87 Commits

Author SHA1 Message Date
713ca17c62 WIP: JSONRPC server refactoring
Some checks reported errors
Pyxis/orion/feature%2Fjsonrpc-next Something is wrong with the build of this commit
Pyxis/orion/pipeline/head Something is wrong with the build of this commit
LaCanne/orion/pipeline/head Something is wrong with the build of this commit
2019-02-12 10:17:06 +01:00
0f0213c326 web application base layout 2018-12-06 22:12:32 +01:00
e3bfd27b0a Make roverConfiguration with JSON-RPC possible 2018-12-06 16:37:51 +01:00
128b135d5c Make linter happy ... 2018-12-06 16:37:51 +01:00
dc195d0d21 Fixing tests for new specs 2018-12-06 16:37:51 +01:00
94b4b220c6 Using mdns instead of hardcoded IP ... 2018-12-06 16:37:51 +01:00
b1a4dc162d Fixing go.sum and go.mod 2018-12-06 16:37:51 +01:00
ec2fd846cc Add SkipUpdate() Updater method
Allow to skip the update step and reboot to ReachView
2018-12-06 16:37:51 +01:00
68e9ba80b3 Adding Tests run and improving reply 2018-12-06 16:37:51 +01:00
e0a32a2ecb refactoring server.go 2018-12-06 16:37:51 +01:00
e6ee5d688f Improve JSON-RPC methods for emlid interaction 2018-12-06 16:37:51 +01:00
cadd3482a2 Lint Clean ! 2018-12-06 16:37:51 +01:00
aed2271bf7 Continuing work on JSON-RPC API ! 2018-12-06 16:37:51 +01:00
6a316c53ee Begin of json rpc API and ... making openwrt module work
Openwrt module was broken reworking all module !
2018-12-06 16:37:51 +01:00
1694111ed5 Tag bin/build target as PHONY 2018-12-06 16:37:51 +01:00
2f05a4573b Base implementation of the RPC endpoint 2018-12-06 16:37:51 +01:00
030bb818e1 Add base manual position update example 2018-12-06 16:33:04 +01:00
668a33a1a1 Fix reach services discovery 2018-12-06 16:31:23 +01:00
4da7f14564 Add method to stream modules status 2018-10-16 19:07:35 +02:00
187d53fd29 Fix Reach services discovery
- Use github.com/grandcat/zeroconf lib instead of github.com/oleksandr/bonjour
2018-10-16 15:23:16 +02:00
9bd20331ef Add service discovery helper
Use MDNS-SD to discover ReachRS services on the local network
2018-10-09 14:05:38 +02:00
fd8657a495 Disable golang modules when executing linters 2018-09-26 16:02:43 +02:00
599c4cf1d5 Merge branch 'feature/reachview-apply-conf' into develop 2018-09-26 15:57:01 +02:00
dc4dd7a9fb Lint: disable lll 2018-09-26 15:56:46 +02:00
854052bc84 Example: simple cli for automatic configuration of rover/base modules 2018-09-26 15:56:06 +02:00
e4bb33e895 CI: only lint modified files 2018-09-26 12:08:29 +02:00
9367e5e79e Use context.Context to provide timeout detection to websocket calls 2018-09-26 12:05:55 +02:00
1dcd03e455 Use pointers to create partial configuration updates 2018-09-25 17:28:12 +02:00
70ddfe49ed Merge branch 'develop' of https://forge.cadoles.com/Pyxis/orion into develop 2018-09-21 17:00:59 +02:00
364dfecb31 Cleaning code to please the linter
Added feature for #145
Fix bug #145
2018-09-21 17:00:11 +02:00
cf58d86eb0 Remove gometalinter install script 2018-09-21 16:56:32 +02:00
f769ca382e Merge branch 'feature/reachview-api' into develop 2018-09-21 16:07:56 +02:00
1a04caafdf Implements full configuration model 2018-09-21 16:07:38 +02:00
6e9df8d386 Refactor reach package
- Rename reach package to emlid
- Create generic Reach websocket client
- Add 2 new subpackages 'updater' and 'reachview' to provides specific
API
2018-09-21 16:07:38 +02:00
77a779aebe Provides a pre-commit git hook to lint Go files 2018-09-21 16:07:38 +02:00
2c7aad91c6 Use golangci-lint instead of gometalinter 2018-09-21 16:07:38 +02:00
f67724dc3a Add another checkpoint to ReachView.Configuration() test 2018-09-21 16:07:38 +02:00
e3672cc6d7 Add basic Configuration() method 2018-09-21 16:07:38 +02:00
ff13693f69 Add ReachView client 2018-09-21 16:07:38 +02:00
ba3d85f48b Create generic method to implements the request/response pattern 2018-09-21 16:07:38 +02:00
a44e40eea2 Merge branch 'feature/uciClient' into develop 2018-09-21 16:05:16 +02:00
17487dd7a6 Spliting complex function parseWifiCells 2018-09-21 15:42:48 +02:00
b34ccd3dee Improving network_test.go ...
This way we don't need a real wifi card
2018-09-21 14:36:06 +02:00
1dbb62c490 Add /proc/net/wireless sample 2018-09-21 14:33:17 +02:00
ec26c74ae8 Spliting "complex" methods to please go linter ! 2018-09-21 13:42:43 +02:00
de0255fd03 Cleaning lint issue : openwrt/wifi.go:39:⚠️ declaration of res shadows declaration at openwrt/wifi.go:31 (vetshadow) 2018-09-21 13:42:43 +02:00
3f36175f1a Cleaning test data 2018-09-21 13:42:43 +02:00
b680e256b9 Updating executor to remove old util.go
Adding new Network interaction "class"
2018-09-21 13:42:43 +02:00
735bc8d19e Adding DHCP Client and new Wifi stack 2018-09-21 13:42:43 +02:00
e1f0c68630 Object oriented UCI + Executor interface 2018-09-21 13:42:43 +02:00
b8f0a554c1 Adding begin of openwrt manipulation module 2018-09-21 13:42:43 +02:00
1aa77c90ab Add Jenkinsfile for continuous integration 2018-09-21 10:13:08 +02:00
3c8f85dcff Lint: sort struct attributes to reduce memory usage 2018-09-20 15:46:32 +02:00
3adfc2a5bb Remove redundant return 2018-09-20 15:45:52 +02:00
425d139b1c Fix error event unbinding 2018-09-20 15:44:34 +02:00
a968004d4e Lint: sort struct attributes to reduce memory usage 2018-09-20 15:43:34 +02:00
5f6dcd2253 Rename ConnectToWifiNetwork() to JoinWifiNetwork() for brevety and clarity 2018-09-20 12:08:20 +02:00
13267b2d5a Rename TimeSyncStatus() to TimeSynced() for API clarity 2018-09-20 11:36:48 +02:00
6534c51fe4 Rename SavedWifiNetworks() to WifiNetworks() for consistency 2018-09-20 11:33:51 +02:00
5008dfbd56 Add Updater CLI example 2018-09-20 11:22:03 +02:00
964e1d713e Allow RebootNow() to wait for disconnection 2018-09-20 11:20:35 +02:00
f24f697a3d Allow ConnectToWifiNetwork() to wait for disconnection 2018-09-20 10:59:39 +02:00
52bac70174 Merge branch 'feature/reach-updater-client' into develop 2018-09-19 17:47:49 +02:00
ee3113ed80 Add package documentation and usage example of UpdaterClient 2018-09-19 17:45:38 +02:00
582e362aae Add WEP wifi network security 2018-09-19 17:25:11 +02:00
403e14c320 Rename OPKGUpdate() to Update() 2018-09-19 17:24:50 +02:00
2d0c3d9de9 Fix flag message to run updater integration tests 2018-09-19 17:24:17 +02:00
998f718354 Add doc command to Makefile 2018-09-19 17:23:28 +02:00
dd0a466bd3 Namespaces updaters API in its own client 2018-09-19 17:13:45 +02:00
48db0458c0 Add OPKGUpdate() API 2018-09-19 16:30:37 +02:00
fc4e50bf08 Use internal logger to display results info 2018-09-19 15:54:11 +02:00
1e16779c52 Add ReachViewVersion() API 2018-09-19 15:53:40 +02:00
055ee0000d Add ReceiverUpradeAvailable() API 2018-09-19 15:46:15 +02:00
1bf205347e Add TimeSyncStatus() API 2018-09-19 15:35:56 +02:00
23aee0fb68 Add flag to execute integration tests 2018-09-19 15:29:44 +02:00
505d462352 Remove Probe() method 2018-09-19 13:04:56 +02:00
a2d1c675d7 WiFi networks management API 2018-09-19 13:00:08 +02:00
e7831091ad Restrict linting domain 2018-09-19 10:33:50 +02:00
55e74355bf Update forge.cadoles.com/Pyxis/golang-socketio dep 2018-09-19 10:26:55 +02:00
68371cb7c7 Add reach.Option comments 2018-09-19 10:02:09 +02:00
cd27332c4f Base de client ReachRS fonctionnelle 2018-09-19 10:02:09 +02:00
267017bdc1 Adding begin of Golang setupKit implementation 2018-09-18 16:32:58 +02:00
2421071da6 Adding bash script to connect a wlan interface to a wifi network
usage :

./setupKit.sh wlan1 reach my_secret_wpa_key

first parameter is the wifi interface
second is the SSID prefix, I use reach for  "reachxx:xx"
last is the WPA KEY to connect to network
2018-09-18 15:53:45 +02:00
4489f22ac0 Adding experimentation shell scripts ! 2018-09-18 14:36:45 +02:00
29d5a48440 Upating License 2018-09-18 09:03:49 +02:00
3d693f0632 Add Docker Compose basic environment 2018-09-17 17:51:14 +02:00
9b11769a70 Initial commit 2018-09-17 14:17:54 +02:00
90 changed files with 17624 additions and 0 deletions

4
.editorconfig Normal file
View File

@ -0,0 +1,4 @@
[*.{js,html,tmpl,json}]
charset = utf-8
indent_style = space
indent_size = 2

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
/vendor
/bin
/.env
/.vscode

3
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"printcode.browserPath": "/usr/bin/firefox"
}

59
Jenkinsfile vendored Normal file
View File

@ -0,0 +1,59 @@
pipeline {
agent {
docker { image 'golang:1.11' }
}
stages {
stage('Prepare environment') {
steps {
script {
sh 'make deps'
sh 'make vendor'
}
}
}
stage('Run unit tests') {
steps {
script {
sh 'make test'
}
}
}
stage('Run lint') {
steps {
script {
try {
sh 'make LINT_ARGS="--new-from-rev=HEAD~" lint'
} catch(ex) {
currentBuild.result = "UNSTABLE"
}
}
}
}
}
post {
always {
script {
if (currentBuild.currentResult != 'SUCCESS') {
emailext (
subject: "${currentBuild.currentResult} - Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'",
body: """
Voir les étapes du job: ${env.BUILD_URL}flowGraphTable
Projet: ${env.GIT_URL}
Branche: ${env.GIT_BRANCH}
Commit: ${env.GIT_COMMIT}
""",
recipientProviders: [developers(), requestor()],
)
}
}
}
}
}

54
Makefile Normal file
View File

@ -0,0 +1,54 @@
LINT_ARGS ?= ./...
DEPLOY_HOST ?= 192.168.100.1
export GO111MODULE := on
build: bin/server
bin/server:
CGO_ENABLED=0 go build -mod=vendor -v -o ./bin/server ./cmd/server
cmd/server/static/dist:
cd cmd/server && npm install
cd cmd/server && npm run build
watch:
modd
test: tidy
GO111MODULE=off go clean -testcache
go test -mod=vendor -v ./...
lint:
@GO111MODULE=off golangci-lint run --tests=false --skip-dirs 'example' -e '.*/pkg/mod' -e ".*/go/src" --enable-all --disable lll $(LINT_ARGS)
tidy:
go mod tidy
vendor: tidy
go mod vendor
deps:
# Install modd
GO111MODULE=off go get -u github.com/cortesi/modd/cmd/modd
# Install golangci-lint
GO111MODULE=off go get -u github.com/golangci/golangci-lint/cmd/golangci-lint
release: cmd/server/static/dist
rm -rf release
NODE_ENV=production ./script/release
clean:
rm -rf ./bin
go clean -i -x -r -modcache
deploy: release
rsync -avzz --delete release/server-linux-arm/. root@$(DEPLOY_HOST):/opt/orion/
scp misc/openwrt/orion.init root@$(DEPLOY_HOST):/etc/init.d/orion
ssh root@$(DEPLOY_HOST) chmod +x /etc/init.d/orion
ssh root@$(DEPLOY_HOST) /etc/init.d/orion restart
doc:
@echo "Open your browser to http://localhost:6060/pkg/forge.cadoles.com/Pyxis/orion/ to see the documentation"
@godoc -http=:6060
.PHONY: test clean generate vendor deps lint watch tidy doc bin/server cmd/server/static/dist release

11
README.md Normal file
View File

@ -0,0 +1,11 @@
# Orion
Récepteur GNSS/RTK pour les topographes et chefs de chantier
## Documentation
[Voir la documentation](./doc)
## License
`GNU GPL v3` http://dachary.org/loic/gpl-french.pdf

2
cmd/server/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/static/dist
/node_modules

28
cmd/server/config.go Normal file
View File

@ -0,0 +1,28 @@
package main
import (
"github.com/caarlos0/env"
)
type config struct {
HTTPHost string `env:"ORION_HTTP_HOST"`
HTTPPort string `env:"ORION_HTTP_PORT"`
TemplateDir string `env:"ORION_TEMPLATE_DIR"`
AssetDir string `env:"ORION_ASSET_DIR"`
}
func overwriteFromEnv(conf *config) error {
if err := env.Parse(conf); err != nil {
return err
}
return nil
}
func newDefaultConfig() *config {
return &config{
HTTPHost: "0.0.0.0",
HTTPPort: "8888",
TemplateDir: "./templates",
AssetDir: "./static",
}
}

525
cmd/server/jsonrpc/rpc.go Normal file
View File

@ -0,0 +1,525 @@
package jsonrpc
import (
"context"
"fmt"
"log"
"net/http"
"time"
"forge.cadoles.com/Cadoles/owrt"
"forge.cadoles.com/Pyxis/orion/emlid"
"forge.cadoles.com/Pyxis/orion/emlid/reachview"
"forge.cadoles.com/Pyxis/orion/emlid/updater"
"github.com/gorilla/rpc"
"github.com/gorilla/rpc/json"
"github.com/pkg/errors"
)
// OrionService is the JSON-RPC API
type OrionService struct {
UCI *owrt.UCI
}
// NewOrionService create a new OrionService !
func NewOrionService() *OrionService {
uci := owrt.NewUCI()
return &OrionService{
UCI: uci,
}
}
// UCIArgs argument structure for exported method OwrtListWifiDevices
type UCIArgs struct{}
// UCIResponse is the response structure for exposed method OwrtListWifiDevices
type UCIResponse struct {
Devices []map[string]string
}
// OwrtListWifiDevices offers an RPC Method to list Wifi nics in a OpenWRT device.
func (o *OrionService) OwrtListWifiDevices(r *http.Request, args *UCIArgs, reply *UCIResponse) error {
o.UCI.LoadWirelessConf()
devs := o.UCI.GetWifiDevices()
reply.Devices = devs
return nil
}
// ListIfaceArgs argument structure for exported method OwrtListWifiDevices
type ListIfaceArgs struct{}
// ListIfaceResponse is the response structure for exposed method OwrtListWifiDevices
type ListIfaceResponse struct {
Interfaces map[int]*owrt.UCIWirelessInterface
}
// OwrtListWifiInterfaces offers an RPC Method to list wifi interfaces in a OpenWRT device.
func (o *OrionService) OwrtListWifiInterfaces(r *http.Request, args *ListIfaceArgs, reply *ListIfaceResponse) error {
o.UCI.LoadWirelessConf()
reply.Interfaces = o.UCI.GetWifiIfaces()
return nil
}
// CreateIfaceArgs argument structure for exported method OwrtCreateWifiInterface
type CreateIfaceArgs struct {
Cleanup bool
Iface *owrt.UCIWirelessInterface
}
// CreateIfaceResponse argument structure for exported method OwrtCreateWifiInterface
type CreateIfaceResponse struct {
Errors []*owrt.Action
Iface *owrt.UCIWirelessInterface
}
// OwrtCreateWifiInterface Create a WifiInterface in openwrt
func (o *OrionService) OwrtCreateWifiInterface(r *http.Request,
args *CreateIfaceArgs,
reply *CreateIfaceResponse) error {
reply.Iface = nil
if args.Cleanup {
o.UCI.LoadWirelessConf()
w := o.UCI.GetWifiIfaces()
for _, iface := range w {
iface.Delete(o.UCI)
}
o.UCI.Commit()
o.UCI.Reload()
time.Sleep(3 * time.Second)
}
o.UCI.LoadWirelessConf()
create := args.Iface.Create(o.UCI)
if create.ReturnCode != 0 {
reply.Errors = append(reply.Errors, create)
return nil
}
create = args.Iface.SysAdd(o.UCI)
if create.ReturnCode == 233 {
delete := args.Iface.SysDel(o.UCI)
if delete.ReturnCode != 0 {
reply.Errors = append(reply.Errors, delete)
return nil
}
create = args.Iface.SysAdd(o.UCI)
if create.ReturnCode != 0 {
reply.Errors = append(reply.Errors, create)
return nil
}
}
create = args.Iface.Up(o.UCI)
if create.ReturnCode != 0 {
reply.Errors = append(reply.Errors, create)
return nil
}
create = args.Iface.Save(o.UCI)
if create.ReturnCode != 0 {
reply.Errors = append(reply.Errors, create)
return nil
}
reply.Iface = args.Iface
return nil
}
// ConnectIfaceArgs argument structure for exported method OwrtCreateWifiInterface
type ConnectIfaceArgs struct {
Iface *owrt.UCIWirelessInterface
SSID string
Key string
}
// ConnectIfaceResponse argument structure for exported method OwrtCreateWifiInterface
type ConnectIfaceResponse struct {
status int
Errors []string
}
// OwrtConnectWifiInterface connects a given Wifi Interface to a given SSID
func (o *OrionService) OwrtConnectWifiInterface(r *http.Request,
args *ConnectIfaceArgs,
reply *ConnectIfaceResponse) error {
o.UCI.LoadWirelessConf()
iface := o.UCI.GetWifiIface(args.Iface.Index)
cells := iface.Scan()
for _, cell := range cells {
if cell.Ssid == args.SSID {
cn := iface.Connect(o.UCI, cell, args.Key)
if cn.ReturnCode != 0 {
reply.status = cn.ReturnCode
reply.Errors = append(reply.Errors, cn.Stdout, cn.Stderr, cn.Command)
}
reply.status = 0
return nil
}
}
reply.status = 1
msg := fmt.Sprintf("Wifi Cell with SSID %s is not available !", args.SSID)
reply.Errors = append(reply.Errors, msg)
return nil
}
// OrionBox describe an fresh Orion box (base or rover)
type OrionBox struct {
Address string
NewAddress string
SSID string
Security string
WifiKey string
}
// OrionServer describe the Orion master server
type OrionServer struct {
Address string
SSID string
Security string
WifiKey string
ClientIface *owrt.UCIWirelessInterface
}
// UpdateOrionBoxArgs argument structure for exported method OwrtCreateWifiInterface
type UpdateOrionBoxArgs struct {
Box *OrionBox
Server *OrionServer
}
// UpdateOrionBoxResponse argument structure for exported method OwrtCreateWifiInterface
type UpdateOrionBoxResponse struct {
IP string
Netmask string
Synced bool
Version string
Status *updater.UpdateStatus
Results *updater.TestResults
}
// connect wifi interface to a Orion box wifi hotspot!
func (o *OrionService) connectBox(box *OrionBox, server *OrionServer) error {
o.UCI.LoadWirelessConf()
if server == nil {
return fmt.Errorf("Server definition is empty")
}
if box == nil {
return fmt.Errorf("Box definitioni is emtpy")
}
iface := server.ClientIface
cells := iface.Scan()
for _, cell := range cells {
if cell.Ssid == box.SSID {
cn := iface.Connect(o.UCI, cell, box.WifiKey)
if cn.ReturnCode != 0 {
return fmt.Errorf("%s\n%s", cn.Stdout, cn.Stderr)
}
dhcli := owrt.NewDhcpClient(iface.SysDevName)
dhres := dhcli.AskForIP()
if dhres.CmdRes.ReturnCode != 0 {
return fmt.Errorf("%s\n%s", cn.Stdout, cn.Stderr)
}
re := o.UCI.Reload()
if re.ReturnCode != 0 {
return fmt.Errorf("%s\n%s", re.Stdout, re.Stderr)
}
return nil
}
}
return fmt.Errorf("Wifi cell with SSID %s is not available", box.SSID)
}
func (o *OrionService) discoverService(rqContext context.Context) ([]emlid.Service, error) {
ctx, cancelDiscover := context.WithTimeout(rqContext, 55*time.Second)
defer cancelDiscover()
return emlid.Discover(ctx)
}
func (o *OrionService) connectUpdater(rqContext context.Context, box *OrionBox) (*updater.Client, error) {
var boxCli *updater.Client
service, err := o.discoverService(rqContext)
fmt.Printf("DEBUG len = %d\n", len(service))
if len(service) == 0 {
fmt.Println("DEBUG Connecting to box with EndPoint !")
boxCli = updater.NewClient(
emlid.WithEndpoint(box.Address, 80),
)
} else if err == nil {
fmt.Println("DEBUG Connecting to box with Service !")
boxCli = updater.NewClient(
emlid.WithService(service[0]),
)
} else {
fmt.Printf("Non mais là c'est vraiment étrange !")
return nil, err
}
//fmt.Printf("NAME: %s, IP: %s", service[0].Name, service[0].AddrV4)
return boxCli, err
}
// setupMasterWifi connects to the box, add wifi network and join it !
func (o *OrionService) setupMasterWifi(rqContext context.Context, box *OrionBox, server *OrionServer) error {
if err := o.connectBox(box, server); err != nil {
return errors.Wrap(err, "Connect to box failed")
}
if server.Security == "" {
server.Security = string(updater.SecurityWPAPSK)
}
boxCli, cliErr := o.connectUpdater(rqContext, box)
if cliErr != nil {
return errors.Wrap(cliErr, "Creation of updater client failed")
}
if err := boxCli.Connect(); err != nil {
return errors.Wrap(err, "Connecting to Box failed")
}
defer boxCli.Close()
fmt.Println("Running Tests !")
ctx, testResultsCancel := context.WithTimeout(rqContext, 55*time.Second)
defer testResultsCancel()
_, err := boxCli.TestResults(ctx)
if err != nil {
return errors.Wrap(err, "Minimal test failed")
}
fmt.Println("Add Wifi !")
ctx, addWifiCancel := context.WithTimeout(rqContext, 55*time.Second)
defer addWifiCancel()
done, err := boxCli.AddWifiNetwork(ctx, server.SSID, updater.WifiSecurity(server.Security), server.WifiKey)
if err != nil {
return errors.Wrap(err, "AddWifiNetworkFailed")
}
if !done {
return fmt.Errorf("Impossible to add wifi network")
}
ctx, joinWifiCancel := context.WithTimeout(ctx, 55*time.Second)
defer joinWifiCancel()
fmt.Println("Join Wifi !")
if err := boxCli.JoinWifiNetwork(ctx, server.SSID, true); err != nil {
return errors.Wrap(err, "Time sync failed")
}
return nil
}
// updateAndReboot connects to the box with the New address and run basic tests on version dans updates
func (o *OrionService) updateAndReboot(rqContext context.Context, box *OrionBox, reply *UpdateOrionBoxResponse) error {
time.Sleep(3 * time.Second)
boxCli, err := o.connectUpdater(rqContext, box)
if err != nil {
return errors.Wrap(err, "Problem connecting to updater")
}
if err := boxCli.Connect(); err != nil {
fmt.Println("Waiting 3 seconds on error")
time.Sleep(3 * time.Second)
boxCli, clerr := o.connectUpdater(rqContext, box)
if clerr != nil {
return errors.Wrap(err, "Problem connecting to updater")
}
if err := boxCli.Connect(); err != nil {
return errors.Wrap(err, "Connecting to Box on master wifi network failed")
}
}
defer boxCli.Close()
ctx, timeSyncedCancel := context.WithTimeout(rqContext, 55*time.Second)
defer timeSyncedCancel()
synced, err := boxCli.TimeSynced(ctx)
if err != nil {
return errors.Wrap(err, "Time sync failed")
}
reply.Synced = synced
ctx, reachviewVersionCancel := context.WithTimeout(rqContext, 55*time.Second)
defer reachviewVersionCancel()
version, err := boxCli.ReachViewVersion(ctx)
if err != nil {
return err
}
reply.Version = version
ctx, updateCancel := context.WithTimeout(rqContext, 55*time.Second)
defer updateCancel()
status, err := boxCli.Update(ctx)
if err != nil {
return errors.Wrap(err, "System update failed")
}
reply.Status = status
if err := boxCli.SkipUpdate(); err != nil {
log.Fatalf("error while skipping update: %s", err)
}
ctx, rebootCancel := context.WithTimeout(rqContext, 55*time.Second)
defer rebootCancel()
return boxCli.RebootNow(ctx, true)
}
// UpdateOrionBox starts provisionning process for an Orion box (base or rover)
func (o *OrionService) UpdateOrionBox(r *http.Request,
args *UpdateOrionBoxArgs,
reply *UpdateOrionBoxResponse) error {
// if err := o.setupMasterWifi(r.Context(), args.Box, args.Server); err != nil {
// return err
// }
_ = o.setupMasterWifi(r.Context(), args.Box, args.Server)
return o.updateAndReboot(r.Context(), args.Box, reply)
}
// connectReachview creates the client to a reachview module and returns it !
func (o *OrionService) connectReachView(rqContext context.Context, box *OrionBox) (*reachview.Client, error) {
var boxCli *reachview.Client
service, err := o.discoverService(rqContext)
fmt.Printf("DEBUG len = %d\n", len(service))
if len(service) == 0 {
fmt.Println("DEBUG Connecting to box with EndPoint !")
boxCli = reachview.NewClient(
emlid.WithEndpoint(box.Address, 80),
)
} else if err == nil {
fmt.Println("DEBUG Connecting to box with Service !")
boxCli = reachview.NewClient(
emlid.WithService(service[0]),
)
} else {
fmt.Printf("Non mais là c'est vraiment étrange !")
return nil, err
}
//fmt.Printf("NAME: %s, IP: %s", service[0].Name, service[0].AddrV4)
return boxCli, err
}
// ConfigOrionBoxArgs argument structure for exported method OwrtCreateWifiInterface
type ConfigOrionBoxArgs struct {
Box *OrionBox
}
// ConfigOrionBoxResponse argument structure for exported method OwrtCreateWifiInterface
type ConfigOrionBoxResponse struct {
}
func (o *OrionService) resetConfiguration(rqContext context.Context, c *reachview.Client) {
ctx, resetCancel := context.WithTimeout(rqContext, 55*time.Second)
defer resetCancel()
result, _, err := c.ResetConfiguration(ctx)
if err != nil {
log.Fatal(err)
}
if result != reachview.ConfigurationApplySuccess {
log.Fatal("configuration reset failed !")
}
}
// FIXME have to came from parameters !
func (o *OrionService) getCommonConfiguration() *reachview.Configuration {
return &reachview.Configuration{
RTKSettings: &reachview.RTKSettings{
PositioningSystems: &reachview.PositionningSystems{
GPS: reachview.True,
GLONASS: reachview.True,
Galileo: reachview.True,
SBAS: reachview.True,
QZSS: reachview.True,
},
UpdateRate: reachview.String("5"),
},
LoRa: &reachview.LoRa{
AirRate: reachview.String("9.11"),
Frequency: reachview.Float(868000),
OutputPower: reachview.String("20"),
},
PositionOutput: &reachview.PositionOutput{
Output1: &reachview.Output{
Enabled: reachview.False,
},
Output2: &reachview.Output{
Enabled: reachview.False,
},
},
}
}
func (o *OrionService) applyConfiguration(rqContext context.Context, c *reachview.Client, config *reachview.Configuration) error {
ctx, applyConfCancel := context.WithTimeout(rqContext, 55*time.Second)
defer applyConfCancel()
result, _, err := c.ApplyConfiguration(ctx, config)
if err != nil {
return err
}
if result != reachview.ConfigurationApplySuccess {
return fmt.Errorf("Configuration update failed")
}
return c.RestartRTKLib()
}
func (o *OrionService) configureRover(rqContext context.Context, c *reachview.Client) error {
_ = c.Connect()
defer c.Close()
o.resetConfiguration(rqContext, c)
config := o.getCommonConfiguration()
config.RTKSettings.GPSARMode = reachview.GPSARModeFixAndHold
config.RTKSettings.GLONASSARMode = reachview.On
config.RTKSettings.PositionningMode = reachview.PositionningModeKinematic
config.RTKSettings.UpdateRate = reachview.String("5")
config.CorrectionInput = &reachview.CorrectionInput{
Input2: &reachview.Input2{
Input: reachview.Input{
Enabled: reachview.True,
Format: reachview.IOFormatRTCM3,
Type: reachview.IOTypeLoRa,
Path: reachview.String("lora"),
},
SendPositionToBase: reachview.Off,
},
}
config.BaseMode = &reachview.BaseMode{
Output: &reachview.Output{
Enabled: reachview.False,
},
}
log.Println("configuring module as rover")
return o.applyConfiguration(rqContext, c, config)
}
// ConfigureOrionBox starts provisionning process for an Orion box (base or rover)
func (o *OrionService) ConfigureOrionBox(r *http.Request,
args *ConfigOrionBoxArgs,
reply *ConfigOrionBoxResponse) error {
reach, err := o.connectReachView(r.Context(), args.Box)
if err != nil {
return errors.Wrap(err, "Impossible to create ReachView client")
}
fmt.Println("Start Rover Configuraiton !")
return o.configureRover(r.Context(), reach)
}
// NewServer returns a new configured JSON-RPC server
func NewServer() *rpc.Server {
server := rpc.NewServer()
server.RegisterCodec(json.NewCodec(), "application/json")
if err := server.RegisterService(NewOrionService(), "Orion"); err != nil {
panic(err)
}
return server
}

View File

@ -0,0 +1,32 @@
package jsonrpc
import (
"net/http"
"forge.cadoles.com/Cadoles/owrt"
"github.com/davecgh/go-spew/spew"
)
type ScanWifiArgs struct{}
type ScanWifiReply struct {
AccessPoints []*owrt.WifiCell
}
// ScanWifi starts a WiFi scan and returns available access points
func (o *OrionService) ScanWifi(r *http.Request, args *ScanWifiArgs, reply *ScanWifiReply) error {
o.UCI.LoadWirelessConf()
ifaces := o.UCI.GetWifiIfaces()
reply.AccessPoints = make([]*owrt.WifiCell, 0)
for _, iface := range ifaces {
scanner := owrt.NewWifiScanner(iface.Name)
cells := scanner.Scan()
spew.Dump(iface, cells)
reply.AccessPoints = append(reply.AccessPoints, cells...)
}
return nil
}

View File

@ -0,0 +1,32 @@
package jsonrpc
import (
"github.com/gorilla/rpc"
"forge.cadoles.com/wpetit/goweb/service"
"github.com/pkg/errors"
)
const ServiceName service.Name = "jsonrpc"
// From retrieves the JSONRPC service in the given container or panic
func From(container *service.Container) (*rpc.Server, error) {
service, err := container.Service(ServiceName)
if err != nil {
return nil, errors.Wrapf(err, "error while retrieving '%s' service", ServiceName)
}
jsonRPCService, ok := service.(*rpc.Server)
if !ok {
return nil, errors.Errorf("retrieved service is not a valid '%s' service", ServiceName)
}
return jsonRPCService, nil
}
// Must retrieves the json-rpc service in the given container or panic otherwise
func Must(container *service.Container) *rpc.Server {
service, err := From(container)
if err != nil {
panic(err)
}
return service
}

View File

@ -0,0 +1,104 @@
POST http://192.168.100.1:8888/rpc HTTP/1.1
content-type: application/json
{
"id": 0,
"method": "Orion.OwrtListWifiDevices",
"params": []
}
###
POST http://192.168.100.1:8888/rpc HTTP/1.1
content-type: application/json
{
"id": 1,
"method": "Orion.OwrtCreateWifiInterface",
"params": [ {
"Iface": {
"Name": "PyxisNetwork",
"Network": "lan",
"Index": 0,
"Ssid": "Pyxis",
"SysDevName": "wlan0",
"Encryption": "psk2",
"Key": "A2Z3E4R5T6Y7U",
"Device": "radio0",
"DevicePath": "soc/soc:pcie/pci0000:00/0000:00:01.0/0000:01:00.0",
"Mode": "ap"
},
"Cleanup": true
}
]
}
###
POST http://192.168.100.1:8888/rpc HTTP/1.1
content-type: application/json
{
"id": 1,
"method": "Orion.OwrtCreateWifiInterface",
"params": [ {
"Iface": {
"Name": "PyxisClient",
"Index": 1,
"SysDevName": "wlan1",
"Device": "radio1",
"DevicePath": "soc/soc:pcie/pci0000:00/0000:00:02.0/0000:02:00.0",
"Mode": "sta"
},
"Cleanup": false
}]
}
###
POST http://192.168.100.1:8888/rpc HTTP/1.1
content-type: application/json
{
"id": 1,
"method": "Orion.UpdateOrionBox",
"params": [ {
"Box": {
"Address": "",
"NewAddress": "",
"Security": "",
"SSID" : "reach:2a:03",
"WifiKey": "emlidreach"
},
"Server": {
"Address": "",
"SSID": "Pyxis",
"Security": "",
"WifiKey": "A2Z3E4R5T6Y7U",
"ClientIface" : {
"Name": "PyxisClient",
"Index": 1,
"SysDevName": "wlan1",
"Device": "radio1",
"DevicePath": "soc/soc:pcie/pci0000:00/0000:00:02.0/0000:02:00.0",
"Mode": "sta"
}
}
} ]
}
###
POST http://192.168.100.1:8888/rpc HTTP/1.1
content-type: application/json
{
"id": 1,
"method": "Orion.ConfigureOrionBox",
"params": [ {
"Box": {
"Address": "",
"NewAddress": "",
"Security": "",
"SSID" : "reach:2a:03",
"WifiKey": "emlidreach"
}
} ]
}

88
cmd/server/main.go Normal file
View File

@ -0,0 +1,88 @@
package main
import (
"fmt"
"log"
"net/http"
"github.com/gorilla/sessions"
"forge.cadoles.com/wpetit/goweb/session/gorilla"
"forge.cadoles.com/wpetit/goweb/template/html"
"github.com/go-chi/chi/middleware"
"forge.cadoles.com/wpetit/goweb/service/session"
"forge.cadoles.com/wpetit/goweb/service/template"
"forge.cadoles.com/Pyxis/orion/cmd/server/jsonrpc"
containerMiddleware "forge.cadoles.com/wpetit/goweb/middleware/container"
"forge.cadoles.com/wpetit/goweb/service"
"github.com/go-chi/chi"
)
var (
conf = newDefaultConfig()
)
func main() {
if err := overwriteFromEnv(conf); err != nil {
log.Fatal(err)
}
// Create service container
container := service.NewContainer()
container.Provide(jsonrpc.ServiceName, getJSONRPCServiceProvider())
container.Provide(template.ServiceName, html.ServiceProvider(conf.TemplateDir))
container.Provide(session.ServiceName, getSessionServiceProvider())
r := chi.NewRouter()
r.Use(middleware.Recoverer)
r.Use(middleware.RequestID)
r.Use(middleware.Logger)
r.Use(containerMiddleware.ServiceContainer(container))
configureRoutes(r)
hostStr := fmt.Sprintf("%s:%s", conf.HTTPHost, conf.HTTPPort)
log.Printf("listening on http://%s", hostStr)
if err := http.ListenAndServe(hostStr, r); err != nil {
log.Fatal(err)
}
}
func getJSONRPCServiceProvider() service.Provider {
jsonrpc := jsonrpc.NewServer()
return func(c *service.Container) (interface{}, error) {
return jsonrpc, nil
}
}
func getSessionServiceProvider() service.Provider {
// Create a new encrypted/authenticated cookie store for the session
cookieStore, err := gorilla.CreateCookieSessionStore(32, 64)
var sessionService session.Service
if err == nil {
sessionService = gorilla.NewSessionService(
"orion",
cookieStore,
&sessions.Options{
HttpOnly: true,
},
)
}
return func(c *service.Container) (interface{}, error) {
if err != nil {
return nil, err
}
return sessionService, nil
}
}

5767
cmd/server/package-lock.json generated Normal file
View File

@ -0,0 +1,5767 @@
{
"name": "server",
"version": "0.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@stimulus/core": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@stimulus/core/-/core-1.1.0.tgz",
"integrity": "sha512-tBQkrijjk8p3ZAhMMu2u87kXbTeBLPWiemoZqmb62krUt/IofQMFrbbiSzPAkkVqlv3kwjs0bmlO3H4fWE9HBQ==",
"dev": true,
"requires": {
"@stimulus/mutation-observers": "^1.1.0"
}
},
"@stimulus/multimap": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@stimulus/multimap/-/multimap-1.1.0.tgz",
"integrity": "sha512-LoAyUhHX5b8/gVXHVMKUXT8vZnXSyJAWs1sopQZNBWDs34zSpWF5tqclf0T3TNg3aCbQlWaHnYv3lickpbrNEQ==",
"dev": true
},
"@stimulus/mutation-observers": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@stimulus/mutation-observers/-/mutation-observers-1.1.0.tgz",
"integrity": "sha512-Tr0bmJEFqAm3o0mJPZcCLurlW+lp8gohFeUQNbkjj9bmCGygQKuWr1b3dwyJgG94qRuzo66QdKkvp04tp1o7lw==",
"dev": true,
"requires": {
"@stimulus/multimap": "^1.1.0"
}
},
"@stimulus/webpack-helpers": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@stimulus/webpack-helpers/-/webpack-helpers-1.1.0.tgz",
"integrity": "sha512-trzloYQ7RBZcYIbB5hLLgYvC7MHJkj1avPFIrEFCd2t7WCFhH5wQApyzAZAS+BtjvFwHp0o1o7Rp1OceRgjOCw==",
"dev": true
},
"@webassemblyjs/ast": {
"version": "1.7.11",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz",
"integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==",
"dev": true,
"requires": {
"@webassemblyjs/helper-module-context": "1.7.11",
"@webassemblyjs/helper-wasm-bytecode": "1.7.11",
"@webassemblyjs/wast-parser": "1.7.11"
}
},
"@webassemblyjs/floating-point-hex-parser": {
"version": "1.7.11",
"resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz",
"integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==",
"dev": true
},
"@webassemblyjs/helper-api-error": {
"version": "1.7.11",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz",
"integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==",
"dev": true
},
"@webassemblyjs/helper-buffer": {
"version": "1.7.11",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz",
"integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==",
"dev": true
},
"@webassemblyjs/helper-code-frame": {
"version": "1.7.11",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz",
"integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==",
"dev": true,
"requires": {
"@webassemblyjs/wast-printer": "1.7.11"
}
},
"@webassemblyjs/helper-fsm": {
"version": "1.7.11",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz",
"integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==",
"dev": true
},
"@webassemblyjs/helper-module-context": {
"version": "1.7.11",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz",
"integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==",
"dev": true
},
"@webassemblyjs/helper-wasm-bytecode": {
"version": "1.7.11",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz",
"integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==",
"dev": true
},
"@webassemblyjs/helper-wasm-section": {
"version": "1.7.11",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz",
"integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==",
"dev": true,
"requires": {
"@webassemblyjs/ast": "1.7.11",
"@webassemblyjs/helper-buffer": "1.7.11",
"@webassemblyjs/helper-wasm-bytecode": "1.7.11",
"@webassemblyjs/wasm-gen": "1.7.11"
}
},
"@webassemblyjs/ieee754": {
"version": "1.7.11",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz",
"integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==",
"dev": true,
"requires": {
"@xtuc/ieee754": "^1.2.0"
}
},
"@webassemblyjs/leb128": {
"version": "1.7.11",
"resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz",
"integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==",
"dev": true,
"requires": {
"@xtuc/long": "4.2.1"
}
},
"@webassemblyjs/utf8": {
"version": "1.7.11",
"resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz",
"integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==",
"dev": true
},
"@webassemblyjs/wasm-edit": {
"version": "1.7.11",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz",
"integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==",
"dev": true,
"requires": {
"@webassemblyjs/ast": "1.7.11",
"@webassemblyjs/helper-buffer": "1.7.11",
"@webassemblyjs/helper-wasm-bytecode": "1.7.11",
"@webassemblyjs/helper-wasm-section": "1.7.11",
"@webassemblyjs/wasm-gen": "1.7.11",
"@webassemblyjs/wasm-opt": "1.7.11",
"@webassemblyjs/wasm-parser": "1.7.11",
"@webassemblyjs/wast-printer": "1.7.11"
}
},
"@webassemblyjs/wasm-gen": {
"version": "1.7.11",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz",
"integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==",
"dev": true,
"requires": {
"@webassemblyjs/ast": "1.7.11",
"@webassemblyjs/helper-wasm-bytecode": "1.7.11",
"@webassemblyjs/ieee754": "1.7.11",
"@webassemblyjs/leb128": "1.7.11",
"@webassemblyjs/utf8": "1.7.11"
}
},
"@webassemblyjs/wasm-opt": {
"version": "1.7.11",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz",
"integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==",
"dev": true,
"requires": {
"@webassemblyjs/ast": "1.7.11",
"@webassemblyjs/helper-buffer": "1.7.11",
"@webassemblyjs/wasm-gen": "1.7.11",
"@webassemblyjs/wasm-parser": "1.7.11"
}
},
"@webassemblyjs/wasm-parser": {
"version": "1.7.11",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz",
"integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==",
"dev": true,
"requires": {
"@webassemblyjs/ast": "1.7.11",
"@webassemblyjs/helper-api-error": "1.7.11",
"@webassemblyjs/helper-wasm-bytecode": "1.7.11",
"@webassemblyjs/ieee754": "1.7.11",
"@webassemblyjs/leb128": "1.7.11",
"@webassemblyjs/utf8": "1.7.11"
}
},
"@webassemblyjs/wast-parser": {
"version": "1.7.11",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz",
"integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==",
"dev": true,
"requires": {
"@webassemblyjs/ast": "1.7.11",
"@webassemblyjs/floating-point-hex-parser": "1.7.11",
"@webassemblyjs/helper-api-error": "1.7.11",
"@webassemblyjs/helper-code-frame": "1.7.11",
"@webassemblyjs/helper-fsm": "1.7.11",
"@xtuc/long": "4.2.1"
}
},
"@webassemblyjs/wast-printer": {
"version": "1.7.11",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz",
"integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==",
"dev": true,
"requires": {
"@webassemblyjs/ast": "1.7.11",
"@webassemblyjs/wast-parser": "1.7.11",
"@xtuc/long": "4.2.1"
}
},
"@xtuc/ieee754": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
"integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
"dev": true
},
"@xtuc/long": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz",
"integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==",
"dev": true
},
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true
},
"acorn": {
"version": "5.7.3",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
"integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==",
"dev": true
},
"acorn-dynamic-import": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz",
"integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==",
"dev": true,
"requires": {
"acorn": "^5.0.0"
}
},
"adjust-sourcemap-loader": {
"version": "1.2.0",
"resolved": "http://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-1.2.0.tgz",
"integrity": "sha512-958oaHHVEXMvsY7v7cC5gEkNIcoaAVIhZ4mBReYVZJOTP9IgKmzLjIOhTtzpLMu+qriXvLsVjJ155EeInp45IQ==",
"dev": true,
"requires": {
"assert": "^1.3.0",
"camelcase": "^1.2.1",
"loader-utils": "^1.1.0",
"lodash.assign": "^4.0.1",
"lodash.defaults": "^3.1.2",
"object-path": "^0.9.2",
"regex-parser": "^2.2.9"
},
"dependencies": {
"camelcase": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
"integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
"dev": true
},
"lodash.defaults": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz",
"integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=",
"dev": true,
"requires": {
"lodash.assign": "^3.0.0",
"lodash.restparam": "^3.0.0"
},
"dependencies": {
"lodash.assign": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz",
"integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=",
"dev": true,
"requires": {
"lodash._baseassign": "^3.0.0",
"lodash._createassigner": "^3.0.0",
"lodash.keys": "^3.0.0"
}
}
}
}
}
},
"ajv": {
"version": "6.6.1",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz",
"integrity": "sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==",
"dev": true,
"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.0",
"resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.0.tgz",
"integrity": "sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk=",
"dev": true
},
"ajv-keywords": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz",
"integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=",
"dev": true
},
"amdefine": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
"integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
"dev": true
},
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true
},
"ansi-styles": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
"dev": true
},
"anymatch": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
"integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
"dev": true,
"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==",
"dev": true
},
"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==",
"dev": true,
"requires": {
"delegates": "^1.0.0",
"readable-stream": "^2.0.6"
}
},
"arity-n": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz",
"integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=",
"dev": true
},
"arr-diff": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
"integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
"dev": true
},
"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==",
"dev": true
},
"arr-union": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
"integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
"dev": true
},
"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=",
"dev": true
},
"array-unique": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
"integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
"dev": true
},
"asn1": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
"integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
"dev": true,
"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==",
"dev": true,
"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=",
"dev": true,
"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=",
"dev": true
},
"assign-symbols": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
"integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
"dev": true
},
"async-each": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
"integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
"dev": true
},
"async-foreach": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
"integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=",
"dev": true
},
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
"dev": true
},
"atob": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
"integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
"dev": true
},
"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=",
"dev": true
},
"aws4": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
"integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
"dev": true
},
"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=",
"dev": true,
"requires": {
"chalk": "^1.1.3",
"esutils": "^2.0.2",
"js-tokens": "^3.0.2"
}
},
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true
},
"base": {
"version": "0.11.2",
"resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
"integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
"dev": true,
"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=",
"dev": true,
"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==",
"dev": true,
"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==",
"dev": true,
"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==",
"dev": true,
"requires": {
"is-accessor-descriptor": "^1.0.0",
"is-data-descriptor": "^1.0.0",
"kind-of": "^6.0.2"
}
}
}
},
"base64-js": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
"integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
"dev": true
},
"bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
"integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
"dev": true,
"requires": {
"tweetnacl": "^0.14.3"
}
},
"big.js": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
"integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
"dev": true
},
"binary-extensions": {
"version": "1.12.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz",
"integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==",
"dev": true
},
"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=",
"dev": true,
"requires": {
"inherits": "~2.0.0"
}
},
"bluebird": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz",
"integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==",
"dev": true
},
"bn.js": {
"version": "4.11.8",
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
"integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
"dev": true
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"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==",
"dev": true,
"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=",
"dev": true,
"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=",
"dev": true
},
"browserify-aes": {
"version": "1.2.0",
"resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
"integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
"dev": true,
"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==",
"dev": true,
"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==",
"dev": true,
"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": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
"integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
"dev": true,
"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=",
"dev": true,
"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==",
"dev": true,
"requires": {
"pako": "~1.0.5"
}
},
"buffer": {
"version": "4.9.1",
"resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
"integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
"dev": true,
"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==",
"dev": true
},
"buffer-xor": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
"integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
"dev": true
},
"builtin-modules": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
"integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
"dev": true
},
"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=",
"dev": true
},
"bulma": {
"version": "0.7.2",
"resolved": "https://registry.npmjs.org/bulma/-/bulma-0.7.2.tgz",
"integrity": "sha512-6JHEu8U/1xsyOst/El5ImLcZIiE2JFXgvrz8GGWbnDLwTNRPJzdAM0aoUM1Ns0avALcVb6KZz9NhzmU53dGDcQ==",
"dev": true
},
"cacache": {
"version": "11.3.1",
"resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.1.tgz",
"integrity": "sha512-2PEw4cRRDu+iQvBTTuttQifacYjLPhET+SYO/gEFMy8uhi+jlJREDAjSF5FWSdV/Aw5h18caHA7vMTw2c+wDzA==",
"dev": true,
"requires": {
"bluebird": "^3.5.1",
"chownr": "^1.0.1",
"figgy-pudding": "^3.1.0",
"glob": "^7.1.2",
"graceful-fs": "^4.1.11",
"lru-cache": "^4.1.3",
"mississippi": "^3.0.0",
"mkdirp": "^0.5.1",
"move-concurrently": "^1.0.1",
"promise-inflight": "^1.0.1",
"rimraf": "^2.6.2",
"ssri": "^6.0.0",
"unique-filename": "^1.1.0",
"y18n": "^4.0.0"
},
"dependencies": {
"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==",
"dev": true
}
}
},
"cache-base": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
"integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
"dev": true,
"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"
}
},
"camelcase": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
"integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
"dev": true
},
"camelcase-keys": {
"version": "2.1.0",
"resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
"integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
"dev": true,
"requires": {
"camelcase": "^2.0.0",
"map-obj": "^1.0.0"
}
},
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
"dev": true
},
"chalk": {
"version": "1.1.3",
"resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"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"
}
},
"chokidar": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
"integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==",
"dev": true,
"requires": {
"anymatch": "^2.0.0",
"async-each": "^1.0.0",
"braces": "^2.3.0",
"fsevents": "^1.2.2",
"glob-parent": "^3.1.0",
"inherits": "^2.0.1",
"is-binary-path": "^1.0.0",
"is-glob": "^4.0.0",
"lodash.debounce": "^4.0.8",
"normalize-path": "^2.1.1",
"path-is-absolute": "^1.0.0",
"readdirp": "^2.0.0",
"upath": "^1.0.5"
}
},
"chownr": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz",
"integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==",
"dev": true
},
"chrome-trace-event": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz",
"integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==",
"dev": true,
"requires": {
"tslib": "^1.9.0"
}
},
"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==",
"dev": true,
"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==",
"dev": true,
"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=",
"dev": true,
"requires": {
"is-descriptor": "^0.1.0"
}
}
}
},
"cliui": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
"integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
"dev": true,
"requires": {
"string-width": "^1.0.1",
"strip-ansi": "^3.0.1",
"wrap-ansi": "^2.0.0"
}
},
"clone-deep": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz",
"integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==",
"dev": true,
"requires": {
"for-own": "^1.0.0",
"is-plain-object": "^2.0.4",
"kind-of": "^6.0.0",
"shallow-clone": "^1.0.0"
}
},
"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=",
"dev": true
},
"collection-visit": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
"integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
"dev": true,
"requires": {
"map-visit": "^1.0.0",
"object-visit": "^1.0.0"
}
},
"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==",
"dev": true,
"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=",
"dev": true
},
"combined-stream": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
"integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
"dev": true,
"requires": {
"delayed-stream": "~1.0.0"
}
},
"commander": {
"version": "2.17.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
"integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
"dev": true
},
"commondir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
"integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
"dev": true
},
"component-emitter": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
"integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
"dev": true
},
"compose-function": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz",
"integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=",
"dev": true,
"requires": {
"arity-n": "^1.0.4"
}
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
"concat-stream": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
"integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
"dev": true,
"requires": {
"buffer-from": "^1.0.0",
"inherits": "^2.0.3",
"readable-stream": "^2.2.2",
"typedarray": "^0.0.6"
}
},
"console-browserify": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
"integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
"dev": true,
"requires": {
"date-now": "^0.1.4"
}
},
"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=",
"dev": true
},
"constants-browserify": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
"integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
"dev": true
},
"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==",
"dev": true,
"requires": {
"safe-buffer": "~5.1.1"
}
},
"copy-concurrently": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
"integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
"dev": true,
"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=",
"dev": true
},
"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=",
"dev": true
},
"create-ecdh": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
"integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
"dev": true,
"requires": {
"bn.js": "^4.1.0",
"elliptic": "^6.0.0"
}
},
"create-hash": {
"version": "1.2.0",
"resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
"integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
"dev": true,
"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": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
"integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
"dev": true,
"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": "3.0.1",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
"integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
"dev": true,
"requires": {
"lru-cache": "^4.0.1",
"which": "^1.2.9"
}
},
"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==",
"dev": true,
"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==",
"dev": true,
"requires": {
"inherits": "^2.0.3",
"source-map": "^0.6.1",
"source-map-resolve": "^0.5.2",
"urix": "^0.1.0"
}
},
"css-loader": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz",
"integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==",
"dev": true,
"requires": {
"babel-code-frame": "^6.26.0",
"css-selector-tokenizer": "^0.7.0",
"icss-utils": "^2.1.0",
"loader-utils": "^1.0.2",
"lodash": "^4.17.11",
"postcss": "^6.0.23",
"postcss-modules-extract-imports": "^1.2.0",
"postcss-modules-local-by-default": "^1.2.0",
"postcss-modules-scope": "^1.1.0",
"postcss-modules-values": "^1.3.0",
"postcss-value-parser": "^3.3.0",
"source-list-map": "^2.0.0"
}
},
"css-selector-tokenizer": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz",
"integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==",
"dev": true,
"requires": {
"cssesc": "^0.1.0",
"fastparse": "^1.1.1",
"regexpu-core": "^1.0.0"
}
},
"cssesc": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz",
"integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=",
"dev": true
},
"currently-unhandled": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
"integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
"dev": true,
"requires": {
"array-find-index": "^1.0.1"
}
},
"cyclist": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz",
"integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=",
"dev": true
},
"d": {
"version": "1.0.0",
"resolved": "http://registry.npmjs.org/d/-/d-1.0.0.tgz",
"integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
"dev": true,
"requires": {
"es5-ext": "^0.10.9"
}
},
"dashdash": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
"dev": true,
"requires": {
"assert-plus": "^1.0.0"
}
},
"date-now": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
"integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
"dev": true
},
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
},
"decamelize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
"dev": true
},
"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=",
"dev": true
},
"define-property": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
"integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
"dev": true,
"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==",
"dev": true,
"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==",
"dev": true,
"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==",
"dev": true,
"requires": {
"is-accessor-descriptor": "^1.0.0",
"is-data-descriptor": "^1.0.0",
"kind-of": "^6.0.2"
}
}
}
},
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
"dev": true
},
"delegates": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
"dev": true
},
"des.js": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
"integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
"dev": true,
"requires": {
"inherits": "^2.0.1",
"minimalistic-assert": "^1.0.0"
}
},
"diffie-hellman": {
"version": "5.0.3",
"resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
"integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
"dev": true,
"requires": {
"bn.js": "^4.1.0",
"miller-rabin": "^4.0.0",
"randombytes": "^2.0.0"
}
},
"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==",
"dev": true
},
"duplexify": {
"version": "3.6.1",
"resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz",
"integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==",
"dev": true,
"requires": {
"end-of-stream": "^1.0.0",
"inherits": "^2.0.1",
"readable-stream": "^2.0.0",
"stream-shift": "^1.0.0"
}
},
"ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
"integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
"dev": true,
"requires": {
"jsbn": "~0.1.0",
"safer-buffer": "^2.1.0"
}
},
"elliptic": {
"version": "6.4.1",
"resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz",
"integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==",
"dev": true,
"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"
}
},
"emojis-list": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
"integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
"dev": true
},
"end-of-stream": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
"integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
"dev": true,
"requires": {
"once": "^1.4.0"
}
},
"enhanced-resolve": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
"integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
"memory-fs": "^0.4.0",
"tapable": "^1.0.0"
}
},
"errno": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
"integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
"dev": true,
"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==",
"dev": true,
"requires": {
"is-arrayish": "^0.2.1"
}
},
"es5-ext": {
"version": "0.10.46",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.46.tgz",
"integrity": "sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw==",
"dev": true,
"requires": {
"es6-iterator": "~2.0.3",
"es6-symbol": "~3.1.1",
"next-tick": "1"
}
},
"es6-iterator": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
"integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
"dev": true,
"requires": {
"d": "1",
"es5-ext": "^0.10.35",
"es6-symbol": "^3.1.1"
}
},
"es6-symbol": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
"integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
"dev": true,
"requires": {
"d": "1",
"es5-ext": "~0.10.14"
}
},
"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=",
"dev": true
},
"eslint-scope": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz",
"integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==",
"dev": true,
"requires": {
"esrecurse": "^4.1.0",
"estraverse": "^4.1.1"
}
},
"esrecurse": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
"integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
"dev": true,
"requires": {
"estraverse": "^4.1.0"
}
},
"estraverse": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
"integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
"dev": true
},
"esutils": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
"integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
"dev": true
},
"events": {
"version": "1.1.1",
"resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz",
"integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
"dev": true
},
"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==",
"dev": true,
"requires": {
"md5.js": "^1.3.4",
"safe-buffer": "^5.1.1"
}
},
"execa": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz",
"integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==",
"dev": true,
"requires": {
"cross-spawn": "^6.0.0",
"get-stream": "^3.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"
},
"dependencies": {
"cross-spawn": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
"integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
"dev": true,
"requires": {
"nice-try": "^1.0.4",
"path-key": "^2.0.1",
"semver": "^5.5.0",
"shebang-command": "^1.2.0",
"which": "^1.2.9"
}
}
}
},
"expand-brackets": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
"integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
"dev": true,
"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": {
"define-property": {
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
"dev": true,
"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=",
"dev": true,
"requires": {
"is-extendable": "^0.1.0"
}
}
}
},
"extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
"dev": true
},
"extend-shallow": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
"integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
"dev": true,
"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==",
"dev": true,
"requires": {
"is-plain-object": "^2.0.4"
}
}
}
},
"extglob": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
"integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
"dev": true,
"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=",
"dev": true,
"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=",
"dev": true,
"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==",
"dev": true,
"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==",
"dev": true,
"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==",
"dev": true,
"requires": {
"is-accessor-descriptor": "^1.0.0",
"is-data-descriptor": "^1.0.0",
"kind-of": "^6.0.2"
}
}
}
},
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
"dev": true
},
"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=",
"dev": true
},
"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=",
"dev": true
},
"fastparse": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
"integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
"dev": true
},
"figgy-pudding": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz",
"integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==",
"dev": true
},
"file-loader": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/file-loader/-/file-loader-2.0.0.tgz",
"integrity": "sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==",
"dev": true,
"requires": {
"loader-utils": "^1.0.2",
"schema-utils": "^1.0.0"
}
},
"fill-range": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
"integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
"dev": true,
"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=",
"dev": true,
"requires": {
"is-extendable": "^0.1.0"
}
}
}
},
"find-cache-dir": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz",
"integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==",
"dev": true,
"requires": {
"commondir": "^1.0.1",
"make-dir": "^1.0.0",
"pkg-dir": "^3.0.0"
}
},
"find-up": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
"integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
"dev": true,
"requires": {
"path-exists": "^2.0.0",
"pinkie-promise": "^2.0.0"
}
},
"flush-write-stream": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz",
"integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==",
"dev": true,
"requires": {
"inherits": "^2.0.1",
"readable-stream": "^2.0.4"
}
},
"for-in": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
"integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
"dev": true
},
"for-own": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
"integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
"dev": true,
"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=",
"dev": true
},
"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==",
"dev": true,
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
"mime-types": "^2.1.12"
}
},
"fragment-cache": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
"integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
"dev": true,
"requires": {
"map-cache": "^0.2.2"
}
},
"from2": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
"integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
"dev": true,
"requires": {
"inherits": "^2.0.1",
"readable-stream": "^2.0.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=",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
"iferr": "^0.1.5",
"imurmurhash": "^0.1.4",
"readable-stream": "1 || 2"
}
},
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
"fsevents": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz",
"integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==",
"dev": true,
"optional": true,
"requires": {
"nan": "^2.9.2",
"node-pre-gyp": "^0.10.0"
},
"dependencies": {
"abbrev": {
"version": "1.1.1",
"bundled": true,
"dev": true,
"optional": true
},
"ansi-regex": {
"version": "2.1.1",
"bundled": true,
"dev": true
},
"aproba": {
"version": "1.2.0",
"bundled": true,
"dev": true,
"optional": true
},
"are-we-there-yet": {
"version": "1.1.4",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"delegates": "^1.0.0",
"readable-stream": "^2.0.6"
}
},
"balanced-match": {
"version": "1.0.0",
"bundled": true,
"dev": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
"dev": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"chownr": {
"version": "1.0.1",
"bundled": true,
"dev": true,
"optional": true
},
"code-point-at": {
"version": "1.1.0",
"bundled": true,
"dev": true
},
"concat-map": {
"version": "0.0.1",
"bundled": true,
"dev": true
},
"console-control-strings": {
"version": "1.1.0",
"bundled": true,
"dev": true
},
"core-util-is": {
"version": "1.0.2",
"bundled": true,
"dev": true,
"optional": true
},
"debug": {
"version": "2.6.9",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"ms": "2.0.0"
}
},
"deep-extend": {
"version": "0.5.1",
"bundled": true,
"dev": true,
"optional": true
},
"delegates": {
"version": "1.0.0",
"bundled": true,
"dev": true,
"optional": true
},
"detect-libc": {
"version": "1.0.3",
"bundled": true,
"dev": true,
"optional": true
},
"fs-minipass": {
"version": "1.2.5",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"minipass": "^2.2.1"
}
},
"fs.realpath": {
"version": "1.0.0",
"bundled": true,
"dev": true,
"optional": true
},
"gauge": {
"version": "2.7.4",
"bundled": true,
"dev": 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.2",
"bundled": true,
"dev": 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,
"dev": true,
"optional": true
},
"iconv-lite": {
"version": "0.4.21",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"safer-buffer": "^2.1.0"
}
},
"ignore-walk": {
"version": "3.0.1",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"minimatch": "^3.0.4"
}
},
"inflight": {
"version": "1.0.6",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"once": "^1.3.0",
"wrappy": "1"
}
},
"inherits": {
"version": "2.0.3",
"bundled": true,
"dev": true
},
"ini": {
"version": "1.3.5",
"bundled": true,
"dev": true,
"optional": true
},
"is-fullwidth-code-point": {
"version": "1.0.0",
"bundled": true,
"dev": true,
"requires": {
"number-is-nan": "^1.0.0"
}
},
"isarray": {
"version": "1.0.0",
"bundled": true,
"dev": true,
"optional": true
},
"minimatch": {
"version": "3.0.4",
"bundled": true,
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"minimist": {
"version": "0.0.8",
"bundled": true,
"dev": true
},
"minipass": {
"version": "2.2.4",
"bundled": true,
"dev": true,
"requires": {
"safe-buffer": "^5.1.1",
"yallist": "^3.0.0"
}
},
"minizlib": {
"version": "1.1.0",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"minipass": "^2.2.1"
}
},
"mkdirp": {
"version": "0.5.1",
"bundled": true,
"dev": true,
"requires": {
"minimist": "0.0.8"
}
},
"ms": {
"version": "2.0.0",
"bundled": true,
"dev": true,
"optional": true
},
"needle": {
"version": "2.2.0",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"debug": "^2.1.2",
"iconv-lite": "^0.4.4",
"sax": "^1.2.4"
}
},
"node-pre-gyp": {
"version": "0.10.0",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"detect-libc": "^1.0.2",
"mkdirp": "^0.5.1",
"needle": "^2.2.0",
"nopt": "^4.0.1",
"npm-packlist": "^1.1.6",
"npmlog": "^4.0.2",
"rc": "^1.1.7",
"rimraf": "^2.6.1",
"semver": "^5.3.0",
"tar": "^4"
}
},
"nopt": {
"version": "4.0.1",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"abbrev": "1",
"osenv": "^0.1.4"
}
},
"npm-bundled": {
"version": "1.0.3",
"bundled": true,
"dev": true,
"optional": true
},
"npm-packlist": {
"version": "1.1.10",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"ignore-walk": "^3.0.1",
"npm-bundled": "^1.0.1"
}
},
"npmlog": {
"version": "4.1.2",
"bundled": true,
"dev": 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,
"dev": true
},
"object-assign": {
"version": "4.1.1",
"bundled": true,
"dev": true,
"optional": true
},
"once": {
"version": "1.4.0",
"bundled": true,
"dev": true,
"requires": {
"wrappy": "1"
}
},
"os-homedir": {
"version": "1.0.2",
"bundled": true,
"dev": true,
"optional": true
},
"os-tmpdir": {
"version": "1.0.2",
"bundled": true,
"dev": true,
"optional": true
},
"osenv": {
"version": "0.1.5",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"os-homedir": "^1.0.0",
"os-tmpdir": "^1.0.0"
}
},
"path-is-absolute": {
"version": "1.0.1",
"bundled": true,
"dev": true,
"optional": true
},
"process-nextick-args": {
"version": "2.0.0",
"bundled": true,
"dev": true,
"optional": true
},
"rc": {
"version": "1.2.7",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"deep-extend": "^0.5.1",
"ini": "~1.3.0",
"minimist": "^1.2.0",
"strip-json-comments": "~2.0.1"
},
"dependencies": {
"minimist": {
"version": "1.2.0",
"bundled": true,
"dev": true,
"optional": true
}
}
},
"readable-stream": {
"version": "2.3.6",
"bundled": true,
"dev": 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.2",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"glob": "^7.0.5"
}
},
"safe-buffer": {
"version": "5.1.1",
"bundled": true,
"dev": true
},
"safer-buffer": {
"version": "2.1.2",
"bundled": true,
"dev": true,
"optional": true
},
"sax": {
"version": "1.2.4",
"bundled": true,
"dev": true,
"optional": true
},
"semver": {
"version": "5.5.0",
"bundled": true,
"dev": true,
"optional": true
},
"set-blocking": {
"version": "2.0.0",
"bundled": true,
"dev": true,
"optional": true
},
"signal-exit": {
"version": "3.0.2",
"bundled": true,
"dev": true,
"optional": true
},
"string-width": {
"version": "1.0.2",
"bundled": true,
"dev": 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,
"dev": true,
"optional": true,
"requires": {
"safe-buffer": "~5.1.0"
}
},
"strip-ansi": {
"version": "3.0.1",
"bundled": true,
"dev": true,
"requires": {
"ansi-regex": "^2.0.0"
}
},
"strip-json-comments": {
"version": "2.0.1",
"bundled": true,
"dev": true,
"optional": true
},
"tar": {
"version": "4.4.1",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"chownr": "^1.0.1",
"fs-minipass": "^1.2.5",
"minipass": "^2.2.4",
"minizlib": "^1.1.0",
"mkdirp": "^0.5.0",
"safe-buffer": "^5.1.1",
"yallist": "^3.0.2"
}
},
"util-deprecate": {
"version": "1.0.2",
"bundled": true,
"dev": true,
"optional": true
},
"wide-align": {
"version": "1.1.2",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"string-width": "^1.0.2"
}
},
"wrappy": {
"version": "1.0.2",
"bundled": true,
"dev": true
},
"yallist": {
"version": "3.0.2",
"bundled": true,
"dev": true
}
}
},
"fstream": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
"integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
"inherits": "~2.0.0",
"mkdirp": ">=0.5 0",
"rimraf": "2"
}
},
"gauge": {
"version": "2.7.4",
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
"dev": 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"
}
},
"gaze": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
"integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
"dev": true,
"requires": {
"globule": "^1.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==",
"dev": true
},
"get-stdin": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
"integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
"dev": true
},
"get-stream": {
"version": "3.0.0",
"resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
"integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
"dev": true
},
"get-value": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
"integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
"dev": true
},
"getpass": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
"dev": true,
"requires": {
"assert-plus": "^1.0.0"
}
},
"glob": {
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
"integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
"dev": 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"
}
},
"glob-parent": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
"integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
"dev": true,
"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=",
"dev": true,
"requires": {
"is-extglob": "^2.1.0"
}
}
}
},
"global-modules-path": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.1.tgz",
"integrity": "sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg==",
"dev": true
},
"globule": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz",
"integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==",
"dev": true,
"requires": {
"glob": "~7.1.1",
"lodash": "~4.17.10",
"minimatch": "~3.0.2"
}
},
"graceful-fs": {
"version": "4.1.15",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
"integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
"dev": true
},
"har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
"dev": true
},
"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==",
"dev": true,
"requires": {
"ajv": "^6.5.5",
"har-schema": "^2.0.0"
}
},
"has-ansi": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
"integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
"dev": true,
"requires": {
"ansi-regex": "^2.0.0"
}
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
"has-unicode": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
"dev": true
},
"has-value": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
"integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
"dev": true,
"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=",
"dev": true,
"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=",
"dev": true,
"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=",
"dev": true,
"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==",
"dev": true,
"requires": {
"inherits": "^2.0.3",
"minimalistic-assert": "^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=",
"dev": true,
"requires": {
"hash.js": "^1.0.3",
"minimalistic-assert": "^1.0.0",
"minimalistic-crypto-utils": "^1.0.1"
}
},
"hosted-git-info": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
"integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
"dev": true
},
"http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
"dev": true,
"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=",
"dev": true
},
"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=",
"dev": true
},
"icss-utils": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz",
"integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=",
"dev": true,
"requires": {
"postcss": "^6.0.1"
}
},
"ieee754": {
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
"integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==",
"dev": true
},
"iferr": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
"integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
"dev": true
},
"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==",
"dev": true,
"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=",
"dev": true
},
"in-publish": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz",
"integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=",
"dev": true
},
"indent-string": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
"integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
"dev": true,
"requires": {
"repeating": "^2.0.0"
}
},
"indexof": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
"integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
"dev": true
},
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"requires": {
"once": "^1.3.0",
"wrappy": "1"
}
},
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
},
"interpret": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
"integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
"dev": true
},
"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=",
"dev": true
},
"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=",
"dev": true,
"requires": {
"kind-of": "^3.0.2"
},
"dependencies": {
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
"is-buffer": "^1.1.5"
}
}
}
},
"is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
"integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
"dev": true
},
"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=",
"dev": true,
"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==",
"dev": true
},
"is-builtin-module": {
"version": "1.0.0",
"resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
"integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
"dev": true,
"requires": {
"builtin-modules": "^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=",
"dev": true,
"requires": {
"kind-of": "^3.0.2"
},
"dependencies": {
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
"is-buffer": "^1.1.5"
}
}
}
},
"is-descriptor": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
"dev": true,
"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==",
"dev": true
}
}
},
"is-extendable": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
"integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
"dev": true
},
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
"dev": true
},
"is-finite": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
"integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
"dev": true,
"requires": {
"number-is-nan": "^1.0.0"
}
},
"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=",
"dev": true,
"requires": {
"number-is-nan": "^1.0.0"
}
},
"is-glob": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
"integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
"dev": true,
"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=",
"dev": true,
"requires": {
"kind-of": "^3.0.2"
},
"dependencies": {
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
"is-buffer": "^1.1.5"
}
}
}
},
"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==",
"dev": true,
"requires": {
"isobject": "^3.0.1"
}
},
"is-stream": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
"dev": true
},
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
"dev": true
},
"is-utf8": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
"integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
"dev": true
},
"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==",
"dev": true
},
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
"dev": true
},
"isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
"integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
"dev": true
},
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
"dev": true
},
"js-base64": {
"version": "2.4.9",
"resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.9.tgz",
"integrity": "sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ==",
"dev": true
},
"js-tokens": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
"integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
"dev": true
},
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
"dev": true
},
"jsesc": {
"version": "0.5.0",
"resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
"integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
"dev": true
},
"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==",
"dev": true
},
"json-schema": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
"integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
"dev": true
},
"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==",
"dev": true
},
"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=",
"dev": true
},
"json5": {
"version": "0.5.1",
"resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
"integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
"dev": true
},
"jsprim": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
"integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
"dev": true,
"requires": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
"json-schema": "0.2.3",
"verror": "1.10.0"
}
},
"kind-of": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
"integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
"dev": true
},
"lcid": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
"integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
"dev": true,
"requires": {
"invert-kv": "^1.0.0"
}
},
"load-json-file": {
"version": "1.1.0",
"resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
"integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
"dev": true,
"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"
}
},
"loader-runner": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz",
"integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==",
"dev": true
},
"loader-utils": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
"integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
"dev": true,
"requires": {
"big.js": "^3.1.3",
"emojis-list": "^2.0.0",
"json5": "^0.5.0"
}
},
"locate-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
"dev": true,
"requires": {
"p-locate": "^3.0.0",
"path-exists": "^3.0.0"
},
"dependencies": {
"path-exists": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
"integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
"dev": true
}
}
},
"lodash": {
"version": "4.17.11",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
"integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
"dev": true
},
"lodash._baseassign": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
"integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=",
"dev": true,
"requires": {
"lodash._basecopy": "^3.0.0",
"lodash.keys": "^3.0.0"
}
},
"lodash._basecopy": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
"integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
"dev": true
},
"lodash._bindcallback": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz",
"integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=",
"dev": true
},
"lodash._createassigner": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz",
"integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=",
"dev": true,
"requires": {
"lodash._bindcallback": "^3.0.0",
"lodash._isiterateecall": "^3.0.0",
"lodash.restparam": "^3.0.0"
}
},
"lodash._getnative": {
"version": "3.9.1",
"resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
"integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
"dev": true
},
"lodash._isiterateecall": {
"version": "3.0.9",
"resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
"integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
"dev": true
},
"lodash.assign": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
"integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=",
"dev": true
},
"lodash.clonedeep": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
"dev": true
},
"lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
"integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
"dev": true
},
"lodash.defaults": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
"integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=",
"dev": true
},
"lodash.isarguments": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
"integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
"dev": true
},
"lodash.isarray": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
"integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
"dev": true
},
"lodash.keys": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
"integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
"dev": true,
"requires": {
"lodash._getnative": "^3.0.0",
"lodash.isarguments": "^3.0.0",
"lodash.isarray": "^3.0.0"
}
},
"lodash.mergewith": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz",
"integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==",
"dev": true
},
"lodash.restparam": {
"version": "3.6.1",
"resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz",
"integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=",
"dev": true
},
"lodash.tail": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz",
"integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=",
"dev": true
},
"loud-rejection": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
"integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
"dev": true,
"requires": {
"currently-unhandled": "^0.4.1",
"signal-exit": "^3.0.0"
}
},
"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==",
"dev": true,
"requires": {
"pseudomap": "^1.0.2",
"yallist": "^2.1.2"
}
},
"make-dir": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
"integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
"dev": true,
"requires": {
"pify": "^3.0.0"
},
"dependencies": {
"pify": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
"integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
"dev": true
}
}
},
"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==",
"dev": true,
"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=",
"dev": true
},
"map-obj": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
"integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
"dev": true
},
"map-visit": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
"integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
"dev": true,
"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==",
"dev": true,
"requires": {
"hash-base": "^3.0.0",
"inherits": "^2.0.1",
"safe-buffer": "^5.1.2"
}
},
"mem": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz",
"integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==",
"dev": true,
"requires": {
"map-age-cleaner": "^0.1.1",
"mimic-fn": "^1.0.0",
"p-is-promise": "^1.1.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=",
"dev": true,
"requires": {
"errno": "^0.1.3",
"readable-stream": "^2.0.1"
}
},
"meow": {
"version": "3.7.0",
"resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
"integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
"dev": true,
"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"
}
},
"micromatch": {
"version": "3.1.10",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
"integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
"dev": true,
"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"
}
},
"miller-rabin": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
"integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
"dev": true,
"requires": {
"bn.js": "^4.0.0",
"brorand": "^1.0.1"
}
},
"mime-db": {
"version": "1.37.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
"integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
"dev": true
},
"mime-types": {
"version": "2.1.21",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
"integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
"dev": true,
"requires": {
"mime-db": "~1.37.0"
}
},
"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==",
"dev": true
},
"mini-css-extract-plugin": {
"version": "0.4.5",
"resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.5.tgz",
"integrity": "sha512-dqBanNfktnp2hwL2YguV9Jh91PFX7gu7nRLs4TGsbAfAG6WOtlynFRYzwDwmmeSb5uIwHo9nx1ta0f7vAZVp2w==",
"dev": true,
"requires": {
"loader-utils": "^1.1.0",
"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==",
"dev": true
},
"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=",
"dev": true
},
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"minimist": {
"version": "1.2.0",
"resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"dev": true
},
"mississippi": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
"integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
"dev": true,
"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.1",
"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
"integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
"dev": true,
"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==",
"dev": true,
"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=",
"dev": true,
"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=",
"dev": true
}
}
},
"mkdirp": {
"version": "0.5.1",
"resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"dev": true,
"requires": {
"minimist": "0.0.8"
},
"dependencies": {
"minimist": {
"version": "0.0.8",
"resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
"dev": true
}
}
},
"move-concurrently": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
"integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
"dev": true,
"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.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
},
"nan": {
"version": "2.11.1",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz",
"integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==",
"dev": true
},
"nanomatch": {
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
"integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
"dev": true,
"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"
}
},
"neo-async": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz",
"integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==",
"dev": true
},
"next-tick": {
"version": "1.0.0",
"resolved": "http://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
"integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
"dev": true
},
"nice-try": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
"integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
"dev": true
},
"node-gyp": {
"version": "3.8.0",
"resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
"integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
"dev": true,
"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": "http://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
"integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
"dev": true
}
}
},
"node-libs-browser": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz",
"integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==",
"dev": true,
"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": "^1.0.0",
"https-browserify": "^1.0.0",
"os-browserify": "^0.3.0",
"path-browserify": "0.0.0",
"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.10.3",
"vm-browserify": "0.0.4"
},
"dependencies": {
"punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
"integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
"dev": true
}
}
},
"node-sass": {
"version": "4.10.0",
"resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.10.0.tgz",
"integrity": "sha512-fDQJfXszw6vek63Fe/ldkYXmRYK/QS6NbvM3i5oEo9ntPDy4XX7BcKZyTKv+/kSSxRtXXc7l+MSwEmYc0CSy6Q==",
"dev": true,
"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.assign": "^4.2.0",
"lodash.clonedeep": "^4.3.2",
"lodash.mergewith": "^4.6.0",
"meow": "^3.7.0",
"mkdirp": "^0.5.1",
"nan": "^2.10.0",
"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"
}
},
"nopt": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
"integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
"dev": true,
"requires": {
"abbrev": "1"
}
},
"normalize-package-data": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
"integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
"dev": true,
"requires": {
"hosted-git-info": "^2.1.4",
"is-builtin-module": "^1.0.0",
"semver": "2 || 3 || 4 || 5",
"validate-npm-package-license": "^3.0.1"
}
},
"normalize-path": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
"integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
"dev": true,
"requires": {
"remove-trailing-separator": "^1.0.1"
}
},
"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=",
"dev": true,
"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==",
"dev": 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",
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
"dev": true
},
"oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
"dev": true
},
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"dev": true
},
"object-copy": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
"integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
"dev": true,
"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=",
"dev": true,
"requires": {
"is-descriptor": "^0.1.0"
}
},
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
"is-buffer": "^1.1.5"
}
}
}
},
"object-path": {
"version": "0.9.2",
"resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz",
"integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=",
"dev": true
},
"object-visit": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
"integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
"dev": true,
"requires": {
"isobject": "^3.0.0"
}
},
"object.pick": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
"integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
"dev": true,
"requires": {
"isobject": "^3.0.1"
}
},
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"requires": {
"wrappy": "1"
}
},
"os-browserify": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
"integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
"dev": true
},
"os-homedir": {
"version": "1.0.2",
"resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
"dev": true
},
"os-locale": {
"version": "1.4.0",
"resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
"integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
"dev": true,
"requires": {
"lcid": "^1.0.0"
}
},
"os-tmpdir": {
"version": "1.0.2",
"resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
"dev": true
},
"osenv": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
"integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
"dev": true,
"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=",
"dev": true
},
"p-finally": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
"integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
"dev": true
},
"p-is-promise": {
"version": "1.1.0",
"resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
"integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=",
"dev": true
},
"p-limit": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz",
"integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==",
"dev": true,
"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==",
"dev": true,
"requires": {
"p-limit": "^2.0.0"
}
},
"p-try": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
"integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
"dev": true
},
"pako": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.7.tgz",
"integrity": "sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ==",
"dev": true
},
"parallel-transform": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz",
"integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=",
"dev": true,
"requires": {
"cyclist": "~0.2.2",
"inherits": "^2.0.3",
"readable-stream": "^2.1.5"
}
},
"parse-asn1": {
"version": "5.1.1",
"resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz",
"integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==",
"dev": true,
"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"
}
},
"parse-json": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
"integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
"dev": true,
"requires": {
"error-ex": "^1.2.0"
}
},
"pascalcase": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
"integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
"dev": true
},
"path-browserify": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
"integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
"dev": true
},
"path-dirname": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
"integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
"dev": true
},
"path-exists": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
"integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
"dev": true,
"requires": {
"pinkie-promise": "^2.0.0"
}
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true
},
"path-key": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
"integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
"dev": true
},
"path-type": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
"integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
"pify": "^2.0.0",
"pinkie-promise": "^2.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==",
"dev": true,
"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=",
"dev": true
},
"pify": {
"version": "2.3.0",
"resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
"dev": true
},
"pinkie": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
"integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
"dev": true
},
"pinkie-promise": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
"integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
"dev": true,
"requires": {
"pinkie": "^2.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==",
"dev": true,
"requires": {
"find-up": "^3.0.0"
},
"dependencies": {
"find-up": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
"dev": true,
"requires": {
"locate-path": "^3.0.0"
}
}
}
},
"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=",
"dev": true
},
"postcss": {
"version": "6.0.23",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
"integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
"dev": true,
"requires": {
"chalk": "^2.4.1",
"source-map": "^0.6.1",
"supports-color": "^5.4.0"
},
"dependencies": {
"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==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
}
},
"chalk": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
"integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
}
}
},
"postcss-modules-extract-imports": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz",
"integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==",
"dev": true,
"requires": {
"postcss": "^6.0.1"
}
},
"postcss-modules-local-by-default": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz",
"integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=",
"dev": true,
"requires": {
"css-selector-tokenizer": "^0.7.0",
"postcss": "^6.0.1"
}
},
"postcss-modules-scope": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz",
"integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=",
"dev": true,
"requires": {
"css-selector-tokenizer": "^0.7.0",
"postcss": "^6.0.1"
}
},
"postcss-modules-values": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz",
"integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=",
"dev": true,
"requires": {
"icss-replace-symbols": "^1.1.0",
"postcss": "^6.0.1"
}
},
"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==",
"dev": true
},
"process": {
"version": "0.11.10",
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
"integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
"dev": true
},
"process-nextick-args": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
"integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
"dev": true
},
"promise-inflight": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
"integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
"dev": true
},
"prr": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
"integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
"dev": true
},
"pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
"dev": true
},
"psl": {
"version": "1.1.29",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz",
"integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==",
"dev": true
},
"public-encrypt": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
"integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
"dev": true,
"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==",
"dev": true,
"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==",
"dev": true,
"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==",
"dev": true,
"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==",
"dev": true
},
"qs": {
"version": "6.5.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
"dev": true
},
"querystring": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
"integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
"dev": true
},
"querystring-es3": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
"integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
"dev": true
},
"randombytes": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
"integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==",
"dev": true,
"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==",
"dev": true,
"requires": {
"randombytes": "^2.0.5",
"safe-buffer": "^5.1.0"
}
},
"read-pkg": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
"integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
"dev": true,
"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=",
"dev": true,
"requires": {
"find-up": "^1.0.0",
"read-pkg": "^1.0.0"
}
},
"readable-stream": {
"version": "2.3.6",
"resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"dev": 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"
}
},
"readdirp": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
"integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.11",
"micromatch": "^3.1.10",
"readable-stream": "^2.0.2"
}
},
"redent": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
"integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
"dev": true,
"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==",
"dev": true
},
"regex-not": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
"integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
"dev": true,
"requires": {
"extend-shallow": "^3.0.2",
"safe-regex": "^1.1.0"
}
},
"regex-parser": {
"version": "2.2.9",
"resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.9.tgz",
"integrity": "sha512-VncXxOF6uFlYog5prG2j+e2UGJeam5MfNiJnB/qEgo4KTnMm2XrELCg4rNZ6IlaEUZnGlb8aB6lXowCRQtTkkA==",
"dev": true
},
"regexpu-core": {
"version": "1.0.0",
"resolved": "http://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz",
"integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=",
"dev": true,
"requires": {
"regenerate": "^1.2.1",
"regjsgen": "^0.2.0",
"regjsparser": "^0.1.4"
}
},
"regjsgen": {
"version": "0.2.0",
"resolved": "http://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
"integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
"dev": true
},
"regjsparser": {
"version": "0.1.5",
"resolved": "http://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
"integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
"dev": true,
"requires": {
"jsesc": "~0.5.0"
}
},
"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=",
"dev": true
},
"repeat-element": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
"integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
"dev": true
},
"repeat-string": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
"dev": true
},
"repeating": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
"integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
"dev": true,
"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==",
"dev": true,
"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"
}
},
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
"dev": true
},
"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=",
"dev": true
},
"resolve-cwd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
"integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
"dev": true,
"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=",
"dev": true
},
"resolve-url": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
"integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
"dev": true
},
"resolve-url-loader": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.0.0.tgz",
"integrity": "sha512-ZzRUnpu+pLkrN2ZBsEEifOD6W+9ZNtdIu+kY3vs+11PwuZ2WykxbAY9qO+S9SmasSDRllxNdSm9IhN8HU4xGKg==",
"dev": true,
"requires": {
"adjust-sourcemap-loader": "^1.1.0",
"camelcase": "^4.1.0",
"compose-function": "^3.0.3",
"convert-source-map": "^1.5.1",
"es6-iterator": "^2.0.3",
"loader-utils": "^1.1.0",
"lodash.defaults": "^4.0.0",
"postcss": "^7.0.0",
"rework": "^1.0.1",
"rework-visit": "^1.0.0",
"source-map": "^0.5.7"
},
"dependencies": {
"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==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
}
},
"camelcase": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
"integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
"dev": true
},
"chalk": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
"integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
},
"postcss": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz",
"integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==",
"dev": true,
"requires": {
"chalk": "^2.4.1",
"source-map": "^0.6.1",
"supports-color": "^5.5.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==",
"dev": true
}
}
},
"source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
"dev": true
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
}
}
},
"ret": {
"version": "0.1.15",
"resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
"integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
"dev": true
},
"rework": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz",
"integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=",
"dev": true,
"requires": {
"convert-source-map": "^0.3.3",
"css": "^2.0.0"
},
"dependencies": {
"convert-source-map": {
"version": "0.3.5",
"resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz",
"integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=",
"dev": true
}
}
},
"rework-visit": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz",
"integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=",
"dev": true
},
"rimraf": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
"integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
"dev": true,
"requires": {
"glob": "^7.0.5"
}
},
"ripemd160": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
"integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
"dev": true,
"requires": {
"hash-base": "^3.0.0",
"inherits": "^2.0.1"
}
},
"run-queue": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
"integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
"dev": true,
"requires": {
"aproba": "^1.1.1"
}
},
"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==",
"dev": true
},
"safe-regex": {
"version": "1.1.0",
"resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
"integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
"dev": true,
"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==",
"dev": true
},
"sass-graph": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz",
"integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=",
"dev": true,
"requires": {
"glob": "^7.0.0",
"lodash": "^4.0.0",
"scss-tokenizer": "^0.2.3",
"yargs": "^7.0.0"
}
},
"sass-loader": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz",
"integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==",
"dev": true,
"requires": {
"clone-deep": "^2.0.1",
"loader-utils": "^1.0.1",
"lodash.tail": "^4.1.1",
"neo-async": "^2.5.0",
"pify": "^3.0.0",
"semver": "^5.5.0"
},
"dependencies": {
"pify": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
"integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
"dev": true
}
}
},
"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==",
"dev": true,
"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=",
"dev": true,
"requires": {
"js-base64": "^2.1.8",
"source-map": "^0.4.2"
},
"dependencies": {
"source-map": {
"version": "0.4.4",
"resolved": "http://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
"integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
"dev": true,
"requires": {
"amdefine": ">=0.0.4"
}
}
}
},
"semver": {
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
"integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
"dev": true
},
"serialize-javascript": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz",
"integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==",
"dev": true
},
"set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
"dev": true
},
"set-value": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
"integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
"dev": true,
"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=",
"dev": true,
"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=",
"dev": true
},
"sha.js": {
"version": "2.4.11",
"resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
"integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
"dev": true,
"requires": {
"inherits": "^2.0.1",
"safe-buffer": "^5.0.1"
}
},
"shallow-clone": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz",
"integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==",
"dev": true,
"requires": {
"is-extendable": "^0.1.1",
"kind-of": "^5.0.0",
"mixin-object": "^2.0.1"
},
"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==",
"dev": true
}
}
},
"shebang-command": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
"integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
"dev": true,
"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=",
"dev": true
},
"signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
"dev": true
},
"snapdragon": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
"integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
"dev": true,
"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": {
"define-property": {
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
"dev": true,
"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=",
"dev": true,
"requires": {
"is-extendable": "^0.1.0"
}
},
"source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
"dev": true
}
}
},
"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==",
"dev": true,
"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=",
"dev": true,
"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==",
"dev": true,
"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==",
"dev": true,
"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==",
"dev": true,
"requires": {
"is-accessor-descriptor": "^1.0.0",
"is-data-descriptor": "^1.0.0",
"kind-of": "^6.0.2"
}
}
}
},
"snapdragon-util": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
"integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
"dev": true,
"requires": {
"kind-of": "^3.2.0"
},
"dependencies": {
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
"is-buffer": "^1.1.5"
}
}
}
},
"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==",
"dev": true
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
},
"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==",
"dev": true,
"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.9",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz",
"integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==",
"dev": true,
"requires": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
"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=",
"dev": true
},
"spdx-correct": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
"integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
"dev": true,
"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==",
"dev": true
},
"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==",
"dev": true,
"requires": {
"spdx-exceptions": "^2.1.0",
"spdx-license-ids": "^3.0.0"
}
},
"spdx-license-ids": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz",
"integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==",
"dev": true
},
"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==",
"dev": true,
"requires": {
"extend-shallow": "^3.0.0"
}
},
"sshpk": {
"version": "1.15.2",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz",
"integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==",
"dev": true,
"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==",
"dev": true,
"requires": {
"figgy-pudding": "^3.5.1"
}
},
"static-extend": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
"integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
"dev": true,
"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=",
"dev": true,
"requires": {
"is-descriptor": "^0.1.0"
}
}
}
},
"stdout-stream": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz",
"integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==",
"dev": true,
"requires": {
"readable-stream": "^2.0.1"
}
},
"stimulus": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/stimulus/-/stimulus-1.1.0.tgz",
"integrity": "sha512-H5B/jYGoKHW7KZCdkxsjml16wMp9ubHh/Db2ewcMWIV5Y4LOGKqYOKsNDs650DidKdGht8CBTtF7jAodIOHZMA==",
"dev": true,
"requires": {
"@stimulus/core": "^1.1.0",
"@stimulus/webpack-helpers": "^1.1.0"
}
},
"stream-browserify": {
"version": "2.0.1",
"resolved": "http://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
"integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
"dev": true,
"requires": {
"inherits": "~2.0.1",
"readable-stream": "^2.0.2"
}
},
"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==",
"dev": true,
"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==",
"dev": true,
"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"
}
},
"stream-shift": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
"integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
"dev": true
},
"string-width": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": 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",
"resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"requires": {
"safe-buffer": "~5.1.0"
}
},
"strip-ansi": {
"version": "3.0.1",
"resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"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=",
"dev": true,
"requires": {
"is-utf8": "^0.2.0"
}
},
"strip-eof": {
"version": "1.0.0",
"resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
"integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
"dev": true
},
"strip-indent": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
"integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
"dev": true,
"requires": {
"get-stdin": "^4.0.1"
}
},
"style-loader": {
"version": "0.23.1",
"resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz",
"integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==",
"dev": true,
"requires": {
"loader-utils": "^1.1.0",
"schema-utils": "^1.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=",
"dev": true
},
"tapable": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz",
"integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==",
"dev": true
},
"tar": {
"version": "2.2.1",
"resolved": "http://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
"integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
"dev": true,
"requires": {
"block-stream": "*",
"fstream": "^1.0.2",
"inherits": "2"
}
},
"terser": {
"version": "3.11.0",
"resolved": "https://registry.npmjs.org/terser/-/terser-3.11.0.tgz",
"integrity": "sha512-5iLMdhEPIq3zFWskpmbzmKwMQixKmTYwY3Ox9pjtSklBLnHiuQ0GKJLhL1HSYtyffHM3/lDIFBnb82m9D7ewwQ==",
"dev": true,
"requires": {
"commander": "~2.17.1",
"source-map": "~0.6.1",
"source-map-support": "~0.5.6"
}
},
"terser-webpack-plugin": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz",
"integrity": "sha512-61lV0DSxMAZ8AyZG7/A4a3UPlrbOBo8NIQ4tJzLPAdGOQ+yoNC7l5ijEow27lBAL2humer01KLS6bGIMYQxKoA==",
"dev": true,
"requires": {
"cacache": "^11.0.2",
"find-cache-dir": "^2.0.0",
"schema-utils": "^1.0.0",
"serialize-javascript": "^1.4.0",
"source-map": "^0.6.1",
"terser": "^3.8.1",
"webpack-sources": "^1.1.0",
"worker-farm": "^1.5.2"
}
},
"through2": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
"integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
"dev": true,
"requires": {
"readable-stream": "~2.3.6",
"xtend": "~4.0.1"
}
},
"timers-browserify": {
"version": "2.0.10",
"resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz",
"integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==",
"dev": true,
"requires": {
"setimmediate": "^1.0.4"
}
},
"to-arraybuffer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
"integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
"dev": true
},
"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=",
"dev": true,
"requires": {
"kind-of": "^3.0.2"
},
"dependencies": {
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
"is-buffer": "^1.1.5"
}
}
}
},
"to-regex": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
"integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
"dev": true,
"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=",
"dev": true,
"requires": {
"is-number": "^3.0.0",
"repeat-string": "^1.6.1"
}
},
"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==",
"dev": true,
"requires": {
"psl": "^1.1.24",
"punycode": "^1.4.1"
},
"dependencies": {
"punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
"integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
"dev": true
}
}
},
"trim-newlines": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
"integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
"dev": true
},
"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==",
"dev": true,
"requires": {
"glob": "^7.1.2"
}
},
"tslib": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
"integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
"dev": true
},
"tty-browserify": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
"integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
"dev": true
},
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
"dev": true,
"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=",
"dev": true
},
"typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
"dev": true
},
"union-value": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
"integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
"dev": true,
"requires": {
"arr-union": "^3.1.0",
"get-value": "^2.0.6",
"is-extendable": "^0.1.1",
"set-value": "^0.4.3"
},
"dependencies": {
"extend-shallow": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
"is-extendable": "^0.1.0"
}
},
"set-value": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
"integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
"dev": true,
"requires": {
"extend-shallow": "^2.0.1",
"is-extendable": "^0.1.1",
"is-plain-object": "^2.0.1",
"to-object-path": "^0.3.0"
}
}
}
},
"unique-filename": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
"integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
"dev": true,
"requires": {
"unique-slug": "^2.0.0"
}
},
"unique-slug": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz",
"integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==",
"dev": true,
"requires": {
"imurmurhash": "^0.1.4"
}
},
"unset-value": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
"integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
"dev": true,
"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=",
"dev": true,
"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=",
"dev": true,
"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=",
"dev": true
}
}
},
"upath": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz",
"integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==",
"dev": true
},
"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==",
"dev": true,
"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=",
"dev": true
},
"url": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
"integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
"dev": true,
"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=",
"dev": true
}
}
},
"use": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
"integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
"dev": true
},
"util": {
"version": "0.10.3",
"resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz",
"integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
"dev": true,
"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=",
"dev": true
}
}
},
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
"dev": true
},
"uuid": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
"integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
"dev": true
},
"v8-compile-cache": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz",
"integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==",
"dev": true
},
"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==",
"dev": true,
"requires": {
"spdx-correct": "^3.0.0",
"spdx-expression-parse": "^3.0.0"
}
},
"verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
"dev": true,
"requires": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
"extsprintf": "^1.2.0"
}
},
"vm-browserify": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
"integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
"dev": true,
"requires": {
"indexof": "0.0.1"
}
},
"watchpack": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz",
"integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==",
"dev": true,
"requires": {
"chokidar": "^2.0.2",
"graceful-fs": "^4.1.2",
"neo-async": "^2.5.0"
}
},
"webpack": {
"version": "4.27.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-4.27.1.tgz",
"integrity": "sha512-WArHiLvHrlfyRM8i7f+2SFbr/XbQ0bXqTkPF8JpHOzub5482Y3wx7rEO8stuLGOKOgZJcqcisLhD7LrM/+fVMw==",
"dev": true,
"requires": {
"@webassemblyjs/ast": "1.7.11",
"@webassemblyjs/helper-module-context": "1.7.11",
"@webassemblyjs/wasm-edit": "1.7.11",
"@webassemblyjs/wasm-parser": "1.7.11",
"acorn": "^5.6.2",
"acorn-dynamic-import": "^3.0.0",
"ajv": "^6.1.0",
"ajv-keywords": "^3.1.0",
"chrome-trace-event": "^1.0.0",
"enhanced-resolve": "^4.1.0",
"eslint-scope": "^4.0.0",
"json-parse-better-errors": "^1.0.2",
"loader-runner": "^2.3.0",
"loader-utils": "^1.1.0",
"memory-fs": "~0.4.1",
"micromatch": "^3.1.8",
"mkdirp": "~0.5.0",
"neo-async": "^2.5.0",
"node-libs-browser": "^2.0.0",
"schema-utils": "^0.4.4",
"tapable": "^1.1.0",
"terser-webpack-plugin": "^1.1.0",
"watchpack": "^1.5.0",
"webpack-sources": "^1.3.0"
},
"dependencies": {
"schema-utils": {
"version": "0.4.7",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz",
"integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==",
"dev": true,
"requires": {
"ajv": "^6.1.0",
"ajv-keywords": "^3.1.0"
}
}
}
},
"webpack-cli": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.2.tgz",
"integrity": "sha512-Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ==",
"dev": true,
"requires": {
"chalk": "^2.4.1",
"cross-spawn": "^6.0.5",
"enhanced-resolve": "^4.1.0",
"global-modules-path": "^2.3.0",
"import-local": "^2.0.0",
"interpret": "^1.1.0",
"loader-utils": "^1.1.0",
"supports-color": "^5.5.0",
"v8-compile-cache": "^2.0.2",
"yargs": "^12.0.2"
},
"dependencies": {
"ansi-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
"integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
"dev": true
},
"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==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
}
},
"camelcase": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz",
"integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==",
"dev": true
},
"chalk": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
"integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
},
"cliui": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
"integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
"dev": true,
"requires": {
"string-width": "^2.1.1",
"strip-ansi": "^4.0.0",
"wrap-ansi": "^2.0.0"
}
},
"cross-spawn": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
"integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
"dev": true,
"requires": {
"nice-try": "^1.0.4",
"path-key": "^2.0.1",
"semver": "^5.5.0",
"shebang-command": "^1.2.0",
"which": "^1.2.9"
}
},
"find-up": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
"dev": true,
"requires": {
"locate-path": "^3.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==",
"dev": true
},
"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=",
"dev": true
},
"lcid": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
"integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
"dev": true,
"requires": {
"invert-kv": "^2.0.0"
}
},
"os-locale": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz",
"integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==",
"dev": true,
"requires": {
"execa": "^0.10.0",
"lcid": "^2.0.0",
"mem": "^4.0.0"
}
},
"string-width": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
"dev": true,
"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=",
"dev": true,
"requires": {
"ansi-regex": "^3.0.0"
}
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.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=",
"dev": true
},
"yargs": {
"version": "12.0.5",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
"integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
"dev": true,
"requires": {
"cliui": "^4.0.0",
"decamelize": "^1.2.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": "^11.1.1"
}
},
"yargs-parser": {
"version": "11.1.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
"integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
"dev": true,
"requires": {
"camelcase": "^5.0.0",
"decamelize": "^1.2.0"
}
}
}
},
"webpack-sources": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz",
"integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==",
"dev": true,
"requires": {
"source-list-map": "^2.0.0",
"source-map": "~0.6.1"
}
},
"which": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
"requires": {
"isexe": "^2.0.0"
}
},
"which-module": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
"integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
"dev": true
},
"wide-align": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
"integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
"dev": true,
"requires": {
"string-width": "^1.0.2 || 2"
}
},
"worker-farm": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz",
"integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==",
"dev": true,
"requires": {
"errno": "~0.1.7"
}
},
"wrap-ansi": {
"version": "2.1.0",
"resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
"integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
"dev": true,
"requires": {
"string-width": "^1.0.1",
"strip-ansi": "^3.0.1"
}
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
"xtend": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
"integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
"dev": true
},
"y18n": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
"integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
"dev": true
},
"yallist": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
"dev": true
},
"yargs": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
"integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
"dev": true,
"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"
},
"dependencies": {
"camelcase": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
"integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
"dev": true
}
}
},
"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=",
"dev": true,
"requires": {
"camelcase": "^3.0.0"
},
"dependencies": {
"camelcase": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
"integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
"dev": true
}
}
}
}
}

26
cmd/server/package.json Normal file
View File

@ -0,0 +1,26 @@
{
"name": "server",
"version": "0.0.0",
"description": "Orion web application",
"main": "static/src/index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack-cli",
"watch": "webpack-cli --watch"
},
"author": "Cadoles <contact@cadoles.com>",
"license": "AGPL-3.0",
"devDependencies": {
"bulma": "^0.7.2",
"css-loader": "^1.0.1",
"file-loader": "^2.0.0",
"mini-css-extract-plugin": "^0.4.4",
"node-sass": "^4.10.0",
"resolve-url-loader": "^3.0.0",
"sass-loader": "^7.1.0",
"stimulus": "^1.1.0",
"style-loader": "^0.23.1",
"webpack": "^4.25.0",
"webpack-cli": "^3.1.2"
}
}

37
cmd/server/route.go Normal file
View File

@ -0,0 +1,37 @@
package main
import (
"net/http"
"forge.cadoles.com/wpetit/goweb/middleware/container"
"forge.cadoles.com/wpetit/goweb/service/template"
"forge.cadoles.com/wpetit/goweb/static"
"github.com/go-chi/chi"
"forge.cadoles.com/Pyxis/orion/cmd/server/jsonrpc"
)
func configureRoutes(r *chi.Mux) {
r.Get("/", serveHomepage)
r.Get("/modules", serveModulesList)
r.Post("/rpc", handleJSONRPC)
r.Get("/**", static.Dir(conf.AssetDir, "", r.NotFoundHandler()))
}
func serveHomepage(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "/modules", http.StatusFound)
}
func serveModulesList(w http.ResponseWriter, r *http.Request) {
ctn := container.Must(r.Context())
templateService := template.Must(ctn)
if err := templateService.RenderPage(w, "modules_list.html.tmpl", nil); err != nil {
panic(err)
}
}
func handleJSONRPC(w http.ResponseWriter, r *http.Request) {
ctn := container.Must(r.Context())
rpcServer := jsonrpc.Must(ctn)
rpcServer.ServeHTTP(w, r)
}

View File

@ -0,0 +1,21 @@
import { Controller } from "stimulus"
export default class extends Controller {
connect() {
this.updateLinkStatus();
}
updateLinkStatus() {
const href = window.location.href;
const links = Array.from(this.element.querySelectorAll("a[href]"));
links.forEach(l => {
if (l.href === href) {
l.classList.add("is-active");
} else {
l.classList.remove("is-active");
}
});
}
}

View File

@ -0,0 +1,18 @@
import { Controller } from "stimulus"
import { JSONRPC } from "../util/jsonrpc";
export default class extends Controller {
connect() {
this.rpc = new JSONRPC("/rpc");
}
listWifiDevices() {
return this.rpc.call("Orion.ScanWifi");
}
onScanClick() {
this.listWifiDevices().then(result => console.log(result));
}
}

View File

@ -0,0 +1,11 @@
require('bulma/bulma.sass');
import { Application } from "stimulus"
import { definitionsFromContext } from "stimulus/webpack-helpers"
const application = Application.start();
const localContext = require.context("./controllers", true, /\.js$/);
const definitions = [
...definitionsFromContext(localContext),
];
application.load(definitions);

View File

@ -0,0 +1,53 @@
export class RPCError extends Error {
constructor(source) {
super("A remote error occured");
this.source = source;
this.name = this.constructor.name;
if (typeof Error.captureStackTrace === 'function') {
Error.captureStackTrace(this, this.constructor);
} else {
this.stack = (new Error(message)).stack;
}
}
getSource() {
return this.source;
}
}
export class JSONRPC {
constructor(endpoint) {
this.endpoint = endpoint;
this.id = 0;
}
call(method, params, isNotification = false) {
const requestId = this.id++;
return fetch(this.endpoint, {
method: 'POST',
headers:{
'Content-Type': 'application/json',
},
body: JSON.stringify({
id: isNotification ? null : requestId,
method,
params: params || [],
})
})
.then(res => res.json())
.then(result => {
if (result.error) throw new RPCError(result.error);
if (!isNotification && requestId !== result.id) throw new Error("unexpected id in rpc response");
return result;
});
}
}

View File

@ -0,0 +1,27 @@
{{define "base"}}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Orion</title>
<link rel="stylesheet" href="/css/server.css">
</head>
<body>
{{template "navbar" .}}
<section class="section">
<div class="container">
<div class="columns">
<div class="column is-3">
{{template "menu" .}}
</div>
<div class="column is-9">
{{block "page_content" .}}{{end}}
</div>
</div>
</div>
</section>
<script type="text/javascript" src="/server.js"></script>
</body>
</html>
{{end}}

View File

@ -0,0 +1,10 @@
{{define "menu"}}
<aside class="menu" data-controller="menu">
<p class="menu-label">
Gestion de la flotte
</p>
<ul class="menu-list">
<li><a href="/modules">Modules</a></li>
</ul>
</aside>
{{end}}

View File

@ -0,0 +1,10 @@
{{define "navbar"}}
<nav class="navbar is-info" role="navigation" aria-label="main navigation">
<div class="container">
<div class="navbar-brand">
<a class="navbar-item" href="/">
<b>Orion</b>
</a>
</div>
</nav>
{{end}}

View File

@ -0,0 +1,24 @@
{{define "page_content"}}
<div data-controller="modules">
<div class="level is-mobile">
<div class="level-left">
<h4 class="is-size-4 level-item">Modules à portée</h4>
</div>
<div class="level-right">
<button data-action="click->modules#onScanClick" class="button is-primary">Scanner</button>
</div>
</div>
<table class="table">
<thead>
<tr>
<th>SSID</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<tr></tr>
</tbody>
</table>
</div>
{{end}}
{{template "base" .}}

View File

@ -0,0 +1,68 @@
const path = require('path');
const env = process.env;
// Plugins
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
mode: `${env.NODE_ENV ? env.NODE_ENV : 'production'}`,
entry: {
server: './static/src/index.js',
},
devtool: 'eval-source-map',
output: {
filename: '[name].js',
path: path.join(__dirname, 'static', 'dist')
},
module: {
rules: [{
test: /\.(scss|sass)$/,
include: [
path.resolve(__dirname, 'node_modules'),
],
use: [
MiniCssExtractPlugin.loader,
{
loader: "css-loader",
options: {}
},
{
loader: "resolve-url-loader",
options: {}
},
{
loader: "sass-loader",
options: {
sourceMap: true,
sourceMapContents: false
}
}
]
},{
test: /\.(woff(2)?|ttf|eot)(\?v=\d+\.\d+\.\d+)?$/,
use: [{
loader: 'file-loader',
options: {
name: '[name].[ext]',
outputPath: '/fonts/'
}
}]
},{
test: /\.(svg|png|jpg)(\?v=\d+\.\d+\.\d+)?$/,
use: [{
loader: 'file-loader',
options: {
name: '[name].[ext]',
outputPath: '/img/'
}
}]
}]
},
plugins: [
new MiniCssExtractPlugin({
filename: "/css/[name].css",
chunkFilename: "/css/[id].css"
})
]
}

View File

@ -0,0 +1,40 @@
FROM alpine:3.7 AS downloader
ARG HTTP_PROXY=""
ARG HTTPS_PROXY=""
ARG http_proxy=""
ARG https_proxy=""
ARG OPENWRT_VERSION=18.06.1
RUN apk add --no-cache wget tar
RUN wget -O openwrt.tar.gz https://downloads.openwrt.org/releases/${OPENWRT_VERSION}/targets/x86/generic/openwrt-${OPENWRT_VERSION}-x86-generic-generic-rootfs.tar.gz\
&& mkdir /openwrt \
&& tar -C /openwrt -xzf openwrt.tar.gz
FROM scratch
COPY --from=downloader /openwrt /
RUN mkdir -p /var/lock \
&& mkdir -p /var/run
USER root
# Install and enable Luci
RUN opkg update\
&& opkg install luci luci-mod-rpc\
&& /etc/init.d/uhttpd enable
RUN rm /lib/preinit/* &&\
echo > /lib/preinit/00_empty_dummy_script &&\
/etc/init.d/cron disable &&\
/etc/init.d/gpio_switch disable &&\
/etc/init.d/led disable &&\
/etc/init.d/dropbear disable &&\
/etc/init.d/network disable &&\
/etc/init.d/odhcpd disable &&\
/etc/init.d/sysctl disable &&\
/etc/init.d/sysfixtime disable &&\
/etc/init.d/sysntpd disable
CMD /sbin/init

4
doc/README.md Normal file
View File

@ -0,0 +1,4 @@
# Documentation
- [Préparer son environnement de développement](./prepa-dev.md)
- [Utilisation de l'environnement Compose](./compose.md)

22
doc/compose.md Normal file
View File

@ -0,0 +1,22 @@
# Utilisation de l'environnement Compose
Un environnement docker-compose est mis à disposition des développeurs afin de faciliter le processus de développement.
Cet environnement contient:
- Une installation d'OpenWRT basique
## Lancer l'environnement
Il vous faudra [Docker](https://docs.docker.com/install/) et [Compose](https://docs.docker.com/compose/overview/) sur votre machine.
Dans le répertoire du projet Orion, faites
```
docker-compose up
```
Les services suivants seront alors exposés sur votre machine:
- http://localhost:8080/ - Accès à l'interface LuCi du service OpenWRT

14
doc/debug-websocket.md Normal file
View File

@ -0,0 +1,14 @@
# Débugger la communication websocket avec ReachView
## Intercepter les connexions sur le module ReachRS
Il est possible d'intercepter et logger les communications sur la connexion websocket de ReachView.
Pour ce faire, se connecter en SSH sur le module ReachRS et lancer la commande:
```
tcpdump -nl -w - -i wlan0 -c 500 port 80|strings
```
## Intercepter les connexions sortantes depuis la machine de test

24
doc/prepa-dev.md Normal file
View File

@ -0,0 +1,24 @@
# Préparer son environnement de développement
### Dépendances
- [Go >= 1.11](https://golang.org/dl/)
### Procédure
1. Installer les outils de développement. Cette opération va notamment générer les bindings Qt pour l'application `notebook`. **Cette étape peut durer un certain temps**.
```shell
make install-devtools
```
2. Lancer le serveur
```shell
make watch
```
3. (Optionnel mais recommandé) Installer le hook Git `pre-commit`
```shell
rm -f .git/hooks/pre-commit.sample
ln -s "$PWD/misc/git-hooks/pre-commit" .git/hooks/pre-commit
```

12
docker-compose.yml Normal file
View File

@ -0,0 +1,12 @@
version: '2.2'
services:
openwrt:
build:
context: ./containers/openwrt
args:
HTTP_PROXY: ${HTTP_PROXY}
HTTPS_PROXY: ${HTTPS_PROXY}
http_proxy: ${http_proxy}
https_proxy: ${https_proxy}
ports:
- 8080:80

View File

@ -0,0 +1,17 @@
package emlid
const (
// EventBrowserConnected is emitted after the initial connection to the
// ReachView endpoint
eventBrowserConnected = "browser connected"
)
// sendBrowserConnected notifies the ReachView endpoint
// of a new connection.
// See misc/reachview/update_main.js line 297
func (c *Client) sendBrowserConnected() error {
payload := map[string]string{
"data": "I'm connected",
}
return c.Emit(eventBrowserConnected, payload)
}

158
emlid/client.go Normal file
View File

@ -0,0 +1,158 @@
package emlid
import (
"context"
"sync"
"forge.cadoles.com/Pyxis/golang-socketio"
"forge.cadoles.com/Pyxis/golang-socketio/transport"
"github.com/mitchellh/mapstructure"
"github.com/pkg/errors"
)
// Client is a ReachRS websocket API client
type Client struct {
opts *Options
conn *gosocketio.Client
}
// EventHandler is an event handler
type EventHandler func(data interface{})
// Connect connects the client to the ReachView endpoint
// This method is not safe to call by different coroutines
func (c *Client) Connect() error {
var err error
var wg sync.WaitGroup
wg.Add(1)
transport := &transport.WebsocketTransport{
PingInterval: c.opts.PingInterval,
PingTimeout: c.opts.PingTimeout,
ReceiveTimeout: c.opts.ReceiveTimeout,
SendTimeout: c.opts.SendTimeout,
BufferSize: c.opts.BufferSize,
}
c.Logf("connecting to '%s'", c.opts.Endpoint)
conn, err := gosocketio.Dial(c.opts.Endpoint, transport)
if err != nil {
return errors.Wrap(err, "error while connecting to endpoint")
}
c.conn = conn
err = conn.On(gosocketio.OnConnection, func(h *gosocketio.Channel) {
conn.Off(gosocketio.OnError)
c.Logf("connected with sid '%s'", h.Id())
err = c.sendBrowserConnected()
wg.Done()
})
if err != nil {
return errors.Wrap(err, "error while attaching to connection event")
}
err = conn.On(gosocketio.OnError, func(h *gosocketio.Channel) {
c.Logf("error")
err = errors.Errorf("an unknown error occured")
c.conn = nil
wg.Done()
})
if err != nil {
return errors.Wrap(err, "error while attaching to error event")
}
wg.Wait()
return err
}
// Close closes the current connection to the ReachView endpoint
func (c *Client) Close() {
if c.conn == nil {
return
}
c.conn.Close()
c.conn = nil
}
// Emit a new event with the given data
func (c *Client) Emit(event string, data interface{}) error {
c.Logf("emit '%s' event", event)
if err := c.conn.Emit(event, data); err != nil {
return errors.Wrapf(err, "error while emitting '%s' event", event)
}
c.Logf("'%s' event sent", event)
return nil
}
// On binds and event handler to the given event
func (c *Client) On(event string, handler interface{}) error {
return c.conn.On(event, handler)
}
// Off remove the handler bound to the given event
func (c *Client) Off(event string) {
c.conn.Off(event)
}
// ReqResp emits an event with the given data and waits for a response
func (c *Client) ReqResp(ctx context.Context,
requestEvent string, requestData interface{},
responseEvent string, res interface{}) error {
var err error
var wg sync.WaitGroup
var once sync.Once
done := func() {
c.conn.Off(responseEvent)
wg.Done()
}
wg.Add(1)
go func() {
<-ctx.Done()
err = ctx.Err()
once.Do(done)
}()
err = c.conn.On(responseEvent, func(_ *gosocketio.Channel, data interface{}) {
err = mapstructure.WeakDecode(data, res)
once.Do(done)
})
if err != nil {
return errors.Wrapf(err, "error while binding to '%s' event", responseEvent)
}
if err = c.Emit(requestEvent, requestData); err != nil {
return errors.Wrapf(err, "error while emitting event '%s'", requestEvent)
}
wg.Wait()
return err
}
// Logf logs the given message with the configured logger
func (c *Client) Logf(format string, args ...interface{}) {
if c.opts.Logger == nil {
return
}
c.opts.Logger.Printf(format, args...)
}
// NewClient returns a new ReachRS websocket client
func NewClient(opts ...OptionFunc) *Client {
options := DefaultOptions()
for _, o := range opts {
o(options)
}
return &Client{
opts: options,
}
}

57
emlid/discovery.go Normal file
View File

@ -0,0 +1,57 @@
package emlid
import (
"context"
"net"
"sync"
"github.com/grandcat/zeroconf"
)
// Service is a ReachRS service discovered via MDNS-SD
type Service struct {
Name string
AddrV4 *net.IP
Port int
}
// Discover tries to discover ReachRS services on the local network via mDNS-SD
func Discover(ctx context.Context) ([]Service, error) {
var wg sync.WaitGroup
wg.Add(1)
resolver, err := zeroconf.NewResolver()
if err != nil {
return nil, err
}
services := make([]Service, 0)
entries := make(chan *zeroconf.ServiceEntry)
go func() {
for e := range entries {
var addr *net.IP
if len(e.AddrIPv4) > 0 {
addr = &e.AddrIPv4[0]
}
srv := Service{
Name: e.Instance,
AddrV4: addr,
Port: e.Port,
}
services = append(services, srv)
}
wg.Done()
}()
if err = resolver.Browse(ctx, "_reach._tcp", ".local", entries); err != nil {
return nil, err
}
wg.Wait()
return services, nil
}

33
emlid/discovery_test.go Normal file
View File

@ -0,0 +1,33 @@
package emlid
import (
"context"
"testing"
"time"
)
func TestDiscovery(t *testing.T) {
if !*runDiscoveryIntegrationTests {
t.Skip("To run this test, use: go test -discovery-integration")
}
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
services, err := Discover(ctx)
if err != nil {
t.Fatal(err)
}
if g, e := len(services), 1; g != e {
t.Fatalf("len(services): got '%d', expected '%d'", g, e)
}
s := services[0]
if g, e := s.Name, "reach"; g != e {
t.Errorf("services[0].Name: got '%s', expected '%s'", g, e)
}
}

109
emlid/option.go Normal file
View File

@ -0,0 +1,109 @@
package emlid
import (
"log"
"os"
"time"
"forge.cadoles.com/Pyxis/golang-socketio"
)
// Logger is a logger implementation for the ReachRS client
type Logger interface {
Printf(format string, args ...interface{})
}
// Options are ReachRS client configuration options
type Options struct {
Endpoint string
PingInterval time.Duration
PingTimeout time.Duration
ReceiveTimeout time.Duration
SendTimeout time.Duration
BufferSize int
Logger Logger
}
// OptionFunc is an option configuration for the ReachRS client
type OptionFunc func(opts *Options)
// WithEndpoint configures the client to target the given host and port
func WithEndpoint(host string, port int) OptionFunc {
return func(opts *Options) {
opts.Endpoint = gosocketio.GetUrl(host, port, false)
}
}
// WithService configures the client to target the given ReachRS service
func WithService(service Service) OptionFunc {
return func(opts *Options) {
opts.Endpoint = gosocketio.GetUrl(service.AddrV4.String(), service.Port, false)
}
}
// WithPingInterval configures the client to use the given ping interval
func WithPingInterval(interval time.Duration) OptionFunc {
return func(opts *Options) {
opts.PingInterval = interval
}
}
// WithPingTimeout configures the client to use the given ping timeout
func WithPingTimeout(timeout time.Duration) OptionFunc {
return func(opts *Options) {
opts.PingTimeout = timeout
}
}
// WithReceiveTimeout configures the client to use the given receive timeout
func WithReceiveTimeout(timeout time.Duration) OptionFunc {
return func(opts *Options) {
opts.ReceiveTimeout = timeout
}
}
// WithSendTimeout configures the client to use the given send timeout
func WithSendTimeout(timeout time.Duration) OptionFunc {
return func(opts *Options) {
opts.SendTimeout = timeout
}
}
// WithBufferSize configures the client to use the given buffer size
func WithBufferSize(size int) OptionFunc {
return func(opts *Options) {
opts.BufferSize = size
}
}
// WithLogger configures the client to use the given logger
func WithLogger(logger Logger) OptionFunc {
return func(opts *Options) {
opts.Logger = logger
}
}
// WithStandardLogger configures the client to use the given standard logger
func WithStandardLogger() OptionFunc {
return func(opts *Options) {
logger := log.New(os.Stdout, "[reachrs] ", log.LstdFlags)
opts.Logger = logger
}
}
// DefaultOptions returns the default values for the client options
func DefaultOptions() *Options {
opts := &Options{}
defaults := []OptionFunc{
WithEndpoint("192.168.42.1", 80),
WithPingInterval(30 * time.Second),
WithPingTimeout(60 * time.Second),
WithReceiveTimeout(60 * time.Second),
WithSendTimeout(60 * time.Second),
WithBufferSize(1024 * 32),
}
for _, o := range defaults {
o(opts)
}
return opts
}

4
emlid/reach.go Normal file
View File

@ -0,0 +1,4 @@
// Package emlid is a package to configure EMLID ReachRS modules in Go.
//
// It aims to provide a simple interface to common ReachRS modules management operations.
package emlid

14
emlid/reachview/client.go Normal file
View File

@ -0,0 +1,14 @@
package reachview
import "forge.cadoles.com/Pyxis/orion/emlid"
// Client is a ReachRS Updater client
type Client struct {
*emlid.Client
}
// NewClient returns a new ReachRS ReachView client
func NewClient(opts ...emlid.OptionFunc) *Client {
client := emlid.NewClient(opts...)
return &Client{client}
}

View File

@ -0,0 +1,51 @@
package reachview
import "context"
const (
eventGetConfiguration = "get configuration"
eventCurrentConfiguration = "current configuration"
eventApplyConfiguration = "apply configuration"
eventConfigurationApplied = "configuration applied"
eventResetConfiguration = "reset configuration to default"
)
// Configuration fetches and return the current configuration of the ReachRS module
func (r *Client) Configuration(ctx context.Context) (*Configuration, error) {
configuration := &Configuration{}
if err := r.ReqResp(ctx, eventGetConfiguration, nil, eventCurrentConfiguration, configuration); err != nil {
return nil, err
}
return configuration, nil
}
type configurationApplied struct {
Configuration *Configuration `mapstructure:"configuration,omitempty"`
Result string `mapstructure:"result"`
Constraints *Constraints `mapstructure:"Constraints,omitempty"`
}
const (
// ConfigurationApplySuccess -
ConfigurationApplySuccess = "success"
// ConfigurationApplyFailed -
ConfigurationApplyFailed = "failed"
)
// ApplyConfiguration applies the given configuration
func (r *Client) ApplyConfiguration(ctx context.Context, config *Configuration) (string, *Configuration, error) {
res := &configurationApplied{}
if err := r.ReqResp(ctx, eventApplyConfiguration, config, eventConfigurationApplied, res); err != nil {
return ConfigurationApplyFailed, nil, err
}
return res.Result, res.Configuration, nil
}
// ResetConfiguration resets the module configuration to factory defaults
func (r *Client) ResetConfiguration(ctx context.Context) (string, *Configuration, error) {
res := &configurationApplied{}
if err := r.ReqResp(ctx, eventResetConfiguration, nil, eventConfigurationApplied, res); err != nil {
return ConfigurationApplyFailed, nil, err
}
return res.Result, res.Configuration, nil
}

View File

@ -0,0 +1,243 @@
package reachview
var (
// On -
On = String("on")
// Off -
Off = String("off")
// True -
True = Bool(true)
// False -
False = Bool(false)
// GPSARModeFixAndHold -
GPSARModeFixAndHold = String("fix-and-hold")
// GPSARModeContinuous -
GPSARModeContinuous = String("continuous")
// PositionningModeKinematic -
PositionningModeKinematic = String("kinematic")
// PositionningModeSingle -
PositionningModeSingle = String("single")
// PositionningModeStatic -
PositionningModeStatic = String("static")
// IOFormatRTCM3 -
IOFormatRTCM3 = String("rtcm3")
// IOTypeLoRa -
IOTypeLoRa = String("lora")
// BaseCoordinatesModeManual -
BaseCoordinatesModeManual = String("manual")
// BaseCoordinatesModeAverageFix -
BaseCoordinatesModeAverageFix = String("fix-and-hold")
// BaseCoordinatesModeAverageSingle -
BaseCoordinatesModeAverageSingle = String("single-and-hold")
// BaseCoordinatesModeAverageFloat -
BaseCoordinatesModeAverageFloat = String("float-and-hold")
// BaseCoordinatesFormatLLH -
BaseCoordinatesFormatLLH = String("llh")
// BaseCoordinatesFormatXYZ -
BaseCoordinatesFormatXYZ = String("xyz")
)
// String returns an string pointer
// This is a helper to constructs partials configations objects
// for the ApplyConfiguration() method
func String(v string) *string {
return &v
}
// Int returns an int pointer
// This is a helper to constructs partials configations objects
// for the ApplyConfiguration() method
func Int(v int) *int {
return &v
}
// Bool returns a bool pointer
// This is a helper to constructs partials configations objects
// for the ApplyConfiguration() method
func Bool(v bool) *bool {
return &v
}
// Float returns a float64 pointer
// This is a helper to constructs partials configations objects
// for the ApplyConfiguration() method
func Float(v float64) *float64 {
return &v
}
// Configuration -
type Configuration struct {
RTKSettings *RTKSettings `mapstructure:"rtk settings,omitempty" json:"rtk settings,omitempty"`
CorrectionInput *CorrectionInput `mapstructure:"correction input,omitempty" json:"correction input,omitempty"`
PositionOutput *PositionOutput `mapstructure:"position output,omitempty" json:"position output,omitempty"`
BaseMode *BaseMode `mapstructure:"base mode,omitempty" json:"base mode,omitempty"`
Logging *Logging `mapstructure:"logging,omitempty" json:"logging,omitempty"`
Bluetooth *Bluetooth `mapstructure:"bluetooth,omitempty" json:"bluetooth,omitempty"`
LoRa *LoRa `mapstructure:"lora,omitempty" json:"lora,omitempty"`
Constraints *Constraints `mapstructure:"constraints,omitempty" json:"constraints,omitempty"`
}
// RTKSettings -
type RTKSettings struct {
GLONASSARMode *string `mapstructure:"glonass ar mode,omitempty" json:"glonass ar mode,omitempty"`
UpdateRate *string `mapstructure:"update rate,omitempty" json:"update rate,omitempty"`
ElevationMaskAngle *string `mapstructure:"elevation mask angle,omitempty" json:"elevation mask angle,omitempty"`
MaxHorizontalAcceleration *string `mapstructure:"max horizontal acceleration,omitempty" json:"max horizontal acceleration,omitempty"`
SNRMask *string `mapstructure:"snr mask,omitempty" json:"snr mask,omitempty"`
GPSARMode *string `mapstructure:"gps ar mode,omitempty" json:"gps ar mode,omitempty"`
PositionningMode *string `mapstructure:"positioning mode,omitempty" json:"positioning mode,omitempty"`
PositioningSystems *PositionningSystems `mapstructure:"positioning systems,omitempty" json:"positioning systems,omitempty"`
MaxVerticalAcceleration *string `mapstructure:"max vertical acceleration,omitempty" json:"max vertical acceleration,omitempty"`
}
// PositionningSystems -
type PositionningSystems struct {
GLONASS *bool `mapstructure:"glonass,omitempty" json:"glonass,omitempty"`
SBAS *bool `mapstructure:"sbas,omitempty" json:"sbas,omitempty"`
QZS *bool `mapstructure:"qzs,omitempty" json:"qzs,omitempty"`
QZSS *bool `mapstructure:"qzss,omitempty" json:"qzss,omitempty"`
Compass *bool `mapstructure:"compass,omitempty" json:"compass,omitempty"`
Galileo *bool `mapstructure:"galileo,omitempty" json:"galileo,omitempty"`
GPS *bool `mapstructure:"gps,omitempty" json:"gps,omitempty"`
}
// CorrectionInput -
type CorrectionInput struct {
Input2 *Input2 `mapstructure:"input2,omitempty" json:"input2,omitempty"`
Input3 *Input3 `mapstructure:"input3,omitempty" json:"input3,omitempty"`
}
// Input -
type Input struct {
Path *string `mapstructure:"path,omitempty" json:"path,omitempty"`
Type *string `mapstructure:"type,omitempty" json:"type,omitempty"`
Enabled *bool `mapstructure:"enabled,omitempty" json:"enabled,omitempty"`
Format *string `mapstructure:"format,omitempty" json:"format,omitempty"`
}
// Input2 -
type Input2 struct {
Input `mapstructure:",squash"`
SendPositionToBase *string `mapstructure:"send position to base,omitempty" json:"send position to base,omitempty"`
}
// Input3 -
type Input3 struct {
Input `mapstructure:",squash"`
}
// PositionOutput -
type PositionOutput struct {
Output1 *Output `mapstructure:"output1,omitempty" json:"output1,omitempty"`
Output2 *Output `mapstructure:"output2,omitempty" json:"output2,omitempty"`
Output3 *Output `mapstructure:"output3,omitempty" json:"output3,omitempty"`
Output4 *Output `mapstructure:"output4,omitempty" json:"output4,omitempty"`
}
// Output -
type Output struct {
Path *string `mapstructure:"path,omitempty" json:"path,omitempty"`
Type *string `mapstructure:"type,omitempty" json:"type,omitempty"`
Enabled *bool `mapstructure:"enabled,omitempty" json:"enabled,omitempty"`
Format *string `mapstructure:"format,omitempty" json:"format,omitempty"`
}
// BaseMode -
type BaseMode struct {
Output *Output `mapstructure:"output,omitempty" json:"output,omitempty"`
BaseCoordinates *BaseCoordinates `mapstructure:"base coordinates,omitempty" json:"base coordinates,omitempty"`
RTCM3Messages *RTCM3Messages `mapstructure:"rtcm3 messages,omitempty" json:"rtcm3 messages,omitempty"`
}
// BaseCoordinates -
type BaseCoordinates struct {
Format *string `mapstructure:"format,omitempty" json:"format,omitempty"`
AntennaOffset *AntennaOffset `mapstructure:"antenna offset,omitempty" json:"antenna offset,omitempty"`
Accumulation *string `mapstructure:"accumulation,omitempty" json:"accumulation,omitempty"`
Coordinates []*string `mapstructure:"coordinates,omitempty" json:"coordinates,omitempty"`
Mode *string `mapstructure:"mode,omitempty" json:"mode,omitempty"`
}
// AntennaOffset -
type AntennaOffset struct {
East *string `mapstructure:"east,omitempty" json:"east,omitempty"`
North *string `mapstructure:"north,omitempty" json:"north,omitempty"`
Up *string `mapstructure:"up,omitempty" json:"up,omitempty"`
}
// RTCM3Messages -
type RTCM3Messages struct {
// GPS L1 code and phase and ambiguities and carrier-to-noise ratio
Type1002 *RTCMMessageType `mapstructure:"1002,omitemtpy" json:"1002,omitemtpy"`
// Station coordinates XYZ for antenna reference point and antenna height.
Type1006 *RTCMMessageType `mapstructure:"1006,omitemtpy" json:"1006,omitemtpy"`
// Antenna serial number.
Type1008 *RTCMMessageType `mapstructure:"1008,omitemtpy" json:"1008,omitemtpy"`
// GLONASS L1 code and phase and ambiguities and carrier-to-noise ratio.
Type1010 *RTCMMessageType `mapstructure:"1010,omitemtpy" json:"1010,omitemtpy"`
// GPS ephemeris.
Type1019 *RTCMMessageType `mapstructure:"1019,omitemtpy" json:"1019,omitemtpy"`
// GLONASS ephemeris.
Type1020 *RTCMMessageType `mapstructure:"1020,omitemtpy" json:"1020,omitemtpy"`
// The type 7 Multiple Signal Message format for Europes Galileo system
Type1097 *RTCMMessageType `mapstructure:"1097,omitemtpy" json:"1097,omitemtpy"`
// Full SBAS pseudo-ranges, carrier phases, Doppler and signal strength (high resolution)
Type1107 *RTCMMessageType `mapstructure:"1107,omitemtpy" json:"1107,omitemtpy"`
// Full QZSS pseudo-ranges, carrier phases, Doppler and signal strength (high resolution)
Type1117 *RTCMMessageType `mapstructure:"1117,omitemtpy" json:"1117,omitemtpy"`
// Full BeiDou pseudo-ranges, carrier phases, Doppler and signal strength (high resolution)
Type1127 *RTCMMessageType `mapstructure:"1127,omitemtpy" json:"1127,omitemtpy"`
}
// RTCMMessageType -
type RTCMMessageType struct {
Frequency *string `mapstructure:"frequency,omitempty" json:"frequency,omitempty"`
Enabled *bool `mapstructure:"enabled,omitempty" json:"enabled,omitempty"`
}
// Logging -
type Logging struct {
Correction *LoggingService `mapstructure:"correction,omitempty" json:"correction,omitempty"`
Interval *int `mapstructure:"interval,omitempty" json:"interval,omitempty"`
Solution *LoggingService `mapstructure:"solution,omitempty" json:"solution,omitempty"`
Raw *LoggingService `mapstructure:"raw,omitempty" json:"raw,omitempty"`
Base *LoggingService `mapstructure:"base,omitempty" json:"base,omitempty"`
Overwrite *bool `mapstructure:"overwrite,omitempty" json:"overwrite,omitempty"`
}
// LoggingService -
type LoggingService struct {
Started *bool `mapstructure:"started,omitempty" json:"started,omitempty"`
Version *string `mapstructure:"version,omitempty" json:"version,omitempty"`
Format *string `mapstructure:"format,omitempty" json:"format,omitempty"`
}
// Bluetooth -
type Bluetooth struct {
Enabled *bool `mapstructure:"enabled,omitempty" json:"enabled,omitempty"`
Discoverable *bool `mapstructure:"discoverable,omitempty" json:"discoverable,omitempty"`
Pin *int `mapstructure:"pin,omitempty" json:"pin,omitempty"`
}
// LoRa -
type LoRa struct {
AirRate *string `mapstructure:"air rate,omitempty" json:"air rate,omitempty"`
Frequency *float64 `mapstructure:"frequency,omitempty" json:"frequency,omitempty"`
OutputPower *string `mapstructure:"output power,omitempty" json:"output power,omitempty"`
}
// Constraints -
type Constraints struct {
LoRa *LoRaConstraints `mapstructure:"lora,omitempty" json:"lora,omitempty"`
}
// LoRaConstraints -
type LoRaConstraints struct {
Frequency *LoRaFrequencyRange `mapstructure:"frequency,omitempty" json:"frequency,omitempty"`
}
// LoRaFrequencyRange -
type LoRaFrequencyRange struct {
Min *int `mapstructure:"min,omitempty" json:"min,omitempty"`
Max *int `mapstructure:"max,omitempty" json:"max,omitempty"`
}

View File

@ -0,0 +1,91 @@
package reachview
import (
"context"
"testing"
"time"
"forge.cadoles.com/Pyxis/orion/emlid"
)
func TestReachViewConfiguration(t *testing.T) {
if !*runReachViewIntegrationTests {
t.Skip("To run this test, use: go test -reachview-integration")
}
client := NewClient(
emlid.WithStandardLogger(),
emlid.WithEndpoint(*reachHost, 80),
)
if err := client.Connect(); err != nil {
t.Fatal(err)
}
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
config, err := client.Configuration(ctx)
if err != nil {
t.Error(err)
}
if config == nil {
t.Fatal("config should not be nil")
}
if config.RTKSettings == nil {
t.Fatal("config.RTKSettings should not be nil")
}
defer client.Close()
}
func TestReachViewApplyConfiguration(t *testing.T) {
if !*runReachViewIntegrationTests {
t.Skip("To run this test, use: go test -reachview-integration")
}
client := NewClient(
emlid.WithStandardLogger(),
emlid.WithEndpoint(*reachHost, 80),
)
if err := client.Connect(); err != nil {
t.Fatal(err)
}
ctx, configurationCancel := context.WithTimeout(context.Background(), 5*time.Second)
defer configurationCancel()
config, err := client.Configuration(ctx)
if err != nil {
t.Error(err)
}
config.RTKSettings.PositionningMode = String("single")
ctx, applyConfCancel := context.WithTimeout(context.Background(), 5*time.Second)
defer applyConfCancel()
result, config, err := client.ApplyConfiguration(ctx, config)
if err != nil {
t.Error(err)
}
if config == nil {
t.Fatal("config should not be nil")
}
if config.RTKSettings == nil {
t.Fatal("config.RTKSettings should not be nil")
}
if g, e := result, ConfigurationApplySuccess; g != e {
t.Errorf("result: got '%s', expected '%s'", g, e)
}
defer client.Close()
}

10
emlid/reachview/rtk.go Normal file
View File

@ -0,0 +1,10 @@
package reachview
const (
eventRestartRTKLib = "restart rtklib"
)
// RestartRTKLib asks the ReachRS module to restart the RTKlib
func (c *Client) RestartRTKLib() error {
return c.Emit(eventRestartRTKLib, nil)
}

View File

@ -0,0 +1,142 @@
package reachview
import (
"context"
"forge.cadoles.com/Pyxis/golang-socketio"
"github.com/mitchellh/mapstructure"
)
const (
eventStatusBroadcast = "status broadcast"
)
// StatusBroadcast is a broadcasted message containing modules'
// positioning informations
/* Source sample
{
"receiver time mark count": "0",
"ant type base": "",
"solution status": "-",
"vel enu (m/s) base": "0.000,0.000,0.000",
"time of receiver clock rover": "2018/10/16 13:55:26.006000000",
"baseline length float (m)": "0.000",
"# of rtcm messages rover": "",
"time sys offset (ns)": "26.748,-6.962,0.000,0.000",
"# of average single pos base": "0",
"pos xyz float std (m) rover": "0.000,0.000,0.000",
"ant delta rover": "0.000 0.000 0.000",
"# of rtcm messages corr": "",
"accumulated time to run": "05:45:59.7",
"cpu time for a cycle (ms)": "16",
"Parameter": "Value",
"# of rtcm messages base": "",
"vel enu (m/s) rover": "0.467,0.476,0.577",
"ant type rover": "",
"pos xyz single (m) rover": "4315030.518,379718.279,4666208.342",
"pos xyz (m) base": "0.000,0.000,0.000",
"# of input data corr": "obs(0),nav(0),gnav(0),ion(0),sbs(0),pos(0),dgps(0),ssr(0),err(0)",
"rtk server state": "run",
"pos xyz fixed (m) rover": "0.000,0.000,0.000",
"age of differential (s)": "0.000",
"pos xyz fixed std (m) rover": "0.000,0.000,0.000",
"# of all estimated states": "170",
"processing cycle (ms)": "10",
"ant delta base": "0.000 0.000 0.000",
"# of valid satellites": "6",
"rtklib version": "2.4.3 Emlid b28",
"bytes in input buffer": "0,0",
"# of satellites rover": "11",
"# of input data rover": "obs(103738),nav(60),gnav(45),ion(3305),sbs(0),pos(0),dgps(0),ssr(0),err(0)",
"pos xyz float (m) rover": "0.000,0.000,0.000",
"ratio for ar validation": "0.000",
"pos llh (deg,m) base": "0.00000000,0.00000000,0.000",
"missing obs data count": "4468",
"# of real estimated states": "9",
"baseline length fixed (m)": "0.000",
"# of satellites base": "0",
"last time mark": "-",
"# of input data base": "obs(0),nav(0),gnav(0),ion(0),sbs(0),pos(0),dgps(0),ssr(0),err(0)",
"GDOP/PDOP/HDOP/VDOP": "0.0,0.0,0.0,0.0",
"positioning mode": "kinematic",
"pos llh single (deg,m) rover": "47.32085966,5.02901552,257.086",
"solution interval (s)": "0.200",
"rtklib time mark count": "0"
}
*/
type Status struct {
ReceiverTimeMarkCount int `mapstructure:"receiver time mark count"`
BaseAntType string `mapstructure:"ant type base"`
SolutionStatus string `mapstructure:"solution status"`
PositioningMode string `mapstructure:"positioning mode"`
BaseVelocityEnum string `mapstructure:"vel enu (m/s) base"`
RoverReceiverTime string `mapstructure:"time of receiver clock rover"`
BaselineLengthFloat string `mapstructure:"baseline length float (m)"`
RoverNumberOfRTCMMessages string `mapstructure:"# of rtcm messages rover"`
TimeSysOffset string `mapstructure:"time sys offset (ns)"`
BaseNumberOfAverageSinglePos int `mapstructure:"# of average single pos base"`
RoverPosXYZStandaloneFloat string `mapstructure:"pos xyz float std (m) rover"`
RoverAntDelta string `mapstructure:"ant delta rover"`
NumberOfRTCMCorrection string `mapstructure:"# of rtcm messages corr"`
AccumulatedTimeToRun string `mapstructure:"accumulated time to run"`
CPUTimeForACycle int `mapstructure:"cpu time for a cycle (ms)"`
Parameter string `mapstructure:"Parameter"`
BaseNumberOfRTCMMessages string `mapstructure:"# of rtcm messages base"`
RoverVelocityEnum string `mapstructure:"vel enu (m/s) rover"`
RoverAntType string `mapstructure:"ant type rover"`
RoverPosXYZSingle string `mapstructure:"pos xyz single (m) rover"`
BasePosXYZ string `mapstructure:"pos xyz (m) base"`
NumberOfInputDataCorrection string `mapstructure:"# of input data corr"`
RTKServerState string `mapstructure:"rtk server state"`
RoverPosXYZFixed string `mapstructure:"pos xyz fixed (m) rover"`
AgeOfDifferential float32 `mapstructure:"age of differential (s)"`
RoverPosXYZStandaloneFixed string `mapstructure:"pos xyz fixed std (m) rover"`
NumberOfAllEstimatedStates int `mapstructure:"# of all estimated states"`
ProcessingCycle int `mapstructure:"processing cycle (ms)"`
BaseAntDelta string `mapstructure:"ant delta base"`
NumberOfValidStellites int `mapstructure:"# of valid satellites"`
RTKLibVersion string `mapstructure:"2.4.3 Emlid b28"`
BytesInInputBuffer string `mapstructure:"bytes in input buffer"`
RoverNumberOfSatellites int `mapstructure:"# of satellites rover"`
RoverNumberOfInputData string `mapstructure:"# of input data rover"`
RoverPosXYZFloat string `mapstructure:"pos xyz float (m) rover"`
RatioForARValidation float32 `mapstructure:"ratio for ar validation"`
BasePosLLH string `mapstructure:"pos llh (deg,m) base"`
MissingObsDataCount int `mapstructure:"missing obs data count"`
NumberOfRealEstimatedStates int `mapstructure:"# of real estimated states"`
BaselineLengthFixed float32 `mapstructure:"baseline length fixed (m)"`
BaseNumberOfSatellites int `mapstructure:"# of satellites base"`
LastTimemark string `mapstructure:"last time mark"`
BaseNumberOfInputData string `mapstructure:"# of input data base"`
GdopPdopHdopVdop string `mapstructure:"GDOP/PDOP/HDOP/VDOP"`
RoverPosLLHSingle string `mapstructure:"pos llh single (deg,m) rover"`
SolutionInterval float32 `mapstructure:"solution interval (s)"`
RTKLibTimeMarkCount int `mapstructure:"rtklib time mark count"`
}
// StatusBroadcast listens for StatusBroadcast messages
func (c *Client) StatusBroadcast(ctx context.Context) (chan Status, error) {
out := make(chan Status)
handler := func(_ *gosocketio.Channel, data interface{}) {
res := Status{}
if err := mapstructure.WeakDecode(data, &res); err != nil {
c.Logf("error while decoding status broadcast: %s", err)
}
select {
case <-ctx.Done():
c.Off(eventStatusBroadcast)
close(out)
default:
out <- res
}
}
if err := c.On(eventStatusBroadcast, handler); err != nil {
return nil, err
}
return out, nil
}

View File

@ -0,0 +1,39 @@
package reachview
import (
"context"
"testing"
"time"
"forge.cadoles.com/Pyxis/orion/emlid"
"github.com/davecgh/go-spew/spew"
)
func TestReachViewStatusBroadcast(t *testing.T) {
if !*runReachViewIntegrationTests {
t.Skip("To run this test, use: go test -reachview-integration")
}
client := NewClient(
emlid.WithStandardLogger(),
emlid.WithEndpoint(*reachHost, 80),
)
if err := client.Connect(); err != nil {
t.Fatal(err)
}
defer client.Close()
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
statuses, err := client.StatusBroadcast(ctx)
if err != nil {
t.Fatal(err)
}
for s := range statuses {
spew.Dump(s)
}
}

View File

@ -0,0 +1,13 @@
package reachview
import "flag"
var runReachViewIntegrationTests = flag.Bool(
"reachview-integration", false,
"Run the 'ReachView' integration tests (in addition to the unit tests)",
)
var reachHost = flag.String(
"reach-host", "192.168.42.1",
"The Reach module host to use in integration tests",
)

15
emlid/updater/client.go Normal file
View File

@ -0,0 +1,15 @@
// Package updater provides an API to communicate with the ReachRS modules "Updater" application
package updater
import "forge.cadoles.com/Pyxis/orion/emlid"
// Client is a ReachRS Updater client
type Client struct {
*emlid.Client
}
// NewClient returns a new ReachRS Updater client
func NewClient(opts ...emlid.OptionFunc) *Client {
client := emlid.NewClient(opts...)
return &Client{client}
}

View File

@ -0,0 +1,39 @@
package updater
import (
"context"
"log"
"time"
"forge.cadoles.com/Pyxis/orion/emlid"
)
func Example_usage() {
// Create a new Updater client instance
updater := NewClient(
emlid.WithEndpoint("192.168.42.1", 80), // Define the module endpoint
)
// Connect to the ReachRS Updater endpoint
if err := updater.Connect(); err != nil {
log.Fatal(err)
}
// We create a context for the API call with a 10 second delay
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
// Retrieve the Wifi networks
networks, err := updater.WifiNetworks(ctx)
if err != nil {
log.Fatal(err)
}
// Do something with network
for _, n := range networks {
log.Printf("Save WiFi network: SSID: '%s', Security: '%s'", n.SSID, n.Security)
}
// Dont forget to close the connection when you are done
defer updater.Close()
}

View File

@ -0,0 +1,21 @@
package updater
import "context"
const (
eventGetReachViewVersion = "get reachview version"
eventReachViewVersionResults = "current reachview version"
)
type reachViewVersion struct {
Version string `json:"version"`
}
// ReachViewVersion returns the ReachRS module ReachView version
func (c *Client) ReachViewVersion(ctx context.Context) (string, error) {
res := &reachViewVersion{}
if err := c.ReqResp(ctx, eventGetReachViewVersion, nil, eventReachViewVersionResults, res); err != nil {
return "", err
}
return res.Version, nil
}

View File

@ -0,0 +1,37 @@
package updater
import (
"context"
"testing"
"time"
"forge.cadoles.com/Pyxis/orion/emlid"
)
func TestClientReachViewVersion(t *testing.T) {
if !*runUpdaterIntegrationTests {
t.Skip("To run this test, use: go test -updater-integration")
}
client := NewClient(
emlid.WithStandardLogger(),
emlid.WithEndpoint(*reachHost, 80),
)
if err := client.Connect(); err != nil {
t.Fatal(err)
}
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
version, err := client.ReachViewVersion(ctx)
if err != nil {
t.Error(err)
}
if version == "" {
t.Error("version should not be empty")
}
defer client.Close()
}

View File

@ -0,0 +1,56 @@
package updater
import (
"context"
"sync"
"forge.cadoles.com/Pyxis/golang-socketio"
"github.com/pkg/errors"
)
const (
eventReboot = "reboot now"
)
// RebootNow asks the ReachRS module to reboot now
func (c *Client) RebootNow(ctx context.Context, waitDisconnect bool) error {
var err error
var wg sync.WaitGroup
if waitDisconnect {
var once sync.Once
done := func() {
c.Off(gosocketio.OnDisconnection)
wg.Done()
}
wg.Add(1)
go func() {
<-ctx.Done()
err = ctx.Err()
once.Do(done)
}()
err = c.On(gosocketio.OnDisconnection, func(h *gosocketio.Channel) {
once.Do(done)
})
if err != nil {
return errors.Wrapf(err, "error while binding to '%s' event", gosocketio.OnDisconnection)
}
}
if err = c.Emit(eventReboot, nil); err != nil {
return err
}
if waitDisconnect {
wg.Wait()
}
return err
}

View File

@ -0,0 +1,37 @@
package updater
import (
"context"
"testing"
"time"
"forge.cadoles.com/Pyxis/orion/emlid"
)
func TestClientRebootNow(t *testing.T) {
if !*runUpdaterIntegrationTests {
t.Skip("To run this test, use: go test -updater-integration")
}
if !*runRebootTest {
t.Skip("To run this test, use: go test -updater-reboot-test")
}
client := NewClient(
emlid.WithStandardLogger(),
emlid.WithEndpoint(*reachHost, 80),
)
if err := client.Connect(); err != nil {
t.Fatal(err)
}
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := client.RebootNow(ctx, true); err != nil {
t.Error(err)
}
defer client.Close()
}

View File

@ -0,0 +1,23 @@
package updater
import "context"
const (
eventIsReceiverUpgradeAvailable = "is receiver upgrade available"
eventReceiverUpgradeAvailable = "receiver upgrade available"
)
type receiverUpgreAvailable struct {
Available bool `json:"available"`
Running bool `json:"running"`
}
// ReceiverUpgradeAvailable checks if an upgrade is avaialable/running for the ReachRS module
func (c *Client) ReceiverUpgradeAvailable(ctx context.Context) (bool, bool, error) {
res := &receiverUpgreAvailable{}
if err := c.ReqResp(ctx, eventIsReceiverUpgradeAvailable, nil, eventReceiverUpgradeAvailable, res); err != nil {
return false, false, err
}
c.Logf("receiver upgrade result: available: %v, running: %v", res.Available, res.Running)
return res.Available, res.Running, nil
}

View File

@ -0,0 +1,34 @@
package updater
import (
"context"
"testing"
"time"
"forge.cadoles.com/Pyxis/orion/emlid"
)
func TestClientReceiverUpgradeAvailable(t *testing.T) {
if !*runUpdaterIntegrationTests {
t.Skip("To run this test, use: go test -updater-integration")
}
client := NewClient(
emlid.WithStandardLogger(),
emlid.WithEndpoint(*reachHost, 80),
)
if err := client.Connect(); err != nil {
t.Fatal(err)
}
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
_, _, err := client.ReceiverUpgradeAvailable(ctx)
if err != nil {
t.Error(err)
}
defer client.Close()
}

View File

@ -0,0 +1,27 @@
package updater
import "context"
const (
eventGetTestResults = "get test results"
eventTestResults = "test results"
)
// TestResults are the ReachRS module's test results
//
type TestResults struct {
Device string `json:"device"`
Lora bool `json:"lora"`
MPU bool `json:"mpu"`
STC bool `json:"stc"`
UBlox bool `json:"u-blox"`
}
// TestResults returns the ReachRS module tests results
func (c *Client) TestResults(ctx context.Context) (*TestResults, error) {
res := &TestResults{}
if err := c.ReqResp(ctx, eventGetTestResults, nil, eventTestResults, res); err != nil {
return nil, err
}
return res, nil
}

View File

@ -0,0 +1,38 @@
package updater
import (
"context"
"testing"
"time"
"forge.cadoles.com/Pyxis/orion/emlid"
)
func TestClientTestResults(t *testing.T) {
if !*runUpdaterIntegrationTests {
t.Skip("To run this test, use: go test -updater-integration")
}
client := NewClient(
emlid.WithStandardLogger(),
emlid.WithEndpoint(*reachHost, 80),
)
if err := client.Connect(); err != nil {
t.Fatal(err)
}
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
results, err := client.TestResults(ctx)
if err != nil {
t.Error(err)
}
if g, e := results.Device, "ReachRS"; g != e {
t.Errorf("results.Device: got '%s', expected '%s'", g, e)
}
defer client.Close()
}

View File

@ -0,0 +1,23 @@
package updater
import "context"
const (
eventGetTimeSyncStatus = "get time sync status"
eventTimeSyncResults = "time sync status"
)
type timeSyncStatus struct {
Status bool `json:"status"`
}
// TimeSynced returns the ReachRS module time synchronization status.
// A true response means that the module has synchronized its clock.
func (c *Client) TimeSynced(ctx context.Context) (bool, error) {
res := &timeSyncStatus{}
if err := c.ReqResp(ctx, eventGetTimeSyncStatus, nil, eventTimeSyncResults, res); err != nil {
return false, err
}
c.Logf("time sync result: %v", res.Status)
return res.Status, nil
}

View File

@ -0,0 +1,34 @@
package updater
import (
"context"
"testing"
"time"
"forge.cadoles.com/Pyxis/orion/emlid"
)
func TestClientTimeSync(t *testing.T) {
if !*runUpdaterIntegrationTests {
t.Skip("To run this test, use: go test -updater-integration")
}
client := NewClient(
emlid.WithStandardLogger(),
emlid.WithEndpoint(*reachHost, 80),
)
if err := client.Connect(); err != nil {
t.Fatal(err)
}
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
_, err := client.TimeSynced(ctx)
if err != nil {
t.Error(err)
}
defer client.Close()
}

34
emlid/updater/update.go Normal file
View File

@ -0,0 +1,34 @@
package updater
import "context"
const (
eventUpdate = "update"
eventOPKGUpdateResult = "opkg update result"
eventSkipUpdate = "skip update"
)
// UpdateStatus embeds informations about update status
type UpdateStatus struct {
Active bool `json:"active"`
Locked bool `json:"locked"`
State string `json:"state"`
}
// Update asks the ReachRS module to start an OPKG update
func (c *Client) Update(ctx context.Context) (*UpdateStatus, error) {
res := &UpdateStatus{}
if err := c.ReqResp(ctx, eventUpdate, nil, eventOPKGUpdateResult, res); err != nil {
return nil, err
}
c.Logf(
"opkg update result: active: %v, state: %v, locked: %v",
res.Active, res.State, res.Locked,
)
return res, nil
}
// SkipUpdate asks the ReachRS module to skip the update
func (c *Client) SkipUpdate() error {
return c.Emit(eventSkipUpdate, nil)
}

View File

@ -0,0 +1,34 @@
package updater
import (
"context"
"testing"
"time"
"forge.cadoles.com/Pyxis/orion/emlid"
)
func TestClientOPKGUpdate(t *testing.T) {
if !*runUpdaterIntegrationTests {
t.Skip("To run this test, use: go test -updater-integration")
}
client := NewClient(
emlid.WithStandardLogger(),
emlid.WithEndpoint(*reachHost, 80),
)
if err := client.Connect(); err != nil {
t.Fatal(err)
}
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
_, err := client.Update(ctx)
if err != nil {
t.Error(err)
}
defer client.Close()
}

View File

@ -0,0 +1,23 @@
package updater
import "flag"
var runUpdaterIntegrationTests = flag.Bool(
"updater-integration", false,
"Run the 'Updater' integration tests (in addition to the unit tests)",
)
var runRebootTest = flag.Bool(
"updater-reboot-test", false,
"Run the updater 'Reboot' test (in addition to the unit tests)",
)
var runJoinNetworkTest = flag.Bool(
"updater-join-network-test", false,
"Run the updater 'JoinWiFiNetwork' test (in addition to the unit tests)",
)
var reachHost = flag.String(
"reach-host", "192.168.42.1",
"The Reach module host to use in integration tests",
)

View File

@ -0,0 +1,116 @@
package updater
import (
"context"
"sync"
"forge.cadoles.com/Pyxis/golang-socketio"
"github.com/pkg/errors"
)
const (
eventGetSavedWifiNetworks = "get saved wifi networks"
eventSavedWifiNetworkResults = "wifi saved networks results"
eventAddWifiNetwork = "add new network"
eventAddWifiNetworkResults = "add network results"
eventRemoveWifiNetwork = "remove network"
eventRemoveWifiNetworkResults = "remove network results"
eventConnectToNetwork = "connect to network"
)
// WifiSecurity is a WiFi network security algorithm
type WifiSecurity string
const (
// SecurityWEP WEP wifi network
SecurityWEP WifiSecurity = "wep"
// SecurityWPAPSK WPA(2)-PSK wifi network
SecurityWPAPSK WifiSecurity = "wpa-psk"
// SecurityOpen Open wifi network
SecurityOpen WifiSecurity = "open"
)
// WifiNetwork is a ReachRS module wifi network
type WifiNetwork struct {
SSID string `json:"ssid"`
Password string `json:"password"`
Security WifiSecurity `json:"security"`
Identity string `json:"identity"`
Visible bool `json:"is_visible"`
Connected bool `json:"is_connected"`
Added bool `json:"is_added"`
}
// WifiNetworks returns the ReachRS module wifi networks
func (c *Client) WifiNetworks(ctx context.Context) ([]WifiNetwork, error) {
res := make([]WifiNetwork, 0)
if err := c.ReqResp(ctx, eventGetSavedWifiNetworks, nil, eventSavedWifiNetworkResults, &res); err != nil {
return nil, err
}
return res, nil
}
// AddWifiNetwork asks the ReachRS module to save the given wifi network informations
func (c *Client) AddWifiNetwork(ctx context.Context, ssid string, security WifiSecurity, password string) (bool, error) {
res := false
network := &WifiNetwork{
SSID: ssid,
Security: security,
Password: password,
}
if err := c.ReqResp(ctx, eventAddWifiNetwork, network, eventAddWifiNetworkResults, &res); err != nil {
return false, err
}
return res, nil
}
// RemoveWifiNetwork asks the ReachRS module to remove the given WiFi network
func (c *Client) RemoveWifiNetwork(ctx context.Context, ssid string) (bool, error) {
res := false
if err := c.ReqResp(ctx, eventRemoveWifiNetwork, ssid, eventRemoveWifiNetworkResults, &res); err != nil {
return false, err
}
return res, nil
}
// JoinWifiNetwork asks the ReachRS module to join the given WiFi network
func (c *Client) JoinWifiNetwork(ctx context.Context, ssid string, waitDisconnect bool) error {
var err error
var wg sync.WaitGroup
if waitDisconnect {
var once sync.Once
done := func() {
c.Off(gosocketio.OnDisconnection)
wg.Done()
}
wg.Add(1)
go func() {
<-ctx.Done()
err = ctx.Err()
once.Do(done)
}()
err = c.On(gosocketio.OnDisconnection, func(h *gosocketio.Channel) {
once.Do(done)
})
if err != nil {
return errors.Wrapf(err, "error while binding to '%s' event", gosocketio.OnDisconnection)
}
}
if err := c.Emit(eventConnectToNetwork, ssid); err != nil {
return errors.Wrapf(err, "error while emitting '%s' event", eventConnectToNetwork)
}
if waitDisconnect {
wg.Wait()
}
return nil
}

View File

@ -0,0 +1,145 @@
package updater
import (
"context"
"fmt"
"math/rand"
"testing"
"time"
"forge.cadoles.com/Pyxis/orion/emlid"
)
func TestClientSavedWiFiNetworks(t *testing.T) {
if !*runUpdaterIntegrationTests {
t.Skip("To run this test, use: go test -updater-integration")
}
client := NewClient(
emlid.WithStandardLogger(),
emlid.WithEndpoint(*reachHost, 80),
)
if err := client.Connect(); err != nil {
t.Fatal(err)
}
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
_, err := client.WifiNetworks(ctx)
if err != nil {
t.Error(err)
}
defer client.Close()
}
func TestClientCRUDWiFiNetwork(t *testing.T) {
if !*runUpdaterIntegrationTests {
t.Skip("To run this test, use: go test -updater-integration")
}
client := NewClient(
emlid.WithStandardLogger(),
emlid.WithEndpoint(*reachHost, 80),
)
if err := client.Connect(); err != nil {
t.Fatal(err)
}
ssid := fmt.Sprintf("wifi_test_%d", rand.Uint32())
ctx := context.Background()
addWifiContext, addWifiCancel := context.WithTimeout(ctx, 5*time.Second)
defer addWifiCancel()
done, err := client.AddWifiNetwork(addWifiContext, ssid, SecurityOpen, "")
if err != nil {
t.Error(err)
}
if g, e := done, true; g != e {
t.Errorf("AddWifiNetwork() -> done: got '%v', expected '%v'", g, e)
}
wifiContext, wifiCancel := context.WithTimeout(ctx, 5*time.Second)
defer wifiCancel()
networks, err := client.WifiNetworks(wifiContext)
if err != nil {
t.Error(err)
}
found := false
for _, n := range networks {
if n.SSID == ssid {
found = true
break
}
}
if g, e := found, true; g != e {
t.Errorf("wifi network '%s' should exists", ssid)
}
removeWifiContext, removeWifiCancel := context.WithTimeout(ctx, 5*time.Second)
defer removeWifiCancel()
done, err = client.RemoveWifiNetwork(removeWifiContext, ssid)
if err != nil {
t.Error(err)
}
if g, e := done, true; g != e {
t.Errorf("RemoveWifiNetwork() -> done: got '%v', expected '%v'", g, e)
}
defer client.Close()
}
func TestClientWifiNetworkJoin(t *testing.T) {
if !*runUpdaterIntegrationTests {
t.Skip("To run this test, use: go test -updater-integration")
}
if !*runJoinNetworkTest {
t.Skip("To run this test, use: go test -updater-join-network-test")
}
client := NewClient(
emlid.WithStandardLogger(),
emlid.WithEndpoint(*reachHost, 80),
)
if err := client.Connect(); err != nil {
t.Fatal(err)
}
ssid := fmt.Sprintf("wifi_test_%d", rand.Uint32())
ctx := context.Background()
addWifiContext, addWifiCancel := context.WithTimeout(ctx, 5*time.Second)
defer addWifiCancel()
done, err := client.AddWifiNetwork(addWifiContext, ssid, SecurityOpen, "")
if err != nil {
t.Error(err)
}
if g, e := done, true; g != e {
t.Errorf("AddWifiNetwork() -> done: got '%v', expected '%v'", g, e)
}
joinWifiContext, joinWifiCancel := context.WithTimeout(ctx, 5*time.Second)
defer joinWifiCancel()
if err := client.JoinWifiNetwork(joinWifiContext, ssid, true); err != nil {
t.Error(err)
}
time.Sleep(5 * time.Second)
defer client.Close()
}

8
emlid/util_test.go Normal file
View File

@ -0,0 +1,8 @@
package emlid
import "flag"
var runDiscoveryIntegrationTests = flag.Bool(
"discovery-integration", false,
"Run the 'Discovery' integration tests (in addition to the unit tests)",
)

93
example/base-pos/main.go Normal file
View File

@ -0,0 +1,93 @@
package main
import (
"context"
"flag"
"log"
"time"
"forge.cadoles.com/Pyxis/orion/emlid"
"forge.cadoles.com/Pyxis/orion/emlid/reachview"
)
var (
host = "192.168.42.1"
)
func init() {
flag.StringVar(&host, "host", host, "ReachRS module host")
}
func main() {
flag.Parse()
c := connect()
defer c.Close()
log.Println("updating base manual position")
// 42["apply configuration",{"base mode":{"base coordinates":{"coordinates":["0","0","0"],"antenna offset":{"up":"0","east":"0","north":"0"},"format":"llh","mode":"fix-and-hold","accumulation":"2"}}}]
config := &reachview.Configuration{
BaseMode: &reachview.BaseMode{
BaseCoordinates: &reachview.BaseCoordinates{
Coordinates: []*string{
reachview.String("2"),
reachview.String("0"),
reachview.String("0"),
},
AntennaOffset: &reachview.AntennaOffset{
East: reachview.String("0"),
North: reachview.String("0"),
Up: reachview.String("2"),
},
Format: reachview.BaseCoordinatesFormatLLH,
Mode: reachview.String("manual"),
},
},
}
applyConfiguration(c, config)
log.Println("done")
}
func connect() *reachview.Client {
c := reachview.NewClient(
emlid.WithEndpoint(host, 80),
)
log.Printf("connecting to module '%s'", host)
if err := c.Connect(); err != nil {
log.Fatal(err)
}
log.Println("connected")
return c
}
func applyConfiguration(c *reachview.Client, config *reachview.Configuration) {
ctx, applyConfCancel := context.WithTimeout(context.Background(), 20*time.Second)
defer applyConfCancel()
result, _, err := c.ApplyConfiguration(ctx, config)
if err != nil {
log.Fatal(err)
}
if result != reachview.ConfigurationApplySuccess {
log.Fatal("configuration update failed !")
}
log.Println("restarting rtklib")
if err := c.RestartRTKLib(); err != nil {
log.Fatal(err)
}
}

41
example/discovery/main.go Normal file
View File

@ -0,0 +1,41 @@
package main
import (
"context"
"flag"
"log"
"time"
"forge.cadoles.com/Pyxis/orion/emlid"
)
var (
timeout = 5 * time.Second
)
func init() {
flag.DurationVar(&timeout, "timeout", timeout, "mDNS scan timeout")
}
func main() {
flag.Parse()
log.Println("Searching for ReachRS services on network...")
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
services, err := emlid.Discover(ctx)
if err != nil {
log.Fatal(err)
}
for _, s := range services {
log.Println("Found:")
log.Printf(" Name: '%s'", s.Name)
log.Printf(" Hosts: %s", s.AddrV4)
log.Printf(" Port: '%d'", s.Port)
}
}

View File

@ -0,0 +1,16 @@
# Example: ReachView
A simple example of a ReachView client that can:
- Configure a ReachRS module as "base" or "rover"
## Usage
1. Boot your ReachRS module in "ReachView" mode
2. Launch the example:
```shell
go run example/reachview/main.go \
-mode 'rover|base'\
-host '<DEVICE_IP_ADDRESS'\
```

228
example/reachview/main.go Normal file
View File

@ -0,0 +1,228 @@
package main
import (
"context"
"flag"
"fmt"
"log"
"strings"
"time"
"forge.cadoles.com/Pyxis/orion/emlid"
"forge.cadoles.com/Pyxis/orion/emlid/reachview"
)
const (
modeRover = "rover"
modeBase = "base"
)
var (
mode = modeRover
host = "192.168.42.1"
)
func init() {
modes := []string{modeRover, modeBase}
flag.StringVar(
&mode, "mode", mode,
fmt.Sprintf("The configuration mode. Available: %v", strings.Join(modes, ", ")),
)
flag.StringVar(&host, "host", host, "ReachRS module host")
}
func main() {
flag.Parse()
switch mode {
case modeRover:
configureRover()
case modeBase:
configureBase()
default:
log.Fatalf("unknown mode '%s'", mode)
}
log.Println("done")
}
func connect() *reachview.Client {
c := reachview.NewClient(
emlid.WithEndpoint(host, 80),
)
log.Printf("connecting to module '%s'", host)
if err := c.Connect(); err != nil {
log.Fatal(err)
}
log.Println("connected")
return c
}
func configureRover() {
c := connect()
defer c.Close()
resetConfiguration(c)
config := getCommonConfiguration()
config.RTKSettings.GPSARMode = reachview.GPSARModeFixAndHold
config.RTKSettings.GLONASSARMode = reachview.On
config.RTKSettings.PositionningMode = reachview.PositionningModeKinematic
config.RTKSettings.UpdateRate = reachview.String("5")
config.CorrectionInput = &reachview.CorrectionInput{
Input2: &reachview.Input2{
Input: reachview.Input{
Enabled: reachview.True,
Format: reachview.IOFormatRTCM3,
Type: reachview.IOTypeLoRa,
Path: reachview.String("lora"),
},
SendPositionToBase: reachview.Off,
},
}
log.Println("configuring module as rover")
applyConfiguration(c, config)
}
func configureBase() {
c := connect()
defer c.Close()
resetConfiguration(c)
log.Println("configuring module as base")
config := getCommonConfiguration()
config.RTKSettings.UpdateRate = reachview.String("1")
config.BaseMode = &reachview.BaseMode{
Output: &reachview.Output{
Enabled: reachview.True,
Format: reachview.IOFormatRTCM3,
Type: reachview.IOTypeLoRa,
},
BaseCoordinates: &reachview.BaseCoordinates{
Accumulation: reachview.String("1"),
AntennaOffset: &reachview.AntennaOffset{
Up: reachview.String("0"),
},
Mode: reachview.BaseCoordinatesModeAverageSingle,
Format: reachview.BaseCoordinatesFormatLLH,
},
RTCM3Messages: &reachview.RTCM3Messages{
Type1002: &reachview.RTCMMessageType{
Enabled: reachview.True,
Frequency: reachview.String("0.1"),
},
Type1006: &reachview.RTCMMessageType{
Enabled: reachview.True,
Frequency: reachview.String("0.1"),
},
Type1010: &reachview.RTCMMessageType{
Enabled: reachview.True,
Frequency: reachview.String("0.5"),
},
Type1097: &reachview.RTCMMessageType{
Enabled: reachview.True,
Frequency: reachview.String("0.5"),
},
Type1008: &reachview.RTCMMessageType{
Enabled: reachview.False,
},
Type1019: &reachview.RTCMMessageType{
Enabled: reachview.False,
},
Type1020: &reachview.RTCMMessageType{
Enabled: reachview.False,
},
Type1107: &reachview.RTCMMessageType{
Enabled: reachview.False,
},
Type1117: &reachview.RTCMMessageType{
Enabled: reachview.False,
},
Type1127: &reachview.RTCMMessageType{
Enabled: reachview.False,
},
},
}
applyConfiguration(c, config)
}
func applyConfiguration(c *reachview.Client, config *reachview.Configuration) {
ctx, applyConfCancel := context.WithTimeout(context.Background(), 10*time.Second)
defer applyConfCancel()
result, _, err := c.ApplyConfiguration(ctx, config)
if err != nil {
log.Fatal(err)
}
if result != reachview.ConfigurationApplySuccess {
log.Fatal("configuration update failed !")
}
log.Println("restarting rtklib")
if err := c.RestartRTKLib(); err != nil {
log.Fatal(err)
}
}
func resetConfiguration(c *reachview.Client) {
log.Println("resetting module configuration")
ctx, resetCancel := context.WithTimeout(context.Background(), 10*time.Second)
defer resetCancel()
result, _, err := c.ResetConfiguration(ctx)
if err != nil {
log.Fatal(err)
}
if result != reachview.ConfigurationApplySuccess {
log.Fatal("configuration reset failed !")
}
}
func getCommonConfiguration() *reachview.Configuration {
return &reachview.Configuration{
RTKSettings: &reachview.RTKSettings{
PositioningSystems: &reachview.PositionningSystems{
GPS: reachview.True,
GLONASS: reachview.True,
Galileo: reachview.True,
SBAS: reachview.True,
QZSS: reachview.True,
},
UpdateRate: reachview.String("5"),
},
LoRa: &reachview.LoRa{
AirRate: reachview.String("9.11"),
Frequency: reachview.Float(868000),
OutputPower: reachview.String("20"),
},
PositionOutput: &reachview.PositionOutput{
Output1: &reachview.Output{
Enabled: reachview.False,
},
Output2: &reachview.Output{
Enabled: reachview.False,
},
},
}
}

27
example/updater/README.md Normal file
View File

@ -0,0 +1,27 @@
# Example: Updater
A simple example of an updater client wich can:
- Configure a ReachRS module to use the given WiFi network
- Check for updates then reboot to "ReachView" mode
## Usage
1. Boot your ReachRS module in "Updater" mode. You can see a documentation on how to reset your device [here](https://forge.cadoles.com/Pyxis/orion/wiki/FlashIt).
2. Launch the example in `configure-wifi` phase and provides WiFi network informations.
```shell
go run example/updater/main.go \
-phase 'configure-wifi'\
-host '<DEVICE_IP_ADDRESS'\
-ssid '<WIFI_SSID>'\
-password '<WIFI_PASSWORD>'\
-security '<WIFI_SECURITY>'
```
3. The device will switch to the provided WiFi network, as you should do.
4. Launch the example in `update-then-reboot` phase.
```shell
go run example/updater/main.go \
-phase 'update-and-reboot'\
-host '<DEVICE_IP_ADDRESS'
```

201
example/updater/main.go Normal file
View File

@ -0,0 +1,201 @@
package main
import (
"context"
"flag"
"fmt"
"log"
"strings"
"time"
"forge.cadoles.com/Pyxis/orion/emlid"
"forge.cadoles.com/Pyxis/orion/emlid/updater"
)
const stepSleep = 5
const (
phaseConfigureWifi = "configure-wifi"
phaseUpdateThenReboot = "update-then-reboot"
)
var (
phase = phaseConfigureWifi
host = "192.168.42.1"
ssid = ""
security = string(updater.SecurityWPAPSK)
password = ""
)
func init() {
phases := []string{phaseConfigureWifi, phaseUpdateThenReboot}
flag.StringVar(
&phase, "phase", phase,
fmt.Sprintf("The configuration phase. Available: %v", strings.Join(phases, ", ")),
)
flag.StringVar(&host, "host", host, "ReachRS module host")
flag.StringVar(&ssid, "ssid", ssid, "The WiFi SSID to connect the module to")
flag.StringVar(&security, "security", security, "The WiFi security algorithm")
flag.StringVar(&password, "password", password, "The WiFi password")
}
func main() {
flag.Parse()
switch phase {
case phaseConfigureWifi:
configureWifi()
case phaseUpdateThenReboot:
updateThenReboot()
default:
log.Fatalf("unknown phase '%s'", phase)
}
log.Println("done")
}
func connect() *updater.Client {
c := updater.NewClient(
emlid.WithEndpoint(host, 80),
)
log.Printf("connecting to module '%s'", host)
if err := c.Connect(); err != nil {
log.Fatal(err)
}
log.Println("connected")
return c
}
func configureWifi() {
if ssid == "" {
log.Fatal("you must provide a WiFi SSID with the -ssid flag")
}
c := connect()
defer c.Close()
ctx := context.Background()
log.Println("checking module status")
ctx, testResultsCancel := context.WithTimeout(ctx, 5*time.Second)
defer testResultsCancel()
results, err := c.TestResults(ctx)
if err != nil {
log.Fatal(err)
}
log.Printf("device: '%s'", results.Device)
log.Printf("lora activated ? %v", results.Lora)
log.Printf("mpu activated ? %v", results.MPU)
log.Printf("stc activated ? %v", results.STC)
log.Printf("ublox activated ? %v", results.UBlox)
sleep(stepSleep)
log.Printf("adding wifi network '%s'", ssid)
ctx, addWifiCancel := context.WithTimeout(ctx, 5*time.Second)
defer addWifiCancel()
done, err := c.AddWifiNetwork(ctx, ssid, updater.WifiSecurity(security), password)
if err != nil {
log.Fatal(err)
}
if !done {
log.Fatal("couldnt add wifi network")
}
sleep(stepSleep)
log.Println("connecting module to wifi network")
ctx, joinWifiCancel := context.WithTimeout(ctx, 5*time.Second)
defer joinWifiCancel()
if err := c.JoinWifiNetwork(ctx, ssid, true); err != nil {
log.Fatal(err)
}
log.Printf("you can now switch to the wifi network and start phase '%s'", phaseUpdateThenReboot)
}
func updateThenReboot() {
c := connect()
defer c.Close()
log.Println("checking module status")
ctx, testResultsCancel := context.WithTimeout(context.Background(), 20*time.Second)
defer testResultsCancel()
results, err := c.TestResults(ctx)
if err != nil {
log.Fatalf("error while checking device state: %s", err)
}
log.Printf("device: '%s'", results.Device)
log.Printf("lora activated ? %v", results.Lora)
log.Printf("mpu activated ? %v", results.MPU)
log.Printf("stc activated ? %v", results.STC)
log.Printf("ublox activated ? %v", results.UBlox)
sleep(stepSleep)
log.Println("checking time sync")
ctx, timeSyncedCancel := context.WithTimeout(context.Background(), 20*time.Second)
defer timeSyncedCancel()
synced, err := c.TimeSynced(ctx)
if err != nil {
log.Fatalf("error while checking time sync status: %s", err)
}
log.Printf("time synced ? %v", synced)
sleep(stepSleep)
log.Println("checking for upgrade")
ctx, upgradeAvailableCancel := context.WithTimeout(context.Background(), 20*time.Second)
defer upgradeAvailableCancel()
_, _, err = c.ReceiverUpgradeAvailable(ctx)
if err != nil {
log.Fatalf("error while checking for upgrade: %s", err)
}
sleep(stepSleep)
log.Println("checking reachview version")
ctx, reachviewVersionCancel := context.WithTimeout(context.Background(), 20*time.Second)
defer reachviewVersionCancel()
version, err := c.ReachViewVersion(ctx)
if err != nil {
log.Fatalf("error while checking version: %s", err)
}
log.Printf("reachview version ? '%s'", version)
sleep(stepSleep)
log.Println("skipping update")
if err := c.SkipUpdate(); err != nil {
log.Fatalf("error while skipping update: %s", err)
}
sleep(stepSleep)
log.Println("rebooting device")
ctx, rebootCancel := context.WithTimeout(context.Background(), 20*time.Second)
defer rebootCancel()
if err := c.RebootNow(ctx, true); err != nil {
log.Fatalf("error while rebooting: %s", err)
}
}
func sleep(seconds int) {
log.Printf("sleeping for %d seconds...", seconds)
time.Sleep(time.Duration(seconds) * time.Second)
}

26
go.mod Normal file
View File

@ -0,0 +1,26 @@
module forge.cadoles.com/Pyxis/orion
require (
forge.cadoles.com/Cadoles/owrt v0.0.0-20181112081730-972e21754f2d
forge.cadoles.com/Pyxis/golang-socketio v0.0.0-20180919100209-bb857ced6b95
forge.cadoles.com/wpetit/goweb v0.0.0-20181207091353-38f4c7b7359c
github.com/caarlos0/env v3.4.0+incompatible
github.com/cenkalti/backoff v2.0.0+incompatible // indirect
github.com/davecgh/go-spew v1.1.1
github.com/go-chi/chi v3.3.3+incompatible
github.com/gorilla/rpc v1.1.0
github.com/gorilla/sessions v1.1.3
github.com/gorilla/websocket v1.4.0 // indirect
github.com/grandcat/zeroconf v0.0.0-20180329153754-df75bb3ccae1
github.com/miekg/dns v1.0.12 // indirect
github.com/mitchellh/mapstructure v1.1.2
github.com/oxtoacart/bpool v0.0.0-20150712133111-4e1c5567d7c2 // indirect
github.com/pkg/errors v0.8.0
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/stretchr/testify v1.2.2 // indirect
golang.org/x/crypto v0.0.0-20181001203147-e3636079e1a4 // indirect
golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3 // indirect
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f // indirect
golang.org/x/sys v0.0.0-20181005133103-4497e2df6f9e // indirect
golang.org/x/text v0.3.0 // indirect
)

48
go.sum Normal file
View File

@ -0,0 +1,48 @@
forge.cadoles.com/Cadoles/owrt v0.0.0-20181112081730-972e21754f2d h1:JrHRNqeepC+rk7/06UYd9a/+WA/CppGswZdmRNyzSgU=
forge.cadoles.com/Cadoles/owrt v0.0.0-20181112081730-972e21754f2d/go.mod h1:VLonz5tZXLI6NIndv6vr3741fCLntobz4gIG37b96xo=
forge.cadoles.com/Pyxis/golang-socketio v0.0.0-20180919100209-bb857ced6b95 h1:o3G5+9RjczCK1xAYFaRMknk1kY9Ule6PNfiW6N6hEpg=
forge.cadoles.com/Pyxis/golang-socketio v0.0.0-20180919100209-bb857ced6b95/go.mod h1:I6kYOFWNkFlNeQLI7ZqfTRz4NdPHZxX0Bzizmzgchs0=
forge.cadoles.com/wpetit/goweb v0.0.0-20181207091353-38f4c7b7359c h1:kGi00vgn8lniN9MSelOWGeJMiRsXWeQyCc6mio00ayI=
forge.cadoles.com/wpetit/goweb v0.0.0-20181207091353-38f4c7b7359c/go.mod h1:0zrl4O5z1OWAlQYtFF8/O/iGpCMsiDmbXx3ZO+PNG3o=
github.com/caarlos0/env v3.4.0+incompatible h1:FRwBdvENjLHZoUbFnULnFss9wKtcapdaM35DfxiTjeM=
github.com/caarlos0/env v3.4.0+incompatible/go.mod h1:tdCsowwCzMLdkqRYDlHpZCp2UooDD3MspDBjZ2AD02Y=
github.com/cenkalti/backoff v2.0.0+incompatible h1:5IIPUHhlnUZbcHQsQou5k1Tn58nJkeJL9U+ig5CHJbY=
github.com/cenkalti/backoff v2.0.0+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-chi/chi v3.3.3+incompatible h1:KHkmBEMNkwKuK4FdQL7N2wOeB9jnIx7jR5wsuSBEFI8=
github.com/go-chi/chi v3.3.3+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8=
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
github.com/gorilla/rpc v1.1.0 h1:marKfvVP0Gpd/jHlVBKCQ8RAoUPdX7K1Nuh6l1BNh7A=
github.com/gorilla/rpc v1.1.0/go.mod h1:V4h9r+4sF5HnzqbwIez0fKSpANP0zlYd3qR7p36jkTQ=
github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ=
github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
github.com/gorilla/sessions v1.1.3 h1:uXoZdcdA5XdXF3QzuSlheVRUvjl+1rKY7zBXL68L9RU=
github.com/gorilla/sessions v1.1.3/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w=
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/grandcat/zeroconf v0.0.0-20180329153754-df75bb3ccae1 h1:VSELJSxQlpi1bz4ZwT+93hPpzNLRcgytLr77iVRJpcE=
github.com/grandcat/zeroconf v0.0.0-20180329153754-df75bb3ccae1/go.mod h1:YjKB0WsLXlMkO9p+wGTCoPIDGRJH0mz7E526PxkQVxI=
github.com/miekg/dns v1.0.12 h1:814rTNaw7Q7pGncpSEDT06YS8rdGmpUEnKgpQzctJsk=
github.com/miekg/dns v1.0.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/oxtoacart/bpool v0.0.0-20150712133111-4e1c5567d7c2 h1:CXwSGu/LYmbjEab5aMCs5usQRVBGThelUKBNnoSOuso=
github.com/oxtoacart/bpool v0.0.0-20150712133111-4e1c5567d7c2/go.mod h1:L3UMQOThbttwfYRNFOWLLVXMhk5Lkio4GGOtw5UrxS0=
github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
golang.org/x/crypto v0.0.0-20181001203147-e3636079e1a4 h1:Vk3wNqEZwyGyei9yq5ekj7frek2u7HUfffJ1/opblzc=
golang.org/x/crypto v0.0.0-20181001203147-e3636079e1a4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3 h1:czFLhve3vsQetD6JOJ8NZZvGQIXlnN3/yXxbT6/awxI=
golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20181005133103-4497e2df6f9e h1:EfdBzeKbFSvOjoIqSZcfS8wp0FBLokGBEs9lz1OtSg0=
golang.org/x/sys v0.0.0-20181005133103-4497e2df6f9e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

17
misc/git-hooks/pre-commit Executable file
View File

@ -0,0 +1,17 @@
#!/bin/bash
set -eo pipefail
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
CHANGESET=$(git diff --cached --name-only --diff-filter=ACM)
function lint_go_files {
echo "Linting modified Go files..."
( cd "$DIR/../.." && make LINT_ARGS="--new-from-rev=HEAD~ ./..." lint )
}
function main {
lint_go_files
}
main

24
misc/openwrt/orion.init Normal file
View File

@ -0,0 +1,24 @@
#!/bin/sh /etc/rc.common
PID_FILE=/var/run/orion.pid
COMMAND="/opt/orion/server"
WORKDIR=/opt/orion
start() {
cd "$WORKDIR"
start-stop-daemon -S \
-b -m \
-p "$PID_FILE" \
-x "$COMMAND"
}
stop() {
start-stop-daemon -K \
-p "$PID_FILE" \
-x "$COMMAND"
}
restart() {
stop
start
}

View File

@ -0,0 +1,823 @@
/**
* ReachView code is placed under the GPL license.
* Written by Egor Fedorov (egor.fedorov@emlid.com) and Danil Kramorov (danil.kramorov@emlid.com)
* Copyright (c) 2015-2018, Emlid Limited
* All rights reserved.
*
* If you are interested in using ReachView code as a part of a
* closed source project, please contact Emlid Limited (info@emlid.com).
*
* This file is part of ReachView.
*
* ReachView is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* ReachView is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ReachView. If not, see <http://www.gnu.org/licenses/>.
*/
$(document).ready(function () {
requirejs(['socket', 'bootstrap_select'], function (io, bootstrap_select) {
var lostConnectionNoty;
var addConnectionNoty;
var removeConnetctionNoty;
var emptyRequiredModal = false;
var incorrectSymbolsNumber = false;
var incorrectSymbols = false;
var syncInterval;
var new_network = {};
var to_append = '';
var testPass = false;
var wifiPass = false;
var timePass = false;
var receiverPass = false;
var updatePass = false;
var currentVersion = false;
var availableReceiverVersion = false;
var availableVersion = false;
var opkgResult = false;
var receiverLocked = false;
var device = '';
var preventLostConnectionNoty = false;
var disconnect_msg = 'Lost connection with Reach. Please check your network, then try refreshing the page.';
$('.bootstrap-select').selectpicker();
$('.styled, .multiselect-container input').uniform({ radioClass: 'choice' });
$(document).on('click', '#create_new_network', function () {
$(this).parents('.modal-content').find('.required_field:visible').each(function () {
if ($.trim($(this).val()) === '') {
emptyRequiredModal = true;
return false;
}
});
if ($('#new_network_pass:visible').length !== 0) {
if ($('#new_network_pass').val().length < 8) {
incorrectSymbolsNumber = true;
} else {
incorrectSymbolsNumber = false;
}
} else {
incorrectSymbolsNumber = false;
}
if (emptyRequiredModal) {
$(this).parents('.modal-content').find('.required_field:visible')
.filter(function () { return $.trim($(this).val()) === ''; }).css('border', '1px solid red');
$(this).parents('.modal-content').find('.required_field')
.filter(function () { return $.trim($(this).val()) !== ''; }).css('border', '1px solid #ddd');
emptyRequiredModal = false;
} else {
$(this).parents('.modal-content').find('.required_field').css('border', '1px solid #ddd');
if (incorrectSymbols) {
$('.modal_add_warning').text('Incorrect symbols. Use only a-z, 1-9 characters.');
} else if (incorrectSymbolsNumber) {
$('.modal_add_warning').text('Password should contain at least 8 characters');
} else {
new_network['ssid'] = $('#new_network_name').val();
new_network['password'] = $('#new_network_pass').val();
new_network['security'] = $('#security_select').val();
new_network['identity'] = $('#new_network_identity').val();
$('#modal_network').modal('hide');
socket.emit('add new network', new_network);
}
}
});
$(document).on('change', '#security_select', function () {
$('#new_network_identity').removeClass('required_field');
$('#new_network_identity').parents('.form-group').css('display', 'none');
$('#new_network_pass').addClass('required_field');
$('#new_network_pass').parents('.form-group').css('display', 'block');
$('#uniform-show_pass').parents('.form-group').css('display', 'block');
if ($(this).val() === 'open') {
$('#new_network_pass').removeClass('required_field');
$('#new_network_pass').parents('.form-group').css('display', 'none');
$('#uniform-show_pass').parents('.form-group').css('display', 'none');
} else if ($(this).val() == 'wpaeap') {
$('#new_network_identity').addClass('required_field');
$('#new_network_identity').parents('.form-group').css('display', 'block');
}
});
$('#modal_network').on('show.bs.modal', function () {
$('#new_network_name').val('');
$('#new_network_pass').val('');
$('#new_network_pass').attr('type', 'password');
$('#new_network_identity').val('');
$('#security_select').val('wpa-psk');
$('#security_select').selectpicker('refresh');
$('#show_pass').attr('checked', false);
$('#show_pass').parent().removeClass('checked');
$('.modal_add_warning').text('');
$('#security_select').change();
$('#modal_network input').css('border', '1px solid #ddd');
});
$(document).on('change', '#show_pass', function () {
if ($(this).is(':checked')) {
$('#new_network_pass').attr('type', 'text');
} else {
$('#new_network_pass').attr('type', 'password');
}
});
$(document).on('click', '#added_wi-fi li', function () {
if (!$(this).hasClass('connected_wi-fi_network')) {
$('#modal_saved_connect .network_title').text($(this).find('.wi-fi_title').text());
$('#modal_saved_connect .network_mac').text('Security: ' + $(this).find('.wi-fi_security').val());
$('#modal_saved_connect').modal('show');
}
return false;
});
$(document).on('click', '#connected_wi-fi li', function () {
return false;
});
$(document).on('click', '#connect_network', function () {
var ssid_to_connect = $('#modal_saved_connect .network_title').text();
disconnect_msg = 'Reach is connecting to another network. Switch to ' + ssid_to_connect + ' to continue.';
socket.emit('connect to network', ssid_to_connect);
$('#modal_saved_connect').modal('hide');
return false;
});
$(document).on('click', '#forget_network', function () {
var ssid_to_remove = $('#modal_saved_connect .network_title').text();
socket.emit('remove network', ssid_to_remove);
$('#modal_saved_connect').modal('hide');
return false;
});
$('.update_reachview').on('click', function () {
if (!$(this).hasClass('disabled')) {
receiverPass = true;
socket.emit('upgrade reachview');
$('.current_version').text('Updating...');
$('.update_status').html('<i class="icon-spinner2 spinner text-warning"></i>');
$('.row_try_skip').css('display', 'none');
$('.skip_update_btn').css('display', 'none');
$('.update_reachview').addClass('disabled');
}
return false;
});
$('.skip_update, .skip_update_btn').on('click', function () {
receiverPass = true;
socket.emit('skip update');
$('.update_status').html('<i class="icon-checkmark3 text-success"></i>');
$('.update_anchor:not(.collapsed)').click();
$('.row_try_skip').css('display', 'none');
$('.skip_update_btn').css('display', 'none');
updatePass = true;
if (updatePass && receiverPass && timePass && wifiPass && testPass) {
$('.to_app').removeClass('disabled');
} else {
$('.to_app').addClass('disabled');
}
return false;
});
$('.try_again').on('click', function () {
receiverPass = true;
$('.row_try_skip').css('display', 'none');
currentVersion = false;
socket.emit('get reachview version');
$('.current_version').text('Getting current version...');
$('.update_status').html('<i class="icon-spinner2 spinner text-warning"></i>');
return false;
});
$('.to_app').on('click', function () {
if (!$(this).hasClass('disabled')) {
disconnect_msg = 'Reach is rebooting and has been disconnected from this network.';
noty({
width: 200,
text: 'Reboot will start in 3...',
type: 'information',
dismissQueue: true,
timeout: 3000,
closeWith: false,
layout: 'topRight',
callback: {
onClose: function () {
if (device === 'ReachM+' || device === 'ReachRS+') {
preventLostConnectionNoty = true;
$('#modal_mender_guide').modal({ backdrop: 'static', keyboard: false });
}
socket.emit('reboot now');
}
}
});
setTimeout(function () { $('.noty_text').text('Reboot will start in 2...'); }, 1000);
setTimeout(function () { $('.noty_text').text('Reboot will start in 1...'); }, 2000);
}
return false;
});
// SocketIO namespace:
socket = io();
socket.on('add network results', function (msg) {
if (msg) {
socket.emit('get saved wifi networks');
} else {
addConnectionNoty = noty({
width: 200,
text: 'Failed to add a new Wi-Fi connection',
type: 'error',
dismissQueue: true,
timeout: 4000,
closeWith: ['click'],
layout: 'topRight'
});
}
});
socket.on('remove network results', function (msg) {
if (msg) {
socket.emit('get saved wifi networks');
} else {
removeConnetctionNoty = noty({
width: 200,
text: 'Failed to remove network',
type: 'error',
dismissQueue: true,
timeout: 4000,
closeWith: ['click'],
layout: 'topRight'
});
}
});
// say hello on connect
socket.on('connect', function () {
socket.emit('browser connected', {data: 'I\'m connected'});
if (typeof lostConnectionNoty !== 'undefined') {
lostConnectionNoty.close();
}
});
socket.on('reconnect', function () {
$('.disconnect_overlay').fadeOut();
$('body').css('position', 'relative');
$(window).resize();
});
socket.on('disconnect', function () {
if (preventLostConnectionNoty) {
return;
}
$('.disconnect_overlay').fadeIn();
$('body').css('position', 'fixed');
lostConnectionNoty = noty({
width: 200,
text: disconnect_msg,
type: 'error',
dismissQueue: true,
timeout: false,
closeWith: false,
layout: 'topRight',
callback: {
onClose: function () {
$('.disconnect_overlay').fadeOut();
$('body').css('position', 'relative');
noty({
width: 200,
text: 'Reach reconnected!',
type: 'success',
dismissQueue: true,
closeWith: false,
timeout: 3000,
layout: 'topRight'
});
}
}
});
});
socket.on('connect_error', function () {
console.clear();
console.warn('Lost connection with sockets');
});
socket.emit('get test results');
socket.on('reachview upgrade status', function (msg) {
if (!receiverPass) {
return;
}
$('.row_try_skip').css('display', 'none');
$('.skip_update_btn').css('display', 'none');
if (!$('.update_status i').hasClass('icon-spinner2')) {
$('.update_status').html('<i class="icon-spinner2 spinner text-warning"></i>');
}
$('.available_version').css('display', 'none');
$('.update_reachview').addClass('disabled');
$('.coords_progress').css('display', 'block');
if (msg['active']) {
$('.current_version').text(msg['state'] + ' ' + msg['package'] + ' (' + msg['version'] + ')');
}
if (msg['state'] === 'Downloading') {
$('.coords_progress .progress-bar').removeClass('progress-bar-striped active');
$('.coords_progress .progress-bar').css('width', msg['percentage'] + '%');
if (parseInt(msg['percentage']) > 30) {
$('.coords_progress .progress-bar span').text(msg['percentage'] + '%');
} else {
$('.coords_progress .progress-bar span').text('');
}
} else if (msg['state'] === 'Installing') {
$('.coords_progress .progress-bar').css('width', '100%');
$('.coords_progress .progress-bar span').text('');
$('.coords_progress .progress-bar').addClass('progress-bar-striped active');
} else if (msg['state'] === 'Finished') {
$('.coords_progress').css('display', 'none');
currentVersion = false;
socket.emit('get reachview version');
$('.update_status').html('<i class="icon-checkmark3 text-success"></i>');
$('.update_reachview').css('display', 'none');
$('.available_version').css('display', 'none');
updatePass = true;
if (updatePass && receiverPass && timePass && wifiPass && testPass) {
$('.to_app').removeClass('disabled');
} else {
$('.to_app').addClass('disabled');
}
} else if (msg['state'] === 'Failed') {
$('.coords_progress').css('display', 'none');
$('.update_status').html('<i class="icon-cross2 text-danger-400"></i>');
$('.coords_progress .progress-bar').css('width', '0%');
$('.coords_progress .progress-bar span').text('');
if (msg['locked']) {
$('.current_version').html('Update system is used by another process. Please try again later.');
} else {
$('.current_version').html('Failed to perform update.');
}
$('.skip_update_btn').css('display', 'inline-block');
$('.update_reachview').css('display', 'block');
$('.update_reachview').removeClass('disabled');
$('.update_anchor.collapsed').click();
}
});
socket.on('wifi saved networks results', function (msg) {
var connectedNetwork = false;
var to_append = '';
msg.forEach(function (key, value) {
var ssid = (key['ssid'] !== '') ? key['ssid'] : 'Unknown';
if (key['is_connected']) {
to_append += '<li class="media connected_wi-fi_network">';
$('#current_network').text(ssid);
} else {
to_append += '<li class="media">';
}
to_append += '<a href="#" class="media-link"><div class="media-body">';
to_append += '<div class="media-heading text-semibold wi-fi_title">' + ssid + '</div>';
if (key['is_connected']) {
to_append += '<span class="text-muted">Connected (' + key['ip'] + ')</span>';
connectedNetwork = true;
} else {
to_append += '<span class="text-muted">Saved</span>';
}
to_append += '<input type="hidden" class="wi-fi_mac" value="' + key['mac_address'] + '"><input type="hidden" class="wi-fi_security" value="' + key['security'] + '"></div>';
if (key['is_connected']) {
to_append += '<div class="media-right media-middle text-nowrap"><span class="text-muted wi-fi_remove"><i class="icon-link text-size-base"></i></span></div>';
}
to_append += '</a></li>';
});
$('#added_wi-fi').html(to_append);
$('#connected_wi-fi').html('');
$('#connected_wi-fi').append($('.connected_wi-fi_network'));
if (connectedNetwork) {
$('.wifi_status').html('<i class="icon-checkmark3 text-success"></i>');
socket.emit('get time sync status');
$('.overlay.sync_overlay').fadeOut();
$('.sync_status').html('<i class="icon-spinner2 spinner text-warning"></i>');
syncInterval = setInterval(function () { socket.emit('get time sync status'); }, 1000);
wifiPass = true;
} else {
$('.wifi_status').html('<i class="icon-circle-small text-danger-400"></i>');
$('.wi-fi_anchor.collapsed').click();
wifiPass = false;
}
});
socket.on('time sync status', function (msg) {
if (timePass) {
return;
}
if (msg['status']) {
$('.sync_status').html('<i class="icon-checkmark3 text-success"></i>');
$('.time_sync_warning').text('Time was synchronized!');
// Receiver update
availableReceiverVersion = false;
socket.emit('is receiver upgrade available');
$('.receiver_status').html('<i class="icon-spinner2 spinner text-warning"></i>');
$('#receiver_upgrade_msg').text('Checking for receiver updates...');
$('.receiver_overlay').fadeOut();
// Reach update
// currentVersion = false;
// socket.emit('get reachview version');
// $('.current_version').text('Getting current version...');
// $('.overlay.update_overlay').fadeOut();
// $('.update_status').html('<i class="icon-spinner2 spinner text-warning"></i>');
clearInterval(syncInterval);
timePass = true;
} else {
$('.time_sync_warning').text('Check your internet connection or connect antenna.');
timePass = false;
}
});
socket.on('receiver upgrade available', function (msg) {
if (availableReceiverVersion || receiverLocked) {
return;
}
if (msg['running']) {
$('#receiver_upgrade_msg').text('Updating receiver...');
$('.receiver_status').html('<i class="icon-spinner2 spinner text-warning"></i>');
$('.update_receiver').css('display', 'inline-block');
$('.update_receiver').addClass('disabled');
$('.skip_receiver_update').css('display', 'none');
$('.receiver_progress').css('display', 'block');
$('.receiver_anchor.collapsed').click();
return;
}
if (msg['available']) {
$('.receiver_status').html('<i class="text-warning icon-circle-small"></i>');
$('#receiver_upgrade_msg').text('Receiver upgrade available');
$('.update_receiver').css('display', 'inline-block');
$('.skip_receiver_update').css('display', 'inline-block');
$('.receiver_anchor.collapsed').click();
} else {
$('.receiver_status').html('<i class="icon-checkmark3 text-success"></i>');
$('#receiver_upgrade_msg').text('No upgrades available for receiver');
$('.skip_receiver_update').trigger('click', [true]);
}
availableReceiverVersion = true;
});
$('.update_receiver').on('click', function () {
if (!$(this).hasClass('disabled')) {
receiverPass = false;
socket.emit('upgrade receiver');
$('#receiver_upgrade_msg').text('Updating receiver...');
$('.receiver_status').html('<i class="icon-spinner2 spinner text-warning"></i>');
$('.update_receiver').addClass('disabled');
$('.skip_receiver_update').css('display', 'none');
$('.receiver_progress').css('display', 'block');
}
return false;
});
$('.skip_receiver_update, .receiver_skip_locked').on('click', function (event, fakeClick) {
if (!$(this).hasClass('disabled')) {
$(this).css('display', 'none');
$('.receiver_status').html('<i class="icon-checkmark3 text-success"></i>');
if (!fakeClick) {
$('.receiver_anchor:not(.collapsed)').click();
}
if (!availableVersion && !updatePass) {
currentVersion = false;
socket.emit('get reachview version');
$('.current_version').text('Getting current version...');
$('.overlay.update_overlay').fadeOut();
$('.update_status').html('<i class="icon-spinner2 spinner text-warning"></i>');
}
receiverLocked = false;
receiverPass = true;
}
return false;
});
$('.receiver_try_again').on('click', function () {
receiverPass = false;
availableReceiverVersion = false;
socket.emit('is receiver upgrade available');
$('.receiver_status').html('<i class="icon-spinner2 spinner text-warning"></i>');
$('#receiver_upgrade_msg').text('Checking for receiver updates...');
$('.receiver_try_skip').css('display', 'none');
receiverLocked = false;
return false;
});
socket.on('receiver upgrade result', function (msg) {
if (receiverPass || receiverLocked) {
return;
}
if (msg) {
$('.update_receiver').css('display', 'none');
$('#receiver_upgrade_msg').text('Receiver updated successfully');
$('.receiver_status').html('<i class="icon-checkmark3 text-success"></i>');
$('.skip_receiver_update').trigger('click', [true]);
} else {
$('#receiver_upgrade_msg').text('Failed to perform receiver update');
$('.receiver_status').html('<i class="text-warning icon-circle-small"></i>');
$('.update_receiver').css('display', 'inline-block');
$('.skip_receiver_update').css('display', 'inline-block');
$('.receiver_anchor.collapsed').click();
$('.update_receiver').removeClass('disabled');
}
$('.receiver_progress').css('display', 'none');
});
socket.on('opkg update result', function (msg) {
if (opkgResult) {
return;
}
if (msg['state'] === 'Failed') {
$('.update_status').html('<i class="icon-cross2 text-danger-400"></i>');
$('.update_anchor.collapsed').click();
if (msg['locked']) {
$('.current_version').html('Update system is used by another process. Please try again later.');
} else {
$('.current_version').html('Update server unreachable. Check your Internet connection or try again later.');
}
$('.available_version').css('display', 'none');
$('.row_try_skip').css('display', 'block');
$('.update_reachview').css('display', 'none');
$('.update_anchor.collapsed').click();
}
else if (msg['state'] === 'Finished') {
opkgResult = true;
availableVersion = false;
socket.emit('is reachview upgrade available');
}
});
socket.on('update system locked', function () {
if (receiverPass) {
$('.update_anchor.collapsed').click();
$('.update_status').html('<i class="icon-cross2 text-danger-400"></i>');
$('.current_version').text('Update system is used by another process. Please try again later.');
$('.available_version').css('display', 'none');
$('.row_try_skip').css('display', 'block');
} else {
$('.receiver_anchor.collapsed').click();
$('.receiver_status').html('<i class="icon-cross2 text-danger-400"></i>');
$('#receiver_upgrade_msg').text('Update system is used by another process. Please try again later.');
$('.update_receiver').css('display', 'none');
$('.skip_receiver_update').css('display', 'none');
$('.receiver_try_skip').css('display', 'block');
receiverLocked = true;
}
});
socket.on('current reachview version', function (msg) {
if (currentVersion || !receiverPass) {
return;
}
var version = (msg['version'] != null)
? 'Current ReachView version: ' + msg['version']
: 'Could not retrieve ReachView version.';
$('.current_version').text(version);
currentVersion = true;
opkgResult = false;
socket.emit('update');
$('.available_version').css('display', 'block');
$('.available_version').text('Checking for updates...');
});
socket.on('reachview upgrade version', function (msg) {
if (availableVersion || !receiverPass) {
return;
}
if (!msg['upgrade available']) {
$('.update_status').html('<i class="icon-checkmark3 text-success"></i>');
$('.update_reachview').css('display', 'none');
$('.available_version').css('display', 'none');
updatePass = true;
if (updatePass && receiverPass && timePass && wifiPass && testPass) {
$('.to_app').removeClass('disabled');
} else {
$('.to_app').addClass('disabled');
}
} else {
$('.available_version').css('display', 'block');
$('.available_version').text('Available version: ' + msg['available version']);
$('.update_status').html('<i class="text-warning icon-circle-small"></i>');
$('.update_reachview').css('display', 'inline-block');
$('.update_anchor.collapsed').click();
}
availableVersion = true;
});
socket.on('test results', function (msg) {
$('.tests_status').css('display', 'none');
device = msg['device'];
if (msg['device'] === 'Reach' || msg['device'] === 'ReachM+') {
$('.ltc_test, .stc_test, .lora_test').parent().css('display', 'none');
}
if (!msg['ltc']) {
$('.tests_status').html('<i class="icon-cross2 text-danger-400"></i>');
$('.test_warning').text('Test 3 failed');
$('.test_warning').slideDown();
testPass = true;
}
if (!msg['stc']) {
$('.tests_status').html('<i class="icon-cross2 text-danger-400"></i>');
$('.test_warning').text('Test 4 failed');
$('.test_warning').slideDown();
testPass = true;
}
if (!msg['lora']) {
$('.tests_status').html('<i class="icon-cross2 text-danger-400"></i>');
$('.test_warning').text('Test 5 failed');
$('.test_warning').slideDown();
testPass = true;
}
if (!msg['mpu']) {
$('.tests_status').html('<i class="icon-cross2 text-danger-400"></i>');
$('.test_warning').text('Test 1 failed');
$('.test_warning').slideDown();
testPass = true;
}
if (!msg['u-blox']) {
$('.tests_status').html('<i class="icon-cross2 text-danger-400"></i>');
$('.test_warning').text('Test 2 failed');
$('.test_warning').slideDown();
testPass = false;
}
if (msg['device'] === 'Reach' || msg['device'] === 'ReachM+') {
if (msg['u-blox'] && msg['mpu']) {
$('.tests_status').html('<i class="icon-checkmark3 text-success"></i>');
testPass = true;
}
} else {
if (msg['u-blox'] && msg['mpu'] && msg['lora'] && msg['ltc'] && msg['stc']) {
$('.tests_status').html('<i class="icon-checkmark3 text-success"></i>');
testPass = true;
}
}
$('.tests_status').fadeIn();
if (msg['mpu']) {
$('.mpu_test').html('<i class="icon-checkmark3 text-success"></i>');
} else {
$('.mpu_test').html('<i class="icon-cross2 text-danger-400"></i>');
}
if (msg['u-blox']) {
$('.u-blox_test').html('<i class="icon-checkmark3 text-success"></i>');
} else {
$('.u-blox_test').html('<i class="icon-cross2 text-danger-400"></i>');
}
if (msg['lora']) {
$('.lora_test').html('<i class="icon-checkmark3 text-success"></i>');
} else {
$('.lora_test').html('<i class="icon-cross2 text-danger-400"></i>');
}
if (msg['stc']) {
$('.stc_test').html('<i class="icon-checkmark3 text-success"></i>');
} else {
$('.stc_test').html('<i class="icon-cross2 text-danger-400"></i>');
}
if (msg['ltc']) {
$('.ltc_test').html('<i class="icon-checkmark3 text-success"></i>');
} else {
$('.ltc_test').html('<i class="icon-cross2 text-danger-400"></i>');
}
socket.emit('get saved wifi networks');
});
});
});

24
modd.conf Normal file
View File

@ -0,0 +1,24 @@
**/*.go
!**/*_test.go
modd.conf
.env
cmd/server/templates/**
Makefile {
prep: make build
daemon: [ -e .env ] && . .env; \
ORION_TEMPLATE_DIR="cmd/server/templates" \
ORION_ASSET_DIR="cmd/server/static/dist" \
./bin/server
}
{
daemon: [ ! -z "$(which node)" ] && cd cmd/server && npm run watch
}
**/*.go
modd.conf
Makefile {
prep: make lint LINT_ARGS=--fast
prep: make test
}

Binary file not shown.

View File

@ -0,0 +1,11 @@
# Orion
Récepteur GNSS/RTK pour les topographes et chefs de chantier
## Documentation
[Voir la documentation](./doc)
## License
`GNU GPL v3` http://dachary.org/loic/gpl-french.pdf

BIN
release/server-linux-arm/server Executable file

Binary file not shown.

View File

@ -0,0 +1,6748 @@
/*! bulma.io v0.7.2 | MIT License | github.com/jgthms/bulma */
@keyframes spinAround {
from {
transform: rotate(0deg); }
to {
transform: rotate(359deg); } }
.delete, .modal-close, .is-unselectable, .button, .file, .breadcrumb, .pagination-previous,
.pagination-next,
.pagination-link,
.pagination-ellipsis, .tabs {
-webkit-touch-callout: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none; }
.select:not(.is-multiple):not(.is-loading)::after, .navbar-link:not(.is-arrowless)::after {
border: 3px solid transparent;
border-radius: 2px;
border-right: 0;
border-top: 0;
content: " ";
display: block;
height: 0.625em;
margin-top: -0.4375em;
pointer-events: none;
position: absolute;
top: 50%;
transform: rotate(-45deg);
transform-origin: center;
width: 0.625em; }
.box:not(:last-child), .content:not(:last-child), .notification:not(:last-child), .progress:not(:last-child), .table:not(:last-child), .table-container:not(:last-child), .title:not(:last-child),
.subtitle:not(:last-child), .block:not(:last-child), .highlight:not(:last-child), .breadcrumb:not(:last-child), .level:not(:last-child), .list:not(:last-child), .message:not(:last-child), .tabs:not(:last-child) {
margin-bottom: 1.5rem; }
.delete, .modal-close {
-moz-appearance: none;
-webkit-appearance: none;
background-color: rgba(10, 10, 10, 0.2);
border: none;
border-radius: 290486px;
cursor: pointer;
pointer-events: auto;
display: inline-block;
flex-grow: 0;
flex-shrink: 0;
font-size: 0;
height: 20px;
max-height: 20px;
max-width: 20px;
min-height: 20px;
min-width: 20px;
outline: none;
position: relative;
vertical-align: top;
width: 20px; }
.delete::before, .modal-close::before, .delete::after, .modal-close::after {
background-color: white;
content: "";
display: block;
left: 50%;
position: absolute;
top: 50%;
transform: translateX(-50%) translateY(-50%) rotate(45deg);
transform-origin: center center; }
.delete::before, .modal-close::before {
height: 2px;
width: 50%; }
.delete::after, .modal-close::after {
height: 50%;
width: 2px; }
.delete:hover, .modal-close:hover, .delete:focus, .modal-close:focus {
background-color: rgba(10, 10, 10, 0.3); }
.delete:active, .modal-close:active {
background-color: rgba(10, 10, 10, 0.4); }
.is-small.delete, .is-small.modal-close {
height: 16px;
max-height: 16px;
max-width: 16px;
min-height: 16px;
min-width: 16px;
width: 16px; }
.is-medium.delete, .is-medium.modal-close {
height: 24px;
max-height: 24px;
max-width: 24px;
min-height: 24px;
min-width: 24px;
width: 24px; }
.is-large.delete, .is-large.modal-close {
height: 32px;
max-height: 32px;
max-width: 32px;
min-height: 32px;
min-width: 32px;
width: 32px; }
.button.is-loading::after, .select.is-loading::after, .control.is-loading::after, .loader {
animation: spinAround 500ms infinite linear;
border: 2px solid #dbdbdb;
border-radius: 290486px;
border-right-color: transparent;
border-top-color: transparent;
content: "";
display: block;
height: 1em;
position: relative;
width: 1em; }
.is-overlay, .image.is-square img, .image.is-1by1 img, .image.is-5by4 img, .image.is-4by3 img, .image.is-3by2 img, .image.is-5by3 img, .image.is-16by9 img, .image.is-2by1 img, .image.is-3by1 img, .image.is-4by5 img, .image.is-3by4 img, .image.is-2by3 img, .image.is-3by5 img, .image.is-9by16 img, .image.is-1by2 img, .image.is-1by3 img, .modal, .modal-background, .hero-video {
bottom: 0;
left: 0;
position: absolute;
right: 0;
top: 0; }
.button, .input,
.textarea, .select select, .file-cta,
.file-name, .pagination-previous,
.pagination-next,
.pagination-link,
.pagination-ellipsis {
-moz-appearance: none;
-webkit-appearance: none;
align-items: center;
border: 1px solid transparent;
border-radius: 4px;
box-shadow: none;
display: inline-flex;
font-size: 1rem;
height: 2.25em;
justify-content: flex-start;
line-height: 1.5;
padding-bottom: calc(0.375em - 1px);
padding-left: calc(0.625em - 1px);
padding-right: calc(0.625em - 1px);
padding-top: calc(0.375em - 1px);
position: relative;
vertical-align: top; }
.button:focus, .input:focus,
.textarea:focus, .select select:focus, .file-cta:focus,
.file-name:focus, .pagination-previous:focus,
.pagination-next:focus,
.pagination-link:focus,
.pagination-ellipsis:focus, .is-focused.button, .is-focused.input,
.is-focused.textarea, .select select.is-focused, .is-focused.file-cta,
.is-focused.file-name, .is-focused.pagination-previous,
.is-focused.pagination-next,
.is-focused.pagination-link,
.is-focused.pagination-ellipsis, .button:active, .input:active,
.textarea:active, .select select:active, .file-cta:active,
.file-name:active, .pagination-previous:active,
.pagination-next:active,
.pagination-link:active,
.pagination-ellipsis:active, .is-active.button, .is-active.input,
.is-active.textarea, .select select.is-active, .is-active.file-cta,
.is-active.file-name, .is-active.pagination-previous,
.is-active.pagination-next,
.is-active.pagination-link,
.is-active.pagination-ellipsis {
outline: none; }
.button[disabled], .input[disabled],
.textarea[disabled], .select select[disabled], .file-cta[disabled],
.file-name[disabled], .pagination-previous[disabled],
.pagination-next[disabled],
.pagination-link[disabled],
.pagination-ellipsis[disabled] {
cursor: not-allowed; }
/*! minireset.css v0.0.3 | MIT License | github.com/jgthms/minireset.css */
html,
body,
p,
ol,
ul,
li,
dl,
dt,
dd,
blockquote,
figure,
fieldset,
legend,
textarea,
pre,
iframe,
hr,
h1,
h2,
h3,
h4,
h5,
h6 {
margin: 0;
padding: 0; }
h1,
h2,
h3,
h4,
h5,
h6 {
font-size: 100%;
font-weight: normal; }
ul {
list-style: none; }
button,
input,
select,
textarea {
margin: 0; }
html {
box-sizing: border-box; }
*, *::before, *::after {
box-sizing: inherit; }
img,
audio,
video {
height: auto;
max-width: 100%; }
iframe {
border: 0; }
table {
border-collapse: collapse;
border-spacing: 0; }
td,
th {
padding: 0;
text-align: left; }
html {
background-color: white;
font-size: 16px;
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
min-width: 300px;
overflow-x: hidden;
overflow-y: scroll;
text-rendering: optimizeLegibility;
text-size-adjust: 100%; }
article,
aside,
figure,
footer,
header,
hgroup,
section {
display: block; }
body,
button,
input,
select,
textarea {
font-family: BlinkMacSystemFont, -apple-system, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif; }
code,
pre {
-moz-osx-font-smoothing: auto;
-webkit-font-smoothing: auto;
font-family: monospace; }
body {
color: #4a4a4a;
font-size: 1rem;
font-weight: 400;
line-height: 1.5; }
a {
color: #3273dc;
cursor: pointer;
text-decoration: none; }
a strong {
color: currentColor; }
a:hover {
color: #363636; }
code {
background-color: whitesmoke;
color: #ff3860;
font-size: 0.875em;
font-weight: normal;
padding: 0.25em 0.5em 0.25em; }
hr {
background-color: whitesmoke;
border: none;
display: block;
height: 2px;
margin: 1.5rem 0; }
img {
height: auto;
max-width: 100%; }
input[type="checkbox"],
input[type="radio"] {
vertical-align: baseline; }
small {
font-size: 0.875em; }
span {
font-style: inherit;
font-weight: inherit; }
strong {
color: #363636;
font-weight: 700; }
pre {
-webkit-overflow-scrolling: touch;
background-color: whitesmoke;
color: #4a4a4a;
font-size: 0.875em;
overflow-x: auto;
padding: 1.25rem 1.5rem;
white-space: pre;
word-wrap: normal; }
pre code {
background-color: transparent;
color: currentColor;
font-size: 1em;
padding: 0; }
table td,
table th {
text-align: left;
vertical-align: top; }
table th {
color: #363636; }
.is-clearfix::after {
clear: both;
content: " ";
display: table; }
.is-pulled-left {
float: left !important; }
.is-pulled-right {
float: right !important; }
.is-clipped {
overflow: hidden !important; }
.is-size-1 {
font-size: 3rem !important; }
.is-size-2 {
font-size: 2.5rem !important; }
.is-size-3 {
font-size: 2rem !important; }
.is-size-4 {
font-size: 1.5rem !important; }
.is-size-5 {
font-size: 1.25rem !important; }
.is-size-6 {
font-size: 1rem !important; }
.is-size-7 {
font-size: 0.75rem !important; }
@media screen and (max-width: 768px) {
.is-size-1-mobile {
font-size: 3rem !important; }
.is-size-2-mobile {
font-size: 2.5rem !important; }
.is-size-3-mobile {
font-size: 2rem !important; }
.is-size-4-mobile {
font-size: 1.5rem !important; }
.is-size-5-mobile {
font-size: 1.25rem !important; }
.is-size-6-mobile {
font-size: 1rem !important; }
.is-size-7-mobile {
font-size: 0.75rem !important; } }
@media screen and (min-width: 769px), print {
.is-size-1-tablet {
font-size: 3rem !important; }
.is-size-2-tablet {
font-size: 2.5rem !important; }
.is-size-3-tablet {
font-size: 2rem !important; }
.is-size-4-tablet {
font-size: 1.5rem !important; }
.is-size-5-tablet {
font-size: 1.25rem !important; }
.is-size-6-tablet {
font-size: 1rem !important; }
.is-size-7-tablet {
font-size: 0.75rem !important; } }
@media screen and (max-width: 1087px) {
.is-size-1-touch {
font-size: 3rem !important; }
.is-size-2-touch {
font-size: 2.5rem !important; }
.is-size-3-touch {
font-size: 2rem !important; }
.is-size-4-touch {
font-size: 1.5rem !important; }
.is-size-5-touch {
font-size: 1.25rem !important; }
.is-size-6-touch {
font-size: 1rem !important; }
.is-size-7-touch {
font-size: 0.75rem !important; } }
@media screen and (min-width: 1088px) {
.is-size-1-desktop {
font-size: 3rem !important; }
.is-size-2-desktop {
font-size: 2.5rem !important; }
.is-size-3-desktop {
font-size: 2rem !important; }
.is-size-4-desktop {
font-size: 1.5rem !important; }
.is-size-5-desktop {
font-size: 1.25rem !important; }
.is-size-6-desktop {
font-size: 1rem !important; }
.is-size-7-desktop {
font-size: 0.75rem !important; } }
@media screen and (min-width: 1280px) {
.is-size-1-widescreen {
font-size: 3rem !important; }
.is-size-2-widescreen {
font-size: 2.5rem !important; }
.is-size-3-widescreen {
font-size: 2rem !important; }
.is-size-4-widescreen {
font-size: 1.5rem !important; }
.is-size-5-widescreen {
font-size: 1.25rem !important; }
.is-size-6-widescreen {
font-size: 1rem !important; }
.is-size-7-widescreen {
font-size: 0.75rem !important; } }
@media screen and (min-width: 1472px) {
.is-size-1-fullhd {
font-size: 3rem !important; }
.is-size-2-fullhd {
font-size: 2.5rem !important; }
.is-size-3-fullhd {
font-size: 2rem !important; }
.is-size-4-fullhd {
font-size: 1.5rem !important; }
.is-size-5-fullhd {
font-size: 1.25rem !important; }
.is-size-6-fullhd {
font-size: 1rem !important; }
.is-size-7-fullhd {
font-size: 0.75rem !important; } }
.has-text-centered {
text-align: center !important; }
.has-text-justified {
text-align: justify !important; }
.has-text-left {
text-align: left !important; }
.has-text-right {
text-align: right !important; }
@media screen and (max-width: 768px) {
.has-text-centered-mobile {
text-align: center !important; } }
@media screen and (min-width: 769px), print {
.has-text-centered-tablet {
text-align: center !important; } }
@media screen and (min-width: 769px) and (max-width: 1087px) {
.has-text-centered-tablet-only {
text-align: center !important; } }
@media screen and (max-width: 1087px) {
.has-text-centered-touch {
text-align: center !important; } }
@media screen and (min-width: 1088px) {
.has-text-centered-desktop {
text-align: center !important; } }
@media screen and (min-width: 1088px) and (max-width: 1279px) {
.has-text-centered-desktop-only {
text-align: center !important; } }
@media screen and (min-width: 1280px) {
.has-text-centered-widescreen {
text-align: center !important; } }
@media screen and (min-width: 1280px) and (max-width: 1471px) {
.has-text-centered-widescreen-only {
text-align: center !important; } }
@media screen and (min-width: 1472px) {
.has-text-centered-fullhd {
text-align: center !important; } }
@media screen and (max-width: 768px) {
.has-text-justified-mobile {
text-align: justify !important; } }
@media screen and (min-width: 769px), print {
.has-text-justified-tablet {
text-align: justify !important; } }
@media screen and (min-width: 769px) and (max-width: 1087px) {
.has-text-justified-tablet-only {
text-align: justify !important; } }
@media screen and (max-width: 1087px) {
.has-text-justified-touch {
text-align: justify !important; } }
@media screen and (min-width: 1088px) {
.has-text-justified-desktop {
text-align: justify !important; } }
@media screen and (min-width: 1088px) and (max-width: 1279px) {
.has-text-justified-desktop-only {
text-align: justify !important; } }
@media screen and (min-width: 1280px) {
.has-text-justified-widescreen {
text-align: justify !important; } }
@media screen and (min-width: 1280px) and (max-width: 1471px) {
.has-text-justified-widescreen-only {
text-align: justify !important; } }
@media screen and (min-width: 1472px) {
.has-text-justified-fullhd {
text-align: justify !important; } }
@media screen and (max-width: 768px) {
.has-text-left-mobile {
text-align: left !important; } }
@media screen and (min-width: 769px), print {
.has-text-left-tablet {
text-align: left !important; } }
@media screen and (min-width: 769px) and (max-width: 1087px) {
.has-text-left-tablet-only {
text-align: left !important; } }
@media screen and (max-width: 1087px) {
.has-text-left-touch {
text-align: left !important; } }
@media screen and (min-width: 1088px) {
.has-text-left-desktop {
text-align: left !important; } }
@media screen and (min-width: 1088px) and (max-width: 1279px) {
.has-text-left-desktop-only {
text-align: left !important; } }
@media screen and (min-width: 1280px) {
.has-text-left-widescreen {
text-align: left !important; } }
@media screen and (min-width: 1280px) and (max-width: 1471px) {
.has-text-left-widescreen-only {
text-align: left !important; } }
@media screen and (min-width: 1472px) {
.has-text-left-fullhd {
text-align: left !important; } }
@media screen and (max-width: 768px) {
.has-text-right-mobile {
text-align: right !important; } }
@media screen and (min-width: 769px), print {
.has-text-right-tablet {
text-align: right !important; } }
@media screen and (min-width: 769px) and (max-width: 1087px) {
.has-text-right-tablet-only {
text-align: right !important; } }
@media screen and (max-width: 1087px) {
.has-text-right-touch {
text-align: right !important; } }
@media screen and (min-width: 1088px) {
.has-text-right-desktop {
text-align: right !important; } }
@media screen and (min-width: 1088px) and (max-width: 1279px) {
.has-text-right-desktop-only {
text-align: right !important; } }
@media screen and (min-width: 1280px) {
.has-text-right-widescreen {
text-align: right !important; } }
@media screen and (min-width: 1280px) and (max-width: 1471px) {
.has-text-right-widescreen-only {
text-align: right !important; } }
@media screen and (min-width: 1472px) {
.has-text-right-fullhd {
text-align: right !important; } }
.is-capitalized {
text-transform: capitalize !important; }
.is-lowercase {
text-transform: lowercase !important; }
.is-uppercase {
text-transform: uppercase !important; }
.is-italic {
font-style: italic !important; }
.has-text-white {
color: white !important; }
a.has-text-white:hover, a.has-text-white:focus {
color: #e6e6e6 !important; }
.has-background-white {
background-color: white !important; }
.has-text-black {
color: #0a0a0a !important; }
a.has-text-black:hover, a.has-text-black:focus {
color: black !important; }
.has-background-black {
background-color: #0a0a0a !important; }
.has-text-light {
color: whitesmoke !important; }
a.has-text-light:hover, a.has-text-light:focus {
color: #dbdbdb !important; }
.has-background-light {
background-color: whitesmoke !important; }
.has-text-dark {
color: #363636 !important; }
a.has-text-dark:hover, a.has-text-dark:focus {
color: #1c1c1c !important; }
.has-background-dark {
background-color: #363636 !important; }
.has-text-primary {
color: #00d1b2 !important; }
a.has-text-primary:hover, a.has-text-primary:focus {
color: #009e86 !important; }
.has-background-primary {
background-color: #00d1b2 !important; }
.has-text-link {
color: #3273dc !important; }
a.has-text-link:hover, a.has-text-link:focus {
color: #205bbc !important; }
.has-background-link {
background-color: #3273dc !important; }
.has-text-info {
color: #209cee !important; }
a.has-text-info:hover, a.has-text-info:focus {
color: #0f81cc !important; }
.has-background-info {
background-color: #209cee !important; }
.has-text-success {
color: #23d160 !important; }
a.has-text-success:hover, a.has-text-success:focus {
color: #1ca64c !important; }
.has-background-success {
background-color: #23d160 !important; }
.has-text-warning {
color: #ffdd57 !important; }
a.has-text-warning:hover, a.has-text-warning:focus {
color: #ffd324 !important; }
.has-background-warning {
background-color: #ffdd57 !important; }
.has-text-danger {
color: #ff3860 !important; }
a.has-text-danger:hover, a.has-text-danger:focus {
color: #ff0537 !important; }
.has-background-danger {
background-color: #ff3860 !important; }
.has-text-black-bis {
color: #121212 !important; }
.has-background-black-bis {
background-color: #121212 !important; }
.has-text-black-ter {
color: #242424 !important; }
.has-background-black-ter {
background-color: #242424 !important; }
.has-text-grey-darker {
color: #363636 !important; }
.has-background-grey-darker {
background-color: #363636 !important; }
.has-text-grey-dark {
color: #4a4a4a !important; }
.has-background-grey-dark {
background-color: #4a4a4a !important; }
.has-text-grey {
color: #7a7a7a !important; }
.has-background-grey {
background-color: #7a7a7a !important; }
.has-text-grey-light {
color: #b5b5b5 !important; }
.has-background-grey-light {
background-color: #b5b5b5 !important; }
.has-text-grey-lighter {
color: #dbdbdb !important; }
.has-background-grey-lighter {
background-color: #dbdbdb !important; }
.has-text-white-ter {
color: whitesmoke !important; }
.has-background-white-ter {
background-color: whitesmoke !important; }
.has-text-white-bis {
color: #fafafa !important; }
.has-background-white-bis {
background-color: #fafafa !important; }
.has-text-weight-light {
font-weight: 300 !important; }
.has-text-weight-normal {
font-weight: 400 !important; }
.has-text-weight-semibold {
font-weight: 600 !important; }
.has-text-weight-bold {
font-weight: 700 !important; }
.is-block {
display: block !important; }
@media screen and (max-width: 768px) {
.is-block-mobile {
display: block !important; } }
@media screen and (min-width: 769px), print {
.is-block-tablet {
display: block !important; } }
@media screen and (min-width: 769px) and (max-width: 1087px) {
.is-block-tablet-only {
display: block !important; } }
@media screen and (max-width: 1087px) {
.is-block-touch {
display: block !important; } }
@media screen and (min-width: 1088px) {
.is-block-desktop {
display: block !important; } }
@media screen and (min-width: 1088px) and (max-width: 1279px) {
.is-block-desktop-only {
display: block !important; } }
@media screen and (min-width: 1280px) {
.is-block-widescreen {
display: block !important; } }
@media screen and (min-width: 1280px) and (max-width: 1471px) {
.is-block-widescreen-only {
display: block !important; } }
@media screen and (min-width: 1472px) {
.is-block-fullhd {
display: block !important; } }
.is-flex {
display: flex !important; }
@media screen and (max-width: 768px) {
.is-flex-mobile {
display: flex !important; } }
@media screen and (min-width: 769px), print {
.is-flex-tablet {
display: flex !important; } }
@media screen and (min-width: 769px) and (max-width: 1087px) {
.is-flex-tablet-only {
display: flex !important; } }
@media screen and (max-width: 1087px) {
.is-flex-touch {
display: flex !important; } }
@media screen and (min-width: 1088px) {
.is-flex-desktop {
display: flex !important; } }
@media screen and (min-width: 1088px) and (max-width: 1279px) {
.is-flex-desktop-only {
display: flex !important; } }
@media screen and (min-width: 1280px) {
.is-flex-widescreen {
display: flex !important; } }
@media screen and (min-width: 1280px) and (max-width: 1471px) {
.is-flex-widescreen-only {
display: flex !important; } }
@media screen and (min-width: 1472px) {
.is-flex-fullhd {
display: flex !important; } }
.is-inline {
display: inline !important; }
@media screen and (max-width: 768px) {
.is-inline-mobile {
display: inline !important; } }
@media screen and (min-width: 769px), print {
.is-inline-tablet {
display: inline !important; } }
@media screen and (min-width: 769px) and (max-width: 1087px) {
.is-inline-tablet-only {
display: inline !important; } }
@media screen and (max-width: 1087px) {
.is-inline-touch {
display: inline !important; } }
@media screen and (min-width: 1088px) {
.is-inline-desktop {
display: inline !important; } }
@media screen and (min-width: 1088px) and (max-width: 1279px) {
.is-inline-desktop-only {
display: inline !important; } }
@media screen and (min-width: 1280px) {
.is-inline-widescreen {
display: inline !important; } }
@media screen and (min-width: 1280px) and (max-width: 1471px) {
.is-inline-widescreen-only {
display: inline !important; } }
@media screen and (min-width: 1472px) {
.is-inline-fullhd {
display: inline !important; } }
.is-inline-block {
display: inline-block !important; }
@media screen and (max-width: 768px) {
.is-inline-block-mobile {
display: inline-block !important; } }
@media screen and (min-width: 769px), print {
.is-inline-block-tablet {
display: inline-block !important; } }
@media screen and (min-width: 769px) and (max-width: 1087px) {
.is-inline-block-tablet-only {
display: inline-block !important; } }
@media screen and (max-width: 1087px) {
.is-inline-block-touch {
display: inline-block !important; } }
@media screen and (min-width: 1088px) {
.is-inline-block-desktop {
display: inline-block !important; } }
@media screen and (min-width: 1088px) and (max-width: 1279px) {
.is-inline-block-desktop-only {
display: inline-block !important; } }
@media screen and (min-width: 1280px) {
.is-inline-block-widescreen {
display: inline-block !important; } }
@media screen and (min-width: 1280px) and (max-width: 1471px) {
.is-inline-block-widescreen-only {
display: inline-block !important; } }
@media screen and (min-width: 1472px) {
.is-inline-block-fullhd {
display: inline-block !important; } }
.is-inline-flex {
display: inline-flex !important; }
@media screen and (max-width: 768px) {
.is-inline-flex-mobile {
display: inline-flex !important; } }
@media screen and (min-width: 769px), print {
.is-inline-flex-tablet {
display: inline-flex !important; } }
@media screen and (min-width: 769px) and (max-width: 1087px) {
.is-inline-flex-tablet-only {
display: inline-flex !important; } }
@media screen and (max-width: 1087px) {
.is-inline-flex-touch {
display: inline-flex !important; } }
@media screen and (min-width: 1088px) {
.is-inline-flex-desktop {
display: inline-flex !important; } }
@media screen and (min-width: 1088px) and (max-width: 1279px) {
.is-inline-flex-desktop-only {
display: inline-flex !important; } }
@media screen and (min-width: 1280px) {
.is-inline-flex-widescreen {
display: inline-flex !important; } }
@media screen and (min-width: 1280px) and (max-width: 1471px) {
.is-inline-flex-widescreen-only {
display: inline-flex !important; } }
@media screen and (min-width: 1472px) {
.is-inline-flex-fullhd {
display: inline-flex !important; } }
.is-hidden {
display: none !important; }
.is-sr-only {
border: none !important;
clip: rect(0, 0, 0, 0) !important;
height: 0.01em !important;
overflow: hidden !important;
padding: 0 !important;
position: absolute !important;
white-space: nowrap !important;
width: 0.01em !important; }
@media screen and (max-width: 768px) {
.is-hidden-mobile {
display: none !important; } }
@media screen and (min-width: 769px), print {
.is-hidden-tablet {
display: none !important; } }
@media screen and (min-width: 769px) and (max-width: 1087px) {
.is-hidden-tablet-only {
display: none !important; } }
@media screen and (max-width: 1087px) {
.is-hidden-touch {
display: none !important; } }
@media screen and (min-width: 1088px) {
.is-hidden-desktop {
display: none !important; } }
@media screen and (min-width: 1088px) and (max-width: 1279px) {
.is-hidden-desktop-only {
display: none !important; } }
@media screen and (min-width: 1280px) {
.is-hidden-widescreen {
display: none !important; } }
@media screen and (min-width: 1280px) and (max-width: 1471px) {
.is-hidden-widescreen-only {
display: none !important; } }
@media screen and (min-width: 1472px) {
.is-hidden-fullhd {
display: none !important; } }
.is-invisible {
visibility: hidden !important; }
@media screen and (max-width: 768px) {
.is-invisible-mobile {
visibility: hidden !important; } }
@media screen and (min-width: 769px), print {
.is-invisible-tablet {
visibility: hidden !important; } }
@media screen and (min-width: 769px) and (max-width: 1087px) {
.is-invisible-tablet-only {
visibility: hidden !important; } }
@media screen and (max-width: 1087px) {
.is-invisible-touch {
visibility: hidden !important; } }
@media screen and (min-width: 1088px) {
.is-invisible-desktop {
visibility: hidden !important; } }
@media screen and (min-width: 1088px) and (max-width: 1279px) {
.is-invisible-desktop-only {
visibility: hidden !important; } }
@media screen and (min-width: 1280px) {
.is-invisible-widescreen {
visibility: hidden !important; } }
@media screen and (min-width: 1280px) and (max-width: 1471px) {
.is-invisible-widescreen-only {
visibility: hidden !important; } }
@media screen and (min-width: 1472px) {
.is-invisible-fullhd {
visibility: hidden !important; } }
.is-marginless {
margin: 0 !important; }
.is-paddingless {
padding: 0 !important; }
.is-radiusless {
border-radius: 0 !important; }
.is-shadowless {
box-shadow: none !important; }
.box {
background-color: white;
border-radius: 6px;
box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1);
color: #4a4a4a;
display: block;
padding: 1.25rem; }
a.box:hover, a.box:focus {
box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px #3273dc; }
a.box:active {
box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2), 0 0 0 1px #3273dc; }
.button {
background-color: white;
border-color: #dbdbdb;
border-width: 1px;
color: #363636;
cursor: pointer;
justify-content: center;
padding-bottom: calc(0.375em - 1px);
padding-left: 0.75em;
padding-right: 0.75em;
padding-top: calc(0.375em - 1px);
text-align: center;
white-space: nowrap; }
.button strong {
color: inherit; }
.button .icon, .button .icon.is-small, .button .icon.is-medium, .button .icon.is-large {
height: 1.5em;
width: 1.5em; }
.button .icon:first-child:not(:last-child) {
margin-left: calc(-0.375em - 1px);
margin-right: 0.1875em; }
.button .icon:last-child:not(:first-child) {
margin-left: 0.1875em;
margin-right: calc(-0.375em - 1px); }
.button .icon:first-child:last-child {
margin-left: calc(-0.375em - 1px);
margin-right: calc(-0.375em - 1px); }
.button:hover, .button.is-hovered {
border-color: #b5b5b5;
color: #363636; }
.button:focus, .button.is-focused {
border-color: #3273dc;
color: #363636; }
.button:focus:not(:active), .button.is-focused:not(:active) {
box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); }
.button:active, .button.is-active {
border-color: #4a4a4a;
color: #363636; }
.button.is-text {
background-color: transparent;
border-color: transparent;
color: #4a4a4a;
text-decoration: underline; }
.button.is-text:hover, .button.is-text.is-hovered, .button.is-text:focus, .button.is-text.is-focused {
background-color: whitesmoke;
color: #363636; }
.button.is-text:active, .button.is-text.is-active {
background-color: #e8e8e8;
color: #363636; }
.button.is-text[disabled] {
background-color: transparent;
border-color: transparent;
box-shadow: none; }
.button.is-white {
background-color: white;
border-color: transparent;
color: #0a0a0a; }
.button.is-white:hover, .button.is-white.is-hovered {
background-color: #f9f9f9;
border-color: transparent;
color: #0a0a0a; }
.button.is-white:focus, .button.is-white.is-focused {
border-color: transparent;
color: #0a0a0a; }
.button.is-white:focus:not(:active), .button.is-white.is-focused:not(:active) {
box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); }
.button.is-white:active, .button.is-white.is-active {
background-color: #f2f2f2;
border-color: transparent;
color: #0a0a0a; }
.button.is-white[disabled] {
background-color: white;
border-color: transparent;
box-shadow: none; }
.button.is-white.is-inverted {
background-color: #0a0a0a;
color: white; }
.button.is-white.is-inverted:hover {
background-color: black; }
.button.is-white.is-inverted[disabled] {
background-color: #0a0a0a;
border-color: transparent;
box-shadow: none;
color: white; }
.button.is-white.is-loading::after {
border-color: transparent transparent #0a0a0a #0a0a0a !important; }
.button.is-white.is-outlined {
background-color: transparent;
border-color: white;
color: white; }
.button.is-white.is-outlined:hover, .button.is-white.is-outlined:focus {
background-color: white;
border-color: white;
color: #0a0a0a; }
.button.is-white.is-outlined.is-loading::after {
border-color: transparent transparent white white !important; }
.button.is-white.is-outlined[disabled] {
background-color: transparent;
border-color: white;
box-shadow: none;
color: white; }
.button.is-white.is-inverted.is-outlined {
background-color: transparent;
border-color: #0a0a0a;
color: #0a0a0a; }
.button.is-white.is-inverted.is-outlined:hover, .button.is-white.is-inverted.is-outlined:focus {
background-color: #0a0a0a;
color: white; }
.button.is-white.is-inverted.is-outlined[disabled] {
background-color: transparent;
border-color: #0a0a0a;
box-shadow: none;
color: #0a0a0a; }
.button.is-black {
background-color: #0a0a0a;
border-color: transparent;
color: white; }
.button.is-black:hover, .button.is-black.is-hovered {
background-color: #040404;
border-color: transparent;
color: white; }
.button.is-black:focus, .button.is-black.is-focused {
border-color: transparent;
color: white; }
.button.is-black:focus:not(:active), .button.is-black.is-focused:not(:active) {
box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); }
.button.is-black:active, .button.is-black.is-active {
background-color: black;
border-color: transparent;
color: white; }
.button.is-black[disabled] {
background-color: #0a0a0a;
border-color: transparent;
box-shadow: none; }
.button.is-black.is-inverted {
background-color: white;
color: #0a0a0a; }
.button.is-black.is-inverted:hover {
background-color: #f2f2f2; }
.button.is-black.is-inverted[disabled] {
background-color: white;
border-color: transparent;
box-shadow: none;
color: #0a0a0a; }
.button.is-black.is-loading::after {
border-color: transparent transparent white white !important; }
.button.is-black.is-outlined {
background-color: transparent;
border-color: #0a0a0a;
color: #0a0a0a; }
.button.is-black.is-outlined:hover, .button.is-black.is-outlined:focus {
background-color: #0a0a0a;
border-color: #0a0a0a;
color: white; }
.button.is-black.is-outlined.is-loading::after {
border-color: transparent transparent #0a0a0a #0a0a0a !important; }
.button.is-black.is-outlined[disabled] {
background-color: transparent;
border-color: #0a0a0a;
box-shadow: none;
color: #0a0a0a; }
.button.is-black.is-inverted.is-outlined {
background-color: transparent;
border-color: white;
color: white; }
.button.is-black.is-inverted.is-outlined:hover, .button.is-black.is-inverted.is-outlined:focus {
background-color: white;
color: #0a0a0a; }
.button.is-black.is-inverted.is-outlined[disabled] {
background-color: transparent;
border-color: white;
box-shadow: none;
color: white; }
.button.is-light {
background-color: whitesmoke;
border-color: transparent;
color: #363636; }
.button.is-light:hover, .button.is-light.is-hovered {
background-color: #eeeeee;
border-color: transparent;
color: #363636; }
.button.is-light:focus, .button.is-light.is-focused {
border-color: transparent;
color: #363636; }
.button.is-light:focus:not(:active), .button.is-light.is-focused:not(:active) {
box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); }
.button.is-light:active, .button.is-light.is-active {
background-color: #e8e8e8;
border-color: transparent;
color: #363636; }
.button.is-light[disabled] {
background-color: whitesmoke;
border-color: transparent;
box-shadow: none; }
.button.is-light.is-inverted {
background-color: #363636;
color: whitesmoke; }
.button.is-light.is-inverted:hover {
background-color: #292929; }
.button.is-light.is-inverted[disabled] {
background-color: #363636;
border-color: transparent;
box-shadow: none;
color: whitesmoke; }
.button.is-light.is-loading::after {
border-color: transparent transparent #363636 #363636 !important; }
.button.is-light.is-outlined {
background-color: transparent;
border-color: whitesmoke;
color: whitesmoke; }
.button.is-light.is-outlined:hover, .button.is-light.is-outlined:focus {
background-color: whitesmoke;
border-color: whitesmoke;
color: #363636; }
.button.is-light.is-outlined.is-loading::after {
border-color: transparent transparent whitesmoke whitesmoke !important; }
.button.is-light.is-outlined[disabled] {
background-color: transparent;
border-color: whitesmoke;
box-shadow: none;
color: whitesmoke; }
.button.is-light.is-inverted.is-outlined {
background-color: transparent;
border-color: #363636;
color: #363636; }
.button.is-light.is-inverted.is-outlined:hover, .button.is-light.is-inverted.is-outlined:focus {
background-color: #363636;
color: whitesmoke; }
.button.is-light.is-inverted.is-outlined[disabled] {
background-color: transparent;
border-color: #363636;
box-shadow: none;
color: #363636; }
.button.is-dark {
background-color: #363636;
border-color: transparent;
color: whitesmoke; }
.button.is-dark:hover, .button.is-dark.is-hovered {
background-color: #2f2f2f;
border-color: transparent;
color: whitesmoke; }
.button.is-dark:focus, .button.is-dark.is-focused {
border-color: transparent;
color: whitesmoke; }
.button.is-dark:focus:not(:active), .button.is-dark.is-focused:not(:active) {
box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); }
.button.is-dark:active, .button.is-dark.is-active {
background-color: #292929;
border-color: transparent;
color: whitesmoke; }
.button.is-dark[disabled] {
background-color: #363636;
border-color: transparent;
box-shadow: none; }
.button.is-dark.is-inverted {
background-color: whitesmoke;
color: #363636; }
.button.is-dark.is-inverted:hover {
background-color: #e8e8e8; }
.button.is-dark.is-inverted[disabled] {
background-color: whitesmoke;
border-color: transparent;
box-shadow: none;
color: #363636; }
.button.is-dark.is-loading::after {
border-color: transparent transparent whitesmoke whitesmoke !important; }
.button.is-dark.is-outlined {
background-color: transparent;
border-color: #363636;
color: #363636; }
.button.is-dark.is-outlined:hover, .button.is-dark.is-outlined:focus {
background-color: #363636;
border-color: #363636;
color: whitesmoke; }
.button.is-dark.is-outlined.is-loading::after {
border-color: transparent transparent #363636 #363636 !important; }
.button.is-dark.is-outlined[disabled] {
background-color: transparent;
border-color: #363636;
box-shadow: none;
color: #363636; }
.button.is-dark.is-inverted.is-outlined {
background-color: transparent;
border-color: whitesmoke;
color: whitesmoke; }
.button.is-dark.is-inverted.is-outlined:hover, .button.is-dark.is-inverted.is-outlined:focus {
background-color: whitesmoke;
color: #363636; }
.button.is-dark.is-inverted.is-outlined[disabled] {
background-color: transparent;
border-color: whitesmoke;
box-shadow: none;
color: whitesmoke; }
.button.is-primary {
background-color: #00d1b2;
border-color: transparent;
color: #fff; }
.button.is-primary:hover, .button.is-primary.is-hovered {
background-color: #00c4a7;
border-color: transparent;
color: #fff; }
.button.is-primary:focus, .button.is-primary.is-focused {
border-color: transparent;
color: #fff; }
.button.is-primary:focus:not(:active), .button.is-primary.is-focused:not(:active) {
box-shadow: 0 0 0 0.125em rgba(0, 209, 178, 0.25); }
.button.is-primary:active, .button.is-primary.is-active {
background-color: #00b89c;
border-color: transparent;
color: #fff; }
.button.is-primary[disabled] {
background-color: #00d1b2;
border-color: transparent;
box-shadow: none; }
.button.is-primary.is-inverted {
background-color: #fff;
color: #00d1b2; }
.button.is-primary.is-inverted:hover {
background-color: #f2f2f2; }
.button.is-primary.is-inverted[disabled] {
background-color: #fff;
border-color: transparent;
box-shadow: none;
color: #00d1b2; }
.button.is-primary.is-loading::after {
border-color: transparent transparent #fff #fff !important; }
.button.is-primary.is-outlined {
background-color: transparent;
border-color: #00d1b2;
color: #00d1b2; }
.button.is-primary.is-outlined:hover, .button.is-primary.is-outlined:focus {
background-color: #00d1b2;
border-color: #00d1b2;
color: #fff; }
.button.is-primary.is-outlined.is-loading::after {
border-color: transparent transparent #00d1b2 #00d1b2 !important; }
.button.is-primary.is-outlined[disabled] {
background-color: transparent;
border-color: #00d1b2;
box-shadow: none;
color: #00d1b2; }
.button.is-primary.is-inverted.is-outlined {
background-color: transparent;
border-color: #fff;
color: #fff; }
.button.is-primary.is-inverted.is-outlined:hover, .button.is-primary.is-inverted.is-outlined:focus {
background-color: #fff;
color: #00d1b2; }
.button.is-primary.is-inverted.is-outlined[disabled] {
background-color: transparent;
border-color: #fff;
box-shadow: none;
color: #fff; }
.button.is-link {
background-color: #3273dc;
border-color: transparent;
color: #fff; }
.button.is-link:hover, .button.is-link.is-hovered {
background-color: #276cda;
border-color: transparent;
color: #fff; }
.button.is-link:focus, .button.is-link.is-focused {
border-color: transparent;
color: #fff; }
.button.is-link:focus:not(:active), .button.is-link.is-focused:not(:active) {
box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); }
.button.is-link:active, .button.is-link.is-active {
background-color: #2366d1;
border-color: transparent;
color: #fff; }
.button.is-link[disabled] {
background-color: #3273dc;
border-color: transparent;
box-shadow: none; }
.button.is-link.is-inverted {
background-color: #fff;
color: #3273dc; }
.button.is-link.is-inverted:hover {
background-color: #f2f2f2; }
.button.is-link.is-inverted[disabled] {
background-color: #fff;
border-color: transparent;
box-shadow: none;
color: #3273dc; }
.button.is-link.is-loading::after {
border-color: transparent transparent #fff #fff !important; }
.button.is-link.is-outlined {
background-color: transparent;
border-color: #3273dc;
color: #3273dc; }
.button.is-link.is-outlined:hover, .button.is-link.is-outlined:focus {
background-color: #3273dc;
border-color: #3273dc;
color: #fff; }
.button.is-link.is-outlined.is-loading::after {
border-color: transparent transparent #3273dc #3273dc !important; }
.button.is-link.is-outlined[disabled] {
background-color: transparent;
border-color: #3273dc;
box-shadow: none;
color: #3273dc; }
.button.is-link.is-inverted.is-outlined {
background-color: transparent;
border-color: #fff;
color: #fff; }
.button.is-link.is-inverted.is-outlined:hover, .button.is-link.is-inverted.is-outlined:focus {
background-color: #fff;
color: #3273dc; }
.button.is-link.is-inverted.is-outlined[disabled] {
background-color: transparent;
border-color: #fff;
box-shadow: none;
color: #fff; }
.button.is-info {
background-color: #209cee;
border-color: transparent;
color: #fff; }
.button.is-info:hover, .button.is-info.is-hovered {
background-color: #1496ed;
border-color: transparent;
color: #fff; }
.button.is-info:focus, .button.is-info.is-focused {
border-color: transparent;
color: #fff; }
.button.is-info:focus:not(:active), .button.is-info.is-focused:not(:active) {
box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); }
.button.is-info:active, .button.is-info.is-active {
background-color: #118fe4;
border-color: transparent;
color: #fff; }
.button.is-info[disabled] {
background-color: #209cee;
border-color: transparent;
box-shadow: none; }
.button.is-info.is-inverted {
background-color: #fff;
color: #209cee; }
.button.is-info.is-inverted:hover {
background-color: #f2f2f2; }
.button.is-info.is-inverted[disabled] {
background-color: #fff;
border-color: transparent;
box-shadow: none;
color: #209cee; }
.button.is-info.is-loading::after {
border-color: transparent transparent #fff #fff !important; }
.button.is-info.is-outlined {
background-color: transparent;
border-color: #209cee;
color: #209cee; }
.button.is-info.is-outlined:hover, .button.is-info.is-outlined:focus {
background-color: #209cee;
border-color: #209cee;
color: #fff; }
.button.is-info.is-outlined.is-loading::after {
border-color: transparent transparent #209cee #209cee !important; }
.button.is-info.is-outlined[disabled] {
background-color: transparent;
border-color: #209cee;
box-shadow: none;
color: #209cee; }
.button.is-info.is-inverted.is-outlined {
background-color: transparent;
border-color: #fff;
color: #fff; }
.button.is-info.is-inverted.is-outlined:hover, .button.is-info.is-inverted.is-outlined:focus {
background-color: #fff;
color: #209cee; }
.button.is-info.is-inverted.is-outlined[disabled] {
background-color: transparent;
border-color: #fff;
box-shadow: none;
color: #fff; }
.button.is-success {
background-color: #23d160;
border-color: transparent;
color: #fff; }
.button.is-success:hover, .button.is-success.is-hovered {
background-color: #22c65b;
border-color: transparent;
color: #fff; }
.button.is-success:focus, .button.is-success.is-focused {
border-color: transparent;
color: #fff; }
.button.is-success:focus:not(:active), .button.is-success.is-focused:not(:active) {
box-shadow: 0 0 0 0.125em rgba(35, 209, 96, 0.25); }
.button.is-success:active, .button.is-success.is-active {
background-color: #20bc56;
border-color: transparent;
color: #fff; }
.button.is-success[disabled] {
background-color: #23d160;
border-color: transparent;
box-shadow: none; }
.button.is-success.is-inverted {
background-color: #fff;
color: #23d160; }
.button.is-success.is-inverted:hover {
background-color: #f2f2f2; }
.button.is-success.is-inverted[disabled] {
background-color: #fff;
border-color: transparent;
box-shadow: none;
color: #23d160; }
.button.is-success.is-loading::after {
border-color: transparent transparent #fff #fff !important; }
.button.is-success.is-outlined {
background-color: transparent;
border-color: #23d160;
color: #23d160; }
.button.is-success.is-outlined:hover, .button.is-success.is-outlined:focus {
background-color: #23d160;
border-color: #23d160;
color: #fff; }
.button.is-success.is-outlined.is-loading::after {
border-color: transparent transparent #23d160 #23d160 !important; }
.button.is-success.is-outlined[disabled] {
background-color: transparent;
border-color: #23d160;
box-shadow: none;
color: #23d160; }
.button.is-success.is-inverted.is-outlined {
background-color: transparent;
border-color: #fff;
color: #fff; }
.button.is-success.is-inverted.is-outlined:hover, .button.is-success.is-inverted.is-outlined:focus {
background-color: #fff;
color: #23d160; }
.button.is-success.is-inverted.is-outlined[disabled] {
background-color: transparent;
border-color: #fff;
box-shadow: none;
color: #fff; }
.button.is-warning {
background-color: #ffdd57;
border-color: transparent;
color: rgba(0, 0, 0, 0.7); }
.button.is-warning:hover, .button.is-warning.is-hovered {
background-color: #ffdb4a;
border-color: transparent;
color: rgba(0, 0, 0, 0.7); }
.button.is-warning:focus, .button.is-warning.is-focused {
border-color: transparent;
color: rgba(0, 0, 0, 0.7); }
.button.is-warning:focus:not(:active), .button.is-warning.is-focused:not(:active) {
box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); }
.button.is-warning:active, .button.is-warning.is-active {
background-color: #ffd83d;
border-color: transparent;
color: rgba(0, 0, 0, 0.7); }
.button.is-warning[disabled] {
background-color: #ffdd57;
border-color: transparent;
box-shadow: none; }
.button.is-warning.is-inverted {
background-color: rgba(0, 0, 0, 0.7);
color: #ffdd57; }
.button.is-warning.is-inverted:hover {
background-color: rgba(0, 0, 0, 0.7); }
.button.is-warning.is-inverted[disabled] {
background-color: rgba(0, 0, 0, 0.7);
border-color: transparent;
box-shadow: none;
color: #ffdd57; }
.button.is-warning.is-loading::after {
border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; }
.button.is-warning.is-outlined {
background-color: transparent;
border-color: #ffdd57;
color: #ffdd57; }
.button.is-warning.is-outlined:hover, .button.is-warning.is-outlined:focus {
background-color: #ffdd57;
border-color: #ffdd57;
color: rgba(0, 0, 0, 0.7); }
.button.is-warning.is-outlined.is-loading::after {
border-color: transparent transparent #ffdd57 #ffdd57 !important; }
.button.is-warning.is-outlined[disabled] {
background-color: transparent;
border-color: #ffdd57;
box-shadow: none;
color: #ffdd57; }
.button.is-warning.is-inverted.is-outlined {
background-color: transparent;
border-color: rgba(0, 0, 0, 0.7);
color: rgba(0, 0, 0, 0.7); }
.button.is-warning.is-inverted.is-outlined:hover, .button.is-warning.is-inverted.is-outlined:focus {
background-color: rgba(0, 0, 0, 0.7);
color: #ffdd57; }
.button.is-warning.is-inverted.is-outlined[disabled] {
background-color: transparent;
border-color: rgba(0, 0, 0, 0.7);
box-shadow: none;
color: rgba(0, 0, 0, 0.7); }
.button.is-danger {
background-color: #ff3860;
border-color: transparent;
color: #fff; }
.button.is-danger:hover, .button.is-danger.is-hovered {
background-color: #ff2b56;
border-color: transparent;
color: #fff; }
.button.is-danger:focus, .button.is-danger.is-focused {
border-color: transparent;
color: #fff; }
.button.is-danger:focus:not(:active), .button.is-danger.is-focused:not(:active) {
box-shadow: 0 0 0 0.125em rgba(255, 56, 96, 0.25); }
.button.is-danger:active, .button.is-danger.is-active {
background-color: #ff1f4b;
border-color: transparent;
color: #fff; }
.button.is-danger[disabled] {
background-color: #ff3860;
border-color: transparent;
box-shadow: none; }
.button.is-danger.is-inverted {
background-color: #fff;
color: #ff3860; }
.button.is-danger.is-inverted:hover {
background-color: #f2f2f2; }
.button.is-danger.is-inverted[disabled] {
background-color: #fff;
border-color: transparent;
box-shadow: none;
color: #ff3860; }
.button.is-danger.is-loading::after {
border-color: transparent transparent #fff #fff !important; }
.button.is-danger.is-outlined {
background-color: transparent;
border-color: #ff3860;
color: #ff3860; }
.button.is-danger.is-outlined:hover, .button.is-danger.is-outlined:focus {
background-color: #ff3860;
border-color: #ff3860;
color: #fff; }
.button.is-danger.is-outlined.is-loading::after {
border-color: transparent transparent #ff3860 #ff3860 !important; }
.button.is-danger.is-outlined[disabled] {
background-color: transparent;
border-color: #ff3860;
box-shadow: none;
color: #ff3860; }
.button.is-danger.is-inverted.is-outlined {
background-color: transparent;
border-color: #fff;
color: #fff; }
.button.is-danger.is-inverted.is-outlined:hover, .button.is-danger.is-inverted.is-outlined:focus {
background-color: #fff;
color: #ff3860; }
.button.is-danger.is-inverted.is-outlined[disabled] {
background-color: transparent;
border-color: #fff;
box-shadow: none;
color: #fff; }
.button.is-small {
border-radius: 2px;
font-size: 0.75rem; }
.button.is-medium {
font-size: 1.25rem; }
.button.is-large {
font-size: 1.5rem; }
.button[disabled] {
background-color: white;
border-color: #dbdbdb;
box-shadow: none;
opacity: 0.5; }
.button.is-fullwidth {
display: flex;
width: 100%; }
.button.is-loading {
color: transparent !important;
pointer-events: none; }
.button.is-loading::after {
position: absolute;
left: calc(50% - (1em / 2));
top: calc(50% - (1em / 2));
position: absolute !important; }
.button.is-static {
background-color: whitesmoke;
border-color: #dbdbdb;
color: #7a7a7a;
box-shadow: none;
pointer-events: none; }
.button.is-rounded {
border-radius: 290486px;
padding-left: 1em;
padding-right: 1em; }
.buttons {
align-items: center;
display: flex;
flex-wrap: wrap;
justify-content: flex-start; }
.buttons .button {
margin-bottom: 0.5rem; }
.buttons .button:not(:last-child):not(.is-fullwidth) {
margin-right: 0.5rem; }
.buttons:last-child {
margin-bottom: -0.5rem; }
.buttons:not(:last-child) {
margin-bottom: 1rem; }
.buttons.has-addons .button:not(:first-child) {
border-bottom-left-radius: 0;
border-top-left-radius: 0; }
.buttons.has-addons .button:not(:last-child) {
border-bottom-right-radius: 0;
border-top-right-radius: 0;
margin-right: -1px; }
.buttons.has-addons .button:last-child {
margin-right: 0; }
.buttons.has-addons .button:hover, .buttons.has-addons .button.is-hovered {
z-index: 2; }
.buttons.has-addons .button:focus, .buttons.has-addons .button.is-focused, .buttons.has-addons .button:active, .buttons.has-addons .button.is-active, .buttons.has-addons .button.is-selected {
z-index: 3; }
.buttons.has-addons .button:focus:hover, .buttons.has-addons .button.is-focused:hover, .buttons.has-addons .button:active:hover, .buttons.has-addons .button.is-active:hover, .buttons.has-addons .button.is-selected:hover {
z-index: 4; }
.buttons.has-addons .button.is-expanded {
flex-grow: 1; }
.buttons.is-centered {
justify-content: center; }
.buttons.is-right {
justify-content: flex-end; }
.container {
margin: 0 auto;
position: relative; }
@media screen and (min-width: 1088px) {
.container {
max-width: 960px;
width: 960px; }
.container.is-fluid {
margin-left: 64px;
margin-right: 64px;
max-width: none;
width: auto; } }
@media screen and (max-width: 1279px) {
.container.is-widescreen {
max-width: 1152px;
width: auto; } }
@media screen and (max-width: 1471px) {
.container.is-fullhd {
max-width: 1344px;
width: auto; } }
@media screen and (min-width: 1280px) {
.container {
max-width: 1152px;
width: 1152px; } }
@media screen and (min-width: 1472px) {
.container {
max-width: 1344px;
width: 1344px; } }
.content li + li {
margin-top: 0.25em; }
.content p:not(:last-child),
.content dl:not(:last-child),
.content ol:not(:last-child),
.content ul:not(:last-child),
.content blockquote:not(:last-child),
.content pre:not(:last-child),
.content table:not(:last-child) {
margin-bottom: 1em; }
.content h1,
.content h2,
.content h3,
.content h4,
.content h5,
.content h6 {
color: #363636;
font-weight: 600;
line-height: 1.125; }
.content h1 {
font-size: 2em;
margin-bottom: 0.5em; }
.content h1:not(:first-child) {
margin-top: 1em; }
.content h2 {
font-size: 1.75em;
margin-bottom: 0.5714em; }
.content h2:not(:first-child) {
margin-top: 1.1428em; }
.content h3 {
font-size: 1.5em;
margin-bottom: 0.6666em; }
.content h3:not(:first-child) {
margin-top: 1.3333em; }
.content h4 {
font-size: 1.25em;
margin-bottom: 0.8em; }
.content h5 {
font-size: 1.125em;
margin-bottom: 0.8888em; }
.content h6 {
font-size: 1em;
margin-bottom: 1em; }
.content blockquote {
background-color: whitesmoke;
border-left: 5px solid #dbdbdb;
padding: 1.25em 1.5em; }
.content ol {
list-style-position: outside;
margin-left: 2em;
margin-top: 1em; }
.content ol:not([type]) {
list-style-type: decimal; }
.content ol:not([type]).is-lower-alpha {
list-style-type: lower-alpha; }
.content ol:not([type]).is-lower-roman {
list-style-type: lower-roman; }
.content ol:not([type]).is-upper-alpha {
list-style-type: upper-alpha; }
.content ol:not([type]).is-upper-roman {
list-style-type: upper-roman; }
.content ul {
list-style: disc outside;
margin-left: 2em;
margin-top: 1em; }
.content ul ul {
list-style-type: circle;
margin-top: 0.5em; }
.content ul ul ul {
list-style-type: square; }
.content dd {
margin-left: 2em; }
.content figure {
margin-left: 2em;
margin-right: 2em;
text-align: center; }
.content figure:not(:first-child) {
margin-top: 2em; }
.content figure:not(:last-child) {
margin-bottom: 2em; }
.content figure img {
display: inline-block; }
.content figure figcaption {
font-style: italic; }
.content pre {
-webkit-overflow-scrolling: touch;
overflow-x: auto;
padding: 1.25em 1.5em;
white-space: pre;
word-wrap: normal; }
.content sup,
.content sub {
font-size: 75%; }
.content table {
width: 100%; }
.content table td,
.content table th {
border: 1px solid #dbdbdb;
border-width: 0 0 1px;
padding: 0.5em 0.75em;
vertical-align: top; }
.content table th {
color: #363636;
text-align: left; }
.content table thead td,
.content table thead th {
border-width: 0 0 2px;
color: #363636; }
.content table tfoot td,
.content table tfoot th {
border-width: 2px 0 0;
color: #363636; }
.content table tbody tr:last-child td,
.content table tbody tr:last-child th {
border-bottom-width: 0; }
.content.is-small {
font-size: 0.75rem; }
.content.is-medium {
font-size: 1.25rem; }
.content.is-large {
font-size: 1.5rem; }
.input,
.textarea {
background-color: white;
border-color: #dbdbdb;
color: #363636;
box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1);
max-width: 100%;
width: 100%; }
.input::-moz-placeholder,
.textarea::-moz-placeholder {
color: rgba(54, 54, 54, 0.3); }
.input::-webkit-input-placeholder,
.textarea::-webkit-input-placeholder {
color: rgba(54, 54, 54, 0.3); }
.input:-moz-placeholder,
.textarea:-moz-placeholder {
color: rgba(54, 54, 54, 0.3); }
.input:-ms-input-placeholder,
.textarea:-ms-input-placeholder {
color: rgba(54, 54, 54, 0.3); }
.input:hover, .input.is-hovered,
.textarea:hover,
.textarea.is-hovered {
border-color: #b5b5b5; }
.input:focus, .input.is-focused, .input:active, .input.is-active,
.textarea:focus,
.textarea.is-focused,
.textarea:active,
.textarea.is-active {
border-color: #3273dc;
box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); }
.input[disabled],
.textarea[disabled] {
background-color: whitesmoke;
border-color: whitesmoke;
box-shadow: none;
color: #7a7a7a; }
.input[disabled]::-moz-placeholder,
.textarea[disabled]::-moz-placeholder {
color: rgba(122, 122, 122, 0.3); }
.input[disabled]::-webkit-input-placeholder,
.textarea[disabled]::-webkit-input-placeholder {
color: rgba(122, 122, 122, 0.3); }
.input[disabled]:-moz-placeholder,
.textarea[disabled]:-moz-placeholder {
color: rgba(122, 122, 122, 0.3); }
.input[disabled]:-ms-input-placeholder,
.textarea[disabled]:-ms-input-placeholder {
color: rgba(122, 122, 122, 0.3); }
.input[readonly],
.textarea[readonly] {
box-shadow: none; }
.input.is-white,
.textarea.is-white {
border-color: white; }
.input.is-white:focus, .input.is-white.is-focused, .input.is-white:active, .input.is-white.is-active,
.textarea.is-white:focus,
.textarea.is-white.is-focused,
.textarea.is-white:active,
.textarea.is-white.is-active {
box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); }
.input.is-black,
.textarea.is-black {
border-color: #0a0a0a; }
.input.is-black:focus, .input.is-black.is-focused, .input.is-black:active, .input.is-black.is-active,
.textarea.is-black:focus,
.textarea.is-black.is-focused,
.textarea.is-black:active,
.textarea.is-black.is-active {
box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); }
.input.is-light,
.textarea.is-light {
border-color: whitesmoke; }
.input.is-light:focus, .input.is-light.is-focused, .input.is-light:active, .input.is-light.is-active,
.textarea.is-light:focus,
.textarea.is-light.is-focused,
.textarea.is-light:active,
.textarea.is-light.is-active {
box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); }
.input.is-dark,
.textarea.is-dark {
border-color: #363636; }
.input.is-dark:focus, .input.is-dark.is-focused, .input.is-dark:active, .input.is-dark.is-active,
.textarea.is-dark:focus,
.textarea.is-dark.is-focused,
.textarea.is-dark:active,
.textarea.is-dark.is-active {
box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); }
.input.is-primary,
.textarea.is-primary {
border-color: #00d1b2; }
.input.is-primary:focus, .input.is-primary.is-focused, .input.is-primary:active, .input.is-primary.is-active,
.textarea.is-primary:focus,
.textarea.is-primary.is-focused,
.textarea.is-primary:active,
.textarea.is-primary.is-active {
box-shadow: 0 0 0 0.125em rgba(0, 209, 178, 0.25); }
.input.is-link,
.textarea.is-link {
border-color: #3273dc; }
.input.is-link:focus, .input.is-link.is-focused, .input.is-link:active, .input.is-link.is-active,
.textarea.is-link:focus,
.textarea.is-link.is-focused,
.textarea.is-link:active,
.textarea.is-link.is-active {
box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); }
.input.is-info,
.textarea.is-info {
border-color: #209cee; }
.input.is-info:focus, .input.is-info.is-focused, .input.is-info:active, .input.is-info.is-active,
.textarea.is-info:focus,
.textarea.is-info.is-focused,
.textarea.is-info:active,
.textarea.is-info.is-active {
box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); }
.input.is-success,
.textarea.is-success {
border-color: #23d160; }
.input.is-success:focus, .input.is-success.is-focused, .input.is-success:active, .input.is-success.is-active,
.textarea.is-success:focus,
.textarea.is-success.is-focused,
.textarea.is-success:active,
.textarea.is-success.is-active {
box-shadow: 0 0 0 0.125em rgba(35, 209, 96, 0.25); }
.input.is-warning,
.textarea.is-warning {
border-color: #ffdd57; }
.input.is-warning:focus, .input.is-warning.is-focused, .input.is-warning:active, .input.is-warning.is-active,
.textarea.is-warning:focus,
.textarea.is-warning.is-focused,
.textarea.is-warning:active,
.textarea.is-warning.is-active {
box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); }
.input.is-danger,
.textarea.is-danger {
border-color: #ff3860; }
.input.is-danger:focus, .input.is-danger.is-focused, .input.is-danger:active, .input.is-danger.is-active,
.textarea.is-danger:focus,
.textarea.is-danger.is-focused,
.textarea.is-danger:active,
.textarea.is-danger.is-active {
box-shadow: 0 0 0 0.125em rgba(255, 56, 96, 0.25); }
.input.is-small,
.textarea.is-small {
border-radius: 2px;
font-size: 0.75rem; }
.input.is-medium,
.textarea.is-medium {
font-size: 1.25rem; }
.input.is-large,
.textarea.is-large {
font-size: 1.5rem; }
.input.is-fullwidth,
.textarea.is-fullwidth {
display: block;
width: 100%; }
.input.is-inline,
.textarea.is-inline {
display: inline;
width: auto; }
.input.is-rounded {
border-radius: 290486px;
padding-left: 1em;
padding-right: 1em; }
.input.is-static {
background-color: transparent;
border-color: transparent;
box-shadow: none;
padding-left: 0;
padding-right: 0; }
.textarea {
display: block;
max-width: 100%;
min-width: 100%;
padding: 0.625em;
resize: vertical; }
.textarea:not([rows]) {
max-height: 600px;
min-height: 120px; }
.textarea[rows] {
height: initial; }
.textarea.has-fixed-size {
resize: none; }
.checkbox,
.radio {
cursor: pointer;
display: inline-block;
line-height: 1.25;
position: relative; }
.checkbox input,
.radio input {
cursor: pointer; }
.checkbox:hover,
.radio:hover {
color: #363636; }
.checkbox[disabled],
.radio[disabled] {
color: #7a7a7a;
cursor: not-allowed; }
.radio + .radio {
margin-left: 0.5em; }
.select {
display: inline-block;
max-width: 100%;
position: relative;
vertical-align: top; }
.select:not(.is-multiple) {
height: 2.25em; }
.select:not(.is-multiple):not(.is-loading)::after {
border-color: #3273dc;
right: 1.125em;
z-index: 4; }
.select.is-rounded select {
border-radius: 290486px;
padding-left: 1em; }
.select select {
background-color: white;
border-color: #dbdbdb;
color: #363636;
cursor: pointer;
display: block;
font-size: 1em;
max-width: 100%;
outline: none; }
.select select::-moz-placeholder {
color: rgba(54, 54, 54, 0.3); }
.select select::-webkit-input-placeholder {
color: rgba(54, 54, 54, 0.3); }
.select select:-moz-placeholder {
color: rgba(54, 54, 54, 0.3); }
.select select:-ms-input-placeholder {
color: rgba(54, 54, 54, 0.3); }
.select select:hover, .select select.is-hovered {
border-color: #b5b5b5; }
.select select:focus, .select select.is-focused, .select select:active, .select select.is-active {
border-color: #3273dc;
box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); }
.select select[disabled] {
background-color: whitesmoke;
border-color: whitesmoke;
box-shadow: none;
color: #7a7a7a; }
.select select[disabled]::-moz-placeholder {
color: rgba(122, 122, 122, 0.3); }
.select select[disabled]::-webkit-input-placeholder {
color: rgba(122, 122, 122, 0.3); }
.select select[disabled]:-moz-placeholder {
color: rgba(122, 122, 122, 0.3); }
.select select[disabled]:-ms-input-placeholder {
color: rgba(122, 122, 122, 0.3); }
.select select::-ms-expand {
display: none; }
.select select[disabled]:hover {
border-color: whitesmoke; }
.select select:not([multiple]) {
padding-right: 2.5em; }
.select select[multiple] {
height: auto;
padding: 0; }
.select select[multiple] option {
padding: 0.5em 1em; }
.select:not(.is-multiple):not(.is-loading):hover::after {
border-color: #363636; }
.select.is-white:not(:hover)::after {
border-color: white; }
.select.is-white select {
border-color: white; }
.select.is-white select:hover, .select.is-white select.is-hovered {
border-color: #f2f2f2; }
.select.is-white select:focus, .select.is-white select.is-focused, .select.is-white select:active, .select.is-white select.is-active {
box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); }
.select.is-black:not(:hover)::after {
border-color: #0a0a0a; }
.select.is-black select {
border-color: #0a0a0a; }
.select.is-black select:hover, .select.is-black select.is-hovered {
border-color: black; }
.select.is-black select:focus, .select.is-black select.is-focused, .select.is-black select:active, .select.is-black select.is-active {
box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); }
.select.is-light:not(:hover)::after {
border-color: whitesmoke; }
.select.is-light select {
border-color: whitesmoke; }
.select.is-light select:hover, .select.is-light select.is-hovered {
border-color: #e8e8e8; }
.select.is-light select:focus, .select.is-light select.is-focused, .select.is-light select:active, .select.is-light select.is-active {
box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); }
.select.is-dark:not(:hover)::after {
border-color: #363636; }
.select.is-dark select {
border-color: #363636; }
.select.is-dark select:hover, .select.is-dark select.is-hovered {
border-color: #292929; }
.select.is-dark select:focus, .select.is-dark select.is-focused, .select.is-dark select:active, .select.is-dark select.is-active {
box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); }
.select.is-primary:not(:hover)::after {
border-color: #00d1b2; }
.select.is-primary select {
border-color: #00d1b2; }
.select.is-primary select:hover, .select.is-primary select.is-hovered {
border-color: #00b89c; }
.select.is-primary select:focus, .select.is-primary select.is-focused, .select.is-primary select:active, .select.is-primary select.is-active {
box-shadow: 0 0 0 0.125em rgba(0, 209, 178, 0.25); }
.select.is-link:not(:hover)::after {
border-color: #3273dc; }
.select.is-link select {
border-color: #3273dc; }
.select.is-link select:hover, .select.is-link select.is-hovered {
border-color: #2366d1; }
.select.is-link select:focus, .select.is-link select.is-focused, .select.is-link select:active, .select.is-link select.is-active {
box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); }
.select.is-info:not(:hover)::after {
border-color: #209cee; }
.select.is-info select {
border-color: #209cee; }
.select.is-info select:hover, .select.is-info select.is-hovered {
border-color: #118fe4; }
.select.is-info select:focus, .select.is-info select.is-focused, .select.is-info select:active, .select.is-info select.is-active {
box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); }
.select.is-success:not(:hover)::after {
border-color: #23d160; }
.select.is-success select {
border-color: #23d160; }
.select.is-success select:hover, .select.is-success select.is-hovered {
border-color: #20bc56; }
.select.is-success select:focus, .select.is-success select.is-focused, .select.is-success select:active, .select.is-success select.is-active {
box-shadow: 0 0 0 0.125em rgba(35, 209, 96, 0.25); }
.select.is-warning:not(:hover)::after {
border-color: #ffdd57; }
.select.is-warning select {
border-color: #ffdd57; }
.select.is-warning select:hover, .select.is-warning select.is-hovered {
border-color: #ffd83d; }
.select.is-warning select:focus, .select.is-warning select.is-focused, .select.is-warning select:active, .select.is-warning select.is-active {
box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); }
.select.is-danger:not(:hover)::after {
border-color: #ff3860; }
.select.is-danger select {
border-color: #ff3860; }
.select.is-danger select:hover, .select.is-danger select.is-hovered {
border-color: #ff1f4b; }
.select.is-danger select:focus, .select.is-danger select.is-focused, .select.is-danger select:active, .select.is-danger select.is-active {
box-shadow: 0 0 0 0.125em rgba(255, 56, 96, 0.25); }
.select.is-small {
border-radius: 2px;
font-size: 0.75rem; }
.select.is-medium {
font-size: 1.25rem; }
.select.is-large {
font-size: 1.5rem; }
.select.is-disabled::after {
border-color: #7a7a7a; }
.select.is-fullwidth {
width: 100%; }
.select.is-fullwidth select {
width: 100%; }
.select.is-loading::after {
margin-top: 0;
position: absolute;
right: 0.625em;
top: 0.625em;
transform: none; }
.select.is-loading.is-small:after {
font-size: 0.75rem; }
.select.is-loading.is-medium:after {
font-size: 1.25rem; }
.select.is-loading.is-large:after {
font-size: 1.5rem; }
.file {
align-items: stretch;
display: flex;
justify-content: flex-start;
position: relative; }
.file.is-white .file-cta {
background-color: white;
border-color: transparent;
color: #0a0a0a; }
.file.is-white:hover .file-cta, .file.is-white.is-hovered .file-cta {
background-color: #f9f9f9;
border-color: transparent;
color: #0a0a0a; }
.file.is-white:focus .file-cta, .file.is-white.is-focused .file-cta {
border-color: transparent;
box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.25);
color: #0a0a0a; }
.file.is-white:active .file-cta, .file.is-white.is-active .file-cta {
background-color: #f2f2f2;
border-color: transparent;
color: #0a0a0a; }
.file.is-black .file-cta {
background-color: #0a0a0a;
border-color: transparent;
color: white; }
.file.is-black:hover .file-cta, .file.is-black.is-hovered .file-cta {
background-color: #040404;
border-color: transparent;
color: white; }
.file.is-black:focus .file-cta, .file.is-black.is-focused .file-cta {
border-color: transparent;
box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.25);
color: white; }
.file.is-black:active .file-cta, .file.is-black.is-active .file-cta {
background-color: black;
border-color: transparent;
color: white; }
.file.is-light .file-cta {
background-color: whitesmoke;
border-color: transparent;
color: #363636; }
.file.is-light:hover .file-cta, .file.is-light.is-hovered .file-cta {
background-color: #eeeeee;
border-color: transparent;
color: #363636; }
.file.is-light:focus .file-cta, .file.is-light.is-focused .file-cta {
border-color: transparent;
box-shadow: 0 0 0.5em rgba(245, 245, 245, 0.25);
color: #363636; }
.file.is-light:active .file-cta, .file.is-light.is-active .file-cta {
background-color: #e8e8e8;
border-color: transparent;
color: #363636; }
.file.is-dark .file-cta {
background-color: #363636;
border-color: transparent;
color: whitesmoke; }
.file.is-dark:hover .file-cta, .file.is-dark.is-hovered .file-cta {
background-color: #2f2f2f;
border-color: transparent;
color: whitesmoke; }
.file.is-dark:focus .file-cta, .file.is-dark.is-focused .file-cta {
border-color: transparent;
box-shadow: 0 0 0.5em rgba(54, 54, 54, 0.25);
color: whitesmoke; }
.file.is-dark:active .file-cta, .file.is-dark.is-active .file-cta {
background-color: #292929;
border-color: transparent;
color: whitesmoke; }
.file.is-primary .file-cta {
background-color: #00d1b2;
border-color: transparent;
color: #fff; }
.file.is-primary:hover .file-cta, .file.is-primary.is-hovered .file-cta {
background-color: #00c4a7;
border-color: transparent;
color: #fff; }
.file.is-primary:focus .file-cta, .file.is-primary.is-focused .file-cta {
border-color: transparent;
box-shadow: 0 0 0.5em rgba(0, 209, 178, 0.25);
color: #fff; }
.file.is-primary:active .file-cta, .file.is-primary.is-active .file-cta {
background-color: #00b89c;
border-color: transparent;
color: #fff; }
.file.is-link .file-cta {
background-color: #3273dc;
border-color: transparent;
color: #fff; }
.file.is-link:hover .file-cta, .file.is-link.is-hovered .file-cta {
background-color: #276cda;
border-color: transparent;
color: #fff; }
.file.is-link:focus .file-cta, .file.is-link.is-focused .file-cta {
border-color: transparent;
box-shadow: 0 0 0.5em rgba(50, 115, 220, 0.25);
color: #fff; }
.file.is-link:active .file-cta, .file.is-link.is-active .file-cta {
background-color: #2366d1;
border-color: transparent;
color: #fff; }
.file.is-info .file-cta {
background-color: #209cee;
border-color: transparent;
color: #fff; }
.file.is-info:hover .file-cta, .file.is-info.is-hovered .file-cta {
background-color: #1496ed;
border-color: transparent;
color: #fff; }
.file.is-info:focus .file-cta, .file.is-info.is-focused .file-cta {
border-color: transparent;
box-shadow: 0 0 0.5em rgba(32, 156, 238, 0.25);
color: #fff; }
.file.is-info:active .file-cta, .file.is-info.is-active .file-cta {
background-color: #118fe4;
border-color: transparent;
color: #fff; }
.file.is-success .file-cta {
background-color: #23d160;
border-color: transparent;
color: #fff; }
.file.is-success:hover .file-cta, .file.is-success.is-hovered .file-cta {
background-color: #22c65b;
border-color: transparent;
color: #fff; }
.file.is-success:focus .file-cta, .file.is-success.is-focused .file-cta {
border-color: transparent;
box-shadow: 0 0 0.5em rgba(35, 209, 96, 0.25);
color: #fff; }
.file.is-success:active .file-cta, .file.is-success.is-active .file-cta {
background-color: #20bc56;
border-color: transparent;
color: #fff; }
.file.is-warning .file-cta {
background-color: #ffdd57;
border-color: transparent;
color: rgba(0, 0, 0, 0.7); }
.file.is-warning:hover .file-cta, .file.is-warning.is-hovered .file-cta {
background-color: #ffdb4a;
border-color: transparent;
color: rgba(0, 0, 0, 0.7); }
.file.is-warning:focus .file-cta, .file.is-warning.is-focused .file-cta {
border-color: transparent;
box-shadow: 0 0 0.5em rgba(255, 221, 87, 0.25);
color: rgba(0, 0, 0, 0.7); }
.file.is-warning:active .file-cta, .file.is-warning.is-active .file-cta {
background-color: #ffd83d;
border-color: transparent;
color: rgba(0, 0, 0, 0.7); }
.file.is-danger .file-cta {
background-color: #ff3860;
border-color: transparent;
color: #fff; }
.file.is-danger:hover .file-cta, .file.is-danger.is-hovered .file-cta {
background-color: #ff2b56;
border-color: transparent;
color: #fff; }
.file.is-danger:focus .file-cta, .file.is-danger.is-focused .file-cta {
border-color: transparent;
box-shadow: 0 0 0.5em rgba(255, 56, 96, 0.25);
color: #fff; }
.file.is-danger:active .file-cta, .file.is-danger.is-active .file-cta {
background-color: #ff1f4b;
border-color: transparent;
color: #fff; }
.file.is-small {
font-size: 0.75rem; }
.file.is-medium {
font-size: 1.25rem; }
.file.is-medium .file-icon .fa {
font-size: 21px; }
.file.is-large {
font-size: 1.5rem; }
.file.is-large .file-icon .fa {
font-size: 28px; }
.file.has-name .file-cta {
border-bottom-right-radius: 0;
border-top-right-radius: 0; }
.file.has-name .file-name {
border-bottom-left-radius: 0;
border-top-left-radius: 0; }
.file.has-name.is-empty .file-cta {
border-radius: 4px; }
.file.has-name.is-empty .file-name {
display: none; }
.file.is-boxed .file-label {
flex-direction: column; }
.file.is-boxed .file-cta {
flex-direction: column;
height: auto;
padding: 1em 3em; }
.file.is-boxed .file-name {
border-width: 0 1px 1px; }
.file.is-boxed .file-icon {
height: 1.5em;
width: 1.5em; }
.file.is-boxed .file-icon .fa {
font-size: 21px; }
.file.is-boxed.is-small .file-icon .fa {
font-size: 14px; }
.file.is-boxed.is-medium .file-icon .fa {
font-size: 28px; }
.file.is-boxed.is-large .file-icon .fa {
font-size: 35px; }
.file.is-boxed.has-name .file-cta {
border-radius: 4px 4px 0 0; }
.file.is-boxed.has-name .file-name {
border-radius: 0 0 4px 4px;
border-width: 0 1px 1px; }
.file.is-centered {
justify-content: center; }
.file.is-fullwidth .file-label {
width: 100%; }
.file.is-fullwidth .file-name {
flex-grow: 1;
max-width: none; }
.file.is-right {
justify-content: flex-end; }
.file.is-right .file-cta {
border-radius: 0 4px 4px 0; }
.file.is-right .file-name {
border-radius: 4px 0 0 4px;
border-width: 1px 0 1px 1px;
order: -1; }
.file-label {
align-items: stretch;
display: flex;
cursor: pointer;
justify-content: flex-start;
overflow: hidden;
position: relative; }
.file-label:hover .file-cta {
background-color: #eeeeee;
color: #363636; }
.file-label:hover .file-name {
border-color: #d5d5d5; }
.file-label:active .file-cta {
background-color: #e8e8e8;
color: #363636; }
.file-label:active .file-name {
border-color: #cfcfcf; }
.file-input {
height: 100%;
left: 0;
opacity: 0;
outline: none;
position: absolute;
top: 0;
width: 100%; }
.file-cta,
.file-name {
border-color: #dbdbdb;
border-radius: 4px;
font-size: 1em;
padding-left: 1em;
padding-right: 1em;
white-space: nowrap; }
.file-cta {
background-color: whitesmoke;
color: #4a4a4a; }
.file-name {
border-color: #dbdbdb;
border-style: solid;
border-width: 1px 1px 1px 0;
display: block;
max-width: 16em;
overflow: hidden;
text-align: left;
text-overflow: ellipsis; }
.file-icon {
align-items: center;
display: flex;
height: 1em;
justify-content: center;
margin-right: 0.5em;
width: 1em; }
.file-icon .fa {
font-size: 14px; }
.label {
color: #363636;
display: block;
font-size: 1rem;
font-weight: 700; }
.label:not(:last-child) {
margin-bottom: 0.5em; }
.label.is-small {
font-size: 0.75rem; }
.label.is-medium {
font-size: 1.25rem; }
.label.is-large {
font-size: 1.5rem; }
.help {
display: block;
font-size: 0.75rem;
margin-top: 0.25rem; }
.help.is-white {
color: white; }
.help.is-black {
color: #0a0a0a; }
.help.is-light {
color: whitesmoke; }
.help.is-dark {
color: #363636; }
.help.is-primary {
color: #00d1b2; }
.help.is-link {
color: #3273dc; }
.help.is-info {
color: #209cee; }
.help.is-success {
color: #23d160; }
.help.is-warning {
color: #ffdd57; }
.help.is-danger {
color: #ff3860; }
.field:not(:last-child) {
margin-bottom: 0.75rem; }
.field.has-addons {
display: flex;
justify-content: flex-start; }
.field.has-addons .control:not(:last-child) {
margin-right: -1px; }
.field.has-addons .control:not(:first-child):not(:last-child) .button,
.field.has-addons .control:not(:first-child):not(:last-child) .input,
.field.has-addons .control:not(:first-child):not(:last-child) .select select {
border-radius: 0; }
.field.has-addons .control:first-child .button,
.field.has-addons .control:first-child .input,
.field.has-addons .control:first-child .select select {
border-bottom-right-radius: 0;
border-top-right-radius: 0; }
.field.has-addons .control:last-child .button,
.field.has-addons .control:last-child .input,
.field.has-addons .control:last-child .select select {
border-bottom-left-radius: 0;
border-top-left-radius: 0; }
.field.has-addons .control .button:not([disabled]):hover, .field.has-addons .control .button:not([disabled]).is-hovered,
.field.has-addons .control .input:not([disabled]):hover,
.field.has-addons .control .input:not([disabled]).is-hovered,
.field.has-addons .control .select select:not([disabled]):hover,
.field.has-addons .control .select select:not([disabled]).is-hovered {
z-index: 2; }
.field.has-addons .control .button:not([disabled]):focus, .field.has-addons .control .button:not([disabled]).is-focused, .field.has-addons .control .button:not([disabled]):active, .field.has-addons .control .button:not([disabled]).is-active,
.field.has-addons .control .input:not([disabled]):focus,
.field.has-addons .control .input:not([disabled]).is-focused,
.field.has-addons .control .input:not([disabled]):active,
.field.has-addons .control .input:not([disabled]).is-active,
.field.has-addons .control .select select:not([disabled]):focus,
.field.has-addons .control .select select:not([disabled]).is-focused,
.field.has-addons .control .select select:not([disabled]):active,
.field.has-addons .control .select select:not([disabled]).is-active {
z-index: 3; }
.field.has-addons .control .button:not([disabled]):focus:hover, .field.has-addons .control .button:not([disabled]).is-focused:hover, .field.has-addons .control .button:not([disabled]):active:hover, .field.has-addons .control .button:not([disabled]).is-active:hover,
.field.has-addons .control .input:not([disabled]):focus:hover,
.field.has-addons .control .input:not([disabled]).is-focused:hover,
.field.has-addons .control .input:not([disabled]):active:hover,
.field.has-addons .control .input:not([disabled]).is-active:hover,
.field.has-addons .control .select select:not([disabled]):focus:hover,
.field.has-addons .control .select select:not([disabled]).is-focused:hover,
.field.has-addons .control .select select:not([disabled]):active:hover,
.field.has-addons .control .select select:not([disabled]).is-active:hover {
z-index: 4; }
.field.has-addons .control.is-expanded {
flex-grow: 1; }
.field.has-addons.has-addons-centered {
justify-content: center; }
.field.has-addons.has-addons-right {
justify-content: flex-end; }
.field.has-addons.has-addons-fullwidth .control {
flex-grow: 1;
flex-shrink: 0; }
.field.is-grouped {
display: flex;
justify-content: flex-start; }
.field.is-grouped > .control {
flex-shrink: 0; }
.field.is-grouped > .control:not(:last-child) {
margin-bottom: 0;
margin-right: 0.75rem; }
.field.is-grouped > .control.is-expanded {
flex-grow: 1;
flex-shrink: 1; }
.field.is-grouped.is-grouped-centered {
justify-content: center; }
.field.is-grouped.is-grouped-right {
justify-content: flex-end; }
.field.is-grouped.is-grouped-multiline {
flex-wrap: wrap; }
.field.is-grouped.is-grouped-multiline > .control:last-child, .field.is-grouped.is-grouped-multiline > .control:not(:last-child) {
margin-bottom: 0.75rem; }
.field.is-grouped.is-grouped-multiline:last-child {
margin-bottom: -0.75rem; }
.field.is-grouped.is-grouped-multiline:not(:last-child) {
margin-bottom: 0; }
@media screen and (min-width: 769px), print {
.field.is-horizontal {
display: flex; } }
.field-label .label {
font-size: inherit; }
@media screen and (max-width: 768px) {
.field-label {
margin-bottom: 0.5rem; } }
@media screen and (min-width: 769px), print {
.field-label {
flex-basis: 0;
flex-grow: 1;
flex-shrink: 0;
margin-right: 1.5rem;
text-align: right; }
.field-label.is-small {
font-size: 0.75rem;
padding-top: 0.375em; }
.field-label.is-normal {
padding-top: 0.375em; }
.field-label.is-medium {
font-size: 1.25rem;
padding-top: 0.375em; }
.field-label.is-large {
font-size: 1.5rem;
padding-top: 0.375em; } }
.field-body .field .field {
margin-bottom: 0; }
@media screen and (min-width: 769px), print {
.field-body {
display: flex;
flex-basis: 0;
flex-grow: 5;
flex-shrink: 1; }
.field-body .field {
margin-bottom: 0; }
.field-body > .field {
flex-shrink: 1; }
.field-body > .field:not(.is-narrow) {
flex-grow: 1; }
.field-body > .field:not(:last-child) {
margin-right: 0.75rem; } }
.control {
clear: both;
font-size: 1rem;
position: relative;
text-align: left; }
.control.has-icon .icon {
color: #dbdbdb;
height: 2.25em;
pointer-events: none;
position: absolute;
top: 0;
width: 2.25em;
z-index: 4; }
.control.has-icon .input:focus + .icon {
color: #7a7a7a; }
.control.has-icon .input.is-small + .icon {
font-size: 0.75rem; }
.control.has-icon .input.is-medium + .icon {
font-size: 1.25rem; }
.control.has-icon .input.is-large + .icon {
font-size: 1.5rem; }
.control.has-icon:not(.has-icon-right) .icon {
left: 0; }
.control.has-icon:not(.has-icon-right) .input {
padding-left: 2.25em; }
.control.has-icon.has-icon-right .icon {
right: 0; }
.control.has-icon.has-icon-right .input {
padding-right: 2.25em; }
.control.has-icons-left .input:focus ~ .icon,
.control.has-icons-left .select:focus ~ .icon, .control.has-icons-right .input:focus ~ .icon,
.control.has-icons-right .select:focus ~ .icon {
color: #7a7a7a; }
.control.has-icons-left .input.is-small ~ .icon,
.control.has-icons-left .select.is-small ~ .icon, .control.has-icons-right .input.is-small ~ .icon,
.control.has-icons-right .select.is-small ~ .icon {
font-size: 0.75rem; }
.control.has-icons-left .input.is-medium ~ .icon,
.control.has-icons-left .select.is-medium ~ .icon, .control.has-icons-right .input.is-medium ~ .icon,
.control.has-icons-right .select.is-medium ~ .icon {
font-size: 1.25rem; }
.control.has-icons-left .input.is-large ~ .icon,
.control.has-icons-left .select.is-large ~ .icon, .control.has-icons-right .input.is-large ~ .icon,
.control.has-icons-right .select.is-large ~ .icon {
font-size: 1.5rem; }
.control.has-icons-left .icon, .control.has-icons-right .icon {
color: #dbdbdb;
height: 2.25em;
pointer-events: none;
position: absolute;
top: 0;
width: 2.25em;
z-index: 4; }
.control.has-icons-left .input,
.control.has-icons-left .select select {
padding-left: 2.25em; }
.control.has-icons-left .icon.is-left {
left: 0; }
.control.has-icons-right .input,
.control.has-icons-right .select select {
padding-right: 2.25em; }
.control.has-icons-right .icon.is-right {
right: 0; }
.control.is-loading::after {
position: absolute !important;
right: 0.625em;
top: 0.625em;
z-index: 4; }
.control.is-loading.is-small:after {
font-size: 0.75rem; }
.control.is-loading.is-medium:after {
font-size: 1.25rem; }
.control.is-loading.is-large:after {
font-size: 1.5rem; }
.icon {
align-items: center;
display: inline-flex;
justify-content: center;
height: 1.5rem;
width: 1.5rem; }
.icon.is-small {
height: 1rem;
width: 1rem; }
.icon.is-medium {
height: 2rem;
width: 2rem; }
.icon.is-large {
height: 3rem;
width: 3rem; }
.image {
display: block;
position: relative; }
.image img {
display: block;
height: auto;
width: 100%; }
.image img.is-rounded {
border-radius: 290486px; }
.image.is-square img, .image.is-1by1 img, .image.is-5by4 img, .image.is-4by3 img, .image.is-3by2 img, .image.is-5by3 img, .image.is-16by9 img, .image.is-2by1 img, .image.is-3by1 img, .image.is-4by5 img, .image.is-3by4 img, .image.is-2by3 img, .image.is-3by5 img, .image.is-9by16 img, .image.is-1by2 img, .image.is-1by3 img {
height: 100%;
width: 100%; }
.image.is-square, .image.is-1by1 {
padding-top: 100%; }
.image.is-5by4 {
padding-top: 80%; }
.image.is-4by3 {
padding-top: 75%; }
.image.is-3by2 {
padding-top: 66.6666%; }
.image.is-5by3 {
padding-top: 60%; }
.image.is-16by9 {
padding-top: 56.25%; }
.image.is-2by1 {
padding-top: 50%; }
.image.is-3by1 {
padding-top: 33.3333%; }
.image.is-4by5 {
padding-top: 125%; }
.image.is-3by4 {
padding-top: 133.3333%; }
.image.is-2by3 {
padding-top: 150%; }
.image.is-3by5 {
padding-top: 166.6666%; }
.image.is-9by16 {
padding-top: 177.7777%; }
.image.is-1by2 {
padding-top: 200%; }
.image.is-1by3 {
padding-top: 300%; }
.image.is-16x16 {
height: 16px;
width: 16px; }
.image.is-24x24 {
height: 24px;
width: 24px; }
.image.is-32x32 {
height: 32px;
width: 32px; }
.image.is-48x48 {
height: 48px;
width: 48px; }
.image.is-64x64 {
height: 64px;
width: 64px; }
.image.is-96x96 {
height: 96px;
width: 96px; }
.image.is-128x128 {
height: 128px;
width: 128px; }
.notification {
background-color: whitesmoke;
border-radius: 4px;
padding: 1.25rem 2.5rem 1.25rem 1.5rem;
position: relative; }
.notification a:not(.button):not(.dropdown-item) {
color: currentColor;
text-decoration: underline; }
.notification strong {
color: currentColor; }
.notification code,
.notification pre {
background: white; }
.notification pre code {
background: transparent; }
.notification > .delete {
position: absolute;
right: 0.5rem;
top: 0.5rem; }
.notification .title,
.notification .subtitle,
.notification .content {
color: currentColor; }
.notification.is-white {
background-color: white;
color: #0a0a0a; }
.notification.is-black {
background-color: #0a0a0a;
color: white; }
.notification.is-light {
background-color: whitesmoke;
color: #363636; }
.notification.is-dark {
background-color: #363636;
color: whitesmoke; }
.notification.is-primary {
background-color: #00d1b2;
color: #fff; }
.notification.is-link {
background-color: #3273dc;
color: #fff; }
.notification.is-info {
background-color: #209cee;
color: #fff; }
.notification.is-success {
background-color: #23d160;
color: #fff; }
.notification.is-warning {
background-color: #ffdd57;
color: rgba(0, 0, 0, 0.7); }
.notification.is-danger {
background-color: #ff3860;
color: #fff; }
.progress {
-moz-appearance: none;
-webkit-appearance: none;
border: none;
border-radius: 290486px;
display: block;
height: 1rem;
overflow: hidden;
padding: 0;
width: 100%; }
.progress::-webkit-progress-bar {
background-color: #dbdbdb; }
.progress::-webkit-progress-value {
background-color: #4a4a4a; }
.progress::-moz-progress-bar {
background-color: #4a4a4a; }
.progress::-ms-fill {
background-color: #4a4a4a;
border: none; }
.progress.is-white::-webkit-progress-value {
background-color: white; }
.progress.is-white::-moz-progress-bar {
background-color: white; }
.progress.is-white::-ms-fill {
background-color: white; }
.progress.is-black::-webkit-progress-value {
background-color: #0a0a0a; }
.progress.is-black::-moz-progress-bar {
background-color: #0a0a0a; }
.progress.is-black::-ms-fill {
background-color: #0a0a0a; }
.progress.is-light::-webkit-progress-value {
background-color: whitesmoke; }
.progress.is-light::-moz-progress-bar {
background-color: whitesmoke; }
.progress.is-light::-ms-fill {
background-color: whitesmoke; }
.progress.is-dark::-webkit-progress-value {
background-color: #363636; }
.progress.is-dark::-moz-progress-bar {
background-color: #363636; }
.progress.is-dark::-ms-fill {
background-color: #363636; }
.progress.is-primary::-webkit-progress-value {
background-color: #00d1b2; }
.progress.is-primary::-moz-progress-bar {
background-color: #00d1b2; }
.progress.is-primary::-ms-fill {
background-color: #00d1b2; }
.progress.is-link::-webkit-progress-value {
background-color: #3273dc; }
.progress.is-link::-moz-progress-bar {
background-color: #3273dc; }
.progress.is-link::-ms-fill {
background-color: #3273dc; }
.progress.is-info::-webkit-progress-value {
background-color: #209cee; }
.progress.is-info::-moz-progress-bar {
background-color: #209cee; }
.progress.is-info::-ms-fill {
background-color: #209cee; }
.progress.is-success::-webkit-progress-value {
background-color: #23d160; }
.progress.is-success::-moz-progress-bar {
background-color: #23d160; }
.progress.is-success::-ms-fill {
background-color: #23d160; }
.progress.is-warning::-webkit-progress-value {
background-color: #ffdd57; }
.progress.is-warning::-moz-progress-bar {
background-color: #ffdd57; }
.progress.is-warning::-ms-fill {
background-color: #ffdd57; }
.progress.is-danger::-webkit-progress-value {
background-color: #ff3860; }
.progress.is-danger::-moz-progress-bar {
background-color: #ff3860; }
.progress.is-danger::-ms-fill {
background-color: #ff3860; }
.progress.is-small {
height: 0.75rem; }
.progress.is-medium {
height: 1.25rem; }
.progress.is-large {
height: 1.5rem; }
.table {
background-color: white;
color: #363636; }
.table td,
.table th {
border: 1px solid #dbdbdb;
border-width: 0 0 1px;
padding: 0.5em 0.75em;
vertical-align: top; }
.table td.is-white,
.table th.is-white {
background-color: white;
border-color: white;
color: #0a0a0a; }
.table td.is-black,
.table th.is-black {
background-color: #0a0a0a;
border-color: #0a0a0a;
color: white; }
.table td.is-light,
.table th.is-light {
background-color: whitesmoke;
border-color: whitesmoke;
color: #363636; }
.table td.is-dark,
.table th.is-dark {
background-color: #363636;
border-color: #363636;
color: whitesmoke; }
.table td.is-primary,
.table th.is-primary {
background-color: #00d1b2;
border-color: #00d1b2;
color: #fff; }
.table td.is-link,
.table th.is-link {
background-color: #3273dc;
border-color: #3273dc;
color: #fff; }
.table td.is-info,
.table th.is-info {
background-color: #209cee;
border-color: #209cee;
color: #fff; }
.table td.is-success,
.table th.is-success {
background-color: #23d160;
border-color: #23d160;
color: #fff; }
.table td.is-warning,
.table th.is-warning {
background-color: #ffdd57;
border-color: #ffdd57;
color: rgba(0, 0, 0, 0.7); }
.table td.is-danger,
.table th.is-danger {
background-color: #ff3860;
border-color: #ff3860;
color: #fff; }
.table td.is-narrow,
.table th.is-narrow {
white-space: nowrap;
width: 1%; }
.table td.is-selected,
.table th.is-selected {
background-color: #00d1b2;
color: #fff; }
.table td.is-selected a,
.table td.is-selected strong,
.table th.is-selected a,
.table th.is-selected strong {
color: currentColor; }
.table th {
color: #363636;
text-align: left; }
.table tr.is-selected {
background-color: #00d1b2;
color: #fff; }
.table tr.is-selected a,
.table tr.is-selected strong {
color: currentColor; }
.table tr.is-selected td,
.table tr.is-selected th {
border-color: #fff;
color: currentColor; }
.table thead td,
.table thead th {
border-width: 0 0 2px;
color: #363636; }
.table tfoot td,
.table tfoot th {
border-width: 2px 0 0;
color: #363636; }
.table tbody tr:last-child td,
.table tbody tr:last-child th {
border-bottom-width: 0; }
.table.is-bordered td,
.table.is-bordered th {
border-width: 1px; }
.table.is-bordered tr:last-child td,
.table.is-bordered tr:last-child th {
border-bottom-width: 1px; }
.table.is-fullwidth {
width: 100%; }
.table.is-hoverable tbody tr:not(.is-selected):hover {
background-color: #fafafa; }
.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover {
background-color: #fafafa; }
.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even) {
background-color: whitesmoke; }
.table.is-narrow td,
.table.is-narrow th {
padding: 0.25em 0.5em; }
.table.is-striped tbody tr:not(.is-selected):nth-child(even) {
background-color: #fafafa; }
.table-container {
-webkit-overflow-scrolling: touch;
overflow: auto;
overflow-y: hidden;
max-width: 100%; }
.tags {
align-items: center;
display: flex;
flex-wrap: wrap;
justify-content: flex-start; }
.tags .tag {
margin-bottom: 0.5rem; }
.tags .tag:not(:last-child) {
margin-right: 0.5rem; }
.tags:last-child {
margin-bottom: -0.5rem; }
.tags:not(:last-child) {
margin-bottom: 1rem; }
.tags.has-addons .tag {
margin-right: 0; }
.tags.has-addons .tag:not(:first-child) {
border-bottom-left-radius: 0;
border-top-left-radius: 0; }
.tags.has-addons .tag:not(:last-child) {
border-bottom-right-radius: 0;
border-top-right-radius: 0; }
.tags.is-centered {
justify-content: center; }
.tags.is-centered .tag {
margin-right: 0.25rem;
margin-left: 0.25rem; }
.tags.is-right {
justify-content: flex-end; }
.tags.is-right .tag:not(:first-child) {
margin-left: 0.5rem; }
.tags.is-right .tag:not(:last-child) {
margin-right: 0; }
.tag:not(body) {
align-items: center;
background-color: whitesmoke;
border-radius: 4px;
color: #4a4a4a;
display: inline-flex;
font-size: 0.75rem;
height: 2em;
justify-content: center;
line-height: 1.5;
padding-left: 0.75em;
padding-right: 0.75em;
white-space: nowrap; }
.tag:not(body) .delete {
margin-left: 0.25rem;
margin-right: -0.375rem; }
.tag:not(body).is-white {
background-color: white;
color: #0a0a0a; }
.tag:not(body).is-black {
background-color: #0a0a0a;
color: white; }
.tag:not(body).is-light {
background-color: whitesmoke;
color: #363636; }
.tag:not(body).is-dark {
background-color: #363636;
color: whitesmoke; }
.tag:not(body).is-primary {
background-color: #00d1b2;
color: #fff; }
.tag:not(body).is-link {
background-color: #3273dc;
color: #fff; }
.tag:not(body).is-info {
background-color: #209cee;
color: #fff; }
.tag:not(body).is-success {
background-color: #23d160;
color: #fff; }
.tag:not(body).is-warning {
background-color: #ffdd57;
color: rgba(0, 0, 0, 0.7); }
.tag:not(body).is-danger {
background-color: #ff3860;
color: #fff; }
.tag:not(body).is-medium {
font-size: 1rem; }
.tag:not(body).is-large {
font-size: 1.25rem; }
.tag:not(body) .icon:first-child:not(:last-child) {
margin-left: -0.375em;
margin-right: 0.1875em; }
.tag:not(body) .icon:last-child:not(:first-child) {
margin-left: 0.1875em;
margin-right: -0.375em; }
.tag:not(body) .icon:first-child:last-child {
margin-left: -0.375em;
margin-right: -0.375em; }
.tag:not(body).is-delete {
margin-left: 1px;
padding: 0;
position: relative;
width: 2em; }
.tag:not(body).is-delete::before, .tag:not(body).is-delete::after {
background-color: currentColor;
content: "";
display: block;
left: 50%;
position: absolute;
top: 50%;
transform: translateX(-50%) translateY(-50%) rotate(45deg);
transform-origin: center center; }
.tag:not(body).is-delete::before {
height: 1px;
width: 50%; }
.tag:not(body).is-delete::after {
height: 50%;
width: 1px; }
.tag:not(body).is-delete:hover, .tag:not(body).is-delete:focus {
background-color: #e8e8e8; }
.tag:not(body).is-delete:active {
background-color: #dbdbdb; }
.tag:not(body).is-rounded {
border-radius: 290486px; }
a.tag:hover {
text-decoration: underline; }
.title,
.subtitle {
word-break: break-word; }
.title em,
.title span,
.subtitle em,
.subtitle span {
font-weight: inherit; }
.title sub,
.subtitle sub {
font-size: 0.75em; }
.title sup,
.subtitle sup {
font-size: 0.75em; }
.title .tag,
.subtitle .tag {
vertical-align: middle; }
.title {
color: #363636;
font-size: 2rem;
font-weight: 600;
line-height: 1.125; }
.title strong {
color: inherit;
font-weight: inherit; }
.title + .highlight {
margin-top: -0.75rem; }
.title:not(.is-spaced) + .subtitle {
margin-top: -1.25rem; }
.title.is-1 {
font-size: 3rem; }
.title.is-2 {
font-size: 2.5rem; }
.title.is-3 {
font-size: 2rem; }
.title.is-4 {
font-size: 1.5rem; }
.title.is-5 {
font-size: 1.25rem; }
.title.is-6 {
font-size: 1rem; }
.title.is-7 {
font-size: 0.75rem; }
.subtitle {
color: #4a4a4a;
font-size: 1.25rem;
font-weight: 400;
line-height: 1.25; }
.subtitle strong {
color: #363636;
font-weight: 600; }
.subtitle:not(.is-spaced) + .title {
margin-top: -1.25rem; }
.subtitle.is-1 {
font-size: 3rem; }
.subtitle.is-2 {
font-size: 2.5rem; }
.subtitle.is-3 {
font-size: 2rem; }
.subtitle.is-4 {
font-size: 1.5rem; }
.subtitle.is-5 {
font-size: 1.25rem; }
.subtitle.is-6 {
font-size: 1rem; }
.subtitle.is-7 {
font-size: 0.75rem; }
.heading {
display: block;
font-size: 11px;
letter-spacing: 1px;
margin-bottom: 5px;
text-transform: uppercase; }
.highlight {
font-weight: 400;
max-width: 100%;
overflow: hidden;
padding: 0; }
.highlight pre {
overflow: auto;
max-width: 100%; }
.number {
align-items: center;
background-color: whitesmoke;
border-radius: 290486px;
display: inline-flex;
font-size: 1.25rem;
height: 2em;
justify-content: center;
margin-right: 1.5rem;
min-width: 2.5em;
padding: 0.25rem 0.5rem;
text-align: center;
vertical-align: top; }
.breadcrumb {
font-size: 1rem;
white-space: nowrap; }
.breadcrumb a {
align-items: center;
color: #3273dc;
display: flex;
justify-content: center;
padding: 0 0.75em; }
.breadcrumb a:hover {
color: #363636; }
.breadcrumb li {
align-items: center;
display: flex; }
.breadcrumb li:first-child a {
padding-left: 0; }
.breadcrumb li.is-active a {
color: #363636;
cursor: default;
pointer-events: none; }
.breadcrumb li + li::before {
color: #b5b5b5;
content: "/"; }
.breadcrumb ul,
.breadcrumb ol {
align-items: flex-start;
display: flex;
flex-wrap: wrap;
justify-content: flex-start; }
.breadcrumb .icon:first-child {
margin-right: 0.5em; }
.breadcrumb .icon:last-child {
margin-left: 0.5em; }
.breadcrumb.is-centered ol,
.breadcrumb.is-centered ul {
justify-content: center; }
.breadcrumb.is-right ol,
.breadcrumb.is-right ul {
justify-content: flex-end; }
.breadcrumb.is-small {
font-size: 0.75rem; }
.breadcrumb.is-medium {
font-size: 1.25rem; }
.breadcrumb.is-large {
font-size: 1.5rem; }
.breadcrumb.has-arrow-separator li + li::before {
content: "\2192"; }
.breadcrumb.has-bullet-separator li + li::before {
content: "\2022"; }
.breadcrumb.has-dot-separator li + li::before {
content: "\B7"; }
.breadcrumb.has-succeeds-separator li + li::before {
content: "\227B"; }
.card {
background-color: white;
box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1);
color: #4a4a4a;
max-width: 100%;
position: relative; }
.card-header {
background-color: transparent;
align-items: stretch;
box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1);
display: flex; }
.card-header-title {
align-items: center;
color: #363636;
display: flex;
flex-grow: 1;
font-weight: 700;
padding: 0.75rem; }
.card-header-title.is-centered {
justify-content: center; }
.card-header-icon {
align-items: center;
cursor: pointer;
display: flex;
justify-content: center;
padding: 0.75rem; }
.card-image {
display: block;
position: relative; }
.card-content {
background-color: transparent;
padding: 1.5rem; }
.card-footer {
background-color: transparent;
border-top: 1px solid #dbdbdb;
align-items: stretch;
display: flex; }
.card-footer-item {
align-items: center;
display: flex;
flex-basis: 0;
flex-grow: 1;
flex-shrink: 0;
justify-content: center;
padding: 0.75rem; }
.card-footer-item:not(:last-child) {
border-right: 1px solid #dbdbdb; }
.card .media:not(:last-child) {
margin-bottom: 0.75rem; }
.dropdown {
display: inline-flex;
position: relative;
vertical-align: top; }
.dropdown.is-active .dropdown-menu, .dropdown.is-hoverable:hover .dropdown-menu {
display: block; }
.dropdown.is-right .dropdown-menu {
left: auto;
right: 0; }
.dropdown.is-up .dropdown-menu {
bottom: 100%;
padding-bottom: 4px;
padding-top: initial;
top: auto; }
.dropdown-menu {
display: none;
left: 0;
min-width: 12rem;
padding-top: 4px;
position: absolute;
top: 100%;
z-index: 20; }
.dropdown-content {
background-color: white;
border-radius: 4px;
box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1);
padding-bottom: 0.5rem;
padding-top: 0.5rem; }
.dropdown-item {
color: #4a4a4a;
display: block;
font-size: 0.875rem;
line-height: 1.5;
padding: 0.375rem 1rem;
position: relative; }
a.dropdown-item,
button.dropdown-item {
padding-right: 3rem;
text-align: left;
white-space: nowrap;
width: 100%; }
a.dropdown-item:hover,
button.dropdown-item:hover {
background-color: whitesmoke;
color: #0a0a0a; }
a.dropdown-item.is-active,
button.dropdown-item.is-active {
background-color: #3273dc;
color: #fff; }
.dropdown-divider {
background-color: #dbdbdb;
border: none;
display: block;
height: 1px;
margin: 0.5rem 0; }
.level {
align-items: center;
justify-content: space-between; }
.level code {
border-radius: 4px; }
.level img {
display: inline-block;
vertical-align: top; }
.level.is-mobile {
display: flex; }
.level.is-mobile .level-left,
.level.is-mobile .level-right {
display: flex; }
.level.is-mobile .level-left + .level-right {
margin-top: 0; }
.level.is-mobile .level-item:not(:last-child) {
margin-bottom: 0;
margin-right: 0.75rem; }
.level.is-mobile .level-item:not(.is-narrow) {
flex-grow: 1; }
@media screen and (min-width: 769px), print {
.level {
display: flex; }
.level > .level-item:not(.is-narrow) {
flex-grow: 1; } }
.level-item {
align-items: center;
display: flex;
flex-basis: auto;
flex-grow: 0;
flex-shrink: 0;
justify-content: center; }
.level-item .title,
.level-item .subtitle {
margin-bottom: 0; }
@media screen and (max-width: 768px) {
.level-item:not(:last-child) {
margin-bottom: 0.75rem; } }
.level-left,
.level-right {
flex-basis: auto;
flex-grow: 0;
flex-shrink: 0; }
.level-left .level-item.is-flexible,
.level-right .level-item.is-flexible {
flex-grow: 1; }
@media screen and (min-width: 769px), print {
.level-left .level-item:not(:last-child),
.level-right .level-item:not(:last-child) {
margin-right: 0.75rem; } }
.level-left {
align-items: center;
justify-content: flex-start; }
@media screen and (max-width: 768px) {
.level-left + .level-right {
margin-top: 1.5rem; } }
@media screen and (min-width: 769px), print {
.level-left {
display: flex; } }
.level-right {
align-items: center;
justify-content: flex-end; }
@media screen and (min-width: 769px), print {
.level-right {
display: flex; } }
.list {
background-color: white;
border-radius: 4px;
box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); }
.list-item {
display: block;
padding: 0.5em 1em; }
.list-item:not(a) {
color: #4a4a4a; }
.list-item:first-child {
border-top-left-radius: 4px;
border-top-right-radius: 4px; }
.list-item:last-child {
border-top-left-radius: 4px;
border-top-right-radius: 4px; }
.list-item:not(:last-child) {
border-bottom: 1px solid #dbdbdb; }
.list-item.is-active {
background-color: #3273dc;
color: #fff; }
a.list-item {
background-color: whitesmoke;
cursor: pointer; }
.media {
align-items: flex-start;
display: flex;
text-align: left; }
.media .content:not(:last-child) {
margin-bottom: 0.75rem; }
.media .media {
border-top: 1px solid rgba(219, 219, 219, 0.5);
display: flex;
padding-top: 0.75rem; }
.media .media .content:not(:last-child),
.media .media .control:not(:last-child) {
margin-bottom: 0.5rem; }
.media .media .media {
padding-top: 0.5rem; }
.media .media .media + .media {
margin-top: 0.5rem; }
.media + .media {
border-top: 1px solid rgba(219, 219, 219, 0.5);
margin-top: 1rem;
padding-top: 1rem; }
.media.is-large + .media {
margin-top: 1.5rem;
padding-top: 1.5rem; }
.media-left,
.media-right {
flex-basis: auto;
flex-grow: 0;
flex-shrink: 0; }
.media-left {
margin-right: 1rem; }
.media-right {
margin-left: 1rem; }
.media-content {
flex-basis: auto;
flex-grow: 1;
flex-shrink: 1;
text-align: left; }
@media screen and (max-width: 768px) {
.media-content {
overflow-x: auto; } }
.menu {
font-size: 1rem; }
.menu.is-small {
font-size: 0.75rem; }
.menu.is-medium {
font-size: 1.25rem; }
.menu.is-large {
font-size: 1.5rem; }
.menu-list {
line-height: 1.25; }
.menu-list a {
border-radius: 2px;
color: #4a4a4a;
display: block;
padding: 0.5em 0.75em; }
.menu-list a:hover {
background-color: whitesmoke;
color: #363636; }
.menu-list a.is-active {
background-color: #3273dc;
color: #fff; }
.menu-list li ul {
border-left: 1px solid #dbdbdb;
margin: 0.75em;
padding-left: 0.75em; }
.menu-label {
color: #7a7a7a;
font-size: 0.75em;
letter-spacing: 0.1em;
text-transform: uppercase; }
.menu-label:not(:first-child) {
margin-top: 1em; }
.menu-label:not(:last-child) {
margin-bottom: 1em; }
.message {
background-color: whitesmoke;
border-radius: 4px;
font-size: 1rem; }
.message strong {
color: currentColor; }
.message a:not(.button):not(.tag) {
color: currentColor;
text-decoration: underline; }
.message.is-small {
font-size: 0.75rem; }
.message.is-medium {
font-size: 1.25rem; }
.message.is-large {
font-size: 1.5rem; }
.message.is-white {
background-color: white; }
.message.is-white .message-header {
background-color: white;
color: #0a0a0a; }
.message.is-white .message-body {
border-color: white;
color: #4d4d4d; }
.message.is-black {
background-color: #fafafa; }
.message.is-black .message-header {
background-color: #0a0a0a;
color: white; }
.message.is-black .message-body {
border-color: #0a0a0a;
color: #090909; }
.message.is-light {
background-color: #fafafa; }
.message.is-light .message-header {
background-color: whitesmoke;
color: #363636; }
.message.is-light .message-body {
border-color: whitesmoke;
color: #505050; }
.message.is-dark {
background-color: #fafafa; }
.message.is-dark .message-header {
background-color: #363636;
color: whitesmoke; }
.message.is-dark .message-body {
border-color: #363636;
color: #2a2a2a; }
.message.is-primary {
background-color: #f5fffd; }
.message.is-primary .message-header {
background-color: #00d1b2;
color: #fff; }
.message.is-primary .message-body {
border-color: #00d1b2;
color: #021310; }
.message.is-link {
background-color: #f6f9fe; }
.message.is-link .message-header {
background-color: #3273dc;
color: #fff; }
.message.is-link .message-body {
border-color: #3273dc;
color: #22509a; }
.message.is-info {
background-color: #f6fbfe; }
.message.is-info .message-header {
background-color: #209cee;
color: #fff; }
.message.is-info .message-body {
border-color: #209cee;
color: #12537e; }
.message.is-success {
background-color: #f6fef9; }
.message.is-success .message-header {
background-color: #23d160;
color: #fff; }
.message.is-success .message-body {
border-color: #23d160;
color: #0e301a; }
.message.is-warning {
background-color: #fffdf5; }
.message.is-warning .message-header {
background-color: #ffdd57;
color: rgba(0, 0, 0, 0.7); }
.message.is-warning .message-body {
border-color: #ffdd57;
color: #3b3108; }
.message.is-danger {
background-color: #fff5f7; }
.message.is-danger .message-header {
background-color: #ff3860;
color: #fff; }
.message.is-danger .message-body {
border-color: #ff3860;
color: #cd0930; }
.message-header {
align-items: center;
background-color: #4a4a4a;
border-radius: 4px 4px 0 0;
color: #fff;
display: flex;
font-weight: 700;
justify-content: space-between;
line-height: 1.25;
padding: 0.75em 1em;
position: relative; }
.message-header .delete {
flex-grow: 0;
flex-shrink: 0;
margin-left: 0.75em; }
.message-header + .message-body {
border-width: 0;
border-top-left-radius: 0;
border-top-right-radius: 0; }
.message-body {
border-color: #dbdbdb;
border-radius: 4px;
border-style: solid;
border-width: 0 0 0 4px;
color: #4a4a4a;
padding: 1.25em 1.5em; }
.message-body code,
.message-body pre {
background-color: white; }
.message-body pre code {
background-color: transparent; }
.modal {
align-items: center;
display: none;
flex-direction: column;
justify-content: center;
overflow: hidden;
position: fixed;
z-index: 40; }
.modal.is-active {
display: flex; }
.modal-background {
background-color: rgba(10, 10, 10, 0.86); }
.modal-content,
.modal-card {
margin: 0 20px;
max-height: calc(100vh - 160px);
overflow: auto;
position: relative;
width: 100%; }
@media screen and (min-width: 769px), print {
.modal-content,
.modal-card {
margin: 0 auto;
max-height: calc(100vh - 40px);
width: 640px; } }
.modal-close {
background: none;
height: 40px;
position: fixed;
right: 20px;
top: 20px;
width: 40px; }
.modal-card {
display: flex;
flex-direction: column;
max-height: calc(100vh - 40px);
overflow: hidden;
-ms-overflow-y: visible; }
.modal-card-head,
.modal-card-foot {
align-items: center;
background-color: whitesmoke;
display: flex;
flex-shrink: 0;
justify-content: flex-start;
padding: 20px;
position: relative; }
.modal-card-head {
border-bottom: 1px solid #dbdbdb;
border-top-left-radius: 6px;
border-top-right-radius: 6px; }
.modal-card-title {
color: #363636;
flex-grow: 1;
flex-shrink: 0;
font-size: 1.5rem;
line-height: 1; }
.modal-card-foot {
border-bottom-left-radius: 6px;
border-bottom-right-radius: 6px;
border-top: 1px solid #dbdbdb; }
.modal-card-foot .button:not(:last-child) {
margin-right: 10px; }
.modal-card-body {
-webkit-overflow-scrolling: touch;
background-color: white;
flex-grow: 1;
flex-shrink: 1;
overflow: auto;
padding: 20px; }
.navbar {
background-color: white;
min-height: 3.25rem;
position: relative;
z-index: 30; }
.navbar.is-white {
background-color: white;
color: #0a0a0a; }
.navbar.is-white .navbar-brand > .navbar-item,
.navbar.is-white .navbar-brand .navbar-link {
color: #0a0a0a; }
.navbar.is-white .navbar-brand > a.navbar-item:hover, .navbar.is-white .navbar-brand > a.navbar-item.is-active,
.navbar.is-white .navbar-brand .navbar-link:hover,
.navbar.is-white .navbar-brand .navbar-link.is-active {
background-color: #f2f2f2;
color: #0a0a0a; }
.navbar.is-white .navbar-brand .navbar-link::after {
border-color: #0a0a0a; }
.navbar.is-white .navbar-burger {
color: #0a0a0a; }
@media screen and (min-width: 1088px) {
.navbar.is-white .navbar-start > .navbar-item,
.navbar.is-white .navbar-start .navbar-link,
.navbar.is-white .navbar-end > .navbar-item,
.navbar.is-white .navbar-end .navbar-link {
color: #0a0a0a; }
.navbar.is-white .navbar-start > a.navbar-item:hover, .navbar.is-white .navbar-start > a.navbar-item.is-active,
.navbar.is-white .navbar-start .navbar-link:hover,
.navbar.is-white .navbar-start .navbar-link.is-active,
.navbar.is-white .navbar-end > a.navbar-item:hover,
.navbar.is-white .navbar-end > a.navbar-item.is-active,
.navbar.is-white .navbar-end .navbar-link:hover,
.navbar.is-white .navbar-end .navbar-link.is-active {
background-color: #f2f2f2;
color: #0a0a0a; }
.navbar.is-white .navbar-start .navbar-link::after,
.navbar.is-white .navbar-end .navbar-link::after {
border-color: #0a0a0a; }
.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,
.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link {
background-color: #f2f2f2;
color: #0a0a0a; }
.navbar.is-white .navbar-dropdown a.navbar-item.is-active {
background-color: white;
color: #0a0a0a; } }
.navbar.is-black {
background-color: #0a0a0a;
color: white; }
.navbar.is-black .navbar-brand > .navbar-item,
.navbar.is-black .navbar-brand .navbar-link {
color: white; }
.navbar.is-black .navbar-brand > a.navbar-item:hover, .navbar.is-black .navbar-brand > a.navbar-item.is-active,
.navbar.is-black .navbar-brand .navbar-link:hover,
.navbar.is-black .navbar-brand .navbar-link.is-active {
background-color: black;
color: white; }
.navbar.is-black .navbar-brand .navbar-link::after {
border-color: white; }
.navbar.is-black .navbar-burger {
color: white; }
@media screen and (min-width: 1088px) {
.navbar.is-black .navbar-start > .navbar-item,
.navbar.is-black .navbar-start .navbar-link,
.navbar.is-black .navbar-end > .navbar-item,
.navbar.is-black .navbar-end .navbar-link {
color: white; }
.navbar.is-black .navbar-start > a.navbar-item:hover, .navbar.is-black .navbar-start > a.navbar-item.is-active,
.navbar.is-black .navbar-start .navbar-link:hover,
.navbar.is-black .navbar-start .navbar-link.is-active,
.navbar.is-black .navbar-end > a.navbar-item:hover,
.navbar.is-black .navbar-end > a.navbar-item.is-active,
.navbar.is-black .navbar-end .navbar-link:hover,
.navbar.is-black .navbar-end .navbar-link.is-active {
background-color: black;
color: white; }
.navbar.is-black .navbar-start .navbar-link::after,
.navbar.is-black .navbar-end .navbar-link::after {
border-color: white; }
.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,
.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link {
background-color: black;
color: white; }
.navbar.is-black .navbar-dropdown a.navbar-item.is-active {
background-color: #0a0a0a;
color: white; } }
.navbar.is-light {
background-color: whitesmoke;
color: #363636; }
.navbar.is-light .navbar-brand > .navbar-item,
.navbar.is-light .navbar-brand .navbar-link {
color: #363636; }
.navbar.is-light .navbar-brand > a.navbar-item:hover, .navbar.is-light .navbar-brand > a.navbar-item.is-active,
.navbar.is-light .navbar-brand .navbar-link:hover,
.navbar.is-light .navbar-brand .navbar-link.is-active {
background-color: #e8e8e8;
color: #363636; }
.navbar.is-light .navbar-brand .navbar-link::after {
border-color: #363636; }
.navbar.is-light .navbar-burger {
color: #363636; }
@media screen and (min-width: 1088px) {
.navbar.is-light .navbar-start > .navbar-item,
.navbar.is-light .navbar-start .navbar-link,
.navbar.is-light .navbar-end > .navbar-item,
.navbar.is-light .navbar-end .navbar-link {
color: #363636; }
.navbar.is-light .navbar-start > a.navbar-item:hover, .navbar.is-light .navbar-start > a.navbar-item.is-active,
.navbar.is-light .navbar-start .navbar-link:hover,
.navbar.is-light .navbar-start .navbar-link.is-active,
.navbar.is-light .navbar-end > a.navbar-item:hover,
.navbar.is-light .navbar-end > a.navbar-item.is-active,
.navbar.is-light .navbar-end .navbar-link:hover,
.navbar.is-light .navbar-end .navbar-link.is-active {
background-color: #e8e8e8;
color: #363636; }
.navbar.is-light .navbar-start .navbar-link::after,
.navbar.is-light .navbar-end .navbar-link::after {
border-color: #363636; }
.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,
.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link {
background-color: #e8e8e8;
color: #363636; }
.navbar.is-light .navbar-dropdown a.navbar-item.is-active {
background-color: whitesmoke;
color: #363636; } }
.navbar.is-dark {
background-color: #363636;
color: whitesmoke; }
.navbar.is-dark .navbar-brand > .navbar-item,
.navbar.is-dark .navbar-brand .navbar-link {
color: whitesmoke; }
.navbar.is-dark .navbar-brand > a.navbar-item:hover, .navbar.is-dark .navbar-brand > a.navbar-item.is-active,
.navbar.is-dark .navbar-brand .navbar-link:hover,
.navbar.is-dark .navbar-brand .navbar-link.is-active {
background-color: #292929;
color: whitesmoke; }
.navbar.is-dark .navbar-brand .navbar-link::after {
border-color: whitesmoke; }
.navbar.is-dark .navbar-burger {
color: whitesmoke; }
@media screen and (min-width: 1088px) {
.navbar.is-dark .navbar-start > .navbar-item,
.navbar.is-dark .navbar-start .navbar-link,
.navbar.is-dark .navbar-end > .navbar-item,
.navbar.is-dark .navbar-end .navbar-link {
color: whitesmoke; }
.navbar.is-dark .navbar-start > a.navbar-item:hover, .navbar.is-dark .navbar-start > a.navbar-item.is-active,
.navbar.is-dark .navbar-start .navbar-link:hover,
.navbar.is-dark .navbar-start .navbar-link.is-active,
.navbar.is-dark .navbar-end > a.navbar-item:hover,
.navbar.is-dark .navbar-end > a.navbar-item.is-active,
.navbar.is-dark .navbar-end .navbar-link:hover,
.navbar.is-dark .navbar-end .navbar-link.is-active {
background-color: #292929;
color: whitesmoke; }
.navbar.is-dark .navbar-start .navbar-link::after,
.navbar.is-dark .navbar-end .navbar-link::after {
border-color: whitesmoke; }
.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,
.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link {
background-color: #292929;
color: whitesmoke; }
.navbar.is-dark .navbar-dropdown a.navbar-item.is-active {
background-color: #363636;
color: whitesmoke; } }
.navbar.is-primary {
background-color: #00d1b2;
color: #fff; }
.navbar.is-primary .navbar-brand > .navbar-item,
.navbar.is-primary .navbar-brand .navbar-link {
color: #fff; }
.navbar.is-primary .navbar-brand > a.navbar-item:hover, .navbar.is-primary .navbar-brand > a.navbar-item.is-active,
.navbar.is-primary .navbar-brand .navbar-link:hover,
.navbar.is-primary .navbar-brand .navbar-link.is-active {
background-color: #00b89c;
color: #fff; }
.navbar.is-primary .navbar-brand .navbar-link::after {
border-color: #fff; }
.navbar.is-primary .navbar-burger {
color: #fff; }
@media screen and (min-width: 1088px) {
.navbar.is-primary .navbar-start > .navbar-item,
.navbar.is-primary .navbar-start .navbar-link,
.navbar.is-primary .navbar-end > .navbar-item,
.navbar.is-primary .navbar-end .navbar-link {
color: #fff; }
.navbar.is-primary .navbar-start > a.navbar-item:hover, .navbar.is-primary .navbar-start > a.navbar-item.is-active,
.navbar.is-primary .navbar-start .navbar-link:hover,
.navbar.is-primary .navbar-start .navbar-link.is-active,
.navbar.is-primary .navbar-end > a.navbar-item:hover,
.navbar.is-primary .navbar-end > a.navbar-item.is-active,
.navbar.is-primary .navbar-end .navbar-link:hover,
.navbar.is-primary .navbar-end .navbar-link.is-active {
background-color: #00b89c;
color: #fff; }
.navbar.is-primary .navbar-start .navbar-link::after,
.navbar.is-primary .navbar-end .navbar-link::after {
border-color: #fff; }
.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,
.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link {
background-color: #00b89c;
color: #fff; }
.navbar.is-primary .navbar-dropdown a.navbar-item.is-active {
background-color: #00d1b2;
color: #fff; } }
.navbar.is-link {
background-color: #3273dc;
color: #fff; }
.navbar.is-link .navbar-brand > .navbar-item,
.navbar.is-link .navbar-brand .navbar-link {
color: #fff; }
.navbar.is-link .navbar-brand > a.navbar-item:hover, .navbar.is-link .navbar-brand > a.navbar-item.is-active,
.navbar.is-link .navbar-brand .navbar-link:hover,
.navbar.is-link .navbar-brand .navbar-link.is-active {
background-color: #2366d1;
color: #fff; }
.navbar.is-link .navbar-brand .navbar-link::after {
border-color: #fff; }
.navbar.is-link .navbar-burger {
color: #fff; }
@media screen and (min-width: 1088px) {
.navbar.is-link .navbar-start > .navbar-item,
.navbar.is-link .navbar-start .navbar-link,
.navbar.is-link .navbar-end > .navbar-item,
.navbar.is-link .navbar-end .navbar-link {
color: #fff; }
.navbar.is-link .navbar-start > a.navbar-item:hover, .navbar.is-link .navbar-start > a.navbar-item.is-active,
.navbar.is-link .navbar-start .navbar-link:hover,
.navbar.is-link .navbar-start .navbar-link.is-active,
.navbar.is-link .navbar-end > a.navbar-item:hover,
.navbar.is-link .navbar-end > a.navbar-item.is-active,
.navbar.is-link .navbar-end .navbar-link:hover,
.navbar.is-link .navbar-end .navbar-link.is-active {
background-color: #2366d1;
color: #fff; }
.navbar.is-link .navbar-start .navbar-link::after,
.navbar.is-link .navbar-end .navbar-link::after {
border-color: #fff; }
.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,
.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link {
background-color: #2366d1;
color: #fff; }
.navbar.is-link .navbar-dropdown a.navbar-item.is-active {
background-color: #3273dc;
color: #fff; } }
.navbar.is-info {
background-color: #209cee;
color: #fff; }
.navbar.is-info .navbar-brand > .navbar-item,
.navbar.is-info .navbar-brand .navbar-link {
color: #fff; }
.navbar.is-info .navbar-brand > a.navbar-item:hover, .navbar.is-info .navbar-brand > a.navbar-item.is-active,
.navbar.is-info .navbar-brand .navbar-link:hover,
.navbar.is-info .navbar-brand .navbar-link.is-active {
background-color: #118fe4;
color: #fff; }
.navbar.is-info .navbar-brand .navbar-link::after {
border-color: #fff; }
.navbar.is-info .navbar-burger {
color: #fff; }
@media screen and (min-width: 1088px) {
.navbar.is-info .navbar-start > .navbar-item,
.navbar.is-info .navbar-start .navbar-link,
.navbar.is-info .navbar-end > .navbar-item,
.navbar.is-info .navbar-end .navbar-link {
color: #fff; }
.navbar.is-info .navbar-start > a.navbar-item:hover, .navbar.is-info .navbar-start > a.navbar-item.is-active,
.navbar.is-info .navbar-start .navbar-link:hover,
.navbar.is-info .navbar-start .navbar-link.is-active,
.navbar.is-info .navbar-end > a.navbar-item:hover,
.navbar.is-info .navbar-end > a.navbar-item.is-active,
.navbar.is-info .navbar-end .navbar-link:hover,
.navbar.is-info .navbar-end .navbar-link.is-active {
background-color: #118fe4;
color: #fff; }
.navbar.is-info .navbar-start .navbar-link::after,
.navbar.is-info .navbar-end .navbar-link::after {
border-color: #fff; }
.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,
.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link {
background-color: #118fe4;
color: #fff; }
.navbar.is-info .navbar-dropdown a.navbar-item.is-active {
background-color: #209cee;
color: #fff; } }
.navbar.is-success {
background-color: #23d160;
color: #fff; }
.navbar.is-success .navbar-brand > .navbar-item,
.navbar.is-success .navbar-brand .navbar-link {
color: #fff; }
.navbar.is-success .navbar-brand > a.navbar-item:hover, .navbar.is-success .navbar-brand > a.navbar-item.is-active,
.navbar.is-success .navbar-brand .navbar-link:hover,
.navbar.is-success .navbar-brand .navbar-link.is-active {
background-color: #20bc56;
color: #fff; }
.navbar.is-success .navbar-brand .navbar-link::after {
border-color: #fff; }
.navbar.is-success .navbar-burger {
color: #fff; }
@media screen and (min-width: 1088px) {
.navbar.is-success .navbar-start > .navbar-item,
.navbar.is-success .navbar-start .navbar-link,
.navbar.is-success .navbar-end > .navbar-item,
.navbar.is-success .navbar-end .navbar-link {
color: #fff; }
.navbar.is-success .navbar-start > a.navbar-item:hover, .navbar.is-success .navbar-start > a.navbar-item.is-active,
.navbar.is-success .navbar-start .navbar-link:hover,
.navbar.is-success .navbar-start .navbar-link.is-active,
.navbar.is-success .navbar-end > a.navbar-item:hover,
.navbar.is-success .navbar-end > a.navbar-item.is-active,
.navbar.is-success .navbar-end .navbar-link:hover,
.navbar.is-success .navbar-end .navbar-link.is-active {
background-color: #20bc56;
color: #fff; }
.navbar.is-success .navbar-start .navbar-link::after,
.navbar.is-success .navbar-end .navbar-link::after {
border-color: #fff; }
.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,
.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link {
background-color: #20bc56;
color: #fff; }
.navbar.is-success .navbar-dropdown a.navbar-item.is-active {
background-color: #23d160;
color: #fff; } }
.navbar.is-warning {
background-color: #ffdd57;
color: rgba(0, 0, 0, 0.7); }
.navbar.is-warning .navbar-brand > .navbar-item,
.navbar.is-warning .navbar-brand .navbar-link {
color: rgba(0, 0, 0, 0.7); }
.navbar.is-warning .navbar-brand > a.navbar-item:hover, .navbar.is-warning .navbar-brand > a.navbar-item.is-active,
.navbar.is-warning .navbar-brand .navbar-link:hover,
.navbar.is-warning .navbar-brand .navbar-link.is-active {
background-color: #ffd83d;
color: rgba(0, 0, 0, 0.7); }
.navbar.is-warning .navbar-brand .navbar-link::after {
border-color: rgba(0, 0, 0, 0.7); }
.navbar.is-warning .navbar-burger {
color: rgba(0, 0, 0, 0.7); }
@media screen and (min-width: 1088px) {
.navbar.is-warning .navbar-start > .navbar-item,
.navbar.is-warning .navbar-start .navbar-link,
.navbar.is-warning .navbar-end > .navbar-item,
.navbar.is-warning .navbar-end .navbar-link {
color: rgba(0, 0, 0, 0.7); }
.navbar.is-warning .navbar-start > a.navbar-item:hover, .navbar.is-warning .navbar-start > a.navbar-item.is-active,
.navbar.is-warning .navbar-start .navbar-link:hover,
.navbar.is-warning .navbar-start .navbar-link.is-active,
.navbar.is-warning .navbar-end > a.navbar-item:hover,
.navbar.is-warning .navbar-end > a.navbar-item.is-active,
.navbar.is-warning .navbar-end .navbar-link:hover,
.navbar.is-warning .navbar-end .navbar-link.is-active {
background-color: #ffd83d;
color: rgba(0, 0, 0, 0.7); }
.navbar.is-warning .navbar-start .navbar-link::after,
.navbar.is-warning .navbar-end .navbar-link::after {
border-color: rgba(0, 0, 0, 0.7); }
.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,
.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link {
background-color: #ffd83d;
color: rgba(0, 0, 0, 0.7); }
.navbar.is-warning .navbar-dropdown a.navbar-item.is-active {
background-color: #ffdd57;
color: rgba(0, 0, 0, 0.7); } }
.navbar.is-danger {
background-color: #ff3860;
color: #fff; }
.navbar.is-danger .navbar-brand > .navbar-item,
.navbar.is-danger .navbar-brand .navbar-link {
color: #fff; }
.navbar.is-danger .navbar-brand > a.navbar-item:hover, .navbar.is-danger .navbar-brand > a.navbar-item.is-active,
.navbar.is-danger .navbar-brand .navbar-link:hover,
.navbar.is-danger .navbar-brand .navbar-link.is-active {
background-color: #ff1f4b;
color: #fff; }
.navbar.is-danger .navbar-brand .navbar-link::after {
border-color: #fff; }
.navbar.is-danger .navbar-burger {
color: #fff; }
@media screen and (min-width: 1088px) {
.navbar.is-danger .navbar-start > .navbar-item,
.navbar.is-danger .navbar-start .navbar-link,
.navbar.is-danger .navbar-end > .navbar-item,
.navbar.is-danger .navbar-end .navbar-link {
color: #fff; }
.navbar.is-danger .navbar-start > a.navbar-item:hover, .navbar.is-danger .navbar-start > a.navbar-item.is-active,
.navbar.is-danger .navbar-start .navbar-link:hover,
.navbar.is-danger .navbar-start .navbar-link.is-active,
.navbar.is-danger .navbar-end > a.navbar-item:hover,
.navbar.is-danger .navbar-end > a.navbar-item.is-active,
.navbar.is-danger .navbar-end .navbar-link:hover,
.navbar.is-danger .navbar-end .navbar-link.is-active {
background-color: #ff1f4b;
color: #fff; }
.navbar.is-danger .navbar-start .navbar-link::after,
.navbar.is-danger .navbar-end .navbar-link::after {
border-color: #fff; }
.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,
.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link {
background-color: #ff1f4b;
color: #fff; }
.navbar.is-danger .navbar-dropdown a.navbar-item.is-active {
background-color: #ff3860;
color: #fff; } }
.navbar > .container {
align-items: stretch;
display: flex;
min-height: 3.25rem;
width: 100%; }
.navbar.has-shadow {
box-shadow: 0 2px 0 0 whitesmoke; }
.navbar.is-fixed-bottom, .navbar.is-fixed-top {
left: 0;
position: fixed;
right: 0;
z-index: 30; }
.navbar.is-fixed-bottom {
bottom: 0; }
.navbar.is-fixed-bottom.has-shadow {
box-shadow: 0 -2px 0 0 whitesmoke; }
.navbar.is-fixed-top {
top: 0; }
html.has-navbar-fixed-top,
body.has-navbar-fixed-top {
padding-top: 3.25rem; }
html.has-navbar-fixed-bottom,
body.has-navbar-fixed-bottom {
padding-bottom: 3.25rem; }
.navbar-brand,
.navbar-tabs {
align-items: stretch;
display: flex;
flex-shrink: 0;
min-height: 3.25rem; }
.navbar-brand a.navbar-item:hover {
background-color: transparent; }
.navbar-tabs {
-webkit-overflow-scrolling: touch;
max-width: 100vw;
overflow-x: auto;
overflow-y: hidden; }
.navbar-burger {
color: #4a4a4a;
cursor: pointer;
display: block;
height: 3.25rem;
position: relative;
width: 3.25rem;
margin-left: auto; }
.navbar-burger span {
background-color: currentColor;
display: block;
height: 1px;
left: calc(50% - 8px);
position: absolute;
transform-origin: center;
transition-duration: 86ms;
transition-property: background-color, opacity, transform;
transition-timing-function: ease-out;
width: 16px; }
.navbar-burger span:nth-child(1) {
top: calc(50% - 6px); }
.navbar-burger span:nth-child(2) {
top: calc(50% - 1px); }
.navbar-burger span:nth-child(3) {
top: calc(50% + 4px); }
.navbar-burger:hover {
background-color: rgba(0, 0, 0, 0.05); }
.navbar-burger.is-active span:nth-child(1) {
transform: translateY(5px) rotate(45deg); }
.navbar-burger.is-active span:nth-child(2) {
opacity: 0; }
.navbar-burger.is-active span:nth-child(3) {
transform: translateY(-5px) rotate(-45deg); }
.navbar-menu {
display: none; }
.navbar-item,
.navbar-link {
color: #4a4a4a;
display: block;
line-height: 1.5;
padding: 0.5rem 0.75rem;
position: relative; }
.navbar-item .icon:only-child,
.navbar-link .icon:only-child {
margin-left: -0.25rem;
margin-right: -0.25rem; }
a.navbar-item,
.navbar-link {
cursor: pointer; }
a.navbar-item:hover, a.navbar-item.is-active,
.navbar-link:hover,
.navbar-link.is-active {
background-color: #fafafa;
color: #3273dc; }
.navbar-item {
display: block;
flex-grow: 0;
flex-shrink: 0; }
.navbar-item img {
max-height: 1.75rem; }
.navbar-item.has-dropdown {
padding: 0; }
.navbar-item.is-expanded {
flex-grow: 1;
flex-shrink: 1; }
.navbar-item.is-tab {
border-bottom: 1px solid transparent;
min-height: 3.25rem;
padding-bottom: calc(0.5rem - 1px); }
.navbar-item.is-tab:hover {
background-color: transparent;
border-bottom-color: #3273dc; }
.navbar-item.is-tab.is-active {
background-color: transparent;
border-bottom-color: #3273dc;
border-bottom-style: solid;
border-bottom-width: 3px;
color: #3273dc;
padding-bottom: calc(0.5rem - 3px); }
.navbar-content {
flex-grow: 1;
flex-shrink: 1; }
.navbar-link:not(.is-arrowless) {
padding-right: 2.5em; }
.navbar-link:not(.is-arrowless)::after {
border-color: #3273dc;
margin-top: -0.375em;
right: 1.125em; }
.navbar-dropdown {
font-size: 0.875rem;
padding-bottom: 0.5rem;
padding-top: 0.5rem; }
.navbar-dropdown .navbar-item {
padding-left: 1.5rem;
padding-right: 1.5rem; }
.navbar-divider {
background-color: whitesmoke;
border: none;
display: none;
height: 2px;
margin: 0.5rem 0; }
@media screen and (max-width: 1087px) {
.navbar > .container {
display: block; }
.navbar-brand .navbar-item,
.navbar-tabs .navbar-item {
align-items: center;
display: flex; }
.navbar-link::after {
display: none; }
.navbar-menu {
background-color: white;
box-shadow: 0 8px 16px rgba(10, 10, 10, 0.1);
padding: 0.5rem 0; }
.navbar-menu.is-active {
display: block; }
.navbar.is-fixed-bottom-touch, .navbar.is-fixed-top-touch {
left: 0;
position: fixed;
right: 0;
z-index: 30; }
.navbar.is-fixed-bottom-touch {
bottom: 0; }
.navbar.is-fixed-bottom-touch.has-shadow {
box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); }
.navbar.is-fixed-top-touch {
top: 0; }
.navbar.is-fixed-top .navbar-menu, .navbar.is-fixed-top-touch .navbar-menu {
-webkit-overflow-scrolling: touch;
max-height: calc(100vh - 3.25rem);
overflow: auto; }
html.has-navbar-fixed-top-touch,
body.has-navbar-fixed-top-touch {
padding-top: 3.25rem; }
html.has-navbar-fixed-bottom-touch,
body.has-navbar-fixed-bottom-touch {
padding-bottom: 3.25rem; } }
@media screen and (min-width: 1088px) {
.navbar,
.navbar-menu,
.navbar-start,
.navbar-end {
align-items: stretch;
display: flex; }
.navbar {
min-height: 3.25rem; }
.navbar.is-spaced {
padding: 1rem 2rem; }
.navbar.is-spaced .navbar-start,
.navbar.is-spaced .navbar-end {
align-items: center; }
.navbar.is-spaced a.navbar-item,
.navbar.is-spaced .navbar-link {
border-radius: 4px; }
.navbar.is-transparent a.navbar-item:hover, .navbar.is-transparent a.navbar-item.is-active,
.navbar.is-transparent .navbar-link:hover,
.navbar.is-transparent .navbar-link.is-active {
background-color: transparent !important; }
.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link {
background-color: transparent !important; }
.navbar.is-transparent .navbar-dropdown a.navbar-item:hover {
background-color: whitesmoke;
color: #0a0a0a; }
.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active {
background-color: whitesmoke;
color: #3273dc; }
.navbar-burger {
display: none; }
.navbar-item,
.navbar-link {
align-items: center;
display: flex; }
.navbar-item {
display: flex; }
.navbar-item.has-dropdown {
align-items: stretch; }
.navbar-item.has-dropdown-up .navbar-link::after {
transform: rotate(135deg) translate(0.25em, -0.25em); }
.navbar-item.has-dropdown-up .navbar-dropdown {
border-bottom: 2px solid #dbdbdb;
border-radius: 6px 6px 0 0;
border-top: none;
bottom: 100%;
box-shadow: 0 -8px 8px rgba(10, 10, 10, 0.1);
top: auto; }
.navbar-item.is-active .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown {
display: block; }
.navbar.is-spaced .navbar-item.is-active .navbar-dropdown, .navbar-item.is-active .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed {
opacity: 1;
pointer-events: auto;
transform: translateY(0); }
.navbar-menu {
flex-grow: 1;
flex-shrink: 0; }
.navbar-start {
justify-content: flex-start;
margin-right: auto; }
.navbar-end {
justify-content: flex-end;
margin-left: auto; }
.navbar-dropdown {
background-color: white;
border-bottom-left-radius: 6px;
border-bottom-right-radius: 6px;
border-top: 2px solid #dbdbdb;
box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1);
display: none;
font-size: 0.875rem;
left: 0;
min-width: 100%;
position: absolute;
top: 100%;
z-index: 20; }
.navbar-dropdown .navbar-item {
padding: 0.375rem 1rem;
white-space: nowrap; }
.navbar-dropdown a.navbar-item {
padding-right: 3rem; }
.navbar-dropdown a.navbar-item:hover {
background-color: whitesmoke;
color: #0a0a0a; }
.navbar-dropdown a.navbar-item.is-active {
background-color: whitesmoke;
color: #3273dc; }
.navbar.is-spaced .navbar-dropdown, .navbar-dropdown.is-boxed {
border-radius: 6px;
border-top: none;
box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1);
display: block;
opacity: 0;
pointer-events: none;
top: calc(100% + (-4px));
transform: translateY(-5px);
transition-duration: 86ms;
transition-property: opacity, transform; }
.navbar-dropdown.is-right {
left: auto;
right: 0; }
.navbar-divider {
display: block; }
.navbar > .container .navbar-brand,
.container > .navbar .navbar-brand {
margin-left: -.75rem; }
.navbar > .container .navbar-menu,
.container > .navbar .navbar-menu {
margin-right: -.75rem; }
.navbar.is-fixed-bottom-desktop, .navbar.is-fixed-top-desktop {
left: 0;
position: fixed;
right: 0;
z-index: 30; }
.navbar.is-fixed-bottom-desktop {
bottom: 0; }
.navbar.is-fixed-bottom-desktop.has-shadow {
box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); }
.navbar.is-fixed-top-desktop {
top: 0; }
html.has-navbar-fixed-top-desktop,
body.has-navbar-fixed-top-desktop {
padding-top: 3.25rem; }
html.has-navbar-fixed-bottom-desktop,
body.has-navbar-fixed-bottom-desktop {
padding-bottom: 3.25rem; }
html.has-spaced-navbar-fixed-top,
body.has-spaced-navbar-fixed-top {
padding-top: 5.25rem; }
html.has-spaced-navbar-fixed-bottom,
body.has-spaced-navbar-fixed-bottom {
padding-bottom: 5.25rem; }
a.navbar-item.is-active,
.navbar-link.is-active {
color: #0a0a0a; }
a.navbar-item.is-active:not(:hover),
.navbar-link.is-active:not(:hover) {
background-color: transparent; }
.navbar-item.has-dropdown:hover .navbar-link, .navbar-item.has-dropdown.is-active .navbar-link {
background-color: #fafafa; } }
.pagination {
font-size: 1rem;
margin: -0.25rem; }
.pagination.is-small {
font-size: 0.75rem; }
.pagination.is-medium {
font-size: 1.25rem; }
.pagination.is-large {
font-size: 1.5rem; }
.pagination.is-rounded .pagination-previous,
.pagination.is-rounded .pagination-next {
padding-left: 1em;
padding-right: 1em;
border-radius: 290486px; }
.pagination.is-rounded .pagination-link {
border-radius: 290486px; }
.pagination,
.pagination-list {
align-items: center;
display: flex;
justify-content: center;
text-align: center; }
.pagination-previous,
.pagination-next,
.pagination-link,
.pagination-ellipsis {
font-size: 1em;
padding-left: 0.5em;
padding-right: 0.5em;
justify-content: center;
margin: 0.25rem;
text-align: center; }
.pagination-previous,
.pagination-next,
.pagination-link {
border-color: #dbdbdb;
color: #363636;
min-width: 2.25em; }
.pagination-previous:hover,
.pagination-next:hover,
.pagination-link:hover {
border-color: #b5b5b5;
color: #363636; }
.pagination-previous:focus,
.pagination-next:focus,
.pagination-link:focus {
border-color: #3273dc; }
.pagination-previous:active,
.pagination-next:active,
.pagination-link:active {
box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); }
.pagination-previous[disabled],
.pagination-next[disabled],
.pagination-link[disabled] {
background-color: #dbdbdb;
border-color: #dbdbdb;
box-shadow: none;
color: #7a7a7a;
opacity: 0.5; }
.pagination-previous,
.pagination-next {
padding-left: 0.75em;
padding-right: 0.75em;
white-space: nowrap; }
.pagination-link.is-current {
background-color: #3273dc;
border-color: #3273dc;
color: #fff; }
.pagination-ellipsis {
color: #b5b5b5;
pointer-events: none; }
.pagination-list {
flex-wrap: wrap; }
@media screen and (max-width: 768px) {
.pagination {
flex-wrap: wrap; }
.pagination-previous,
.pagination-next {
flex-grow: 1;
flex-shrink: 1; }
.pagination-list li {
flex-grow: 1;
flex-shrink: 1; } }
@media screen and (min-width: 769px), print {
.pagination-list {
flex-grow: 1;
flex-shrink: 1;
justify-content: flex-start;
order: 1; }
.pagination-previous {
order: 2; }
.pagination-next {
order: 3; }
.pagination {
justify-content: space-between; }
.pagination.is-centered .pagination-previous {
order: 1; }
.pagination.is-centered .pagination-list {
justify-content: center;
order: 2; }
.pagination.is-centered .pagination-next {
order: 3; }
.pagination.is-right .pagination-previous {
order: 1; }
.pagination.is-right .pagination-next {
order: 2; }
.pagination.is-right .pagination-list {
justify-content: flex-end;
order: 3; } }
.panel {
font-size: 1rem; }
.panel:not(:last-child) {
margin-bottom: 1.5rem; }
.panel-heading,
.panel-tabs,
.panel-block {
border-bottom: 1px solid #dbdbdb;
border-left: 1px solid #dbdbdb;
border-right: 1px solid #dbdbdb; }
.panel-heading:first-child,
.panel-tabs:first-child,
.panel-block:first-child {
border-top: 1px solid #dbdbdb; }
.panel-heading {
background-color: whitesmoke;
border-radius: 4px 4px 0 0;
color: #363636;
font-size: 1.25em;
font-weight: 300;
line-height: 1.25;
padding: 0.5em 0.75em; }
.panel-tabs {
align-items: flex-end;
display: flex;
font-size: 0.875em;
justify-content: center; }
.panel-tabs a {
border-bottom: 1px solid #dbdbdb;
margin-bottom: -1px;
padding: 0.5em; }
.panel-tabs a.is-active {
border-bottom-color: #4a4a4a;
color: #363636; }
.panel-list a {
color: #4a4a4a; }
.panel-list a:hover {
color: #3273dc; }
.panel-block {
align-items: center;
color: #363636;
display: flex;
justify-content: flex-start;
padding: 0.5em 0.75em; }
.panel-block input[type="checkbox"] {
margin-right: 0.75em; }
.panel-block > .control {
flex-grow: 1;
flex-shrink: 1;
width: 100%; }
.panel-block.is-wrapped {
flex-wrap: wrap; }
.panel-block.is-active {
border-left-color: #3273dc;
color: #363636; }
.panel-block.is-active .panel-icon {
color: #3273dc; }
a.panel-block,
label.panel-block {
cursor: pointer; }
a.panel-block:hover,
label.panel-block:hover {
background-color: whitesmoke; }
.panel-icon {
display: inline-block;
font-size: 14px;
height: 1em;
line-height: 1em;
text-align: center;
vertical-align: top;
width: 1em;
color: #7a7a7a;
margin-right: 0.75em; }
.panel-icon .fa {
font-size: inherit;
line-height: inherit; }
.tabs {
-webkit-overflow-scrolling: touch;
align-items: stretch;
display: flex;
font-size: 1rem;
justify-content: space-between;
overflow: hidden;
overflow-x: auto;
white-space: nowrap; }
.tabs a {
align-items: center;
border-bottom-color: #dbdbdb;
border-bottom-style: solid;
border-bottom-width: 1px;
color: #4a4a4a;
display: flex;
justify-content: center;
margin-bottom: -1px;
padding: 0.5em 1em;
vertical-align: top; }
.tabs a:hover {
border-bottom-color: #363636;
color: #363636; }
.tabs li {
display: block; }
.tabs li.is-active a {
border-bottom-color: #3273dc;
color: #3273dc; }
.tabs ul {
align-items: center;
border-bottom-color: #dbdbdb;
border-bottom-style: solid;
border-bottom-width: 1px;
display: flex;
flex-grow: 1;
flex-shrink: 0;
justify-content: flex-start; }
.tabs ul.is-left {
padding-right: 0.75em; }
.tabs ul.is-center {
flex: none;
justify-content: center;
padding-left: 0.75em;
padding-right: 0.75em; }
.tabs ul.is-right {
justify-content: flex-end;
padding-left: 0.75em; }
.tabs .icon:first-child {
margin-right: 0.5em; }
.tabs .icon:last-child {
margin-left: 0.5em; }
.tabs.is-centered ul {
justify-content: center; }
.tabs.is-right ul {
justify-content: flex-end; }
.tabs.is-boxed a {
border: 1px solid transparent;
border-radius: 4px 4px 0 0; }
.tabs.is-boxed a:hover {
background-color: whitesmoke;
border-bottom-color: #dbdbdb; }
.tabs.is-boxed li.is-active a {
background-color: white;
border-color: #dbdbdb;
border-bottom-color: transparent !important; }
.tabs.is-fullwidth li {
flex-grow: 1;
flex-shrink: 0; }
.tabs.is-toggle a {
border-color: #dbdbdb;
border-style: solid;
border-width: 1px;
margin-bottom: 0;
position: relative; }
.tabs.is-toggle a:hover {
background-color: whitesmoke;
border-color: #b5b5b5;
z-index: 2; }
.tabs.is-toggle li + li {
margin-left: -1px; }
.tabs.is-toggle li:first-child a {
border-radius: 4px 0 0 4px; }
.tabs.is-toggle li:last-child a {
border-radius: 0 4px 4px 0; }
.tabs.is-toggle li.is-active a {
background-color: #3273dc;
border-color: #3273dc;
color: #fff;
z-index: 1; }
.tabs.is-toggle ul {
border-bottom: none; }
.tabs.is-toggle.is-toggle-rounded li:first-child a {
border-bottom-left-radius: 290486px;
border-top-left-radius: 290486px;
padding-left: 1.25em; }
.tabs.is-toggle.is-toggle-rounded li:last-child a {
border-bottom-right-radius: 290486px;
border-top-right-radius: 290486px;
padding-right: 1.25em; }
.tabs.is-small {
font-size: 0.75rem; }
.tabs.is-medium {
font-size: 1.25rem; }
.tabs.is-large {
font-size: 1.5rem; }
.column {
display: block;
flex-basis: 0;
flex-grow: 1;
flex-shrink: 1;
padding: 0.75rem; }
.columns.is-mobile > .column.is-narrow {
flex: none; }
.columns.is-mobile > .column.is-full {
flex: none;
width: 100%; }
.columns.is-mobile > .column.is-three-quarters {
flex: none;
width: 75%; }
.columns.is-mobile > .column.is-two-thirds {
flex: none;
width: 66.6666%; }
.columns.is-mobile > .column.is-half {
flex: none;
width: 50%; }
.columns.is-mobile > .column.is-one-third {
flex: none;
width: 33.3333%; }
.columns.is-mobile > .column.is-one-quarter {
flex: none;
width: 25%; }
.columns.is-mobile > .column.is-one-fifth {
flex: none;
width: 20%; }
.columns.is-mobile > .column.is-two-fifths {
flex: none;
width: 40%; }
.columns.is-mobile > .column.is-three-fifths {
flex: none;
width: 60%; }
.columns.is-mobile > .column.is-four-fifths {
flex: none;
width: 80%; }
.columns.is-mobile > .column.is-offset-three-quarters {
margin-left: 75%; }
.columns.is-mobile > .column.is-offset-two-thirds {
margin-left: 66.6666%; }
.columns.is-mobile > .column.is-offset-half {
margin-left: 50%; }
.columns.is-mobile > .column.is-offset-one-third {
margin-left: 33.3333%; }
.columns.is-mobile > .column.is-offset-one-quarter {
margin-left: 25%; }
.columns.is-mobile > .column.is-offset-one-fifth {
margin-left: 20%; }
.columns.is-mobile > .column.is-offset-two-fifths {
margin-left: 40%; }
.columns.is-mobile > .column.is-offset-three-fifths {
margin-left: 60%; }
.columns.is-mobile > .column.is-offset-four-fifths {
margin-left: 80%; }
.columns.is-mobile > .column.is-1 {
flex: none;
width: 8.33333%; }
.columns.is-mobile > .column.is-offset-1 {
margin-left: 8.33333%; }
.columns.is-mobile > .column.is-2 {
flex: none;
width: 16.66667%; }
.columns.is-mobile > .column.is-offset-2 {
margin-left: 16.66667%; }
.columns.is-mobile > .column.is-3 {
flex: none;
width: 25%; }
.columns.is-mobile > .column.is-offset-3 {
margin-left: 25%; }
.columns.is-mobile > .column.is-4 {
flex: none;
width: 33.33333%; }
.columns.is-mobile > .column.is-offset-4 {
margin-left: 33.33333%; }
.columns.is-mobile > .column.is-5 {
flex: none;
width: 41.66667%; }
.columns.is-mobile > .column.is-offset-5 {
margin-left: 41.66667%; }
.columns.is-mobile > .column.is-6 {
flex: none;
width: 50%; }
.columns.is-mobile > .column.is-offset-6 {
margin-left: 50%; }
.columns.is-mobile > .column.is-7 {
flex: none;
width: 58.33333%; }
.columns.is-mobile > .column.is-offset-7 {
margin-left: 58.33333%; }
.columns.is-mobile > .column.is-8 {
flex: none;
width: 66.66667%; }
.columns.is-mobile > .column.is-offset-8 {
margin-left: 66.66667%; }
.columns.is-mobile > .column.is-9 {
flex: none;
width: 75%; }
.columns.is-mobile > .column.is-offset-9 {
margin-left: 75%; }
.columns.is-mobile > .column.is-10 {
flex: none;
width: 83.33333%; }
.columns.is-mobile > .column.is-offset-10 {
margin-left: 83.33333%; }
.columns.is-mobile > .column.is-11 {
flex: none;
width: 91.66667%; }
.columns.is-mobile > .column.is-offset-11 {
margin-left: 91.66667%; }
.columns.is-mobile > .column.is-12 {
flex: none;
width: 100%; }
.columns.is-mobile > .column.is-offset-12 {
margin-left: 100%; }
@media screen and (max-width: 768px) {
.column.is-narrow-mobile {
flex: none; }
.column.is-full-mobile {
flex: none;
width: 100%; }
.column.is-three-quarters-mobile {
flex: none;
width: 75%; }
.column.is-two-thirds-mobile {
flex: none;
width: 66.6666%; }
.column.is-half-mobile {
flex: none;
width: 50%; }
.column.is-one-third-mobile {
flex: none;
width: 33.3333%; }
.column.is-one-quarter-mobile {
flex: none;
width: 25%; }
.column.is-one-fifth-mobile {
flex: none;
width: 20%; }
.column.is-two-fifths-mobile {
flex: none;
width: 40%; }
.column.is-three-fifths-mobile {
flex: none;
width: 60%; }
.column.is-four-fifths-mobile {
flex: none;
width: 80%; }
.column.is-offset-three-quarters-mobile {
margin-left: 75%; }
.column.is-offset-two-thirds-mobile {
margin-left: 66.6666%; }
.column.is-offset-half-mobile {
margin-left: 50%; }
.column.is-offset-one-third-mobile {
margin-left: 33.3333%; }
.column.is-offset-one-quarter-mobile {
margin-left: 25%; }
.column.is-offset-one-fifth-mobile {
margin-left: 20%; }
.column.is-offset-two-fifths-mobile {
margin-left: 40%; }
.column.is-offset-three-fifths-mobile {
margin-left: 60%; }
.column.is-offset-four-fifths-mobile {
margin-left: 80%; }
.column.is-1-mobile {
flex: none;
width: 8.33333%; }
.column.is-offset-1-mobile {
margin-left: 8.33333%; }
.column.is-2-mobile {
flex: none;
width: 16.66667%; }
.column.is-offset-2-mobile {
margin-left: 16.66667%; }
.column.is-3-mobile {
flex: none;
width: 25%; }
.column.is-offset-3-mobile {
margin-left: 25%; }
.column.is-4-mobile {
flex: none;
width: 33.33333%; }
.column.is-offset-4-mobile {
margin-left: 33.33333%; }
.column.is-5-mobile {
flex: none;
width: 41.66667%; }
.column.is-offset-5-mobile {
margin-left: 41.66667%; }
.column.is-6-mobile {
flex: none;
width: 50%; }
.column.is-offset-6-mobile {
margin-left: 50%; }
.column.is-7-mobile {
flex: none;
width: 58.33333%; }
.column.is-offset-7-mobile {
margin-left: 58.33333%; }
.column.is-8-mobile {
flex: none;
width: 66.66667%; }
.column.is-offset-8-mobile {
margin-left: 66.66667%; }
.column.is-9-mobile {
flex: none;
width: 75%; }
.column.is-offset-9-mobile {
margin-left: 75%; }
.column.is-10-mobile {
flex: none;
width: 83.33333%; }
.column.is-offset-10-mobile {
margin-left: 83.33333%; }
.column.is-11-mobile {
flex: none;
width: 91.66667%; }
.column.is-offset-11-mobile {
margin-left: 91.66667%; }
.column.is-12-mobile {
flex: none;
width: 100%; }
.column.is-offset-12-mobile {
margin-left: 100%; } }
@media screen and (min-width: 769px), print {
.column.is-narrow, .column.is-narrow-tablet {
flex: none; }
.column.is-full, .column.is-full-tablet {
flex: none;
width: 100%; }
.column.is-three-quarters, .column.is-three-quarters-tablet {
flex: none;
width: 75%; }
.column.is-two-thirds, .column.is-two-thirds-tablet {
flex: none;
width: 66.6666%; }
.column.is-half, .column.is-half-tablet {
flex: none;
width: 50%; }
.column.is-one-third, .column.is-one-third-tablet {
flex: none;
width: 33.3333%; }
.column.is-one-quarter, .column.is-one-quarter-tablet {
flex: none;
width: 25%; }
.column.is-one-fifth, .column.is-one-fifth-tablet {
flex: none;
width: 20%; }
.column.is-two-fifths, .column.is-two-fifths-tablet {
flex: none;
width: 40%; }
.column.is-three-fifths, .column.is-three-fifths-tablet {
flex: none;
width: 60%; }
.column.is-four-fifths, .column.is-four-fifths-tablet {
flex: none;
width: 80%; }
.column.is-offset-three-quarters, .column.is-offset-three-quarters-tablet {
margin-left: 75%; }
.column.is-offset-two-thirds, .column.is-offset-two-thirds-tablet {
margin-left: 66.6666%; }
.column.is-offset-half, .column.is-offset-half-tablet {
margin-left: 50%; }
.column.is-offset-one-third, .column.is-offset-one-third-tablet {
margin-left: 33.3333%; }
.column.is-offset-one-quarter, .column.is-offset-one-quarter-tablet {
margin-left: 25%; }
.column.is-offset-one-fifth, .column.is-offset-one-fifth-tablet {
margin-left: 20%; }
.column.is-offset-two-fifths, .column.is-offset-two-fifths-tablet {
margin-left: 40%; }
.column.is-offset-three-fifths, .column.is-offset-three-fifths-tablet {
margin-left: 60%; }
.column.is-offset-four-fifths, .column.is-offset-four-fifths-tablet {
margin-left: 80%; }
.column.is-1, .column.is-1-tablet {
flex: none;
width: 8.33333%; }
.column.is-offset-1, .column.is-offset-1-tablet {
margin-left: 8.33333%; }
.column.is-2, .column.is-2-tablet {
flex: none;
width: 16.66667%; }
.column.is-offset-2, .column.is-offset-2-tablet {
margin-left: 16.66667%; }
.column.is-3, .column.is-3-tablet {
flex: none;
width: 25%; }
.column.is-offset-3, .column.is-offset-3-tablet {
margin-left: 25%; }
.column.is-4, .column.is-4-tablet {
flex: none;
width: 33.33333%; }
.column.is-offset-4, .column.is-offset-4-tablet {
margin-left: 33.33333%; }
.column.is-5, .column.is-5-tablet {
flex: none;
width: 41.66667%; }
.column.is-offset-5, .column.is-offset-5-tablet {
margin-left: 41.66667%; }
.column.is-6, .column.is-6-tablet {
flex: none;
width: 50%; }
.column.is-offset-6, .column.is-offset-6-tablet {
margin-left: 50%; }
.column.is-7, .column.is-7-tablet {
flex: none;
width: 58.33333%; }
.column.is-offset-7, .column.is-offset-7-tablet {
margin-left: 58.33333%; }
.column.is-8, .column.is-8-tablet {
flex: none;
width: 66.66667%; }
.column.is-offset-8, .column.is-offset-8-tablet {
margin-left: 66.66667%; }
.column.is-9, .column.is-9-tablet {
flex: none;
width: 75%; }
.column.is-offset-9, .column.is-offset-9-tablet {
margin-left: 75%; }
.column.is-10, .column.is-10-tablet {
flex: none;
width: 83.33333%; }
.column.is-offset-10, .column.is-offset-10-tablet {
margin-left: 83.33333%; }
.column.is-11, .column.is-11-tablet {
flex: none;
width: 91.66667%; }
.column.is-offset-11, .column.is-offset-11-tablet {
margin-left: 91.66667%; }
.column.is-12, .column.is-12-tablet {
flex: none;
width: 100%; }
.column.is-offset-12, .column.is-offset-12-tablet {
margin-left: 100%; } }
@media screen and (max-width: 1087px) {
.column.is-narrow-touch {
flex: none; }
.column.is-full-touch {
flex: none;
width: 100%; }
.column.is-three-quarters-touch {
flex: none;
width: 75%; }
.column.is-two-thirds-touch {
flex: none;
width: 66.6666%; }
.column.is-half-touch {
flex: none;
width: 50%; }
.column.is-one-third-touch {
flex: none;
width: 33.3333%; }
.column.is-one-quarter-touch {
flex: none;
width: 25%; }
.column.is-one-fifth-touch {
flex: none;
width: 20%; }
.column.is-two-fifths-touch {
flex: none;
width: 40%; }
.column.is-three-fifths-touch {
flex: none;
width: 60%; }
.column.is-four-fifths-touch {
flex: none;
width: 80%; }
.column.is-offset-three-quarters-touch {
margin-left: 75%; }
.column.is-offset-two-thirds-touch {
margin-left: 66.6666%; }
.column.is-offset-half-touch {
margin-left: 50%; }
.column.is-offset-one-third-touch {
margin-left: 33.3333%; }
.column.is-offset-one-quarter-touch {
margin-left: 25%; }
.column.is-offset-one-fifth-touch {
margin-left: 20%; }
.column.is-offset-two-fifths-touch {
margin-left: 40%; }
.column.is-offset-three-fifths-touch {
margin-left: 60%; }
.column.is-offset-four-fifths-touch {
margin-left: 80%; }
.column.is-1-touch {
flex: none;
width: 8.33333%; }
.column.is-offset-1-touch {
margin-left: 8.33333%; }
.column.is-2-touch {
flex: none;
width: 16.66667%; }
.column.is-offset-2-touch {
margin-left: 16.66667%; }
.column.is-3-touch {
flex: none;
width: 25%; }
.column.is-offset-3-touch {
margin-left: 25%; }
.column.is-4-touch {
flex: none;
width: 33.33333%; }
.column.is-offset-4-touch {
margin-left: 33.33333%; }
.column.is-5-touch {
flex: none;
width: 41.66667%; }
.column.is-offset-5-touch {
margin-left: 41.66667%; }
.column.is-6-touch {
flex: none;
width: 50%; }
.column.is-offset-6-touch {
margin-left: 50%; }
.column.is-7-touch {
flex: none;
width: 58.33333%; }
.column.is-offset-7-touch {
margin-left: 58.33333%; }
.column.is-8-touch {
flex: none;
width: 66.66667%; }
.column.is-offset-8-touch {
margin-left: 66.66667%; }
.column.is-9-touch {
flex: none;
width: 75%; }
.column.is-offset-9-touch {
margin-left: 75%; }
.column.is-10-touch {
flex: none;
width: 83.33333%; }
.column.is-offset-10-touch {
margin-left: 83.33333%; }
.column.is-11-touch {
flex: none;
width: 91.66667%; }
.column.is-offset-11-touch {
margin-left: 91.66667%; }
.column.is-12-touch {
flex: none;
width: 100%; }
.column.is-offset-12-touch {
margin-left: 100%; } }
@media screen and (min-width: 1088px) {
.column.is-narrow-desktop {
flex: none; }
.column.is-full-desktop {
flex: none;
width: 100%; }
.column.is-three-quarters-desktop {
flex: none;
width: 75%; }
.column.is-two-thirds-desktop {
flex: none;
width: 66.6666%; }
.column.is-half-desktop {
flex: none;
width: 50%; }
.column.is-one-third-desktop {
flex: none;
width: 33.3333%; }
.column.is-one-quarter-desktop {
flex: none;
width: 25%; }
.column.is-one-fifth-desktop {
flex: none;
width: 20%; }
.column.is-two-fifths-desktop {
flex: none;
width: 40%; }
.column.is-three-fifths-desktop {
flex: none;
width: 60%; }
.column.is-four-fifths-desktop {
flex: none;
width: 80%; }
.column.is-offset-three-quarters-desktop {
margin-left: 75%; }
.column.is-offset-two-thirds-desktop {
margin-left: 66.6666%; }
.column.is-offset-half-desktop {
margin-left: 50%; }
.column.is-offset-one-third-desktop {
margin-left: 33.3333%; }
.column.is-offset-one-quarter-desktop {
margin-left: 25%; }
.column.is-offset-one-fifth-desktop {
margin-left: 20%; }
.column.is-offset-two-fifths-desktop {
margin-left: 40%; }
.column.is-offset-three-fifths-desktop {
margin-left: 60%; }
.column.is-offset-four-fifths-desktop {
margin-left: 80%; }
.column.is-1-desktop {
flex: none;
width: 8.33333%; }
.column.is-offset-1-desktop {
margin-left: 8.33333%; }
.column.is-2-desktop {
flex: none;
width: 16.66667%; }
.column.is-offset-2-desktop {
margin-left: 16.66667%; }
.column.is-3-desktop {
flex: none;
width: 25%; }
.column.is-offset-3-desktop {
margin-left: 25%; }
.column.is-4-desktop {
flex: none;
width: 33.33333%; }
.column.is-offset-4-desktop {
margin-left: 33.33333%; }
.column.is-5-desktop {
flex: none;
width: 41.66667%; }
.column.is-offset-5-desktop {
margin-left: 41.66667%; }
.column.is-6-desktop {
flex: none;
width: 50%; }
.column.is-offset-6-desktop {
margin-left: 50%; }
.column.is-7-desktop {
flex: none;
width: 58.33333%; }
.column.is-offset-7-desktop {
margin-left: 58.33333%; }
.column.is-8-desktop {
flex: none;
width: 66.66667%; }
.column.is-offset-8-desktop {
margin-left: 66.66667%; }
.column.is-9-desktop {
flex: none;
width: 75%; }
.column.is-offset-9-desktop {
margin-left: 75%; }
.column.is-10-desktop {
flex: none;
width: 83.33333%; }
.column.is-offset-10-desktop {
margin-left: 83.33333%; }
.column.is-11-desktop {
flex: none;
width: 91.66667%; }
.column.is-offset-11-desktop {
margin-left: 91.66667%; }
.column.is-12-desktop {
flex: none;
width: 100%; }
.column.is-offset-12-desktop {
margin-left: 100%; } }
@media screen and (min-width: 1280px) {
.column.is-narrow-widescreen {
flex: none; }
.column.is-full-widescreen {
flex: none;
width: 100%; }
.column.is-three-quarters-widescreen {
flex: none;
width: 75%; }
.column.is-two-thirds-widescreen {
flex: none;
width: 66.6666%; }
.column.is-half-widescreen {
flex: none;
width: 50%; }
.column.is-one-third-widescreen {
flex: none;
width: 33.3333%; }
.column.is-one-quarter-widescreen {
flex: none;
width: 25%; }
.column.is-one-fifth-widescreen {
flex: none;
width: 20%; }
.column.is-two-fifths-widescreen {
flex: none;
width: 40%; }
.column.is-three-fifths-widescreen {
flex: none;
width: 60%; }
.column.is-four-fifths-widescreen {
flex: none;
width: 80%; }
.column.is-offset-three-quarters-widescreen {
margin-left: 75%; }
.column.is-offset-two-thirds-widescreen {
margin-left: 66.6666%; }
.column.is-offset-half-widescreen {
margin-left: 50%; }
.column.is-offset-one-third-widescreen {
margin-left: 33.3333%; }
.column.is-offset-one-quarter-widescreen {
margin-left: 25%; }
.column.is-offset-one-fifth-widescreen {
margin-left: 20%; }
.column.is-offset-two-fifths-widescreen {
margin-left: 40%; }
.column.is-offset-three-fifths-widescreen {
margin-left: 60%; }
.column.is-offset-four-fifths-widescreen {
margin-left: 80%; }
.column.is-1-widescreen {
flex: none;
width: 8.33333%; }
.column.is-offset-1-widescreen {
margin-left: 8.33333%; }
.column.is-2-widescreen {
flex: none;
width: 16.66667%; }
.column.is-offset-2-widescreen {
margin-left: 16.66667%; }
.column.is-3-widescreen {
flex: none;
width: 25%; }
.column.is-offset-3-widescreen {
margin-left: 25%; }
.column.is-4-widescreen {
flex: none;
width: 33.33333%; }
.column.is-offset-4-widescreen {
margin-left: 33.33333%; }
.column.is-5-widescreen {
flex: none;
width: 41.66667%; }
.column.is-offset-5-widescreen {
margin-left: 41.66667%; }
.column.is-6-widescreen {
flex: none;
width: 50%; }
.column.is-offset-6-widescreen {
margin-left: 50%; }
.column.is-7-widescreen {
flex: none;
width: 58.33333%; }
.column.is-offset-7-widescreen {
margin-left: 58.33333%; }
.column.is-8-widescreen {
flex: none;
width: 66.66667%; }
.column.is-offset-8-widescreen {
margin-left: 66.66667%; }
.column.is-9-widescreen {
flex: none;
width: 75%; }
.column.is-offset-9-widescreen {
margin-left: 75%; }
.column.is-10-widescreen {
flex: none;
width: 83.33333%; }
.column.is-offset-10-widescreen {
margin-left: 83.33333%; }
.column.is-11-widescreen {
flex: none;
width: 91.66667%; }
.column.is-offset-11-widescreen {
margin-left: 91.66667%; }
.column.is-12-widescreen {
flex: none;
width: 100%; }
.column.is-offset-12-widescreen {
margin-left: 100%; } }
@media screen and (min-width: 1472px) {
.column.is-narrow-fullhd {
flex: none; }
.column.is-full-fullhd {
flex: none;
width: 100%; }
.column.is-three-quarters-fullhd {
flex: none;
width: 75%; }
.column.is-two-thirds-fullhd {
flex: none;
width: 66.6666%; }
.column.is-half-fullhd {
flex: none;
width: 50%; }
.column.is-one-third-fullhd {
flex: none;
width: 33.3333%; }
.column.is-one-quarter-fullhd {
flex: none;
width: 25%; }
.column.is-one-fifth-fullhd {
flex: none;
width: 20%; }
.column.is-two-fifths-fullhd {
flex: none;
width: 40%; }
.column.is-three-fifths-fullhd {
flex: none;
width: 60%; }
.column.is-four-fifths-fullhd {
flex: none;
width: 80%; }
.column.is-offset-three-quarters-fullhd {
margin-left: 75%; }
.column.is-offset-two-thirds-fullhd {
margin-left: 66.6666%; }
.column.is-offset-half-fullhd {
margin-left: 50%; }
.column.is-offset-one-third-fullhd {
margin-left: 33.3333%; }
.column.is-offset-one-quarter-fullhd {
margin-left: 25%; }
.column.is-offset-one-fifth-fullhd {
margin-left: 20%; }
.column.is-offset-two-fifths-fullhd {
margin-left: 40%; }
.column.is-offset-three-fifths-fullhd {
margin-left: 60%; }
.column.is-offset-four-fifths-fullhd {
margin-left: 80%; }
.column.is-1-fullhd {
flex: none;
width: 8.33333%; }
.column.is-offset-1-fullhd {
margin-left: 8.33333%; }
.column.is-2-fullhd {
flex: none;
width: 16.66667%; }
.column.is-offset-2-fullhd {
margin-left: 16.66667%; }
.column.is-3-fullhd {
flex: none;
width: 25%; }
.column.is-offset-3-fullhd {
margin-left: 25%; }
.column.is-4-fullhd {
flex: none;
width: 33.33333%; }
.column.is-offset-4-fullhd {
margin-left: 33.33333%; }
.column.is-5-fullhd {
flex: none;
width: 41.66667%; }
.column.is-offset-5-fullhd {
margin-left: 41.66667%; }
.column.is-6-fullhd {
flex: none;
width: 50%; }
.column.is-offset-6-fullhd {
margin-left: 50%; }
.column.is-7-fullhd {
flex: none;
width: 58.33333%; }
.column.is-offset-7-fullhd {
margin-left: 58.33333%; }
.column.is-8-fullhd {
flex: none;
width: 66.66667%; }
.column.is-offset-8-fullhd {
margin-left: 66.66667%; }
.column.is-9-fullhd {
flex: none;
width: 75%; }
.column.is-offset-9-fullhd {
margin-left: 75%; }
.column.is-10-fullhd {
flex: none;
width: 83.33333%; }
.column.is-offset-10-fullhd {
margin-left: 83.33333%; }
.column.is-11-fullhd {
flex: none;
width: 91.66667%; }
.column.is-offset-11-fullhd {
margin-left: 91.66667%; }
.column.is-12-fullhd {
flex: none;
width: 100%; }
.column.is-offset-12-fullhd {
margin-left: 100%; } }
.columns {
margin-left: -0.75rem;
margin-right: -0.75rem;
margin-top: -0.75rem; }
.columns:last-child {
margin-bottom: -0.75rem; }
.columns:not(:last-child) {
margin-bottom: calc(1.5rem - 0.75rem); }
.columns.is-centered {
justify-content: center; }
.columns.is-gapless {
margin-left: 0;
margin-right: 0;
margin-top: 0; }
.columns.is-gapless > .column {
margin: 0;
padding: 0 !important; }
.columns.is-gapless:not(:last-child) {
margin-bottom: 1.5rem; }
.columns.is-gapless:last-child {
margin-bottom: 0; }
.columns.is-mobile {
display: flex; }
.columns.is-multiline {
flex-wrap: wrap; }
.columns.is-vcentered {
align-items: center; }
@media screen and (min-width: 769px), print {
.columns:not(.is-desktop) {
display: flex; } }
@media screen and (min-width: 1088px) {
.columns.is-desktop {
display: flex; } }
.columns.is-variable {
--columnGap: 0.75rem;
margin-left: calc(-1 * var(--columnGap));
margin-right: calc(-1 * var(--columnGap)); }
.columns.is-variable .column {
padding-left: var(--columnGap);
padding-right: var(--columnGap); }
.columns.is-variable.is-0 {
--columnGap: 0rem; }
@media screen and (max-width: 768px) {
.columns.is-variable.is-0-mobile {
--columnGap: 0rem; } }
@media screen and (min-width: 769px), print {
.columns.is-variable.is-0-tablet {
--columnGap: 0rem; } }
@media screen and (min-width: 769px) and (max-width: 1087px) {
.columns.is-variable.is-0-tablet-only {
--columnGap: 0rem; } }
@media screen and (max-width: 1087px) {
.columns.is-variable.is-0-touch {
--columnGap: 0rem; } }
@media screen and (min-width: 1088px) {
.columns.is-variable.is-0-desktop {
--columnGap: 0rem; } }
@media screen and (min-width: 1088px) and (max-width: 1279px) {
.columns.is-variable.is-0-desktop-only {
--columnGap: 0rem; } }
@media screen and (min-width: 1280px) {
.columns.is-variable.is-0-widescreen {
--columnGap: 0rem; } }
@media screen and (min-width: 1280px) and (max-width: 1471px) {
.columns.is-variable.is-0-widescreen-only {
--columnGap: 0rem; } }
@media screen and (min-width: 1472px) {
.columns.is-variable.is-0-fullhd {
--columnGap: 0rem; } }
.columns.is-variable.is-1 {
--columnGap: 0.25rem; }
@media screen and (max-width: 768px) {
.columns.is-variable.is-1-mobile {
--columnGap: 0.25rem; } }
@media screen and (min-width: 769px), print {
.columns.is-variable.is-1-tablet {
--columnGap: 0.25rem; } }
@media screen and (min-width: 769px) and (max-width: 1087px) {
.columns.is-variable.is-1-tablet-only {
--columnGap: 0.25rem; } }
@media screen and (max-width: 1087px) {
.columns.is-variable.is-1-touch {
--columnGap: 0.25rem; } }
@media screen and (min-width: 1088px) {
.columns.is-variable.is-1-desktop {
--columnGap: 0.25rem; } }
@media screen and (min-width: 1088px) and (max-width: 1279px) {
.columns.is-variable.is-1-desktop-only {
--columnGap: 0.25rem; } }
@media screen and (min-width: 1280px) {
.columns.is-variable.is-1-widescreen {
--columnGap: 0.25rem; } }
@media screen and (min-width: 1280px) and (max-width: 1471px) {
.columns.is-variable.is-1-widescreen-only {
--columnGap: 0.25rem; } }
@media screen and (min-width: 1472px) {
.columns.is-variable.is-1-fullhd {
--columnGap: 0.25rem; } }
.columns.is-variable.is-2 {
--columnGap: 0.5rem; }
@media screen and (max-width: 768px) {
.columns.is-variable.is-2-mobile {
--columnGap: 0.5rem; } }
@media screen and (min-width: 769px), print {
.columns.is-variable.is-2-tablet {
--columnGap: 0.5rem; } }
@media screen and (min-width: 769px) and (max-width: 1087px) {
.columns.is-variable.is-2-tablet-only {
--columnGap: 0.5rem; } }
@media screen and (max-width: 1087px) {
.columns.is-variable.is-2-touch {
--columnGap: 0.5rem; } }
@media screen and (min-width: 1088px) {
.columns.is-variable.is-2-desktop {
--columnGap: 0.5rem; } }
@media screen and (min-width: 1088px) and (max-width: 1279px) {
.columns.is-variable.is-2-desktop-only {
--columnGap: 0.5rem; } }
@media screen and (min-width: 1280px) {
.columns.is-variable.is-2-widescreen {
--columnGap: 0.5rem; } }
@media screen and (min-width: 1280px) and (max-width: 1471px) {
.columns.is-variable.is-2-widescreen-only {
--columnGap: 0.5rem; } }
@media screen and (min-width: 1472px) {
.columns.is-variable.is-2-fullhd {
--columnGap: 0.5rem; } }
.columns.is-variable.is-3 {
--columnGap: 0.75rem; }
@media screen and (max-width: 768px) {
.columns.is-variable.is-3-mobile {
--columnGap: 0.75rem; } }
@media screen and (min-width: 769px), print {
.columns.is-variable.is-3-tablet {
--columnGap: 0.75rem; } }
@media screen and (min-width: 769px) and (max-width: 1087px) {
.columns.is-variable.is-3-tablet-only {
--columnGap: 0.75rem; } }
@media screen and (max-width: 1087px) {
.columns.is-variable.is-3-touch {
--columnGap: 0.75rem; } }
@media screen and (min-width: 1088px) {
.columns.is-variable.is-3-desktop {
--columnGap: 0.75rem; } }
@media screen and (min-width: 1088px) and (max-width: 1279px) {
.columns.is-variable.is-3-desktop-only {
--columnGap: 0.75rem; } }
@media screen and (min-width: 1280px) {
.columns.is-variable.is-3-widescreen {
--columnGap: 0.75rem; } }
@media screen and (min-width: 1280px) and (max-width: 1471px) {
.columns.is-variable.is-3-widescreen-only {
--columnGap: 0.75rem; } }
@media screen and (min-width: 1472px) {
.columns.is-variable.is-3-fullhd {
--columnGap: 0.75rem; } }
.columns.is-variable.is-4 {
--columnGap: 1rem; }
@media screen and (max-width: 768px) {
.columns.is-variable.is-4-mobile {
--columnGap: 1rem; } }
@media screen and (min-width: 769px), print {
.columns.is-variable.is-4-tablet {
--columnGap: 1rem; } }
@media screen and (min-width: 769px) and (max-width: 1087px) {
.columns.is-variable.is-4-tablet-only {
--columnGap: 1rem; } }
@media screen and (max-width: 1087px) {
.columns.is-variable.is-4-touch {
--columnGap: 1rem; } }
@media screen and (min-width: 1088px) {
.columns.is-variable.is-4-desktop {
--columnGap: 1rem; } }
@media screen and (min-width: 1088px) and (max-width: 1279px) {
.columns.is-variable.is-4-desktop-only {
--columnGap: 1rem; } }
@media screen and (min-width: 1280px) {
.columns.is-variable.is-4-widescreen {
--columnGap: 1rem; } }
@media screen and (min-width: 1280px) and (max-width: 1471px) {
.columns.is-variable.is-4-widescreen-only {
--columnGap: 1rem; } }
@media screen and (min-width: 1472px) {
.columns.is-variable.is-4-fullhd {
--columnGap: 1rem; } }
.columns.is-variable.is-5 {
--columnGap: 1.25rem; }
@media screen and (max-width: 768px) {
.columns.is-variable.is-5-mobile {
--columnGap: 1.25rem; } }
@media screen and (min-width: 769px), print {
.columns.is-variable.is-5-tablet {
--columnGap: 1.25rem; } }
@media screen and (min-width: 769px) and (max-width: 1087px) {
.columns.is-variable.is-5-tablet-only {
--columnGap: 1.25rem; } }
@media screen and (max-width: 1087px) {
.columns.is-variable.is-5-touch {
--columnGap: 1.25rem; } }
@media screen and (min-width: 1088px) {
.columns.is-variable.is-5-desktop {
--columnGap: 1.25rem; } }
@media screen and (min-width: 1088px) and (max-width: 1279px) {
.columns.is-variable.is-5-desktop-only {
--columnGap: 1.25rem; } }
@media screen and (min-width: 1280px) {
.columns.is-variable.is-5-widescreen {
--columnGap: 1.25rem; } }
@media screen and (min-width: 1280px) and (max-width: 1471px) {
.columns.is-variable.is-5-widescreen-only {
--columnGap: 1.25rem; } }
@media screen and (min-width: 1472px) {
.columns.is-variable.is-5-fullhd {
--columnGap: 1.25rem; } }
.columns.is-variable.is-6 {
--columnGap: 1.5rem; }
@media screen and (max-width: 768px) {
.columns.is-variable.is-6-mobile {
--columnGap: 1.5rem; } }
@media screen and (min-width: 769px), print {
.columns.is-variable.is-6-tablet {
--columnGap: 1.5rem; } }
@media screen and (min-width: 769px) and (max-width: 1087px) {
.columns.is-variable.is-6-tablet-only {
--columnGap: 1.5rem; } }
@media screen and (max-width: 1087px) {
.columns.is-variable.is-6-touch {
--columnGap: 1.5rem; } }
@media screen and (min-width: 1088px) {
.columns.is-variable.is-6-desktop {
--columnGap: 1.5rem; } }
@media screen and (min-width: 1088px) and (max-width: 1279px) {
.columns.is-variable.is-6-desktop-only {
--columnGap: 1.5rem; } }
@media screen and (min-width: 1280px) {
.columns.is-variable.is-6-widescreen {
--columnGap: 1.5rem; } }
@media screen and (min-width: 1280px) and (max-width: 1471px) {
.columns.is-variable.is-6-widescreen-only {
--columnGap: 1.5rem; } }
@media screen and (min-width: 1472px) {
.columns.is-variable.is-6-fullhd {
--columnGap: 1.5rem; } }
.columns.is-variable.is-7 {
--columnGap: 1.75rem; }
@media screen and (max-width: 768px) {
.columns.is-variable.is-7-mobile {
--columnGap: 1.75rem; } }
@media screen and (min-width: 769px), print {
.columns.is-variable.is-7-tablet {
--columnGap: 1.75rem; } }
@media screen and (min-width: 769px) and (max-width: 1087px) {
.columns.is-variable.is-7-tablet-only {
--columnGap: 1.75rem; } }
@media screen and (max-width: 1087px) {
.columns.is-variable.is-7-touch {
--columnGap: 1.75rem; } }
@media screen and (min-width: 1088px) {
.columns.is-variable.is-7-desktop {
--columnGap: 1.75rem; } }
@media screen and (min-width: 1088px) and (max-width: 1279px) {
.columns.is-variable.is-7-desktop-only {
--columnGap: 1.75rem; } }
@media screen and (min-width: 1280px) {
.columns.is-variable.is-7-widescreen {
--columnGap: 1.75rem; } }
@media screen and (min-width: 1280px) and (max-width: 1471px) {
.columns.is-variable.is-7-widescreen-only {
--columnGap: 1.75rem; } }
@media screen and (min-width: 1472px) {
.columns.is-variable.is-7-fullhd {
--columnGap: 1.75rem; } }
.columns.is-variable.is-8 {
--columnGap: 2rem; }
@media screen and (max-width: 768px) {
.columns.is-variable.is-8-mobile {
--columnGap: 2rem; } }
@media screen and (min-width: 769px), print {
.columns.is-variable.is-8-tablet {
--columnGap: 2rem; } }
@media screen and (min-width: 769px) and (max-width: 1087px) {
.columns.is-variable.is-8-tablet-only {
--columnGap: 2rem; } }
@media screen and (max-width: 1087px) {
.columns.is-variable.is-8-touch {
--columnGap: 2rem; } }
@media screen and (min-width: 1088px) {
.columns.is-variable.is-8-desktop {
--columnGap: 2rem; } }
@media screen and (min-width: 1088px) and (max-width: 1279px) {
.columns.is-variable.is-8-desktop-only {
--columnGap: 2rem; } }
@media screen and (min-width: 1280px) {
.columns.is-variable.is-8-widescreen {
--columnGap: 2rem; } }
@media screen and (min-width: 1280px) and (max-width: 1471px) {
.columns.is-variable.is-8-widescreen-only {
--columnGap: 2rem; } }
@media screen and (min-width: 1472px) {
.columns.is-variable.is-8-fullhd {
--columnGap: 2rem; } }
.tile {
align-items: stretch;
display: block;
flex-basis: 0;
flex-grow: 1;
flex-shrink: 1;
min-height: min-content; }
.tile.is-ancestor {
margin-left: -0.75rem;
margin-right: -0.75rem;
margin-top: -0.75rem; }
.tile.is-ancestor:last-child {
margin-bottom: -0.75rem; }
.tile.is-ancestor:not(:last-child) {
margin-bottom: 0.75rem; }
.tile.is-child {
margin: 0 !important; }
.tile.is-parent {
padding: 0.75rem; }
.tile.is-vertical {
flex-direction: column; }
.tile.is-vertical > .tile.is-child:not(:last-child) {
margin-bottom: 1.5rem !important; }
@media screen and (min-width: 769px), print {
.tile:not(.is-child) {
display: flex; }
.tile.is-1 {
flex: none;
width: 8.33333%; }
.tile.is-2 {
flex: none;
width: 16.66667%; }
.tile.is-3 {
flex: none;
width: 25%; }
.tile.is-4 {
flex: none;
width: 33.33333%; }
.tile.is-5 {
flex: none;
width: 41.66667%; }
.tile.is-6 {
flex: none;
width: 50%; }
.tile.is-7 {
flex: none;
width: 58.33333%; }
.tile.is-8 {
flex: none;
width: 66.66667%; }
.tile.is-9 {
flex: none;
width: 75%; }
.tile.is-10 {
flex: none;
width: 83.33333%; }
.tile.is-11 {
flex: none;
width: 91.66667%; }
.tile.is-12 {
flex: none;
width: 100%; } }
.hero {
align-items: stretch;
display: flex;
flex-direction: column;
justify-content: space-between; }
.hero .navbar {
background: none; }
.hero .tabs ul {
border-bottom: none; }
.hero.is-white {
background-color: white;
color: #0a0a0a; }
.hero.is-white a:not(.button):not(.dropdown-item):not(.tag),
.hero.is-white strong {
color: inherit; }
.hero.is-white .title {
color: #0a0a0a; }
.hero.is-white .subtitle {
color: rgba(10, 10, 10, 0.9); }
.hero.is-white .subtitle a:not(.button),
.hero.is-white .subtitle strong {
color: #0a0a0a; }
@media screen and (max-width: 1087px) {
.hero.is-white .navbar-menu {
background-color: white; } }
.hero.is-white .navbar-item,
.hero.is-white .navbar-link {
color: rgba(10, 10, 10, 0.7); }
.hero.is-white a.navbar-item:hover, .hero.is-white a.navbar-item.is-active,
.hero.is-white .navbar-link:hover,
.hero.is-white .navbar-link.is-active {
background-color: #f2f2f2;
color: #0a0a0a; }
.hero.is-white .tabs a {
color: #0a0a0a;
opacity: 0.9; }
.hero.is-white .tabs a:hover {
opacity: 1; }
.hero.is-white .tabs li.is-active a {
opacity: 1; }
.hero.is-white .tabs.is-boxed a, .hero.is-white .tabs.is-toggle a {
color: #0a0a0a; }
.hero.is-white .tabs.is-boxed a:hover, .hero.is-white .tabs.is-toggle a:hover {
background-color: rgba(10, 10, 10, 0.1); }
.hero.is-white .tabs.is-boxed li.is-active a, .hero.is-white .tabs.is-boxed li.is-active a:hover, .hero.is-white .tabs.is-toggle li.is-active a, .hero.is-white .tabs.is-toggle li.is-active a:hover {
background-color: #0a0a0a;
border-color: #0a0a0a;
color: white; }
.hero.is-white.is-bold {
background-image: linear-gradient(141deg, #e6e6e6 0%, white 71%, white 100%); }
@media screen and (max-width: 768px) {
.hero.is-white.is-bold .navbar-menu {
background-image: linear-gradient(141deg, #e6e6e6 0%, white 71%, white 100%); } }
.hero.is-black {
background-color: #0a0a0a;
color: white; }
.hero.is-black a:not(.button):not(.dropdown-item):not(.tag),
.hero.is-black strong {
color: inherit; }
.hero.is-black .title {
color: white; }
.hero.is-black .subtitle {
color: rgba(255, 255, 255, 0.9); }
.hero.is-black .subtitle a:not(.button),
.hero.is-black .subtitle strong {
color: white; }
@media screen and (max-width: 1087px) {
.hero.is-black .navbar-menu {
background-color: #0a0a0a; } }
.hero.is-black .navbar-item,
.hero.is-black .navbar-link {
color: rgba(255, 255, 255, 0.7); }
.hero.is-black a.navbar-item:hover, .hero.is-black a.navbar-item.is-active,
.hero.is-black .navbar-link:hover,
.hero.is-black .navbar-link.is-active {
background-color: black;
color: white; }
.hero.is-black .tabs a {
color: white;
opacity: 0.9; }
.hero.is-black .tabs a:hover {
opacity: 1; }
.hero.is-black .tabs li.is-active a {
opacity: 1; }
.hero.is-black .tabs.is-boxed a, .hero.is-black .tabs.is-toggle a {
color: white; }
.hero.is-black .tabs.is-boxed a:hover, .hero.is-black .tabs.is-toggle a:hover {
background-color: rgba(10, 10, 10, 0.1); }
.hero.is-black .tabs.is-boxed li.is-active a, .hero.is-black .tabs.is-boxed li.is-active a:hover, .hero.is-black .tabs.is-toggle li.is-active a, .hero.is-black .tabs.is-toggle li.is-active a:hover {
background-color: white;
border-color: white;
color: #0a0a0a; }
.hero.is-black.is-bold {
background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); }
@media screen and (max-width: 768px) {
.hero.is-black.is-bold .navbar-menu {
background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } }
.hero.is-light {
background-color: whitesmoke;
color: #363636; }
.hero.is-light a:not(.button):not(.dropdown-item):not(.tag),
.hero.is-light strong {
color: inherit; }
.hero.is-light .title {
color: #363636; }
.hero.is-light .subtitle {
color: rgba(54, 54, 54, 0.9); }
.hero.is-light .subtitle a:not(.button),
.hero.is-light .subtitle strong {
color: #363636; }
@media screen and (max-width: 1087px) {
.hero.is-light .navbar-menu {
background-color: whitesmoke; } }
.hero.is-light .navbar-item,
.hero.is-light .navbar-link {
color: rgba(54, 54, 54, 0.7); }
.hero.is-light a.navbar-item:hover, .hero.is-light a.navbar-item.is-active,
.hero.is-light .navbar-link:hover,
.hero.is-light .navbar-link.is-active {
background-color: #e8e8e8;
color: #363636; }
.hero.is-light .tabs a {
color: #363636;
opacity: 0.9; }
.hero.is-light .tabs a:hover {
opacity: 1; }
.hero.is-light .tabs li.is-active a {
opacity: 1; }
.hero.is-light .tabs.is-boxed a, .hero.is-light .tabs.is-toggle a {
color: #363636; }
.hero.is-light .tabs.is-boxed a:hover, .hero.is-light .tabs.is-toggle a:hover {
background-color: rgba(10, 10, 10, 0.1); }
.hero.is-light .tabs.is-boxed li.is-active a, .hero.is-light .tabs.is-boxed li.is-active a:hover, .hero.is-light .tabs.is-toggle li.is-active a, .hero.is-light .tabs.is-toggle li.is-active a:hover {
background-color: #363636;
border-color: #363636;
color: whitesmoke; }
.hero.is-light.is-bold {
background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); }
@media screen and (max-width: 768px) {
.hero.is-light.is-bold .navbar-menu {
background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); } }
.hero.is-dark {
background-color: #363636;
color: whitesmoke; }
.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag),
.hero.is-dark strong {
color: inherit; }
.hero.is-dark .title {
color: whitesmoke; }
.hero.is-dark .subtitle {
color: rgba(245, 245, 245, 0.9); }
.hero.is-dark .subtitle a:not(.button),
.hero.is-dark .subtitle strong {
color: whitesmoke; }
@media screen and (max-width: 1087px) {
.hero.is-dark .navbar-menu {
background-color: #363636; } }
.hero.is-dark .navbar-item,
.hero.is-dark .navbar-link {
color: rgba(245, 245, 245, 0.7); }
.hero.is-dark a.navbar-item:hover, .hero.is-dark a.navbar-item.is-active,
.hero.is-dark .navbar-link:hover,
.hero.is-dark .navbar-link.is-active {
background-color: #292929;
color: whitesmoke; }
.hero.is-dark .tabs a {
color: whitesmoke;
opacity: 0.9; }
.hero.is-dark .tabs a:hover {
opacity: 1; }
.hero.is-dark .tabs li.is-active a {
opacity: 1; }
.hero.is-dark .tabs.is-boxed a, .hero.is-dark .tabs.is-toggle a {
color: whitesmoke; }
.hero.is-dark .tabs.is-boxed a:hover, .hero.is-dark .tabs.is-toggle a:hover {
background-color: rgba(10, 10, 10, 0.1); }
.hero.is-dark .tabs.is-boxed li.is-active a, .hero.is-dark .tabs.is-boxed li.is-active a:hover, .hero.is-dark .tabs.is-toggle li.is-active a, .hero.is-dark .tabs.is-toggle li.is-active a:hover {
background-color: whitesmoke;
border-color: whitesmoke;
color: #363636; }
.hero.is-dark.is-bold {
background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); }
@media screen and (max-width: 768px) {
.hero.is-dark.is-bold .navbar-menu {
background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); } }
.hero.is-primary {
background-color: #00d1b2;
color: #fff; }
.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag),
.hero.is-primary strong {
color: inherit; }
.hero.is-primary .title {
color: #fff; }
.hero.is-primary .subtitle {
color: rgba(255, 255, 255, 0.9); }
.hero.is-primary .subtitle a:not(.button),
.hero.is-primary .subtitle strong {
color: #fff; }
@media screen and (max-width: 1087px) {
.hero.is-primary .navbar-menu {
background-color: #00d1b2; } }
.hero.is-primary .navbar-item,
.hero.is-primary .navbar-link {
color: rgba(255, 255, 255, 0.7); }
.hero.is-primary a.navbar-item:hover, .hero.is-primary a.navbar-item.is-active,
.hero.is-primary .navbar-link:hover,
.hero.is-primary .navbar-link.is-active {
background-color: #00b89c;
color: #fff; }
.hero.is-primary .tabs a {
color: #fff;
opacity: 0.9; }
.hero.is-primary .tabs a:hover {
opacity: 1; }
.hero.is-primary .tabs li.is-active a {
opacity: 1; }
.hero.is-primary .tabs.is-boxed a, .hero.is-primary .tabs.is-toggle a {
color: #fff; }
.hero.is-primary .tabs.is-boxed a:hover, .hero.is-primary .tabs.is-toggle a:hover {
background-color: rgba(10, 10, 10, 0.1); }
.hero.is-primary .tabs.is-boxed li.is-active a, .hero.is-primary .tabs.is-boxed li.is-active a:hover, .hero.is-primary .tabs.is-toggle li.is-active a, .hero.is-primary .tabs.is-toggle li.is-active a:hover {
background-color: #fff;
border-color: #fff;
color: #00d1b2; }
.hero.is-primary.is-bold {
background-image: linear-gradient(141deg, #009e6c 0%, #00d1b2 71%, #00e7eb 100%); }
@media screen and (max-width: 768px) {
.hero.is-primary.is-bold .navbar-menu {
background-image: linear-gradient(141deg, #009e6c 0%, #00d1b2 71%, #00e7eb 100%); } }
.hero.is-link {
background-color: #3273dc;
color: #fff; }
.hero.is-link a:not(.button):not(.dropdown-item):not(.tag),
.hero.is-link strong {
color: inherit; }
.hero.is-link .title {
color: #fff; }
.hero.is-link .subtitle {
color: rgba(255, 255, 255, 0.9); }
.hero.is-link .subtitle a:not(.button),
.hero.is-link .subtitle strong {
color: #fff; }
@media screen and (max-width: 1087px) {
.hero.is-link .navbar-menu {
background-color: #3273dc; } }
.hero.is-link .navbar-item,
.hero.is-link .navbar-link {
color: rgba(255, 255, 255, 0.7); }
.hero.is-link a.navbar-item:hover, .hero.is-link a.navbar-item.is-active,
.hero.is-link .navbar-link:hover,
.hero.is-link .navbar-link.is-active {
background-color: #2366d1;
color: #fff; }
.hero.is-link .tabs a {
color: #fff;
opacity: 0.9; }
.hero.is-link .tabs a:hover {
opacity: 1; }
.hero.is-link .tabs li.is-active a {
opacity: 1; }
.hero.is-link .tabs.is-boxed a, .hero.is-link .tabs.is-toggle a {
color: #fff; }
.hero.is-link .tabs.is-boxed a:hover, .hero.is-link .tabs.is-toggle a:hover {
background-color: rgba(10, 10, 10, 0.1); }
.hero.is-link .tabs.is-boxed li.is-active a, .hero.is-link .tabs.is-boxed li.is-active a:hover, .hero.is-link .tabs.is-toggle li.is-active a, .hero.is-link .tabs.is-toggle li.is-active a:hover {
background-color: #fff;
border-color: #fff;
color: #3273dc; }
.hero.is-link.is-bold {
background-image: linear-gradient(141deg, #1577c6 0%, #3273dc 71%, #4366e5 100%); }
@media screen and (max-width: 768px) {
.hero.is-link.is-bold .navbar-menu {
background-image: linear-gradient(141deg, #1577c6 0%, #3273dc 71%, #4366e5 100%); } }
.hero.is-info {
background-color: #209cee;
color: #fff; }
.hero.is-info a:not(.button):not(.dropdown-item):not(.tag),
.hero.is-info strong {
color: inherit; }
.hero.is-info .title {
color: #fff; }
.hero.is-info .subtitle {
color: rgba(255, 255, 255, 0.9); }
.hero.is-info .subtitle a:not(.button),
.hero.is-info .subtitle strong {
color: #fff; }
@media screen and (max-width: 1087px) {
.hero.is-info .navbar-menu {
background-color: #209cee; } }
.hero.is-info .navbar-item,
.hero.is-info .navbar-link {
color: rgba(255, 255, 255, 0.7); }
.hero.is-info a.navbar-item:hover, .hero.is-info a.navbar-item.is-active,
.hero.is-info .navbar-link:hover,
.hero.is-info .navbar-link.is-active {
background-color: #118fe4;
color: #fff; }
.hero.is-info .tabs a {
color: #fff;
opacity: 0.9; }
.hero.is-info .tabs a:hover {
opacity: 1; }
.hero.is-info .tabs li.is-active a {
opacity: 1; }
.hero.is-info .tabs.is-boxed a, .hero.is-info .tabs.is-toggle a {
color: #fff; }
.hero.is-info .tabs.is-boxed a:hover, .hero.is-info .tabs.is-toggle a:hover {
background-color: rgba(10, 10, 10, 0.1); }
.hero.is-info .tabs.is-boxed li.is-active a, .hero.is-info .tabs.is-boxed li.is-active a:hover, .hero.is-info .tabs.is-toggle li.is-active a, .hero.is-info .tabs.is-toggle li.is-active a:hover {
background-color: #fff;
border-color: #fff;
color: #209cee; }
.hero.is-info.is-bold {
background-image: linear-gradient(141deg, #04a6d7 0%, #209cee 71%, #3287f5 100%); }
@media screen and (max-width: 768px) {
.hero.is-info.is-bold .navbar-menu {
background-image: linear-gradient(141deg, #04a6d7 0%, #209cee 71%, #3287f5 100%); } }
.hero.is-success {
background-color: #23d160;
color: #fff; }
.hero.is-success a:not(.button):not(.dropdown-item):not(.tag),
.hero.is-success strong {
color: inherit; }
.hero.is-success .title {
color: #fff; }
.hero.is-success .subtitle {
color: rgba(255, 255, 255, 0.9); }
.hero.is-success .subtitle a:not(.button),
.hero.is-success .subtitle strong {
color: #fff; }
@media screen and (max-width: 1087px) {
.hero.is-success .navbar-menu {
background-color: #23d160; } }
.hero.is-success .navbar-item,
.hero.is-success .navbar-link {
color: rgba(255, 255, 255, 0.7); }
.hero.is-success a.navbar-item:hover, .hero.is-success a.navbar-item.is-active,
.hero.is-success .navbar-link:hover,
.hero.is-success .navbar-link.is-active {
background-color: #20bc56;
color: #fff; }
.hero.is-success .tabs a {
color: #fff;
opacity: 0.9; }
.hero.is-success .tabs a:hover {
opacity: 1; }
.hero.is-success .tabs li.is-active a {
opacity: 1; }
.hero.is-success .tabs.is-boxed a, .hero.is-success .tabs.is-toggle a {
color: #fff; }
.hero.is-success .tabs.is-boxed a:hover, .hero.is-success .tabs.is-toggle a:hover {
background-color: rgba(10, 10, 10, 0.1); }
.hero.is-success .tabs.is-boxed li.is-active a, .hero.is-success .tabs.is-boxed li.is-active a:hover, .hero.is-success .tabs.is-toggle li.is-active a, .hero.is-success .tabs.is-toggle li.is-active a:hover {
background-color: #fff;
border-color: #fff;
color: #23d160; }
.hero.is-success.is-bold {
background-image: linear-gradient(141deg, #12af2f 0%, #23d160 71%, #2ce28a 100%); }
@media screen and (max-width: 768px) {
.hero.is-success.is-bold .navbar-menu {
background-image: linear-gradient(141deg, #12af2f 0%, #23d160 71%, #2ce28a 100%); } }
.hero.is-warning {
background-color: #ffdd57;
color: rgba(0, 0, 0, 0.7); }
.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag),
.hero.is-warning strong {
color: inherit; }
.hero.is-warning .title {
color: rgba(0, 0, 0, 0.7); }
.hero.is-warning .subtitle {
color: rgba(0, 0, 0, 0.9); }
.hero.is-warning .subtitle a:not(.button),
.hero.is-warning .subtitle strong {
color: rgba(0, 0, 0, 0.7); }
@media screen and (max-width: 1087px) {
.hero.is-warning .navbar-menu {
background-color: #ffdd57; } }
.hero.is-warning .navbar-item,
.hero.is-warning .navbar-link {
color: rgba(0, 0, 0, 0.7); }
.hero.is-warning a.navbar-item:hover, .hero.is-warning a.navbar-item.is-active,
.hero.is-warning .navbar-link:hover,
.hero.is-warning .navbar-link.is-active {
background-color: #ffd83d;
color: rgba(0, 0, 0, 0.7); }
.hero.is-warning .tabs a {
color: rgba(0, 0, 0, 0.7);
opacity: 0.9; }
.hero.is-warning .tabs a:hover {
opacity: 1; }
.hero.is-warning .tabs li.is-active a {
opacity: 1; }
.hero.is-warning .tabs.is-boxed a, .hero.is-warning .tabs.is-toggle a {
color: rgba(0, 0, 0, 0.7); }
.hero.is-warning .tabs.is-boxed a:hover, .hero.is-warning .tabs.is-toggle a:hover {
background-color: rgba(10, 10, 10, 0.1); }
.hero.is-warning .tabs.is-boxed li.is-active a, .hero.is-warning .tabs.is-boxed li.is-active a:hover, .hero.is-warning .tabs.is-toggle li.is-active a, .hero.is-warning .tabs.is-toggle li.is-active a:hover {
background-color: rgba(0, 0, 0, 0.7);
border-color: rgba(0, 0, 0, 0.7);
color: #ffdd57; }
.hero.is-warning.is-bold {
background-image: linear-gradient(141deg, #ffaf24 0%, #ffdd57 71%, #fffa70 100%); }
@media screen and (max-width: 768px) {
.hero.is-warning.is-bold .navbar-menu {
background-image: linear-gradient(141deg, #ffaf24 0%, #ffdd57 71%, #fffa70 100%); } }
.hero.is-danger {
background-color: #ff3860;
color: #fff; }
.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag),
.hero.is-danger strong {
color: inherit; }
.hero.is-danger .title {
color: #fff; }
.hero.is-danger .subtitle {
color: rgba(255, 255, 255, 0.9); }
.hero.is-danger .subtitle a:not(.button),
.hero.is-danger .subtitle strong {
color: #fff; }
@media screen and (max-width: 1087px) {
.hero.is-danger .navbar-menu {
background-color: #ff3860; } }
.hero.is-danger .navbar-item,
.hero.is-danger .navbar-link {
color: rgba(255, 255, 255, 0.7); }
.hero.is-danger a.navbar-item:hover, .hero.is-danger a.navbar-item.is-active,
.hero.is-danger .navbar-link:hover,
.hero.is-danger .navbar-link.is-active {
background-color: #ff1f4b;
color: #fff; }
.hero.is-danger .tabs a {
color: #fff;
opacity: 0.9; }
.hero.is-danger .tabs a:hover {
opacity: 1; }
.hero.is-danger .tabs li.is-active a {
opacity: 1; }
.hero.is-danger .tabs.is-boxed a, .hero.is-danger .tabs.is-toggle a {
color: #fff; }
.hero.is-danger .tabs.is-boxed a:hover, .hero.is-danger .tabs.is-toggle a:hover {
background-color: rgba(10, 10, 10, 0.1); }
.hero.is-danger .tabs.is-boxed li.is-active a, .hero.is-danger .tabs.is-boxed li.is-active a:hover, .hero.is-danger .tabs.is-toggle li.is-active a, .hero.is-danger .tabs.is-toggle li.is-active a:hover {
background-color: #fff;
border-color: #fff;
color: #ff3860; }
.hero.is-danger.is-bold {
background-image: linear-gradient(141deg, #ff0561 0%, #ff3860 71%, #ff5257 100%); }
@media screen and (max-width: 768px) {
.hero.is-danger.is-bold .navbar-menu {
background-image: linear-gradient(141deg, #ff0561 0%, #ff3860 71%, #ff5257 100%); } }
.hero.is-small .hero-body {
padding-bottom: 1.5rem;
padding-top: 1.5rem; }
@media screen and (min-width: 769px), print {
.hero.is-medium .hero-body {
padding-bottom: 9rem;
padding-top: 9rem; } }
@media screen and (min-width: 769px), print {
.hero.is-large .hero-body {
padding-bottom: 18rem;
padding-top: 18rem; } }
.hero.is-halfheight .hero-body, .hero.is-fullheight .hero-body, .hero.is-fullheight-with-navbar .hero-body {
align-items: center;
display: flex; }
.hero.is-halfheight .hero-body > .container, .hero.is-fullheight .hero-body > .container, .hero.is-fullheight-with-navbar .hero-body > .container {
flex-grow: 1;
flex-shrink: 1; }
.hero.is-halfheight {
min-height: 50vh; }
.hero.is-fullheight {
min-height: 100vh; }
.hero.is-fullheight-with-navbar {
min-height: calc(100vh - 3.25rem); }
.hero-video {
overflow: hidden; }
.hero-video video {
left: 50%;
min-height: 100%;
min-width: 100%;
position: absolute;
top: 50%;
transform: translate3d(-50%, -50%, 0); }
.hero-video.is-transparent {
opacity: 0.3; }
@media screen and (max-width: 768px) {
.hero-video {
display: none; } }
.hero-buttons {
margin-top: 1.5rem; }
@media screen and (max-width: 768px) {
.hero-buttons .button {
display: flex; }
.hero-buttons .button:not(:last-child) {
margin-bottom: 0.75rem; } }
@media screen and (min-width: 769px), print {
.hero-buttons {
display: flex;
justify-content: center; }
.hero-buttons .button:not(:last-child) {
margin-right: 1.5rem; } }
.hero-head,
.hero-foot {
flex-grow: 0;
flex-shrink: 0; }
.hero-body {
flex-grow: 1;
flex-shrink: 0;
padding: 3rem 1.5rem; }
.section {
padding: 3rem 1.5rem; }
@media screen and (min-width: 1088px) {
.section.is-medium {
padding: 9rem 1.5rem; }
.section.is-large {
padding: 18rem 1.5rem; } }
.footer {
background-color: #fafafa;
padding: 3rem 1.5rem 6rem; }

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,27 @@
{{define "base"}}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Orion</title>
<link rel="stylesheet" href="/css/server.css">
</head>
<body>
{{template "navbar" .}}
<section class="section">
<div class="container">
<div class="columns">
<div class="column is-3">
{{template "menu" .}}
</div>
<div class="column is-9">
{{block "page_content" .}}{{end}}
</div>
</div>
</div>
</section>
<script type="text/javascript" src="/server.js"></script>
</body>
</html>
{{end}}

View File

@ -0,0 +1,10 @@
{{define "menu"}}
<aside class="menu" data-controller="menu">
<p class="menu-label">
Gestion de la flotte
</p>
<ul class="menu-list">
<li><a href="/modules">Modules</a></li>
</ul>
</aside>
{{end}}

View File

@ -0,0 +1,10 @@
{{define "navbar"}}
<nav class="navbar is-info" role="navigation" aria-label="main navigation">
<div class="container">
<div class="navbar-brand">
<a class="navbar-item" href="/">
<b>Orion</b>
</a>
</div>
</nav>
{{end}}

View File

@ -0,0 +1,24 @@
{{define "page_content"}}
<div data-controller="modules">
<div class="level is-mobile">
<div class="level-left">
<h4 class="is-size-4 level-item">Modules à portée</h4>
</div>
<div class="level-right">
<button data-action="click->modules#onScanClick" class="button is-primary">Scanner</button>
</div>
</div>
<table class="table">
<thead>
<tr>
<th>SSID</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<tr></tr>
</tbody>
</table>
</div>
{{end}}
{{template "base" .}}

View File

@ -0,0 +1,90 @@
#!/bin/bash
function rpcLogin() {
local IP=$1
local PORT=$2
local USER="$3"
local PASS="$4"
local RES=""
local cmd="curl"
local url="http://${IP}:${PORT}/cgi-bin/luci/rpc/auth"
local opt="--silent --data"
local data="{ \"id\": 1, \"method\": \"login\", \"params\": [ \"$USER\", \"$PASS\" ] }"
res=$(${cmd} ${url} ${opt} "${data}")
echo ${res} | jq -Ma ".result"
}
function iwList()
{
local IP=$1
local PORT=$2
local IFACE=$3
local TOKEN="$4"
local cmd="curl"
local url="http://${IP}:${PORT}/cgi-bin/luci/rpc/sys"
local opt="--silent --cookie sysauth=${TOKEN} --data"
local data="{ \"method\": \"wifi.getiwinfo\", \"params\": [ \"${IFACE}\" ] }"
res=$(${cmd} ${url} ${opt} "${data}")
echo ${res} |jq
}
function netDeviceInfo()
{
local IP=$1
local PORT=$2
local TOKEN="$3"
local cmd="curl"
local url="http://${IP}:${PORT}/cgi-bin/luci/rpc/sys"
local opt="--silent --cookie sysauth=${TOKEN} --data"
local data="{ \"method\": \"net.deviceinfo\", \"params\": [ \"wlan0\" ]}"
res=$(${cmd} ${url} ${opt} "${data}")
echo ${res} |jq
}
function netDevices()
{
local IP=$1
local PORT=$2
local TOKEN="$3"
local cmd="curl"
local url="http://${IP}:${PORT}/cgi-bin/luci/rpc/sys"
local opt="--silent --cookie sysauth=${TOKEN} --data"
local data="{ \"method\": \"net.devices\", \"params\": [] }"
res=$(${cmd} ${url} ${opt} "${data}")
echo ${res} |jq
}
function arpTable()
{
local IP=$1
local PORT=$2
local TOKEN="$3"
local cmd="curl"
local url="http://${IP}:${PORT}/cgi-bin/luci/rpc/sys"
local opt="--silent --cookie sysauth=${TOKEN} --data"
local data="{ \"method\": \"net.arptable\", \"params\": [] }"
res=$(${cmd} ${url} ${opt} "${data}")
echo ${res} |jq
}
#FIXME USER PASS
authToken=$(rpcLogin 192.168.1.1 8080 root 'XXXXXX EDITE MOI')
#netDevices 192.168.1.1 8080 ${authToken}
#netDeviceInfo 192.168.1.1 8080 ${authToken}
#iwList 192.168.1.1 8080 wlan0 ${authToken}
#iwList 192.168.1.1 8080 wlan1 ${authToken}
adoles:

View File

@ -0,0 +1,38 @@
package main
import (
"bytes"
"fmt"
"log"
"os/exec"
)
func scanWifi(iface string) string {
command := "iwinfo"
opt := "scan"
var out bytes.Buffer
var stderr bytes.Buffer
fmt.Printf("Running %s command\n", command)
exe := exec.Command(command, iface, opt)
exe.Stdout = &out
exe.Stderr = &stderr
err := exe.Run()
if err != nil {
fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
log.Fatal(err)
}
return out.String()
}
func getCellInfo(iface string, ssidPrefix string) {
cells := scanWifi(iface)
fmt.Printf("%s\n", cells)
}
func main() {
getCellInfo("wlan1", "Base1")
}

View File

@ -0,0 +1,73 @@
#!/bin/bash
#
# Try to setup Kit !
#
function scanWifi() {
local iface=${1}
iwinfo ${iface} scan
return ${?}
}
function getWifiCell()
{
local iface=${1}
local ssidPrefix=${2}
res=$(scanWifi ${iface} | grep -B 1 "ESSID: \"${ssidPrefix}")
if [[ "${res}" == "Scanning not possible" ]] || [[ "${res}" == "" ]]
then
for try in $(seq 0 10)
do
sleep 5
res=$(scanWifi ${iface} | grep -B 1 "ESSID: \"${ssidPrefix}")
if [[ "${res}" == "Scanning not possible" ]] || [[ "${res}" == "" ]]
then
continue
else
echo ${res}
return 0
fi
done
echo "Error scanning wifi networks !"
return 2
else
echo ${res}
return 0
fi
}
function connectWifi() {
local iface=${1}
local ssidPrefix=${2}
local wpa=${3}
local cell=$(getWifiCell ${iface} ${ssidPrefix})
if [[ $? -ne 0 ]]
then
echo "Error on wifi scan !"
exit 12
fi
local ssid=$(echo ${cell} | awk '{print $7}' | sed -e 's/"//g')
local cellMAC=$(echo ${cell} | awk '{print $5}' | sed -e 's/"//g"')
set -x
uci delete wireless.@wifi-iface[1]
uci add wireless wifi-iface
uci set wireless.@wifi-iface[1].network="EmlidReach"
uci set wireless.@wifi-iface[1].ssid="${ssid}"
uci set wireless.@wifi-iface[1].encryption="psk2"
uci set wireless.@wifi-iface[1].device="radio1"
uci set wireless.@wifi-iface[1].mode="sta"
uci set wireless.@wifi-iface[1].bssid="${cellMAC}"
uci set wireless.@wifi-iface[1].key="${wpa}"
uci commit
reload_config
sleep 20
set +x
udhcpc -i ${iface}
}
# interface SSID_PREFIX Network_KEY
connectWifi "$1" "$2" "$3"

View File

@ -0,0 +1,26 @@
#!/bin/bash
function scanWifi()
{
local ifcace=$1
iwconfig ${iface} scan
function connectBoard()
{
uci delete wireless.@wifi-iface[1]
uci add wireless wifi-iface
uci set wireless.@wifi-iface[1].network="EmlidReach"
uci set wireless.@wifi-iface[1].ssid="Base1:2a:03"
uci set wireless.@wifi-iface[1].encryption="psk2"
uci set wireless.@wifi-iface[1].device="radio1"
uci set wireless.@wifi-iface[1].mode="sta"
uci set wireless.@wifi-iface[1].bssid="FC:DB:B3:7E:2A:03"
uci set wireless.@wifi-iface[1].key="basepyxis"
uci commit
reload_config
sleep 15
udhcpc -i wlan1
}
cells=$(scanWifi wlan1)

83
script/release Executable file
View File

@ -0,0 +1,83 @@
#!/bin/bash
set -eo pipefail
OS_TARGETS=(linux)
ARCH_TARGETS=(arm)
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
function build {
local name=$1
local srcdir=$2
local os=$3
local arch=$4
local dirname="$name-$os-$arch"
local destdir="$DIR/../release/$dirname"
rm -rf "$destdir"
mkdir -p "$destdir"
echo "building $dirname..."
CGO_ENABLED=0 GOOS="$os" GOARCH="$arch" go build -ldflags="-s -w" -o "$destdir/$name" "$srcdir"
}
function copy {
local name=$1
local os=$2
local arch=$3
local src=$4
local dest=$5
local dirname="$name-$os-$arch"
local destdir="$DIR/../release/$dirname"
echo "copying '$src' to '$destdir/$dest'..."
mkdir -p "$(dirname $destdir/$dest)"
cp -rfL $src "$destdir/$dest"
}
function compress {
local name=$1
local os=$2
local arch=$3
local dirname="$name-$os-$arch"
local destdir="$DIR/../release/$dirname"
echo "compressing $dirname..."
tar -czf "$destdir.tar.gz" -C "$destdir/../" "$dirname"
}
function release_server {
local os=$1
local arch=$2
build 'server' "$DIR/../cmd/server" $os $arch
copy 'server' $os $arch "$DIR/../README.md" "README.md"
copy 'server' $os $arch "$DIR/../cmd/server/static/dist" "static"
copy 'server' $os $arch "$DIR/../cmd/server/templates" "templates"
compress 'server' $os $arch
}
function main {
for os in ${OS_TARGETS[@]}; do
for arch in ${ARCH_TARGETS[@]}; do
release_server $os $arch
done
done
}
main

56
use.go Normal file
View File

@ -0,0 +1,56 @@
package main
import (
"forge.cadoles.com/Cadoles/owrt"
)
func main() {
uci := owrt.NewUCI()
uci.LoadWirelessConf()
wifaces := uci.GetWifiIfaces()
wDevices := uci.GetWifiDevices()
PyxisDevice := wDevices[0]
ClientDevice := wDevices[1]
for _, iface := range wifaces {
iface.Delete(uci)
}
// Main Pyxis Interface
pyxis := owrt.NewUCIWirelessInterface()
pyxis.Name = "Pyxis-Network"
pyxis.Network = "pyxis"
pyxis.Index = 0
pyxis.Ssid = "Pyxis"
pyxis.SysDevName = "wlan0"
pyxis.Encryption = "psk2"
pyxis.Key = "xxxxxxxxx"
pyxis.Device = PyxisDevice["Device"]
pyxis.DevicePath = PyxisDevice["Path"]
pyxis.Mode = "ap"
_ = pyxis.Create(uci)
_ = pyxis.Save(uci)
// Client Interface
client := owrt.NewUCIWirelessInterface()
client.Name = "Client-Network"
client.Index = 1
client.SysDevName = "wlan1"
client.Device = ClientDevice["Device"]
client.DevicePath = ClientDevice["Path"]
client.Mode = "sta"
_ = client.Create(uci)
_ = client.SysAdd(uci)
_ = client.Up(uci)
scan := client.Scan()
for _, elm := range scan {
if elm.Ssid == "Cadoles" {
client.Connect(uci, elm, "xxxxxx")
}
}
dhcp := owrt.NewDhcpClient(client.SysDevName)
dhcp.AskForIP()
}