diff --git a/index.html b/index.html
index aec61e9..5cba945 100644
--- a/index.html
+++ b/index.html
@@ -597,6 +597,19 @@
once
TRUE
+
+
+ FALSE
+
+
+
+
+ 左
+ 上
+ 幅
+ 高さ
+
+
@@ -966,9 +979,9 @@
-
-
+
+
diff --git a/index.js b/index.js
index 74d2972..2b7bd06 100644
--- a/index.js
+++ b/index.js
@@ -1,147 +1,619 @@
-const { app, BrowserWindow, Menu, session } = require('electron');
-require('@electron/remote/main').initialize();
+'use strict';
-/** Force disable security warning */
-process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true';
+let elutil = elUtil_new();
-// Keep a global reference of the window object, if you don't, the window will
-// be closed automatically when the JavaScript object is garbage collected.
-let win
+const testfunc = () => {
+ elutil.openURL('http://ocoge.club');
+}
-function createWindow() {
- // Create the browser window.
- win = new BrowserWindow({
- /** Icon */
- icon: "./icon.png",
- width: 1280,
- height: 940,
- webPreferences: {
- nodeIntegration: true,
- contextIsolation: false,
- enableRemoteModule: true
+//============ User Customize Start ===============
+// カスタムブロックカラー定義
+Blockly.HSV_SATURATION = 0.55;
+Blockly.HSV_VALUE = 0.75;
+var gpio_color = '0';
+var multimedia_color = '240';
+var network_color = '340';
+var special_color = '20';
+var snippets_color = '90';
+// テーマ
+var theme = Blockly.Theme.defineTheme('ocoge', {
+ 'base': Blockly.Themes.Classic,
+ 'startHats': true,
+ 'componentStyles': {
+ 'toolboxBackgroundColour': 'aliceblue',
+ 'flyoutBackgroundColour': 'lavender',
+ 'toolboxForegroundColour': 'white',
+ 'flyoutForegroundColour': 'steelblue'
+ },
+ 'blockStyles': {
+ 'gpio_blocks': {
+ "colourPrimary": gpio_color
+ },
+ 'multimedia_blocks': {
+ "colourPrimary": multimedia_color
+ },
+ 'network_blocks': {
+ "colourPrimary": network_color
+ },
+ 'special_blocks': {
+ "colourPrimary": special_color
+ },
+ 'snippets_blocks': {
+ "colourPrimary": snippets_color
}
- })
- /** Maximize Window when launch */
- win.maximize();
+ },
+ 'categoryStyles': {
+ "gpio_category": {
+ "colour": gpio_color
+ },
+ "multimedia_category": {
+ "colour": multimedia_color
+ },
+ "network_category": {
+ "colour": network_color
+ },
+ "special_category": {
+ "colour": special_color
+ },
+ "snippets_category": {
+ "colour": snippets_color
+ }
+ },
+});
- // and load the index.html of the app.
- win.loadFile('index.html')
+// Customize messages
+Blockly.Msg["CONTROLS_IF_MSG_THEN"] = "ならば";
+Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "";
+Blockly.Msg["MATH_CHANGE_TITLE"] = "変数 %1 を %2 増やす";
+Blockly.Msg["VARIABLES_SET"] = "変数 %1 を %2 にする";
+// Blockly.Msg["TEXT_PRINT_TITLE"] = "ダイアログに %1 を表示";
+Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "偽";
+Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "真 または 偽 を返します。";
+Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "真";
+// ローカライズ対応の準備
+Blockly.Msg["UGJ_CONTROL_FOR_TITLE"] = "%1 %2 を %3 から %4 まで %5 ずつ %6 %7 %8";
+Blockly.Msg["UGJ_CONTROL_FOR_INDEX"] = "番号";
+Blockly.Msg["UGJ_CONTROL_FOR_INCREASE"] = "増やして";
+Blockly.Msg["UGJ_CONTROL_FOR_DECREASE"] = "減らして";
+Blockly.Msg["UGJ_CONTROL_FOR_TOOLTIP"] = "インデックス番号を決められた数ずつ増やし(減らし)ながら、ステートメントを実行します。";
+Blockly.Msg["UGJ_FOREACH_TITLE"] = "リスト %1 の各 %2 について %3 %4";
+Blockly.Msg["UGJ_FOREACH_ITEM"] = "項目";
+Blockly.Msg["UGJ_FOREACH_TOOLTIP"] = "リストの各項目について、その項目を変数「項目」としてステートメントを実行します。";
- // Open the DevTools.
- // win.webContents.openDevTools()
+Blockly.Msg["GPIOCHIP_OPEN_TITLE"] = "GPIO を使えるようにする";
+Blockly.Msg["GPIOCHIP_OPEN_TOOLTIP"] = "GPIOを初期化して接続します。";
+Blockly.Msg["GPIOCHIP_CLOSE_TITLE"] = "GPIO の後片付けをする";
+Blockly.Msg["GPIOCHIP_CLOSE_TOOLTIP"] = "GPIOとの接続を終了します。";
+Blockly.Msg["GPIOCHIP_CLOSE_TITLE"] = "GPIO の後片付けをする";
+Blockly.Msg["GPIO_CLAIM_INPUT_TITLE"] = "GPIO %1 を入力モードにして %2";
+Blockly.Msg["GPIO_CLAIM_INPUT_TOOLTIP"] = "GPIO端子を入力モードにして、プルアップ・プルダウン・無しを設定します。";
+Blockly.Msg["GPIO_CLAIM_OUTPUT_TITLE"] = "GPIO %1 を出力モードにする";
+Blockly.Msg["GPIO_CLAIM_OUTPUT_TOOLTIP"] = "GPIO端子のモードを出力に設定します。";
+Blockly.Msg["GPIO_READ_TITLE"] = "GPIO %1 の値";
+Blockly.Msg["GPIO_READ_TOOLTIP"] = "GPIO端子の値をデジタル値(0または1)で読み取ります。";
+Blockly.Msg["GPIO_WRITE_TITLE"] = "GPIO %1 の値を %2 にする";
+Blockly.Msg["GPIO_WRITE_TOOLTIP"] = "GPIO端子の値をデジタル値(0または1)で出力します。";
+Blockly.Msg["TX_SERVO_TITLE"] = "GPIO %1 のサーボモータの回転を %2 にする";
+Blockly.Msg["TX_SERVO_TOOLTIP"] = "サーボモータの回転をパルス幅(1000~2000μsec)までの数値で指定します。";
+Blockly.Msg["TX_PWM_TITLE"] = "PWM : GPIO %1 に、パルス周波数 %2 Hz, デューティー比 %3 %%で出力";
+Blockly.Msg["TX_PWM_TOOLTIP"] = "パルス周波数をセットして、GPIO端子がPWM出力できるようにします。レンジは100固定です。";
+Blockly.Msg["I2C_OPEN_TITLE"] = "アドレス %1 の I2C デバイスを開く";
+Blockly.Msg["I2C_OPEN_TOOLTIP"] = "I2C接続されたデバイスとの通信を開始します。一度にオープンできるI2Cデバイスはひとつだけです。";
+Blockly.Msg["SERIAL_OPEN_TITLE"] = "シリアルポート %1 を速度 %2 bpsで開く";
+Blockly.Msg["SERIAL_OPEN_TOOLTIP"] = "シリアルデバイスとの接続を開きます。";
+Blockly.Msg["SERIAL_CLOSE_TITLE"] = "シリアルポートを閉じる";
+Blockly.Msg["SERIAL_CLOSE_TOOLTIP"] = "シリアルデバイスとの接続を閉じます。";
+Blockly.Msg["SERIAL_WRITE_TITLE"] = "シリアルポートに %1 を送信する";
+Blockly.Msg["SERIAL_WRITE_TOOLTIP"] = "シリアル接続されたデバイスにデータを送信します。シリアルポートは開かれていなくてはいけません。";
+Blockly.Msg["SERIAL_READ_TITLE"] = "シリアルポートから %1 文字読み込む";
+Blockly.Msg["SERIAL_READ_TOOLTIP"] = "オープン済みシリアルポートから、指定のバイト数だけデータを読み込みます。";
+Blockly.Msg["I2C_CLOSE_TITLE"] = "I2C デバイスを閉じる";
+Blockly.Msg["I2C_CLOSE_TOOLTIP"] = "I2C接続されたデバイスと通信を切断します。";
+Blockly.Msg["I2C_WRITE_BYTE_TITLE"] = "デバイスに1バイトデータ %1 を送信";
+Blockly.Msg["I2C_WRITE_BYTE_TOOLTIP"] = "i2cデバイスに1バイトデータを送信します。0-0xFFの範囲の数字で入力してください。";
+Blockly.Msg["I2C_READ_BYTE_TITLE"] = "I2C デバイスから 1 バイト受け取る";
+Blockly.Msg["I2C_READ_BYTE_TOOLTIP"] = "オープン済み I2C デバイスからデータを 1 バイト受け取ります。";
+Blockly.Msg["I2C_WRITE_BYTE_DATA_TITLE"] = "レジスタ %1 に %2 を書き込む";
+Blockly.Msg["I2C_WRITE_BYTE_DATA_TOOLTIP"] = "デバイスの指定されたレジスタに1バイトを書き込みます。";
+Blockly.Msg["I2C_READ_BYTE_DATA_TITLE"] = "レジスタ %1 の値";
+Blockly.Msg["I2C_READ_BYTE_DATA_TOOLTIP"] = "デバイスの指定されたレジスタから1バイトを読み込みます。";
+Blockly.Msg["I2C_READ_DEVICE_TITLE"] = "i2cデバイスから %1 バイト受け取る";
+Blockly.Msg["I2C_READ_DEVICE_TOOLTIP"] = "デバイスから指定したバイト数のデータを受け取ります。データが指定の長さより短いこともあります。";
+Blockly.Msg["I2C_WRITE_DEVICE_TITLE"] = "i2c デバイスに %1 を送信";
+Blockly.Msg["I2C_WRITE_DEVICE_TOOLTIP"] = "i2c デバイスにデータを送信します。";
- // Emitted when the window is closed.
- win.on('closed', () => {
- // Dereference the window object, usually you would store windows
- // in an array if your app supports multi windows, this is the time
- // when you should delete the corresponding element.
- win = null
- })
+Blockly.Msg["UGJ_BME280_TITLE"] = "BME280(アドレス %1 )の計測値: %2 %3 %4";
+Blockly.Msg["UGJ_BME280_TOOLTIP"] = "環境センサーBME280で、気温(摂氏)、湿度(%)、気圧(hPa)を計測し、それぞれを変数に代入します。";
+Blockly.Msg["UGJ_BME280_READ_TEMP"] = "気温";
+Blockly.Msg["UGJ_BME280_READ_HUM"] = "湿度";
+Blockly.Msg["UGJ_BME280_READ_PRES"] = "気圧";
- /** For SkyWay */
- session.defaultSession.webRequest.onBeforeSendHeaders((details, callback) => {
- details.requestHeaders['Origin'] = 'electron://localhost';
- callback({
- cancel: false,
- requestHeaders: details.requestHeaders
- });
+Blockly.Msg["UGJ_CODECHAR_TITLE"] = "コード %1 の文字";
+Blockly.Msg["UGJ_CODECHAR_TOOLTIP"] = "文字コードを文字に変換します。";
+Blockly.Msg["UGJ_CHARCODE_TITLE"] = "%1 の文字コード";
+Blockly.Msg["UGJ_CHARCODE_TOOLTIP"] = "入力テキストの1文字目の文字コードを返します。";
+Blockly.Msg["UGJ_HEXTODEC_TITLE"] = "0x %1";
+Blockly.Msg["UGJ_HEXTODEC_TOOLTIP"] = "16進数を10進数に変換します。";
+Blockly.Msg["UGJ_DECTOHEX_TITLE"] = "%1 を16進数に変換";
+Blockly.Msg["UGJ_DECTOHEX_TOOLTIP"] = "10進数を16進数に変換します。";
+
+Blockly.Msg["UGJ_CANVAS_INIT_TITLE"] = "キャンバスを表示";
+Blockly.Msg["UGJ_CANVAS_INIT_TOOLTIP"] = "キャンバスを表示し、使用できるようにします。";
+Blockly.Msg["UGJ_FACEAPI_TITLE"] = "TensorFlowによる顔検出: %1 ランドマークを検出 %2 %3";
+Blockly.Msg["UGJ_FACEAPI_TOOLTIP"] = "TensorFlow とFaceAPI をロードし、顔検出をできるようにします。";
+
+Blockly.Msg["UGJ_SLEEP_TITLE"] = "%1 秒待つ";
+Blockly.Msg["UGJ_SLEEP_TOOLTIP"] = "指定した秒数だけ処理を中断します。";
+
+// Customize Toolbox
+class CustomCategory extends Blockly.ToolboxCategory {
+ /** Constructor for a custom category. @override */
+ constructor(categoryDef, toolbox, opt_parent) {
+ super(categoryDef, toolbox, opt_parent);
+ }
+ /** @override */
+ addColourBorder_(colour) {
+ this.rowDiv_.style.backgroundColor = colour;
+ }
+ /** @override */
+ setSelected(isSelected) {
+ // We do not store the label span on the category, so use getElementsByClassName.
+ var labelDom = this.rowDiv_.getElementsByClassName('blocklyTreeLabel')[0];
+ if (isSelected) {
+ // Change the background color of the div to white.
+ this.rowDiv_.style.backgroundColor = 'white';
+ // Set the colour of the text to the colour of the category.
+ labelDom.style.color = this.colour_;
+ this.iconDom_.style.color = this.colour_;
+ } else {
+ // Set the background back to the original colour.
+ this.rowDiv_.style.backgroundColor = this.colour_;
+ // Set the text back to white.
+ labelDom.style.color = 'white';
+ this.iconDom_.style.color = 'white';
+ }
+ // This is used for accessibility purposes.
+ Blockly.utils.aria.setState(/** @type {!Element} */(this.htmlDiv_),
+ Blockly.utils.aria.State.SELECTED, isSelected);
+ }
+}
+Blockly.registry.register(
+ Blockly.registry.Type.TOOLBOX_ITEM,
+ Blockly.ToolboxCategory.registrationName,
+ CustomCategory, true);
+//============ User Customize End ===============
+
+
+//背景canvasとマスコットの準備
+const ugj_canvasBgImg = (imgSrc, x, y) => { //x,y == -1: center or middle
+ let el = document.getElementById('canvas_bg');
+ let ctx = el.getContext('2d');
+ ctx.fillStyle = 'rgb(255,255,255)';
+ ctx.fillRect(0, 0, 480, 360);
+ let img = new Image();
+ img.src = imgSrc;
+ img.onload = () => {
+ if (x < 0) { //センタリング
+ let w = img.width;
+ if (w >= 480) x = 0;
+ else x = Math.floor((480 - w) / 2);
+ }
+ if (y < 0) { //縦中寄せ
+ let h = img.height;
+ if (h >= 360) y = 0;
+ else y = Math.floor((360 - h) / 2);
+ }
+ ctx.drawImage(img, x, y);
+ }
+};
+
+// HTML部品のインスタンス - 画面上の必要な部品はすべてここで取得しておく
+let ugjel_displayArea = document.getElementById('display_area'); // ディスプレイ部
+let ugjel_blackboard = document.getElementById('blackboard'); // 黒板
+let ugjel_inputForm = document.getElementById('inputForm'); // 入力フォーム
+let ugjel_inputBox = document.getElementById('inputBox'); // 入力フィールド
+
+// その他のプロパティ
+let ugj_inputEvLstnrID = 0; // 入力フォームの動的イベントリスナの最新のID
+let ugj_sounds = (names => { // サウンドファイルのいろいろの配列の初期化
+ let sounds = [];
+ names.forEach(value => {
+ let filepath = `./sounds/${value}.wav`;
+ sounds[value] = { 'file': filepath, 'audio': new Audio(filepath) };
+ });
+ return sounds;
+})(['meow', 'bounce', 'type_chime', 'type_dink', 'type_tap', 'type_space', 'type_return']); // サウンドファイルのベース名のリスト
+
+// メソッド
+
+// マスコット選択
+const ugj_selectMascot = async () => {
+ let fname = await elutil.selectMascotFile();
+ if (fname) {
+ ugj_canvasBgImg(fname, -1, -1);
+ elutil.setMascotFilePath(fname);
+ }
+}
+
+// サウンド再生 - 連続再生のため、再生開始後すぐにオーディオ要素を再生成する
+const ugj_soundPlay = soundName => {
+ ugj_sounds[soundName]['audio'].play();
+ ugj_sounds[soundName]['audio'] = new Audio(ugj_sounds[soundName]['file']);
+};
+
+// OK,Cancel 2択のダイアログを表示
+const ugj_confirm = (title, message, callback) => {
+ CustomDialog.show(title, message, {
+ showOkay: true,
+ onOkay: () => callback(true),
+ showCancel: true,
+ onCancel: () => callback(false)
+ });
+};
+
+const ugj_htmlEntities = str =>// HTMLエンティティのエスケープ
+ String(str).replace(//g, '>').replace(/"/g, '"');//.replace(/&/g, '&').replace(/ /g, ' ');
+
+// 新規ワークスペース
+const ugj_newWorkspace = () => {
+ ugj_confirm('新規ワークスペース', '保存していない内容はすべて破棄されます。よろしいですか?', okey => {
+ if (okey) {
+ workspace.clear();
+ elutil.newFile();
+ }
});
}
-// This method will be called when Electron has finished
-// initialization and is ready to create browser windows.
-// Some APIs can only be used after this event occurs.
-// app.on('ready', createWindow)
-app.on('ready', () => {
- createWindow();
- /** Custom Menu */
- let template = [
- {
- label: 'Menu',
- submenu: [
- {
- label: 'Toggle Menu Bar',
- click: () => {
- win.setMenuBarVisibility(!win.menuBarVisible);
- },
- accelerator: "CommandOrControl+Shift+M"
- },
- {
- label: 'Reload',
- click: () => {
- win.reload();
- },
- accelerator: "F5"
- },
- {
- label: 'Mascot',
- click: (item, focusedWindow) => {
- if (focusedWindow)
- focusedWindow.webContents.executeJavaScript('ugj_selectMascot()');
- },
- accelerator: "CommandOrControl+M"
- },
- {
- label: 'Toggle Developer Tools',
- click: () => {
- win.webContents.toggleDevTools()
- },
- accelerator: "F12"
- },
- {
- label: 'About',
- click: () => {
- var os = require('os');
- var detail = 'Version: ' + process.env.npm_package_version + '\n'
- + 'Node.js: ' + process.versions.node + '\n'
- + 'Chrome: ' + process.versions.chrome + '\n'
- + 'Electron: ' + process.versions.electron + '\n'
- + 'V8: ' + process.versions.v8 + '\n'
- + 'OS: ' + os.type + ' ' + os.arch + ' ' + os.version + ' ' + os.release;
- var options = {
- type: 'info',
- buttons: ['OK'],
- title: 'OCoGe',
- message: 'OCoGe - Oiwa Code Generator',
- detail: detail
- };
- require('electron').dialog.showMessageBox(win, options);
- },
- accelerator: "CommandOrControl+I"
- },
- {
- label: 'Quit',
- click: () => {
- app.quit();
- },
- accelerator: "CommandOrControl+Q"
- }
- ]
+// ワークスペースをファイルに保存・読込
+const ugj_saveWorkspaceToFile = async () => {
+ let xml = Blockly.Xml.workspaceToDom(workspace);
+ let xml_text = Blockly.Xml.domToText(xml);
+ if (await elutil.saveWsFile(xml_text) === false) {
+ alert('保存できませんでした。');
+ }
+}
+const ugj_loadWorkspaceFromFile = async () => {
+ let xml_text = await elutil.loadWsFile();
+ if (xml_text.length > 0) {
+ let xml = Blockly.Xml.textToDom(xml_text);
+ Blockly.Xml.domToWorkspace(xml, workspace);
+ }
+}
+
+// ワークスペースを別名で保存
+const ugj_saveWorkspaceAs = () => {
+ elutil.newFile();
+ ugj_saveWorkspaceToFile();
+}
+
+// ワークスペースをローカルストレージに保存・読込
+const ugj_saveWorkspace = () => {
+ // Workspace
+ let xml = Blockly.Xml.workspaceToDom(workspace);
+ let xml_text = Blockly.Xml.domToText(xml);
+ localStorage.setItem("ocoge.xml", xml_text);
+}
+const ugj_loadWorkspace = () => {
+ // Workspace
+ let xml_text = localStorage.getItem("ocoge.xml");
+ if (xml_text !== null) {
+ if (xml_text.length != 0) {
+ let xml = Blockly.Xml.textToDom(xml_text);
+ Blockly.Xml.domToWorkspace(xml, workspace);
}
- ]
- const menu = Menu.buildFromTemplate(template);
- Menu.setApplicationMenu(menu);
- win.setMenuBarVisibility(false);
-})
-
-
-// Quit when all windows are closed.
-app.on('window-all-closed', () => {
- // On macOS it is common for applications and their menu bar
- // to stay active until the user quits explicitly with Cmd + Q
- if (process.platform !== 'darwin') {
- app.quit()
}
-})
+}
-app.on('activate', () => {
- // On macOS it's common to re-create a window in the app when the
- // dock icon is clicked and there are no other windows open.
- if (win === null) {
- createWindow()
+// // Python コードフォーマッタ YAPF をコール
+// const ugj_pyBeautify = (code) => {
+// let formatted;
+// formatted = window.ocogeapi.child_process.spawnSync('python3', ['-m', 'yapf'], { input: code }).stdout.toString();
+// return formatted;
+// }
+// Python コードフォーマッタ Black をコール
+const ugj_pyBeautify = (code) => {
+ let formatted;
+ formatted = window.ocogeapi.child_process.spawnSync('python3', ['-m', 'black', '-'], { input: code }).stdout.toString();
+ return formatted;
+}
+
+// ワークスペースからコードを生成して必要であれば整形処理をする
+const ugj_createCode = (args) => {
+ const addAsync = args.async || false;
+ const beautify = args.beautify || false;
+ const prettify = args.prettify || false;
+ const ext = args.ext || 'js';
+
+ let code;
+ if (ext == 'py') { // Python コード出力
+ try {
+ code = Blockly.Python.workspaceToCode(workspace);
+ } catch (e) { // Pythonコードを持たないブロックがある場合
+ window.alert('Python 非対応のブロックが使用されています。\n' + e.message);
+ }
+ code = Blockly.Python.workspaceToCode(workspace);
+ }
+ else { // Javascript コード出力
+ code = Blockly.JavaScript.workspaceToCode(workspace);
}
-})
-// In this file you can include the rest of your app's specific main process
-// code. You can also put them in separate files and require them here.
+ if (ext == 'py') { //Python
+ // コードを綺麗に
+ if (beautify) code = ugj_pyBeautify(code);
+ } else { // JavaScript
+ // await使用のため、必要に応じてコード全体をasync付き即時関数でラップ
+ if (addAsync) {
+ code = [
+ '(async () => {',
+ code,
+ '})();'
+ ].join('\n');
+ }
+ // コードを綺麗に
+ if (beautify) code = js_beautify(code, { indent_size: 2 });
+ }
+ // シンタックスハイライト(HTML化): 先に HTML エンティティをエスケープ
+ if (prettify) code = PR.prettyPrintOne(ugj_htmlEntities(code), ext, true);
+
+ return code;
+}
+
+// ブロックスクリプト実行
+const ugj_runCode = async () => {
+ document.activeElement.blur(); //実行ボタンからフォーカスを外す:エンターキー押下が悪さをするため
+ let code = ugj_createCode({ 'async': true });
+ await eval(code).catch(e => { alert(e); });
+}
+
+// コードをダイアログで表示・保存
+// エレメントのオブジェクトとかコールバックとか Python対応とか
+// 色々この中で完結させてみる
+const ugj_showCode = () => {
+ var ext = 'js';
+ const dialog = document.getElementById('codeDlg');
+ const content = document.getElementById('dlgContent');
+ const btn_close = document.getElementById('dlgClose');
+ const btn_export = document.getElementById('dlgExport');
+ const chkbox_cli = document.getElementById('dlgCli');
+
+ const dialog_title = document.getElementById('dlgTitle');
+
+ const showCode = () =>
+ content.innerHTML = ugj_createCode({ 'beautify': true, 'ext': ext, 'prettify': true });
+
+ showCode();
+
+ dialog.showModal();
+
+ const close_cb = () => {
+ dialog.close();
+ btn_close.removeEventListener('click', close_cb);
+ btn_export.removeEventListener('click', export_cb);
+ }
+ const export_cb = () => {
+ code = ugj_createCode({ 'ext': ext, 'async': true, 'beautify': true });
+ // blackboardWrite()とwindow.alert()、fukidashi()をconsole.log()に書き換え、
+ // document... と ugj_... と elutil... をコメントアウト(ブラウザ関連部分の追放という意味では不完全なので注意)
+ // あと正規表現もいい加減
+ if (chkbox_cli.checked && ext == 'js')
+ code = code.replace(/const appendDiv[^#]*\/\/#/gm, 'const blackboardWrite = text => console.log(text);').replace('window.alert', 'console.log').replace(/ugj_fukidashi(.*), \d+(\);)/gm, 'console.log$1$2').replace(/(^(?=.*document.)[^;]*;)/gm, '/* $1 */').replace(/(^(?=.*ugj_)[^;]*;)/gm, '/* $1 */').replace(/(^(?=.*elutil.)[^;]*;)/gm, '/* $1 */');
+ if (elutil.saveFile(code, ext) === false) {
+ alert('保存できませんでした。');
+ }
+ close_cb();
+ }
+ btn_close.addEventListener('click', close_cb);
+ btn_export.addEventListener('click', export_cb);
+ document.addEventListener('keypress', (ev) => {
+ if (ev.key == 'p' && ext == 'js') {
+ ext = 'py';
+ showCode();
+ }
+ });
+ document.addEventListener('keyup', (ev) => {
+ if (ev.key == 'p') {
+ ext = 'js';
+ showCode();
+ }
+ });
+}
+
+
+// フキダシ
+let ugj_fdTimeoutID = null;
+let ugj_fdRecentBox = null;
+const ugj_fukidashi = (text, sec) => {
+ // Canvas Context
+ const context = document.getElementById('canvas').getContext('2d');
+ // 吹き出しを消去する関数
+ const clearFd = (x, y, w, h) => context.clearRect(x, y, w, h);
+ // 前回の思い出を忘れる
+ if (ugj_fdRecentBox !== null) {
+ clearFd(ugj_fdRecentBox.x, ugj_fdRecentBox.y, ugj_fdRecentBox.w, ugj_fdRecentBox.h);
+ clearTimeout(ugj_fdTimeoutID);
+ ugj_fdRecentBox = null;
+ }
+
+ // 基本設定
+ let rtopX = 170; // フキダシ右上 X座標
+ let rtopY = 40; // フキダシ右上 Y座標
+ let boxWidth = 140;
+ let padding = 5;
+ let radius = 5;// 円弧の半径
+
+ // 吹き出しの背景色
+ context.fillStyle = "#b7e6ff";
+
+ // テキスト設定
+ let limitedWidth = boxWidth - (padding * 2);
+ let size = 14;
+ context.font = size + "px ''";
+
+ // テキスト調整 行に分解
+ let lineTextList = text.split("\n");
+ let newLineTextList = [];
+ lineTextList.forEach((lineText) => {
+ if (context.measureText(lineText).width > limitedWidth) {
+ characterList = lineText.split("");// 1文字ずつ分割
+ let preLineText = "";
+ lineText = "";
+ characterList.forEach((character) => {
+ lineText += character;
+ if (context.measureText(lineText).width > limitedWidth) {
+ newLineTextList.push(preLineText);
+ lineText = character;
+ }
+ preLineText = lineText;
+ });
+ }
+ newLineTextList.push(lineText);
+ });
+ let lineLength = newLineTextList.length;
+
+ // 角丸
+ let width = boxWidth;// 枠の幅
+ let height = (size * lineLength) + (padding * 3); // 枠の高さ
+ let toRadianCoefficient = Math.PI / 180; // 角度からラジアンへの変換係数
+ // 角丸原点(左上座標)
+ let boxOrigin = {
+ "x": rtopX - width,
+ "y": rtopY,
+ }
+ // 円弧から円弧までの直線は自動で引かれます、角度は回り方によって変わります。
+ // arc(中心x, 中心y, 半径, 開始角度, 終了角度, 反時計回り)
+ context.beginPath();
+ context.arc(boxOrigin.x + radius, boxOrigin.y + radius, radius, 180 * toRadianCoefficient, 270 * toRadianCoefficient, false);// 左上
+ context.arc(boxOrigin.x + width - radius, boxOrigin.y + radius, radius, 270 * toRadianCoefficient, 0, false);// 右上
+ context.arc(boxOrigin.x + width - radius, boxOrigin.y + height - radius, radius, 0, 90 * toRadianCoefficient, false);// 右下
+ context.arc(boxOrigin.x + radius, boxOrigin.y + height - radius, radius, 90 * toRadianCoefficient, 180 * toRadianCoefficient, false);// 左下
+ context.closePath();
+ context.fill();
+
+ // 矢印(ヒゲ)
+ let arrow = {
+ "x": rtopX - width / 2 + 40,
+ "y": rtopY + height + 10,
+ "width": 10,
+ "height": 10,
+ }
+ context.beginPath();
+ context.moveTo(arrow.x, arrow.y);
+ context.lineTo(arrow.x, arrow.y - arrow.height);
+ context.lineTo(arrow.x - arrow.width, arrow.y - arrow.height);
+ context.fill();
+
+ // テキスト描画
+ context.fillStyle = "#000000";
+ newLineTextList.forEach((lineText, index) => {
+ context.fillText(lineText, boxOrigin.x + padding, boxOrigin.y + padding + (size * (index + 1)));
+ });
+
+ // 描画した吹き出しの位置情報を保存
+ ugj_fdRecentBox = { x: boxOrigin.x, y: boxOrigin.y, w: width, h: height + arrow.height };
+ // 指定時間後に消去(0以下で自動消去なし)
+ if (sec > 0) {
+ ugj_fdTimeoutID = setTimeout(() => {
+ clearFd(boxOrigin.x, boxOrigin.y, width, height + arrow.height);
+ }, sec * 1000);
+ }
+
+ // return [boxOrigin.x, boxOrigin.y, width, height+arrow.height];
+ // https://qiita.com/horikeso/items/95595f379a8dfa63c34a
+}
+
+// コードジェネレータモード(Javascript/Python切り替え)
+var isPyMode;
+const ugj_pyMode = (checked) => isPyMode = checked;
+
+
+//=====================================
+//======= Blockly GUI codes ===========
+// Use in a block or block definition:
+
+// Resizable workspace injection script
+var blocklyArea = document.getElementById('blocklyArea');
+var blocklyDiv = document.getElementById('blocklyDiv');
+// var workspace = Blockly.inject(blocklyDiv,
+// {toolbox: document.getElementById('toolbox')});
+var workspace = Blockly.inject(blocklyDiv,
+ {
+ toolbox: document.getElementById('toolbox'),
+ theme: theme,
+ renderer: 'thrasos',
+
+ scrollbars: true,
+ grid: {
+ spacing: 20,
+ length: 1,
+ colour: '#888',//888
+ snap: true
+ },
+ zoom: { startScale: 1.0, controls: true },
+ trashcan: true,
+ media: './google-blockly/media/'
+ });
+var onresize = function (e) {
+ // Compute the absolute coordinates and dimensions of blocklyArea.
+ var element = blocklyArea;
+ var x = 0;
+ var y = 0;
+ do {
+ x += element.offsetLeft;
+ y += element.offsetTop;
+ element = element.offsetParent;
+ } while (element);
+ // Position blocklyDiv over blocklyArea.
+ blocklyDiv.style.left = x + 'px';
+ blocklyDiv.style.top = y + 'px';
+ blocklyDiv.style.width = blocklyArea.offsetWidth + 'px';
+ blocklyDiv.style.height = blocklyArea.offsetHeight + 'px';
+ Blockly.svgResize(workspace);
+};
+window.addEventListener('resize', onresize, false);
+onresize();
+Blockly.svgResize(workspace);
+//=====================================
+//=====================================
+
+
+// ワークスペースの未保存の変更のフラグ
+const ugj_wsUpdateCB = event => {
+ if (event.type != Blockly.Events.UI) {
+ elutil.setWsChanged(true);
+ }
+}
+
+// ウィンドウロード・アンロード時
+window.onload = () => {
+ var menu = document.getElementById('conmenu'); //独自コンテキストメニュー
+ var area = document.getElementById('dlgContent'); //対象エリア
+ var body = document.body; //bodyエリア
+ body.oncontextmenu = () => false;
+ //右クリック時に独自コンテキストメニューを表示する
+ area.addEventListener('contextmenu', function (e) {
+ menu.style.left = e.pageX + 'px';
+ menu.style.top = e.pageY + 'px';
+ menu.classList.add('on');
+ });
+ //左クリック時に独自コンテキストメニューを非表示にする
+ body.addEventListener('click', function () {
+ if (menu.classList.contains('on')) {
+ menu.classList.remove('on');
+ }
+ });
+
+ // ワークスペースといくつかの環境のオートリストア
+ ugj_loadWorkspace();
+ elutil.loadPrefsFromLS();
+ setTimeout(() => { // 環境設定のロードが終わってからイベントリスナを作成
+ workspace.addChangeListener(ugj_wsUpdateCB);
+ }, 100);
+ // 背景canvas
+ ugj_canvasBgImg(elutil.getMascotFilePath(), -1, -1);
+}
+window.onbeforeunload = () => {
+ ugj_saveWorkspace();
+ elutil.savePrefsToLS();
+ elutil.killAllChildren();
+}
diff --git a/index_elutil.js b/index_elutil.js
new file mode 100644
index 0000000..a84c277
--- /dev/null
+++ b/index_elutil.js
@@ -0,0 +1,315 @@
+/** Electron / Node.js に由来する機能に関する諸々 */
+/** ブラウザ動作時にもちょびっと対応 */
+'use strict'
+
+// ファイル定数
+const ugj_const = {
+ doc_root: '/home/pi/Documents/ocoge_docs/',
+ app_name: 'ocoge',
+ mascot_path: './img/',
+ mascot_defname: 'tamachee.png',
+ library_path: './lib/',
+ executable_path: './bin/',
+ localStorage_fname: 'ocoge.json',
+ error_ja_all: 'エラーが発生しました。\n『おこげ倶楽部』までお問い合わせください。'
+}
+
+/** クラス elUtil ****************************************************************** */
+// Electron 動作用
+class elUtil {
+ constructor() {
+ this.path = window.ocogeapi.path
+ this.fs = window.ocogeapi.fs
+ this.ipcRenderer = window.ocogeapi.electron_ipcRenderer
+ this.shell = window.ocogeapi.electron_shell
+ this.saveFilepath = null;
+ this.wsChanged = false;
+ this.mascotFilePath = this.path.join(ugj_const.mascot_path, ugj_const.mascot_defname);
+ this.children = [];
+ }
+ // 0で数値の桁合わせ : NUM=値 LEN=桁数
+ zeroPadding(NUM, LEN) {
+ return (Array(LEN).join('0') + NUM).slice(-LEN);
+ }
+ // 現在の日付時刻から workspace フォルダ内のユニークなファイルパスを作成
+ getUniqueFilepath() {
+ let today = new Date();
+ let filename = today.getFullYear() + '-' + this.zeroPadding((today.getMonth() + 1), 2) + '-' + this.zeroPadding(today.getDate(), 2) + '-' + this.zeroPadding(today.getHours(), 2) + '-' + this.zeroPadding(today.getMinutes(), 2) + '-' + this.zeroPadding(today.getSeconds(), 2);
+ let filepath = this.path.join(ugj_const.doc_root, filename);
+ return filepath;
+ }
+ // リンクを外部ブラウザで開く
+ openURL(url) {
+ this.shell.openExternal(url);
+ }
+ // saveFilepath を更新
+ // ウィンドウタイトルバーテキストを変更
+ setSaveFilepath(filepath) {
+ this.saveFilepath = filepath;
+ this.setWsChanged(false);
+ }
+ // ワークスペースが変更された・保存された
+ // ウィンドウタイトルバーテキストを変更
+ setWsChanged(changed) {
+ let title;
+ this.wsChanged = changed;
+ if (this.saveFilepath) title = this.saveFilepath + ' - ' + ugj_const.app_name;
+ else title = ugj_const.app_name;
+ if (changed) title = '*' + title;
+ this.ipcRenderer.send('set_title', title);
+ }
+ // 保存ファイルプロパティを更新
+ newFile() { this.setSaveFilepath(null); }
+ // ワークスペースファイル読み込みの一連の動作のラッパ
+ async loadWsFile() {
+ let filepath = await this.openFile('xml', ugj_const.doc_root);
+ if (filepath.length > 0) {
+ if (this.saveFilepath === null) {
+ this.setSaveFilepath(filepath);
+ } //読み込みに失敗してもsaveFilepathが更新されてしまうのはちょっと具合が悪いかも
+ return this.readFromFile(filepath);
+ } else {
+ return '';
+ }
+ }
+ // その他ファイル読み込みの一連の動作のラッパ
+ async loadFile(ext) {
+ let filepath = await this.openFile(ext, ugj_const.doc_root);
+ if (filepath.length > 0) {
+ return this.readFromFile(filepath);
+ } else {
+ return '';
+ }
+ }
+ async selectMascotFile() {
+ return await this.openFile('png', ugj_const.mascot_path);
+ }
+ // オープンファイルダイアログ
+ async openFile(ext, dpath) {
+ let title = 'Select a file';
+ let filter;
+ if (ext == 'xml') {
+ filter = { name: 'XML - Extensible Markup Language', extensions: ['xml'] };
+ } else if (ext == 'js') {
+ filter = { name: 'JS - JavaScript', extensions: ['js'] };
+ } else if (ext == 'png') {
+ filter = { name: 'PNG - Portable Network Graphics', extensions: ['png'] };
+ } else {
+ filter = { name: 'text file', extensions: ['txt'] };
+ }
+ let filepaths = await this.ipcRenderer.invoke('open_dialog', title, dpath, filter);
+ if (filepaths == undefined) {
+ return '';
+ } else {
+ return filepaths[0];
+ }
+ }
+ // ファイルからデータを読み込み
+ readFromFile(filepath) {
+ let data = '';
+ try {
+ data = this.fs.readFileSync(filepath, 'utf-8');
+ }
+ catch (err) {
+ console.log(err);
+ }
+ return data;
+ }
+ // テキストファイル読み込み: 外部スクリプト動的読み込みに使用
+ readTextFile(filepath) {
+ return this.readFromFile(filepath);
+ }
+ // ワークスペースファイル保存の一連の動作のラッパ
+ async saveWsFile(data) {
+ if (this.saveFilepath === null) {
+ let filepath = await this.selectSaveFile('xml');
+ if (filepath === undefined) { //キャンセル
+ return undefined;
+ } else {
+ this.setSaveFilepath(filepath);
+ } //これも保存が成功したら変更するようにすべきかしら
+ } else this.setWsChanged(false);
+ return this.writeToFile(this.saveFilepath, data);
+ }
+ // その他ファイル保存の一連の動作のラッパ
+ async saveFile(data, ext) {
+ let filepath = await this.selectSaveFile(ext);
+ if (filepath === undefined) { //キャンセル
+ return undefined;
+ }
+ return this.writeToFile(filepath, data);
+ }
+ // ファイル保存ダイアログ
+ async selectSaveFile(ext) {
+ let title = '保存先を決定してください';
+ let filter, filter_name;
+ let defName;
+ if (ext == 'xml') {
+ filter = { name: 'xml file', extensions: ['xml'] };
+ defName = this.getUniqueFilepath() + '.xml';
+ } else if (ext == 'js' || ext == 'py') {
+ if (ext == 'js') filter_name = 'javascript file';
+ else filter_name = 'python file'
+ filter = { name: filter_name, extensions: [ext] };
+ // ワークスペース保存名がある場合、それをベースにファイル名の候補を決める
+ if (this.saveFilepath === null) {
+ defName = this.getUniqueFilepath() + '.' + ext;
+ } else {
+ let dirname = this.path.dirname(this.saveFilepath);
+ let basename = this.path.basename(this.saveFilepath, '.xml');
+ defName = path.join(dirname, basename) + '.' + ext;
+ }
+ } else {
+ filter = { name: 'text file', extensions: ['txt'] };
+ }
+ let filename = await this.ipcRenderer.invoke('save_dialog', title, defName, filter);
+ return filename;
+ }
+ // ファイル書き込み
+ writeToFile(filepath, data) {
+ try {
+ this.fs.writeFileSync(filepath, data);
+ return true;
+ }
+ catch (err) {
+ return false;
+ }
+ }
+
+ // 子プロセス関連
+ // 新しい子プロセスを作成し、配列に保存
+ addChild(child) {
+ this.children.push(child);
+ }
+ // 全ての子プロセスを殺し、配列をクリア
+ killAllChildren() {
+ this.children.forEach(function (child) {
+ child.kill();
+ });
+ this.children = [];
+ }
+
+ // 設定(保存ファイルパスと未保存フラグ)をローカルストレージに保存
+ savePrefsToLS() {
+ let wc = '0';
+ if (this.wsChanged) wc = '1';
+ let o = { 'saveFilepath': this.saveFilepath, 'wsChanged': wc, 'mascotFilePath': this.mascotFilePath };
+ let s = JSON.stringify(o);
+ localStorage.setItem(this.localStorage_fname, s);
+ }
+
+ // 設定(保存ファイルパスと未保存フラグ)をローカルストレージからロード
+ loadPrefsFromLS() {
+ let s = localStorage.getItem(this.localStorage_fname);
+ if (s !== null) {
+ let o = JSON.parse(s);
+ this.setSaveFilepath(o.saveFilepath);
+ if (o.wsChanged == '0') this.setWsChanged(false);
+ else this.setWsChanged(true);
+ if (o.mascotFilePath) this.setMascotFilePath(o.mascotFilePath);
+ }
+ }
+
+ // マスコット画像パスをプロパティにセット
+ setMascotFilePath(fpath) {
+ this.mascotFilePath = fpath;
+ }
+ getMascotFilePath() {
+ return this.mascotFilePath;
+ }
+
+
+ // ファイル名にアプリケーションのドキュメントルートまでのパスをつけて返す
+ getDocPath(filename) {
+ return this.path.join(this.appDocRoot, filename);
+ }
+
+}
+// ブラウザ動作用
+class brUtil {
+ // マスコット
+ getMascotFilePath() { return `./img/${ugj_const.mascot_defname}`; }
+ //ワークスペースのダウンロード
+ saveWsFile(xml_text) {
+ let blob = new Blob([xml_text], { "type": "text/xml" });
+ const downLoadLink = document.createElement("a");
+ document.body.appendChild(downLoadLink);
+ downLoadLink.download = 'workspace.xml';
+ downLoadLink.href = URL.createObjectURL(blob);
+ downLoadLink.click();
+ downLoadLink.parentElement.removeChild(downLoadLink);
+ return true;
+ }
+ //ワークスペースのインポート
+ loadWsFile() {
+ const fileInputEl = document.createElement('input');
+ document.body.appendChild(fileInputEl);
+ fileInputEl.type = 'file';
+ fileInputEl.addEventListener('change', ev => {
+ let reader = new FileReader();
+ reader.readAsText(ev.target.files[0]);
+ reader.addEventListener('load', () => {
+ let xml = Blockly.Xml.textToDom(reader.result);
+ Blockly.Xml.domToWorkspace(xml, workspace);
+ });
+ });
+ fileInputEl.click();
+ fileInputEl.parentElement.removeChild(fileInputEl);
+ return '';
+ }
+
+ // index.jsから万一呼ばれても何もしない関数
+ openURL() { ; }
+ selectMascotFile() { ; }
+ setMascotFilePath(fname) { ; }
+ saveFile() { ; }
+ savePrefsToLS() { ; }
+ loadPrefsFromLS() { ; }
+ newFile() { ; }
+ setWsChanged() { ; }
+ killAllChildren() { ; }
+}
+
+// Electron 動作 / ブラウザ動作自動判別
+const is_el = (typeof window.ocogeapi !== 'undefined')
+
+// utilクラスのインスタンスを返す
+const elUtil_new = () => {
+ if (is_el) return new elUtil
+ else return new brUtil
+}
+
+// "require" for "BLOCK"s
+// ブラウザ動作時にはすべてアラートを表示
+const require = module_name => {
+ if (is_el) {
+ switch (module_name) {
+ case '@ocogeclub/lgpio':
+ return window.ocogeapi.lgpio;
+ case '@ocogeclub/bme280':
+ return window.ocogeapi.bme280;
+ case 'fs':
+ return window.ocogeapi.fs;
+ case 'path':
+ return window.ocogeapi.path;
+ default:
+ throw new Error(`Unknown module "${module_name}" required.\nStopped.`);
+ }
+ } else {
+ let block;
+ switch (module_name) {
+ case '@ocogeclub/lgpio':
+ block = 'GPIO';
+ break;
+ case '@ocogeclub/bme280':
+ block = 'BME280';
+ break;
+ case 'fs':
+ block = 'ファイル';
+ break;
+ default:
+ throw new Error(ugj_const.error_ja_all);
+ }
+ throw `ブロック「${block}」は、Web体験版ではご利用になれません。\n詳しくは https://ocoge.club/ をご覧ください。`;
+ }
+}
diff --git a/lib/models/face_landmark_68_tiny_model-weights_manifest.json b/lib/models/face_landmark_68_tiny_model-weights_manifest.json
new file mode 100644
index 0000000..83de57b
--- /dev/null
+++ b/lib/models/face_landmark_68_tiny_model-weights_manifest.json
@@ -0,0 +1,39 @@
+[
+ {
+ "weights":
+ [
+ {"name":"dense0/conv0/filters","shape":[3,3,3,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008194216092427571,"min":-0.9423348506291708}},
+ {"name":"dense0/conv0/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006839508168837603,"min":-0.8412595047670252}},
+ {"name":"dense0/conv1/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.009194007106855804,"min":-1.2779669878529567}},
+ {"name":"dense0/conv1/pointwise_filter","shape":[1,1,32,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0036026100317637128,"min":-0.3170296827952067}},
+ {"name":"dense0/conv1/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.000740380117706224,"min":-0.06367269012273527}},
+ {"name":"dense0/conv2/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":1,"min":0}},
+ {"name":"dense0/conv2/pointwise_filter","shape":[1,1,32,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":1,"min":0}},
+ {"name":"dense0/conv2/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0037702228508743585,"min":-0.6220867703942692}},
+ {"name":"dense1/conv0/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0033707996209462483,"min":-0.421349952618281}},
+ {"name":"dense1/conv0/pointwise_filter","shape":[1,1,32,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.014611541991140328,"min":-1.8556658328748217}},
+ {"name":"dense1/conv0/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002832523046755323,"min":-0.30307996600281956}},
+ {"name":"dense1/conv1/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006593170586754294,"min":-0.6329443763284123}},
+ {"name":"dense1/conv1/pointwise_filter","shape":[1,1,64,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.012215249211180444,"min":-1.6001976466646382}},
+ {"name":"dense1/conv1/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002384825547536214,"min":-0.3028728445370992}},
+ {"name":"dense1/conv2/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005859645441466687,"min":-0.7617539073906693}},
+ {"name":"dense1/conv2/pointwise_filter","shape":[1,1,64,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.013121426806730382,"min":-1.7845140457153321}},
+ {"name":"dense1/conv2/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0032247188044529336,"min":-0.46435950784122243}},
+ {"name":"dense2/conv0/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002659512618008782,"min":-0.32977956463308894}},
+ {"name":"dense2/conv0/pointwise_filter","shape":[1,1,64,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.015499923743453681,"min":-1.9839902391620712}},
+ {"name":"dense2/conv0/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0032450980999890497,"min":-0.522460794098237}},
+ {"name":"dense2/conv1/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005911862382701799,"min":-0.792189559282041}},
+ {"name":"dense2/conv1/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.021025861478319356,"min":-2.2077154552235325}},
+ {"name":"dense2/conv1/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00349616945958605,"min":-0.46149436866535865}},
+ {"name":"dense2/conv2/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008104994250278847,"min":-1.013124281284856}},
+ {"name":"dense2/conv2/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.029337059282789044,"min":-3.5791212325002633}},
+ {"name":"dense2/conv2/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0038808938334969913,"min":-0.4230174278511721}},
+ {"name":"fc/weights","shape":[128,136],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.014016061670639936,"min":-1.8921683255363912}},
+ {"name":"fc/bias","shape":[136],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0029505149698724935,"min":0.088760145008564}}
+ ],
+ "paths":
+ [
+ "face_landmark_68_tiny_model.bin"
+ ]
+ }
+]
\ No newline at end of file
diff --git a/lib/models/face_landmark_68_tiny_model.bin b/lib/models/face_landmark_68_tiny_model.bin
new file mode 100644
index 0000000..f04a9d5
Binary files /dev/null and b/lib/models/face_landmark_68_tiny_model.bin differ
diff --git a/lib/models/tiny_face_detector_model-weights_manifest.json b/lib/models/tiny_face_detector_model-weights_manifest.json
index 7d3b222..d11c9a3 100644
--- a/lib/models/tiny_face_detector_model-weights_manifest.json
+++ b/lib/models/tiny_face_detector_model-weights_manifest.json
@@ -1 +1,30 @@
-[{"weights":[{"name":"conv0/filters","shape":[3,3,3,16],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.009007044399485869,"min":-1.2069439495311063}},{"name":"conv0/bias","shape":[16],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005263455241334205,"min":-0.9211046672334858}},{"name":"conv1/depthwise_filter","shape":[3,3,16,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004001977630690033,"min":-0.5042491814669441}},{"name":"conv1/pointwise_filter","shape":[1,1,16,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.013836609615999109,"min":-1.411334180831909}},{"name":"conv1/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0015159862590771096,"min":-0.30926119685173037}},{"name":"conv2/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002666276225856706,"min":-0.317286870876948}},{"name":"conv2/pointwise_filter","shape":[1,1,32,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.015265831292844286,"min":-1.6792414422128714}},{"name":"conv2/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0020280554598453,"min":-0.37113414915168985}},{"name":"conv3/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006100742489683862,"min":-0.8907084034938438}},{"name":"conv3/pointwise_filter","shape":[1,1,64,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.016276211832083907,"min":-2.0508026908425725}},{"name":"conv3/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.003394414279975143,"min":-0.7637432129944072}},{"name":"conv4/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006716050119961009,"min":-0.8059260143953211}},{"name":"conv4/pointwise_filter","shape":[1,1,128,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.021875603993733724,"min":-2.8875797271728514}},{"name":"conv4/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0041141652009066415,"min":-0.8187188749804216}},{"name":"conv5/depthwise_filter","shape":[3,3,256,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008423839597141042,"min":-0.9013508368940915}},{"name":"conv5/pointwise_filter","shape":[1,1,256,512],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.030007277283014035,"min":-3.8709387695088107}},{"name":"conv5/bias","shape":[512],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008402082966823203,"min":-1.4871686851277068}},{"name":"conv8/filters","shape":[1,1,512,25],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.028336129469030042,"min":-4.675461362389957}},{"name":"conv8/bias","shape":[25],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002268134028303857,"min":-0.41053225912299807}}],"paths":["tiny_face_detector_model-shard1"]}]
\ No newline at end of file
+[
+ {
+ "weights":
+ [
+ {"name":"conv0/filters","shape":[3,3,3,16],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.009007044399485869,"min":-1.2069439495311063}},
+ {"name":"conv0/bias","shape":[16],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005263455241334205,"min":-0.9211046672334858}},
+ {"name":"conv1/depthwise_filter","shape":[3,3,16,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004001977630690033,"min":-0.5042491814669441}},
+ {"name":"conv1/pointwise_filter","shape":[1,1,16,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.013836609615999109,"min":-1.411334180831909}},
+ {"name":"conv1/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0015159862590771096,"min":-0.30926119685173037}},
+ {"name":"conv2/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002666276225856706,"min":-0.317286870876948}},
+ {"name":"conv2/pointwise_filter","shape":[1,1,32,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.015265831292844286,"min":-1.6792414422128714}},
+ {"name":"conv2/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0020280554598453,"min":-0.37113414915168985}},
+ {"name":"conv3/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006100742489683862,"min":-0.8907084034938438}},
+ {"name":"conv3/pointwise_filter","shape":[1,1,64,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.016276211832083907,"min":-2.0508026908425725}},
+ {"name":"conv3/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.003394414279975143,"min":-0.7637432129944072}},
+ {"name":"conv4/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006716050119961009,"min":-0.8059260143953211}},
+ {"name":"conv4/pointwise_filter","shape":[1,1,128,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.021875603993733724,"min":-2.8875797271728514}},
+ {"name":"conv4/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0041141652009066415,"min":-0.8187188749804216}},
+ {"name":"conv5/depthwise_filter","shape":[3,3,256,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008423839597141042,"min":-0.9013508368940915}},
+ {"name":"conv5/pointwise_filter","shape":[1,1,256,512],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.030007277283014035,"min":-3.8709387695088107}},
+ {"name":"conv5/bias","shape":[512],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008402082966823203,"min":-1.4871686851277068}},
+ {"name":"conv8/filters","shape":[1,1,512,25],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.028336129469030042,"min":-4.675461362389957}},
+ {"name":"conv8/bias","shape":[25],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002268134028303857,"min":-0.41053225912299807}}
+ ],
+ "paths":
+ [
+ "tiny_face_detector_model.bin"
+ ]
+ }
+]
\ No newline at end of file
diff --git a/lib/models/tiny_face_detector_model-shard1 b/lib/models/tiny_face_detector_model.bin
similarity index 100%
rename from lib/models/tiny_face_detector_model-shard1
rename to lib/models/tiny_face_detector_model.bin
diff --git a/local_modules/@ocogeclub/bme280/BME280.js b/local_modules/@ocogeclub/bme280/BME280.js
index e69f369..d35238b 100644
--- a/local_modules/@ocogeclub/bme280/BME280.js
+++ b/local_modules/@ocogeclub/bme280/BME280.js
@@ -1,269 +1,266 @@
'use strict';
-// const { strictEqual } = require('assert');
+this.pi = null;
-class BME280 {
+this.i2cBusNo = null;
+this.i2cAddress = null;
+this.i2cHand = null;
- constructor(options) {
- this.pi = require('@ocogeclub/lgpio');
+this.I2C_ADDRESS_B = 0x76;
+this.I2C_ADDRESS_A = 0x77;
+this.CHIP_ID = 0x58;
- this.i2cBusNo = (options && options.hasOwnProperty('i2cBusNo')) ? options.i2cBusNo : 1;
- this.i2cAddress = (options && options.hasOwnProperty('i2cAddress')) ? options.i2cAddress : BME280.BME280_DEFAULT_I2C_ADDRESS();
- this.i2cHand = this.pi.i2c_open(this.i2cBusNo, this.i2cAddress);
+this.REGISTER_DIG_T1 = 0x88;
+this.REGISTER_DIG_T2 = 0x8A;
+this.REGISTER_DIG_T3 = 0x8C;
- this.I2C_ADDRESS_B = 0x76;
- this.I2C_ADDRESS_A = 0x77;
- this.CHIP_ID = 0x58;
+this.REGISTER_DIG_P1 = 0x8E;
+this.REGISTER_DIG_P2 = 0x90;
+this.REGISTER_DIG_P3 = 0x92;
+this.REGISTER_DIG_P4 = 0x94;
+this.REGISTER_DIG_P5 = 0x96;
+this.REGISTER_DIG_P6 = 0x98;
+this.REGISTER_DIG_P7 = 0x9A;
+this.REGISTER_DIG_P8 = 0x9C;
+this.REGISTER_DIG_P9 = 0x9E;
- this.REGISTER_DIG_T1 = 0x88;
- this.REGISTER_DIG_T2 = 0x8A;
- this.REGISTER_DIG_T3 = 0x8C;
+this.REGISTER_DIG_H1 = 0xA1;
+this.REGISTER_DIG_H2 = 0xE1;
+this.REGISTER_DIG_H3 = 0xE3;
+this.REGISTER_DIG_H4 = 0xE4;
+this.REGISTER_DIG_H5 = 0xE5;
+this.REGISTER_DIG_H6 = 0xE7;
- this.REGISTER_DIG_P1 = 0x8E;
- this.REGISTER_DIG_P2 = 0x90;
- this.REGISTER_DIG_P3 = 0x92;
- this.REGISTER_DIG_P4 = 0x94;
- this.REGISTER_DIG_P5 = 0x96;
- this.REGISTER_DIG_P6 = 0x98;
- this.REGISTER_DIG_P7 = 0x9A;
- this.REGISTER_DIG_P8 = 0x9C;
- this.REGISTER_DIG_P9 = 0x9E;
+this.REGISTER_CHIPID = 0xD0;
+this.REGISTER_RESET = 0xE0;
- this.REGISTER_DIG_H1 = 0xA1;
- this.REGISTER_DIG_H2 = 0xE1;
- this.REGISTER_DIG_H3 = 0xE3;
- this.REGISTER_DIG_H4 = 0xE4;
- this.REGISTER_DIG_H5 = 0xE5;
- this.REGISTER_DIG_H6 = 0xE7;
+this.REGISTER_CONTROL_HUM = 0xF2;
+this.REGISTER_CONTROL = 0xF4;
+this.REGISTER_PRESSURE_DATA = 0xF7;
+this.REGISTER_TEMP_DATA = 0xFA;
+this.REGISTER_HUMIDITY_DATA = 0xFD;
- this.REGISTER_CHIPID = 0xD0;
- this.REGISTER_RESET = 0xE0;
+exports.init = (options) => {
+ this.pi = require('@ocogeclub/lgpio');
- this.REGISTER_CONTROL_HUM = 0xF2;
- this.REGISTER_CONTROL = 0xF4;
- this.REGISTER_PRESSURE_DATA = 0xF7;
- this.REGISTER_TEMP_DATA = 0xFA;
- this.REGISTER_HUMIDITY_DATA = 0xFD;
+ this.i2cBusNo = (options && options.hasOwnProperty('i2cBusNo')) ? options.i2cBusNo : 1;
+ this.i2cAddress = (options && options.hasOwnProperty('i2cAddress')) ? options.i2cAddress : this.BME280_DEFAULT_I2C_ADDRESS();
+ this.i2cHand = this.pi.i2c_open(this.i2cBusNo, this.i2cAddress);
+
+ let r;
+ r = this.pi.i2c_write_byte_data(this.i2cHand, this.REGISTER_CHIPID, 0);
+ if (r < 0) return r;
+ let chipId = this.pi.i2c_read_byte_data(this.i2cHand, this.REGISTER_CHIPID);
+ if (chipId !== this.CHIP_ID_BME280() &&
+ chipId !== this.CHIP_ID1_BMP280() &&
+ chipId !== this.CHIP_ID2_BMP280() &&
+ chipId !== this.CHIP_ID3_BMP280()) {
+ return `Unexpected BMx280 chip ID: 0x${chipId.toString(16).toUpperCase()}`;
}
-
- init() {
- let r;
- r = this.pi.i2c_write_byte_data(this.i2cHand, this.REGISTER_CHIPID, 0);
- if (r < 0) return r;
- let chipId = this.pi.i2c_read_byte_data(this.i2cHand, this.REGISTER_CHIPID);
- if (chipId !== BME280.CHIP_ID_BME280() &&
- chipId !== BME280.CHIP_ID1_BMP280() &&
- chipId !== BME280.CHIP_ID2_BMP280() &&
- chipId !== BME280.CHIP_ID3_BMP280()) {
- return `Unexpected BMx280 chip ID: 0x${chipId.toString(16).toUpperCase()}`;
+ // console.log(`Found BMx280 chip ID 0x${chipId.toString(16).toUpperCase()} on bus i2c-${this.i2cBusNo}, address 0x${this.i2cAddress.toString(16).toUpperCase()}`);
+ this.loadCalibration((err) => {
+ if (err) {
+ return err;
}
- // console.log(`Found BMx280 chip ID 0x${chipId.toString(16).toUpperCase()} on bus i2c-${this.i2cBusNo}, address 0x${this.i2cAddress.toString(16).toUpperCase()}`);
- this.loadCalibration((err) => {
- if (err) {
- return err;
- }
- // Humidity 16x oversampling
- //
- let r = this.pi.i2c_write_byte_data(this.i2cHand, this.REGISTER_CONTROL_HUM, 0b00000101);
- if (r < 0) return `Humidity 16x oversampling error: ${r}`;
- // Temperture/pressure 16x oversampling, normal mode
- //
- r = this.pi.i2c_write_byte_data(this.i2cHand, this.REGISTER_CONTROL, 0b10110111);
- if (r < 0) return `Temperture/pressure 16x oversampling error: ${r}`;
-
- return 0;
- });
- }
-
- // reset()
- //
- // Perform a power-on reset procedure. You will need to call init() following a reset()
- //
- reset() {
- const POWER_ON_RESET_CMD = 0xB6;
- let r = this.pi.i2c_write_byte_data(this.i2cHand, this.REGISTER_RESET, POWER_ON_RESET_CMD);
- if (r < 0) return `cannot power-on reset: ${r}`;
- else return 0;
- }
-
- // cancel()
- //
- // Cancels the sensor and releases resources.
- //
- cancel() {
- if (this.i2cHand >= 0) {
- this.pi.i2c_close(this.i2cHand);
- this.i2cHand = 0;
- }
- }
-
- readSensorData() {
- if (!this.cal) {
- return 'You must first call bme280.init()';
- }
-
- // Grab temperature, humidity, and pressure in a single read
+ // Humidity 16x oversampling
//
- let buffer = this.pi.i2c_read_i2c_block_data(this.i2cHand, this.REGISTER_PRESSURE_DATA, 8);
- if (!buffer) return `couldn't grab data`;
- // Temperature (temperature first since we need t_fine for pressure and humidity)
+ let r = this.pi.i2c_write_byte_data(this.i2cHand, this.REGISTER_CONTROL_HUM, 0b00000101);
+ if (r < 0) return `Humidity 16x oversampling error: ${r}`;
+ // Temperture/pressure 16x oversampling, normal mode
//
- let adc_T = BME280.uint20(buffer[3], buffer[4], buffer[5]);
- let tvar1 = ((((adc_T >> 3) - (this.cal.dig_T1 << 1))) * this.cal.dig_T2) >> 11;
- let tvar2 = (((((adc_T >> 4) - this.cal.dig_T1) * ((adc_T >> 4) - this.cal.dig_T1)) >> 12) * this.cal.dig_T3) >> 14;
- let t_fine = tvar1 + tvar2;
-
- let temperature_C = ((t_fine * 5 + 128) >> 8) / 100;
-
- // Pressure
- //
- let adc_P = BME280.uint20(buffer[0], buffer[1], buffer[2]);
- let pvar1 = t_fine / 2 - 64000;
- let pvar2 = pvar1 * pvar1 * this.cal.dig_P6 / 32768;
- pvar2 = pvar2 + pvar1 * this.cal.dig_P5 * 2;
- pvar2 = pvar2 / 4 + this.cal.dig_P4 * 65536;
- pvar1 = (this.cal.dig_P3 * pvar1 * pvar1 / 524288 + this.cal.dig_P2 * pvar1) / 524288;
- pvar1 = (1 + pvar1 / 32768) * this.cal.dig_P1;
-
- let pressure_hPa = 0;
-
- if (pvar1 !== 0) {
- let p = 1048576 - adc_P;
- p = ((p - pvar2 / 4096) * 6250) / pvar1;
- pvar1 = this.cal.dig_P9 * p * p / 2147483648;
- pvar2 = p * this.cal.dig_P8 / 32768;
- p = p + (pvar1 + pvar2 + this.cal.dig_P7) / 16;
-
- pressure_hPa = p / 100;
- }
-
- // Humidity (available on the BME280, will be zero on the BMP280 since it has no humidity sensor)
- //
- let adc_H = BME280.uint16(buffer[6], buffer[7]);
-
- let h = t_fine - 76800;
- h = (adc_H - (this.cal.dig_H4 * 64 + this.cal.dig_H5 / 16384 * h)) *
- (this.cal.dig_H2 / 65536 * (1 + this.cal.dig_H6 / 67108864 * h * (1 + this.cal.dig_H3 / 67108864 * h)));
- h = h * (1 - this.cal.dig_H1 * h / 524288);
-
- let humidity = (h > 100) ? 100 : (h < 0 ? 0 : h);
-
- return {
- temperature_C: temperature_C,
- humidity: humidity,
- pressure_hPa: pressure_hPa
- };
- }
-
- loadCalibration(callback) {
- let buffer = this.pi.i2c_read_i2c_block_data(this.i2cHand, this.REGISTER_DIG_T1, 24);
- // for (let i = 0; i < 24; i++) console.log(parseInt(buffer[i], 16));
- if (buffer) {
- let h1 = this.pi.i2c_read_byte_data(this.i2cHand, this.REGISTER_DIG_H1);
- let h2 = this.pi.i2c_read_word_data(this.i2cHand, this.REGISTER_DIG_H2);
- let h3 = this.pi.i2c_read_byte_data(this.i2cHand, this.REGISTER_DIG_H3);
- let h4 = this.pi.i2c_read_byte_data(this.i2cHand, this.REGISTER_DIG_H4);
- let h5 = this.pi.i2c_read_byte_data(this.i2cHand, this.REGISTER_DIG_H5);
- let h5_1 = this.pi.i2c_read_byte_data(this.i2cHand, this.REGISTER_DIG_H5 + 1);
- let h6 = this.pi.i2c_read_byte_data(this.i2cHand, this.REGISTER_DIG_H6);
-
- this.cal = {
- dig_T1: BME280.uint16(buffer[1], buffer[0]),
- dig_T2: BME280.int16(buffer[3], buffer[2]),
- dig_T3: BME280.int16(buffer[5], buffer[4]),
-
- dig_P1: BME280.uint16(buffer[7], buffer[6]),
- dig_P2: BME280.int16(buffer[9], buffer[8]),
- dig_P3: BME280.int16(buffer[11], buffer[10]),
- dig_P4: BME280.int16(buffer[13], buffer[12]),
- dig_P5: BME280.int16(buffer[15], buffer[14]),
- dig_P6: BME280.int16(buffer[17], buffer[16]),
- dig_P7: BME280.int16(buffer[19], buffer[18]),
- dig_P8: BME280.int16(buffer[21], buffer[20]),
- dig_P9: BME280.int16(buffer[23], buffer[22]),
-
- dig_H1: h1,
- dig_H2: h2,
- dig_H3: h3,
- dig_H4: (h4 << 4) | (h5 & 0xF),
- dig_H5: (h5_1 << 4) | (h5 >> 4),
- dig_H6: h6
- };
-
- // console.log('BME280 cal = ' + JSON.stringify(this.cal, null, 2));
- callback();
- }
- }
-
- static BME280_DEFAULT_I2C_ADDRESS() {
- return 0x77;
- }
-
- static CHIP_ID1_BMP280() {
- return 0x56;
- }
-
- static CHIP_ID2_BMP280() {
- return 0x57;
- }
-
- static CHIP_ID3_BMP280() {
- return 0x58;
- }
-
- static CHIP_ID_BME280() {
- return 0x60;
- }
-
- static int16(msb, lsb) {
- let val = BME280.uint16(msb, lsb);
- return val > 32767 ? (val - 65536) : val;
- }
-
- static uint16(msb, lsb) {
- return msb << 8 | lsb;
- }
-
- static uint20(msb, lsb, xlsb) {
- return ((msb << 8 | lsb) << 8 | xlsb) >> 4;
- }
-
- static convertCelciusToFahrenheit(c) {
- return c * 9 / 5 + 32;
- }
-
- static convertHectopascalToInchesOfMercury(hPa) {
- return hPa * 0.02952998751;
- }
-
- static convertMetersToFeet(m) {
- return m * 3.28084;
- }
-
- static calculateHeatIndexCelcius(temperature_C, humidity) {
- return -8.784695 + 1.61139411 * temperature_C + 2.33854900 * humidity +
- -0.14611605 * temperature_C * humidity + -0.01230809 * Math.pow(temperature_C, 2) +
- -0.01642482 * Math.pow(humidity, 2) + 0.00221173 * Math.pow(temperature_C, 2) * humidity +
- 0.00072546 * temperature_C * Math.pow(humidity, 2) +
- -0.00000358 * Math.pow(temperature_C, 2) * Math.pow(humidity, 2);
- }
-
- static calculateDewPointCelcius(temperature_C, humidity) {
- return 243.04 * (Math.log(humidity / 100.0) + ((17.625 * temperature_C) / (243.04 + temperature_C))) /
- (17.625 - Math.log(humidity / 100.0) - ((17.625 * temperature_C) / (243.04 + temperature_C)));
- }
-
- static calculateAltitudeMeters(pressure_hPa, seaLevelPressure_hPa) {
- if (!seaLevelPressure_hPa) {
- seaLevelPressure_hPa = 1013.25;
- }
-
- return (1.0 - Math.pow(pressure_hPa / seaLevelPressure_hPa, (1 / 5.2553))) * 145366.45 * 0.3048;
- }
+ r = this.pi.i2c_write_byte_data(this.i2cHand, this.REGISTER_CONTROL, 0b10110111);
+ if (r < 0) return `Temperture/pressure 16x oversampling error: ${r}`;
+ return 0;
+ });
+}
+
+// reset()
+//
+// Perform a power-on reset procedure. You will need to call init() following a reset()
+//
+exports.reset = () => {
+ const POWER_ON_RESET_CMD = 0xB6;
+ let r = this.pi.i2c_write_byte_data(this.i2cHand, this.REGISTER_RESET, POWER_ON_RESET_CMD);
+ if (r < 0) return `cannot power-on reset: ${r}`;
+ else return 0;
+}
+
+// cancel()
+//
+// Cancels the sensor and releases resources.
+//
+exports.cancel = () => {
+ if (this.i2cHand >= 0) {
+ this.pi.i2c_close(this.i2cHand);
+ this.i2cHand = 0;
+ }
+}
+
+exports.readSensorData = () => {
+ if (!this.cal) {
+ return 'You must first call bme280.init()';
+ }
+
+ // Grab temperature, humidity, and pressure in a single read
+ //
+ let buffer = this.pi.i2c_read_i2c_block_data(this.i2cHand, this.REGISTER_PRESSURE_DATA, 8);
+ if (!buffer) return `couldn't grab data`;
+ // Temperature (temperature first since we need t_fine for pressure and humidity)
+ //
+ let adc_T = this.uint20(buffer[3], buffer[4], buffer[5]);
+ let tvar1 = ((((adc_T >> 3) - (this.cal.dig_T1 << 1))) * this.cal.dig_T2) >> 11;
+ let tvar2 = (((((adc_T >> 4) - this.cal.dig_T1) * ((adc_T >> 4) - this.cal.dig_T1)) >> 12) * this.cal.dig_T3) >> 14;
+ let t_fine = tvar1 + tvar2;
+
+ let temperature_C = ((t_fine * 5 + 128) >> 8) / 100;
+
+ // Pressure
+ //
+ let adc_P = this.uint20(buffer[0], buffer[1], buffer[2]);
+ let pvar1 = t_fine / 2 - 64000;
+ let pvar2 = pvar1 * pvar1 * this.cal.dig_P6 / 32768;
+ pvar2 = pvar2 + pvar1 * this.cal.dig_P5 * 2;
+ pvar2 = pvar2 / 4 + this.cal.dig_P4 * 65536;
+ pvar1 = (this.cal.dig_P3 * pvar1 * pvar1 / 524288 + this.cal.dig_P2 * pvar1) / 524288;
+ pvar1 = (1 + pvar1 / 32768) * this.cal.dig_P1;
+
+ let pressure_hPa = 0;
+
+ if (pvar1 !== 0) {
+ let p = 1048576 - adc_P;
+ p = ((p - pvar2 / 4096) * 6250) / pvar1;
+ pvar1 = this.cal.dig_P9 * p * p / 2147483648;
+ pvar2 = p * this.cal.dig_P8 / 32768;
+ p = p + (pvar1 + pvar2 + this.cal.dig_P7) / 16;
+
+ pressure_hPa = p / 100;
+ }
+
+ // Humidity (available on the BME280, will be zero on the BMP280 since it has no humidity sensor)
+ //
+ let adc_H = this.uint16(buffer[6], buffer[7]);
+
+ let h = t_fine - 76800;
+ h = (adc_H - (this.cal.dig_H4 * 64 + this.cal.dig_H5 / 16384 * h)) *
+ (this.cal.dig_H2 / 65536 * (1 + this.cal.dig_H6 / 67108864 * h * (1 + this.cal.dig_H3 / 67108864 * h)));
+ h = h * (1 - this.cal.dig_H1 * h / 524288);
+
+ let humidity = (h > 100) ? 100 : (h < 0 ? 0 : h);
+
+ return {
+ temperature_C: temperature_C,
+ humidity: humidity,
+ pressure_hPa: pressure_hPa
+ };
+}
+
+exports.loadCalibration = (callback) => {
+ let buffer = this.pi.i2c_read_i2c_block_data(this.i2cHand, this.REGISTER_DIG_T1, 24);
+ // for (let i = 0; i < 24; i++) console.log(parseInt(buffer[i], 16));
+ if (buffer) {
+ let h1 = this.pi.i2c_read_byte_data(this.i2cHand, this.REGISTER_DIG_H1);
+ let h2 = this.pi.i2c_read_word_data(this.i2cHand, this.REGISTER_DIG_H2);
+ let h3 = this.pi.i2c_read_byte_data(this.i2cHand, this.REGISTER_DIG_H3);
+ let h4 = this.pi.i2c_read_byte_data(this.i2cHand, this.REGISTER_DIG_H4);
+ let h5 = this.pi.i2c_read_byte_data(this.i2cHand, this.REGISTER_DIG_H5);
+ let h5_1 = this.pi.i2c_read_byte_data(this.i2cHand, this.REGISTER_DIG_H5 + 1);
+ let h6 = this.pi.i2c_read_byte_data(this.i2cHand, this.REGISTER_DIG_H6);
+
+ this.cal = {
+ dig_T1: this.uint16(buffer[1], buffer[0]),
+ dig_T2: this.int16(buffer[3], buffer[2]),
+ dig_T3: this.int16(buffer[5], buffer[4]),
+
+ dig_P1: this.uint16(buffer[7], buffer[6]),
+ dig_P2: this.int16(buffer[9], buffer[8]),
+ dig_P3: this.int16(buffer[11], buffer[10]),
+ dig_P4: this.int16(buffer[13], buffer[12]),
+ dig_P5: this.int16(buffer[15], buffer[14]),
+ dig_P6: this.int16(buffer[17], buffer[16]),
+ dig_P7: this.int16(buffer[19], buffer[18]),
+ dig_P8: this.int16(buffer[21], buffer[20]),
+ dig_P9: this.int16(buffer[23], buffer[22]),
+
+ dig_H1: h1,
+ dig_H2: h2,
+ dig_H3: h3,
+ dig_H4: (h4 << 4) | (h5 & 0xF),
+ dig_H5: (h5_1 << 4) | (h5 >> 4),
+ dig_H6: h6
+ };
+
+ // console.log('BME280 cal = ' + JSON.stringify(this.cal, null, 2));
+ callback();
+ }
+}
+
+exports.BME280_DEFAULT_I2C_ADDRESS = () => {
+ return 0x77;
+}
+
+exports.CHIP_ID1_BMP280 = () => {
+ return 0x56;
+}
+
+exports.CHIP_ID2_BMP280 = () => {
+ return 0x57;
+}
+
+exports.CHIP_ID3_BMP280 = () => {
+ return 0x58;
+}
+
+exports.CHIP_ID_BME280 = () => {
+ return 0x60;
+}
+
+exports.int16 = (msb, lsb) => {
+ let val = this.uint16(msb, lsb);
+ return val > 32767 ? (val - 65536) : val;
+}
+
+exports.uint16 = (msb, lsb) => {
+ return msb << 8 | lsb;
+}
+
+exports.uint20 = (msb, lsb, xlsb) => {
+ return ((msb << 8 | lsb) << 8 | xlsb) >> 4;
+}
+
+exports.convertCelciusToFahrenheit = (c) => {
+ return c * 9 / 5 + 32;
+}
+
+exports.convertHectopascalToInchesOfMercury = (hPa) => {
+ return hPa * 0.02952998751;
+}
+
+exports.convertMetersToFeet = (m) => {
+ return m * 3.28084;
+}
+
+exports.calculateHeatIndexCelcius = (temperature_C, humidity) => {
+ return -8.784695 + 1.61139411 * temperature_C + 2.33854900 * humidity +
+ -0.14611605 * temperature_C * humidity + -0.01230809 * Math.pow(temperature_C, 2) +
+ -0.01642482 * Math.pow(humidity, 2) + 0.00221173 * Math.pow(temperature_C, 2) * humidity +
+ 0.00072546 * temperature_C * Math.pow(humidity, 2) +
+ -0.00000358 * Math.pow(temperature_C, 2) * Math.pow(humidity, 2);
+}
+
+exports.calculateDewPointCelcius = (temperature_C, humidity) => {
+ return 243.04 * (Math.log(humidity / 100.0) + ((17.625 * temperature_C) / (243.04 + temperature_C))) /
+ (17.625 - Math.log(humidity / 100.0) - ((17.625 * temperature_C) / (243.04 + temperature_C)));
+}
+
+exports.calculateAltitudeMeters = (pressure_hPa, seaLevelPressure_hPa) => {
+ if (!seaLevelPressure_hPa) {
+ seaLevelPressure_hPa = 1013.25;
+ }
+
+ return (1.0 - Math.pow(pressure_hPa / seaLevelPressure_hPa, (1 / 5.2553))) * 145366.45 * 0.3048;
}
-module.exports = BME280;
/*
* This code was forked from skylarstein's bme280-sensor: https://github.com/skylarstein/bme280-sensor
diff --git a/main.js b/main.js
new file mode 100644
index 0000000..c61c4e3
--- /dev/null
+++ b/main.js
@@ -0,0 +1,178 @@
+const { app, BrowserWindow, Menu, session, ipcMain, dialog } = require('electron')
+const path = require('path')
+
+/** Force disable security warning */
+process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true'
+
+// Keep a global reference of the window object, if you don't, the window will
+// be closed automatically when the JavaScript object is garbage collected.
+let win
+
+function createWindow() {
+ // Create the browser window.
+ win = new BrowserWindow({
+ /** Icon */
+ icon: "./icon.png",
+ width: 1280,
+ height: 940,
+ webPreferences: {
+ preload: path.join(__dirname, 'preload.js')
+ // nodeIntegration: true,
+ // contextIsolation: false
+ }
+ })
+ /** Maximize Window at startup */
+ win.maximize()
+
+ // and load the index.html of the app.
+ win.loadFile('index.html')
+
+ // Open the DevTools.
+ win.webContents.openDevTools()
+
+ // Emitted when the window is closed.
+ // win.on('closed', () => {
+ // // Dereference the window object, usually you would store windows
+ // // in an array if your app supports multi windows, this is the time
+ // // when you should delete the corresponding element.
+ // win = null
+ // })
+
+ /** For SkyWay */
+ session.defaultSession.webRequest.onBeforeSendHeaders((details, callback) => {
+ details.requestHeaders['Origin'] = 'electron://localhost'
+ callback({
+ cancel: false,
+ requestHeaders: details.requestHeaders
+ })
+ })
+}
+
+// This method will be called when Electron has finished
+// initialization and is ready to create browser windows.
+// Some APIs can only be used after this event occurs.
+// app.on('ready', createWindow)
+app.whenReady().then(() => {
+ createWindow()
+
+ app.on('activate', function () {
+ // On macOS it's common to re-create a window in the app when the
+ // dock icon is clicked and there are no other windows open.
+ if (BrowserWindow.getAllWindows().length === 0) createWindow()
+ })
+
+ /** Custom Menu */
+ let template = [
+ {
+ label: 'Menu',
+ submenu: [
+ {
+ label: 'Toggle Menu Bar',
+ click: () => {
+ win.setMenuBarVisibility(!win.menuBarVisible)
+ },
+ accelerator: "CommandOrControl+Shift+M"
+ },
+ {
+ label: 'Reload',
+ click: () => {
+ win.reload()
+ },
+ accelerator: "F5"
+ },
+ {
+ label: 'Mascot',
+ click: (item, focusedWindow) => {
+ if (focusedWindow)
+ focusedWindow.webContents.executeJavaScript('ugj_selectMascot()')
+ },
+ accelerator: "CommandOrControl+M"
+ },
+ {
+ label: 'Toggle Developer Tools',
+ click: () => {
+ win.webContents.toggleDevTools()
+ },
+ accelerator: "F12"
+ },
+ {
+ label: 'About',
+ click: () => {
+ var os = require('os')
+ var detail = 'Version: ' + process.env.npm_package_version + '\n'
+ + 'Node.js: ' + process.versions.node + '\n'
+ + 'Chrome: ' + process.versions.chrome + '\n'
+ + 'Electron: ' + process.versions.electron + '\n'
+ + 'V8: ' + process.versions.v8 + '\n'
+ + 'OS: ' + os.type + ' ' + os.arch + ' ' + os.version + ' ' + os.release
+ var options = {
+ type: 'info',
+ buttons: ['OK'],
+ title: 'OCoGe',
+ message: 'OCoGe - Oiwa Code Generator',
+ detail: detail
+ }
+ require('electron').dialog.showMessageBox(win, options)
+ },
+ accelerator: "CommandOrControl+I"
+ },
+ {
+ label: 'Quit',
+ click: () => {
+ app.quit()
+ },
+ accelerator: "CommandOrControl+Q"
+ }
+ ]
+ }
+ ]
+ const menu = Menu.buildFromTemplate(template)
+ Menu.setApplicationMenu(menu)
+ win.setMenuBarVisibility(false)
+})
+
+
+// Quit when all windows are closed.
+app.on('window-all-closed', () => {
+ // On macOS it is common for applications and their menu bar
+ // to stay active until the user quits explicitly with Cmd + Q
+ if (process.platform !== 'darwin') {
+ app.quit()
+ }
+})
+
+// app.on('activate', () => {
+// // On macOS it's common to re-create a window in the app when the
+// // dock icon is clicked and there are no other windows open.
+// if (win === null) {
+// createWindow()
+// }
+// })
+
+// In this file you can include the rest of your app's specific main process
+// code. You can also put them in separate files and require them here.
+
+// IPC
+ipcMain.on('set_title', (ev, title) => {
+ win.setTitle(title)
+})
+ipcMain.handle('open_dialog', (ev, title, dpath, filter) => {
+ let filepaths = dialog.showOpenDialogSync(win, {
+ properties: ['openFile'],
+ title: title,
+ defaultPath: dpath,
+ filters: [
+ filter
+ ]
+ })
+ return filepaths
+})
+ipcMain.handle('save_dialog', (ev, title, defName, filter) => {
+ let filename = dialog.showSaveDialogSync(win, {
+ title: title,
+ defaultPath: defName,
+ filters: [filter]
+ })
+ console.log(filename)
+ return filename
+})
diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644
index 2559358..0000000
--- a/package-lock.json
+++ /dev/null
@@ -1,2252 +0,0 @@
-{
- "name": "ocoge",
- "version": "0.1.3",
- "lockfileVersion": 1,
- "requires": true,
- "dependencies": {
- "@electron/get": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.13.0.tgz",
- "integrity": "sha512-+SjZhRuRo+STTO1Fdhzqnv9D2ZhjxXP6egsJ9kiO8dtP68cDx7dFCwWi64dlMQV7sWcfW1OYCW4wviEBzmRsfQ==",
- "dev": true,
- "requires": {
- "debug": "^4.1.1",
- "env-paths": "^2.2.0",
- "fs-extra": "^8.1.0",
- "global-agent": "^2.0.2",
- "global-tunnel-ng": "^2.7.1",
- "got": "^9.6.0",
- "progress": "^2.0.3",
- "semver": "^6.2.0",
- "sumchecker": "^3.0.1"
- }
- },
- "@electron/remote": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@electron/remote/-/remote-1.2.1.tgz",
- "integrity": "sha512-yKh60I8KjezQkZqeuN5Nu2O/Z72+tgNgzvAa8QQPLtQbsrCOaeIWdXZQqierz4jQ5jzTNUk6KIcK3V2kFeaxaQ=="
- },
- "@gar/promisify": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz",
- "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==",
- "dev": true
- },
- "@malept/cross-spawn-promise": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz",
- "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==",
- "dev": true,
- "requires": {
- "cross-spawn": "^7.0.1"
- }
- },
- "@npmcli/fs": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.0.0.tgz",
- "integrity": "sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==",
- "dev": true,
- "requires": {
- "@gar/promisify": "^1.0.1",
- "semver": "^7.3.5"
- },
- "dependencies": {
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "@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"
- },
- "dependencies": {
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true
- }
- }
- },
- "@ocogeclub/bme280": {
- "version": "file:local_modules/@ocogeclub/bme280"
- },
- "@ocogeclub/lgpio": {
- "version": "file:local_modules/@ocogeclub/lgpio",
- "requires": {
- "bindings": "^1.5.0",
- "node-addon-api": "^1.7.1"
- }
- },
- "@sindresorhus/is": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
- "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
- "dev": true
- },
- "@szmarczak/http-timer": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
- "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
- "dev": true,
- "requires": {
- "defer-to-connect": "^1.0.1"
- }
- },
- "@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
- },
- "@types/cacheable-request": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz",
- "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==",
- "dev": true,
- "requires": {
- "@types/http-cache-semantics": "*",
- "@types/keyv": "*",
- "@types/node": "*",
- "@types/responselike": "*"
- }
- },
- "@types/http-cache-semantics": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz",
- "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==",
- "dev": true
- },
- "@types/keyv": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.2.tgz",
- "integrity": "sha512-/FvAK2p4jQOaJ6CGDHJTqZcUtbZe820qIeTg7o0Shg7drB4JHeL+V/dhSaly7NXx6u8eSee+r7coT+yuJEvDLg==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/node": {
- "version": "14.17.14",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.14.tgz",
- "integrity": "sha512-rsAj2u8Xkqfc332iXV12SqIsjVi07H479bOP4q94NAcjzmAvapumEhuVIt53koEf7JFrpjgNKjBga5Pnn/GL8A==",
- "dev": true
- },
- "@types/responselike": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
- "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==",
- "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.1.4",
- "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.4.tgz",
- "integrity": "sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ==",
- "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"
- }
- },
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
- },
- "ansi-styles": {
- "version": "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"
- }
- },
- "aproba": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
- "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
- "dev": true
- },
- "are-we-there-yet": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.6.tgz",
- "integrity": "sha512-+1byPnimWdGcKFRS48zG73nxM08kamPFReUYvEmRXI3E8E4YhF4voMRDaGlfGD1UeRHEgs4NhQCE28KI8JVj1A==",
- "dev": true,
- "requires": {
- "delegates": "^1.0.0",
- "readable-stream": "^3.6.0"
- },
- "dependencies": {
- "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"
- }
- }
- }
- },
- "axios": {
- "version": "0.21.1",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
- "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
- "requires": {
- "follow-redirects": "^1.10.0"
- }
- },
- "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
- },
- "base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "dev": true
- },
- "bindings": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
- "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
- "requires": {
- "file-uri-to-path": "1.0.0"
- }
- },
- "bl": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
- "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
- "dev": true,
- "requires": {
- "buffer": "^5.5.0",
- "inherits": "^2.0.4",
- "readable-stream": "^3.4.0"
- },
- "dependencies": {
- "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"
- }
- }
- }
- },
- "boolean": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.1.4.tgz",
- "integrity": "sha512-3hx0kwU3uzG6ReQ3pnaFQPSktpBw6RHN3/ivDKEuU8g1XSfafowyvDnadjv1xp8IZqhtSukxlwv9bF6FhX8m0w==",
- "dev": true,
- "optional": 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"
- }
- },
- "buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "dev": true,
- "requires": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- },
- "buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
- "dev": true
- },
- "buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "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"
- },
- "dependencies": {
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true
- }
- }
- },
- "cacheable-lookup": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
- "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
- "dev": true
- },
- "cacheable-request": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
- "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
- "dev": true,
- "requires": {
- "clone-response": "^1.0.2",
- "get-stream": "^5.1.0",
- "http-cache-semantics": "^4.0.0",
- "keyv": "^3.0.0",
- "lowercase-keys": "^2.0.0",
- "normalize-url": "^4.1.0",
- "responselike": "^1.0.2"
- },
- "dependencies": {
- "get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "dev": true,
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "lowercase-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
- "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
- "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"
- }
- },
- "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
- },
- "cli-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
- "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
- "dev": true,
- "requires": {
- "restore-cursor": "^3.1.0"
- }
- },
- "cli-spinners": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz",
- "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==",
- "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"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
- "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
- },
- "string-width": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
- "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
- }
- },
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- }
- }
- },
- "clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
- "dev": true
- },
- "clone-response": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
- "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
- "dev": true,
- "requires": {
- "mimic-response": "^1.0.0"
- }
- },
- "code-point-at": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
- "dev": true
- },
- "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
- },
- "colors": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
- "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
- "dev": true
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "dev": true
- },
- "concat-stream": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
- "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^2.2.2",
- "typedarray": "^0.0.6"
- }
- },
- "config-chain": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
- "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
- "dev": true,
- "optional": true,
- "requires": {
- "ini": "^1.3.4",
- "proto-list": "~1.2.1"
- }
- },
- "console-control-strings": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
- "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
- "dev": true
- },
- "core-js": {
- "version": "3.17.1",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.17.1.tgz",
- "integrity": "sha512-C8i/FNpVN2Ti89QIJcFn9ZQmnM+HaAQr2OpE+ja3TRM9Q34FigsGlAVuwPGkIgydSVClo/1l1D1grP8LVt9IYA==",
- "dev": true,
- "optional": true
- },
- "core-util-is": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
- "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"
- }
- },
- "debug": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
- "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "decompress-response": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
- "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
- "dev": true,
- "requires": {
- "mimic-response": "^1.0.0"
- }
- },
- "defaults": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
- "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
- "dev": true,
- "requires": {
- "clone": "^1.0.2"
- }
- },
- "defer-to-connect": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
- "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
- "dev": true
- },
- "define-properties": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
- "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "dev": true,
- "optional": true,
- "requires": {
- "object-keys": "^1.0.12"
- }
- },
- "delegates": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
- "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
- "dev": true
- },
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
- "dev": true
- },
- "detect-libc": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
- "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
- "dev": true
- },
- "detect-node": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
- "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
- "dev": true,
- "optional": true
- },
- "duplexer3": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
- "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
- "dev": true
- },
- "electron": {
- "version": "14.0.0",
- "resolved": "https://registry.npmjs.org/electron/-/electron-14.0.0.tgz",
- "integrity": "sha512-O6EI7L1BPIrTpEIFefjjmdbmSn9LtE4mmrv4dfpV4Mqaa8uKuNYQogwZPEvSwaBexb69eb1LQ25n+f+kBcjiRQ==",
- "dev": true,
- "requires": {
- "@electron/get": "^1.0.1",
- "@types/node": "^14.6.2",
- "extract-zip": "^1.0.3"
- }
- },
- "electron-rebuild": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/electron-rebuild/-/electron-rebuild-3.2.3.tgz",
- "integrity": "sha512-9oxNmKlDCaf651c+yJWCDIBpF6A9aY+wQtasLEeR5AsPYPuOKEX6xHnC2+WgCLOC94JEpCZznecyC84fbwZq4A==",
- "dev": true,
- "requires": {
- "@malept/cross-spawn-promise": "^2.0.0",
- "colors": "^1.3.3",
- "debug": "^4.1.1",
- "detect-libc": "^1.0.3",
- "fs-extra": "^10.0.0",
- "got": "^11.7.0",
- "lzma-native": "^8.0.1",
- "node-abi": "^2.19.2",
- "node-api-version": "^0.1.4",
- "node-gyp": "^8.1.0",
- "ora": "^5.1.0",
- "tar": "^6.0.5",
- "yargs": "^17.0.1"
- },
- "dependencies": {
- "@sindresorhus/is": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.0.1.tgz",
- "integrity": "sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g==",
- "dev": true
- },
- "@szmarczak/http-timer": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
- "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
- "dev": true,
- "requires": {
- "defer-to-connect": "^2.0.0"
- }
- },
- "cacheable-request": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz",
- "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==",
- "dev": true,
- "requires": {
- "clone-response": "^1.0.2",
- "get-stream": "^5.1.0",
- "http-cache-semantics": "^4.0.0",
- "keyv": "^4.0.0",
- "lowercase-keys": "^2.0.0",
- "normalize-url": "^6.0.1",
- "responselike": "^2.0.0"
- }
- },
- "decompress-response": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
- "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
- "dev": true,
- "requires": {
- "mimic-response": "^3.1.0"
- }
- },
- "defer-to-connect": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
- "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
- "dev": true
- },
- "fs-extra": {
- "version": "10.0.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
- "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- }
- },
- "get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "dev": true,
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "got": {
- "version": "11.8.2",
- "resolved": "https://registry.npmjs.org/got/-/got-11.8.2.tgz",
- "integrity": "sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==",
- "dev": true,
- "requires": {
- "@sindresorhus/is": "^4.0.0",
- "@szmarczak/http-timer": "^4.0.5",
- "@types/cacheable-request": "^6.0.1",
- "@types/responselike": "^1.0.0",
- "cacheable-lookup": "^5.0.3",
- "cacheable-request": "^7.0.1",
- "decompress-response": "^6.0.0",
- "http2-wrapper": "^1.0.0-beta.5.2",
- "lowercase-keys": "^2.0.0",
- "p-cancelable": "^2.0.0",
- "responselike": "^2.0.0"
- }
- },
- "json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
- "dev": true
- },
- "jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.6",
- "universalify": "^2.0.0"
- }
- },
- "keyv": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz",
- "integrity": "sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==",
- "dev": true,
- "requires": {
- "json-buffer": "3.0.1"
- }
- },
- "lowercase-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
- "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
- "dev": true
- },
- "mimic-response": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
- "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
- "dev": true
- },
- "normalize-url": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
- "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
- "dev": true
- },
- "p-cancelable": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
- "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
- "dev": true
- },
- "responselike": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz",
- "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==",
- "dev": true,
- "requires": {
- "lowercase-keys": "^2.0.0"
- }
- },
- "universalify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
- "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
- "dev": true
- }
- }
- },
- "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
- },
- "encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
- "dev": true,
- "optional": 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"
- }
- },
- "end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
- "dev": true,
- "requires": {
- "once": "^1.4.0"
- }
- },
- "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
- },
- "es6-error": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
- "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
- "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": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
- "optional": true
- },
- "extract-zip": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz",
- "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==",
- "dev": true,
- "requires": {
- "concat-stream": "^1.6.2",
- "debug": "^2.6.9",
- "mkdirp": "^0.5.4",
- "yauzl": "^2.10.0"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- }
- }
- },
- "fd-slicer": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
- "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
- "dev": true,
- "requires": {
- "pend": "~1.2.0"
- }
- },
- "file-uri-to-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
- "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="
- },
- "follow-redirects": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.2.tgz",
- "integrity": "sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA=="
- },
- "fs-extra": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
- "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
- "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": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
- "dev": true
- },
- "gauge": {
- "version": "2.7.4",
- "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
- "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
- "dev": true,
- "requires": {
- "aproba": "^1.0.3",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.0",
- "object-assign": "^4.1.0",
- "signal-exit": "^3.0.0",
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wide-align": "^1.1.0"
- }
- },
- "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-stream": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
- "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
- "dev": true,
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "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"
- }
- },
- "global-agent": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.2.0.tgz",
- "integrity": "sha512-+20KpaW6DDLqhG7JDiJpD1JvNvb8ts+TNl7BPOYcURqCrXqnN1Vf+XVOrkKJAFPqfX+oEhsdzOj1hLWkBTdNJg==",
- "dev": true,
- "optional": true,
- "requires": {
- "boolean": "^3.0.1",
- "core-js": "^3.6.5",
- "es6-error": "^4.1.1",
- "matcher": "^3.0.0",
- "roarr": "^2.15.3",
- "semver": "^7.3.2",
- "serialize-error": "^7.0.1"
- },
- "dependencies": {
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "optional": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "global-tunnel-ng": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz",
- "integrity": "sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==",
- "dev": true,
- "optional": true,
- "requires": {
- "encodeurl": "^1.0.2",
- "lodash": "^4.17.10",
- "npm-conf": "^1.1.3",
- "tunnel": "^0.0.6"
- }
- },
- "globalthis": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz",
- "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==",
- "dev": true,
- "optional": true,
- "requires": {
- "define-properties": "^1.1.3"
- }
- },
- "got": {
- "version": "9.6.0",
- "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
- "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
- "dev": true,
- "requires": {
- "@sindresorhus/is": "^0.14.0",
- "@szmarczak/http-timer": "^1.1.2",
- "cacheable-request": "^6.0.0",
- "decompress-response": "^3.3.0",
- "duplexer3": "^0.1.4",
- "get-stream": "^4.1.0",
- "lowercase-keys": "^1.0.1",
- "mimic-response": "^1.0.1",
- "p-cancelable": "^1.0.0",
- "to-readable-stream": "^1.0.0",
- "url-parse-lax": "^3.0.0"
- }
- },
- "graceful-fs": {
- "version": "4.2.8",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
- "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==",
- "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-unicode": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
- "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
- "dev": true
- },
- "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"
- }
- },
- "http2-wrapper": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
- "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
- "dev": true,
- "requires": {
- "quick-lru": "^5.1.1",
- "resolve-alpn": "^1.0.0"
- }
- },
- "https-proxy-agent": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
- "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
- "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": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=",
- "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"
- }
- },
- "ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "dev": true
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
- "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": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "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
- },
- "ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "dev": true,
- "optional": true
- },
- "ip": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
- "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "dev": true,
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "is-interactive": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
- "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
- "dev": true
- },
- "is-lambda": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
- "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=",
- "dev": true
- },
- "is-unicode-supported": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
- "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
- "dev": true
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
- "dev": true
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "dev": true
- },
- "json-buffer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
- "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
- "dev": true
- },
- "json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
- "dev": true,
- "optional": true
- },
- "jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.6"
- }
- },
- "keyv": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
- "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
- "dev": true,
- "requires": {
- "json-buffer": "3.0.0"
- }
- },
- "lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
- "dev": true,
- "optional": true
- },
- "log-symbols": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
- "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
- "dev": true,
- "requires": {
- "chalk": "^4.1.0",
- "is-unicode-supported": "^0.1.0"
- }
- },
- "lowercase-keys": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
- "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
- "dev": true
- },
- "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"
- }
- },
- "lzma-native": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/lzma-native/-/lzma-native-8.0.1.tgz",
- "integrity": "sha512-Ryr9X3yDVZhRYOxR8QhUBCNe6GdEfy9BvFDIFtUvEkocvSvnrYt9lRm6FR1z0eQn0QSMenrgrDIJRMgUf9zsKQ==",
- "dev": true,
- "requires": {
- "node-addon-api": "^3.1.0",
- "node-gyp-build": "^4.2.1",
- "readable-stream": "^3.6.0"
- },
- "dependencies": {
- "node-addon-api": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz",
- "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==",
- "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"
- }
- }
- }
- },
- "make-fetch-happen": {
- "version": "8.0.14",
- "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz",
- "integrity": "sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ==",
- "dev": true,
- "requires": {
- "agentkeepalive": "^4.1.3",
- "cacache": "^15.0.5",
- "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",
- "promise-retry": "^2.0.1",
- "socks-proxy-agent": "^5.0.0",
- "ssri": "^8.0.0"
- }
- },
- "matcher": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz",
- "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==",
- "dev": true,
- "optional": true,
- "requires": {
- "escape-string-regexp": "^4.0.0"
- }
- },
- "mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true
- },
- "mimic-response": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
- "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
- "dev": true
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
- "dev": true
- },
- "minipass": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
- "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
- "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": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5"
- }
- },
- "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-abi": {
- "version": "2.30.1",
- "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz",
- "integrity": "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==",
- "dev": true,
- "requires": {
- "semver": "^5.4.1"
- },
- "dependencies": {
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true
- }
- }
- },
- "node-addon-api": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz",
- "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg=="
- },
- "node-api-version": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.1.4.tgz",
- "integrity": "sha512-KGXihXdUChwJAOHO53bv9/vXcLmdUsZ6jIptbvYvkpKfth+r7jw44JkVxQFA3kX5nQjzjmGu1uAu/xNNLNlI5g==",
- "dev": true,
- "requires": {
- "semver": "^7.3.5"
- },
- "dependencies": {
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "node-gyp": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.2.0.tgz",
- "integrity": "sha512-KG8SdcoAnw2d6augGwl1kOayALUrXW/P2uOAm2J2+nmW/HjZo7y+8TDg7LejxbekOOSv3kzhq+NSUYkIDAX8eA==",
- "dev": true,
- "requires": {
- "env-paths": "^2.2.0",
- "glob": "^7.1.4",
- "graceful-fs": "^4.2.6",
- "make-fetch-happen": "^8.0.14",
- "nopt": "^5.0.0",
- "npmlog": "^4.1.2",
- "rimraf": "^3.0.2",
- "semver": "^7.3.5",
- "tar": "^6.1.2",
- "which": "^2.0.2"
- },
- "dependencies": {
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "node-gyp-build": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz",
- "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==",
- "dev": true
- },
- "nodemailer": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.6.0.tgz",
- "integrity": "sha512-ikSMDU1nZqpo2WUPE0wTTw/NGGImTkwpJKDIFPZT+YvvR9Sj+ze5wzu95JHkBMglQLoG2ITxU21WukCC/XsFkg=="
- },
- "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-url": {
- "version": "4.5.1",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
- "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==",
- "dev": true
- },
- "npm-conf": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz",
- "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==",
- "dev": true,
- "optional": true,
- "requires": {
- "config-chain": "^1.1.11",
- "pify": "^3.0.0"
- }
- },
- "npmlog": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
- "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
- "dev": true,
- "requires": {
- "are-we-there-yet": "~1.1.2",
- "console-control-strings": "~1.1.0",
- "gauge": "~2.7.3",
- "set-blocking": "~2.0.0"
- }
- },
- "number-is-nan": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
- "dev": true
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
- "dev": true
- },
- "object-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,
- "optional": true
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "dev": true,
- "requires": {
- "wrappy": "1"
- }
- },
- "onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
- "dev": true,
- "requires": {
- "mimic-fn": "^2.1.0"
- }
- },
- "ora": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
- "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
- "dev": true,
- "requires": {
- "bl": "^4.1.0",
- "chalk": "^4.1.0",
- "cli-cursor": "^3.1.0",
- "cli-spinners": "^2.5.0",
- "is-interactive": "^1.0.0",
- "is-unicode-supported": "^0.1.0",
- "log-symbols": "^4.1.0",
- "strip-ansi": "^6.0.0",
- "wcwidth": "^1.0.1"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
- "dev": true
- },
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- }
- }
- },
- "p-cancelable": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
- "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
- "dev": true
- },
- "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"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "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
- },
- "pend": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
- "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
- "dev": true
- },
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
- "dev": true,
- "optional": true
- },
- "prepend-http": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
- "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
- "dev": true
- },
- "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
- },
- "progress": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
- "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
- "dev": true
- },
- "promise-inflight": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
- "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
- "dev": true
- },
- "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"
- }
- },
- "proto-list": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
- "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=",
- "dev": true,
- "optional": true
- },
- "pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "dev": true,
- "requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
- "quick-lru": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
- "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
- "dev": true
- },
- "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"
- }
- },
- "require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
- "dev": true
- },
- "resolve-alpn": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
- "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
- "dev": true
- },
- "responselike": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
- "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
- "dev": true,
- "requires": {
- "lowercase-keys": "^1.0.0"
- }
- },
- "restore-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
- "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
- "dev": true,
- "requires": {
- "onetime": "^5.1.0",
- "signal-exit": "^3.0.2"
- }
- },
- "retry": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
- "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
- "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"
- }
- },
- "roarr": {
- "version": "2.15.4",
- "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz",
- "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==",
- "dev": true,
- "optional": true,
- "requires": {
- "boolean": "^3.0.1",
- "detect-node": "^2.0.4",
- "globalthis": "^1.0.1",
- "json-stringify-safe": "^5.0.1",
- "semver-compare": "^1.0.0",
- "sprintf-js": "^1.1.2"
- }
- },
- "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
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "dev": true,
- "optional": true
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- },
- "semver-compare": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
- "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
- "dev": true,
- "optional": true
- },
- "serialize-error": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz",
- "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
- "dev": true,
- "optional": true,
- "requires": {
- "type-fest": "^0.13.1"
- }
- },
- "set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
- "dev": true
- },
- "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
- },
- "signal-exit": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
- "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
- "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
- },
- "socks": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.1.tgz",
- "integrity": "sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==",
- "dev": true,
- "requires": {
- "ip": "^1.1.5",
- "smart-buffer": "^4.1.0"
- }
- },
- "socks-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==",
- "dev": true,
- "requires": {
- "agent-base": "^6.0.2",
- "debug": "4",
- "socks": "^2.3.3"
- }
- },
- "sprintf-js": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
- "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==",
- "dev": true,
- "optional": true
- },
- "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"
- }
- },
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "dev": true,
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "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"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "sumchecker": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz",
- "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==",
- "dev": true,
- "requires": {
- "debug": "^4.1.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"
- }
- },
- "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"
- },
- "dependencies": {
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true
- }
- }
- },
- "to-readable-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
- "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
- "dev": true
- },
- "tunnel": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
- "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
- "dev": true,
- "optional": true
- },
- "type-fest": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
- "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
- "dev": true,
- "optional": true
- },
- "typedarray": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
- "dev": true
- },
- "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"
- }
- },
- "universalify": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
- "dev": true
- },
- "url-parse-lax": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
- "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
- "dev": true,
- "requires": {
- "prepend-http": "^2.0.0"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
- "dev": true
- },
- "wcwidth": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
- "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
- "dev": true,
- "requires": {
- "defaults": "^1.0.3"
- }
- },
- "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"
- }
- },
- "wide-align": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
- "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
- "dev": true,
- "requires": {
- "string-width": "^1.0.2 || 2"
- }
- },
- "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"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
- "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
- },
- "string-width": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
- "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
- }
- },
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- }
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "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.1.1",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz",
- "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==",
- "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.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
- "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
- },
- "string-width": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
- "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
- }
- },
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- }
- }
- },
- "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
- },
- "yauzl": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
- "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
- "dev": true,
- "requires": {
- "buffer-crc32": "~0.2.3",
- "fd-slicer": "~1.1.0"
- }
- }
- }
-}
diff --git a/package.json b/package.json
index d319d6b..2b2f114 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
"name": "ocoge",
"version": "0.1.3",
"description": "\"大岩産 Code Generator\" は、Google Blockly ライブラリを使用した、Raspberry Pi 上で動作するブロックプログラム開発・実行環境です。",
- "main": "index.js",
+ "main": "main.js",
"scripts": {
"start": "electron .",
"rebuild": "electron-rebuild"
@@ -19,14 +19,15 @@
},
"homepage": "https://github.com/ocogeclub/ocoge#readme",
"devDependencies": {
- "electron": "^14.0.0",
- "electron-rebuild": "^3.2.3"
+ "electron": "15.0.0",
+ "electron-rebuild": "3.2.3"
},
"dependencies": {
- "@electron/remote": "^1.2.1",
"@ocogeclub/bme280": "file:local_modules/@ocogeclub/bme280",
"@ocogeclub/lgpio": "file:local_modules/@ocogeclub/lgpio",
"axios": "^0.21.1",
- "nodemailer": "^6.6.0"
+ "nodemailer": "^6.6.0",
+ "@tensorflow/tfjs-node": "^3.9.0",
+ "@vladmandic/face-api": "^1.5.3"
}
-}
+}
\ No newline at end of file
diff --git a/preload.js b/preload.js
new file mode 100644
index 0000000..ea5a702
--- /dev/null
+++ b/preload.js
@@ -0,0 +1,19 @@
+const electron = require("electron")
+const path = require('path')
+
+electron.contextBridge.exposeInMainWorld(
+ "ocogeapi",
+ {
+ // Electron固有:index.htmlから直接