diff --git a/Makefile b/Makefile index 90eab8b..09a4a38 100644 --- a/Makefile +++ b/Makefile @@ -100,6 +100,9 @@ node_modules: package.json $(TARGET_DIR)/%: src/resources/% install -D $< $@ +src/svelte-components/dist/%: + cd src/svelte-components && rm -rf dist && npm run build + $(TARGET_DIR)/index.html: build/templates.pug $(TARGET_DIR)/index.html: $(wildcard src/static/js/*) $(TARGET_DIR)/index.html: $(wildcard src/static/css/*) @@ -108,9 +111,16 @@ $(TARGET_DIR)/index.html: $(wildcard src/js/*) $(TARGET_DIR)/index.html: $(wildcard src/stylus/*) $(TARGET_DIR)/index.html: src/resources/config-template.json $(TARGET_DIR)/index.html: $(wildcard src/resources/onefinity*defaults.json) +$(TARGET_DIR)/index.html: $(wildcard src/svelte-components/dist/*) -$(TARGET_DIR)/%.html: src/pug/%.pug node_modules - @mkdir -p $(shell dirname $@) +FORCE: + +$(TARGET_DIR)/%.html: src/pug/%.pug node_modules FORCE + cd src/svelte-components && rm -rf dist && npm run build + @mkdir -p $(TARGET_DIR)/svelte-components + cp src/svelte-components/dist/* $(TARGET_DIR)/svelte-components/ + + @mkdir -p $(TARGET_DIR) $(PUG) -O pug-opts.js -P $< -o $(TARGET_DIR) || (rm -f $@; exit 1) pylint: diff --git a/src/avr/src/line.c b/src/avr/src/line.c index 132c14f..a94d186 100644 --- a/src/avr/src/line.c +++ b/src/avr/src/line.c @@ -54,7 +54,7 @@ static struct { line_t line; int section; - int seg; + uint32_t seg; float iD; // Initial section distance float iV; // Initial section velocity diff --git a/src/js/admin-general-view.js b/src/js/admin-general-view.js index 2db7e1e..bbc5791 100644 --- a/src/js/admin-general-view.js +++ b/src/js/admin-general-view.js @@ -1,150 +1,120 @@ -/******************************************************************************\ - - This file is part of the Buildbotics firmware. - - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. - - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . - - The software 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . - - For information regarding this software email: - "Joseph Coffland" - -\******************************************************************************/ - -'use strict' +"use strict"; +const api = require("./api"); +const utils = require("./utils"); const merge = require("lodash.merge"); const config_defaults = require("../resources/onefinity_defaults.json"); const variant_defaults = { - machinist_x35: require("../resources/onefinity_machinist_x35_defaults.json"), - woodworker_x35: require("../resources/onefinity_woodworker_x35_defaults.json"), - woodworker_x50: require("../resources/onefinity_woodworker_x50_defaults.json"), - journeyman_x50: require("../resources/onefinity_journeyman_x50_defaults.json") + machinist_x35: require("../resources/onefinity_machinist_x35_defaults.json"), + woodworker_x35: require("../resources/onefinity_woodworker_x35_defaults.json"), + woodworker_x50: require("../resources/onefinity_woodworker_x50_defaults.json"), + journeyman_x50: require("../resources/onefinity_journeyman_x50_defaults.json") }; -const api = require('./api'); - module.exports = { - template: '#admin-general-view-template', - props: ['config', 'state'], + template: "#admin-general-view-template", + props: [ "config", "state" ], - data: function () { - return { - configRestored: false, - confirmReset: false, - configReset: false, - latest: '', - autoCheckUpgrade: true, - reset_variant: '' - } - }, - - events: { - latest_version: function (version) { - this.latest = version - } - }, - - ready: function () { - this.autoCheckUpgrade = this.config.admin['auto-check-upgrade'] - }, - - methods: { - backup: function () { - document.getElementById('download-target').src = '/api/config/download'; + data: function() { + return { + confirmReset: false, + autoCheckUpgrade: true, + reset_variant: "" + }; }, - restore_config: function () { - // If we don't reset the form the browser may cache file if name is same - // even if contents have changed - $('.restore-config')[0].reset(); - $('.restore-config input').click(); + ready: function() { + this.autoCheckUpgrade = this.config.admin["auto-check-upgrade"]; }, - restore: function (e) { - var files = e.target.files || e.dataTransfer.files; - if (!files.length) return; + methods: { + backup: function() { + document.getElementById("download-target").src = "/api/config/download"; + }, - var fr = new FileReader(); - fr.onload = function (e) { - var config; - try { - config = JSON.parse(e.target.result); - } catch (ex) { - api.alert("Invalid config file"); - return; + restore_config: function() { + utils.clickFileInput("restore-config"); + }, + + restore: function(e) { + const files = e.target.files || e.dataTransfer.files; + if (!files.length) { + return; + } + + const fileReader = new FileReader(); + fileReader.onload = async ({ target }) => { + let config; + try { + config = JSON.parse(target.result); + } catch (error) { + console.error("Invalid config file:", error); + alert("Invalid config file"); + return; + } + + try { + await api.put("config/save", config); + this.$dispatch("update"); + SvelteComponents.showDialog("Message", { + title: "Success", + message: "Configuration restored" + }); + } catch (error) { + console.error("Restore failed:", error); + alert("Restore failed"); + } + }; + + fileReader.readAsText(files[0]); + }, + + reset: async function() { + const config = merge( + {}, + config_defaults, + variant_defaults[this.reset_variant] + ); + + try { + await api.put("config/save", config); + this.confirmReset = false; + this.$dispatch("update"); + SvelteComponents.showDialog("Message", { + title: "Success", + message: "Configuration restored" + }); + } catch (error) { + console.error("Restore failed:", error); + alert("Restore failed"); + } + }, + + check: function() { + this.$dispatch("check"); + }, + + upgrade: function() { + this.$dispatch("upgrade"); + }, + + upload_firmware: function() { + utils.clickFileInput("upload-firmware"); + }, + + upload: function(e) { + const files = e.target.files || e.dataTransfer.files; + if (!files.length) { + return; + } + this.$dispatch("upload", files[0]); + }, + + change_auto_check_upgrade: function() { + this.config.admin["auto-check-upgrade"] = this.autoCheckUpgrade; + this.$dispatch("config-changed"); } - - api.put('config/save', config).done(function (data) { - this.$dispatch('update'); - this.configRestored = true; - - }.bind(this)).fail(function (error) { - api.alert('Restore failed', error); - }) - }.bind(this); - - fr.readAsText(files[0]); - }, - - reset: async function () { - const config = merge( - {}, - config_defaults, - variant_defaults[this.reset_variant] - ); - - try { - await api.put('config/save', config) - this.confirmReset = false; - this.$dispatch('update'); - this.configRestored = true; - } catch (err) { - api.alert('Restore failed'); - console.error('Restore failed', err); - } - }, - - check: function () { - this.$dispatch('check') - }, - - upgrade: function () { - this.$dispatch('upgrade') - }, - - upload_firmware: function () { - // If we don't reset the form the browser may cache file if name is same - // even if contents have changed - $('.upload-firmware')[0].reset(); - $('.upload-firmware input').click(); - }, - - upload: function (e) { - var files = e.target.files || e.dataTransfer.files; - if (!files.length) return; - this.$dispatch('upload', files[0]); - }, - - change_auto_check_upgrade: function () { - this.config.admin['auto-check-upgrade'] = this.autoCheckUpgrade; - this.$dispatch('config-changed'); } - } -} +}; diff --git a/src/js/admin-network-view.js b/src/js/admin-network-view.js index 1dae7b2..69f3e8d 100644 --- a/src/js/admin-network-view.js +++ b/src/js/admin-network-view.js @@ -1,177 +1,14 @@ -/******************************************************************************\ - - This file is part of the Buildbotics firmware. - - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. - - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . - - The software 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . - - For information regarding this software email: - "Joseph Coffland" - -\******************************************************************************/ - -'use strict' - - -var api = require('./api'); - - module.exports = { - template: '#admin-network-view-template', - props: ['config', 'state'], + template: "#admin-network-view-template", + attached: function() { + this.svelteComponent = SvelteComponents.createComponent( + "AdminNetworkView", + document.getElementById("admin-network") + ); + }, - data: function () { - return { - hostnameSet: false, - usernameSet: false, - passwordSet: false, - redirectTimeout: 0, - hostname: '', - username: '', - current: '', - password: '', - password2: '', - wifi_mode: 'client', - wifi_ssid: '', - wifi_ch: undefined, - wifi_pass: '', - wifiConfirm: false, - rebooting: false + detached: function() { + this.svelteComponent.$destroy(); } - }, - - - ready: function () { - api.get('hostname').done(function (hostname) { - this.hostname = hostname; - }.bind(this)); - - api.get('remote/username').done(function (username) { - this.username = username; - }.bind(this)); - - api.get('wifi').done(function (config) { - this.wifi_mode = config.mode; - this.wifi_ssid = config.ssid; - this.wifi_ch = config.channel; - }.bind(this)); - }, - - - methods: { - redirect: function (hostname) { - if (0 < this.redirectTimeout) { - this.redirectTimeout -= 1; - setTimeout(function () {this.redirect(hostname)}.bind(this), 1000); - - } else location.hostname = hostname; - }, - - - set_hostname: function () { - api.put('hostname', {hostname: this.hostname}).done(function () { - this.redirectTimeout = 45; - this.hostnameSet = true; - - api.put('reboot').always(function () { - if (String(location.hostname) == 'localhost') return; - - var hostname = this.hostname; - if (String(location.hostname).endsWith('.local')) - hostname += '.local' - this.$dispatch('hostname-changed', hostname); - this.redirect(hostname); - }.bind(this)); - - }.bind(this)).fail(function (error) { - api.alert('Set hostname failed', error); - }) - }, - - - set_username: function () { - api.put('remote/username', {username: this.username}).done(function () { - this.usernameSet = true; - }.bind(this)).fail(function (error) { - api.alert('Set username failed', error); - }) - }, - - - set_password: function () { - if (this.password != this.password2) { - alert('Passwords to not match'); - return; - } - - if (this.password.length < 6) { - alert('Password too short'); - return; - } - - api.put('remote/password', { - current: this.current, - password: this.password - }).done(function () { - this.passwordSet = true; - }.bind(this)).fail(function (error) { - api.alert('Set password failed', error); - }) - }, - - - config_wifi: function () { - this.wifiConfirm = false; - - if (!this.wifi_ssid.length) { - alert('SSID not set'); - return; - } - - if (32 < this.wifi_ssid.length) { - alert('SSID longer than 32 characters'); - return; - } - - if (this.wifi_pass.length && this.wifi_pass.length < 8) { - alert('WiFi password shorter than 8 characters'); - return; - } - - if (128 < this.wifi_pass.length) { - alert('WiFi password longer than 128 characters'); - return; - } - - this.rebooting = true; - - var config = { - mode: this.wifi_mode, - channel: this.wifi_ch, - ssid: this.wifi_ssid, - pass: this.wifi_pass - } - - api.put('wifi', config).fail(function (error) { - api.alert('Failed to configure WiFi', error); - this.rebooting = false; - }.bind(this)) - } - } -} +}; diff --git a/src/js/api.js b/src/js/api.js index 8c07a02..45a74e8 100644 --- a/src/js/api.js +++ b/src/js/api.js @@ -1,104 +1,48 @@ -/******************************************************************************\ +"use strict"; - This file is part of the Buildbotics firmware. +async function callApi(method, url, data) { + try { + const headers = {}; + let body = undefined; - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. + if (data) { + if (data instanceof FormData) { + body = data; + } else { + headers["Content-Type"] = "application/json; charset=utf-8"; + body = JSON.stringify(data); + } + } - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . + const response = await fetch(`/api/${url}`, { + method, + headers, + body, + cache: "no-cache", + }); - The software 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 - Lesser General Public License for more details. + if (response.ok) { + return await response.json(); + } - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . + throw new Error(await response.text()); + } catch (error) { + console.debug(`API Error: ${url}: ${error}`); - For information regarding this software email: - "Joseph Coffland" - -\******************************************************************************/ - -'use strict' - - -function api_cb(method, url, data, config) { - config = $.extend({ - type: method, - url: '/api/' + url, - dataType: 'json', - cache: false - }, config); - - if (typeof data == 'object') { - config.data = JSON.stringify(data); - config.contentType = 'application/json; charset=utf-8'; - } - - var d = $.Deferred(); - - $.ajax(config).success(function (data, status, xhr) { - d.resolve(data, status, xhr); - - }).error(function (xhr, status, error) { - var text = xhr.responseText; - try {text = $.parseJSON(xhr.responseText)} catch(e) {} - if (!text) text = error; - - d.reject(text, xhr, status, error); - console.debug('API Error: ' + url + ': ' + text); - }); - - return d.promise(); + throw error; + } } - module.exports = { - get: function (url, config) { - return api_cb('GET', url, undefined, config); - }, + get: function(url) { + return callApi("GET", url); + }, + put: function(url, body = undefined) { + return callApi("PUT", url, body); + }, - put: function(url, data, config) { - return api_cb('PUT', url, data, config); - }, - - - post: function(url, data, config) { - return api_cb('POST', url, data, config); - }, - - - upload: function(url, data, config) { - config = $.extend({ - processData: false, - contentType: false, - cache: false, - data: data - }, config); - - return api_cb('PUT', url, undefined, config); - }, - - - 'delete': function (url, config) { - return api_cb('DELETE', url, undefined, config); - }, - - - alert: function (msg, error) { - if (typeof error != 'undefined') { - if (typeof error.message != 'undefined') - msg += '\n' + error.message; - else msg += '\n' + JSON.stringify(error); + delete: function(url) { + return callApi("DELETE", url); } - - alert(msg); - } -} +}; diff --git a/src/js/app.js b/src/js/app.js index b8b0e76..9a5445b 100644 --- a/src/js/app.js +++ b/src/js/app.js @@ -1,506 +1,440 @@ -/******************************************************************************\ +"use strict"; - This file is part of the Buildbotics firmware. +const api = require("./api"); +const cookie = require("./cookie")("bbctrl-"); +const Sock = require("./sock"); +const semverLt = require("semver/functions/lt"); - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. +SvelteComponents.createComponent("DialogHost", + document.getElementById("svelte-dialog-host") +); - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . +function parse_version(v) { + const pattern = /^(\d+)\.(\d+)\.(\d+)(?:[-.]?(.*))?$/; + const [ version, major, minor, patch, pre ] = v.trim().match(pattern) || []; - The software 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . - - For information regarding this software email: - "Joseph Coffland" - -\******************************************************************************/ - -'use strict' - -const api = require('./api'); -const cookie = require('./cookie')('bbctrl-'); -const Sock = require('./sock'); -const omit = require('lodash.omit'); - -function is_newer_version(current, latest) { - const pattern = /(\d+)\.(\d+)\.(\d+)(.*)/; - const currentParts = current.match(pattern); - const latestParts = latest.match(pattern); - - if (!currentParts || !latestParts) { - return false; - } - - // Normal version comparisons - const major = latestParts[1] - currentParts[1]; - const minor = latestParts[2] - currentParts[2]; - const patch = latestParts[3] - currentParts[3]; - - // If current is a pre-release, and latest is a release - const betaToRelease = latestParts[4].length === 0 && currentParts[4].length > 0; - - switch (true) { - case major > 0: - case major === 0 && minor > 0: - case major === 0 && minor === 0 && patch > 0: - case major === 0 && minor === 0 && patch === 0 && betaToRelease: - return true; - - default: - return false; - } + return { + version, + major, + minor, + patch, + pre + }; } -function is_object(o) { return o !== null && typeof o == 'object' } -function is_array(o) { return Array.isArray(o) } +function fixup_version_number(version) { + const v = parse_version(version); + + version = `${v.major}.${v.minor}.${v.patch}`; + if (v.pre) { + const [ , prefix, num ] = v.pre.match(/([a-zA-Z])(\d+)/); + + const suffix = prefix === "b" + ? `beta.${num}` + : v.pre; + + version = `${version}-${suffix}`; + } + + return version; +} + +function is_object(o) { + return o !== null && typeof o == "object"; +} + +function is_array(o) { + return Array.isArray(o); +} function update_array(dst, src) { - while (dst.length) dst.pop() - for (var i = 0; i < src.length; i++) - Vue.set(dst, i, src[i]); + while (dst.length) { + dst.pop(); + } + + for (let i = 0; i < src.length; i++) { + Vue.set(dst, i, src[i]); + } } +function hasOwnProperty(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); +} function update_object(dst, src, remove) { - var props, index, key, value; + let props, index, key, value; - if (remove) { - props = Object.getOwnPropertyNames(dst); + if (remove) { + props = Object.getOwnPropertyNames(dst); - for (index in props) { - key = props[index]; - if (!src.hasOwnProperty(key)) - Vue.delete(dst, key); + for (index in props) { + key = props[index]; + if (!hasOwnProperty(src, key)) { + Vue.delete(dst, key); + } + } } - } - props = Object.getOwnPropertyNames(src); - for (index in props) { - key = props[index]; - value = src[key]; + props = Object.getOwnPropertyNames(src); + for (index in props) { + key = props[index]; + value = src[key]; - if (is_array(value) && dst.hasOwnProperty(key) && is_array(dst[key])) - update_array(dst[key], value); - - else if (is_object(value) && dst.hasOwnProperty(key) && is_object(dst[key])) - update_object(dst[key], value, remove); - - else Vue.set(dst, key, value); - } + if (is_array(value) && hasOwnProperty(dst, key) && is_array(dst[key])) { + update_array(dst[key], value); + } else if (is_object(value) && hasOwnProperty(dst, key) && is_object(dst[key])) { + update_object(dst[key], value, remove); + } else { + Vue.set(dst, key, value); + } + } } module.exports = new Vue({ - el: 'body', + el: "body", - - data: function () { - return { - status: 'connecting', - currentView: 'loading', - index: -1, - modified: false, - template: require('../resources/config-template.json'), - config: { - settings: { units: 'METRIC' }, - motors: [{}, {}, {}, {}], - version: '', - full_version: '' - }, - state: { - messages: [], - probing_active: false, - wait_for_probing_complete: false, - show_probe_complete_modal: false, - show_probe_failed_modal: false - }, - video_size: cookie.get('video-size', 'small'), - crosshair: cookie.get('crosshair', 'false') != 'false', - errorTimeout: 30, - errorTimeoutStart: 0, - errorShow: false, - errorMessage: '', - confirmUpgrade: false, - confirmUpload: false, - firmwareUpgrading: false, - checkedUpgrade: false, - firmwareName: '', - latestVersion: '', - ipAddress: '0.0.0.0', - wifiSSID: '', - confirmShutdown: false, - diskSpace: '' - } - }, - - components: { - 'estop': { template: '#estop-template' }, - 'loading-view': { template: '

Loading...

' }, - 'control-view': require('./control-view'), - 'settings-view': require('./settings-view'), - 'motor-view': require('./motor-view'), - 'tool-view': require('./tool-view'), - 'io-view': require('./io-view'), - 'admin-general-view': require('./admin-general-view'), - 'admin-network-view': require('./admin-network-view'), - 'help-view': { template: '#help-view-template' }, - 'cheat-sheet-view': { - template: '#cheat-sheet-view-template', - data: function () { return { showUnimplemented: false } } - } - }, - - events: { - 'config-changed': function () { - this.modified = true; + data: function() { + return { + status: "connecting", + currentView: "loading", + display_units: localStorage.getItem("display_units") || "METRIC", + index: -1, + modified: false, + template: require("../resources/config-template.json"), + config: { + settings: { units: "METRIC" }, + motors: [{}, {}, {}, {}], + version: "", + full_version: "", + ip: "<>", + wifiName: "not connected", + }, + state: { + messages: [], + }, + video_size: cookie.get("video-size", "small"), + crosshair: cookie.get("crosshair", "false") != "false", + errorTimeout: 30, + errorTimeoutStart: 0, + errorShow: false, + errorMessage: "", + confirmUpgrade: false, + confirmUpload: false, + firmwareUpgrading: false, + checkedUpgrade: false, + firmwareName: "", + latestVersion: "", + }; }, - 'hostname-changed': function (hostname) { - this.hostname = hostname + components: { + estop: { template: "#estop-template" }, + "loading-view": { template: "

Loading...

" }, + "control-view": require("./control-view"), + "settings-view": require("./settings-view"), + "motor-view": require("./motor-view"), + "tool-view": require("./tool-view"), + "io-view": require("./io-view"), + "admin-general-view": require("./admin-general-view"), + "admin-network-view": require("./admin-network-view"), + "help-view": require("./help-view"), + "cheat-sheet-view": { + template: "#cheat-sheet-view-template", + data: function() { + return { + showUnimplemented: false + }; + }, + }, }, - send: function (msg) { - if (this.status == 'connected') { - console.debug('>', msg); - this.sock.send(msg); - } + watch: { + display_units: function(value) { + localStorage.setItem("display_units", value); + SvelteComponents.setDisplayUnits(value); + }, }, - connected: function () { - this.update() - }, + events: { + "config-changed": function() { + this.modified = true; + }, - update: function () { - this.update() - }, + send: function(msg) { + if (this.status == "connected") { + this.sock.send(msg); + } + }, - check: function () { - this.latestVersion = ''; + connected: function() { + this.update(); + }, - $.ajax({ - type: 'GET', - url: 'https://raw.githubusercontent.com/OneFinityCNC/onefinity-release/master/latest.txt', - data: { hid: this.state.hid }, - cache: false + update: function() { + this.update(); + }, - }).done(function (data) { - this.latestVersion = data; - this.$broadcast('latest_version', data); - }.bind(this)) - }, + check: async function() { + try { + const response = await fetch("https://raw.githubusercontent.com/OneFinityCNC/onefinity-release/master/latest.txt", { + cache: "no-cache" + }); - upgrade: function () { - this.confirmUpgrade = true; - }, + this.latestVersion = (await response.text()).trim(); + } catch (err) { + this.latestVersion = ""; + } + }, - upload: function (firmware) { - this.firmware = firmware; - this.firmwareName = firmware.name; - this.confirmUpload = true; - }, + upgrade: function() { + this.confirmUpgrade = true; + }, - error: function (msg) { - // Honor user error blocking - if (Date.now() - this.errorTimeoutStart < this.errorTimeout * 1000) - return; + upload: function(firmware) { + this.firmware = firmware; + this.firmwareName = firmware.name; + this.confirmUpload = true; + }, - // Wait at least 1 sec to pop up repeated errors - if (1 < msg.repeat && Date.now() - msg.ts < 1000) { - return; - } - - // Popup error dialog - this.errorShow = true; - this.errorMessage = msg.msg; - } - }, - - computed: { - popupMessages: function () { - const msgs = []; - - for (let i = 0; i < this.state.messages.length; i++) { - const text = this.state.messages[i].text; - if (!/^#/.test(text)) { - msgs.push(text); - } - } - - return msgs; - } - }, - - ready: function () { - $(window).on('hashchange', this.parse_hash); - this.connect(); - }, - - methods: { - metric: function () { - return this.config.settings.units != 'IMPERIAL' - }, - - block_error_dialog: function () { - this.errorTimeoutStart = Date.now(); - this.errorShow = false; - }, - - toggle_video: function (e) { - if (this.video_size == 'small') this.video_size = 'large'; - else if (this.video_size == 'large') this.video_size = 'small'; - cookie.set('video-size', this.video_size); - }, - - toggle_crosshair: function (e) { - e.preventDefault(); - this.crosshair = !this.crosshair; - cookie.set('crosshair', this.crosshair); - }, - - estop: function () { - if (this.state.xx == 'ESTOPPED') api.put('clear'); - else api.put('estop'); - }, - - upgrade_confirmed: async function () { - this.confirmUpgrade = false; - - try { - await api.put('upgrade'); - this.firmwareUpgrading = true; - } catch (err) { - api.alert('Error during upgrade.'); - console.error("Error during upgrade", err); - } - }, - - upload_confirmed: function () { - this.confirmUpload = false; - - const form = new FormData(); - form.append('firmware', this.firmware); - - $.ajax({ - url: '/api/firmware/update', - type: 'PUT', - data: form, - cache: false, - contentType: false, - processData: false - - }).success(function () { - this.firmwareUpgrading = true; - }.bind(this)).error(function (err) { - api.alert('Firmware update failed'); - console.error('Firmware update failed', err); - }.bind(this)) - }, - - show_upgrade: function () { - if (!this.latestVersion) return false; - return is_newer_version(this.config.version, this.latestVersion); - }, - - update: function () { - api.get('config/load').done(function (config) { - update_object(this.config, config, true); - this.parse_hash(); - - if (!this.checkedUpgrade) { - this.checkedUpgrade = true; - - var check = this.config.admin['auto-check-upgrade']; - if (typeof check == 'undefined' || check) - this.$emit('check'); - } - - this.check_ip_address(); - this.check_ssid(); - }.bind(this)) - }, - - check_ip_address: function () { - $.ajax({ - type: 'GET', - url: 'hostinfo.txt', - data: { hid: this.state.hid }, - cache: false - - }).done(function (data) { - console.debug('>', data); - this.ipAddress = 'IP:' + data; - this.$broadcast('ipAddress', data); - }.bind(this)) - }, - - check_ssid: function () { - $.ajax({ - type: 'GET', - url: 'ssidinfo.txt', - data: { hid: this.state.hid }, - cache: false - - }).done(function (data) { - console.debug('>', data); - this.wifiSSID = 'SSID:' + data; - this.$broadcast('wifiSSID', data); - }.bind(this)) - }, - - get_ip_address: function () { - console.debug('get_ip>', this.ipAddress); - return this.ipAddress; - }, - - get_ssid: function () { - console.debug('get_ssid>', this.wifiSSID); - return this.wifiSSID; - }, - - shutdown: function () { - this.confirmShutdown = false; - api.put('shutdown'); - - }, - - reboot: function () { - this.confirmShutdown = false; - api.put('reboot'); - }, - - connect: function () { - this.sock = new Sock(`//${location.host}/sockjs`); - - this.sock.onmessage = (e) => { - if (typeof e.data != 'object') { - return; - } - - if ('log' in e.data) { - if (e.data.log.msg === "Switch not found") { - this.$broadcast('probing_failed'); - } else { - this.$broadcast('log', e.data.log); - } - - delete e.data.log; - } - - // Check for session ID change on controller - if ('sid' in e.data) { - if (typeof this.sid == 'undefined') { - this.sid = e.data.sid; - } else if (this.sid != e.data.sid) { - if (typeof this.hostname !== 'undefined' && location.hostname !== 'localhost') { - location.hostname = this.hostname; + error: function(msg) { + // Honor user error blocking + if (Date.now() - this.errorTimeoutStart < this.errorTimeout * 1000) { + return; } - location.reload(); - } - } + // Wait at least 1 sec to pop up repeated errors + if (1 < msg.repeat && Date.now() - msg.ts < 1000) { + return; + } - // Set this to true to get console output of changes to the state - const debugStateChanges = false; - if (debugStateChanges) { - const data = omit(e.data, [ - 'vdd', - 'vin', - 'vout', - 'motor', - 'temp', - 'heartbeat', - 'load1', - 'load2', - 'rpi_temp' - ]); - if (Object.keys(data).length > 0) { - console.log(JSON.stringify(data, null, 4)); - } - } - - update_object(this.state, e.data, false); - - if (this.state.pw === 0) { - Vue.set(this.state, "saw_probe_connected", true); - } - - if (this.state.cycle === 'idle') { - if (this.state.wait_for_probing_complete) { - Vue.set(this.state, "wait_for_probing_complete", false); - this.$broadcast("probing_complete"); - } - } - - this.$broadcast('update'); - }; - - this.sock.onopen = () => { - this.status = 'connected'; - this.$emit(this.status); - this.$broadcast(this.status); - }; - - this.sock.onclose = () => { - this.status = 'disconnected'; - this.$emit(this.status); - this.$broadcast(this.status); - }; + // Popup error dialog + this.errorShow = true; + this.errorMessage = msg.msg; + }, }, - parse_hash: function () { - var hash = location.hash.substr(1); + computed: { + popupMessages: function() { + const msgs = []; - if (!hash.trim().length) { - location.hash = 'control'; - return; - } + for (let i = 0; i < this.state.messages.length; i++) { + const text = this.state.messages[i].text; + if (!/^#/.test(text)) { + msgs.push(text); + } + } - var parts = hash.split(':'); - - if (parts.length == 2) this.index = parts[1]; - - this.currentView = parts[0]; + return msgs; + }, }, - save: function () { - const selected_tool = this.config.tool['selected-tool']; - const saveModbus = selected_tool !== "pwm" && - selected_tool !== "laser" && - selected_tool !== "router"; - const settings = { - ['tool']: { ...this.config.tool }, - ['pwm-spindle']: { ...this.config['pwm-spindle'] }, - ['modbus-spindle']: saveModbus ? { ...this.config['modbus-spindle'] } : undefined - } - delete settings.tool['tool-type']; + ready: function() { + window.onhashchange = () => this.parse_hash(); + this.connect(); - this.config['selected-tool-settings'][selected_tool] = settings; - - api.put('config/save', this.config).done(function (data) { - this.modified = false; - }.bind(this)).fail(function (error) { - api.alert('Save failed', error); - }); + SvelteComponents.registerControllerMethods({ + dispatch: (...args) => this.$dispatch(...args) + }); }, - close_messages: function (action) { - if (action == 'stop') api.put('stop'); - if (action == 'continue') api.put('unpause'); + methods: { + block_error_dialog: function() { + this.errorTimeoutStart = Date.now(); + this.errorShow = false; + }, - // Acknowledge messages - if (this.state.messages.length) { - var id = this.state.messages.slice(-1)[0].id - api.put('message/' + id + '/ack'); - } - } - } -}) + toggle_video: function() { + if (this.video_size == "small") { + this.video_size = "large"; + } else if (this.video_size == "large") { + this.video_size = "small"; + } + cookie.set("video-size", this.video_size); + }, + + toggle_crosshair: function(e) { + e.preventDefault(); + this.crosshair = !this.crosshair; + cookie.set("crosshair", this.crosshair); + }, + + estop: function() { + if (this.state.xx == "ESTOPPED") { + api.put("clear"); + } else { + api.put("estop"); + } + }, + + upgrade_confirmed: async function() { + this.confirmUpgrade = false; + + try { + await api.put("upgrade"); + this.firmwareUpgrading = true; + } catch (error) { + console.error("Error during upgrade:", error); + alert("Error during upgrade"); + } + }, + + upload_confirmed: async function() { + this.confirmUpload = false; + + const form = new FormData(); + form.append("firmware", this.firmware); + + try { + await api.put("firmware/update", form); + this.firmwareUpgrading = true; + } catch (error) { + console.error("Firmware update failed:", error); + alert("Firmware update failed"); + } + }, + + show_upgrade: function() { + if (!this.latestVersion) { + return false; + } + + return semverLt(this.config.full_version, this.latestVersion); + }, + + showShutdownDialog: function() { + SvelteComponents.showDialog("Shutdown"); + }, + + update: async function() { + const config = await api.get("config/load"); + const wifi = await api.get("wifi"); + update_object(this.config, config, true); + this.config.full_version = fixup_version_number(this.config.full_version); + this.config.ip = wifi.ipAddresses; + this.config.wifiName = wifi.wifi; + this.parse_hash(); + + if (!this.checkedUpgrade) { + this.checkedUpgrade = true; + + const check = this.config.admin["auto-check-upgrade"]; + if (typeof check == "undefined" || check) { + this.$emit("check"); + } + } + + SvelteComponents.handleConfigUpdate(this.config); + }, + + connect: function() { + this.sock = new Sock(`//${location.host}/sockjs`); + + this.sock.onmessage = (e) => { + if (typeof e.data != "object") { + return; + } + + if (e.data.log && e.data.log.msg !== "Switch not found") { + this.$broadcast("log", e.data.log); + + if (Object.keys(e.data).length === 1) { + // If there's only log data, we're done + return; + } + } + + // Check for session ID change on controller + if ("sid" in e.data) { + if (typeof this.sid == "undefined") { + this.sid = e.data.sid; + } else if (this.sid != e.data.sid) { + if (this.hostname && location.hostname !== "localhost") { + location.hostname = this.hostname; + } + + location.reload(); + } + } + + update_object(this.state, e.data, false); + + SvelteComponents.handleControllerStateUpdate(this.state); + + delete this.state.log; + + this.$broadcast("update"); + }; + + this.sock.onopen = () => { + this.status = "connected"; + this.$emit(this.status); + this.$broadcast(this.status); + }; + + this.sock.onclose = () => { + this.status = "disconnected"; + this.$emit(this.status); + this.$broadcast(this.status); + }; + }, + + parse_hash: function() { + const hash = location.hash.substr(1); + + if (!hash.trim().length) { + location.hash = "control"; + return; + } + + const parts = hash.split(":"); + + if (parts.length == 2) { + this.index = parts[1]; + } + + this.currentView = parts[0]; + }, + + save: async function() { + const selected_tool = this.config.tool["selected-tool"]; + const saveModbus = + selected_tool !== "pwm" && + selected_tool !== "laser" && + selected_tool !== "router"; + const settings = { + ["tool"]: { ...this.config.tool }, + ["pwm-spindle"]: { ...this.config["pwm-spindle"] }, + ["modbus-spindle"]: saveModbus + ? { ...this.config["modbus-spindle"] } + : undefined, + }; + delete settings.tool["tool-type"]; + + this.config["selected-tool-settings"][selected_tool] = settings; + + try { + await api.put("config/save", this.config); + this.modified = false; + } catch (error) { + console.error("Save failed:", error); + alert("Save failed"); + } + }, + + close_messages: function(action) { + if (action == "stop") { + api.put("stop"); + } + + if (action == "continue") { + api.put("unpause"); + } + + // Acknowledge messages + if (this.state.messages.length) { + const id = this.state.messages.slice(-1)[0].id; + api.put(`message/${id}/ack`); + } + }, + }, +}); diff --git a/src/js/axis-control.js b/src/js/axis-control.js index c6fa5c3..81a9bed 100644 --- a/src/js/axis-control.js +++ b/src/js/axis-control.js @@ -1,65 +1,37 @@ -/******************************************************************************\ - - This file is part of the Buildbotics firmware. - - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. - - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . - - The software 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . - - For information regarding this software email: - "Joseph Coffland" - -\******************************************************************************/ - -'use strict' - +"use strict"; module.exports = { - template: '#axis-control-template', - props: ['axes', 'colors', 'enabled', 'adjust', 'step'], + template: "#axis-control-template", + props: [ "axes", "colors", "enabled", "adjust", "step" ], + methods: { + jog: function(axis, ring, direction) { + const value = direction * this.value(ring); + this.$dispatch(this.step ? "step" : "jog", this.axes[axis], value); + }, - methods: { - jog: function (axis, ring, direction) { - var value = direction * this.value(ring); - this.$dispatch(this.step ? 'step' : 'jog', this.axes[axis], value); - }, + back2zero: function(axis0,axis1) { + this.$dispatch("back2zero",this.axes[axis0],this.axes[axis1]); + }, - back2zero: function(axis0,axis1) { - this.$dispatch('back2zero',this.axes[axis0],this.axes[axis1]) - }, + release: function(axis) { + if (!this.step) { + this.$dispatch("jog", this.axes[axis], 0); + } + }, + value: function(ring) { + const adjust = [ 0.01, 0.1, 1 ][this.adjust]; + if (this.step) { + return adjust * [ 0.1, 1, 10, 100 ][ring]; + } + return adjust * [ 0.1, 0.25, 0.5, 1 ][ring]; + }, - release: function (axis) { - if (!this.step) this.$dispatch('jog', this.axes[axis], 0) - }, - - - value: function (ring) { - var adjust = [0.01, 0.1, 1][this.adjust]; - if (this.step) return adjust * [0.1, 1, 10, 100][ring]; - return adjust * [0.1, 0.25, 0.5, 1][ring]; - }, - - - text: function (ring) { - var value = this.value(ring) * (this.step ? 1 : 100); - value = parseFloat(value.toFixed(3)); - return value + (this.step ? '' : '%'); + text: function(ring) { + let value = this.value(ring) * (this.step ? 1 : 100); + value = parseFloat(value.toFixed(3)); + return value + (this.step ? "" : "%"); + } } - } -} +}; diff --git a/src/js/axis-vars.js b/src/js/axis-vars.js index 99eff79..92fc20f 100644 --- a/src/js/axis-vars.js +++ b/src/js/axis-vars.js @@ -1,232 +1,254 @@ -/******************************************************************************\ - - This file is part of the Buildbotics firmware. - - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. - - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . - - The software 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . - - For information regarding this software email: - "Joseph Coffland" - -\******************************************************************************/ - -'use strict' - - -function is_defined(x) {return typeof x != 'undefined'} - +"use strict"; module.exports = { - props: ['state', 'config'], + props: [ "state", "config" ], + computed: { + metric: function() { + return this.$root.display_units === "METRIC"; + }, - computed: { - x: function () {return this._compute_axis('x')}, - y: function () {return this._compute_axis('y')}, - z: function () {return this._compute_axis('z')}, - a: function () {return this._compute_axis('a')}, - b: function () {return this._compute_axis('b')}, - c: function () {return this._compute_axis('c')}, - axes: function () {return this._compute_axes()} - }, + x: function() { + return this._compute_axis("x"); + }, + y: function() { + return this._compute_axis("y"); + }, - methods: { - _convert_length: function (value) { - return this.state.imperial ? value / 25.4 : value; - }, + z: function() { + return this._compute_axis("z"); + }, + a: function() { + return this._compute_axis("a"); + }, - _length_str: function (value) { - return this._convert_length(value).toLocaleString() + - (this.state.imperial ? ' in' : ' mm'); - }, + b: function() { + return this._compute_axis("b"); + }, + c: function() { + return this._compute_axis("c"); + }, - _compute_axis: function (axis) { - var abs = this.state[axis + 'p'] || 0; - var off = this.state['offset_' + axis]; - var motor_id = this._get_motor_id(axis); - var motor = motor_id == -1 ? {} : this.config.motors[motor_id]; - var enabled = typeof motor.enabled != 'undefined' && motor.enabled; - var homingMode = motor['homing-mode'] - var homed = this.state[motor_id + 'homed']; - var min = this.state[motor_id + 'tn']; - var max = this.state[motor_id + 'tm']; - var dim = max - min; - var pathMin = this.state['path_min_' + axis]; - var pathMax = this.state['path_max_' + axis]; - var pathDim = pathMax - pathMin; - var under = pathMin + off < min; - var over = max < pathMax + off; - var klass = (homed ? 'homed' : 'unhomed') + ' axis-' + axis; - var state = 'UNHOMED'; - var icon = 'question-circle'; - var fault = this.state[motor_id + 'df'] & 0x1f; - var shutdown = this.state.power_shutdown; - var title; - var ticon = 'question-circle'; - var tstate = 'NO FILE'; - var toolmsg; - var tklass = (homed ? 'homed' : 'unhomed') + ' axis-' + axis; - - if (fault || shutdown) { - state = shutdown ? 'SHUTDOWN' : 'FAULT'; - klass += ' error'; - icon = 'exclamation-circle'; - - } else if(homed) { - state = 'HOMED'; - icon = 'check-circle'; - } - - if (0 < dim && dim < pathDim) { - tstate = 'NO FIT'; - tklass += ' error'; - ticon = 'ban'; - - } else { - - if (over || under) { - tstate = over ? 'OVER' : 'UNDER'; - tklass += ' warn'; - ticon = 'exclamation-circle'; - } else { - tstate = 'OK'; - ticon = 'check-circle'; + axes: function() { + return this._compute_axes(); } - } - - switch (state) { - case 'UNHOMED': title = 'Click the home button to home axis.'; break; - case 'HOMED': title = 'Axis successfuly homed.'; break; - case 'FAULT': - title = 'Motor driver fault. A potentially damaging electrical ' + - 'condition was detected and the motor driver was shutdown. ' + - 'Please power down the controller and check your motor cabling. ' + - 'See the "Motor Faults" table on the "Indicators" tab for more ' + - 'information.'; - break; - case 'SHUTDOWN': - title = 'Motor power fault. All motors in shutdown. ' + - 'See the "Power Faults" table on the "Indicators" tab for more ' + - 'information. Reboot controller to reset.'; - } - - switch(tstate) { - - case 'OVER': - toolmsg = 'Caution: The current tool path file would move ' + - this._length_str(pathMax + off - max) + ' above axis limit with the current offset.'; - break; - - case 'UNDER': - toolmsg = 'Caution: The current tool path file would move ' + - this._length_str(min - pathMin - off) + ' below limit with the current offset.'; - break; - - case 'NO FIT': - toolmsg = 'Warning: The current tool path dimensions (' + - this._length_str(pathDim) + ') exceed axis dimensions (' + - this._length_str(dim) + ') by ' + - this._length_str(pathDim - dim) + '.'; - break; - - default: - toolmsg = 'Tool path ' + axis + ' dimensions OK.'; - break; - - } - - - return { - pos: abs - off, - abs: abs, - off: off, - min: min, - max: max, - dim: dim, - pathMin: pathMin, - pathMax: pathMax, - pathDim: pathDim, - motor: motor_id, - enabled: enabled, - homingMode: homingMode, - homed: homed, - klass: klass, - state: state, - icon: icon, - title: title, - ticon: ticon, - tstate: tstate, - toolmsg: toolmsg, - tklass: tklass - } }, + methods: { + _convert_length: function(value) { + return this.metric + ? value + : value / 25.4; + }, - _get_motor_id: function (axis) { - for (var i = 0; i < this.config.motors.length; i++) { - var motor = this.config.motors[i]; - if (motor.axis.toLowerCase() == axis) return i; - } + _length_str: function(value) { + return this._convert_length(value).toLocaleString() + (this.metric ? " mm" : " in"); + }, - return -1; - }, + _compute_axis: function(axis) { + const abs = this.state[`${axis}p`] || 0; + const off = this.state[`offset_${axis}`]; + const motor_id = this._get_motor_id(axis); + const motor = motor_id == -1 ? {} : this.config.motors[motor_id]; + const enabled = typeof motor.enabled != "undefined" && motor.enabled; + const homingMode = motor["homing-mode"]; + const homed = this.state[`${motor_id}homed`]; + const min = this.state[`${motor_id}tn`]; + const max = this.state[`${motor_id}tm`]; + const dim = max - min; + const pathMin = this.state[`path_min_${axis}`]; + const pathMax = this.state[`path_max_${axis}`]; + const pathDim = pathMax - pathMin; + const under = pathMin + off < min; + const over = max < pathMax + off; + let klass = `${homed ? "homed" : "unhomed"} axis-${axis}`; + let state = "UNHOMED"; + let icon = "question-circle"; + const fault = this.state[`${motor_id}df`] & 0x1f; + const shutdown = this.state.power_shutdown; + let title; + let ticon = "question-circle"; + let tstate = "NO FILE"; + let toolmsg; + let tklass = `${homed ? "homed" : "unhomed"} axis-${axis}`; + if (fault || shutdown) { + state = shutdown ? "SHUTDOWN" : "FAULT"; + klass += " error"; + icon = "exclamation-circle"; + } else if (homed) { + state = "HOMED"; + icon = "check-circle"; + } - _compute_axes: function () { - var homed = false; + if (0 < dim && dim < pathDim) { + tstate = "NO FIT"; + tklass += " error"; + ticon = "ban"; + } else { + if (over || under) { + tstate = over ? "OVER" : "UNDER"; + tklass += " warn"; + ticon = "exclamation-circle"; + } else { + tstate = "OK"; + ticon = "check-circle"; + } + } - for (var name of 'xyzabc') { - var axis = this[name]; + switch (state) { + case "UNHOMED": + title = "Click the home button to home axis."; + break; - if (!axis.enabled) continue - if (!axis.homed) {homed = false; break} - homed = true; - } + case "HOMED": + title = "Axis successfuly homed."; + break; - var error = false; - var warn = false; + case "FAULT": + title = [ + `Motor driver fault. A potentially damaging electrical`, + `condition was detected and the motor driver was shutdown.`, + `Please power down the controller and check your motor cabling.`, + `See the "Motor Faults" table on the "Indicators" tab for more`, + `information.`, + ].join(" "); + break; - if (homed) - for (name of 'xyzabc') { - axis = this[name]; + case "SHUTDOWN": + title = [ + `Motor power fault. All motors in shutdown.`, + `See the "Power Faults" table on the "Indicators" tab for more`, + `information. Reboot controller to reset.` + ].join(" "); + break; + } - if (!axis.enabled) continue; - if (axis.klass.indexOf('error') != -1) error = true; - if (axis.klass.indexOf('warn') != -1) warn = true; + switch (tstate) { + case "OVER": + toolmsg = [ + `Caution: The current tool path file would move`, + `${this._length_str(pathMax + off - max)}`, + `above axis limit with the current offset.` + ].join(" "); + break; + + case "UNDER": + toolmsg = [ + `Caution: The current tool path file would move`, + `${this._length_str(min - pathMin - off)}`, + `below limit with the current offset.` + ].join(" "); + break; + + case "NO FIT": + toolmsg = [ + `Warning: The current tool path dimensions`, + `(${this._length_str(pathDim)}) exceed axis dimensions`, + `(${this._length_str(dim)}) by ${this._length_str(pathDim - dim)}.` + ].join(" "); + break; + + default: + toolmsg = `Tool path ${axis} dimensions OK.`; + break; + } + + return { + pos: abs - off, + abs: abs, + off: off, + min: min, + max: max, + dim: dim, + pathMin: pathMin, + pathMax: pathMax, + pathDim: pathDim, + motor: motor_id, + enabled: enabled, + homingMode: homingMode, + homed: homed, + klass: klass, + state: state, + icon: icon, + title: title, + ticon: ticon, + tstate: tstate, + toolmsg: toolmsg, + tklass: tklass + }; + }, + + _get_motor_id: function(axis) { + for (let i = 0; i < this.config.motors.length; i++) { + const motor = this.config.motors[i]; + if (motor.axis.toLowerCase() == axis) { + return i; + } + } + + return -1; + }, + + _compute_axes: function() { + let homed = false; + + for (const name of "xyzabc") { + const axis = this[name]; + + if (!axis.enabled) { + continue; + } + + if (!axis.homed) { + homed = false; break; + } + + homed = true; + } + + let error = false; + let warn = false; + + if (homed) { + for (const name of "xyzabc") { + const axis = this[name]; + + if (!axis.enabled) { + continue; + } + + if (axis.klass.indexOf("error") != -1) { + error = true; + } + + if (axis.klass.indexOf("warn") != -1) { + warn = true; + } + } + } + + let klass = homed ? "homed" : "unhomed"; + if (error) { + klass += " error"; + } else if (warn) { + klass += " warn"; + } + + if (!homed && this.ask_home) { + this.ask_home = false; + SvelteComponents.showDialog("HomeMachine", { + home: () => this.home() + }); + } + + return { + homed: homed, + klass: klass + }; } - - var klass = homed ? 'homed' : 'unhomed'; - if (error) klass += ' error'; - else if (warn) klass += ' warn'; - - if(!homed && this.ask_home) - { - this.ask_home_msg = true; - this.ask_home = false; - } - - return { - homed: homed, - klass: klass - } } - } -} +}; diff --git a/src/js/console.js b/src/js/console.js index 5607bba..ccaf5eb 100644 --- a/src/js/console.js +++ b/src/js/console.js @@ -1,87 +1,77 @@ -/******************************************************************************\ - - This file is part of the Buildbotics firmware. - - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. - - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . - - The software 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . - - For information regarding this software email: - "Joseph Coffland" - -\******************************************************************************/ - -'use strict' - +"use strict"; function _msg_equal(a, b) { - return a.level == b.level && a.source == b.source && a.where == b.where && - a.msg == b.msg; + return a.level == b.level + && a.source == b.source + && a.where == b.where + && a.msg == b.msg; } - // Shared among all instances -var messages = []; - +const messages = []; module.exports = { - template: '#console-template', + template: "#console-template", + data: function() { + return { + messages + }; + }, - data: function () { - return {messages: messages} - }, + events: { + log: function(msg) { + // There may be multiple instances of this module so ignore messages + // that have already been processed. + if (msg.logged) { + return; + } + msg.logged = true; - events: { - log: function (msg) { - // There may be multiple instances of this module so ignore messages - // that have already been processed. - if (msg.logged) return; - msg.logged = true; + // Make sure we have a message level + msg.level = msg.level || "info"; - // Make sure we have a message level - msg.level = msg.level || 'info'; + // Add to message log and count and collapse repeats + const repeat = messages.length && _msg_equal(msg, messages[0]); + if (repeat) { + messages[0].repeat++; + } else { + msg.repeat = msg.repeat || 1; + messages.unshift(msg); + while (256 < messages.length) { + messages.pop(); + } + } - // Add to message log and count and collapse repeats - var repeat = messages.length && _msg_equal(msg, messages[0]); - if (repeat) messages[0].repeat++; - else { - msg.repeat = msg.repeat || 1; - messages.unshift(msg); - while (256 < messages.length) messages.pop(); - } - msg.ts = Date.now(); + if (messages[0].repeat > 1) { + return; + } - // Write message to browser console for debugging - var text = JSON.stringify(msg); - if (msg.level == 'error' || msg.level == 'critical') console.error(text); - else if (msg.level == 'warning') console.warn(text); - else if (msg.level == 'debug' && console.debug) console.debug(text); - else console.log(text); + msg.ts = Date.now(); - // Event on errors - if (msg.level == 'error' || msg.level == 'critical') - this.$dispatch('error', msg); + // Write message to browser console for debugging + const text = JSON.stringify(msg); + if (msg.level == "error" || msg.level == "critical") { + console.error(text); + } else if (msg.level == "warning") { + console.warn(text); + } else if (msg.level == "debug" && console.debug) { + console.debug(text); + } else { + console.log(text); + } + + // Event on errors + if (msg.level == "error" || msg.level == "critical") { + this.$dispatch("error", msg); + } + } + }, + + methods: { + clear: function() { + messages.splice(0, messages.length); + }, } - }, - - - methods: { - clear: function () {messages.splice(0, messages.length);}, - } -} +}; diff --git a/src/js/control-view.js b/src/js/control-view.js index 802f3d5..bce3252 100644 --- a/src/js/control-view.js +++ b/src/js/control-view.js @@ -1,713 +1,499 @@ -/******************************************************************************\ +"use strict"; - This file is part of the Buildbotics firmware. - - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. - - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . - - The software 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . - - For information regarding this software email: - "Joseph Coffland" - -\******************************************************************************/ - -'use strict' - -var api = require('./api'); -var cookie = require('./cookie')('bbctrl-'); +const api = require("./api"); +const utils = require("./utils"); +const cookie = require("./cookie")("bbctrl-"); module.exports = { - template: '#control-view-template', - props: ['config', 'template', 'state'], + template: "#control-view-template", + props: [ "config", "template", "state" ], - data: function () { - return { - mach_units: 'METRIC', - mdi: '', - last_file: undefined, - last_file_time: undefined, - toolpath: {}, - toolpath_progress: 0, - axes: 'xyzabc', - history: [], - speed_override: 1, - feed_override: 1, - manual_home: { - x: false, - y: false, - z: false, - a: false, - b: false, - c: false - }, - position_msg: { - x: false, - y: false, - z: false, - a: false, - b: false, - c: false - }, - axis_position: 0, - jog_step: cookie.get_bool('jog-step'), - jog_adjust: parseInt(cookie.get('jog-adjust', 2)), - deleteGCode: false, - tab: 'auto', - jog_incr: 1.0, - tool_diameter: 6.35, - tool_diameter_for_prompt: 6.35, - show_probe_test_modal: false, - show_tool_diameter_modal: false, - toolpath_msg: { - x: false, - y: false, - z: false, - a: false, - b: false, - c: false - }, - ask_home: true, - ask_home_msg: false, - ask_zero_xy_msg: false, - ask_zero_z_msg: false, - showGcodeMessage: false - } - }, - - components: { - 'axis-control': require('./axis-control'), - 'path-viewer': require('./path-viewer'), - 'gcode-viewer': require('./gcode-viewer') - }, - - - watch: { - 'state.imperial': { - handler: function (imperial) { - this.mach_units = imperial ? 'IMPERIAL' : 'METRIC'; - }, - immediate: true - }, - - 'state.bitDiameter': { - handler: function (bitDiameter) { - this.tool_diameter = bitDiameter; - }, - immediate: true + data: function() { + return { + current_time: "", + mach_units: this.$root.state.metric ? "METRIC" : "IMPERIAL", + mdi: "", + last_file: undefined, + last_file_time: undefined, + toolpath: {}, + toolpath_progress: 0, + axes: "xyzabc", + history: [], + speed_override: 1, + feed_override: 1, + jog_incr_amounts: { + "METRIC": { + fine: 0.1, + small: 1.0, + medium: 10, + large: 100, + }, + "IMPERIAL": { + fine: 0.005, + small: 0.05, + medium: 0.5, + large: 5, + } + }, + jog_incr: localStorage.getItem("jog_incr") || "small", + jog_step: cookie.get_bool("jog-step"), + jog_adjust: parseInt(cookie.get("jog-adjust", 2)), + deleteGCode: false, + tab: "auto", + ask_home: true, + showGcodeMessage: false + }; }, - - mach_units: function (units) { - if ((units == 'METRIC') != this.metric) - this.send(units == 'METRIC' ? 'G21' : 'G20'); - - this.units_changed(); + components: { + "axis-control": require("./axis-control"), + "path-viewer": require("./path-viewer"), + "gcode-viewer": require("./gcode-viewer") }, - 'state.line': function () { - if (this.mach_state != 'HOMING') - this.$broadcast('gcode-line', this.state.line); - }, - - 'state.selected_time': function () { - this.load(); - }, - - jog_step: function () { - cookie.set_bool('jog-step', this.jog_step); - }, - - jog_adjust: function () { - cookie.set('jog-adjust', this.jog_adjust); - } - }, - - - computed: { - metric: function () { - return !this.state.imperial; - }, - - - mach_state: function () { - var cycle = this.state.cycle; - var state = this.state.xx; - - if (typeof cycle != 'undefined' && state != 'ESTOPPED' && - (cycle == 'jogging' || cycle == 'homing')) - return cycle.toUpperCase(); - return state || '' - }, - - - pause_reason: function () {return this.state.pr}, - - - is_running: function () { - return this.mach_state == 'RUNNING' || this.mach_state == 'HOMING'; - }, - - - is_stopping: function () {return this.mach_state == 'STOPPING'}, - is_holding: function () {return this.mach_state == 'HOLDING'}, - is_ready: function () {return this.mach_state == 'READY'}, - is_idle: function () {return this.state.cycle == 'idle'}, - - - is_paused: function () { - return this.is_holding && - (this.pause_reason == 'User pause' || - this.pause_reason == 'Program pause') - }, - - - can_mdi: function () {return this.is_idle || this.state.cycle == 'mdi'}, - - - can_set_axis: function () { - return this.is_idle - // TODO allow setting axis position during pause - return this.is_idle || this.is_paused - }, - - - message: function () { - if (this.mach_state == 'ESTOPPED') return this.state.er; - if (this.mach_state == 'HOLDING') return this.state.pr; - if (this.state.messages.length) - return this.state.messages.slice(-1)[0].text; - return ''; - }, - - - highlight_state: function () { - return this.mach_state == 'ESTOPPED' || this.mach_state == 'HOLDING'; - }, - - - plan_time: function () {return this.state.plan_time}, - - - plan_time_remaining: function () { - if (!(this.is_stopping || this.is_running || this.is_holding)) return 0; - return this.toolpath.time - this.plan_time - }, - - - eta: function () { - if (this.mach_state != 'RUNNING') return ''; - var remaining = this.plan_time_remaining; - var d = new Date(); - d.setSeconds(d.getSeconds() + remaining); - return d.toLocaleString(); - }, - - - progress: function () { - if (!this.toolpath.time || this.is_ready) return 0; - var p = this.plan_time / this.toolpath.time; - return p < 1 ? p : 1; - } - }, - - - events: { - jog: function (axis, power) { - var data = {ts: new Date().getTime()}; - data[axis] = power; - api.put('jog', data); - }, - - back2zero: function(axis0,axis1) { - this.send("G0"+axis0+"0"+axis1+"0"); - }, - - step: function (axis, value) { - this.send('M70\nG91\nG0' + axis + value + '\nM72'); - }, - - probing_failed: function() { - Vue.set(this.state, "probing_active", false); - Vue.set(this.state, "wait_for_probing_complete", false); - Vue.set(this.state, "show_probe_complete_modal", false); - Vue.set(this.state, "goto_xy_zero_after_probe", false); - - Vue.set(this.state, "show_probe_failed_modal", true); - }, - - probing_complete: function() { - Vue.set(this.state, "probing_active", false); - - if (this.config.settings['probing-prompts']) { - Vue.set(this.state, "show_probe_complete_modal", true); - } else { - this.$emit("finalize_probe"); - } - }, - - finalize_probe: function() { - Vue.set(this.state, "show_probe_complete_modal", false); - - if (this.state.goto_xy_zero_after_probe) { - this.goto_zero(1, 1, 0, 0); - } - - Vue.set(this.state, "goto_xy_zero_after_probe", false); - } - }, - - - ready: function () { - this.load() - }, - - - methods: { - units_changed : function() { - if(this.mach_units == 'METRIC') { - document.getElementById("jog_button_fine").innerHTML = "0.1"; - document.getElementById("jog_button_small").innerHTML = "1.0"; - document.getElementById("jog_button_medium").innerHTML = "10"; - document.getElementById("jog_button_large").innerHTML = "100"; - } else { - document.getElementById("jog_button_fine").innerHTML = "0.005"; - document.getElementById("jog_button_small").innerHTML = "0.05"; - document.getElementById("jog_button_medium").innerHTML = "0.5"; - document.getElementById("jog_button_large").innerHTML = "5"; - } - - this.set_jog_incr('small'); - }, - - start_probe_test: function(on_finish) { - if (!this.config.settings['probing-prompts']) { - on_finish(); - return; - } - - this.show_probe_test_modal = true; - Vue.set(this.state, "saw_probe_connected", false); - Vue.set(this.state, "on_probe_finish", on_finish); - }, - - finish_probe_test: function() { - this.show_probe_test_modal = false; - Vue.set(this.state, "saw_probe_connected", false); - - const on_finish = this.state.on_probe_finish; - Vue.set(this.state, "on_probe_finish", undefined); - - on_finish(); - }, - - hide_probe_failed_modal: function() { - Vue.set(this.state, "show_probe_failed_modal", false); - }, - - prep_and_show_tool_diameter_modal() { - this.tool_diameter_for_prompt = (this.mach_units == 'METRIC') - ? this.tool_diameter - : this.tool_diameter / 25.4; - - this.tool_diameter_for_prompt = this.tool_diameter_for_prompt.toFixed(3).replace(/0+$/, ""); - - this.show_tool_diameter_modal = true; - }, - - set_tool_diameter() { - this.tool_diameter = parseFloat(this.tool_diameter_for_prompt); - - if (!isFinite(this.tool_diameter)) { - return; - } - - this.show_tool_diameter_modal = false; - - if (this.mach_units !== "METRIC") { - this.tool_diameter *= 25.4; - } - - this.probe_xyz(); - }, - - probe(zOnly = false) { - const xdim = this.config.probe["probe-xdim"]; - const ydim = this.config.probe["probe-ydim"]; - const zdim = this.config.probe["probe-zdim"]; - const slowSeek = this.config.probe["probe-slow-seek"]; - const fastSeek = this.config.probe["probe-fast-seek"]; - - const zlift = 1; - const xoffset = xdim + (this.tool_diameter / 2.0); - const yoffset = ydim + (this.tool_diameter / 2.0); - const zoffset = zdim; - - const metric = this.mach_units == "METRIC"; - const mm = n => (metric ? n : n / 25.4).toFixed(5); - const speed = s => `F${mm(s)}`; - - // After probing Z, we want to drop the bit down: - // Ideally, 12.7mm/0.5in - // And we don't want to be more than 75% down on the probe block - // Also, add zlift to compensate for the fact that we lift after probing Z - const plunge = Math.min(12.7, zoffset * 0.75) + zlift; - - Vue.set(this.state, "probing_active", true); - Vue.set(this.state, "goto_xy_zero_after_probe", !zOnly); - - if (zOnly) { - this.send(` - ${metric ? "G21" : "G20"} - G92 Z0 - - G38.2 Z ${mm(-25.4)} ${speed(fastSeek)} - G91 G1 Z ${mm(1)} - G38.2 Z ${mm(-2)} ${speed(slowSeek)} - G92 Z ${mm(zoffset)} - - G91 G0 Z ${mm(3)} - - M2 - `); - } else { - this.send(` - ${metric ? "G21" : "G20"} - G92 X0 Y0 Z0 - - G38.2 Z ${mm(-25.4)} ${speed(fastSeek)} - G91 G1 Z ${mm(1)} - G38.2 Z ${mm(-2)} ${speed(slowSeek)} - G92 Z ${mm(zoffset)} - - G91 G0 Z ${mm(zlift)} - G91 G0 X ${mm(20)} - G91 G0 Z ${mm(-plunge)} - G38.2 X ${mm(-20)} ${speed(fastSeek)} - G91 G1 X ${mm(1)} - G38.2 X ${mm(-2)} ${speed(slowSeek)} - G92 X ${mm(xoffset)} - - G91 G0 X ${mm(1)} - G91 G0 Y ${mm(20)} - G91 G0 X ${mm(-20)} - G38.2 Y ${mm(-20)} ${speed(fastSeek)} - G91 G1 Y ${mm(1)} - G38.2 Y ${mm(-2)} ${speed(slowSeek)} - G92 Y ${mm(yoffset)} - - G91 G0 Y ${mm(3)} - G91 G0 Z ${mm(25.4)} - - M2 - `); - } - - // Wait 1 second to let the probing sequence begin, - // then wait for probing to be complete - setTimeout(() => Vue.set(this.state, "wait_for_probing_complete", true), 1000); - }, - - probe_xyz() { - this.probe(false); - }, - - probe_z() { - this.probe(true); - }, - - set_jog_incr: function(newValue) { - document.getElementById("jog_button_fine").style.fontWeight = 'normal'; - document.getElementById("jog_button_small").style.fontWeight = 'normal'; - document.getElementById("jog_button_medium").style.fontWeight = 'normal'; - document.getElementById("jog_button_large").style.fontWeight = 'normal'; - - if (newValue == 'fine') { - document.getElementById("jog_button_fine").style.fontWeight = 'bold'; - if(this.mach_units == 'METRIC') - this.jog_incr = 0.1; - else - this.jog_incr = 0.005; - } else if (newValue == 'small') { - document.getElementById("jog_button_small").style.fontWeight = 'bold'; - if(this.mach_units == 'METRIC') - this.jog_incr = 1.0; - else - this.jog_incr = 0.05; - } else if (newValue == 'medium') { - document.getElementById("jog_button_medium").style.fontWeight = 'bold'; - if(this.mach_units == 'METRIC') - this.jog_incr = 10; - else - this.jog_incr = 0.5; - } else if (newValue == 'large') { - document.getElementById("jog_button_large").style.fontWeight = 'bold'; - - this.jog_incr = (this.mach_units == 'METRIC') - ? 100 - : 5; - } - }, - - goto_zero(zero_x,zero_y,zero_z,zero_a) { - var xcmd = ""; - var ycmd = ""; - var zcmd = ""; - var acmd = ""; - if(zero_x) xcmd = "X0"; - if(zero_y) ycmd = "Y0"; - if(zero_z) zcmd = "Z0"; - if(zero_a) acmd = "A0"; - - this.ask_zero_xy_msg = false; - this.ask_zero_z_msg = false; - - this.send('G90\nG0' + xcmd + ycmd + zcmd + acmd + '\n'); - }, - - jog_fn: function (x_jog,y_jog,z_jog,a_jog) { - var xcmd = "X" + x_jog * this.jog_incr; - var ycmd = "Y" + y_jog * this.jog_incr; - var zcmd = "Z" + z_jog * this.jog_incr; - var acmd = "A" + a_jog * this.jog_incr; - - this.send('G91\nG0' + xcmd + ycmd + zcmd + acmd + '\n'); - }, - - send: function (msg) { - this.$dispatch('send', msg) - }, - - load: function () { - var file_time = this.state.selected_time; - var file = this.state.selected; - if (this.last_file == file && this.last_file_time == file_time) return; - this.last_file = file; - this.last_file_time = file_time; - - this.$broadcast('gcode-load', file); - this.$broadcast('gcode-line', this.state.line); - this.toolpath_progress = 0; - this.load_toolpath(file, file_time); - }, - - - load_toolpath: async function (file, file_time) { - this.toolpath = {}; - - if (!file) return; - if (this.last_file_time != file_time) return; - - this.showGcodeMessage = true; - - while (this.showGcodeMessage) { - const toolpath = await api.get(`path/${file}`); - this.toolpath_progress = toolpath.progress; - - if (toolpath.progress === 1 || typeof toolpath.progress == 'undefined') { - this.showGcodeMessage = false - - if (toolpath.bounds) { - toolpath.filename = file; - this.toolpath_progress = 1; - this.toolpath = toolpath; - - const state = this.$root.state; - for (let axis of 'xyzabc') { - Vue.set(state, 'path_min_' + axis, toolpath.bounds.min[axis]); - Vue.set(state, 'path_max_' + axis, toolpath.bounds.max[axis]); + watch: { + jog_incr: function(value) { + localStorage.setItem("jog_incr", value); + }, + + "state.metric": { + handler: function(metric) { + this.mach_units = metric + ? "METRIC" + : "IMPERIAL"; + }, + immediate: true + }, + + "state.line": function() { + if (this.mach_state != "HOMING") { + this.$broadcast("gcode-line", this.state.line); } - } + }, + + "state.selected_time": function() { + this.load(); + }, + + jog_step: function() { + cookie.set_bool("jog-step", this.jog_step); + }, + + jog_adjust: function() { + cookie.set("jog-adjust", this.jog_adjust); } - } }, + computed: { + display_units: { + cache: false, + get: function() { + return this.$root.display_units; + }, + set: function(value) { + this.$root.display_units = value; + } + }, - submit_mdi: function () { - this.send(this.mdi); - if (!this.history.length || this.history[0] != this.mdi) - this.history.unshift(this.mdi); - this.mdi = ''; + metric: function() { + return this.display_units === "METRIC"; + }, + + mach_state: function() { + const cycle = this.state.cycle; + const state = this.state.xx; + + if (state != "ESTOPPED" && (cycle == "jogging" || cycle == "homing")) { + return cycle.toUpperCase(); + } + + return state || ""; + }, + + pause_reason: function() { + return this.state.pr; + }, + + is_running: function() { + return this.mach_state == "RUNNING" || this.mach_state == "HOMING"; + }, + + is_stopping: function() { + return this.mach_state == "STOPPING"; + }, + + is_holding: function() { + return this.mach_state == "HOLDING"; + }, + + is_ready: function() { + return this.mach_state == "READY"; + }, + + is_idle: function() { + return this.state.cycle == "idle"; + }, + + is_paused: function() { + return this.is_holding && (this.pause_reason == "User pause" || this.pause_reason == "Program pause"); + }, + + can_mdi: function() { + return this.is_idle || this.state.cycle == "mdi"; + }, + + can_set_axis: function() { + return this.is_idle; + + // TODO allow setting axis position during pause + // return this.is_idle || this.is_paused; + }, + + message: function() { + if (this.mach_state == "ESTOPPED") { + return this.state.er; + } + + if (this.mach_state == "HOLDING") { + return this.state.pr; + } + + if (this.state.messages.length) { + return this.state.messages.slice(-1)[0].text; + } + + return ""; + }, + + highlight_state: function() { + return this.mach_state == "ESTOPPED" || this.mach_state == "HOLDING"; + }, + + plan_time: function() { + return this.state.plan_time; + }, + + plan_time_remaining: function() { + if (!(this.is_stopping || this.is_running || this.is_holding)) { + return 0; + } + + return this.toolpath.time - this.plan_time; + }, + + eta: function() { + if (this.mach_state != "RUNNING") { + return ""; + } + + const remaining = this.plan_time_remaining; + const d = new Date(); + d.setSeconds(d.getSeconds() + remaining); + return d.toLocaleString(); + }, + + progress: function() { + if (!this.toolpath.time || this.is_ready) { + return 0; + } + + const p = this.plan_time / this.toolpath.time; + return Math.min(1, p); + } }, + events: { + jog: function(axis, power) { + const data = { ts: new Date().getTime() }; + data[axis] = power; + api.put("jog", data); + }, - mdi_start_pause: function () { - if (this.state.xx == 'RUNNING') this.pause(); + back2zero: function(axis0, axis1) { + this.send(`G0 ${axis0}0 ${axis1}0`); + }, - else if (this.state.xx == 'STOPPING' || this.state.xx == 'HOLDING') - this.unpause(); - - else this.submit_mdi(); + step: function(axis, value) { + this.send(` + M70 + G91 + G0 ${axis}${value} + M72 + `); + }, }, + ready: function() { + this.load(); - load_history: function (index) { - this.mdi = this.history[index]; + setInterval(() => { + this.current_time = new Date().toLocaleTimeString(); + }, 1000); + + SvelteComponents.registerControllerMethods({ + stop: (...args) => this.stop(...args), + send: (...args) => this.send(...args), + isAxisHomed: (axis) => this[axis].homed, + unhome: (...args) => this.unhome(...args), + set_position: (...args) => this.set_position(...args), + set_home: (...args) => this.set_home(...args) + }); }, + methods: { + getJogIncrStyle(value) { + const weight = `font-weight:${this.jog_incr === value ? "bold" : "normal"}`; + const color = this.jog_incr === value ? "color:#0078e7" : ""; - open: function (e) { - // If we don't reset the form the browser may cache file if name is same - // even if contents have changed - $('.gcode-file-input')[0].reset(); - $('.gcode-file-input input').click(); + return [ weight, color ].join(";"); + }, + + jog_fn: function(x_jog, y_jog, z_jog, a_jog) { + const amount = this.jog_incr_amounts[this.display_units][this.jog_incr]; + + const xcmd = `X${x_jog * amount}`; + const ycmd = `Y${y_jog * amount}`; + const zcmd = `Z${z_jog * amount}`; + const acmd = `A${a_jog * amount}`; + + this.send(` + G91 + ${this.metric ? "G21" : "G20"} + G0 ${xcmd}${ycmd}${zcmd}${acmd} + `); + }, + + send: function(msg) { + this.$dispatch("send", msg); + }, + + load: function() { + const file_time = this.state.selected_time; + const file = this.state.selected; + if (this.last_file == file && this.last_file_time == file_time) { + return; + } + + this.last_file = file; + this.last_file_time = file_time; + + this.$broadcast("gcode-load", file); + this.$broadcast("gcode-line", this.state.line); + this.toolpath_progress = 0; + this.load_toolpath(file, file_time); + }, + + load_toolpath: async function(file, file_time) { + this.toolpath = {}; + + if (!file || this.last_file_time != file_time) { + return; + } + + this.showGcodeMessage = true; + + while (this.showGcodeMessage) { + const toolpath = await api.get(`path/${file}`); + this.toolpath_progress = toolpath.progress; + + if (toolpath.progress === 1 || typeof toolpath.progress == "undefined") { + this.showGcodeMessage = false; + + if (toolpath.bounds) { + toolpath.filename = file; + this.toolpath_progress = 1; + this.toolpath = toolpath; + + const state = this.$root.state; + for (const axis of "xyzabc") { + Vue.set(state, `path_min_${axis}`, toolpath.bounds.min[axis]); + Vue.set(state, `path_max_${axis}`, toolpath.bounds.max[axis]); + } + } + } + } + }, + + submit_mdi: function() { + this.send(this.mdi); + + if (!this.history.length || this.history[0] != this.mdi) { + this.history.unshift(this.mdi); + } + + this.mdi = ""; + }, + + mdi_start_pause: function() { + if (this.state.xx == "RUNNING") { + this.pause(); + } else if (this.state.xx == "STOPPING" || this.state.xx == "HOLDING") { + this.unpause(); + } else { + this.submit_mdi(); + } + }, + + load_history: function(index) { + this.mdi = this.history[index]; + }, + + open: function() { + utils.clickFileInput("gcode-file-input"); + }, + + upload: function(e) { + const files = e.target.files || e.dataTransfer.files; + if (!files.length) { + return; + } + + const file = files[0]; + + const extension = file.name.split(".").pop(); + switch (extension.toLowerCase()) { + case "nc": + case "ngc": + case "gcode": + case "gc": + break; + + default: + alert(`Unsupported file type: ${extension}`); + return; + } + + SvelteComponents.showDialog("Upload", { + file, + onComplete: () => { + this.last_file_time = undefined; // Force reload + this.$broadcast("gcode-reload", file.name); + } + }); + }, + + delete_current: function() { + if (this.state.selected) { + api.delete(`file/${this.state.selected}`); + } + + this.deleteGCode = false; + }, + + delete_all: function() { + api.delete("file"); + this.deleteGCode = false; + }, + + home: function(axis) { + this.ask_home = false; + + if (typeof axis == "undefined") { + api.put("home"); + } else if (this[axis].homingMode != "manual") { + api.put(`home/${axis}`); + } else { + SvelteComponents.showDialog("ManualHomeAxis", { axis }); + } + }, + + set_home: function(axis, position) { + api.put(`home/${axis}/set`, { position: parseFloat(position) }); + }, + + unhome: function(axis) { + api.put(`home/${axis}/clear`); + }, + + show_set_position: function(axis) { + SvelteComponents.showDialog("SetAxisPosition", { axis }); + }, + + showMoveToZeroDialog: function(axes) { + SvelteComponents.showDialog("MoveToZero", { axes }); + }, + + showToolpathMessageDialog: function(axis) { + SvelteComponents.showDialog("Message", { title: this[axis].toolmsg }); + }, + + set_position: function(axis, position) { + api.put(`position/${axis}`, { "position": parseFloat(position) }); + }, + + zero_all: function() { + for (const axis of "xyzabc") { + if (this[axis].enabled) { + this.zero(axis); + } + } + }, + + zero: function(axis) { + if (typeof axis == "undefined") { + this.zero_all(); + } else { + this.set_position(axis, 0); + } + }, + + start_pause: function() { + if (this.state.xx == "RUNNING") { + this.pause(); + } else if (this.state.xx == "STOPPING" || this.state.xx == "HOLDING") { + this.unpause(); + } else { + this.start(); + } + }, + + start: function() { + api.put("start"); + }, + + pause: function() { + api.put("pause"); + }, + + unpause: function() { + api.put("unpause"); + }, + + optional_pause: function() { + api.put("pause/optional"); + }, + + stop: function() { + api.put("stop"); + }, + + step: function() { + api.put("step"); + }, + + override_feed: function() { + api.put(`override/feed/${this.feed_override}`); + }, + + override_speed: function() { + api.put(`override/speed/${this.speed_override}`); + }, + + current: function(axis, value) { + const x = value / 32.0; + if (this.state[`${axis}pl`] == x) { + return; + } + + const data = {}; + data[`${axis}pl`] = x; + this.send(JSON.stringify(data)); + }, + + showProbeDialog: function(probeType) { + SvelteComponents.showDialog("Probe", { probeType }); + } }, - - upload: async function (e) { - const files = e.target.files || e.dataTransfer.files; - if (!files.length) { - return; - } - - const file = files[0]; - - const extension = file.name.split(".").pop(); - switch (extension.toLowerCase()) { - case "nc": - case "ngc": - case "gcode": - case "gc": - break; - - default: - alert(`Unsupported file type: ${extension}`); - return; - } - - const fd = new FormData(); - - fd.append('gcode', file); - - try { - await api.upload('file', fd); - - this.last_file_time = undefined; // Force reload - this.$broadcast('gcode-reload', file.name); - } catch (err) { - api.alert('Upload failed', err) - } - }, - - - delete_current: function () { - if (this.state.selected) { - api.delete('file/' + this.state.selected); - } - - this.deleteGCode = false; - }, - - - delete_all: function () { - api.delete('file'); - this.deleteGCode = false; - }, - - - home: function (axis) { - - this.ask_home = false; - this.ask_home_msg = false; - - if (typeof axis == 'undefined') api.put('home'); - - else { - if (this[axis].homingMode != 'manual') api.put('home/' + axis); - else this.manual_home[axis] = true; - } - }, - - - set_home: function (axis, position) { - this.manual_home[axis] = false; - api.put('home/' + axis + '/set', {position: parseFloat(position)}); - }, - - - unhome: function (axis) { - this.position_msg[axis] = false; - api.put('home/' + axis + '/clear'); - }, - - - show_set_position: function (axis) { - this.axis_position = 0; - this.position_msg[axis] = true; - }, - - show_toolpath_msg : function(axis) { - this.toolpath_msg[axis] = true; - }, - - - set_position: function (axis, position) { - this.position_msg[axis] = false; - api.put('position/' + axis, {'position': parseFloat(position)}); - }, - - - zero_all: function () { - for (var axis of 'xyzabc') - if (this[axis].enabled) this.zero(axis); - }, - - - zero: function (axis) { - if (typeof axis == 'undefined') this.zero_all(); - else this.set_position(axis, 0); - }, - - - start_pause: function () { - if (this.state.xx == 'RUNNING') this.pause(); - - else if (this.state.xx == 'STOPPING' || this.state.xx == 'HOLDING') - this.unpause(); - - else this.start(); - }, - - - start: function () {api.put('start')}, - pause: function () {api.put('pause')}, - unpause: function () {api.put('unpause')}, - optional_pause: function () {api.put('pause/optional')}, - stop: function () {api.put('stop')}, - step: function () {api.put('step')}, - - - override_feed: function () {api.put('override/feed/' + this.feed_override)}, - - - override_speed: function () { - api.put('override/speed/' + this.speed_override) - }, - - - current: function (axis, value) { - var x = value / 32.0; - if (this.state[axis + 'pl'] == x) return; - - var data = {}; - data[axis + 'pl'] = x; - this.send(JSON.stringify(data)); - } - }, - - - mixins: [require('./axis-vars')] -} + mixins: [ require("./axis-vars") ] +}; diff --git a/src/js/cookie.js b/src/js/cookie.js index 6244436..2ec1e36 100644 --- a/src/js/cookie.js +++ b/src/js/cookie.js @@ -1,69 +1,49 @@ -/******************************************************************************\ +"use strict"; - Copyright 2018. Buildbotics LLC - All Rights Reserved. - - For information regarding this software email: - Joseph Coffland - joseph@buildbotics.com - - This software is free software: you clan redistribute it and/or - modify it under the terms of the GNU Lesser General Public License - as published by the Free Software Foundation, either version 2.1 of - the License, or (at your option) any later version. - - This software 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the C! library. If not, see - . - -\******************************************************************************/ - -'use strict' - - -module.exports = function (prefix) { - if (typeof prefix == 'undefined') prefix = ''; - - var cookie = { - get: function (name, defaultValue) { - var decodedCookie = decodeURIComponent(document.cookie); - var ca = decodedCookie.split(';'); - name = prefix + name + '='; - - for (var i = 0; i < ca.length; i++) { - var c = ca[i]; - while (c.charAt(0) == ' ') c = c.substring(1); - if (!c.indexOf(name)) return c.substring(name.length, c.length); - } - - return defaultValue; - }, - - - set: function (name, value, days) { - var offset = 2147483647; // Max value - if (typeof days != 'undefined') offset = days * 24 * 60 * 60 * 1000; - var d = new Date(); - d.setTime(d.getTime() + offset); - var expires = 'expires=' + d.toUTCString(); - document.cookie = prefix + name + '=' + value + ';' + expires + ';path=/'; - }, - - - set_bool: function (name, value) { - cookie.set(name, value ? 'true' : 'false'); - }, - - - get_bool: function (name, defaultValue) { - return cookie.get(name, defaultValue ? 'true' : 'false') == 'true'; +module.exports = function(prefix) { + if (typeof prefix == "undefined") { + prefix = ""; } - } - return cookie; -} + const cookie = { + get: function(name, defaultValue) { + const decodedCookie = decodeURIComponent(document.cookie); + const ca = decodedCookie.split(";"); + name = `${prefix + name}=`; + + for (let i = 0; i < ca.length; i++) { + let c = ca[i]; + while (c.charAt(0) == " ") { + c = c.substring(1); + } + if (!c.indexOf(name)) { + return c.substring(name.length, c.length); + } + } + + return defaultValue; + }, + + set: function(name, value, days) { + let offset = 2147483647; // Max value + if (typeof days != "undefined") { + offset = days * 24 * 60 * 60 * 1000; + } + + const d = new Date(); + d.setTime(d.getTime() + offset); + const expires = `expires=${d.toUTCString()}`; + document.cookie = `${prefix}${name}=${value};${expires};path=/`; + }, + + set_bool: function(name, value) { + cookie.set(name, value ? "true" : "false"); + }, + + get_bool: function(name, defaultValue) { + return cookie.get(name, defaultValue ? "true" : "false") == "true"; + } + }; + + return cookie; +}; diff --git a/src/js/gcode-viewer.js b/src/js/gcode-viewer.js index 633a8d5..4a877df 100644 --- a/src/js/gcode-viewer.js +++ b/src/js/gcode-viewer.js @@ -1,168 +1,154 @@ -/******************************************************************************\ - - This file is part of the Buildbotics firmware. - - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. - - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . - - The software 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . - - For information regarding this software email: - "Joseph Coffland" - -\******************************************************************************/ - -'use strict' - -var api = require('./api'); - - -var entityMap = { - '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', - '/': '/', '`': '`', '=': '='} +"use strict"; +const entityMap = { + "&": "&", "<": "<", ">": ">", '"': """, "'": "'", + "/": "/", "`": "`", "=": "=" }; function escapeHTML(s) { - return s.replace(/[&<>"'`=\/]/g, function (c) {return entityMap[c]}) + return s.replace(/[&<>"'`=\\/]/g, function(c) { + return entityMap[c]; + }); } - module.exports = { - template: '#gcode-viewer-template', + template: "#gcode-viewer-template", - - data: function () { - return { - empty: true, - file: '', - line: -1, - scrolling: false - } - }, - - - events: { - 'gcode-load': function (file) {this.load(file)}, - 'gcode-clear': function () {this.clear()}, - 'gcode-reload': function (file) {this.reload(file)}, - 'gcode-line': function (line) {this.update_line(line)} - }, - - - ready: function () { - this.clusterize = new Clusterize({ - rows: [], - scrollElem: $(this.$el).find('.clusterize-scroll')[0], - contentElem: $(this.$el).find('.clusterize-content')[0], - no_data_text: 'GCode view...', - callbacks: {clusterChanged: this.highlight} - }); - }, - - - attached: function () { - if (typeof this.clusterize != 'undefined') - this.clusterize.refresh(true); - }, - - - methods: { - load: async function(file) { - if (file == this.file) return; - this.clear(); - this.file = file; - - if (!file) return; - - const response = await fetch(`/api/file/${file}?${Math.random()}`); - const text = await response.text(); - - if (text.length > 20e6) { - this.clusterize.update(['File is large - gcode view disabled']); - } else { - const lines = escapeHTML(text.trimRight()) - .split(/[\r\n]/) - .map((line, i) => `
  • ${i + 1}${line}
  • `); - - this.clusterize.update(lines); - } - - this.empty = false; - - Vue.nextTick(this.update_line); + data: function() { + return { + empty: true, + file: "", + line: -1 + }; }, - - clear: function () { - this.empty = true; - this.file = ''; - this.line = -1; - this.clusterize.clear(); - }, - - - reload: function (file) { - if (file != this.file) return; - this.clear(); - this.load(file); - }, - - - highlight: function () { - var e = $(this.$el).find('.highlight'); - if (e.length) e.removeClass('highlight'); - - e = $(this.$el).find('.ln' + this.line); - if (e.length) e.addClass('highlight'); - }, - - - update_line: function(line) { - if (typeof line != 'undefined') { - if (this.line == line) return; - this.line = line; - - } else line = this.line; - - var totalLines = this.clusterize.getRowsAmount(); - - if (line <= 0) line = 1; - if (totalLines < line) line = totalLines; - - var e = $(this.$el).find('.clusterize-scroll'); - - var lineHeight = e[0].scrollHeight / totalLines; - var linesPerPage = Math.floor(e[0].clientHeight / lineHeight); - var current = e[0].scrollTop / lineHeight; - var target = line - 1 - Math.floor(linesPerPage / 2); - - // Update scroll position - if (!this.scrolling) { - if (target < current - 20 || current + 20 < target) - e[0].scrollTop = target * lineHeight; - - else { - this.scrolling = true; - e.animate({scrollTop: target * lineHeight}, { - complete: function () {this.scrolling = false}.bind(this) - }) + events: { + "gcode-load": function(file) { + this.load(file); + }, + "gcode-clear": function() { + this.clear(); + }, + "gcode-reload": function(file) { + this.reload(file); + }, + "gcode-line": function(line) { + this.update_line(line); } - } + }, - Vue.nextTick(this.highlight); + ready: function() { + this.clusterize = new Clusterize({ + rows: [], + scrollElem: this.$el.querySelector(".clusterize-scroll"), + contentElem: this.$el.querySelector(".clusterize-content"), + no_data_text: "GCode view...", + callbacks: { clusterChanged: this.highlight } + }); + }, + + attached: function() { + if (typeof this.clusterize != "undefined") { + this.clusterize.refresh(true); + } + }, + + methods: { + load: async function(file) { + if (file == this.file) { + return; + } + + this.clear(); + this.file = file; + + if (!file) { + return; + } + + const response = await fetch(`/api/file/${file}`, { cache: "no-cache" }); + const text = await response.text(); + + if (text.length > 20e6) { + this.clusterize.update([ "File is large - gcode view disabled" ]); + } else { + const lines = escapeHTML(text.trimRight()) + .split(/[\r\n]/) + .map((line, i) => `
  • ${i + 1}${line}
  • `); + + this.clusterize.update(lines); + } + + this.empty = false; + + Vue.nextTick(this.update_line); + }, + + clear: function() { + this.empty = true; + this.file = ""; + this.line = -1; + this.clusterize.clear(); + }, + + reload: function(file) { + if (file != this.file) { + return; + } + + this.clear(); + this.load(file); + }, + + highlight: function() { + const highlights = this.$el.querySelectorAll(".highlight"); + for (const highlight of highlights) { + highlight.className = (highlight.className || "") + .split(" ") + .filter(c => c !== "highlight") + .join(" "); + } + + const lines = this.$el.querySelectorAll(`.ln${this.line}`); + for (const line of lines) { + line.className = (line.className || "") + .split(" ") + .filter(c => c !== "highlight") + .concat([ "highlight" ]) + .join(" "); + } + }, + + update_line: function(line) { + if (typeof line != "undefined") { + if (this.line == line) { + return; + } + + this.line = line; + } else { + line = this.line; + } + + const totalLines = this.clusterize.getRowsAmount(); + + if (line <= 0) { + line = 1; + } + + if (totalLines < line) { + line = totalLines; + } + + const scroll = this.$el.querySelector(".clusterize-scroll"); + + const lineHeight = scroll.scrollHeight / totalLines; + const linesPerPage = Math.floor(scroll.clientHeight / lineHeight); + const target = line - 1 - Math.floor(linesPerPage / 2); + + // Update scroll position + scroll.scrollTop = target * lineHeight; + + Vue.nextTick(this.highlight); + } } - } -} +}; diff --git a/src/js/help-view.js b/src/js/help-view.js new file mode 100644 index 0000000..c6ee6b0 --- /dev/null +++ b/src/js/help-view.js @@ -0,0 +1,14 @@ +module.exports = { + template: "#help-view-template", + + attached: function() { + this.svelteComponent = SvelteComponents.createComponent( + "HelpView", + document.getElementById("help") + ); + }, + + detached: function() { + this.svelteComponent.$destroy(); + } +}; diff --git a/src/js/indicators.js b/src/js/indicators.js index 0285784..811d63f 100644 --- a/src/js/indicators.js +++ b/src/js/indicators.js @@ -1,107 +1,94 @@ -/******************************************************************************\ - - This file is part of the Buildbotics firmware. - - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. - - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . - - The software 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . - - For information regarding this software email: - "Joseph Coffland" - -\******************************************************************************/ - -'use strict' - -var modbus = require('./modbus.js'); +"use strict"; +const modbus = require("./modbus.js"); module.exports = { - template: '#indicators-template', - props: ['state'], + template: "#indicators-template", + props: [ "state" ], + computed: { + modbus_status: function() { + return modbus.status_to_string(this.state.mx); + }, - computed: { - modbus_status: function () {return modbus.status_to_string(this.state.mx)}, + sense_error: function() { + let error = ""; + if (this.state.motor_voltage_sense_error) { + error += "Motor voltage\n"; + } + if (this.state.motor_current_sense_error) { + error += "Motor current\n"; + } + if (this.state.load1_sense_error) { + error += "Load 1\n"; + } + if (this.state.load2_sense_error) { + error += "Load 2\n"; + } + if (this.state.vdd_current_sense_error) { + error += "Vdd current\n"; + } - sense_error: function () { - var error = ''; + return error; + } + }, - if (this.state.motor_voltage_sense_error) error += 'Motor voltage\n'; - if (this.state.motor_current_sense_error) error += 'Motor current\n'; - if (this.state.load1_sense_error) error += 'Load 1\n'; - if (this.state.load2_sense_error) error += 'Load 2\n'; - if (this.state.vdd_current_sense_error) error += 'Vdd current\n'; + methods: { + is_motor_enabled: function(motor) { + return typeof this.state[`${motor}me`] != "undefined" && this.state[`${motor}me`]; + }, - return error; + get_min_pin: function(motor) { + switch (motor) { + case 0: return 3; + case 1: return 5; + case 2: return 9; + case 3: return 11; + } + }, + + get_max_pin: function(motor) { + switch (motor) { + case 0: return 4; + case 1: return 8; + case 2: return 10; + case 3: return 12; + } + }, + + motor_fault_class: function(motor, bit) { + if (typeof motor == "undefined") { + const status = this.state["fa"]; + + if (typeof status == "undefined") { + return "fa-question"; + } + + return `fa-thumbs-${status ? "down error" : "up success"}`; + } + + const flags = this.state[`${motor}df`]; + + if (typeof flags == "undefined") { + return "fa-question"; + } + + return (flags & (1 << bit)) ? "fa-thumbs-down error" : + "fa-thumbs-up success"; + }, + + motor_reset: function(motor) { + if (typeof motor == "undefined") { + let cmd = ""; + for (let i = 0; i < 4; i++) { + cmd += `\\$${i}df=0\n`; + } + + this.$dispatch("send", cmd); + } else { + this.$dispatch("send", `\\$${motor}df=0`); + } + } } - }, - - - methods: { - is_motor_enabled: function (motor) { - return typeof this.state[motor + 'me'] != 'undefined' && - this.state[motor + 'me']; - }, - - - get_min_pin: function (motor) { - switch (motor) { - case 0: return 3; - case 1: return 5; - case 2: return 9; - case 3: return 11; - } - }, - - - get_max_pin: function (motor) { - switch (motor) { - case 0: return 4; - case 1: return 8; - case 2: return 10; - case 3: return 12; - } - }, - - - motor_fault_class: function (motor, bit) { - if (typeof motor == 'undefined') { - var status = this.state['fa']; - if (typeof status == 'undefined') return 'fa-question'; - return 'fa-thumbs-' + (status ? 'down error' : 'up success') - } - - var flags = this.state[motor + 'df']; - if (typeof flags == 'undefined') return 'fa-question'; - return (flags & (1 << bit)) ? 'fa-thumbs-down error' : - 'fa-thumbs-up success'; - }, - - - motor_reset: function (motor) { - if (typeof motor == 'undefined') { - var cmd = ''; - for (var i = 0; i < 4; i++) - cmd += '\\$' + i + 'df=0\n'; - this.$dispatch('send', cmd); - - } else this.$dispatch('send', '\\$' + motor + 'df=0'); - } - } -} +}; diff --git a/src/js/io-indicator.js b/src/js/io-indicator.js index 1803661..f1956d0 100644 --- a/src/js/io-indicator.js +++ b/src/js/io-indicator.js @@ -1,177 +1,155 @@ -/******************************************************************************\ - - This file is part of the Buildbotics firmware. - - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. - - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . - - The software 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . - - For information regarding this software email: - "Joseph Coffland" - -\******************************************************************************/ - -'use strict' - +"use strict"; module.exports = { - template: "#io-indicator-template", - props: ['name', 'state'], + template: "#io-indicator-template", + props: [ "name", "state" ], + computed: { + klass: function() { + switch (this.name) { + case "min-switch-0": return this.get_motor_min_class(0); + case "min-switch-1": return this.get_motor_min_class(1); + case "min-switch-2": return this.get_motor_min_class(2); + case "min-switch-3": return this.get_motor_min_class(3); + case "max-switch-0": return this.get_motor_max_class(0); + case "max-switch-1": return this.get_motor_max_class(1); + case "max-switch-2": return this.get_motor_max_class(2); + case "max-switch-3": return this.get_motor_max_class(3); + case "estop": return this.get_input_class("ew", "et"); + case "probe": return this.get_input_class("pw", "pt"); + case "load-1": return this.get_output_class("1"); + case "load-2": return this.get_output_class("2"); + case "fault": return this.get_output_class("f"); + case "tool-enable-mode": return this.get_output_class("e"); + case "tool-direction-mode": return this.get_output_class("d"); + } + }, - computed: { - klass: function () { - if (this.name == 'min-switch-0') return this.get_motor_min_class(0); - if (this.name == 'min-switch-1') return this.get_motor_min_class(1); - if (this.name == 'min-switch-2') return this.get_motor_min_class(2); - if (this.name == 'min-switch-3') return this.get_motor_min_class(3); - if (this.name == 'max-switch-0') return this.get_motor_max_class(0); - if (this.name == 'max-switch-1') return this.get_motor_max_class(1); - if (this.name == 'max-switch-2') return this.get_motor_max_class(2); - if (this.name == 'max-switch-3') return this.get_motor_max_class(3); - if (this.name == 'estop') return this.get_input_class('ew', 'et'); - if (this.name == 'probe') return this.get_input_class('pw', 'pt'); - if (this.name == 'load-1') return this.get_output_class('1'); - if (this.name == 'load-2') return this.get_output_class('2'); - if (this.name == 'fault') return this.get_output_class('f'); - if (this.name == 'tool-enable-mode') return this.get_output_class('e'); - if (this.name == 'tool-direction-mode') return this.get_output_class('d'); + tooltip: function() { + switch (this.name) { + case "min-switch-0": return this.get_motor_min_tooltip(0); + case "min-switch-1": return this.get_motor_min_tooltip(1); + case "min-switch-2": return this.get_motor_min_tooltip(2); + case "min-switch-3": return this.get_motor_min_tooltip(3); + case "max-switch-0": return this.get_motor_max_tooltip(0); + case "max-switch-1": return this.get_motor_max_tooltip(1); + case "max-switch-2": return this.get_motor_max_tooltip(2); + case "max-switch-3": return this.get_motor_max_tooltip(3); + case "estop": return this.get_input_tooltip("ew", "et"); + case "probe": return this.get_input_tooltip("pw", "pt"); + case "load-1": return this.get_output_tooltip("1"); + case "load-2": return this.get_output_tooltip("2"); + case "fault": return this.get_output_tooltip("f"); + case "tool-direction-mode": return this.get_output_tooltip("d"); + case "tool-enable-mode": return this.get_output_tooltip("e"); + } + } }, + methods: { + get_io_state_class: function(active, state) { + if (typeof active == "undefined" || typeof state == "undefined") { + return "fa-exclamation-triangle warn"; + } - tooltip: function () { - if (this.name == 'min-switch-0') return this.get_motor_min_tooltip(0); - if (this.name == 'min-switch-1') return this.get_motor_min_tooltip(1); - if (this.name == 'min-switch-2') return this.get_motor_min_tooltip(2); - if (this.name == 'min-switch-3') return this.get_motor_min_tooltip(3); - if (this.name == 'max-switch-0') return this.get_motor_max_tooltip(0); - if (this.name == 'max-switch-1') return this.get_motor_max_tooltip(1); - if (this.name == 'max-switch-2') return this.get_motor_max_tooltip(2); - if (this.name == 'max-switch-3') return this.get_motor_max_tooltip(3); - if (this.name == 'estop') return this.get_input_tooltip('ew', 'et'); - if (this.name == 'probe') return this.get_input_tooltip('pw', 'pt'); - if (this.name == 'load-1') return this.get_output_tooltip('1'); - if (this.name == 'load-2') return this.get_output_tooltip('2'); - if (this.name == 'fault') return this.get_output_tooltip('f'); - if (this.name == 'tool-direction-mode') - return this.get_output_tooltip('d'); - if (this.name == 'tool-enable-mode') - return this.get_output_tooltip('e'); + if (state == 2) { + return "fa-circle-o"; + } + + const icon = state ? "fa-plus-circle" : "fa-minus-circle"; + return `${icon} ${active ? "active" : "inactive"}`; + }, + + get_input_active: function(stateCode, typeCode) { + const type = this.state[typeCode]; + const state = this.state[stateCode]; + + if (type == 1) { + return !state; // Normally open + } else if (type == 2) { + return state; // Normally closed + } + + return false; + }, + + get_input_class: function(stateCode, typeCode) { + return this.get_io_state_class(this.get_input_active(stateCode, typeCode), this.state[stateCode]); + }, + + get_output_class: function(output) { + return this.get_io_state_class(this.state[`${output}oa`], this.state[`${output}os`]); + }, + + get_motor_min_class: function(motor) { + return this.get_input_class(`${motor}lw`, `${motor}ls`); + }, + + get_motor_max_class: function(motor) { + return this.get_input_class(`${motor}xw`, `${motor}xs`); + }, + + get_tooltip: function(mode, active, state) { + if (typeof mode == "undefined" || typeof active == "undefined" || typeof state == "undefined") { + return "Invalid"; + } + + if (state == 0) { + state = "Lo/Gnd"; + } else if (state == 1) { + state = "Hi/+3.3v"; + } else if (state == 2) { + state = "Tristated"; + } else { + return "Invalid"; + } + + return `Mode: ${mode}\nActive: ${active ? "True" : "False"}\nLevel: ${state}`; + }, + + get_input_tooltip: function(stateCode, typeCode) { + let type = this.state[typeCode]; + if (type == 0) { + return "Disabled"; + } else if (type == 1) { + type = "Normally open"; + } else if (type == 2) { + type = "Normally closed"; + } + + const active = this.get_input_active(stateCode, typeCode); + const state = this.state[stateCode]; + + return this.get_tooltip(type, active, state); + }, + + get_output_tooltip: function(output) { + let mode = this.state[`${output}om`]; + + switch (mode) { + case 0: return "Disabled"; + case 1: mode = "Lo/Hi"; break; + case 2: mode = "Hi/Lo"; break; + case 3: mode = "Tri/Lo"; break; + case 4: mode = "Tri/Hi"; break; + case 5: mode = "Lo/Tri"; break; + case 6: mode = "Hi/Tri"; break; + default: + mode = undefined; + } + + const active = this.state[`${output}oa`]; + const state = this.state[`${output}os`]; + + return this.get_tooltip(mode, active, state); + }, + + get_motor_min_tooltip: function(motor) { + return this.get_input_tooltip(`${motor}lw`, `${motor}ls`); + }, + + get_motor_max_tooltip: function(motor) { + return this.get_input_tooltip(`${motor}xw`, `${motor}xs`); + } } - }, - - - methods: { - get_io_state_class: function (active, state) { - if (typeof active == 'undefined' || typeof state == 'undefined') - return 'fa-exclamation-triangle warn'; - - if (state == 2) return 'fa-circle-o'; - - return (state ? 'fa-plus-circle' : 'fa-minus-circle') + ' ' + - (active ? 'active' : 'inactive'); - }, - - - get_input_active: function (stateCode, typeCode) { - var type = this.state[typeCode]; - var state = this.state[stateCode]; - - if (type == 1) return !state; // Normally open - else if (type == 2) return state; // Normally closed - - return false - }, - - - get_input_class: function (stateCode, typeCode) { - return this.get_io_state_class(this.get_input_active(stateCode, typeCode), - this.state[stateCode]); - }, - - - get_output_class: function (output) { - return this.get_io_state_class(this.state[output + 'oa'], - this.state[output + 'os']); - }, - - - get_motor_min_class: function (motor) { - return this.get_input_class(motor + 'lw', motor + 'ls'); - }, - - - get_motor_max_class: function (motor) { - return this.get_input_class(motor + 'xw', motor + 'xs'); - }, - - - get_tooltip: function (mode, active, state) { - if (typeof mode == 'undefined' || typeof active == 'undefined' || - typeof state == 'undefined') return 'Invalid'; - - if (state == 0) state = 'Lo/Gnd'; - else if (state == 1) state = 'Hi/+3.3v'; - else if (state == 2) state = 'Tristated'; - else return 'Invalid'; - - return 'Mode: ' + mode + '\nActive: ' + (active ? 'True' : 'False') + - '\nLevel: ' + state; - }, - - - get_input_tooltip: function (stateCode, typeCode) { - var type = this.state[typeCode]; - if (type == 0) return 'Disabled'; - else if (type == 1) type = 'Normally open'; - else if (type == 2) type = 'Normally closed'; - - var active = this.get_input_active(stateCode, typeCode); - var state = this.state[stateCode]; - - return this.get_tooltip(type, active, state); - }, - - - get_output_tooltip: function (output) { - var mode = this.state[output + 'om']; - if (mode == 0) return 'Disabled'; - else if (mode == 1) mode = 'Lo/Hi'; - else if (mode == 2) mode = 'Hi/Lo'; - else if (mode == 3) mode = 'Tri/Lo'; - else if (mode == 4) mode = 'Tri/Hi'; - else if (mode == 5) mode = 'Lo/Tri'; - else if (mode == 6) mode = 'Hi/Tri'; - else mode = undefined; - - var active = this.state[output + 'oa']; - var state = this.state[output + 'os']; - - return this.get_tooltip(mode, active, state); - }, - - - get_motor_min_tooltip: function (motor) { - return this.get_input_tooltip(motor + 'lw', motor + 'ls'); - }, - - - get_motor_max_tooltip: function (motor) { - return this.get_input_tooltip(motor + 'xw', motor + 'xs'); - } - } -} +}; diff --git a/src/js/io-view.js b/src/js/io-view.js index 1cbdc49..4d2679b 100644 --- a/src/js/io-view.js +++ b/src/js/io-view.js @@ -1,42 +1,13 @@ -/******************************************************************************\ - - This file is part of the Buildbotics firmware. - - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. - - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . - - The software 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . - - For information regarding this software email: - "Joseph Coffland" - -\******************************************************************************/ - -'use strict' - +"use strict"; module.exports = { - template: '#io-view-template', - props: ['config', 'template', 'state'], + template: "#io-view-template", + props: [ "config", "template", "state" ], - - events: { - 'input-changed': function() { - this.$dispatch('config-changed'); - return false; + events: { + "input-changed": function() { + this.$dispatch("config-changed"); + return false; + } } - } -} +}; diff --git a/src/js/main.js b/src/js/main.js index d369409..f58ad13 100644 --- a/src/js/main.js +++ b/src/js/main.js @@ -1,147 +1,148 @@ -/******************************************************************************\ - - This file is part of the Buildbotics firmware. - - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. - - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . - - The software 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . - - For information regarding this software email: - "Joseph Coffland" - -\******************************************************************************/ - -'use strict'; - +"use strict"; function cookie_get(name) { - var decodedCookie = decodeURIComponent(document.cookie); - var ca = decodedCookie.split(';'); - name = name + '='; + const decodedCookie = decodeURIComponent(document.cookie); + const ca = decodedCookie.split(";"); + name = `${name}=`; - for (var i = 0; i < ca.length; i++) { - var c = ca[i]; - while (c.charAt(0) == ' ') c = c.substring(1); - if (!c.indexOf(name)) return c.substring(name.length, c.length); - } + for (let i = 0; i < ca.length; i++) { + let c = ca[i]; + while (c.charAt(0) == " ") { + c = c.substring(1); + } + + if (!c.indexOf(name)) { + return c.substring(name.length, c.length); + } + } } - function cookie_set(name, value, days) { - var d = new Date(); - d.setTime(d.getTime() + days * 24 * 60 * 60 * 1000); - var expires = 'expires=' + d.toUTCString(); - document.cookie = name + '=' + value + ';' + expires + ';path=/'; + const d = new Date(); + d.setTime(d.getTime() + days * 24 * 60 * 60 * 1000); + const expires = `expires=${d.toUTCString()}`; + document.cookie = `${name}=${value};${expires};path=/`; } - -var uuid_chars = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_+'; - +const uuid_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_+"; function uuid(length) { - if (typeof length == 'undefined') length = 52; + if (typeof length == "undefined") { + length = 52; + } - var s = ''; - for (var i = 0; i < length; i++) - s += uuid_chars[Math.floor(Math.random() * uuid_chars.length)]; + let s = ""; + for (let i = 0; i < length; i++) { + s += uuid_chars[Math.floor(Math.random() * uuid_chars.length)]; + } - return s + return s; } - -$(function() { - if (typeof cookie_get('client-id') == 'undefined') - cookie_set('client-id', uuid(), 10000); - - // Vue debugging - Vue.config.debug = true; - //Vue.util.warn = function (msg) {console.debug('[Vue warn]: ' + msg)} - - // Register global components - Vue.component('templated-input', require('./templated-input')); - Vue.component('message', require('./message')); - Vue.component('indicators', require('./indicators')); - Vue.component('io-indicator', require('./io-indicator')); - Vue.component('console', require('./console')); - Vue.component('unit-value', require('./unit-value')); - - Vue.filter('number', function (value) { - if (isNaN(value)) return 'NaN'; - return value.toLocaleString(); - }); - - Vue.filter('percent', function (value, precision) { - if (typeof value == 'undefined') return ''; - if (typeof precision == 'undefined') precision = 2; - return (value * 100.0).toFixed(precision) + '%'; - }); - - Vue.filter('non_zero_percent', function (value, precision) { - if (!value) return ''; - if (typeof precision == 'undefined') precision = 2; - return (value * 100.0).toFixed(precision) + '%'; - }); - - Vue.filter('fixed', function (value, precision) { - if (typeof value == 'undefined') return '0'; - return parseFloat(value).toFixed(precision) - }); - - Vue.filter('upper', function (value) { - if (typeof value == 'undefined') return ''; - return value.toUpperCase() - }); - - Vue.filter('time', function (value, precision) { - if (isNaN(value)) return ''; - if (isNaN(precision)) precision = 0; - - var MIN = 60; - var HR = MIN * 60; - var DAY = HR * 24; - var parts = []; - - if (DAY <= value) { - parts.push(Math.floor(value / DAY)); - value %= DAY; +window.onload = function() { + if (typeof cookie_get("client-id") == "undefined") { + cookie_set("client-id", uuid(), 10000); } - if (HR <= value) { - parts.push(Math.floor(value / HR)); - value %= HR; - } + // Register global components + Vue.component("templated-input", require("./templated-input")); + Vue.component("message", require("./message")); + Vue.component("indicators", require("./indicators")); + Vue.component("io-indicator", require("./io-indicator")); + Vue.component("console", require("./console")); + Vue.component("unit-value", require("./unit-value")); - if (MIN <= value) { - parts.push(Math.floor(value / MIN)); - value %= MIN; + Vue.filter("number", function(value) { + if (isNaN(value)) { + return "NaN"; + } - } else parts.push(0); + return value.toLocaleString(); + }); - parts.push(value); + Vue.filter("percent", function(value, precision) { + if (typeof value == "undefined") { + return ""; + } - for (var i = 0; i < parts.length; i++) { - parts[i] = parts[i].toFixed(i == parts.length - 1 ? precision : 0); - if (i && parts[i] < 10) parts[i] = '0' + parts[i]; - } + if (typeof precision == "undefined") { + precision = 2; + } - return parts.join(':'); - }); + return `${(value * 100.0).toFixed(precision)}%`; + }); - // Vue app - require('./app'); -}); + Vue.filter("non_zero_percent", function(value, precision) { + if (!value) { + return ""; + } + + if (typeof precision == "undefined") { + precision = 2; + } + + return `${(value * 100.0).toFixed(precision)}%`; + }); + + Vue.filter("fixed", function(value, precision) { + if (typeof value == "undefined") { + return "0"; + } + + return parseFloat(value).toFixed(precision); + }); + + Vue.filter("upper", function(value) { + if (typeof value == "undefined") { + return ""; + } + + return value.toUpperCase(); + }); + + Vue.filter("time", function(value, precision) { + if (isNaN(value)) { + return ""; + } + + if (isNaN(precision)) { + precision = 0; + } + + const MIN = 60; + const HR = MIN * 60; + const DAY = HR * 24; + const parts = []; + + if (DAY <= value) { + parts.push(Math.floor(value / DAY)); + value %= DAY; + } + + if (HR <= value) { + parts.push(Math.floor(value / HR)); + value %= HR; + } + + if (MIN <= value) { + parts.push(Math.floor(value / MIN)); + value %= MIN; + } else { + parts.push(0); + } + + parts.push(value); + + for (let i = 0; i < parts.length; i++) { + parts[i] = parts[i].toFixed(i == parts.length - 1 ? precision : 0); + if (i && parts[i] < 10) { + parts[i] = `0${parts[i]}`; + } + } + + return parts.join(":"); + }); + + // Vue app + require("./app"); +}; diff --git a/src/js/message.js b/src/js/message.js index 57c1fae..3f4c1d4 100644 --- a/src/js/message.js +++ b/src/js/message.js @@ -1,47 +1,19 @@ -/******************************************************************************\ - - This file is part of the Buildbotics firmware. - - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. - - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . - - The software 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . - - For information regarding this software email: - "Joseph Coffland" - -\******************************************************************************/ - -'use strict' - +"use strict"; module.exports = { - template: '#message-template', + template: "#message-template", - props: { - show: { - type: Boolean, - required: true, - twoWay: true - }, + props: { + show: { + type: Boolean, + required: true, + twoWay: true + }, - class: { - type: String, - required: false, - twoWay: false + class: { + type: String, + required: false, + twoWay: false + } } - } -} +}; diff --git a/src/js/modbus-reg.js b/src/js/modbus-reg.js index 224f22e..464dcf0 100644 --- a/src/js/modbus-reg.js +++ b/src/js/modbus-reg.js @@ -1,48 +1,20 @@ -/******************************************************************************\ - - This file is part of the Buildbotics firmware. - - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. - - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . - - The software 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . - - For information regarding this software email: - "Joseph Coffland" - -\******************************************************************************/ - -'use strict' - +"use strict"; module.exports = { - replace: true, - template: '#modbus-reg-view-template', - props: ['index', 'model', 'template', 'enable'], + replace: true, + template: "#modbus-reg-view-template", + props: [ "index", "model", "template", "enable" ], + computed: { + has_user_value: function() { + const type = this.model["reg-type"]; + return type.indexOf("write") != -1 || type.indexOf("fixed") != -1; + } + }, - computed: { - has_user_value: function () { - var type = this.model['reg-type']; - return type.indexOf('write') != -1 || type.indexOf('fixed') != -1; + methods: { + change: function() { + this.$dispatch("input-changed"); + } } - }, - - - methods: { - change: function () {this.$dispatch('input-changed')} - } -} +}; diff --git a/src/js/modbus.js b/src/js/modbus.js index 83a7504..8ce2543 100644 --- a/src/js/modbus.js +++ b/src/js/modbus.js @@ -1,51 +1,23 @@ -/******************************************************************************\ - - This file is part of the Buildbotics firmware. - - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. - - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . - - The software 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . - - For information regarding this software email: - "Joseph Coffland" - -\******************************************************************************/ - -'use strict' - +"use strict"; // Must match modbus.c -var exports = { - DISCONNECTED: 0, - OK: 1, - CRC: 2, - INVALID: 3, - TIMEDOUT: 4 +const constants = { + DISCONNECTED: 0, + OK: 1, + CRC: 2, + INVALID: 3, + TIMEDOUT: 4 }; - -exports.status_to_string = - function (status) { - if (status == exports.OK) return 'Ok'; - if (status == exports.CRC) return 'CRC error'; - if (status == exports.INVALID) return 'Invalid response'; - if (status == exports.TIMEDOUT) return 'Timedout'; - return 'Disconnected'; - } - - -module.exports = exports; +module.exports = { + ...constants, + status_to_string: function(status) { + switch (status) { + case constants.OK: return "Ok"; + case constants.CRC: return "CRC error"; + case constants.INVALID: return "Invalid response"; + case constants.TIMEDOUT: return "Timedout"; + default: return "Disconnected"; + } + } +}; diff --git a/src/js/motor-view.js b/src/js/motor-view.js index 49bbf08..8a41d3a 100644 --- a/src/js/motor-view.js +++ b/src/js/motor-view.js @@ -1,136 +1,120 @@ -/******************************************************************************\ - - This file is part of the Buildbotics firmware. - - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. - - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . - - The software 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . - - For information regarding this software email: - "Joseph Coffland" - -\******************************************************************************/ - -'use strict' - +"use strict"; module.exports = { - template: '#motor-view-template', - props: ['index', 'config', 'template', 'state'], + template: "#motor-view-template", + props: [ "index", "config", "template", "state" ], + computed: { + metric: function() { + return this.$root.display_units === "METRIC"; + }, - computed: { - metric: function () {return this.$root.metric()}, + is_slave: function() { + for (let i = 0; i < this.index; i++) { + if (this.motor.axis == this.config.motors[i].axis) { + return true; + } + } + return false; + }, - is_slave: function () { - for (var i = 0; i < this.index; i++) - if (this.motor.axis == this.config.motors[i].axis) - return true; + motor: function() { + return this.config.motors[this.index]; + }, - return false; + invalidMaxVelocity: function() { + return this.maxMaxVelocity < this.motor["max-velocity"]; + }, + + maxMaxVelocity: function() { + return 1 * (15 * this.umPerStep / this.motor["microsteps"]).toFixed(3); + }, + + ustepPerSec: function() { + return this.rpm * this.stepsPerRev * this.motor["microsteps"] / 60; + }, + + rpm: function() { + return 1000 * this.motor["max-velocity"] / this.motor["travel-per-rev"]; + }, + + gForce: function() { + return this.motor["max-accel"] * 0.0283254504; + }, + + gForcePerMin: function() { + return this.motor["max-jerk"] * 0.0283254504; + }, + + stepsPerRev: function() { + return 360 / this.motor["step-angle"]; + }, + + umPerStep: function() { + return this.motor["travel-per-rev"] * this.motor["step-angle"] / 0.36; + }, + + milPerStep: function() { + return this.umPerStep / 25.4; + }, + + invalidStallVelocity: function() { + if (!this.motor["homing-mode"].startsWith("stall-")) { + return false; + } + + return this.maxStallVelocity < this.motor["search-velocity"]; + }, + + stallRPM: function() { + const v = this.motor["search-velocity"]; + return 1000 * v / this.motor["travel-per-rev"]; + }, + + maxStallVelocity: function() { + const maxRate = 900000 / this.motor["stall-sample-time"]; + const ustep = this.motor["stall-microstep"]; + const angle = this.motor["step-angle"]; + const travel = this.motor["travel-per-rev"]; + const maxStall = maxRate * 60 / 360 / 1000 * angle / ustep * travel; + + return 1 * maxStall.toFixed(3); + }, + + stallUStepPerSec: function() { + const ustep = this.motor["stall-microstep"]; + return this.stallRPM * this.stepsPerRev * ustep / 60; + } }, + events: { + "input-changed": function() { + Vue.nextTick(function() { + // Limit max-velocity + if (this.invalidMaxVelocity) { + this.$set('motor["max-velocity"]', this.maxMaxVelocity); + } - motor: function () {return this.config.motors[this.index]}, + //Limit stall-velocity + if (this.invalidStallVelocity) { + this.$set('motor["search-velocity"]', this.maxStallVelocity); + } + this.$dispatch("config-changed"); + }.bind(this)); - invalidMaxVelocity: function () { - return this.maxMaxVelocity < this.motor['max-velocity']; + return false; + } }, + methods: { + show: function(name, templ) { + if (templ.hmodes == undefined) { + return true; + } - maxMaxVelocity: function () { - return 1 * (15 * this.umPerStep / this.motor['microsteps']).toFixed(3); - }, - - - ustepPerSec: function () { - return this.rpm * this.stepsPerRev * this.motor['microsteps'] / 60; - }, - - - rpm: function () { - return 1000 * this.motor['max-velocity'] / this.motor['travel-per-rev']; - }, - - - gForce: function () {return this.motor['max-accel'] * 0.0283254504}, - gForcePerMin: function () {return this.motor['max-jerk'] * 0.0283254504}, - stepsPerRev: function () {return 360 / this.motor['step-angle']}, - - - umPerStep: function () { - return this.motor['travel-per-rev'] * this.motor['step-angle'] / 0.36 - }, - - - milPerStep: function () {return this.umPerStep / 25.4}, - - invalidStallVelocity: function() { - if(!this.motor['homing-mode'].startsWith('stall-')) return false; - return this.maxStallVelocity < this.motor['search-velocity']; - }, - - stallRPM: function() { - var v = this.motor['search-velocity']; - return 1000 * v / this.motor['travel-per-rev']; - }, - - maxStallVelocity: function() { - var maxRate = 900000/this.motor['stall-sample-time']; - var ustep = this.motor['stall-microstep']; - var angle = this.motor['step-angle']; - var travel = this.motor['travel-per-rev']; - var maxStall = maxRate * 60/ 360 /1000 * angle/ ustep * travel; - - return 1 * maxStall.toFixed(3); - }, - - stallUStepPerSec: function() { - var ustep = this.motor['stall-microstep']; - return this.stallRPM * this.stepsPerRev * ustep / 60; + return templ.hmodes.indexOf(this.motor["homing-mode"]) != -1; + } } - - }, - - - events: { - 'input-changed': function() { - Vue.nextTick(function () { - // Limit max-velocity - if (this.invalidMaxVelocity) - this.$set('motor["max-velocity"]', this.maxMaxVelocity); - - //Limit stall-velocity - if(this.invalidStallVelocity) - this.$set('motor["search-velocity"]', this.maxStallVelocity); - - this.$dispatch('config-changed'); - }.bind(this)) - - return false; - } - }, - - methods: { - show: function(name, templ) { - if(templ.hmodes == undefined) return true; - return templ.hmodes.indexOf(this.motor['homing-mode']) != -1; - } - } -} +}; diff --git a/src/js/orbit.js b/src/js/orbit.js index 45c5768..ef7a4fc 100644 --- a/src/js/orbit.js +++ b/src/js/orbit.js @@ -7,7 +7,7 @@ * @author jcoffland / https://buildbotics.com/ */ -'use strict' +"use strict"; // This set of controls performs orbiting, dollying (zooming), and panning. // Unlike TrackballControls, it maintains the "up" direction object.up @@ -17,665 +17,682 @@ // Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish // Pan - right mouse, or arrow keys / touch: two-finger move +const OrbitControls = function(object, domElement) { + // internals + // eslint-disable-next-line @typescript-eslint/no-this-alias + const scope = this; -var OrbitControls = function (object, domElement) { - this.object = object; - this.domElement = domElement != undefined ? domElement : document; + const changeEvent = { type: "change" }; + const startEvent = { type: "start" }; + const endEvent = { type: "end" }; - // Set to false to disable this control - this.enabled = true; + const STATE = { + NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY_PAN: 4 + }; - // "target" sets the location of focus, where the object orbits around - this.target = new THREE.Vector3(); + let state = STATE.NONE; + const EPS = 0.000001; - // How far you can zoom in and out (OrthographicCamera only) - this.minZoom = 0; - this.maxZoom = Infinity; + // current position in spherical coordinates + const spherical = new THREE.Spherical(); + const sphericalDelta = new THREE.Spherical(); - // How far you can orbit vertically, upper and lower limits. - // Range is 0 to Math.PI radians. - this.minPolarAngle = 0; // radians - this.maxPolarAngle = Math.PI; // radians + let scale = 1; + const panOffset = new THREE.Vector3(); + let zoomChanged = false; - // How far you can orbit horizontally, upper and lower limits. - // If set, must be a sub-interval of the interval [- Math.PI, Math.PI]. - this.minAzimuthAngle = -Infinity; // radians - this.maxAzimuthAngle = Infinity; // radians + const rotateStart = new THREE.Vector2(); + const rotateEnd = new THREE.Vector2(); + const rotateDelta = new THREE.Vector2(); - // Set to true to enable damping (inertia) - // If damping is enabled, call controls.update() in your animation loop - this.enableDamping = false; - this.dampingFactor = 0.25; + const panStart = new THREE.Vector2(); + const panEnd = new THREE.Vector2(); + const panDelta = new THREE.Vector2(); - // This option enables dollying in and out; - // left as "zoom" for backwards compatibility. - // Set to false to disable zooming - this.enableZoom = true; - this.zoomSpeed = 1.0; + const dollyStart = new THREE.Vector2(); + const dollyEnd = new THREE.Vector2(); + const dollyDelta = new THREE.Vector2(); - // Set to false to disable rotating - this.enableRotate = true; - this.rotateSpeed = 1.0; + this.object = object; + this.domElement = domElement != undefined ? domElement : document; - // Set to false to disable panning - this.enablePan = true; - this.panSpeed = 1.0; - this.screenSpacePanning = false; // if true, pan in screen-space - this.keyPanSpeed = 7.0; // pixels moved per arrow key push + // Set to false to disable this control + this.enabled = true; - // Set to true to automatically rotate around the target - // If auto-rotate is enabled, call controls.update() in your animation loop - this.autoRotate = false; - this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 + // "target" sets the location of focus, where the object orbits around + this.target = new THREE.Vector3(); - // Set to false to disable use of the keys - this.enableKeys = true; + // How far you can zoom in and out (OrthographicCamera only) + this.minZoom = 0; + this.maxZoom = Infinity; - // The four arrow keys - this.keys = {LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40}; + // How far you can orbit vertically, upper and lower limits. + // Range is 0 to Math.PI radians. + this.minPolarAngle = 0; // radians + this.maxPolarAngle = Math.PI; // radians - // Mouse buttons - this.mouseButtons = { - ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT - }; + // How far you can orbit horizontally, upper and lower limits. + // If set, must be a sub-interval of the interval [- Math.PI, Math.PI]. + this.minAzimuthAngle = -Infinity; // radians + this.maxAzimuthAngle = Infinity; // radians - // for reset - this.target0 = this.target.clone(); - this.position0 = this.object.position.clone(); - this.zoom0 = this.object.zoom; + // Set to true to enable damping (inertia) + // If damping is enabled, call controls.update() in your animation loop + this.enableDamping = false; + this.dampingFactor = 0.25; - // public methods - this.getPolarAngle = function () {return spherical.phi} - this.getAzimuthalAngle = function () {return spherical.theta} + // This option enables dollying in and out; + // left as "zoom" for backwards compatibility. + // Set to false to disable zooming + this.enableZoom = true; + this.zoomSpeed = 1.0; + // Set to false to disable rotating + this.enableRotate = true; + this.rotateSpeed = 1.0; - this.saveState = function () { - scope.target0.copy(scope.target); - scope.position0.copy(scope.object.position); - scope.zoom0 = scope.object.zoom; - } + // Set to false to disable panning + this.enablePan = true; + this.panSpeed = 1.0; + this.screenSpacePanning = false; // if true, pan in screen-space + this.keyPanSpeed = 7.0; // pixels moved per arrow key push + // Set to true to automatically rotate around the target + // If auto-rotate is enabled, call controls.update() in your animation loop + this.autoRotate = false; + this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 - this.reset = function () { - scope.target.copy(scope.target0); - scope.object.position.copy(scope.position0); - scope.object.zoom = scope.zoom0; - scope.object.updateProjectionMatrix(); + // Set to false to disable use of the keys + this.enableKeys = true; - scope.dispatchEvent(changeEvent); - scope.update(); + // The four arrow keys + this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 }; - state = STATE.NONE; - } + // Mouse buttons + this.mouseButtons = { + ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT + }; + // for reset + this.target0 = this.target.clone(); + this.position0 = this.object.position.clone(); + this.zoom0 = this.object.zoom; - this.update = function () { - var offset = new THREE.Vector3(); + // public methods + this.getPolarAngle = function() { + return spherical.phi; + }; - // so camera.up is the orbit axis - var quat = new THREE.Quaternion() - .setFromUnitVectors(object.up, new THREE.Vector3(0, 1, 0)); - var quatInverse = quat.clone().inverse(); + this.getAzimuthalAngle = function() { + return spherical.theta; + }; - var lastPosition = new THREE.Vector3(); - var lastQuaternion = new THREE.Quaternion(); + this.saveState = function() { + scope.target0.copy(scope.target); + scope.position0.copy(scope.object.position); + scope.zoom0 = scope.object.zoom; + }; - return function update() { - var position = scope.object.position; - - offset.copy(position).sub(scope.target); - - // rotate offset to "y-axis-is-up" space - offset.applyQuaternion(quat); - - // angle from z-axis around y-axis - spherical.setFromVector3(offset); - - if (scope.autoRotate && state == STATE.NONE) - rotateLeft(getAutoRotationAngle()); - - spherical.theta += sphericalDelta.theta; - spherical.phi += sphericalDelta.phi; - - // restrict theta to be between desired limits - spherical.theta = - Math.max(scope.minAzimuthAngle, - Math.min(scope.maxAzimuthAngle, spherical.theta)); - - // restrict phi to be between desired limits - spherical.phi = - Math.max(scope.minPolarAngle, - Math.min(scope.maxPolarAngle, spherical.phi)); - - spherical.makeSafe(); - spherical.radius *= scale; - - // restrict radius to be between desired limits - spherical.radius = - Math.max(10, Math.min(scope.object.far * 0.8, spherical.radius)); - - // move target to panned location - scope.target.add(panOffset); - - offset.setFromSpherical(spherical); - - // rotate offset back to "camera-up-vector-is-up" space - offset.applyQuaternion(quatInverse); - - position.copy(scope.target).add(offset); - scope.object.lookAt(scope.target); - - if (scope.enableDamping) { - sphericalDelta.theta *= (1 - scope.dampingFactor); - sphericalDelta.phi *= (1 - scope.dampingFactor); - panOffset.multiplyScalar(1 - scope.dampingFactor); - - } else { - sphericalDelta.set(0, 0, 0); - panOffset.set(0, 0, 0); - } - - // update condition is: - // min(camera displacement, camera rotation in radians)^2 > EPS - // using small-angle approximation cos(x/2) = 1 - x^2 / 8 - if (zoomChanged || scale != 1 || - lastPosition.distanceToSquared(scope.object.position) > EPS || - 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) { + this.reset = function() { + scope.target.copy(scope.target0); + scope.object.position.copy(scope.position0); + scope.object.zoom = scope.zoom0; + scope.object.updateProjectionMatrix(); scope.dispatchEvent(changeEvent); + scope.update(); - lastPosition.copy(scope.object.position); - lastQuaternion.copy(scope.object.quaternion); - zoomChanged = false; - scale = 1; + state = STATE.NONE; + }; - return true; - } + this.update = function() { + const offset = new THREE.Vector3(); - return false; + // so camera.up is the orbit axis + const quat = new THREE.Quaternion().setFromUnitVectors(object.up, new THREE.Vector3(0, 1, 0)); + const quatInverse = quat.clone().inverse(); + + const lastPosition = new THREE.Vector3(); + const lastQuaternion = new THREE.Quaternion(); + + return function update() { + const position = scope.object.position; + + offset.copy(position).sub(scope.target); + + // rotate offset to "y-axis-is-up" space + offset.applyQuaternion(quat); + + // angle from z-axis around y-axis + spherical.setFromVector3(offset); + + if (scope.autoRotate && state == STATE.NONE) { + rotateLeft(getAutoRotationAngle()); + } + + spherical.theta += sphericalDelta.theta; + spherical.phi += sphericalDelta.phi; + + // restrict theta to be between desired limits + spherical.theta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, spherical.theta)); + + // restrict phi to be between desired limits + spherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi)); + + spherical.makeSafe(); + spherical.radius *= scale; + + // restrict radius to be between desired limits + spherical.radius = Math.max(10, Math.min(scope.object.far * 0.8, spherical.radius)); + + // move target to panned location + scope.target.add(panOffset); + + offset.setFromSpherical(spherical); + + // rotate offset back to "camera-up-vector-is-up" space + offset.applyQuaternion(quatInverse); + + position.copy(scope.target).add(offset); + scope.object.lookAt(scope.target); + + if (scope.enableDamping) { + sphericalDelta.theta *= (1 - scope.dampingFactor); + sphericalDelta.phi *= (1 - scope.dampingFactor); + panOffset.multiplyScalar(1 - scope.dampingFactor); + + } else { + sphericalDelta.set(0, 0, 0); + panOffset.set(0, 0, 0); + } + + // update condition is: + // min(camera displacement, camera rotation in radians)^2 > EPS + // using small-angle approximation cos(x/2) = 1 - x^2 / 8 + if (zoomChanged + || scale != 1 + || lastPosition.distanceToSquared(scope.object.position) > EPS + || 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) { + + scope.dispatchEvent(changeEvent); + + lastPosition.copy(scope.object.position); + lastQuaternion.copy(scope.object.quaternion); + zoomChanged = false; + scale = 1; + + return true; + } + + return false; + }; + }(); + + this.dispose = function() { + scope.domElement.removeEventListener("contextmenu", onContextMenu, false); + scope.domElement.removeEventListener("mousedown", onMouseDown, false); + scope.domElement.removeEventListener("wheel", onMouseWheel, false); + scope.domElement.removeEventListener("touchstart", onTouchStart, false); + scope.domElement.removeEventListener("touchend", onTouchEnd, false); + scope.domElement.removeEventListener("touchmove", onTouchMove, false); + document.removeEventListener("mousemove", onMouseMove, false); + document.removeEventListener("mouseup", onMouseUp, false); + window.removeEventListener("keydown", onKeyDown, false); + }; + + function getAutoRotationAngle() { + return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed; } - }() - - this.dispose = function () { - scope.domElement.removeEventListener('contextmenu', onContextMenu, false); - scope.domElement.removeEventListener('mousedown', onMouseDown, false); - scope.domElement.removeEventListener('wheel', onMouseWheel, false); - scope.domElement.removeEventListener('touchstart', onTouchStart, false); - scope.domElement.removeEventListener('touchend', onTouchEnd, false); - scope.domElement.removeEventListener('touchmove', onTouchMove, false); - document.removeEventListener('mousemove', onMouseMove, false); - document.removeEventListener('mouseup', onMouseUp, false); - window.removeEventListener('keydown', onKeyDown, false); - } - - - // internals - var scope = this; - - var changeEvent = {type: 'change'}; - var startEvent = {type: 'start'}; - var endEvent = {type: 'end'}; - - var STATE = { - NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY_PAN: 4 - }; - - var state = STATE.NONE; - var EPS = 0.000001; - - // current position in spherical coordinates - var spherical = new THREE.Spherical(); - var sphericalDelta = new THREE.Spherical(); - - var scale = 1; - var panOffset = new THREE.Vector3(); - var zoomChanged = false; - - var rotateStart = new THREE.Vector2(); - var rotateEnd = new THREE.Vector2(); - var rotateDelta = new THREE.Vector2(); - - var panStart = new THREE.Vector2(); - var panEnd = new THREE.Vector2(); - var panDelta = new THREE.Vector2(); - - var dollyStart = new THREE.Vector2(); - var dollyEnd = new THREE.Vector2(); - var dollyDelta = new THREE.Vector2(); - - - function getAutoRotationAngle() { - return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed; - } - - - function getZoomScale() {return Math.pow(0.95, scope.zoomSpeed)} - function rotateLeft(angle) {sphericalDelta.theta -= angle} - function rotateUp(angle) {sphericalDelta.phi -= angle} - - - var panLeft = function () { - var v = new THREE.Vector3(); - - return function panLeft(distance, objectMatrix) { - v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix - v.multiplyScalar(-distance); - panOffset.add(v); + function getZoomScale() { + return Math.pow(0.95, scope.zoomSpeed); } - }() - - var panUp = function () { - var v = new THREE.Vector3(); - - return function panUp(distance, objectMatrix) { - if (scope.screenSpacePanning) v.setFromMatrixColumn(objectMatrix, 1); - else { - v.setFromMatrixColumn(objectMatrix, 0); - v.crossVectors(scope.object.up, v); - } - - v.multiplyScalar(distance); - panOffset.add(v); + function rotateLeft(angle) { + sphericalDelta.theta -= angle; } - }() - - function unknownCamera() { - console.warn('WARNING: OrbitControls.js encountered an unknown camera ' + - 'type - pan & zoom disabled.'); - scope.enablePan = false; - scope.enableZoom = false; - } - - - // deltaX and deltaY are in pixels; right and down are positive - var pan = function () { - var offset = new THREE.Vector3(); - - return function pan(deltaX, deltaY) { - var element = scope.domElement === document ? - scope.domElement.body : scope.domElement; - - if (scope.object.isPerspectiveCamera) { - // perspective - offset.copy(scope.object.position).sub(scope.target); - var targetDistance = offset.length(); - - // half of the fov is center to top of screen - targetDistance *= Math.tan((scope.object.fov / 2) * Math.PI / 180.0); - - // we use only clientHeight here so aspect ratio does not distort speed - panLeft(2 * deltaX * targetDistance / element.clientHeight, - scope.object.matrix); - panUp(2 * deltaY * targetDistance / element.clientHeight, - scope.object.matrix); - - } else if (scope.object.isOrthographicCamera) { - // orthographic - panLeft(deltaX * (scope.object.right - scope.object.left) / - scope.object.zoom / element.clientWidth, scope.object.matrix); - panUp(deltaY * (scope.object.top - scope.object.bottom) / - scope.object.zoom / element.clientHeight, scope.object.matrix); - - } else unknownCamera(); + function rotateUp(angle) { + sphericalDelta.phi -= angle; } - }() + const panLeft = function() { + const v = new THREE.Vector3(); - function dollyIn(dollyScale) { - if (scope.object.isPerspectiveCamera) scale /= dollyScale; + return function panLeft(distance, objectMatrix) { + v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix + v.multiplyScalar(-distance); + panOffset.add(v); + }; + }(); - else if (scope.object.isOrthographicCamera) { - scope.object.zoom = + const panUp = function() { + const v = new THREE.Vector3(); + + return function panUp(distance, objectMatrix) { + if (scope.screenSpacePanning) { + v.setFromMatrixColumn(objectMatrix, 1); + } else { + v.setFromMatrixColumn(objectMatrix, 0); + v.crossVectors(scope.object.up, v); + } + + v.multiplyScalar(distance); + panOffset.add(v); + }; + }(); + + function unknownCamera() { + console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan & zoom disabled."); + scope.enablePan = false; + scope.enableZoom = false; + } + + // deltaX and deltaY are in pixels; right and down are positive + const pan = function() { + const offset = new THREE.Vector3(); + + return function pan(deltaX, deltaY) { + const element = scope.domElement === document + ? scope.domElement.body + : scope.domElement; + + if (scope.object.isPerspectiveCamera) { + // perspective + offset.copy(scope.object.position).sub(scope.target); + let targetDistance = offset.length(); + + // half of the fov is center to top of screen + targetDistance *= Math.tan((scope.object.fov / 2) * Math.PI / 180.0); + + // we use only clientHeight here so aspect ratio does not distort speed + panLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix); + panUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix); + + } else if (scope.object.isOrthographicCamera) { + // orthographic + panLeft(deltaX * (scope.object.right - scope.object.left) / scope.object.zoom / element.clientWidth, scope.object.matrix); + panUp(deltaY * (scope.object.top - scope.object.bottom) / scope.object.zoom / element.clientHeight, scope.object.matrix); + + } else { + unknownCamera(); + } + }; + }(); + + function dollyIn(dollyScale) { + if (scope.object.isPerspectiveCamera) { + scale /= dollyScale; + } else if (scope.object.isOrthographicCamera) { + scope.object.zoom = Math.max(scope.minZoom, - Math.min(scope.maxZoom, scope.object.zoom * dollyScale)); - scope.object.updateProjectionMatrix(); - zoomChanged = true; + Math.min(scope.maxZoom, scope.object.zoom * dollyScale)); + scope.object.updateProjectionMatrix(); + zoomChanged = true; - } else unknownCamera(); - } + } else { + unknownCamera(); + } + } - - function dollyOut(dollyScale) { - if (scope.object.isPerspectiveCamera) scale *= dollyScale; - - else if (scope.object.isOrthographicCamera) { - scope.object.zoom = + function dollyOut(dollyScale) { + if (scope.object.isPerspectiveCamera) { + scale *= dollyScale; + } else if (scope.object.isOrthographicCamera) { + scope.object.zoom = Math.max(scope.minZoom, - Math.min(scope.maxZoom, scope.object.zoom / dollyScale)); - scope.object.updateProjectionMatrix(); - zoomChanged = true; + Math.min(scope.maxZoom, scope.object.zoom / dollyScale)); + scope.object.updateProjectionMatrix(); + zoomChanged = true; - } else unknownCamera(); - } - - - // event callbacks - update the object state - function handleMouseDownRotate(event) { - rotateStart.set(event.clientX, event.clientY); - } - - - function handleMouseDownDolly(event) { - dollyStart.set(event.clientX, event.clientY); - } - - - function handleMouseDownPan(event) { - panStart.set(event.clientX, event.clientY); - } - - - function handleMouseMoveRotate(event) { - rotateEnd.set(event.clientX, event.clientY); - rotateDelta.subVectors(rotateEnd, rotateStart) - .multiplyScalar(scope.rotateSpeed); - - var element = scope.domElement === document ? - scope.domElement.body : scope.domElement; - - // yes, height - rotateLeft(2 * Math.PI * rotateDelta.x / element.clientHeight); - rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight); - - rotateStart.copy(rotateEnd); - - scope.update(); - } - - - function handleMouseMoveDolly(event) { - dollyEnd.set(event.clientX, event.clientY); - dollyDelta.subVectors(dollyEnd, dollyStart); - - if (dollyDelta.y > 0) dollyIn(getZoomScale()); - else if (dollyDelta.y < 0) dollyOut(getZoomScale()); - - dollyStart.copy(dollyEnd); - scope.update(); - } - - - function handleMouseMovePan(event) { - panEnd.set(event.clientX, event.clientY); - panDelta.subVectors(panEnd, panStart).multiplyScalar(scope.panSpeed); - pan(panDelta.x, panDelta.y); - panStart.copy(panEnd); - scope.update(); - } - - - function handleMouseUp(event) {} - - - function handleMouseWheel(event) { - if (event.deltaY < 0) dollyOut(getZoomScale()); - else if (event.deltaY > 0) dollyIn(getZoomScale()); - - scope.update(); - } - - - function handleKeyDown(event) { - switch (event.keyCode) { - case scope.keys.UP: - pan(0, scope.keyPanSpeed); - scope.update(); - break; - - case scope.keys.BOTTOM: - pan(0, -scope.keyPanSpeed); - scope.update(); - break; - - case scope.keys.LEFT: - pan(scope.keyPanSpeed, 0); - scope.update(); - break; - - case scope.keys.RIGHT: - pan(-scope.keyPanSpeed, 0); - scope.update(); - break; - } - } - - - function handleTouchStartRotate(event) { - rotateStart.set(event.touches[0].pageX, event.touches[0].pageY); - } - - - function handleTouchStartDollyPan(event) { - if (scope.enableZoom) { - var dx = event.touches[0].pageX - event.touches[1].pageX; - var dy = event.touches[0].pageY - event.touches[1].pageY; - var distance = Math.sqrt(dx * dx + dy * dy); - - dollyStart.set(0, distance); + } else { + unknownCamera(); + } } - if (scope.enablePan) { - var x = 0.5 * (event.touches[0].pageX + event.touches[1].pageX); - var y = 0.5 * (event.touches[0].pageY + event.touches[1].pageY); - panStart.set(x, y); - } - } - - - function handleTouchMoveRotate(event) { - rotateEnd.set(event.touches[0].pageX, event.touches[0].pageY); - rotateDelta.subVectors(rotateEnd, rotateStart) - .multiplyScalar(scope.rotateSpeed); - - var element = scope.domElement === document ? - scope.domElement.body : scope.domElement; - - // yes, height - rotateLeft(2 * Math.PI * rotateDelta.x / element.clientHeight); - rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight); - rotateStart.copy(rotateEnd); - scope.update(); - } - - - function handleTouchMoveDollyPan(event) { - if (scope.enableZoom) { - var dx = event.touches[0].pageX - event.touches[1].pageX; - var dy = event.touches[0].pageY - event.touches[1].pageY; - var distance = Math.sqrt(dx * dx + dy * dy); - - dollyEnd.set(0, distance); - dollyDelta.set(0, Math.pow(dollyEnd.y / dollyStart.y, scope.zoomSpeed)); - dollyIn(dollyDelta.y); - dollyStart.copy(dollyEnd); + // event callbacks - update the object state + function handleMouseDownRotate(event) { + rotateStart.set(event.clientX, event.clientY); } - - if (scope.enablePan) { - var x = 0.5 * (event.touches[0].pageX + event.touches[1].pageX); - var y = 0.5 * (event.touches[0].pageY + event.touches[1].pageY); - - panEnd.set(x, y); - panDelta.subVectors(panEnd, panStart).multiplyScalar(scope.panSpeed); - pan(panDelta.x, panDelta.y); - panStart.copy(panEnd); + function handleMouseDownDolly(event) { + dollyStart.set(event.clientX, event.clientY); } - scope.update(); - } - - - function handleTouchEnd(event) {} - - - // event handlers - listen for events and reset state - function onMouseDown(event) { - if (!scope.enabled) return; - - event.preventDefault(); - - switch (event.button) { - case scope.mouseButtons.ORBIT: - if (!scope.enableRotate) return; - handleMouseDownRotate(event); - state = STATE.ROTATE; - break; - - case scope.mouseButtons.ZOOM: - if (!scope.enableZoom) return; - handleMouseDownDolly(event); - state = STATE.DOLLY; - break; - - case scope.mouseButtons.PAN: - if (!scope.enablePan) return; - handleMouseDownPan(event); - state = STATE.PAN; - break; + function handleMouseDownPan(event) { + panStart.set(event.clientX, event.clientY); } - if (state != STATE.NONE) { - document.addEventListener('mousemove', onMouseMove, false); - document.addEventListener('mouseup', onMouseUp, false); - scope.dispatchEvent(startEvent); - } - } + function handleMouseMoveRotate(event) { + rotateEnd.set(event.clientX, event.clientY); + rotateDelta.subVectors(rotateEnd, rotateStart) + .multiplyScalar(scope.rotateSpeed); + const element = scope.domElement === document ? + scope.domElement.body : scope.domElement; - function onMouseMove(event) { - if (!scope.enabled) return; + // yes, height + rotateLeft(2 * Math.PI * rotateDelta.x / element.clientHeight); + rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight); - event.preventDefault(); + rotateStart.copy(rotateEnd); - switch (state) { - case STATE.ROTATE: - if (!scope.enableRotate) return; - handleMouseMoveRotate(event); - break; - - case STATE.DOLLY: - if (!scope.enableZoom) return; - handleMouseMoveDolly(event); - break; - - case STATE.PAN: - if (!scope.enablePan) return; - handleMouseMovePan(event); - break; - } - } - - - function onMouseUp(event) { - if (!scope.enabled) return; - - handleMouseUp(event); - document.removeEventListener('mousemove', onMouseMove, false); - document.removeEventListener('mouseup', onMouseUp, false); - scope.dispatchEvent(endEvent); - state = STATE.NONE; - } - - - function onMouseWheel(event) { - if (!scope.enabled || !scope.enableZoom || - (state != STATE.NONE && state != STATE.ROTATE)) return; - - event.preventDefault(); - event.stopPropagation(); - scope.dispatchEvent(startEvent); - handleMouseWheel(event); - scope.dispatchEvent(endEvent); - } - - - function onKeyDown(event) { - if (!scope.enabled || !scope.enableKeys || !scope.enablePan) return; - - handleKeyDown(event); - } - - - function onTouchStart(event) { - if (!scope.enabled) return; - - event.preventDefault(); - - switch (event.touches.length) { - case 1: // one-fingered touch: rotate - if (!scope.enableRotate) return; - handleTouchStartRotate(event); - state = STATE.TOUCH_ROTATE; - break; - - case 2: // two-fingered touch: dolly-pan - if (!scope.enableZoom && !scope.enablePan) return; - handleTouchStartDollyPan(event); - state = STATE.TOUCH_DOLLY_PAN; - break; - - default: state = STATE.NONE; + scope.update(); } - if (state != STATE.NONE) scope.dispatchEvent(startEvent); - } + function handleMouseMoveDolly(event) { + dollyEnd.set(event.clientX, event.clientY); + dollyDelta.subVectors(dollyEnd, dollyStart); + if (dollyDelta.y > 0) { + dollyIn(getZoomScale()); + } else if (dollyDelta.y < 0) { + dollyOut(getZoomScale()); + } - function onTouchMove(event) { - if (!scope.enabled) return; - - event.preventDefault(); - event.stopPropagation(); - - switch (event.touches.length) { - case 1: // one-fingered touch: rotate - if (!scope.enableRotate) return; - if (state != STATE.TOUCH_ROTATE) return; // is this needed? - - handleTouchMoveRotate(event); - break; - - case 2: // two-fingered touch: dolly-pan - if (!scope.enableZoom && !scope.enablePan) return; - if (state != STATE.TOUCH_DOLLY_PAN) return; // is this needed? - - handleTouchMoveDollyPan(event); - break; - - default: state = STATE.NONE; + dollyStart.copy(dollyEnd); + scope.update(); } - } + function handleMouseMovePan(event) { + panEnd.set(event.clientX, event.clientY); + panDelta.subVectors(panEnd, panStart).multiplyScalar(scope.panSpeed); + pan(panDelta.x, panDelta.y); + panStart.copy(panEnd); + scope.update(); + } - function onTouchEnd(event) { - if (!scope.enabled) return; + function handleMouseWheel(event) { + if (event.deltaY < 0) { + dollyOut(getZoomScale()); + } else if (event.deltaY > 0) { + dollyIn(getZoomScale()); + } - handleTouchEnd(event); - scope.dispatchEvent(endEvent); - state = STATE.NONE; - } + scope.update(); + } + function handleKeyDown(event) { + switch (event.keyCode) { + case scope.keys.UP: + pan(0, scope.keyPanSpeed); + scope.update(); + break; - function onContextMenu(event) { - if (!scope.enabled) return; - event.preventDefault(); - } + case scope.keys.BOTTOM: + pan(0, -scope.keyPanSpeed); + scope.update(); + break; + case scope.keys.LEFT: + pan(scope.keyPanSpeed, 0); + scope.update(); + break; - scope.domElement.addEventListener('contextmenu', onContextMenu, false); - scope.domElement.addEventListener('mousedown', onMouseDown, false); - scope.domElement.addEventListener('wheel', onMouseWheel, false); - scope.domElement.addEventListener('touchstart', onTouchStart, false); - scope.domElement.addEventListener('touchend', onTouchEnd, false); - scope.domElement.addEventListener('touchmove', onTouchMove, false); - window .addEventListener('keydown', onKeyDown, false); + case scope.keys.RIGHT: + pan(-scope.keyPanSpeed, 0); + scope.update(); + break; + } + } - this.update(); // force an update at start -} + function handleTouchStartRotate(event) { + rotateStart.set(event.touches[0].pageX, event.touches[0].pageY); + } + function handleTouchStartDollyPan(event) { + if (scope.enableZoom) { + const dx = event.touches[0].pageX - event.touches[1].pageX; + const dy = event.touches[0].pageY - event.touches[1].pageY; + const distance = Math.sqrt(dx * dx + dy * dy); + + dollyStart.set(0, distance); + } + + if (scope.enablePan) { + const x = 0.5 * (event.touches[0].pageX + event.touches[1].pageX); + const y = 0.5 * (event.touches[0].pageY + event.touches[1].pageY); + panStart.set(x, y); + } + } + + function handleTouchMoveRotate(event) { + rotateEnd.set(event.touches[0].pageX, event.touches[0].pageY); + rotateDelta.subVectors(rotateEnd, rotateStart) + .multiplyScalar(scope.rotateSpeed); + + const element = scope.domElement === document ? + scope.domElement.body : scope.domElement; + + // yes, height + rotateLeft(2 * Math.PI * rotateDelta.x / element.clientHeight); + rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight); + rotateStart.copy(rotateEnd); + scope.update(); + } + + function handleTouchMoveDollyPan(event) { + if (scope.enableZoom) { + const dx = event.touches[0].pageX - event.touches[1].pageX; + const dy = event.touches[0].pageY - event.touches[1].pageY; + const distance = Math.sqrt(dx * dx + dy * dy); + + dollyEnd.set(0, distance); + dollyDelta.set(0, Math.pow(dollyEnd.y / dollyStart.y, scope.zoomSpeed)); + dollyIn(dollyDelta.y); + dollyStart.copy(dollyEnd); + } + + if (scope.enablePan) { + const x = 0.5 * (event.touches[0].pageX + event.touches[1].pageX); + const y = 0.5 * (event.touches[0].pageY + event.touches[1].pageY); + + panEnd.set(x, y); + panDelta.subVectors(panEnd, panStart).multiplyScalar(scope.panSpeed); + pan(panDelta.x, panDelta.y); + panStart.copy(panEnd); + } + + scope.update(); + } + + // event handlers - listen for events and reset state + function onMouseDown(event) { + if (!scope.enabled) { + return; + } + + event.preventDefault(); + + switch (event.button) { + case scope.mouseButtons.ORBIT: + if (!scope.enableRotate) { + return; + } + handleMouseDownRotate(event); + state = STATE.ROTATE; + break; + + case scope.mouseButtons.ZOOM: + if (!scope.enableZoom) { + return; + } + handleMouseDownDolly(event); + state = STATE.DOLLY; + break; + + case scope.mouseButtons.PAN: + if (!scope.enablePan) { + return; + } + handleMouseDownPan(event); + state = STATE.PAN; + break; + } + + if (state != STATE.NONE) { + document.addEventListener("mousemove", onMouseMove, false); + document.addEventListener("mouseup", onMouseUp, false); + scope.dispatchEvent(startEvent); + } + } + + function onMouseMove(event) { + if (!scope.enabled) { + return; + } + + event.preventDefault(); + + switch (state) { + case STATE.ROTATE: + if (!scope.enableRotate) { + return; + } + handleMouseMoveRotate(event); + break; + + case STATE.DOLLY: + if (!scope.enableZoom) { + return; + } + handleMouseMoveDolly(event); + break; + + case STATE.PAN: + if (!scope.enablePan) { + return; + } + handleMouseMovePan(event); + break; + } + } + + function onMouseUp() { + if (!scope.enabled) { + return; + } + + document.removeEventListener("mousemove", onMouseMove, false); + document.removeEventListener("mouseup", onMouseUp, false); + scope.dispatchEvent(endEvent); + state = STATE.NONE; + } + + function onMouseWheel(event) { + if (!scope.enabled || !scope.enableZoom || + (state != STATE.NONE && state != STATE.ROTATE)) { + return; + } + + event.preventDefault(); + event.stopPropagation(); + scope.dispatchEvent(startEvent); + handleMouseWheel(event); + scope.dispatchEvent(endEvent); + } + + function onKeyDown(event) { + if (!scope.enabled || !scope.enableKeys || !scope.enablePan) { + return; + } + + handleKeyDown(event); + } + + function onTouchStart(event) { + if (!scope.enabled) { + return; + } + + event.preventDefault(); + + switch (event.touches.length) { + case 1: // one-fingered touch: rotate + if (!scope.enableRotate) { + return; + } + handleTouchStartRotate(event); + state = STATE.TOUCH_ROTATE; + break; + + case 2: // two-fingered touch: dolly-pan + if (!scope.enableZoom && !scope.enablePan) { + return; + } + handleTouchStartDollyPan(event); + state = STATE.TOUCH_DOLLY_PAN; + break; + + default: state = STATE.NONE; + } + + if (state != STATE.NONE) { + scope.dispatchEvent(startEvent); + } + } + + function onTouchMove(event) { + if (!scope.enabled) { + return; + } + + event.preventDefault(); + event.stopPropagation(); + + switch (event.touches.length) { + case 1: // one-fingered touch: rotate + if (!scope.enableRotate) { + return; + } + if (state != STATE.TOUCH_ROTATE) { + return; + } // is this needed? + + handleTouchMoveRotate(event); + break; + + case 2: // two-fingered touch: dolly-pan + if (!scope.enableZoom && !scope.enablePan) { + return; + } + if (state != STATE.TOUCH_DOLLY_PAN) { + return; + } // is this needed? + + handleTouchMoveDollyPan(event); + break; + + default: state = STATE.NONE; + } + } + + function onTouchEnd() { + if (!scope.enabled) { + return; + } + + scope.dispatchEvent(endEvent); + state = STATE.NONE; + } + + function onContextMenu(event) { + if (!scope.enabled) { + return; + } + event.preventDefault(); + } + + scope.domElement.addEventListener("contextmenu", onContextMenu, false); + scope.domElement.addEventListener("mousedown", onMouseDown, false); + scope.domElement.addEventListener("wheel", onMouseWheel, false); + scope.domElement.addEventListener("touchstart", onTouchStart, false); + scope.domElement.addEventListener("touchend", onTouchEnd, false); + scope.domElement.addEventListener("touchmove", onTouchMove, false); + window.addEventListener("keydown", onKeyDown, false); + + this.update(); // force an update at start +}; OrbitControls.prototype = Object.create(THREE.EventDispatcher.prototype); OrbitControls.prototype.constructor = OrbitControls; diff --git a/src/js/path-viewer.js b/src/js/path-viewer.js index f790af0..6240a5b 100644 --- a/src/js/path-viewer.js +++ b/src/js/path-viewer.js @@ -1,766 +1,773 @@ -/******************************************************************************\ +"use strict"; - Copyright 2018. Buildbotics LLC - All Rights Reserved. - - For information regarding this software email: - Joseph Coffland - joseph@buildbotics.com - - This software is free software: you clan redistribute it and/or - modify it under the terms of the GNU Lesser General Public License - as published by the Free Software Foundation, either version 2.1 of - the License, or (at your option) any later version. - - This software 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the C! library. If not, see - . - -\******************************************************************************/ - -'use strict' - -var orbit = require('./orbit'); -var cookie = require('./cookie')('bbctrl-'); -var font = require('./helvetiker_regular.typeface.json') +const orbit = require("./orbit"); +const cookie = require("./cookie")("bbctrl-"); +const font = require("./helvetiker_regular.typeface.json"); module.exports = { - template: '#path-viewer-template', - props: ['toolpath'], + template: "#path-viewer-template", + props: [ "toolpath" ], - data: function () { - return { - enabled: false, - loading: false, - dirty: true, - snapView: cookie.get('snap-view', 'isometric'), - small: cookie.get_bool('small-path-view', true), - surfaceMode: 'cut', - showPath: cookie.get_bool('show-path', true), - showTool: cookie.get_bool('show-tool', true), - showBBox: cookie.get_bool('show-bbox', true), - showAxes: cookie.get_bool('show-axes', true), - showIntensity: cookie.get_bool('show-intensity', false) - } - }, - - - computed: { - target: function () { - return $(this.$el).find('.path-viewer-content')[0] + data: function() { + return { + enabled: false, + loading: false, + dirty: true, + snapView: cookie.get("snap-view", "isometric"), + small: cookie.get_bool("small-path-view", true), + surfaceMode: "cut", + showPath: cookie.get_bool("show-path", true), + showTool: cookie.get_bool("show-tool", true), + showBBox: cookie.get_bool("show-bbox", true), + showAxes: cookie.get_bool("show-axes", true), + showIntensity: cookie.get_bool("show-intensity", false) + }; }, - webglAvailable: function() { - // Create canvas element. The canvas is not added to the - // document itself, so it is never displayed in the - // browser window. - const canvas = document.createElement("canvas"); - - // Get WebGLRenderingContext from canvas element. - const gl = canvas.getContext("webgl") || canvas.getContext("experimental-webgl"); - - // Report the result. - return gl && gl instanceof WebGLRenderingContext; - } - }, - - - watch: { - toolpath: function () {Vue.nextTick(this.update)}, - surfaceMode: function (mode) {this.update_surface_mode(mode)}, - - - small: function (enable) { - cookie.set_bool('small-path-view', enable); - Vue.nextTick(this.update_view) - }, - - - showPath: function (enable) { - cookie.set_bool('show-path', enable); - this.set_visible(this.pathView, enable) - }, - - - showTool: function (enable) { - cookie.set_bool('show-tool', enable); - this.set_visible(this.toolView, enable) - }, - - - showAxes: function (enable) { - cookie.set_bool('show-axes', enable); - this.set_visible(this.axesView, enable) - }, - - - showIntensity: function (enable) { - cookie.set_bool('show-intensity', enable); - Vue.nextTick(this.update) - }, - - - showBBox: function (enable) { - cookie.set_bool('show-bbox', enable); - this.set_visible(this.bboxView, enable); - this.set_visible(this.envelopeView, enable); - }, - - - x: function () {this.axis_changed()}, - y: function () {this.axis_changed()}, - z: function () {this.axis_changed()} - }, - - - ready: function () { - this.graphics(); - Vue.nextTick(this.update); - }, - - - methods: { - update: async function () { - if (!this.webglAvailable) { - return; - } - - if (!this.state.selected) { - this.dirty = true; - this.scene = new THREE.Scene(); - - } else if (!this.toolpath.filename && !this.loading) { - this.loading = true; - this.dirty = true; - this.draw_loading(); - } - - if (!this.enabled || !this.toolpath.filename) return; - - async function get(url) { - const response = await fetch(`${url}?${Math.random()}`); - const arrayBuffer = await response.arrayBuffer(); - - return new Float32Array(arrayBuffer); - } - - const [positions, speeds] = await Promise.all([ - get('/api/path/' + this.toolpath.filename + '/positions'), - get('/api/path/' + this.toolpath.filename + '/speeds') - ]); - - this.positions = positions - this.speeds = speeds; - this.loading = false; - - // Update scene - this.scene = new THREE.Scene(); - this.draw(this.scene); - this.snap(this.snapView); - - this.update_view(); - }, - - - update_surface_mode: function (mode) { - if (!this.enabled) return; - - if (typeof this.surfaceMaterial != 'undefined') { - this.surfaceMaterial.wireframe = mode == 'wire'; - this.surfaceMaterial.needsUpdate = true; - } - - this.set_visible(this.surfaceMesh, mode == 'cut' || mode == 'wire'); - this.set_visible(this.workpieceMesh, mode == 'solid'); - }, - - - load_surface: function (surface) { - if (typeof surface == 'undefined') { - this.vertices = undefined; - this.normals = undefined; - return; - } - - this.vertices = surface.vertices; - - // Expand normals - this.normals = []; - for (var i = 0; i < surface.normals.length / 3; i++) - for (var j = 0; j < 3; j++) - for (var k = 0; k < 3; k++) - this.normals.push(surface.normals[i * 3 + k]); - }, - - - set_visible: function (target, visible) { - if (typeof target != 'undefined') target.visible = visible; - this.dirty = true; - }, - - - get_dims: function () { - var t = $(this.target); - var width = t.innerWidth(); - var height = t.innerHeight(); - return {width: width, height: height}; - }, - - - update_view: function () { - if (!this.enabled) return; - var dims = this.get_dims(); - - this.camera.aspect = dims.width / dims.height; - this.camera.updateProjectionMatrix(); - this.renderer.setSize(dims.width, dims.height); - - if (this.loading) { - this.controls.reset(); - this.camera.position.copy(new THREE.Vector3(0, 0, 600)); - this.camera.lookAt(new THREE.Vector3(0, 0, 0)); - } - - this.dirty = true; - }, - - - update_tool: function (tool) { - if (!this.enabled) return; - if (typeof tool == 'undefined') tool = this.toolView; - if (typeof tool == 'undefined') return; - tool.position.x = this.x.pos; - tool.position.y = this.y.pos; - tool.position.z = this.z.pos; - }, - - - update_envelope: function (envelope) { - if (!this.enabled || !this.axes.homed) return; - if (typeof envelope == 'undefined') envelope = this.envelopeView; - if (typeof envelope == 'undefined') return; - - var min = new THREE.Vector3(); - var max = new THREE.Vector3(); - - for (var axis of 'xyz') { - min[axis] = this[axis].min - this[axis].off; - max[axis] = this[axis].max - this[axis].off; - } - - var bounds = new THREE.Box3(min, max); - if (bounds.isEmpty()) { - envelope.geometry = this.create_empty_geom(); - } - else { - envelope.geometry = this.create_bbox_geom(bounds); - } - }, - - - axis_changed: function () { - this.update_tool(); - this.update_envelope(); - this.dirty = true; - }, - - - graphics: function () { - if (!this.webglAvailable) { - return; - } - - try { - // Renderer - this.renderer = new THREE.WebGLRenderer({antialias: true, alpha: true}); - this.renderer.setPixelRatio(window.devicePixelRatio); - this.renderer.setClearColor(0, 0); - this.target.appendChild(this.renderer.domElement); - - } catch (e) { - console.log('WebGL not supported: ', e); - return; - } - - this.enabled = true; - - // Camera - this.camera = new THREE.PerspectiveCamera(45, 4 / 3, 1, 10000); - - // Lighting - this.ambient = new THREE.AmbientLight(0xffffff, 0.5); - - var keyLight = new THREE.DirectionalLight - (new THREE.Color('hsl(30, 100%, 75%)'), 0.75); - keyLight.position.set(-100, 0, 100); - - var fillLight = new THREE.DirectionalLight - (new THREE.Color('hsl(240, 100%, 75%)'), 0.25); - fillLight.position.set(100, 0, 100); - - var backLight = new THREE.DirectionalLight(0xffffff, 0.5); - backLight.position.set(100, 0, -100).normalize(); - - this.lights = new THREE.Group(); - this.lights.add(keyLight); - this.lights.add(fillLight); - this.lights.add(backLight); - - // Surface material - this.surfaceMaterial = this.create_surface_material(); - - // Controls - this.controls = new orbit(this.camera, this.renderer.domElement); - this.controls.enableDamping = true; - this.controls.dampingFactor = 0.2; - this.controls.rotateSpeed = 0.25; - this.controls.enableZoom = true; - - // Move lights with scene - this.controls.addEventListener('change', function (scope) { - return function () { - keyLight.position.copy(scope.camera.position); - fillLight.position.copy(scope.camera.position); - backLight.position.copy(scope.camera.position); - keyLight.lookAt(scope.controls.target); - fillLight.lookAt(scope.controls.target); - backLight.lookAt(scope.controls.target); - scope.dirty = true; + computed: { + target: function() { + return this.$el.querySelector(".path-viewer-content"); + }, + + webglAvailable: function() { + // Create canvas element. The canvas is not added to the + // document itself, so it is never displayed in the + // browser window. + const canvas = document.createElement("canvas"); + + // Get WebGLRenderingContext from canvas element. + const gl = canvas.getContext("webgl") || canvas.getContext("experimental-webgl"); + + // Report the result. + return gl && gl instanceof WebGLRenderingContext; } - }(this)) - - // Events - window.addEventListener('resize', this.update_view, false); - - // Start it - this.render(); }, - - create_surface_material: function () { - return new THREE.MeshPhongMaterial({ - specular: 0x111111, - shininess: 10, - side: THREE.FrontSide, - color: 0x0c2d53 - }); - }, - - - draw_loading: function () { - this.scene = new THREE.Scene(); - - var geometry = new THREE.TextGeometry('Loading 3D View...', { - font: new THREE.Font(font), - size: 40, - height: 5, - curveSegments: 12, - bevelEnabled: true, - bevelThickness: 10, - bevelSize: 8, - bevelSegments: 5 - }); - geometry.computeBoundingBox(); - - var center = geometry.center(); - var mesh = new THREE.Mesh(geometry, this.surfaceMaterial); - - this.scene.add(mesh); - this.scene.add(this.ambient); - this.scene.add(this.lights); - this.update_view(); - }, - - - draw_workpiece: function (scene, material) { - if (typeof this.workpiece == 'undefined') return; - - var min = this.workpiece.min; - var max = this.workpiece.max; - - min = new THREE.Vector3(min[0], min[1], min[2]); - max = new THREE.Vector3(max[0], max[1], max[2]); - var dims = max.clone().sub(min); - - var geometry = new THREE.BoxGeometry(dims.x, dims.y, dims.z) - var mesh = new THREE.Mesh(geometry, material); - - var offset = dims.clone(); - offset.divideScalar(2); - offset.add(min); - - mesh.position.add(offset); - - geometry.computeBoundingBox(); - - scene.add(mesh); - - return mesh; - }, - - - draw_surface: function (scene, material) { - if (typeof this.vertices == 'undefined') return; - - var geometry = new THREE.BufferGeometry(); - - geometry.addAttribute - ('position', new THREE.Float32BufferAttribute(this.vertices, 3)); - geometry.addAttribute - ('normal', new THREE.Float32BufferAttribute(this.normals, 3)); - - geometry.computeBoundingSphere(); - geometry.computeBoundingBox(); - - return new THREE.Mesh(geometry, material); - }, - - - draw_tool: function (scene, bbox) { - // Tool size is relative to bounds - var size = bbox.getSize(new THREE.Vector3()); - var length = (size.x + size.y + size.z) / 24; - - if (length < 1) length = 1; - - var material = new THREE.MeshPhongMaterial({ - transparent: true, - opacity: 0.75, - specular: 0x161616, - shininess: 10, - color: 0xffa500 // Orange - }); - - var geometry = new THREE.CylinderGeometry(length / 2, 0, length, 128); - geometry.translate(0, length / 2, 0); - geometry.rotateX(0.5 * Math.PI); - - var mesh = new THREE.Mesh(geometry, material); - this.update_tool(mesh); - mesh.visible = this.showTool; - scene.add(mesh); - return mesh; - }, - - - draw_axis: function (axis, up, length, radius) { - var color; - - if (axis == 0) color = 0xff0000; // Red - else if (axis == 1) color = 0x00ff00; // Green - else if (axis == 2) color = 0x0000ff; // Blue - - var group = new THREE.Group(); - var material = new THREE.MeshPhongMaterial({ - specular: 0x161616, shininess: 10, color: color - }); - var geometry = new THREE.CylinderGeometry(radius, radius, length, 128); - geometry.translate(0, -length / 2, 0); - group.add(new THREE.Mesh(geometry, material)); - - geometry = new THREE.CylinderGeometry(1.5 * radius, 0, 2 * radius, 128); - geometry.translate(0, -length - radius, 0); - group.add(new THREE.Mesh(geometry, material)); - - if (axis == 0) group.rotateZ((up ? 0.5 : 1.5) * Math.PI); - else if (axis == 1) group.rotateX((up ? 0 : 1 ) * Math.PI); - else if (axis == 2) group.rotateX((up ? 1.5 : 0.5) * Math.PI); - - return group; - }, - - - draw_axes: function (scene, bbox) { - var size = bbox.getSize(new THREE.Vector3()); - var length = (size.x + size.y + size.z) / 3; - length /= 10; - - if (length < 1) length = 1; - - var radius = length / 20; - - var group = new THREE.Group(); - - for (var axis = 0; axis < 3; axis++) - for (var up = 0; up < 2; up++) - group.add(this.draw_axis(axis, up, length, radius)); - - group.visible = this.showAxes; - scene.add(group); - - return group; - }, - - - get_color: function (speed) { - if (isNaN(speed)) return [255, 0, 0]; // Rapid - - var intensity = speed / this.toolpath.maxSpeed; - if (typeof speed == 'undefined' || !this.showIntensity) intensity = 1; - return [0, 255 * intensity, 127 * (1 - intensity)]; - }, - - - draw_path: function (scene) { - var geometry = new THREE.BufferGeometry(); - var material = - new THREE.LineBasicMaterial({ - vertexColors: THREE.VertexColors, - linewidth: 1.5 - }); - - var positions = new THREE.Float32BufferAttribute(this.positions, 3); - geometry.addAttribute('position', positions); - - var colors = []; - for (var i = 0; i < this.speeds.length; i++) { - var color = this.get_color(this.speeds[i]); - Array.prototype.push.apply(colors, color); - } - - colors = new THREE.Uint8BufferAttribute(colors, 3, true); - geometry.addAttribute('color', colors); - - geometry.computeBoundingSphere(); - geometry.computeBoundingBox(); - - var line = new THREE.Line(geometry, material); - - line.visible = this.showPath; - scene.add(line); - - return line; - }, - - - create_empty_geom: function () { - var geometry = new THREE.BufferGeometry(); - geometry.addAttribute('position', - new THREE.Float32BufferAttribute([], 3)); - return geometry; - }, - - - create_bbox_geom: function (bbox) { - var vertices = []; - - if (!bbox.isEmpty()) { - // Top - vertices.push(bbox.min.x, bbox.min.y, bbox.min.z); - vertices.push(bbox.max.x, bbox.min.y, bbox.min.z); - vertices.push(bbox.max.x, bbox.min.y, bbox.min.z); - vertices.push(bbox.max.x, bbox.min.y, bbox.max.z); - vertices.push(bbox.max.x, bbox.min.y, bbox.max.z); - vertices.push(bbox.min.x, bbox.min.y, bbox.max.z); - vertices.push(bbox.min.x, bbox.min.y, bbox.max.z); - vertices.push(bbox.min.x, bbox.min.y, bbox.min.z); - - // Bottom - vertices.push(bbox.min.x, bbox.max.y, bbox.min.z); - vertices.push(bbox.max.x, bbox.max.y, bbox.min.z); - vertices.push(bbox.max.x, bbox.max.y, bbox.min.z); - vertices.push(bbox.max.x, bbox.max.y, bbox.max.z); - vertices.push(bbox.max.x, bbox.max.y, bbox.max.z); - vertices.push(bbox.min.x, bbox.max.y, bbox.max.z); - vertices.push(bbox.min.x, bbox.max.y, bbox.max.z); - vertices.push(bbox.min.x, bbox.max.y, bbox.min.z); - - // Sides - vertices.push(bbox.min.x, bbox.min.y, bbox.min.z); - vertices.push(bbox.min.x, bbox.max.y, bbox.min.z); - vertices.push(bbox.max.x, bbox.min.y, bbox.min.z); - vertices.push(bbox.max.x, bbox.max.y, bbox.min.z); - vertices.push(bbox.max.x, bbox.min.y, bbox.max.z); - vertices.push(bbox.max.x, bbox.max.y, bbox.max.z); - vertices.push(bbox.min.x, bbox.min.y, bbox.max.z); - vertices.push(bbox.min.x, bbox.max.y, bbox.max.z); - } - - var geometry = new THREE.BufferGeometry(); - - geometry.addAttribute('position', - new THREE.Float32BufferAttribute(vertices, 3)); - - return geometry; - }, - - - draw_bbox: function (scene, bbox) { - var geometry = this.create_bbox_geom(bbox); - var material = new THREE.LineBasicMaterial({color: 0xffffff}); - var line = new THREE.LineSegments(geometry, material); - - line.visible = this.showBBox; - - scene.add(line); - - return line; - }, - - - draw_envelope: function (scene) { - var geometry = this.create_empty_geom(); - var material = new THREE.LineBasicMaterial({color: 0x00f7ff}); - var line = new THREE.LineSegments(geometry, material); - - line.visible = this.showBBox; - - scene.add(line); - this.update_envelope(line); - - return line; - }, - - - draw: function (scene) { - // Lights - scene.add(this.ambient); - scene.add(this.lights); - - // Model - this.pathView = this.draw_path(scene); - this.surfaceMesh = this.draw_surface(scene, this.surfaceMaterial); - this.workpieceMesh = this.draw_workpiece(scene, this.surfaceMaterial); - this.update_surface_mode(this.surfaceMode); - - // Compute bounding box - var bbox = this.get_model_bounds(); - - // Tool, axes & bounds - this.toolView = this.draw_tool(scene, bbox); - this.axesView = this.draw_axes(scene, bbox); - this.bboxView = this.draw_bbox(scene, bbox); - this.envelopeView = this.draw_envelope(scene); - }, - - - render: function () { - window.requestAnimationFrame(this.render); - if (typeof this.scene == 'undefined') return; - - if (this.controls.update() || this.dirty) { - this.dirty = false; - this.renderer.render(this.scene, this.camera); - } - }, - - - get_model_bounds: function () { - var bbox = new THREE.Box3(new THREE.Vector3(0, 0, 0), - new THREE.Vector3(0.00001, 0.00001, 0.00001)); - - function add(o) { - if (typeof o != 'undefined') { - var oBBox = new THREE.Box3(); - oBBox.setFromObject(o); - bbox.union(oBBox); + watch: { + toolpath: function() { + Vue.nextTick(this.update); + }, + + surfaceMode: function(mode) { + this.update_surface_mode(mode); + }, + + small: function(enable) { + cookie.set_bool("small-path-view", enable); + Vue.nextTick(this.update_view); + }, + + showPath: function(enable) { + cookie.set_bool("show-path", enable); + this.set_visible(this.pathView, enable); + }, + + showTool: function(enable) { + cookie.set_bool("show-tool", enable); + this.set_visible(this.toolView, enable); + }, + + showAxes: function(enable) { + cookie.set_bool("show-axes", enable); + this.set_visible(this.axesView, enable); + }, + + showIntensity: function(enable) { + cookie.set_bool("show-intensity", enable); + Vue.nextTick(this.update); + }, + + showBBox: function(enable) { + cookie.set_bool("show-bbox", enable); + this.set_visible(this.bboxView, enable); + this.set_visible(this.envelopeView, enable); + }, + + x: function() { + this.axis_changed(); + }, + + y: function() { + this.axis_changed(); + }, + + z: function() { + this.axis_changed(); } - } - - add(this.pathView); - add(this.surfaceMesh); - add(this.workpieceMesh); - - return bbox; }, + ready: function() { + this.graphics(); + Vue.nextTick(this.update); + }, - snap: function (view) { - if (this.loading) return; - if (view != this.snapView) { - this.snapView = view; - cookie.set('snap-view', view); - } + methods: { + update: async function() { + if (!this.webglAvailable) { + return; + } - var bbox = this.get_model_bounds(); - this.controls.reset(); - bbox.getCenter(this.controls.target); - this.update_view(); + if (!this.state.selected) { + this.dirty = true; + this.scene = new THREE.Scene(); - // Compute new camera position - var center = bbox.getCenter(new THREE.Vector3()); - var offset = new THREE.Vector3(); + } else if (!this.toolpath.filename && !this.loading) { + this.loading = true; + this.dirty = true; + this.draw_loading(); + } - if (view == 'isometric') {offset.y -= 1; offset.z += 1;} - if (view == 'front') offset.y -= 1; - if (view == 'back') offset.y += 1; - if (view == 'left') offset.x -= 1; - if (view == 'right') offset.x += 1; - if (view == 'top') offset.z += 1; - if (view == 'bottom') offset.z -= 1; - offset.normalize(); + if (!this.enabled || !this.toolpath.filename) { + return; + } - // Initial camera position - var position = new THREE.Vector3().copy(center).add(offset); - this.camera.position.copy(position); - this.camera.lookAt(center); // Get correct camera orientation + async function get(url) { + const response = await fetch(`${url}`, { cache: "no-cache" }); + const arrayBuffer = await response.arrayBuffer(); - var theta = this.camera.fov / 180 * Math.PI; // View angle - var cameraLine = new THREE.Line3(center, position); - var cameraUp = new THREE.Vector3().copy(this.camera.up) - .applyQuaternion(this.camera.quaternion); - var cameraLeft = - new THREE.Vector3().copy(offset).cross(cameraUp).normalize(); + return new Float32Array(arrayBuffer); + } - var corners = [ - new THREE.Vector3(bbox.min.x, bbox.min.y, bbox.min.z), - new THREE.Vector3(bbox.min.x, bbox.min.y, bbox.max.z), - new THREE.Vector3(bbox.min.x, bbox.max.y, bbox.min.z), - new THREE.Vector3(bbox.min.x, bbox.max.y, bbox.max.z), - new THREE.Vector3(bbox.max.x, bbox.min.y, bbox.min.z), - new THREE.Vector3(bbox.max.x, bbox.min.y, bbox.max.z), - new THREE.Vector3(bbox.max.x, bbox.max.y, bbox.min.z), - new THREE.Vector3(bbox.max.x, bbox.max.y, bbox.max.z), - ] + const [ positions, speeds ] = await Promise.all([ + get(`/api/path/${this.toolpath.filename}/positions`), + get(`/api/path/${this.toolpath.filename}/speeds`) + ]); - var dist = this.camera.near; // Min camera dist + this.positions = positions; + this.speeds = speeds; + this.loading = false; - for (var i = 0; i < corners.length; i++) { - // Project on to camera line - var p1 = cameraLine - .closestPointToPoint(corners[i], false, new THREE.Vector3()); + // Update scene + this.scene = new THREE.Scene(); + this.draw(this.scene); + this.snap(this.snapView); - // Compute distance from projection to center - var d = p1.distanceTo(center); - if (cameraLine.closestPointToPointParameter(p1, false) < 0) d = -d; + this.update_view(); + }, - // Compute up line - var up = - new THREE.Line3(p1, new THREE.Vector3().copy(p1).add(cameraUp)); + update_surface_mode: function(mode) { + if (!this.enabled) { + return; + } - // Project on to up line - var p2 = up.closestPointToPoint(corners[i], false, new THREE.Vector3()); + if (typeof this.surfaceMaterial != "undefined") { + this.surfaceMaterial.wireframe = mode == "wire"; + this.surfaceMaterial.needsUpdate = true; + } - // Compute length - var l = p1.distanceTo(p2); + this.set_visible(this.surfaceMesh, mode == "cut" || mode == "wire"); + this.set_visible(this.workpieceMesh, mode == "solid"); + }, - // Update min camera distance - dist = Math.max(dist, d + l / Math.tan(theta / 2)); + load_surface: function(surface) { + if (typeof surface == "undefined") { + this.vertices = undefined; + this.normals = undefined; + return; + } - // Compute left line - var left = - new THREE.Line3(p1, new THREE.Vector3().copy(p1).add(cameraLeft)); + this.vertices = surface.vertices; - // Project on to left line - var p3 = - left.closestPointToPoint(corners[i], false, new THREE.Vector3()); + // Expand normals + this.normals = []; + for (let i = 0; i < surface.normals.length / 3; i++) { + for (let j = 0; j < 3; j++) { + for (let k = 0; k < 3; k++) { + this.normals.push(surface.normals[i * 3 + k]); + } + } + } + }, - // Compute length - l = p1.distanceTo(p3); + set_visible: function(target, visible) { + if (typeof target != "undefined") { + target.visible = visible; + } + this.dirty = true; + }, - // Update min camera distance - dist = Math.max(dist, d + l / Math.tan(theta / 2) / this.camera.aspect); - } + get_dims: function() { + const computedStyle = window.getComputedStyle(this.target); - this.camera.position.copy(offset.multiplyScalar(dist * 1.2).add(center)); - } - }, + return { + width: parseInt(computedStyle.width), + height: parseInt(computedStyle.height) + }; + }, + update_view: function() { + if (!this.enabled) { + return; + } - mixins: [require('./axis-vars')] -} + const dims = this.get_dims(); + + this.camera.aspect = dims.width / dims.height; + this.camera.updateProjectionMatrix(); + this.renderer.setSize(dims.width, dims.height); + + if (this.loading) { + this.controls.reset(); + this.camera.position.copy(new THREE.Vector3(0, 0, 600)); + this.camera.lookAt(new THREE.Vector3(0, 0, 0)); + } + + this.dirty = true; + }, + + update_tool: function(tool) { + if (!this.enabled) { + return; + } + + if (typeof tool == "undefined") { + tool = this.toolView; + } + + if (typeof tool == "undefined") { + return; + } + + tool.position.x = this.x.pos; + tool.position.y = this.y.pos; + tool.position.z = this.z.pos; + }, + + update_envelope: function(envelope) { + if (!this.enabled || !this.axes.homed) { + return; + } + + if (typeof envelope == "undefined") { + envelope = this.envelopeView; + } + + if (typeof envelope == "undefined") { + return; + } + + const min = new THREE.Vector3(); + const max = new THREE.Vector3(); + + for (const axis of "xyz") { + min[axis] = this[axis].min - this[axis].off; + max[axis] = this[axis].max - this[axis].off; + } + + const bounds = new THREE.Box3(min, max); + if (bounds.isEmpty()) { + envelope.geometry = this.create_empty_geom(); + } else { + envelope.geometry = this.create_bbox_geom(bounds); + } + }, + + axis_changed: function() { + this.update_tool(); + this.update_envelope(); + this.dirty = true; + }, + + graphics: function() { + if (!this.webglAvailable) { + return; + } + + try { + // Renderer + this.renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true }); + this.renderer.setPixelRatio(window.devicePixelRatio); + this.renderer.setClearColor(0, 0); + this.target.appendChild(this.renderer.domElement); + + } catch (e) { + console.log("WebGL not supported: ", e); + return; + } + + this.enabled = true; + + // Camera + this.camera = new THREE.PerspectiveCamera(45, 4 / 3, 1, 10000); + + // Lighting + this.ambient = new THREE.AmbientLight(0xffffff, 0.5); + + const keyLight = new THREE.DirectionalLight(new THREE.Color("hsl(30, 100%, 75%)"), 0.75); + keyLight.position.set(-100, 0, 100); + + const fillLight = new THREE.DirectionalLight(new THREE.Color("hsl(240, 100%, 75%)"), 0.25); + fillLight.position.set(100, 0, 100); + + const backLight = new THREE.DirectionalLight(0xffffff, 0.5); + backLight.position.set(100, 0, -100).normalize(); + + this.lights = new THREE.Group(); + this.lights.add(keyLight); + this.lights.add(fillLight); + this.lights.add(backLight); + + // Surface material + this.surfaceMaterial = this.create_surface_material(); + + // Controls + this.controls = new orbit(this.camera, this.renderer.domElement); + this.controls.enableDamping = true; + this.controls.dampingFactor = 0.2; + this.controls.rotateSpeed = 0.25; + this.controls.enableZoom = true; + + // Move lights with scene + this.controls.addEventListener("change", function(scope) { + return function() { + keyLight.position.copy(scope.camera.position); + fillLight.position.copy(scope.camera.position); + backLight.position.copy(scope.camera.position); + keyLight.lookAt(scope.controls.target); + fillLight.lookAt(scope.controls.target); + backLight.lookAt(scope.controls.target); + scope.dirty = true; + }; + }(this)); + + // Events + window.addEventListener("resize", this.update_view, false); + + // Start it + this.render(); + }, + + create_surface_material: function() { + return new THREE.MeshPhongMaterial({ + specular: 0x111111, + shininess: 10, + side: THREE.FrontSide, + color: 0x0c2d53 + }); + }, + + draw_loading: function() { + this.scene = new THREE.Scene(); + + const geometry = new THREE.TextGeometry("Loading 3D View...", { + font: new THREE.Font(font), + size: 40, + height: 5, + curveSegments: 12, + bevelEnabled: true, + bevelThickness: 10, + bevelSize: 8, + bevelSegments: 5 + }); + geometry.computeBoundingBox(); + + const mesh = new THREE.Mesh(geometry, this.surfaceMaterial); + + this.scene.add(mesh); + this.scene.add(this.ambient); + this.scene.add(this.lights); + this.update_view(); + }, + + draw_workpiece: function(scene, material) { + if (typeof this.workpiece == "undefined") { + return; + } + + let min = this.workpiece.min; + let max = this.workpiece.max; + + min = new THREE.Vector3(min[0], min[1], min[2]); + max = new THREE.Vector3(max[0], max[1], max[2]); + const dims = max.clone().sub(min); + + const geometry = new THREE.BoxGeometry(dims.x, dims.y, dims.z); + const mesh = new THREE.Mesh(geometry, material); + + const offset = dims.clone(); + offset.divideScalar(2); + offset.add(min); + + mesh.position.add(offset); + + geometry.computeBoundingBox(); + + scene.add(mesh); + + return mesh; + }, + + draw_surface: function(scene, material) { + if (typeof this.vertices == "undefined") { + return; + } + + const geometry = new THREE.BufferGeometry(); + + geometry.addAttribute("position", new THREE.Float32BufferAttribute(this.vertices, 3)); + geometry.addAttribute("normal", new THREE.Float32BufferAttribute(this.normals, 3)); + + geometry.computeBoundingSphere(); + geometry.computeBoundingBox(); + + return new THREE.Mesh(geometry, material); + }, + + draw_tool: function(scene, bbox) { + // Tool size is relative to bounds + const size = bbox.getSize(new THREE.Vector3()); + let length = (size.x + size.y + size.z) / 24; + + if (length < 1) { + length = 1; + } + + const material = new THREE.MeshPhongMaterial({ + transparent: true, + opacity: 0.75, + specular: 0x161616, + shininess: 10, + color: 0xffa500 // Orange + }); + + const geometry = new THREE.CylinderGeometry(length / 2, 0, length, 128); + geometry.translate(0, length / 2, 0); + geometry.rotateX(0.5 * Math.PI); + + const mesh = new THREE.Mesh(geometry, material); + this.update_tool(mesh); + mesh.visible = this.showTool; + scene.add(mesh); + return mesh; + }, + + draw_axis: function(axis, up, length, radius) { + let color; + + if (axis == 0) { + color = 0xff0000; + } else if (axis == 1) { + color = 0x00ff00; + } else if (axis == 2) { + color = 0x0000ff; + } + + const group = new THREE.Group(); + const material = new THREE.MeshPhongMaterial({ + specular: 0x161616, shininess: 10, color: color + }); + let geometry = new THREE.CylinderGeometry(radius, radius, length, 128); + geometry.translate(0, -length / 2, 0); + group.add(new THREE.Mesh(geometry, material)); + + geometry = new THREE.CylinderGeometry(1.5 * radius, 0, 2 * radius, 128); + geometry.translate(0, -length - radius, 0); + group.add(new THREE.Mesh(geometry, material)); + + if (axis == 0) { + group.rotateZ((up ? 0.5 : 1.5) * Math.PI); + } else if (axis == 1) { + group.rotateX((up ? 0 : 1 ) * Math.PI); + } else if (axis == 2) { + group.rotateX((up ? 1.5 : 0.5) * Math.PI); + } + + return group; + }, + + draw_axes: function(scene, bbox) { + const size = bbox.getSize(new THREE.Vector3()); + let length = (size.x + size.y + size.z) / 3; + length /= 10; + + if (length < 1) { + length = 1; + } + + const radius = length / 20; + + const group = new THREE.Group(); + + for (let axis = 0; axis < 3; axis++) { + for (let up = 0; up < 2; up++) { + group.add(this.draw_axis(axis, up, length, radius)); + } + } + + group.visible = this.showAxes; + scene.add(group); + + return group; + }, + + get_color: function(speed) { + if (isNaN(speed)) { + return [ 255, 0, 0 ]; + } // Rapid + + let intensity = speed / this.toolpath.maxSpeed; + if (typeof speed == "undefined" || !this.showIntensity) { + intensity = 1; + } + + return [ 0, 255 * intensity, 127 * (1 - intensity) ]; + }, + + draw_path: function(scene) { + const geometry = new THREE.BufferGeometry(); + const material = new THREE.LineBasicMaterial({ + vertexColors: THREE.VertexColors, + linewidth: 1.5 + }); + + const positions = new THREE.Float32BufferAttribute(this.positions, 3); + geometry.addAttribute("position", positions); + + let colors = []; + for (let i = 0; i < this.speeds.length; i++) { + const color = this.get_color(this.speeds[i]); + Array.prototype.push.apply(colors, color); + } + + colors = new THREE.Uint8BufferAttribute(colors, 3, true); + geometry.addAttribute("color", colors); + + geometry.computeBoundingSphere(); + geometry.computeBoundingBox(); + + const line = new THREE.Line(geometry, material); + + line.visible = this.showPath; + scene.add(line); + + return line; + }, + + create_empty_geom: function() { + const geometry = new THREE.BufferGeometry(); + geometry.addAttribute("position", + new THREE.Float32BufferAttribute([], 3)); + return geometry; + }, + + create_bbox_geom: function(bbox) { + const vertices = []; + + if (!bbox.isEmpty()) { + // Top + vertices.push(bbox.min.x, bbox.min.y, bbox.min.z); + vertices.push(bbox.max.x, bbox.min.y, bbox.min.z); + vertices.push(bbox.max.x, bbox.min.y, bbox.min.z); + vertices.push(bbox.max.x, bbox.min.y, bbox.max.z); + vertices.push(bbox.max.x, bbox.min.y, bbox.max.z); + vertices.push(bbox.min.x, bbox.min.y, bbox.max.z); + vertices.push(bbox.min.x, bbox.min.y, bbox.max.z); + vertices.push(bbox.min.x, bbox.min.y, bbox.min.z); + + // Bottom + vertices.push(bbox.min.x, bbox.max.y, bbox.min.z); + vertices.push(bbox.max.x, bbox.max.y, bbox.min.z); + vertices.push(bbox.max.x, bbox.max.y, bbox.min.z); + vertices.push(bbox.max.x, bbox.max.y, bbox.max.z); + vertices.push(bbox.max.x, bbox.max.y, bbox.max.z); + vertices.push(bbox.min.x, bbox.max.y, bbox.max.z); + vertices.push(bbox.min.x, bbox.max.y, bbox.max.z); + vertices.push(bbox.min.x, bbox.max.y, bbox.min.z); + + // Sides + vertices.push(bbox.min.x, bbox.min.y, bbox.min.z); + vertices.push(bbox.min.x, bbox.max.y, bbox.min.z); + vertices.push(bbox.max.x, bbox.min.y, bbox.min.z); + vertices.push(bbox.max.x, bbox.max.y, bbox.min.z); + vertices.push(bbox.max.x, bbox.min.y, bbox.max.z); + vertices.push(bbox.max.x, bbox.max.y, bbox.max.z); + vertices.push(bbox.min.x, bbox.min.y, bbox.max.z); + vertices.push(bbox.min.x, bbox.max.y, bbox.max.z); + } + + const geometry = new THREE.BufferGeometry(); + + geometry.addAttribute("position", + new THREE.Float32BufferAttribute(vertices, 3)); + + return geometry; + }, + + draw_bbox: function(scene, bbox) { + const geometry = this.create_bbox_geom(bbox); + const material = new THREE.LineBasicMaterial({ color: 0xffffff }); + const line = new THREE.LineSegments(geometry, material); + + line.visible = this.showBBox; + + scene.add(line); + + return line; + }, + + draw_envelope: function(scene) { + const geometry = this.create_empty_geom(); + const material = new THREE.LineBasicMaterial({ color: 0x00f7ff }); + const line = new THREE.LineSegments(geometry, material); + + line.visible = this.showBBox; + + scene.add(line); + this.update_envelope(line); + + return line; + }, + + draw: function(scene) { + // Lights + scene.add(this.ambient); + scene.add(this.lights); + + // Model + this.pathView = this.draw_path(scene); + this.surfaceMesh = this.draw_surface(scene, this.surfaceMaterial); + this.workpieceMesh = this.draw_workpiece(scene, this.surfaceMaterial); + this.update_surface_mode(this.surfaceMode); + + // Compute bounding box + const bbox = this.get_model_bounds(); + + // Tool, axes & bounds + this.toolView = this.draw_tool(scene, bbox); + this.axesView = this.draw_axes(scene, bbox); + this.bboxView = this.draw_bbox(scene, bbox); + this.envelopeView = this.draw_envelope(scene); + }, + + render: function() { + window.requestAnimationFrame(this.render); + + if (typeof this.scene == "undefined") { + return; + } + + if (this.controls.update() || this.dirty) { + this.dirty = false; + this.renderer.render(this.scene, this.camera); + } + }, + + get_model_bounds: function() { + const bbox = new THREE.Box3(new THREE.Vector3(0, 0, 0), + new THREE.Vector3(0.00001, 0.00001, 0.00001)); + + function add(o) { + if (typeof o != "undefined") { + const oBBox = new THREE.Box3(); + oBBox.setFromObject(o); + bbox.union(oBBox); + } + } + + add(this.pathView); + add(this.surfaceMesh); + add(this.workpieceMesh); + + return bbox; + }, + + snap: function(view) { + if (this.loading) { + return; + } + + if (view != this.snapView) { + this.snapView = view; + cookie.set("snap-view", view); + } + + const bbox = this.get_model_bounds(); + this.controls.reset(); + bbox.getCenter(this.controls.target); + this.update_view(); + + // Compute new camera position + const center = bbox.getCenter(new THREE.Vector3()); + const offset = new THREE.Vector3(); + + switch (view) { + case "isometric": offset.y -= 1; offset.z += 1; break; + case "front": offset.y -= 1; break; + case "back": offset.y += 1; break; + case "left": offset.x -= 1; break; + case "right": offset.x += 1; break; + case "top": offset.z += 1; break; + case "bottom": offset.z -= 1; break; + } + + offset.normalize(); + + // Initial camera position + const position = new THREE.Vector3().copy(center).add(offset); + this.camera.position.copy(position); + this.camera.lookAt(center); // Get correct camera orientation + + const theta = this.camera.fov / 180 * Math.PI; // View angle + const cameraLine = new THREE.Line3(center, position); + const cameraUp = new THREE.Vector3() + .copy(this.camera.up) + .applyQuaternion(this.camera.quaternion); + const cameraLeft = new THREE.Vector3() + .copy(offset) + .cross(cameraUp) + .normalize(); + + const corners = [ + new THREE.Vector3(bbox.min.x, bbox.min.y, bbox.min.z), + new THREE.Vector3(bbox.min.x, bbox.min.y, bbox.max.z), + new THREE.Vector3(bbox.min.x, bbox.max.y, bbox.min.z), + new THREE.Vector3(bbox.min.x, bbox.max.y, bbox.max.z), + new THREE.Vector3(bbox.max.x, bbox.min.y, bbox.min.z), + new THREE.Vector3(bbox.max.x, bbox.min.y, bbox.max.z), + new THREE.Vector3(bbox.max.x, bbox.max.y, bbox.min.z), + new THREE.Vector3(bbox.max.x, bbox.max.y, bbox.max.z), + ]; + + let dist = this.camera.near; // Min camera dist + + for (let i = 0; i < corners.length; i++) { + // Project on to camera line + const p1 = cameraLine.closestPointToPoint(corners[i], false, new THREE.Vector3()); + + // Compute distance from projection to center + let d = p1.distanceTo(center); + if (cameraLine.closestPointToPointParameter(p1, false) < 0) { + d = -d; + } + + // Compute up line + const up = new THREE.Line3(p1, new THREE.Vector3().copy(p1).add(cameraUp)); + + // Project on to up line + const p2 = up.closestPointToPoint(corners[i], false, new THREE.Vector3()); + + // Compute length + let l = p1.distanceTo(p2); + + // Update min camera distance + dist = Math.max(dist, d + l / Math.tan(theta / 2)); + + // Compute left line + const left = new THREE.Line3(p1, new THREE.Vector3().copy(p1).add(cameraLeft)); + + // Project on to left line + const p3 = left.closestPointToPoint(corners[i], false, new THREE.Vector3()); + + // Compute length + l = p1.distanceTo(p3); + + // Update min camera distance + dist = Math.max(dist, d + l / Math.tan(theta / 2) / this.camera.aspect); + } + + this.camera.position.copy(offset.multiplyScalar(dist * 1.2).add(center)); + } + }, + + mixins: [ require("./axis-vars") ] +}; diff --git a/src/js/settings-view.js b/src/js/settings-view.js index 599aea8..514b42b 100644 --- a/src/js/settings-view.js +++ b/src/js/settings-view.js @@ -1,42 +1,14 @@ -/******************************************************************************\ - - This file is part of the Buildbotics firmware. - - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. - - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . - - The software 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . - - For information regarding this software email: - "Joseph Coffland" - -\******************************************************************************/ - -'use strict' - - module.exports = { - template: '#settings-view-template', - props: ['config', 'template'], + template: "#settings-view-template", + attached: function() { + this.svelteComponent = SvelteComponents.createComponent( + "SettingsView", + document.getElementById("settings") + ); + }, - events: { - 'input-changed': function() { - this.$dispatch('config-changed'); - return false; + detached: function() { + this.svelteComponent.$destroy(); } - } -} +}; diff --git a/src/js/sock.js b/src/js/sock.js index 5c274cd..1a248dc 100644 --- a/src/js/sock.js +++ b/src/js/sock.js @@ -1,127 +1,106 @@ -/******************************************************************************\ +"use strict"; - This file is part of the Buildbotics firmware. +const Sock = function(url, retry, timeout) { + if (!(this instanceof Sock)) { + return new Sock(url, retry); + } - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. + if (typeof retry == "undefined") { + retry = 2000; + } + if (typeof timeout == "undefined") { + timeout = 16000; + } - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . + this.url = url; + this.retry = retry; + this.timeout = timeout; + this.divisions = 4; + this.count = 0; - The software 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 - Lesser General Public License for more details. + this.connect(); +}; - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . +Sock.prototype.onmessage = function() { + // Ignore +}; - For information regarding this software email: - "Joseph Coffland" +Sock.prototype.onopen = function() { + // Ignore +}; -\******************************************************************************/ +Sock.prototype.onclose = function() { + // Ignore +}; -'use strict' +Sock.prototype.connect = function() { + console.debug("connecting to", this.url); + this.close(); + this._sock = new SockJS(this.url); -var Sock = function (url, retry, timeout) { - if (!(this instanceof Sock)) return new Sock(url, retry); + this._sock.onmessage = function(e) { + console.debug("msg:", e.data); + this.heartbeat("msg"); + this.onmessage(e); + }.bind(this); - if (typeof retry == 'undefined') retry = 2000; - if (typeof timeout == 'undefined') timeout = 16000; + this._sock.onopen = function() { + console.debug("connected"); + this.heartbeat("open"); + this.onopen(); + }.bind(this); - this.url = url; - this.retry = retry; - this.timeout = timeout; - this.divisions = 4; - this.count = 0; + this._sock.onclose = function() { + console.debug("disconnected"); + this._cancel_timeout(); - this.connect(); -} + this.onclose(); + if (typeof this._sock != "undefined") { + setTimeout(this.connect.bind(this), this.retry); + } + }.bind(this); +}; +Sock.prototype._timedout = function() { + // Divide timeout so slow browser doesn't trigger timeouts when the + // connection is good. + if (this.divisions <= ++this.count) { + console.debug("connection timedout"); + this._timeout = undefined; + this._sock.close(); -Sock.prototype.onmessage = function () {} -Sock.prototype.onopen = function () {} -Sock.prototype.onclose = function () {} + } else { + this._set_timeout(); + } +}; - -Sock.prototype.connect = function () { - console.debug('connecting to', this.url); - this.close(); - - this._sock = new SockJS(this.url); - - this._sock.onmessage = function (e) { - console.debug('msg:', e.data); - this.heartbeat('msg'); - this.onmessage(e); - }.bind(this); - - - this._sock.onopen = function () { - console.debug('connected'); - this.heartbeat('open'); - this.onopen(); - }.bind(this); - - - this._sock.onclose = function () { - console.debug('disconnected'); - this._cancel_timeout(); - - this.onclose(); - if (typeof this._sock != 'undefined') - setTimeout(this.connect.bind(this), this.retry); - }.bind(this); -} - - -Sock.prototype._timedout = function () { - // Divide timeout so slow browser doesn't trigger timeouts when the - // connection is good. - if (this.divisions <= ++this.count) { - console.debug('connection timedout'); +Sock.prototype._cancel_timeout = function() { + clearTimeout(this._timeout); this._timeout = undefined; - this._sock.close(); + this.count = 0; +}; - } else this._set_timeout(); -} +Sock.prototype._set_timeout = function() { + this._timeout = setTimeout(this._timedout.bind(this), + this.timeout / this.divisions); +}; +Sock.prototype.heartbeat = function() { + this._cancel_timeout(); + this._set_timeout(); +}; -Sock.prototype._cancel_timeout = function () { - clearTimeout(this._timeout); - this._timeout = undefined; - this.count = 0; -} +Sock.prototype.close = function() { + if (typeof this._sock != "undefined") { + const sock = this._sock; + this._sock = undefined; + sock.close(); + } +}; +Sock.prototype.send = function(msg) { + this._sock.send(msg); +}; -Sock.prototype._set_timeout = function () { - this._timeout = setTimeout(this._timedout.bind(this), - this.timeout / this.divisions); -} - - -Sock.prototype.heartbeat = function (msg) { - //console.debug('heartbeat ' + new Date().toLocaleTimeString() + ' ' + msg); - this._cancel_timeout(); - this._set_timeout(); -} - - -Sock.prototype.close = function () { - if (typeof this._sock != 'undefined') { - var sock = this._sock; - this._sock = undefined; - sock.close(); - } -} - - -Sock.prototype.send = function (msg) {this._sock.send(msg)} - - -module.exports = Sock +module.exports = Sock; diff --git a/src/js/templated-input.js b/src/js/templated-input.js index 32d80eb..a168b6e 100644 --- a/src/js/templated-input.js +++ b/src/js/templated-input.js @@ -1,89 +1,69 @@ -/******************************************************************************\ - - This file is part of the Buildbotics firmware. - - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. - - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . - - The software 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . - - For information regarding this software email: - "Joseph Coffland" - -\******************************************************************************/ - -'use strict' - +"use strict"; module.exports = { - replace: true, - template: '#templated-input-template', - props: ['name', 'model', 'template'], + replace: true, + template: "#templated-input-template", + props: [ "name", "model", "template" ], - - data: function () {return {view: ''}}, - - - computed: { - metric: function () {return this.$root.metric()}, - - - _view: function () { - if (this.template.scale) { - if (this.metric) return 1 * this.model.toFixed(3); - - return 1 * (this.model / this.template.scale).toFixed(4); - } - - return this.model; + data: function() { + return { view: "" }; }, + computed: { + metric: function() { + return this.$root.display_units === "METRIC"; + }, - units: function () { - return (this.metric || !this.template.iunit) ? - this.template.unit : this.template.iunit; + _view: function() { + if (this.template.scale) { + if (this.metric) { + return 1 * this.model.toFixed(3); + } + + return 1 * (this.model / this.template.scale).toFixed(4); + } + + return this.model; + }, + + units: function() { + return (this.metric || !this.template.iunit) + ? this.template.unit + : this.template.iunit; + }, + + title: function() { + let s = `Default :${this.template.default} ${(this.template.unit || "")}`; + + if (typeof this.template.help != "undefined") { + s = `${this.template.help}\n${s}`; + } + + return s; + } }, + watch: { + _view: function() { + this.view = this._view; + }, - title: function () { - var s = 'Default ' + this.template.default + ' ' + - (this.template.unit || ''); - if (typeof this.template.help != 'undefined') - s = this.template.help + '\n' + s; - return s; + view: function() { + if (this.template.scale && !this.metric) { + this.model = this.view * this.template.scale; + } else { + this.model = this.view; + } + } + }, + + ready: function() { + this.view = this._view; + }, + + methods: { + change: function() { + this.$dispatch("input-changed"); + } } - }, - - - watch: { - _view: function () {this.view = this._view}, - - - view: function () { - if (this.template.scale && !this.metric) - this.model = this.view * this.template.scale; - else this.model = this.view; - } - }, - - - ready: function () {this.view = this._view}, - - - methods: { - change: function () {this.$dispatch('input-changed')} - } -} +}; diff --git a/src/js/tool-view.js b/src/js/tool-view.js index e4bc390..ae29365 100644 --- a/src/js/tool-view.js +++ b/src/js/tool-view.js @@ -1,277 +1,252 @@ -/******************************************************************************\ +"use strict"; - This file is part of the Buildbotics firmware. - - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. - - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . - - The software 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . - - For information regarding this software email: - "Joseph Coffland" - -\******************************************************************************/ - -'use strict'; - -const api = require('./api'); -const modbus = require('./modbus.js'); +const api = require("./api"); +const modbus = require("./modbus.js"); const merge = require("lodash.merge"); module.exports = { - template: '#tool-view-template', - props: ['config', 'template', 'state'], + template: "#tool-view-template", + props: [ "config", "template", "state" ], - data: function () { - return { - address: 0, - value: 0, - toolList: [ - { - id: "disabled", - name: "Disabled" - }, - { - id: "router", - type: "PWM Spindle", - name: "Router (Makita, etc)" - }, - { - id: "laser", - type: "PWM Spindle", - name: "Laser (J Tech, etc)" - }, - { - id: "pwm", - name: "PWM Spindle" - }, - { - id: "unsupported-separator", - name: "Unsupported Tools", - disabled: true, - unsupported: true - }, - { - id: "huanyang-vfd", - name: "Huanyang VFD", - unsupported: true - }, - { - id: "custom-modbus-vfd", - name: "Custom Modbus VFD", - unsupported: true - }, - { - id: "ac-tech-vfd", - name: "AC-Tech VFD", - unsupported: true - }, - { - id: "nowforever-vfd", - name: "Nowforever VFD", - unsupported: true - }, - { - id: "delta-vfd", - name: "Delta VFD015M21A (Beta)", - unsupported: true - }, - { - id: "yl600-vfd", - name: "YL600, YL620, YL620-A VFD (Beta)", - unsupported: true - }, - { - id: "fr-d700-vfd", - name: "FR-D700 (Beta)", - unsupported: true - }, - { - id: "sunfar-e300-vfd", - name: "Sunfar E300 (Beta)", - unsupported: true - }, - { - id: "omron-mx2-vfd", - name: "OMRON MX2", - unsupported: true + data: function() { + return { + address: 0, + value: 0, + toolList: [ + { + id: "disabled", + name: "Disabled" + }, + { + id: "router", + type: "PWM Spindle", + name: "Router (Makita, etc)" + }, + { + id: "laser", + type: "PWM Spindle", + name: "Laser (J Tech, etc)" + }, + { + id: "pwm", + name: "PWM Spindle" + }, + { + id: "unsupported-separator", + name: "Unsupported Tools", + disabled: true, + unsupported: true + }, + { + id: "huanyang-vfd", + name: "Huanyang VFD", + unsupported: true + }, + { + id: "custom-modbus-vfd", + name: "Custom Modbus VFD", + unsupported: true + }, + { + id: "ac-tech-vfd", + name: "AC-Tech VFD", + unsupported: true + }, + { + id: "nowforever-vfd", + name: "Nowforever VFD", + unsupported: true + }, + { + id: "delta-vfd", + name: "Delta VFD015M21A (Beta)", + unsupported: true + }, + { + id: "yl600-vfd", + name: "YL600, YL620, YL620-A VFD (Beta)", + unsupported: true + }, + { + id: "fr-d700-vfd", + name: "FR-D700 (Beta)", + unsupported: true + }, + { + id: "sunfar-e300-vfd", + name: "Sunfar E300 (Beta)", + unsupported: true + }, + { + id: "omron-mx2-vfd", + name: "OMRON MX2", + unsupported: true + } + ] + }; + }, + + components: { + "modbus-reg": require("./modbus-reg.js") + }, + + watch: { + "state.mr": function() { + this.value = this.state.mr; + } + }, + + events: { + "input-changed": function() { + this.$dispatch("config-changed"); + + return false; + }, + }, + + ready: function() { + this.value = this.state.mr; + }, + + computed: { + regs_tmpl: function() { + return this.template["modbus-spindle"].regs; + }, + + tool_type: function() { + return this.config.tool["tool-type"].toUpperCase(); + }, + + selected_tool: function() { + return this.config.tool["selected-tool"]; + }, + + is_pwm_spindle: function() { + return this.selected_tool == "pwm"; + }, + + is_modbus: function() { + switch (this.selected_tool) { + case "disabled": + case "laser": + case "router": + case "pwm": + return false; + + default: + return true; + } + }, + + modbus_status: function() { + return modbus.status_to_string(this.state.mx); + } + }, + + methods: { + change_selected_tool: function() { + const selectedToolSettings = this.config["selected-tool-settings"] || {}; + const settings = selectedToolSettings[this.selected_tool] || {}; + this.config.tool = merge({}, this.config.tool, settings["tool"]); + this.config["pwm-spindle"] = merge({}, this.config["pwm-spindle"], settings["pwm-spindle"]); + this.config["modbus-spindle"] = merge({}, this.config["modbus-spindle"], settings["modbus-spindle"]); + + const tool = this.toolList.find(tool => tool.id == this.config.tool["selected-tool"]); + this.config.tool["tool-type"] = tool.type || tool.name; + + this.$dispatch("config-changed"); + }, + + show_tool_settings: function(key) { + switch (true) { + case key === "tool-type": + case key === "selected-tool": + return false; + + case this.selected_tool === "disabled": + return false; + + case this.selected_tool === "laser": + case this.selected_tool === "router": + switch (key) { + case "tool-enable-mode": + return true; + + default: + return false; + } + + default: + return true; + } + }, + + get_reg_type: function(reg) { + return this.regs_tmpl.template["reg-type"].values[this.state[`${reg}vt`]]; + }, + + get_reg_addr: function(reg) { + return this.state[`${reg}va`]; + }, + + get_reg_value: function(reg) { + return this.state[`${reg}vv`]; + }, + + get_reg_fails: function(reg) { + const fails = this.state[`${reg}vr`]; + return fails == 255 ? "Max" : fails; + }, + + show_modbus_field: function(key) { + return key != "regs" && (key != "multi-write" || this.tool_type == "CUSTOM MODBUS VFD"); + }, + + read: function(e) { + e.preventDefault(); + api.put("modbus/read", { address: this.address }); + }, + + write: function(e) { + e.preventDefault(); + api.put("modbus/write", { address: this.address, value: this.value }); + }, + + customize: function(e) { + e.preventDefault(); + this.config.tool["tool-type"] = "Custom Modbus VFD"; + + const regs = this.config["modbus-spindle"].regs; + for (let i = 0; i < regs.length; i++) { + const reg = this.regs_tmpl.index[i]; + regs[i]["reg-type"] = this.get_reg_type(reg); + regs[i]["reg-addr"] = this.get_reg_addr(reg); + regs[i]["reg-value"] = this.get_reg_value(reg); + } + + this.$dispatch("config-changed"); + }, + + clear: function(e) { + e.preventDefault(); + this.config.tool["tool-type"] = "Custom Modbus VFD"; + + const regs = this.config["modbus-spindle"].regs; + for (let i = 0; i < regs.length; i++) { + regs[i]["reg-type"] = "disabled"; + regs[i]["reg-addr"] = 0; + regs[i]["reg-value"] = 0; + } + + this.$dispatch("config-changed"); + }, + + reset_failures: function(e) { + e.preventDefault(); + const regs = this.config["modbus-spindle"].regs; + for (let reg = 0; reg < regs.length; reg++) { + this.$dispatch("send", `$${reg}vr=0`); + } } - ] } - }, - - components: { - 'modbus-reg': require('./modbus-reg.js') - }, - - watch: { - 'state.mr': function () { this.value = this.state.mr } - }, - - events: { - 'input-changed': function () { - this.$dispatch('config-changed'); - - return false; - }, - }, - - ready: function () { - this.value = this.state.mr; - }, - - computed: { - regs_tmpl: function () { - return this.template['modbus-spindle'].regs; - }, - - tool_type: function () { - return this.config.tool['tool-type'].toUpperCase(); - }, - - selected_tool: function () { - return this.config.tool['selected-tool']; - }, - - is_pwm_spindle: function () { - return this.selected_tool == 'pwm'; - }, - - is_modbus: function () { - switch (this.selected_tool) { - case "disabled": - case "laser": - case "router": - case "pwm": - return false; - - default: - return true; - } - }, - - modbus_status: function () { - return modbus.status_to_string(this.state.mx); - } - }, - - methods: { - change_selected_tool: function () { - const selectedToolSettings = this.config['selected-tool-settings'] || {}; - const settings = selectedToolSettings[this.selected_tool] || {}; - this.config.tool = merge({}, this.config.tool, settings['tool']); - this.config['pwm-spindle'] = merge({}, this.config['pwm-spindle'], settings['pwm-spindle']); - this.config['modbus-spindle'] = merge({}, this.config['modbus-spindle'], settings['modbus-spindle']); - - const tool = this.toolList.find(tool => tool.id == this.config.tool['selected-tool']); - this.config.tool["tool-type"] = tool.type || tool.name; - - this.$dispatch("config-changed"); - }, - - show_tool_settings: function (key) { - switch (true) { - case key === "tool-type": - case key === "selected-tool": - return false; - - case this.selected_tool === "disabled": - return false; - - case this.selected_tool === "laser": - case this.selected_tool === "router": - switch (key) { - case "tool-enable-mode": - return true; - - default: - return false; - } - - default: - return true; - } - }, - - get_reg_type: function (reg) { - return this.regs_tmpl.template['reg-type'].values[this.state[reg + 'vt']]; - }, - - get_reg_addr: function (reg) { - return this.state[reg + 'va']; - }, - - get_reg_value: function (reg) { - return this.state[reg + 'vv']; - }, - - get_reg_fails: function (reg) { - const fails = this.state[reg + 'vr'] - return fails == 255 ? 'Max' : fails; - }, - - show_modbus_field: function (key) { - return key != 'regs' && - (key != 'multi-write' || this.tool_type == 'CUSTOM MODBUS VFD'); - }, - - read: function (e) { - e.preventDefault(); - api.put('modbus/read', { address: this.address }); - }, - - write: function (e) { - e.preventDefault(); - api.put('modbus/write', { address: this.address, value: this.value }); - }, - - customize: function (e) { - e.preventDefault(); - this.config.tool['tool-type'] = 'Custom Modbus VFD'; - - const regs = this.config['modbus-spindle'].regs; - for (let i = 0; i < regs.length; i++) { - const reg = this.regs_tmpl.index[i]; - regs[i]['reg-type'] = this.get_reg_type(reg); - regs[i]['reg-addr'] = this.get_reg_addr(reg); - regs[i]['reg-value'] = this.get_reg_value(reg); - } - - this.$dispatch('config-changed'); - }, - - clear: function (e) { - e.preventDefault(); - this.config.tool['tool-type'] = 'Custom Modbus VFD'; - - const regs = this.config['modbus-spindle'].regs; - for (let i = 0; i < regs.length; i++) { - regs[i]['reg-type'] = 'disabled'; - regs[i]['reg-addr'] = 0; - regs[i]['reg-value'] = 0; - } - - this.$dispatch('config-changed'); - }, - - reset_failures: function (e) { - e.preventDefault(); - const regs = this.config['modbus-spindle'].regs; - for (let reg = 0; reg < regs.length; reg++) - this.$dispatch('send', '\$' + reg + 'vr=0'); - } - } -} +}; diff --git a/src/js/unit-value.js b/src/js/unit-value.js index d4d6ee0..cb0dcb3 100644 --- a/src/js/unit-value.js +++ b/src/js/unit-value.js @@ -1,58 +1,47 @@ -/******************************************************************************\ - - This file is part of the Buildbotics firmware. - - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. - - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . - - The software 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . - - For information regarding this software email: - "Joseph Coffland" - -\******************************************************************************/ - -'use strict' - +"use strict"; module.exports = { - replace: true, - template: '{{text}}{{metric ? unit : iunit}}', - props: ['value', 'precision', 'unit', 'iunit', 'scale'], + replace: true, + template: '{{text}}{{metric ? unit : iunit}}', + props: [ "value", "precision", "unit", "iunit", "scale" ], + computed: { + metric: { + cache: false, + get: function() { + return this.$root.display_units === "METRIC"; + } + }, - computed: { - metric: function () {return !this.$root.state.imperial}, + text: function() { + let value = this.value; + if (typeof value == "undefined") { + return ""; + } + if (!this.metric) { + value /= this.scale; + } - text: function () { - var value = this.value; - if (typeof value == 'undefined') return ''; + return (1 * value.toFixed(this.precision)).toLocaleString(); + } + }, - if (!this.metric) value /= this.scale; + ready: function() { + if (typeof this.precision == "undefined") { + this.precision = 0; + } - return (1 * value.toFixed(this.precision)).toLocaleString(); + if (typeof this.unit == "undefined") { + this.unit = "mm"; + } + + if (typeof this.iunit == "undefined") { + this.iunit = "in"; + } + + if (typeof this.scale == "undefined") { + this.scale = 25.4; + } } - }, - - - ready: function () { - if (typeof this.precision == 'undefined') this.precision = 0; - if (typeof this.unit == 'undefined') this.unit = 'mm'; - if (typeof this.iunit == 'undefined') this.iunit = 'in'; - if (typeof this.scale == 'undefined') this.scale = 25.4; - } -} +}; diff --git a/src/js/utils.js b/src/js/utils.js new file mode 100644 index 0000000..f21b9e9 --- /dev/null +++ b/src/js/utils.js @@ -0,0 +1,9 @@ +function clickFileInput(formClass) { + const form = document.querySelector(`.${formClass}`); + form.reset(); + form.querySelector("input").click(); +} + +module.exports = { + clickFileInput +}; diff --git a/src/pug/index.pug b/src/pug/index.pug index 731e721..3e30f38 100644 --- a/src/pug/index.pug +++ b/src/pug/index.pug @@ -1,30 +1,3 @@ -//-///////////////////////////////////////////////////////////////////////////// -//- // -//- This file is part of the Buildbotics firmware. // -//- // -//- Copyright (c) 2015 - 2018, Buildbotics LLC // -//- All rights reserved. // -//- // -//- This file ("the software") is free software: you can redistribute it // -//- and/or modify it under the terms of the GNU General Public License, // -//- version 2 as published by the Free Software Foundation. You should // -//- have received a copy of the GNU General Public License, version 2 // -//- along with the software. If not, see . // -//- // -//- The software 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 // -//- Lesser General Public License for more details. // -//- // -//- You should have received a copy of the GNU Lesser General Public // -//- License along with the software. If not, see // -//- . // -//- // -//- For information regarding this software email: // -//- "Joseph Coffland" // -//- // -//-///////////////////////////////////////////////////////////////////////////// - doctype html html(lang="en") head @@ -39,12 +12,17 @@ html(lang="en") style: include ../static/css/font-awesome.min.css style: include ../static/css/Audiowide.css style: include ../static/css/clusterize.css + style: include ../svelte-components/node_modules/svelte-material-ui/bare.css + style: include ../../build/http/svelte-components/smui.css + style: include ../../build/http/svelte-components/style.css style: include:stylus ../stylus/style.styl - body(v-cloak) + #svelte-dialog-host + #overlay(v-if="status != 'connected'") span {{status}} + #layout a#menuLink.menu-link(href="#menu"): span @@ -87,49 +65,43 @@ html(lang="en") li.pure-menu-heading a.pure-menu-link(href="#help") Help - button.pure-button.pure-button-primary(@click="confirmShutdown = true", style="width: 100%") - .fa.fa-power-off - message(:show.sync="confirmShutdown") - h3(slot="header") Confirm shutdown? - p(slot="body") Please wait for black screen before switching off power. - div(slot="footer") - button.pure-button(@click="confirmShutdown = false") Cancel - button.pure-button.button-success(@click="shutdown") Shutdown - button.pure-button.button-success(@click="reboot") Restart - + button.pure-button.pure-button-primary(@click="showShutdownDialog", style="width: 100%") + .fa.fa-power-off #main - .header - .header-content - .banner - img(src="/images/onefinity_logo.png") - .title - .fa.fa-thermometer-full(class="error", - v-if="80 <= state.rpi_temp", - title="Raspberry Pi temperature too high.") - .subtitle - | CNC Controller #[b {{state.demo ? 'Demo ' : ''}}] - | v{{config.full_version}} - a.upgrade-version(v-if="show_upgrade()", href="#admin-general") - | Upgrade to v{{latestVersion}} - .fa.fa-check(v-if="!show_upgrade() && latestVersion", - title="Firmware up to date" style="font-size: inherit") - .p {{get_ip_address()}} {{get_ssid()}} + .nav-header + .brand + img(src="/images/onefinity_logo.png") + .version + div + | Version: v{{config.full_version}} + div + | IP Address: {{config.ip}} + div + | WiFi: {{config.wifiName}} + a.upgrade-link(v-if="show_upgrade()", href="#admin-general") + | Upgrade to v{{latestVersion}} + .fa.fa-exclamation-circle.upgrade-attention(v-if="show_upgrade()") - .estop(:class="{active: state.es}") - estop(@click="estop") + .pi-temp-warning + .fa.fa-thermometer-full(class="error", + v-if="80 <= state.rpi_temp", + title="Raspberry Pi temperature too high.") - .video(title="Plug camera into USB.\n" + - "Left click to toggle video size.\n" + - "Right click to toggle crosshair.", @click="toggle_video", - @contextmenu="toggle_crosshair", :class="video_size") - .crosshair(v-if="crosshair") - .vertical - .horizontal - .box - img(src="/api/video") + .whitespace - .clear + .video(title="Plug camera into USB.\n" + + "Left click to toggle video size.\n" + + "Right click to toggle crosshair.", @click="toggle_video", + @contextmenu="toggle_crosshair", :class="video_size") + .crosshair(v-if="crosshair") + .vertical + .horizontal + .box + img(src="/api/video") + + .estop(:class="{active: state.es}") + estop(@click="estop") .content(class="{{currentView}}-view") component(:is="currentView + '-view'", :index="index", @@ -205,10 +177,10 @@ html(lang="en") #templates: include ../../build/templates.pug iframe#download-target(style="display:none") - script: include ../static/js/jquery-1.11.3.min.js script: include ../static/js/vue.js script: include ../static/js/sockjs.min.js script: include ../static/js/clusterize.min.js script: include ../static/js/three.min.js script: include:browserify ../js/main.js + script: include ../../build/http/svelte-components/index.js script: include ../static/js/ui.js diff --git a/src/pug/templates/admin-general-view.pug b/src/pug/templates/admin-general-view.pug index d90a20c..c0a22ab 100644 --- a/src/pug/templates/admin-general-view.pug +++ b/src/pug/templates/admin-general-view.pug @@ -1,30 +1,3 @@ -//-///////////////////////////////////////////////////////////////////////////// -//- // -//- This file is part of the Buildbotics firmware. // -//- // -//- Copyright (c) 2015 - 2018, Buildbotics LLC // -//- All rights reserved. // -//- // -//- This file ("the software") is free software: you can redistribute it // -//- and/or modify it under the terms of the GNU General Public License, // -//- version 2 as published by the Free Software Foundation. You should // -//- have received a copy of the GNU General Public License, version 2 // -//- along with the software. If not, see . // -//- // -//- The software 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 // -//- Lesser General Public License for more details. // -//- // -//- You should have received a copy of the GNU Lesser General Public // -//- License along with the software. If not, see // -//- . // -//- // -//- For information regarding this software email: // -//- "Joseph Coffland" // -//- // -//-///////////////////////////////////////////////////////////////////////////// - script#admin-general-view-template(type="text/x-template") #admin-general h2 Firmware @@ -45,9 +18,6 @@ script#admin-general-view-template(type="text/x-template") label.pure-button.pure-button-primary(@click="restore_config") Restore form.restore-config.file-upload input(type="file", accept=".json", @change="restore") - message(:show.sync="configRestored") - h3(slot="header") Success - p(slot="body") Configuration restored. button.pure-button.pure-button-primary(@click="confirmReset = true") Reset message(:show.sync="confirmReset") @@ -70,10 +40,6 @@ script#admin-general-view-template(type="text/x-template") button.pure-button(@click="confirmReset = false") Cancel button.pure-button.pure-button-primary(@click="reset") Reset - message(:show.sync="configReset") - h3(slot="header") Success - p(slot="body") Configuration reset. - h2 Debugging a(href="/api/log", target="_blank") button.pure-button.pure-button-primary View Log diff --git a/src/pug/templates/admin-network-view.pug b/src/pug/templates/admin-network-view.pug index a1c328a..6c24c77 100644 --- a/src/pug/templates/admin-network-view.pug +++ b/src/pug/templates/admin-network-view.pug @@ -1,130 +1,2 @@ -//-///////////////////////////////////////////////////////////////////////////// -//- // -//- This file is part of the Buildbotics firmware. // -//- // -//- Copyright (c) 2015 - 2018, Buildbotics LLC // -//- All rights reserved. // -//- // -//- This file ("the software") is free software: you can redistribute it // -//- and/or modify it under the terms of the GNU General Public License, // -//- version 2 as published by the Free Software Foundation. You should // -//- have received a copy of the GNU General Public License, version 2 // -//- along with the software. If not, see . // -//- // -//- The software 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 // -//- Lesser General Public License for more details. // -//- // -//- You should have received a copy of the GNU Lesser General Public // -//- License along with the software. If not, see // -//- . // -//- // -//- For information regarding this software email: // -//- "Joseph Coffland" // -//- // -//-///////////////////////////////////////////////////////////////////////////// - script#admin-network-view-template(type="text/x-template") #admin-network - h2 Hostname - .pure-form.pure-form-aligned - .pure-control-group - label(for="hostname") Hostname - input(name="hostname", v-model="hostname", @keyup.enter="set_hostname") - button.pure-button.pure-button-primary(@click="set_hostname") Set - - message(:show.sync="hostnameSet") - h3(slot="header") Hostname Set - div(slot="body") - p Hostname was successfuly set to #[strong {{hostname}}]. - p Rebooting to apply changes. - p Redirecting to new hostname in {{redirectTimeout}} seconds. - div(slot="footer") - - h2 Remote SSH User - .pure-form.pure-form-aligned - .pure-control-group - label(for="username") Username - input(name="username", v-model="username", @keyup.enter="set_username") - button.pure-button.pure-button-primary(@click="set_username") Set - - .pure-form.pure-form-aligned - .pure-control-group - label(for="current") Current Password - input(name="current", v-model="current", type="password") - .pure-control-group - label(for="pass1") New Password - input(name="pass1", v-model="password", type="password") - .pure-control-group - label(for="pass2") New Password - input(name="pass2", v-model="password2", type="password") - button.pure-button.pure-button-primary(@click="set_password") Set - - message(:show.sync="passwordSet") - h3(slot="header") Password Set - p(slot="body") - - message(:show.sync="usernameSet") - h3(slot="header") Username Set - p(slot="body") - - h2 Wifi Setup - .pure-form.pure-form-aligned - .pure-control-group - label(for="wifi_mode") Mode - select(name="wifi_mode", v-model="wifi_mode", - title="Select client or access point mode") - option(value="disabled") Disabled - option(value="client") Client - option(value="ap") Access Point - button.pure-button.pure-button-primary(@click="wifiConfirm = true", - v-if="wifi_mode == 'disabled'") Set - - .pure-control-group(v-if="wifi_mode == 'ap'") - label(for="wifi_ch") Channel - select(name="wifi_ch", v-model="wifi_ch") - each ch in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] - option(value=ch)= ch - - .pure-control-group(v-if="wifi_mode != 'disabled'") - label(for="ssid") Network (SSID) - input(name="ssid", v-model="wifi_ssid") - - .pure-control-group(v-if="wifi_mode != 'disabled'") - label(for="wifi_pass") Password - input(name="wifi_pass", v-model="wifi_pass", type="password") - button.pure-button.pure-button-primary(@click="wifiConfirm = true") Set - - p(v-if="wifi_mode != 'disabled'"). - WARNING: WiFi may be unreliable in an electrically noisy environment - such as a machine shop. - - message.wifi-confirm(:show.sync="wifiConfirm") - h3(slot="header") Configure Wifi and reboot? - div(slot="body") - p - | After configuring the Wifi settings the controller will - | automatically reboot. - table - tr - th Mode - td  {{wifi_mode}} - tr(v-if="wifi_mode == 'ap'") - th Channel - td  {{wifi_ch}} - tr(v-if="wifi_mode != 'disabled'") - th SSID - td  {{wifi_ssid}} - tr(v-if="wifi_mode != 'disabled'") - th Auth - td  {{wifi_pass ? 'WPA2' : 'Open'}} - - div(slot="footer") - button.pure-button(@click="wifiConfirm = false") Cancel - button.pure-button.button-success(@click="config_wifi") OK - - message(:show.sync="rebooting") - h3(slot="header") Rebooting - p(slot="body") Please wait... - div(slot="footer") diff --git a/src/pug/templates/axis-control.pug b/src/pug/templates/axis-control.pug index 77764b9..9707aff 100644 --- a/src/pug/templates/axis-control.pug +++ b/src/pug/templates/axis-control.pug @@ -1,30 +1,3 @@ -//-///////////////////////////////////////////////////////////////////////////// -//- // -//- This file is part of the Buildbotics firmware. // -//- // -//- Copyright (c) 2015 - 2018, Buildbotics LLC // -//- All rights reserved. // -//- // -//- This file ("the software") is free software: you can redistribute it // -//- and/or modify it under the terms of the GNU General Public License, // -//- version 2 as published by the Free Software Foundation. You should // -//- have received a copy of the GNU General Public License, version 2 // -//- along with the software. If not, see . // -//- // -//- The software 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 // -//- Lesser General Public License for more details. // -//- // -//- You should have received a copy of the GNU Lesser General Public // -//- License along with the software. If not, see // -//- . // -//- // -//- For information regarding this software email: // -//- "Joseph Coffland" // -//- // -//-///////////////////////////////////////////////////////////////////////////// - script#axis-control-template(type="text/x-template") svg(xmlns="http://www.w3.org/2000/svg", xmlns:xlink="http://www.w3.org/1999/xlink", diff --git a/src/pug/templates/cheat-sheet-view.pug b/src/pug/templates/cheat-sheet-view.pug index 4f63351..d23ee1e 100644 --- a/src/pug/templates/cheat-sheet-view.pug +++ b/src/pug/templates/cheat-sheet-view.pug @@ -1,30 +1,3 @@ -//-///////////////////////////////////////////////////////////////////////////// -//- // -//- This file is part of the Buildbotics firmware. // -//- // -//- Copyright (c) 2015 - 2018, Buildbotics LLC // -//- All rights reserved. // -//- // -//- This file ("the software") is free software: you can redistribute it // -//- and/or modify it under the terms of the GNU General Public License, // -//- version 2 as published by the Free Software Foundation. You should // -//- have received a copy of the GNU General Public License, version 2 // -//- along with the software. If not, see . // -//- // -//- The software 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 // -//- Lesser General Public License for more details. // -//- // -//- You should have received a copy of the GNU Lesser General Public // -//- License along with the software. If not, see // -//- . // -//- // -//- For information regarding this software email: // -//- "Joseph Coffland" // -//- // -//-///////////////////////////////////////////////////////////////////////////// - script#cheat-sheet-view-template(type="text/x-template") // Modified from http://linuxcnc.org/docs/html/gcode.html - var base = 'http://linuxcnc.org/docs/html/gcode'; diff --git a/src/pug/templates/console.pug b/src/pug/templates/console.pug index 0fe66f0..02d65e2 100644 --- a/src/pug/templates/console.pug +++ b/src/pug/templates/console.pug @@ -1,30 +1,3 @@ -//-///////////////////////////////////////////////////////////////////////////// -//- // -//- This file is part of the Buildbotics firmware. // -//- // -//- Copyright (c) 2015 - 2018, Buildbotics LLC // -//- All rights reserved. // -//- // -//- This file ("the software") is free software: you can redistribute it // -//- and/or modify it under the terms of the GNU General Public License, // -//- version 2 as published by the Free Software Foundation. You should // -//- have received a copy of the GNU General Public License, version 2 // -//- along with the software. If not, see . // -//- // -//- The software 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 // -//- Lesser General Public License for more details. // -//- // -//- You should have received a copy of the GNU Lesser General Public // -//- License along with the software. If not, see // -//- . // -//- // -//- For information regarding this software email: // -//- "Joseph Coffland" // -//- // -//-///////////////////////////////////////////////////////////////////////////// - script#console-template(type="text/x-template") .console .toolbar diff --git a/src/pug/templates/control-view.pug b/src/pug/templates/control-view.pug index 7c08bf5..6f5887d 100644 --- a/src/pug/templates/control-view.pug +++ b/src/pug/templates/control-view.pug @@ -1,30 +1,3 @@ -//-///////////////////////////////////////////////////////////////////////////// -//- // -//- This file is part of the Buildbotics firmware. // -//- // -//- Copyright (c) 2015 - 2018, Buildbotics LLC // -//- All rights reserved. // -//- // -//- This file ("the software") is free software: you can redistribute it // -//- and/or modify it under the terms of the GNU General Public License, // -//- version 2 as published by the Free Software Foundation. You should // -//- have received a copy of the GNU General Public License, version 2 // -//- along with the software. If not, see . // -//- // -//- The software 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 // -//- Lesser General Public License for more details. // -//- // -//- You should have received a copy of the GNU Lesser General Public // -//- License along with the software. If not, see // -//- . // -//- // -//- For information regarding this software email: // -//- "Joseph Coffland" // -//- // -//-///////////////////////////////////////////////////////////////////////////// - script#control-view-template(type="text/x-template") #control message(:show.sync="showGcodeMessage") @@ -36,109 +9,6 @@ script#control-view-template(type="text/x-template") div(slot="footer") label Simulating {{(toolpath_progress || 0) | percent}} - - message(:show.sync=`ask_home_msg`) - h3(slot="header") Home Machine - - div(slot="body") - p Home the machine? - - div(slot="footer") - button.pure-button(@click="home()") - | OK - - button.pure-button(@click='ask_home_msg = false; ask_home = false') - | Cancel - - message(:show.sync=`ask_zero_xy_msg`) - h3(slot="header") XY Origin - - div(slot="body") - p Move to XY origin? - - div(slot="footer") - button.pure-button(@click="goto_zero(1,1,0,0)") - | Confirm - - button.pure-button(@click='ask_zero_xy_msg = false') - | Cancel - - message(:show.sync=`ask_zero_z_msg`) - h3(slot="header") Z Origin - - div(slot="body") - p Move to Z origin? - - div(slot="footer") - button.pure-button(@click="goto_zero(0,0,1,0)") - | Confirm - - button.pure-button(@click='ask_zero_z_msg = false') - | Cancel - - message(:show.sync=`show_probe_test_modal`) - - h3(slot="header") Test probe connection - - div(slot="body") - .pure-form - p Attach the probe magnet to the collet. - p Touch the probe block to the bit. - - div(slot="footer") - button.pure-button(@click=`show_probe_test_modal = false`) - | Cancel - - button.pure-button.button-success( - :disabled=`!state.saw_probe_connected` - @click=`finish_probe_test()`) Continue - - message(:show.sync=`show_tool_diameter_modal`) - h3(slot="header") Enter probe tool information - - div(slot="body") - .pure-form - .pure-control-group - label="{{metric ? 'Diameter (mm)' : 'Diameter (inches)'}}" - input(v-model="tool_diameter_for_prompt", size="8") - p - - div(slot="footer") - button.pure-button(@click=`show_tool_diameter_modal = false`) - | Cancel - - button.pure-button.button-success( - @click=`set_tool_diameter`) - | Set - - message(:show.sync=`state.show_probe_complete_modal`) - h3(slot="header") Probing complete! - - div(slot="body") - .pure-form - p Don't forget to put away the probe! - div(v-if="state.goto_xy_zero_after_probe") - p - | The machine will now move - br - | to the X-Y zero point. - p Watch your hands! - - div(slot="footer") - button.pure-button.button-success(@click=`$emit("finalize_probe")`) - | Done - - message(:show.sync=`state.show_probe_failed_modal`) - h3(slot="header") Probing failed! - - div(slot="body") - .pure-form - p Could not find the probe block during probing! - p Make sure the tip of the bit is about 1/4" (~6mm) above the probe block, and try again. - - div(slot="footer") - button.pure-button.button-success(@click=`hide_probe_failed_modal()`) - | OK table(style="table-layout: fixed; width: 100%;") tr(style="height: fit-content;") @@ -151,55 +21,60 @@ script#control-view-template(type="text/x-template") col(style="width:100px") tr td(style="height:100px",align="center") - button(style="height:100px;width:100px",@click="jog_fn(-1,1,0,0)") + button(@click="jog_fn(-1,1,0,0)") .fa.fa-arrow-right(style="transform: rotate(-135deg);") td(style="height:100px",align="center") - button(style="height:100px;width:100px",@click="jog_fn(0,1,0,0)") Y+ + button(@click="jog_fn(0,1,0,0)") Y+ td(style="height:100px",align="center") - button(style="height:100px;width:100px",@click="jog_fn(1,1,0,0)") + button(@click="jog_fn(1,1,0,0)") .fa.fa-arrow-right(style="transform: rotate(-45deg);") td(style="height:100px",align="center") - button(style="height:100px;width:100px",,@click="jog_fn(0,0,1,0)") Z+ + button(,@click="jog_fn(0,0,1,0)") Z+ tr td(style="height:100px",align="center") - button(style="height:100px;width:100px",@click="jog_fn(-1,0,0,0)") X- + button(@click="jog_fn(-1,0,0,0)") X- td(style="height:100px",align="center") - button(style="height:100px;width:100px",@click="ask_zero_xy_msg = true") - .fa.fa-bullseye(style="font-size: 172%") + button(@click="showMoveToZeroDialog('xy')") + .fa.fa-bullseye(style="font-size: 173%") td(style="height:100px",align="center") - button(style="height:100px;width:100px",@click="jog_fn(1,0,0,0)") X+ + button(@click="jog_fn(1,0,0,0)") X+ td(style="height:100px",align="center") - button(style="height:100px;width:100px",@click='ask_zero_z_msg = true') Z0 + button(@click="showMoveToZeroDialog('z')") Z0 tr td(style="height:100px",align="center") - button(style="height:100px;width:100px",@click="jog_fn(-1,-1,0,0)") + button(@click="jog_fn(-1,-1,0,0)") .fa.fa-arrow-right(style="transform: rotate(135deg);") td(style="height:100px",align="center") - button(style="height:100px;width:100px",@click="jog_fn(0,-1,0,0)") Y- + button(@click="jog_fn(0,-1,0,0)") Y- td(style="height:100px",align="center") - button(style="height:100px;width:100px",@click="jog_fn(1,-1,0,0)") + button(@click="jog_fn(1,-1,0,0)") .fa.fa-arrow-right(style="transform: rotate(45deg);") td(style="height:100px",align="center") - button(style="height:100px;width:100px",@click="jog_fn(0,0,-1,0)") Z- + button(@click="jog_fn(0,0,-1,0)") Z- tr td(style="height:100px",align="center") - button#jog_button_fine(style="height:100px;width:100px", @click=`set_jog_incr('fine')`) 0.1 + button(:style="getJogIncrStyle('fine')", @click="jog_incr = 'fine'") + span {{jog_incr_amounts[display_units].fine}}#[span.jog-units {{metric ? 'mm' : 'in'}}] td(style="height:100px",align="center") - button#jog_button_small(style="height:100px;width:100px", @click=`set_jog_incr('small')`) 1.0 + button(:style="getJogIncrStyle('small')", @click="jog_incr = 'small'") + span {{jog_incr_amounts[display_units].small}}#[span.jog-units {{metric ? 'mm' : 'in'}}] td(style="height:100px",align="center") - button#jog_button_medium(style="height:100px;width:100px", @click=`set_jog_incr('medium')`) 10 + button(:style="getJogIncrStyle('medium')", @click="jog_incr = 'medium'") + span {{jog_incr_amounts[display_units].medium}}#[span.jog-units {{metric ? 'mm' : 'in'}}] td(style="height:100px",align="center") - button#jog_button_large(style="height:100px;width:100px", @click=`set_jog_incr('large')`) 100 + button(:style="getJogIncrStyle('large')", @click="jog_incr = 'large'") + span {{jog_incr_amounts[display_units].large}}#[span.jog-units {{metric ? 'mm' : 'in'}}] tr td(style="height:100px", align="center", colspan="2") button(:class="state['pw'] ? '' : 'load-on'", style="height:100px;width:200px", - @click=`start_probe_test(prep_and_show_tool_diameter_modal)`) + @click="showProbeDialog('xyz')") | Probe XYZ + td(style="height:100px", align="center", colspan="2") button(:class="state['pw'] ? '' : 'load-on'", style="height:100px;width:200px", - @click=`start_probe_test(probe_z)`) + @click="showProbeDialog('z')") | Probe Z td(style="vertical-align: top;") @@ -211,8 +86,6 @@ script#control-view-template(type="text/x-template") th.offset Offset th.state State th.tstate Toolpath - //th.tstate Min - //th.tstate Max th.actions button.pure-button(disabled, style="height:60px;width:60px;display:none;") @@ -234,79 +107,25 @@ script#control-view-template(type="text/x-template") td.state .fa(:class=`'fa-' + ${axis}.icon`) | {{#{axis}.state}} - td.tstate(:class=`${axis}.tklass`, :title=`${axis}.toolmsg`, @click=`show_toolpath_msg('${axis}')`) + td.tstate(:class=`${axis}.tklass`, :title=`${axis}.toolmsg`, @click=`showToolpathMessageDialog('${axis}')`) .fa(:class=`'fa-' + ${axis}.ticon`) | {{#{axis}.tstate}} - //td.tstate: unit-value(:value=`${axis}.pathMin`, precision=4) - //td.tstate: unit-value(:value=`${axis}.pathMax`, precision=4) - - message(:show.sync=`toolpath_msg['${axis}']`) - h3(slot="header") Tool path info {{'#{axis}' | upper}} axis - - div(slot="body") - p {{#{axis}.toolmsg}} - - div(slot="footer") - button.pure-button(@click=`toolpath_msg['${axis}'] = false`) - | OK - + th.actions button.pure-button(:disabled="!can_set_axis", title=`Set {{'${axis}' | upper}} axis position.`, - @click=`show_set_position('${axis}')`,style="height:60px;width:60px") + @click=`show_set_position('${axis}')`, style="height:60px;width:60px") .fa.fa-cog button.pure-button(:disabled="!can_set_axis", title=`Zero {{'${axis}' | upper}} axis offset.`, - @click=`zero('${axis}')`,style="height:60px;width:60px") + @click=`zero('${axis}')`, style="height:60px;width:60px") .fa.fa-map-marker button.pure-button(:disabled="!is_idle", @click=`home('${axis}')`, - title=`Home {{'${axis}' | upper}} axis.`,style="height:60px;width:60px") + title=`Home {{'${axis}' | upper}} axis.`, style="height:60px;width:60px") .fa.fa-home - message(:show.sync=`position_msg['${axis}']`) - h3(slot="header") Set {{'#{axis}' | upper}} axis position - - div(slot="body") - .pure-form - .pure-control-group - label Position - input(v-model="axis_position", - @keyup.enter=`set_position('${axis}', axis_position)`) - p - - div(slot="footer") - button.pure-button(@click=`position_msg['${axis}'] = false`) - | Cancel - - button.pure-button(v-if=`${axis}.homed`, - @click=`unhome('${axis}')`) Unhome - - button.pure-button.button-success( - @click=`set_position('${axis}', axis_position)`) Set - - message(:show.sync=`manual_home['${axis}']`) - h3(slot="header") Manually home {{'#{axis}' | upper}} axis - - div(slot="body") - p Set axis absolute position. - - .pure-form - .pure-control-group - label Absolute - input(v-model="axis_position", - @keyup.enter=`set_home('${axis}', axis_position)`) - - p - - div(slot="footer") - button.pure-button(@click=`manual_home['${axis}'] = false`) - | Cancel - - button.pure-button.button-success( - title=`Home {{'${axis}' | upper}} axis.`, - @click=`set_home('${axis}', axis_position)`) Set tr(style="vertical-align: top;") td @@ -323,10 +142,10 @@ script#control-view-template(type="text/x-template") td.message(:class="{attention: highlight_state}") | {{message.replace(/^#/, '')}} - tr(title="Active machine units") - th Units - td.mach_units - select(v-model="mach_units", :disabled="!is_idle") + tr + th Display Units + td.units + select(v-model="display_units") option(value="METRIC") METRIC option(value="IMPERIAL") IMPERIAL @@ -368,6 +187,11 @@ script#control-view-template(type="text/x-template") td table.info + tr + th Current Time + td + span {{current_time}} + tr th Remaining td(title="Total run time (days:hours:mins:secs)"). @@ -376,12 +200,7 @@ script#control-view-template(type="text/x-template") tr th ETA td.eta {{eta}} - tr - th Line - td - | {{0 <= state.line ? state.line : 0 | number}} - span(v-if="toolpath.lines") - |  of {{toolpath.lines | number}} + tr th Progress td.progress @@ -484,6 +303,9 @@ script#control-view-template(type="text/x-template") input(v-model="mdi", :disabled="!can_mdi", @keyup.enter="submit_mdi") + div + em The machine is currently operating in #[strong {{mach_units}}] units. Use G20/G21 to switch units. + .history(:class="{placeholder: !history}") span(v-if="!history.length") MDI history displays here. ul @@ -497,9 +319,6 @@ script#control-view-template(type="text/x-template") section#content4.tab-content indicators(:state="state", :template="template") - - - .override(title="Feed rate override.") label Feed input(type="range", min="0", max="2", step="0.01", diff --git a/src/pug/templates/estop.pug b/src/pug/templates/estop.pug index 2af3df0..393fa88 100644 --- a/src/pug/templates/estop.pug +++ b/src/pug/templates/estop.pug @@ -1,30 +1,3 @@ -//-///////////////////////////////////////////////////////////////////////////// -//- // -//- This file is part of the Buildbotics firmware. // -//- // -//- Copyright (c) 2015 - 2018, Buildbotics LLC // -//- All rights reserved. // -//- // -//- This file ("the software") is free software: you can redistribute it // -//- and/or modify it under the terms of the GNU General Public License, // -//- version 2 as published by the Free Software Foundation. You should // -//- have received a copy of the GNU General Public License, version 2 // -//- along with the software. If not, see . // -//- // -//- The software 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 // -//- Lesser General Public License for more details. // -//- // -//- You should have received a copy of the GNU Lesser General Public // -//- License along with the software. If not, see // -//- . // -//- // -//- For information regarding this software email: // -//- "Joseph Coffland" // -//- // -//-///////////////////////////////////////////////////////////////////////////// - script#estop-template(type="text/x-template") svg(version="1.1", xmlns:svg="http://www.w3.org/2000/svg", xmlns="http://www.w3.org/2000/svg", diff --git a/src/pug/templates/gcode-viewer.pug b/src/pug/templates/gcode-viewer.pug index 4a00617..3ae500c 100644 --- a/src/pug/templates/gcode-viewer.pug +++ b/src/pug/templates/gcode-viewer.pug @@ -1,30 +1,3 @@ -//-///////////////////////////////////////////////////////////////////////////// -//- // -//- This file is part of the Buildbotics firmware. // -//- // -//- Copyright (c) 2015 - 2018, Buildbotics LLC // -//- All rights reserved. // -//- // -//- This file ("the software") is free software: you can redistribute it // -//- and/or modify it under the terms of the GNU General Public License, // -//- version 2 as published by the Free Software Foundation. You should // -//- have received a copy of the GNU General Public License, version 2 // -//- along with the software. If not, see . // -//- // -//- The software 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 // -//- Lesser General Public License for more details. // -//- // -//- You should have received a copy of the GNU Lesser General Public // -//- License along with the software. If not, see // -//- . // -//- // -//- For information regarding this software email: // -//- "Joseph Coffland" // -//- // -//-///////////////////////////////////////////////////////////////////////////// - script#gcode-viewer-template(type="text/x-template") .gcode .clusterize diff --git a/src/pug/templates/help-view.pug b/src/pug/templates/help-view.pug index 4c1b677..80aed01 100644 --- a/src/pug/templates/help-view.pug +++ b/src/pug/templates/help-view.pug @@ -1,75 +1,2 @@ -//-///////////////////////////////////////////////////////////////////////////// -//- // -//- This file is part of the Buildbotics firmware. // -//- // -//- Copyright (c) 2015 - 2018, Buildbotics LLC // -//- All rights reserved. // -//- // -//- This file ("the software") is free software: you can redistribute it // -//- and/or modify it under the terms of the GNU General Public License, // -//- version 2 as published by the Free Software Foundation. You should // -//- have received a copy of the GNU General Public License, version 2 // -//- along with the software. If not, see . // -//- // -//- The software 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 // -//- Lesser General Public License for more details. // -//- // -//- You should have received a copy of the GNU Lesser General Public // -//- License along with the software. If not, see // -//- . // -//- // -//- For information regarding this software email: // -//- "Joseph Coffland" // -//- // -//-///////////////////////////////////////////////////////////////////////////// - script#help-view-template(type="text/x-template") - #help - h2 Contact - p - | You can contact us here - | - a(href="https://onefinitycnc.com/support", target="_blank") - | onefinitycnc.com/support - |. - - h2 Discussion Forum - p - | Check out our support and discussion forum. - | - a(href="https://forum.onefinitycnc.com", target="_blank") - | forum.onefinitycnc.com - |. Register on the site and post a message. We can't wait to hear from you. - - h2 Buildbotics - p - | This controller is based on the Buildbotics CNC Controller. - | We encourage you to check out the - a(href="http://buildbotics.com", target="_blank") Buildbotics Website - |. - - h2 CAD/CAM Software - p - a(href="http://wikipedia.com/wiki/Computer-aided_manufacturing", - target="_blank") CAM - | - | software can be used to create GCode - | automatically from - | - a(href="http://wikipedia.com/wiki/Computer-aided_design", - target="_blank") CAD - | - | models. Here are a few CAD/CAM resources: - ul - li: a(href="http://camotics.org/", target="_blank") - | CAMotics - Open-Source CNC Simulator - li: a(href="http://librecad.org/", target="_blank") - | LibreCAD - Open-Source 2D CAD - li: a(href="https://www.freecadweb.org/", target="_blank") - | FreeCAD - Open-Source 3D CAD - li: a(href="http://www.openscad.org/", target="_blank") - | OpenSCAD - Open-Source 3D CAD for programmers - li: a(href="http://wiki.linuxcnc.org/cgi-bin/wiki.pl?Cam", - target="_blank") LinuxCNC CAM resources + #help diff --git a/src/pug/templates/indicators.pug b/src/pug/templates/indicators.pug index 8414680..dc65c48 100644 --- a/src/pug/templates/indicators.pug +++ b/src/pug/templates/indicators.pug @@ -1,30 +1,3 @@ -//-///////////////////////////////////////////////////////////////////////////// -//- // -//- This file is part of the Buildbotics firmware. // -//- // -//- Copyright (c) 2015 - 2018, Buildbotics LLC // -//- All rights reserved. // -//- // -//- This file ("the software") is free software: you can redistribute it // -//- and/or modify it under the terms of the GNU General Public License, // -//- version 2 as published by the Free Software Foundation. You should // -//- have received a copy of the GNU General Public License, version 2 // -//- along with the software. If not, see . // -//- // -//- The software 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 // -//- Lesser General Public License for more details. // -//- // -//- You should have received a copy of the GNU Lesser General Public // -//- License along with the software. If not, see // -//- . // -//- // -//- For information regarding this software email: // -//- "Joseph Coffland" // -//- // -//-///////////////////////////////////////////////////////////////////////////// - script#indicators-template(type="text/x-template") .indicators table.legend diff --git a/src/pug/templates/io-indicator.pug b/src/pug/templates/io-indicator.pug index 8baf875..8479b9e 100644 --- a/src/pug/templates/io-indicator.pug +++ b/src/pug/templates/io-indicator.pug @@ -1,29 +1,2 @@ -//-///////////////////////////////////////////////////////////////////////////// -//- // -//- This file is part of the Buildbotics firmware. // -//- // -//- Copyright (c) 2015 - 2018, Buildbotics LLC // -//- All rights reserved. // -//- // -//- This file ("the software") is free software: you can redistribute it // -//- and/or modify it under the terms of the GNU General Public License, // -//- version 2 as published by the Free Software Foundation. You should // -//- have received a copy of the GNU General Public License, version 2 // -//- along with the software. If not, see . // -//- // -//- The software 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 // -//- Lesser General Public License for more details. // -//- // -//- You should have received a copy of the GNU Lesser General Public // -//- License along with the software. If not, see // -//- . // -//- // -//- For information regarding this software email: // -//- "Joseph Coffland" // -//- // -//-///////////////////////////////////////////////////////////////////////////// - script#io-indicator-template(type="text/x-template") .fa.io(:class="klass", :title="tooltip") diff --git a/src/pug/templates/io-view.pug b/src/pug/templates/io-view.pug index ffb3800..616e856 100644 --- a/src/pug/templates/io-view.pug +++ b/src/pug/templates/io-view.pug @@ -1,30 +1,3 @@ -//-///////////////////////////////////////////////////////////////////////////// -//- // -//- This file is part of the Buildbotics firmware. // -//- // -//- Copyright (c) 2015 - 2018, Buildbotics LLC // -//- All rights reserved. // -//- // -//- This file ("the software") is free software: you can redistribute it // -//- and/or modify it under the terms of the GNU General Public License, // -//- version 2 as published by the Free Software Foundation. You should // -//- have received a copy of the GNU General Public License, version 2 // -//- along with the software. If not, see . // -//- // -//- The software 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 // -//- Lesser General Public License for more details. // -//- // -//- You should have received a copy of the GNU Lesser General Public // -//- License along with the software. If not, see // -//- . // -//- // -//- For information regarding this software email: // -//- "Joseph Coffland" // -//- // -//-///////////////////////////////////////////////////////////////////////////// - script#io-view-template(type="text/x-template") #io h1 I/O Configuration diff --git a/src/pug/templates/message.pug b/src/pug/templates/message.pug index 7257547..dc63219 100644 --- a/src/pug/templates/message.pug +++ b/src/pug/templates/message.pug @@ -1,30 +1,3 @@ -//-///////////////////////////////////////////////////////////////////////////// -//- // -//- This file is part of the Buildbotics firmware. // -//- // -//- Copyright (c) 2015 - 2018, Buildbotics LLC // -//- All rights reserved. // -//- // -//- This file ("the software") is free software: you can redistribute it // -//- and/or modify it under the terms of the GNU General Public License, // -//- version 2 as published by the Free Software Foundation. You should // -//- have received a copy of the GNU General Public License, version 2 // -//- along with the software. If not, see . // -//- // -//- The software 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 // -//- Lesser General Public License for more details. // -//- // -//- You should have received a copy of the GNU Lesser General Public // -//- License along with the software. If not, see // -//- . // -//- // -//- For information regarding this software email: // -//- "Joseph Coffland" // -//- // -//-///////////////////////////////////////////////////////////////////////////// - script#message-template(type="text/x-template") .modal-mask(v-if="show", :class="class") .modal-wrapper diff --git a/src/pug/templates/modbus-reg-view.pug b/src/pug/templates/modbus-reg-view.pug index ac86cfd..e9da884 100644 --- a/src/pug/templates/modbus-reg-view.pug +++ b/src/pug/templates/modbus-reg-view.pug @@ -1,30 +1,3 @@ -//-///////////////////////////////////////////////////////////////////////////// -//- // -//- This file is part of the Buildbotics firmware. // -//- // -//- Copyright (c) 2015 - 2018, Buildbotics LLC // -//- All rights reserved. // -//- // -//- This file ("the software") is free software: you can redistribute it // -//- and/or modify it under the terms of the GNU General Public License, // -//- version 2 as published by the Free Software Foundation. You should // -//- have received a copy of the GNU General Public License, version 2 // -//- along with the software. If not, see . // -//- // -//- The software 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 // -//- Lesser General Public License for more details. // -//- // -//- You should have received a copy of the GNU Lesser General Public // -//- License along with the software. If not, see // -//- . // -//- // -//- For information regarding this software email: // -//- "Joseph Coffland" // -//- // -//-///////////////////////////////////////////////////////////////////////////// - script#modbus-reg-view-template(type="text/x-template") tr.modbus-reg td.reg-index {{index}} diff --git a/src/pug/templates/motor-view.pug b/src/pug/templates/motor-view.pug index a0ea712..9b7b2aa 100644 --- a/src/pug/templates/motor-view.pug +++ b/src/pug/templates/motor-view.pug @@ -1,30 +1,3 @@ -//-///////////////////////////////////////////////////////////////////////////// -//- // -//- This file is part of the Buildbotics firmware. // -//- // -//- Copyright (c) 2015 - 2018, Buildbotics LLC // -//- All rights reserved. // -//- // -//- This file ("the software") is free software: you can redistribute it // -//- and/or modify it under the terms of the GNU General Public License, // -//- version 2 as published by the Free Software Foundation. You should // -//- have received a copy of the GNU General Public License, version 2 // -//- along with the software. If not, see . // -//- // -//- The software 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 // -//- Lesser General Public License for more details. // -//- // -//- You should have received a copy of the GNU Lesser General Public // -//- License along with the software. If not, see // -//- . // -//- // -//- For information regarding this software email: // -//- "Joseph Coffland" // -//- // -//-///////////////////////////////////////////////////////////////////////////// - script#motor-view-template(type="text/x-template") .motor(:class="{slave: is_slave}") h1 Motor {{index}} Configuration diff --git a/src/pug/templates/path-viewer.pug b/src/pug/templates/path-viewer.pug index 8b60c2a..51a3290 100644 --- a/src/pug/templates/path-viewer.pug +++ b/src/pug/templates/path-viewer.pug @@ -1,30 +1,3 @@ -//-///////////////////////////////////////////////////////////////////////////// -//- // -//- This file is part of the Buildbotics firmware. // -//- // -//- Copyright (c) 2015 - 2018, Buildbotics LLC // -//- All rights reserved. // -//- // -//- This file ("the software") is free software: you can redistribute it // -//- and/or modify it under the terms of the GNU General Public License, // -//- version 2 as published by the Free Software Foundation. You should // -//- have received a copy of the GNU General Public License, version 2 // -//- along with the software. If not, see . // -//- // -//- The software 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 // -//- Lesser General Public License for more details. // -//- // -//- You should have received a copy of the GNU Lesser General Public // -//- License along with the software. If not, see // -//- . // -//- // -//- For information regarding this software email: // -//- "Joseph Coffland" // -//- // -//-///////////////////////////////////////////////////////////////////////////// - script#path-viewer-template(type="text/x-template") .path-viewer(v-show="enabled", :class="{small: small}") .path-viewer-toolbar diff --git a/src/pug/templates/settings-view.pug b/src/pug/templates/settings-view.pug index 058e043..4b6cf85 100644 --- a/src/pug/templates/settings-view.pug +++ b/src/pug/templates/settings-view.pug @@ -1,85 +1,2 @@ -//- All rights reserved. // -//- // -//- This file ("the software") is free software: you can redistribute it // -//- and/or modify it under the terms of the GNU General Public License, // -//- version 2 as published by the Free Software Foundation. You should // -//- have received a copy of the GNU General Public License, version 2 // -//- along with the software. If not, see . // -//- // -//- The software 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 // -//- Lesser General Public License for more details. // -//- // -//- You should have received a copy of the GNU Lesser General Public // -//- License along with the software. If not, see // -//- . // -//- // -//- For information regarding this software email: // -//- "Joseph Coffland" // -//- // -//-///////////////////////////////////////////////////////////////////////////// - script#settings-view-template(type="text/x-template") #settings - h1 Settings - - .pure-form.pure-form-aligned - fieldset - h2 Units - templated-input(name="units", :model.sync="config.settings.units", - :template="template.settings.units") - - p - | Note, #[tt units] sets both the machine default units and the - | units used in motor configuration. GCode #[tt program-start], - | set below, may also change the default machine units. - - fieldset - h2 Probing safety prompts - templated-input(name="probing-prompts", - :model.sync="config.settings['probing-prompts']", - :template="template.settings['probing-prompts']") - - fieldset - h2 Probe Dimensions - templated-input(v-for="templ in template.probe", :name="$key", - :model.sync="config.probe[$key]", :template="templ") - - fieldset - h2 GCode - templated-input(v-for="templ in template.gcode", :name="$key", - :model.sync="config.gcode[$key]", :template="templ") - - fieldset - h2 Path Accuracy - templated-input(name="max-deviation", - :model.sync="config.settings['max-deviation']", - :template="template.settings['max-deviation']") - - p. - Lower #[tt max-deviation] to follow the programmed path more precisely - but at a slower speed. - - p. - In order to improve traversal speed, the path planner may merge - consecutive moves or round off sharp corners if doing so would deviate - from the program path by less than #[tt max-deviation]. - - - var base = '//linuxcnc.org/docs/html/gcode/g-code.html' - p. - GCode commands - #[a(href=base + "#gcode:g61", target="_blank") G61, G61.1] and - #[a(href=base + "#gcode:g64", target="_blank") G64] also affect path - planning accuracy. - - h2 Cornering Speed (Advanced) - templated-input(name="junction-accel", - :model.sync="config.settings['junction-accel']", - :template="template.settings['junction-accel']") - - p. - Junction acceleration limits the cornering speed the planner will - allow. Increasing this value will allow for faster traversal of - corners but may cause the planner to violate axis jerk limits and - stall the motors. Use with caution. diff --git a/src/pug/templates/templated-input.pug b/src/pug/templates/templated-input.pug index c4c48ce..2507a95 100644 --- a/src/pug/templates/templated-input.pug +++ b/src/pug/templates/templated-input.pug @@ -1,30 +1,3 @@ -//-///////////////////////////////////////////////////////////////////////////// -//- // -//- This file is part of the Buildbotics firmware. // -//- // -//- Copyright (c) 2015 - 2018, Buildbotics LLC // -//- All rights reserved. // -//- // -//- This file ("the software") is free software: you can redistribute it // -//- and/or modify it under the terms of the GNU General Public License, // -//- version 2 as published by the Free Software Foundation. You should // -//- have received a copy of the GNU General Public License, version 2 // -//- along with the software. If not, see . // -//- // -//- The software 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 // -//- Lesser General Public License for more details. // -//- // -//- You should have received a copy of the GNU Lesser General Public // -//- License along with the software. If not, see // -//- . // -//- // -//- For information regarding this software email: // -//- "Joseph Coffland" // -//- // -//-///////////////////////////////////////////////////////////////////////////// - script#templated-input-template(type="text/x-template") .pure-control-group(class="tmpl-input-{{name}}", :title="title") label(:for="name") {{name}} @@ -38,22 +11,17 @@ script#templated-input-template(type="text/x-template") input(v-if="template.type == 'float'", v-model.number="view", number, :min="template.min", :max="template.max", :step="template.step || 'any'", - type="number", :name="name", @change="change") + type="number", :name="name", @keyup="change") input(v-if="template.type == 'int' && !template.values", number, v-model.number="view", :min="template.min", :max="template.max", - type="number", :name="name", @change="change") + type="number", :name="name", @keyup="change") input(v-if="template.type == 'string'", v-model="view", type="text", - :name="name", @change="change") + :name="name", @keyup="change") textarea(v-if="template.type == 'text'", v-model="view", :name="name", - @change="change") - - span.range(v-if="template.type == 'percent'") - input(type="range", v-model="view", :name="name", number, min="0", - max="100", step="1", @change="change") - | {{view}} + @keyup="change") label.units {{units}} diff --git a/src/pug/templates/tool-view.pug b/src/pug/templates/tool-view.pug index c5e442a..e41511a 100644 --- a/src/pug/templates/tool-view.pug +++ b/src/pug/templates/tool-view.pug @@ -1,30 +1,3 @@ -//-///////////////////////////////////////////////////////////////////////////// -//- // -//- This file is part of the Buildbotics firmware. // -//- // -//- Copyright (c) 2015 - 2018, Buildbotics LLC // -//- All rights reserved. // -//- // -//- This file ("the software") is free software: you can redistribute it // -//- and/or modify it under the terms of the GNU General Public License, // -//- version 2 as published by the Free Software Foundation. You should // -//- have received a copy of the GNU General Public License, version 2 // -//- along with the software. If not, see . // -//- // -//- The software 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 // -//- Lesser General Public License for more details. // -//- // -//- You should have received a copy of the GNU Lesser General Public // -//- License along with the software. If not, see // -//- . // -//- // -//- For information regarding this software email: // -//- "Joseph Coffland" // -//- // -//-///////////////////////////////////////////////////////////////////////////// - script#tool-view-template(type="text/x-template") #tool h1 Tool Configuration diff --git a/src/py/bbctrl/FileHandler.py b/src/py/bbctrl/FileHandler.py index ad6a24e..9b4b20c 100644 --- a/src/py/bbctrl/FileHandler.py +++ b/src/py/bbctrl/FileHandler.py @@ -1,52 +1,43 @@ -################################################################################ -# # -# This file is part of the Buildbotics firmware. # -# # -# Copyright (c) 2015 - 2018, Buildbotics LLC # -# All rights reserved. # -# # -# This file ("the software") is free software: you can redistribute it # -# and/or modify it under the terms of the GNU General Public License, # -# version 2 as published by the Free Software Foundation. You should # -# have received a copy of the GNU General Public License, version 2 # -# along with the software. If not, see . # -# # -# The software 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 # -# Lesser General Public License for more details. # -# # -# You should have received a copy of the GNU Lesser General Public # -# License along with the software. If not, see # -# . # -# # -# For information regarding this software email: # -# "Joseph Coffland" # -# # -################################################################################ - import os +import tempfile import bbctrl import glob -import html +import tornado from tornado import gen from tornado.web import HTTPError +from tornado.escape import url_unescape def safe_remove(path): try: os.unlink(path) - except OSError: pass + except OSError: + pass +@tornado.web.stream_request_body class FileHandler(bbctrl.APIHandler): - def prepare(self): pass + def prepare(self): + if self.request.method == 'PUT': + self.request.connection.set_max_body_size(2 ** 30) + filename = self.request.path.split('/')[-1] + self.uploadFilename = url_unescape(filename) \ + .replace('\\', '/') \ + .replace('#', '-') \ + .replace('?', '-') + + self.uploadFile = tempfile.NamedTemporaryFile("wb") + + def data_received(self, data): + if self.request.method == 'PUT': + self.uploadFile.write(data) def delete_ok(self, filename): if not filename: # Delete everything - for path in glob.glob(self.get_upload('*')): safe_remove(path) + for path in glob.glob(self.get_upload('*')): + safe_remove(path) self.get_ctrl().preplanner.delete_all_plans() self.get_ctrl().state.clear_files() @@ -57,26 +48,29 @@ class FileHandler(bbctrl.APIHandler): self.get_ctrl().preplanner.delete_plans(filename) self.get_ctrl().state.remove_file(filename) - def put_ok(self, *args): - gcode = self.request.files['gcode'][0] - filename = os.path.basename(gcode['filename'].replace('\\', '/')) - filename = filename.replace('#', '-').replace('?', '-') + if not os.path.exists(self.get_upload()): + os.mkdir(self.get_upload()) - if not os.path.exists(self.get_upload()): os.mkdir(self.get_upload()) + filename = self.get_upload(self.uploadFilename).encode('utf8') + safe_remove(filename) + os.link(self.uploadFile.name, filename) - with open(self.get_upload(filename).encode('utf8'), 'wb') as f: - f.write(gcode['body']) - os.sync() + self.uploadFile.close() - self.get_ctrl().preplanner.invalidate(filename) - self.get_ctrl().state.add_file(filename) - self.get_log('FileHandler').info('GCode received: ' + filename) + del (self.uploadFile) + self.get_ctrl().preplanner.invalidate(self.uploadFilename) + self.get_ctrl().state.add_file(self.uploadFilename) + self.get_log('FileHandler').info( + 'GCode received: ' + self.uploadFilename) + + del (self.uploadFilename) @gen.coroutine def get(self, filename): - if not filename: raise HTTPError(400, 'Missing filename') + if not filename: + raise HTTPError(400, 'Missing filename') filename = os.path.basename(filename) try: @@ -84,6 +78,7 @@ class FileHandler(bbctrl.APIHandler): self.write(f.read()) except Exception: self.get_ctrl().state.select_file('') - raise HTTPError(400, "Unable to read file - doesn't appear to be GCode.") + raise HTTPError( + 400, "Unable to read file - doesn't appear to be GCode.") self.get_ctrl().state.select_file(filename) diff --git a/src/py/bbctrl/Web.py b/src/py/bbctrl/Web.py index ed2003e..55cb274 100644 --- a/src/py/bbctrl/Web.py +++ b/src/py/bbctrl/Web.py @@ -1,30 +1,3 @@ -################################################################################ -# # -# This file is part of the Buildbotics firmware. # -# # -# Copyright (c) 2015 - 2018, Buildbotics LLC # -# All rights reserved. # -# # -# This file ("the software") is free software: you can redistribute it # -# and/or modify it under the terms of the GNU General Public License, # -# version 2 as published by the Free Software Foundation. You should # -# have received a copy of the GNU General Public License, version 2 # -# along with the software. If not, see . # -# # -# The software 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 # -# Lesser General Public License for more details. # -# # -# You should have received a copy of the GNU Lesser General Public # -# License along with the software. If not, see # -# . # -# # -# For information regarding this software email: # -# "Joseph Coffland" # -# # -################################################################################ - import os import json import tornado @@ -34,9 +7,9 @@ import subprocess import socket from tornado.web import HTTPError from tornado import gen - +import re import bbctrl - +from urllib.request import urlopen def call_get_output(cmd): @@ -75,7 +48,7 @@ def check_password(password): class RebootHandler(bbctrl.APIHandler): def put_ok(self): self.get_ctrl().lcd.goodbye('Rebooting...') - subprocess.Popen('reboot') + subprocess.Popen(['reboot']) class ShutdownHandler(bbctrl.APIHandler): def put_ok(self): @@ -153,6 +126,30 @@ class HostnameHandler(bbctrl.APIHandler): raise HTTPError(400, 'Failed to set hostname') +class NetworkData(bbctrl.APIHandler): + + def get(self): + try: + ipAddresses = subprocess.P( + "ip -4 addr | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'", shell=True).decode().split() + ipAddresses.remove("127.0.0.1") + regex = re.compile(r'/255$/') + filtered = [i for i in ipAddresses if not regex.match(i)] + ipAddresses = filtered[0] + except: + ipAddresses = "Not Connected" + try: + wifi = subprocess.check_output( + "sudo iw dev wlan0 info | grep ssid", shell=True).decode().split() + wifi.pop(0) + wifiName = " ".join(wifi) + except: + wifi = "not connected" + self.write_json({ + 'ipAddresses': ipAddresses, + 'wifi': wifiName + }) + class WifiHandler(bbctrl.APIHandler): def get(self): data = {'ssid': '', 'channel': 0} @@ -189,6 +186,7 @@ class WifiHandler(bbctrl.APIHandler): raise HTTPError(400, 'Failed to configure wifi') + class UsernameHandler(bbctrl.APIHandler): def get(self): self.write_json(get_username()) @@ -407,6 +405,97 @@ class JogHandler(bbctrl.APIHandler): self.get_ctrl().mach.jog(self.json) +class ScreenRotationHandler(bbctrl.APIHandler): + + @gen.coroutine + def get(self): + with open("/boot/config.txt", 'rt') as config: + lines = config.readlines() + for line in lines: + if line.startswith('display_rotate'): + self.write_json({ + 'rotated': + int(displayRotatePattern.search(line).group(1)) != 0 + }) + return + + self.write_json({'rotated': False}) + return + + @gen.coroutine + def put_ok(self): + rotated = self.json['rotated'] + + subprocess.Popen([ + '/usr/local/bin/edit-boot-config', + 'display_rotate={}'.format(2 if rotated else 0) + ]) + + with open("/usr/share/X11/xorg.conf.d/40-libinput.conf", + 'rt') as config: + text = config.read() + text = transformationMatrixPattern.sub(r'\1\2\3\5', text) + if rotated: + text = matchIsTouchscreenPattern.sub( + r'\1\2\3\2Option "TransformationMatrix" "-1 0 1 0 -1 1 0 0 1"\1\4', + text) + with open("/usr/share/X11/xorg.conf.d/40-libinput.conf", + 'wt') as config: + config.write(text) + + subprocess.run('reboot') + + +class TimeHandler(bbctrl.APIHandler): + + def get(self): + timeinfo = call_get_output(['timedatectl']) + timezones = call_get_output( + ['timedatectl', 'list-timezones', '--no-pager']) + self.get_log('TimeHandler').info('Time stuff: {}, {}'.format( + timeinfo, timezones)) + + self.write_json({'timeinfo': timeinfo, 'timezones': timezones}) + + def put_ok(self): + datetime = self.json['datetime'] + timezone = self.json['timezone'] + subprocess.Popen(['timedatectl', 'set-time', datetime]) + subprocess.Popen(['timedatectl', 'set-timezone', timezone]) + + +class RemoteDiagnosticsHandler(bbctrl.APIHandler): + + def get(self): + code = self.get_query_argument("code", "") + command = self.get_query_argument("command", "") + + log = self.get_log('RemoteDiagnostics') + + if command == "disconnect": + subprocess.Popen(['killall', 'ngrok']) + self.write_json({'message': "Succesfully disconnected"}) + + if command == "connect": + try: + url = 'https://tinyurl.com/1f-remote?code={}'.format(code) + with urlopen(url) as response: + body = response.read() + + os.makedirs("/tmp/ngrok", exist_ok=True) + with open("/tmp/ngrok/1f-ngrok.sh", 'wb') as f: + f.write(body) + + subprocess.Popen(['/bin/bash', "/tmp/ngrok/1f-ngrok.sh"]) + self.write_json({'success': True}) + except Exception as e: + log.info("Failed: {}".format(str(e))) + self.write_json({ + 'success': False, + 'code': e.code or None, + 'message': e.reason or "Unknown" + }) + # Base class for Web Socket connections class ClientConnection(object): def __init__(self, app): @@ -517,7 +606,8 @@ class Web(tornado.web.Application): (r'/api/reboot', RebootHandler), (r'/api/shutdown', ShutdownHandler), (r'/api/hostname', HostnameHandler), - (r'/api/wifi', WifiHandler), + (r'/api/wifi', NetworkData), + (r'/api/network', WifiHandler), (r'/api/remote/username', UsernameHandler), (r'/api/remote/password', PasswordHandler), (r'/api/config/load', ConfigLoadHandler), @@ -544,6 +634,9 @@ class Web(tornado.web.Application): (r'/api/modbus/write', ModbusWriteHandler), (r'/api/jog', JogHandler), (r'/api/video', bbctrl.VideoHandler), + (r'/api/screen-rotation', ScreenRotationHandler), + (r'/api/time', TimeHandler), + (r'/api/remote-diagnostics', RemoteDiagnosticsHandler), (r'/(.*)', StaticFileHandler, {'path': bbctrl.get_resource('http/'), 'default_filename': 'index.html'}), diff --git a/src/static/js/three.min.js b/src/static/js/three.min.js index 75e5c31..a0a33c8 100644 --- a/src/static/js/three.min.js +++ b/src/static/js/three.min.js @@ -172,7 +172,7 @@ c.isSpriteMaterial?(t.diffuse.value=c.color,t.opacity.value=c.opacity,t.rotation b.envMap,a.flipEnvMap.value=b.envMap&&b.envMap.isCubeTexture?-1:1,a.reflectivity.value=b.reflectivity,a.refractionRatio.value=b.refractionRatio,a.maxMipLevel.value=Ca.get(b.envMap).__maxMipLevel);b.lightMap&&(a.lightMap.value=b.lightMap,a.lightMapIntensity.value=b.lightMapIntensity);b.aoMap&&(a.aoMap.value=b.aoMap,a.aoMapIntensity.value=b.aoMapIntensity);if(b.map)var c=b.map;else b.specularMap?c=b.specularMap:b.displacementMap?c=b.displacementMap:b.normalMap?c=b.normalMap:b.bumpMap?c=b.bumpMap:b.roughnessMap? c=b.roughnessMap:b.metalnessMap?c=b.metalnessMap:b.alphaMap?c=b.alphaMap:b.emissiveMap&&(c=b.emissiveMap);void 0!==c&&(c.isWebGLRenderTarget&&(c=c.texture),!0===c.matrixAutoUpdate&&c.updateMatrix(),a.uvTransform.value.copy(c.matrix))}function r(a,b){a.specular.value=b.specular;a.shininess.value=Math.max(b.shininess,1E-4);b.emissiveMap&&(a.emissiveMap.value=b.emissiveMap);b.bumpMap&&(a.bumpMap.value=b.bumpMap,a.bumpScale.value=b.bumpScale,1===b.side&&(a.bumpScale.value*=-1));b.normalMap&&(a.normalMap.value= b.normalMap,a.normalScale.value.copy(b.normalScale),1===b.side&&a.normalScale.value.negate());b.displacementMap&&(a.displacementMap.value=b.displacementMap,a.displacementScale.value=b.displacementScale,a.displacementBias.value=b.displacementBias)}function v(a,b){a.roughness.value=b.roughness;a.metalness.value=b.metalness;b.roughnessMap&&(a.roughnessMap.value=b.roughnessMap);b.metalnessMap&&(a.metalnessMap.value=b.metalnessMap);b.emissiveMap&&(a.emissiveMap.value=b.emissiveMap);b.bumpMap&&(a.bumpMap.value= -b.bumpMap,a.bumpScale.value=b.bumpScale,1===b.side&&(a.bumpScale.value*=-1));b.normalMap&&(a.normalMap.value=b.normalMap,a.normalScale.value.copy(b.normalScale),1===b.side&&a.normalScale.value.negate());b.displacementMap&&(a.displacementMap.value=b.displacementMap,a.displacementScale.value=b.displacementScale,a.displacementBias.value=b.displacementBias);b.envMap&&(a.envMapIntensity.value=b.envMapIntensity)}console.log("THREE.WebGLRenderer","96");a=a||{};var y=void 0!==a.canvas?a.canvas:document.createElementNS("http://www.w3.org/1999/xhtml", +b.bumpMap,a.bumpScale.value=b.bumpScale,1===b.side&&(a.bumpScale.value*=-1));b.normalMap&&(a.normalMap.value=b.normalMap,a.normalScale.value.copy(b.normalScale),1===b.side&&a.normalScale.value.negate());b.displacementMap&&(a.displacementMap.value=b.displacementMap,a.displacementScale.value=b.displacementScale,a.displacementBias.value=b.displacementBias);b.envMap&&(a.envMapIntensity.value=b.envMapIntensity)}a=a||{};var y=void 0!==a.canvas?a.canvas:document.createElementNS("http://www.w3.org/1999/xhtml", "canvas"),x=void 0!==a.context?a.context:null,w=void 0!==a.alpha?a.alpha:!1,G=void 0!==a.depth?a.depth:!0,D=void 0!==a.stencil?a.stencil:!0,O=void 0!==a.antialias?a.antialias:!1,S=void 0!==a.premultipliedAlpha?a.premultipliedAlpha:!0,E=void 0!==a.preserveDrawingBuffer?a.preserveDrawingBuffer:!1,z=void 0!==a.powerPreference?a.powerPreference:"default",A=null,B=null;this.domElement=y;this.context=null;this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=!0;this.clippingPlanes= [];this.localClippingEnabled=!1;this.gammaFactor=2;this.physicallyCorrectLights=this.gammaOutput=this.gammaInput=!1;this.toneMappingWhitePoint=this.toneMappingExposure=this.toneMapping=1;this.maxMorphTargets=8;this.maxMorphNormals=4;var P=this,I=!1,F=null,L=null,M=null,Q=-1;var H=b=null;var U=!1;var V=null,Z=null,T=new aa,zc=new aa,Y=null,fa=0,X=y.width,N=y.height,W=1,cb=new aa(0,0,X,N),ha=new aa(0,0,X,N),ra=!1,pa=new od,ba=new Nf,qd=!1,Xd=!1,yc=new J,db=new p;try{w={alpha:w,depth:G,stencil:D,antialias:O, premultipliedAlpha:S,preserveDrawingBuffer:E,powerPreference:z};y.addEventListener("webglcontextlost",d,!1);y.addEventListener("webglcontextrestored",e,!1);var C=x||y.getContext("webgl",w)||y.getContext("experimental-webgl",w);if(null===C){if(null!==y.getContext("webgl"))throw Error("Error creating WebGL context with your selected attributes.");throw Error("Error creating WebGL context.");}void 0===C.getShaderPrecisionFormat&&(C.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}})}catch(Lg){console.error("THREE.WebGLRenderer: "+ diff --git a/src/static/js/vue.js b/src/static/js/vue.js index c8d69ec..a357bde 100644 --- a/src/static/js/vue.js +++ b/src/static/js/vue.js @@ -394,7 +394,7 @@ var inBrowser = typeof window !== 'undefined' && Object.prototype.toString.call(window) !== '[object Object]'; // detect devtools - var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__; + var devtools = false; // UA sniffing for working around browser-specific quirks var UA = inBrowser && window.navigator.userAgent.toLowerCase(); @@ -9677,14 +9677,5 @@ var template = Object.freeze({ Vue.version = '1.0.17'; - // devtools global hook - /* istanbul ignore next */ - if (devtools) { - devtools.emit('init', Vue); - } else if ('development' !== 'production' && inBrowser && /Chrome\/\d+/.test(window.navigator.userAgent)) { - console.log('Download the Vue Devtools for a better development experience:\n' + 'https://github.com/vuejs/vue-devtools'); - } - return Vue; - })); \ No newline at end of file diff --git a/src/stylus/style.styl b/src/stylus/style.styl index 2ded9ff..02d5ce2 100644 --- a/src/stylus/style.styl +++ b/src/stylus/style.styl @@ -4,6 +4,9 @@ body [v-cloak] display none +.menu-link + z-index unset + tt color #000 background #eee @@ -32,22 +35,62 @@ tt height 140px padding 0 - .header-content - max-width 90% - margin auto - text-align left +.nav-header + padding-left 60px + display flex - .estop - float right - margin 5px + .brand + display flex + flex-direction column + align-self center + white-space nowrap + + img + width 300px + + .version + font-size 18pt + color #777 + display flex + flex-direction column + justify-content space-evenly + border-left #777 2px solid; + margin-left 15px + padding 0px 10px + font-weight bold + + .upgrade-link + margin-left 20px + font-size 16pt + align-self center + color blue + + .upgrade-attention + color red + font-size 18pt + align-self center + margin-left 5px + + .pi-temp-warning + align-self center + font-size 30pt + font-family Audiowide + display inline + margin 0 30px + + .left + color #444 + .right + color #e5aa3d + + .whitespace + flex-grow 1 .video position relative - float right width 174px height 130px - margin 2px 5px - border 2px solid #fff + border 2px solid transparent border-radius 5px &:hover @@ -87,29 +130,9 @@ tt width 100% height 100% - .banner - float left - padding-top 40px - white-space nowrap - - img - vertical-align top - - .title - font-size 30pt - font-family Audiowide - display inline - margin-right 0.5em - - .left - color #444 - .right - color #e5aa3d - - .subtitle - font-size 18pt - font-weight 100 - color #aaa + .estop + align-self center + margin 0 30px .error background red @@ -214,8 +237,6 @@ span.unit .pure-control-group label.units width 6em - - label.units text-align left textarea @@ -230,6 +251,7 @@ span.unit padding 0.7em 1em border-radius 3px display inline-block + @keyframes blink 50% @@ -267,6 +289,12 @@ span.unit // The jogging buttons, etc. .control-buttons button font-size 150% + width 100px + height 100px + + .jog-units + font-size initial + margin-left 5px &:first-child margin 0.5em 0 @@ -335,6 +363,7 @@ span.unit .axis .name text-transform capitalize + vertical-align middle .name, .position font-size 24pt @@ -421,7 +450,7 @@ span.unit min-width 8em width 100% - .mach_units + .units padding 0 select @@ -848,18 +877,6 @@ tt.save text-decoration none -.upgrade-version - display inline-block - border-radius 4px - padding 2px - margin-left 0.5em - color #555 - background-color #e5aa3d - text-decoration none - - &:hover - color #fff - .modal-mask position fixed z-index 9998 diff --git a/src/svelte-components/.gitignore b/src/svelte-components/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/src/svelte-components/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/src/svelte-components/README.md b/src/svelte-components/README.md new file mode 100644 index 0000000..4ef762f --- /dev/null +++ b/src/svelte-components/README.md @@ -0,0 +1,48 @@ +# Svelte + TS + Vite + +This template should help get you started developing with Svelte and TypeScript in Vite. + +## Recommended IDE Setup + +[VS Code](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). + +## Need an official Svelte framework? + +Check out [SvelteKit](https://github.com/sveltejs/kit#readme), which is also powered by Vite. Deploy anywhere with its serverless-first approach and adapt to various platforms, with out of the box support for TypeScript, SCSS, and Less, and easily-added support for mdsvex, GraphQL, PostCSS, Tailwind CSS, and more. + +## Technical considerations + +**Why use this over SvelteKit?** + +- It brings its own routing solution which might not be preferable for some users. +- It is first and foremost a framework that just happens to use Vite under the hood, not a Vite app. + `vite dev` and `vite build` wouldn't work in a SvelteKit environment, for example. + +This template contains as little as possible to get started with Vite + TypeScript + Svelte, while taking into account the developer experience with regards to HMR and intellisense. It demonstrates capabilities on par with the other `create-vite` templates and is a good starting point for beginners dipping their toes into a Vite + Svelte project. + +Should you later need the extended capabilities and extensibility provided by SvelteKit, the template has been structured similarly to SvelteKit so that it is easy to migrate. + +**Why `global.d.ts` instead of `compilerOptions.types` inside `jsconfig.json` or `tsconfig.json`?** + +Setting `compilerOptions.types` shuts out all other types not explicitly listed in the configuration. Using triple-slash references keeps the default TypeScript setting of accepting type information from the entire workspace, while also adding `svelte` and `vite/client` type information. + +**Why include `.vscode/extensions.json`?** + +Other templates indirectly recommend extensions via the README, but this file allows VS Code to prompt the user to install the recommended extension upon opening the project. + +**Why enable `allowJs` in the TS template?** + +While `allowJs: false` would indeed prevent the use of `.js` files in the project, it does not prevent the use of JavaScript syntax in `.svelte` files. In addition, it would force `checkJs: false`, bringing the worst of both worlds: not being able to guarantee the entire codebase is TypeScript, and also having worse typechecking for the existing JavaScript. In addition, there are valid use cases in which a mixed codebase may be relevant. + +**Why is HMR not preserving my local component state?** + +HMR state preservation comes with a number of gotchas! It has been disabled by default in both `svelte-hmr` and `@sveltejs/vite-plugin-svelte` due to its often surprising behavior. You can read the details [here](https://github.com/rixo/svelte-hmr#svelte-hmr). + +If you have state that's important to retain within a component, consider creating an external store which would not be replaced by HMR. + +```ts +// store.ts +// An extremely simple external store +import { writable } from 'svelte/store' +export default writable(0) +``` diff --git a/src/svelte-components/index.html b/src/svelte-components/index.html new file mode 100644 index 0000000..d2f6839 --- /dev/null +++ b/src/svelte-components/index.html @@ -0,0 +1,13 @@ + + + + + + + Svelte + TS + Vite App + + +
    + + + diff --git a/src/svelte-components/package-lock.json b/src/svelte-components/package-lock.json new file mode 100644 index 0000000..ef58833 --- /dev/null +++ b/src/svelte-components/package-lock.json @@ -0,0 +1,10382 @@ +{ + "name": "svelte-components", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "svelte-components", + "version": "0.0.0", + "devDependencies": { + "@sveltejs/kit": "^1.0.0-next.392", + "@sveltejs/vite-plugin-svelte": "^1.0.1", + "@tsconfig/svelte": "^3.0.0", + "node-sass": "^7.0.1", + "polyfill-object.fromentries": "^1.0.1", + "smui-theme": "^6.0.0-beta.16", + "string.prototype.matchall": "^4.0.7", + "svelte": "^3.49.0", + "svelte-check": "^2.8.0", + "svelte-icon": "^1.2.4", + "svelte-material-ui": "^6.0.0-beta.16", + "svelte-preprocess": "^4.10.7", + "svelte-tiny-virtual-list": "^2.0.5", + "tslib": "^2.4.0", + "typescript": "^4.7.4", + "vite": "^3.0.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@material/animation": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-13.0.0.tgz", + "integrity": "sha512-YR0/u4u56qXDjKYolQ7F+IvlPkaSBhMl/dZv8DK0FbD6PH4ckOPd3bEXNRndXtprsxwknQQP2pttjPImylkl0g==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/banner": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/banner/-/banner-13.0.0.tgz", + "integrity": "sha512-59M85ezhwRaa+BqguYCCaRS57fV5KQe3Ff2cU6LcQNw0UPMFW1ap0dZ+iZBv/sj+7/QcqBBShL9uu8dWKtI4Gg==", + "dev": true, + "dependencies": { + "@material/base": "^13.0.0", + "@material/button": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/tokens": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/base": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-13.0.0.tgz", + "integrity": "sha512-vFx0JryRfcvUNX3cZ2u32wUMvxzd+c/YW0LFOXNgqCDWlubHcMm0Y6Wz371LhfQo80/NE69u+/4Joo99yKnVeg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/button": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/button/-/button-13.0.0.tgz", + "integrity": "sha512-lYorht6fcEd4P+dsLVp2BGtaY5cGYNp71LMajuDe71GZX3dZPoKeVvb+Ie1S7vcB+o+WLTeaisMk9/vA4gfi8A==", + "dev": true, + "dependencies": { + "@material/density": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/tokens": "^13.0.0", + "@material/touch-target": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/card": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/card/-/card-13.0.0.tgz", + "integrity": "sha512-ooJUOt1Viv99Dyz4rhz9ZZbfa996eHh3RUuXkPRkT66Btd5TzpdqsQWKwOVc5bgbgWqzhDWQ6A/aQdYqH97ccg==", + "dev": true, + "dependencies": { + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/checkbox": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-13.0.0.tgz", + "integrity": "sha512-tRC6n9Jq7GgdU0d1F8NOvUy6WiRZR58tUgL1QqoiQK9PGKSt0dAF3Aa48uubO7/Lt9K4NqgwV6/OeHv8pHaM/w==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/density": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/touch-target": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/chips": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/chips/-/chips-13.0.0.tgz", + "integrity": "sha512-Ov4runDbrROUpMqKyCi3lpknfrLzGwtV+/rfYIgTYUkEVpCHXHddxXxcjP4zqh3QLXnE6ma92PLGcxCb/zzogQ==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/checkbox": "^13.0.0", + "@material/density": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/tokens": "^13.0.0", + "@material/touch-target": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/circular-progress": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-13.0.0.tgz", + "integrity": "sha512-jSbr0ywY2N6s05tyqTXl/cG339C+qU3ck3FwXUq5SJup8CWT0AoJ8EG/CD10CEhNH8nH9Iwstve95oNgIt8G4g==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/progress-indicator": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/data-table": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-13.0.0.tgz", + "integrity": "sha512-Z3yEq1T6Om/A3ntPw0bd40dqtOR4H3++pvchgW35kq+V9xDLL0hfzmuiy0QH4plA2ZsFYJxjt02k/SRvnkjKPQ==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/checkbox": "^13.0.0", + "@material/density": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/icon-button": "^13.0.0", + "@material/linear-progress": "^13.0.0", + "@material/list": "^13.0.0", + "@material/menu": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/select": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/touch-target": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/density": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/density/-/density-13.0.0.tgz", + "integrity": "sha512-ppJTzOsuhjQam5GvHaq/XZocZNUr+41XQ2sd5nONAmQ0wwzXgqG0FaxtF1EXqK3uZFadz+vAu6enagre9DXhTA==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/dialog": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-13.0.0.tgz", + "integrity": "sha512-1Ggo9Bid94F1ttZJKSjIcgMvkVQtKsqwbqLs5cWlleaiwtAcwUE12XA2B1MNj8xM9ajU3BJm4GigupBOK1jGHQ==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/button": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/icon-button": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/tokens": "^13.0.0", + "@material/touch-target": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/dom": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-13.0.0.tgz", + "integrity": "sha512-M9HLAYBZtkTUvf66FL+jAEvUOdhji1HkGA1mV6oyE+HY9gkCkmso+mngvzlLd5+uaAVE9I3WQFhSb9gp0cpXnw==", + "dev": true, + "dependencies": { + "@material/feature-targeting": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/drawer": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-13.0.0.tgz", + "integrity": "sha512-TIV/K9MED3ymngmKrdLwOMhUF44BzoR6HuTVsZAM4bgy0sfSv+jzgaGUqJsvjEhTXk+Q9OTEge+TsU/ETzQCbg==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/list": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/elevation": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-13.0.0.tgz", + "integrity": "sha512-hzdblgamVRbC0UwKafcvUVDvKzMiOSveDiwGgFk+EAg/tZRdwMlQPyf/9I6Lr8Cw/pNGnEOPhmCDOYPOHimr0w==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/fab": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/fab/-/fab-13.0.0.tgz", + "integrity": "sha512-qOi+XWEZWUR5T961UjSorgqm5VaanuZtRN3nsrKqHH1p0L8fYRc3qkGIChlaY9p7BcOYMCynXJzT+MfELVrcwA==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/tokens": "^13.0.0", + "@material/touch-target": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/feature-targeting": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-13.0.0.tgz", + "integrity": "sha512-QJClfeaA4EMyAxKJy9WR0Nx+/VwSZCkhGLUVBG9NhxqYGfl/LtaeaidrNm32vYEoNZAofN92VD2RwQTRwp/dMQ==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/floating-label": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-13.0.0.tgz", + "integrity": "sha512-imAPamD97QrizVCOpxjr3UfQJyDBpEEhDBSbEbKLrCpqG3jQx4/My5rNKKVGWjxUiBYgBA1dhkn98RRX5tGBtQ==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/form-field": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-13.0.0.tgz", + "integrity": "sha512-cXs5uYA89KgrXrU1UYkl52JizeIK3Mx9LjBw4ZYiyQJzFaBTPYsYWGSJMad1HZhWlRiigGTyN1M9ePIxtBpi0Q==", + "dev": true, + "dependencies": { + "@material/base": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/icon-button": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-13.0.0.tgz", + "integrity": "sha512-SdxFytWvbfN0fj7jHFq3DqK5/Zoms+Ipuv6fI8AzwgDFe7mXJ2euPahN+3XcmJ3BaSMyfYsdbcYdCWs8bgHW1w==", + "dev": true, + "dependencies": { + "@material/base": "^13.0.0", + "@material/density": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/touch-target": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/image-list": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-13.0.0.tgz", + "integrity": "sha512-D78QKpK5JmO6zrbsSYt1YfRlkqzzduDTe6BstS0efUFS1CA11hrqwQFoMaR1L1dw2U3CQ/CP22bBMSZVV9aU6A==", + "dev": true, + "dependencies": { + "@material/feature-targeting": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/layout-grid": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-13.0.0.tgz", + "integrity": "sha512-9L1BVLRIyetm/AOC+59+yca6R0OO2AJKHiUMdZrxgUVjqVblqWXEMeONZqslFRGHBiSIaYdrDIhn4ZTYY6tKUA==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/line-ripple": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-13.0.0.tgz", + "integrity": "sha512-5djBRXrd1+SiMVUTWr4rD6xv+/qTaGGmgUS5GytBE5mczvnEwcPmM4PzF+HNj2TS+wvNvIfRjRmUzWO2Z6w2lA==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/linear-progress": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-13.0.0.tgz", + "integrity": "sha512-FJpP6flSME5QRPfkB616uA5bk9aMKJBqkklrHk6dSMZaTKbiHRmc6faxMIZ4w9W49JFMXaSwzC39y96tQTiRQg==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/progress-indicator": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/list": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/list/-/list-13.0.0.tgz", + "integrity": "sha512-poq4WNDEfW6Z3YPAn3wdBX4RSkj3A83Pht6984MmG8YJZMlq34ftHECw37VcdmFJIyRPdpZqywJo/i7CxsSAgQ==", + "dev": true, + "dependencies": { + "@material/base": "^13.0.0", + "@material/density": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/menu": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/menu/-/menu-13.0.0.tgz", + "integrity": "sha512-RY9R2ubYU6a7WRJW3nWr/AoSzdrxwUGqkfJSx0U9M/wK1vbXYYcJ7eCXFzSpa5VrstE7of7PbyYtQ8V61tILEQ==", + "dev": true, + "dependencies": { + "@material/base": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/list": "^13.0.0", + "@material/menu-surface": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/menu-surface": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-13.0.0.tgz", + "integrity": "sha512-Irfnk0l8AO7z8ucilbBzZI8izbFV/aK1GbiPpT1SmZuKkL1z+04rB2HpB+OqwaBixdLTDq70AyawcnQ0MACeXQ==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/notched-outline": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-13.0.0.tgz", + "integrity": "sha512-BHdxr1x2AN4oqycTNg0FGisG3rMHf50z3MuyUoQsJJ3WGjxBMWKd0yK/xl4m38nFKPg1vQnzyHIYTJdRpCaE7A==", + "dev": true, + "dependencies": { + "@material/base": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/floating-label": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/progress-indicator": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-13.0.0.tgz", + "integrity": "sha512-IfhAMn03gWg/Rl0Bg26Q1g+DrMnaULllz+ZJeIY7BXZC5qFYq1fLq4+RiQmfPGlJfURUjrWNLcI1VDVyXUHHzg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/radio": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/radio/-/radio-13.0.0.tgz", + "integrity": "sha512-6jeZ+dKSzBB/j2IZ7RjFl5mrB+EWnpv/x+U9w6ENLCdueM4+LKUqBAc2fC2WMycsqgoFnlB0xsO/sG+kN0J6fw==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/density": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/touch-target": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/ripple": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-13.0.0.tgz", + "integrity": "sha512-hx4B40hB2rRfsGwf1jwo2GGlYDq0yUQjcMcMmXfQipPJNpQhy8ylmXKc1DBjmWf7EQ/MgbfCSYwPrYXrbGP31w==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/rtl": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-13.0.0.tgz", + "integrity": "sha512-nFGy3iQg7k+xLs67eb86mRFVLwa0yi7MusqRK4OM8DXcLO5yoVfUTPKpdSykcbRryp9imVHsxutox2tZawR4og==", + "dev": true, + "dependencies": { + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/segmented-button": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/segmented-button/-/segmented-button-13.0.0.tgz", + "integrity": "sha512-cbjSzkGms+MB6e7ZF6Toc0kpIor4qFm3ueY8KGRIbpvPoJuHfDy6wqIUhwpfAibSpcaDSnCKg1m+hEtyplZPkQ==", + "dev": true, + "dependencies": { + "@material/base": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/touch-target": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/select": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/select/-/select-13.0.0.tgz", + "integrity": "sha512-wVprsSMicU/l+LAqXdOU+qdzzdHupLXpWWQo2Rsk8G6AxL1Zna+/+ETnRlDdr2wHHK/KNDXSBdmuCcoEIRshcA==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/density": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/floating-label": "^13.0.0", + "@material/line-ripple": "^13.0.0", + "@material/list": "^13.0.0", + "@material/menu": "^13.0.0", + "@material/menu-surface": "^13.0.0", + "@material/notched-outline": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/shape": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-13.0.0.tgz", + "integrity": "sha512-exk96+iCjzCujk3aSrvIMhmW773s1Tc0h+MbQKbt6Iv3nHJCyLSiRbxclCHXWHrVwG/9KZRkrt/g2qk7P3VRBg==", + "dev": true, + "dependencies": { + "@material/feature-targeting": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/slider": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/slider/-/slider-13.0.0.tgz", + "integrity": "sha512-PW+3X9MiOoWmXhirYo/Mk2UYW00Tnsihrx5YJQ4+IxwbrUI75/8yUsO8kVr7YC+Eqhldz8oXzhIXglQFtbpolQ==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/snackbar": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-13.0.0.tgz", + "integrity": "sha512-z59aYCeMWWEbsUU04QDZN4CxzCCOp3OIc5tzrdqnY3qRq4wwApxncf7RKKKSU2K6WTEWfdHHOc7aNX8kqlDmUg==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/button": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/icon-button": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/switch": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/switch/-/switch-13.0.0.tgz", + "integrity": "sha512-zbdo6nKEOAx24ILCBobZlQqU2WZ+KuPgdAc1VTI1q1BCKN3rDIfm9RnsCuYiZa9iaq4UUgdYuhH8KVEYGP7Lrw==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/density": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/tokens": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/tab/-/tab-13.0.0.tgz", + "integrity": "sha512-7tziMFiyiFZner39h6ue6A6rfJhz8LDyeVPYfdAMe8ZO8GT+PczDr5yuectamR8fNBE7Fk9Bj/KvIOx+LjKgDg==", + "dev": true, + "dependencies": { + "@material/base": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/tab-indicator": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab-bar": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-13.0.0.tgz", + "integrity": "sha512-GLODDvwKiN867weT+WiSR/4Oum2hw0Ipl1vcJxtZeE6C3PmGWBE316j8a5DLYvf9bjIPLYLNLUzLU3QnJB6T5w==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/density": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/tab": "^13.0.0", + "@material/tab-indicator": "^13.0.0", + "@material/tab-scroller": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab-indicator": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-13.0.0.tgz", + "integrity": "sha512-T6Q4zCdl374rQgNLrAIc8+sy8ax6fbNTZRb+oJgShzjVz4wH9OLk6LX1RREHEeWiZt69nTqeR4yU6/6xFX+Kjw==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab-scroller": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-13.0.0.tgz", + "integrity": "sha512-SHdNXTLrNA47RbTNOQa67DbQjw0qrf1h0OuoESXHMU/B7QQvhAOqnHpU32/LdCP+gvc7EdZjolVQgk3WphDcQA==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/tab": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/textfield": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-13.0.0.tgz", + "integrity": "sha512-CzodrOqx8wzj2AQngMpISURJID4jVOHf4CtiPoj32LG8bWLn5ZfAAX2aA2rO6NPyDYsFm0aEnlfMhnDwQyPoYw==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/density": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/floating-label": "^13.0.0", + "@material/line-ripple": "^13.0.0", + "@material/notched-outline": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/theme": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-13.0.0.tgz", + "integrity": "sha512-KAe1s0MvvfCGAwJliDVTvgAKuD3ESwhl7F7br4Iam4IPdqME2rWl8NPhKHFfaWqTG7PyCgMMngYEYuA8cLNTsA==", + "dev": true, + "dependencies": { + "@material/feature-targeting": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tokens": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-13.0.0.tgz", + "integrity": "sha512-t55CKVeAjABdSQCKjsvYvqrA6Z4f5varLpLloai8ZQU0giSl7qbUczV1i8y2pSOzpRTswD5JKM7a19qfsl/TCA==", + "dev": true, + "dependencies": { + "@material/elevation": "^13.0.0" + } + }, + "node_modules/@material/tooltip": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/tooltip/-/tooltip-13.0.0.tgz", + "integrity": "sha512-/QinwEM0sYtRUthgOy7R+V4iwLMZ8SCd8A3PyGyTr27BUGWykwAUFdXyzT4rxLhDNcnDOYH14N+Z3Bom+UwO9Q==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/top-app-bar": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-13.0.0.tgz", + "integrity": "sha512-NTbIbBmoo4wfbBwW+9XMmjYQJ3e7NJ9P/ahTszYuzYDyWNcc3m8G/A0zM+1LBmoze3rP/QTxcaJUH/A5/3ufXA==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/touch-target": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-13.0.0.tgz", + "integrity": "sha512-2BMjj+nwKIYG7cZZGcNuRSKo53knqDu9ksv9wLidxjLgzqXBd1v9gdXsqMRQXepoOqftWGmYMaRYI0xMnxt6lA==", + "dev": true, + "dependencies": { + "@material/base": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/rtl": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/typography": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/typography/-/typography-13.0.0.tgz", + "integrity": "sha512-UfaK4vT3LmGiiySf2RVIrf7fJZa6EJadFwo4YUMJx9bvUMRlBm1oI8Vo9fYpKdLfuSTeA+2BlgbwYVObj3laFw==", + "dev": true, + "dependencies": { + "@material/feature-targeting": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@smui-extra/accordion": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui-extra/accordion/-/accordion-6.0.0-beta.16.tgz", + "integrity": "sha512-p1gBhIyg3a8EXZWOsDPKURneqIssWsg5g72bp+TYvRWqN/e1X2CPnpiYwxWivl+k8A0h2u3rRvQiQnD08R0TlA==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/paper": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui-extra/autocomplete": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui-extra/autocomplete/-/autocomplete-6.0.0-beta.16.tgz", + "integrity": "sha512-ENmfOy4SNj68tDYNjCmwkDIU/dDWu3X7YghcrFkxsJdNinvlzwKnX1dvRvFc9Ov8V2n8V6oNQZsw7f9yhGcOBQ==", + "dev": true, + "dependencies": { + "@smui/common": "^6.0.0-beta.16", + "@smui/list": "^6.0.0-beta.16", + "@smui/menu": "^6.0.0-beta.16", + "@smui/menu-surface": "^6.0.0-beta.16", + "@smui/textfield": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui-extra/badge": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui-extra/badge/-/badge-6.0.0-beta.16.tgz", + "integrity": "sha512-yVm90zodAY/9o3u0rE3KuNoegciVv+InV0gVAwJYEFRvjjsamwCUf853pvfaKqMksdT+dsReIAycrw/4Zdv3fQ==", + "dev": true, + "dependencies": { + "@material/feature-targeting": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/banner": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/banner/-/banner-6.0.0-beta.16.tgz", + "integrity": "sha512-XF+NcRo4lF0iJcMKAC6eoUO//8/SHHB8yWK70EA5xCps469bgB/9s5+1wi3HdRCdddqI8LBFHYpzDj3KJ9D3RA==", + "dev": true, + "dependencies": { + "@material/banner": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/button": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/button/-/button-6.0.0-beta.16.tgz", + "integrity": "sha512-+sBnqo8PlbvV7R3sHUOu+/y2xqiDwcpjLkW7BVvbK0r3Rit87yKCb5Octa0DnnTmNh9W6bHGe162v760drcSfw==", + "dev": true, + "dependencies": { + "@material/button": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/theme": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/card": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/card/-/card-6.0.0-beta.16.tgz", + "integrity": "sha512-QCFM7EuM0mH0hxzRbFbforgGFP9q8SLLUHIqW4D17QA5EYiVAuGrputlT4Zx8ujTDSs7/Glax+qCSL3WnF2L3g==", + "dev": true, + "dependencies": { + "@material/card": "^13.0.0", + "@smui/button": "^6.0.0-beta.16", + "@smui/common": "^6.0.0-beta.16", + "@smui/icon-button": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/checkbox": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/checkbox/-/checkbox-6.0.0-beta.16.tgz", + "integrity": "sha512-gasHsQjgpPoYfOPl7hCibBiv6PWG8I1VzRrdmSQMbv9H0HI2Nn8Oo3DpYCnAUd6z4JhVk6UWCzqaO+La/tUAHw==", + "dev": true, + "dependencies": { + "@material/checkbox": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/chips": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/chips/-/chips-6.0.0-beta.16.tgz", + "integrity": "sha512-mfkVFAna0qsyYcyKL8LuqGxIteclKDm4PJ+yXUUk3VbsUcKFFf6FZqvM0xsjZt4QIKkrnDaALtCOviheHQNH7A==", + "dev": true, + "dependencies": { + "@material/chips": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/rtl": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/circular-progress": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/circular-progress/-/circular-progress-6.0.0-beta.16.tgz", + "integrity": "sha512-d4iLP6pZFB2hbXA04ykBI8fAOHRd8kdvEZnPbFDbyV97BqXVuuQP+TMlqL0a/NppDD9gaC09ZWnGaijlpEAfHg==", + "dev": true, + "dependencies": { + "@material/circular-progress": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/common": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/common/-/common-6.0.0-beta.16.tgz", + "integrity": "sha512-Ual6505AOP75T+IneOQ6e1tnlhDflJX+yxa9T8Hx5X00MOiULvWACg/RW3c8UEQAc96YnEsA3utv5qDy8tZpmg==", + "dev": true, + "dependencies": { + "@material/dom": "^13.0.0", + "@tsconfig/svelte": "^3.0.0", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/data-table": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/data-table/-/data-table-6.0.0-beta.16.tgz", + "integrity": "sha512-nNHIGbGMviTDGivOeaIwV6RnP/Lq7XZqs72gmX40ncLYIu1c//HNhIrcL3qbF+Ne/8gq7cuuKC4F26VUPEPD0g==", + "dev": true, + "dependencies": { + "@material/data-table": "^13.0.0", + "@material/dom": "^13.0.0", + "@smui/checkbox": "^6.0.0-beta.16", + "@smui/common": "^6.0.0-beta.16", + "@smui/icon-button": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "@smui/select": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/dialog": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/dialog/-/dialog-6.0.0-beta.16.tgz", + "integrity": "sha512-UXFcY11p67vG5+JWbx3DIQZrtBG2kLmAT2PQoacqU3WxM2kyBk0BXePggohlS9tPjGLSq/nCE8sL4bveJxIipA==", + "dev": true, + "dependencies": { + "@material/button": "^13.0.0", + "@material/dialog": "^13.0.0", + "@material/dom": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/drawer": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/drawer/-/drawer-6.0.0-beta.16.tgz", + "integrity": "sha512-BNWQP2ZhFU/oAC8EFxzPvLhpBknaMK0zDwY/WNvYpP0YP0eH6xlZaJoPpPxT1QYdgmXA6EvG2u4FqE+gCWI9fg==", + "dev": true, + "dependencies": { + "@material/dom": "^13.0.0", + "@material/drawer": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/fab": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/fab/-/fab-6.0.0-beta.16.tgz", + "integrity": "sha512-bv71H/EgQh8VbWokQuhio5I5mvygofJZnBRZvVdMX1YTrvDafJzbLf4A2zLycVMJmOX124at86G9t8hAAQQ4KQ==", + "dev": true, + "dependencies": { + "@material/fab": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/floating-label": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/floating-label/-/floating-label-6.0.0-beta.16.tgz", + "integrity": "sha512-9Vk7NPoWgL7r7Sk88iWfq+rW/BKL1rQ6S0rJimspsoUIgPpUQYFeBRZFaQiOMJZJrJEGisJbqdKVpsXqqnNq/w==", + "dev": true, + "dependencies": { + "@material/floating-label": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/form-field": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/form-field/-/form-field-6.0.0-beta.16.tgz", + "integrity": "sha512-sNzmim4HDM07feYaqRZGy0VwNH6PuerSl6Ha5cxAFaTLN8SIzfNUEJ7iNX1eBImTlrRNHsR6VwUySXX60xUyQA==", + "dev": true, + "dependencies": { + "@material/feature-targeting": "^13.0.0", + "@material/form-field": "^13.0.0", + "@material/rtl": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/icon-button": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/icon-button/-/icon-button-6.0.0-beta.16.tgz", + "integrity": "sha512-2OwRT3smK5S5V+sI2c8URij0Z91/FVeGKZHy4V5q/GYSlaPu1WJtgFY1O/9wNYEYq0PkP4ohwq16ZiURy+rYTQ==", + "dev": true, + "dependencies": { + "@material/density": "^13.0.0", + "@material/icon-button": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/image-list": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/image-list/-/image-list-6.0.0-beta.16.tgz", + "integrity": "sha512-XBRlJxjtLfaAhWssv50ffTqEolntvNs7dE7jsXCgqS5vEtSPxCWUkGEwcRANmmrlXayV5o8Dl2WFgrs++Q2k7A==", + "dev": true, + "dependencies": { + "@material/image-list": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/layout-grid": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/layout-grid/-/layout-grid-6.0.0-beta.16.tgz", + "integrity": "sha512-xJFYyuEfRpM/SGP5B1f6EzRE+ZUhykRQWi4+PEqI/TERvMeb/9MK0vydGavAg+3Ye4b9R7nx3H2CNlsXs79q1A==", + "dev": true, + "dependencies": { + "@material/layout-grid": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/line-ripple": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/line-ripple/-/line-ripple-6.0.0-beta.16.tgz", + "integrity": "sha512-+o3lvnmpudOl4CKvCq2B99PKJHQgdLnyFqd1/x75IwhQjuV2El5yuqE+rC5hAVzo6vKqJmWME/1+bNfkPvIvaA==", + "dev": true, + "dependencies": { + "@material/line-ripple": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/linear-progress": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/linear-progress/-/linear-progress-6.0.0-beta.16.tgz", + "integrity": "sha512-lT8nSoEyCoKS3JBvxOY73hRzEhMO5lbOe51S2EKdTqV3KOaw6MODeoHt7xfo/VOkVAX4eYni1MdS5c8UEZ7MIg==", + "dev": true, + "dependencies": { + "@material/linear-progress": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/list": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/list/-/list-6.0.0-beta.16.tgz", + "integrity": "sha512-eMzbQPk9F07rxvynLalNqlrc6WwIGVJna6eotBYB2JELpSU+oB86xicgKK08d1w3TLY8zwVUmcigSEWmM843mw==", + "dev": true, + "dependencies": { + "@material/dom": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/list": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/menu": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/menu/-/menu-6.0.0-beta.16.tgz", + "integrity": "sha512-Kh4aaf217ZGBIX0ZFqK5BxdII/KoYRfsKrpQNH9wIXShKUUH4uPIbIINYCkpzcoJ2ximzmpHJC0OfHvXfkipbA==", + "dev": true, + "dependencies": { + "@material/dom": "^13.0.0", + "@material/menu": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/list": "^6.0.0-beta.16", + "@smui/menu-surface": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/menu-surface": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/menu-surface/-/menu-surface-6.0.0-beta.16.tgz", + "integrity": "sha512-a8hLHBcu6+XDgdcdcR22arjsPr1G/4cpFLToWirSYfhk2pEfK9a/gkQiNOII0LHwZlreIgo/1FeUeAClJGCqhA==", + "dev": true, + "dependencies": { + "@material/animation": "^13.0.0", + "@material/menu-surface": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/notched-outline": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/notched-outline/-/notched-outline-6.0.0-beta.16.tgz", + "integrity": "sha512-2z01cpWNhqFbNJTnXfR2sBF/icEJnDGfVE9KZwU3OLZSBeoBoXFc9opc+HGKkWt678AS50VRoOMHSkxShk5q9g==", + "dev": true, + "dependencies": { + "@material/notched-outline": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/floating-label": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/paper": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/paper/-/paper-6.0.0-beta.16.tgz", + "integrity": "sha512-b103emE4DoN6ZuZk5jHD7TbROJYGo3rsfbZlmzUG9plPcOL5rhGVkLhB8m3oWlLqLNG0vl6kJPLiHe2qYny66g==", + "dev": true, + "dependencies": { + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/radio": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/radio/-/radio-6.0.0-beta.16.tgz", + "integrity": "sha512-wuHhhaAqgj8a1RWVUHXMAk4sDcmxfkHzvfOemVm7izl5YrR+215+HconkBVPDA1e/2j37jOBeIJ/bgus2TSSWQ==", + "dev": true, + "dependencies": { + "@material/radio": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/ripple": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/ripple/-/ripple-6.0.0-beta.16.tgz", + "integrity": "sha512-9vlsFn8ZL0tpWKHmDfZPPzQzdusLNZaA3CzpJKnnMIWvlUZVixR780iHa1YXg0cEEQ2lPlSK4CFJEdiGMFRAow==", + "dev": true, + "dependencies": { + "@material/dom": "^13.0.0", + "@material/ripple": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/segmented-button": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/segmented-button/-/segmented-button-6.0.0-beta.16.tgz", + "integrity": "sha512-ezL4OxfnYgOyp5Xm8VpBBKRdeV9ihXGeIo/GX244u3MAyE4B4KUBkf565dAnRJR1YxuuS5mR0ht0jCWZCsT90g==", + "dev": true, + "dependencies": { + "@material/segmented-button": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/select": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/select/-/select-6.0.0-beta.16.tgz", + "integrity": "sha512-GexYE2oRjywdcpo3XGCbzduR13Bp9LYPnV8Guax+i4wpJlG288lem2tDWmsodnNXQTGQ+sVqICz0QLnDmPSvUQ==", + "dev": true, + "dependencies": { + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/select": "^13.0.0", + "@material/theme": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/floating-label": "^6.0.0-beta.16", + "@smui/line-ripple": "^6.0.0-beta.16", + "@smui/list": "^6.0.0-beta.16", + "@smui/menu": "^6.0.0-beta.16", + "@smui/menu-surface": "^6.0.0-beta.16", + "@smui/notched-outline": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/slider": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/slider/-/slider-6.0.0-beta.16.tgz", + "integrity": "sha512-kGrl1UCOdukMngP5R7fLDNpMBBCm6EI3+jutiLR+NT9RhmwUN5befs8edHotkWxPK1xzLN/KSezzKUFaWK4OCg==", + "dev": true, + "dependencies": { + "@material/dom": "^13.0.0", + "@material/slider": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/snackbar": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/snackbar/-/snackbar-6.0.0-beta.16.tgz", + "integrity": "sha512-px509mEoSZYa0QoVD/PyecsX9duXH0pfnhrWe1HrQ4A7NzqFBgFsbt+N7z6C84LVQYZ5GNZ2E6YVMrPMm+CvZw==", + "dev": true, + "dependencies": { + "@material/dom": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/snackbar": "^13.0.0", + "@smui/button": "^6.0.0-beta.16", + "@smui/common": "^6.0.0-beta.16", + "@smui/icon-button": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/switch": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/switch/-/switch-6.0.0-beta.16.tgz", + "integrity": "sha512-z14p7DE4ZF0D2ir+qQ3wgA3khexztSY3Z7xbNV0+yO5rIW24l2Sg/uFrZSNDfQuiIUHSf1aP9zHCPrxmm74OLA==", + "dev": true, + "dependencies": { + "@material/feature-targeting": "^13.0.0", + "@material/switch": "^13.0.0", + "@material/theme": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/tab": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/tab/-/tab-6.0.0-beta.16.tgz", + "integrity": "sha512-eizOqQcjLOOMq1bvrrF6b8QPrOYJHz9fQ2hhozk9d7HsX4fw5G4RyJ6psowd/qkG+SYaWj2EuBAs16ZAmxFHOg==", + "dev": true, + "dependencies": { + "@material/tab": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "@smui/tab-indicator": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/tab-bar": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/tab-bar/-/tab-bar-6.0.0-beta.16.tgz", + "integrity": "sha512-YCOJxlGIX8sRrvZsljy0KUowb0e0ED7XtbUVIJUldHmY6hFeFSDt6MI1QoNpNfns+7rptYbVIfx7xzSF7PVyYQ==", + "dev": true, + "dependencies": { + "@material/tab-bar": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/tab": "^6.0.0-beta.16", + "@smui/tab-scroller": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/tab-indicator": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/tab-indicator/-/tab-indicator-6.0.0-beta.16.tgz", + "integrity": "sha512-VQZQwcVItljBMUtMZCOOKCQ4FibK2MynkUVsWA0ZibvKAb4MXBZHbAnrxhVnQ2rM100HOoog6eXzHJNWrm9U+Q==", + "dev": true, + "dependencies": { + "@material/tab-indicator": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/tab-scroller": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/tab-scroller/-/tab-scroller-6.0.0-beta.16.tgz", + "integrity": "sha512-ilf4zeiIELyZcFwxBPbqckxOnoSjRk1VxHbrZJekehwiOwVkzALLdogtx6LwSdw9bg/DDzlG0nrfc/oUYF2VRA==", + "dev": true, + "dependencies": { + "@material/dom": "^13.0.0", + "@material/tab-scroller": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/textfield": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/textfield/-/textfield-6.0.0-beta.16.tgz", + "integrity": "sha512-lzW9oZ2PTuJRwtJoxxMlbElv6ZaAqT2W4tJAMs6hI8R0iotEyahcZNm8YxilOHIVLiCkeXOqd2LB4QBeq+vvVQ==", + "dev": true, + "dependencies": { + "@material/dom": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/textfield": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/floating-label": "^6.0.0-beta.16", + "@smui/line-ripple": "^6.0.0-beta.16", + "@smui/notched-outline": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/tooltip": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/tooltip/-/tooltip-6.0.0-beta.16.tgz", + "integrity": "sha512-3htoW3eGrH6a6CKlE8nSe0vsXRi2zp27N5mcsfDOe2ZP96ynQvZU60LN+s5qz5pUS8NCXlV4ffGwIFflDzepvw==", + "dev": true, + "dependencies": { + "@material/tooltip": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/top-app-bar": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/top-app-bar/-/top-app-bar-6.0.0-beta.16.tgz", + "integrity": "sha512-GkSB8RO1WJT4DowPRi+n8+LEFZHKUTHctafuOtETQ9F6Hx0PXhAUWEjMQKVyuLkZbylZmmSMaKmeQUhot/2GzA==", + "dev": true, + "dependencies": { + "@material/feature-targeting": "^13.0.0", + "@material/top-app-bar": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@smui/touch-target": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/touch-target/-/touch-target-6.0.0-beta.16.tgz", + "integrity": "sha512-dQ9ynPFhimwrTlKajxil4gdJTkzQ8g75sQjRWY60NjNY9q4z5DxGsbL1BBmUWaaq3qNIcmg568tDEj5ES2Q3Zg==", + "dev": true, + "dependencies": { + "@material/touch-target": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "node_modules/@sveltejs/kit": { + "version": "1.0.0-next.392", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.392.tgz", + "integrity": "sha512-od4rDJ/Soq0I7mda7sTbAnNKERHSDEGNa7QBpLA859xgBkwC1JnEIymYOh9dm+hMyHhB0bUoRoaur0qxKLqOOw==", + "dev": true, + "dependencies": { + "@sveltejs/vite-plugin-svelte": "^1.0.1", + "chokidar": "^3.5.3", + "sade": "^1.8.1" + }, + "bin": { + "svelte-kit": "svelte-kit.js" + }, + "engines": { + "node": ">=16.9" + }, + "peerDependencies": { + "svelte": "^3.44.0", + "vite": "^3.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.1.tgz", + "integrity": "sha512-PorCgUounn0VXcpeJu+hOweZODKmGuLHsLomwqSj+p26IwjjGffmYQfVHtiTWq+NqaUuuHWWG7vPge6UFw4Aeg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^4.2.1", + "debug": "^4.3.4", + "deepmerge": "^4.2.2", + "kleur": "^4.1.5", + "magic-string": "^0.26.2", + "svelte-hmr": "^0.14.12" + }, + "engines": { + "node": "^14.18.0 || >= 16" + }, + "peerDependencies": { + "diff-match-patch": "^1.0.5", + "svelte": "^3.44.0", + "vite": "^3.0.0" + }, + "peerDependenciesMeta": { + "diff-match-patch": { + "optional": true + } + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@tsconfig/svelte": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-3.0.0.tgz", + "integrity": "sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==", + "dev": true + }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.6.tgz", + "integrity": "sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw==", + "dev": true + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "node_modules/@types/pug": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", + "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "dev": true + }, + "node_modules/@types/sass": { + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.43.1.tgz", + "integrity": "sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/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 + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dedent-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz", + "integrity": "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.49.tgz", + "integrity": "sha512-/TlVHhOaq7Yz8N1OJrjqM3Auzo5wjvHFLk+T8pIue+fhnhIMpfAzsG6PLVMbFveVxqD2WOp3QHei+52IMUNmCw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "esbuild-android-64": "0.14.49", + "esbuild-android-arm64": "0.14.49", + "esbuild-darwin-64": "0.14.49", + "esbuild-darwin-arm64": "0.14.49", + "esbuild-freebsd-64": "0.14.49", + "esbuild-freebsd-arm64": "0.14.49", + "esbuild-linux-32": "0.14.49", + "esbuild-linux-64": "0.14.49", + "esbuild-linux-arm": "0.14.49", + "esbuild-linux-arm64": "0.14.49", + "esbuild-linux-mips64le": "0.14.49", + "esbuild-linux-ppc64le": "0.14.49", + "esbuild-linux-riscv64": "0.14.49", + "esbuild-linux-s390x": "0.14.49", + "esbuild-netbsd-64": "0.14.49", + "esbuild-openbsd-64": "0.14.49", + "esbuild-sunos-64": "0.14.49", + "esbuild-windows-32": "0.14.49", + "esbuild-windows-64": "0.14.49", + "esbuild-windows-arm64": "0.14.49" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.49.tgz", + "integrity": "sha512-vYsdOTD+yi+kquhBiFWl3tyxnj2qZJsl4tAqwhT90ktUdnyTizgle7TjNx6Ar1bN7wcwWqZ9QInfdk2WVagSww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.49.tgz", + "integrity": "sha512-g2HGr/hjOXCgSsvQZ1nK4nW/ei8JUx04Li74qub9qWrStlysaVmadRyTVuW32FGIpLQyc5sUjjZopj49eGGM2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.49.tgz", + "integrity": "sha512-3rvqnBCtX9ywso5fCHixt2GBCUsogNp9DjGmvbBohh31Ces34BVzFltMSxJpacNki96+WIcX5s/vum+ckXiLYg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.49.tgz", + "integrity": "sha512-XMaqDxO846srnGlUSJnwbijV29MTKUATmOLyQSfswbK/2X5Uv28M9tTLUJcKKxzoo9lnkYPsx2o8EJcTYwCs/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.49.tgz", + "integrity": "sha512-NJ5Q6AjV879mOHFri+5lZLTp5XsO2hQ+KSJYLbfY9DgCu8s6/Zl2prWXVANYTeCDLlrIlNNYw8y34xqyLDKOmQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.49.tgz", + "integrity": "sha512-lFLtgXnAc3eXYqj5koPlBZvEbBSOSUbWO3gyY/0+4lBdRqELyz4bAuamHvmvHW5swJYL7kngzIZw6kdu25KGOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.49.tgz", + "integrity": "sha512-zTTH4gr2Kb8u4QcOpTDVn7Z8q7QEIvFl/+vHrI3cF6XOJS7iEI1FWslTo3uofB2+mn6sIJEQD9PrNZKoAAMDiA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.49.tgz", + "integrity": "sha512-hYmzRIDzFfLrB5c1SknkxzM8LdEUOusp6M2TnuQZJLRtxTgyPnZZVtyMeCLki0wKgYPXkFsAVhi8vzo2mBNeTg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.49.tgz", + "integrity": "sha512-iE3e+ZVv1Qz1Sy0gifIsarJMQ89Rpm9mtLSRtG3AH0FPgAzQ5Z5oU6vYzhc/3gSPi2UxdCOfRhw2onXuFw/0lg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.49.tgz", + "integrity": "sha512-KLQ+WpeuY+7bxukxLz5VgkAAVQxUv67Ft4DmHIPIW+2w3ObBPQhqNoeQUHxopoW/aiOn3m99NSmSV+bs4BSsdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.49.tgz", + "integrity": "sha512-n+rGODfm8RSum5pFIqFQVQpYBw+AztL8s6o9kfx7tjfK0yIGF6tm5HlG6aRjodiiKkH2xAiIM+U4xtQVZYU4rA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.49.tgz", + "integrity": "sha512-WP9zR4HX6iCBmMFH+XHHng2LmdoIeUmBpL4aL2TR8ruzXyT4dWrJ5BSbT8iNo6THN8lod6GOmYDLq/dgZLalGw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.49.tgz", + "integrity": "sha512-h66ORBz+Dg+1KgLvzTVQEA1LX4XBd1SK0Fgbhhw4akpG/YkN8pS6OzYI/7SGENiN6ao5hETRDSkVcvU9NRtkMQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.49.tgz", + "integrity": "sha512-DhrUoFVWD+XmKO1y7e4kNCqQHPs6twz6VV6Uezl/XHYGzM60rBewBF5jlZjG0nCk5W/Xy6y1xWeopkrhFFM0sQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.49.tgz", + "integrity": "sha512-BXaUwFOfCy2T+hABtiPUIpWjAeWK9P8O41gR4Pg73hpzoygVGnj0nI3YK4SJhe52ELgtdgWP/ckIkbn2XaTxjQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.49.tgz", + "integrity": "sha512-lP06UQeLDGmVPw9Rg437Btu6J9/BmyhdoefnQ4gDEJTtJvKtQaUcOQrhjTq455ouZN4EHFH1h28WOJVANK41kA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.49.tgz", + "integrity": "sha512-4c8Zowp+V3zIWje329BeLbGh6XI9c/rqARNaj5yPHdC61pHI9UNdDxT3rePPJeWcEZVKjkiAS6AP6kiITp7FSw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.49.tgz", + "integrity": "sha512-q7Rb+J9yHTeKr9QTPDYkqfkEj8/kcKz9lOabDuvEXpXuIcosWCJgo5Z7h/L4r7rbtTH4a8U2FGKb6s1eeOHmJA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.49.tgz", + "integrity": "sha512-+Cme7Ongv0UIUTniPqfTX6mJ8Deo7VXw9xN0yJEN1lQMHDppTNmKwAM3oGbD/Vqff+07K2gN0WfNkMohmG+dVw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.49.tgz", + "integrity": "sha512-v+HYNAXzuANrCbbLFJ5nmO3m5y2PGZWLe3uloAkLt87aXiO2mZr3BTmacZdjwNkNEHuH3bNtN8cak+mzVjVPfA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/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, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "dependencies": { + "globule": "^1.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globule": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", + "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", + "dev": true, + "dependencies": { + "glob": "~7.1.1", + "lodash": "^4.17.21", + "minimatch": "~3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/globule/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globule/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", + "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minipass": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", + "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dev": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nan": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", + "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-gyp/node_modules/are-we-there-yet": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/node-gyp/node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-sass": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-7.0.1.tgz", + "integrity": "sha512-uMy+Xt29NlqKCFdFRZyXKOTqGt+QaKHexv9STj2WeLottnlqZEEWx6Bj0MXNthmFRRdM/YwyNo/8Tr46TOM0jQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "async-foreach": "^0.1.3", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "lodash": "^4.17.15", + "meow": "^9.0.0", + "nan": "^2.13.2", + "node-gyp": "^8.4.1", + "npmlog": "^5.0.0", + "request": "^2.88.0", + "sass-graph": "4.0.0", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "bin": { + "node-sass": "bin/node-sass" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/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, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/polyfill-object.fromentries": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/polyfill-object.fromentries/-/polyfill-object.fromentries-1.0.1.tgz", + "integrity": "sha512-zlEL/n2S73hX7BQXIPapzirQw4yM/VC7slrcOyfbsH0ZyUQ/lLh4NF9wshSJ354v0F3KDMC8FCxeTQ7UUPpu9g==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "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.3", + "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.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "2.77.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.0.tgz", + "integrity": "sha512-vL8xjY4yOQEw79DvyXLijhnhh+R/O9zpF/LEgkCebZFtb6ELeN9H3/2T0r8+mp+fFTBHZ5qGpOpW2ela2zRt3g==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", + "dev": true, + "dependencies": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + } + }, + "node_modules/sander/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/sander/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/sass": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.0.tgz", + "integrity": "sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/sass-graph": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-4.0.0.tgz", + "integrity": "sha512-WSO/MfXqKH7/TS8RdkCX3lVkPFQzCgbqdGsmSKq6tlPU+GpGEsa/5aW18JqItnqh+lPtcjifqdZ/VmiILkKckQ==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "lodash": "^4.17.11", + "scss-tokenizer": "^0.3.0", + "yargs": "^17.2.1" + }, + "bin": { + "sassgraph": "bin/sassgraph" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/scss-tokenizer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.3.0.tgz", + "integrity": "sha512-14Zl9GcbBvOT9057ZKjpz5yPOyUWG2ojd9D5io28wHRYsOrs7U95Q+KNL87+32p8rc+LvDpbu/i9ZYjM9Q+FsQ==", + "dev": true, + "dependencies": { + "js-base64": "^2.4.3", + "source-map": "^0.7.1" + } + }, + "node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/smui-theme": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/smui-theme/-/smui-theme-6.0.0-beta.16.tgz", + "integrity": "sha512-koh62ENvVp7ure62NUHTTaLudH1nxdL/YJt5u0rLuBSs53UPg8L8hdmcGqmTawj3h2dlD+yuHnyx8lpT1y8EWQ==", + "dev": true, + "dependencies": { + "node-fetch": "^2.6.7", + "sass": "^1.49.9", + "yargs": "^17.3.1" + }, + "bin": { + "smui-theme": "smui-theme" + } + }, + "node_modules/socks": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", + "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", + "dev": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sorcery": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", + "integrity": "sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==", + "dev": true, + "dependencies": { + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0", + "sourcemap-codec": "^1.3.0" + }, + "bin": { + "sorcery": "bin/index.js" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "dependencies": { + "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" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/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, + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/stdout-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "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" + } + }, + "node_modules/stdout-stream/node_modules/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 + }, + "node_modules/stdout-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.1", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svelte": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.49.0.tgz", + "integrity": "sha512-+lmjic1pApJWDfPCpUUTc1m8azDqYCG1JN9YEngrx/hUyIcFJo6VZhj0A1Ai0wqoHcEIuQy+e9tk+4uDgdtsFA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/svelte-check": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.8.0.tgz", + "integrity": "sha512-HRL66BxffMAZusqe5I5k26mRWQ+BobGd9Rxm3onh7ZVu0nTk8YTKJ9vu3LVPjUGLU9IX7zS+jmwPVhJYdXJ8vg==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.9", + "chokidar": "^3.4.1", + "fast-glob": "^3.2.7", + "import-fresh": "^3.2.1", + "picocolors": "^1.0.0", + "sade": "^1.7.4", + "svelte-preprocess": "^4.0.0", + "typescript": "*" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "peerDependencies": { + "svelte": "^3.24.0" + } + }, + "node_modules/svelte-hmr": { + "version": "0.14.12", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.14.12.tgz", + "integrity": "sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==", + "dev": true, + "engines": { + "node": "^12.20 || ^14.13.1 || >= 16" + }, + "peerDependencies": { + "svelte": ">=3.19.0" + } + }, + "node_modules/svelte-icon": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/svelte-icon/-/svelte-icon-1.2.4.tgz", + "integrity": "sha512-fDdTKQAaWUFRRR1f4l65ynXdoAcsR8ikL8G9hOh7gGrjlx/44Ka6flEJHR5mCKoAN/A11n8pd96QcKZpxvmbIQ==", + "dev": true + }, + "node_modules/svelte-material-ui": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/svelte-material-ui/-/svelte-material-ui-6.0.0-beta.16.tgz", + "integrity": "sha512-lztDBPv6+/Xhdlf7sxdrYAbo+1N+TwXTbhncl00FF7mU05ZWhhmtDtqMUeMLEX8x956XSV8TT1J1bywRjbSdtQ==", + "dev": true, + "dependencies": { + "@smui-extra/accordion": "^6.0.0-beta.16", + "@smui-extra/autocomplete": "^6.0.0-beta.16", + "@smui-extra/badge": "^6.0.0-beta.16", + "@smui/banner": "^6.0.0-beta.16", + "@smui/button": "^6.0.0-beta.16", + "@smui/card": "^6.0.0-beta.16", + "@smui/checkbox": "^6.0.0-beta.16", + "@smui/chips": "^6.0.0-beta.16", + "@smui/circular-progress": "^6.0.0-beta.16", + "@smui/common": "^6.0.0-beta.16", + "@smui/data-table": "^6.0.0-beta.16", + "@smui/dialog": "^6.0.0-beta.16", + "@smui/drawer": "^6.0.0-beta.16", + "@smui/fab": "^6.0.0-beta.16", + "@smui/floating-label": "^6.0.0-beta.16", + "@smui/form-field": "^6.0.0-beta.16", + "@smui/icon-button": "^6.0.0-beta.16", + "@smui/image-list": "^6.0.0-beta.16", + "@smui/layout-grid": "^6.0.0-beta.16", + "@smui/line-ripple": "^6.0.0-beta.16", + "@smui/linear-progress": "^6.0.0-beta.16", + "@smui/list": "^6.0.0-beta.16", + "@smui/menu": "^6.0.0-beta.16", + "@smui/menu-surface": "^6.0.0-beta.16", + "@smui/notched-outline": "^6.0.0-beta.16", + "@smui/paper": "^6.0.0-beta.16", + "@smui/radio": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "@smui/segmented-button": "^6.0.0-beta.16", + "@smui/select": "^6.0.0-beta.16", + "@smui/slider": "^6.0.0-beta.16", + "@smui/snackbar": "^6.0.0-beta.16", + "@smui/switch": "^6.0.0-beta.16", + "@smui/tab": "^6.0.0-beta.16", + "@smui/tab-bar": "^6.0.0-beta.16", + "@smui/tab-indicator": "^6.0.0-beta.16", + "@smui/tab-scroller": "^6.0.0-beta.16", + "@smui/textfield": "^6.0.0-beta.16", + "@smui/tooltip": "^6.0.0-beta.16", + "@smui/top-app-bar": "^6.0.0-beta.16", + "@smui/touch-target": "^6.0.0-beta.16" + } + }, + "node_modules/svelte-preprocess": { + "version": "4.10.7", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz", + "integrity": "sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@types/pug": "^2.0.4", + "@types/sass": "^1.16.0", + "detect-indent": "^6.0.0", + "magic-string": "^0.25.7", + "sorcery": "^0.10.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">= 9.11.2" + }, + "peerDependencies": { + "@babel/core": "^7.10.2", + "coffeescript": "^2.5.1", + "less": "^3.11.3 || ^4.0.0", + "postcss": "^7 || ^8", + "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", + "pug": "^3.0.0", + "sass": "^1.26.8", + "stylus": "^0.55.0", + "sugarss": "^2.0.0", + "svelte": "^3.23.0", + "typescript": "^3.9.5 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "coffeescript": { + "optional": true + }, + "less": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "postcss": { + "optional": true + }, + "postcss-load-config": { + "optional": true + }, + "pug": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/svelte-preprocess/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/svelte-tiny-virtual-list": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/svelte-tiny-virtual-list/-/svelte-tiny-virtual-list-2.0.5.tgz", + "integrity": "sha512-xg9ckb8UeeIme4/5qlwCrl2QNmUZ8SCQYZn3Ji83cUsoASqRNy3KWjpmNmzYvPDqCHSZjruBBsoB7t5hwuzw5g==", + "dev": true + }, + "node_modules/svelte2tsx": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.12.tgz", + "integrity": "sha512-43ayMivmh1IDCgb+4YDf54YuOJZGCUKFpp37RbfjGgNU+Pmb9HhP+zRXa1pMh4mwSTBfqZS0FbJZP3Q8CSxvvg==", + "dev": true, + "dependencies": { + "dedent-js": "^1.0.1", + "pascal-case": "^3.1.1" + }, + "peerDependencies": { + "svelte": "^3.24", + "typescript": "^4.1.2" + } + }, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "glob": "^7.1.2" + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/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, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vite": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.0.2.tgz", + "integrity": "sha512-TAqydxW/w0U5AoL5AsD9DApTvGb2iNbGs3sN4u2VdT1GFkQVUfgUldt+t08TZgi23uIauh1TUOQJALduo9GXqw==", + "dev": true, + "dependencies": { + "esbuild": "^0.14.47", + "postcss": "^8.4.14", + "resolve": "^1.22.1", + "rollup": "^2.75.6" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "less": "*", + "sass": "*", + "stylus": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "dev": true, + "engines": { + "node": ">=12" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.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.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "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" + } + } + } + }, + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@material/animation": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-13.0.0.tgz", + "integrity": "sha512-YR0/u4u56qXDjKYolQ7F+IvlPkaSBhMl/dZv8DK0FbD6PH4ckOPd3bEXNRndXtprsxwknQQP2pttjPImylkl0g==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/banner": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/banner/-/banner-13.0.0.tgz", + "integrity": "sha512-59M85ezhwRaa+BqguYCCaRS57fV5KQe3Ff2cU6LcQNw0UPMFW1ap0dZ+iZBv/sj+7/QcqBBShL9uu8dWKtI4Gg==", + "dev": true, + "requires": { + "@material/base": "^13.0.0", + "@material/button": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/tokens": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/base": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-13.0.0.tgz", + "integrity": "sha512-vFx0JryRfcvUNX3cZ2u32wUMvxzd+c/YW0LFOXNgqCDWlubHcMm0Y6Wz371LhfQo80/NE69u+/4Joo99yKnVeg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/button": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/button/-/button-13.0.0.tgz", + "integrity": "sha512-lYorht6fcEd4P+dsLVp2BGtaY5cGYNp71LMajuDe71GZX3dZPoKeVvb+Ie1S7vcB+o+WLTeaisMk9/vA4gfi8A==", + "dev": true, + "requires": { + "@material/density": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/tokens": "^13.0.0", + "@material/touch-target": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/card": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/card/-/card-13.0.0.tgz", + "integrity": "sha512-ooJUOt1Viv99Dyz4rhz9ZZbfa996eHh3RUuXkPRkT66Btd5TzpdqsQWKwOVc5bgbgWqzhDWQ6A/aQdYqH97ccg==", + "dev": true, + "requires": { + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/checkbox": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-13.0.0.tgz", + "integrity": "sha512-tRC6n9Jq7GgdU0d1F8NOvUy6WiRZR58tUgL1QqoiQK9PGKSt0dAF3Aa48uubO7/Lt9K4NqgwV6/OeHv8pHaM/w==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/density": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/touch-target": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/chips": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/chips/-/chips-13.0.0.tgz", + "integrity": "sha512-Ov4runDbrROUpMqKyCi3lpknfrLzGwtV+/rfYIgTYUkEVpCHXHddxXxcjP4zqh3QLXnE6ma92PLGcxCb/zzogQ==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/checkbox": "^13.0.0", + "@material/density": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/tokens": "^13.0.0", + "@material/touch-target": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/circular-progress": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-13.0.0.tgz", + "integrity": "sha512-jSbr0ywY2N6s05tyqTXl/cG339C+qU3ck3FwXUq5SJup8CWT0AoJ8EG/CD10CEhNH8nH9Iwstve95oNgIt8G4g==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/progress-indicator": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/data-table": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-13.0.0.tgz", + "integrity": "sha512-Z3yEq1T6Om/A3ntPw0bd40dqtOR4H3++pvchgW35kq+V9xDLL0hfzmuiy0QH4plA2ZsFYJxjt02k/SRvnkjKPQ==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/checkbox": "^13.0.0", + "@material/density": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/icon-button": "^13.0.0", + "@material/linear-progress": "^13.0.0", + "@material/list": "^13.0.0", + "@material/menu": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/select": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/touch-target": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/density": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/density/-/density-13.0.0.tgz", + "integrity": "sha512-ppJTzOsuhjQam5GvHaq/XZocZNUr+41XQ2sd5nONAmQ0wwzXgqG0FaxtF1EXqK3uZFadz+vAu6enagre9DXhTA==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/dialog": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-13.0.0.tgz", + "integrity": "sha512-1Ggo9Bid94F1ttZJKSjIcgMvkVQtKsqwbqLs5cWlleaiwtAcwUE12XA2B1MNj8xM9ajU3BJm4GigupBOK1jGHQ==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/button": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/icon-button": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/tokens": "^13.0.0", + "@material/touch-target": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/dom": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-13.0.0.tgz", + "integrity": "sha512-M9HLAYBZtkTUvf66FL+jAEvUOdhji1HkGA1mV6oyE+HY9gkCkmso+mngvzlLd5+uaAVE9I3WQFhSb9gp0cpXnw==", + "dev": true, + "requires": { + "@material/feature-targeting": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/drawer": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-13.0.0.tgz", + "integrity": "sha512-TIV/K9MED3ymngmKrdLwOMhUF44BzoR6HuTVsZAM4bgy0sfSv+jzgaGUqJsvjEhTXk+Q9OTEge+TsU/ETzQCbg==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/list": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/elevation": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-13.0.0.tgz", + "integrity": "sha512-hzdblgamVRbC0UwKafcvUVDvKzMiOSveDiwGgFk+EAg/tZRdwMlQPyf/9I6Lr8Cw/pNGnEOPhmCDOYPOHimr0w==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/fab": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/fab/-/fab-13.0.0.tgz", + "integrity": "sha512-qOi+XWEZWUR5T961UjSorgqm5VaanuZtRN3nsrKqHH1p0L8fYRc3qkGIChlaY9p7BcOYMCynXJzT+MfELVrcwA==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/tokens": "^13.0.0", + "@material/touch-target": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/feature-targeting": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-13.0.0.tgz", + "integrity": "sha512-QJClfeaA4EMyAxKJy9WR0Nx+/VwSZCkhGLUVBG9NhxqYGfl/LtaeaidrNm32vYEoNZAofN92VD2RwQTRwp/dMQ==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/floating-label": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-13.0.0.tgz", + "integrity": "sha512-imAPamD97QrizVCOpxjr3UfQJyDBpEEhDBSbEbKLrCpqG3jQx4/My5rNKKVGWjxUiBYgBA1dhkn98RRX5tGBtQ==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/form-field": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-13.0.0.tgz", + "integrity": "sha512-cXs5uYA89KgrXrU1UYkl52JizeIK3Mx9LjBw4ZYiyQJzFaBTPYsYWGSJMad1HZhWlRiigGTyN1M9ePIxtBpi0Q==", + "dev": true, + "requires": { + "@material/base": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/icon-button": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-13.0.0.tgz", + "integrity": "sha512-SdxFytWvbfN0fj7jHFq3DqK5/Zoms+Ipuv6fI8AzwgDFe7mXJ2euPahN+3XcmJ3BaSMyfYsdbcYdCWs8bgHW1w==", + "dev": true, + "requires": { + "@material/base": "^13.0.0", + "@material/density": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/touch-target": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/image-list": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-13.0.0.tgz", + "integrity": "sha512-D78QKpK5JmO6zrbsSYt1YfRlkqzzduDTe6BstS0efUFS1CA11hrqwQFoMaR1L1dw2U3CQ/CP22bBMSZVV9aU6A==", + "dev": true, + "requires": { + "@material/feature-targeting": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/layout-grid": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-13.0.0.tgz", + "integrity": "sha512-9L1BVLRIyetm/AOC+59+yca6R0OO2AJKHiUMdZrxgUVjqVblqWXEMeONZqslFRGHBiSIaYdrDIhn4ZTYY6tKUA==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/line-ripple": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-13.0.0.tgz", + "integrity": "sha512-5djBRXrd1+SiMVUTWr4rD6xv+/qTaGGmgUS5GytBE5mczvnEwcPmM4PzF+HNj2TS+wvNvIfRjRmUzWO2Z6w2lA==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/linear-progress": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-13.0.0.tgz", + "integrity": "sha512-FJpP6flSME5QRPfkB616uA5bk9aMKJBqkklrHk6dSMZaTKbiHRmc6faxMIZ4w9W49JFMXaSwzC39y96tQTiRQg==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/progress-indicator": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/list": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/list/-/list-13.0.0.tgz", + "integrity": "sha512-poq4WNDEfW6Z3YPAn3wdBX4RSkj3A83Pht6984MmG8YJZMlq34ftHECw37VcdmFJIyRPdpZqywJo/i7CxsSAgQ==", + "dev": true, + "requires": { + "@material/base": "^13.0.0", + "@material/density": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/menu": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/menu/-/menu-13.0.0.tgz", + "integrity": "sha512-RY9R2ubYU6a7WRJW3nWr/AoSzdrxwUGqkfJSx0U9M/wK1vbXYYcJ7eCXFzSpa5VrstE7of7PbyYtQ8V61tILEQ==", + "dev": true, + "requires": { + "@material/base": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/list": "^13.0.0", + "@material/menu-surface": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/menu-surface": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-13.0.0.tgz", + "integrity": "sha512-Irfnk0l8AO7z8ucilbBzZI8izbFV/aK1GbiPpT1SmZuKkL1z+04rB2HpB+OqwaBixdLTDq70AyawcnQ0MACeXQ==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/notched-outline": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-13.0.0.tgz", + "integrity": "sha512-BHdxr1x2AN4oqycTNg0FGisG3rMHf50z3MuyUoQsJJ3WGjxBMWKd0yK/xl4m38nFKPg1vQnzyHIYTJdRpCaE7A==", + "dev": true, + "requires": { + "@material/base": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/floating-label": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/progress-indicator": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-13.0.0.tgz", + "integrity": "sha512-IfhAMn03gWg/Rl0Bg26Q1g+DrMnaULllz+ZJeIY7BXZC5qFYq1fLq4+RiQmfPGlJfURUjrWNLcI1VDVyXUHHzg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/radio": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/radio/-/radio-13.0.0.tgz", + "integrity": "sha512-6jeZ+dKSzBB/j2IZ7RjFl5mrB+EWnpv/x+U9w6ENLCdueM4+LKUqBAc2fC2WMycsqgoFnlB0xsO/sG+kN0J6fw==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/density": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/touch-target": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/ripple": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-13.0.0.tgz", + "integrity": "sha512-hx4B40hB2rRfsGwf1jwo2GGlYDq0yUQjcMcMmXfQipPJNpQhy8ylmXKc1DBjmWf7EQ/MgbfCSYwPrYXrbGP31w==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/rtl": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-13.0.0.tgz", + "integrity": "sha512-nFGy3iQg7k+xLs67eb86mRFVLwa0yi7MusqRK4OM8DXcLO5yoVfUTPKpdSykcbRryp9imVHsxutox2tZawR4og==", + "dev": true, + "requires": { + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/segmented-button": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/segmented-button/-/segmented-button-13.0.0.tgz", + "integrity": "sha512-cbjSzkGms+MB6e7ZF6Toc0kpIor4qFm3ueY8KGRIbpvPoJuHfDy6wqIUhwpfAibSpcaDSnCKg1m+hEtyplZPkQ==", + "dev": true, + "requires": { + "@material/base": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/touch-target": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/select": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/select/-/select-13.0.0.tgz", + "integrity": "sha512-wVprsSMicU/l+LAqXdOU+qdzzdHupLXpWWQo2Rsk8G6AxL1Zna+/+ETnRlDdr2wHHK/KNDXSBdmuCcoEIRshcA==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/density": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/floating-label": "^13.0.0", + "@material/line-ripple": "^13.0.0", + "@material/list": "^13.0.0", + "@material/menu": "^13.0.0", + "@material/menu-surface": "^13.0.0", + "@material/notched-outline": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/shape": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-13.0.0.tgz", + "integrity": "sha512-exk96+iCjzCujk3aSrvIMhmW773s1Tc0h+MbQKbt6Iv3nHJCyLSiRbxclCHXWHrVwG/9KZRkrt/g2qk7P3VRBg==", + "dev": true, + "requires": { + "@material/feature-targeting": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/slider": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/slider/-/slider-13.0.0.tgz", + "integrity": "sha512-PW+3X9MiOoWmXhirYo/Mk2UYW00Tnsihrx5YJQ4+IxwbrUI75/8yUsO8kVr7YC+Eqhldz8oXzhIXglQFtbpolQ==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/snackbar": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-13.0.0.tgz", + "integrity": "sha512-z59aYCeMWWEbsUU04QDZN4CxzCCOp3OIc5tzrdqnY3qRq4wwApxncf7RKKKSU2K6WTEWfdHHOc7aNX8kqlDmUg==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/button": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/icon-button": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/switch": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/switch/-/switch-13.0.0.tgz", + "integrity": "sha512-zbdo6nKEOAx24ILCBobZlQqU2WZ+KuPgdAc1VTI1q1BCKN3rDIfm9RnsCuYiZa9iaq4UUgdYuhH8KVEYGP7Lrw==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/density": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/tokens": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/tab": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/tab/-/tab-13.0.0.tgz", + "integrity": "sha512-7tziMFiyiFZner39h6ue6A6rfJhz8LDyeVPYfdAMe8ZO8GT+PczDr5yuectamR8fNBE7Fk9Bj/KvIOx+LjKgDg==", + "dev": true, + "requires": { + "@material/base": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/tab-indicator": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/tab-bar": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-13.0.0.tgz", + "integrity": "sha512-GLODDvwKiN867weT+WiSR/4Oum2hw0Ipl1vcJxtZeE6C3PmGWBE316j8a5DLYvf9bjIPLYLNLUzLU3QnJB6T5w==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/density": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/tab": "^13.0.0", + "@material/tab-indicator": "^13.0.0", + "@material/tab-scroller": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/tab-indicator": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-13.0.0.tgz", + "integrity": "sha512-T6Q4zCdl374rQgNLrAIc8+sy8ax6fbNTZRb+oJgShzjVz4wH9OLk6LX1RREHEeWiZt69nTqeR4yU6/6xFX+Kjw==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/tab-scroller": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-13.0.0.tgz", + "integrity": "sha512-SHdNXTLrNA47RbTNOQa67DbQjw0qrf1h0OuoESXHMU/B7QQvhAOqnHpU32/LdCP+gvc7EdZjolVQgk3WphDcQA==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/tab": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/textfield": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-13.0.0.tgz", + "integrity": "sha512-CzodrOqx8wzj2AQngMpISURJID4jVOHf4CtiPoj32LG8bWLn5ZfAAX2aA2rO6NPyDYsFm0aEnlfMhnDwQyPoYw==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/density": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/floating-label": "^13.0.0", + "@material/line-ripple": "^13.0.0", + "@material/notched-outline": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/theme": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-13.0.0.tgz", + "integrity": "sha512-KAe1s0MvvfCGAwJliDVTvgAKuD3ESwhl7F7br4Iam4IPdqME2rWl8NPhKHFfaWqTG7PyCgMMngYEYuA8cLNTsA==", + "dev": true, + "requires": { + "@material/feature-targeting": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/tokens": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-13.0.0.tgz", + "integrity": "sha512-t55CKVeAjABdSQCKjsvYvqrA6Z4f5varLpLloai8ZQU0giSl7qbUczV1i8y2pSOzpRTswD5JKM7a19qfsl/TCA==", + "dev": true, + "requires": { + "@material/elevation": "^13.0.0" + } + }, + "@material/tooltip": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/tooltip/-/tooltip-13.0.0.tgz", + "integrity": "sha512-/QinwEM0sYtRUthgOy7R+V4iwLMZ8SCd8A3PyGyTr27BUGWykwAUFdXyzT4rxLhDNcnDOYH14N+Z3Bom+UwO9Q==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/top-app-bar": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-13.0.0.tgz", + "integrity": "sha512-NTbIbBmoo4wfbBwW+9XMmjYQJ3e7NJ9P/ahTszYuzYDyWNcc3m8G/A0zM+1LBmoze3rP/QTxcaJUH/A5/3ufXA==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/base": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/touch-target": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-13.0.0.tgz", + "integrity": "sha512-2BMjj+nwKIYG7cZZGcNuRSKo53knqDu9ksv9wLidxjLgzqXBd1v9gdXsqMRQXepoOqftWGmYMaRYI0xMnxt6lA==", + "dev": true, + "requires": { + "@material/base": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/rtl": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@material/typography": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@material/typography/-/typography-13.0.0.tgz", + "integrity": "sha512-UfaK4vT3LmGiiySf2RVIrf7fJZa6EJadFwo4YUMJx9bvUMRlBm1oI8Vo9fYpKdLfuSTeA+2BlgbwYVObj3laFw==", + "dev": true, + "requires": { + "@material/feature-targeting": "^13.0.0", + "@material/theme": "^13.0.0", + "tslib": "^2.1.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "requires": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + } + }, + "@smui-extra/accordion": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui-extra/accordion/-/accordion-6.0.0-beta.16.tgz", + "integrity": "sha512-p1gBhIyg3a8EXZWOsDPKURneqIssWsg5g72bp+TYvRWqN/e1X2CPnpiYwxWivl+k8A0h2u3rRvQiQnD08R0TlA==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/paper": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui-extra/autocomplete": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui-extra/autocomplete/-/autocomplete-6.0.0-beta.16.tgz", + "integrity": "sha512-ENmfOy4SNj68tDYNjCmwkDIU/dDWu3X7YghcrFkxsJdNinvlzwKnX1dvRvFc9Ov8V2n8V6oNQZsw7f9yhGcOBQ==", + "dev": true, + "requires": { + "@smui/common": "^6.0.0-beta.16", + "@smui/list": "^6.0.0-beta.16", + "@smui/menu": "^6.0.0-beta.16", + "@smui/menu-surface": "^6.0.0-beta.16", + "@smui/textfield": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui-extra/badge": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui-extra/badge/-/badge-6.0.0-beta.16.tgz", + "integrity": "sha512-yVm90zodAY/9o3u0rE3KuNoegciVv+InV0gVAwJYEFRvjjsamwCUf853pvfaKqMksdT+dsReIAycrw/4Zdv3fQ==", + "dev": true, + "requires": { + "@material/feature-targeting": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/banner": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/banner/-/banner-6.0.0-beta.16.tgz", + "integrity": "sha512-XF+NcRo4lF0iJcMKAC6eoUO//8/SHHB8yWK70EA5xCps469bgB/9s5+1wi3HdRCdddqI8LBFHYpzDj3KJ9D3RA==", + "dev": true, + "requires": { + "@material/banner": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/button": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/button/-/button-6.0.0-beta.16.tgz", + "integrity": "sha512-+sBnqo8PlbvV7R3sHUOu+/y2xqiDwcpjLkW7BVvbK0r3Rit87yKCb5Octa0DnnTmNh9W6bHGe162v760drcSfw==", + "dev": true, + "requires": { + "@material/button": "^13.0.0", + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/theme": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/card": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/card/-/card-6.0.0-beta.16.tgz", + "integrity": "sha512-QCFM7EuM0mH0hxzRbFbforgGFP9q8SLLUHIqW4D17QA5EYiVAuGrputlT4Zx8ujTDSs7/Glax+qCSL3WnF2L3g==", + "dev": true, + "requires": { + "@material/card": "^13.0.0", + "@smui/button": "^6.0.0-beta.16", + "@smui/common": "^6.0.0-beta.16", + "@smui/icon-button": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/checkbox": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/checkbox/-/checkbox-6.0.0-beta.16.tgz", + "integrity": "sha512-gasHsQjgpPoYfOPl7hCibBiv6PWG8I1VzRrdmSQMbv9H0HI2Nn8Oo3DpYCnAUd6z4JhVk6UWCzqaO+La/tUAHw==", + "dev": true, + "requires": { + "@material/checkbox": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/chips": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/chips/-/chips-6.0.0-beta.16.tgz", + "integrity": "sha512-mfkVFAna0qsyYcyKL8LuqGxIteclKDm4PJ+yXUUk3VbsUcKFFf6FZqvM0xsjZt4QIKkrnDaALtCOviheHQNH7A==", + "dev": true, + "requires": { + "@material/chips": "^13.0.0", + "@material/dom": "^13.0.0", + "@material/rtl": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/circular-progress": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/circular-progress/-/circular-progress-6.0.0-beta.16.tgz", + "integrity": "sha512-d4iLP6pZFB2hbXA04ykBI8fAOHRd8kdvEZnPbFDbyV97BqXVuuQP+TMlqL0a/NppDD9gaC09ZWnGaijlpEAfHg==", + "dev": true, + "requires": { + "@material/circular-progress": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/common": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/common/-/common-6.0.0-beta.16.tgz", + "integrity": "sha512-Ual6505AOP75T+IneOQ6e1tnlhDflJX+yxa9T8Hx5X00MOiULvWACg/RW3c8UEQAc96YnEsA3utv5qDy8tZpmg==", + "dev": true, + "requires": { + "@material/dom": "^13.0.0", + "@tsconfig/svelte": "^3.0.0", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/data-table": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/data-table/-/data-table-6.0.0-beta.16.tgz", + "integrity": "sha512-nNHIGbGMviTDGivOeaIwV6RnP/Lq7XZqs72gmX40ncLYIu1c//HNhIrcL3qbF+Ne/8gq7cuuKC4F26VUPEPD0g==", + "dev": true, + "requires": { + "@material/data-table": "^13.0.0", + "@material/dom": "^13.0.0", + "@smui/checkbox": "^6.0.0-beta.16", + "@smui/common": "^6.0.0-beta.16", + "@smui/icon-button": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "@smui/select": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/dialog": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/dialog/-/dialog-6.0.0-beta.16.tgz", + "integrity": "sha512-UXFcY11p67vG5+JWbx3DIQZrtBG2kLmAT2PQoacqU3WxM2kyBk0BXePggohlS9tPjGLSq/nCE8sL4bveJxIipA==", + "dev": true, + "requires": { + "@material/button": "^13.0.0", + "@material/dialog": "^13.0.0", + "@material/dom": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/drawer": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/drawer/-/drawer-6.0.0-beta.16.tgz", + "integrity": "sha512-BNWQP2ZhFU/oAC8EFxzPvLhpBknaMK0zDwY/WNvYpP0YP0eH6xlZaJoPpPxT1QYdgmXA6EvG2u4FqE+gCWI9fg==", + "dev": true, + "requires": { + "@material/dom": "^13.0.0", + "@material/drawer": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/fab": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/fab/-/fab-6.0.0-beta.16.tgz", + "integrity": "sha512-bv71H/EgQh8VbWokQuhio5I5mvygofJZnBRZvVdMX1YTrvDafJzbLf4A2zLycVMJmOX124at86G9t8hAAQQ4KQ==", + "dev": true, + "requires": { + "@material/fab": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/floating-label": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/floating-label/-/floating-label-6.0.0-beta.16.tgz", + "integrity": "sha512-9Vk7NPoWgL7r7Sk88iWfq+rW/BKL1rQ6S0rJimspsoUIgPpUQYFeBRZFaQiOMJZJrJEGisJbqdKVpsXqqnNq/w==", + "dev": true, + "requires": { + "@material/floating-label": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/form-field": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/form-field/-/form-field-6.0.0-beta.16.tgz", + "integrity": "sha512-sNzmim4HDM07feYaqRZGy0VwNH6PuerSl6Ha5cxAFaTLN8SIzfNUEJ7iNX1eBImTlrRNHsR6VwUySXX60xUyQA==", + "dev": true, + "requires": { + "@material/feature-targeting": "^13.0.0", + "@material/form-field": "^13.0.0", + "@material/rtl": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/icon-button": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/icon-button/-/icon-button-6.0.0-beta.16.tgz", + "integrity": "sha512-2OwRT3smK5S5V+sI2c8URij0Z91/FVeGKZHy4V5q/GYSlaPu1WJtgFY1O/9wNYEYq0PkP4ohwq16ZiURy+rYTQ==", + "dev": true, + "requires": { + "@material/density": "^13.0.0", + "@material/icon-button": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/image-list": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/image-list/-/image-list-6.0.0-beta.16.tgz", + "integrity": "sha512-XBRlJxjtLfaAhWssv50ffTqEolntvNs7dE7jsXCgqS5vEtSPxCWUkGEwcRANmmrlXayV5o8Dl2WFgrs++Q2k7A==", + "dev": true, + "requires": { + "@material/image-list": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/layout-grid": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/layout-grid/-/layout-grid-6.0.0-beta.16.tgz", + "integrity": "sha512-xJFYyuEfRpM/SGP5B1f6EzRE+ZUhykRQWi4+PEqI/TERvMeb/9MK0vydGavAg+3Ye4b9R7nx3H2CNlsXs79q1A==", + "dev": true, + "requires": { + "@material/layout-grid": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/line-ripple": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/line-ripple/-/line-ripple-6.0.0-beta.16.tgz", + "integrity": "sha512-+o3lvnmpudOl4CKvCq2B99PKJHQgdLnyFqd1/x75IwhQjuV2El5yuqE+rC5hAVzo6vKqJmWME/1+bNfkPvIvaA==", + "dev": true, + "requires": { + "@material/line-ripple": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/linear-progress": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/linear-progress/-/linear-progress-6.0.0-beta.16.tgz", + "integrity": "sha512-lT8nSoEyCoKS3JBvxOY73hRzEhMO5lbOe51S2EKdTqV3KOaw6MODeoHt7xfo/VOkVAX4eYni1MdS5c8UEZ7MIg==", + "dev": true, + "requires": { + "@material/linear-progress": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/list": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/list/-/list-6.0.0-beta.16.tgz", + "integrity": "sha512-eMzbQPk9F07rxvynLalNqlrc6WwIGVJna6eotBYB2JELpSU+oB86xicgKK08d1w3TLY8zwVUmcigSEWmM843mw==", + "dev": true, + "requires": { + "@material/dom": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/list": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/menu": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/menu/-/menu-6.0.0-beta.16.tgz", + "integrity": "sha512-Kh4aaf217ZGBIX0ZFqK5BxdII/KoYRfsKrpQNH9wIXShKUUH4uPIbIINYCkpzcoJ2ximzmpHJC0OfHvXfkipbA==", + "dev": true, + "requires": { + "@material/dom": "^13.0.0", + "@material/menu": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/list": "^6.0.0-beta.16", + "@smui/menu-surface": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/menu-surface": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/menu-surface/-/menu-surface-6.0.0-beta.16.tgz", + "integrity": "sha512-a8hLHBcu6+XDgdcdcR22arjsPr1G/4cpFLToWirSYfhk2pEfK9a/gkQiNOII0LHwZlreIgo/1FeUeAClJGCqhA==", + "dev": true, + "requires": { + "@material/animation": "^13.0.0", + "@material/menu-surface": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/notched-outline": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/notched-outline/-/notched-outline-6.0.0-beta.16.tgz", + "integrity": "sha512-2z01cpWNhqFbNJTnXfR2sBF/icEJnDGfVE9KZwU3OLZSBeoBoXFc9opc+HGKkWt678AS50VRoOMHSkxShk5q9g==", + "dev": true, + "requires": { + "@material/notched-outline": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/floating-label": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/paper": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/paper/-/paper-6.0.0-beta.16.tgz", + "integrity": "sha512-b103emE4DoN6ZuZk5jHD7TbROJYGo3rsfbZlmzUG9plPcOL5rhGVkLhB8m3oWlLqLNG0vl6kJPLiHe2qYny66g==", + "dev": true, + "requires": { + "@material/elevation": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/shape": "^13.0.0", + "@material/theme": "^13.0.0", + "@material/typography": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/radio": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/radio/-/radio-6.0.0-beta.16.tgz", + "integrity": "sha512-wuHhhaAqgj8a1RWVUHXMAk4sDcmxfkHzvfOemVm7izl5YrR+215+HconkBVPDA1e/2j37jOBeIJ/bgus2TSSWQ==", + "dev": true, + "requires": { + "@material/radio": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/ripple": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/ripple/-/ripple-6.0.0-beta.16.tgz", + "integrity": "sha512-9vlsFn8ZL0tpWKHmDfZPPzQzdusLNZaA3CzpJKnnMIWvlUZVixR780iHa1YXg0cEEQ2lPlSK4CFJEdiGMFRAow==", + "dev": true, + "requires": { + "@material/dom": "^13.0.0", + "@material/ripple": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/segmented-button": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/segmented-button/-/segmented-button-6.0.0-beta.16.tgz", + "integrity": "sha512-ezL4OxfnYgOyp5Xm8VpBBKRdeV9ihXGeIo/GX244u3MAyE4B4KUBkf565dAnRJR1YxuuS5mR0ht0jCWZCsT90g==", + "dev": true, + "requires": { + "@material/segmented-button": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/select": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/select/-/select-6.0.0-beta.16.tgz", + "integrity": "sha512-GexYE2oRjywdcpo3XGCbzduR13Bp9LYPnV8Guax+i4wpJlG288lem2tDWmsodnNXQTGQ+sVqICz0QLnDmPSvUQ==", + "dev": true, + "requires": { + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/select": "^13.0.0", + "@material/theme": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/floating-label": "^6.0.0-beta.16", + "@smui/line-ripple": "^6.0.0-beta.16", + "@smui/list": "^6.0.0-beta.16", + "@smui/menu": "^6.0.0-beta.16", + "@smui/menu-surface": "^6.0.0-beta.16", + "@smui/notched-outline": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/slider": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/slider/-/slider-6.0.0-beta.16.tgz", + "integrity": "sha512-kGrl1UCOdukMngP5R7fLDNpMBBCm6EI3+jutiLR+NT9RhmwUN5befs8edHotkWxPK1xzLN/KSezzKUFaWK4OCg==", + "dev": true, + "requires": { + "@material/dom": "^13.0.0", + "@material/slider": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/snackbar": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/snackbar/-/snackbar-6.0.0-beta.16.tgz", + "integrity": "sha512-px509mEoSZYa0QoVD/PyecsX9duXH0pfnhrWe1HrQ4A7NzqFBgFsbt+N7z6C84LVQYZ5GNZ2E6YVMrPMm+CvZw==", + "dev": true, + "requires": { + "@material/dom": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/snackbar": "^13.0.0", + "@smui/button": "^6.0.0-beta.16", + "@smui/common": "^6.0.0-beta.16", + "@smui/icon-button": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/switch": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/switch/-/switch-6.0.0-beta.16.tgz", + "integrity": "sha512-z14p7DE4ZF0D2ir+qQ3wgA3khexztSY3Z7xbNV0+yO5rIW24l2Sg/uFrZSNDfQuiIUHSf1aP9zHCPrxmm74OLA==", + "dev": true, + "requires": { + "@material/feature-targeting": "^13.0.0", + "@material/switch": "^13.0.0", + "@material/theme": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/tab": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/tab/-/tab-6.0.0-beta.16.tgz", + "integrity": "sha512-eizOqQcjLOOMq1bvrrF6b8QPrOYJHz9fQ2hhozk9d7HsX4fw5G4RyJ6psowd/qkG+SYaWj2EuBAs16ZAmxFHOg==", + "dev": true, + "requires": { + "@material/tab": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "@smui/tab-indicator": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/tab-bar": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/tab-bar/-/tab-bar-6.0.0-beta.16.tgz", + "integrity": "sha512-YCOJxlGIX8sRrvZsljy0KUowb0e0ED7XtbUVIJUldHmY6hFeFSDt6MI1QoNpNfns+7rptYbVIfx7xzSF7PVyYQ==", + "dev": true, + "requires": { + "@material/tab-bar": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/tab": "^6.0.0-beta.16", + "@smui/tab-scroller": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/tab-indicator": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/tab-indicator/-/tab-indicator-6.0.0-beta.16.tgz", + "integrity": "sha512-VQZQwcVItljBMUtMZCOOKCQ4FibK2MynkUVsWA0ZibvKAb4MXBZHbAnrxhVnQ2rM100HOoog6eXzHJNWrm9U+Q==", + "dev": true, + "requires": { + "@material/tab-indicator": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/tab-scroller": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/tab-scroller/-/tab-scroller-6.0.0-beta.16.tgz", + "integrity": "sha512-ilf4zeiIELyZcFwxBPbqckxOnoSjRk1VxHbrZJekehwiOwVkzALLdogtx6LwSdw9bg/DDzlG0nrfc/oUYF2VRA==", + "dev": true, + "requires": { + "@material/dom": "^13.0.0", + "@material/tab-scroller": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/textfield": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/textfield/-/textfield-6.0.0-beta.16.tgz", + "integrity": "sha512-lzW9oZ2PTuJRwtJoxxMlbElv6ZaAqT2W4tJAMs6hI8R0iotEyahcZNm8YxilOHIVLiCkeXOqd2LB4QBeq+vvVQ==", + "dev": true, + "requires": { + "@material/dom": "^13.0.0", + "@material/feature-targeting": "^13.0.0", + "@material/ripple": "^13.0.0", + "@material/rtl": "^13.0.0", + "@material/textfield": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "@smui/floating-label": "^6.0.0-beta.16", + "@smui/line-ripple": "^6.0.0-beta.16", + "@smui/notched-outline": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/tooltip": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/tooltip/-/tooltip-6.0.0-beta.16.tgz", + "integrity": "sha512-3htoW3eGrH6a6CKlE8nSe0vsXRi2zp27N5mcsfDOe2ZP96ynQvZU60LN+s5qz5pUS8NCXlV4ffGwIFflDzepvw==", + "dev": true, + "requires": { + "@material/tooltip": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/top-app-bar": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/top-app-bar/-/top-app-bar-6.0.0-beta.16.tgz", + "integrity": "sha512-GkSB8RO1WJT4DowPRi+n8+LEFZHKUTHctafuOtETQ9F6Hx0PXhAUWEjMQKVyuLkZbylZmmSMaKmeQUhot/2GzA==", + "dev": true, + "requires": { + "@material/feature-targeting": "^13.0.0", + "@material/top-app-bar": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@smui/touch-target": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@smui/touch-target/-/touch-target-6.0.0-beta.16.tgz", + "integrity": "sha512-dQ9ynPFhimwrTlKajxil4gdJTkzQ8g75sQjRWY60NjNY9q4z5DxGsbL1BBmUWaaq3qNIcmg568tDEj5ES2Q3Zg==", + "dev": true, + "requires": { + "@material/touch-target": "^13.0.0", + "@smui/common": "^6.0.0-beta.16", + "svelte2tsx": "^0.5.5" + } + }, + "@sveltejs/kit": { + "version": "1.0.0-next.392", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.392.tgz", + "integrity": "sha512-od4rDJ/Soq0I7mda7sTbAnNKERHSDEGNa7QBpLA859xgBkwC1JnEIymYOh9dm+hMyHhB0bUoRoaur0qxKLqOOw==", + "dev": true, + "requires": { + "@sveltejs/vite-plugin-svelte": "^1.0.1", + "chokidar": "^3.5.3", + "sade": "^1.8.1" + } + }, + "@sveltejs/vite-plugin-svelte": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.1.tgz", + "integrity": "sha512-PorCgUounn0VXcpeJu+hOweZODKmGuLHsLomwqSj+p26IwjjGffmYQfVHtiTWq+NqaUuuHWWG7vPge6UFw4Aeg==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^4.2.1", + "debug": "^4.3.4", + "deepmerge": "^4.2.2", + "kleur": "^4.1.5", + "magic-string": "^0.26.2", + "svelte-hmr": "^0.14.12" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@tsconfig/svelte": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-3.0.0.tgz", + "integrity": "sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "@types/node": { + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.6.tgz", + "integrity": "sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "@types/pug": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", + "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "dev": true + }, + "@types/sass": { + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.43.1.tgz", + "integrity": "sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "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 + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "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": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, + "cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "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": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true + } + } + }, + "dedent-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz", + "integrity": "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + } + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "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" + } + }, + "es-abstract": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, + "esbuild": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.49.tgz", + "integrity": "sha512-/TlVHhOaq7Yz8N1OJrjqM3Auzo5wjvHFLk+T8pIue+fhnhIMpfAzsG6PLVMbFveVxqD2WOp3QHei+52IMUNmCw==", + "dev": true, + "requires": { + "esbuild-android-64": "0.14.49", + "esbuild-android-arm64": "0.14.49", + "esbuild-darwin-64": "0.14.49", + "esbuild-darwin-arm64": "0.14.49", + "esbuild-freebsd-64": "0.14.49", + "esbuild-freebsd-arm64": "0.14.49", + "esbuild-linux-32": "0.14.49", + "esbuild-linux-64": "0.14.49", + "esbuild-linux-arm": "0.14.49", + "esbuild-linux-arm64": "0.14.49", + "esbuild-linux-mips64le": "0.14.49", + "esbuild-linux-ppc64le": "0.14.49", + "esbuild-linux-riscv64": "0.14.49", + "esbuild-linux-s390x": "0.14.49", + "esbuild-netbsd-64": "0.14.49", + "esbuild-openbsd-64": "0.14.49", + "esbuild-sunos-64": "0.14.49", + "esbuild-windows-32": "0.14.49", + "esbuild-windows-64": "0.14.49", + "esbuild-windows-arm64": "0.14.49" + } + }, + "esbuild-android-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.49.tgz", + "integrity": "sha512-vYsdOTD+yi+kquhBiFWl3tyxnj2qZJsl4tAqwhT90ktUdnyTizgle7TjNx6Ar1bN7wcwWqZ9QInfdk2WVagSww==", + "dev": true, + "optional": true + }, + "esbuild-android-arm64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.49.tgz", + "integrity": "sha512-g2HGr/hjOXCgSsvQZ1nK4nW/ei8JUx04Li74qub9qWrStlysaVmadRyTVuW32FGIpLQyc5sUjjZopj49eGGM2g==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.49.tgz", + "integrity": "sha512-3rvqnBCtX9ywso5fCHixt2GBCUsogNp9DjGmvbBohh31Ces34BVzFltMSxJpacNki96+WIcX5s/vum+ckXiLYg==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.49.tgz", + "integrity": "sha512-XMaqDxO846srnGlUSJnwbijV29MTKUATmOLyQSfswbK/2X5Uv28M9tTLUJcKKxzoo9lnkYPsx2o8EJcTYwCs/A==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.49.tgz", + "integrity": "sha512-NJ5Q6AjV879mOHFri+5lZLTp5XsO2hQ+KSJYLbfY9DgCu8s6/Zl2prWXVANYTeCDLlrIlNNYw8y34xqyLDKOmQ==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.49.tgz", + "integrity": "sha512-lFLtgXnAc3eXYqj5koPlBZvEbBSOSUbWO3gyY/0+4lBdRqELyz4bAuamHvmvHW5swJYL7kngzIZw6kdu25KGOA==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.49.tgz", + "integrity": "sha512-zTTH4gr2Kb8u4QcOpTDVn7Z8q7QEIvFl/+vHrI3cF6XOJS7iEI1FWslTo3uofB2+mn6sIJEQD9PrNZKoAAMDiA==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.49.tgz", + "integrity": "sha512-hYmzRIDzFfLrB5c1SknkxzM8LdEUOusp6M2TnuQZJLRtxTgyPnZZVtyMeCLki0wKgYPXkFsAVhi8vzo2mBNeTg==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.49.tgz", + "integrity": "sha512-iE3e+ZVv1Qz1Sy0gifIsarJMQ89Rpm9mtLSRtG3AH0FPgAzQ5Z5oU6vYzhc/3gSPi2UxdCOfRhw2onXuFw/0lg==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.49.tgz", + "integrity": "sha512-KLQ+WpeuY+7bxukxLz5VgkAAVQxUv67Ft4DmHIPIW+2w3ObBPQhqNoeQUHxopoW/aiOn3m99NSmSV+bs4BSsdA==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.49.tgz", + "integrity": "sha512-n+rGODfm8RSum5pFIqFQVQpYBw+AztL8s6o9kfx7tjfK0yIGF6tm5HlG6aRjodiiKkH2xAiIM+U4xtQVZYU4rA==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.49.tgz", + "integrity": "sha512-WP9zR4HX6iCBmMFH+XHHng2LmdoIeUmBpL4aL2TR8ruzXyT4dWrJ5BSbT8iNo6THN8lod6GOmYDLq/dgZLalGw==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.49.tgz", + "integrity": "sha512-h66ORBz+Dg+1KgLvzTVQEA1LX4XBd1SK0Fgbhhw4akpG/YkN8pS6OzYI/7SGENiN6ao5hETRDSkVcvU9NRtkMQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.49.tgz", + "integrity": "sha512-DhrUoFVWD+XmKO1y7e4kNCqQHPs6twz6VV6Uezl/XHYGzM60rBewBF5jlZjG0nCk5W/Xy6y1xWeopkrhFFM0sQ==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.49.tgz", + "integrity": "sha512-BXaUwFOfCy2T+hABtiPUIpWjAeWK9P8O41gR4Pg73hpzoygVGnj0nI3YK4SJhe52ELgtdgWP/ckIkbn2XaTxjQ==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.49.tgz", + "integrity": "sha512-lP06UQeLDGmVPw9Rg437Btu6J9/BmyhdoefnQ4gDEJTtJvKtQaUcOQrhjTq455ouZN4EHFH1h28WOJVANK41kA==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.49.tgz", + "integrity": "sha512-4c8Zowp+V3zIWje329BeLbGh6XI9c/rqARNaj5yPHdC61pHI9UNdDxT3rePPJeWcEZVKjkiAS6AP6kiITp7FSw==", + "dev": true, + "optional": true + }, + "esbuild-windows-32": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.49.tgz", + "integrity": "sha512-q7Rb+J9yHTeKr9QTPDYkqfkEj8/kcKz9lOabDuvEXpXuIcosWCJgo5Z7h/L4r7rbtTH4a8U2FGKb6s1eeOHmJA==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.49.tgz", + "integrity": "sha512-+Cme7Ongv0UIUTniPqfTX6mJ8Deo7VXw9xN0yJEN1lQMHDppTNmKwAM3oGbD/Vqff+07K2gN0WfNkMohmG+dVw==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.49.tgz", + "integrity": "sha512-v+HYNAXzuANrCbbLFJ5nmO3m5y2PGZWLe3uloAkLt87aXiO2mZr3BTmacZdjwNkNEHuH3bNtN8cak+mzVjVPfA==", + "dev": true, + "optional": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "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" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "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": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "dev": true + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globule": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", + "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", + "dev": true, + "requires": { + "glob": "~7.1.1", + "lodash": "^4.17.21", + "minimatch": "~3.0.2" + }, + "dependencies": { + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "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" + } + }, + "minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "immutable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "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": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "magic-string": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", + "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "dev": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + } + }, + "map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true + }, + "meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + } + }, + "minipass": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", + "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dev": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "nan": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", + "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", + "dev": true + }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "dependencies": { + "are-we-there-yet": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + } + }, + "npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + } + } + } + }, + "node-sass": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-7.0.1.tgz", + "integrity": "sha512-uMy+Xt29NlqKCFdFRZyXKOTqGt+QaKHexv9STj2WeLottnlqZEEWx6Bj0MXNthmFRRdM/YwyNo/8Tr46TOM0jQ==", + "dev": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "lodash": "^4.17.15", + "meow": "^9.0.0", + "nan": "^2.13.2", + "node-gyp": "^8.4.1", + "npmlog": "^5.0.0", + "request": "^2.88.0", + "sass-graph": "4.0.0", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "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": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "polyfill-object.fromentries": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/polyfill-object.fromentries/-/polyfill-object.fromentries-1.0.1.tgz", + "integrity": "sha512-zlEL/n2S73hX7BQXIPapzirQw4yM/VC7slrcOyfbsH0ZyUQ/lLh4NF9wshSJ354v0F3KDMC8FCxeTQ7UUPpu9g==", + "dev": true + }, + "postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "dev": true, + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "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.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "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.3", + "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.5.0", + "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": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "2.77.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.0.tgz", + "integrity": "sha512-vL8xjY4yOQEw79DvyXLijhnhh+R/O9zpF/LEgkCebZFtb6ELeN9H3/2T0r8+mp+fFTBHZ5qGpOpW2ela2zRt3g==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "requires": { + "mri": "^1.1.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", + "dev": true, + "requires": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "sass": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.0.tgz", + "integrity": "sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "sass-graph": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-4.0.0.tgz", + "integrity": "sha512-WSO/MfXqKH7/TS8RdkCX3lVkPFQzCgbqdGsmSKq6tlPU+GpGEsa/5aW18JqItnqh+lPtcjifqdZ/VmiILkKckQ==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "lodash": "^4.17.11", + "scss-tokenizer": "^0.3.0", + "yargs": "^17.2.1" + } + }, + "scss-tokenizer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.3.0.tgz", + "integrity": "sha512-14Zl9GcbBvOT9057ZKjpz5yPOyUWG2ojd9D5io28wHRYsOrs7U95Q+KNL87+32p8rc+LvDpbu/i9ZYjM9Q+FsQ==", + "dev": true, + "requires": { + "js-base64": "^2.4.3", + "source-map": "^0.7.1" + } + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true + }, + "smui-theme": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/smui-theme/-/smui-theme-6.0.0-beta.16.tgz", + "integrity": "sha512-koh62ENvVp7ure62NUHTTaLudH1nxdL/YJt5u0rLuBSs53UPg8L8hdmcGqmTawj3h2dlD+yuHnyx8lpT1y8EWQ==", + "dev": true, + "requires": { + "node-fetch": "^2.6.7", + "sass": "^1.49.9", + "yargs": "^17.3.1" + } + }, + "socks": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", + "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", + "dev": true, + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "sorcery": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", + "integrity": "sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0", + "sourcemap-codec": "^1.3.0" + } + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "dev": true + }, + "sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "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": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "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" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "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 + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.matchall": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.1", + "side-channel": "^1.0.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "svelte": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.49.0.tgz", + "integrity": "sha512-+lmjic1pApJWDfPCpUUTc1m8azDqYCG1JN9YEngrx/hUyIcFJo6VZhj0A1Ai0wqoHcEIuQy+e9tk+4uDgdtsFA==", + "dev": true + }, + "svelte-check": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.8.0.tgz", + "integrity": "sha512-HRL66BxffMAZusqe5I5k26mRWQ+BobGd9Rxm3onh7ZVu0nTk8YTKJ9vu3LVPjUGLU9IX7zS+jmwPVhJYdXJ8vg==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.9", + "chokidar": "^3.4.1", + "fast-glob": "^3.2.7", + "import-fresh": "^3.2.1", + "picocolors": "^1.0.0", + "sade": "^1.7.4", + "svelte-preprocess": "^4.0.0", + "typescript": "*" + } + }, + "svelte-hmr": { + "version": "0.14.12", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.14.12.tgz", + "integrity": "sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==", + "dev": true, + "requires": {} + }, + "svelte-icon": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/svelte-icon/-/svelte-icon-1.2.4.tgz", + "integrity": "sha512-fDdTKQAaWUFRRR1f4l65ynXdoAcsR8ikL8G9hOh7gGrjlx/44Ka6flEJHR5mCKoAN/A11n8pd96QcKZpxvmbIQ==", + "dev": true + }, + "svelte-material-ui": { + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/svelte-material-ui/-/svelte-material-ui-6.0.0-beta.16.tgz", + "integrity": "sha512-lztDBPv6+/Xhdlf7sxdrYAbo+1N+TwXTbhncl00FF7mU05ZWhhmtDtqMUeMLEX8x956XSV8TT1J1bywRjbSdtQ==", + "dev": true, + "requires": { + "@smui-extra/accordion": "^6.0.0-beta.16", + "@smui-extra/autocomplete": "^6.0.0-beta.16", + "@smui-extra/badge": "^6.0.0-beta.16", + "@smui/banner": "^6.0.0-beta.16", + "@smui/button": "^6.0.0-beta.16", + "@smui/card": "^6.0.0-beta.16", + "@smui/checkbox": "^6.0.0-beta.16", + "@smui/chips": "^6.0.0-beta.16", + "@smui/circular-progress": "^6.0.0-beta.16", + "@smui/common": "^6.0.0-beta.16", + "@smui/data-table": "^6.0.0-beta.16", + "@smui/dialog": "^6.0.0-beta.16", + "@smui/drawer": "^6.0.0-beta.16", + "@smui/fab": "^6.0.0-beta.16", + "@smui/floating-label": "^6.0.0-beta.16", + "@smui/form-field": "^6.0.0-beta.16", + "@smui/icon-button": "^6.0.0-beta.16", + "@smui/image-list": "^6.0.0-beta.16", + "@smui/layout-grid": "^6.0.0-beta.16", + "@smui/line-ripple": "^6.0.0-beta.16", + "@smui/linear-progress": "^6.0.0-beta.16", + "@smui/list": "^6.0.0-beta.16", + "@smui/menu": "^6.0.0-beta.16", + "@smui/menu-surface": "^6.0.0-beta.16", + "@smui/notched-outline": "^6.0.0-beta.16", + "@smui/paper": "^6.0.0-beta.16", + "@smui/radio": "^6.0.0-beta.16", + "@smui/ripple": "^6.0.0-beta.16", + "@smui/segmented-button": "^6.0.0-beta.16", + "@smui/select": "^6.0.0-beta.16", + "@smui/slider": "^6.0.0-beta.16", + "@smui/snackbar": "^6.0.0-beta.16", + "@smui/switch": "^6.0.0-beta.16", + "@smui/tab": "^6.0.0-beta.16", + "@smui/tab-bar": "^6.0.0-beta.16", + "@smui/tab-indicator": "^6.0.0-beta.16", + "@smui/tab-scroller": "^6.0.0-beta.16", + "@smui/textfield": "^6.0.0-beta.16", + "@smui/tooltip": "^6.0.0-beta.16", + "@smui/top-app-bar": "^6.0.0-beta.16", + "@smui/touch-target": "^6.0.0-beta.16" + } + }, + "svelte-preprocess": { + "version": "4.10.7", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz", + "integrity": "sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==", + "dev": true, + "requires": { + "@types/pug": "^2.0.4", + "@types/sass": "^1.16.0", + "detect-indent": "^6.0.0", + "magic-string": "^0.25.7", + "sorcery": "^0.10.0", + "strip-indent": "^3.0.0" + }, + "dependencies": { + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + } + } + }, + "svelte-tiny-virtual-list": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/svelte-tiny-virtual-list/-/svelte-tiny-virtual-list-2.0.5.tgz", + "integrity": "sha512-xg9ckb8UeeIme4/5qlwCrl2QNmUZ8SCQYZn3Ji83cUsoASqRNy3KWjpmNmzYvPDqCHSZjruBBsoB7t5hwuzw5g==", + "dev": true + }, + "svelte2tsx": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.12.tgz", + "integrity": "sha512-43ayMivmh1IDCgb+4YDf54YuOJZGCUKFpp37RbfjGgNU+Pmb9HhP+zRXa1pMh4mwSTBfqZS0FbJZP3Q8CSxvvg==", + "dev": true, + "requires": { + "dedent-js": "^1.0.1", + "pascal-case": "^3.1.1" + } + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "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": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "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": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + }, + "typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "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": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vite": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.0.2.tgz", + "integrity": "sha512-TAqydxW/w0U5AoL5AsD9DApTvGb2iNbGs3sN4u2VdT1GFkQVUfgUldt+t08TZgi23uIauh1TUOQJALduo9GXqw==", + "dev": true, + "requires": { + "esbuild": "^0.14.47", + "fsevents": "~2.3.2", + "postcss": "^8.4.14", + "resolve": "^1.22.1", + "rollup": "^2.75.6" + } + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "dependencies": { + "yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "dev": true + } + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } + } +} diff --git a/src/svelte-components/package.json b/src/svelte-components/package.json new file mode 100644 index 0000000..2700285 --- /dev/null +++ b/src/svelte-components/package.json @@ -0,0 +1,31 @@ +{ + "name": "svelte-components", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "postbuild": "smui-theme compile dist/smui.css -i src/theme", + "preview": "vite preview", + "check": "svelte-check --tsconfig ./tsconfig.json" + }, + "devDependencies": { + "@sveltejs/kit": "^1.0.0-next.392", + "@sveltejs/vite-plugin-svelte": "^1.0.1", + "@tsconfig/svelte": "^3.0.0", + "node-sass": "^7.0.1", + "polyfill-object.fromentries": "^1.0.1", + "smui-theme": "^6.0.0-beta.16", + "string.prototype.matchall": "^4.0.7", + "svelte": "^3.49.0", + "svelte-check": "^2.8.0", + "svelte-icon": "^1.2.4", + "svelte-material-ui": "^6.0.0-beta.16", + "svelte-preprocess": "^4.10.7", + "svelte-tiny-virtual-list": "^2.0.5", + "tslib": "^2.4.0", + "typescript": "^4.7.4", + "vite": "^3.0.2" + } +} diff --git a/src/svelte-components/public/favicon.ico b/src/svelte-components/public/favicon.ico new file mode 100644 index 0000000..d75d248 Binary files /dev/null and b/src/svelte-components/public/favicon.ico differ diff --git a/src/svelte-components/src/components/AdminNetworkView.svelte b/src/svelte-components/src/components/AdminNetworkView.svelte new file mode 100644 index 0000000..9e1e218 --- /dev/null +++ b/src/svelte-components/src/components/AdminNetworkView.svelte @@ -0,0 +1,215 @@ + + + + + +
    +

    Network Info

    + +
    +
    + + + + {$networkInfo.hostname} + + + +
    +
    + +
    +
    + + + {#each $networkInfo.ipAddresses as ipAddress} +
    + + {ipAddress} + +
    + {/each} +
    +
    +
    + +
    +
    + +
    + + + {#if $networkInfo.wifi.networks.length === 0} + + Scanning... + + {:else} + {#each $networkInfo.wifi.networks as network} + + onNetworkSelected(network)} + > + + + + + {network.Name} + {#if network.Encryption !== "Open"} + + + + {/if} + + {/each} + {/if} + + + + Click on a Wi-Fi network to connect or disconnect. + +
    +
    +
    +
    + + diff --git a/src/svelte-components/src/components/ConfigTemplatedInput.svelte b/src/svelte-components/src/components/ConfigTemplatedInput.svelte new file mode 100644 index 0000000..71c5d00 --- /dev/null +++ b/src/svelte-components/src/components/ConfigTemplatedInput.svelte @@ -0,0 +1,196 @@ + + +{#if template} +
    + + + {#if template.values} + + {:else if template.type === "bool"} + + {:else if template.type === "float"} + + {:else if template.type === "int"} + + {:else if template.type === "string"} + + {:else if template.type == "text"} +