From 5c467a66594072c7822f8dd9e5efdf74367574d8 Mon Sep 17 00:00:00 2001 From: unknown <348063288@qq.com> Date: Sat, 3 Jun 2023 18:51:13 +0800 Subject: [PATCH 001/143] bundling all typescript into one bundle.js --- .gitignore | 4 +- index.js | 56 ++++++++----------- tsconfig.json | 2 +- .../@types}/sdapi_py_re.d.ts | 0 {main/types => typescripts/@types}/uxp.d.ts | 0 .../after_detailer}/after_detailer.tsx | 4 +- .../after_detailer}/config.ts | 0 .../after_detailer}/style/after_detailer.css | 0 typescripts/entry.ts | 5 ++ {main/src => typescripts/main}/all.ts | 0 {main/src => typescripts/main}/astore.ts | 0 {main/src => typescripts/main}/main.tsx | 2 +- .../ultimate_sd_upscaler}/config.ts | 0 .../ultimate_sd_upscaler}/elements.tsx | 0 .../ultimate_sd_upscaler}/scripts.tsx | 0 .../ultimate_sd_upscaler.tsx | 0 webpack.config.js | 12 ++-- 17 files changed, 37 insertions(+), 48 deletions(-) rename {main/types => typescripts/@types}/sdapi_py_re.d.ts (100%) rename {main/types => typescripts/@types}/uxp.d.ts (100%) rename {after_detailer/src => typescripts/after_detailer}/after_detailer.tsx (99%) rename {after_detailer/src => typescripts/after_detailer}/config.ts (100%) rename {after_detailer/src => typescripts/after_detailer}/style/after_detailer.css (100%) create mode 100644 typescripts/entry.ts rename {main/src => typescripts/main}/all.ts (100%) rename {main/src => typescripts/main}/astore.ts (100%) rename {main/src => typescripts/main}/main.tsx (97%) rename {ultimate_sd_upscaler/src => typescripts/ultimate_sd_upscaler}/config.ts (100%) rename {ultimate_sd_upscaler/src => typescripts/ultimate_sd_upscaler}/elements.tsx (100%) rename {ultimate_sd_upscaler/src => typescripts/ultimate_sd_upscaler}/scripts.tsx (100%) rename {ultimate_sd_upscaler/src => typescripts/ultimate_sd_upscaler}/ultimate_sd_upscaler.tsx (100%) diff --git a/.gitignore b/.gitignore index 81824754..12a866fc 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,4 @@ original_mask.png # comments when packaging (include in the package,uxp packager will use .gitignore to ignore files): */dist/*LICENSE.txt */dist/*.bundle.js - -# uncomments when packaging (don't include in the package) -# /docs +typescripts/dist diff --git a/index.js b/index.js index ddc04dd7..eb9805c3 100644 --- a/index.js +++ b/index.js @@ -88,17 +88,7 @@ const lexica_tab = require('./utility/tab/lexica_tab') const share_tab = require('./utility/tab/share_tab') // const ultimate_sd_upscaler = require('./ultimate_sd_upscaler/dist/ultimate_sd_upscaler') // const ultimate_sd_upscaler_script = require('./ultimate_sd_upscaler/dist/ultimate_sd_upscaler.bundle') - -// const after_detailer_script = require('./main/dist/after_detailer.bundle') -// const scripts = require('./main/dist/scripts.bundle') -// const main = require('./main/dist/main.bundle') - -const { - after_detailer_script, - scripts, - main, - ultimate_sd_upscaler, -} = require('./main/dist/all.bundle') +const { scripts, main, after_detailer_script } = require('./typescripts/dist/bundle') // const ultimate_sd_upscaler_script_test = require('./ultimate_sd_upscaler/dist/main') @@ -703,24 +693,24 @@ let g_old_slider_height = 512 let g_hi_res_upscaler_models let g_controlnet_max_models -;(async function () { - g_hi_res_upscaler_models = await sd_tab.requestGetHiResUpscalers() + ; (async function () { + g_hi_res_upscaler_models = await sd_tab.requestGetHiResUpscalers() - g_controlnet_max_models = await control_net.requestControlNetMaxUnits() + g_controlnet_max_models = await control_net.requestControlNetMaxUnits() - for (let model of g_hi_res_upscaler_models) { - //update the hi res upscaler models menu - let hrModelsMenuClass = - document.getElementsByClassName('hrModelsMenuClass') - for (let i = 0; i < hrModelsMenuClass.length; i++) { - const menu_item_element = document.createElement('sp-menu-item') - menu_item_element.className = 'hrModelsMenuItem' - menu_item_element.innerHTML = model - hrModelsMenuClass[i].appendChild(menu_item_element) - // console.log(model + ' added to ' + hrModelsMenuClass[i].id)//Log + for (let model of g_hi_res_upscaler_models) { + //update the hi res upscaler models menu + let hrModelsMenuClass = + document.getElementsByClassName('hrModelsMenuClass') + for (let i = 0; i < hrModelsMenuClass.length; i++) { + const menu_item_element = document.createElement('sp-menu-item') + menu_item_element.className = 'hrModelsMenuItem' + menu_item_element.innerHTML = model + hrModelsMenuClass[i].appendChild(menu_item_element) + // console.log(model + ' added to ' + hrModelsMenuClass[i].id)//Log + } } - } -})() + })() let g_generation_session = new session.GenerationSession(0) //session manager g_generation_session.deactivate() //session starte as inactive @@ -1450,9 +1440,9 @@ function toggleTwoButtonsByClass(isVisible, first_class, second_class) { //show generate button first_class_btns.forEach( (element) => - (element.textContent = `Generate ${getCurrentGenerationModeByValue( - g_sd_mode - )}`) + (element.textContent = `Generate ${getCurrentGenerationModeByValue( + g_sd_mode + )}`) ) } second_class_btns.forEach((element) => (element.style.display = 'none')) @@ -2919,7 +2909,7 @@ async function progressRecursive() { if ( json?.current_image && g_generation_session.request_status === - Enum.RequestStateEnum['Generating'] + Enum.RequestStateEnum['Generating'] ) { const base64_url = general.base64ToBase64Url(json.current_image) @@ -3694,8 +3684,8 @@ document.getElementById('collapsible').addEventListener('click', function () { } }) -function removeInitImageFromViewer() {} -function removeMaskFromViewer() {} +function removeInitImageFromViewer() { } +function removeMaskFromViewer() { } //REFACTOR: move to viewer.js async function viewerThumbnailclickHandler(e, viewer_obj_owner) { if (g_isViewerMenuDisabled) { @@ -4772,7 +4762,7 @@ function switchMenu_new(rb) { try { const contianer_class = rb.parentElement.parentElement.parentElement.dataset[ - 'container-class' + 'container-class' ] //input_option.li.ul.div.dataset['container-class'] const radio_group = rb.parentElement.parentElement.parentElement //radio_group in this case is ul document diff --git a/tsconfig.json b/tsconfig.json index 02f9674c..7e465c3b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -56,7 +56,7 @@ // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ - "outDir": "./main/dist", /* Specify an output folder for all emitted files. */ + "outDir": "./typescripts/dist", /* Specify an output folder for all emitted files. */ // "removeComments": true, /* Disable emitting comments. */ // "noEmit": true, /* Disable emitting files from a compilation. */ // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ diff --git a/main/types/sdapi_py_re.d.ts b/typescripts/@types/sdapi_py_re.d.ts similarity index 100% rename from main/types/sdapi_py_re.d.ts rename to typescripts/@types/sdapi_py_re.d.ts diff --git a/main/types/uxp.d.ts b/typescripts/@types/uxp.d.ts similarity index 100% rename from main/types/uxp.d.ts rename to typescripts/@types/uxp.d.ts diff --git a/after_detailer/src/after_detailer.tsx b/typescripts/after_detailer/after_detailer.tsx similarity index 99% rename from after_detailer/src/after_detailer.tsx rename to typescripts/after_detailer/after_detailer.tsx index d26a31af..d4a66457 100644 --- a/after_detailer/src/after_detailer.tsx +++ b/typescripts/after_detailer/after_detailer.tsx @@ -8,10 +8,10 @@ import { SliderType, SpMenu, SpSliderWithLabel, -} from '../../ultimate_sd_upscaler/src/elements' +} from '../ultimate_sd_upscaler/elements' // import * as sdapi from '../../sdapi_py_re' -import { AStore } from '../../main/src/astore' +import { AStore } from '../main/astore' import { ui_config, model_list } from './config' import { requestGet } from '../../utility/api' import { requestControlNetModelList } from '../../utility/tab/control_net' diff --git a/after_detailer/src/config.ts b/typescripts/after_detailer/config.ts similarity index 100% rename from after_detailer/src/config.ts rename to typescripts/after_detailer/config.ts diff --git a/after_detailer/src/style/after_detailer.css b/typescripts/after_detailer/style/after_detailer.css similarity index 100% rename from after_detailer/src/style/after_detailer.css rename to typescripts/after_detailer/style/after_detailer.css diff --git a/typescripts/entry.ts b/typescripts/entry.ts new file mode 100644 index 00000000..4417ca86 --- /dev/null +++ b/typescripts/entry.ts @@ -0,0 +1,5 @@ +// export * as controlnet from './controlnet/main' +export * as after_detailer_script from './after_detailer/after_detailer' +export * as ultimate_sd_upscaler from './ultimate_sd_upscaler/ultimate_sd_upscaler' +export * as scripts from './ultimate_sd_upscaler/scripts' +export * as main from './main/main' \ No newline at end of file diff --git a/main/src/all.ts b/typescripts/main/all.ts similarity index 100% rename from main/src/all.ts rename to typescripts/main/all.ts diff --git a/main/src/astore.ts b/typescripts/main/astore.ts similarity index 100% rename from main/src/astore.ts rename to typescripts/main/astore.ts diff --git a/main/src/main.tsx b/typescripts/main/main.tsx similarity index 97% rename from main/src/main.tsx rename to typescripts/main/main.tsx index c193d18b..fffcd845 100644 --- a/main/src/main.tsx +++ b/typescripts/main/main.tsx @@ -2,7 +2,7 @@ import React, { ReactEventHandler } from 'react' import ReactDOM from 'react-dom/client' import { observer } from 'mobx-react' import { AStore } from './astore' -import { SpMenu } from '../../ultimate_sd_upscaler/src/elements' +import { SpMenu } from '../ultimate_sd_upscaler/elements' import { getExtensionUrl } from '../../utility/sdapi/python_replacement' import * as api from '../../utility/api' diff --git a/ultimate_sd_upscaler/src/config.ts b/typescripts/ultimate_sd_upscaler/config.ts similarity index 100% rename from ultimate_sd_upscaler/src/config.ts rename to typescripts/ultimate_sd_upscaler/config.ts diff --git a/ultimate_sd_upscaler/src/elements.tsx b/typescripts/ultimate_sd_upscaler/elements.tsx similarity index 100% rename from ultimate_sd_upscaler/src/elements.tsx rename to typescripts/ultimate_sd_upscaler/elements.tsx diff --git a/ultimate_sd_upscaler/src/scripts.tsx b/typescripts/ultimate_sd_upscaler/scripts.tsx similarity index 100% rename from ultimate_sd_upscaler/src/scripts.tsx rename to typescripts/ultimate_sd_upscaler/scripts.tsx diff --git a/ultimate_sd_upscaler/src/ultimate_sd_upscaler.tsx b/typescripts/ultimate_sd_upscaler/ultimate_sd_upscaler.tsx similarity index 100% rename from ultimate_sd_upscaler/src/ultimate_sd_upscaler.tsx rename to typescripts/ultimate_sd_upscaler/ultimate_sd_upscaler.tsx diff --git a/webpack.config.js b/webpack.config.js index bd7312a8..1ee1fd50 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,19 +1,15 @@ + const path = require('path') // const CleanWebpackPlugin = require('clean-webpack-plugin') const CopyPlugin = require('copy-webpack-plugin') module.exports = { entry: { - // after_detailer: './after_detailer/src/after_detailer.tsx', - // ultimate_sd_upscaler: - // './ultimate_sd_upscaler/src/ultimate_sd_upscaler.tsx', - // scripts: './ultimate_sd_upscaler/src/scripts.tsx', - // main: './main/src/main.tsx', - all: './main/src/all.ts', + bundle: './typescripts/entry.ts', }, output: { - path: path.resolve(__dirname, './main/dist'), - filename: '[name].bundle.js', + path: path.resolve(__dirname, './typescripts/dist'), + filename: '[name].js', libraryTarget: 'commonjs2', }, mode: 'development', From 9c723389f67b13a4ed4213364130c40aa30795e7 Mon Sep 17 00:00:00 2001 From: unknown <348063288@qq.com> Date: Mon, 5 Jun 2023 23:06:36 +0800 Subject: [PATCH 002/143] controlnet refactor --- index.html | 48 - index.js | 49 +- sdapi_py_re.js | 12 +- typescripts/after_detailer/after_detailer.tsx | 8 +- typescripts/controlnet/ControlNetTab.tsx | 142 ++ typescripts/controlnet/ControlNetUnit.tsx | 297 +++++ typescripts/controlnet/entry.ts | 152 +++ typescripts/controlnet/main.tsx | 16 + typescripts/controlnet/store.ts | 91 ++ typescripts/controlnet/util.tsx | 26 + typescripts/entry.ts | 2 +- typescripts/main/all.ts | 7 - typescripts/main/main.tsx | 7 +- typescripts/ultimate_sd_upscaler/scripts.tsx | 2 +- .../ultimate_sd_upscaler.tsx | 8 +- .../elements.tsx | 99 ++ typescripts/util/oldSystem.tsx | 23 + utility/html_manip.js | 10 - utility/presets/preset.js | 3 +- utility/tab/control_net.js | 1153 ----------------- 20 files changed, 889 insertions(+), 1266 deletions(-) create mode 100644 typescripts/controlnet/ControlNetTab.tsx create mode 100644 typescripts/controlnet/ControlNetUnit.tsx create mode 100644 typescripts/controlnet/entry.ts create mode 100644 typescripts/controlnet/main.tsx create mode 100644 typescripts/controlnet/store.ts create mode 100644 typescripts/controlnet/util.tsx delete mode 100644 typescripts/main/all.ts rename typescripts/{ultimate_sd_upscaler => util}/elements.tsx (72%) create mode 100644 typescripts/util/oldSystem.tsx delete mode 100644 utility/tab/control_net.js diff --git a/index.html b/index.html index 0c017657..5f83fb50 100644 --- a/index.html +++ b/index.html @@ -991,54 +991,6 @@
- - - - - - -
- -
- - -
- -
- Disable ControlNet Tab - -
- (element.textContent = `Generate ${getCurrentGenerationModeByValue( - g_sd_mode - )}`) + (element.textContent = `Generate ${getCurrentGenerationModeByValue( + g_sd_mode + )}`) ) } second_class_btns.forEach((element) => (element.style.display = 'none')) @@ -2909,7 +2908,7 @@ async function progressRecursive() { if ( json?.current_image && g_generation_session.request_status === - Enum.RequestStateEnum['Generating'] + Enum.RequestStateEnum['Generating'] ) { const base64_url = general.base64ToBase64Url(json.current_image) @@ -3684,8 +3683,8 @@ document.getElementById('collapsible').addEventListener('click', function () { } }) -function removeInitImageFromViewer() { } -function removeMaskFromViewer() { } +function removeInitImageFromViewer() {} +function removeMaskFromViewer() {} //REFACTOR: move to viewer.js async function viewerThumbnailclickHandler(e, viewer_obj_owner) { if (g_isViewerMenuDisabled) { @@ -4762,7 +4761,7 @@ function switchMenu_new(rb) { try { const contianer_class = rb.parentElement.parentElement.parentElement.dataset[ - 'container-class' + 'container-class' ] //input_option.li.ul.div.dataset['container-class'] const radio_group = rb.parentElement.parentElement.parentElement //radio_group in this case is ul document @@ -4808,4 +4807,4 @@ Array.from(document.querySelectorAll('.rbSubTab')).forEach((rb) => { // this.shadowRoot.innerHTML = '

Hello World!

' // } // } -// customElements.define('custom-element', CustomElement) +// customElements.define('custom-element', CustomElement) \ No newline at end of file diff --git a/sdapi_py_re.js b/sdapi_py_re.js index 4049d7f8..c0c5de4a 100644 --- a/sdapi_py_re.js +++ b/sdapi_py_re.js @@ -3,12 +3,12 @@ const { base64ToBase64Url } = require('./utility/general') const { getExtensionType } = require('./utility/html_manip') const py_re = require('./utility/sdapi/python_replacement') const Enum = require('./enum') -// const control_net = require('./utility/tab/control_net') +const { control_net } = require('./typescripts/dist/bundle') const { mapPluginSettingsToControlNet, getEnableControlNet, getModuleDetail, -} = require('./utility/tab/control_net') +} = control_net const api = require('./utility/api') //javascript plugin can't read images from local directory so we send a request to local server to read the image file and send it back to plugin as image string base64 @@ -648,8 +648,8 @@ async function requestControlNetTxt2Img(plugin_settings) { mask_index >= numberOfAnnotations ) continue - html_manip.setControlMaskSrc( - base64ToBase64Url(base64_mask[mask_index]), + control_net.setControlMaskSrc( + base64_mask[mask_index], index ) g_generation_session.controlNetMask[index] = base64_mask[mask_index] @@ -742,8 +742,8 @@ async function requestControlNetImg2Img(plugin_settings) { mask_index >= numberOfAnnotations ) continue - html_manip.setControlMaskSrc( - base64ToBase64Url(base64_mask[mask_index]), + control_net.setControlMaskSrc( + base64_mask[mask_index], index ) g_generation_session.controlNetMask[index] = base64_mask[mask_index] diff --git a/typescripts/after_detailer/after_detailer.tsx b/typescripts/after_detailer/after_detailer.tsx index d4a66457..8098936f 100644 --- a/typescripts/after_detailer/after_detailer.tsx +++ b/typescripts/after_detailer/after_detailer.tsx @@ -8,13 +8,13 @@ import { SliderType, SpMenu, SpSliderWithLabel, -} from '../ultimate_sd_upscaler/elements' +} from '../util/elements' // import * as sdapi from '../../sdapi_py_re' - +import { api } from '../util/oldSystem' import { AStore } from '../main/astore' import { ui_config, model_list } from './config' -import { requestGet } from '../../utility/api' -import { requestControlNetModelList } from '../../utility/tab/control_net' +const { requestGet } = api +import { requestControlNetModelList } from '../controlnet/entry' import './style/after_detailer.css' diff --git a/typescripts/controlnet/ControlNetTab.tsx b/typescripts/controlnet/ControlNetTab.tsx new file mode 100644 index 00000000..08db37d2 --- /dev/null +++ b/typescripts/controlnet/ControlNetTab.tsx @@ -0,0 +1,142 @@ +import { observer } from 'mobx-react'; +import React from 'react'; +import ControlNetUnit from './ControlNetUnit'; +import { store as ControlNetStore } from './main'; +import { DefaultControlNetUnitData } from './store'; +import { Enum, controlnet_preset, note, preset, selection } from '../util/oldSystem'; + +let g_controlnet_presets: any; +declare const g_generation_session: any; + +@observer +class ControlNetTab extends React.Component<{ appState: typeof ControlNetStore }>{ + state = { + maxControlNet: 0 + } + + private presetMenuChildren: JSX.Element[] = [] + + onPresetMenuChange(evt: any) { + const preset_index = evt.target.selectedIndex + const preset_name = evt.target.options[preset_index].textContent + ControlNetStore.controlNetUnitData.forEach((dataitem, index) => { + const presetData = g_controlnet_presets[preset_name][index] || {} + + dataitem.enabled = presetData.enabled || DefaultControlNetUnitData.enabled + dataitem.input_image = presetData.input_image || DefaultControlNetUnitData.input_image + dataitem.mask = presetData.mask || DefaultControlNetUnitData.mask + + dataitem.module = presetData.module || DefaultControlNetUnitData.module + dataitem.model = presetData.model || DefaultControlNetUnitData.model + dataitem.weight = presetData.weight || DefaultControlNetUnitData.weight + dataitem.resize_mode = presetData.resize_mode || DefaultControlNetUnitData.resize_mode + dataitem.lowvram = presetData.lowvram || DefaultControlNetUnitData.lowvram + dataitem.processor_res = presetData.processor_res || DefaultControlNetUnitData.processor_res + dataitem.threshold_a = presetData.threshold_a || DefaultControlNetUnitData.threshold_a + dataitem.threshold_b = presetData.threshold_b || DefaultControlNetUnitData.threshold_b + dataitem.guidance_start = presetData.guidance_start || DefaultControlNetUnitData.guidance_start + dataitem.guidance_end = presetData.guidance_end || DefaultControlNetUnitData.guidance_end + dataitem.guessmode = presetData.guessmode || DefaultControlNetUnitData.guessmode + + dataitem.control_mode = presetData.control_mode || DefaultControlNetUnitData.control_mode + dataitem.pixel_perfect = presetData.pixel_perfect || DefaultControlNetUnitData.pixel_perfect + }) + } + async updatePresetMenuEvent() { + const custom_presets = await preset.getAllCustomPresetsSettings( + Enum.PresetTypeEnum['ControlNetPreset'] + ) + g_controlnet_presets = { + 'Select CtrlNet Preset': {}, + ...controlnet_preset.ControlNetNativePresets, + ...custom_presets, + } + + const presets_names = Object.keys(g_controlnet_presets) + + this.presetMenuChildren = presets_names.map(preset_name => { + if (preset_name == "Select CtrlNet Preset") + return {preset_name} + else + return {preset_name} + }) + } + + async onSetAllControlImage() { + const selectionInfo = await selection.Selection.getSelectionInfoExe() + if (selectionInfo) { + const base64_image = await g_generation_session.setControlNetImageHelper() + + ControlNetStore.controlNetUnitData.forEach(async (data) => { + data.input_image = base64_image + }) + } else { + await note.Notification.inactiveSelectionArea() + } + } + + componentDidMount(): void { + this.updatePresetMenuEvent() + } + + render() { + return ( +
+ + {/* + {this.presetMenuChildren.map(child => child)} + */} + +
+ { + this.props.appState.maxControlNet == 0 && ( + + The Controlnet Extension is missing from Automatic1111. + Please install it to use it through the plugin. + ) + } +
+
+ +
+ Disable ControlNet Tab +
+ { + Array(this.props.appState.maxControlNet * 2).fill(0).map((v, index) => { + if (index % 2 == 0) { + return + } + else { + return + } + }) + } +
+ ); + } +} + + +export default ControlNetTab; diff --git a/typescripts/controlnet/ControlNetUnit.tsx b/typescripts/controlnet/ControlNetUnit.tsx new file mode 100644 index 00000000..5482a92a --- /dev/null +++ b/typescripts/controlnet/ControlNetUnit.tsx @@ -0,0 +1,297 @@ +import { observer } from 'mobx-react'; +import React from 'react'; +import { SpCheckBox, SpMenu, SpSlider } from '../util/elements'; +import ControlNetStore from './store'; +import { mapRange, versionCompare } from './util'; +import { note, selection } from '../util/oldSystem'; + +declare const g_generation_session: any; +declare const io: any; +declare const app: any; + + +@observer +export default class ControlNetUnit extends React.Component<{ index: number, appState: typeof ControlNetStore }, {}> { + + onEnableChange(event: any) { + event.preventDefault() + const storeData = this.props.appState.controlNetUnitData[this.props.index]; + storeData.enabled = !storeData.enabled; + } + onLowVRamChange(event: any) { + event.preventDefault() + const storeData = this.props.appState.controlNetUnitData[this.props.index]; + storeData.lowvram = !storeData.lowvram; + } + onGuessModeChange(event: any) { + event.preventDefault() + const storeData = this.props.appState.controlNetUnitData[this.props.index]; + storeData.guessmode = !storeData.guessmode; + } + onPixelPerfectChange(event: any) { + event.preventDefault() + const storeData = this.props.appState.controlNetUnitData[this.props.index]; + console.log('onPixelPerfectChange', storeData.pixel_perfect); + storeData.pixel_perfect = !storeData.pixel_perfect; + } + onWeightMove(event: any) { + event.preventDefault() + if (event.target.tagName != 'SP-SLIDER') return; + const storeData = this.props.appState.controlNetUnitData[this.props.index]; + storeData.weight = +mapRange(event.target.value, 0, 200, 0, 2, 0.01).toFixed(2); + } + onGuidanceStartMove(event: any) { + event.preventDefault() + if (event.target.tagName != 'SP-SLIDER') return; + const storeData = this.props.appState.controlNetUnitData[this.props.index]; + storeData.guidance_start = +mapRange(event.target.value, 0, 10, 0, 1, 0.1).toFixed(1); + } + onGuidanceEndMove(event: any) { + event.preventDefault() + if (event.target.tagName != 'SP-SLIDER') return; + const storeData = this.props.appState.controlNetUnitData[this.props.index]; + storeData.guidance_end = +mapRange(event.target.value, 0, 10, 0, 1, 0.1).toFixed(1); + } + onPreprocsesorChange(event: any, { index, item }: { index: number, item: string }) { + const storeData = this.props.appState.controlNetUnitData[this.props.index]; + storeData.module = item + } + onModelChange(event: any, { index, item }: { index: number, item: string }) { + const storeData = this.props.appState.controlNetUnitData[this.props.index]; + storeData.model = item + } + onResolutionMove(event: any) { + event.preventDefault() + if (event.target.tagName != 'SP-SLIDER') return; + const storeData = this.props.appState.controlNetUnitData[this.props.index]; + let resolutionConfig = this.props.appState.preprocessorDetail[storeData.module] || {}; + let sliderConfig = resolutionConfig.sliders[0]; + storeData.processor_res = +(event.target.value * (sliderConfig.step || 1)); + } + onThresholdAMove(event: any) { + event.preventDefault() + if (event.target.tagName != 'SP-SLIDER') return; + const storeData = this.props.appState.controlNetUnitData[this.props.index]; + let resolutionConfig = this.props.appState.preprocessorDetail[storeData.module] || {}; + let sliderConfig = resolutionConfig.sliders[1]; + storeData.threshold_a = +(event.target.value * (sliderConfig.step || 1)); + } + onThresholdBMove(event: any) { + event.preventDefault() + if (event.target.tagName != 'SP-SLIDER') return; + const storeData = this.props.appState.controlNetUnitData[this.props.index]; + let resolutionConfig = this.props.appState.preprocessorDetail[storeData.module] || {}; + let sliderConfig = resolutionConfig.sliders[2]; + storeData.threshold_b = +(event.target.value * (sliderConfig.step || 1)); + } + async onSetImageButtonClick() { + const selectionInfo = await selection.Selection.getSelectionInfoExe() + if (selectionInfo) { + const base64_image = await g_generation_session.setControlNetImageHelper() + + this.props.appState.controlNetUnitData[this.props.index].input_image = base64_image + } else { + await note.Notification.inactiveSelectionArea() + } + } + async onMaskButtonClick() { + const storeData = this.props.appState.controlNetUnitData[this.props.index]; + if ( + g_generation_session.control_net_selection_info && + storeData.mask + ) { + const selection_info = + g_generation_session.control_net_selection_info + const layer = await io.IO.base64ToLayer( + storeData.mask, + 'ControlNet Mask.png', + selection_info.left, + selection_info.top, + selection_info.width, + selection_info.height + ) + } else { + // await note.Notification.inactiveSelectionArea() + app.showAlert('Mask Image is not available') + } + } + + render() { + const storeData = this.props.appState.controlNetUnitData[this.props.index]; + const pd = this.props.appState.preprocessorDetail[storeData.module] || {}; + const ppSlider = pd.sliders || []; + + console.log("pixel_perfect:" + storeData.pixel_perfect); + + return
+
+ Control Net Settings Slot {this.props.index} +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+ + Enable + Low VRAM + 1 ? 'none' : void 0}} onChange={this.onGuessModeChange.bind(this)} checked={storeData.guessmode} id={`chGuessMode_${this.props.index}`}>Guess Mode + 1 ? void 0 : 'none'}} onChange={this.onPixelPerfectChange.bind(this)} checked={storeData.pixel_perfect} id={`chPixelPerfect_${this.props.index}`}>Pixel Perfect + { + this.props.appState.controlnetApiVersion > 1 && + + Control Mode: + Balanced + Prompt + ControlNet + + } + +
+
+ + Weight: + {storeData.weight} + + + Guidance strength start: + {storeData.guidance_start} + + + Guidance strength end: + {storeData.guidance_end} + + {ppSlider && ppSlider[0] && !storeData.pixel_perfect && + {ppSlider[0].name}: + {storeData.processor_res.toFixed(2)} + } + {ppSlider && ppSlider[1] && + {ppSlider[1].name}: + {storeData.threshold_a.toFixed(2)} + } + {ppSlider && ppSlider[2] && + {ppSlider[2].name}: + {storeData.threshold_b.toFixed(2)} + } +
+
+
+ + {!pd.model_free && + () + } +
+
+ } +} diff --git a/typescripts/controlnet/entry.ts b/typescripts/controlnet/entry.ts new file mode 100644 index 00000000..2fe19c8e --- /dev/null +++ b/typescripts/controlnet/entry.ts @@ -0,0 +1,152 @@ +import { Enum, api } from "../util/oldSystem"; +import { store, versionCompare } from "./main" + +declare const g_sd_config_obj: any; +declare const g_sd_url: any; + +async function requestControlNetPreprocessors() { + const control_net_json = await api.requestGet(`${g_sd_url}/controlnet/module_list?alias_name=1`) + + return control_net_json +} +async function requestControlNetModelList(): Promise { + const control_net_json = await api.requestGet(`${g_sd_url}/controlnet/model_list`) + + const model_list = control_net_json?.model_list + return model_list +} +async function requestControlNetApiVersion() { + const json = await api.requestGet(`${g_sd_url}/controlnet/version`) + + const version = json?.version + + return version +} +async function requestControlNetMaxUnits() { + const json = await api.requestGet(`${g_sd_url}/controlnet/settings`) + + const control_net_max_models_num = json?.control_net_max_models_num ?? 1 + + return control_net_max_models_num +} + +async function initializeControlNetTab(controlnet_max_models: number) { + store.maxControlNet = controlnet_max_models || store.maxControlNet + store.controlnetApiVersion = await requestControlNetApiVersion() + + try { + const models = await requestControlNetModelList() + store.supportedModels = models || []; + } catch (e) { + console.warn(e) + } + try { + const pps = await requestControlNetPreprocessors() + store.supportedPreprocessors = pps ? pps.module_list : []; + store.preprocessorDetail = pps ? pps.module_detail : {} + + } catch (e) { + console.warn(e) + } +} + +function getEnableControlNet(index: number) { + if (typeof index == 'undefined') + return store.controlNetUnitData.filter(item => item.enabled).length > 0 + else + return store.controlNetUnitData[index || 0].enabled +} +function mapPluginSettingsToControlNet(plugin_settings: any) { + const ps = plugin_settings // for shortness + let controlnet_units: any[] = [] + + for (let index = 0; index < store.maxControlNet; index++) { + controlnet_units[index] = { + enabled: getEnableControlNet(index), + input_image: store.controlNetUnitData[index].input_image, + mask: '', + module: store.controlNetUnitData[index].module, + model: store.controlNetUnitData[index].model, + weight: store.controlNetUnitData[index].weight, + resize_mode: 'Scale to Fit (Inner Fit)', + lowvram: store.controlNetUnitData[index].lowvram, + processor_res: store.controlNetUnitData[index].processor_res || 512, + threshold_a: store.controlNetUnitData[index].threshold_a, + threshold_b: store.controlNetUnitData[index].threshold_b, + // guidance: , + guidance_start: store.controlNetUnitData[index].guidance_start, + guidance_end: store.controlNetUnitData[index].guidance_end, + guessmode: false, + } + if (store.controlnetApiVersion > 1) { + controlnet_units[index].control_mode = store.controlNetUnitData[index].control_mode; + controlnet_units[index].pixel_perfect = true; + } + } + + if ( + plugin_settings['mode'] === Enum.generationModeEnum['Img2Img'] || + plugin_settings['mode'] === Enum.generationModeEnum['Inpaint'] || + plugin_settings['mode'] === Enum.generationModeEnum['Outpaint'] + ) { + const b_use_guess_mode = store.controlNetUnitData[0].guessmode; + controlnet_units[0]['guessmode'] = b_use_guess_mode + } + + const controlnet_payload = { + ...ps, + controlnet_units, //keep for backward compatibility for now + subseed: -1, + override_settings: {}, + override_settings_restore_afterwards: true, + alwayson_scripts: { + controlnet: { + args: controlnet_units, + }, + }, + } + + return controlnet_payload +} +function getControlNetMaxModelsNumber() { + return store.maxControlNet; +} +function getUnitsData() { + return store.controlNetUnitData +} +function setControlMaskSrc(base64: string, index: number) { + store.controlNetUnitData[index].mask = base64; +} +function isControlNetModeEnable() { + //@ts-ignore + let is_tab_enabled = !document.getElementById('chDisableControlNetTab').checked + + let numOfEnabled = 0 + if (is_tab_enabled) { + for (let index = 0; index < store.maxControlNet; index++) { + if (getEnableControlNet(index)) { + numOfEnabled += 1 + } + } + } + let is_mode_enabled = is_tab_enabled // could be true + if (is_tab_enabled === false || numOfEnabled === 0) { + is_mode_enabled = false + } + return is_mode_enabled +} +function getModuleDetail() { + return store.preprocessorDetail; +} +export { + requestControlNetModelList, + requestControlNetMaxUnits, + initializeControlNetTab, + getEnableControlNet, + mapPluginSettingsToControlNet, + getControlNetMaxModelsNumber, + getUnitsData, + setControlMaskSrc, + isControlNetModeEnable, + getModuleDetail +} \ No newline at end of file diff --git a/typescripts/controlnet/main.tsx b/typescripts/controlnet/main.tsx new file mode 100644 index 00000000..797ae17b --- /dev/null +++ b/typescripts/controlnet/main.tsx @@ -0,0 +1,16 @@ +import ReactDOM from 'react-dom/client' +import React from 'react'; +import ControlNetTab from './ControlNetTab'; +import store from './store' +import { versionCompare } from './util' + +const elem = document.getElementById('sp-control_net-tab-page'); +if (elem) { + const root = ReactDOM.createRoot(elem) + root.render() +} + +export { + store, + versionCompare +} \ No newline at end of file diff --git a/typescripts/controlnet/store.ts b/typescripts/controlnet/store.ts new file mode 100644 index 00000000..d752be10 --- /dev/null +++ b/typescripts/controlnet/store.ts @@ -0,0 +1,91 @@ +import { observable, reaction } from "mobx"; + +export const DefaultControlNetUnitData = { + enabled: false, + input_image: '', + mask: '', + + module: "", + model: "", + weight: 1.0, + resize_mode: "Scale to Fit (Inner Fit)", + lowvram: false, + processor_res: 512, + threshold_a: 0, + threshold_b: 0, + + guidance_start: 0, + guidance_end: 1, + guessmode: false, + + control_mode: "Balanced", + pixel_perfect: true, +} + +export interface controlNetUnitData { + enabled: boolean, + input_image: string, + mask: string, + + module: string, + model: string, + weight: number, + resize_mode: "Just Resize" | "Crop and Resize" | "Resize and Fill", + lowvram: boolean, + processor_res: number, + threshold_a: number, + threshold_b: number, + + guidance_start: number, + guidance_end: number, + guessmode: boolean, + + control_mode: "Balanced" | "My prompt is more important" | "ControlNet is more important", + pixel_perfect: boolean, +} +interface ControlNetMobxStore { + maxControlNet: number, + controlnetApiVersion: number, + + supportedModels: string[], + supportedPreprocessors: string[], + preprocessorDetail: {[key: string]: any}, + + controlNetUnitData: controlNetUnitData[] +} + +var ControlNetStore = observable({ + maxControlNet: 0, + controlnetApiVersion: 1, + + supportedModels: [], + supportedPreprocessors: [], + preprocessorDetail: {}, + + controlNetUnitData: [] +}); + +reaction( + () => { + return ControlNetStore.controlNetUnitData.map(data => data.module) + }, + (module_, index) => { + ControlNetStore.controlNetUnitData.forEach((data, index) => { + const pd = ControlNetStore.preprocessorDetail[module_[index]] || {} + const pSlider = pd.sliders || [] + data.processor_res = pSlider[0]?.value || 512 + data.threshold_a = pSlider[1]?.value || 0 + data.threshold_b = pSlider[2]?.value || 0 + }) + } +) +reaction( + () => ControlNetStore.maxControlNet, + maxControlNet => { + ControlNetStore.controlNetUnitData = Array(maxControlNet).fill(0).map((v, index) => { + return ControlNetStore.controlNetUnitData[index] || DefaultControlNetUnitData; + }) + } +) + +export default ControlNetStore \ No newline at end of file diff --git a/typescripts/controlnet/util.tsx b/typescripts/controlnet/util.tsx new file mode 100644 index 00000000..2b267102 --- /dev/null +++ b/typescripts/controlnet/util.tsx @@ -0,0 +1,26 @@ + +export function mapRange(x: number, in_min: number, in_max: number, out_min: number, out_max: number, step: number) { + return Math.round( + ( + ((x - in_min) * (out_max - out_min)) / (in_max - in_min) + out_min + ) / step + ) * step +} + +export function versionCompare(to: string, from: string) { + const vTo = to.split('.') + const vFrom = from.split('.') + + for (let i = 0; i < Math.max(vTo.length, vFrom.length); i++) { + const vFromI = +(vFrom[i] || 0) + const vToI = +(vTo[i] || 0) + if (isNaN(vFromI) || isNaN(vToI)) { throw new Error(`invalid version ${vTo} or ${vFrom} `) } + + if (vFromI > vToI) { + return -1 + } else if (vFromI < vToI) { + return 1; + } + } + return 0; +} \ No newline at end of file diff --git a/typescripts/entry.ts b/typescripts/entry.ts index 4417ca86..ddd63860 100644 --- a/typescripts/entry.ts +++ b/typescripts/entry.ts @@ -1,4 +1,4 @@ -// export * as controlnet from './controlnet/main' +export * as control_net from './controlnet/entry' export * as after_detailer_script from './after_detailer/after_detailer' export * as ultimate_sd_upscaler from './ultimate_sd_upscaler/ultimate_sd_upscaler' export * as scripts from './ultimate_sd_upscaler/scripts' diff --git a/typescripts/main/all.ts b/typescripts/main/all.ts deleted file mode 100644 index fb2c9ec9..00000000 --- a/typescripts/main/all.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * as ultimate_sd_upscaler from '../../ultimate_sd_upscaler/src/ultimate_sd_upscaler' -export * as after_detailer_script from '../../after_detailer/src/after_detailer' -export * as scripts from '../../ultimate_sd_upscaler/src/scripts' -export * as main from './main' - - - diff --git a/typescripts/main/main.tsx b/typescripts/main/main.tsx index fffcd845..40f2dd9c 100644 --- a/typescripts/main/main.tsx +++ b/typescripts/main/main.tsx @@ -2,11 +2,10 @@ import React, { ReactEventHandler } from 'react' import ReactDOM from 'react-dom/client' import { observer } from 'mobx-react' import { AStore } from './astore' -import { SpMenu } from '../ultimate_sd_upscaler/elements' - -import { getExtensionUrl } from '../../utility/sdapi/python_replacement' -import * as api from '../../utility/api' +import { SpMenu } from '../util/elements' +import { api, python_replacement } from '../util/oldSystem' +const { getExtensionUrl } = python_replacement // class SDStore extends AStore { // constructor(data: any) { // super(data) diff --git a/typescripts/ultimate_sd_upscaler/scripts.tsx b/typescripts/ultimate_sd_upscaler/scripts.tsx index 1973d2fa..119b19dd 100644 --- a/typescripts/ultimate_sd_upscaler/scripts.tsx +++ b/typescripts/ultimate_sd_upscaler/scripts.tsx @@ -4,7 +4,7 @@ import ReactDOM from 'react-dom/client' import { makeAutoObservable, toJS } from 'mobx' import { observer } from 'mobx-react' -import { SpMenu } from './elements' +import { SpMenu } from '../util/elements' import * as ultimate_sd_upscale_script from './ultimate_sd_upscaler' import { ScriptMode } from './ultimate_sd_upscaler' export function toJsFunc(store: any) { diff --git a/typescripts/ultimate_sd_upscaler/ultimate_sd_upscaler.tsx b/typescripts/ultimate_sd_upscaler/ultimate_sd_upscaler.tsx index 7e062160..b33dd8a6 100644 --- a/typescripts/ultimate_sd_upscaler/ultimate_sd_upscaler.tsx +++ b/typescripts/ultimate_sd_upscaler/ultimate_sd_upscaler.tsx @@ -4,13 +4,11 @@ import ReactDOM from 'react-dom/client' import { action, makeAutoObservable, reaction, toJS } from 'mobx' import { Provider, inject, observer } from 'mobx-react' -import { SliderType, SpMenu, SpSliderWithLabel } from './elements' - -import * as sdapi from '../../sdapi_py_re' +import { SliderType, SpMenu, SpSliderWithLabel } from '../util/elements' import { ui_config } from './config' -import { requestGet } from '../../utility/api' - +import { api, sdapi } from '../util/oldSystem' +const { requestGet } = api declare let g_sd_url: string export let script_name: string = 'ultimate sd upscale' diff --git a/typescripts/ultimate_sd_upscaler/elements.tsx b/typescripts/util/elements.tsx similarity index 72% rename from typescripts/ultimate_sd_upscaler/elements.tsx rename to typescripts/util/elements.tsx index 0ef6d1c1..b615f289 100644 --- a/typescripts/ultimate_sd_upscaler/elements.tsx +++ b/typescripts/util/elements.tsx @@ -258,3 +258,102 @@ export class SpMenu extends React.Component<{ ) } } +class PhotoshopElem extends React.Component<{ [key: string]: any }, {}> { + protected elem: Element | null = null; + + protected curEvents: { [key: string]: (evt: Event) => any } = { + + } + + componentDidMount(): void { + this.updateEventListener() + } + + // componentDidUpdate(): void { + // this.updateEventListener() + // } + + updateEventListener() { + if (!this.elem) throw new Error('elem is not rendered with ref'); + + const [, newEvent] = this.splitProps(this.props) + + Object.keys(this.curEvents).forEach(evkey => { + if (this.curEvents[evkey] != newEvent[evkey]) { + this.elem?.removeEventListener(evkey, this.curEvents[evkey]); + } + }); + Object.keys(newEvent).forEach(evkey => { + this.elem?.addEventListener(evkey, newEvent[evkey]); + }) + } + + componentWillUnmount(): void { + Object.keys(this.curEvents).forEach(evkey => { + this.elem?.removeEventListener(evkey, this.curEvents[evkey]); + }); + } + splitProps(props: any): [any, any] { + const attr: any = {}; + const event: any = {}; + Object.keys(props).forEach((propKey: string) => { + if (propKey.startsWith('on')) { + const key = propKey[2].toLocaleLowerCase() + propKey.slice(3) + event[key] = props[propKey]; + + } else { + attr[propKey] = props[propKey]; + } + }) + return [attr, event] + } +} +export class SpPicker extends PhotoshopElem { + render() { + const [attr] = this.splitProps(this.props) + return this.elem = elem} {...attr}> + } +} +export class SpMenuItem extends PhotoshopElem { + render() { + const [attr] = this.splitProps(this.props) + return this.elem = elem} {...attr}> + } +} +export class SpLabel extends PhotoshopElem { + render() { + const [attr] = this.splitProps(this.props) + return this.elem = elem} {...attr}> + } +} +export class SpCheckBox extends PhotoshopElem { + render() { + const [attr] = this.splitProps(this.props) + if (!attr['checked']) delete attr['checked'] + return this.elem = elem} {...attr}> + } +} +export class SpSlider extends PhotoshopElem { + render() { + const [attr] = this.splitProps(this.props) + return this.elem = elem} {...attr}> + } +} +export class SpRadioGroup extends PhotoshopElem { + render() { + const [attr] = this.splitProps(this.props) + return this.elem = elem} {...attr}> + } +} +export class SpRadio extends PhotoshopElem { + render() { + const [attr] = this.splitProps(this.props) + return this.elem = elem} {...attr}> + } +} +export class SpDivider extends PhotoshopElem { + render() { + const [attr] = this.splitProps(this.props) + return this.elem = elem} {...attr}> + } +} diff --git a/typescripts/util/oldSystem.tsx b/typescripts/util/oldSystem.tsx new file mode 100644 index 00000000..767c5fc4 --- /dev/null +++ b/typescripts/util/oldSystem.tsx @@ -0,0 +1,23 @@ +//@ts-ignore +const req = window['require']; + +// because we use window['require'], so the base path of this require function is the root path of plugin. +const selection = req('./selection') +const note = req('./utility/notification') +const controlnet_preset = req('./utility/presets/controlnet_preset') +const preset = req('./utility/presets/preset') +const Enum = req('./enum') +const api = req('./utility/api') +const python_replacement = req('./utility/sdapi/python_replacement') +const sdapi = req('./sdapi_py_re') + +export { + selection, + note, + controlnet_preset, + preset, + Enum, + api, + python_replacement, + sdapi +} \ No newline at end of file diff --git a/utility/html_manip.js b/utility/html_manip.js index 41bf2cc3..6854c627 100644 --- a/utility/html_manip.js +++ b/utility/html_manip.js @@ -552,15 +552,6 @@ function setControlImageSrc(image_src, element_index = 0) { // ) control_net_image_element.src = image_src } -function setControlMaskSrc(image_src, element_index = 0) { - const control_net_image_element = document.querySelector( - `#controlnet_settings_${element_index} .control_net_mask_` - ) - // const control_net_image_element = document.getElementById( - // 'control_net_mask' + '_' + element_index - // ) - control_net_image_element.src = image_src -} function setProgressImageSrc(image_src) { // const progress_image_element = document.getElementById('progressImage') @@ -1153,7 +1144,6 @@ module.exports = { setLinkWidthHeightState, isSquareThumbnail, setControlImageSrc, - setControlMaskSrc, setHordeApiKey, populateMenu, diff --git a/utility/presets/preset.js b/utility/presets/preset.js index 8d1350e8..5e2cd27f 100644 --- a/utility/presets/preset.js +++ b/utility/presets/preset.js @@ -3,7 +3,6 @@ const html_manip = require('../html_manip') const Enum = require('../../enum') const event = require('../event') -// const control_net = require('../../utility/tab/control_net') let settings = { model: null, prompt_shortcut: null, @@ -161,7 +160,7 @@ function getPresetSettings(preset_type) { if (preset_type === Enum.PresetTypeEnum['SDPreset']) { preset_settings = g_ui_settings_object.getSettings() } else if (preset_type === Enum.PresetTypeEnum['ControlNetPreset']) { - const { ControlNetUnit } = require('../../utility/tab/control_net') // only import ControlNetUnit to avoid circular dependency + const { ControlNetUnit } = require('../typescripts/dist/bundle').control_net // only import ControlNetUnit to avoid circular dependency // preset_settings = control_net.ControlNetUnit.getUnits() preset_settings = ControlNetUnit.getUnits() diff --git a/utility/tab/control_net.js b/utility/tab/control_net.js deleted file mode 100644 index 849db5c8..00000000 --- a/utility/tab/control_net.js +++ /dev/null @@ -1,1153 +0,0 @@ -const api = require('../api') -const html_manip = require('../html_manip') -const selection = require('../../selection') -const note = require('../notification') -const controlnet_preset = require('../presets/controlnet_preset') -const preset = require('../presets/preset') -const Enum = require('../../enum') -const event = require('../event') - -// const g_controlnet_max_supported_models = 3 -let g_controlnet_presets -let g_module_detail - -class ControlNetUnit { - static {} - - static resetUnit(index) { - const controlnet_unit_default = { - module: null, - model: null, - weight: 1.0, - resize_mode: null, - lowvram: null, - processor_res: null, - threshold_a: null, - threshold_b: null, - - guidance_start: 0, - guidance_end: 1, - // guessmode: null, - } - this.setUnit(index, controlnet_unit_default) - } - - static resetUnits() { - for (let i = 0; i < g_controlnet_max_models; ++i) { - this.resetUnit(i) - } - } - static getUnit(index) { - const controlnet_unit = { - module: this.getModule(index), - model: this.getModel(index), - weight: this.getWeight(index), - resize_mode: null, - lowvram: null, - processor_res: null, - threshold_a: null, - threshold_b: null, - - guidance_start: this.getGuidanceStrengthStart(index), - guidance_end: this.getGuidanceStrengthEnd(index), - // guessmode: null, - } - return controlnet_unit - } - static setUnit(index, unit_settings) { - const controlnet_unit_setters = { - module: this.setModule, - model: this.setModel, - weight: this.setWeight, - resize_mode: null, - lowvram: null, - processor_res: null, - threshold_a: null, - threshold_b: null, - - guidance_start: this.setGuidanceStrengthStart, - guidance_end: this.setGuidanceStrengthEnd, - // guessmode: null, - } - - for (const [name, value] of Object.entries(unit_settings)) { - try { - if ( - controlnet_unit_setters.hasOwnProperty(name) - //&& value.toString() // check if it has a value, null return error; undefine return error; 0 pass - ) { - // if (value) { - const setter = controlnet_unit_setters[name] - - setter(index, value) - // } - } - } catch (e) { - console.warn(e) - } - } - } - static getUnits() { - const controlnet_units = {} - - for (let i = 0; i < g_controlnet_max_models; ++i) { - controlnet_units[i] = this.getUnit(i) - } - return controlnet_units - } - static setUnits(controlnet_units) { - for (const [index, unit] of Object.entries(controlnet_units)) { - try { - this.setUnit(index, unit) - } catch (e) { - console.warn(e) - } - } - } - static doesUnitExist(index) { - //TODO: check if controlnet unit exist - if (index >= 0) { - } - } - - static getModule(index) { - const module = getSelectedModule(index) - return module - } - static setModule(index, module_item) { - try { - const module_menu_element = controlnetElement( - index, - '.mModulesMenuControlNet_' - ) - - html_manip.selectMenuItemByElement(module_menu_element, module_item) - // module_menu_element.dispatchEvent(new Event('click')) - // module_menu_element.click() - changeModule(module_item, index) - } catch (e) { - html_manip.unselectMenuItemByElement(module_menu_element) - console.warn(e) - } - } - static getModel(index) { - const model = getSelectedModel(index) - return model - } - static setModel(index, model_item) { - try { - const model_menu_element = controlnetElement( - index, - '.mModelsMenuControlNet_' - ) - html_manip.selectMenuItemByElement(model_menu_element, model_item) - } catch (e) { - html_manip.unselectMenuItemByElement(model_menu_element) - console.warn(e) - } - } - static getWeight(index = 0) { - const weight = getWeight(index) - return weight - } - static setWeight(index, weight) { - setWeight(index, weight) - } - static getGuidanceStrengthStart(index) { - const guidance_strength = getControlNetGuidanceStrengthStart(index) - return guidance_strength - } - - static setGuidanceStrengthStart(index, sd_value) { - setControlNetGuidanceStrengthStart(index, sd_value) - } - static getGuidanceStrengthEnd(index) { - const guidance_strength = getControlNetGuidanceStrengthEnd(index) - return guidance_strength - } - static setGuidanceStrengthEnd(index, sd_value) { - setControlNetGuidanceStrengthEnd(index, sd_value) - } - static getProcessorRes(index) { - const slider = controlnetElement(index, '.slControlNetProcessorRes_') - - return slider.value - } - static setProcessorRes(index, sd_value) { - const slider = controlnetElement(index, '.slControlNetProcessorRes_') - slider.value = sd_value - } - static getThreshold(index, a_or_b) { - let slider - if (a_or_b === 'a') { - slider = controlnetElement(index, '.slControlNetThreshold_A_') - } else if (a_or_b === 'b') { - slider = controlnetElement(index, '.slControlNetThreshold_B_') - } - - const sd_value = general.mapRange( - slider.value, - slider.min, - slider.max, - slider.dataset['sd_min'], - slider.dataset['sd_max'] - ) - return sd_value - } - static setThreshold(index, a_or_b, sd_value) { - let slider - let label - if (a_or_b === 'a') { - slider = controlnetElement(index, '.slControlNetThreshold_A_') - label = controlnetElement(index, '.lControlNetThreshold_A_') - } else if (a_or_b === 'b') { - slider = controlnetElement(index, '.slControlNetThreshold_B_') - label = controlnetElement(index, '.lControlNetThreshold_B_') - } - - const slider_value = general.mapRange( - sd_value, - slider.dataset['sd_min'], - slider.dataset['sd_max'], - slider.min, - slider.max - ) - slider.value = String(slider_value) - label.innerText = String(sd_value) - } - - static getControlNetUnitJson(index = 0) {} -} - -async function checkIfControlNetInstalled() {} - -async function requestControlNetDetectMap( - controlnet_init_image, - _module, - processor_res, - threshold_a, - threshold_b -) { - try { - const payload = { - controlnet_module: _module, - controlnet_input_images: [controlnet_init_image], - controlnet_processor_res: processor_res, - controlnet_threshold_a: threshold_a, - controlnet_threshold_b: threshold_b, - } - const full_url = `${g_sd_url}/controlnet/detect` - - // debugger - - const response_data = await api.requestPost(full_url, payload) - - // update the mask preview with the new detectMap - if (response_data['images'].length === 0) { - app.showAlert(response_data['info']) - } - return response_data['images'][0] - } catch (e) { - console.warn('requestControlNetDetectMap(): ', _module, e) - } -} - -async function requestControlNetVersion() { - const json = await api.requestGet(`${g_sd_url}/controlnet/version`) - - const version = json?.version - - return version -} -async function requestControlNetMaxUnits() { - const json = await api.requestGet(`${g_sd_url}/controlnet/settings`) - - const control_net_max_models_num = json?.control_net_max_models_num ?? 1 - - return control_net_max_models_num -} - -async function requestControlNetModelList() { - const control_net_json = await api.requestGet( - `${g_sd_url}/controlnet/model_list` - ) - - const model_list = control_net_json?.model_list - - return model_list -} - -async function requestControlNetModuleList() { - const result = await api.requestGet( - `${g_sd_url}/controlnet/module_list?alias_names=1` - ) - - return result?.module_list -} -async function populateModelMenu() { - try { - const models = await requestControlNetModelList() - for (let index = 0; index < g_controlnet_max_models; index++) { - const menu_element = controlnetElement( - index, - '.mModelsMenuControlNet_' - ) - html_manip.populateMenuByElement( - menu_element, - 'mModelsMenuItemControlNet_', - models, - (item, item_html_element) => { - item_html_element.innerHTML = item - item_html_element.dataset['index'] = index - }, - false, - 'Select Model' - ) - } - } catch (e) { - console.warn(e) - } -} - -function changeModule(_module, index) { - // const index = index - - const preprocessor_res_element = controlnetElement( - index, - '.slControlNetProcessorRes_' - ) - - const threshold_a_element = controlnetElement( - index, - '.slControlNetThreshold_A_' - ) - const threshold_b_element = controlnetElement( - index, - '.slControlNetThreshold_B_' - ) - - const detail = g_module_detail[_module] - - function remapArray(arr) { - let obj = { - preprocessor_res: arr[0] || null, - threshold_a: arr[1] || null, - threshold_b: arr[2] || null, - } - return obj - } - const params = remapArray(detail['sliders']) - const model_free = detail.model_free - - // threshold_a_element.min = prams. - // threshold_a_element.max = - // debugger - if (model_free) - controlnetElement( - index, - '.mModelsMenuControlNet_' - ).parentElement.style.display = 'none' - else - controlnetElement( - index, - '.mModelsMenuControlNet_' - ).parentElement.style.display = 'block' - - if (params?.preprocessor_res) { - const preprocessor_res_label_element = controlnetElement( - index, - '.labelControlNetProcessorRes_' - ) - preprocessor_res_element.style.display = 'block' - preprocessor_res_label_element.innerText = params.preprocessor_res.name - } else { - preprocessor_res_element.style.display = 'none' - } - if (params?.threshold_a) { - const threshold_a_label_element = controlnetElement( - index, - '.labelControlNetThreshold_A_' - ) - - threshold_a_element.dataset['sd_min'] = params.threshold_a.min - threshold_a_element.dataset['sd_max'] = params.threshold_a.max - ControlNetUnit.setThreshold(index, 'a', params.threshold_a.value) - threshold_a_element.style.display = 'block' - threshold_a_label_element.innerText = params.threshold_a.name + ':' - } else { - ControlNetUnit.setThreshold(index, 'a', 32) - threshold_a_element.style.display = 'none' - } - - if (params?.threshold_b) { - const threshold_b_label_element = controlnetElement( - index, - '.labelControlNetThreshold_B_' - ) - - threshold_b_element.dataset['sd_min'] = params.threshold_b.min - threshold_b_element.dataset['sd_max'] = params.threshold_b.max - ControlNetUnit.setThreshold(index, 'b', params.threshold_b.value) - threshold_b_element.style.display = 'block' - threshold_b_label_element.innerText = params.threshold_b.name + ':' - } else { - ControlNetUnit.setThreshold(index, 'b', 32) - threshold_b_element.style.display = 'none' - } -} -async function populatePreprocessorMenu() { - try { - // debugger - const modules = await requestControlNetModuleList() - for (let index = 0; index < g_controlnet_max_models; index++) { - const menu_element = controlnetElement( - index, - '.mModulesMenuControlNet_' - ) - - menu_element.dataset['index'] = String(index) - html_manip.populateMenuByElement( - menu_element, - 'mModuleMenuItemControlNet_', - modules, - (item, item_html_element) => { - item_html_element.innerHTML = item - item_html_element.dataset['index'] = index - }, - false, - 'Select Module' - ) - - menu_element.addEventListener('click', (event) => { - changeModule( - event.target.innerText, - event.target.dataset['index'] - ) - }) - } - } catch (e) { - console.warn(e) - } -} -function controlnetElement(index, class_) { - const element = document.querySelector( - `#controlnet_settings_${index} ${class_}` - ) - return element -} -function getControlNetGuidanceStrengthStart(index) { - const slider_element = document.querySelector( - `#controlnet_settings_${index} .slControlNetGuidanceStrengthStart_` - ) - const sd_value = html_manip.getSliderSdValueByElement( - slider_element, - 0, - 100, - 0, - 1 - ) - return sd_value -} -function setControlNetGuidanceStrengthStart(index, sd_value) { - const slider_element = controlnetElement( - index, - '.slControlNetGuidanceStrengthStart_' - ) - - const label_element = controlnetElement( - index, - '.lControlNetGuidanceStrengthStart_' - ) - html_manip.setSliderSdValueByElements( - slider_element, - label_element, - sd_value, - 0, - 100, - 0, - 1 - ) -} - -function getControlNetGuidanceStrengthEnd(index) { - const slider_element = controlnetElement( - index, - '.slControlNetGuidanceStrengthEnd_' - ) - const sd_value = html_manip.getSliderSdValueByElement( - slider_element, - 0, - 100, - 0, - 1 - ) - return sd_value -} -function setControlNetGuidanceStrengthEnd(index, sd_value) { - const slider_element = controlnetElement( - index, - '.slControlNetGuidanceStrengthEnd_' - ) - - const label_element = controlnetElement( - index, - '.lControlNetGuidanceStrengthEnd_' - ) - html_manip.setSliderSdValueByElements( - slider_element, - label_element, - sd_value, - 0, - 100, - 0, - 1 - ) -} - -// controlnet settings getters -function getControlNetWeightGuidanceStrengthStart(index = 0) { - const slider_element = controlnetElement( - index, - '.slControlNetGuidanceStrengthStart_' - ) - const slider_value = slider_element.value - const sd_value = general.mapRange(slider_value, 0, 100, 0, 1) // convert slider value to SD ready value - return sd_value -} - -function getControlNetWeightGuidanceStrengthEnd(index = 0) { - const slider_value = controlnetElement( - index, - '.slControlNetGuidanceStrengthEnd_' - ).value - - const sd_value = general.mapRange(slider_value, 0, 100, 0, 1) // convert slider value to SD ready value - return sd_value -} - -function getWeight(index = 0) { - const slider_value = document.querySelector( - `#controlnet_settings_${index} .slControlNetWeight_` - ).value - - const sd_value = general.mapRange(slider_value, 0, 100, 0, 2) // convert slider value to SD ready value - return sd_value -} -function setWeight(index = 0, sd_weight) { - const slider_element = document.querySelector( - `#controlnet_settings_${index} .slControlNetWeight_` - ) - const label_element = document.querySelector( - `#controlnet_settings_${index} .lControlNetWeight_` - ) - - html_manip.setSliderSdValueByElements( - slider_element, - label_element, - sd_weight, - 0, - 100, - 0, - 2 - ) -} -function getUseLowVram(index = 0) { - const b_result = document.querySelector( - `#controlnet_settings_${index} .chlowVram_` - ).checked - return b_result -} -function getEnableControlNet(index = 0) { - const is_enable = document.querySelector( - `#controlnet_settings_${index} .chEnableControlNet_` - ).checked - return is_enable -} -function setEnable(index) { - document.querySelector( - `#controlnet_settings_${index} .chEnableControlNet_` - ).checked = b_live_update -} -function getSelectedModule(index = 0) { - const menu_element = controlnetElement(index, '.mModulesMenuControlNet_') - // debugger - const module_name = - html_manip.getSelectedMenuItemTextContentByElement(menu_element) - - return module_name -} -function getSelectedModel(index = 0) { - const menu_element = controlnetElement(index, '.mModelsMenuControlNet_') - const model_name = - html_manip.getSelectedMenuItemTextContentByElement(menu_element) - return model_name -} -function getUseGuessMode(index = 0) { - const is_guess_mode = document.querySelector( - `#controlnet_settings_${index} .chGuessMode_` - ).checked - - return is_guess_mode -} - -function getControlNetMode(index = 0) { - const controlnet_mode = document.querySelector( - `#controlnet_settings_${index} .rgControlNetMode_` - ).selected - - return controlnet_mode -} - -function getControlNetPixelPerfect(index = 0) { - const pixel_perfect = document.querySelector( - `#controlnet_settings_${index} .chPixelPerfect_` - ).checked - - return pixel_perfect -} -function isControlNetModeEnable() { - let is_tab_enabled = !document.getElementById('chDisableControlNetTab') - .checked - - let numOfEnabled = 0 - if (g_controlnet_max_models <= 0) { - return false - } - - if (is_tab_enabled) { - for (let index = 0; index < g_controlnet_max_models; index++) { - if (getEnableControlNet(index)) { - numOfEnabled += 1 - } - } - } - let is_mode_enabled = is_tab_enabled // could be true - if (is_tab_enabled === false || numOfEnabled === 0) { - is_mode_enabled = false - } - return is_mode_enabled -} -// function getControlNetMaxModelsNumber() { -// return g_controlnet_max_supported_models -// } - -function preprocessorData( - processor_res = 512, - threshold_a = 64, - threshold_b = 64, - a_min = 64, - a_max = 1024, - b_min = 64, - b_max = 1024, - processor_res_label = 'Annotator resolution', - threshold_a_label = 'threshold a', - threshold_b_label = 'threshold b' -) { - return { - processor_res, - threshold_a, - threshold_b, - a_min, - a_max, - b_min, - b_max, - processor_res_label, - threshold_a_label, - threshold_b_label, - } -} - -function mapPluginSettingsToControlNet(plugin_settings) { - const ps = plugin_settings // for shortness - let controlnet_units = [] - - // debugger - let active_index = 0 - for (let index = 0; index < g_controlnet_max_models; index++) { - const preprocessor_name = getSelectedModule(index) - - controlnet_units[active_index] = { - enabled: getEnableControlNet(index), - input_image: g_generation_session.controlNetImage[index], - mask: '', - module: getSelectedModule(index), - model: getSelectedModel(index), - weight: getWeight(index), - resize_mode: 'Scale to Fit (Inner Fit)', - lowvram: getUseLowVram(index), - processor_res: ControlNetUnit.getProcessorRes(index), - threshold_a: ControlNetUnit.getThreshold(index, 'a'), - threshold_b: ControlNetUnit.getThreshold(index, 'b'), - // guidance: , - guidance_start: getControlNetWeightGuidanceStrengthStart(index), - guidance_end: getControlNetWeightGuidanceStrengthEnd(index), - // guessmode: false, - control_mode: parseInt(getControlNetMode()), - pixel_perfect: getControlNetPixelPerfect(), - } - active_index++ - } - - // if ( - // plugin_settings['mode'] === Enum.generationModeEnum['Img2Img'] || - // plugin_settings['mode'] === Enum.generationModeEnum['Inpaint'] || - // plugin_settings['mode'] === Enum.generationModeEnum['Outpaint'] - // ) { - // const b_use_guess_mode = getUseGuessMode() - // controlnet_units[0]['guessmode'] = b_use_guess_mode - // } - - const controlnet_payload = { - ...ps, - controlnet_units, //keep for backward compatibility for now - subseed: -1, - override_settings: {}, - override_settings_restore_afterwards: true, - alwayson_scripts: { - ...(ps?.alwayson_scripts || {}), - controlnet: { - args: controlnet_units, - }, - }, - } - - return controlnet_payload -} -function refreshControlNetTab() {} - -async function populateControlNetPresetMenu() { - // const default_preset_name = 'Select CtrlNet Preset' - // const default_preset_settings = {} // empty preset - - const custom_presets = await preset.getAllCustomPresetsSettings( - Enum.PresetTypeEnum['ControlNetPreset'] - ) - g_controlnet_presets = { - 'Select CtrlNet Preset': {}, - ...controlnet_preset.ControlNetNativePresets, - ...custom_presets, - } - - const presets_names = Object.keys(g_controlnet_presets) - - html_manip.populateMenu( - 'mControlNetPresetMenu', - 'mControlNetPresetMenuItem', - presets_names, - (preset_name, item_html_element) => { - item_html_element.innerHTML = preset_name - } - ) - html_manip.selectMenuItem('mControlNetPresetMenu', 'Select CtrlNet Preset') -} - -document - .getElementById('mControlNetPresetMenu') - .addEventListener('change', async (evt) => { - try { - ControlNetUnit.resetUnits() - const preset_index = evt.target.selectedIndex - const preset_name = evt.target.options[preset_index].textContent - units_settings = g_controlnet_presets[preset_name] - - ControlNetUnit.setUnits(units_settings) - } catch (e) { - console.warn(e) - } - }) - -document - .getElementById('bSetAllControlImage') - .addEventListener('click', async () => { - const selectionInfo = await selection.Selection.getSelectionInfoExe() - if (selectionInfo) { - const base64_image = - await g_generation_session.setControlNetImageHelper() - - for (index = 0; index < g_controlnet_max_models; index++) { - await g_generation_session.setControlNetImage( - index, - base64_image - ) - } - } else { - await note.Notification.inactiveSelectionArea() - } - }) - -function initControlNetUnitsEventListeners(controlnet_max_models) { - for (let index = 0; index < controlnet_max_models; index++) { - //event listeners - controlnetElement( - index, - '.slControlNetGuidanceStrengthStart_' - ).addEventListener('input', (evt) => { - // debugger - const sd_value = general.mapRange(evt.target.value, 0, 100, 0, 1) // convert slider value to SD ready value - controlnetElement( - index, - '.lControlNetGuidanceStrengthStart_' - ).textContent = Number(sd_value).toFixed(2) - }) - - controlnetElement( - index, - '.slControlNetGuidanceStrengthEnd_' - ).addEventListener('input', (evt) => { - // debugger - const sd_value = general.mapRange(evt.target.value, 0, 100, 0, 1) // convert slider value to SD ready value - controlnetElement( - index, - '.lControlNetGuidanceStrengthEnd_' - ).textContent = Number(sd_value).toFixed(2) - }) - - document - .querySelector(`#controlnet_settings_${index} .slControlNetWeight_`) - .addEventListener('input', (evt) => { - // debugger - const sd_value = general.mapRange( - evt.target.value, - 0, - 100, - 0, - 2 - ) // convert slider value to SD ready value - document.querySelector( - `#controlnet_settings_${index} .lControlNetWeight_` - ).textContent = Number(sd_value).toFixed(2) - }) - - // controlnetElement(index, '.slControlNetProcessorRes_').addEventListener( - // 'input', - // (evt) => { - // // debugger - // const sd_value = general.mapRange( - // evt.target.value, - // 64, - // 2048, - // 64, - // 2048 - // ) // convert slider value to SD ready value - // controlnetElement(index, '.lControlNetProcessorRes_').textContent = - // Number(sd_value).toFixed(2) - // } - // ) - controlnetElement(index, '.slControlNetThreshold_A_').addEventListener( - 'input', - (event) => { - const slider = event.target - const sd_value = Number( - general - .mapRange( - slider.value, - slider.min, - slider.max, - slider.dataset['sd_min'], - slider.dataset['sd_max'] - ) - .toFixed(2) - ) - controlnetElement(index, '.lControlNetThreshold_A_').innerText = - String(sd_value) - // ControlNetUnit.setThreshold(index, 'a', sd_value) - // controlnetElement(index, '.lControlNetThreshold_A_').value = - // sd_value - } - ) - controlnetElement(index, '.slControlNetThreshold_B_').addEventListener( - 'input', - (event) => { - const slider = event.target - const sd_value = Number( - general - .mapRange( - slider.value, - slider.min, - slider.max, - slider.dataset['sd_min'], - slider.dataset['sd_max'] - ) - .toFixed(2) - ) - controlnetElement(index, '.lControlNetThreshold_B_').innerText = - String(sd_value) - // ControlNetUnit.setThreshold(index, 'a', sd_value) - // controlnetElement(index, '.lControlNetThreshold_A_').value = - // sd_value - } - ) - document - .querySelector(`#controlnet_settings_${index} .bSetControlImage_`) - .addEventListener('click', async () => { - const selectionInfo = - await selection.Selection.getSelectionInfoExe() - if (selectionInfo) { - // debugger - const base64_image = - await g_generation_session.setControlNetImageHelper() - await g_generation_session.setControlNetImage( - index, - base64_image - ) - } else { - await note.Notification.inactiveSelectionArea() - } - }) - - document - .querySelector(`#controlnet_settings_${index} .bControlMask_`) - .addEventListener('click', async () => { - await previewAnnotator(index) - }) - } -} -document - .getElementById('mControlNetPresetMenu') - .addEventListener('updatePresetMenuEvent', async (event) => { - // console.log("I'm listening on a custom event") - await populateControlNetPresetMenu() - }) - -async function previewAnnotator(index) { - try { - const controlnet_init_image = - g_generation_session.controlNetImage[index] - const _module = ControlNetUnit.getModule(index) - const processor_res = ControlNetUnit.getProcessorRes(index) - const threshold_a = ControlNetUnit.getThreshold(index, 'a') - const threshold_b = ControlNetUnit.getThreshold(index, 'b') - if (!controlnet_init_image) { - const error = 'ControlNet initial image is empty' - app.showAlert(error) - throw error - } - if (!_module || _module === 'none') { - const error = 'select a valid controlnet module (preprocessor)' - app.showAlert(error) - throw error - } - - const detect_map = await requestControlNetDetectMap( - controlnet_init_image, - _module, - processor_res, - threshold_a, - threshold_b - ) - - const rgb_detect_map_url = - await io.convertBlackAndWhiteImageToRGBChannels3(detect_map) - const rgb_detect_map = general.base64UrlToBase64(rgb_detect_map_url) - g_generation_session.controlNetMask[index] = rgb_detect_map - - html_manip.setControlMaskSrc(rgb_detect_map_url, index) - } catch (e) { - console.warn('PreviewAnnotator click(): index: ', index, e) - } -} -async function previewAnnotatorFromCanvas(index) { - try { - const _module = ControlNetUnit.getModule(index) - - const width = html_manip.getWidth() - const height = html_manip.getHeight() - const selectionInfo = await psapi.getSelectionInfoExe() - g_generation_session.control_net_preview_selection_info = selectionInfo - const base64 = await io.IO.getSelectionFromCanvasAsBase64Interface_New( - width, - height, - selectionInfo, - true - ) - - if (!_module || _module === 'none') { - const error = 'select a valid controlnet module (preprocessor)' - app.showAlert(error) - throw error - } - - const processor_res = ControlNetUnit.getProcessorRes(index) - const threshold_a = ControlNetUnit.getThreshold(index, 'a') - const threshold_b = ControlNetUnit.getThreshold(index, 'b') - - const detect_map = await requestControlNetDetectMap( - base64, - _module, - processor_res, - threshold_a, - threshold_b - ) - - const rgb_detect_map_url = - await io.convertBlackAndWhiteImageToRGBChannels3(detect_map) - g_generation_session.controlNetMask[index] = detect_map - html_manip.setControlMaskSrc(rgb_detect_map_url, index) - } catch (e) { - console.warn('PreviewAnnotator click(): index: ', index, e) - } -} -// document -// .getElementById('bPreviewAnnotator_0') -// .addEventListener('click', async (event) => { -// const index = parseInt(event.target.dataset['controlnet-index']) -// await previewAnnotator(index) -// }) - -function initPreviewElement(index) { - //make init mask image use the thumbnail class with buttons - // const mask_image_html = document.getElementById( - // 'control_net_preview_image_0' - // ) - - const mask_image_html = controlnetElement(index, '.control_net_mask_') - const mask_parent_element = mask_image_html.parentElement - - this.thumbnail_container = thumbnail.Thumbnail.wrapImgInContainer( - mask_image_html, - 'viewer-image-container' - ) - - mask_parent_element.appendChild(thumbnail_container) - - async function toCanvas(index) { - // debugger - if ( - g_generation_session.control_net_preview_selection_info && - g_generation_session.controlNetMask[index] - ) { - const selection_info = - g_generation_session.control_net_preview_selection_info - const layer = await io.IO.base64ToLayer( - g_generation_session.controlNetMask[index], - 'ControlNet Mask.png', - selection_info.left, - selection_info.top, - selection_info.width, - selection_info.height - ) - } else { - // await note.Notification.inactiveSelectionArea() - app.showAlert('Mask Image is not available') - } - } - async function toControlNetInitImage(index) { - const preview_result_base64 = g_generation_session.controlNetMask[index] - g_generation_session.controlNetImage[index] = preview_result_base64 - g_generation_session.control_net_selection_info = - g_generation_session.control_net_preview_selection_info - - const rgb_detect_map_url = - await io.convertBlackAndWhiteImageToRGBChannels3( - preview_result_base64 - ) - - // g_generation_session.controlNetMask[index] = rgb_detect_map - - html_manip.setControlImageSrc(rgb_detect_map_url, index) - } - thumbnail.Thumbnail.addSPButtonToContainer( - this.thumbnail_container, - 'svg_sp_btn', - 'use as ControlNet init image', - - toControlNetInitImage, - index - ) - thumbnail.Thumbnail.addSPButtonToContainer( - this.thumbnail_container, - 'svg_sp_btn_canvas', - 'move to the canvas', - - toCanvas, - index - ) - thumbnail.Thumbnail.addSPButtonToContainer( - this.thumbnail_container, - 'svg_sp_btn_preview', - 'preview selection from canvas', - - previewAnnotatorFromCanvas, - index - ) -} - -function initControlNetUnit(index) { - document.querySelector( - `#controlnet_settings_${index} .controlnet_unit_label_` - ).textContent = `Control Net Settings Slot ${index}` -} -async function initializeControlNetTab(controlnet_max_models) { - try { - if (controlnet_max_models <= 0) { - document.getElementById('controlnetMissingError').style.display = - 'block' - - return - } - document.getElementById('controlnetMissingError').style.display = 'none' - // if (controlnet_max_models > g_controlnet_max_models) - // controlnet_max_models = g_controlnet_max_models - - await populateControlNetPresetMenu() - const parent_container = document.getElementById( - 'controlnet_parent_container' - ) - parent_container.innerHTML = '' - const controlnet_unit_template = document.getElementById( - 'controlnet_settings_template' - ) - - for (let index = 0; index < controlnet_max_models; index++) { - const controlnet_unit = controlnet_unit_template.cloneNode(true) - controlnet_unit.id = 'controlnet_settings_' + index - controlnet_unit.dataset['index'] = String(index) - parent_container.appendChild(controlnet_unit) - } - - const full_url = `${g_sd_url}/controlnet/module_list?alias_names=1` - let result_json = await api.requestGet(full_url) - g_module_detail = result_json['module_detail'] - - initControlNetUnitsEventListeners(controlnet_max_models) // add event listener to all units after cloning - - await populateModelMenu() - await populatePreprocessorMenu() - for (let index = 0; index < controlnet_max_models; index++) { - document.getElementById( - 'controlnet_settings_' + index - ).style.display = 'block' - initPreviewElement(index) - - initControlNetUnit(index) - } - // const version = await requestControlNetVersion() - // document.getElementById('ControlNetVersion').innerText = version - } catch (e) { - console.warn(e) - } -} - -module.exports = { - requestControlNetModelList, - populateModelMenu, - initializeControlNetTab, - getWeight, - mapPluginSettingsToControlNet, - getEnableControlNet, - getSelectedModule, - getSelectedModel, - // getControlNetMaxModelsNumber, - getControlNetGuidanceStrengthStart, - setControlNetGuidanceStrengthStart, - getControlNetGuidanceStrengthEnd, - setControlNetGuidanceStrengthEnd, - ControlNetUnit, - populateControlNetPresetMenu, - isControlNetModeEnable, - getModuleDetail() { - return g_module_detail - }, - requestControlNetVersion, - requestControlNetMaxUnits, -} From ca8eccf7186c4c5cc8b108dc3ca118a7b1e0c155 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 8 Jun 2023 12:19:53 +0300 Subject: [PATCH 003/143] add dependency to import svg as react component --- package-lock.json | 13866 ++++++++++++++++++++----------- package.json | 4 +- tsconfig.json | 1 + typescripts/@types/custom.d.ts | 6 + webpack.config.js | 5 + 5 files changed, 8973 insertions(+), 4909 deletions(-) create mode 100644 typescripts/@types/custom.d.ts diff --git a/package-lock.json b/package-lock.json index e4b9370c..2118e5fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ "@babel/plugin-proposal-object-rest-spread": "^7.20.7", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-transform-react-jsx": "^7.21.5", + "@svgr/webpack": "^8.0.1", "babel-loader": "^9.1.2", "clean-webpack-plugin": "^4.0.0", "copy-webpack-plugin": "^11.0.0", @@ -36,6 +37,7 @@ "terser-webpack-plugin": "^3.0.8", "ts-loader": "^9.4.2", "typescript": "^5.0.4", + "url-loader": "^4.1.1", "webpack": "^5.82.1", "webpack-cli": "^5.1.1" } @@ -66,9 +68,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.21.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", - "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.3.tgz", + "integrity": "sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -114,12 +116,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", - "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.3.tgz", + "integrity": "sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5", + "@babel/types": "^7.22.3", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -140,13 +142,25 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.3.tgz", + "integrity": "sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", - "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz", + "integrity": "sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.21.5", + "@babel/compat-data": "^7.22.0", "@babel/helper-validator-option": "^7.21.0", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", @@ -183,10 +197,94 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz", + "integrity": "sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.22.1", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-member-expression-to-functions": "^7.22.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.22.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz", + "integrity": "sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.3.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz", + "integrity": "sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", - "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz", + "integrity": "sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==", "dev": true, "engines": { "node": ">=6.9.0" @@ -217,6 +315,18 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz", + "integrity": "sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-module-imports": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", @@ -230,19 +340,31 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", - "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz", + "integrity": "sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-environment-visitor": "^7.22.1", "@babel/helper-module-imports": "^7.21.4", "@babel/helper-simple-access": "^7.21.5", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/template": "^7.21.9", + "@babel/traverse": "^7.22.1", + "@babel/types": "^7.22.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -257,6 +379,41 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz", + "integrity": "sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.1", + "@babel/helper-member-expression-to-functions": "^7.22.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.21.9", + "@babel/traverse": "^7.22.1", + "@babel/types": "^7.22.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-simple-access": { "version": "7.21.5", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", @@ -269,6 +426,18 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", @@ -308,6 +477,21 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", + "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helpers": { "version": "7.21.5", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", @@ -337,9 +521,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", - "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==", + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.4.tgz", + "integrity": "sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -347,6 +531,38 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz", + "integrity": "sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-transform-optional-chaining": "^7.22.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, "node_modules/@babel/plugin-proposal-object-rest-spread": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", @@ -366,6 +582,52 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", @@ -378,13 +640,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -393,10 +655,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { + "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -405,32 +667,25 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.5.tgz", - "integrity": "sha512-ELdlq61FpoEkHO6gFRpfj0kUgSwQTGoaEU8eMRoS8Dv3v6e7BjEAj5WMtIBRdHUeAioMhKP5HyxNzNnP+heKbA==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/types": "^7.21.5" + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -439,1363 +694,1374 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/runtime": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", - "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.3.tgz", + "integrity": "sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA==", + "dev": true, "dependencies": { - "regenerator-runtime": "^0.13.11" + "@babel/helper-plugin-utils": "^7.21.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/helper-plugin-utils": "^7.10.4" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", - "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.5", - "@babel/types": "^7.21.5", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/types": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", - "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", + "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@dependents/detective-less": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@dependents/detective-less/-/detective-less-3.0.2.tgz", - "integrity": "sha512-1YUvQ+e0eeTWAHoN8Uz2x2U37jZs6IGutiIE5LXId7cxfUGhtZjzxE06FdUiuiRrW+UE0vNCdSNPH2lY4dQCOQ==", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, "dependencies": { - "gonzales-pe": "^4.3.0", - "node-source-walk": "^5.0.1" + "@babel/helper-plugin-utils": "^7.10.4" }, - "engines": { - "node": ">=12" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@fastify/ajv-compiler": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.4.0.tgz", - "integrity": "sha512-69JnK7Cot+ktn7LD5TikP3b7psBPX55tYpQa8WSumt8r117PCa2zwHnImfBtRWYExreJlI48hr0WZaVrTBGj7w==", "dependencies": { - "ajv": "^8.11.0", - "ajv-formats": "^2.1.1", - "fast-uri": "^2.0.0" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@fastify/deepmerge": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@fastify/deepmerge/-/deepmerge-1.3.0.tgz", - "integrity": "sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==" - }, - "node_modules/@fastify/error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.1.0.tgz", - "integrity": "sha512-jmk3Q822+xi8jVzGsux3mWd+9O4rzVUGCqR2+JlF9LkCeeUmRdxPd2Je6S7IGMk5VTtB0xyB3crRQqklUyQ6dQ==" - }, - "node_modules/@fastify/fast-json-stringify-compiler": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.1.0.tgz", - "integrity": "sha512-cTKBV2J9+u6VaKDhX7HepSfPSzw+F+TSd+k0wzifj4rG+4E5PjSFJCk19P8R6tr/72cuzgGd+mbB3jFT6lvAgw==", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, "dependencies": { - "fast-json-stringify": "^5.0.0" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, - "node_modules/@jimp/bmp": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.16.13.tgz", - "integrity": "sha512-9edAxu7N2FX7vzkdl5Jo1BbACfycUtBQX+XBMcHA2bk62P8R0otgkHg798frgAk/WxQIzwxqOH6wMiCwrlAzdQ==", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13", - "bmp-js": "^0.1.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/core": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.16.13.tgz", - "integrity": "sha512-qXpA1tzTnlkTku9yqtuRtS/wVntvE6f3m3GNxdTdtmc+O+Wcg9Xo2ABPMh7Nc0AHbMKzwvwgB2JnjZmlmJEObg==", + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13", - "any-base": "^1.1.0", - "buffer": "^5.2.0", - "exif-parser": "^0.1.12", - "file-type": "^16.5.4", - "load-bmfont": "^1.3.1", - "mkdirp": "^0.5.1", - "phin": "^2.9.1", - "pixelmatch": "^4.0.2", - "tinycolor2": "^1.4.1" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/core/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/custom": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.13.tgz", - "integrity": "sha512-LTATglVUPGkPf15zX1wTMlZ0+AU7cGEGF6ekVF1crA8eHUWsGjrYTB+Ht4E3HTrCok8weQG+K01rJndCp/l4XA==", + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/core": "^0.16.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/gif": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.16.13.tgz", - "integrity": "sha512-yFAMZGv3o+YcjXilMWWwS/bv1iSqykFahFMSO169uVMtfQVfa90kt4/kDwrXNR6Q9i6VHpFiGZMlF2UnHClBvg==", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13", - "gifwrap": "^0.9.2", - "omggif": "^1.0.9" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/jpeg": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.16.13.tgz", - "integrity": "sha512-BJHlDxzTlCqP2ThqP8J0eDrbBfod7npWCbJAcfkKqdQuFk0zBPaZ6KKaQKyKxmWJ87Z6ohANZoMKEbtvrwz1AA==", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", + "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13", - "jpeg-js": "^0.4.2" + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/plugin-blit": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.13.tgz", - "integrity": "sha512-8Z1k96ZFxlhK2bgrY1JNWNwvaBeI/bciLM0yDOni2+aZwfIIiC7Y6PeWHTAvjHNjphz+XCt01WQmOYWCn0ML6g==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5" + "@babel/core": "^7.0.0" } }, - "node_modules/@jimp/plugin-blur": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.13.tgz", - "integrity": "sha512-PvLrfa8vkej3qinlebyhLpksJgCF5aiysDMSVhOZqwH5nQLLtDE9WYbnsofGw4r0VVpyw3H/ANCIzYTyCtP9Cg==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", + "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/plugin-circle": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.16.13.tgz", - "integrity": "sha512-RNave7EFgZrb5V5EpdvJGAEHMnDAJuwv05hKscNfIYxf0kR3KhViBTDy+MoTnMlIvaKFULfwIgaZWzyhuINMzA==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.3.tgz", + "integrity": "sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" + "@babel/helper-environment-visitor": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/plugin-color": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.13.tgz", - "integrity": "sha512-xW+9BtEvoIkkH/Wde9ql4nAFbYLkVINhpgAE7VcBUsuuB34WUbcBl/taOuUYQrPEFQJ4jfXiAJZ2H/rvKjCVnQ==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", + "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13", - "tinycolor2": "^1.4.1" + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/plugin-contain": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.16.13.tgz", - "integrity": "sha512-QayTXw4tXMwU6q6acNTQrTTFTXpNRBe+MgTGMDU0lk+23PjlFCO/9sacflelG8lsp7vNHhAxFeHptDMAksEYzg==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-blit": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5", - "@jimp/plugin-scale": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/plugin-cover": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.16.13.tgz", - "integrity": "sha512-BSsP71GTNaqWRcvkbWuIVH+zK7b3TSNebbhDkFK0fVaUTzHuKMS/mgY4hDZIEVt7Rf5FjadAYtsujHN9w0iSYA==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", + "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-crop": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5", - "@jimp/plugin-scale": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/plugin-crop": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.13.tgz", - "integrity": "sha512-WEl2tPVYwzYL8OKme6Go2xqiWgKsgxlMwyHabdAU4tXaRwOCnOI7v4021gCcBb9zn/oWwguHuKHmK30Fw2Z/PA==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.3.tgz", + "integrity": "sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" + "@babel/helper-create-class-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/plugin-displace": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.16.13.tgz", - "integrity": "sha512-qt9WKq8vWrcjySa9DyQ0x/RBMHQeiVjdVSY1SJsMjssPUf0pS74qorcuAkGi89biN3YoGUgPkpqECnAWnYwgGA==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.3.tgz", + "integrity": "sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" + "@babel/helper-create-class-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5" + "@babel/core": "^7.12.0" } }, - "node_modules/@jimp/plugin-dither": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.16.13.tgz", - "integrity": "sha512-5/N3yJggbWQTlGZHQYJPmQXEwR52qaXjEzkp1yRBbtdaekXE3BG/suo0fqeoV/csf8ooI78sJzYmIrxNoWVtgQ==", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", + "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/plugin-fisheye": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.13.tgz", - "integrity": "sha512-2rZmTdFbT/cF9lEZIkXCYO0TsT114Q27AX5IAo0Sju6jVQbvIk1dFUTnwLDadTo8wkJlFzGqMQ24Cs8cHWOliA==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", + "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/template": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/plugin-flip": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.16.13.tgz", - "integrity": "sha512-EmcgAA74FTc5u7Z+hUO/sRjWwfPPLuOQP5O64x5g4j0T12Bd29IgsYZxoutZo/rb3579+JNa/3wsSEmyVv1EpA==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", + "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-rotate": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/plugin-gaussian": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.13.tgz", - "integrity": "sha512-A1XKfGQD0iDdIiKqFYi8nZMv4dDVYdxbrmgR7y/CzUHhSYdcmoljLIIsZZM3Iks/Wa353W3vtvkWLuDbQbch1w==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/plugin-invert": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.16.13.tgz", - "integrity": "sha512-xFMrIn7czEZbdbMzZWuaZFnlLGJDVJ82y5vlsKsXRTG2kcxRsMPXvZRWHV57nSs1YFsNqXSbrC8B98n0E32njQ==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/plugin-mask": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.16.13.tgz", - "integrity": "sha512-wLRYKVBXql2GAYgt6FkTnCfE+q5NomM7Dlh0oIPGAoMBWDyTx0eYutRK6PlUrRK2yMHuroAJCglICTbxqGzowQ==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.1.tgz", + "integrity": "sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/plugin-normalize": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.16.13.tgz", - "integrity": "sha512-3tfad0n9soRna4IfW9NzQdQ2Z3ijkmo21DREHbE6CGcMIxOSvfRdSvf1qQPApxjTSo8LTU4MCi/fidx/NZ0GqQ==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/plugin-print": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.16.13.tgz", - "integrity": "sha512-0m6i3p01PGRkGAK9r53hDYrkyMq+tlhLOIbsSTmZyh6HLshUKlTB7eXskF5OpVd5ZUHoltlNc6R+ggvKIzxRFw==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.3.tgz", + "integrity": "sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13", - "load-bmfont": "^1.4.0" + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-blit": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/plugin-resize": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.13.tgz", - "integrity": "sha512-qoqtN8LDknm3fJm9nuPygJv30O3vGhSBD2TxrsCnhtOsxKAqVPJtFVdGd/qVuZ8nqQANQmTlfqTiK9mVWQ7MiQ==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", + "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/plugin-rotate": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.13.tgz", - "integrity": "sha512-Ev+Jjmj1nHYw897z9C3R9dYsPv7S2/nxdgfFb/h8hOwK0Ovd1k/+yYS46A0uj/JCKK0pQk8wOslYBkPwdnLorw==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-blit": ">=0.3.5", - "@jimp/plugin-crop": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/plugin-scale": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.13.tgz", - "integrity": "sha512-05POQaEJVucjTiSGMoH68ZiELc7QqpIpuQlZ2JBbhCV+WCbPFUBcGSmE7w4Jd0E2GvCho/NoMODLwgcVGQA97A==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.3.tgz", + "integrity": "sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/plugin-shadow": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.16.13.tgz", - "integrity": "sha512-nmu5VSZ9hsB1JchTKhnnCY+paRBnwzSyK5fhkhtQHHoFD5ArBQ/5wU8y6tCr7k/GQhhGq1OrixsECeMjPoc8Zw==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-blur": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/plugin-threshold": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.16.13.tgz", - "integrity": "sha512-+3zArBH0OE3Rhjm4HyAokMsZlIq5gpQec33CncyoSwxtRBM2WAhUVmCUKuBo+Lr/2/4ISoY4BWpHKhMLDix6cA==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.3.tgz", + "integrity": "sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13" + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-color": ">=0.8.0", - "@jimp/plugin-resize": ">=0.8.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/plugins": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.16.13.tgz", - "integrity": "sha512-CJLdqODEhEVs4MgWCxpWL5l95sCBlkuSLz65cxEm56X5akIsn4LOlwnKoSEZioYcZUBvHhCheH67AyPTudfnQQ==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/plugin-blit": "^0.16.13", - "@jimp/plugin-blur": "^0.16.13", - "@jimp/plugin-circle": "^0.16.13", - "@jimp/plugin-color": "^0.16.13", - "@jimp/plugin-contain": "^0.16.13", - "@jimp/plugin-cover": "^0.16.13", - "@jimp/plugin-crop": "^0.16.13", - "@jimp/plugin-displace": "^0.16.13", - "@jimp/plugin-dither": "^0.16.13", - "@jimp/plugin-fisheye": "^0.16.13", - "@jimp/plugin-flip": "^0.16.13", - "@jimp/plugin-gaussian": "^0.16.13", - "@jimp/plugin-invert": "^0.16.13", - "@jimp/plugin-mask": "^0.16.13", - "@jimp/plugin-normalize": "^0.16.13", - "@jimp/plugin-print": "^0.16.13", - "@jimp/plugin-resize": "^0.16.13", - "@jimp/plugin-rotate": "^0.16.13", - "@jimp/plugin-scale": "^0.16.13", - "@jimp/plugin-shadow": "^0.16.13", - "@jimp/plugin-threshold": "^0.16.13", - "timm": "^1.6.1" + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/png": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.16.13.tgz", - "integrity": "sha512-8cGqINvbWJf1G0Her9zbq9I80roEX0A+U45xFby3tDWfzn+Zz8XKDF1Nv9VUwVx0N3zpcG1RPs9hfheG4Cq2kg==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", + "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.16.13", - "pngjs": "^3.3.3" + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/tiff": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.16.13.tgz", - "integrity": "sha512-oJY8d9u95SwW00VPHuCNxPap6Q1+E/xM5QThb9Hu+P6EGuu6lIeLaNBMmFZyblwFbwrH+WBOZlvIzDhi4Dm/6Q==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", + "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "utif": "^2.0.1" + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-simple-access": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/types": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.16.13.tgz", - "integrity": "sha512-mC0yVNUobFDjoYLg4hoUwzMKgNlxynzwt3cDXzumGvRJ7Kb8qQGOWJQjQFo5OxmGExqzPphkirdbBF88RVLBCg==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz", + "integrity": "sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/bmp": "^0.16.13", - "@jimp/gif": "^0.16.13", - "@jimp/jpeg": "^0.16.13", - "@jimp/png": "^0.16.13", - "@jimp/tiff": "^0.16.13", - "timm": "^1.6.1" + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-validator-identifier": "^7.19.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@jimp/custom": ">=0.3.5" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jimp/utils": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.16.13.tgz", - "integrity": "sha512-VyCpkZzFTHXtKgVO35iKN0sYR10psGpV6SkcSeV4oF7eSYlR8Bl6aQLCzVeFjvESF7mxTmIiI3/XrMobVrtxDA==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.7.2", - "regenerator-runtime": "^0.13.3" + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz", + "integrity": "sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/helper-create-regexp-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz", + "integrity": "sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5" + }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.3.tgz", + "integrity": "sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.3.tgz", + "integrity": "sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.3.tgz", + "integrity": "sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@babel/compat-data": "^7.22.3", + "@babel/helper-compilation-targets": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "dev": true, "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.3.tgz", + "integrity": "sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz", + "integrity": "sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg==", + "dev": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz", + "integrity": "sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw==", "dev": true, "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "deprecated": "This functionality has been moved to @npmcli/fs", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.3.tgz", + "integrity": "sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug==", "dev": true, "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "@babel/helper-create-class-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@npmcli/move-file/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.3.tgz", + "integrity": "sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw==", "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@npmcli/move-file/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", "dev": true, "dependencies": { - "glob": "^7.1.3" + "@babel/helper-plugin-utils": "^7.18.6" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" - }, - "node_modules/@types/eslint": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", - "integrity": "sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==", + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.3.tgz", + "integrity": "sha512-b5J6muxQYp4H7loAQv/c7GO5cPuRA6H5hx4gO+/Hn+Cu9MRQU0PNiUoWq1L//8sq6kFSNxGXFb2XTaUfa9y+Pg==", "dev": true, "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", "dev": true, "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "dev": true + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.3.tgz", + "integrity": "sha512-JEulRWG2f04a7L8VWaOngWiK6p+JOSpB+DAtwfJgOaej1qdbNxqtK7MwTBHjUA10NeFcszlFNqCdbRcirzh2uQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-jsx": "^7.21.4", + "@babel/types": "^7.22.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", "dev": true, "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" + "@babel/plugin-transform-react-jsx": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "16.9.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", - "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" - }, - "node_modules/@types/react": { - "version": "18.2.6", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.6.tgz", - "integrity": "sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA==", + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", + "dev": true, "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/react-dom": { - "version": "18.2.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.4.tgz", - "integrity": "sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw==", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", + "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", + "dev": true, "dependencies": { - "@types/react": "*" + "@babel/helper-plugin-utils": "^7.21.5", + "regenerator-transform": "^0.15.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" - }, - "node_modules/@typescript-eslint/types": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", - "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", - "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", + "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "dev": true, "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", - "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.8", - "eslint-visitor-keys": "^3.3.0" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.3.tgz", + "integrity": "sha512-pyjnCIniO5PNaEuGxT28h0HbMru3qCVrMqVgVOz/krComdIrY9W6FCLBq9NWHY8HDGaUlan+UhmZElDENIfCcw==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-typescript": "^7.21.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", + "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.3.tgz", + "integrity": "sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", "dev": true, "dependencies": { - "@xtuc/ieee754": "^1.2.0" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.3.tgz", + "integrity": "sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw==", "dev": true, "dependencies": { - "@xtuc/long": "4.2.2" + "@babel/helper-create-regexp-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "node_modules/@babel/preset-env": { + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.4.tgz", + "integrity": "sha512-c3lHOjbwBv0TkhYCr+XCR6wKcSZ1QbQTVdSkZUaVpLv8CVWotBMArWUi5UAJrcrQaEnleVkkvaV8F/pmc/STZQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@babel/compat-data": "^7.22.3", + "@babel/helper-compilation-targets": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-validator-option": "^7.21.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.3", + "@babel/plugin-proposal-private-property-in-object": "^7.21.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-import-attributes": "^7.22.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.21.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.3", + "@babel/plugin-transform-async-to-generator": "^7.20.7", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.21.0", + "@babel/plugin-transform-class-properties": "^7.22.3", + "@babel/plugin-transform-class-static-block": "^7.22.3", + "@babel/plugin-transform-classes": "^7.21.0", + "@babel/plugin-transform-computed-properties": "^7.21.5", + "@babel/plugin-transform-destructuring": "^7.21.3", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-dynamic-import": "^7.22.1", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-export-namespace-from": "^7.22.3", + "@babel/plugin-transform-for-of": "^7.21.5", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-json-strings": "^7.22.3", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.3", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.20.11", + "@babel/plugin-transform-modules-commonjs": "^7.21.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.3", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.3", + "@babel/plugin-transform-new-target": "^7.22.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.3", + "@babel/plugin-transform-numeric-separator": "^7.22.3", + "@babel/plugin-transform-object-rest-spread": "^7.22.3", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-optional-catch-binding": "^7.22.3", + "@babel/plugin-transform-optional-chaining": "^7.22.3", + "@babel/plugin-transform-parameters": "^7.22.3", + "@babel/plugin-transform-private-methods": "^7.22.3", + "@babel/plugin-transform-private-property-in-object": "^7.22.3", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.21.5", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.20.7", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.21.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.3", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.3", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.22.4", + "babel-plugin-polyfill-corejs2": "^0.4.3", + "babel-plugin-polyfill-corejs3": "^0.8.1", + "babel-plugin-polyfill-regenerator": "^0.5.0", + "core-js-compat": "^3.30.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.0.tgz", - "integrity": "sha512-K/vuv72vpfSEZoo5KIU0a2FsEoYdW0DUMtMpB5X3LlUwshetMZRZRxB7sCsVji/lFaSxtQQ3aM9O4eMolXkU9w==", - "dev": true, - "engines": { - "node": ">=14.15.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" }, "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webpack-cli/info": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", - "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", + "node_modules/@babel/preset-react": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.3.tgz", + "integrity": "sha512-lxDz1mnZ9polqClBCVBjIVUypoB4qV3/tZUDb/IlYbW1kiiLaXaX+bInbRjl+lNQ/iUZraQ3+S8daEmoELMWug==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-validator-option": "^7.21.0", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.22.3", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + }, "engines": { - "node": ">=14.15.0" + "node": ">=6.9.0" }, "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webpack-cli/serve": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.4.tgz", - "integrity": "sha512-0xRgjgDLdz6G7+vvDLlaRpFatJaJ69uTalZLRSMX5B3VUrDmXcrVA3+6fXXQgmYz7bY9AAgs348XQdmtLsK41A==", + "node_modules/@babel/preset-typescript": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz", + "integrity": "sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-validator-option": "^7.21.0", + "@babel/plugin-syntax-jsx": "^7.21.4", + "@babel/plugin-transform-modules-commonjs": "^7.21.5", + "@babel/plugin-transform-typescript": "^7.21.3" + }, "engines": { - "node": ">=14.15.0" + "node": ">=6.9.0" }, "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", "dev": true }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "node_modules/@babel/runtime": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", + "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", "dependencies": { - "event-target-shim": "^5.0.0" + "regenerator-runtime": "^0.13.11" }, "engines": { - "node": ">=6.5" + "node": ">=6.9.0" } }, - "node_modules/abstract-logging": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", - "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" - }, - "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "node_modules/@babel/template": { + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", + "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "@babel/code-frame": "^7.21.4", + "@babel/parser": "^7.21.9", + "@babel/types": "^7.21.5" }, "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "peerDependencies": { - "acorn": "^8" + "node": ">=6.9.0" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "node_modules/@babel/traverse": { + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.4.tgz", + "integrity": "sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==", "dev": true, "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.22.3", + "@babel/helper-environment-visitor": "^7.22.1", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.22.4", + "@babel/types": "^7.22.4", + "debug": "^4.1.0", + "globals": "^11.1.0" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "node_modules/@babel/types": { + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.4.tgz", + "integrity": "sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==", + "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "@babel/helper-string-parser": "^7.21.5", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "node_modules/@dependents/detective-less": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@dependents/detective-less/-/detective-less-3.0.2.tgz", + "integrity": "sha512-1YUvQ+e0eeTWAHoN8Uz2x2U37jZs6IGutiIE5LXId7cxfUGhtZjzxE06FdUiuiRrW+UE0vNCdSNPH2lY4dQCOQ==", "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" + "gonzales-pe": "^4.3.0", + "node-source-walk": "^5.0.1" }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "engines": { + "node": ">=12" } }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">=8" + "node": ">=10.0.0" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, + "node_modules/@fastify/ajv-compiler": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.4.0.tgz", + "integrity": "sha512-69JnK7Cot+ktn7LD5TikP3b7psBPX55tYpQa8WSumt8r117PCa2zwHnImfBtRWYExreJlI48hr0WZaVrTBGj7w==", "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" + "ajv": "^8.11.0", + "ajv-formats": "^2.1.1", + "fast-uri": "^2.0.0" } }, - "node_modules/any-base": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", - "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" - }, - "node_modules/any-promise": { + "node_modules/@fastify/deepmerge": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/app-module-path": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", - "integrity": "sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==" + "resolved": "https://registry.npmjs.org/@fastify/deepmerge/-/deepmerge-1.3.0.tgz", + "integrity": "sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==" }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==" + "node_modules/@fastify/error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.1.0.tgz", + "integrity": "sha512-jmk3Q822+xi8jVzGsux3mWd+9O4rzVUGCqR2+JlF9LkCeeUmRdxPd2Je6S7IGMk5VTtB0xyB3crRQqklUyQ6dQ==" }, - "node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "dev": true, + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.1.0.tgz", + "integrity": "sha512-cTKBV2J9+u6VaKDhX7HepSfPSzw+F+TSd+k0wzifj4rG+4E5PjSFJCk19P8R6tr/72cuzgGd+mbB3jFT6lvAgw==", "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ast-module-types": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-4.0.0.tgz", - "integrity": "sha512-Kd0o8r6CDazJGCRzs8Ivpn0xj19oNKrULhoJFzhGjRsLpekF2zyZs9Ukz+JvZhWD6smszfepakTFhAaYpsI12g==", - "engines": { - "node": ">=12.0" - } - }, - "node_modules/atomic-sleep": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", - "engines": { - "node": ">=8.0.0" + "fast-json-stringify": "^5.0.0" } }, - "node_modules/avvio": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.2.0.tgz", - "integrity": "sha512-bbCQdg7bpEv6kGH41RO/3B2/GMMmJSo2iBK+X8AWN9mujtfUipMDfIjsgHCfpnKqoGEQrrmCDKSa5OQ19+fDmg==", - "dependencies": { - "archy": "^1.0.0", - "debug": "^4.0.0", - "fastq": "^1.6.1" - } + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true }, - "node_modules/babel-loader": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", - "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", - "dev": true, + "node_modules/@jimp/bmp": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.16.13.tgz", + "integrity": "sha512-9edAxu7N2FX7vzkdl5Jo1BbACfycUtBQX+XBMcHA2bk62P8R0otgkHg798frgAk/WxQIzwxqOH6wMiCwrlAzdQ==", "dependencies": { - "find-cache-dir": "^3.3.2", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "bmp-js": "^0.1.0" }, "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" + "@jimp/custom": ">=0.3.5" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "node_modules/@jimp/core": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.16.13.tgz", + "integrity": "sha512-qXpA1tzTnlkTku9yqtuRtS/wVntvE6f3m3GNxdTdtmc+O+Wcg9Xo2ABPMh7Nc0AHbMKzwvwgB2JnjZmlmJEObg==", "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "any-base": "^1.1.0", + "buffer": "^5.2.0", + "exif-parser": "^0.1.12", + "file-type": "^16.5.4", + "load-bmfont": "^1.3.1", + "mkdirp": "^0.5.1", + "phin": "^2.9.1", + "pixelmatch": "^4.0.2", + "tinycolor2": "^1.4.1" } }, - "node_modules/bl/node_modules/buffer": { + "node_modules/@jimp/core/node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", @@ -1818,1233 +2084,4029 @@ "ieee754": "^1.1.13" } }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/@jimp/custom": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.13.tgz", + "integrity": "sha512-LTATglVUPGkPf15zX1wTMlZ0+AU7cGEGF6ekVF1crA8eHUWsGjrYTB+Ht4E3HTrCok8weQG+K01rJndCp/l4XA==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "@babel/runtime": "^7.7.2", + "@jimp/core": "^0.16.13" } }, - "node_modules/bmp-js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", - "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@jimp/gif": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.16.13.tgz", + "integrity": "sha512-yFAMZGv3o+YcjXilMWWwS/bv1iSqykFahFMSO169uVMtfQVfa90kt4/kDwrXNR6Q9i6VHpFiGZMlF2UnHClBvg==", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "gifwrap": "^0.9.2", + "omggif": "^1.0.9" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" } }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/@jimp/jpeg": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.16.13.tgz", + "integrity": "sha512-BJHlDxzTlCqP2ThqP8J0eDrbBfod7npWCbJAcfkKqdQuFk0zBPaZ6KKaQKyKxmWJ87Z6ohANZoMKEbtvrwz1AA==", "dependencies": { - "fill-range": "^7.0.1" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "jpeg-js": "^0.4.2" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@jimp/custom": ">=0.3.5" } }, - "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], + "node_modules/@jimp/plugin-blit": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.13.tgz", + "integrity": "sha512-8Z1k96ZFxlhK2bgrY1JNWNwvaBeI/bciLM0yDOni2+aZwfIIiC7Y6PeWHTAvjHNjphz+XCt01WQmOYWCn0ML6g==", "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - }, - "bin": { - "browserslist": "cli.js" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "peerDependencies": { + "@jimp/custom": ">=0.3.5" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/@jimp/plugin-blur": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.13.tgz", + "integrity": "sha512-PvLrfa8vkej3qinlebyhLpksJgCF5aiysDMSVhOZqwH5nQLLtDE9WYbnsofGw4r0VVpyw3H/ANCIzYTyCtP9Cg==", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" } }, - "node_modules/buffer-equal": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", - "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==", - "engines": { - "node": ">=0.4.0" + "node_modules/@jimp/plugin-circle": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.16.13.tgz", + "integrity": "sha512-RNave7EFgZrb5V5EpdvJGAEHMnDAJuwv05hKscNfIYxf0kR3KhViBTDy+MoTnMlIvaKFULfwIgaZWzyhuINMzA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" } }, - "node_modules/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 - }, - "node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "dev": true, + "node_modules/@jimp/plugin-color": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.13.tgz", + "integrity": "sha512-xW+9BtEvoIkkH/Wde9ql4nAFbYLkVINhpgAE7VcBUsuuB34WUbcBl/taOuUYQrPEFQJ4jfXiAJZ2H/rvKjCVnQ==", "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "tinycolor2": "^1.4.1" }, - "engines": { - "node": ">= 10" + "peerDependencies": { + "@jimp/custom": ">=0.3.5" } }, - "node_modules/cacache/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" + "node_modules/@jimp/plugin-contain": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.16.13.tgz", + "integrity": "sha512-QayTXw4tXMwU6q6acNTQrTTFTXpNRBe+MgTGMDU0lk+23PjlFCO/9sacflelG8lsp7vNHhAxFeHptDMAksEYzg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5", + "@jimp/plugin-scale": ">=0.3.5" } }, - "node_modules/cacache/node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, + "node_modules/@jimp/plugin-cover": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.16.13.tgz", + "integrity": "sha512-BSsP71GTNaqWRcvkbWuIVH+zK7b3TSNebbhDkFK0fVaUTzHuKMS/mgY4hDZIEVt7Rf5FjadAYtsujHN9w0iSYA==", "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-crop": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5", + "@jimp/plugin-scale": ">=0.3.5" } }, - "node_modules/cacache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, + "node_modules/@jimp/plugin-crop": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.13.tgz", + "integrity": "sha512-WEl2tPVYwzYL8OKme6Go2xqiWgKsgxlMwyHabdAU4tXaRwOCnOI7v4021gCcBb9zn/oWwguHuKHmK30Fw2Z/PA==", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "@jimp/custom": ">=0.3.5" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001486", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001486.tgz", - "integrity": "sha512-uv7/gXuHi10Whlj0pp5q/tsK/32J2QSqVRKQhs2j8VsDCjgyruAh/eEXHF822VqO9yT6iZKw3nRwZRSPBE9OQg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, + "node_modules/@jimp/plugin-displace": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.16.13.tgz", + "integrity": "sha512-qt9WKq8vWrcjySa9DyQ0x/RBMHQeiVjdVSY1SJsMjssPUf0pS74qorcuAkGi89biN3YoGUgPkpqECnAWnYwgGA==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@jimp/custom": ">=0.3.5" } }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "engines": { - "node": "*" + "node_modules/@jimp/plugin-dither": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.16.13.tgz", + "integrity": "sha512-5/N3yJggbWQTlGZHQYJPmQXEwR52qaXjEzkp1yRBbtdaekXE3BG/suo0fqeoV/csf8ooI78sJzYmIrxNoWVtgQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "node_modules/@jimp/plugin-fisheye": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.13.tgz", + "integrity": "sha512-2rZmTdFbT/cF9lEZIkXCYO0TsT114Q27AX5IAo0Sju6jVQbvIk1dFUTnwLDadTo8wkJlFzGqMQ24Cs8cHWOliA==", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "peerDependencies": { + "@jimp/custom": ">=0.3.5" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, + "node_modules/@jimp/plugin-flip": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.16.13.tgz", + "integrity": "sha512-EmcgAA74FTc5u7Z+hUO/sRjWwfPPLuOQP5O64x5g4j0T12Bd29IgsYZxoutZo/rb3579+JNa/3wsSEmyVv1EpA==", "dependencies": { - "is-glob": "^4.0.1" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" }, - "engines": { - "node": ">= 6" + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-rotate": ">=0.3.5" } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "node_modules/@jimp/plugin-gaussian": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.13.tgz", + "integrity": "sha512-A1XKfGQD0iDdIiKqFYi8nZMv4dDVYdxbrmgR7y/CzUHhSYdcmoljLIIsZZM3Iks/Wa353W3vtvkWLuDbQbch1w==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-invert": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.16.13.tgz", + "integrity": "sha512-xFMrIn7czEZbdbMzZWuaZFnlLGJDVJ82y5vlsKsXRTG2kcxRsMPXvZRWHV57nSs1YFsNqXSbrC8B98n0E32njQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-mask": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.16.13.tgz", + "integrity": "sha512-wLRYKVBXql2GAYgt6FkTnCfE+q5NomM7Dlh0oIPGAoMBWDyTx0eYutRK6PlUrRK2yMHuroAJCglICTbxqGzowQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-normalize": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.16.13.tgz", + "integrity": "sha512-3tfad0n9soRna4IfW9NzQdQ2Z3ijkmo21DREHbE6CGcMIxOSvfRdSvf1qQPApxjTSo8LTU4MCi/fidx/NZ0GqQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-print": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.16.13.tgz", + "integrity": "sha512-0m6i3p01PGRkGAK9r53hDYrkyMq+tlhLOIbsSTmZyh6HLshUKlTB7eXskF5OpVd5ZUHoltlNc6R+ggvKIzxRFw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "load-bmfont": "^1.4.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-resize": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.13.tgz", + "integrity": "sha512-qoqtN8LDknm3fJm9nuPygJv30O3vGhSBD2TxrsCnhtOsxKAqVPJtFVdGd/qVuZ8nqQANQmTlfqTiK9mVWQ7MiQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-rotate": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.13.tgz", + "integrity": "sha512-Ev+Jjmj1nHYw897z9C3R9dYsPv7S2/nxdgfFb/h8hOwK0Ovd1k/+yYS46A0uj/JCKK0pQk8wOslYBkPwdnLorw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5", + "@jimp/plugin-crop": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-scale": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.13.tgz", + "integrity": "sha512-05POQaEJVucjTiSGMoH68ZiELc7QqpIpuQlZ2JBbhCV+WCbPFUBcGSmE7w4Jd0E2GvCho/NoMODLwgcVGQA97A==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-shadow": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.16.13.tgz", + "integrity": "sha512-nmu5VSZ9hsB1JchTKhnnCY+paRBnwzSyK5fhkhtQHHoFD5ArBQ/5wU8y6tCr7k/GQhhGq1OrixsECeMjPoc8Zw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blur": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-threshold": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.16.13.tgz", + "integrity": "sha512-+3zArBH0OE3Rhjm4HyAokMsZlIq5gpQec33CncyoSwxtRBM2WAhUVmCUKuBo+Lr/2/4ISoY4BWpHKhMLDix6cA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-color": ">=0.8.0", + "@jimp/plugin-resize": ">=0.8.0" + } + }, + "node_modules/@jimp/plugins": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.16.13.tgz", + "integrity": "sha512-CJLdqODEhEVs4MgWCxpWL5l95sCBlkuSLz65cxEm56X5akIsn4LOlwnKoSEZioYcZUBvHhCheH67AyPTudfnQQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/plugin-blit": "^0.16.13", + "@jimp/plugin-blur": "^0.16.13", + "@jimp/plugin-circle": "^0.16.13", + "@jimp/plugin-color": "^0.16.13", + "@jimp/plugin-contain": "^0.16.13", + "@jimp/plugin-cover": "^0.16.13", + "@jimp/plugin-crop": "^0.16.13", + "@jimp/plugin-displace": "^0.16.13", + "@jimp/plugin-dither": "^0.16.13", + "@jimp/plugin-fisheye": "^0.16.13", + "@jimp/plugin-flip": "^0.16.13", + "@jimp/plugin-gaussian": "^0.16.13", + "@jimp/plugin-invert": "^0.16.13", + "@jimp/plugin-mask": "^0.16.13", + "@jimp/plugin-normalize": "^0.16.13", + "@jimp/plugin-print": "^0.16.13", + "@jimp/plugin-resize": "^0.16.13", + "@jimp/plugin-rotate": "^0.16.13", + "@jimp/plugin-scale": "^0.16.13", + "@jimp/plugin-shadow": "^0.16.13", + "@jimp/plugin-threshold": "^0.16.13", + "timm": "^1.6.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/png": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.16.13.tgz", + "integrity": "sha512-8cGqINvbWJf1G0Her9zbq9I80roEX0A+U45xFby3tDWfzn+Zz8XKDF1Nv9VUwVx0N3zpcG1RPs9hfheG4Cq2kg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "pngjs": "^3.3.3" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/tiff": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.16.13.tgz", + "integrity": "sha512-oJY8d9u95SwW00VPHuCNxPap6Q1+E/xM5QThb9Hu+P6EGuu6lIeLaNBMmFZyblwFbwrH+WBOZlvIzDhi4Dm/6Q==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "utif": "^2.0.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/types": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.16.13.tgz", + "integrity": "sha512-mC0yVNUobFDjoYLg4hoUwzMKgNlxynzwt3cDXzumGvRJ7Kb8qQGOWJQjQFo5OxmGExqzPphkirdbBF88RVLBCg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/bmp": "^0.16.13", + "@jimp/gif": "^0.16.13", + "@jimp/jpeg": "^0.16.13", + "@jimp/png": "^0.16.13", + "@jimp/tiff": "^0.16.13", + "timm": "^1.6.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/utils": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.16.13.tgz", + "integrity": "sha512-VyCpkZzFTHXtKgVO35iKN0sYR10psGpV6SkcSeV4oF7eSYlR8Bl6aQLCzVeFjvESF7mxTmIiI3/XrMobVrtxDA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.0.0.tgz", + "integrity": "sha512-UKrY3860AQICgH7g+6h2zkoxeVEPLYwX/uAjmqo4PIq2FIHppwhIqZstIyTz0ZtlwreKR41O3W3BzsBBiJV2Aw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.0.0.tgz", + "integrity": "sha512-KLcjiZychInVrhs86OvcYPLTFu9L5XV2vj0XAaE1HwE3J3jLmIzRY8ttdeAg/iFyp8nhavJpafpDZTt+1LIpkQ==", + "dev": true, + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.0.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.0.0.tgz", + "integrity": "sha512-aJKtc+Pie/rFYsVH/unSkDaZGvEeylNv/s2cP+ta9/rYWxRVvoV/S4Qw65Kmrtah4CBK5PM6ISH9qUH7IJQCng==", + "dev": true, + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.0.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.0.1.tgz", + "integrity": "sha512-bfCFb+4ZsM3UuKP2t7KmDwn6YV8qVn9HIQJmau6xeQb/iV65Rpi7NBNBWA2hcCd4GKoCqG8hpaaDk5FDR0eH+g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.0.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.0.1.tgz", + "integrity": "sha512-29OJ1QmJgnohQHDAgAuY2h21xWD6TZiXji+hnx+W635RiXTAlHTbjrZDktfqzkN0bOeQEtNe+xgq73/XeWFfSg==", + "dev": true, + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.0.1.tgz", + "integrity": "sha512-zSoeKcbCmfMXjA11uDuCJb+1LWNb3vy6Qw/VHj0Nfcl3UuqwuoZWknHsBIhCWvi4wU9vPui3aq054qjVyZqY4A==", + "dev": true, + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.0.0", + "@svgr/plugin-jsx": "8.0.1", + "@svgr/plugin-svgo": "8.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/eslint": { + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", + "integrity": "sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "16.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", + "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "node_modules/@types/react": { + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.6.tgz", + "integrity": "sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.4.tgz", + "integrity": "sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + }, + "node_modules/@typescript-eslint/types": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", + "dependencies": { + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", + "dependencies": { + "@typescript-eslint/types": "5.59.8", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.0.tgz", + "integrity": "sha512-K/vuv72vpfSEZoo5KIU0a2FsEoYdW0DUMtMpB5X3LlUwshetMZRZRxB7sCsVji/lFaSxtQQ3aM9O4eMolXkU9w==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", + "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.4.tgz", + "integrity": "sha512-0xRgjgDLdz6G7+vvDLlaRpFatJaJ69uTalZLRSMX5B3VUrDmXcrVA3+6fXXQgmYz7bY9AAgs348XQdmtLsK41A==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-base": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", + "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app-module-path": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", + "integrity": "sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==" + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-module-types": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-4.0.0.tgz", + "integrity": "sha512-Kd0o8r6CDazJGCRzs8Ivpn0xj19oNKrULhoJFzhGjRsLpekF2zyZs9Ukz+JvZhWD6smszfepakTFhAaYpsI12g==", + "engines": { + "node": ">=12.0" + } + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/avvio": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.2.0.tgz", + "integrity": "sha512-bbCQdg7bpEv6kGH41RO/3B2/GMMmJSo2iBK+X8AWN9mujtfUipMDfIjsgHCfpnKqoGEQrrmCDKSa5OQ19+fDmg==", + "dependencies": { + "archy": "^1.0.0", + "debug": "^4.0.0", + "fastq": "^1.6.1" + } + }, + "node_modules/babel-loader": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", + "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", + "dev": true, + "dependencies": { + "find-cache-dir": "^3.3.2", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz", + "integrity": "sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.4.0", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz", + "integrity": "sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.0", + "core-js-compat": "^3.30.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz", + "integrity": "sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bmp-js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", + "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/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 + }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001486", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001486.tgz", + "integrity": "sha512-uv7/gXuHi10Whlj0pp5q/tsK/32J2QSqVRKQhs2j8VsDCjgyruAh/eEXHF822VqO9yT6iZKw3nRwZRSPBE9OQg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, - "engines": { - "node": ">=10" + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/clean-webpack-plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==", + "dev": true, + "dependencies": { + "del": "^4.1.1" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "webpack": ">=4.0.0 <6.0.0" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/core-js-compat": { + "version": "3.30.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", + "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cosmiconfig": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", + "dev": true, + "dependencies": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "engines": { + "node": "*" + } + }, + "node_modules/css-loader": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", + "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.19", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dependency-tree": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/dependency-tree/-/dependency-tree-9.0.0.tgz", + "integrity": "sha512-osYHZJ1fBSon3lNLw70amAXsQ+RGzXsPvk9HbBgTLbp/bQBmpH5mOmsUvqXU+YEWVU0ZLewsmzOET/8jWswjDQ==", + "dependencies": { + "commander": "^2.20.3", + "debug": "^4.3.1", + "filing-cabinet": "^3.0.1", + "precinct": "^9.0.0", + "typescript": "^4.0.0" + }, + "bin": { + "dependency-tree": "bin/cli.js" + }, + "engines": { + "node": "^10.13 || ^12 || >=14" + } + }, + "node_modules/dependency-tree/node_modules/detective-stylus": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/detective-stylus/-/detective-stylus-3.0.0.tgz", + "integrity": "sha512-1xYTzbrduExqMYmte7Qk99IRA3Aa6oV7PYzd+3yDcQXkmENvyGF/arripri6lxRDdNYEb4fZFuHtNRAXbz3iAA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/dependency-tree/node_modules/module-definition": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/module-definition/-/module-definition-4.1.0.tgz", + "integrity": "sha512-rHXi/DpMcD2qcKbPCTklDbX9lBKJrUSl971TW5l6nMpqKCIlzJqmQ8cfEF5M923h2OOLHPDVlh5pJxNyV+AJlw==", + "dependencies": { + "ast-module-types": "^4.0.0", + "node-source-walk": "^5.0.1" + }, + "bin": { + "module-definition": "bin/cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dependency-tree/node_modules/precinct": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/precinct/-/precinct-9.2.1.tgz", + "integrity": "sha512-uzKHaTyiVejWW7VJtHInb9KBUq9yl9ojxXGujhjhDmPon2wgZPBKQIKR+6csGqSlUeGXAA4MEFnU6DesxZib+A==", + "dependencies": { + "@dependents/detective-less": "^3.0.1", + "commander": "^9.5.0", + "detective-amd": "^4.1.0", + "detective-cjs": "^4.1.0", + "detective-es6": "^3.0.1", + "detective-postcss": "^6.1.1", + "detective-sass": "^4.1.1", + "detective-scss": "^3.0.1", + "detective-stylus": "^3.0.0", + "detective-typescript": "^9.1.1", + "module-definition": "^4.1.0", + "node-source-walk": "^5.0.1" + }, + "bin": { + "precinct": "bin/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.14.0 || >=16.0.0" + } + }, + "node_modules/dependency-tree/node_modules/precinct/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/dependency-tree/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/detective-amd": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/detective-amd/-/detective-amd-4.2.0.tgz", + "integrity": "sha512-RbuEJHz78A8nW7CklkqTzd8lDCN42En53dgEIsya0DilpkwslamSZDasLg8dJyxbw46OxhSQeY+C2btdSkCvQQ==", + "dependencies": { + "ast-module-types": "^4.0.0", + "escodegen": "^2.0.0", + "get-amd-module-type": "^4.1.0", + "node-source-walk": "^5.0.1" + }, + "bin": { + "detective-amd": "bin/cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/detective-cjs": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/detective-cjs/-/detective-cjs-4.1.0.tgz", + "integrity": "sha512-QxzMwt5MfPLwS7mG30zvnmOvHLx5vyVvjsAV6gQOyuMoBR5G1DhS1eJZ4P10AlH+HSnk93mTcrg3l39+24XCtg==", + "dependencies": { + "ast-module-types": "^4.0.0", + "node-source-walk": "^5.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/detective-es6": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/detective-es6/-/detective-es6-3.0.1.tgz", + "integrity": "sha512-evPeYIEdK1jK3Oji5p0hX4sPV/1vK+o4ihcWZkMQE6voypSW/cIBiynOLxQk5KOOQbdP8oOAsYqouMTYO5l1sw==", + "dependencies": { + "node-source-walk": "^5.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/detective-less": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/detective-less/-/detective-less-1.0.2.tgz", + "integrity": "sha512-Rps1xDkEEBSq3kLdsdnHZL1x2S4NGDcbrjmd4q+PykK5aJwDdP5MBgrJw1Xo+kyUHuv3JEzPqxr+Dj9ryeDRTA==", + "dependencies": { + "debug": "^4.0.0", + "gonzales-pe": "^4.2.3", + "node-source-walk": "^4.0.0" + }, + "engines": { + "node": ">= 6.0" + } + }, + "node_modules/detective-less/node_modules/node-source-walk": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-4.3.0.tgz", + "integrity": "sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA==", + "dependencies": { + "@babel/parser": "^7.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/detective-postcss": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-6.1.3.tgz", + "integrity": "sha512-7BRVvE5pPEvk2ukUWNQ+H2XOq43xENWbH0LcdCE14mwgTBEAMoAx+Fc1rdp76SmyZ4Sp48HlV7VedUnP6GA1Tw==", + "dependencies": { + "is-url": "^1.2.4", + "postcss": "^8.4.23", + "postcss-values-parser": "^6.0.2" + }, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/detective-sass": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/detective-sass/-/detective-sass-4.1.3.tgz", + "integrity": "sha512-xGRbwGaGte57gvEqM8B9GDiURY3El/H49vA6g9wFkxq9zalmTlTAuqWu+BsH0iwonGPruLt55tZZDEZqPc6lag==", + "dependencies": { + "gonzales-pe": "^4.3.0", + "node-source-walk": "^5.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/detective-scss": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/detective-scss/-/detective-scss-3.1.1.tgz", + "integrity": "sha512-FWkfru1jZBhUeuBsOeGKXKAVDrzYFSQFK2o2tuG/nCCFQ0U/EcXC157MNAcR5mmj+mCeneZzlkBOFJTesDjrww==", + "dependencies": { + "gonzales-pe": "^4.3.0", + "node-source-walk": "^5.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/detective-stylus": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detective-stylus/-/detective-stylus-2.0.1.tgz", + "integrity": "sha512-/Tvs1pWLg8eYwwV6kZQY5IslGaYqc/GACxjcaGudiNtN5nKCH6o2WnJK3j0gA3huCnoQcbv8X7oz/c1lnvE3zQ==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/detective-typescript": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-9.1.1.tgz", + "integrity": "sha512-Uc1yVutTF0RRm1YJ3g//i1Cn2vx1kwHj15cnzQP6ff5koNzQ0idc1zAC73ryaWEulA0ElRXFTq6wOqe8vUQ3MA==", + "dependencies": { + "@typescript-eslint/typescript-estree": "^5.55.0", + "ast-module-types": "^4.0.0", + "node-source-walk": "^5.0.1", + "typescript": "^4.9.5" + }, + "engines": { + "node": "^12.20.0 || ^14.14.0 || >=16.0.0" + } + }, + "node_modules/detective-typescript/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-case/node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.393", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.393.tgz", + "integrity": "sha512-Yl1E9pu+7PBKSVHZsuw79QVa8ZonpyxBGI/MnuBumiXpxNuNwFo9iZLAAhQGla/LTAt1A7zR4PwgysukxJc0qA==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", + "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/exif-parser": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", + "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==" + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-json-stringify": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.5.0.tgz", + "integrity": "sha512-rmw2Z8/mLkND8zI+3KTYIkNPEoF5v6GqDP/o+g7H3vjdWjBwuKpgAYFHIzL6ORRB+iqDjjtJnLIW9Mzxn5szOA==", + "dependencies": { + "@fastify/deepmerge": "^1.0.0", + "ajv": "^8.10.0", + "ajv-formats": "^2.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^2.1.0", + "rfdc": "^1.2.0" + } + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fast-querystring": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.0.0.tgz", + "integrity": "sha512-3LQi62IhQoDlmt4ULCYmh17vRO2EtS7hTSsG4WwoKWgV7GLMKBOecEh+aiavASnLx8I2y89OD33AGLo0ccRhzA==", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-redact": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", + "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-uri": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.2.0.tgz", + "integrity": "sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg==" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastify": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.10.2.tgz", + "integrity": "sha512-0T+4zI6N3S8ex0LCZi3H4FasJR4AzWw834fUkPWvV8r6GBJkLmAOfFxH8f5V29Plef24IK0QSQD/tz1Nx+1UOA==", + "dependencies": { + "@fastify/ajv-compiler": "^3.3.1", + "@fastify/error": "^3.0.0", + "@fastify/fast-json-stringify-compiler": "^4.1.0", + "abstract-logging": "^2.0.1", + "avvio": "^8.2.0", + "content-type": "^1.0.4", + "find-my-way": "^7.3.0", + "light-my-request": "^5.6.1", + "pino": "^8.5.0", + "process-warning": "^2.0.0", + "proxy-addr": "^2.0.7", + "rfdc": "^1.3.0", + "secure-json-parse": "^2.5.0", + "semver": "^7.3.7", + "tiny-lru": "^10.0.0" + } + }, + "node_modules/fastq": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, - "engines": { - "node": ">=6.0" + "peerDependencies": { + "ajv": "^6.9.1" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, "engines": { - "node": ">=6" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/clean-webpack-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==", - "dev": true, + "node_modules/file-type": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", "dependencies": { - "del": "^4.1.1" + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" }, "engines": { - "node": ">=10.0.0" + "node": ">=10" }, - "peerDependencies": { - "webpack": ">=4.0.0 <6.0.0" + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" } }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "node_modules/filing-cabinet": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/filing-cabinet/-/filing-cabinet-3.3.1.tgz", + "integrity": "sha512-renEK4Hh6DUl9Vl22Y3cxBq1yh8oNvbAdXnhih0wVpmea+uyKjC9K4QeRjUaybIiIewdzfum+Fg15ZqJ/GyCaA==", "dependencies": { - "restore-cursor": "^3.1.0" + "app-module-path": "^2.2.0", + "commander": "^2.20.3", + "debug": "^4.3.3", + "enhanced-resolve": "^5.8.3", + "is-relative-path": "^1.0.2", + "module-definition": "^3.3.1", + "module-lookup-amd": "^7.0.1", + "resolve": "^1.21.0", + "resolve-dependency-path": "^2.0.0", + "sass-lookup": "^3.0.0", + "stylus-lookup": "^3.0.1", + "tsconfig-paths": "^3.10.1", + "typescript": "^3.9.7" + }, + "bin": { + "filing-cabinet": "bin/cli.js" }, "engines": { - "node": ">=8" + "node": ">=10.13.0" } }, - "node_modules/cli-spinners": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", - "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", - "engines": { - "node": ">=6" + "node_modules/filing-cabinet/node_modules/typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4.2.0" } }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, "engines": { - "node": ">=0.8" + "node": ">=8" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, + "node_modules/find-my-way": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.3.1.tgz", + "integrity": "sha512-kGvM08SOkqvheLcuQ8GW9t/H901Qb9rZEbcNWbXopzy4jDRoaJpJoObPSKf4MnQLZ20ZTp7rL5MpF6rf+pqmyg==", "dependencies": { - "color-name": "1.1.3" + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^2.0.0" + }, + "engines": { + "node": ">=14" } }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "node_modules/flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", + "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash." }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "engines": { "node": ">= 0.6" } }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 0.6" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" + "node": ">=6.9.0" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, + "node_modules/get-amd-module-type": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-4.1.0.tgz", + "integrity": "sha512-0e/eK6vTGCnSfQ6eYs3wtH05KotJYIP7ZIZEueP/KlA+0dIAEs8bYFvOd/U56w1vfjhJqBagUxVMyy9Tr/cViQ==", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "ast-module-types": "^4.0.0", + "node-source-walk": "^5.0.1" }, "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "engines": { - "node": "*" + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "node_modules/gifwrap": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.9.4.tgz", + "integrity": "sha512-MDMwbhASQuVeD4JKd1fKgNgCRL3fGqMM4WaqpNhWO0JiMOAjbQdumbs4BbBZEy9/M00EHEjKN3HieVhCUlwjeQ==", + "dependencies": { + "image-q": "^4.0.0", + "omggif": "^1.0.10" } }, - "node_modules/css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", - "dev": true, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.19", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": "*" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "bin": { - "cssesc": "bin/cssesc" + "dependencies": { + "is-glob": "^4.0.3" }, "engines": { - "node": ">=4" + "node": ">=10.13.0" } }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "min-document": "^2.19.0", + "process": "^0.11.10" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, "engines": { - "node": ">=4.0.0" + "node": ">=4" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "node_modules/globby": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "dev": true, "dependencies": { - "clone": "^1.0.2" + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, + "node_modules/gonzales-pe": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", + "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", "dependencies": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" + "minimist": "^1.2.5" + }, + "bin": { + "gonzales": "bin/gonzales.js" }, "engines": { - "node": ">=6" + "node": ">=0.6.0" } }, - "node_modules/del/node_modules/globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", - "dev": true, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dependencies": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "function-bind": "^1.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4.0" } }, - "node_modules/del/node_modules/globby/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/dependency-tree": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/dependency-tree/-/dependency-tree-9.0.0.tgz", - "integrity": "sha512-osYHZJ1fBSon3lNLw70amAXsQ+RGzXsPvk9HbBgTLbp/bQBmpH5mOmsUvqXU+YEWVU0ZLewsmzOET/8jWswjDQ==", - "dependencies": { - "commander": "^2.20.3", - "debug": "^4.3.1", - "filing-cabinet": "^3.0.1", - "precinct": "^9.0.0", - "typescript": "^4.0.0" - }, - "bin": { - "dependency-tree": "bin/cli.js" - }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, "engines": { - "node": "^10.13 || ^12 || >=14" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/dependency-tree/node_modules/detective-stylus": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/detective-stylus/-/detective-stylus-3.0.0.tgz", - "integrity": "sha512-1xYTzbrduExqMYmte7Qk99IRA3Aa6oV7PYzd+3yDcQXkmENvyGF/arripri6lxRDdNYEb4fZFuHtNRAXbz3iAA==", + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "engines": { - "node": ">=12" + "node": ">= 4" } }, - "node_modules/dependency-tree/node_modules/module-definition": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/module-definition/-/module-definition-4.1.0.tgz", - "integrity": "sha512-rHXi/DpMcD2qcKbPCTklDbX9lBKJrUSl971TW5l6nMpqKCIlzJqmQ8cfEF5M923h2OOLHPDVlh5pJxNyV+AJlw==", + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/image-q": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/image-q/-/image-q-4.0.0.tgz", + "integrity": "sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==", "dependencies": { - "ast-module-types": "^4.0.0", - "node-source-walk": "^5.0.1" - }, - "bin": { - "module-definition": "bin/cli.js" - }, - "engines": { - "node": ">=12" + "@types/node": "16.9.1" } }, - "node_modules/dependency-tree/node_modules/precinct": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/precinct/-/precinct-9.2.1.tgz", - "integrity": "sha512-uzKHaTyiVejWW7VJtHInb9KBUq9yl9ojxXGujhjhDmPon2wgZPBKQIKR+6csGqSlUeGXAA4MEFnU6DesxZib+A==", + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, "dependencies": { - "@dependents/detective-less": "^3.0.1", - "commander": "^9.5.0", - "detective-amd": "^4.1.0", - "detective-cjs": "^4.1.0", - "detective-es6": "^3.0.1", - "detective-postcss": "^6.1.1", - "detective-sass": "^4.1.1", - "detective-scss": "^3.0.1", - "detective-stylus": "^3.0.0", - "detective-typescript": "^9.1.1", - "module-definition": "^4.1.0", - "node-source-walk": "^5.0.1" - }, - "bin": { - "precinct": "bin/cli.js" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": "^12.20.0 || ^14.14.0 || >=16.0.0" - } - }, - "node_modules/dependency-tree/node_modules/precinct/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "engines": { - "node": "^12.20.0 || >=14" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dependency-tree/node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, "engines": { - "node": ">=4.2.0" + "node": ">=4" } }, - "node_modules/detective-amd": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/detective-amd/-/detective-amd-4.2.0.tgz", - "integrity": "sha512-RbuEJHz78A8nW7CklkqTzd8lDCN42En53dgEIsya0DilpkwslamSZDasLg8dJyxbw46OxhSQeY+C2btdSkCvQQ==", + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, "dependencies": { - "ast-module-types": "^4.0.0", - "escodegen": "^2.0.0", - "get-amd-module-type": "^4.1.0", - "node-source-walk": "^5.0.1" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" }, "bin": { - "detective-amd": "bin/cli.js" + "import-local-fixture": "fixtures/cli.js" }, "engines": { - "node": ">=12" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/detective-cjs": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/detective-cjs/-/detective-cjs-4.1.0.tgz", - "integrity": "sha512-QxzMwt5MfPLwS7mG30zvnmOvHLx5vyVvjsAV6gQOyuMoBR5G1DhS1eJZ4P10AlH+HSnk93mTcrg3l39+24XCtg==", - "dependencies": { - "ast-module-types": "^4.0.0", - "node-source-walk": "^5.0.1" - }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, "engines": { - "node": ">=12" + "node": ">=0.8.19" } }, - "node_modules/detective-es6": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/detective-es6/-/detective-es6-3.0.1.tgz", - "integrity": "sha512-evPeYIEdK1jK3Oji5p0hX4sPV/1vK+o4ihcWZkMQE6voypSW/cIBiynOLxQk5KOOQbdP8oOAsYqouMTYO5l1sw==", - "dependencies": { - "node-source-walk": "^5.0.0" - }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/detective-less": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/detective-less/-/detective-less-1.0.2.tgz", - "integrity": "sha512-Rps1xDkEEBSq3kLdsdnHZL1x2S4NGDcbrjmd4q+PykK5aJwDdP5MBgrJw1Xo+kyUHuv3JEzPqxr+Dj9ryeDRTA==", + "node_modules/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==" + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { - "debug": "^4.0.0", - "gonzales-pe": "^4.2.3", - "node-source-walk": "^4.0.0" - }, - "engines": { - "node": ">= 6.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/detective-less/node_modules/node-source-walk": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-4.3.0.tgz", - "integrity": "sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA==", - "dependencies": { - "@babel/parser": "^7.0.0" - }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, "engines": { - "node": ">=6.0" + "node": ">=10.13.0" } }, - "node_modules/detective-postcss": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-6.1.3.tgz", - "integrity": "sha512-7BRVvE5pPEvk2ukUWNQ+H2XOq43xENWbH0LcdCE14mwgTBEAMoAx+Fc1rdp76SmyZ4Sp48HlV7VedUnP6GA1Tw==", - "dependencies": { - "is-url": "^1.2.4", - "postcss": "^8.4.23", - "postcss-values-parser": "^6.0.2" - }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">= 0.10" } }, - "node_modules/detective-sass": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/detective-sass/-/detective-sass-4.1.3.tgz", - "integrity": "sha512-xGRbwGaGte57gvEqM8B9GDiURY3El/H49vA6g9wFkxq9zalmTlTAuqWu+BsH0iwonGPruLt55tZZDEZqPc6lag==", + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, "dependencies": { - "gonzales-pe": "^4.3.0", - "node-source-walk": "^5.0.1" + "binary-extensions": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/detective-scss": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/detective-scss/-/detective-scss-3.1.1.tgz", - "integrity": "sha512-FWkfru1jZBhUeuBsOeGKXKAVDrzYFSQFK2o2tuG/nCCFQ0U/EcXC157MNAcR5mmj+mCeneZzlkBOFJTesDjrww==", + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-core-module": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", "dependencies": { - "gonzales-pe": "^4.3.0", - "node-source-walk": "^5.0.1" + "has": "^1.0.3" }, - "engines": { - "node": ">=12" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/detective-stylus": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detective-stylus/-/detective-stylus-2.0.1.tgz", - "integrity": "sha512-/Tvs1pWLg8eYwwV6kZQY5IslGaYqc/GACxjcaGudiNtN5nKCH6o2WnJK3j0gA3huCnoQcbv8X7oz/c1lnvE3zQ==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { - "node": ">=6.0" + "node": ">=0.10.0" } }, - "node_modules/detective-typescript": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-9.1.1.tgz", - "integrity": "sha512-Uc1yVutTF0RRm1YJ3g//i1Cn2vx1kwHj15cnzQP6ff5koNzQ0idc1zAC73ryaWEulA0ElRXFTq6wOqe8vUQ3MA==", + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { - "@typescript-eslint/typescript-estree": "^5.55.0", - "ast-module-types": "^4.0.0", - "node-source-walk": "^5.0.1", - "typescript": "^4.9.5" + "is-extglob": "^2.1.1" }, "engines": { - "node": "^12.20.0 || ^14.14.0 || >=16.0.0" + "node": ">=0.10.0" } }, - "node_modules/detective-typescript/node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "node_modules/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==", "engines": { - "node": ">=4.2.0" + "node": ">=8" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "engines": { - "node": ">=8" + "node": ">=0.12.0" } }, - "node_modules/dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.393", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.393.tgz", - "integrity": "sha512-Yl1E9pu+7PBKSVHZsuw79QVa8ZonpyxBGI/MnuBumiXpxNuNwFo9iZLAAhQGla/LTAt1A7zR4PwgysukxJc0qA==", - "dev": true + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "dev": true, "engines": { - "node": ">= 4" + "node": ">=6" } }, - "node_modules/enhanced-resolve": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", - "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "is-path-inside": "^2.1.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=6" } }, - "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", "dev": true, - "bin": { - "envinfo": "dist/cli.js" + "dependencies": { + "path-is-inside": "^1.0.2" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/es-module-lexer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", - "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", "engines": { - "node": ">=0.8.0" + "node": ">=0.10.0" } }, - "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "node_modules/is-relative-path": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-relative-path/-/is-relative-path-1.0.2.tgz", + "integrity": "sha512-i1h+y50g+0hRbBD+dbnInl3JlJ702aar58snAeX+MxBAPvzXGej7sYoPMhlnykabt0ZzCJNBEyzMlekuQZN7fA==" + }, + "node_modules/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==", + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, + "node_modules/is-url-superb": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-4.0.0.tgz", + "integrity": "sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==", "engines": { - "node": ">=6.0" + "node": ">=10" }, - "optionalDependencies": { - "source-map": "~0.6.1" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, "engines": { - "node": ">=4.0" + "node": ">=0.10.0" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">= 10.13.0" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=8" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "node_modules/jest-worker/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/jimp": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.16.2.tgz", + "integrity": "sha512-UpItBk81a92f8oEyoGYbO3YK4QcM0hoIyuGHmShoF9Ov63P5Qo7Q/X2xsAgnODmSuDJFOtrPtJd5GSWW4LKdOQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/custom": "^0.16.2", + "@jimp/plugins": "^0.16.2", + "@jimp/types": "^0.16.2", + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/jpeg-js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", + "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { - "estraverse": "^5.2.0" + "argparse": "^2.0.1" }, - "engines": { - "node": ">=4.0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, "engines": { - "node": ">=4.0" + "node": ">=4" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "bin": { + "json5": "lib/cli.js" + }, "engines": { - "node": ">=4.0" + "node": ">=6" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, "engines": { - "node": ">=6" + "node": ">= 0.8.0" } }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" + "node_modules/light-my-request": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.8.0.tgz", + "integrity": "sha512-4BtD5C+VmyTpzlDPCZbsatZMJVgUIciSOwYhJDCbLffPZ35KoDkDj4zubLeHDEb35b4kkPeEv5imbh+RJxK/Pg==", + "dependencies": { + "cookie": "^0.5.0", + "process-warning": "^2.0.0", + "set-cookie-parser": "^2.4.1" } }, - "node_modules/exif-parser": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", - "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==" + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true }, - "node_modules/fast-decode-uri-component": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", - "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" + "node_modules/load-bmfont": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz", + "integrity": "sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==", + "dependencies": { + "buffer-equal": "0.0.1", + "mime": "^1.3.4", + "parse-bmfont-ascii": "^1.0.3", + "parse-bmfont-binary": "^1.0.5", + "parse-bmfont-xml": "^1.1.4", + "phin": "^2.9.1", + "xhr": "^2.0.1", + "xtend": "^4.0.0" + } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" }, "engines": { - "node": ">=8.6.0" + "node": ">=8.9.0" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "p-locate": "^4.1.0" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, - "node_modules/fast-json-stringify": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.5.0.tgz", - "integrity": "sha512-rmw2Z8/mLkND8zI+3KTYIkNPEoF5v6GqDP/o+g7H3vjdWjBwuKpgAYFHIzL6ORRB+iqDjjtJnLIW9Mzxn5szOA==", + "node_modules/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==", "dependencies": { - "@fastify/deepmerge": "^1.0.0", - "ajv": "^8.10.0", - "ajv-formats": "^2.1.1", - "fast-deep-equal": "^3.1.3", - "fast-uri": "^2.1.0", - "rfdc": "^1.2.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "node_modules/fast-querystring": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.0.0.tgz", - "integrity": "sha512-3LQi62IhQoDlmt4ULCYmh17vRO2EtS7hTSsG4WwoKWgV7GLMKBOecEh+aiavASnLx8I2y89OD33AGLo0ccRhzA==", + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "fast-decode-uri-component": "^1.0.1" - } - }, - "node_modules/fast-redact": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", - "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==", + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/fast-uri": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.2.0.tgz", - "integrity": "sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg==" - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">= 4.9.1" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/fastify": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.10.2.tgz", - "integrity": "sha512-0T+4zI6N3S8ex0LCZi3H4FasJR4AzWw834fUkPWvV8r6GBJkLmAOfFxH8f5V29Plef24IK0QSQD/tz1Nx+1UOA==", + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "@fastify/ajv-compiler": "^3.3.1", - "@fastify/error": "^3.0.0", - "@fastify/fast-json-stringify-compiler": "^4.1.0", - "abstract-logging": "^2.0.1", - "avvio": "^8.2.0", - "content-type": "^1.0.4", - "find-my-way": "^7.3.0", - "light-my-request": "^5.6.1", - "pino": "^8.5.0", - "process-warning": "^2.0.0", - "proxy-addr": "^2.0.7", - "rfdc": "^1.3.0", - "secure-json-parse": "^2.5.0", - "semver": "^7.3.7", - "tiny-lru": "^10.0.0" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/fastq": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", - "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", - "dependencies": { - "reusify": "^1.0.4" + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dev": true, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "node": ">=8" } }, - "node_modules/file-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "js-tokens": "^3.0.0 || ^4.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "bin": { + "loose-envify": "cli.js" } }, - "node_modules/file-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" + "dependencies": { + "tslib": "^2.0.3" } }, - "node_modules/file-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "node_modules/lower-case/node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", "dev": true }, - "node_modules/file-loader/node_modules/schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", - "dev": true, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">=10" + } + }, + "node_modules/madge": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/madge/-/madge-6.0.0.tgz", + "integrity": "sha512-dddxP62sj5pL+l9MJnq9C34VFqmRj+2+uSOdn/7lOTSliLRH0WyQ8uCEF3VxkPRNOBvMKK2xumnIE15HRSAL9A==", + "dependencies": { + "chalk": "^4.1.1", + "commander": "^7.2.0", + "commondir": "^1.0.1", + "debug": "^4.3.1", + "dependency-tree": "^9.0.0", + "detective-amd": "^4.0.1", + "detective-cjs": "^4.0.0", + "detective-es6": "^3.0.0", + "detective-less": "^1.0.2", + "detective-postcss": "^6.1.0", + "detective-sass": "^4.0.1", + "detective-scss": "^3.0.0", + "detective-stylus": "^2.0.1", + "detective-typescript": "^9.0.0", + "ora": "^5.4.1", + "pluralize": "^8.0.0", + "precinct": "^8.1.0", + "pretty-ms": "^7.0.1", + "rc": "^1.2.7", + "stream-to-array": "^2.3.0", + "ts-graphviz": "^1.5.0", + "typescript": "^3.9.5", + "walkdir": "^0.4.1" + }, + "bin": { + "madge": "bin/cli.js" + }, + "engines": { + "node": ">=14" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "type": "individual", + "url": "https://www.paypal.me/pahen" } }, - "node_modules/file-type": { - "version": "16.5.4", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", - "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", + "node_modules/madge/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "readable-web-to-node-stream": "^3.0.0", - "strtok3": "^6.2.4", - "token-types": "^4.1.1" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/madge/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/filing-cabinet": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/filing-cabinet/-/filing-cabinet-3.3.1.tgz", - "integrity": "sha512-renEK4Hh6DUl9Vl22Y3cxBq1yh8oNvbAdXnhih0wVpmea+uyKjC9K4QeRjUaybIiIewdzfum+Fg15ZqJ/GyCaA==", + "node_modules/madge/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "app-module-path": "^2.2.0", - "commander": "^2.20.3", - "debug": "^4.3.3", - "enhanced-resolve": "^5.8.3", - "is-relative-path": "^1.0.2", - "module-definition": "^3.3.1", - "module-lookup-amd": "^7.0.1", - "resolve": "^1.21.0", - "resolve-dependency-path": "^2.0.0", - "sass-lookup": "^3.0.0", - "stylus-lookup": "^3.0.1", - "tsconfig-paths": "^3.10.1", - "typescript": "^3.9.7" + "color-name": "~1.1.4" }, - "bin": { - "filing-cabinet": "bin/cli.js" + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/madge/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/madge/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/madge/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/madge/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=8" } }, - "node_modules/filing-cabinet/node_modules/typescript": { + "node_modules/madge/node_modules/typescript": { "version": "3.9.10", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", @@ -3056,4130 +6118,4469 @@ "node": ">=4.2.0" } }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, "dependencies": { - "to-regex-range": "^5.0.1" + "semver": "^6.0.0" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "node": ">= 8" } }, - "node_modules/find-my-way": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.3.1.tgz", - "integrity": "sha512-kGvM08SOkqvheLcuQ8GW9t/H901Qb9rZEbcNWbXopzy4jDRoaJpJoObPSKf4MnQLZ20ZTp7rL5MpF6rf+pqmyg==", + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-querystring": "^1.0.0", - "safe-regex2": "^2.0.0" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=14" + "node": ">=8.6" } }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", - "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash." - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, "engines": { "node": ">= 0.6" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "dependencies": { - "minipass": "^3.0.0" + "mime-db": "1.52.0" }, "engines": { - "node": ">= 8" + "node": ">= 0.6" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": "*" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/get-amd-module-type": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-4.1.0.tgz", - "integrity": "sha512-0e/eK6vTGCnSfQ6eYs3wtH05KotJYIP7ZIZEueP/KlA+0dIAEs8bYFvOd/U56w1vfjhJqBagUxVMyy9Tr/cViQ==", + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, "dependencies": { - "ast-module-types": "^4.0.0", - "node-source-walk": "^5.0.1" + "minipass": "^3.0.0" }, "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "node_modules/gifwrap": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.9.4.tgz", - "integrity": "sha512-MDMwbhASQuVeD4JKd1fKgNgCRL3fGqMM4WaqpNhWO0JiMOAjbQdumbs4BbBZEy9/M00EHEjKN3HieVhCUlwjeQ==", + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, "dependencies": { - "image-q": "^4.0.0", - "omggif": "^1.0.10" + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minipass": "^3.0.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, "dependencies": { - "is-glob": "^4.0.3" + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, "engines": { - "node": ">=10.13.0" + "node": ">= 8" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dependencies": { - "min-document": "^2.19.0", - "process": "^0.11.10" + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" + "node_modules/mobx": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.9.0.tgz", + "integrity": "sha512-HdKewQEREEJgsWnErClfbFoVebze6rGazxFLU/XUyrII8dORfVszN1V0BMRnQSzcgsNNtkX8DHj3nC6cdWE9YQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" } }, - "node_modules/globby": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", - "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", - "dev": true, + "node_modules/mobx-react": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-7.6.0.tgz", + "integrity": "sha512-+HQUNuh7AoQ9ZnU6c4rvbiVVl+wEkb9WqYsVDzGLng+Dqj1XntHu79PvEWKtSMoMj67vFp/ZPXcElosuJO8ckA==", "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" + "mobx-react-lite": "^3.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + }, + "peerDependencies": { + "mobx": "^6.1.0", + "react": "^16.8.0 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/mobx-react-lite": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.4.3.tgz", + "integrity": "sha512-NkJREyFTSUXR772Qaai51BnE1voWx56LOL80xG7qkZr6vo8vEaLF3sz1JNUVh+rxmUzxYaqOhfuxTfqUh0FXUg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "peerDependencies": { + "mobx": "^6.1.0", + "react": "^16.8.0 || ^17 || ^18" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } } }, - "node_modules/gonzales-pe": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", - "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", + "node_modules/module-definition": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/module-definition/-/module-definition-3.4.0.tgz", + "integrity": "sha512-XxJ88R1v458pifaSkPNLUTdSPNVGMP2SXVncVmApGO+gAfrLANiYe6JofymCzVceGOMwQE2xogxBSc8uB7XegA==", "dependencies": { - "minimist": "^1.2.5" + "ast-module-types": "^3.0.0", + "node-source-walk": "^4.0.0" }, "bin": { - "gonzales": "bin/gonzales.js" + "module-definition": "bin/cli.js" }, "engines": { - "node": ">=0.6.0" + "node": ">=6.0" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "node_modules/module-definition/node_modules/ast-module-types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-3.0.0.tgz", + "integrity": "sha512-CMxMCOCS+4D+DkOQfuZf+vLrSEmY/7xtORwdxs4wtcC1wVgvk2MqFFTwQCFhvWsI4KPU9lcWXPI8DgRiz+xetQ==", + "engines": { + "node": ">=6.0" + } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/module-definition/node_modules/node-source-walk": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-4.3.0.tgz", + "integrity": "sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA==", "dependencies": { - "function-bind": "^1.1.1" + "@babel/parser": "^7.0.0" }, "engines": { - "node": ">= 0.4.0" + "node": ">=6.0" } }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, + "node_modules/module-lookup-amd": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/module-lookup-amd/-/module-lookup-amd-7.0.1.tgz", + "integrity": "sha512-w9mCNlj0S8qviuHzpakaLVc+/7q50jl9a/kmJ/n8bmXQZgDPkQHnPBb8MUOYh3WpAYkXuNc2c+khsozhIp/amQ==", + "dependencies": { + "commander": "^2.8.1", + "debug": "^4.1.0", + "glob": "^7.1.6", + "requirejs": "^2.3.5", + "requirejs-config-file": "^4.0.0" + }, + "bin": { + "lookup-amd": "bin/cli.js" + }, "engines": { - "node": ">=4" + "node": ">=10.13.0" } }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" + "url": "https://github.com/sponsors/ai" } - ] - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, "engines": { - "node": ">= 4" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node_modules/image-q": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/image-q/-/image-q-4.0.0.tgz", - "integrity": "sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==", + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, "dependencies": { - "@types/node": "16.9.1" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" } }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "node_modules/no-case/node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "node_modules/node-source-walk": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-5.0.2.tgz", + "integrity": "sha512-Y4jr/8SRS5hzEdZ7SGuvZGwfORvNsSsNRwDXx5WisiqzsVfeftDvRgfeqWNgZvWSJbgubTRVRYBzK6UO+ErqjA==", + "dependencies": { + "@babel/parser": "^7.21.4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", "dev": true, "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" }, "bin": { - "import-local-fixture": "fixtures/cli.js" + "nodemon": "bin/nodemon.js" }, "engines": { - "node": ">=8" + "node": ">=8.10.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/nodemon" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, "engines": { - "node": ">=0.8.19" + "node": "*" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==" + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/omggif": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", + "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==" }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "node_modules/on-exit-leak-free": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz", + "integrity": "sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { - "once": "^1.3.0", "wrappy": "1" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, "engines": { - "node": ">=10.13.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, "engines": { - "node": ">= 0.10" + "node": ">= 0.8.0" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dependencies": { - "binary-extensions": "^2.0.0" + "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" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "has": "^1.0.3" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/ora/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "is-extglob": "^2.1.1" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=7.0.0" } }, - "node_modules/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==", + "node_modules/ora/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { "node": ">=8" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=0.12.0" + "node": ">=8" } }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/is-path-in-cwd": { + "node_modules/p-map": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true, - "dependencies": { - "is-path-inside": "^2.1.0" - }, "engines": { "node": ">=6" } }, - "node_modules/is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "dependencies": { - "path-is-inside": "^1.0.2" - }, "engines": { "node": ">=6" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "dependencies": { - "isobject": "^3.0.1" + "callsites": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "engines": { - "node": ">=0.10.0" + "node_modules/parse-bmfont-ascii": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", + "integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==" + }, + "node_modules/parse-bmfont-binary": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", + "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==" + }, + "node_modules/parse-bmfont-xml": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", + "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", + "dependencies": { + "xml-parse-from-string": "^1.0.0", + "xml2js": "^0.4.5" } }, - "node_modules/is-relative-path": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-relative-path/-/is-relative-path-1.0.2.tgz", - "integrity": "sha512-i1h+y50g+0hRbBD+dbnInl3JlJ702aar58snAeX+MxBAPvzXGej7sYoPMhlnykabt0ZzCJNBEyzMlekuQZN7fA==" + "node_modules/parse-headers": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" }, - "node_modules/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==", + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + "node_modules/parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "engines": { + "node": ">=6" + } }, - "node_modules/is-url-superb": { + "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-4.0.0.tgz", - "integrity": "sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "engines": { "node": ">=0.10.0" } }, - "node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, "engines": { - "node": ">= 10.13.0" + "node": ">=8" } }, - "node_modules/jest-worker/node_modules/has-flag": { + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "engines": { "node": ">=8" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, + "node_modules/peek-readable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", "engines": { "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/jimp": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.16.2.tgz", - "integrity": "sha512-UpItBk81a92f8oEyoGYbO3YK4QcM0hoIyuGHmShoF9Ov63P5Qo7Q/X2xsAgnODmSuDJFOtrPtJd5GSWW4LKdOQ==", - "dependencies": { - "@babel/runtime": "^7.7.2", - "@jimp/custom": "^0.16.2", - "@jimp/plugins": "^0.16.2", - "@jimp/types": "^0.16.2", - "regenerator-runtime": "^0.13.3" - } - }, - "node_modules/jpeg-js": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", - "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==" + "node_modules/phin": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", + "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { - "node": ">=4" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "bin": { - "json5": "lib/cli.js" - }, "engines": { "node": ">=6" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "pinkie": "^2.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=0.10.0" } }, - "node_modules/light-my-request": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.8.0.tgz", - "integrity": "sha512-4BtD5C+VmyTpzlDPCZbsatZMJVgUIciSOwYhJDCbLffPZ35KoDkDj4zubLeHDEb35b4kkPeEv5imbh+RJxK/Pg==", + "node_modules/pino": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.7.0.tgz", + "integrity": "sha512-l9sA5uPxmZzwydhMWUcm1gI0YxNnYl8MfSr2h8cwLvOAzQLBLewzF247h/vqHe3/tt6fgtXeG9wdjjoetdI/vA==", "dependencies": { - "cookie": "^0.5.0", + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "v1.0.0", + "pino-std-serializers": "^6.0.0", "process-warning": "^2.0.0", - "set-cookie-parser": "^2.4.1" + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.1.0", + "thread-stream": "^2.0.0" + }, + "bin": { + "pino": "bin.js" } }, - "node_modules/load-bmfont": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz", - "integrity": "sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==", + "node_modules/pino-abstract-transport": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz", + "integrity": "sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==", "dependencies": { - "buffer-equal": "0.0.1", - "mime": "^1.3.4", - "parse-bmfont-ascii": "^1.0.3", - "parse-bmfont-binary": "^1.0.5", - "parse-bmfont-xml": "^1.1.4", - "phin": "^2.9.1", - "xhr": "^2.0.1", - "xtend": "^4.0.0" + "readable-stream": "^4.0.0", + "split2": "^4.0.0" } }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } + "node_modules/pino-std-serializers": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.0.0.tgz", + "integrity": "sha512-mMMOwSKrmyl+Y12Ri2xhH1lbzQxwwpuru9VjyJpgFIH4asSj88F2csdMwN6+M5g1Ll4rmsYghHLQJw81tgZ7LQ==" }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, + "node_modules/pixelmatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", + "integrity": "sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" + "pngjs": "^3.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" } }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "dependencies": { - "p-locate": "^4.1.0" + "find-up": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/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==", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss": { + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "color-convert": "^2.0.1" + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, "engines": { - "node": ">=8" + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" }, "engines": { - "node": ">=10" + "node": "^10 || ^12 || >= 14" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, "dependencies": { - "color-name": "~1.1.4" + "postcss-selector-parser": "^6.0.4" }, "engines": { - "node": ">=7.0.0" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/log-symbols/node_modules/has-flag": { + "node_modules/postcss-modules-values": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "icss-utils": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "node_modules/postcss-selector-parser": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz", + "integrity": "sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg==", + "dev": true, "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, - "bin": { - "loose-envify": "cli.js" + "engines": { + "node": ">=4" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/postcss-values-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.2.tgz", + "integrity": "sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==", "dependencies": { - "yallist": "^4.0.0" + "color-name": "^1.1.4", + "is-url-superb": "^4.0.0", + "quote-unquote": "^1.0.0" }, "engines": { "node": ">=10" + }, + "peerDependencies": { + "postcss": "^8.2.9" } }, - "node_modules/madge": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/madge/-/madge-6.0.0.tgz", - "integrity": "sha512-dddxP62sj5pL+l9MJnq9C34VFqmRj+2+uSOdn/7lOTSliLRH0WyQ8uCEF3VxkPRNOBvMKK2xumnIE15HRSAL9A==", + "node_modules/postcss-values-parser/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/precinct": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/precinct/-/precinct-8.3.1.tgz", + "integrity": "sha512-pVppfMWLp2wF68rwHqBIpPBYY8Kd12lDhk8LVQzOwqllifVR15qNFyod43YLyFpurKRZQKnE7E4pofAagDOm2Q==", "dependencies": { - "chalk": "^4.1.1", - "commander": "^7.2.0", - "commondir": "^1.0.1", - "debug": "^4.3.1", - "dependency-tree": "^9.0.0", - "detective-amd": "^4.0.1", - "detective-cjs": "^4.0.0", - "detective-es6": "^3.0.0", + "commander": "^2.20.3", + "debug": "^4.3.3", + "detective-amd": "^3.1.0", + "detective-cjs": "^3.1.1", + "detective-es6": "^2.2.1", "detective-less": "^1.0.2", - "detective-postcss": "^6.1.0", - "detective-sass": "^4.0.1", - "detective-scss": "^3.0.0", - "detective-stylus": "^2.0.1", - "detective-typescript": "^9.0.0", - "ora": "^5.4.1", - "pluralize": "^8.0.0", - "precinct": "^8.1.0", - "pretty-ms": "^7.0.1", - "rc": "^1.2.7", - "stream-to-array": "^2.3.0", - "ts-graphviz": "^1.5.0", - "typescript": "^3.9.5", - "walkdir": "^0.4.1" + "detective-postcss": "^4.0.0", + "detective-sass": "^3.0.1", + "detective-scss": "^2.0.1", + "detective-stylus": "^1.0.0", + "detective-typescript": "^7.0.0", + "module-definition": "^3.3.1", + "node-source-walk": "^4.2.0" }, "bin": { - "madge": "bin/cli.js" + "precinct": "bin/cli.js" }, "engines": { - "node": ">=14" + "node": "^10.13 || ^12 || >=14" + } + }, + "node_modules/precinct/node_modules/@typescript-eslint/types": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, "funding": { - "type": "individual", - "url": "https://www.paypal.me/pahen" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/madge/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/precinct/node_modules/@typescript-eslint/typescript-estree": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", "dependencies": { - "color-convert": "^2.0.1" + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { - "node": ">=8" + "node": "^10.12.0 || >=12.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/madge/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/precinct/node_modules/@typescript-eslint/visitor-keys": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@typescript-eslint/types": "4.33.0", + "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": ">=10" + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/madge/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, + "node_modules/precinct/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "node_modules/madge/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/madge/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "node_modules/precinct/node_modules/ast-module-types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-3.0.0.tgz", + "integrity": "sha512-CMxMCOCS+4D+DkOQfuZf+vLrSEmY/7xtORwdxs4wtcC1wVgvk2MqFFTwQCFhvWsI4KPU9lcWXPI8DgRiz+xetQ==", "engines": { - "node": ">= 10" + "node": ">=6.0" } }, - "node_modules/madge/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/precinct/node_modules/detective-amd": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/detective-amd/-/detective-amd-3.1.2.tgz", + "integrity": "sha512-jffU26dyqJ37JHR/o44La6CxtrDf3Rt9tvd2IbImJYxWKTMdBjctp37qoZ6ZcY80RHg+kzWz4bXn39e4P7cctQ==", + "dependencies": { + "ast-module-types": "^3.0.0", + "escodegen": "^2.0.0", + "get-amd-module-type": "^3.0.0", + "node-source-walk": "^4.2.0" + }, + "bin": { + "detective-amd": "bin/cli.js" + }, "engines": { - "node": ">=8" + "node": ">=6.0" } }, - "node_modules/madge/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/precinct/node_modules/detective-cjs": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/detective-cjs/-/detective-cjs-3.1.3.tgz", + "integrity": "sha512-ljs7P0Yj9MK64B7G0eNl0ThWSYjhAaSYy+fQcpzaKalYl/UoQBOzOeLCSFEY1qEBhziZ3w7l46KG/nH+s+L7BQ==", "dependencies": { - "has-flag": "^4.0.0" + "ast-module-types": "^3.0.0", + "node-source-walk": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=6.0" } }, - "node_modules/madge/node_modules/typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "node_modules/precinct/node_modules/detective-es6": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/detective-es6/-/detective-es6-2.2.2.tgz", + "integrity": "sha512-eZUKCUsbHm8xoeoCM0z6JFwvDfJ5Ww5HANo+jPR7AzkFpW9Mun3t/TqIF2jjeWa2TFbAiGaWESykf2OQp3oeMw==", + "dependencies": { + "node-source-walk": "^4.0.0" }, "engines": { - "node": ">=4.2.0" + "node": ">=6.0" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, + "node_modules/precinct/node_modules/detective-postcss": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-4.0.0.tgz", + "integrity": "sha512-Fwc/g9VcrowODIAeKRWZfVA/EufxYL7XfuqJQFroBKGikKX83d2G7NFw6kDlSYGG3LNQIyVa+eWv1mqre+v4+A==", "dependencies": { - "semver": "^6.0.0" + "debug": "^4.1.1", + "is-url": "^1.2.4", + "postcss": "^8.1.7", + "postcss-values-parser": "^2.0.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node": "^10 || ^12 || >=14" } }, - "node_modules/md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "node_modules/precinct/node_modules/detective-sass": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/detective-sass/-/detective-sass-3.0.2.tgz", + "integrity": "sha512-DNVYbaSlmti/eztFGSfBw4nZvwsTaVXEQ4NsT/uFckxhJrNRFUh24d76KzoCC3aarvpZP9m8sC2L1XbLej4F7g==", "dependencies": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "gonzales-pe": "^4.3.0", + "node-source-walk": "^4.0.0" + }, "engines": { - "node": ">= 8" + "node": ">=6.0" } }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "node_modules/precinct/node_modules/detective-scss": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detective-scss/-/detective-scss-2.0.2.tgz", + "integrity": "sha512-hDWnWh/l0tht/7JQltumpVea/inmkBaanJUcXRB9kEEXVwVUMuZd6z7eusQ6GcBFrfifu3pX/XPyD7StjbAiBg==", "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "gonzales-pe": "^4.3.0", + "node-source-walk": "^4.0.0" }, "engines": { - "node": ">=8.6" + "node": ">=6.0" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" + "node_modules/precinct/node_modules/detective-stylus": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detective-stylus/-/detective-stylus-1.0.3.tgz", + "integrity": "sha512-4/bfIU5kqjwugymoxLXXLltzQNeQfxGoLm2eIaqtnkWxqbhap9puDVpJPVDx96hnptdERzS5Cy6p9N8/08A69Q==" + }, + "node_modules/precinct/node_modules/detective-typescript": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-7.0.2.tgz", + "integrity": "sha512-unqovnhxzvkCz3m1/W4QW4qGsvXCU06aU2BAm8tkza+xLnp9SOFnob2QsTxUv5PdnQKfDvWcv9YeOeFckWejwA==", + "dependencies": { + "@typescript-eslint/typescript-estree": "^4.33.0", + "ast-module-types": "^2.7.1", + "node-source-walk": "^4.2.0", + "typescript": "^3.9.10" }, "engines": { - "node": ">=4" + "node": "^10.13 || >=12.0.0" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, + "node_modules/precinct/node_modules/detective-typescript/node_modules/ast-module-types": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-2.7.1.tgz", + "integrity": "sha512-Rnnx/4Dus6fn7fTqdeLEAn5vUll5w7/vts0RN608yFa6si/rDOUonlIIiwugHBFWjylHjxm9owoSZn71KwG4gw==" + }, + "node_modules/precinct/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, + "node_modules/precinct/node_modules/get-amd-module-type": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-3.0.2.tgz", + "integrity": "sha512-PcuKwB8ouJnKuAPn6Hk3UtdfKoUV3zXRqVEvj8XGIXqjWfgd1j7QGdXy5Z9OdQfzVt1Sk29HVe/P+X74ccOuqw==", "dependencies": { - "mime-db": "1.52.0" + "ast-module-types": "^3.0.0", + "node-source-walk": "^4.2.2" }, "engines": { - "node": ">= 0.6" + "node": ">=6.0" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/precinct/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "node_modules/precinct/node_modules/node-source-walk": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-4.3.0.tgz", + "integrity": "sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA==", "dependencies": { - "dom-walk": "^0.1.0" + "@babel/parser": "^7.0.0" + }, + "engines": { + "node": ">=6.0" } }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/precinct/node_modules/postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", "dependencies": { - "brace-expansion": "^1.1.7" + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" }, "engines": { - "node": "*" + "node": ">=6.14.4" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/precinct/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" } }, - "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" + "node_modules/precinct/node_modules/typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=8" + "node": ">=4.2.0" } }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "engines": { - "node": ">= 8" + "node": ">= 0.8.0" } }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "node_modules/prettier": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.3.tgz", + "integrity": "sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==", "dev": true, - "dependencies": { - "minipass": "^3.0.0" + "bin": { + "prettier": "bin-prettier.js" }, "engines": { - "node": ">= 8" + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, + "node_modules/pretty-ms": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", + "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", "dependencies": { - "minipass": "^3.0.0" + "parse-ms": "^2.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "engines": { - "node": ">= 8" + "node": ">= 0.6.0" } }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "node_modules/process-warning": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.1.0.tgz", + "integrity": "sha512-9C20RLxrZU/rFnxWncDkuF6O999NdIf3E1ws4B0ZeY3sRVPzWBMsYDE2lxjxhiXxg464cQTgKUGm8/i6y2YGXg==" + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dependencies": { - "minimist": "^1.2.6" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": ">= 0.10" } }, - "node_modules/mobx": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.9.0.tgz", - "integrity": "sha512-HdKewQEREEJgsWnErClfbFoVebze6rGazxFLU/XUyrII8dORfVszN1V0BMRnQSzcgsNNtkX8DHj3nC6cdWE9YQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mobx" - } + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true }, - "node_modules/mobx-react": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-7.6.0.tgz", - "integrity": "sha512-+HQUNuh7AoQ9ZnU6c4rvbiVVl+wEkb9WqYsVDzGLng+Dqj1XntHu79PvEWKtSMoMj67vFp/ZPXcElosuJO8ckA==", - "dependencies": { - "mobx-react-lite": "^3.4.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mobx" - }, - "peerDependencies": { - "mobx": "^6.1.0", - "react": "^16.8.0 || ^17 || ^18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" } }, - "node_modules/mobx-react-lite": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.4.3.tgz", - "integrity": "sha512-NkJREyFTSUXR772Qaai51BnE1voWx56LOL80xG7qkZr6vo8vEaLF3sz1JNUVh+rxmUzxYaqOhfuxTfqUh0FXUg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mobx" - }, - "peerDependencies": { - "mobx": "^6.1.0", - "react": "^16.8.0 || ^17 || ^18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "react-native": { - "optional": true + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } + ] + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "node_modules/quote-unquote": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/quote-unquote/-/quote-unquote-1.0.0.tgz", + "integrity": "sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" } }, - "node_modules/module-definition": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/module-definition/-/module-definition-3.4.0.tgz", - "integrity": "sha512-XxJ88R1v458pifaSkPNLUTdSPNVGMP2SXVncVmApGO+gAfrLANiYe6JofymCzVceGOMwQE2xogxBSc8uB7XegA==", + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dependencies": { - "ast-module-types": "^3.0.0", - "node-source-walk": "^4.0.0" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "bin": { - "module-definition": "bin/cli.js" - }, - "engines": { - "node": ">=6.0" + "rc": "cli.js" } }, - "node_modules/module-definition/node_modules/ast-module-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-3.0.0.tgz", - "integrity": "sha512-CMxMCOCS+4D+DkOQfuZf+vLrSEmY/7xtORwdxs4wtcC1wVgvk2MqFFTwQCFhvWsI4KPU9lcWXPI8DgRiz+xetQ==", + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, "engines": { - "node": ">=6.0" + "node": ">=0.10.0" } }, - "node_modules/module-definition/node_modules/node-source-walk": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-4.3.0.tgz", - "integrity": "sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA==", + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", "dependencies": { - "@babel/parser": "^7.0.0" + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" }, - "engines": { - "node": ">=6.0" + "peerDependencies": { + "react": "^18.2.0" } }, - "node_modules/module-lookup-amd": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/module-lookup-amd/-/module-lookup-amd-7.0.1.tgz", - "integrity": "sha512-w9mCNlj0S8qviuHzpakaLVc+/7q50jl9a/kmJ/n8bmXQZgDPkQHnPBb8MUOYh3WpAYkXuNc2c+khsozhIp/amQ==", + "node_modules/readable-stream": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.2.0.tgz", + "integrity": "sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A==", "dependencies": { - "commander": "^2.8.1", - "debug": "^4.1.0", - "glob": "^7.1.6", - "requirejs": "^2.3.5", - "requirejs-config-file": "^4.0.0" - }, - "bin": { - "lookup-amd": "bin/cli.js" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10" }, "engines": { - "node": ">=10.13.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dependencies": { + "readable-stream": "^3.6.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", - "dev": true - }, - "node_modules/node-source-walk": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-5.0.2.tgz", - "integrity": "sha512-Y4jr/8SRS5hzEdZ7SGuvZGwfORvNsSsNRwDXx5WisiqzsVfeftDvRgfeqWNgZvWSJbgubTRVRYBzK6UO+ErqjA==", + "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dependencies": { - "@babel/parser": "^7.21.4" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=12" + "node": ">= 6" } }, - "node_modules/nodemon": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", - "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "dependencies": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" + "picomatch": "^2.2.1" }, "engines": { "node": ">=8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" } }, - "node_modules/nodemon/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "engines": { + "node": ">= 12.13.0" } }, - "node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" + "resolve": "^1.20.0" }, "engines": { - "node": "*" + "node": ">= 10.13.0" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/omggif": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", - "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==" - }, - "node_modules/on-exit-leak-free": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz", - "integrity": "sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==" + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "dev": true, "dependencies": { - "wrappy": "1" + "@babel/runtime": "^7.8.4" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, "dependencies": { - "mimic-fn": "^2.1.0" + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "jsesc": "~0.5.0" }, - "engines": { - "node": ">= 0.8.0" + "bin": { + "regjsparser": "bin/parser" } }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dependencies": { - "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" - }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "engines": { - "node": ">=10" + "node": ">=0.10.0" + } + }, + "node_modules/requirejs": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", + "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==", + "bin": { + "r_js": "bin/r.js", + "r.js": "bin/r.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=0.4.0" } }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/requirejs-config-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/requirejs-config-file/-/requirejs-config-file-4.0.0.tgz", + "integrity": "sha512-jnIre8cbWOyvr8a5F2KuqBnY+SDA4NXr/hzEZJG79Mxm2WiFQz2dzhC8ibtPJS7zkmBEl1mxSwp5HhC1W4qpxw==", "dependencies": { - "color-convert": "^2.0.1" + "esprima": "^4.0.0", + "stringify-object": "^3.2.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=10.13.0" } }, - "node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": ">=10" + "bin": { + "resolve": "bin/resolve" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ora/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, "dependencies": { - "color-name": "~1.1.4" + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "node_modules/resolve-dependency-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-dependency-path/-/resolve-dependency-path-2.0.0.tgz", + "integrity": "sha512-DIgu+0Dv+6v2XwRaNWnumKu7GPufBBOr5I1gRPJHkvghrfCGOooJODFvgFimX/KRxk9j0whD2MnKHzM1jYvk9w==", + "engines": { + "node": ">=6.0.0" + } }, - "node_modules/ora/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, "engines": { "node": ">=8" } }, - "node_modules/ora/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dependencies": { - "has-flag": "^4.0.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { "node": ">=8" } }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "glob": "^7.1.3" }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", + "integrity": "sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==", + "dependencies": { + "ret": "~0.2.0" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.1.tgz", + "integrity": "sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA==", "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" } }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, + "node_modules/sass-lookup": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/sass-lookup/-/sass-lookup-3.0.0.tgz", + "integrity": "sha512-TTsus8CfFRn1N44bvdEai1no6PqdmDiQUiqW5DlpmtT+tYnIt1tXtDIph5KA1efC+LmioJXSnCtUVpcK9gaKIg==", "dependencies": { - "p-limit": "^2.2.0" + "commander": "^2.16.0" + }, + "bin": { + "sass-lookup": "bin/cli.js" }, "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "engines": { - "node": ">=6" + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/schema-utils": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", + "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, "engines": { - "node": ">=6" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "node_modules/parse-bmfont-ascii": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", - "integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==" + "node_modules/secure-json-parse": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.6.0.tgz", + "integrity": "sha512-B9osKohb6L+EZ6Kve3wHKfsAClzOC/iISA2vSuCe5Jx5NAKiwitfxx8ZKYapHXr0sYRj7UZInT7pLb3rp2Yx6A==" }, - "node_modules/parse-bmfont-binary": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", - "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==" + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/parse-bmfont-xml": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", - "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, "dependencies": { - "xml-parse-from-string": "^1.0.0", - "xml2js": "^0.4.5" + "randombytes": "^2.1.0" } }, - "node_modules/parse-headers": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", - "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + "node_modules/set-cookie-parser": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz", + "integrity": "sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==" }, - "node_modules/parse-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "dev": true + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, "engines": { - "node": ">=8" + "node": ">=8.10.0" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/peek-readable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", - "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/phin": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", - "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "node_modules/snake-case/node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "dev": true }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node_modules/sonic-boom": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.2.1.tgz", + "integrity": "sha512-iITeTHxy3B9FGu8aVdiDXUVAcHMF9Ss0cCsAOo2HfCrmVGT3/DT5oYaeu0M/YKZDlKTvChEyPq0zI9Hf33EX6A==", + "dependencies": { + "atomic-sleep": "^1.0.0" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "engines": { "node": ">=0.10.0" } }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "dependencies": { - "pinkie": "^2.0.0" - }, + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/split2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", + "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==", "engines": { - "node": ">=0.10.0" + "node": ">= 10.x" } }, - "node_modules/pino": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.7.0.tgz", - "integrity": "sha512-l9sA5uPxmZzwydhMWUcm1gI0YxNnYl8MfSr2h8cwLvOAzQLBLewzF247h/vqHe3/tt6fgtXeG9wdjjoetdI/vA==", + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, "dependencies": { - "atomic-sleep": "^1.0.0", - "fast-redact": "^3.1.1", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "v1.0.0", - "pino-std-serializers": "^6.0.0", - "process-warning": "^2.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.2.0", - "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^3.1.0", - "thread-stream": "^2.0.0" + "minipass": "^3.1.1" }, - "bin": { - "pino": "bin.js" + "engines": { + "node": ">= 8" } }, - "node_modules/pino-abstract-transport": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz", - "integrity": "sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==", + "node_modules/stream-to-array": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", + "integrity": "sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==", "dependencies": { - "readable-stream": "^4.0.0", - "split2": "^4.0.0" + "any-promise": "^1.1.0" } }, - "node_modules/pino-std-serializers": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.0.0.tgz", - "integrity": "sha512-mMMOwSKrmyl+Y12Ri2xhH1lbzQxwwpuru9VjyJpgFIH4asSj88F2csdMwN6+M5g1Ll4rmsYghHLQJw81tgZ7LQ==" + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } }, - "node_modules/pixelmatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", - "integrity": "sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==", + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "dependencies": { - "pngjs": "^3.0.0" + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" }, - "bin": { - "pixelmatch": "bin/pixelmatch" + "engines": { + "node": ">=4" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "find-up": "^4.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "engines": { "node": ">=4" } }, - "node_modules/pngjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "engines": { - "node": ">=4.0.0" + "node": ">=0.10.0" } }, - "node_modules/postcss": { - "version": "8.4.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", - "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/strtok3": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "@tokenizer/token": "^0.3.0", + "peek-readable": "^4.1.0" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "node_modules/style-loader": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.2.tgz", + "integrity": "sha512-RHs/vcrKdQK8wZliteNK4NKzxvLBzpuHMqYmUVWeKa6MkaIQ97ZTOS0b+zapZhy6GcrgWnvWYCMHRirC3FsUmw==", "dev": true, "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "postcss": "^8.1.0" + "webpack": "^5.0.0" } }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, + "node_modules/stylus-lookup": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-lookup/-/stylus-lookup-3.0.2.tgz", + "integrity": "sha512-oEQGHSjg/AMaWlKe7gqsnYzan8DLcGIHe0dUaFkucZZ14z4zjENRlQMCHT4FNsiWnJf17YN9OvrCfCoi7VvOyg==", "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" + "commander": "^2.8.1", + "debug": "^4.1.0" }, - "engines": { - "node": "^10 || ^12 || >= 14" + "bin": { + "stylus-lookup": "bin/cli.js" }, - "peerDependencies": { - "postcss": "^8.1.0" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.4" + "has-flag": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true + }, + "node_modules/svgo": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz", + "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==", "dev": true, "dependencies": { - "icss-utils": "^5.0.0" + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.2.1", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" }, "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">=14.0.0" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" } }, - "node_modules/postcss-selector-parser": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz", - "integrity": "sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg==", + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, "engines": { - "node": ">=4" + "node": ">= 10" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } }, - "node_modules/postcss-values-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.2.tgz", - "integrity": "sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==", + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, "dependencies": { - "color-name": "^1.1.4", - "is-url-superb": "^4.0.0", - "quote-unquote": "^1.0.0" + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" }, "engines": { "node": ">=10" - }, - "peerDependencies": { - "postcss": "^8.2.9" } }, - "node_modules/postcss-values-parser/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "node_modules/precinct": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/precinct/-/precinct-8.3.1.tgz", - "integrity": "sha512-pVppfMWLp2wF68rwHqBIpPBYY8Kd12lDhk8LVQzOwqllifVR15qNFyod43YLyFpurKRZQKnE7E4pofAagDOm2Q==", + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, "dependencies": { - "commander": "^2.20.3", - "debug": "^4.3.3", - "detective-amd": "^3.1.0", - "detective-cjs": "^3.1.1", - "detective-es6": "^2.2.1", - "detective-less": "^1.0.2", - "detective-postcss": "^4.0.0", - "detective-sass": "^3.0.1", - "detective-scss": "^2.0.1", - "detective-stylus": "^1.0.0", - "detective-typescript": "^7.0.0", - "module-definition": "^3.3.1", - "node-source-walk": "^4.2.0" + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" }, "bin": { - "precinct": "bin/cli.js" + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.8.tgz", + "integrity": "sha512-ygwK8TYMRTYtSyLB2Mhnt90guQh989CIq/mL/2apwi6rA15Xys4ydNUiH4ah6EZCfQxSk26ZFQilZ4IQ6IZw6A==", + "dev": true, + "dependencies": { + "cacache": "^15.0.5", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.1.0", + "p-limit": "^3.0.2", + "schema-utils": "^2.6.6", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.8.0", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 10.13.0" }, - "engines": { - "node": "^10.13 || ^12 || >=14" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/precinct/node_modules/@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/precinct/node_modules/@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/terser-webpack-plugin/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/precinct/node_modules/@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, "dependencies": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": ">= 8.9.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/precinct/node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "engines": { - "node": ">=8" + "url": "https://opencollective.com/webpack" } }, - "node_modules/precinct/node_modules/ast-module-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-3.0.0.tgz", - "integrity": "sha512-CMxMCOCS+4D+DkOQfuZf+vLrSEmY/7xtORwdxs4wtcC1wVgvk2MqFFTwQCFhvWsI4KPU9lcWXPI8DgRiz+xetQ==", - "engines": { - "node": ">=6.0" + "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" } }, - "node_modules/precinct/node_modules/detective-amd": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/detective-amd/-/detective-amd-3.1.2.tgz", - "integrity": "sha512-jffU26dyqJ37JHR/o44La6CxtrDf3Rt9tvd2IbImJYxWKTMdBjctp37qoZ6ZcY80RHg+kzWz4bXn39e4P7cctQ==", + "node_modules/terser-webpack-plugin/node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, "dependencies": { - "ast-module-types": "^3.0.0", - "escodegen": "^2.0.0", - "get-amd-module-type": "^3.0.0", - "node-source-walk": "^4.2.0" - }, - "bin": { - "detective-amd": "bin/cli.js" - }, - "engines": { - "node": ">=6.0" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" } }, - "node_modules/precinct/node_modules/detective-cjs": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/detective-cjs/-/detective-cjs-3.1.3.tgz", - "integrity": "sha512-ljs7P0Yj9MK64B7G0eNl0ThWSYjhAaSYy+fQcpzaKalYl/UoQBOzOeLCSFEY1qEBhziZ3w7l46KG/nH+s+L7BQ==", + "node_modules/thread-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.2.0.tgz", + "integrity": "sha512-rUkv4/fnb4rqy/gGy7VuqK6wE1+1DOCOWy4RMeaV69ZHMP11tQKZvZSip1yTgrKCMZzEMcCL/bKfHvSfDHx+iQ==", "dependencies": { - "ast-module-types": "^3.0.0", - "node-source-walk": "^4.0.0" - }, - "engines": { - "node": ">=6.0" + "real-require": "^0.2.0" } }, - "node_modules/precinct/node_modules/detective-es6": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/detective-es6/-/detective-es6-2.2.2.tgz", - "integrity": "sha512-eZUKCUsbHm8xoeoCM0z6JFwvDfJ5Ww5HANo+jPR7AzkFpW9Mun3t/TqIF2jjeWa2TFbAiGaWESykf2OQp3oeMw==", - "dependencies": { - "node-source-walk": "^4.0.0" - }, + "node_modules/timm": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz", + "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==" + }, + "node_modules/tiny-lru": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-10.0.1.tgz", + "integrity": "sha512-Vst+6kEsWvb17Zpz14sRJV/f8bUWKhqm6Dc+v08iShmIJ/WxqWytHzCTd6m88pS33rE2zpX34TRmOpAJPloNCA==", "engines": { - "node": ">=6.0" + "node": ">=6" } }, - "node_modules/precinct/node_modules/detective-postcss": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-4.0.0.tgz", - "integrity": "sha512-Fwc/g9VcrowODIAeKRWZfVA/EufxYL7XfuqJQFroBKGikKX83d2G7NFw6kDlSYGG3LNQIyVa+eWv1mqre+v4+A==", - "dependencies": { - "debug": "^4.1.1", - "is-url": "^1.2.4", - "postcss": "^8.1.7", - "postcss-values-parser": "^2.0.1" - }, + "node_modules/tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=4" } }, - "node_modules/precinct/node_modules/detective-sass": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/detective-sass/-/detective-sass-3.0.2.tgz", - "integrity": "sha512-DNVYbaSlmti/eztFGSfBw4nZvwsTaVXEQ4NsT/uFckxhJrNRFUh24d76KzoCC3aarvpZP9m8sC2L1XbLej4F7g==", + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dependencies": { - "gonzales-pe": "^4.3.0", - "node-source-walk": "^4.0.0" + "is-number": "^7.0.0" }, "engines": { - "node": ">=6.0" + "node": ">=8.0" } }, - "node_modules/precinct/node_modules/detective-scss": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detective-scss/-/detective-scss-2.0.2.tgz", - "integrity": "sha512-hDWnWh/l0tht/7JQltumpVea/inmkBaanJUcXRB9kEEXVwVUMuZd6z7eusQ6GcBFrfifu3pX/XPyD7StjbAiBg==", + "node_modules/token-types": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", + "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", "dependencies": { - "gonzales-pe": "^4.3.0", - "node-source-walk": "^4.0.0" + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" }, "engines": { - "node": ">=6.0" + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/precinct/node_modules/detective-stylus": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detective-stylus/-/detective-stylus-1.0.3.tgz", - "integrity": "sha512-4/bfIU5kqjwugymoxLXXLltzQNeQfxGoLm2eIaqtnkWxqbhap9puDVpJPVDx96hnptdERzS5Cy6p9N8/08A69Q==" - }, - "node_modules/precinct/node_modules/detective-typescript": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-7.0.2.tgz", - "integrity": "sha512-unqovnhxzvkCz3m1/W4QW4qGsvXCU06aU2BAm8tkza+xLnp9SOFnob2QsTxUv5PdnQKfDvWcv9YeOeFckWejwA==", + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "^4.33.0", - "ast-module-types": "^2.7.1", - "node-source-walk": "^4.2.0", - "typescript": "^3.9.10" + "nopt": "~1.0.10" }, - "engines": { - "node": "^10.13 || >=12.0.0" + "bin": { + "nodetouch": "bin/nodetouch.js" } }, - "node_modules/precinct/node_modules/detective-typescript/node_modules/ast-module-types": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-2.7.1.tgz", - "integrity": "sha512-Rnnx/4Dus6fn7fTqdeLEAn5vUll5w7/vts0RN608yFa6si/rDOUonlIIiwugHBFWjylHjxm9owoSZn71KwG4gw==" - }, - "node_modules/precinct/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "node_modules/ts-graphviz": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ts-graphviz/-/ts-graphviz-1.7.0.tgz", + "integrity": "sha512-QOQI0L4J+n5e3yxSyd/lF4teI78o+p72i+jM8whdLNW/UZYlhlBoac9indtHAFW6O/7xBpve1S/yK1qWeVttkw==", "engines": { - "node": ">=10" + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ts-graphviz" } }, - "node_modules/precinct/node_modules/get-amd-module-type": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-3.0.2.tgz", - "integrity": "sha512-PcuKwB8ouJnKuAPn6Hk3UtdfKoUV3zXRqVEvj8XGIXqjWfgd1j7QGdXy5Z9OdQfzVt1Sk29HVe/P+X74ccOuqw==", + "node_modules/ts-loader": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", + "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "dev": true, "dependencies": { - "ast-module-types": "^3.0.0", - "node-source-walk": "^4.2.2" + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" }, "engines": { - "node": ">=6.0" + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" } }, - "node_modules/precinct/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/ts-loader/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/precinct/node_modules/node-source-walk": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-4.3.0.tgz", - "integrity": "sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA==", + "node_modules/ts-loader/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { - "@babel/parser": "^7.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=6.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/precinct/node_modules/postcss-values-parser": { + "node_modules/ts-loader/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "color-name": "~1.1.4" }, "engines": { - "node": ">=6.14.4" + "node": ">=7.0.0" } }, - "node_modules/precinct/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/ts-loader/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ts-loader/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } }, - "node_modules/precinct/node_modules/typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "node_modules/ts-loader/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4.2.0" + "node": ">=8" } }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "engines": { - "node": ">= 0.8.0" + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, - "node_modules/prettier": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.3.tgz", - "integrity": "sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==", - "dev": true, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "^1.2.0" + }, "bin": { - "prettier": "bin-prettier.js" + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dependencies": { + "tslib": "^1.8.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 6" }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, - "node_modules/pretty-ms": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", - "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dependencies": { - "parse-ms": "^2.1.0" + "prelude-ls": "~1.1.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8.0" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "node_modules/typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": ">= 0.6.0" + "node": ">=12.20" } }, - "node_modules/process-warning": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.1.0.tgz", - "integrity": "sha512-9C20RLxrZU/rFnxWncDkuF6O999NdIf3E1ws4B0ZeY3sRVPzWBMsYDE2lxjxhiXxg464cQTgKUGm8/i6y2YGXg==" - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" }, "engines": { - "node": ">= 0.10" + "node": ">=4" } }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-format-unescaped": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } }, - "node_modules/quote-unquote": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/quote-unquote/-/quote-unquote-1.0.0.tgz", - "integrity": "sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==" + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==" }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "dev": true, "dependencies": { - "safe-buffer": "^5.1.0" + "unique-slug": "^2.0.0" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" + "imurmurhash": "^0.1.4" } }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "loose-envify": "^1.1.0" + "escalade": "^3.1.1", + "picocolors": "^1.0.0" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "bin": { + "update-browserslist-db": "cli.js" }, "peerDependencies": { - "react": "^18.2.0" + "browserslist": ">= 4.21.0" } }, - "node_modules/readable-stream": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.2.0.tgz", - "integrity": "sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A==", + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "punycode": "^2.1.0" } }, - "node_modules/readable-web-to-node-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dev": true, "dependencies": { - "readable-stream": "^3.6.0" + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">= 10.13.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, - "engines": { - "node": ">= 6" + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/url-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { - "picomatch": "^2.2.1" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=8.10.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/real-require": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", - "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", - "engines": { - "node": ">= 12.13.0" + "node_modules/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" } }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "node_modules/url-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.2.0.tgz", + "integrity": "sha512-0zTyLGyDJYd/MBxG1AhJkKa6fpEBds4OQO2ut0w7OYG+ZGhGea09lijvzsqegYSik88zc7cUtIlnnO+/BvD6gQ==", "dev": true, "dependencies": { - "resolve": "^1.20.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "node_modules/utif": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", + "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", + "dependencies": { + "pako": "^1.0.5" + } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/walkdir": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", + "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==", "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "node_modules/requirejs": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", - "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==", - "bin": { - "r_js": "bin/r.js", - "r.js": "bin/r.js" + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" }, "engines": { - "node": ">=0.4.0" + "node": ">=10.13.0" } }, - "node_modules/requirejs-config-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/requirejs-config-file/-/requirejs-config-file-4.0.0.tgz", - "integrity": "sha512-jnIre8cbWOyvr8a5F2KuqBnY+SDA4NXr/hzEZJG79Mxm2WiFQz2dzhC8ibtPJS7zkmBEl1mxSwp5HhC1W4qpxw==", + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dependencies": { - "esprima": "^4.0.0", - "stringify-object": "^3.2.1" + "defaults": "^1.0.3" + } + }, + "node_modules/webpack": { + "version": "5.82.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.82.1.tgz", + "integrity": "sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.14.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" }, "engines": { "node": ">=10.13.0" - } - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "node_modules/webpack-cli": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.1.tgz", + "integrity": "sha512-OLJwVMoXnXYH2ncNGU8gxVpUtm3ybvdioiTvHgUyBuyMLKiVvWy+QObzBsMtp5pH7qQoEuWgeEUQ/sU3ZJFzAw==", "dev": true, "dependencies": { - "resolve-from": "^5.0.0" + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.0", + "@webpack-cli/info": "^2.0.1", + "@webpack-cli/serve": "^2.0.4", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" }, "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-dependency-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-dependency-path/-/resolve-dependency-path-2.0.0.tgz", - "integrity": "sha512-DIgu+0Dv+6v2XwRaNWnumKu7GPufBBOr5I1gRPJHkvghrfCGOooJODFvgFimX/KRxk9j0whD2MnKHzM1jYvk9w==", - "engines": { - "node": ">=6.0.0" + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } } }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, "engines": { - "node": ">=8" + "node": ">=14" } }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/ret": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", - "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", - "engines": { - "node": ">=4" + "node": ">=10.0.0" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=10.13.0" } }, - "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" - }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { - "glob": "^7.1.3" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", - "integrity": "sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==", - "dependencies": { - "ret": "~0.2.0" + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" } }, - "node_modules/safe-stable-stringify": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.1.tgz", - "integrity": "sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA==", + "node_modules/webpack/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/sass-lookup": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sass-lookup/-/sass-lookup-3.0.0.tgz", - "integrity": "sha512-TTsus8CfFRn1N44bvdEai1no6PqdmDiQUiqW5DlpmtT+tYnIt1tXtDIph5KA1efC+LmioJXSnCtUVpcK9gaKIg==", + "node_modules/webpack/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, "dependencies": { - "commander": "^2.16.0" - }, - "bin": { - "sass-lookup": "bin/cli.js" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">= 10.13.0" } }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, - "node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, - "node_modules/secure-json-parse": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.6.0.tgz", - "integrity": "sha512-B9osKohb6L+EZ6Kve3wHKfsAClzOC/iISA2vSuCe5Jx5NAKiwitfxx8ZKYapHXr0sYRj7UZInT7pLb3rp2Yx6A==" - }, - "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "node_modules/webpack/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "has-flag": "^4.0.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "node_modules/webpack/node_modules/terser": { + "version": "5.17.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.6.tgz", + "integrity": "sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ==", "dev": true, "dependencies": { - "randombytes": "^2.1.0" + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" } }, - "node_modules/set-cookie-parser": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz", - "integrity": "sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "node_modules/webpack/node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dev": true, "dependencies": { - "kind-of": "^6.0.2" + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" }, "engines": { - "node": ">=8" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { - "shebang-regex": "^3.0.0" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, - "node_modules/simple-update-notifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", - "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", - "dev": true, + "node_modules/xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", "dependencies": { - "semver": "~7.0.0" + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/xml-parse-from-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", + "integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==" + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" }, "engines": { - "node": ">=8.10.0" + "node": ">=4.0.0" } }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" } }, - "node_modules/slash": { + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/sonic-boom": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.2.1.tgz", - "integrity": "sha512-iITeTHxy3B9FGu8aVdiDXUVAcHMF9Ss0cCsAOo2HfCrmVGT3/DT5oYaeu0M/YKZDlKTvChEyPq0zI9Hf33EX6A==", - "dependencies": { - "atomic-sleep": "^1.0.0" + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true, - "engines": { - "node": ">=0.10.0" + "@babel/code-frame": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" } }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } + "@babel/compat-data": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.3.tgz", + "integrity": "sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==", + "dev": true }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "@babel/core": { + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", + "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-compilation-targets": "^7.21.5", + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helpers": "^7.21.5", + "@babel/parser": "^7.21.8", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, - "node_modules/split2": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", - "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==", - "engines": { - "node": ">= 10.x" + "@babel/generator": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.3.tgz", + "integrity": "sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==", + "dev": true, + "requires": { + "@babel/types": "^7.22.3", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" } }, - "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" + "requires": { + "@babel/types": "^7.18.6" } }, - "node_modules/stream-to-array": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", - "integrity": "sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==", - "dependencies": { - "any-promise": "^1.1.0" + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.3.tgz", + "integrity": "sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg==", + "dev": true, + "requires": { + "@babel/types": "^7.22.3" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "@babel/helper-compilation-targets": { + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz", + "integrity": "sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.0", + "@babel/helper-validator-option": "^7.21.0", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, "dependencies": { - "safe-buffer": "~5.2.0" + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } } }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" + "@babel/helper-create-class-features-plugin": { + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz", + "integrity": "sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.22.1", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-member-expression-to-functions": "^7.22.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.22.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6", + "semver": "^6.3.0" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, - "node_modules/strtok3": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", - "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", - "dependencies": { - "@tokenizer/token": "^0.3.0", - "peek-readable": "^4.1.0" - }, - "engines": { - "node": ">=10" + "@babel/helper-create-regexp-features-plugin": { + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz", + "integrity": "sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.3.1", + "semver": "^6.3.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, - "node_modules/style-loader": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.2.tgz", - "integrity": "sha512-RHs/vcrKdQK8wZliteNK4NKzxvLBzpuHMqYmUVWeKa6MkaIQ97ZTOS0b+zapZhy6GcrgWnvWYCMHRirC3FsUmw==", + "@babel/helper-define-polyfill-provider": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz", + "integrity": "sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg==", "dev": true, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "requires": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" }, - "peerDependencies": { - "webpack": "^5.0.0" + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, - "node_modules/stylus-lookup": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/stylus-lookup/-/stylus-lookup-3.0.2.tgz", - "integrity": "sha512-oEQGHSjg/AMaWlKe7gqsnYzan8DLcGIHe0dUaFkucZZ14z4zjENRlQMCHT4FNsiWnJf17YN9OvrCfCoi7VvOyg==", - "dependencies": { - "commander": "^2.8.1", - "debug": "^4.1.0" - }, - "bin": { - "stylus-lookup": "bin/cli.js" - }, - "engines": { - "node": ">=6.0.0" + "@babel/helper-environment-visitor": { + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz", + "integrity": "sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "dev": true, + "requires": { + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "requires": { + "@babel/types": "^7.18.6" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@babel/helper-member-expression-to-functions": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz", + "integrity": "sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA==", + "dev": true, + "requires": { + "@babel/types": "^7.22.3" } }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "engines": { - "node": ">=6" + "@babel/helper-module-imports": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "dev": true, + "requires": { + "@babel/types": "^7.21.4" } }, - "node_modules/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "@babel/helper-module-transforms": { + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz", + "integrity": "sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==", "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "requires": { + "@babel/helper-environment-visitor": "^7.22.1", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-simple-access": "^7.21.5", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.21.9", + "@babel/traverse": "^7.22.1", + "@babel/types": "^7.22.0" } }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", "dev": true, - "engines": { - "node": ">=8" + "requires": { + "@babel/types": "^7.18.6" } }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "@babel/helper-plugin-utils": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", + "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" } }, - "node_modules/terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "@babel/helper-replace-supers": { + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz", + "integrity": "sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ==", "dev": true, - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=6.0.0" + "requires": { + "@babel/helper-environment-visitor": "^7.22.1", + "@babel/helper-member-expression-to-functions": "^7.22.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.21.9", + "@babel/traverse": "^7.22.1", + "@babel/types": "^7.22.0" } }, - "node_modules/terser-webpack-plugin": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.8.tgz", - "integrity": "sha512-ygwK8TYMRTYtSyLB2Mhnt90guQh989CIq/mL/2apwi6rA15Xys4ydNUiH4ah6EZCfQxSk26ZFQilZ4IQ6IZw6A==", + "@babel/helper-simple-access": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", + "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", "dev": true, - "dependencies": { - "cacache": "^15.0.5", - "find-cache-dir": "^3.3.1", - "jest-worker": "^26.1.0", - "p-limit": "^3.0.2", - "schema-utils": "^2.6.6", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.8.0", - "webpack-sources": "^1.4.3" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "requires": { + "@babel/types": "^7.21.5" } }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "requires": { + "@babel/types": "^7.20.0" } }, - "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" + "requires": { + "@babel/types": "^7.18.6" } }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "@babel/helper-string-parser": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", "dev": true }, - "node_modules/terser-webpack-plugin/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", + "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "requires": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" } }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "@babel/helpers": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", + "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "requires": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" } }, - "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, - "dependencies": { - "randombytes": "^2.1.0" + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "node_modules/terser-webpack-plugin/node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "@babel/parser": { + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.4.tgz", + "integrity": "sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==" + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", "dev": true, - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" } }, - "node_modules/thread-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.2.0.tgz", - "integrity": "sha512-rUkv4/fnb4rqy/gGy7VuqK6wE1+1DOCOWy4RMeaV69ZHMP11tQKZvZSip1yTgrKCMZzEMcCL/bKfHvSfDHx+iQ==", - "dependencies": { - "real-require": "^0.2.0" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz", + "integrity": "sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-transform-optional-chaining": "^7.22.3" } }, - "node_modules/timm": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz", - "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==" - }, - "node_modules/tiny-lru": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-10.0.1.tgz", - "integrity": "sha512-Vst+6kEsWvb17Zpz14sRJV/f8bUWKhqm6Dc+v08iShmIJ/WxqWytHzCTd6m88pS33rE2zpX34TRmOpAJPloNCA==", - "engines": { - "node": ">=6" + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" } }, - "node_modules/tinycolor2": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "dev": true, - "engines": { - "node": ">=4" + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" } }, - "node_modules/token-types": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", - "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", - "dependencies": { - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" } }, - "node_modules/touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, - "dependencies": { - "nopt": "~1.0.10" - }, - "bin": { - "nodetouch": "bin/nodetouch.js" + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" } }, - "node_modules/ts-graphviz": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ts-graphviz/-/ts-graphviz-1.7.0.tgz", - "integrity": "sha512-QOQI0L4J+n5e3yxSyd/lF4teI78o+p72i+jM8whdLNW/UZYlhlBoac9indtHAFW6O/7xBpve1S/yK1qWeVttkw==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ts-graphviz" + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" } }, - "node_modules/ts-loader": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", - "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "typescript": "*", - "webpack": "^5.0.0" + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" } }, - "node_modules/ts-loader/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" } }, - "node_modules/ts-loader/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "@babel/plugin-syntax-import-attributes": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.3.tgz", + "integrity": "sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA==", "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "requires": { + "@babel/helper-plugin-utils": "^7.21.5" } }, - "node_modules/ts-loader/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" } }, - "node_modules/ts-loader/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/ts-loader/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "engines": { - "node": ">=8" + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" } }, - "node_modules/ts-loader/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "@babel/plugin-syntax-jsx": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", + "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" } }, - "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" } }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" } }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" } }, - "node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=12.20" + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" } }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "node_modules/uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==" + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, - "dependencies": { - "unique-slug": "^2.0.0" + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" } }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "@babel/plugin-syntax-typescript": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", + "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" } }, - "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" + "@babel/plugin-transform-arrow-functions": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", + "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.21.5" } }, - "node_modules/utif": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", - "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", - "dependencies": { - "pako": "^1.0.5" + "@babel/plugin-transform-async-generator-functions": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.3.tgz", + "integrity": "sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "@babel/plugin-transform-async-to-generator": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", + "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9" + } }, - "node_modules/walkdir": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", - "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==", - "engines": { - "node": ">=6.0.0" + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" } }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "@babel/plugin-transform-block-scoping": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", + "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dependencies": { - "defaults": "^1.0.3" + "@babel/plugin-transform-class-properties": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.3.tgz", + "integrity": "sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5" } }, - "node_modules/webpack": { - "version": "5.82.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.82.1.tgz", - "integrity": "sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw==", + "@babel/plugin-transform-class-static-block": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.3.tgz", + "integrity": "sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw==", "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.14.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, - "node_modules/webpack-cli": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.1.tgz", - "integrity": "sha512-OLJwVMoXnXYH2ncNGU8gxVpUtm3ybvdioiTvHgUyBuyMLKiVvWy+QObzBsMtp5pH7qQoEuWgeEUQ/sU3ZJFzAw==", + "@babel/plugin-transform-classes": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", + "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.0", - "@webpack-cli/info": "^2.0.1", - "@webpack-cli/serve": "^2.0.4", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" } }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "@babel/plugin-transform-computed-properties": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", + "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", "dev": true, - "engines": { - "node": ">=14" + "requires": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/template": "^7.20.7" } }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "@babel/plugin-transform-destructuring": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", + "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" } }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", "dev": true, - "engines": { - "node": ">=10.13.0" + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" } }, - "node_modules/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "@babel/plugin-transform-dynamic-import": { + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.1.tgz", + "integrity": "sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ==", "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" + "requires": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, - "node_modules/webpack/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", "dev": true, - "engines": { - "node": ">=8" + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, - "node_modules/webpack/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "@babel/plugin-transform-export-namespace-from": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.3.tgz", + "integrity": "sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g==", "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" + "requires": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "@babel/plugin-transform-for-of": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", + "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.21.5" + } }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "requires": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" } }, - "node_modules/webpack/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "@babel/plugin-transform-json-strings": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.3.tgz", + "integrity": "sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "requires": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" } }, - "node_modules/webpack/node_modules/terser": { - "version": "5.17.6", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.6.tgz", - "integrity": "sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ==", + "@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" } }, - "node_modules/webpack/node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.3.tgz", + "integrity": "sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA==", "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } + "requires": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" } }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true + "@babel/plugin-transform-modules-amd": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", + "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" + } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "engines": { - "node": ">=0.10.0" + "@babel/plugin-transform-modules-commonjs": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", + "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-simple-access": "^7.21.5" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "@babel/plugin-transform-modules-systemjs": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz", + "integrity": "sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-validator-identifier": "^7.19.1" + } }, - "node_modules/xhr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", - "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", - "dependencies": { - "global": "~4.4.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" + "@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, - "node_modules/xml-parse-from-string": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", - "integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==" + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz", + "integrity": "sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5" + } }, - "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" + "@babel/plugin-transform-new-target": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz", + "integrity": "sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.21.5" } }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "engines": { - "node": ">=4.0" + "@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.3.tgz", + "integrity": "sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" + "@babel/plugin-transform-numeric-separator": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.3.tgz", + "integrity": "sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "@babel/plugin-transform-object-rest-spread": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.3.tgz", + "integrity": "sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.3", + "@babel/helper-compilation-targets": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.3" + } }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + }, + "@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.3.tgz", + "integrity": "sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g==", "dev": true, "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, - "@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "@babel/plugin-transform-optional-chaining": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz", + "integrity": "sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg==", "dev": true, "requires": { - "@babel/highlight": "^7.18.6" + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, - "@babel/compat-data": { - "version": "7.21.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", - "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", - "dev": true + "@babel/plugin-transform-parameters": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz", + "integrity": "sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.21.5" + } }, - "@babel/core": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", - "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", + "@babel/plugin-transform-private-methods": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.3.tgz", + "integrity": "sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug==", "dev": true, "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helpers": "^7.21.5", - "@babel/parser": "^7.21.8", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "@babel/helper-create-class-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5" } }, - "@babel/generator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", - "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", + "@babel/plugin-transform-private-property-in-object": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.3.tgz", + "integrity": "sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw==", "dev": true, "requires": { - "@babel/types": "^7.21.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, - "@babel/helper-annotate-as-pure": { + "@babel/plugin-transform-property-literals": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.6" } }, - "@babel/helper-compilation-targets": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", - "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", + "@babel/plugin-transform-react-constant-elements": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.3.tgz", + "integrity": "sha512-b5J6muxQYp4H7loAQv/c7GO5cPuRA6H5hx4gO+/Hn+Cu9MRQU0PNiUoWq1L//8sq6kFSNxGXFb2XTaUfa9y+Pg==", "dev": true, "requires": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } + "@babel/helper-plugin-utils": "^7.21.5" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" } }, - "@babel/helper-environment-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", - "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "@babel/plugin-transform-react-jsx": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.3.tgz", + "integrity": "sha512-JEulRWG2f04a7L8VWaOngWiK6p+JOSpB+DAtwfJgOaej1qdbNxqtK7MwTBHjUA10NeFcszlFNqCdbRcirzh2uQ==", "dev": true, "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-jsx": "^7.21.4", + "@babel/types": "^7.22.3" } }, - "@babel/helper-hoist-variables": { + "@babel/plugin-transform-react-jsx-development": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/plugin-transform-react-jsx": "^7.18.6" } }, - "@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", "dev": true, "requires": { - "@babel/types": "^7.21.4" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, - "@babel/helper-module-transforms": { + "@babel/plugin-transform-regenerator": { "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", - "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", + "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-simple-access": "^7.21.5", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/helper-plugin-utils": "^7.21.5", + "regenerator-transform": "^0.15.1" } }, - "@babel/helper-plugin-utils": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", - "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", - "dev": true + "@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } }, - "@babel/helper-simple-access": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", - "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", + "@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", "dev": true, "requires": { - "@babel/types": "^7.21.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, - "@babel/helper-split-export-declaration": { + "@babel/plugin-transform-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", + "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + } + }, + "@babel/plugin-transform-sticky-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.6" } }, - "@babel/helper-string-parser": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", - "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", - "dev": true + "@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true + "@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } }, - "@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", - "dev": true + "@babel/plugin-transform-typescript": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.3.tgz", + "integrity": "sha512-pyjnCIniO5PNaEuGxT28h0HbMru3qCVrMqVgVOz/krComdIrY9W6FCLBq9NWHY8HDGaUlan+UhmZElDENIfCcw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-typescript": "^7.21.4" + } }, - "@babel/helpers": { + "@babel/plugin-transform-unicode-escapes": { "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", - "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", + "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", "dev": true, "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/helper-plugin-utils": "^7.21.5" } }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.3.tgz", + "integrity": "sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5" } }, - "@babel/parser": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", - "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==" - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", "dev": true, "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.3.tgz", + "integrity": "sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5" } }, - "@babel/plugin-syntax-jsx": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", + "@babel/preset-env": { + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.4.tgz", + "integrity": "sha512-c3lHOjbwBv0TkhYCr+XCR6wKcSZ1QbQTVdSkZUaVpLv8CVWotBMArWUi5UAJrcrQaEnleVkkvaV8F/pmc/STZQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/compat-data": "^7.22.3", + "@babel/helper-compilation-targets": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-validator-option": "^7.21.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.3", + "@babel/plugin-proposal-private-property-in-object": "^7.21.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-import-attributes": "^7.22.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.21.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.3", + "@babel/plugin-transform-async-to-generator": "^7.20.7", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.21.0", + "@babel/plugin-transform-class-properties": "^7.22.3", + "@babel/plugin-transform-class-static-block": "^7.22.3", + "@babel/plugin-transform-classes": "^7.21.0", + "@babel/plugin-transform-computed-properties": "^7.21.5", + "@babel/plugin-transform-destructuring": "^7.21.3", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-dynamic-import": "^7.22.1", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-export-namespace-from": "^7.22.3", + "@babel/plugin-transform-for-of": "^7.21.5", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-json-strings": "^7.22.3", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.3", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.20.11", + "@babel/plugin-transform-modules-commonjs": "^7.21.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.3", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.3", + "@babel/plugin-transform-new-target": "^7.22.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.3", + "@babel/plugin-transform-numeric-separator": "^7.22.3", + "@babel/plugin-transform-object-rest-spread": "^7.22.3", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-optional-catch-binding": "^7.22.3", + "@babel/plugin-transform-optional-chaining": "^7.22.3", + "@babel/plugin-transform-parameters": "^7.22.3", + "@babel/plugin-transform-private-methods": "^7.22.3", + "@babel/plugin-transform-private-property-in-object": "^7.22.3", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.21.5", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.20.7", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.21.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.3", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.3", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.22.4", + "babel-plugin-polyfill-corejs2": "^0.4.3", + "babel-plugin-polyfill-corejs3": "^0.8.1", + "babel-plugin-polyfill-regenerator": "^0.5.0", + "core-js-compat": "^3.30.2", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" } }, - "@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", + "@babel/preset-react": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.3.tgz", + "integrity": "sha512-lxDz1mnZ9polqClBCVBjIVUypoB4qV3/tZUDb/IlYbW1kiiLaXaX+bInbRjl+lNQ/iUZraQ3+S8daEmoELMWug==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-validator-option": "^7.21.0", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.22.3", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" } }, - "@babel/plugin-transform-react-jsx": { + "@babel/preset-typescript": { "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.5.tgz", - "integrity": "sha512-ELdlq61FpoEkHO6gFRpfj0kUgSwQTGoaEU8eMRoS8Dv3v6e7BjEAj5WMtIBRdHUeAioMhKP5HyxNzNnP+heKbA==", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz", + "integrity": "sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.21.4", "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-validator-option": "^7.21.0", "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/types": "^7.21.5" + "@babel/plugin-transform-modules-commonjs": "^7.21.5", + "@babel/plugin-transform-typescript": "^7.21.3" } }, + "@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, "@babel/runtime": { "version": "7.20.13", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", @@ -7189,38 +10590,38 @@ } }, "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", + "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.21.4", + "@babel/parser": "^7.21.9", + "@babel/types": "^7.21.5" } }, "@babel/traverse": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", - "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.4.tgz", + "integrity": "sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==", "dev": true, "requires": { "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-environment-visitor": "^7.21.5", + "@babel/generator": "^7.22.3", + "@babel/helper-environment-visitor": "^7.22.1", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.5", - "@babel/types": "^7.21.5", + "@babel/parser": "^7.22.4", + "@babel/types": "^7.22.4", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", - "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.4.tgz", + "integrity": "sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.21.5", @@ -7726,11 +11127,151 @@ } } }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.0.0.tgz", + "integrity": "sha512-UKrY3860AQICgH7g+6h2zkoxeVEPLYwX/uAjmqo4PIq2FIHppwhIqZstIyTz0ZtlwreKR41O3W3BzsBBiJV2Aw==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "dev": true, + "requires": {} + }, + "@svgr/babel-preset": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.0.0.tgz", + "integrity": "sha512-KLcjiZychInVrhs86OvcYPLTFu9L5XV2vj0XAaE1HwE3J3jLmIzRY8ttdeAg/iFyp8nhavJpafpDZTt+1LIpkQ==", + "dev": true, + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.0.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + } + }, + "@svgr/core": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.0.0.tgz", + "integrity": "sha512-aJKtc+Pie/rFYsVH/unSkDaZGvEeylNv/s2cP+ta9/rYWxRVvoV/S4Qw65Kmrtah4CBK5PM6ISH9qUH7IJQCng==", + "dev": true, + "requires": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.0.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "dev": true, + "requires": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + } + }, + "@svgr/plugin-jsx": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.0.1.tgz", + "integrity": "sha512-bfCFb+4ZsM3UuKP2t7KmDwn6YV8qVn9HIQJmau6xeQb/iV65Rpi7NBNBWA2hcCd4GKoCqG8hpaaDk5FDR0eH+g==", + "dev": true, + "requires": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.0.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + } + }, + "@svgr/plugin-svgo": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.0.1.tgz", + "integrity": "sha512-29OJ1QmJgnohQHDAgAuY2h21xWD6TZiXji+hnx+W635RiXTAlHTbjrZDktfqzkN0bOeQEtNe+xgq73/XeWFfSg==", + "dev": true, + "requires": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + } + }, + "@svgr/webpack": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.0.1.tgz", + "integrity": "sha512-zSoeKcbCmfMXjA11uDuCJb+1LWNb3vy6Qw/VHj0Nfcl3UuqwuoZWknHsBIhCWvi4wU9vPui3aq054qjVyZqY4A==", + "dev": true, + "requires": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.0.0", + "@svgr/plugin-jsx": "8.0.1", + "@svgr/plugin-svgo": "8.0.1" + } + }, "@tokenizer/token": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true + }, "@types/eslint": { "version": "8.37.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", @@ -8163,6 +11704,12 @@ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==" }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -8188,24 +11735,62 @@ "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" }, - "avvio": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.2.0.tgz", - "integrity": "sha512-bbCQdg7bpEv6kGH41RO/3B2/GMMmJSo2iBK+X8AWN9mujtfUipMDfIjsgHCfpnKqoGEQrrmCDKSa5OQ19+fDmg==", + "avvio": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.2.0.tgz", + "integrity": "sha512-bbCQdg7bpEv6kGH41RO/3B2/GMMmJSo2iBK+X8AWN9mujtfUipMDfIjsgHCfpnKqoGEQrrmCDKSa5OQ19+fDmg==", + "requires": { + "archy": "^1.0.0", + "debug": "^4.0.0", + "fastq": "^1.6.1" + } + }, + "babel-loader": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", + "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.2", + "schema-utils": "^4.0.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz", + "integrity": "sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.4.0", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz", + "integrity": "sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q==", + "dev": true, "requires": { - "archy": "^1.0.0", - "debug": "^4.0.0", - "fastq": "^1.6.1" + "@babel/helper-define-polyfill-provider": "^0.4.0", + "core-js-compat": "^3.30.1" } }, - "babel-loader": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", - "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", + "babel-plugin-polyfill-regenerator": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz", + "integrity": "sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g==", "dev": true, "requires": { - "find-cache-dir": "^3.3.2", - "schema-utils": "^4.0.0" + "@babel/helper-define-polyfill-provider": "^0.4.0" } }, "balanced-match": { @@ -8266,6 +11851,12 @@ "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==" }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -8367,6 +11958,18 @@ } } }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, "caniuse-lite": { "version": "1.0.30001486", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001486.tgz", @@ -8538,6 +12141,27 @@ "serialize-javascript": "^6.0.0" } }, + "core-js-compat": { + "version": "3.30.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", + "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", + "dev": true, + "requires": { + "browserslist": "^4.21.5" + } + }, + "cosmiconfig": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", + "dev": true, + "requires": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -8570,12 +12194,68 @@ "semver": "^7.3.8" } }, + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "requires": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, + "csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "requires": { + "css-tree": "~2.2.0" + }, + "dependencies": { + "css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "requires": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + } + }, + "mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true + } + } + }, "csstype": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", @@ -8599,6 +12279,12 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true + }, "defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -8811,11 +12497,66 @@ "path-type": "^4.0.0" } }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, "dom-walk": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "dev": true + } + } + }, "electron-to-chromium": { "version": "1.4.393", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.393.tgz", @@ -8837,12 +12578,27 @@ "tapable": "^2.2.0" } }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true + }, "envinfo": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", "dev": true }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, "es-module-lexer": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", @@ -9356,6 +13112,24 @@ "@types/node": "16.9.1" } }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, "import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -9419,6 +13193,12 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -9594,6 +13374,15 @@ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -9642,6 +13431,12 @@ "set-cookie-parser": "^2.4.1" } }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, "load-bmfont": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz", @@ -9683,6 +13478,12 @@ "p-locate": "^4.1.0" } }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -9745,6 +13546,23 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "dev": true + } + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -9865,6 +13683,12 @@ "is-buffer": "~1.1.6" } }, + "mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -10056,6 +13880,24 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "dev": true + } + } + }, "node-releases": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", @@ -10120,6 +13962,15 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -10261,6 +14112,15 @@ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, "parse-bmfont-ascii": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", @@ -10285,6 +14145,18 @@ "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, "parse-ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", @@ -10858,11 +14730,66 @@ "resolve": "^1.20.0" } }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, "regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, + "regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "requires": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + } + }, + "regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true + } + } + }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -11083,6 +15010,24 @@ "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true }, + "snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "dev": true + } + } + }, "sonic-boom": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.2.1.tgz", @@ -11215,6 +15160,34 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, + "svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true + }, + "svgo": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz", + "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==", + "dev": true, + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.2.1", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + } + } + }, "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -11518,6 +15491,34 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true + }, "uniq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", @@ -11559,6 +15560,55 @@ "punycode": "^2.1.0" } }, + "url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.2.0.tgz", + "integrity": "sha512-0zTyLGyDJYd/MBxG1AhJkKa6fpEBds4OQO2ut0w7OYG+ZGhGea09lijvzsqegYSik88zc7cUtIlnnO+/BvD6gQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, "utif": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", diff --git a/package.json b/package.json index 67b7ae64..0445285b 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "@babel/plugin-proposal-object-rest-spread": "^7.20.7", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-transform-react-jsx": "^7.21.5", + "@svgr/webpack": "^8.0.1", "babel-loader": "^9.1.2", "clean-webpack-plugin": "^4.0.0", "copy-webpack-plugin": "^11.0.0", @@ -36,6 +37,7 @@ "terser-webpack-plugin": "^3.0.8", "ts-loader": "^9.4.2", "typescript": "^5.0.4", + "url-loader": "^4.1.1", "webpack": "^5.82.1", "webpack-cli": "^5.1.1" }, @@ -53,4 +55,4 @@ "url": "https://github.com/AbdullahAlfaraj/Auto-Photoshop-StableDiffusion-Plugin/issues" }, "homepage": "https://github.com/AbdullahAlfaraj/Auto-Photoshop-StableDiffusion-Plugin#readme" -} \ No newline at end of file +} diff --git a/tsconfig.json b/tsconfig.json index 7e465c3b..bdd1703f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -108,4 +108,5 @@ "skipLibCheck": true /* Skip type checking all .d.ts files. */ }, "exclude": ["./jimp"], + // "include": ["./typescripts/@types/custom.d.ts"] } diff --git a/typescripts/@types/custom.d.ts b/typescripts/@types/custom.d.ts new file mode 100644 index 00000000..ad8db2e1 --- /dev/null +++ b/typescripts/@types/custom.d.ts @@ -0,0 +1,6 @@ +declare module '*.svg' { + import React = require('react'); + export const ReactComponent: React.FunctionComponent>; + const src: string; + export default src; +} diff --git a/webpack.config.js b/webpack.config.js index 1ee1fd50..d2bfb08c 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -54,6 +54,11 @@ module.exports = { test: /\.css$/, use: ['style-loader', 'css-loader'], }, + { + test: /\.svg$/, + use: ['@svgr/webpack', 'url-loader'], + }, + ], }, plugins: [ From 11393a12e16e3fdddef5feccdf76bd4350277a90 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 8 Jun 2023 12:20:44 +0300 Subject: [PATCH 004/143] remove dead code --- index.html | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/index.html b/index.html index 5f83fb50..cef182f2 100644 --- a/index.html +++ b/index.html @@ -2355,10 +2355,7 @@
- +
From d2fd88ed2138f0a0eb6671f275bbd1d4096d421b Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Fri, 9 Jun 2023 05:04:09 +0300 Subject: [PATCH 005/143] fix: controlNet preset menu will not load --- typescripts/controlnet/ControlNetTab.tsx | 29 ++++++++++++++++------- typescripts/controlnet/ControlNetUnit.tsx | 2 +- typescripts/util/oldSystem.tsx | 8 ++++++- utility/presets/preset.js | 5 ++-- 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/typescripts/controlnet/ControlNetTab.tsx b/typescripts/controlnet/ControlNetTab.tsx index 08db37d2..8185b7f2 100644 --- a/typescripts/controlnet/ControlNetTab.tsx +++ b/typescripts/controlnet/ControlNetTab.tsx @@ -4,6 +4,7 @@ import ControlNetUnit from './ControlNetUnit'; import { store as ControlNetStore } from './main'; import { DefaultControlNetUnitData } from './store'; import { Enum, controlnet_preset, note, preset, selection } from '../util/oldSystem'; +import {SpMenuComponent} from '../util/elements'; let g_controlnet_presets: any; declare const g_generation_session: any; @@ -11,12 +12,14 @@ declare const g_generation_session: any; @observer class ControlNetTab extends React.Component<{ appState: typeof ControlNetStore }>{ state = { - maxControlNet: 0 + maxControlNet: 0, + presetMenuChildren: [] } - private presetMenuChildren: JSX.Element[] = [] + // private presetMenuChildren: JSX.Element[] = [] onPresetMenuChange(evt: any) { + const preset_index = evt.target.selectedIndex const preset_name = evt.target.options[preset_index].textContent ControlNetStore.controlNetUnitData.forEach((dataitem, index) => { @@ -42,7 +45,12 @@ class ControlNetTab extends React.Component<{ appState: typeof ControlNetStore } dataitem.pixel_perfect = presetData.pixel_perfect || DefaultControlNetUnitData.pixel_perfect }) } + // function to update presetMenuChildren + updatePresetMenuChildren(newChildren:any) { + this.setState({ presetMenuChildren: newChildren }); + } async updatePresetMenuEvent() { + const custom_presets = await preset.getAllCustomPresetsSettings( Enum.PresetTypeEnum['ControlNetPreset'] ) @@ -54,12 +62,14 @@ class ControlNetTab extends React.Component<{ appState: typeof ControlNetStore } const presets_names = Object.keys(g_controlnet_presets) - this.presetMenuChildren = presets_names.map(preset_name => { + // debugger; + const presetMenuChildren = presets_names.map(preset_name => { if (preset_name == "Select CtrlNet Preset") return {preset_name} else return {preset_name} }) + this.updatePresetMenuChildren(presetMenuChildren) } async onSetAllControlImage() { @@ -87,14 +97,14 @@ class ControlNetTab extends React.Component<{ appState: typeof ControlNetStore } size="m" label="ControlNet Preset" > - {/* - {this.presetMenuChildren.map(child => child)} - */} + {this.state.presetMenuChildren.map(child => child)} +
{ @@ -123,16 +133,19 @@ class ControlNetTab extends React.Component<{ appState: typeof ControlNetStore } Disable ControlNet Tab
- { +
+ + { Array(this.props.appState.maxControlNet * 2).fill(0).map((v, index) => { if (index % 2 == 0) { - return + return
} else { return } }) } +
); } diff --git a/typescripts/controlnet/ControlNetUnit.tsx b/typescripts/controlnet/ControlNetUnit.tsx index 5482a92a..d7b50789 100644 --- a/typescripts/controlnet/ControlNetUnit.tsx +++ b/typescripts/controlnet/ControlNetUnit.tsx @@ -288,7 +288,7 @@ export default class ControlNetUnit extends React.Component<{ index: number, app onChange={this.onModelChange.bind(this)} id={`mModelsMenuControlNet_${this.props.index}`} items={['none'].concat(this.props.appState.supportedModels)} - selected_index={this.props.appState.supportedModels.indexOf(storeData.model || 'none')} + selected_index={this.props.appState.supportedModels.indexOf(storeData.model || 'none')+1}// 'none' item will offset the index by 1 />) } diff --git a/typescripts/util/oldSystem.tsx b/typescripts/util/oldSystem.tsx index 767c5fc4..2f185a40 100644 --- a/typescripts/util/oldSystem.tsx +++ b/typescripts/util/oldSystem.tsx @@ -10,6 +10,9 @@ const Enum = req('./enum') const api = req('./utility/api') const python_replacement = req('./utility/sdapi/python_replacement') const sdapi = req('./sdapi_py_re') +const html_manip = req('./utility/html_manip') +const psapi = req('./psapi') +const general = req('./utility/general') export { selection, @@ -19,5 +22,8 @@ export { Enum, api, python_replacement, - sdapi + sdapi, + html_manip, + psapi, + general, } \ No newline at end of file diff --git a/utility/presets/preset.js b/utility/presets/preset.js index 5e2cd27f..3a0db8f5 100644 --- a/utility/presets/preset.js +++ b/utility/presets/preset.js @@ -160,10 +160,9 @@ function getPresetSettings(preset_type) { if (preset_type === Enum.PresetTypeEnum['SDPreset']) { preset_settings = g_ui_settings_object.getSettings() } else if (preset_type === Enum.PresetTypeEnum['ControlNetPreset']) { - const { ControlNetUnit } = require('../typescripts/dist/bundle').control_net // only import ControlNetUnit to avoid circular dependency - // preset_settings = control_net.ControlNetUnit.getUnits() + const { getUnitsData } = require('../../typescripts/dist/bundle').control_net // only import ControlNetUnit to avoid circular dependency + preset_settings = getUnitsData() - preset_settings = ControlNetUnit.getUnits() } return preset_settings } From 95fa58cb6a1d3be3bfe1ed0ee8092f3b570f8792 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Fri, 9 Jun 2023 05:05:29 +0300 Subject: [PATCH 006/143] fix: set max controlNet models to 0 on request failure --- typescripts/controlnet/entry.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/typescripts/controlnet/entry.ts b/typescripts/controlnet/entry.ts index 2fe19c8e..a247e247 100644 --- a/typescripts/controlnet/entry.ts +++ b/typescripts/controlnet/entry.ts @@ -2,7 +2,7 @@ import { Enum, api } from "../util/oldSystem"; import { store, versionCompare } from "./main" declare const g_sd_config_obj: any; -declare const g_sd_url: any; +declare let g_sd_url: string; async function requestControlNetPreprocessors() { const control_net_json = await api.requestGet(`${g_sd_url}/controlnet/module_list?alias_name=1`) @@ -25,7 +25,7 @@ async function requestControlNetApiVersion() { async function requestControlNetMaxUnits() { const json = await api.requestGet(`${g_sd_url}/controlnet/settings`) - const control_net_max_models_num = json?.control_net_max_models_num ?? 1 + const control_net_max_models_num = json?.control_net_max_models_num ?? 0 return control_net_max_models_num } From b3f94ab4f0da0b9ff0e07b1b93ec0ec416d5f4f4 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Fri, 9 Jun 2023 05:11:11 +0300 Subject: [PATCH 007/143] add thumbnail functionality to CtrlNet annotated image --- icon/move_to_canvas.svg | 36 +++++ icon/pen.svg | 9 ++ icon/preview.svg | 56 +++++++ typescripts/controlnet/ControlNetUnit.tsx | 172 +++++++++++++++++++++- typescripts/util/elements.tsx | 50 ++++++- 5 files changed, 314 insertions(+), 9 deletions(-) create mode 100644 icon/move_to_canvas.svg create mode 100644 icon/pen.svg create mode 100644 icon/preview.svg diff --git a/icon/move_to_canvas.svg b/icon/move_to_canvas.svg new file mode 100644 index 00000000..0690430d --- /dev/null +++ b/icon/move_to_canvas.svg @@ -0,0 +1,36 @@ + + + + + + diff --git a/icon/pen.svg b/icon/pen.svg new file mode 100644 index 00000000..4c0b7b68 --- /dev/null +++ b/icon/pen.svg @@ -0,0 +1,9 @@ + + + + diff --git a/icon/preview.svg b/icon/preview.svg new file mode 100644 index 00000000..1b370a83 --- /dev/null +++ b/icon/preview.svg @@ -0,0 +1,56 @@ + + + + + + + + + + \ No newline at end of file diff --git a/typescripts/controlnet/ControlNetUnit.tsx b/typescripts/controlnet/ControlNetUnit.tsx index d7b50789..1c324d86 100644 --- a/typescripts/controlnet/ControlNetUnit.tsx +++ b/typescripts/controlnet/ControlNetUnit.tsx @@ -1,13 +1,15 @@ import { observer } from 'mobx-react'; import React from 'react'; -import { SpCheckBox, SpMenu, SpSlider } from '../util/elements'; +import { MoveToCanvasSvg,ActionButtonSVG, SpCheckBox, SpMenu, SpSlider, Thumbnail, PenSvg, PreviewSvg } from '../util/elements'; import ControlNetStore from './store'; import { mapRange, versionCompare } from './util'; -import { note, selection } from '../util/oldSystem'; +import { note, selection, html_manip, psapi,api, general } from '../util/oldSystem'; + declare const g_generation_session: any; declare const io: any; declare const app: any; +declare let g_sd_url: string; @observer @@ -116,6 +118,159 @@ export default class ControlNetUnit extends React.Component<{ index: number, app } } + async requestControlNetDetectMap( + controlnet_init_image:string, + _module:string, + processor_res:number, + threshold_a:number, + threshold_b:number + ) { + try { + const payload = { + controlnet_module: _module, + controlnet_input_images: [controlnet_init_image], + controlnet_processor_res: processor_res, + controlnet_threshold_a: threshold_a, + controlnet_threshold_b: threshold_b, + } + const full_url = `${g_sd_url}/controlnet/detect` + + const response_data = await api.requestPost(full_url, payload) + + // update the mask preview with the new detectMap + if (response_data['images'].length === 0) { + app.showAlert(response_data['info']) + } + return response_data['images'][0] + } catch (e) { + console.warn('requestControlNetDetectMap(): ', _module, e) + } + } + + + async previewAnnotator() { + const index = this.props.index + try { + const storeData = this.props.appState.controlNetUnitData[index]; + + const controlnet_init_image = storeData.input_image + + const _module = storeData.module || 'none'; + const processor_res = storeData.processor_res + const threshold_a = storeData.threshold_a + const threshold_b = storeData.threshold_b + + if (!controlnet_init_image) { + const error = 'ControlNet initial image is empty' + app.showAlert(error) + throw error + } + if (!_module || _module === 'none') { + const error = 'select a valid controlnet module (preprocessor)' + app.showAlert(error) + throw error + } + + const detect_map = await this.requestControlNetDetectMap( + controlnet_init_image, + _module, + processor_res, + threshold_a, + threshold_b + ) + + const rgb_detect_map_url = + await io.convertBlackAndWhiteImageToRGBChannels3(detect_map) + const rgb_detect_map = general.base64UrlToBase64(rgb_detect_map_url) + g_generation_session.controlNetMask[index] = rgb_detect_map + + storeData.mask = rgb_detect_map + + } catch (e) { + console.warn('PreviewAnnotator click(): index: ', index, e) + } + } + async toCanvas() { + if ( + g_generation_session.control_net_preview_selection_info && + g_generation_session.controlNetMask[this.props.index] + ) { + const selection_info = + g_generation_session.control_net_preview_selection_info + const layer = await io.IO.base64ToLayer( + g_generation_session.controlNetMask[this.props.index], + 'ControlNet Mask.png', + selection_info.left, + selection_info.top, + selection_info.width, + selection_info.height + ) + } else { + // await note.Notification.inactiveSelectionArea() + app.showAlert('Mask Image is not available') + } + } + async toControlNetInitImage() { + const preview_result_base64 = g_generation_session.controlNetMask[this.props.index] + g_generation_session.controlNetImage[this.props.index] = preview_result_base64 + g_generation_session.control_net_selection_info = + g_generation_session.control_net_preview_selection_info + + const rgb_detect_map_url = + await io.convertBlackAndWhiteImageToRGBChannels3( + preview_result_base64 + ) + + // g_generation_session.controlNetMask[index] = rgb_detect_map + + // html_manip.setControlImageSrc(rgb_detect_map_url, this.props.index) + const storeData = this.props.appState.controlNetUnitData[this.props.index]; + + storeData.input_image = storeData.mask + } + async previewAnnotatorFromCanvas() { + try { + const storeData = this.props.appState.controlNetUnitData[this.props.index]; + const _module = storeData.module || 'none'; + + const width = html_manip.getWidth() + const height = html_manip.getHeight() + const selectionInfo = await psapi.getSelectionInfoExe() + g_generation_session.control_net_preview_selection_info = selectionInfo + const base64 = await io.IO.getSelectionFromCanvasAsBase64Interface_New( + width, + height, + selectionInfo, + true + ) + + if (!_module || _module === 'none') { + const error = 'select a valid controlnet module (preprocessor)' + app.showAlert(error) + throw error + } + + const processor_res = storeData.processor_res + const threshold_a = storeData.threshold_a + const threshold_b = storeData.threshold_b + + const detect_map = await this.requestControlNetDetectMap( + base64, + _module, + processor_res, + threshold_a, + threshold_b + ) + + const rgb_detect_map_url = + await io.convertBlackAndWhiteImageToRGBChannels3(detect_map) + g_generation_session.controlNetMask[this.props.index] = detect_map + + storeData.mask = general.base64UrlToBase64(rgb_detect_map_url) + } catch (e) { + console.warn('PreviewAnnotator click(): index: ', this.props.index, e) + } + } render() { const storeData = this.props.appState.controlNetUnitData[this.props.index]; const pd = this.props.appState.preprocessorDetail[storeData.module] || {}; @@ -158,19 +313,26 @@ export default class ControlNetUnit extends React.Component<{ index: number, app className="imgContainer controlNetImaageContainer" >
- + + /> + + + + +
From 00492a6e20a6f1489c55ef29745e13b56804a244 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Fri, 9 Jun 2023 05:16:56 +0300 Subject: [PATCH 011/143] set lowvram to true by default --- typescripts/controlnet/store.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typescripts/controlnet/store.ts b/typescripts/controlnet/store.ts index d752be10..20cc679e 100644 --- a/typescripts/controlnet/store.ts +++ b/typescripts/controlnet/store.ts @@ -9,7 +9,7 @@ export const DefaultControlNetUnitData = { model: "", weight: 1.0, resize_mode: "Scale to Fit (Inner Fit)", - lowvram: false, + lowvram: true, processor_res: 512, threshold_a: 0, threshold_b: 0, From b3434e7dbb96e6278183068f757b81662d66138e Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Fri, 9 Jun 2023 05:18:06 +0300 Subject: [PATCH 012/143] fix: ultimate sd upscale's upscaler menu is empty --- .../ultimate_sd_upscaler.tsx | 38 +++++++++++++++---- typescripts/util/elements.tsx | 3 -- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/typescripts/ultimate_sd_upscaler/ultimate_sd_upscaler.tsx b/typescripts/ultimate_sd_upscaler/ultimate_sd_upscaler.tsx index b33dd8a6..0fe6e4c8 100644 --- a/typescripts/ultimate_sd_upscaler/ultimate_sd_upscaler.tsx +++ b/typescripts/ultimate_sd_upscaler/ultimate_sd_upscaler.tsx @@ -7,7 +7,8 @@ import { Provider, inject, observer } from 'mobx-react' import { SliderType, SpMenu, SpSliderWithLabel } from '../util/elements' import { ui_config } from './config' -import { api, sdapi } from '../util/oldSystem' +import { api } from '../util/oldSystem' + const { requestGet } = api declare let g_sd_url: string @@ -66,6 +67,23 @@ export const script_args_ordered = [ 'custom_scale', ] +//for some reason oldSystem.sdapi is empty {}, could be caused by a circular dependency +//so I've copy pasted requestGetUpscalers() to the ultimate sd upscaler module, as a temporary solution +async function requestGetUpscalers() { + console.log('requestGetUpscalers: ') + let json = [] + const full_url = `${g_sd_url}/sdapi/v1/upscalers` + try { + let request = await fetch(full_url) + json = await request.json() + console.log('upscalers json:') + console.dir(json) + } catch (e) { + console.warn(`issues requesting from ${full_url}`, e) + } + return json +} + class UltimateSDUpscalerStore { data: UltimateSDUpscalerData @@ -141,12 +159,18 @@ export class UltimateSDUpscalerForm extends React.Component<{ } async getUpscalers() { - const sd_upscalers_json = await sdapi.requestGetUpscalers() - const sd_upscalers = sd_upscalers_json.map( - (upscaler: any) => upscaler.name - ) - this.setState({ sd_upscalers: sd_upscalers }) - return sd_upscalers + try{ + + const sd_upscalers_json = await requestGetUpscalers() + const sd_upscalers = sd_upscalers_json.map( + (upscaler: any) => upscaler.name + ) + this.setState({ sd_upscalers: sd_upscalers }) + return sd_upscalers + } + catch(e){ + console.warn("ultimate sd upscaler getUpscalers(): ",e) + } } handleRefresh = async () => { diff --git a/typescripts/util/elements.tsx b/typescripts/util/elements.tsx index 5cfcbfd4..e4a22eab 100644 --- a/typescripts/util/elements.tsx +++ b/typescripts/util/elements.tsx @@ -2,9 +2,6 @@ import React, { CSSProperties, ReactEventHandler, useState } from 'react' // import ReactDOM from 'react-dom' import ReactDOM from 'react-dom/client' // import { versions } from 'uxp' - - - export { ReactComponent as MoveToCanvasSvg } from '../../icon/move_to_canvas.svg'; export { ReactComponent as PenSvg } from '../../icon/pen.svg'; export { ReactComponent as PreviewSvg } from '../../icon/preview.svg'; From df3a22c0f75cf62911abc8692990428809bc3751 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Fri, 9 Jun 2023 06:52:53 +0300 Subject: [PATCH 013/143] refix: allow controlNet to be used with other alwayson_scripts --- typescripts/controlnet/entry.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/typescripts/controlnet/entry.ts b/typescripts/controlnet/entry.ts index a247e247..6007ad20 100644 --- a/typescripts/controlnet/entry.ts +++ b/typescripts/controlnet/entry.ts @@ -100,10 +100,12 @@ function mapPluginSettingsToControlNet(plugin_settings: any) { override_settings: {}, override_settings_restore_afterwards: true, alwayson_scripts: { + ...(ps?.alwayson_scripts || {}), controlnet: { args: controlnet_units, }, }, + } return controlnet_payload From 256ccc83b9cd7c0afa2169360b116e55cffe9fcd Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Fri, 9 Jun 2023 07:02:37 +0300 Subject: [PATCH 014/143] refix: select the current vae when retrieving vae list --- typescripts/main/main.tsx | 73 +++++++++++++++++++++++++++------------ 1 file changed, 51 insertions(+), 22 deletions(-) diff --git a/typescripts/main/main.tsx b/typescripts/main/main.tsx index 40f2dd9c..637ed688 100644 --- a/typescripts/main/main.tsx +++ b/typescripts/main/main.tsx @@ -6,6 +6,8 @@ import { SpMenu } from '../util/elements' import { api, python_replacement } from '../util/oldSystem' const { getExtensionUrl } = python_replacement + +declare let g_sd_url: string // class SDStore extends AStore { // constructor(data: any) { // super(data) @@ -23,9 +25,10 @@ const { getExtensionUrl } = python_replacement const default_values: any = { vae_model_list: [], + current_vae: '', } -export const sd_store = new AStore(default_values) +export const store = new AStore(default_values) @observer export class VAEComponent extends React.Component<{ @@ -40,41 +43,67 @@ export class VAEComponent extends React.Component<{ console.warn('changeVAEModel: vae_model: ', vae_model, e) } } + handleRefresh() { + populateVAE() + } render(): React.ReactNode { return ( - { - // script_store.setSelectedScript(value.item) - console.log('onChange value: ', value) - this.changeVAEModel(value.item) - }} - > +
+ { + // script_store.setSelectedScript(value.item) + console.log('onChange value: ', value) + this.changeVAEModel(value.item) + }} + > + +
) } } const vaeContainerNode = document.getElementById('settingsVAEContainer')! const vaeRoot = ReactDOM.createRoot(vaeContainerNode) -let vae_model_list = ['None'] -declare let g_sd_url: string -async function populateVAE() { - const extension_url = getExtensionUrl() +async function requestGetVAE() { + const full_url = `${g_sd_url}/sdapi/v1/options` - const full_url = `${extension_url}/vae/list` + const options = await api.requestGet(full_url) + return options?.sd_vae +} +export async function populateVAE() { + try{ + const extension_url = getExtensionUrl() + + const full_url = `${extension_url}/vae/list` const vae_models = await api.requestGet(full_url) + console.log('populateVAE vae_models: ', vae_models) - // vae_model_list = vae_models - sd_store.updateProperty('vae_model_list', vae_models) + store.updateProperty('vae_model_list', vae_models) + + const current_vae = await requestGetVAE() + if (current_vae && vae_models.includes(current_vae)) { + store.updateProperty('current_vae', current_vae) + } +}catch(e){ + console.warn("populateVAE():", e) +} } -populateVAE() + vaeRoot.render( From 84a51e2c918dc4c2a11a7e4422a9c70455a38fe0 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Fri, 9 Jun 2023 07:03:58 +0300 Subject: [PATCH 015/143] fix: vae dropdown menu will crash on request failure --- typescripts/main/main.tsx | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/typescripts/main/main.tsx b/typescripts/main/main.tsx index 637ed688..dd709766 100644 --- a/typescripts/main/main.tsx +++ b/typescripts/main/main.tsx @@ -77,7 +77,6 @@ export class VAEComponent extends React.Component<{ const vaeContainerNode = document.getElementById('settingsVAEContainer')! const vaeRoot = ReactDOM.createRoot(vaeContainerNode) - async function requestGetVAE() { const full_url = `${g_sd_url}/sdapi/v1/options` @@ -85,26 +84,24 @@ async function requestGetVAE() { return options?.sd_vae } export async function populateVAE() { - try{ - + try { const extension_url = getExtensionUrl() - - const full_url = `${extension_url}/vae/list` - const vae_models = await api.requestGet(full_url) - console.log('populateVAE vae_models: ', vae_models) - store.updateProperty('vae_model_list', vae_models) + const full_url = `${extension_url}/vae/list` + const vae_models = (await api.requestGet(full_url)) || [] + + console.log('populateVAE vae_models: ', vae_models) + store.updateProperty('vae_model_list', vae_models) - const current_vae = await requestGetVAE() - if (current_vae && vae_models.includes(current_vae)) { - store.updateProperty('current_vae', current_vae) + const current_vae = await requestGetVAE() + if (current_vae && vae_models.includes(current_vae)) { + store.updateProperty('current_vae', current_vae) + } + } catch (e) { + console.warn('populateVAE():', e) } -}catch(e){ - console.warn("populateVAE():", e) -} } - vaeRoot.render( From 1a050aa5c4a1c6ab7cd69bdf3ecbca4ad9080684 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Fri, 9 Jun 2023 22:23:13 +0300 Subject: [PATCH 016/143] log to a file --- index.js | 108 +++++++---- package-lock.json | 323 ++++++++++++++++++++++++++++++--- package.json | 3 +- sdapi_py_re.js | 2 +- tsconfig.json | 2 +- typescripts/entry.ts | 16 +- typescripts/util/logger.ts | 7 + typescripts/util/oldSystem.tsx | 3 +- webpack.config.js | 6 + 9 files changed, 409 insertions(+), 61 deletions(-) create mode 100644 typescripts/util/logger.ts diff --git a/index.js b/index.js index e93fb31c..f29f4a4f 100644 --- a/index.js +++ b/index.js @@ -1,36 +1,3 @@ -const io = require('./utility/io') -const log = console.log -const warn = console.warn -const error = console.error -const should_log = false -if (should_log) { - window.addEventListener('error', (event) => { - const [a, b, c, d, e] = [1, 2, 3, 4, 5] - console.log(`message: ${a}`) - console.log(`source: ${b}`) - console.log(`lineno: ${c}`) - console.log(`colno: ${d}`) - console.log(`error: ${e}`) - }) - - console.log = (data, ...optional_param) => { - log(data, ...optional_param) - io.IOLog.saveLogToFile({ data, ...optional_param }, 'log.txt') - } - console.warn = (data, ...optional_param) => { - try { - warn(data, ...optional_param) - io.IOLog.saveLogToFile({ data, ...optional_param }, 'warn.txt') - } catch (e) { - warn('error while logging: ') - warn(e) - } - } - console.error = (data, ...optional_param) => { - error(data, ...optional_param) - io.IOLog.saveLogToFile({ data, ...optional_param }, 'error.txt') - } -} // import {helloHelper} from 'helper.js' // helloHelper2 = require('./helper.js') @@ -86,7 +53,80 @@ const lexica_tab = require('./utility/tab/lexica_tab') const share_tab = require('./utility/tab/share_tab') // const ultimate_sd_upscaler = require('./ultimate_sd_upscaler/dist/ultimate_sd_upscaler') // const ultimate_sd_upscaler_script = require('./ultimate_sd_upscaler/dist/ultimate_sd_upscaler.bundle') -const { scripts, main, after_detailer_script, control_net } = require('./typescripts/dist/bundle') +const { scripts, main, after_detailer_script, control_net, logger } = require('./typescripts/dist/bundle') + + +const io = require('./utility/io') +const _log = console.log +const _warn = console.warn +const _error = console.error +const should_log = true +if (should_log) { + window.addEventListener('error', (event) => { + const [a, b, c, d, e] = [1, 2, 3, 4, 5] + console.log(`message: ${a}`) + console.log(`source: ${b}`) + console.log(`lineno: ${c}`) + console.log(`colno: ${d}`) + console.log(`error: ${e}`) + }) + + + console.log = (data, ...optional_param) => { + try { + _log(data, ...optional_param) + + // const error = new Error({ data, ...optional_param }); + const formattedOutput = logger.formateLog(data,...optional_param) + io.IOLog.saveLogToFile({log:formattedOutput }, 'log.txt') + + } catch (e) { + _warn('error while logging: ') + _warn(e) + } + + } + + console.warn = (data, ...optional_param) => { + try { + _warn(data, ...optional_param); + const error = new Error(); + const stackTrace = error.stack; + const formattedOutput = logger.formateLog(data,...optional_param) + io.IOLog.saveLogToFile({ warning: formattedOutput,stackTrace }, 'log.txt'); + } catch (e) { + _warn('error while logging: '); + _warn(e); + } + } + + + console.error = (data, ...optional_param) => { + try { + _error(data, ...optional_param); + const error = new Error(); + const stackTrace = error.stack; + const formattedOutput = logger.formateLog(data,...optional_param) + io.IOLog.saveLogToFile({ error: formattedOutput,stackTrace }, 'log.txt'); + } catch (e) { + _error('error while logging: '); + _error(e); + } + + } +} + + + + + + + + + + + + // const ultimate_sd_upscaler_script_test = require('./ultimate_sd_upscaler/dist/main') diff --git a/package-lock.json b/package-lock.json index 2118e5fb..93f8b7f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,8 @@ "mobx": "^6.9.0", "mobx-react": "^7.6.0", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "util": "^0.12.5" }, "devDependencies": { "@babel/core": "^7.21.8", @@ -3464,6 +3465,17 @@ "node": ">=8.0.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/avvio": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.2.0.tgz", @@ -3794,6 +3806,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -5145,6 +5169,14 @@ "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash." }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -5170,20 +5202,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -5210,6 +5228,20 @@ "node": ">=12" } }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", @@ -5312,6 +5344,17 @@ "node": ">=0.6.0" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -5337,6 +5380,42 @@ "node": ">=4" } }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", @@ -5499,6 +5578,21 @@ "node": ">= 0.10" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -5522,6 +5616,17 @@ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", @@ -5546,6 +5651,20 @@ "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -5639,6 +5758,24 @@ "resolved": "https://registry.npmjs.org/is-relative-path/-/is-relative-path-1.0.2.tgz", "integrity": "sha512-i1h+y50g+0hRbBD+dbnInl3JlJ702aar58snAeX+MxBAPvzXGej7sYoPMhlnykabt0ZzCJNBEyzMlekuQZN7fA==" }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -8892,6 +9029,18 @@ "pako": "^1.0.5" } }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -9203,6 +9352,25 @@ "node": ">= 8" } }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", @@ -11735,6 +11903,11 @@ "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" + }, "avvio": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.2.0.tgz", @@ -11958,6 +12131,15 @@ } } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -12938,6 +13120,14 @@ "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -12957,13 +13147,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -12984,6 +13167,17 @@ "node-source-walk": "^5.0.1" } }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, "get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", @@ -13062,6 +13256,14 @@ "minimist": "^1.2.5" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -13081,6 +13283,24 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, "icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", @@ -13193,6 +13413,15 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -13213,6 +13442,11 @@ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, "is-core-module": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", @@ -13231,6 +13465,14 @@ "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -13297,6 +13539,18 @@ "resolved": "https://registry.npmjs.org/is-relative-path/-/is-relative-path-1.0.2.tgz", "integrity": "sha512-i1h+y50g+0hRbBD+dbnInl3JlJ702aar58snAeX+MxBAPvzXGej7sYoPMhlnykabt0ZzCJNBEyzMlekuQZN7fA==" }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, "is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -15617,6 +15871,18 @@ "pako": "^1.0.5" } }, + "util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -15820,6 +16086,19 @@ "isexe": "^2.0.0" } }, + "which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, "wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", diff --git a/package.json b/package.json index 0445285b..61564f5f 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,8 @@ "mobx": "^6.9.0", "mobx-react": "^7.6.0", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "util": "^0.12.5" }, "main": "index.js", "directories": { diff --git a/sdapi_py_re.js b/sdapi_py_re.js index b55bcf00..20796027 100644 --- a/sdapi_py_re.js +++ b/sdapi_py_re.js @@ -64,7 +64,7 @@ async function requestProgress() { const full_url = `${g_sd_url}/sdapi/v1/progress?skip_current_image=false` let request = await fetch(full_url) json = await request.json() - console.log('progress json:', json) + // console.log('progress json:', json) return json } catch (e) { diff --git a/tsconfig.json b/tsconfig.json index bdd1703f..7d9fbc6c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -53,7 +53,7 @@ // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ // "declarationMap": true, /* Create sourcemaps for d.ts files. */ // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ - // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + "sourceMap": true, /* Create source map files for emitted JavaScript files. */ // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ "outDir": "./typescripts/dist", /* Specify an output folder for all emitted files. */ diff --git a/typescripts/entry.ts b/typescripts/entry.ts index ddd63860..c99ebc01 100644 --- a/typescripts/entry.ts +++ b/typescripts/entry.ts @@ -2,4 +2,18 @@ export * as control_net from './controlnet/entry' export * as after_detailer_script from './after_detailer/after_detailer' export * as ultimate_sd_upscaler from './ultimate_sd_upscaler/ultimate_sd_upscaler' export * as scripts from './ultimate_sd_upscaler/scripts' -export * as main from './main/main' \ No newline at end of file +export * as main from './main/main' +export * as logger from './util/logger' + + + + + + + + + + + + + diff --git a/typescripts/util/logger.ts b/typescripts/util/logger.ts new file mode 100644 index 00000000..154ce3e6 --- /dev/null +++ b/typescripts/util/logger.ts @@ -0,0 +1,7 @@ + +import {format} from 'util'; +export function formateLog(data: any, ...optional_param: any[]){ + + const formattedOutput = format(data, ...optional_param); + return formattedOutput +} \ No newline at end of file diff --git a/typescripts/util/oldSystem.tsx b/typescripts/util/oldSystem.tsx index 2f185a40..6b58e08c 100644 --- a/typescripts/util/oldSystem.tsx +++ b/typescripts/util/oldSystem.tsx @@ -13,7 +13,7 @@ const sdapi = req('./sdapi_py_re') const html_manip = req('./utility/html_manip') const psapi = req('./psapi') const general = req('./utility/general') - +const io = req('./utility/io') export { selection, note, @@ -26,4 +26,5 @@ export { html_manip, psapi, general, + io } \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js index d2bfb08c..535dcc3d 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -15,6 +15,7 @@ module.exports = { mode: 'development', // mode: 'production', devtool: 'inline-source-map', // won't work on XD due to lack of eval + // devtool: 'source-map', externals: { uxp: 'commonjs2 uxp', photoshop: 'commonjs2 photoshop', @@ -22,6 +23,11 @@ module.exports = { }, resolve: { extensions: ['.tsx', '.ts', '.js', '.jsx'], + + fallback: { + "util": require.resolve("util/") + } + }, module: { rules: [ From 3726305db627006862a1cbecb195758b8479bfcd Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Sat, 10 Jun 2023 08:15:15 +0300 Subject: [PATCH 017/143] fix missing type declaration --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 7d9fbc6c..0a6693f9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -31,7 +31,7 @@ // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ - "typeRoots": ["./*/types","./types", "./node_modules/@types"], /* Specify multiple folders that act like './node_modules/@types'. */ + "typeRoots": ["./*/@types","./*/types","./types", "./node_modules/@types"], /* Specify multiple folders that act like './node_modules/@types'. */ // "types": [], /* Specify type package names to be included without being referenced in a source file. */ // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ From 7e98fe0addc7f26beaa26111ea25751fca2e1841 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Sat, 10 Jun 2023 12:16:50 +0300 Subject: [PATCH 018/143] formate project files with prettier --- .prettierignore | 8 +- index.html | 1 - index.js | 73 +- sdapi_py_re.js | 37 +- typescripts/@types/custom.d.ts | 10 +- typescripts/@types/sdapi_py_re.d.ts | 5 +- typescripts/@types/uxp.d.ts | 6 +- typescripts/after_detailer/after_detailer.tsx | 6 +- typescripts/after_detailer/config.ts | 2 +- .../after_detailer/style/after_detailer.css | 2 +- typescripts/controlnet/ControlNetTab.tsx | 189 +++-- typescripts/controlnet/ControlNetUnit.tsx | 753 +++++++++++------- typescripts/controlnet/entry.ts | 49 +- typescripts/controlnet/main.tsx | 13 +- typescripts/controlnet/store.ts | 76 +- typescripts/controlnet/util.tsx | 34 +- typescripts/entry.ts | 13 - typescripts/main/astore.ts | 2 +- .../ultimate_sd_upscaler.tsx | 16 +- typescripts/util/elements.tsx | 145 ++-- typescripts/util/logger.ts | 10 +- typescripts/util/oldSystem.tsx | 6 +- utility/presets/preset.js | 4 +- webpack.config.js | 11 +- 24 files changed, 883 insertions(+), 588 deletions(-) diff --git a/.prettierignore b/.prettierignore index ac336ae1..37b9bf05 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,3 +1,9 @@ server/python_server/output/* *.md -manifest.json \ No newline at end of file +manifest.json +jimp/** +server_env/** +.github\workflows\wiki-sync-action.yml +**/dist +.github\workflows\wiki-sync-action.yml +tsconfig.json \ No newline at end of file diff --git a/index.html b/index.html index cef182f2..5efd63bf 100644 --- a/index.html +++ b/index.html @@ -991,7 +991,6 @@
-
{ try { _log(data, ...optional_param) - + // const error = new Error({ data, ...optional_param }); - const formattedOutput = logger.formateLog(data,...optional_param) - io.IOLog.saveLogToFile({log:formattedOutput }, 'log.txt') - - } catch (e) { + const formattedOutput = logger.formateLog(data, ...optional_param) + io.IOLog.saveLogToFile({ log: formattedOutput }, 'log.txt') + } catch (e) { _warn('error while logging: ') _warn(e) } - } console.warn = (data, ...optional_param) => { try { - _warn(data, ...optional_param); - const error = new Error(); - const stackTrace = error.stack; - const formattedOutput = logger.formateLog(data,...optional_param) - io.IOLog.saveLogToFile({ warning: formattedOutput,stackTrace }, 'log.txt'); + _warn(data, ...optional_param) + const error = new Error() + const stackTrace = error.stack + const formattedOutput = logger.formateLog(data, ...optional_param) + io.IOLog.saveLogToFile( + { warning: formattedOutput, stackTrace }, + 'log.txt' + ) } catch (e) { - _warn('error while logging: '); - _warn(e); + _warn('error while logging: ') + _warn(e) } } - - + console.error = (data, ...optional_param) => { try { - _error(data, ...optional_param); - const error = new Error(); - const stackTrace = error.stack; - const formattedOutput = logger.formateLog(data,...optional_param) - io.IOLog.saveLogToFile({ error: formattedOutput,stackTrace }, 'log.txt'); + _error(data, ...optional_param) + const error = new Error() + const stackTrace = error.stack + const formattedOutput = logger.formateLog(data, ...optional_param) + io.IOLog.saveLogToFile( + { error: formattedOutput, stackTrace }, + 'log.txt' + ) } catch (e) { - _error('error while logging: '); - _error(e); + _error('error while logging: ') + _error(e) } - } } - - - - - - - - - - - - // const ultimate_sd_upscaler_script_test = require('./ultimate_sd_upscaler/dist/main') // const { @@ -4817,4 +4810,4 @@ Array.from(document.querySelectorAll('.rbSubTab')).forEach((rb) => { // this.shadowRoot.innerHTML = '

Hello World!

' // } // } -// customElements.define('custom-element', CustomElement) \ No newline at end of file +// customElements.define('custom-element', CustomElement) diff --git a/sdapi_py_re.js b/sdapi_py_re.js index 20796027..8b96c913 100644 --- a/sdapi_py_re.js +++ b/sdapi_py_re.js @@ -4,11 +4,8 @@ const { getExtensionType } = require('./utility/html_manip') const py_re = require('./utility/sdapi/python_replacement') const Enum = require('./enum') const { control_net } = require('./typescripts/dist/bundle') -const { - mapPluginSettingsToControlNet, - getEnableControlNet, - getModuleDetail, -} = control_net +const { mapPluginSettingsToControlNet, getEnableControlNet, getModuleDetail } = + control_net const api = require('./utility/api') //javascript plugin can't read images from local directory so we send a request to local server to read the image file and send it back to plugin as image string base64 @@ -483,13 +480,13 @@ async function requestControlNetTxt2Img(plugin_settings) { app.showAlert('you need to select a valid ControlNet Module') throw 'you need to select a valid ControlNet Module' } - + if ( - !control_net_settings['controlnet_units'][index]['model'] && - !getModuleDetail()[ - control_net_settings['controlnet_units'][index]['module'] - ].model_free - || control_net_settings['controlnet_units'][index]['model'] === 'none' + (!control_net_settings['controlnet_units'][index]['model'] && + !getModuleDetail()[ + control_net_settings['controlnet_units'][index]['module'] + ].model_free) || + control_net_settings['controlnet_units'][index]['model'] === 'none' ) { app.showAlert('you need to select a valid ControlNet Model') throw 'you need to select a valid ControlNet Model' @@ -525,10 +522,7 @@ async function requestControlNetTxt2Img(plugin_settings) { mask_index >= numberOfAnnotations ) continue - control_net.setControlMaskSrc( - base64_mask[mask_index], - index - ) + control_net.setControlMaskSrc(base64_mask[mask_index], index) g_generation_session.controlNetMask[index] = base64_mask[mask_index] mask_index++ } @@ -569,10 +563,10 @@ async function requestControlNetImg2Img(plugin_settings) { throw 'you need to select a valid ControlNet Module' } if ( - !control_net_settings['controlnet_units'][index]['model'] && - !getModuleDetail()[ - control_net_settings['controlnet_units'][index]['module'] - ].model_free || + (!control_net_settings['controlnet_units'][index]['model'] && + !getModuleDetail()[ + control_net_settings['controlnet_units'][index]['module'] + ].model_free) || control_net_settings['controlnet_units'][index]['model'] === 'none' ) { app.showAlert('you need to select a valid ControlNet Model') @@ -618,10 +612,7 @@ async function requestControlNetImg2Img(plugin_settings) { mask_index >= numberOfAnnotations ) continue - control_net.setControlMaskSrc( - base64_mask[mask_index], - index - ) + control_net.setControlMaskSrc(base64_mask[mask_index], index) g_generation_session.controlNetMask[index] = base64_mask[mask_index] mask_index++ } diff --git a/typescripts/@types/custom.d.ts b/typescripts/@types/custom.d.ts index ad8db2e1..1028c742 100644 --- a/typescripts/@types/custom.d.ts +++ b/typescripts/@types/custom.d.ts @@ -1,6 +1,8 @@ declare module '*.svg' { - import React = require('react'); - export const ReactComponent: React.FunctionComponent>; - const src: string; - export default src; + import React = require('react') + export const ReactComponent: React.FunctionComponent< + React.SVGProps + > + const src: string + export default src } diff --git a/typescripts/@types/sdapi_py_re.d.ts b/typescripts/@types/sdapi_py_re.d.ts index 337cdc78..3f901e5e 100644 --- a/typescripts/@types/sdapi_py_re.d.ts +++ b/typescripts/@types/sdapi_py_re.d.ts @@ -1,5 +1,4 @@ - declare module 'sdapi_py_re' { - const exports: any; - export = exports; + const exports: any + export = exports } diff --git a/typescripts/@types/uxp.d.ts b/typescripts/@types/uxp.d.ts index 3d654659..151d5501 100644 --- a/typescripts/@types/uxp.d.ts +++ b/typescripts/@types/uxp.d.ts @@ -1,5 +1,5 @@ declare module 'uxp' { - // Add type declarations for the uxp module here - export const storage: any; - export const versions: any; + // Add type declarations for the uxp module here + export const storage: any + export const versions: any } diff --git a/typescripts/after_detailer/after_detailer.tsx b/typescripts/after_detailer/after_detailer.tsx index 8098936f..12680b22 100644 --- a/typescripts/after_detailer/after_detailer.tsx +++ b/typescripts/after_detailer/after_detailer.tsx @@ -4,11 +4,7 @@ import ReactDOM from 'react-dom/client' // import { action, makeAutoObservable, reaction, toJS } from 'mobx' import { observer } from 'mobx-react' -import { - SliderType, - SpMenu, - SpSliderWithLabel, -} from '../util/elements' +import { SliderType, SpMenu, SpSliderWithLabel } from '../util/elements' // import * as sdapi from '../../sdapi_py_re' import { api } from '../util/oldSystem' import { AStore } from '../main/astore' diff --git a/typescripts/after_detailer/config.ts b/typescripts/after_detailer/config.ts index 5fd2bbdb..9175e4b0 100644 --- a/typescripts/after_detailer/config.ts +++ b/typescripts/after_detailer/config.ts @@ -9,7 +9,7 @@ export const model_list = [ 'person_yolov8n-seg.pt', 'person_yolov8s-seg.pt', - 'None' + 'None', ] export let ui_config = { ad_model: { diff --git a/typescripts/after_detailer/style/after_detailer.css b/typescripts/after_detailer/style/after_detailer.css index 6a17902c..89e93adb 100644 --- a/typescripts/after_detailer/style/after_detailer.css +++ b/typescripts/after_detailer/style/after_detailer.css @@ -25,4 +25,4 @@ .triangle { background-color: transparent; -} \ No newline at end of file +} diff --git a/typescripts/controlnet/ControlNetTab.tsx b/typescripts/controlnet/ControlNetTab.tsx index 8185b7f2..446d5a40 100644 --- a/typescripts/controlnet/ControlNetTab.tsx +++ b/typescripts/controlnet/ControlNetTab.tsx @@ -1,56 +1,81 @@ -import { observer } from 'mobx-react'; -import React from 'react'; -import ControlNetUnit from './ControlNetUnit'; -import { store as ControlNetStore } from './main'; -import { DefaultControlNetUnitData } from './store'; -import { Enum, controlnet_preset, note, preset, selection } from '../util/oldSystem'; -import {SpMenuComponent} from '../util/elements'; +import { observer } from 'mobx-react' +import React from 'react' +import ControlNetUnit from './ControlNetUnit' +import { store as ControlNetStore } from './main' +import { DefaultControlNetUnitData } from './store' +import { + Enum, + controlnet_preset, + note, + preset, + selection, +} from '../util/oldSystem' +import { SpMenuComponent } from '../util/elements' -let g_controlnet_presets: any; -declare const g_generation_session: any; +let g_controlnet_presets: any +declare const g_generation_session: any @observer -class ControlNetTab extends React.Component<{ appState: typeof ControlNetStore }>{ +class ControlNetTab extends React.Component<{ + appState: typeof ControlNetStore +}> { state = { maxControlNet: 0, - presetMenuChildren: [] + presetMenuChildren: [], } // private presetMenuChildren: JSX.Element[] = [] onPresetMenuChange(evt: any) { - const preset_index = evt.target.selectedIndex const preset_name = evt.target.options[preset_index].textContent ControlNetStore.controlNetUnitData.forEach((dataitem, index) => { const presetData = g_controlnet_presets[preset_name][index] || {} - dataitem.enabled = presetData.enabled || DefaultControlNetUnitData.enabled - dataitem.input_image = presetData.input_image || DefaultControlNetUnitData.input_image + dataitem.enabled = + presetData.enabled || DefaultControlNetUnitData.enabled + dataitem.input_image = + presetData.input_image || DefaultControlNetUnitData.input_image dataitem.mask = presetData.mask || DefaultControlNetUnitData.mask - dataitem.module = presetData.module || DefaultControlNetUnitData.module + dataitem.module = + presetData.module || DefaultControlNetUnitData.module dataitem.model = presetData.model || DefaultControlNetUnitData.model - dataitem.weight = presetData.weight || DefaultControlNetUnitData.weight - dataitem.resize_mode = presetData.resize_mode || DefaultControlNetUnitData.resize_mode - dataitem.lowvram = presetData.lowvram || DefaultControlNetUnitData.lowvram - dataitem.processor_res = presetData.processor_res || DefaultControlNetUnitData.processor_res - dataitem.threshold_a = presetData.threshold_a || DefaultControlNetUnitData.threshold_a - dataitem.threshold_b = presetData.threshold_b || DefaultControlNetUnitData.threshold_b - dataitem.guidance_start = presetData.guidance_start || DefaultControlNetUnitData.guidance_start - dataitem.guidance_end = presetData.guidance_end || DefaultControlNetUnitData.guidance_end - dataitem.guessmode = presetData.guessmode || DefaultControlNetUnitData.guessmode + dataitem.weight = + presetData.weight || DefaultControlNetUnitData.weight + dataitem.resize_mode = + presetData.resize_mode || DefaultControlNetUnitData.resize_mode + dataitem.lowvram = + presetData.lowvram || DefaultControlNetUnitData.lowvram + dataitem.processor_res = + presetData.processor_res || + DefaultControlNetUnitData.processor_res + dataitem.threshold_a = + presetData.threshold_a || DefaultControlNetUnitData.threshold_a + dataitem.threshold_b = + presetData.threshold_b || DefaultControlNetUnitData.threshold_b + dataitem.guidance_start = + presetData.guidance_start || + DefaultControlNetUnitData.guidance_start + dataitem.guidance_end = + presetData.guidance_end || + DefaultControlNetUnitData.guidance_end + dataitem.guessmode = + presetData.guessmode || DefaultControlNetUnitData.guessmode - dataitem.control_mode = presetData.control_mode || DefaultControlNetUnitData.control_mode - dataitem.pixel_perfect = presetData.pixel_perfect || DefaultControlNetUnitData.pixel_perfect + dataitem.control_mode = + presetData.control_mode || + DefaultControlNetUnitData.control_mode + dataitem.pixel_perfect = + presetData.pixel_perfect || + DefaultControlNetUnitData.pixel_perfect }) } - // function to update presetMenuChildren - updatePresetMenuChildren(newChildren:any) { - this.setState({ presetMenuChildren: newChildren }); - } + // function to update presetMenuChildren + updatePresetMenuChildren(newChildren: any) { + this.setState({ presetMenuChildren: newChildren }) + } async updatePresetMenuEvent() { - const custom_presets = await preset.getAllCustomPresetsSettings( Enum.PresetTypeEnum['ControlNetPreset'] ) @@ -63,11 +88,26 @@ class ControlNetTab extends React.Component<{ appState: typeof ControlNetStore } const presets_names = Object.keys(g_controlnet_presets) // debugger; - const presetMenuChildren = presets_names.map(preset_name => { - if (preset_name == "Select CtrlNet Preset") - return {preset_name} + const presetMenuChildren = presets_names.map((preset_name) => { + if (preset_name == 'Select CtrlNet Preset') + return ( + + {preset_name} + + ) else - return {preset_name} + return ( + + {preset_name} + + ) }) this.updatePresetMenuChildren(presetMenuChildren) } @@ -75,7 +115,8 @@ class ControlNetTab extends React.Component<{ appState: typeof ControlNetStore } async onSetAllControlImage() { const selectionInfo = await selection.Selection.getSelectionInfoExe() if (selectionInfo) { - const base64_image = await g_generation_session.setControlNetImageHelper() + const base64_image = + await g_generation_session.setControlNetImageHelper() ControlNetStore.controlNetUnitData.forEach(async (data) => { data.input_image = base64_image @@ -101,22 +142,23 @@ class ControlNetTab extends React.Component<{ appState: typeof ControlNetStore } id="mControlNetPresetMenu" value="Select CtrlNet Preset" onChange={this.onPresetMenuChange.bind(this)} - onUpdatePresetMenuEvent={this.updatePresetMenuEvent.bind(this)} + onUpdatePresetMenuEvent={this.updatePresetMenuEvent.bind( + this + )} > - {this.state.presetMenuChildren.map(child => child)} + {this.state.presetMenuChildren.map((child) => child)}
- { - this.props.appState.maxControlNet == 0 && ( - - The Controlnet Extension is missing from Automatic1111. - Please install it to use it through the plugin. - ) - } + {this.props.appState.maxControlNet == 0 && ( + + The Controlnet Extension is missing from Automatic1111. + Please install it to use it through the plugin. + + )}
- Disable ControlNet Tab + + Disable ControlNet Tab +
- - { - Array(this.props.appState.maxControlNet * 2).fill(0).map((v, index) => { - if (index % 2 == 0) { - return
- } - else { - return - } - }) - } + {Array(this.props.appState.maxControlNet * 2) + .fill(0) + .map((v, index) => { + if (index % 2 == 0) { + return ( +
+ + + +
+ ) + } else { + return ( + + ) + } + })}
- ); + ) } } - -export default ControlNetTab; +export default ControlNetTab diff --git a/typescripts/controlnet/ControlNetUnit.tsx b/typescripts/controlnet/ControlNetUnit.tsx index 5bd607fb..ca1e9389 100644 --- a/typescripts/controlnet/ControlNetUnit.tsx +++ b/typescripts/controlnet/ControlNetUnit.tsx @@ -1,107 +1,168 @@ -import { observer } from 'mobx-react'; -import React from 'react'; -import { MoveToCanvasSvg,ActionButtonSVG, SpCheckBox, SpMenu, SpSlider, Thumbnail, PenSvg, PreviewSvg } from '../util/elements'; -import ControlNetStore from './store'; -import { mapRange, versionCompare } from './util'; -import { note, selection, html_manip, psapi,api, general } from '../util/oldSystem'; - - -declare const g_generation_session: any; -declare const io: any; -declare const app: any; -declare let g_sd_url: string; +import { observer } from 'mobx-react' +import React from 'react' +import { + MoveToCanvasSvg, + ActionButtonSVG, + SpCheckBox, + SpMenu, + SpSlider, + Thumbnail, + PenSvg, + PreviewSvg, +} from '../util/elements' +import ControlNetStore from './store' +import { mapRange, versionCompare } from './util' +import { + note, + selection, + html_manip, + psapi, + api, + general, +} from '../util/oldSystem' +declare const g_generation_session: any +declare const io: any +declare const app: any +declare let g_sd_url: string @observer -export default class ControlNetUnit extends React.Component<{ index: number, appState: typeof ControlNetStore }, {}> { - +export default class ControlNetUnit extends React.Component< + { index: number; appState: typeof ControlNetStore }, + {} +> { onEnableChange(event: any) { event.preventDefault() - const storeData = this.props.appState.controlNetUnitData[this.props.index]; - storeData.enabled = !storeData.enabled; + const storeData = + this.props.appState.controlNetUnitData[this.props.index] + storeData.enabled = !storeData.enabled } onLowVRamChange(event: any) { event.preventDefault() - const storeData = this.props.appState.controlNetUnitData[this.props.index]; - storeData.lowvram = !storeData.lowvram; + const storeData = + this.props.appState.controlNetUnitData[this.props.index] + storeData.lowvram = !storeData.lowvram } onGuessModeChange(event: any) { event.preventDefault() - const storeData = this.props.appState.controlNetUnitData[this.props.index]; - storeData.guessmode = !storeData.guessmode; + const storeData = + this.props.appState.controlNetUnitData[this.props.index] + storeData.guessmode = !storeData.guessmode } onPixelPerfectChange(event: any) { event.preventDefault() - const storeData = this.props.appState.controlNetUnitData[this.props.index]; - console.log('onPixelPerfectChange', storeData.pixel_perfect); - storeData.pixel_perfect = !storeData.pixel_perfect; + const storeData = + this.props.appState.controlNetUnitData[this.props.index] + console.log('onPixelPerfectChange', storeData.pixel_perfect) + storeData.pixel_perfect = !storeData.pixel_perfect } onWeightMove(event: any) { event.preventDefault() - if (event.target.tagName != 'SP-SLIDER') return; - const storeData = this.props.appState.controlNetUnitData[this.props.index]; - storeData.weight = +mapRange(event.target.value, 0, 200, 0, 2, 0.01).toFixed(2); + if (event.target.tagName != 'SP-SLIDER') return + const storeData = + this.props.appState.controlNetUnitData[this.props.index] + storeData.weight = +mapRange( + event.target.value, + 0, + 200, + 0, + 2, + 0.01 + ).toFixed(2) } onGuidanceStartMove(event: any) { event.preventDefault() - if (event.target.tagName != 'SP-SLIDER') return; - const storeData = this.props.appState.controlNetUnitData[this.props.index]; - storeData.guidance_start = +mapRange(event.target.value, 0, 10, 0, 1, 0.1).toFixed(1); + if (event.target.tagName != 'SP-SLIDER') return + const storeData = + this.props.appState.controlNetUnitData[this.props.index] + storeData.guidance_start = +mapRange( + event.target.value, + 0, + 10, + 0, + 1, + 0.1 + ).toFixed(1) } onGuidanceEndMove(event: any) { event.preventDefault() - if (event.target.tagName != 'SP-SLIDER') return; - const storeData = this.props.appState.controlNetUnitData[this.props.index]; - storeData.guidance_end = +mapRange(event.target.value, 0, 10, 0, 1, 0.1).toFixed(1); + if (event.target.tagName != 'SP-SLIDER') return + const storeData = + this.props.appState.controlNetUnitData[this.props.index] + storeData.guidance_end = +mapRange( + event.target.value, + 0, + 10, + 0, + 1, + 0.1 + ).toFixed(1) } - onPreprocsesorChange(event: any, { index, item }: { index: number, item: string }) { - const storeData = this.props.appState.controlNetUnitData[this.props.index]; + onPreprocsesorChange( + event: any, + { index, item }: { index: number; item: string } + ) { + const storeData = + this.props.appState.controlNetUnitData[this.props.index] storeData.module = item } - onModelChange(event: any, { index, item }: { index: number, item: string }) { - const storeData = this.props.appState.controlNetUnitData[this.props.index]; + onModelChange( + event: any, + { index, item }: { index: number; item: string } + ) { + const storeData = + this.props.appState.controlNetUnitData[this.props.index] storeData.model = item } onResolutionMove(event: any) { event.preventDefault() - if (event.target.tagName != 'SP-SLIDER') return; - const storeData = this.props.appState.controlNetUnitData[this.props.index]; - let resolutionConfig = this.props.appState.preprocessorDetail[storeData.module] || {}; - let sliderConfig = resolutionConfig.sliders[0]; - storeData.processor_res = +(event.target.value * (sliderConfig.step || 1)); + if (event.target.tagName != 'SP-SLIDER') return + const storeData = + this.props.appState.controlNetUnitData[this.props.index] + let resolutionConfig = + this.props.appState.preprocessorDetail[storeData.module] || {} + let sliderConfig = resolutionConfig.sliders[0] + storeData.processor_res = +( + event.target.value * (sliderConfig.step || 1) + ) } onThresholdAMove(event: any) { event.preventDefault() - if (event.target.tagName != 'SP-SLIDER') return; - const storeData = this.props.appState.controlNetUnitData[this.props.index]; - let resolutionConfig = this.props.appState.preprocessorDetail[storeData.module] || {}; - let sliderConfig = resolutionConfig.sliders[1]; - storeData.threshold_a = +(event.target.value * (sliderConfig.step || 1)); + if (event.target.tagName != 'SP-SLIDER') return + const storeData = + this.props.appState.controlNetUnitData[this.props.index] + let resolutionConfig = + this.props.appState.preprocessorDetail[storeData.module] || {} + let sliderConfig = resolutionConfig.sliders[1] + storeData.threshold_a = +(event.target.value * (sliderConfig.step || 1)) } onThresholdBMove(event: any) { event.preventDefault() - if (event.target.tagName != 'SP-SLIDER') return; - const storeData = this.props.appState.controlNetUnitData[this.props.index]; - let resolutionConfig = this.props.appState.preprocessorDetail[storeData.module] || {}; - let sliderConfig = resolutionConfig.sliders[2]; - storeData.threshold_b = +(event.target.value * (sliderConfig.step || 1)); + if (event.target.tagName != 'SP-SLIDER') return + const storeData = + this.props.appState.controlNetUnitData[this.props.index] + let resolutionConfig = + this.props.appState.preprocessorDetail[storeData.module] || {} + let sliderConfig = resolutionConfig.sliders[2] + storeData.threshold_b = +(event.target.value * (sliderConfig.step || 1)) } async onSetImageButtonClick() { const selectionInfo = await selection.Selection.getSelectionInfoExe() if (selectionInfo) { - const base64_image = await g_generation_session.setControlNetImageHelper() + const base64_image = + await g_generation_session.setControlNetImageHelper() - this.props.appState.controlNetUnitData[this.props.index].input_image = base64_image + this.props.appState.controlNetUnitData[ + this.props.index + ].input_image = base64_image } else { await note.Notification.inactiveSelectionArea() } } async onMaskButtonClick() { - const storeData = this.props.appState.controlNetUnitData[this.props.index]; - if ( - g_generation_session.control_net_selection_info && - storeData.mask - ) { + const storeData = + this.props.appState.controlNetUnitData[this.props.index] + if (g_generation_session.control_net_selection_info && storeData.mask) { const selection_info = g_generation_session.control_net_selection_info const layer = await io.IO.base64ToLayer( @@ -119,11 +180,11 @@ export default class ControlNetUnit extends React.Component<{ index: number, app } async requestControlNetDetectMap( - controlnet_init_image:string, - _module:string, - processor_res:number, - threshold_a:number, - threshold_b:number + controlnet_init_image: string, + _module: string, + processor_res: number, + threshold_a: number, + threshold_b: number ) { try { const payload = { @@ -134,9 +195,9 @@ export default class ControlNetUnit extends React.Component<{ index: number, app controlnet_threshold_b: threshold_b, } const full_url = `${g_sd_url}/controlnet/detect` - + const response_data = await api.requestPost(full_url, payload) - + // update the mask preview with the new detectMap if (response_data['images'].length === 0) { app.showAlert(response_data['info']) @@ -146,19 +207,18 @@ export default class ControlNetUnit extends React.Component<{ index: number, app console.warn('requestControlNetDetectMap(): ', _module, e) } } - - async previewAnnotator() { + async previewAnnotator() { const index = this.props.index try { - const storeData = this.props.appState.controlNetUnitData[index]; - + const storeData = this.props.appState.controlNetUnitData[index] + const controlnet_init_image = storeData.input_image - - const _module = storeData.module || 'none'; - const processor_res = storeData.processor_res - const threshold_a = storeData.threshold_a - const threshold_b = storeData.threshold_b + + const _module = storeData.module || 'none' + const processor_res = storeData.processor_res + const threshold_a = storeData.threshold_a + const threshold_b = storeData.threshold_b if (!controlnet_init_image) { const error = 'ControlNet initial image is empty' @@ -170,7 +230,7 @@ export default class ControlNetUnit extends React.Component<{ index: number, app app.showAlert(error) throw error } - + const detect_map = await this.requestControlNetDetectMap( controlnet_init_image, _module, @@ -178,19 +238,18 @@ export default class ControlNetUnit extends React.Component<{ index: number, app threshold_a, threshold_b ) - + const rgb_detect_map_url = await io.convertBlackAndWhiteImageToRGBChannels3(detect_map) const rgb_detect_map = general.base64UrlToBase64(rgb_detect_map_url) g_generation_session.controlNetMask[index] = rgb_detect_map - + storeData.mask = rgb_detect_map - } catch (e) { console.warn('PreviewAnnotator click(): index: ', index, e) } } - async toCanvas() { + async toCanvas() { if ( g_generation_session.control_net_preview_selection_info && g_generation_session.controlNetMask[this.props.index] @@ -211,8 +270,10 @@ export default class ControlNetUnit extends React.Component<{ index: number, app } } async toControlNetInitImage() { - const preview_result_base64 = g_generation_session.controlNetMask[this.props.index] - g_generation_session.controlNetImage[this.props.index] = preview_result_base64 + const preview_result_base64 = + g_generation_session.controlNetMask[this.props.index] + g_generation_session.controlNetImage[this.props.index] = + preview_result_base64 g_generation_session.control_net_selection_info = g_generation_session.control_net_preview_selection_info @@ -224,36 +285,40 @@ export default class ControlNetUnit extends React.Component<{ index: number, app // g_generation_session.controlNetMask[index] = rgb_detect_map // html_manip.setControlImageSrc(rgb_detect_map_url, this.props.index) - const storeData = this.props.appState.controlNetUnitData[this.props.index]; - + const storeData = + this.props.appState.controlNetUnitData[this.props.index] + storeData.input_image = storeData.mask } - async previewAnnotatorFromCanvas() { + async previewAnnotatorFromCanvas() { try { - const storeData = this.props.appState.controlNetUnitData[this.props.index]; - const _module = storeData.module || 'none'; - + const storeData = + this.props.appState.controlNetUnitData[this.props.index] + const _module = storeData.module || 'none' + const width = html_manip.getWidth() const height = html_manip.getHeight() const selectionInfo = await psapi.getSelectionInfoExe() - g_generation_session.control_net_preview_selection_info = selectionInfo - const base64 = await io.IO.getSelectionFromCanvasAsBase64Interface_New( - width, - height, - selectionInfo, - true - ) - + g_generation_session.control_net_preview_selection_info = + selectionInfo + const base64 = + await io.IO.getSelectionFromCanvasAsBase64Interface_New( + width, + height, + selectionInfo, + true + ) + if (!_module || _module === 'none') { const error = 'select a valid controlnet module (preprocessor)' app.showAlert(error) throw error } - + const processor_res = storeData.processor_res const threshold_a = storeData.threshold_a const threshold_b = storeData.threshold_b - + const detect_map = await this.requestControlNetDetectMap( base64, _module, @@ -261,203 +326,341 @@ export default class ControlNetUnit extends React.Component<{ index: number, app threshold_a, threshold_b ) - + const rgb_detect_map_url = await io.convertBlackAndWhiteImageToRGBChannels3(detect_map) g_generation_session.controlNetMask[this.props.index] = detect_map - + storeData.mask = general.base64UrlToBase64(rgb_detect_map_url) } catch (e) { - console.warn('PreviewAnnotator click(): index: ', this.props.index, e) + console.warn( + 'PreviewAnnotator click(): index: ', + this.props.index, + e + ) } } render() { - const storeData = this.props.appState.controlNetUnitData[this.props.index]; - const pd = this.props.appState.preprocessorDetail[storeData.module] || {}; - const ppSlider = pd.sliders || []; + const storeData = + this.props.appState.controlNetUnitData[this.props.index] + const pd = + this.props.appState.preprocessorDetail[storeData.module] || {} + const ppSlider = pd.sliders || [] - console.log("pixel_perfect:" + storeData.pixel_perfect); + console.log('pixel_perfect:' + storeData.pixel_perfect) - return
-
- Control Net Settings Slot {this.props.index} -
-
-
-
- + return ( +
+
+ + Control Net Settings Slot {this.props.index} + +
+
+
+
+ +
+
+ +
-
- +
+
+ + + + + + + + + + + + +
+
+ +
-
+ Enable + + + Low VRAM + + 1 + ? 'none' + : void 0, + marginRight: '10px', + }} + onChange={this.onGuessModeChange.bind(this)} + checked={storeData.guessmode} + id={`chGuessMode_${this.props.index}`} > + Guess Mode + + 1 + ? void 0 + : 'none', + marginRight: '10px', + }} + onChange={this.onPixelPerfectChange.bind(this)} + checked={storeData.pixel_perfect} + id={`chPixelPerfect_${this.props.index}`} + > + Pixel Perfect + + {this.props.appState.controlnetApiVersion > 1 && ( + + Control Mode: + + Balanced + + + Prompt + + + ControlNet + + + )} + +
- - - - - - - -
-
- + + Guidance strength end: + + + {storeData.guidance_end} + + + {ppSlider && + ppSlider[0] && + !storeData.pixel_perfect && ( + + + {ppSlider[0].name}: + + + {storeData.processor_res.toFixed(2)} + + + )} + {ppSlider && ppSlider[1] && ( + + + {ppSlider[1].name}: + + + {storeData.threshold_a.toFixed(2)} + + + )} + {ppSlider && ppSlider[2] && ( + + + {ppSlider[2].name}: + + + {storeData.threshold_b.toFixed(2)} + + + )}
-
- - Enable - Low VRAM - 1 ? 'none' : void 0, marginRight: "10px"}} onChange={this.onGuessModeChange.bind(this)} checked={storeData.guessmode} id={`chGuessMode_${this.props.index}`}>Guess Mode - 1 ? void 0 : 'none', marginRight: "10px"}} onChange={this.onPixelPerfectChange.bind(this)} checked={storeData.pixel_perfect} id={`chPixelPerfect_${this.props.index}`}>Pixel Perfect - { - this.props.appState.controlnetApiVersion > 1 && - - Control Mode: - Balanced - Prompt - ControlNet - - } - -
-
- - Weight: - {storeData.weight} - - - Guidance strength start: - {storeData.guidance_start} - - - Guidance strength end: - {storeData.guidance_end} - - {ppSlider && ppSlider[0] && !storeData.pixel_perfect && - {ppSlider[0].name}: - {storeData.processor_res.toFixed(2)} - } - {ppSlider && ppSlider[1] && - {ppSlider[1].name}: - {storeData.threshold_a.toFixed(2)} - } - {ppSlider && ppSlider[2] && - {ppSlider[2].name}: - {storeData.threshold_b.toFixed(2)} - } +
+ + {!pd.model_free && ( + + )}
-
- - {!pd.model_free && - () - } -
-
+ ) } } diff --git a/typescripts/controlnet/entry.ts b/typescripts/controlnet/entry.ts index 6007ad20..db1b9fbe 100644 --- a/typescripts/controlnet/entry.ts +++ b/typescripts/controlnet/entry.ts @@ -1,16 +1,20 @@ -import { Enum, api } from "../util/oldSystem"; -import { store, versionCompare } from "./main" +import { Enum, api } from '../util/oldSystem' +import { store, versionCompare } from './main' -declare const g_sd_config_obj: any; -declare let g_sd_url: string; +declare const g_sd_config_obj: any +declare let g_sd_url: string async function requestControlNetPreprocessors() { - const control_net_json = await api.requestGet(`${g_sd_url}/controlnet/module_list?alias_name=1`) + const control_net_json = await api.requestGet( + `${g_sd_url}/controlnet/module_list?alias_name=1` + ) return control_net_json } async function requestControlNetModelList(): Promise { - const control_net_json = await api.requestGet(`${g_sd_url}/controlnet/model_list`) + const control_net_json = await api.requestGet( + `${g_sd_url}/controlnet/model_list` + ) const model_list = control_net_json?.model_list return model_list @@ -36,15 +40,14 @@ async function initializeControlNetTab(controlnet_max_models: number) { try { const models = await requestControlNetModelList() - store.supportedModels = models || []; + store.supportedModels = models || [] } catch (e) { console.warn(e) } try { const pps = await requestControlNetPreprocessors() - store.supportedPreprocessors = pps ? pps.module_list : []; + store.supportedPreprocessors = pps ? pps.module_list : [] store.preprocessorDetail = pps ? pps.module_detail : {} - } catch (e) { console.warn(e) } @@ -52,9 +55,10 @@ async function initializeControlNetTab(controlnet_max_models: number) { function getEnableControlNet(index: number) { if (typeof index == 'undefined') - return store.controlNetUnitData.filter(item => item.enabled).length > 0 - else - return store.controlNetUnitData[index || 0].enabled + return ( + store.controlNetUnitData.filter((item) => item.enabled).length > 0 + ) + else return store.controlNetUnitData[index || 0].enabled } function mapPluginSettingsToControlNet(plugin_settings: any) { const ps = plugin_settings // for shortness @@ -79,8 +83,9 @@ function mapPluginSettingsToControlNet(plugin_settings: any) { guessmode: false, } if (store.controlnetApiVersion > 1) { - controlnet_units[index].control_mode = store.controlNetUnitData[index].control_mode; - controlnet_units[index].pixel_perfect = true; + controlnet_units[index].control_mode = + store.controlNetUnitData[index].control_mode + controlnet_units[index].pixel_perfect = true } } @@ -89,7 +94,7 @@ function mapPluginSettingsToControlNet(plugin_settings: any) { plugin_settings['mode'] === Enum.generationModeEnum['Inpaint'] || plugin_settings['mode'] === Enum.generationModeEnum['Outpaint'] ) { - const b_use_guess_mode = store.controlNetUnitData[0].guessmode; + const b_use_guess_mode = store.controlNetUnitData[0].guessmode controlnet_units[0]['guessmode'] = b_use_guess_mode } @@ -105,23 +110,23 @@ function mapPluginSettingsToControlNet(plugin_settings: any) { args: controlnet_units, }, }, - } return controlnet_payload } function getControlNetMaxModelsNumber() { - return store.maxControlNet; + return store.maxControlNet } function getUnitsData() { return store.controlNetUnitData } function setControlMaskSrc(base64: string, index: number) { - store.controlNetUnitData[index].mask = base64; + store.controlNetUnitData[index].mask = base64 } function isControlNetModeEnable() { //@ts-ignore - let is_tab_enabled = !document.getElementById('chDisableControlNetTab').checked + let is_tab_enabled = !document.getElementById('chDisableControlNetTab') + .checked let numOfEnabled = 0 if (is_tab_enabled) { @@ -138,7 +143,7 @@ function isControlNetModeEnable() { return is_mode_enabled } function getModuleDetail() { - return store.preprocessorDetail; + return store.preprocessorDetail } export { requestControlNetModelList, @@ -150,5 +155,5 @@ export { getUnitsData, setControlMaskSrc, isControlNetModeEnable, - getModuleDetail -} \ No newline at end of file + getModuleDetail, +} diff --git a/typescripts/controlnet/main.tsx b/typescripts/controlnet/main.tsx index 797ae17b..27bddc51 100644 --- a/typescripts/controlnet/main.tsx +++ b/typescripts/controlnet/main.tsx @@ -1,16 +1,13 @@ import ReactDOM from 'react-dom/client' -import React from 'react'; -import ControlNetTab from './ControlNetTab'; +import React from 'react' +import ControlNetTab from './ControlNetTab' import store from './store' import { versionCompare } from './util' -const elem = document.getElementById('sp-control_net-tab-page'); +const elem = document.getElementById('sp-control_net-tab-page') if (elem) { const root = ReactDOM.createRoot(elem) - root.render() + root.render() } -export { - store, - versionCompare -} \ No newline at end of file +export { store, versionCompare } diff --git a/typescripts/controlnet/store.ts b/typescripts/controlnet/store.ts index 20cc679e..4cf00fa9 100644 --- a/typescripts/controlnet/store.ts +++ b/typescripts/controlnet/store.ts @@ -1,14 +1,14 @@ -import { observable, reaction } from "mobx"; +import { observable, reaction } from 'mobx' export const DefaultControlNetUnitData = { enabled: false, input_image: '', mask: '', - module: "", - model: "", + module: '', + model: '', weight: 1.0, - resize_mode: "Scale to Fit (Inner Fit)", + resize_mode: 'Scale to Fit (Inner Fit)', lowvram: true, processor_res: 512, threshold_a: 0, @@ -18,38 +18,41 @@ export const DefaultControlNetUnitData = { guidance_end: 1, guessmode: false, - control_mode: "Balanced", + control_mode: 'Balanced', pixel_perfect: true, } export interface controlNetUnitData { - enabled: boolean, - input_image: string, - mask: string, + enabled: boolean + input_image: string + mask: string - module: string, - model: string, - weight: number, - resize_mode: "Just Resize" | "Crop and Resize" | "Resize and Fill", - lowvram: boolean, - processor_res: number, - threshold_a: number, - threshold_b: number, + module: string + model: string + weight: number + resize_mode: 'Just Resize' | 'Crop and Resize' | 'Resize and Fill' + lowvram: boolean + processor_res: number + threshold_a: number + threshold_b: number - guidance_start: number, - guidance_end: number, - guessmode: boolean, + guidance_start: number + guidance_end: number + guessmode: boolean - control_mode: "Balanced" | "My prompt is more important" | "ControlNet is more important", - pixel_perfect: boolean, + control_mode: + | 'Balanced' + | 'My prompt is more important' + | 'ControlNet is more important' + pixel_perfect: boolean } interface ControlNetMobxStore { - maxControlNet: number, - controlnetApiVersion: number, + maxControlNet: number + controlnetApiVersion: number - supportedModels: string[], - supportedPreprocessors: string[], - preprocessorDetail: {[key: string]: any}, + supportedModels: string[] + supportedPreprocessors: string[] + preprocessorDetail: { [key: string]: any } controlNetUnitData: controlNetUnitData[] } @@ -62,12 +65,12 @@ var ControlNetStore = observable({ supportedPreprocessors: [], preprocessorDetail: {}, - controlNetUnitData: [] -}); + controlNetUnitData: [], +}) reaction( () => { - return ControlNetStore.controlNetUnitData.map(data => data.module) + return ControlNetStore.controlNetUnitData.map((data) => data.module) }, (module_, index) => { ControlNetStore.controlNetUnitData.forEach((data, index) => { @@ -81,11 +84,16 @@ reaction( ) reaction( () => ControlNetStore.maxControlNet, - maxControlNet => { - ControlNetStore.controlNetUnitData = Array(maxControlNet).fill(0).map((v, index) => { - return ControlNetStore.controlNetUnitData[index] || DefaultControlNetUnitData; - }) + (maxControlNet) => { + ControlNetStore.controlNetUnitData = Array(maxControlNet) + .fill(0) + .map((v, index) => { + return ( + ControlNetStore.controlNetUnitData[index] || + DefaultControlNetUnitData + ) + }) } ) -export default ControlNetStore \ No newline at end of file +export default ControlNetStore diff --git a/typescripts/controlnet/util.tsx b/typescripts/controlnet/util.tsx index 2b267102..1d33aaea 100644 --- a/typescripts/controlnet/util.tsx +++ b/typescripts/controlnet/util.tsx @@ -1,10 +1,18 @@ - -export function mapRange(x: number, in_min: number, in_max: number, out_min: number, out_max: number, step: number) { - return Math.round( - ( - ((x - in_min) * (out_max - out_min)) / (in_max - in_min) + out_min - ) / step - ) * step +export function mapRange( + x: number, + in_min: number, + in_max: number, + out_min: number, + out_max: number, + step: number +) { + return ( + Math.round( + (((x - in_min) * (out_max - out_min)) / (in_max - in_min) + + out_min) / + step + ) * step + ) } export function versionCompare(to: string, from: string) { @@ -14,13 +22,15 @@ export function versionCompare(to: string, from: string) { for (let i = 0; i < Math.max(vTo.length, vFrom.length); i++) { const vFromI = +(vFrom[i] || 0) const vToI = +(vTo[i] || 0) - if (isNaN(vFromI) || isNaN(vToI)) { throw new Error(`invalid version ${vTo} or ${vFrom} `) } + if (isNaN(vFromI) || isNaN(vToI)) { + throw new Error(`invalid version ${vTo} or ${vFrom} `) + } if (vFromI > vToI) { return -1 - } else if (vFromI < vToI) { - return 1; + } else if (vFromI < vToI) { + return 1 } } - return 0; -} \ No newline at end of file + return 0 +} diff --git a/typescripts/entry.ts b/typescripts/entry.ts index c99ebc01..b3959fb5 100644 --- a/typescripts/entry.ts +++ b/typescripts/entry.ts @@ -4,16 +4,3 @@ export * as ultimate_sd_upscaler from './ultimate_sd_upscaler/ultimate_sd_upscal export * as scripts from './ultimate_sd_upscaler/scripts' export * as main from './main/main' export * as logger from './util/logger' - - - - - - - - - - - - - diff --git a/typescripts/main/astore.ts b/typescripts/main/astore.ts index c6466db9..23b681ea 100644 --- a/typescripts/main/astore.ts +++ b/typescripts/main/astore.ts @@ -24,4 +24,4 @@ export class AStore { toJsFunc() { return toJS(this) } -} \ No newline at end of file +} diff --git a/typescripts/ultimate_sd_upscaler/ultimate_sd_upscaler.tsx b/typescripts/ultimate_sd_upscaler/ultimate_sd_upscaler.tsx index 8efafaa3..1133474a 100644 --- a/typescripts/ultimate_sd_upscaler/ultimate_sd_upscaler.tsx +++ b/typescripts/ultimate_sd_upscaler/ultimate_sd_upscaler.tsx @@ -159,18 +159,16 @@ export class UltimateSDUpscalerForm extends React.Component<{ } async getUpscalers() { - try{ - + try { const sd_upscalers_json = await requestGetUpscalers() const sd_upscalers = sd_upscalers_json.map( (upscaler: any) => upscaler.name - ) - this.setState({ sd_upscalers: sd_upscalers }) - return sd_upscalers - } - catch(e){ - console.warn("ultimate sd upscaler getUpscalers(): ",e) - } + ) + this.setState({ sd_upscalers: sd_upscalers }) + return sd_upscalers + } catch (e) { + console.warn('ultimate sd upscaler getUpscalers(): ', e) + } } handleRefresh = async () => { diff --git a/typescripts/util/elements.tsx b/typescripts/util/elements.tsx index e4a22eab..3e5d2c37 100644 --- a/typescripts/util/elements.tsx +++ b/typescripts/util/elements.tsx @@ -2,11 +2,9 @@ import React, { CSSProperties, ReactEventHandler, useState } from 'react' // import ReactDOM from 'react-dom' import ReactDOM from 'react-dom/client' // import { versions } from 'uxp' -export { ReactComponent as MoveToCanvasSvg } from '../../icon/move_to_canvas.svg'; -export { ReactComponent as PenSvg } from '../../icon/pen.svg'; -export { ReactComponent as PreviewSvg } from '../../icon/preview.svg'; - - +export { ReactComponent as MoveToCanvasSvg } from '../../icon/move_to_canvas.svg' +export { ReactComponent as PenSvg } from '../../icon/pen.svg' +export { ReactComponent as PreviewSvg } from '../../icon/preview.svg' declare global { namespace JSX { @@ -266,11 +264,9 @@ export class SpMenu extends React.Component<{ } } class PhotoshopElem extends React.Component<{ [key: string]: any }, {}> { - protected elem: Element | null = null; + protected elem: Element | null = null - protected curEvents: { [key: string]: (evt: Event) => any } = { - - } + protected curEvents: { [key: string]: (evt: Event) => any } = {} componentDidMount(): void { this.updateEventListener() @@ -281,35 +277,34 @@ class PhotoshopElem extends React.Component<{ [key: string]: any }, {}> { // } updateEventListener() { - if (!this.elem) throw new Error('elem is not rendered with ref'); + if (!this.elem) throw new Error('elem is not rendered with ref') const [, newEvent] = this.splitProps(this.props) - Object.keys(this.curEvents).forEach(evkey => { + Object.keys(this.curEvents).forEach((evkey) => { if (this.curEvents[evkey] != newEvent[evkey]) { - this.elem?.removeEventListener(evkey, this.curEvents[evkey]); + this.elem?.removeEventListener(evkey, this.curEvents[evkey]) } - }); - Object.keys(newEvent).forEach(evkey => { - this.elem?.addEventListener(evkey, newEvent[evkey]); + }) + Object.keys(newEvent).forEach((evkey) => { + this.elem?.addEventListener(evkey, newEvent[evkey]) }) } componentWillUnmount(): void { - Object.keys(this.curEvents).forEach(evkey => { - this.elem?.removeEventListener(evkey, this.curEvents[evkey]); - }); + Object.keys(this.curEvents).forEach((evkey) => { + this.elem?.removeEventListener(evkey, this.curEvents[evkey]) + }) } splitProps(props: any): [any, any] { - const attr: any = {}; - const event: any = {}; + const attr: any = {} + const event: any = {} Object.keys(props).forEach((propKey: string) => { if (propKey.startsWith('on')) { const key = propKey[2].toLocaleLowerCase() + propKey.slice(3) - event[key] = props[propKey]; - + event[key] = props[propKey] } else { - attr[propKey] = props[propKey]; + attr[propKey] = props[propKey] } }) return [attr, event] @@ -318,81 +313,131 @@ class PhotoshopElem extends React.Component<{ [key: string]: any }, {}> { export class SpPicker extends PhotoshopElem { render() { const [attr] = this.splitProps(this.props) - return this.elem = elem} {...attr}> + return ( + (this.elem = elem)} + {...attr} + > + ) } } export class SpMenuComponent extends PhotoshopElem { render() { const [attr] = this.splitProps(this.props) - return this.elem = elem} {...attr}> + return ( + (this.elem = elem)} + {...attr} + > + ) } } export class SpMenuItem extends PhotoshopElem { render() { const [attr] = this.splitProps(this.props) - return this.elem = elem} {...attr}> + return ( + (this.elem = elem)} + {...attr} + > + ) } } export class SpLabel extends PhotoshopElem { render() { const [attr] = this.splitProps(this.props) - return this.elem = elem} {...attr}> + return ( + (this.elem = elem)} + {...attr} + > + ) } } export class SpCheckBox extends PhotoshopElem { render() { const [attr] = this.splitProps(this.props) if (!attr['checked']) delete attr['checked'] - return this.elem = elem} {...attr}> + return ( + (this.elem = elem)} + {...attr} + > + ) } } export class SpSlider extends PhotoshopElem { render() { const [attr] = this.splitProps(this.props) - return this.elem = elem} {...attr}> + return ( + (this.elem = elem)} + {...attr} + > + ) } } export class SpRadioGroup extends PhotoshopElem { render() { const [attr] = this.splitProps(this.props) - return this.elem = elem} {...attr}> + return ( + (this.elem = elem)} + {...attr} + > + ) } } export class SpRadio extends PhotoshopElem { render() { const [attr] = this.splitProps(this.props) - return this.elem = elem} {...attr}> + return ( + (this.elem = elem)} + {...attr} + > + ) } } export class SpDivider extends PhotoshopElem { render() { const [attr] = this.splitProps(this.props) - return this.elem = elem} {...attr}> + return ( + (this.elem = elem)} + {...attr} + > + ) } } - -export class Thumbnail extends React.Component<{children:React.ReactNode}> { - - render() { - return
- - {this.props.children} -
+export class Thumbnail extends React.Component<{ children: React.ReactNode }> { + render() { + return ( +
{this.props.children}
+ ) } } - - export class ActionButtonSVG extends PhotoshopElem { render() { const [attr] = this.splitProps(this.props) - - return this.elem = elem} {...attr}> - -
- {this.props.children} -
-
}} - + return ( + (this.elem = elem)} + {...attr} + > +
+ {this.props.children} +
+
+ ) + } +} diff --git a/typescripts/util/logger.ts b/typescripts/util/logger.ts index 154ce3e6..72e39a68 100644 --- a/typescripts/util/logger.ts +++ b/typescripts/util/logger.ts @@ -1,7 +1,5 @@ - -import {format} from 'util'; -export function formateLog(data: any, ...optional_param: any[]){ - - const formattedOutput = format(data, ...optional_param); +import { format } from 'util' +export function formateLog(data: any, ...optional_param: any[]) { + const formattedOutput = format(data, ...optional_param) return formattedOutput -} \ No newline at end of file +} diff --git a/typescripts/util/oldSystem.tsx b/typescripts/util/oldSystem.tsx index 6b58e08c..d976e2c7 100644 --- a/typescripts/util/oldSystem.tsx +++ b/typescripts/util/oldSystem.tsx @@ -1,5 +1,5 @@ //@ts-ignore -const req = window['require']; +const req = window['require'] // because we use window['require'], so the base path of this require function is the root path of plugin. const selection = req('./selection') @@ -26,5 +26,5 @@ export { html_manip, psapi, general, - io -} \ No newline at end of file + io, +} diff --git a/utility/presets/preset.js b/utility/presets/preset.js index f597d0e2..81096c85 100644 --- a/utility/presets/preset.js +++ b/utility/presets/preset.js @@ -160,9 +160,9 @@ function getPresetSettings(preset_type) { if (preset_type === Enum.PresetTypeEnum['SDPreset']) { preset_settings = g_ui_settings_object.getSettings() } else if (preset_type === Enum.PresetTypeEnum['ControlNetPreset']) { - const { getUnitsData } = require('../../typescripts/dist/bundle').control_net // only import ControlNetUnit to avoid circular dependency + const { getUnitsData } = + require('../../typescripts/dist/bundle').control_net // only import ControlNetUnit to avoid circular dependency preset_settings = getUnitsData() - } return preset_settings } diff --git a/webpack.config.js b/webpack.config.js index 535dcc3d..cb8db4f0 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,4 +1,3 @@ - const path = require('path') // const CleanWebpackPlugin = require('clean-webpack-plugin') const CopyPlugin = require('copy-webpack-plugin') @@ -23,11 +22,10 @@ module.exports = { }, resolve: { extensions: ['.tsx', '.ts', '.js', '.jsx'], - - fallback: { - "util": require.resolve("util/") - } - + + fallback: { + util: require.resolve('util/'), + }, }, module: { rules: [ @@ -64,7 +62,6 @@ module.exports = { test: /\.svg$/, use: ['@svgr/webpack', 'url-loader'], }, - ], }, plugins: [ From f460f335c2ee5c851bfaf18633160db465d55202 Mon Sep 17 00:00:00 2001 From: Amir Amirkhanov Date: Wed, 14 Jun 2023 23:15:42 +0300 Subject: [PATCH 019/143] Add files via upload icon design --- icon/accept_all.svg | 30 ++++++++++++++++++++++++- icon/accept_selected.svg | 29 +++++++++++++++++++++++- icon/camera_icon.svg | 43 +++++++++++++++++++++++------------ icon/chain_black.svg | 36 +++++++++++++++++++++++++---- icon/chain_white.svg | 45 +++++++++++++++++++++++++++++++++---- icon/discard_all.svg | 31 ++++++++++++++++++++++++- icon/discard_selected.svg | 26 ++++++++++++++++++++- icon/image-search.svg | 34 +++++++++++++++++++++------- icon/layer_to_selection.svg | 37 +++++++++++++++++++++++++----- icon/reset_settings.svg | 29 ++++++++++++++++++++++++ icon/search.svg | 41 ++++++++++++++++++++------------- icon/writing-icon.svg | 28 ++++++++++++++++++++++- 12 files changed, 352 insertions(+), 57 deletions(-) create mode 100644 icon/reset_settings.svg diff --git a/icon/accept_all.svg b/icon/accept_all.svg index b8f9be72..c7db2395 100644 --- a/icon/accept_all.svg +++ b/icon/accept_all.svg @@ -1 +1,29 @@ - \ No newline at end of file + + + + + + + + + + + + + + \ No newline at end of file diff --git a/icon/accept_selected.svg b/icon/accept_selected.svg index 30342c62..34eab928 100644 --- a/icon/accept_selected.svg +++ b/icon/accept_selected.svg @@ -1 +1,28 @@ - \ No newline at end of file + + + + + + + + + + + + + \ No newline at end of file diff --git a/icon/camera_icon.svg b/icon/camera_icon.svg index ad13b59d..4636cc58 100644 --- a/icon/camera_icon.svg +++ b/icon/camera_icon.svg @@ -1,14 +1,29 @@ - - - - - - - - + + + + + + + + + + + + + + \ No newline at end of file diff --git a/icon/chain_black.svg b/icon/chain_black.svg index 369d25bb..d687a447 100644 --- a/icon/chain_black.svg +++ b/icon/chain_black.svg @@ -1,4 +1,32 @@ - - - - + + + + + + + + + + + + + + \ No newline at end of file diff --git a/icon/chain_white.svg b/icon/chain_white.svg index 24465024..7519a804 100644 --- a/icon/chain_white.svg +++ b/icon/chain_white.svg @@ -1,4 +1,41 @@ - - - - + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/icon/discard_all.svg b/icon/discard_all.svg index e290f419..39bee8bb 100644 --- a/icon/discard_all.svg +++ b/icon/discard_all.svg @@ -1 +1,30 @@ - \ No newline at end of file + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/icon/discard_selected.svg b/icon/discard_selected.svg index 8ffdc692..30890c57 100644 --- a/icon/discard_selected.svg +++ b/icon/discard_selected.svg @@ -1 +1,25 @@ - \ No newline at end of file + + + + + + + + + + + + + + \ No newline at end of file diff --git a/icon/image-search.svg b/icon/image-search.svg index 342def6d..36a6409d 100644 --- a/icon/image-search.svg +++ b/icon/image-search.svg @@ -1,15 +1,33 @@ - - + + - image--search - - - - + + + + + + + + \ No newline at end of file diff --git a/icon/layer_to_selection.svg b/icon/layer_to_selection.svg index c78a7c1d..1c675241 100644 --- a/icon/layer_to_selection.svg +++ b/icon/layer_to_selection.svg @@ -1,8 +1,33 @@ - + + + + + + + + + + + + + \ No newline at end of file diff --git a/icon/reset_settings.svg b/icon/reset_settings.svg new file mode 100644 index 00000000..a8573817 --- /dev/null +++ b/icon/reset_settings.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/icon/search.svg b/icon/search.svg index 16e7b461..c3f101be 100644 --- a/icon/search.svg +++ b/icon/search.svg @@ -1,19 +1,28 @@ - - - - - search_right [#1507] - Created with Sketch. - + + + + - - - - + .c, .d { + fill: none; + } - - - - + .e { + fill: #d6d6d6; + } + + + + + + + + + \ No newline at end of file diff --git a/icon/writing-icon.svg b/icon/writing-icon.svg index ecc62918..02d8a993 100644 --- a/icon/writing-icon.svg +++ b/icon/writing-icon.svg @@ -1 +1,27 @@ -writing \ No newline at end of file + + + + + + + + + + + + + + + + \ No newline at end of file From ecb21e3205c9f9dec38ae91b5bc86e433d584246 Mon Sep 17 00:00:00 2001 From: Amir Amirkhanov Date: Wed, 14 Jun 2023 23:19:29 +0300 Subject: [PATCH 020/143] Update index.html replace reset_settings2.png to reset_settings.svg design icons --- index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index 0c017657..bc55fb05 100644 --- a/index.html +++ b/index.html @@ -571,7 +571,7 @@ .resetButton { font-family: Arial, Verdana; - background-image: url(./icon/reset_settings2.png); + background-image: url(./icon/reset_settings.svg); background-color: #777; background-size: 30px; width: 30px; @@ -655,7 +655,7 @@ .refreshButton { font-family: Arial, Verdana; - background-image: url(./icon/reset_settings2.png); + background-image: url(./icon/reset_settings.svg); background-color: #777; background-size: 30px; width: 30px; From a6f249ea418a30860013e39ff8e6c4b6cb68f000 Mon Sep 17 00:00:00 2001 From: Amir Amirkhanov Date: Wed, 14 Jun 2023 23:22:43 +0300 Subject: [PATCH 021/143] Add files via upload From ce39a72ab3f739428e9ec985715b75aed62f6cae Mon Sep 17 00:00:00 2001 From: Amir Amirkhanov Date: Wed, 14 Jun 2023 23:24:20 +0300 Subject: [PATCH 022/143] Add files via upload --- icon/layer_to_selection.svg | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/icon/layer_to_selection.svg b/icon/layer_to_selection.svg index 1c675241..0f66d75a 100644 --- a/icon/layer_to_selection.svg +++ b/icon/layer_to_selection.svg @@ -1,33 +1,25 @@ - + - - + + - - - - + + + + \ No newline at end of file From e74f4e9daa461534ede0e9ff0ec931e50eb752fd Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 22 Jun 2023 08:59:05 +0300 Subject: [PATCH 023/143] add photoshop type dependencies --- package-lock.json | 11 +++++++++++ package.json | 1 + 2 files changed, 12 insertions(+) diff --git a/package-lock.json b/package-lock.json index 93f8b7f6..99a3b508 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "Apache-2.0", "dependencies": { + "@types/photoshop": "^24.5.1", "@types/react": "^18.2.6", "@types/react-dom": "^18.2.4", "fastify": "^4.10.2", @@ -2951,6 +2952,11 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==" }, + "node_modules/@types/photoshop": { + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@types/photoshop/-/photoshop-24.5.1.tgz", + "integrity": "sha512-FY8Dy/HgfAL1TeDZyDTXgZIucAOSioOPSYf09PyEAxKE8QGLbcAKGUH1QliwwmlFgttyPhTqZdtgdYzpUbLYCg==" + }, "node_modules/@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", @@ -11498,6 +11504,11 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==" }, + "@types/photoshop": { + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@types/photoshop/-/photoshop-24.5.1.tgz", + "integrity": "sha512-FY8Dy/HgfAL1TeDZyDTXgZIucAOSioOPSYf09PyEAxKE8QGLbcAKGUH1QliwwmlFgttyPhTqZdtgdYzpUbLYCg==" + }, "@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", diff --git a/package.json b/package.json index 61564f5f..95f3890a 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "author": "Adobe Inc", "license": "Apache-2.0", "dependencies": { + "@types/photoshop": "^24.5.1", "@types/react": "^18.2.6", "@types/react-dom": "^18.2.4", "fastify": "^4.10.2", From 02c7632dd9a3e70f4214dcbdee64b3240d02d091 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 22 Jun 2023 10:10:43 +0300 Subject: [PATCH 024/143] fix formatting conflict with TypeScript directive --- typescripts/controlnet/entry.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/typescripts/controlnet/entry.ts b/typescripts/controlnet/entry.ts index db1b9fbe..3d9642cb 100644 --- a/typescripts/controlnet/entry.ts +++ b/typescripts/controlnet/entry.ts @@ -124,9 +124,10 @@ function setControlMaskSrc(base64: string, index: number) { store.controlNetUnitData[index].mask = base64 } function isControlNetModeEnable() { - //@ts-ignore - let is_tab_enabled = !document.getElementById('chDisableControlNetTab') - .checked + let is_tab_enabled = !( + //@ts-ignore + document.getElementById('chDisableControlNetTab').checked + ) let numOfEnabled = 0 if (is_tab_enabled) { From 5657d0864c54f1e44390fb2fd859cb921619c32d Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 22 Jun 2023 11:48:33 +0300 Subject: [PATCH 025/143] add onInput and onChange events to SpSliderWithLabel --- typescripts/after_detailer/after_detailer.tsx | 4 +-- .../ultimate_sd_upscaler.tsx | 6 ++-- typescripts/util/elements.tsx | 32 ++++++++++++------- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/typescripts/after_detailer/after_detailer.tsx b/typescripts/after_detailer/after_detailer.tsx index 12680b22..eed74353 100644 --- a/typescripts/after_detailer/after_detailer.tsx +++ b/typescripts/after_detailer/after_detailer.tsx @@ -200,7 +200,7 @@ export class AfterDetailerComponent extends React.Component<{ output_value={store.data['ad_conf']} // title={ui_config[id].label} label="Detection Confidence Threshold %:" - onSliderChange={(new_value: number) => { + onSliderInput={(new_value: number) => { // console.log('slider_change: ', new_value) store.updateProperty('ad_conf', new_value) }} @@ -248,7 +248,7 @@ export class AfterDetailerComponent extends React.Component<{ ? SliderType.Integer : SliderType.Float } - onSliderChange={(new_value: number) => { + onSliderInput={(new_value: number) => { // console.log('slider_change: ', new_value) store.updateProperty('controlNetWeight', new_value) }} diff --git a/typescripts/ultimate_sd_upscaler/ultimate_sd_upscaler.tsx b/typescripts/ultimate_sd_upscaler/ultimate_sd_upscaler.tsx index 1133474a..44517b84 100644 --- a/typescripts/ultimate_sd_upscaler/ultimate_sd_upscaler.tsx +++ b/typescripts/ultimate_sd_upscaler/ultimate_sd_upscaler.tsx @@ -223,7 +223,7 @@ export class UltimateSDUpscalerForm extends React.Component<{ output_value={this.props.store.data[id]} title={ui_config[id].label} label={ui_config[id].label} - onSliderChange={this.handleSliderChange} + onSliderInput={this.handleSliderChange} /> )) const seamfix_ids = [ @@ -243,7 +243,7 @@ export class UltimateSDUpscalerForm extends React.Component<{ output_value={this.props.store.data[id]} title={ui_config[id].label} label={ui_config[id].label} - onSliderChange={this.handleSliderChange} + onSliderInput={this.handleSliderChange} slider_type={ Number.isInteger(ui_config[id].step) ? SliderType.Integer @@ -275,7 +275,7 @@ export class UltimateSDUpscalerForm extends React.Component<{ id={'custom_scale'} out_min={ui_config.custom_scale.minimum} out_max={ui_config.custom_scale.maximum} - onSliderChange={this.handleSliderChange} + onSliderInput={this.handleSliderChange} steps={0.01} slider_type={SliderType.Float} /> diff --git a/typescripts/util/elements.tsx b/typescripts/util/elements.tsx index 3e5d2c37..5e4f88bc 100644 --- a/typescripts/util/elements.tsx +++ b/typescripts/util/elements.tsx @@ -41,6 +41,7 @@ export enum SliderType { } export class SpSliderWithLabel extends React.Component<{ onSliderChange?: any + onSliderInput?: any id?: string 'show-value'?: boolean steps?: number @@ -120,17 +121,19 @@ export class SpSliderWithLabel extends React.Component<{ this.setState({ output_value: to_value }) } - onSliderValueChangeHandler(event: React.ChangeEvent) { + onSliderValueInputHandler(event: React.ChangeEvent) { const newValue: string = event.target.value - console.log('onSliderValueChangeHandler value: ', newValue) - this.setState({ output_value: newValue }) - console.log({ - in_min: this.in_min, - in_max: this.in_max, - out_min: this.out_min, - out_max: this.out_max, - }) + let output_value = this.stepToOutputValue(parseInt(newValue)) + this.setState({ output_value: output_value }) + if (this.props.onSliderInput && this.props.id) { + this.props.onSliderInput(this.props.id, output_value) + } else if (this.props.onSliderInput) { + this.props.onSliderInput(output_value) + } + } + onSliderValueChangeHandler(event: React.ChangeEvent) { + const newValue: string = event.target.value let output_value = this.stepToOutputValue(parseInt(newValue)) this.setState({ output_value: output_value }) @@ -151,7 +154,7 @@ export class SpSliderWithLabel extends React.Component<{ //
{versions.plugin}
//
- {this.props.label}: {this.state.output_value} - +
) } From 1bb5d6d720d074936cbc7ef48111a8747fdb689b Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 22 Jun 2023 11:52:15 +0300 Subject: [PATCH 026/143] allow Collapsible to have default open state --- typescripts/after_detailer/after_detailer.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/typescripts/after_detailer/after_detailer.tsx b/typescripts/after_detailer/after_detailer.tsx index eed74353..9ae2096e 100644 --- a/typescripts/after_detailer/after_detailer.tsx +++ b/typescripts/after_detailer/after_detailer.tsx @@ -265,10 +265,15 @@ import { useState, ReactNode } from 'react' interface CollapsibleProps { label: string + defaultIsOpen?: boolean children: ReactNode } -const Collapsible = ({ label, children }: CollapsibleProps) => { - const [isOpen, setIsOpen] = useState(false) +const Collapsible = ({ + label, + defaultIsOpen = false, + children, +}: CollapsibleProps) => { + const [isOpen, setIsOpen] = useState(defaultIsOpen) const handleToggle = () => { setIsOpen(!isOpen) From bbc069fee9aea3657abaa2590136e51ad28cec65 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 22 Jun 2023 13:21:49 +0300 Subject: [PATCH 027/143] Use ComponentType instead of component children --- typescripts/controlnet/ControlNetUnit.tsx | 15 ++++++-------- typescripts/util/elements.tsx | 25 +++++++++++++++-------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/typescripts/controlnet/ControlNetUnit.tsx b/typescripts/controlnet/ControlNetUnit.tsx index ca1e9389..03707b85 100644 --- a/typescripts/controlnet/ControlNetUnit.tsx +++ b/typescripts/controlnet/ControlNetUnit.tsx @@ -405,24 +405,21 @@ export default class ControlNetUnit extends React.Component< height="100px" /> - - + > - - + > - - + >
diff --git a/typescripts/util/elements.tsx b/typescripts/util/elements.tsx index 5e4f88bc..94852cdb 100644 --- a/typescripts/util/elements.tsx +++ b/typescripts/util/elements.tsx @@ -1,4 +1,4 @@ -import React, { CSSProperties, ReactEventHandler, useState } from 'react' +import React, { CSSProperties, ComponentType } from 'react' // import ReactDOM from 'react-dom' import ReactDOM from 'react-dom/client' // import { versions } from 'uxp' @@ -419,31 +419,40 @@ export class SpDivider extends PhotoshopElem { } } -export class Thumbnail extends React.Component<{ children: React.ReactNode }> { +export class Thumbnail extends React.Component<{ + style?: any + children: React.ReactNode +}> { render() { return ( -
{this.props.children}
+
+ {this.props.children} +
) } } -export class ActionButtonSVG extends PhotoshopElem { +export class ActionButtonSVG extends React.Component<{ + onClick?: any + ComponentType: ComponentType +}> { render() { - const [attr] = this.splitProps(this.props) + if (!this.props.ComponentType) { + return null + } return ( (this.elem = elem)} - {...attr} >
- {this.props.children} + {}
) From ad987a093a0b0ddaa7228dbb1ad23d974d3b9b74 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 22 Jun 2023 13:33:04 +0300 Subject: [PATCH 028/143] add two additional plugin's panels --- icon/selection-area_2.svg | 29 ++++++++ index.html | 135 +++++++++++++++++++++++++++++++++++++- index.js | 7 +- manifest.json | 106 +++++++++++++++++++++++++++++- 4 files changed, 271 insertions(+), 6 deletions(-) create mode 100644 icon/selection-area_2.svg diff --git a/icon/selection-area_2.svg b/icon/selection-area_2.svg new file mode 100644 index 00000000..e516f8da --- /dev/null +++ b/icon/selection-area_2.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html index 5efd63bf..831f9303 100644 --- a/index.html +++ b/index.html @@ -588,6 +588,18 @@ height: 30px; background-repeat: no-repeat; } + .svgButton { + font-family: Arial, Verdana; + + background-color: #777; + background-size: 30px; + width: 30px; + height: 30px; + background-repeat: no-repeat; + } + .selectionAreaButton { + background-image: url(./icon/selection-area_2.svg); + } .interrogateButton { font-family: Arial, Verdana; background-image: url(./icon/writing-icon.svg); @@ -699,6 +711,19 @@ color: white; } */ + @@ -2047,8 +2072,7 @@ >
+ + +
+
+ + +
+ + +
+
+
+ + +
+
+ + +
+ + + + + + + + + + + + +
+
+
+
diff --git a/index.js b/index.js index 3778421f..a6b2cd66 100644 --- a/index.js +++ b/index.js @@ -2761,9 +2761,8 @@ document.querySelector('#mModelsMenu').addEventListener('change', (evt) => { sdapi.requestSwapModel(g_model_title) }) //REFACTOR: move to events.js -document - .getElementById('btnLayerToSelection') - .addEventListener('click', async () => { +document.querySelectorAll('.btnLayerToSelection').forEach((el) => { + el.addEventListener('click', async () => { try { const isSelectionAreaValid = await psapi.checkIfSelectionAreaIsActive() @@ -2777,6 +2776,8 @@ document console.warn(e) } }) +}) + //REFACTOR: move to events.js document .getElementById('btnSetInitImageViewer') diff --git a/manifest.json b/manifest.json index 1a3db056..4f60a31e 100644 --- a/manifest.json +++ b/manifest.json @@ -36,7 +36,7 @@ "entrypoints": [ { "type": "panel", - "id": "vanilla", + "id": "main_panel", "label": { "default": "Auto-Photoshop-SD", "en-US": "Auto-Photoshop-SD", @@ -85,6 +85,110 @@ ] } ] + }, + { + "type": "panel", + "id": "second_panel", + "label": { + "default": "Second Auto-Photoshop-SD", + "en-US": "Second Auto-Photoshop-SD", + "es-ES": "Second Auto-Photoshop-SD" + }, + "minimumSize": { + "width": 100, + "height": 100 + }, + "maximumSize": { + "width": 1200, + "height": 10000 + }, + "preferredDockedSize": { + "width": 150, + "height": 800 + }, + "preferredFloatingSize": { + "width": 300, + "height": 800 + }, + "commands": [ + { + "id": "show_alert", + "label": { + "default": "Show Alert", + "en-US": "Show Alert (US)", + "es-ES": "Show Alert (ES)" + } + } + ], + "icons": [ + { + "width": 23, + "height": 23, + "path": "icon/panel.png", + "scale": [ + 1, + 2 + ], + "theme": [ + "all" + ], + "species": [ + "chrome" + ] + } + ] + }, + { + "type": "panel", + "id": "toolbar", + "label": { + "default": "toolbar Auto-Photoshop-SD", + "en-US": "toolbar Auto-Photoshop-SD", + "es-ES": "toolbar Auto-Photoshop-SD" + }, + "minimumSize": { + "width": 30, + "height": 100 + }, + "maximumSize": { + "width": 1200, + "height": 10000 + }, + "preferredDockedSize": { + "width": 30, + "height": 800 + }, + "preferredFloatingSize": { + "width": 30, + "height": 800 + }, + "commands": [ + { + "id": "show_alert", + "label": { + "default": "Show Alert", + "en-US": "Show Alert (US)", + "es-ES": "Show Alert (ES)" + } + } + ], + "icons": [ + { + "width": 23, + "height": 23, + "path": "icon/panel.png", + "scale": [ + 1, + 2 + ], + "theme": [ + "all" + ], + "species": [ + "chrome" + ] + } + ] } ], "icons": [ From 3f6b7fa64e610057f905c0295af36cbdd663a7a0 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 22 Jun 2023 14:32:37 +0300 Subject: [PATCH 029/143] refactor image search in typescript, react and mobx --- typescripts/entry.ts | 2 + typescripts/image_search/image_search.tsx | 66 +++++++++++++++++ typescripts/main/astore.ts | 8 +++ typescripts/util/grid.tsx | 86 +++++++++++++++++++++++ typescripts/util/oldSystem.tsx | 6 ++ utility/tab/image_search_tab.js | 39 ++-------- 6 files changed, 173 insertions(+), 34 deletions(-) create mode 100644 typescripts/image_search/image_search.tsx create mode 100644 typescripts/util/grid.tsx diff --git a/typescripts/entry.ts b/typescripts/entry.ts index b3959fb5..c6cac028 100644 --- a/typescripts/entry.ts +++ b/typescripts/entry.ts @@ -4,3 +4,5 @@ export * as ultimate_sd_upscaler from './ultimate_sd_upscaler/ultimate_sd_upscal export * as scripts from './ultimate_sd_upscaler/scripts' export * as main from './main/main' export * as logger from './util/logger' +export * as image_search from './image_search/image_search' +export { toJS } from 'mobx' diff --git a/typescripts/image_search/image_search.tsx b/typescripts/image_search/image_search.tsx new file mode 100644 index 00000000..9e3aea2b --- /dev/null +++ b/typescripts/image_search/image_search.tsx @@ -0,0 +1,66 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import { observer } from 'mobx-react' +import { AStore } from '../main/astore' +import { Grid } from '../util/grid' +import { MoveToCanvasSvg } from '../util/elements' +import { io } from '../util/oldSystem' + +export const store = new AStore({ + images: [], + refresh: false, + width: 50, + height: 50, +}) + +async function urlToCanvas(url: string) { + const image_file_name = 'search_image_temp.png' + await io.IO.urlToLayer(url, image_file_name) +} + +const ImageSearch = observer(() => { + console.log('rendered') + return ( +
+ ) => { + const new_value = event.target.value + store.updateProperty('height', new_value) + store.updateProperty('width', new_value) + }} + show-value="true" + > + Image Size: + + { + urlToCanvas(store.data.images[index]) + }, + }, + ]} + > +
+ ) +}) + +const gridContainerNode = document.getElementById( + 'divImageSearchImagesContainer' + // 'search_second_panel' +)! +const gridRoot = ReactDOM.createRoot(gridContainerNode) + +let images: string[] = [] +gridRoot.render( + + + +) diff --git a/typescripts/main/astore.ts b/typescripts/main/astore.ts index 23b681ea..74753c37 100644 --- a/typescripts/main/astore.ts +++ b/typescripts/main/astore.ts @@ -20,6 +20,14 @@ export class AStore { updateProperty(key: keyof any, value: any) { ;(this.data as any)[key] = value } + updatePropertyArray(key: keyof any, value: any) { + this.data[key] = this.data[key].concat(value) + } + updatePropertyArrayRemove(key: keyof any, valueToRemove: any) { + this.data[key] = this.data[key].filter( + (item: any) => item !== valueToRemove + ) + } toJsFunc() { return toJS(this) diff --git a/typescripts/util/grid.tsx b/typescripts/util/grid.tsx new file mode 100644 index 00000000..efa764d1 --- /dev/null +++ b/typescripts/util/grid.tsx @@ -0,0 +1,86 @@ +import React from 'react' +import { ActionButtonSVG, Thumbnail } from './elements' + +export class Grid extends React.Component<{ + // thumbnails_data?: any[] + thumbnails?: string[] + width?: number + height?: number + action_buttons?: any[] + children?: React.ReactNode + callback?: any + clicked_index?: number + permanent_indices?: number[] + thumbnails_styles?: [] +}> { + static defaultProps = { + width: 100, + height: 100, + thumbnails: [], + thumbnails_styles: [], + } + + render() { + const img_style = { + width: `${this.props.width}px`, + // height: `${this.props.height}px`, + height: 'auto', + } + return ( +
+ {this.props?.thumbnails?.map((thumbnail, index: number) => { + // const thumbnail = this.props?.thumbnails + // thumbnail + // ? this.props?.thumbnails[index] + // : 'https://source.unsplash.com/random' + const thumbnail_class = this.props?.thumbnails_styles + ? this.props?.thumbnails_styles[index] + : '' + return ( + + { + try { + console.log('image clicked') + if (this.props.callback) { + this.props?.callback(index, event) + } + } catch (e) { + console.warn( + 'error was thrown while calling a callback method' + ) + console.warn(e) + } + }} + src={ + thumbnail ?? + 'https://source.unsplash.com/random' + } + className={`viewer-image-container ${thumbnail_class}`} + /> + + {this.props?.action_buttons?.map((button, i) => { + return ( + i < 4 && ( + { + button.callback(index) + }} + > + ) + ) + })} + + ) + })} + + {/*
+ {this.props?.children} +
*/} +
+ ) + } +} diff --git a/typescripts/util/oldSystem.tsx b/typescripts/util/oldSystem.tsx index d976e2c7..d4c4a6db 100644 --- a/typescripts/util/oldSystem.tsx +++ b/typescripts/util/oldSystem.tsx @@ -14,6 +14,9 @@ const html_manip = req('./utility/html_manip') const psapi = req('./psapi') const general = req('./utility/general') const io = req('./utility/io') +const settings_tab = req('./utility/tab/settings') +const layer_util = req('./utility/layer') +const session = req('./utility/session') export { selection, note, @@ -27,4 +30,7 @@ export { psapi, general, io, + settings_tab, + layer_util, + session, } diff --git a/utility/tab/image_search_tab.js b/utility/tab/image_search_tab.js index f2ea2c8a..e6f64a67 100644 --- a/utility/tab/image_search_tab.js +++ b/utility/tab/image_search_tab.js @@ -1,4 +1,5 @@ const sdapi = require('../../sdapi_py_re') +const { image_search } = require('../../typescripts/dist/bundle') const storage = require('uxp').storage const fs = storage.localFileSystem @@ -8,43 +9,13 @@ document .getElementById('btnImageSearch') .addEventListener('click', async function () { try { - // const output_dir_relative = "./server/python_server/" - const container = document.getElementById( - 'divImageSearchImagesContainer' - ) - // const uniqueDocumentId = await getUniqueDocumentId() - // const [image_paths, metadata_jsons] = await sdapi.loadHistory(uniqueDocumentId) const keywords = document.getElementById('imageSearchField').value const image_search_objs = await sdapi.imageSearch(keywords) - while (container.firstChild) { - container.removeChild(container.firstChild) - } - // let i = 0 - const temp_entry = await fs.getTemporaryFolder() - for (let image_search_obj of image_search_objs) { - const img = document.createElement('img') - // img.src = image_search_obj['image'] - - img.src = image_search_obj['thumbnail'] - - img.className = 'image-search' - // img.dataset.metadata_json_string = JSON.stringify(metadata_jsons[i]) - container.appendChild(img) - img.addEventListener('click', async (e) => { - console.log(`the image url: ${img.src}`) - const link = img.src - const image_file_name = 'search_image_temp.png' - await io.IO.urlToLayer(link, image_file_name) - // await downloadItExe(link, temp_entry, image_file_name) - - // const metadata_json = JSON.parse(e.target.dataset.metadata_json_string) - // console.log("metadata_json: ",metadata_json) - // document.querySelector('#tiSeed').value = metadata_json.Seed - // document.querySelector('#historySeedLabel').textContent = metadata_json.Seed - }) - // i++ - } + const thumbnails = image_search_objs.map((obj) => obj.thumbnail) + const src_list = image_search_objs.map((obj) => obj.image) + image_search.store.updateProperty('thumbnails', thumbnails) + image_search.store.updateProperty('images', src_list) } catch (e) { console.warn(`imageSearch warning: ${e}`) } From a0b7115546f16e25ba4748357376ab5aa6600c84 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 22 Jun 2023 14:52:49 +0300 Subject: [PATCH 030/143] Refactor the history tab using TypeScript, React, and MobX --- typescripts/entry.ts | 1 + typescripts/history/history.tsx | 145 ++++++++++++++++++++++++++++++++ typescripts/main/astore.ts | 1 + utility/tab/history_tab.js | 56 ++---------- 4 files changed, 154 insertions(+), 49 deletions(-) create mode 100644 typescripts/history/history.tsx diff --git a/typescripts/entry.ts b/typescripts/entry.ts index c6cac028..ed5430b0 100644 --- a/typescripts/entry.ts +++ b/typescripts/entry.ts @@ -5,4 +5,5 @@ export * as scripts from './ultimate_sd_upscaler/scripts' export * as main from './main/main' export * as logger from './util/logger' export * as image_search from './image_search/image_search' +export * as history from './history/history' export { toJS } from 'mobx' diff --git a/typescripts/history/history.tsx b/typescripts/history/history.tsx new file mode 100644 index 00000000..e885f907 --- /dev/null +++ b/typescripts/history/history.tsx @@ -0,0 +1,145 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import { observer } from 'mobx-react' +import { AStore, toJS } from '../main/astore' +import { Grid } from '../util/grid' +import { io, settings_tab } from '../util/oldSystem' +import { MoveToCanvasSvg, PenSvg } from '../util/elements' + +declare let g_ui_settings_object: any +export const store = new AStore({ + images: [], + refresh: false, + width: 50, + height: 50, + scale: 1, + metadata_jsons: [], +}) + +async function moveHistoryImageToLayer( + base64_image: string, + selection_info: any +) { + try { + const to_x = selection_info?.left + const to_y = selection_info?.top + const width = selection_info?.width + const height = selection_info?.height + await io.IO.base64ToLayer( + base64_image, + 'History Image', + to_x, + to_y, + width, + height + ) + } catch (e) { + console.warn(e) + } +} + +function getHistoryMetadata(metadata_json: any) { + //auto fill the ui with metadata + // const metadata_json = JSON.parse(img.dataset.metadata_json_string) + + console.log('metadata_json: ', metadata_json) + // document.querySelector('#tiSeed').value = metadata_json.Seed + + //extract auto_metadata into the preset metadata + function convertAutoMetadataToPresset(metadata_json: any) { + metadata_json['seed'] = metadata_json?.auto_metadata?.Seed + } + convertAutoMetadataToPresset(metadata_json) + + const b_use_original_prompt = settings_tab.getUseOriginalPrompt() + if (b_use_original_prompt) { + metadata_json['prompt'] = metadata_json?.original_prompt + ? metadata_json['original_prompt'] + : metadata_json['prompt'] + + metadata_json['negative_prompt'] = + metadata_json?.original_negative_prompt + ? metadata_json['original_negative_prompt'] + : metadata_json['negative_prompt'] + } else { + metadata_json['prompt'] = metadata_json['prompt'] + + metadata_json['negative_prompt'] = metadata_json['negative_prompt'] + } + // document.querySelector('#historySeedLabel').textContent = + // metadata_json?.seed + + g_ui_settings_object.autoFillInSettings(toJS(metadata_json)) +} + +const History = observer(() => { + return ( +
+ {/* {store.data.refresh} */} + ) => { + const new_value = event.target.value + store.updateProperty('height', new_value) + store.updateProperty('width', new_value) + }} + show-value="true" + value={100} + > + Image Size: + + + // base64 + // ? 'data:image/png;base64,' + base64 + // : 'https://source.unsplash.com/random' + // )} + thumbnails={store.data.thumbnails?.map((base64: string) => + base64 + ? 'data:image/png;base64,' + base64 + : 'https://source.unsplash.com/random' + )} + width={store.data.width} + height={store.data.height} + action_buttons={[ + { + ComponentType: PenSvg, + callback: (index: number) => { + try { + console.log( + store.toJsFunc().data.metadata_jsons[index] + ) + getHistoryMetadata( + store.data.metadata_jsons[index] + ) + } catch (e) { + console.warn(e) + } + }, + }, + { + ComponentType: MoveToCanvasSvg, + callback: (index: number) => { + moveHistoryImageToLayer( + store.data.images[index], + store.data.metadata_jsons[index][ + 'selection_info' + ] + ) + }, + }, + ]} + > +
+ ) +}) + +const gridContainerNode = document.getElementById('divHistoryImagesContainer')! +const gridRoot = ReactDOM.createRoot(gridContainerNode) + +gridRoot.render( + + + +) diff --git a/typescripts/main/astore.ts b/typescripts/main/astore.ts index 74753c37..feca8319 100644 --- a/typescripts/main/astore.ts +++ b/typescripts/main/astore.ts @@ -1,4 +1,5 @@ import { makeAutoObservable, reaction, toJS } from 'mobx' +export { toJS } from 'mobx' // import { Provider, inject, observer } from 'mobx-react' export class AStore { data: any diff --git a/utility/tab/history_tab.js b/utility/tab/history_tab.js index cf192bdd..4dffb7c1 100644 --- a/utility/tab/history_tab.js +++ b/utility/tab/history_tab.js @@ -1,7 +1,7 @@ const settings_tab = require('./settings') const sdapi = require('../../sdapi_py_re') const thumbnail = require('../../thumbnail') - +const { history } = require('../../typescripts/dist/bundle') //REFACTORED: moved to history_tab.js function getHistoryMetadata(img) { //auto fill the ui with metadata @@ -36,56 +36,13 @@ document .getElementById('btnLoadHistory') .addEventListener('click', async function () { try { - const output_dir_relative = './server/python_server/' - const container = document.getElementById( - 'divHistoryImagesContainer' - ) const uniqueDocumentId = await getUniqueDocumentId() const [image_paths, metadata_jsons, base64_images] = await sdapi.loadHistory(uniqueDocumentId) - while (container.firstChild) { - container.removeChild(container.firstChild) - } - - const length = image_paths.length - // let i = length -1 - - // for (image_path of image_paths) { - for (let i = length - 1; i >= 0; --i) { - const img = document.createElement('img') - // img.src = `${output_dir_relative}/${image_path}` - const image_src = `data:image/png;base64, ${base64_images[i]}` - img.src = image_src - - img.dataset.path = `${output_dir_relative}/${image_paths[i]}` - img.className = 'history-image' - img.dataset.metadata_json_string = JSON.stringify( - metadata_jsons[i] - ) - console.log(`metadata_jsons[${i}]: `, metadata_jsons[i]) - - const img_container = thumbnail.Thumbnail.wrapImgInContainer( - img, - 'viewer-image-container' - ) - thumbnail.Thumbnail.addSPButtonToContainer( - img_container, - 'svg_sp_btn', - 'copy metadata to settings', - history_tab.getHistoryMetadata, - img - ) - thumbnail.Thumbnail.addSPButtonToContainer( - img_container, - 'svg_sp_btn_datadownload', - 'place the image on the canvas', - moveHistoryImageToLayer, - img - ) - container.appendChild(img_container) - // i++ - } + history.store.updateProperty('images', base64_images) + history.store.updateProperty('thumbnails', base64_images) + history.store.updateProperty('metadata_jsons', metadata_jsons) } catch (e) { console.warn(`loadHistory warning: ${e}`) } @@ -93,8 +50,9 @@ document document .getElementById('btnClearHistoryCache') .addEventListener('click', () => { - const container = document.getElementById('divHistoryImagesContainer') - container.innerHTML = '' + history.store.updateProperty('images', []) + history.store.updateProperty('thumbnails', []) + history.store.updateProperty('metadata_jsons', []) }) module.exports = { getHistoryMetadata, From fc166c8f7107016e115df756392e9df876d73e65 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 22 Jun 2023 15:01:19 +0300 Subject: [PATCH 031/143] add ControlNet tab to the second plugin's panel --- typescripts/controlnet/main.tsx | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/typescripts/controlnet/main.tsx b/typescripts/controlnet/main.tsx index 27bddc51..3e10acce 100644 --- a/typescripts/controlnet/main.tsx +++ b/typescripts/controlnet/main.tsx @@ -3,11 +3,36 @@ import React from 'react' import ControlNetTab from './ControlNetTab' import store from './store' import { versionCompare } from './util' +import Collapsible from '../after_detailer/after_detailer' const elem = document.getElementById('sp-control_net-tab-page') +const elem2 = document.getElementById('sp-control_net-tab-page2') + if (elem) { const root = ReactDOM.createRoot(elem) root.render() } +if (elem2) { + const root = ReactDOM.createRoot(elem2) + root.render( + +
+ +
+ +
+
+
+
+ ) +} export { store, versionCompare } From 8502cefd4773a131abec800cf03f78acdc388886 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 22 Jun 2023 15:18:20 +0300 Subject: [PATCH 032/143] refactor: move saveFileInSubFolder, saveJsonFileInSubFolder to io.js --- index.js | 68 +++-------------------------------- sdapi_py_re.js | 2 +- utility/io.js | 62 ++++++++++++++++++++++++++++++++ utility/sdapi/horde_native.js | 6 ++-- 4 files changed, 70 insertions(+), 68 deletions(-) diff --git a/index.js b/index.js index a6b2cd66..d6d0bd0c 100644 --- a/index.js +++ b/index.js @@ -2661,14 +2661,14 @@ async function generate(settings, mode) { const base64_image = image_info['base64'] g_generation_session.base64OutputImages[path] = base64_image const [document_name, image_name] = path.split('/') - await saveFileInSubFolder( + await io.saveFileInSubFolder( base64_image, document_name, image_name ) //save the output image const json_file_name = `${image_name.split('.')[0]}.json` settings['auto_metadata'] = image_info?.auto_metadata - await saveJsonFileInSubFolder( + await io.saveJsonFileInSubFolder( settings, document_name, json_file_name @@ -2687,14 +2687,14 @@ async function generate(settings, mode) { const base64_image = image_info['base64'] g_generation_session.base64OutputImages[path] = base64_image const [document_name, image_name] = path.split('/') - await saveFileInSubFolder( + await io.saveFileInSubFolder( base64_image, document_name, image_name ) const json_file_name = `${image_name.split('.')[0]}.json` settings['auto_metadata'] = image_info?.auto_metadata - await saveJsonFileInSubFolder( + await io.saveJsonFileInSubFolder( settings, document_name, json_file_name @@ -3195,67 +3195,7 @@ async function getInitImagesDir() { } return init_folder } -//REFACTOR: move to document.js -async function saveFileInSubFolder(b64Image, sub_folder_name, file_name) { - // const b64Image = - // 'iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAADMElEQVR4nOzVwQnAIBQFQYXff81RUkQCOyDj1YOPnbXWPmeTRef+/3O/OyBjzh3CD95BfqICMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMO0TAAD//2Anhf4QtqobAAAAAElFTkSuQmCC' - - const img = _base64ToArrayBuffer(b64Image) - - // const img_name = 'temp_output_image.png' - const img_name = file_name - const folder = await storage.localFileSystem.getDataFolder() - const documentFolderName = sub_folder_name - let documentFolder - try { - documentFolder = await folder.getEntry(documentFolderName) - } catch (e) { - console.warn(e) - //create document folder - documentFolder = await folder.createFolder(documentFolderName) - } - - console.log('documentFolder.nativePath: ', documentFolder.nativePath) - const file = await documentFolder.createFile(img_name, { overwrite: true }) - - await file.write(img, { format: storage.formats.binary }) - - const token = await storage.localFileSystem.createSessionToken(file) // batchPlay requires a token on _path -} -//REFACTOR: move to document.js -async function saveJsonFileInSubFolder(json, sub_folder_name, file_name) { - // const b64Image = - // 'iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAADMElEQVR4nOzVwQnAIBQFQYXff81RUkQCOyDj1YOPnbXWPmeTRef+/3O/OyBjzh3CD95BfqICMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMO0TAAD//2Anhf4QtqobAAAAAElFTkSuQmCC' - - // const img_name = 'temp_output_image.png' - - const json_file_name = file_name - const folder = await storage.localFileSystem.getDataFolder() - const documentFolderName = sub_folder_name - let documentFolder - try { - documentFolder = await folder.getEntry(documentFolderName) - } catch (e) { - console.warn(e) - //create document folder - documentFolder = await folder.createFolder(documentFolderName) - } - - console.log('documentFolder.nativePath: ', documentFolder.nativePath) - const file = await documentFolder.createFile(json_file_name, { - type: storage.types.file, - overwrite: true, - }) - - const JSONInPrettyFormat = JSON.stringify(json, undefined, 4) - await file.write(JSONInPrettyFormat, { - format: storage.formats.utf8, - append: false, - }) - - const token = await storage.localFileSystem.createSessionToken(file) // batchPlay requires a token on _path -} //REFACTOR: move to document.js async function base64ToFile(b64Image, image_name = 'output_image.png') { // const b64Image = diff --git a/sdapi_py_re.js b/sdapi_py_re.js index 8b96c913..39d1fe2b 100644 --- a/sdapi_py_re.js +++ b/sdapi_py_re.js @@ -18,7 +18,7 @@ async function requestSavePng(base64_image, image_name) { const uniqueDocumentId = await getUniqueDocumentId() const folder = `${uniqueDocumentId}/init_images` const init_entry = await getInitImagesDir() - saveFileInSubFolder(base64_image, folder, image_name) + io.saveFileInSubFolder(base64_image, folder, image_name) console.warn('this function is deprecated') } catch (e) { console.warn(e) diff --git a/utility/io.js b/utility/io.js index e89d8f85..f1d7d090 100644 --- a/utility/io.js +++ b/utility/io.js @@ -821,6 +821,66 @@ class IOJson { } } +async function saveFileInSubFolder(b64Image, sub_folder_name, file_name) { + // const b64Image = + // 'iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAADMElEQVR4nOzVwQnAIBQFQYXff81RUkQCOyDj1YOPnbXWPmeTRef+/3O/OyBjzh3CD95BfqICMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMO0TAAD//2Anhf4QtqobAAAAAElFTkSuQmCC' + + const img = _base64ToArrayBuffer(b64Image) + + // const img_name = 'temp_output_image.png' + const img_name = file_name + const folder = await storage.localFileSystem.getDataFolder() + const documentFolderName = sub_folder_name + let documentFolder + try { + documentFolder = await folder.getEntry(documentFolderName) + } catch (e) { + console.warn(e) + //create document folder + documentFolder = await folder.createFolder(documentFolderName) + } + + console.log('documentFolder.nativePath: ', documentFolder.nativePath) + const file = await documentFolder.createFile(img_name, { overwrite: true }) + + await file.write(img, { format: storage.formats.binary }) + + const token = await storage.localFileSystem.createSessionToken(file) // batchPlay requires a token on _path +} +//REFACTOR: move to document.js +async function saveJsonFileInSubFolder(json, sub_folder_name, file_name) { + // const b64Image = + // 'iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAADMElEQVR4nOzVwQnAIBQFQYXff81RUkQCOyDj1YOPnbXWPmeTRef+/3O/OyBjzh3CD95BfqICMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMO0TAAD//2Anhf4QtqobAAAAAElFTkSuQmCC' + + // const img_name = 'temp_output_image.png' + + const json_file_name = file_name + + const folder = await storage.localFileSystem.getDataFolder() + const documentFolderName = sub_folder_name + let documentFolder + try { + documentFolder = await folder.getEntry(documentFolderName) + } catch (e) { + console.warn(e) + //create document folder + documentFolder = await folder.createFolder(documentFolderName) + } + + console.log('documentFolder.nativePath: ', documentFolder.nativePath) + const file = await documentFolder.createFile(json_file_name, { + type: storage.types.file, + overwrite: true, + }) + + const JSONInPrettyFormat = JSON.stringify(json, undefined, 4) + await file.write(JSONInPrettyFormat, { + format: storage.formats.utf8, + append: false, + }) + + const token = await storage.localFileSystem.createSessionToken(file) // batchPlay requires a token on _path +} module.exports = { IO, snapShotLayerExe, @@ -832,4 +892,6 @@ module.exports = { convertBlackAndWhiteImageToRGBChannels2, convertBlackAndWhiteImageToRGBChannels3, isBlackAndWhiteImage, + saveFileInSubFolder, + saveJsonFileInSubFolder, } diff --git a/utility/sdapi/horde_native.js b/utility/sdapi/horde_native.js index b0bcb44d..1179b032 100644 --- a/utility/sdapi/horde_native.js +++ b/utility/sdapi/horde_native.js @@ -139,7 +139,7 @@ class hordeGenerator { const base64_image = _arrayBufferToBase64(image_buffer) //convert the buffer to base64 //send the base64 to the server to save the file in the desired directory // await sdapi.requestSavePng(base64_image, image_name) - await saveFileInSubFolder(base64_image, document_name, image_name) + await io.saveFileInSubFolder(base64_image, document_name, image_name) return base64_image } @@ -156,7 +156,7 @@ class hordeGenerator { const base64_image = _arrayBufferToBase64(image_buffer) //convert the buffer to base64 //send the base64 to the server to save the file in the desired directory // await sdapi.requestSavePng(base64_image, image_name) - await saveFileInSubFolder(base64_image, document_name, image_name) + await io.saveFileInSubFolder(base64_image, document_name, image_name) return base64_image } @@ -249,7 +249,7 @@ class hordeGenerator { g_generation_session.base64OutputImages[path] = image_info['base64'] - await saveJsonFileInSubFolder( + await io.saveJsonFileInSubFolder( this.plugin_settings, document_name, json_file_name From 4dbd089c8397a908988df138f21e2aa51d7e1f74 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Fri, 23 Jun 2023 04:12:31 +0300 Subject: [PATCH 033/143] add preview submenu in the main sd tab --- index.html | 3 ++ index.js | 2 + typescripts/entry.ts | 1 + typescripts/session/progress.ts | 77 ++++++++++++++++++++++++++++ typescripts/util/elements.tsx | 1 + typescripts/viewer/preview.tsx | 69 +++++++++++++++++++++++++ typescripts/viewer/style/preview.css | 6 +++ 7 files changed, 159 insertions(+) create mode 100644 typescripts/session/progress.ts create mode 100644 typescripts/viewer/preview.tsx create mode 100644 typescripts/viewer/style/preview.css diff --git a/index.html b/index.html index 831f9303..25cbf7e9 100644 --- a/index.html +++ b/index.html @@ -3029,6 +3029,9 @@
+
+ +
diff --git a/index.js b/index.js index d6d0bd0c..c0b50e0a 100644 --- a/index.js +++ b/index.js @@ -58,6 +58,7 @@ const { after_detailer_script, control_net, logger, + preview, } = require('./typescripts/dist/bundle') const io = require('./utility/io') @@ -2916,6 +2917,7 @@ async function progressRecursive() { Enum.RequestStateEnum['Generating'] ) { const base64_url = general.base64ToBase64Url(json.current_image) + preview.store.updateProperty('image', json.current_image) const progress_image_html = document.getElementById('progressImage') const container_width = document.querySelector( diff --git a/typescripts/entry.ts b/typescripts/entry.ts index ed5430b0..0ef15d19 100644 --- a/typescripts/entry.ts +++ b/typescripts/entry.ts @@ -6,4 +6,5 @@ export * as main from './main/main' export * as logger from './util/logger' export * as image_search from './image_search/image_search' export * as history from './history/history' +export * as preview from './viewer/preview' export { toJS } from 'mobx' diff --git a/typescripts/session/progress.ts b/typescripts/session/progress.ts new file mode 100644 index 00000000..b6c2ff9b --- /dev/null +++ b/typescripts/session/progress.ts @@ -0,0 +1,77 @@ +import { AStore } from '../main/astore' +import { layer_util } from '../util/oldSystem' + +export const store = new AStore({ + progress_layer: null, + timer_id: null, + progress_value: 0, + progress_image: '', + can_update: true, +}) +declare let g_sd_url: string + +export async function requestProgress() { + try { + console.log('requestProgress: ') + + const full_url = `${g_sd_url}/sdapi/v1/progress?skip_current_image=false` + let request = await fetch(full_url) + const json = await request.json() + // console.log('progress json:', json) + + return json + } catch (e) { + console.warn(e) + // console.log('json: ', json) + } + return null +} + +export class Progress { + static timer_id: any = null + static async deleteProgressImage() { + // preview.store.updateProperty('image', null) + + await this.deleteProgressLayer() + } + + static async deleteProgressLayer() { + try { + await layer_util.deleteLayers([store.data.progress_layer]) // delete the old progress layer + } catch (e) { + console.warn(e) + } + } + + static startTimer(callback: any, interval: number = 1000) { + store.data.can_update = true + //clear the old timer if it exist + try { + store.data.progress_value = 0 + store.data.progress_image = '' + this.timer_id = clearInterval(this.timer_id) + } catch (e) { + console.warn(e) + } + + this.timer_id = setInterval(callback, interval) + } + + static endTimer(callback: any) { + try { + this.timer_id = clearInterval(this.timer_id) + store.data.can_update = false + } catch (e) { + console.warn(e) + } + try { + callback() + } catch (e) { + console.warn(e) + } + } +} + +export class ProgressAutomatic extends Progress {} + +export class ProgressHordeNative {} diff --git a/typescripts/util/elements.tsx b/typescripts/util/elements.tsx index 94852cdb..a00548ff 100644 --- a/typescripts/util/elements.tsx +++ b/typescripts/util/elements.tsx @@ -21,6 +21,7 @@ declare global { 'sp-detail': any 'sp-textarea': any 'sp-action-button': any + 'sp-progressbar': any } } } diff --git a/typescripts/viewer/preview.tsx b/typescripts/viewer/preview.tsx new file mode 100644 index 00000000..c0e8d347 --- /dev/null +++ b/typescripts/viewer/preview.tsx @@ -0,0 +1,69 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' + +import Collapsible from '../after_detailer/after_detailer' +import { observer } from 'mobx-react' +import { AStore } from '../main/astore' +import { progress } from '../entry' +import './style/preview.css' +export const store = new AStore({ + // image: '', + // progress_value: 0, +}) + +const Previewer = observer(() => { + const renderImage = () => { + let preview_img_html + if (progress.store.data.progress_image) { + preview_img_html = ( + + ) + } + return ( +
+ + {progress.store.data.progress_image ? preview_img_html : void 0} +
+ ) + } + return
{renderImage()}
+}) + +const containers = document.querySelectorAll('.previewContainer') + +containers.forEach((container) => { + const root = ReactDOM.createRoot(container) + + root.render( + +
+ + + +
+
+ ) +}) + +// // const node = document.getElementById('previewContainer')! +// const root = ReactDOM.createRoot(node) + +// root.render( +// +//
+// +// +// +//
+//
+// ) diff --git a/typescripts/viewer/style/preview.css b/typescripts/viewer/style/preview.css new file mode 100644 index 00000000..0437d3aa --- /dev/null +++ b/typescripts/viewer/style/preview.css @@ -0,0 +1,6 @@ +.preview_progress_bar { + border-left: 2px solid #3e3e3e; + border-right: 2px solid #3e3e3e; + margin: 0; + width: 100%; +} \ No newline at end of file From f7d4b0a295debdb9308a29160d0ac32d52034444 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Fri, 23 Jun 2023 04:30:13 +0300 Subject: [PATCH 034/143] functionalities to generate init image and masks for each sd mode --- utility/io.js | 307 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 305 insertions(+), 2 deletions(-) diff --git a/utility/io.js b/utility/io.js index f1d7d090..ddbf0cb5 100644 --- a/utility/io.js +++ b/utility/io.js @@ -216,6 +216,7 @@ class IO { new_doc.width, new_doc.height ) // + await layer_util.Layer.moveTo(new_layer, 0, 0) //move to the top left corner // await IOHelper.saveAsWebpExe(doc_entry) //save current document as .webp file, save it into doc_entry folder @@ -565,13 +566,22 @@ class IOHelper { const crop_h = selectionInfo.height const base64_url_result = await Jimp.read(arrayBuffer) .then(async (img) => { - let cropped_img = await img.crop(crop_x, crop_y, crop_w, crop_h) + let cropped_img = await img.crop( + crop_x, + crop_y, + crop_w, + crop_h + // crop_w - 1, + // crop_h - 1 + ) let resized_img if (b_resize) { resized_img = await cropped_img.resize( resize_width, - resize_height + resize_height, + // Jimp.RESIZE_BILINEAR + Jimp.RESIZE_NEAREST_NEIGHBOR ) } else { resized_img = cropped_img @@ -821,6 +831,201 @@ class IOJson { } } +async function createThumbnail(base64Image, width = 100) { + const image = await Jimp.read(Buffer.from(base64Image, 'base64')) + image.resize(width, Jimp.AUTO, Jimp.RESIZE_NEAREST_NEIGHBOR) + const thumbnail = await image.getBase64Async(Jimp.MIME_PNG) + return thumbnail +} + +async function getImageFromCanvas() { + const width = html_manip.getWidth() + const height = html_manip.getHeight() + const selectionInfo = await psapi.getSelectionInfoExe() + const base64 = await io.IO.getSelectionFromCanvasAsBase64Interface_New( + width, + height, + selectionInfo, + true + ) + return base64 +} +async function getBase64FromJimp(jimp_image) { + const dataURL = await jimp_image.getBase64Async(Jimp.MIME_PNG) + const base64 = dataURL.replace(/^data:image\/png;base64,/, '') + return base64 +} + +function transparentToMask(x, y, idx) { + const alpha = this.bitmap.data[idx + 3] + let color + if (alpha === 0) { + color = 0xffffffff + } else if (alpha === 255) { + color = 0x000000ff + } else { + color = Jimp.rgbaToInt(alpha, alpha, alpha, 255) + } + this.setPixelColor(color, x, y) +} +function inpaintTransparentToMask(x, y, idx) { + const alpha = this.bitmap.data[idx + 3] + let color + // if (alpha === 0) { + // color = 0x000000ff + // } else if (alpha === 255) { + // color = 0xffffffff + // } else { + // color = Jimp.rgbaToInt(alpha, alpha, alpha, 255) + // } + + if (alpha === 0) { + color = 0x000000ff + } else { + color = 0xffffffff + } + this.setPixelColor(color, x, y) +} +function transparentToWhiteBackground(x, y, idx) { + const alpha = this.bitmap.data[idx + 3] + let color + if (alpha === 0) { + color = 0xffffffff + } else { + color = Jimp.rgbaToInt( + this.bitmap.data[idx], + this.bitmap.data[idx + 1], + this.bitmap.data[idx + 2], + 255 + ) // remove transparency but keep the color, This is bad. used as workaround Auto1111 not able to handle alpha channels + } + this.setPixelColor(color, x, y) +} +async function getMask() { + try { + let b = app.activeDocument.backgroundLayer + await executeAsModal(() => (b.visible = false)) + const base64 = await getImageFromCanvas() + await executeAsModal(() => (b.visible = true)) + const jimp_image = await Jimp.read(Buffer.from(base64, 'base64')) + + const jimp_mask = await jimp_image.scan( + 0, + 0, + jimp_image.bitmap.width, + jimp_image.bitmap.height, + transparentToMask + ) + html_manip.setInitImageSrc( + await jimp_mask.getBase64Async(Jimp.MIME_PNG) + ) + const mask = await getBase64FromJimp(jimp_mask) + return mask + } catch (e) { + console.warn(e) + } +} + +async function getImg2ImgInitImage() { + //the init image will has transparent pixel in it + //the mask will be a grayscale image/white and black + try { + let b = app.activeDocument.backgroundLayer + await executeAsModal(() => (b.visible = false)) + const base64 = await getImageFromCanvas() + await executeAsModal(() => (b.visible = true)) + const init_image = base64 + + html_manip.setInitImageSrc(general.base64ToBase64Url(init_image)) // convert jimp_image to img.src data + + // console.log('mask: ', mask) + return init_image + } catch (e) { + console.warn(e) + } +} +async function getOutpaintInitImageAndMask() { + //the init image will has transparent pixel in it + //the mask will be a grayscale image/white and black + try { + let b = app.activeDocument.backgroundLayer + await executeAsModal(() => (b.visible = false)) + const base64 = await getImageFromCanvas() + await executeAsModal(() => (b.visible = true)) + const init_image = base64 + let jimp_init = await Jimp.read(Buffer.from(base64, 'base64')) + + let jimp_mask = await jimp_init + .clone() + .scan( + 0, + 0, + jimp_init.bitmap.width, + jimp_init.bitmap.height, + transparentToMask + ) + // jimp_init = await jimp_init.scan( + // 0, + // 0, + // jimp_init.bitmap.width, + // jimp_init.bitmap.height, + // transparentToWhiteBackground + // // transparentToMask + // ) + html_manip.setInitImageMaskSrc( + await jimp_mask.getBase64Async(Jimp.MIME_PNG) + ) // convert jimp_image to img.src data + html_manip.setInitImageSrc( + await jimp_init.getBase64Async(Jimp.MIME_PNG) + ) // convert jimp_image to img.src data + + const mask = await getBase64FromJimp(jimp_mask) + // console.log('mask: ', mask) + return { + init_image, + mask, + } + } catch (e) { + console.warn(e) + } +} + +async function getInpaintInitImageAndMask() { + try { + await executeAsModal(async () => await layer_util.toggleActiveLayer()) //only white mark layer should be visible + const mask_base64 = await getImageFromCanvas() + await executeAsModal(async () => { + await layer_util.toggleActiveLayer() // undo the toggling operation, active layer will be visible + app.activeDocument.activeLayers[0].visible = false //hide the white mark + }) + const init_base64 = await getImageFromCanvas() + + let jimp_mask = await Jimp.read(Buffer.from(mask_base64, 'base64')) //make jimp object + let jimp_init = await Jimp.read(Buffer.from(init_base64, 'base64')) //make jimp object, jimp_init will have transparent pixels, should we convert to white?? + + jimp_mask = await jimp_mask.scan( + 0, + 0, + jimp_mask.bitmap.width, + jimp_mask.bitmap.height, + inpaintTransparentToMask + ) //convert transparent image to black and white image + + html_manip.setInitImageMaskSrc( + await jimp_mask.getBase64Async(Jimp.MIME_PNG) + ) + html_manip.setInitImageSrc( + await jimp_init.getBase64Async(Jimp.MIME_PNG) + ) + + const mask = await getBase64FromJimp(jimp_mask) + const init_image = await getBase64FromJimp(jimp_init) + return { init_image, mask } + } catch (e) { + console.warn(e) + } +} + async function saveFileInSubFolder(b64Image, sub_folder_name, file_name) { // const b64Image = // 'iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAADMElEQVR4nOzVwQnAIBQFQYXff81RUkQCOyDj1YOPnbXWPmeTRef+/3O/OyBjzh3CD95BfqICMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMO0TAAD//2Anhf4QtqobAAAAAElFTkSuQmCC' @@ -881,6 +1086,95 @@ async function saveJsonFileInSubFolder(json, sub_folder_name, file_name) { const token = await storage.localFileSystem.createSessionToken(file) // batchPlay requires a token on _path } +async function fixTransparentEdges(base64) { + function transparentToOpaque(x, y, idx) { + const alpha = this.bitmap.data[idx + 3] + if (alpha > 0 && alpha < 255) { + this.bitmap.data[idx + 3] = 0 //make semi transparent pixels completely transparent + } + } + + try { + let jimp_img = await Jimp.read(Buffer.from(base64, 'base64')) + + jimp_img = await jimp_img.scan( + 0, + 0, + jimp_img.bitmap.width, + jimp_img.bitmap.height, + transparentToOpaque + ) + const opaque_base64 = await getBase64FromJimp(jimp_img) + return opaque_base64 + } catch (e) { + console.warn(e) + } +} + +async function maskFromInitImage(base64) { + function setTransparentToBlack(x, y, idx) { + let alpha = this.bitmap.data[idx + 3] + if (alpha !== 0) { + this.bitmap.data[idx] = 0 + this.bitmap.data[idx + 1] = 0 + this.bitmap.data[idx + 2] = 0 + this.bitmap.data[idx + 3] = 255 + } else { + //alpha === 0 + + this.bitmap.data[idx] = 255 + this.bitmap.data[idx + 1] = 255 + this.bitmap.data[idx + 2] = 255 + this.bitmap.data[idx + 3] = 255 + } + } + + try { + let jimp_img = await Jimp.read(Buffer.from(base64, 'base64')) + + jimp_img = await jimp_img.scan( + 0, + 0, + jimp_img.bitmap.width, + jimp_img.bitmap.height, + setTransparentToBlack + ) + const mask_base64 = await getBase64FromJimp(jimp_img) + return mask_base64 + } catch (e) { + console.warn(e) + } +} +async function fixMaskEdges(base64) { + function grayScaleToBlack(x, y, idx) { + if ( + this.bitmap.data[idx] !== 255 || + this.bitmap.data[idx + 1] !== 255 || + this.bitmap.data[idx + 2] !== 255 + ) { + this.bitmap.data[idx] = 0 + this.bitmap.data[idx + 1] = 0 + this.bitmap.data[idx + 2] = 0 + } + } + + try { + let jimp_img = await Jimp.read(Buffer.from(base64, 'base64')) + + jimp_img = await jimp_img.scan( + 0, + 0, + jimp_img.bitmap.width, + jimp_img.bitmap.height, + grayScaleToBlack + ) + const opaque_base64 = await getBase64FromJimp(jimp_img) + return opaque_base64 + } catch (e) { + console.warn(e) + } +} + module.exports = { IO, snapShotLayerExe, @@ -892,6 +1186,15 @@ module.exports = { convertBlackAndWhiteImageToRGBChannels2, convertBlackAndWhiteImageToRGBChannels3, isBlackAndWhiteImage, + createThumbnail, + getMask, + getOutpaintInitImageAndMask, + getInpaintInitImageAndMask, + getImg2ImgInitImage, saveFileInSubFolder, saveJsonFileInSubFolder, + fixTransparentEdges, + fixMaskEdges, + maskFromInitImage, + getImageFromCanvas, } From 527139468c750d64b281ee2b0a406882f263a363 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Fri, 23 Jun 2023 04:42:59 +0300 Subject: [PATCH 035/143] reimplement the viewer tab functionality in typescript, react, and mobx --- index.html | 27 +- index.js | 495 +++++++++++----------------------- psapi.js | 11 +- sdapi_py_re.js | 4 +- selection.js | 394 +++++++++++++++++++++------ typescripts/entry.ts | 2 + typescripts/util/ts/io.ts | 26 ++ typescripts/viewer/viewer.tsx | 433 +++++++++++++++++++++++++++++ utility/layer.js | 138 +++++++++- utility/session.js | 318 ++++++++++++++++++++++ 10 files changed, 1402 insertions(+), 446 deletions(-) create mode 100644 typescripts/util/ts/io.ts create mode 100644 typescripts/viewer/viewer.tsx diff --git a/index.html b/index.html index 25cbf7e9..37bbed1e 100644 --- a/index.html +++ b/index.html @@ -906,9 +906,6 @@ > Interrupt -
- @@ -1952,12 +1944,6 @@
-
+
+
@@ -3029,9 +3016,19 @@
+ + + + +
+ +
+
+ +
diff --git a/index.js b/index.js index c0b50e0a..5f9c08c5 100644 --- a/index.js +++ b/index.js @@ -16,14 +16,14 @@ const sdapi = require('./sdapi_py_re') const outpaint = require('./outpaint') const psapi = require('./psapi') const app = window.require('photoshop').app - +const constants = require('photoshop').constants const { batchPlay } = require('photoshop').action const { executeAsModal } = require('photoshop').core const dialog_box = require('./dialog_box') // const {entrypoints} = require('uxp') const html_manip = require('./utility/html_manip') // const export_png = require('./export_png') -const viewer = require('./viewer') +const viewerJs = require('./viewer') const selection = require('./selection') const layer_util = require('./utility/layer') const sd_options = require('./utility/sdapi/options') @@ -58,7 +58,10 @@ const { after_detailer_script, control_net, logger, + toJS, + viewer, preview, + progress, } = require('./typescripts/dist/bundle') const io = require('./utility/io') @@ -133,6 +136,7 @@ let g_horde_generator = new horde_native.hordeGenerator() let g_automatic_status = Enum.AutomaticStatusEnum['Offline'] let g_models_status = false let g_current_batch_index = 0 +let g_is_laso_inapint_mode = true //REFACTOR: move to session.js async function hasSessionSelectionChanged() { try { @@ -773,7 +777,7 @@ const backendTypeEnum = { } g_generation_session.mode = generationMode['Txt2Img'] -let g_viewer_manager = new viewer.ViewerManager() +let g_viewer_manager = new viewerJs.ViewerManager() //********** End: global variables */ @@ -1485,7 +1489,7 @@ async function acceptAll() { try { if ( viewer_image_obj.isActive() && - viewer_image_obj instanceof viewer.OutputImage + viewer_image_obj instanceof viewerJs.OutputImage ) { //check if the active viewer_image_obj is a type of OutputImage and move it to the top of the output group folder //this is so when we accept all layers the canvas will look the same. otherwise the image could be cover by another generated image @@ -1858,311 +1862,7 @@ function updateMetadata(new_metadata) { } return metadatas } -//REFACTOR: move to generation_settings.js -async function getSettings() { - let payload = {} - - try { - const extension_type = settings_tab.getExtensionType() // get the extension type - const selectionInfo = await psapi.getSelectionInfoExe() - payload['selection_info'] = selectionInfo - const numberOfBatchSize = parseInt( - document.querySelector('#tiNumberOfBatchSize').value - ) - const numberOfSteps = document.querySelector('#tiNumberOfSteps').value - const prompt = html_manip.getPrompt() - const negative_prompt = html_manip.getNegativePrompt() - const hi_res_fix = html_manip.getHiResFixs() - // console.log("prompt:",prompt) - // console.log("negative_prompt:",negative_prompt) - const model_index = document.querySelector('#mModelsMenu').selectedIndex - const upscaler = document.querySelector('#hrModelsMenu').value - const cfg_scale = document.querySelector('#slCfgScale').value - // const model_index = document.querySelector("#") - - function calculateSeed(init_seed, batch_index, batch_size) { - if (init_seed === -1) return -1 - const seed = init_seed + batch_index * batch_size - return seed - } - - const init_seed = parseInt(document.querySelector('#tiSeed').value) - const seed = calculateSeed( - init_seed, - g_current_batch_index, - numberOfBatchSize - ) - - // const mask_blur = document.querySelector('#slMaskBlur').value - const use_sharp_mask = settings_tab.getUseSharpMask() - const mask_blur = html_manip.getMaskBlur() - const mask_expansion = document.getElementById('slMaskExpansion').value - - const inpaint_full_res_padding = - document.querySelector('#slInpaintPadding').value - - // console.dir(numberOfImages) - const bUsePromptShortcut = document.getElementById( - 'chUsePromptShortcut' - ).checked - let prompt_shortcut_ui_dict = {} - try { - let prompt_shortcut_string = - document.getElementById('taPromptShortcut').value - prompt_shortcut_ui_dict = JSON.parse(prompt_shortcut_string) - } catch (e) { - console.warn( - `warning prompt_shortcut_ui_dict is not valid Json obj: ${e}` - ) - prompt_shortcut_ui_dict = {} - } - - // const slider_width = document.getElementById("slWidth").value - // gWidth = getWidthFromSlider(slider_width) - const original_width = html_manip.getWidth() - const original_height = html_manip.getHeight() - - const width = general.nearestMultiple(original_width, 64) - const height = general.nearestMultiple(original_height, 64) - - const hWidth = html_manip.getSliderSdValue_Old('hrWidth', 64) - const hHeight = html_manip.getSliderSdValue_Old('hrHeight', 64) - const hSteps = html_manip.getSliderSdValue_Old('hrNumberOfSteps', 1) - //const hScale = html_manip.getSliderSdValue_Old('hrScale',1) - console.log('Check') - - const uniqueDocumentId = await getUniqueDocumentId() - const h_denoising_strength = html_manip.getSliderSdValue_Old( - 'hrDenoisingStrength', - 0.01 - ) - console.log('Check2') - - //Note: store the sampler names in json file if auto is offline or auto api is unmounted - - const sampler_name = html_manip.getCheckedSamplerName() - - const mode = html_manip.getMode() - const b_restore_faces = - document.getElementById('chRestoreFaces').checked - - let denoising_strength = h_denoising_strength - if (mode == 'inpaint' || mode == 'outpaint') { - var g_use_mask_image = true - payload['inpaint_full_res'] = - document.getElementById('chInpaintFullRes').checked - payload['inpaint_full_res_padding'] = inpaint_full_res_padding * 4 - - console.log('g_use_mask_image is ', g_use_mask_image) - console.log('g_init_image_mask_name is ', g_init_image_mask_name) - payload['init_image_mask_name'] = g_init_image_mask_name - payload['inpainting_fill'] = html_manip.getMaskContent() - payload['mask_expansion'] = mask_expansion - payload['mask'] = g_generation_session.activeBase64MaskImage - - if (use_sharp_mask === false && payload['mask']) { - //only if mask is available and sharp_mask is off - // use blurry and expanded mask - const iterations = payload['mask_expansion'] - const mask = await py_re.maskExpansionRequest( - payload['mask'], - iterations - ) - if (mask) { - g_generation_session.base64maskExpansionImage = mask - payload['mask'] = mask - } - } - } else if (mode == 'img2img') { - var g_use_mask_image = false - delete payload['inpaint_full_res'] // inpaint full res is not available in img2img mode - delete payload['inpaint_full_res_padding'] - delete payload['init_image_mask_name'] - delete payload['inpainting_fill'] - } - - if ( - g_sd_mode == 'img2img' || - g_sd_mode == 'inpaint' || - g_sd_mode == 'outpaint' - ) { - console.log(`g_use_mask_image:? ${g_use_mask_image}`) - - denoising_strength = html_manip.getDenoisingStrength() - payload['denoising_strength'] = denoising_strength - payload['init_image_name'] = g_init_image_name - - payload['init_images'] = [ - g_generation_session.activeBase64InitImage, - ] - payload['image_cfg_scale'] = sd_tab.getImageCfgScaleSDValue() // we may need to check if model is pix2pix - - if ( - scripts.script_store.isInstalled() && - scripts.script_store.is_active && - scripts.script_store.selected_script_name !== 'None' && - scripts.script_store.is_selected_script_available - ) { - payload['script_args'] = scripts.script_store.orderedValues() - - payload['script_name'] = - scripts.script_store.selected_script_name //'Ultimate SD upscale' - } - } else { - delete payload['script_args'] - delete payload['script_name'] - } - - // payload['script_args'] = [] - - // payload['script_name'] = 'after detailer' - function setAlwaysOnScripts() { - const data = after_detailer_script.store.toJsFunc().data - console.log('setAlwaysOnScripts=> data:', data) - - const alwayson_scripts = { - 'After Detailer': { - args: [ - data.is_enabled, - { - // ad_model: 'face_yolov8n.pt', - ad_model: data.ad_model, - ad_prompt: data.prompt, - ad_negative_prompt: data.negativePrompt, - ad_conf: data.ad_conf, - ad_mask_min_ratio: 0.0, - ad_mask_max_ratio: 1.0, - ad_dilate_erode: 32, - ad_x_offset: 0, - ad_y_offset: 0, - ad_mask_merge_invert: 'None', - ad_mask_blur: 4, - ad_denoising_strength: 0.4, - ad_inpaint_full_res: true, - ad_inpaint_full_res_padding: 0, - ad_use_inpaint_width_height: false, - ad_inpaint_width: 512, - ad_inpaint_height: 512, - ad_use_steps: true, - ad_steps: 28, - ad_use_cfg_scale: false, - ad_cfg_scale: 7.0, - ad_restore_face: false, - ad_controlnet_model: data.controlnet_model, - ad_controlnet_weight: data.controlNetWeight, - }, - ], - }, - } - if (!data?.is_installed) { - delete alwayson_scripts['After Detailer'] - } - return alwayson_scripts - } - - const alwyason_scripts = setAlwaysOnScripts() - payload['alwayson_scripts'] = { - ...(payload['alwayson_scripts'] || {}), - ...alwyason_scripts, - } - - if (hi_res_fix && width >= 512 && height >= 512) { - const hr_scale = sd_tab.getHrScaleSliderSDValue() - - payload['enable_hr'] = hi_res_fix - // payload['firstphase_width'] = width - // payload['firstphase_height'] = height - // payload['hr_resize_x'] = hWidth - // payload['hr_resize_y'] = hHeight - payload['hr_scale'] = hr_scale // Scale - payload['hr_upscaler'] = upscaler // Upscaler - payload['hr_second_pass_steps'] = hSteps // Number of Steps - } else { - //fix hi res bug: if we include firstphase_width or firstphase_height in the payload, - // sd api will use them instead of using width and height variables, even when enable_hr is set to "false" - delete payload['enable_hr'] - // delete payload['firstphase_width'] - // delete payload['firstphase_height'] - } - - //work with the hord - - // const script_args_json = { - // model: "Anything Diffusion", - // nsfw: false, - // shared_laion: false, - // seed_variation: 1, - // post_processing_1: "None", - // post_processing_2: "None", - // post_processing_3: "None" - // } - // const script_args = Object.values(script_args_json) - const backend_type = html_manip.getBackendType() - if (backend_type === backendTypeEnum['Auto1111HordeExtension']) { - payload['script_name'] = script_horde.script_name - payload['script_args'] = script_horde.getScriptArgs() - } else if ( - payload['script_name'] === script_horde.script_name && - backend_type !== backendTypeEnum['Auto1111HordeExtension'] - ) { - delete payload['script_name'] - delete payload['script_args'] - } - - if (bUsePromptShortcut) { - //replace the prompt with the prompt shortcut equivalent - const [new_prompt, new_negative_prompt] = - py_re.replacePromptsWithShortcuts( - prompt, - negative_prompt, - prompt_shortcut_ui_dict - ) - - //used in generation - payload['prompt'] = new_prompt - payload['negative_prompt'] = new_negative_prompt - - //used to when resote settings from metadata - payload['original_prompt'] = prompt - payload['original_negative_prompt'] = negative_prompt - } else { - //use the same prompt as in the prompt textarea - payload['prompt'] = prompt - payload['negative_prompt'] = negative_prompt - - payload['original_prompt'] = prompt - payload['original_negative_prompt'] = negative_prompt - } - - payload = { - ...payload, - // prompt: prompt, - // negative_prompt: negative_prompt, - steps: numberOfSteps, - // n_iter: numberOfImages, - sampler_index: sampler_name, - width: width, - height: height, - denoising_strength: denoising_strength, - batch_size: numberOfBatchSize, - cfg_scale: cfg_scale, - seed: seed, - mask_blur: mask_blur, - use_sharp_mask: use_sharp_mask, - use_prompt_shortcut: bUsePromptShortcut, - prompt_shortcut_ui_dict: prompt_shortcut_ui_dict, - uniqueDocumentId: uniqueDocumentId, - mode: mode, - restore_faces: b_restore_faces, - // script_args: script_args, - // script_name:"Run on Stable Horde" - } - } catch (e) { - console.error(e) - } - return payload -} //REFACTOR: move to generation_settings.js async function getExtraSettings() { let payload = {} @@ -2349,6 +2049,15 @@ async function hasSelectionChanged(new_selection, old_selection) { } //REFACTOR: move to generation.js async function easyModeGenerate(mode) { + try { + //save laso selection + if (g_is_laso_inapint_mode) { + await selection.makeMaskChannelExe('inpaint_laso_mask') + } + } catch (e) { + console.warn(e) + } + try { if ( g_generation_session.request_status !== @@ -2478,14 +2187,48 @@ async function easyModeGenerate(mode) { } await psapi.selectLayersExe([active_layer]) //reselect the active layer since the clean up of the session sometime will change which layer is selected + let init_image + let mask if (mode === 'txt2img') { //Note: keep it for clearity/ readibility } else if (mode === 'img2img' || mode === 'upscale') { - await snapAndFillHandler() + // await snapAndFillHandler() + init_image = await io.getImg2ImgInitImage() + g_generation_session.activeBase64InitImage = init_image } else if (mode === 'inpaint') { - await btnInitInpaintHandler() + // await btnInitInpaintHandler() + + if (g_is_laso_inapint_mode) { + await selection.channelToSelectionExe('inpaint_laso_mask') + const [init_image_base64, mask_base64] = + await selection.inpaintLassoInitImageAndMask() + init_image = init_image_base64 + mask = mask_base64 + g_generation_session.activeBase64InitImage = init_image + g_generation_session.activeBase64MaskImage = mask + } else { + //normal inpaint + try { + await executeAsModal(async () => { + g_inpaint_mask_layer.opacity = 100 + }) + } catch (e) { + console.warn(e) + } + const obj = await io.getInpaintInitImageAndMask() + + init_image = obj.init_image + g_generation_session.activeBase64InitImage = init_image + mask = obj.mask + g_generation_session.activeBase64MaskImage = mask + } } else if (mode === 'outpaint') { - await easyModeOutpaint() + // await easyModeOutpaint() + const obj = await io.getOutpaintInitImageAndMask() + init_image = obj.init_image + g_generation_session.activeBase64InitImage = init_image + mask = obj.mask + g_generation_session.activeBase64MaskImage = mask } //safe to close the previous generation_session outputfolder, since closing a folder will unselect any layer in it. @@ -2496,7 +2239,41 @@ async function easyModeGenerate(mode) { const settings = mode === 'upscale' ? await getExtraSettings() : await getSettings() + if (mode === 'img2img') { + // const init_image = await io.getImg2ImgInitImage() + settings['init_images'] = [init_image] + } else if (mode === 'inpaint') { + // const { init_image, mask } = await io.getInpaintInitImageAndMask() + settings['init_images'] = [init_image] + // settings['mask'] = mask + } else if (mode === 'outpaint') { + settings['init_images'] = [init_image] + // settings['mask'] = mask + } g_generation_session.last_settings = settings + + async function updateViewerStore(store, images) { + try { + if (typeof images === 'undefined' || !images) { + return null + } + store.data.images = images + const thumbnail_list = [] + for (const base64 of images) { + const thumbnail = await io.createThumbnail(base64, 300) + thumbnail_list.push(thumbnail) + } + + store.data.thumbnails = thumbnail_list + } catch (e) { + console.warn(e) + console.warn('images: ', images) + } + } + + await updateViewerStore(viewer.init_store, settings?.init_images) + await updateViewerStore(viewer.mask_store, [settings?.mask]) + // g_generation_session.is_control_net = control_net.getEnableControlNet() g_generation_session.is_control_net = control_net.isControlNetModeEnable() @@ -2653,8 +2430,8 @@ async function generate(settings, mode) { if (isFirstGeneration) { //this is new generation session - g_generation_session.image_paths_to_layers = - await silentImagesToLayersExe(images_info) + // g_generation_session.image_paths_to_layers = + // await silentImagesToLayersExe(images_info) g_generation_session.base64OutputImages = {} //delete all previouse images, Note move this to session end () for (const image_info of images_info) { @@ -2681,7 +2458,7 @@ async function generate(settings, mode) { } else { // generation session is active so we will generate more - let last_images_paths = await silentImagesToLayersExe(images_info) + // let last_images_paths = await silentImagesToLayersExe(images_info) for (const image_info of images_info) { const path = image_info['path'] @@ -2702,14 +2479,35 @@ async function generate(settings, mode) { ) //save the settings } - g_generation_session.image_paths_to_layers = { - ...g_generation_session.image_paths_to_layers, - ...last_images_paths, - } + // g_generation_session.image_paths_to_layers = { + // ...g_generation_session.image_paths_to_layers, + // ...last_images_paths, + // } g_number_generation_per_session++ } await psapi.reSelectMarqueeExe(g_generation_session.selectionInfo) //update the viewer + const base64_list = Object.entries( + g_generation_session.base64OutputImages + ).map((obj) => obj[1] ?? '') + + const thumbnail_list = [] + for (const base64 of base64_list) { + const thumbnail = await io.createThumbnail(base64, 300) + thumbnail_list.push(thumbnail) + } + + viewer.store.updateProperty('thumbnails', thumbnail_list) + viewer.store.updateProperty('images', base64_list) + //load react viewer + //*) extract thumbnails + //*) extract images + //*) on thumbnail click + //*) delete previous layer if it exist + //*) load image to canvas + //*) + + // await loadViewerImages() //esnures that progress bars are set to 0 (as last progress request call might have returned less than 100%) @@ -2967,6 +2765,7 @@ async function progressRecursive() { }, 1000) } } catch (e) { + console.warn(e) if ( g_generation_session.isActive() && g_can_request_progress === true @@ -3761,7 +3560,7 @@ async function loadViewerImages() { // container.removeChild(container.firstChild); // } image_paths = Object.keys(g_generation_session.image_paths_to_layers) - console.log('image_paths: ', image_paths) + // console.log('image_paths: ', image_paths) let i = 0 // const viewer_layers = [] @@ -3839,7 +3638,7 @@ async function loadViewerImages() { } } - console.log('image_paths: ', image_paths) + // console.log('image_paths: ', image_paths) let lastOutputImage for (const path of image_paths) { // const path = image_path @@ -3947,27 +3746,27 @@ async function deleteNoneSelected(viewer_objects) { // document.getElementById('btnLoadViewer').addEventListener('click', loadViewerImages) //REFACTOR: move to document.js -async function moveHistoryImageToLayer(img) { - let image_path = img.dataset.path - const image_path_escape = image_path.replace(/\o/g, '/o') //escape string "\o" in "\output" - - // load the image from "data:image/png;base64," base64_str - const base64_image = img.src.replace('data:image/png;base64,', '') - // await base64ToFile(base64_image) - const metadata_json = JSON.parse(img.dataset.metadata_json_string) - const to_x = metadata_json['selection_info']?.left - const to_y = metadata_json['selection_info']?.top - const width = metadata_json['selection_info']?.width - const height = metadata_json['selection_info']?.height - await io.IO.base64ToLayer( - base64_image, - 'History Image', - to_x, - to_y, - width, - height - ) -} +// async function moveHistoryImageToLayer(img) { +// let image_path = img.dataset.path +// const image_path_escape = image_path.replace(/\o/g, '/o') //escape string "\o" in "\output" + +// // load the image from "data:image/png;base64," base64_str +// const base64_image = img.src.replace('data:image/png;base64,', '') +// // await base64ToFile(base64_image) +// const metadata_json = JSON.parse(img.dataset.metadata_json_string) +// const to_x = metadata_json['selection_info']?.left +// const to_y = metadata_json['selection_info']?.top +// const width = metadata_json['selection_info']?.width +// const height = metadata_json['selection_info']?.height +// await io.IO.base64ToLayer( +// base64_image, +// 'History Image', +// to_x, +// to_y, +// width, +// height +// ) +// } //REFACTOR: move to document.js async function loadPromptShortcut() { @@ -4200,8 +3999,8 @@ async function downloadItExe(link, writeable_entry, image_file_name) { //REFACTOR: move to session.js or selection.js async function activateSessionSelectionArea() { try { - if (psapi.isSelectionValid(g_generation_session.selectionInfo)) { - await psapi.reSelectMarqueeExe(g_generation_session.selectionInfo) + if (psapi.isSelectionValid(session_ts.store.data.selectionInfo)) { + await psapi.reSelectMarqueeExe(session_ts.store.data.selectionInfo) await eventHandler() } } catch (e) { @@ -4746,6 +4545,16 @@ Array.from(document.querySelectorAll('.rbSubTab')).forEach((rb) => { switchMenu(rb) }) +// document.getElementById('scrollToPrompt').addEventListener('click', () => { +// document.getElementById('taPrompt').scrollIntoView() +// }) + +// document.getElementById('scrollToViewer').addEventListener('click', () => { +// document +// .querySelector('#sp-stable-diffusion-ui-tab-page .reactViewerContainer') +// .scrollIntoView() +// }) + // class CustomElement extends HTMLElement { // constructor() { // super() diff --git a/psapi.js b/psapi.js index 3629fb79..9138e416 100644 --- a/psapi.js +++ b/psapi.js @@ -1,6 +1,8 @@ const app = window.require('photoshop').app const batchPlay = require('photoshop').action.batchPlay const { executeAsModal } = require('photoshop').core +const constants = require('photoshop').constants +// console.log(constants.ResampleMethod.BILINEAR) // const export_png = require('./export_png') // const { layerToSelection } = require('./helper') @@ -643,7 +645,7 @@ async function snapshot_layerExe() { await snapshot_layer_new() }, { - commandName: 'Action Commands', + commandName: `Canvas Snapshot...`, } ) } catch (e) { @@ -1400,7 +1402,12 @@ async function layerToSelection(selection_info) { scale_x_ratio = (selection_info.width / layer_info.width) * 100 scale_y_ratio = (selection_info.height / layer_info.height) * 100 console.log('scale_x_y_ratio:', scale_x_ratio, scale_y_ratio) - await layer.scale(scale_x_ratio, scale_y_ratio) + // await layer.scale( + // scale_x_ratio, + // scale_y_ratio, + // constants.ResampleMethod.BILINEAR + // ) + await layer_util.Layer.resizeImageExe(scale_x_ratio, scale_y_ratio) } async function moveLayerExe(layerToMove, selection_info) { diff --git a/sdapi_py_re.js b/sdapi_py_re.js index 39d1fe2b..cde3dc52 100644 --- a/sdapi_py_re.js +++ b/sdapi_py_re.js @@ -39,6 +39,7 @@ async function requestTxt2Img(payload) { } } +//Refactor: move to modes.ts async function requestImg2Img(payload) { console.log('requestImg2Img(): about to send a fetch request') try { @@ -53,8 +54,8 @@ async function requestImg2Img(payload) { } } +//Refactor: move to progress.ts async function requestProgress() { - let json = {} try { console.log('requestProgress: ') @@ -68,6 +69,7 @@ async function requestProgress() { console.warn(e) // console.log('json: ', json) } + return null } async function requestGetModels() { diff --git a/selection.js b/selection.js index 6fedac0c..f947d3c5 100644 --- a/selection.js +++ b/selection.js @@ -1,4 +1,5 @@ const psapi = require('./psapi') + const html_manip = require('./utility/html_manip') function finalWidthHeight( selectionWidth, @@ -125,33 +126,103 @@ async function createChannelIfNotExists(channelName) { } } -const makeMaskChannel = () => ({ - _obj: 'set', - _target: { _ref: 'channel', _property: 'selection' }, - to: { _ref: 'channel', _name: 'inpaint_mask' }, +const deleteChannel = (channel_name = 'inpaint_laso_mask') => + app.activeDocument.channels.getByName(channel_name) + ? [ + { + _obj: 'delete', + _target: { _ref: 'channel', _name: channel_name }, + options: { + failOnMissingProperty: false, + failOnMissingElement: false, + }, + }, + ] + : [] +const makeMaskChannel = (channel_name = 'inpaint_laso_mask') => ({ + // _obj: 'set', + // _target: { _ref: 'channel', _property: 'selection' }, + // to: { _ref: 'channel', _name: channel_name }, + + _obj: 'duplicate', + _target: [ + { + _ref: 'channel', + _property: 'selection', + }, + ], + name: channel_name, + _isCommand: true, + options: { failOnMissingProperty: false, failOnMissingElement: false }, }) -async function makeMaskChannelExe() { +async function makeMaskChannelExe(channel_name = 'inpaint_laso_mask') { + await executeAsModal(async () => { + // const channel = app.activeDocument.channels.getByName(channel_name) + // channel?.remove() + const result = await batchPlay( + [...deleteChannel(channel_name), makeMaskChannel(channel_name)], + // [ + // { + // _obj: 'duplicate', + // _target: [ + // { + // _ref: 'channel', + // _property: 'selection', + // }, + // ], + // name: channel_name, + // _isCommand: true, + // }, + + // { + // _obj: 'make', + // new: { _class: 'channel' }, + // at: { _ref: 'channel', _enum: 'channel', _value: 'mask' }, + // using: { + // _enum: 'userMaskEnabled', + // _value: 'revealSelection', + // }, + // }, + // ], + { + synchronousExecution: true, + modalBehavior: 'execute', + } + ) + console.log('result: ', result) + }) +} +async function multiGetExe() { + desc = { + _obj: 'multiGet', + _target: { _ref: 'layer', _enum: 'ordinal', _value: 'targetEnum' }, + extendedReference: [['layerID', 'itemIndex', 'count']], + options: { failOnMissingProperty: false, failOnMissingElement: false }, + } + + try { + const result = await batchPlay([desc], { + modalBehavior: 'execute', + synchronousExecution: true, + }) + console.log('multiGetExe result: ', result) + // await executeAsModal(async () => {}) + } catch (e) { + console.warn(e) + } +} +async function applyMaskChannelExe(channel_name = 'inpaint_laso_mask') { await executeAsModal(async () => { const result = await batchPlay( [ // SelectionInfoDesc(), // makeMaskChannel(), + { - _obj: 'duplicate', - _target: [ - { - _ref: 'channel', - _property: 'selection', - }, - ], - name: 'inpaint_mask_2', - _isCommand: true, + _obj: 'set', + _target: { _ref: 'channel', _property: 'selection' }, + to: { _ref: 'channel', _name: channel_name }, }, - // { - // _obj: 'set', - // _target: { _ref: 'channel', _property: 'selection' }, - // to: { _ref: 'channel', _name: 'inpaint_mask' }, - // }, { _obj: 'make', new: { _class: 'channel' }, @@ -159,6 +230,7 @@ async function makeMaskChannelExe() { using: { _enum: 'userMaskEnabled', _value: 'revealSelection', + _name: channel_name, }, }, ], @@ -171,6 +243,119 @@ async function makeMaskChannelExe() { }) } +async function createLayerFromMaskChannel(channel_name = 'inpaint_laso_mask') { + await executeAsModal(async () => { + const result = await batchPlay( + [ + // SelectionInfoDesc(), + // makeMaskChannel(), + // { + // _obj: 'set', + // _target: { _ref: 'channel', _property: 'selection' }, + // to: { _ref: 'channel', _name: channel_name }, + // }, + // { + // _obj: 'make', + // new: { _class: 'channel' }, + // at: { _ref: 'channel', _enum: 'channel', _value: 'mask' }, + // using: { + // _enum: 'userMaskEnabled', + // _value: 'revealSelection', + // _name: channel_name, + // }, + // }, + { + _obj: 'set', + _target: { _ref: 'layer' }, + to: { _ref: 'channel', _name: channel_name }, + }, + ], + { + synchronousExecution: true, + modalBehavior: 'execute', + } + ) + console.log('result: ', result) + }) +} + +async function channelToSelectionExe(channel_name = 'inpaint_laso_mask') { + const channelToSelection = { + _obj: 'set', + _target: { _ref: 'channel', _property: 'selection' }, + to: { _ref: 'channel', _name: channel_name }, + } + await executeAsModal(async () => { + const result = await batchPlay([channelToSelection], { + modalBehavior: 'execute', + synchronousExecution: true, + }) + }) +} +async function inpaintLassoInitImageAndMask( + channel_name = 'inpaint_laso_mask' +) { + async function getImageFromCanvas() { + const width = html_manip.getWidth() + const height = html_manip.getHeight() + const selectionInfo = await psapi.getSelectionInfoExe() + const base64 = await io.IO.getSelectionFromCanvasAsBase64Interface_New( + width, + height, + selectionInfo, + true + ) + return base64 + } + const channelToSelection = { + _obj: 'set', + _target: { _ref: 'channel', _property: 'selection' }, + to: { _ref: 'channel', _name: channel_name }, + } + await executeAsModal(async () => { + const result = await batchPlay( + [ + ...deleteChannel(channel_name), + makeMaskChannel(channel_name), + channelToSelection, + ], + { modalBehavior: 'execute', synchronousExecution: true } + ) + const selection_info = await psapi.getSelectionInfoExe() + }) + const init_base64 = await getImageFromCanvas() + html_manip.setInitImageSrc(general.base64ToBase64Url(init_base64)) + let mask_base64 + await executeAsModal(async () => { + const result = await batchPlay([channelToSelection], { + modalBehavior: 'execute', + synchronousExecution: true, + }) + // const selection_info = await psapi.getSelectionInfoExe() + mask_base64 = await fillSelectionWhiteOutsideBlack() + }) + //save laso selection to channel + //get laso selection + //make rect selection + //base64 from selection + //and display it in init image html element + //get laso selection: + //make mask layer + //get rectangular selection + //get base64 from selection + //display it in mask image html element + // let jimp_mask = await Jimp.read(Buffer.from(mask_base64, 'base64')) + // html_manip.setInitImageMaskSrc( + // await jimp_mask.getBase64Async(Jimp.MIME_PNG) + // ) + html_manip.setInitImageMaskSrc(general.base64ToBase64Url(mask_base64)) + + return [init_base64, mask_base64] + // //return + // //init image + //mask +} + async function fillSelectionWhiteOutsideBlack() { // Create a new layer const layer_name = 'inpaint_laso_mask' @@ -193,6 +378,9 @@ async function fillSelectionWhiteOutsideBlack() { _obj: 'inverse', _isCommand: true, }) + await psapi.unselectActiveLayers() + const mask_layer = await layer_util.createNewLayerExe('mask') + await moveToTopLayerStackExe() await batchPlay( [ getSelectionDesc(), @@ -295,73 +483,17 @@ async function fillSelectionWhiteOutsideBlack() { ) //import the base64 image into the canvas as a new layer - await io.IO.base64ToLayer( - base64, - 'base64_to_layer_temp.png', - rect_selection_info.left, - rect_selection_info.top, - rect_selection_info.width, - rect_selection_info.height - ) - // Fill the current selection with white - // await batchPlay( - // [ - // { - // _obj: 'fill', - // using: { - // _enum: 'fillContents', - // _value: 'white', - // }, - // opacity: { - // _unit: 'percentUnit', - // _value: 100, - // }, - // mode: { - // _enum: 'blendMode', - // _value: 'normal', - // }, - // }, - // ], - // { modalBehavior: 'execute' } - // ) - - // // Invert the selection - // await batchPlay( - // [ - // { - // _obj: 'invert', - // _target: [ - // { - // _ref: 'channel', - // _property: 'selection', - // }, - // ], - // }, - // ], - // { modalBehavior: 'execute' } + // await io.IO.base64ToLayer( + // base64, + // 'base64_to_layer_temp.png', + // rect_selection_info.left, + // rect_selection_info.top, + // rect_selection_info.width, + // rect_selection_info.height // ) - // // Fill the inverted selection with black - // await batchPlay( - // [ - // { - // _obj: 'fill', - // using: { - // _enum: 'fillContents', - // _value: 'black', - // }, - // opacity: { - // _unit: 'percentUnit', - // _value: 100, - // }, - // mode: { - // _enum: 'blendMode', - // _value: 'normal', - // }, - // }, - // ], - // { modalBehavior: 'execute' } - // ) + await psapi.cleanLayers([mask_layer]) + return base64 } async function inpaintLasoInitImage() { @@ -630,6 +762,91 @@ class Selection { static {} } +async function moveToTopLayerStackExe() { + const moveToTop = { + _obj: 'move', + _target: { _ref: 'layer', _enum: 'ordinal', _value: 'targetEnum' }, + to: { _ref: 'layer', _enum: 'ordinal', _value: 'front' }, + // _options: { dialogOptions: 'dontDisplay' }, + options: { failOnMissingProperty: false, failOnMissingElement: false }, + } + try { + await executeAsModal(async () => { + const layer = app.activeDocument.activeLayers[0] + + while (layer.parent) { + console.log(layer.parent) + const result = await batchPlay([moveToTop], { + modalBehavior: 'execute', + synchronousExecution: true, + }) + } + }) + } catch (e) { + console.warn(e) + } +} +async function colorRange() { + const select_current_layer_cmd = { + _obj: 'set', + _target: [ + { + _ref: 'channel', + _property: 'selection', + }, + ], + to: { + _ref: 'channel', + _enum: 'channel', + _value: 'transparencyEnum', + }, + _isCommand: true, + } + const cmd = { + _obj: 'colorRange', + fuzziness: 0, + minimum: { + _obj: 'labColor', + luminance: 100, + a: 0, + b: 0, + }, + maximum: { + _obj: 'labColor', + luminance: 100, + a: 0, + b: 0, + }, + colorModel: 0, + _isCommand: true, + } + await batchPlay([select_current_layer_cmd, cmd], { + modalBehavior: 'execute', + synchronousExecution: true, + }) +} + +async function colorRangeExe() { + await executeAsModal( + async () => { + await colorRange() + }, + { commandName: 'Convert Black and White Layer to mask selection' } + ) +} + +async function base64ToLassoSelection(base64, selection_info) { + const temp_layer = await io.IO.base64ToLayer( + base64, + 'monochrome_mask.png', + selection_info.left, + selection_info.top, + selection_info.width, + selection_info.height + ) + await colorRangeExe() + await layer_util.deleteLayers([temp_layer]) +} module.exports = { finalWidthHeight, selectionToFinalWidthHeight, @@ -640,4 +857,13 @@ module.exports = { makeMaskChannel, makeMaskChannelExe, fillSelectionWhiteOutsideBlack, + inpaintLasoInitImage, + applyMaskChannelExe, + createLayerFromMaskChannel, + multiGetExe, + inpaintLassoInitImageAndMask, + channelToSelectionExe, + moveToTopLayerStackExe, + colorRangeExe, + base64ToLassoSelection, } diff --git a/typescripts/entry.ts b/typescripts/entry.ts index 0ef15d19..40a1edb0 100644 --- a/typescripts/entry.ts +++ b/typescripts/entry.ts @@ -6,5 +6,7 @@ export * as main from './main/main' export * as logger from './util/logger' export * as image_search from './image_search/image_search' export * as history from './history/history' +export * as viewer from './viewer/viewer' export * as preview from './viewer/preview' +export * as progress from './session/progress' export { toJS } from 'mobx' diff --git a/typescripts/util/ts/io.ts b/typescripts/util/ts/io.ts new file mode 100644 index 00000000..6ee48c86 --- /dev/null +++ b/typescripts/util/ts/io.ts @@ -0,0 +1,26 @@ +import { io } from '../oldSystem' + +export async function moveImageToLayer( + base64_image: string, + selection_info: any +) { + let layer + try { + const to_x = selection_info?.left + const to_y = selection_info?.top + const width = selection_info?.width + const height = selection_info?.height + layer = await io.IO.base64ToLayer( + base64_image, + 'to_layer', + to_x, + to_y, + width, + height + ) + } catch (e) { + console.warn(e) + layer = null + } + return layer +} diff --git a/typescripts/viewer/viewer.tsx b/typescripts/viewer/viewer.tsx new file mode 100644 index 00000000..58b5f1b5 --- /dev/null +++ b/typescripts/viewer/viewer.tsx @@ -0,0 +1,433 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +// import ReactDOM from 'react-dom' +import { observer } from 'mobx-react' +import { AStore } from '../main/astore' +import { Grid } from '../util/grid' +import { MoveToCanvasSvg, SpSlider, SpSliderWithLabel } from '../util/elements' +import { moveImageToLayer } from '../util/ts/io' +import { io, layer_util } from '../util/oldSystem' +import Collapsible from '../after_detailer/after_detailer' +import { session_ts } from '../entry' +declare let g_generation_session: any + +enum ClickTypeEnum { + Click = 'click', + ShiftClick = 'shift_click', + AltClick = 'alt_click', + SecondClick = 'second_click', //when we click a thumbnail that is active/ has orange border +} + +enum OutputImageStateEnum { + Add = 'add', + remove = 'remove', +} +enum ClassNameEnum { + Green = 'viewerImgSelected', + Orange = 'viewerImgActive', + None = '', +} +function findClickType(event: any) { + let click_type: ClickTypeEnum = ClickTypeEnum.Click + + if (event.shiftKey) { + click_type = ClickTypeEnum.ShiftClick + } else if (event.altKey) { + click_type = ClickTypeEnum.AltClick + } + return click_type +} + +export const store = new AStore({ + images: [], + thumbnails: [], + metadata: [], // metadata for each image + width: 50, + height: 50, + + prev_layer: null, + clicked_index: null, + + permanent_indices: [], + + prev_index: -1, + output_image_obj_list: [], + is_stored: [], + layers: [], + class_name: [], + can_click: true, +}) +export const init_store = new AStore({ + images: [], + thumbnails: [], + + width: 50, + height: 50, + + prev_layer: null, + clicked_index: null, + + permanent_indices: [], + + prev_index: -1, + output_image_obj_list: [], + is_stored: [], + layers: [], + class_name: [], + can_click: true, +}) +export const mask_store = new AStore({ + images: [], + thumbnails: [], + + width: 50, + height: 50, + + prev_layer: null, + clicked_index: null, + + permanent_indices: [], + + prev_index: -1, + output_image_obj_list: [], + is_stored: [], + layers: [], + class_name: [], + can_click: true, +}) + +export async function updateViewerStoreImageAndThumbnail( + store: AStore, + images: string[] +) { + try { + if (typeof images === 'undefined' || !images) { + return null + } + store.data.images = images + const thumbnail_list = [] + for (const base64 of images) { + const thumbnail = await io.createThumbnail(base64, 300) + thumbnail_list.push(thumbnail) + } + + store.data.thumbnails = thumbnail_list + } catch (e) { + console.warn(e) + console.warn('images: ', images) + } +} + +const add = async (base64: string) => { + //change the color of thumbnail border + //add image to the canvas + const layer = await moveImageToLayer( + base64, + session_ts.store.data.selectionInfo + ) + return layer +} +const remove = async (layer: any) => { + await layer_util.deleteLayers([layer]) // delete previous layer +} + +const endSession = async () => { + store.updateProperty('images', []) + store.data.thumbnails = [] + store.data.prev_index = -1 + store.data.is_stored = [] + store.data.layers = [] + store.data.class_name = [] + store.data.can_click = true + session_ts.store.data.is_active = false // +} +const addAll = async () => { + let i = 0 + for (let i = 0; i < store.data.images.length; i++) { + if (store.data.is_stored[i]) { + continue + } + await moveImageToLayer( + store.data.images[i], + session_ts.store.data.selectionInfo + ) + } + + endSession() +} +const discardAll = async () => { + for (let i = 0; i < store.data.images.length; i++) { + await remove(store.data.layers[i]) + } + + endSession() +} +const onlySelected = () => { + endSession() +} +const handleOutputImageThumbnailClick = async (index: number, event?: any) => { + try { + if (!store.data.can_click) return null + // debugger + store.data.can_click = false + const prev_index = store.data.prev_index + const image = store.data.images[index] || '' + const is_stored = store.data.is_stored[index] || false + const is_prev_stored = store.data.is_stored[prev_index] || false + const prev_layer = store.data.layers[prev_index] || null + const prev_image = store.data.images[prev_index] || '' + + console.log('prev_index:', prev_index) + console.log('is_stored:', is_stored) + console.log('is_prev_stored:', is_prev_stored) + console.log('prev_layer:', prev_layer) + + // store.updateProperty('clicked_index', index) + + let click_type: ClickTypeEnum = event + ? findClickType(event) + : ClickTypeEnum.Click + if ( + index === store.data.prev_index && + click_type === ClickTypeEnum.Click + ) { + click_type = ClickTypeEnum.SecondClick + //toggle functionality + } + + console.log('click_type:', click_type) + if (click_type === ClickTypeEnum.Click) { + //1) modify layer stacks + + const layer = await add(image) + await remove(store.data.layers[index]) + console.log('layer:', layer) + store.data.layers[index] = layer + + if (is_prev_stored) { + } else { + await remove(prev_layer) + } + //2)change style + store.data.class_name[prev_index] = is_prev_stored + ? ClassNameEnum.Green + : ClassNameEnum.None + + store.data.class_name[index] = is_stored + ? ClassNameEnum.Green + : ClassNameEnum.Orange + + //3)modify index + store.data.prev_index = index + } else if (click_type === ClickTypeEnum.ShiftClick) { + //1) modify layer stacks + if (prev_index === index) { + store.data.class_name[index] = ClassNameEnum.Green + } else { + if (is_prev_stored) { + } else { + // await remove(prev_layer) + } + + const layer = await add(image) + await remove(store.data.layers[index]) + store.data.layers[index] = layer + //2)change style + store.data.class_name[prev_index] = ClassNameEnum.Green + store.data.class_name[index] = ClassNameEnum.Green + + //3)store index + store.data.is_stored[prev_index] = true + store.data.is_stored[index] = true + store.data.prev_index = index + } + } else if (click_type === ClickTypeEnum.AltClick) { + //1) modify layer stacks + if (is_prev_stored) { + } else { + await remove(prev_layer) + } + await remove(store.data.layers[index]) + //2)change style + store.data.class_name[prev_index] = is_prev_stored + ? ClassNameEnum.Green + : ClassNameEnum.None + store.data.class_name[index] = ClassNameEnum.None + + //3)store index + store.data.prev_index = -1 + store.data.is_stored[index] = false + } else if (click_type === ClickTypeEnum.SecondClick) { + //1) modify layer stacks + if (is_prev_stored) { + } else { + await remove(prev_layer) + } + + //2)change style + store.data.class_name[prev_index] = is_prev_stored + ? ClassNameEnum.Green + : ClassNameEnum.None + + //3)store index + store.data.prev_index = -1 + } + store.data.class_name = [...store.data.class_name] + } catch (e) { + console.warn(e) + } + store.data.can_click = true +} +const Viewer = observer(() => { + // console.log('rendered', store.toJsFunc()) + const button_style = { + display: 'none', + marginRight: '3px', + } + return ( +
+ + // event: React.ChangeEvent + { + try { + console.log('change event triggered!') + // const new_value = event.target.value + // const base_width = 100 + // const scale_ratio = new_value / base_width + + // store.updateProperty('height', scale_ratio) + store.updateProperty('width', new_value) + init_store.updateProperty('width', new_value) + } catch (e) { + console.warn(e) + } + } + } + show-value={false} + steps={1} + output_value={store.data.width} + label="Thumbnail Size:" + > +
+ + + +
+ +
+ + + + +
+
+ { + console.log(index) + }} + width={init_store.data.width} + height={init_store.data.height} + // clicked_index={init_store.data.clicked_index} + // permanent_indices={init_store.data.permanent_indices} + > +
+
+ { + console.log(index) + }} + width={mask_store.data.width} + height={mask_store.data.height} + // clicked_index={init_store.data.clicked_index} + // permanent_indices={init_store.data.permanent_indices} + > +
+
+ { + // console.log( + // 'viewer callback:', + // store.data.images[index], + // g_generation_session.selectionInfo + // ) + // moveImageToLayer( + // store.data.images[index], + // g_generation_session.selectionInfo + // ) + // }, + // }, + // ]} + > +
+
+ ) +}) + +// const node = document.getElementById('reactViewerContainer')! +const containers = document.querySelectorAll('.reactViewerContainer') + +containers.forEach((container) => { + const root = ReactDOM.createRoot(container) + root.render( + +
+ + + +
+
+ ) +}) diff --git a/utility/layer.js b/utility/layer.js index e4564aa5..e87f1eb7 100644 --- a/utility/layer.js +++ b/utility/layer.js @@ -11,6 +11,7 @@ const { } = require('../psapi') const psapi = require('../psapi') +const constants = require('photoshop').constants async function createNewLayerExe(layerName, opacity = 100) { await executeAsModal(async () => { @@ -157,13 +158,126 @@ class Layer { const scale_x_ratio = (new_width / layer_info.width) * 100 const scale_y_ratio = (new_height / layer_info.height) * 100 console.log('scale_x_y_ratio:', scale_x_ratio, scale_y_ratio) - await layer.scale(scale_x_ratio, scale_y_ratio) + // await layer.scale( + // scale_x_ratio, + // scale_y_ratio, + // constants.ResampleMethod.BILINEAR + // ) + await layer_util.Layer.resizeImageExe( + scale_x_ratio, + scale_y_ratio + ) await psapi.reSelectMarqueeExe(selection_info) } catch (e) { console.warn(e) } }) } + static async resizeImage(percent_width, percent_height) { + // let imageSizeDescriptor = { + // _obj: 'imageSize', + // scaleStyles: true, + // constrainProportions: true, + // interfaceIconFrameDimmed: { + // _enum: 'interpolationType', + // // _value: 'automaticInterpolation', + // _value: 'bilinear', + // }, + // _options: { + // dialogOptions: 'dontDisplay', + // }, + // } + + // if (width !== undefined && width !== null) { + // imageSizeDescriptor.width = { + // _unit: 'pixelsUnit', + // _value: width, + // } + // } + // if (height !== undefined && height !== null) { + // imageSizeDescriptor.height = { + // _unit: 'pixelsUnit', + // _value: height, + // } + // } + const setInterpolationMethodDesc = { + _obj: 'set', + _target: [ + { + _ref: 'property', + _property: 'generalPreferences', + }, + { + _ref: 'application', + _enum: 'ordinal', + _value: 'targetEnum', + }, + ], + to: { + _obj: 'generalPreferences', + interpolationMethod: { + _enum: 'interpolationType', + // _value: 'bilinear', + _value: 'nearestNeighbor', + }, + }, + _isCommand: true, + } + let imageSizeDescriptor = { + _obj: 'transform', + _target: [ + { + _ref: 'layer', + _enum: 'ordinal', + _value: 'targetEnum', + }, + ], + freeTransformCenterState: { + _enum: 'quadCenterState', + _value: 'QCSAverage', + }, + // offset: { + // _obj: 'offset', + // horizontal: { + // _unit: 'pixelsUnit', + // _value: 24.4388124547429, + // }, + // vertical: { + // _unit: 'pixelsUnit', + // _value: -24.4388124547429, + // }, + // }, + width: { + _unit: 'percentUnit', + _value: percent_width, + }, + height: { + _unit: 'percentUnit', + _value: percent_height, + }, + linked: true, + interfaceIconFrameDimmed: { + _enum: 'interpolationType', + // _value: 'bilinear', + _value: 'nearestNeighbor', + }, + _isCommand: true, + } + + return batchPlay([setInterpolationMethodDesc, imageSizeDescriptor], { + synchronousExecution: true, + modalBehavior: 'execute', + }) + } + static async resizeImageExe(percent_width, percent_height) { + try { + await executeAsModal(async () => { + await this.resizeImage(percent_width, percent_height) + }) + } catch (e) { + console.warn(e) + } + } static async moveTo(layer, to_x, to_y) { try { @@ -277,6 +391,27 @@ const createSolidLayerDesc = (r, g, b) => ({ }, }) +async function toggleActiveLayer() { + const result = await batchPlay( + [ + { + _obj: 'show', + null: [ + { + _ref: 'layer', + _enum: 'ordinal', + _value: 'targetEnum', + }, + ], + toggleOptionsPalette: true, + _options: { + dialogOptions: 'dontDisplay', + }, + }, + ], + {} + ) +} const toggleBackgroundLayerDesc = () => ({ _obj: 'show', null: [ @@ -354,4 +489,5 @@ module.exports = { createSolidLayerDesc, makeBackgroundLayerDesc, toggleBackgroundLayerExe, + toggleActiveLayer, } diff --git a/utility/session.js b/utility/session.js index 8d255660..6d93b42b 100644 --- a/utility/session.js +++ b/utility/session.js @@ -210,6 +210,7 @@ class GenerationSession { } } async deleteProgressImage() { + preview.store.updateProperty('image', null) this.deleteProgressImageHtml() await this.deleteProgressLayer() } @@ -263,8 +264,325 @@ class GenerationSession { } } +//REFACTOR: move to generation_settings.js +async function getSettings(session_data) { + let payload = {} + + try { + const extension_type = settings_tab.getExtensionType() // get the extension type + const selectionInfo = await psapi.getSelectionInfoExe() + payload['selection_info'] = selectionInfo + const numberOfBatchSize = parseInt( + document.querySelector('#tiNumberOfBatchSize').value + ) + const numberOfSteps = document.querySelector('#tiNumberOfSteps').value + const prompt = html_manip.getPrompt() + const negative_prompt = html_manip.getNegativePrompt() + const hi_res_fix = html_manip.getHiResFixs() + // console.log("prompt:",prompt) + // console.log("negative_prompt:",negative_prompt) + const model_index = document.querySelector('#mModelsMenu').selectedIndex + const upscaler = document.querySelector('#hrModelsMenu').value + const cfg_scale = document.querySelector('#slCfgScale').value + // const model_index = document.querySelector("#") + + function calculateSeed(init_seed, batch_index, batch_size) { + if (init_seed === -1) return -1 + const seed = init_seed + batch_index * batch_size + return seed + } + + const init_seed = parseInt(document.querySelector('#tiSeed').value) + const seed = calculateSeed( + init_seed, + g_current_batch_index, + numberOfBatchSize + ) + + // const mask_blur = document.querySelector('#slMaskBlur').value + const use_sharp_mask = settings_tab.getUseSharpMask() + const mask_blur = html_manip.getMaskBlur() + const mask_expansion = document.getElementById('slMaskExpansion').value + + const inpaint_full_res_padding = + document.querySelector('#slInpaintPadding').value + + // console.dir(numberOfImages) + const bUsePromptShortcut = document.getElementById( + 'chUsePromptShortcut' + ).checked + let prompt_shortcut_ui_dict = {} + try { + let prompt_shortcut_string = + document.getElementById('taPromptShortcut').value + prompt_shortcut_ui_dict = JSON.parse(prompt_shortcut_string) + } catch (e) { + console.warn( + `warning prompt_shortcut_ui_dict is not valid Json obj: ${e}` + ) + prompt_shortcut_ui_dict = {} + } + + // const slider_width = document.getElementById("slWidth").value + // gWidth = getWidthFromSlider(slider_width) + const original_width = html_manip.getWidth() + const original_height = html_manip.getHeight() + + const width = general.nearestMultiple(original_width, 64) + const height = general.nearestMultiple(original_height, 64) + + const hWidth = html_manip.getSliderSdValue_Old('hrWidth', 64) + const hHeight = html_manip.getSliderSdValue_Old('hrHeight', 64) + const hSteps = html_manip.getSliderSdValue_Old('hrNumberOfSteps', 1) + //const hScale = html_manip.getSliderSdValue_Old('hrScale',1) + console.log('Check') + + const uniqueDocumentId = await getUniqueDocumentId() + const h_denoising_strength = html_manip.getSliderSdValue_Old( + 'hrDenoisingStrength', + 0.01 + ) + console.log('Check2') + + //Note: store the sampler names in json file if auto is offline or auto api is unmounted + + const sampler_name = html_manip.getCheckedSamplerName() + + const mode = html_manip.getMode() + const b_restore_faces = + document.getElementById('chRestoreFaces').checked + + let denoising_strength = h_denoising_strength + if (mode == 'inpaint' || mode == 'outpaint') { + var g_use_mask_image = true + payload['inpaint_full_res'] = + document.getElementById('chInpaintFullRes').checked + payload['inpaint_full_res_padding'] = inpaint_full_res_padding * 4 + + console.log('g_use_mask_image is ', g_use_mask_image) + console.log('g_init_image_mask_name is ', g_init_image_mask_name) + payload['init_image_mask_name'] = g_init_image_mask_name + payload['inpainting_fill'] = html_manip.getMaskContent() + payload['mask_expansion'] = mask_expansion + // payload['mask'] = g_generation_session.activeBase64MaskImage + payload['mask'] = session_data?.mask + payload['expanded_mask'] = session_data?.mask + if ( + use_sharp_mask === false && + payload['mask'] && + mask_expansion > 0 + ) { + //only if mask is available and sharp_mask is off + // use blurry and expanded mask + const iterations = payload['mask_expansion'] + const expanded_mask = await py_re.maskExpansionRequest( + payload['mask'], + iterations + ) + if (expanded_mask) { + payload['expanded_mask'] = expanded_mask + payload['mask'] = expanded_mask + session_ts.store.expanded_mask = expanded_mask + } + } + // viewer.store.mask = payload['mask'] // make sure + } else if (mode == 'img2img') { + var g_use_mask_image = false + delete payload['inpaint_full_res'] // inpaint full res is not available in img2img mode + delete payload['inpaint_full_res_padding'] + delete payload['init_image_mask_name'] + delete payload['inpainting_fill'] + } + + if ( + g_sd_mode == 'img2img' || + g_sd_mode == 'inpaint' || + g_sd_mode == 'outpaint' + ) { + // const { init_image, mask } = io.getOutpaintInitImageAndMask() + console.log(`g_use_mask_image:? ${g_use_mask_image}`) + + denoising_strength = html_manip.getDenoisingStrength() + payload['denoising_strength'] = denoising_strength + payload['init_image_name'] = g_init_image_name + + payload['init_images'] = [session_data?.init_image] + // payload['init_images'] = [ + // g_generation_session.activeBase64InitImage, + // // init_image, + // ] + payload['image_cfg_scale'] = sd_tab.getImageCfgScaleSDValue() // we may need to check if model is pix2pix + + if ( + scripts.script_store.isInstalled() && + scripts.script_store.is_active && + scripts.script_store.selected_script_name !== 'None' && + scripts.script_store.is_selected_script_available + ) { + payload['script_args'] = scripts.script_store.orderedValues() + + payload['script_name'] = + scripts.script_store.selected_script_name //'Ultimate SD upscale' + } + } else { + delete payload['script_args'] + delete payload['script_name'] + } + + // payload['script_args'] = [] + + // payload['script_name'] = 'after detailer' + function setAlwaysOnScripts() { + const data = after_detailer_script.store.toJsFunc().data + console.log('setAlwaysOnScripts=> data:', data) + + const alwayson_scripts = { + 'After Detailer': { + args: [ + data.is_enabled, + { + // ad_model: 'face_yolov8n.pt', + ad_model: data.ad_model, + ad_prompt: data.prompt, + ad_negative_prompt: data.negativePrompt, + ad_conf: data.ad_conf, + ad_mask_min_ratio: 0.0, + ad_mask_max_ratio: 1.0, + ad_dilate_erode: 32, + ad_x_offset: 0, + ad_y_offset: 0, + ad_mask_merge_invert: 'None', + ad_mask_blur: 4, + ad_denoising_strength: 0.4, + ad_inpaint_full_res: true, + ad_inpaint_full_res_padding: 0, + ad_use_inpaint_width_height: false, + ad_inpaint_width: 512, + ad_inpaint_height: 512, + ad_use_steps: true, + ad_steps: 28, + ad_use_cfg_scale: false, + ad_cfg_scale: 7.0, + ad_restore_face: false, + ad_controlnet_model: data.controlnet_model, + ad_controlnet_weight: data.controlNetWeight, + }, + ], + }, + } + if (!data?.is_installed) { + delete alwayson_scripts['After Detailer'] + } + return alwayson_scripts + } + + const alwyason_scripts = setAlwaysOnScripts() + payload['alwayson_scripts'] = { + ...(payload['alwayson_scripts'] || {}), + ...alwyason_scripts, + } + + if (hi_res_fix && width >= 512 && height >= 512) { + const hr_scale = sd_tab.getHrScaleSliderSDValue() + + payload['enable_hr'] = hi_res_fix + // payload['firstphase_width'] = width + // payload['firstphase_height'] = height + // payload['hr_resize_x'] = hWidth + // payload['hr_resize_y'] = hHeight + payload['hr_scale'] = hr_scale // Scale + payload['hr_upscaler'] = upscaler // Upscaler + payload['hr_second_pass_steps'] = hSteps // Number of Steps + } else { + //fix hi res bug: if we include firstphase_width or firstphase_height in the payload, + // sd api will use them instead of using width and height variables, even when enable_hr is set to "false" + delete payload['enable_hr'] + // delete payload['firstphase_width'] + // delete payload['firstphase_height'] + } + + //work with the hord + + // const script_args_json = { + // model: "Anything Diffusion", + // nsfw: false, + // shared_laion: false, + // seed_variation: 1, + // post_processing_1: "None", + // post_processing_2: "None", + // post_processing_3: "None" + // } + // const script_args = Object.values(script_args_json) + + const backend_type = html_manip.getBackendType() + if (backend_type === backendTypeEnum['Auto1111HordeExtension']) { + payload['script_name'] = script_horde.script_name + payload['script_args'] = script_horde.getScriptArgs() + } else if ( + payload['script_name'] === script_horde.script_name && + backend_type !== backendTypeEnum['Auto1111HordeExtension'] + ) { + delete payload['script_name'] + delete payload['script_args'] + } + + if (bUsePromptShortcut) { + //replace the prompt with the prompt shortcut equivalent + const [new_prompt, new_negative_prompt] = + py_re.replacePromptsWithShortcuts( + prompt, + negative_prompt, + prompt_shortcut_ui_dict + ) + + //used in generation + payload['prompt'] = new_prompt + payload['negative_prompt'] = new_negative_prompt + + //used to when resote settings from metadata + payload['original_prompt'] = prompt + payload['original_negative_prompt'] = negative_prompt + } else { + //use the same prompt as in the prompt textarea + payload['prompt'] = prompt + payload['negative_prompt'] = negative_prompt + + payload['original_prompt'] = prompt + payload['original_negative_prompt'] = negative_prompt + } + + payload = { + ...payload, + // prompt: prompt, + // negative_prompt: negative_prompt, + steps: numberOfSteps, + // n_iter: numberOfImages, + sampler_index: sampler_name, + width: width, + height: height, + denoising_strength: denoising_strength, + batch_size: numberOfBatchSize, + cfg_scale: cfg_scale, + seed: seed, + mask_blur: mask_blur, + use_sharp_mask: use_sharp_mask, + use_prompt_shortcut: bUsePromptShortcut, + prompt_shortcut_ui_dict: prompt_shortcut_ui_dict, + uniqueDocumentId: uniqueDocumentId, + mode: mode, + restore_faces: b_restore_faces, + // script_args: script_args, + // script_name:"Run on Stable Horde" + } + } catch (e) { + console.error(e) + } + return payload +} + module.exports = { GenerationSession, GarbageCollectionState, SessionState, + getSettings, } From 0ce2f0d5f331ac7bbfdd38f95fcce0f5bcd7b7f0 Mon Sep 17 00:00:00 2001 From: unknown <348063288@qq.com> Date: Sat, 10 Jun 2023 14:28:37 +0800 Subject: [PATCH 036/143] Chinese localization for controlnet --- typescripts/@types/uxp.d.ts | 1 + typescripts/controlnet/ControlNetTab.tsx | 8 +-- typescripts/controlnet/ControlNetUnit.tsx | 31 ++++---- typescripts/globalstore.ts | 12 ++++ typescripts/locale/locale.ts | 88 +++++++++++++++++++++++ 5 files changed, 120 insertions(+), 20 deletions(-) create mode 100644 typescripts/globalstore.ts create mode 100644 typescripts/locale/locale.ts diff --git a/typescripts/@types/uxp.d.ts b/typescripts/@types/uxp.d.ts index 3d654659..40208806 100644 --- a/typescripts/@types/uxp.d.ts +++ b/typescripts/@types/uxp.d.ts @@ -2,4 +2,5 @@ declare module 'uxp' { // Add type declarations for the uxp module here export const storage: any; export const versions: any; + export const host: any; } diff --git a/typescripts/controlnet/ControlNetTab.tsx b/typescripts/controlnet/ControlNetTab.tsx index 8185b7f2..c6c3f2cd 100644 --- a/typescripts/controlnet/ControlNetTab.tsx +++ b/typescripts/controlnet/ControlNetTab.tsx @@ -5,6 +5,7 @@ import { store as ControlNetStore } from './main'; import { DefaultControlNetUnitData } from './store'; import { Enum, controlnet_preset, note, preset, selection } from '../util/oldSystem'; import {SpMenuComponent} from '../util/elements'; +import Locale from '../locale/locale'; let g_controlnet_presets: any; declare const g_generation_session: any; @@ -113,8 +114,7 @@ class ControlNetTab extends React.Component<{ appState: typeof ControlNetStore } id="controlnetMissingError" style={{ color: '#ff595e', whiteSpace: 'normal' }} > - The Controlnet Extension is missing from Automatic1111. - Please install it to use it through the plugin. + {Locale('controlnet.missing')} ) }
- Set All CtrlNet Images + {Locale('controlnet.setall')}
Disable ControlNet Tab + >{Locale('controlnet.disableall')}
diff --git a/typescripts/controlnet/ControlNetUnit.tsx b/typescripts/controlnet/ControlNetUnit.tsx index 5bd607fb..e4e389e6 100644 --- a/typescripts/controlnet/ControlNetUnit.tsx +++ b/typescripts/controlnet/ControlNetUnit.tsx @@ -4,6 +4,7 @@ import { MoveToCanvasSvg,ActionButtonSVG, SpCheckBox, SpMenu, SpSlider, Thumbnai import ControlNetStore from './store'; import { mapRange, versionCompare } from './util'; import { note, selection, html_manip, psapi,api, general } from '../util/oldSystem'; +import Locale from '../locale/locale'; declare const g_generation_session: any; @@ -276,12 +277,10 @@ export default class ControlNetUnit extends React.Component<{ index: number, app const pd = this.props.appState.preprocessorDetail[storeData.module] || {}; const ppSlider = pd.sliders || []; - console.log("pixel_perfect:" + storeData.pixel_perfect); - return
Control Net Settings Slot {this.props.index} + >{Locale('controlnet.index')}{this.props.index}
- Set CtrlNet Img + {Locale('controlnet.setimage')}
@@ -335,32 +334,32 @@ export default class ControlNetUnit extends React.Component<{ index: number, app title="Preview Annotator" > - Preview Annotator + {Locale('controlnet.preview')}
- Enable - Low VRAM - 1 ? 'none' : void 0, marginRight: "10px"}} onChange={this.onGuessModeChange.bind(this)} checked={storeData.guessmode} id={`chGuessMode_${this.props.index}`}>Guess Mode - 1 ? void 0 : 'none', marginRight: "10px"}} onChange={this.onPixelPerfectChange.bind(this)} checked={storeData.pixel_perfect} id={`chPixelPerfect_${this.props.index}`}>Pixel Perfect + {Locale('controlnet.enable')} + {Locale('controlnet.lowVRam')} + 1 ? 'none' : void 0, marginRight: "10px"}} onChange={this.onGuessModeChange.bind(this)} checked={storeData.guessmode} id={`chGuessMode_${this.props.index}`}>{Locale('controlnet.GuessMode')} + 1 ? void 0 : 'none', marginRight: "10px"}} onChange={this.onPixelPerfectChange.bind(this)} checked={storeData.pixel_perfect} id={`chPixelPerfect_${this.props.index}`}>{Locale('controlnet.PixelPerfect')} { this.props.appState.controlnetApiVersion > 1 && - Control Mode: + {Locale('controlnet.ControlMode')} Balanced + >{Locale('controlnet.ControlMode.Balanced')} Prompt + >{Locale('controlnet.ControlMode.Prompt')} ControlNet + >{Locale('controlnet.ControlMode.ControlNet')} } @@ -375,7 +374,7 @@ export default class ControlNetUnit extends React.Component<{ index: number, app onInput={this.onWeightMove.bind(this)} title="2 will keep the composition; 0 will allow composition to change" > - Weight: + {Locale('controlnet.weight')} {storeData.weight} - Guidance strength start: + {Locale('controlnet.guidancestart')} - Guidance strength end: + {Locale('controlnet.guidanceend')} ({ + Locale: host.uiLocale == 'zh_CN' ? host.uiLocale : 'default' +}); + +export default globalStore; \ No newline at end of file diff --git a/typescripts/locale/locale.ts b/typescripts/locale/locale.ts new file mode 100644 index 00000000..392cf5b2 --- /dev/null +++ b/typescripts/locale/locale.ts @@ -0,0 +1,88 @@ +import globalStore from "../globalstore" + +interface LocaleItem { + zh_CN: string, + default: string +} + +// interface LocaleSetting { +// [key: string]: LocaleItem +// } + + +const LocaleSetting = { + "controlnet.missing": { + "zh_CN": `本地SD中缺少控制网扩展。\n请安装该插件后再使用。`, + "default": "The Controlnet Extension is missing from Automatic1111.\nPlease install it to use it through the plugin." + }, + "controlnet.setall": { + "zh_CN": `设置所有控制网图片`, + "default": `Set All CtrlNet Images` + }, + "controlnet.disableall": { + "zh_CN": `禁用控制网选项卡`, + "default": `Disable ControlNet Tab` + }, + "controlnet.index": { + "zh_CN": '控制网 #', + "default": `ControlNet #` + }, + "controlnet.setimage": { + "zh_CN": `设置原始图`, + "default": `Set CtrlNet Img` + }, + "controlnet.preview": { + "zh_CN": `查看标注图`, + "default": `Preview Annotator` + }, + "controlnet.enable": { + "zh_CN": `启用`, + "default": `Enable` + }, + "controlnet.lowVRam": { + "zh_CN": `低显存`, + "default": "low VRAM" + }, + "controlnet.GuessMode": { + "zh_CN": `猜测模式`, + "default": "Guess Mode" + }, + "controlnet.PixelPerfect": { + "zh_CN": `自动分辨率`, + "default": "Pixel Perfect" + }, + "controlnet.ControlMode": { + "zh_CN": `控制优先`, + "default": "Control Mode" + }, + "controlnet.ControlMode.Balanced": { + "zh_CN": `平衡`, + "default": "Balanced" + }, + "controlnet.ControlMode.Prompt": { + "zh_CN": `提示词`, + "default": "Prompt" + }, + "controlnet.ControlMode.ControlNet": { + "zh_CN": `控制网`, + "default": "ControlNet" + }, + "controlnet.weight": { + "zh_CN": `权重: `, + "default": "Weight: " + }, + "controlnet.guidancestart": { + "zh_CN": `开始步数: `, + "default": "Guidance strength start: " + }, + "controlnet.guidanceend": { + "zh_CN": `结束步数: `, + "default": "Guidance strength end: " + }, +} + +export default function Locale(key: keyof typeof LocaleSetting): string +{ + const locale = globalStore.Locale; + return LocaleSetting[key][locale]; +} \ No newline at end of file From 91a65ce04bc93108ae8ea0096ca5dc2f535982a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?zombieyang=28=E6=9D=A8=E6=B5=A9=29?= Date: Thu, 22 Jun 2023 20:42:52 +0800 Subject: [PATCH 037/143] controlnet optimize --- index.html | 252 ---------------- typescripts/controlnet/ControlNetTab.tsx | 18 +- typescripts/controlnet/ControlNetUnit.tsx | 338 +++++++++++----------- 3 files changed, 176 insertions(+), 432 deletions(-) diff --git a/index.html b/index.html index cef182f2..d9e2b179 100644 --- a/index.html +++ b/index.html @@ -991,258 +991,6 @@
- - -
diff --git a/typescripts/controlnet/ControlNetTab.tsx b/typescripts/controlnet/ControlNetTab.tsx index c6c3f2cd..4f7b683d 100644 --- a/typescripts/controlnet/ControlNetTab.tsx +++ b/typescripts/controlnet/ControlNetTab.tsx @@ -130,21 +130,15 @@ class ControlNetTab extends React.Component<{ appState: typeof ControlNetStore } {Locale('controlnet.setall')}
- {Locale('controlnet.disableall')} + {/* {Locale('controlnet.disableall')} */}
- { - Array(this.props.appState.maxControlNet * 2).fill(0).map((v, index) => { - if (index % 2 == 0) { - return
- } - else { - return - } - }) - } + Array(this.props.appState.maxControlNet).fill(0).map((v, index) => { + return + }) + }
); diff --git a/typescripts/controlnet/ControlNetUnit.tsx b/typescripts/controlnet/ControlNetUnit.tsx index e4e389e6..1aab564d 100644 --- a/typescripts/controlnet/ControlNetUnit.tsx +++ b/typescripts/controlnet/ControlNetUnit.tsx @@ -279,184 +279,186 @@ export default class ControlNetUnit extends React.Component<{ index: number, app return
- {Locale('controlnet.index')}{this.props.index} + + {Locale('controlnet.index')}{this.props.index} +
-
-
-
- +
+
+
+
+ +
+
+ +
-
- +
+
+ + + + + + + +
+
+ +
-
+ + {Locale('controlnet.lowVRam')} + 1 ? 'none' : void 0, marginRight: "10px"}} onChange={this.onGuessModeChange.bind(this)} checked={storeData.guessmode} id={`chGuessMode_${this.props.index}`}>{Locale('controlnet.GuessMode')} + 1 ? void 0 : 'none', marginRight: "10px"}} onChange={this.onPixelPerfectChange.bind(this)} checked={storeData.pixel_perfect} id={`chPixelPerfect_${this.props.index}`}>{Locale('controlnet.PixelPerfect')} + { + this.props.appState.controlnetApiVersion > 1 && + + {Locale('controlnet.ControlMode')} + {Locale('controlnet.ControlMode.Balanced')} + {Locale('controlnet.ControlMode.Prompt')} + {Locale('controlnet.ControlMode.ControlNet')} + + } + +
- - - - - - - -
-
- + {ppSlider[1].name}: + {storeData.threshold_a.toFixed(2)} + } + {ppSlider && ppSlider[2] && + {ppSlider[2].name}: + {storeData.threshold_b.toFixed(2)} + }
-
- - {Locale('controlnet.enable')} - {Locale('controlnet.lowVRam')} - 1 ? 'none' : void 0, marginRight: "10px"}} onChange={this.onGuessModeChange.bind(this)} checked={storeData.guessmode} id={`chGuessMode_${this.props.index}`}>{Locale('controlnet.GuessMode')} - 1 ? void 0 : 'none', marginRight: "10px"}} onChange={this.onPixelPerfectChange.bind(this)} checked={storeData.pixel_perfect} id={`chPixelPerfect_${this.props.index}`}>{Locale('controlnet.PixelPerfect')} - { - this.props.appState.controlnetApiVersion > 1 && - - {Locale('controlnet.ControlMode')} - {Locale('controlnet.ControlMode.Balanced')} - {Locale('controlnet.ControlMode.Prompt')} - {Locale('controlnet.ControlMode.ControlNet')} - - } - -
-
- - {Locale('controlnet.weight')} - {storeData.weight} - - - {Locale('controlnet.guidancestart')} - {storeData.guidance_start} - - - {Locale('controlnet.guidanceend')} - {storeData.guidance_end} - - {ppSlider && ppSlider[0] && !storeData.pixel_perfect && - {ppSlider[0].name}: - {storeData.processor_res.toFixed(2)} - } - {ppSlider && ppSlider[1] && - {ppSlider[1].name}: - {storeData.threshold_a.toFixed(2)} - } - {ppSlider && ppSlider[2] && - {ppSlider[2].name}: - {storeData.threshold_b.toFixed(2)} - } +
+ + {!pd.model_free && + () + }
-
- - {!pd.model_free && - () - } -
} } From bf1e6056715a90777164c3382c569ae00eaca2d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?zombieyang=28=E6=9D=A8=E6=B5=A9=29?= Date: Thu, 22 Jun 2023 21:31:47 +0800 Subject: [PATCH 038/143] use official's localization --- tsconfig.json | 2 +- typescripts/controlnet/ControlNetTab.tsx | 12 +- typescripts/controlnet/ControlNetUnit.tsx | 26 +- typescripts/locale/locale.ts | 88 +- typescripts/locale/zh_Hans.json | 3515 +++++++++++++++++++++ 5 files changed, 3543 insertions(+), 100 deletions(-) create mode 100644 typescripts/locale/zh_Hans.json diff --git a/tsconfig.json b/tsconfig.json index 0a6693f9..db431288 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -40,7 +40,7 @@ // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ - // "resolveJsonModule": true, /* Enable importing .json files. */ + "resolveJsonModule": true, /* Enable importing .json files. */ // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ diff --git a/typescripts/controlnet/ControlNetTab.tsx b/typescripts/controlnet/ControlNetTab.tsx index 4f7b683d..cb06f47d 100644 --- a/typescripts/controlnet/ControlNetTab.tsx +++ b/typescripts/controlnet/ControlNetTab.tsx @@ -114,10 +114,10 @@ class ControlNetTab extends React.Component<{ appState: typeof ControlNetStore } id="controlnetMissingError" style={{ color: '#ff595e', whiteSpace: 'normal' }} > - {Locale('controlnet.missing')} + {Locale("The Controlnet Extension is missing from Automatic1111.\nPlease install it to use it through the plugin.")} ) } -
@@ -130,13 +130,13 @@ class ControlNetTab extends React.Component<{ appState: typeof ControlNetStore } {Locale('controlnet.setall')}
- {/* {Locale('controlnet.disableall')} */} -
+ {Locale('controlnet.disableall')} +
*/}
{ Array(this.props.appState.maxControlNet).fill(0).map((v, index) => { - return + return }) }
diff --git a/typescripts/controlnet/ControlNetUnit.tsx b/typescripts/controlnet/ControlNetUnit.tsx index 1aab564d..49546b24 100644 --- a/typescripts/controlnet/ControlNetUnit.tsx +++ b/typescripts/controlnet/ControlNetUnit.tsx @@ -280,7 +280,7 @@ export default class ControlNetUnit extends React.Component<{ index: number, app return
- {Locale('controlnet.index')}{this.props.index} + ControlNet Unit {this.props.index}
@@ -305,7 +305,7 @@ export default class ControlNetUnit extends React.Component<{ index: number, app onClick={this.onSetImageButtonClick.bind(this)} title="Set CtrlNet Img" > - {Locale('controlnet.setimage')} + {Locale('Set CtrlImg')}
@@ -336,31 +336,31 @@ export default class ControlNetUnit extends React.Component<{ index: number, app title="Preview Annotator" > - {Locale('controlnet.preview')} + {Locale('Preview Annotator')}
- {Locale('controlnet.lowVRam')} - 1 ? 'none' : void 0, marginRight: "10px"}} onChange={this.onGuessModeChange.bind(this)} checked={storeData.guessmode} id={`chGuessMode_${this.props.index}`}>{Locale('controlnet.GuessMode')} - 1 ? void 0 : 'none', marginRight: "10px"}} onChange={this.onPixelPerfectChange.bind(this)} checked={storeData.pixel_perfect} id={`chPixelPerfect_${this.props.index}`}>{Locale('controlnet.PixelPerfect')} + {Locale('Low VRAM')} + 1 ? 'none' : void 0, marginRight: "10px"}} onChange={this.onGuessModeChange.bind(this)} checked={storeData.guessmode} id={`chGuessMode_${this.props.index}`}>{Locale('Guess Mode')} + 1 ? void 0 : 'none', marginRight: "10px"}} onChange={this.onPixelPerfectChange.bind(this)} checked={storeData.pixel_perfect} id={`chPixelPerfect_${this.props.index}`}>{Locale('Pixel Perfect')} { this.props.appState.controlnetApiVersion > 1 && - {Locale('controlnet.ControlMode')} + {Locale('Control Mode')} {Locale('controlnet.ControlMode.Balanced')} + >{Locale('Balanced')} {Locale('controlnet.ControlMode.Prompt')} + >{Locale('My prompt is more important')} {Locale('controlnet.ControlMode.ControlNet')} + >{Locale('ControlNet is more important')} } @@ -375,7 +375,7 @@ export default class ControlNetUnit extends React.Component<{ index: number, app onInput={this.onWeightMove.bind(this)} title="2 will keep the composition; 0 will allow composition to change" > - {Locale('controlnet.weight')} + {Locale('Control Weight')} {storeData.weight} - {Locale('controlnet.guidancestart')} + {Locale('Guidance Start (T)')} - {Locale('controlnet.guidanceend')} + {Locale('Guidance End (T)')} idea by redditor WestWordHoeDown, it forces to choose between 2 and 3 image types" : "all -- 全部 - 强制混合 --> 来自于 redditor: WestWordHoeDown 的创意,强制选择 2-3 种图像类型。", + "All models in this directory will receive the selected model's metadata" : "此目录下所有模型都将被粘贴与选中模型完全相同的元数据", + "all --> normally picks a image type as random. Can choose a ‘other’ more unique type." : "all -- 全部 --> 通常会随机选择一个图像类型。可以选择一个 \"其它\" 更独特的类型。", + "Allow detectmap auto saving" : "允许自动保存检测图 (detected maps)", + "Allow img2img" : "允许图生图", + "Allow NSFW" : "允许成人内容", + "Allow other script to control this extension" : "允许其他脚本控制此扩展", + "allow overwrite" : "允许覆盖文件", + "Allow overwrite output-model" : "允许输出时覆盖同名模型", + "Allow Preview" : "允许预览", + "\uD83D\uDD04 All Reset" : "\uD83D\uDD04 全部重置", + "alpha" : "α", + "Alphabetical Order" : "字母顺序", + "alpha threshold" : "透明度阈值", + "Alpha threshold" : "透明度阈值", + "also delete off-screen images" : "允许同时删除屏幕外的图片", + "also enable wierd blocky upscale mode" : "同时启用糟糕的分块放大模式", + "alternate" : "交替", + "Alternatively, use" : "或者, 使用 ", + "Alternatively, you can enable" : "或者,您可以启用", + "Always" : "保持", + "Always discard next-to-last sigma" : "始终舍弃倒数第二个 sigma 值", + "Always Display Buttons" : "总是显示按钮", + "Always print all generation info to standard output" : "始终将所有生成信息输出到控制台", + "Always save all generated image grids" : "始终保存所有生成的网格图", + "Always save all generated images" : "始终保存所有生成的图像", + "A merger of the two checkpoints will be generated in your" : "合并后的模型将保存在您的", + "Amount of images to generate" : "图像生成数量", + "amount of presence of previous frame to influence next frame, also controls steps in the following formula [steps - (strength_schedule * steps)]" : "前一帧影响下一帧的存在量,也控制下式中的步数:[steps - (strength_schedule * steps)]", + "Amount of tries" : "尝试次数", + "Amount schedule" : "数量表", + "Amount times to repeat upscaling with IMG2IMG (loopback)" : "通过图生图放大的重复次数 (回送)", + "and" : "与", + "and generate images according to random segmentation which preserve image layout." : " 来根据保存图像的布局随机分割生成图像。", + "and report your problem." : "反馈您遇到的问题。", + "and upscale to the size of the original video." : "放大图片到原始视频的尺寸。", + "A negative prompt to use when generating preview images." : "生成预览图像时使用的反向提示词", + "Angle" : "角度", + "angular" : "angular (棱角)", + "animal" : "animal (动物)", + "animal - A random (fictional) animal. Has a chance to have human characteristics, such as clothing added." : "animal - 动物 - 一只随机的(虚构的)动物。可能会拥有人类的特征,如穿衣服。", + "animation" : "动画", + "Animation mode" : "动画模式", + "anime" : "anime (动漫)", + "Anime" : "动漫", + "Anime-inclined great guide (by FizzleDorf) with lots of examples:" : "很不错的、带有许多示例的动画指南 (由 FizzleDorf 制作) : ", + "anime key visual" : "anime key visual (动漫主视觉图/海报)", + "Anime Remove Background" : "动漫移除背景模式", + "Annotator resolution" : "预处理器分辨率", + "Anti Blur" : "防模糊", + "API info may not be necessary for some boorus, but certain information or posts may fail to load without it. For example, Danbooru doesn't show certain posts in search results unless you auth as a Gold tier member." : "API 信息对于某些 booru 站点可能不是必需的,但如果没有它,某些信息或图帖可能无法加载。 例如,除非你的 API 验证属于黄金会员,否则 Danbooru 可能不会在搜索结果中显示某些图帖。", + "API Key" : "API 密钥", + "API Keys" : "API 密钥", + "append" : "追加", + "Append" : "追加至末尾", + "Append Caption to File Name" : "将描述文本追加到文件名之后", + "Append comma on tag autocompletion" : "自动添加逗号", + "Append commas" : "追加逗号", + "Append DeepDanbooru to Caption" : "把 DeepDanbooru 的结果追加到已有的描述文本之后", + "Append Hires prompts to the end of the original prompts instead of replacing it." : "将高分辨率修复提示词追加到原始提示词的末尾,而不是替换它们", + "Append interrogated prompt at each iteration" : "在每次迭代时添加何种反推模型反推出的提示词", + "Append prompts, not replace" : "追加提示词 (非替换)", + "Apply" : "应用", + "Apply and quit" : "应用更改并退出", + "Apply and restart UI" : "应用更改并重载前端", + "Apply block weight from text" : "从文本框应用分块权重值", + "Apply changes to ALL displayed images" : "将更改应用于所有已显示的图像", + "Apply color correction to img2img results to match original colors." : "对图生图结果应用颜色校正以匹配原始颜色", + "Apply horizontal Flip" : "应用水平翻转", + "Apply Horizontal Flip" : "应用水平翻转", + "Apply if any" : "应用 (如有)", + "Apply if any: remove style text from prompt; if any styles are found in prompt, put them into styles dropdown, otherwise keep it as it is." : "应用 (如有): 从提示词中删除对应预设样式文本; 将匹配到的预设样式加入下拉菜单", + "Apply inside mask only" : "仅使用内部蒙版", + "Apply mask to original image" : "应用蒙版到原始图", + "Apply mask to the Ref Image" : "应用蒙版到参考图", + "Apply mask to the result" : "应用蒙版到结果", + "Apply only selected scripts to ADetailer" : "只将选定的脚本应用于 After Detailer", + "Apply Presets" : "应用预设", + "Apply: remove style text from prompt, always replace styles dropdown value with found styles (even if none are found)." : "应用: 从提示词中删除对应预设样式文本; 总是将下拉菜单内容替换为相应预设样式名 (即使不存在对应预设)", + "Apply scripts to faces" : "使用脚本识别脸部", + "Apply selected styles to current prompt" : "将所选预设样式插入到当前提示词之后", + "Apply settings" : "保存设置", + "Apply to" : "应用到", + "Apply transfer control when loading models" : "加载模型时应用控制转移", + "a random seed will be used on each frame of the animation" : "随机种子将被应用于每帧动画中", + "architecture" : "architecture (建筑)", + "Architecture" : "架构", + "Archive filename pattern" : "压缩包文件名格式", + "Area" : "区域", + "Area (large to small)" : "面积 (从大到小)", + "Area lower bound" : "图片最小面积(宽*高)", + "Area upper bound" : "图片最大面积(宽*高)", + "Arguments are case-sensitive." : "参数区分大小写。", + "Arm Length" : "手臂长度", + "art deco" : "art deco (装饰艺术)", + "Artistic" : "艺术", + "Artists have a major impact on the result. Automatically, it will select between 0-3 artists out of 3483 artists for your prompt." : "Artists (艺术家风格) 对图像结果有很大影响。它会自动从 3483 名艺术家中选择 0-3 名艺术家名作为你提示词的一部分。", + "art nouveau" : "art nouveau (新艺术运动)", + "as a UI to define your animation schedules (see the Parseq section in the Init tab)." : " 作为定义动画参数表的UI (请参见初始化选项卡中的参数定序器部分) .", + "Ascending" : "升序", + "A setting of 1 will cause every frame to receive diffusion in the sequence of image outputs. A setting of 2 will only diffuse on every other frame, yet motion will still be in effect. The output of images during the cadence sequence will be automatically blended, additively and saved to the specified drive. This may improve the illusion of coherence in some workflows as the content and context of an image will not change or diffuse during frames that were skipped. Higher values of 4-8 cadence will skip over a larger amount of frames and only diffuse the “Nth” frame as set by the diffusion_cadence value. This may produce more continuity in an animation, at the cost of little opportunity to add more diffused content. In extreme examples, motion within a frame will fail to produce diverse prompt context, and the space will be filled with lines or approximations of content - resulting in unexpected animation patterns and artifacts. Video Input & Interpolation modes are not affected by diffusion_cadence." : "设置为 1 将使每个帧在图像输出序列中生成图像。设置为 2 将每隔一帧进行图像生成,但运动仍然有效。间隔序列期间的图像输出将自动混合、添加并保存到指定驱动器。这可能会改善某些工作流中的一致性错觉,因为图像的内容和上下文在跳过的帧期间不会改变或扩散。更高的间隔值,例如4-8,将跳过更多的帧,并仅生成由生成间隔值设置的“第N”帧。这可能会在动画中产生更多的连续性,但几乎没有机会添加更多的扩散内容。在极端的例子中,帧内的运动将无法产生不同的提示上下文,并且空间将充满线条或近似的内容,从而导致意外的动画模式和伪影。视频输入和插值模式不受生成间隔值的影响。", + "Aspect Ratio Helper" : "纵横比助手", + "Attention Heatmap" : "关键词热力图", + "Attention texts for visualization. (comma separated)" : "待可视化关键词 (逗号分隔)", + "Audio (if provided) will *not* be transferred to the interpolated video if Slow-Mo is enabled." : "音频 (如果提供了) 在以下选项启用时将不会转码压制进帧插值后的视频内:慢动作", + "Author" : "作者", + "Author of this model" : "此模型的作者", + "auto" : "自动", + "Auto" : "自动", + "autocast" : "自动转换", + "Autocomplete options" : "自动补全选项", + "auto-delete imgs when video is ready" : "视频完成时自动删除图片", + "Auto detect size from img2img" : "从图生图自动检测图像尺寸", + "Auto focal point crop" : "自动面部焦点剪裁", + "automatic" : "自动", + "Automatic" : "自动", + "“automatic” is entirely build around Latent Couple. It will pass artists and the amount of people/animals/objects to generate in the prompt automatically. Set the prompt compounder equal to the amount of areas defined in Laten Couple." : "\"自动\" 是完全围绕 Latent Couple 构建的。它将在提示词中自动传递艺术家和要生成的人/动物/物件的数量。将提示词混合值设置为等于 Latent Couple 中定义的分区数量。", + "Auto SAM" : "自动 SAM", + "Auto SAM Config" : "自动 SAM 配置", + "Auto SAM is mainly for semantic segmentation and image layout generation, which is supported based on ControlNet. You must have ControlNet extension installed, and you should not change its directory name (sd-webui-controlnet)." : "自动 SAM 基于 ControlNet 的支持,主要用于语义分割和图像分层。需安装 ControlNet 扩展,且不能修改其目录名 (sd-webui-controlnet)。", + "Auto search port" : "自动检索端口", + "Auto segmentation output" : "自动语义分割输出", + "Auto-sized crop" : "自动按比例剪裁缩放", + "Auto Tagging" : "自动标记", + "Auto Tagging option" : "自动标记选项", + "Available" : "可下载", + "A value that determines the output of random number generator - if you create an image with same parameters and seed as another image, you'll get the same result" : "一个决定随机数生成器输出的值 - 以相同参数和相同种子进行多次生成,会得到相同的多张图像\n\uD83C\uDFB2 将随机种子设置为-1,则每次都会使用一个新的随机数\n♻️ 复用上一次使用的随机种子,对于固定输出结果有用", + "A weighted sum will be used for interpolation. Requires two models; A and B. The result is calculated as A * (1 - M) + B * M" : "最终模型权重是前两个模型按比例相加的结果。需要 A、B 两个模型。计算公式为 A * (1 - M) + B * M", + "a-z" : "按首字母正序", + "- Background" : "- 背景", + "background color" : "背景颜色", + "Background gradiant color" : "背景渐变色", + "Background source(mp4 or directory containing images)" : "背景源(mp4 或包含图像的目录)", + "Background type" : "背景类型", + "Backup/Restore" : "备份/恢复", + "Bake in VAE" : "嵌入 VAE 模型", + "Balance between eyes" : "双眼间距平衡", + "Balanced" : "均衡", + "baroque" : "baroque (巴洛克)", + "Base" : "基层值", + "Base alpha" : "α 基数", + "Base Depth" : "基础深度", + "Base Sampler" : "基础采样器", + "Basic" : "基础", + "Basic info" : "基本信息", + "Batch" : "批量处理", + "Batch count" : "总批次数", + "Batch from Dir" : "批量处理文件夹", + "Batch from directory" : "批量处理文件夹", + "Batch from Directory" : "批量处理文件夹", + "Batch img2img" : "批量图生图", + "Batch name" : "批次名称", + "batch process" : "批量处理", + "Batch Process" : "批量处理", + "Batch Run" : "批量处理", + "Batch Settings" : "批量处理设置", + "batch size" : "批量大小", + "Batch size" : "单批数量", + "Batch Size" : "单批数量", + "Batch-Warp" : "批量修复", + "bauhaus" : "bauhaus (包豪斯)", + "behind" : "落后", + "Below here, you can generate a set of random prompts, and send them to the Workflow prompt field. The generation of the prompt uses the settings in the Main tab." : "在下方可以生成一组随机的提示词,并将它们发送到工作流提示词段。提示词的生成使用主菜单中的选项设置。", + "Benchmark Data" : "基准测试数据", + "Benchmarks..." : "基准测试...", + "beta" : "β", + "Better" : "更好的", + "Bicubic" : "双三次", + "Bilinear" : "双线性", + "Bilingual Localization" : "双语对照本地化", + "Bitwise operation" : "按位 (Bitwise) 运算", + "Blacklist" : "黑名单", + "blend" : "混合", + "Blend" : "混合", + "Blend factor max" : "最大混合系数", + "Blend factor slope" : "混合斜率系数", + "Blend mode" : "混合模式", + "BLIP: maximum description length" : "BLIP: 最大描述长度", + "BLIP: minimum description length" : "BLIP: 最小描述长度", + "BLIP: num_beams" : "BLIP: 集束搜索候选项数目", + "Block ID" : "区块 ID", + "Block size" : "区块大小", + "blur" : "模糊", + "Blur" : "模糊", + "Blur amount:" : "模糊度:", + "Blur edges of final overlay mask, if used. Minimum = 0 (no blur)" : "模糊最终覆盖遮罩的边缘(如果使用)。最小值=0(无模糊)", + "- Body" : "- 身体", + "(booru only)" : "(仅 booru)", + "BOOST (multi-resolution merging)" : "BOOST(分块生成后拼合)", + "border" : "边框", + "Border" : "边缘", + "border frames" : "边界帧数", + "Border Frames" : "边界帧数", + "Border Key Frames" : "边界关键帧数", + "bottom-top" : "下 - 上", + "box_nms_thresh" : "箱体数量阈值", + "Branch" : "分支", + "brightness" : "亮度", + "Brightness:" : "明亮度", + "Bring prompts and setting into one column left side" : "将正反提示词输入框和设置移动到左侧", + "built-in" : "内置", + "built with gradio" : "基于 Gradio 构建", + "Built with Gradio" : "基于 Gradio 构建", + "By comma" : "逗号分组", + "By default and where supported, SVG-Edit can store your editor preferences and SVG content locally on your machine so you do not need to add these back each time you load SVG-Edit. If, for privacy reasons, you do not wish to store this information on your machine, you can change away from the default option below." : "默认情况下,SVG Edit 可以将设置和SVG图像保存在你的电脑上,因此你不需要在每次使用 SVG Edit 时重复设置。如果出于隐私因素,你不希望将信息保存在你的电脑上,你可以更改以下默认选项。", + "By default, the algorithm tends to like dark images too much, if you think the output is too dark or not dark enough, you can adjust this ratio. 1 = ‘Do not darken at all’, 0 = ‘A totally black image is ok’, default = 0.9." : "默认情况下,算法倾向于生成较黑的图像,如果你认为输出的图像太黑或不够黑,你可以调整最小照明比率。1=\"完全不变暗\",0=\"全黑的图像\",默认=0.9", + "By none" : "不分组", + "By tokens" : "词元分组", + "By vectors" : "向量分组", + "By words" : "单词分组", + "Cache LDSR model in memory" : "将 LDSR 模型缓存在内存中", + "Cadence" : "生成间隔", + "calculate dimension of LoRAs(It may take a few minutes if there are many LoRAs)" : "计算 LoRA 维度 (取决于模型数量,可能需要数分钟)", + "Calculate hash" : "计算哈希值", + "- Camera" : "- 镜头", + "Camera Far" : "镜头最远渲染距离", + "Camera Focal Length" : "镜头焦距", + "Camera Near" : "镜头最近渲染距离", + "Camera Parameters" : "镜头参数", + "Can be empty,indicating no translation" : "可以为空,表示无需翻译", + "Cancel" : "取消", + "Cancel generate forever" : "停止无限生成", + "Cancel training." : "取消训练", + "canny" : "canny (硬边缘检测)", + "Canny" : "Canny (硬边缘)", + "Canvas Height" : "画布高度", + "Canvas Hotkeys" : "画布热键", + "- Canvas Size" : "- 画布尺寸", + "Canvas Width" : "画布宽度", + "Card height for Extra Networks" : "扩展模型卡牌高度", + "Card height for Extra Networks (px)" : "扩展模型卡牌高度 (px)", + "Card width for Extra Networks" : "扩展模型卡牌宽度", + "Card width for Extra Networks (px)" : "扩展模型卡牌宽度 (px)", + "cartoon" : "cartoon (卡通)", + "Cartoon" : "卡通", + "cascadePSP" : "CascadePSP", + "case sensitive" : "区分大小写", + "Categorical mask status" : "分类蒙版状态", + "⚠ Caution: You should only use these options if you know what you are doing. ⚠" : "⚠ 警告: 你需要清楚知道自己在做什么才能使用这些选项. ⚠", + "centered" : "居中", + "(CF10) Checkpoint format" : "(CF10) 模型格式", + "(CF1) Checkpoint format" : "(CF1) 模型格式", + "(CF2) Checkpoint format" : "(CF2) 模型格式", + "(CF3) Checkpoint format" : "(CF3) 模型格式", + "(CF4) Checkpoint format" : "(CF4) 模型格式", + "(CF5) Checkpoint format" : "(CF5) 模型格式", + "(CF6) Checkpoint format" : "(CF6) 模型格式", + "(CF7) Checkpoint format" : "(CF7) 模型格式", + "(CF8) Checkpoint format" : "(CF8) 模型格式", + "(CF9) Checkpoint format" : "(CF9) 模型格式", + "CFG scale" : "提示词引导系数 (CFG Scale)", + "CFG Scale" : "提示词引导系数 (CFG Scale)", + "Change brightness" : "调节亮度", + "Change checkpoint" : "更改模型", + "Change contrast" : "调节对比度", + "Change CTRL keybindings to SHIFT" : "将 CTRL 绑定更改为 SHIFT", + "Change gain" : "调节增强强度", + "Change gamma" : "调节伽马", + "Change saturation" : "调节饱和度", + "(changes seeds drastically; use CPU to produce the same picture across different videocard vendors)" : "(显著改变种子效果; 使用 CPU 选项可使不同型号显卡产生相同图像)", + "(changes seeds drastically; use CPU to produce the same picture across different vidocard vendors)" : "(大幅改变种子效果, 使用 CPU 选项使不同型号显卡产生相同图像)", + "Change your brush width to make it thinner if you want to draw something." : "绘制内容前请先调整笔刷粗细。", + "Chant filename (Chants are longer prompt presets)" : "Chant 文件名(Chant 指较长的提示词预设)", + "character" : "character (角色)", + "Cheap neural network approximation. Very fast compared to VAE, but produces pictures with 4 times smaller horizontal/vertical resolution and lower quality." : "廉价的神经网络近似值。与VAE相比速度非常快,但生成的图片水平/垂直分辨率是VAE的四分之一,质量较低", + "Checkbox" : "勾选框", + "Check Console log for Downloading Status" : "检查控制台日志以查看下载信息", + "Check for updates" : "检查更新", + "Check models' new version" : "检查模型版本更新", + "Check models’ new version" : "检索模型的新版本", + "Check New Version from Civitai" : "从 Civitai 上检查版本更新", + "checkpoint" : "模型", + "Checkpoint" : "模型", + "Checkpoint A" : "大模型 A", + "Checkpoint B" : "大模型 B", + "Checkpoint Dropdown" : "大模型下拉列表", + "Checkpoint format" : "模型格式", + "Checkpoint Format" : "模型格式", + "Checkpoint Merger" : "模型融合", + "Checkpoint name" : "模型名", + "Checkpoints" : "模型", + "Checkpoint schedule" : "模型表", + "Checkpoints to cache in RAM" : "保留在内存中的 Stable Diffusion 模型数量", + "Check progress" : "查看进度", + "Check system info for validity" : "检测系统信息的有效性", + "Check tensors" : "检测 tensors", + "check this box to enable guided images mode" : "选中该项启用引导图像模式", + "* check your CLI for outputs" : "检查 CLI 的输出", + "Chess" : "分块", + "children's illustration" : "children's illustration (儿童画作)", + "Choose latent sampling method" : "选择潜变量采样方法", + "Choose mode:" : "选择模式:", + "Choose preprocessor for semantic segmentation:" : "选择语义分割的预处理器:", + "(choose Unet model: Automatic = use one with same filename as checkpoint; None = use Unet from checkpoint)" : "(选择 Unet 模型: 自动 = 使用与大模型文件名相同的文件; 无 = 使用大模型中的 Unet)", + "Choose your favorite mask:" : "请选择你喜欢的蒙版:", + "circle" : "圆形", + "cityscape" : "cityscape (城市景观)", + "Civitai Helper" : "Civitai 助手", + "Civitai URL" : "Civitai 链接", + "Civitai URL or Model ID" : "Civitai 地址或模型 ID", + "ckpt" : "ckpt", + "Class" : "组件类别", + "Classifier Free Guidance Scale - how strongly the image should conform to prompt - lower values produce more creative results" : "无分类器指导信息影响尺度(Classifier Free Guidance Scale) - 图像应在多大程度上服从提示词 - 较低的值会产生更有创意的结果", + "clean" : "clean (绿色、清洁)", + "Cleanup non-default temporary directory when starting webui" : "启动 WebUI 时清理非默认临时目录", + "Clear" : "清除", + "Clear ALL filters" : "清除所有过滤器", + "Clear prompt" : "清空提示词内容", + "Clear selection" : "清空选择", + "Clear tag filters" : "标签清除过滤器", + "Clear values" : "清空数值", + "Click Enhance." : "点击“增强”按钮", + "Click here after the generation to show the video" : "生成完成后点这里显示视频", + "click here to gather relevant info" : "点击此处以收集相关信息", + "Click to Upload" : "点击上传", + "Clip and renormalize" : "衰减与规格化", + "CLIP: maximum number of lines in text file" : "CLIP: 文本文件的最大行数", + "CLiP model" : "CLiP 模型", + "clipseg" : "CLIP分割", + "clipseg options" : "CLIPSeg 选项", + "Clip skip" : "CLIP 终止层数", + "Clip Skip" : "CLIP 终止层数", + "CLIP Skip" : "CLIP 终止层数", + "CLIP: skip inquire categories" : "CLIP: 跳过查询类别", + "CLIP skip schedule" : "CLIP 终止层数计划表", + "CLIP tensors checker" : "Clip tensors 检测", + "clip_threshold" : "裁剪阈值", + "Close" : "关闭", + "Closed" : "关闭", + "Close Preview" : "关闭预览", + "Closer is brighter" : "越近越亮", + "Close the video" : "关闭视频", + "cloudscape" : "cloudscape (云景)", + "cluster num" : "簇数", + "Codec" : "编码器", + "CodeFormer vis." : "CodeFormer 可见程度", + "CodeFormer visibility" : "CodeFormer 可见程度", + "CodeFormer weight" : "CodeFormer 权重", + "CodeFormer Weight" : "CodeFormer 权重", + "CodeFormer weight (0 = maximum effect, 1 = minimum effect)" : "CodeFormer 权重 (为 0 时效果最大,为 1 时效果最小)", + "CodeFormer weight parameter; 0 = maximum effect; 1 = minimum effect" : "CodeFormer 权重参数;为 0 时效果最大;为 1 时效果最小", + "Coherence" : "一致性", + "collage" : "collage (拼贴)", + "color_burn" : "颜色加深", + "color_coherence" : "颜色校正", + "Color coherence" : "颜色一致性", + "Color correction factor" : "颜色校正系数", + "color_dodge" : "颜色减淡", + "Color force Grayscale" : "强制颜色空间为灰度", + "colorful" : "colorful (多彩)", + "[color-matcher]" : "颜色匹配器", + "Color Matcher Ref Image" : "颜色匹配器参考图", + "Color Matcher Ref Image Type" : "颜色匹配器参考图类型", + "Color reduce algo" : "色彩减弱算法", + "Color sketch inpainting" : "彩色涂鸦重绘", + "Color Transfer Method" : "颜色迁移算法", + "Color variation" : "色彩变种", + "Combinations" : "组合", + "Combine axis" : "拼合方向", + "Combined" : "兼有", + "Combine into one image" : "拼合为一张图像", + "comics" : "comics (美漫)", + "comma" : "逗号", + "Comma separated face number(s)" : "逗号分隔的面部编号", + "Comma-separated list of tab names; tabs listed here will appear in the extra networks UI first and in order lsited." : "以逗号分割的选项卡名称列表;这里列出的选项卡将首先按顺序出现在扩展模型面板中", + "Comma-separated list of tags (\"artist, style, character, 2d, 3d...\")" : "以逗号分割的标签列表 (如 \"artist,style,character,2d,3d...\")", + "Commit" : "提交", + "Comp alpha schedule" : "混合透明度参数表", + "Compatibility" : "兼容性", + "Comp mask type" : "比较蒙版类型", + "Component" : "模型组件", + "Composable Mask scheduling" : "可组合的蒙版计划表", + "Composite audio files extracted from the original video onto the concatenated video." : "将原始视频中的音频整合到生成的视频中。", + "Composite video with previous frame init image in" : "前一帧初始图像的合成视频在", + "Comp save extra frames" : "保存合成过程所有额外帧", + "Compute Settings" : "计算设置", + "Concatenate each frame while crossfading." : "在交叉融合运算时串联每一帧。", + "concept" : "concept (概念)", + "concept art" : "concept art (概念艺术)", + "concept - Can be a concept, such as “a X of Y”, or an historical event such as “The Trojan War”." : "concept - 概念 - 可以是一种概念:例如一个事物的某种特质;或者是一个历史事件,例如 “特洛伊战争“ 。", + "Config Backup: Config" : "配置备份:配置", + "Config file for Adapter models" : "Adapter 模型配置文件路径", + "Config file for Control Net models" : "ControlNet 模型配置文件路径", + "Config Name" : "配置名", + "Config Presets" : "预设配置", + "Config-Presets" : "预设配置", + "configuration" : "插件设置", + "configuration for" : "详细设置", + "Connecting" : "连接中", + "Connection errored out." : "连接出错", + "Consider a donation on ko-fi! :3" : "考虑在 ko-fi 上为本插件赞助! :3", + "Console logging" : "控制台日志记录", + "Containing directory" : "目标模型目录", + "contrast" : "对比度", + "Contrast schedule" : "对比度参数表", + "Control Mode" : "控制模式", + "Control Mode (Guess Mode)" : "控制类型 (猜测模式)", + "ControlNet guidance end" : "ControlNet 引导结束时机", + "ControlNet guidance end 2nd" : "ControlNet 引导结束时机", + "ControlNet guidance end 3rd" : "ControlNet 引导结束时机", + "ControlNet guidance end 4th" : "ControlNet 引导结束时机", + "ControlNet guidance end 5th" : "ControlNet 引导结束时机", + "ControlNet guidance start" : "ControlNet 引导介入时机", + "ControlNet guidance start 2nd" : "ControlNet 引导介入时机", + "ControlNet guidance start 3rd" : "ControlNet 引导介入时机", + "ControlNet guidance start 4th" : "ControlNet 引导介入时机", + "ControlNet guidance start 5th" : "ControlNet 引导介入时机", + "ControlNet Inpaint Index" : "ControlNet 重绘 Unit 序号", + "ControlNet inpaint model index" : "ControlNet 的 inpaint 模型启用单元页", + "ControlNet inpaint not masked" : "ControlNet 重绘不使用蒙版", + "ControlNet Inpaint Number" : "ControlNet 重绘序号", + "Controlnet input directory" : "ControlNet 输入目录", + "ControlNet input directory" : "ControlNet 的输入目录", + "ControlNet Input Video Path" : "ControlNet 输入视频路径", + "ControlNet is more important" : "更偏向 ControlNet", + "ControlNet Mask Video Path" : "ControlNet 视频蒙版路径", + "ControlNet model" : "ControlNet 模型", + "ControlNet model 2nd" : "ControlNet 模型", + "ControlNet model 3rd" : "ControlNet 模型", + "ControlNet model 4th" : "ControlNet 模型", + "ControlNet model 5th" : "ControlNet 模型", + "ControlNet number" : "ControlNet 序号", + "ControlNet option" : "ControlNet 选项", + "ControlNet Segmentation Index" : "ControlNet 语义分割 Unit 序号", + "Controlnet tile model name" : "Controlnet tile 模型名", + "ControlNet Video Input" : "ControlNet 视频输入", + "ControlNet Video Mask Input" : "ControlNet 视频蒙版输入", + "ControlNet weight" : "ControlNet 权重", + "Control Net Weight" : "ControlNet 权重", + "ControlNet weight 2nd" : "ControlNet 权重", + "ControlNet weight 4th" : "ControlNet 权重", + "ControlNet weight 5th" : "ControlNet 权重", + "Control Net Weight For Face" : "ControlNet 脸部权重", + "Controls the strength of the diffusion on the init image. 0 = disabled" : "控制初始化图像生成器的强度。 0 = 禁用", + "Control Type" : "控制类型", + "Control Weight" : "控制权重", + "convert" : "转换", + "Convert a 360 spherical panorama to a 3D mesh" : "将单张 360° 球形全景图转换为 3D 网格", + "Convert a single 2D image to a 3D mesh" : "将单张 3D 图像转换为 3D 网格", + "Convert currently loaded checkpoint into ONNX. The conversion will fail catastrophically if TensorRT was used at any point prior to conversion, so you might have to restart webui before doing the conversion." : "将当前加载的 checkpoint 转换为 ONNX 模型。如果在转换前的任意时间加载了 TensorRT, 转换会失败。推荐在转换前重启 webui", + "Converted checkpoints will be saved in your" : "转换出的模型将会保存在你的", + "Convert ONNX to TensorRT" : "将 ONNX 模型转换为 TensorRT 模型", + "Convert to ONNX" : "转换为 ONNX 模型", + "Convert Unet to ONNX" : "转换 Unet 为 ONNX 模型", + "copy" : "复制", + "Copy" : "复制", + "Copy config from" : "复制配置文件", + "Copy image to:" : "复制当前图像到: ", + "Copy Metadata" : "开始复制元数据", + "Copy metadata to other models in directory" : "将元数据复制到文件夹中的其他模型", + "\uD83D\uDCCB Copy to clipboard" : "\uD83D\uDCCB 复制到剪切板", + "Copy to ControlNet Inpainting" : "复制到 ControlNet 重绘", + "Copy to ControlNet Segmentation" : "复制到 ControlNet 语义分割", + "Copy to favorites" : "复制到收藏夹", + "Copy to Inpaint Upload & ControlNet Inpainting" : "复制到局部重绘和 ControlNet 重绘", + "Copy to txt2img ControlNet Inpainting" : "复制到文生图 ControlNet 重绘中", + "cosine" : "余弦", + "cosine_with_restarts" : "周期重启余弦", + "Cover image" : "封面图像", + "Cozy Image Browser" : "Cozy 图库浏览器", + "Cozy Nest Image Browser" : "Cozy Nest 图库浏览器", + "Create" : "创建", + "Create animation" : "创建动画", + "Create a text file next to every image with generation parameters." : "同时为每个图片创建一个文本文件储存生成参数", + "Create blank canvas" : "创建空白画布", + "Created at:" : "创建时间:", + "Create debug image" : "创建调试(debug)图像", + "Create embedding" : "创建嵌入式模型", + "Create flipped copies" : "创建水平翻转副本", + "Create From Hub" : "从 Huggingface Hub 中创建", + "Create hypernetwork" : "创建超网络 (Hypernetwork)", + "Create New Canvas" : "创建新画布", + "Creates animation sequence from denoised intermediate steps with video frame interpolation to achieve desired animation duration" : "利用视频插值从降噪过程的中间步骤图像中生成动画", + "Create txt2img canvas" : "创建文生图画布", + "CRF" : "固定码率因子 (CRF)", + "Crop and resize" : "裁剪后缩放", + "Crop and Resize" : "裁剪后缩放", + "Crop Images" : "剪裁图像", + "crop_n_layers" : "分层层数", + "crop_nms_thresh" : "分层数量阈值", + "crop_n_points_downscale_factor" : "分层采样点坍缩因子", + "crop_overlap_ratio" : "分层重叠度", + "Cropping" : "剪裁", + "Crop to fit" : "裁剪以适应宽高比", + "Crop: top, left, bottom, right" : "裁切:顶部,左侧,顶部,右侧", + "Cross-attention" : "Cross-Attention 优化方案", + "Cross attention optimization" : "Cross-Attention 优化方案", + "Crossfade blend rate" : "交叉融合强度", + "Ctrl+up/down precision when editing (attention:1.1)" : "使用 Ctrl + ↑/↓ 设置\"(tag:1.1)\"时的精度", + "Ctrl+up/down precision when editing " : "使用 Ctrl + ↑/↓ 设置\"\"时的精度", + "Ctrl+up/down word delimiters" : "可以使用 Ctrl + ↑/↓ 设置关注度的\"提示词分隔符类型\"", + "cubism" : "cubism (立体主义)", + "Current" : "Current (当前帧)", + "Current Cache" : "当前缓存目录", + "currently selected model" : "当前选择的模型", + "Current Model" : "当前模型", + "Current version" : "当前版本", + "Custom Config File" : "自定义配置文件", + "Custom Name (Optional)" : "自定义名称 (可选)", + "Custom settings file" : "自定义设置文件", + "Custom size" : "自定义尺寸", + "custum name" : "自定义名称", + "Cutoff strongly." : "强效分隔", + "Cut white margin from input" : "从输入中剪切空白区域", + "Daam script" : "Daam 脚本", + "dark" : "dark (暗黑)", + "darken" : "变暗", + "Dataset directory" : "数据集目录", + "Dataset Directory" : "数据集目录", + "Dataset folder structure" : "数据集文件夹结构", + "Dataset Images" : "数据集图片", + "Dataset Load Settings" : "数据集加载设置", + "date" : "日期", + "Date" : "日期", + "debug" : "调试", + "Debug info" : "调试信息", + "Debug level" : "调试等级", + "Debug log" : "调试日志", + "Decode CFG scale" : "解码提示词引导系数(CFG scale)", + "Decoder Tile Size" : "解码器分块大小", + "Decode steps" : "解码迭代步数", + "deepbooru: escape (\\) brackets" : "deepbooru: 转义 (\\) 括号", + "deepbooru: filter out those tags" : "deepbooru: 过滤以下标签", + "deepbooru: score threshold" : "deepbooru: 评分阈值", + "deepbooru: sort tags alphabetically" : "deepbooru: 按字母顺序排序标签", + "deepbooru: use spaces in tags" : "deepbooru: 在标签间使用空格", + "Default Image CFG" : "默认图像引导系数 (CFG)", + "Defaults" : "默认设置", + "Default scoring type" : "默认评分类型", + "Default upscaler for image resize operations" : "默认图像缩放算法", + "default variables: in \\{\\}, like \\{init_mask\\}, \\{video_mask\\}, \\{everywhere\\}" : "默认变量:\\{\\},比如 \\{init_mask\\}, \\{video_mask\\}, \\{everywhere\\}", + "Default view for Extra Networks" : "默认扩展模型视图", + "❌ Del" : "❌ 删除", + "delete" : "删除", + "❌Delete" : "❌删除", + "Delete" : "删除", + "Delete 0-entries from exif cache" : "从 EXIF 缓存删除 0-entries", + "DELETE cannot be undone. The files will be deleted completely." : "删除操作无法撤销,文件会被完全删除。", + "DELETE File(s)" : "删除文件", + "Delete Imgs" : "删除图像", + "Delete intermediate" : "删除临时文件", + "Delete intermediate frames after GIF generation" : "生成 GIF 后删除临时帧图片", + "delete next" : "删除后 N 张", + "delete or keep raw affected (interpolated/ upscaled depending on the UI section) png imgs" : "删除或保留受影响的原始 (根据 UI 设置进行插值/放大) PNG 图像", + "Delete Selected Skeleton (D key)" : "删除选中骨架 (D 键)", + "Denoise" : "降噪", + "Denoise strength" : "重绘幅度", + "Denoising" : "重绘幅度", + "Denoising Diffusion Implicit Models - best at inpainting" : "Denoising Diffusion Implicit models - (DDIM) - 最擅长局部重绘", + "Denoising strength" : "重绘幅度", + "Denoising strength curve" : "重绘幅度曲线", + "Denoising strength for face images" : "脸部重绘幅度", + "Denoising strength for the entire image" : "全图重绘幅度", + "Denoising strength (Inpaint)" : "局部重绘幅度", + "Depth" : "Depth (深度)", + "depth_leres" : "depth_leres (LeReS 深度图估算)", + "depth_leres++" : "depth_leres++ (LeReS 深度图估算++)", + "Depth Map" : "深度图", + "Depth Maps" : "深度图", + "depth_midas" : "depth_midas (MiDaS 深度图估算)", + "Depth (Midas/Adabins)" : "深度模式 (Midas / Adabins)", + "Depth Output" : "深度图输出", + "Depth Prediction" : "深度估计预处理", + "Depth Prediction demo" : "深度估计预处理 Demo", + "depth_zoe" : "depth_zoe (ZoE 深度图估算)", + "Descending" : "降序", + "Description" : "描述", + "description-based:" : "基于描述:", + "Destination directory" : "目标目录", + "Destination Directory" : "目标文件夹", + "detailed" : "detailed (细节)", + "Detailed" : "详细设置", + "Detailed Save As" : "详细保存为", + "Details" : "详细设置", + "Detect from image" : "从图像中提取", + "Detect from Image" : "从图像中提取", + "Detection" : "检测", + "Detection model confidence threshold" : "检测模型置信阈值", + "Detection model confidence threshold %" : "检测模型置信阈值 (单位: %)", + "Detection model confidence threshold % 2nd" : "检测模型置信阈值 (单位: %)", + "Detection model confidence threshold 2nd" : "检测模型置信阈值", + "Detection model confidence threshold % 3rd" : "检测模型置信阈值 (单位: %)", + "Detection model confidence threshold 3rd" : "检测模型置信阈值", + "Detection model confidence threshold % 4th" : "检测模型置信阈值 (单位: %)", + "Detection model confidence threshold 4th" : "检测模型置信阈值", + "Detection model confidence threshold % 5th" : "检测模型置信阈值 (单位: %)", + "Detection model confidence threshold 5th" : "检测模型置信阈值", + "Determines how little respect the algorithm should have for image's content. At 0, nothing will change, and at 1 you'll get an unrelated image. With values below 1.0, processing will take less steps than the Sampling Steps slider specifies." : "决定算法对图像内容的影响程度。设置 0 时,什么都不会改变,而在 1 时,你将获得不相关的图像。\n值低于 1.0 时,处理的迭代步数将少于“采样迭代步数”滑块指定的步数", + "deterministic" : "可复现的", + "difference" : "差值", + "Difference" : "差分", + "Diffuse the first frame based on an image, similar to img2img." : "基于图像生成第一帧,类似于图生图", + "digital" : "digital (数字)", + "digital art" : "digital art (数字艺术)", + "Dilation factor (B)" : "扩张因子 (B)", + "Dimension lower bound" : "最小维度", + "Dimension upper bound" : "最大维度", + "Directly Draw Scribbles" : "直接绘制线稿", + "directory." : "目录。", + "Directory for detected maps auto saving" : "检测图 (detected maps) 保存路径", + "Directory for saving images using the Save button" : "“保存”按钮输出文件夹", + "Directory for saving init images when using img2img" : "图生图初始图像的保存文件夹", + "Directory for temporary images; leave empty for default" : "临时图像目录;默认为空", + "(directory is hidden if its name starts with \".\")" : "(如果目录的名称以 \".\" 开头, 就会被隐藏)", + "(directory is hidden if its name starts with \".\".)" : "(如果目录的名称以 \".\" 开头, 就会被隐藏)", + "Directory name pattern" : "目录名称格式", + "Disable" : "禁用", + "Disable all extensions" : "停用所有扩展", + "Disable at the last loopback time" : "最后一次回送时禁用", + "Disable built-in Lora handler" : "停用内置 Lora 处理器", + "Disable control type selection" : "禁用控制类型筛选", + "disable convert 'AND' to 'BREAK'" : "不再将 \"AND \"转换为 \"BREAK\"", + "disabled" : "禁用", + "Disabled" : "已禁用", + "Disable during hires pass" : "在高清修复过程中停用", + "Disable for Negative prompt." : "为反向提示词禁用本插件效果", + "Disable image browser (Reload UI required)" : "禁用 Cozy 图库浏览器 (需重启UI)", + "Disable image browser (requires reload UI)" : "禁用 Cozy 图库浏览器 (需要重启)", + "Disable openpose edit" : "禁用 openpose 姿态编辑", + "Disable prompt token counters" : "禁用提示词词元长度计数器", + "Disable waves and gradiant background" : "禁用波纹和背景渐变效果", + "Disable waves and gradiant background animations" : "禁用波纹和背景渐变动画", + "Discard" : "丢弃", + "Discard: remove style text from prompt, keep styles dropdown as it is." : "丢弃: 从提示词中删除对应预设样式文本, 并保持预设样式下拉菜单不变", + "Discard weights with matching name" : "删除匹配键名的表达式的权重", + "discord server" : " Discord 服务器", + "display both english and target language" : "同时显示英语和目标语言", + "Display information dialog on Cozy Nest error" : "显示 Cozy Nest 的信息对话框", + "Display mode:" : "显示模式:", + "Display name for this model" : "此模型的显示名", + "Disregard checkpoint information from pasted infotext" : "忽略粘贴的生成信息文本中的 Stable Diffusion 模型信息", + "Divergence (3D effect)" : "发散性(3D 效果)", + "Divisions" : "分区方式", + "Dolly" : "希区柯克(推轨变焦)", + "Do not add watermark to images" : "不在图像上添加水印", + "Do not append detectmap to output" : "不输出检测图 (detected maps) (如深度估算图、动作检测图等)", + "Do not do anything special" : "什么都不做", + "Do not fix prompt schedule for second order samplers." : "不为二阶采样方法修复提示词作用时间", + "Do not make DPM++ SDE deterministic across different batch sizes." : "保留 DPM++ SDE 采样器 在不同的批次大小之间的结果差异", + "Do not resize images" : "不调整图像大小", + "Do not save grids consisting of one picture" : "当仅有一张图时不保存网格图", + "Do not save heatmap images" : "不保存热力图图像", + "Do not show any images in results for web" : "不在浏览器输出结果中显示任何图像", + "Do not store my preferences or SVG content locally" : "不在本地保存设置和SVG图像", + "Don't cache latents" : "不要缓存潜空间图片", + "Don't Cache Latents" : "不要缓存潜空间图片", + "Don't generate images" : "不生成图像", + "Don't generate, only upscale" : "不生成,仅放大", + "Don't outfill" : "不进行填充", + "Don't Override" : "不覆盖", + "Don’t use wierd blocky upscale mode. Or maybe do?" : "不要用 \"糟糕的分块放大模式\" ,或者也许可以试试?", + "double-straight-line" : "双直线", + "down" : "下", + "Download" : "下载", + "Download All files" : "下载所有文件", + "\uD83D\uDCBE Download image" : "\uD83D\uDCBE 下载图片", + "Download localization template" : "导出 localization 模板", + "Download Max Size Preview" : "下载最大尺寸预览图", + "Download missing models upon reading generation parameters from prompt" : "从生成参数中的提示词读取并下载缺失的模型", + "Download missing preview images on startup" : "启动时下载缺失的模型预览图", + "Download Model" : "下载模型", + "Download NSFW (adult) preview images" : "允许下载含成人内容的预览图", + "Download system info" : "下载系统信息", + "Download the pose as .json file" : "以 .json 格式保存姿态图", + "Downscaling" : "缩小", + "Drag Me" : "拖动页面", + "Drawing" : "绘画", + "Drawing Canvas" : "创建画布", + "Draw legend" : "包含图例注释", + "Draw Legends" : "包含图例注释", + "Draw mask" : "绘制蒙版", + "dropdown" : "下拉列表", + "Dropdown" : "下拉列表", + "Drop File Here" : "拖拽文件到此", + "Drop Image Here" : "拖动图像至此", + "Drop out tags when creating prompts." : "创建提示词时丢弃标签(tags)", + "Drop tabs here to hide them" : "把选项卡拖到此处隐藏它们", + "Drop Video Here" : "拖动视频至此", + "Dry Run" : "试运行", + "Due to ControlNet base extension's inner works it needs its models to be located at 'extensions/deforum-for-automatic1111-webui/models'. So copy, symlink or move them there until a more elegant solution is found. And, as of now, it requires use_init checked for the first run. The ControlNet extension version used in the dev process is a24089a62e70a7fae44b7bf35b51fd584dd55e25, if even with all the other options above used it still breaks, upgrade/downgrade your CN version to this one." : "因为 ControlNet 基层插件在内工作,所以需要将 ControlNet 模型置于 “extensions/deforum-for-automatic1111-webui/models”文件夹内。在更优雅的解决方法出现之前,请复制,软链接 symlink 或者移动模型。 \n同时目前为止,该插件需要在第一次运行时检查 use_init。\n用于开发进程的 ControlNet 插件版本为 a24089a62e70a7fae44b7bf35b51fd584dd55e25。如果全部按照上文使用还是损坏,请将 ControlNet 版本升级/降级到上述版本。", + "Due to the limitation of Segment Anything, when there are point prompts, at most 1 box prompt will be allowed; when there are multiple box prompts, no point prompts are allowed." : "由于Segment Anything的限制,当有标记点时,最多允许1个箱体标记;当有多个箱体提示时,不允许使用标记点。", + "duplicate" : "重复的", + "Duplicate Skeleton (X-axis)" : "复制骨架(X 轴)", + "Duplicate Skeleton (Z-axis)" : "复制骨架(Z 轴)", + "Duration" : "时长", + "during the run sequence, only frames specified by this value will be extracted, saved, and diffused upon. A value of 1 indicates that every frame is to be accounted for. Values of 2 will use every other frame for the sequence. Higher values will skip that number of frames respectively." : "在运行序列期间,只有由该值指定的帧才会被提取、保存和生成。1表示要考虑每个帧。2表示每隔一帧用于序列。较高的值将分别跳过该帧数。", + "Dynamic Prompts" : "Dynamic Prompts (动态提示词)", + "Dynamic Prompts enabled" : "启用动态提示词", + "Each image is center-cropped with an automatically chosen width and height." : "每张图片都会以自动选择好的宽和高进行中心裁剪", + "Early stopping parameter for CLIP model; 1 is stop at last layer as usual, 2 is stop at penultimate layer, etc." : "CLIP 模型的提前终止层参数;1是像往常一样停在最后一层,2是停在倒数第二层,以此类推", + "EBSynth Mode" : "EBSynth 模式", + "EBSynth Settings" : "Ebsynth 设置", + "edit" : "编辑", + "Edit" : "编辑", + "Edit common tags." : "编辑常见标签", + "editing" : "后期编辑", + "Editing Enabled" : "开启元数据编辑", + "Edit Openpose" : "编辑 Openpose", + "Edit SVG" : "编辑 SVG", + "Effect" : "效果", + "Effective Block Analyzer" : "高效区块分析器", + "EMA (nagetive)" : "EMA (负)", + "ema-only" : "仅保留 EMA 权重", + "EMA (positive)" : "EMA (正)", + "Embedding" : "嵌入式模型 (Embedding)", + "Embedding Learning rate" : "嵌入式模型学习率", + "Emphasis: use (text) to make model pay more attention to text and [text] to make it pay less attention" : "强调符:使用 (文字) 使模型更关注该文本,使用 [文字] 减少其关注度", + "empty cannot be saved" : "留空时无法保存", + "empty strings cannot be translated" : "无法翻译空的文本", + "Enable" : "启用", + "Enable AA for Downscaling." : "缩小时使用抗锯齿", + "Enable AA for Upscaling." : "放大时使用抗锯齿", + "Enable ADetailer" : "启用 After Detailer", + "Enable Anti Burn (and everything)" : "启用 Anti Burn", + "Enable Autocomplete" : "启用标签自动补全", + "Enable Autopruning" : "启用自动修剪", + "Enable batch mode" : "启用批处理模式", + "Enable Bilingual Localization" : "启用双语对照翻译插件", + "Enable CFG-Based guidance" : "启用基于 CFG 的引导 (CFG-Based guidance)", + "Enable checkpoint scheduling" : "启用模型计划表", + "Enable clear gallery button in txt2img and img2img tabs" : "在文生图和图生图标签页中启用清除图片输出栏按钮", + "Enable CLIP skip scheduling" : "启用 CLIP 终止层数计划表", + "Enable color correction" : "启用颜色校正", + "Enable Control" : "启用控制", + "Enable controlnet tile resample" : "启用 ControlNet 的 tile resample (分块 - 重采样)", + "enabled" : "启用", + "Enabled" : "启用", + "Enable Dynamic Thresholding (CFG Scale Fix)" : "启用动态阈值 (CFG Scale 修复)", + "Enable emphasis" : "启用强调符", + "Enable extra network tweaks" : "启用扩展网络修改", + "Enable Face Prompt" : "启用脸部提示词", + "Enable full page image viewer" : "启用网页全屏图像查看器", + "Enable GroundingDINO" : "启用 GroundingDINO", + "Enable guided images mode" : "启用引导图像模式", + "Enable Hires. fix+" : "启用高分修复PLUS", + "Enable JavaScript aspect ratio controls" : "启用前端纵横比控制", + "Enable Jinja2 templates" : "启用 Jinja2 模板", + "Enable Maintenance tab" : "启用 \"维护\" 选项卡", + "Enable model compile (experimental)" : "启用模型编译优化(实验性)", + "Enable MultiDiffusion" : "启用 MultiDiffusion", + "Enable noise multiplier scheduling" : "启用噪声乘法 (noise multiplier) 调度", + "Enable optimized monocular depth estimation" : "启用单色深度估算优化 (optimized monocular depth estimation)", + "Enable overwrite" : "允许覆盖", + "Enable perspective flip" : "启用透视翻转", + "Enable pixelization" : "启用像素化", + "Enable Pixel Perfect from lllyasviel. Configure your target width and height on txt2img/img2img default panel before preview if you wish to enable pixel perfect." : "启用 lllyasviel 的完美像素模式。在预览前,请在文生图/图生图界面配置好图像的目标宽度和高度。", + "Enable postprocessing operations in txt2img and img2img tabs" : "在文生图/图生图选项卡中启用后处理操作", + "Enable quantization in K samplers for sharper and cleaner results" : "对 K 采样器启用量化以获得更清晰、干净的结果", + "Enable quantization in K samplers for sharper and cleaner results. This may change existing seeds. Requires restart to apply." : "对 K 采样器启用量化以获得更清晰、干净的结果。这可能会改变现有的随机种子。需重启才能应用。", + "Enable Randomize extension" : "启用随机化扩展", + "Enable Region 1" : "启用区域 1", + "Enable Region 2" : "启用区域 2", + "Enable Region 3" : "启用区域 3", + "Enable Region 4" : "启用区域 4", + "Enable Region 5" : "启用区域 5", + "Enable Region 6" : "启用区域 6", + "Enable Region 7" : "启用区域 7", + "Enable Region 8" : "启用区域 8", + "Enable sampler scheduling" : "启用采样器计划表", + "Enable steps scheduling" : "启用迭代步数计划表", + "Enable Subseed scheduling" : "启用第二种子计划表", + "Enable Tag Autocompletion" : "启用标签自动补全", + "Enable tensorboard logging" : "启用 Tensorboard 日志记录", + "Enable tensorboard logging." : "启用 Tensorboard 日志记录", + "Enable this to save VRAM." : "启用此项以节省显存 (VRAM)。", + "Enable thumbnail tooltips" : "启用缩略图工具提示", + "Enable Tiled Diffusion" : "启用 Tiled Diffusion", + "Enable Tiled VAE" : "启用 Tiled VAE", + "Enable tooltip on the canvas" : "启用画布上的工具列提示框", + "Enable uploading manually created mask to SAM." : "启用手动上传蒙版到 SAM。", + "Enable upscale with extras" : "启用后期处理放大", + "Enable Vectorizing" : "启用矢量化", + "Enable webcam" : "开启网络摄像头", + "Encoder Color Fix" : "编码器颜色修复", + "Encoder Tile Size" : "编码器分块大小", + "end at this step" : "结束控制步数", + "End blur width" : "结束模糊宽度", + "Ending Control Step" : "引导终止时机", + "End Page" : "尾页", + "end the animation at this frame number" : "达成此帧数后停止生成", + "Engine" : "引擎", + "Enhance" : "增强", + "Enhanced img2img" : "Enhanced img2img (图生图增强)", + "(ENSD; does not improve anything, just produces different results for ancestral samplers - only useful for reproducing images)" : "(ENSD: 对图像质量无任何提升, 只为 ancestral 采样方法产生不同的结果 - 仅对复现图像有用)", + "Enter categody ids, separated by +. For example, if you want bed+person, your input should be 7+12 for ade20k and 59+0 for coco." : "在此输入类别 ID,用 + 分隔。例如,如果你想分割出 床 + 人,使用ade20k协议应该输入 7 + 12,使用coco协议应该输入 59 + 0。", + "Enter category IDs" : "输入类别ID", + "Enter hypernetwork Dropout structure (or empty). Recommended : 0~0.35 incrementing sequence: 0, 0.05, 0.15" : "输入 Hypernetwork Dropout 结构(或留空)\n推荐:0~0.35\n递增排序:0、0.05、0.15", + "Enter hypernetwork layer structure" : "超网络层结构", + "Enter input path" : "填写输入目录", + "Enter output path" : "填写输出目录", + "Enter relative to webui folder or Full-Absolute path, and make sure it ends with something like this: '20230124234916_%09d.png', just replace 20230124234916 with your batch ID. The %05d is important, don't forget it!" : "输入绝对路径或者以 webui 为根目录的相对路径,同时确认路径结尾类似“20230124234916_%09d.png”。只需要将 20230124234916 替换为你的 batch ID。“%05d”很重要,别忘了!", + "Equirectangular projection" : "等距柱状投影图", + "Erase BG" : "移除背景图", + "Error" : "错误", + "Error threshold" : "错误阈值 (%)", + "Escape brackets" : "将结果中的括号进行转义处理", + "Escape parentheses on insertion" : "插入时转义括号", + "Eta for ancestral samplers" : "ancestral 采样方法的 Eta 系数", + "Eta for DDIM" : "DDIM 采样方法的 Eta 系数", + "Eta noise seed delta" : "Eta 噪声种子偏移量 (ENSD)", + "etc" : "其他", + "Euler Ancestral - very creative, each can get a completely different picture depending on step count, setting steps higher than 30-40 does not help" : "Euler Ancestral - 非常有创意,取决于迭代步数不同而生成完全不同的图像,这意味着将迭代步数设置为高于 30-40 不会有任何帮助", + "ex A." : "例 A:", + "Example: Default args should use 221 as total keyframes." : "示例:默认参数应使用 221 作为总关键帧数。", + "Example flow:" : "工作流示例: ", + "Examples" : "例子", + "Example: seed_schedule could use 0:(5), 1:(-1), 219:(-1), 220:(5)" : "示例:种子数表可以使用 0:(5), 1:(-1), 219:(-1), 220:(5)", + "ex B." : "例 B:", + "ex C." : "例 C:", + "Exclude tags (split by comma)" : "排除标签 (逗号分隔)", + "Exclude Target (e.g., finger, book)" : "排除目标(如 finger, book)", + "exclusion" : "排除", + "Excudes (split by comma)" : "排除 (逗号分隔)", + "exif keyword" : "EXIF 关键词", + "EXIF keyword search" : "EXIF 关键词搜索", + "Existing Caption txt Action" : "对已有标注的 txt 文件的操作", + "Expanded Mask" : "扩展后蒙版", + "Expand Mask" : "展开蒙版设置", + "(Experimental, keep cond caches across jobs, reduce overhead.)" : "(实验性功能;在不同任务中保留缓存以减少开销)", + "Export" : "导出", + "Exported Text" : "输出文本", + "Export type" : "输出类型", + "expressionism" : "expressionism (表现主义)", + "Extension" : "扩展", + "Extension index URL" : "扩展列表地址", + "Extensions" : "扩展", + "Extension State" : "扩展状态", + "extension to be installed." : "插件", + "Extension version" : "扩展版本", + "extra" : "额外", + "Extra" : "▼", + "Extra args" : "额外参数", + "Extra arguments" : "额外参数", + "Extra arguments for trtexec command in plain text form" : "以纯文本形式填写用于 trtexec 命令的额外参数", + "Extract frames from the original video." : "从原始视频中提取帧。", + "Extract from frame" : "提取开始帧", + "Extract nth frame" : "提取间隔帧数", + "Extract to frame" : "提取结束帧", + "Extract U-Net features" : "提取 U-Net 特征值", + "Extra filename (for small sets of custom tags)" : "额外文件名(用于小部分的自定义Tag)", + "Extra generation params" : "附加生成参数", + "Extra network card height" : "扩展模型卡牌高度", + "Extra network card width" : "扩展模型卡牌宽度", + "Extra Networks" : "扩展模型", + "Extra networks separator" : "扩展模型分隔文本", + "Extra networks tab order" : "扩展模型类型选项卡顺序", + "Extra paths to scan for LoRA models, comma-separated. Paths containing commas must be enclosed in double quotes. In the path, \" (one quote) must be replaced by \"\" (two quotes)." : "扫描低秩微调模型 (LoRA) 的附加目录,以逗号分隔。包含逗号的路径必须用双引号括起来。 在路径中,\"(一个引号)必须替换为\"\"(两个引号)。", + "Extra path to scan for ControlNet models (e.g. training output directory)" : "检索 ControlNet 模型的附加目录(如训练输出目录)", + "extras" : "后期处理", + "Extras" : "后期处理", + "(extra text to add before <...> when adding extra network to prompt)" : "(添加扩展模型到提示词时, 在 <...> 之前添加的额外文本)", + "Extra text to add before <...> when adding extra network to prompt" : "在向提示词中添加扩展模型标签时在 <…> 之前添加额外文本", + "Face Area Magnification" : "脸部区域扩展", + "Face Crop option" : "脸部修复选项", + "Face Crop Resolution" : "脸部修复分辨率", + "Face Denoising Strength" : "脸部去噪强度", + "Face detection confidence" : "脸部识别强度", + "Face Detection Method" : "人脸识别算法", + "Face Editor" : "Face Editor (脸部修复)", + "Face margin" : "脸部区域大小", + "Face restoration" : "面部修复", + "Face restoration model" : "面部修复模型", + "Face Restore Model" : "面部修复模型", + "Fall-off exponent (lower=higher detail)" : "衰减指数(越小 = 细节越多)", + "fantasy" : "fantasy (魔幻)", + "Far clip" : "远端衰减", + "fashion" : "fashion (时尚)", + "fast" : "快速模式", + "Fast Decoder" : "使用快速解码器", + "Fast Encoder" : "使用快速编码器", + "Fast Encoder Color Fix" : "快速编码器颜色修复", + "Fast Encoder may change colors; Can fix it with more RAM and lower speed." : "快速编码器可能会导致颜色偏差;通过使用更大的内存和更慢的速度可以避免这个情况", + "fauvism" : "fauvism (野兽派)", + "favorites" : "收藏夹", + "Favorites" : "收藏夹", + "Favorites path from settings: log/images" : "从设置中获取收藏夹路径: log/images", + "Fetch output folder from a1111 settings (Reload needed to enable)" : "从 webui 设置中获取输出文件夹 (需重载以启用)", + "FFmpeg CRF value" : "FFmpeg CRF 值", + "FFmpeg path/ location" : "FFmpeg 路径", + "FFmpeg settings" : "FFmpeg 设置", + "figurativism" : "figurativism (具象主义)", + "File" : "文件", + "File format for grids" : "网格图文件格式", + "File format for images" : "图片文件后缀(格式)", + "filename" : "文件名", + "Filename" : "文件名", + "File Name" : "文件名", + "Filename join string" : "文件名连接用字符串", + "Filename keyword search" : "文件名关键词搜索", + "filename(option)" : "文件名 (可选)", + "Filename word regex" : "文件名用词的正则表达式", + "Filepath:" : "文件路径:", + "File size limit for the above option, MB" : "上述选项的文件大小限制 (单位: MB)", + "Files to process" : "要处理的文件", + "File type" : "文件类型", + "fill" : "填充", + "fill down" : "向下扩展", + "fill it with colors of the image" : "用图像颜色 (高强度模糊) 填充", + "fill it with latent space noise" : "用潜空间噪声填充", + "fill it with latent space zeroes" : "用空白潜空间填充", + "fill left" : "向左扩展", + "fill right" : "向右扩展", + "fill up" : "向上扩展", + "Filter models by path name" : "按路径名筛选模型", + "Filter NSFW content" : "过滤成人内容 (NSFW)", + "Filter out following properties (comma seperated). Example film grain, purple, cat" : "过滤以下提示词包含的属性 (逗号分隔). 例如: film grain, purple, cat", + "Filter values" : "过滤值", + "Final denoising strength" : "最终重绘幅度", + "find but bo translated:" : "已找到但无翻译:", + "Find your cozy spot on Auto1111's webui" : "探寻 Auto1111 webui 最舒适的使用方式", + "First" : "First (第一生成帧)", + "First frame as init image" : "第一帧作为初始化图像", + "first frame of img2img result" : "图生图结果的第一帧", + "FirstGen" : "FirstGen (处理后生成的第一帧)", + "First Page" : "首页", + "Firstpass height" : "首次生成高度", + "Firstpass width" : "首次生成宽度", + "Fit video length" : "适配视频长度", + "Fix broken CLIP position IDs" : "修复损坏的 Clip position ID", + "fixed" : "固定", + "Fixed seed" : "固定种子", + "Focal point entropy weight" : "焦点熵权重", + "Focal point face weight" : "焦点面部权重", + "Font color" : "字体颜色", + "Font for image grids that have text" : "网格图文字字体", + "Font size" : "字体大小", + "for ade20k and" : "来获得 ade20k 类别, 查看", + "For advanced keyframing with Math functions, see" : "对于想使用数学函数执行高级关键帧控制的用户,请参阅", + "For advanced users, you can create a permanent file in \\OneButtonPrompt\\userfiles\\ called antilist.csv" : "对于专业用户,可以在 \\OneButtonPrompt\\userfiles\\ 中创建一个永久文件,命名为 antilist.csv", + "Force convert half to float on interpolation (for some platforms)" : "在插值时强制将半精度浮点数转换为全精度 (适用于部分平台)", + "Force Reset" : "强制重置", + "for coco to get category->id map. Note that coco jumps some numbers, so the actual ID is line_number - 21." : "来获得 coco 的类别 -> id 映射。需注意: coco 会跳过部分数字,所以实际 ID 应该是 “划定数字 - 21 (line_number - 21)”", + "for depth map." : "获取深度图更多信息", + "for detailed explanation." : "以了解详细信息。", + "Foreground Transparency" : "前景透明度", + "for explanation of each parameter. If you still cannot understand, use default." : "以了解每个参数的含义。如果仍不理解,请保持默认。", + "FOR HELP CLICK HERE" : "点击此处获取帮助", + "For hires fix, use width/height sliders to set final resolution rather than first pass (disables Upscale by, Resize width/height to)." : "在高分辨率修复中,通过长宽滑块设定最终分辨率 (关闭放大倍率和自适应分辨率设置)", + "For image processing do exactly the amount of steps as specified" : "在进行图片处理时,准确执行滑块所指定的迭代步数", + "For inpainting, include masked composite in results for web" : "使用重绘时,在网页结果中包含复合蒙版", + "For inpainting, include the greyscale mask in results for web" : "使用重绘时,在网页结果中包含灰度蒙版图", + "For inpainting, save a copy of the greyscale mask" : "使用重绘时,保存一份灰度蒙版副本", + "For inpainting, save a masked composite" : "使用重绘时,保存一份复合蒙版", + "Format" : "格式", + "format: http://127.0.0.1:port" : "格式: http://127.0.0.1:端口号", + "For negative prompts, please write your positive prompt, then --neg ugly, text, assymetric, or any other negative tokens of your choice. OR:" : "对于反向提示词,请写出你的正向提示词,然后添加 --neg ugly,text,assymetric 等您选择的任何其他反向提示词。或者:", + "For SD upscale, how much overlap in pixels should there be between tiles. Tiles overlap so that when they are merged back into one picture, there is no clearly visible seam." : "使用 SD 放大 (SD upscale) 时,分块(Tiles)间的像素重叠宽度\n分块(Tiles)间重叠有助于使它们合并最终图像时避免过于明显的接缝", + "for your animation (leave blank to ignore)." : "用于你的动画中(留空表示忽略)", + "Found a bug or want to ask for a feature ? Please" : "发现了一个错误或想请求添加一个功能?请", + "Found a bug or want to ask for a feature ? Please use" : "发现了一个错误或想请求添加一个功能?请使用", + "Found a bug or want to ask for a feature ? Please use " : "发现了 Bug 或者有个新的想法?请访问 ", + "Found tags" : "匹配的标签", + "fp16" : "fp16", + "fp32" : "fp32", + "fps" : "帧率", + "FPS" : "帧率", + "Frame Height" : "帧高度", + "Frame Interpolation" : "帧插值", + "Frame Interpolation to smooth out, slow-mo (or both) any video." : " 进行帧插值来让任何视频获得顺滑的切换效果,慢动作 (或两者皆可)", + "Frame Interpolation will *not* run if any of the following are enabled: 'Store frames in ram' / 'Skip video for run all'." : "帧差值将不会在以下任一选项启用时启动:“保存帧图像到内存” / “跳过视频”", + "Framerate" : "帧率", + "frames per keyframe" : "每几帧提取1个关键帧", + "Frames to Video" : "帧图片转视频", + "Frame Width" : "帧宽度", + "Free GPU" : "释放显存", + "Frequency" : "频率", + "From (full path)" : "从 (输入完整路径)", + "Full" : "完整", + "Full res mask" : "全分辨率蒙版", + "Full res mask padding" : "全分辨率蒙版的填充尺寸", + "(Full = slow but pretty; Approx NN and TAESD = fast but low quality; Approx cheap = super fast but terrible otherwise)" : "(完整 = 慢但显示效果好; Approx NN 和 TAESD = 快速但低质量; Approx cheap = 超级快但最糟糕)", + "Gallery height in _absolute_ percent of your screen (not remaining height)" : "图像输出栏高度占屏幕的百分比 (非剩余高度)", + "Gamepad repeat period, in milliseconds" : "游戏手柄回报率 (单位: 毫秒)", + "gamma" : "伽马值", + "Gamma" : "伽马值", + "Gap fill technique" : "间隙填充技术", + "Gather" : "生成", + "Gen" : "生成", + "Generate" : "生成", + "Generate 3D inpainted mesh. (Sloooow, required for generating videos)" : "生成优化3D网格 (超慢,用于生成视频)", + "Generate 4 demo videos with 3D inpainted mesh." : "使用 3D 优化网格生成4个演示视频", + "Generate a checkpoint at the current training level." : "保存一个位于当前训练进度的模型文件。", + "Generate a checkpoint at the current training lvel." : "保存一个位于当前训练进度的模型文件。", + "Generate a .ckpt file when saving during training." : "训练中保存时生成一个 ckpt 文件。", + "Generate a mask image." : "生成一个蒙版图像。", + "Generate Batch" : "批量处理", + "Generate Ckpt" : "创建模型", + "Generate .ebs file.(ebsynth project file)" : "生成 .ebs 文件。(Ebsynth 工程文件)", + "Generate forever" : "无限生成", + "Generate human masks" : "生成人工蒙版", + "Generate Info" : "生成信息", + "Generate inputframes" : "生成输入帧", + "Generate layout for batch process" : "生成批量处理的图像分布", + "Generate layout for single image" : "生成单张图像的图像分布", + "Generate me some prompts!" : "生成一些提示词", + "Generate Movie Mode" : "视频生成模式", + "Generate Preview" : "生成预览", + "Generate preview images every N steps." : "每 N 步生成一次预览图像", + "Generate simple 3D mesh. (Fast, accurate only with ZoeDepth models and no boost, no custom maps)" : "生成简单3D网格 (快速, 仅适用于 ZoeDepth 模型, 无 Boost, 无 Maps)", + "Generate stereoscopic image(s)" : "生成立体图像", + "Generate video" : "生成视频", + "Generate Video" : "生成视频", + "Generate video from inpainted(!) mesh." : "从深度图生成视频。", + "Generation Info" : "生成信息", + "Generation mode" : "生成模式", + "Generation settings:" : "生成设置:", + "Generation TEST!!(Ignore Project directory and use the image and mask specified in the main UI)" : "生成测试!!(忽略工程目录,使用用户界面中指定的图像和蒙版)", + "Get Civitai Model Info by Model Page URL" : "从 Civitai 模型页面链接拉取模型信息", + "*Get depth from uploaded video*" : "*从上传的视频中获取深度*", + "Get javascript logs" : "获取 javascript 日志", + "Get List" : "获取列表", + "Get Model Info from Civitai" : "从 Civitai 上获取模型信息", + "Get Model Info from Civitai by URL" : "从 Civitai 链接获取模型信息", + "Get sub directories" : "打开子目录文件夹", + "GFPGAN vis." : "GFPGAN 可见程度", + "GFPGAN visibility" : "GFPGAN 可见程度", + "github" : "GitHub", + "Glow" : "辉光", + "Glow mode" : "辉光模式", + "Gold Pendant" : "装饰艺术", + "gore" : "gore (血腥)", + "Gothic" : "哥特", + "grad" : "梯度", + "Gradient accumulation steps" : "梯度累加步数", + "Gradient Clipping" : "梯度 Clip 修剪", + "Gradient clip value" : "梯度 Clip 值", + "Gradio theme" : "Gradio 主题", + "Gradio theme (requires restart)" : "Gradio 主题样式 (需重启)", + "graffiti" : "graffiti (涂鸦)", + "graphic design" : "graphic design (平面设计)", + "Great" : "很好的", + "greg mode" : "greg mode (Greg Mike: 美国艺术家)", + "Grid layout" : "网格图布局", + "Grid margins (px)" : "网格图边框 (单位: 像素)", + "Grid row count; use -1 for autodetect and 0 for it to be same as batch size" : "网格图行数; 使用 -1 进行自动检测,使用 0 使其与单批数量相同", + "GroundingDINO batch progress status" : "GroundingDINO 批量处理状态", + "GroundingDINO Box Threshold" : "GroundingDINO 箱体阈值", + "GroundingDINO Detection Prompt" : "GroundingDINO 检测提示词", + "GroundingDINO Model (Auto download from huggingface)" : "GroundingDINO 模型 (自动从 huggingface 下载)", + "GroundingDINO + Segment Anything can achieve [text prompt]->[object detection]->[segmentation]" : "GroundingDINO + Segment Anything 可以实现 [文本提示词]->[对象检测]->[语义分割]", + "Group/split table by: (when not started with single quote - so only for prompts, not for merge)" : "提示词分组方式(非单引号开头时):", + "Guess Mode" : "无提示词引导模式", + "Guidance End (T)" : "引导终止时机", + "Guidance Start (T)" : "引导介入时机", + "Guided Images" : "引导图像", + "Guided images schedules" : "引导图像参数表", + "haku_output" : "Haku 输出", + "Half Model" : "半精度模型", + "Hands" : "手掌", + "Hand Size" : "手掌尺寸", + "hard_light" : "强光", + "has metadata" : "有元数据", + "has user metadata" : "内嵌用户元数据", + "Head Size" : "头部尺寸", + "height" : "高度", + "Height" : "高度", + "Height Resolution" : "高度分辨率", + "Help" : "帮助", + "Help for Jinja2 templates" : "Jinja2 模板帮助", + "[here]" : "[这里]", + "here" : "这里", + "Hidden UI tabs" : "选择需要隐藏的 UI 标签栏", + "Hidden UI tabs (requires restart)" : "需要隐藏的 UI 选项卡 (需要重启)", + "Hide annotator result" : "隐藏预处理预览结果", + "Hide caption" : "隐藏文本标注", + "Hide extensions with tags" : "隐藏含有以下标签的扩展", + "Hide heatmap images" : "隐藏热力图图像", + "Hide samplers in user interface" : "隐藏用户界面中的采样方法", + "Hide samplers in user interface (requires restart)" : "在用户界面中隐藏采样器 (需重启)", + "high contrast" : "high contrast (高对比度)", + "Higher levels increases complexity and randomness of generated prompt" : "随机等级越高, 生成的提示词越复杂和随机", + "Highres. fix" : "高分辨率修复", + "Hires CFG" : "高分修复提示词引导系数", + "hires. fix" : "高分辨率修复", + "hiresfix" : "高清修复", + "Hires. fix" : "高分辨率修复 (Hires. fix)", + "Hires. fix+" : "高分修复PLUS", + "Hires fix: show hires prompt and negative prompt" : "高分辨率修复: 显示高分辨率修复的正反提示词输入框", + "Hires fix: show hires sampler selection" : "高分辨率修复: 显示高分采样方法选择栏", + "Hires. fix+ to do steps optimization" : "高分修复 PLUS 来优化迭代步数的话", + "Hires Negative prompt" : "高分修复反向提示词", + "Hires Prompt" : "高分修复正向提示词", + "Hires sampling method" : "高分采样方法", + "Hires Sampling method" : "高分辨率修复采样方法", + "Hires steps" : "高分迭代步数", + "hires upscaler" : "高分辨率修复放大算法", + "Historical" : "Historical (当前帧前的倒数第二帧)", + "History" : "历史记录", + "Horizontal" : "水平", + "Horizontal Mirroring" : "水平镜像", + "horizontal split num" : "水平分割数", + "Horizontal+Vertical Mirroring" : "水平+垂直镜像", + "horror" : "horror (恐怖)", + "how closely the image should conform to the prompt. Lower values produce more creative results. (recommended range 5-15)" : "图像应符合提示词的程度。较低的值会产生更具创造性的结果。(建议范围5-15)", + "how close to get to the colors of the input frame image/ the amount each frame during a tweening step to use the new images colors" : "如何接近输入帧图像的颜色 / 在中间计算步骤中使用新图像颜色的每帧数量", + "How many batches of images to create" : "创建多少批量次数的图像", + "How many results to load at once" : "一次性加载Tag数", + "How many times to improve the generated image iteratively; higher values take longer; very low values can produce bad results" : "迭代改进生成的图像的次数;较高的值需要更长的时间;非常低的值会产生不好的结果。", + "How many times to process an image. Each output is used as the input of the next loop. If set to 1, behavior will be as if this script were not used." : "单个图像的处理次数\n每次输出结果都被用作下一个处理的输入\n设置为 1 等同于不启用这个脚本", + "how much the image should look like the previou one and new image frame init. strength schedule might be better if this is higher, around .75 during the keyfames you want to switch on" : "前一个图像和新的图像帧的初始化强度规划有多大的关系。在你想启用的关键帧中,如果这个数字高一点,大约0.75,可能会更好。", + "How much to blur the mask before processing, in pixels." : "处理前对蒙版进行模糊的强度 (单位: 像素)", + "How often, in seconds, to flush the pending tensorboard events and summaries to disk." : "刷新间隔,单位为秒;将待处理的 Tensorboard 事件和摘要刷新到硬盘", + "How strong of a variation to produce. At 0, there will be no effect. At 1, you will get the complete picture with variation seed (except for ancestral samplers, where you will just get something)." : "变化强度。设为 0 时,将没有效果\n设为 1 时,你将获得完全产自差异随机种子的图像 (此功能对带有 a 后缀的采样器无效)", + "hue" : "色度", + "HuggingFace Token" : "HuggingFace 访问令牌", + "humanoid" : "humanoid (人形)", + "humanoid - A random humanoid, males, females, fantasy types, fictional and non-fictional characters. Can add clothing, features and a bunch of other things." : "humanoid - 人形 - 一个随机的人形生物,男性、女性、幻想类型,虚构或非虚构的生物。可以添加服装,特征和其它东西。", + "Humans Masking" : "人工蒙版", + "Hybrid composite" : "混合合成模式", + "Hybrid motion" : "混合模式", + "Hybrid Schedules" : "混合参数表", + "Hybrid Settings" : "合成设置", + "Hybrid Video" : "视频合成", + "Hybrid Video Compositing in 2D/3D Mode" : "2D/3D 模式下的混合视频合成", + "Hypernetwork" : "超网络 (Hypernetwork)", + "Hypernetwork Learning rate" : "超网络学习率", + "Hypernetworks" : "超网络 (Hypernetworks)", + "Idea and inspiration by xKean." : "这个创意受 xKean 启发。", + "Idea by redditor jonesaid." : "这个创意来自于 redditor: jonesaid 。", + "If an image is specified below, it will be used with highest priority." : "如果在下面指定的一张图像,它将以最高优先级使用。", + "If an image is too large, crop it from the center." : "如果图像太大,则从中心裁剪掉边缘", + "If Deforum crashes due to CN updates, go" : "如果 Deforum 由于 ControlNet 版本更新而崩溃,请前往", + "If enabled, only images will be saved" : "启用时, 仅保存图片", + "if enabled, raw imgs will be deleted after a successful video/ videos (upsacling, interpolation, gif) creation" : "如启用, 则在成功创建视频/其它项目 (放大,插值,gif) 后删除原始图像", + "If loading of the Yolov5_anime model fails, check" : "如果 Yolov5_anime 模型加载失败,请查看", + "If multiple .ebs files are generated, run them all." : "如果生成了多个 .ebs 文件,则需要全部运行。", + "(if not: sort by score)" : "(如不启用: 按评分排序标签)", + "(if not: use underscores)" : "(如不启用: 使用下划线)", + "If out-* directory already exists in the Project directory, delete it manually before executing." : "如果out-*目录已经存在于工程目录中,请在执行前手动删除它。", + "If \"Save a copy of image before doing face restoration.\" is enabled, save every image during rolling generation" : "如果 \"在进行面部修复前保存图像副本 \" 选项启用,则梯度放大倍数生成时保存每张图像", + "If setting2prompt width, which width-ratio between both columns (0: minimize setting, 1: 50/50, 6: minimize output gallery column)" : "设置文生图, 图生图双栏宽度比 (0: 最小化左侧栏宽度, 1: 双侧栏各占50%宽度, 6: 最小化右侧图像输出栏)", + "If setting2prompt width, which width-ratio between both columns (0: minimize setting, 1: 50/50, 6: minimize output gallery column)" : "设置文生图, 图生图双栏宽度比 (0: 最小化左侧栏宽度, 1: 双侧栏各占50%宽度, 6: 最小化右侧图像输出栏)", + "If Smart-Step is enabled, the number of iterations for Hires. fix will never be less than this:" : "如果启用优化迭代步数,高分辨率修复的迭代步数将永远不会少于本选项设置的数值:", + "(if the file size is above the limit, or either width or height are above the limit)" : "(如果图像文件大小超过限制, 或者其宽度或高度超过限制)", + "If the number of tokens is more than the number of vectors, some may be skipped.\nLeave the textbox empty to start with zeroed out vectors" : "如果 Tokens 数量多于向量数量,一些 Tokens 可能会被跳过\n把输入文本框留空,就可以从清零的向量开始", + "If the saved image file size is above the limit, or its either width or height are above the limit, save a downscaled copy as JPG" : "当图像文件大小或尺寸超过限制,另存一份缩小的副本为 JPG 格式", + "If this values is non-zero, it will be added to seed and used to initialize RNG for noises when using samplers with Eta. You can use this to produce even more variation of images, or you can use this to match images of other software if you know what you are doing." : "如果此值非零,它将被添加到种子中,并在使用Eta的采样器时用于初始化随机噪声。\n你可以用它来产生更多的图像变化,或者用它来模仿其他软件生成的图像,如果你确切知道本选项的功能和你在做什么的话。", + "If you have already created a background video in Invert Mask Mode([Ebsynth Utility]->[configuration]->[etc]->[Mask Mode])," : "如果你已经在反相蒙版模式下创建了一个背景视频([Ebsynth Utility]->[插件配置]->[其他]->[蒙版模式]),", + "If you have trouble entering the video path manually, you can also use drag and drop.For large videos, please enter the path manually." : "如果你手动输入视频路径嫌麻烦,也可以使用拖放。但是对于大型视频,还是烦请手动输入路径。", + "If you liked this extension, please" : "如果你喜欢本插件,请", + "If you still cannot understand, use default." : "如果你仍然无法理解,请保持默认值。", + "If you want to use the same tagging results the next time you run img2img, rename the file to prompts.txt" : "如果想在下次运行图生图时使用同样的标记结果,请将该文件重命名为 prompts.txt", + "If you want to use Width/Height which are not multiples of 64, please change noise_type to 'Uniform', in Keyframes --> Noise." : "如果你的宽 / 高参数不是 64 的倍数, 请设置 噪声_类型 选项为 'Uniform‘ , 该选项在关键帧 --> 噪声选项卡内", + "ignore" : "无视", + "Ignore" : "忽略", + "Ignore emphasis" : "忽略强调符号", + "Ignore: keep prompt and styles dropdown as it is." : "忽略: 保持提示词和预设样式下拉菜单不变", + "Ignore selected VAE for stable diffusion checkpoints that have their own .vae.pt next to them" : "对于拥有同名 .vae.pt 的模型,忽略外挂 VAE 设置", + "Ignores step count - uses a number of steps determined by the CFG and resolution" : "忽略迭代步数 - 使用由 CFG 和分辨率确定的步数", + "I know what I am doing." : "高级选项", + "Illustration" : "插画", + "image" : "图像", + "Image" : "图像", + "Image browser" : "图库浏览器", + "Image Browser" : "图库浏览器", + "Image Browser Settings" : "Cozy 图库浏览器设置", + "Image CFG Scale" : "图像引导系数 (CFG)", + "Image Count" : "图片数量", + "Image creation progress preview mode" : "图像生成过程预览模式", + "Image Directory" : "图像目录", + "Image File" : "图像文件", + "Image for Auto Segmentation" : "用于语义分割的图像", + "Image for Image Layout" : "用于图像分布的图像", + "Image for img2img" : "图生图的图像", + "Image for inpainting with mask" : "用于使用蒙版进行局部重绘的图像", + "Image for Recognition" : "识别图像的分辨率", + "Image for Segment Anything" : "用于分离的图像", + "Image height" : "图像高度", + "Image Init" : "图像初始化", + "Image Layout" : "图像分布", + "Image layout status" : "图像分布状态", + "Image Parameters" : "图像参数", + "Image path" : "图像路径", + "Image preview height" : "预览图高度", + "Images directory" : "图像目录", + "Images filename pattern" : "图片文件名格式", + "Images path" : "图像路径", + "Images to use for keyframe guidance" : "用于关键帧引导的图像", + "Image strength schedule" : "图像强度参数表", + "Image to 3D" : "图转 3D", + "Image to 3D mesh" : "图像转 3D 网格", + "Image to be masked" : "需要叠加蒙版的图像", + "Image width" : "图像宽度", + "I'm feeling lucky" : "手气不错", + "img2img" : "图生图", + "img2img alternative test" : "图生图的替代性测试", + "img2img CFG" : "图生图的提示词引导系数", + "img2img DDIM discretize" : "图生图 DDIM 离散化", + "img2img denoise strength" : "图生图的重绘幅度", + "img2img-grids" : "图生图 (网格)", + "img2img: height of image editor" : "图生图: 图像编辑器高度", + "img2img history" : "图生图历史记录", + "img2img keyframes." : "将关键帧进行图生图。", + "img2img model to use" : "图生图使用的模型", + "img2img padding" : "图生图的重叠像素宽度", + "Img2Img Repeat Count (Loop Back)" : "图生图重复次数(回送)", + "img2img sampler" : "图生图的采样方法", + "img2img Sampling steps" : "图生图的采样迭代步数", + "img2img scale" : "图生图的放大倍数", + "Img2Img Settings:" : "图生图设置:", + "IMG2IMG upscale" : "图生图放大", + "img2img upscaler" : "图生图的放大算法", + "Import" : "导入", + "Import a model from Huggingface.co instead of using a local checkpoint." : "从 Huggingface.co 导入模型而非使用本地的模型文件。", + "Important notes:" : "重要信息:", + "Important Notes:" : "重要事项:", + "Important notes and Help" : "重要信息与帮助", + "*Important* notes on Prompts" : "对于提示词模式的重要笔记", + "Import Model from Huggingface Hub" : "从 Huggingface Hub 载入模型", + "Import settings from file" : "从文件导入设置", + "impressionism" : "impressionism (印象派)", + "(improves performance when prompt and negative prompt have different lengths; changes seeds)" : "(当正向提示词与反向提示词长度不同时可以提升性能; 影响随机性)", + "IN00" : "输入层 00", + "IN01" : "输入层 01", + "IN02" : "输入层 02", + "IN03" : "输入层 03", + "IN04" : "输入层 04", + "IN05" : "输入层 05", + "IN06" : "输入层 06", + "IN07" : "输入层 07", + "IN08" : "输入层 08", + "IN09" : "输入层 09", + "IN10" : "输入层 10", + "IN11" : "输入层 11", + "IN_A_00" : "模型 A 输入层 00", + "IN_A_01" : "模型 A 输入层 01", + "IN_A_02" : "模型 A 输入层 02", + "IN_A_03" : "模型 A 输入层 03", + "IN_A_04" : "模型 A 输入层 04", + "IN_A_05" : "模型 A 输入层 05", + "IN_A_06" : "模型 A 输入层 06", + "IN_A_07" : "模型 A 输入层 07", + "IN_A_08" : "模型 A 输入层 08", + "IN_A_09" : "模型 A 输入层 09", + "IN_A_10" : "模型 A 输入层 10", + "IN_A_11" : "模型 A 输入层 11", + "IN_B_00" : "模型 B 输入层 00", + "IN_B_01" : "模型 B 输入层 01", + "IN_B_02" : "模型 B 输入层 02", + "IN_B_03" : "模型 B 输入层 03", + "IN_B_04" : "模型 B 输入层 04", + "IN_B_05" : "模型 B 输入层 05", + "IN_B_06" : "模型 B 输入层 06", + "IN_B_07" : "模型 B 输入层 07", + "IN_B_08" : "模型 B 输入层 08", + "IN_B_09" : "模型 B 输入层 09", + "IN_B_11" : "模型 B 输入层 11", + "Include confident of tags matches in results" : "在结果中包含标签的匹配置信度", + "Include images in sub directories" : "显示子目录中的图片", + "Include ranks of model tags matches in results." : "反推结果包含模型标签匹配等级", + "Include resource hashes in image metadata (for resource auto-detection on Civitai)" : "在图像元数据中嵌入资源哈希值 (用于在 Civitai 上自动检测资源)", + "Include Sub Grids" : "包含次级网格图", + "Include Sub Images" : "包含次级图像", + "Increment seed after each controlnet batch iteration" : "在每次 ControlNet 完成批量迭代后增加种子", + "Index" : "索引", + "info" : "info", + "Info" : "信息", + "Info and links" : "资讯和链接", + "Info & Help" : "信息与帮助", + "Info, Links and Help" : "基本信息与帮助链接", + "Information, comment and share @" : "信息,评论和分享:", + "Infotext" : "文本信息", + "In FPS" : "输入帧率", + "In Frame Count" : "输入帧数", + "In \"Interpolate existing pics\" mode, FPS is determined *only* by output FPS slider. Audio will be added if requested even with slow-mo \"enabled\", as it does *nothing* in this mode." : "在‘插入已有图像’模式中,帧率仅由帧率设置滑块决定。音频将会加入,即使在慢动作模式启用情况下,且在此模式下什么都不会做。", + "Init" : "初始化", + "Initial denoising strength" : "初始去噪强度", + "Initialization text" : "初始化文本", + "Init image" : "初始化图像", + "Init Video" : "初始视频", + "In Keyframes tab, you can also set" : "在关键帧选项卡, 可以设置", + "in <>, like , " : "<>,比如 , ", + "(in megapixels)" : "(单位: 百万像素)", + "(in milliseconds)" : "(单位: 毫秒)", + "inpaint" : "局部重绘", + "Inpaint" : "局部重绘", + "Inpaint area" : "重绘区域", + "Inpaint Area(Override img2img Inpaint area)" : "重绘区域(覆盖图生图的重绘区域)", + "Inpaint at full resolution 2nd" : "全分辨率局部重绘", + "Inpaint at full resolution 3rd" : "全分辨率局部重绘", + "Inpaint at full resolution 4th" : "全分辨率局部重绘", + "Inpaint at full resolution 5th" : "全分辨率局部重绘", + "Inpaint at full resolution padding, pixels 2nd" : "预留像素", + "Inpaint at full resolution padding, pixels 3rd" : "预留像素", + "Inpaint at full resolution padding, pixels 4th" : "预留像素", + "Inpaint at full resolution padding, pixels 5th" : "预留像素", + "Inpaint batch mask directory (required for inpaint batch processing only)" : "批量重绘蒙版目录 (仅限批量重绘使用)", + "Inpaint denoising strength" : "局部重绘幅度", + "Inpaint denoising strength 2nd" : "局部重绘幅度", + "Inpaint denoising strength 3rd" : "局部重绘幅度", + "Inpaint denoising strength 4th" : "局部重绘幅度", + "Inpaint denoising strength 5th" : "局部重绘幅度", + "inpaint_global_harmonious" : "Inpaint_Global_Harmonious (重绘 - 全局融合算法)", + "inpaint height" : "重绘高度", + "inpaint height 2nd" : "重绘高度", + "inpaint height 3rd" : "重绘高度", + "inpaint height 4th" : "重绘高度", + "inpaint height 5th" : "重绘高度", + "inpainting" : "重绘", + "Inpainting" : "重绘", + "Inpainting conditioning mask strength" : "局部重绘时图像调节的蒙版屏蔽强度", + "Inpaint mask blur" : "重绘蒙版边缘模糊度", + "Inpaint mask blur 2nd" : "重绘蒙版边缘模糊度", + "Inpaint mask blur 3rd" : "重绘蒙版边缘模糊度", + "Inpaint mask blur 4th" : "重绘蒙版边缘模糊度", + "Inpaint mask blur 5th" : "重绘蒙版边缘模糊度", + "Inpaint masked" : "重绘蒙版内容", + "Inpaint not masked" : "重绘非蒙版内容", + "inpaint_only" : "inpaint_only (仅局部重绘)", + "inpaint_only+lama" : "inpaint_only+lama (仅局部重绘 + 大型蒙版)", + "Inpaint only masked" : "仅重绘蒙版内容", + "Inpaint only masked 2nd" : "仅重绘蒙版内容", + "Inpaint only masked 3rd" : "仅重绘蒙版内容", + "Inpaint only masked 4th" : "仅重绘蒙版内容", + "Inpaint only masked 5th" : "仅重绘蒙版内容", + "Inpaint only masked padding, pixels" : "仅重绘蒙版区域边缘预留像素", + "Inpaint only masked padding, pixels 2nd" : "仅重绘蒙版区域边缘预留像素", + "Inpaint only masked padding, pixels 3rd" : "仅重绘蒙版区域边缘预留像素", + "Inpaint only masked padding, pixels 4th" : "仅重绘蒙版区域边缘预留像素", + "Inpaint only masked padding, pixels 5th" : "仅重绘蒙版区域边缘预留像素", + "inpaint sketch" : "涂鸦重绘", + "Inpaint sketch" : "涂鸦重绘", + "Inpaint upload" : "上传重绘蒙版", + "inpaint width" : "重绘宽度", + "inpaint width 2nd" : "重绘宽度", + "inpaint width 3rd" : "重绘宽度", + "inpaint width 4th" : "重绘宽度", + "inpaint width 5th" : "重绘宽度", + "(in pixels)" : "(单位: 像素)", + "Input" : "导入", + "Input directory" : "输入目录", + "Input Directory" : "输入目录", + "Input Folder" : "输入文件夹", + "Input Image" : "输入图像", + "Input images directory" : "输入图像目录", + "Input Mesh (.ply | .obj)" : "输入网格文件 (.ply | .obj)", + "Input <= Output" : "输出图像 发送到 输入图像", + "Input path" : "输入目录", + "Input Video" : "输入视频", + "In queue..." : "排队中……", + "In Res" : "输入分辨率", + "(in sampling steps - show new live preview image every N sampling steps; -1 = only show after completion of batch)" : "(每N个采样步骤更新一次实时预览图像; 设置为-1以在每批次完成后显示)", + "Insert after" : "后插", + "Insert before" : "前插", + "Inspect" : "检查", + "install" : "安装", + "Install" : "安装", + "installation" : "installation (装置艺术)", + "installed" : "已安装", + "Installed" : "已安装", + "Install from URL" : "从网址安装", + "Installing..." : "正在安装...", + "Instead it will pick up all files in the \\upscale_me\\ folder and upscale them with below settings." : "相对应的会用 \\upscale_me\\ 文件夹中的文件按照下列设置对它们进行放大。", + "instructs the run to start from a specified point" : "指示运行从指定点开始", + "integrations" : "集成功能", + "interactive splines and Bezier curves" : "交互式样条曲线和贝赛尔曲线", + "Intermediate files path" : "临时文件路径", + "Intermediate results may look better than the end results. /!\\ Intermediate results are cleaned after each run, save them elsewhere if you want to keep them." : "中间的结果可能比最终结果看起来更好。提示: 中间的结果在每次运行后都会被清理,如果你想保留它们,就把它们保存在其它地方", + "internal order" : "内部排序", + "Interpolation" : "插值", + "interpolation method" : "插值模式", + "Interpolation method" : "插值算法", + "Interpolation Method" : "融合算法", + "Interrogate" : "反推提示词", + "Interrogate\nCLIP" : "CLIP\n反推", + "Interrogate\nDeepBooru" : "DeepBooru\n反推", + "Interrogate: keep models in VRAM" : "反推:将模型保留在显存中", + "Interrogate Options" : "反推设置", + "Interrogate Result" : "反推结果", + "Interrogate Selected Image" : "反推所选图片", + "Interrogator" : "反推模型", + "Interrogator Settings" : "反推器设置", + "interrupt" : "中止", + "Interrupt" : "中止", + "In the main tab, set the subject to humanoids" : "在主菜单标签页, 设置主题为 humanoids (人形)", + "In the prefix prompt field then add for example: Art by artistname, 2 people" : "然后在前缀提示词段中添加示例: Art by artistname, 2 people", + "(in tokens - for texts shorter than specified, if they don't fit into 75 token limit, move them to the next 75 token chunk)" : "(Token 中短于指定长度的提示词, 如果它们不符合 75 Tokens 的上限, 则将他们移至下一个 75 Tokens 组中)", + "Invert" : "反相", + "Invert colors" : "反转颜色", + "Invert colors if your image has white background." : "对于白色背景图片请开启颜色反转。", + "Invert DepthMap" : "反转深度图", + "Invert DepthMap (black=near, white=far)" : "反转深度图(黑色=近,白色=远)", + "invert (from white bg & black line)" : "invert (白底黑线反色)", + "Invert Input Color" : "反转输入颜色", + "Invert mask" : "反转蒙版", + "Invert selection" : "反向选择", + "is also a good option, it makes compact math formulae for Deforum keyframes by selecting various waveforms." : " 也是一个很好的选择,它可以通过选择各种波形来为 Deforum 关键帧生成严谨的数学公式.", + "is equivalent to" : "等同于", + "is experimental functions and NO PROOF of effectiveness." : " 为实验性功能,不保证有效性。", + "is set," : "已经设置数值,", + "Iterate seed every line" : "每行输入都换一个随机种子", + "It takes time, just wait. Check console log for detail" : "检查需要一段时间,请耐心等待。检查控制台日志以查看详情。", + "It will then recognize the body type and not generate it. It also recognizes the keyword wearing, and will not generate an outfit." : "然后,它将识别体型来避免生成对应体型。它同样能识别关键词 \"穿着\",避免生成服装。", + "It will translate prompt from your native language into English. So, you can write prompt with your native language." : "这会将您输入的提示词翻译为英文。因此,您可以直接用母语输入提示词。", + "I want to preview GroundingDINO detection result and select the boxes I want." : "我想预览 GroundingDINO 的结果并选择我想要的箱体。", + "Javascript logs" : "Javascript 日志", + "JavaScript selection method" : "前端选择样式", + "Jitter step:" : "抖动步数: ", + "Jitter the seeds of sub-generations when doing a rolling generation (Still deterministic)" : "在进行梯度放大倍数生成时, 对子代生成的随机种子进行抖动 (图像依旧可复现)", + "Join the" : "加入", + "- Joints and Limbs" : "- 关节和四肢", + "json path" : "json 路径", + "JSON Validator" : "JSON 检查器中检查", + "Just resize" : "仅调整大小", + "Just Resize" : "仅调整大小", + "Just resize (latent upscale)" : "调整大小 (潜空间放大)", + "Keep -1 for seeds" : "保持种子随机", + "Keep at 1 for normal behavior.\nSet to different values to compound that many prompts together. My suggestion is to try 2 first." : "设置为 1 保持正常行为。\n设置其他数值来混合更多提示词。我的建议是先尝试设置为 2 。", + "Keep blank if you don't have mask" : "如果没有遮罩, 请保持空白", + "Keep Imgs" : "保留原图", + "Keep models in VRAM" : "将模型保留在显存中", + "Keep occlusion edges" : "保持边缘封闭", + "Keep original size" : "保持原始尺寸", + "Keep temp images" : "保留临时图像", + "Keep the Ratio" : "保持图像比例", + "keep whatever was there originally" : "保留原来的图像,不进行预处理", + "Kernel schedule" : "Kernel 值表", + "Keyframes" : "关键帧", + "Keyframes: animation settings (animation mode, max frames, border)" : "关键帧:动画设置(动画模式,最大帧数,边界)", + "Keyframes: coherence (color coherence & cadence)" : "关键帧:一致性(颜色一致性和间隔)", + "Keyframes: depth warping" : "关键帧:深度扭曲", + "Keyframes: generation settings (noise, strength, contrast, scale)." : "关键帧:通用设置(噪点,强度,对比度,缩放)", + "Keyframes: motion parameters for 2D and 3D (angle, zoom, translation, rotation, perspective flip)." : "关键帧:2D 和 3D 的运动参数(角度,缩放,变换,旋转,透视翻转)", + "Keywords" : "关键词", + "Label" : "标记", + "LAB is a more linear approach to mimic human perception of color space - a good default setting for most users." : "LAB 是一种更为线性的方法,可以模拟人类对色彩空间的感知——这是大多数用户的一个很好的默认设置。", + "ladder" : "阶梯式", + "Lanczos" : "Lanczos", + "landscape" : "landscape (景观)", + "landscape - A landscape or a landscape with a building." : "landscape - 景观 - 一般景观或有建筑的景观。", + "Last message" : "最后输出信息", + "Latent Mirror mode" : "潜空间镜像应用模式", + "Latent Mirror style" : "潜空间镜像方式", + "latent noise" : "潜空间噪声", + "latent nothing" : "空白潜空间", + "Latent tile batch size" : "潜空间分块单批数量", + "Latent tile height" : "潜空间分块高度", + "Latent tile overlap" : "潜空间分块重叠", + "Latent tile width" : "潜空间分块宽度", + "latest" : "最新", + "Layer1" : "图层 1", + "Layer1 mask blur" : "图层 1 蒙版模糊度", + "Layer1 mask strength" : "图层 1 蒙版强度", + "Layer1 opacity" : "图层 1 透明度", + "Layer2" : "图层 2", + "Layer2 mask blur" : "图层 2 蒙版模糊度", + "Layer2 mask strength" : "图层 2 蒙版强度", + "Layer2 opacity" : "图层 2 透明度", + "Layer3" : "图层 3", + "Layer3 mask blur" : "图层 3 蒙版模糊度", + "Layer3 mask strength" : "图层 3 蒙版强度", + "Layer3 opacity" : "图层 3 透明度", + "Layer4" : "图层 4", + "Layer4 mask blur" : "图层 4 蒙版模糊度", + "Layer4 mask strength" : "图层 4 蒙版强度", + "Layer4 opacity" : "图层 4 透明度", + "Layer5" : "图层 5", + "Layer5 mask blur" : "图层 5 蒙版模糊度", + "Layer5 mask strength" : "图层 5 蒙版强度", + "Layer5 opacity" : "图层 5 透明度", + "Layers" : "图层", + "Lazy" : "保守", + "LDSR processing steps. Lower = faster" : "LDSR 处理步数。越少越快", + "Learning rate" : "学习率", + "Learning Rate" : "学习率", + "Learning Rate Scheduler" : "学习率调度器", + "Learning Rate Warmup Steps" : "学习率预热步数", + "Leave blank to save images to the default path." : "留空以将图像保存到默认路径", + "Leave blank to save images to the same path." : "留空以将图像保存到相同路径", + "Leave empty for auto" : "留空时自动生成", + "Leave empty for default main branch" : "留空以使用默认分支", + "Leave empty to use img2img batch controlnet input directory" : "留空以使用图生图批量处理 ControlNet 输入目录", + "Leave empty to use input directory" : "留空以使用普通输入目录", + "Leave empty to use the same name as model and put results into models/Unet-onnx directory" : "留空以使用与 checkpoint 模型相同的名称, 并将转换出的模型放入 models/Unet-onnx 目录", + "Leave empty to use the same name as onnx and put results into models/Unet-trt directory" : "留空以使用与 onnx 模型相同的名称, 并将转换出的模型放入 models/Unet-trt 目录", + "Leave the prompt field empty" : "提示词段留空", + "Leave this alone unless you know what you are doing" : "不明白这个选项的意思的话最好不要动", + "left" : "左", + "Left click the image to add one positive point (black dot). Right click the image to add one negative point (red dot). Left click the point to remove it." : "左键点击图像添加一个黑色的正向标记点(想提取的部分)。右键点击图像添加一个红色的反向标记点(不想提取的部分)。左键再次点击可以删除标记点。", + "left-right" : "左 - 右", + "Legacy hash" : "旧哈希值", + "Leg Length" : "腿部长度", + "Len" : "长度", + "Lerp" : "线性插值", + "Licenses" : "许可协议", + "light" : "light (照明艺术)", + "lighten" : "变亮", + "like here" : "链接", + "Linear" : "线性", + "linear_burn" : "线性加深", + "linear_dodge" : "线性减淡", + "linear_light" : "线性光", + "Lineart" : "Lineart (线稿)", + "lineart_anime" : "lineart_anime (动漫线稿提取)", + "lineart_anime_denoise" : "lineart_anime_denoise (动漫线稿提取 - 去噪)", + "lineart_coarse" : "lineart_coarse (粗略线稿提取)", + "lineart_realistic" : "lineart_realistic (写实线稿提取)", + "lineart_standard (form white bg & black line)" : "lineart_standard (标准线稿提取 - 白底黑线)", + "lineart_standard (from white bg & black line)" : "lineart_standard (标准线稿提取 - 白底黑线反色)", + "line drawing" : "line drawing (线描)", + "Link to DeepL" : "Deepl 在线翻译链接", + "List loaded embeddings" : "获取嵌入式模型列表", + "List of active tabs (separated by commas). Available options are txt2img, img2img, txt2img-grids, img2img-grids, Extras, Favorites, Others. Custom folders are also supported by specifying their path." : "激活的图像保存目录标签 (用逗号分隔). 可用的标签有, 文生图(txt2img),图生图(img2img), 文生图-网格(txt2img-grids), 图生图-网格(img2img-grids), 后期处理(Extras), 收藏夹(Favorites), 其它(Others). 也可以通过指定文件目录来自定义目录标签.", + "List of model names (with file extension) or their hashes to use as black/whitelist, separated by commas." : "用于黑/白名单的模型名称(带文件扩展名)或其哈希值的列表,用逗号分隔", + "List of prompt inputs" : "提示词输入列表", + "List of setting names, separated by commas, for settings that should go to the quick access bar at the top, rather than the usual setting tab. See modules/shared.py for setting names. Requires restarting to apply." : "设置项名称的列表,以英文逗号分隔,该设置会移动到顶部的快速访问栏,而不是默认的设置选项卡。有关设置名称,请参阅 modules/shared.py。(需保存设置并重启)", + "Live preview display period" : "实时预览显示周期", + "Live preview file format" : "实时预览文件格式", + "Live preview method" : "实时预览模式", + "Live previews" : "实时过程预览", + "Live preview subject" : "实时预览主体", + "⚙️ Load" : "⚙️ 加载", + "Load" : "加载", + "Load All Settings" : "载入所有设置", + "Load an image." : "加载一张图片", + "Load BG" : "加载背景图", + "Load from:" : "加载扩展列表", + "Load from JSON" : "加载 JSON", + "Load from subdirectories" : "从子目录中加载", + "load_history" : "加载历史记录", + "Loading..." : "载入中...", + "Load models/files in hidden directories" : "加载隐藏目录中的模型/文件", + "Load models using stream loading method" : "使用流式模型加载方法", + "Load Params" : "载入参数", + "Load Preset" : "加载预设", + "Load results" : "加载结果", + "Load Scene" : "加载场景", + "Load Settings" : "载入设定", + "Load Video Settings" : "载入视频设置", + "Local directory name" : "本地目录名", + "localization" : "本地化", + "Localization" : "本地化", + "Localization file (Please leave `User interface` - `Localization` as None)" : "本地化文件 (请将\"用户界面\" - “本地化翻译”选项设置为“无”)", + "Localization (requires restart)" : "本地化翻译(需要重启)", + "Location" : "FFmpeg 所在位置", + "Log" : "日志", + "Log directory" : "日志目录", + "Logo" : "图标", + "Loop" : "循环", + "Loopback" : "回送", + "[Loopback] Automatically send generated images to this ControlNet unit" : "[回送] 自动将生成后的图像发送到此 ControlNet 单元", + "Loopback option" : "回送选项", + "Loopback source" : "回送源", + "Looping recommendations:" : "循环设置建议:", + "Loops" : "回送次数", + "LoRA Block Weight" : "LoRA Block Weight (LoRA 区块权重配置)", + "LoRA directory (if not default)" : "LoRA 模型文件目录 (如非默认)", + "LoRA model name filter" : "按名称过滤低秩微调 (LoRA) 模型", + "Lora: use old method that takes longer when you have multiple Loras active and produces same results as kohya-ss/sd-webui-additional-networks extension" : "Lora: 使用旧的加载方法,当多个 Lora 激活时需要更长的时间,并且可以生成与 kohya-ss/sd-webui-additional-networks 扩展相同的结果", + "low contrast" : "low contrast (低对比度)", + "Low fps" : "低帧率", + "(Low values = visible seam)" : "(数值越低=接缝越明显)", + "Low VRAM" : "低显存模式", + "Low VRAM (8GB or below)" : "低显存 (8 GB 以下) 模式", + "luminism" : "luminism (光色派)", + "M00" : "中间层", + "M_A_00" : "模型 A 中间层", + "Made by" : "制作方: ", + "Made by deforum.github.io, port for AUTOMATIC1111's webui maintained by kabachuha" : "由 deforum.github.io 制作,AUTOMATIC1111 的 webui 移植版本由 kabachuha 维护", + "magical realism" : "magical realism (魔幻现实主义)", + "Main" : "主菜单", + "Main menu position" : "主菜单位置", + "Main Settings" : "主设置", + "Maintenance" : "维护", + "Make a backup copy of the model being edited when saving its metadata." : "保存元数据时,备份当前编辑的模型文件", + "Make an attempt to produce a picture similar to what would have been produced with same seed at specified resolution" : "尝试生成与同一种子在特定分辨率下产生的图片相似的图片", + "Make GIF" : "制作 GIF", + "Make Hires. fix+ run before any other extensions (will reload WebUI)" : "使 高分辨率修复PLUS 在其它所有插件前执行 (勾选后会立刻重载WebUI)", + "Make Images" : "制作图像", + "Make K-diffusion samplers produce same images in a batch as when making a single image" : "使 K-diffusion 采样器在批量生成与生成单个图像时,产出相同的结果", + "Make LoRA (A-B)" : "制作差分 LoRA (A-B)", + "Make LoRA (alpha * A - beta * B)" : "制作差分 LoRA (α × A - β × B)", + "Make your changes, press 'View changes' to review the changed default values," : "修改后通过点击 '查看更改' 来复查修改后的默认设置数值。\n然后点击 \"应用\" 把更改后的数值写入到 webui 根目录中的 ui-config.json文件中。", + "Make your choices, adjust your settings, set a name, save. To edit a prior choice, select from dropdown and overwrite." : "做出选择,调整设置,设置名称,保存。要编辑先前的选择,请从下拉列表中选择并覆盖。", + "Make Zip when Save?" : "保存时创建 zip 压缩文件?", + "Manage Extensions" : "管理扩展", + "manga" : "manga (日漫)", + "manipulations" : "图片处理", + "Manual install" : "手动安装", + "mask" : "蒙版", + "Mask" : "蒙版", + "Mask blur" : "蒙版边缘模糊度", + "Mask Blur Kernel Size" : "蒙版模糊内核大小", + "Mask Blur Kernel Size(GaussianBlur)" : "蒙版模糊内核大小(高斯模糊)", + "Mask Blur Kernel Size(MedianBlur)" : "蒙版模糊内核大小(中值模糊)", + "Mask brightness adjust" : "蒙版亮度调整", + "Mask by Category" : "按分类创建蒙版", + "mask content ratio" : "蒙版内容比例", + "Mask contrast adjust" : "蒙版对比度调整", + "Mask directory" : "遮罩图像目录", + "Masked content" : "蒙版区域内容处理", + "Mask erosion (-) / dilation (+)" : "蒙版图像腐蚀 (-) / 蒙版图像膨胀 (+)", + "Mask erosion (-) / dilation (+) 2nd" : "蒙版图像腐蚀 (-) / 蒙版图像膨胀 (+)", + "Mask erosion (-) / dilation (+) 3rd" : "蒙版图像腐蚀 (-) / 蒙版图像膨胀 (+)", + "Mask erosion (-) / dilation (+) 4th" : "蒙版图像腐蚀 (-) / 蒙版图像膨胀 (+)", + "Mask erosion (-) / dilation (+) 5th" : "蒙版图像腐蚀 (-) / 蒙版图像膨胀 (+)", + "Mask file" : "蒙版文件", + "Mask fill" : "蒙版填充", + "Mask for ControlNet Inpaint" : "用于 ControlNet 重绘的蒙版", + "mask image:" : "蒙版图像:", + "Masking Method" : "蒙版方式", + "Mask max area ratio" : "蒙版区域最大比率", + "Mask max area ratio 2nd" : "蒙版区域最大比率", + "Mask max area ratio 3rd" : "蒙版区域最大比率", + "Mask max area ratio 4th" : "蒙版区域最大比率", + "Mask max area ratio 5th" : "蒙版区域最大比率", + "Mask merge mode" : "蒙版合并模式", + "Mask merge mode 2nd" : "蒙版合并模式", + "Mask merge mode 3rd" : "蒙版合并模式", + "Mask merge mode 4th" : "蒙版合并模式", + "Mask merge mode 5th" : "蒙版合并模式", + "Mask min area ratio" : "蒙版区域最小比率", + "Mask min area ratio 2nd" : "蒙版区域最小比率", + "Mask min area ratio 3rd" : "蒙版区域最小比率", + "Mask min area ratio 4th" : "蒙版区域最小比率", + "Mask min area ratio 5th" : "蒙版区域最小比率", + "Mask mode" : "蒙版模式", + "Mask Mode" : "蒙版模式", + "Mask Mode(Override img2img Mask mode)" : "蒙版模式(覆盖图生图的蒙版模式)", + "Mask option" : "蒙版选项", + "Mask overlay blur" : "蒙版覆盖模糊度", + "Mask Preprocessing" : "蒙版处理", + "Mask schedule" : "蒙版参数表", + "Mask Setting" : "蒙版设置", + "masks from files: in [], like [mask1.png]" : "从文件中获取蒙版:[] ,比如 [mask1.png]", + "Mask size" : "蒙版尺寸", + "Mask source" : "蒙版来源", + "Mask Target (e.g., girl, cats)" : "蒙版目标(如 girl, cats)", + "Mask Threshold" : "蒙版阈值", + "Mask transparency" : "蒙版透明度", + "Mask x(→) offset" : "蒙版 X 轴 (→) 偏移", + "Mask x(→) offset 2nd" : "蒙版 X 轴 (→) 偏移", + "Mask x(→) offset 3rd" : "蒙版 X 轴 (→) 偏移", + "Mask x(→) offset 4th" : "蒙版 X 轴 (→) 偏移", + "Mask x(→) offset 5th" : "蒙版 X 轴 (→) 偏移", + "Mask y(↑) offset" : "蒙版 Y 轴 (↑) 偏移", + "Mask y(↑) offset 2nd" : "蒙版 Y 轴 (↑) 偏移", + "Mask y(↑) offset 3rd" : "蒙版 Y 轴 (↑) 偏移", + "Mask y(↑) offset 4th" : "蒙版 Y 轴 (↑) 偏移", + "Mask y(↑) offset 5th" : "蒙版 Y 轴 (↑) 偏移", + "Match input size" : "匹配输入图尺寸", + "Max" : "最大值", + "Max Crop Size" : "最大修复尺寸", + "max frames" : "最大帧数", + "Max frames" : "最大帧数", + "Max Image Size" : "最大图像尺寸", + "Maximize area" : "最大化面积", + "Maximum aesthetic_score" : "最大美学评分", + "Maximum batch size" : "最大单批数量", + "Maximum execution time (seconds)" : "最大执行时间(以秒为单位)", + "Maximum height" : "最大高度", + "Maximum Image Height:" : "图片最大高度", + "Maximum image size" : "最大图像尺寸", + "Maximum image size, in megapixels" : "上述选项的最大图像尺寸,单位:百万像素", + "Maximum Image Width:" : "图片最大宽度:", + "Maximum Image Width/Height:" : "图片最大宽度/高度:", + "Maximum keyframe gap" : "最大关键帧间隔", + "Maximum number of faces to detect" : "检测的最大人脸数量", + "Maximum number of images in upscaling cache" : "图像放大缓存中的最大图片数量", + "Maximum prompt token count" : "最大提示词词元长度", + "Maximum ranking" : "最高评分", + "Maximum results" : "候选Tag最大数量", + "Maximum score" : "最高评分", + "Maximum width" : "最大宽度", + "Max key frames" : "最大关键帧数", + "Max models" : "最大模型数量", + "Max number of dataset folders to show" : "要显示的最大数据集文件夹数", + "Max number of top tags to show" : "要显示的最大常见标签数", + "Max prompt words for [prompt_words] pattern" : "用于替代 [prompt_words] 占位符的最大提示词数量", + "Max resolution of temporary files" : "临时文件最大分辨率", + "Max steps" : "最大步数", + "Max Token Length" : "最大词元长度", + "M_B_00" : "模型 B 中间层", + "MBW" : "分块设置权重(MBW)", + "MBW Each" : "A/B 模型分别分块设置权重 (MBW Each)", + "mbw weights" : "分块权重", + "mediapipe_face" : "mediapipe_face (脸部边缘检测)", + "melanin" : "melanin (黑色素/黑人)", + "Memory" : "内存", + "Memory optimization" : "显存优化选项", + "Memory usage" : "内存使用量", + "Merge" : "合并", + "Merge!" : "融合", + "Merge and gen" : "融合并生成", + "Merge And Gen" : "融合并生成", + "Merge and Invert" : "合并且反相", + "Merge Block Weighted" : "模型分块合并", + "Merge&Gen" : "融合并生成", + "Merge LoRAs" : "合并 LoRA", + "Merge mode" : "合并模式", + "Merge Mode" : "融合算法", + "Merge models and load it for generation" : "融合模型并生成图片", + "Merge to Checkpoint" : "合并到大模型", + "Message" : "信息", + "messy" : "messy (混乱)", + "Metadata to show in XY-Grid label for Model axes, comma-separated (example: \"ss_learning_rate, ss_num_epochs\")" : "显示在 X/Y 表标签下的元数据选项,以逗号分隔(示例:\"ss_learning_rate, ss_num_epochs\")", + "Method" : "方案", + "MiDaS weight (vid2depth)" : "MiDaS 权重 (vid2depth)", + "Min" : "最小值", + "Minimize error" : "最小错误阈值", + "minimum aesthetic_score" : "按美学评分下限过滤", + "Minimum aesthetic_score" : "最小美学评分", + "Minimum batch size" : "最小单批数量", + "Minimum height" : "最小高度", + "Minimum keyframe gap" : "最小关键帧间隔", + "Minimum lighting ratio" : "最小照明比率", + "Minimum number of pages per load" : "每次加载的最小页数", + "Minimum prompt token count" : "最小提示词词元长度", + "Minimum ranking" : "最低评分", + "Minimum score" : "最低评分", + "Minimum steps" : "最小迭代步数", + "Minimum width" : "最小宽度", + "min_mask_region_area" : "最小蒙版面积", + "Min-max" : "最低 - 最高", + "Mirror webcam" : "镜像网络摄像头", + "missing metadata" : " 无元数据", + "Mixed" : "混合", + "Mixed Precision" : "混合精度", + "MLDanbooru Tagger" : "ML-Danbooru 标签器", + "mlsd" : "mlsd (M-LSD 直线线条检测)", + "MLSD" : "MLSD (直线)", + "mode" : "模式", + "Mode" : "模式", + "model" : "模型", + "Model" : "模型", + "Model 1" : "模型 1", + "Model 2" : "模型 2", + "Model 3" : "模型 3", + "Model 4" : "模型 4", + "Model 5" : "模型 5", + "model A" : "模型 A", + "model_A" : "模型 A", + "Model A" : "模型 A", + "Model_A" : "模型A", + "model B" : "模型 B", + "model_B" : "模型 B", + "Model B" : "模型 B", + "Model_B" : "模型 B", + "model C" : "模型 C", + "Model C" : "模型 C", + "Model cache size (requires restart)" : "模型缓存数量 (需重启)", + "Model compile mode (experimental)" : "模型编译模式(实验性)", + "Model Converter" : "模型转换", + "Model description/readme/notes/instructions" : "模型的描述信息/说明/注释/指引", + "model hash" : "模型哈希值", + "Model hash" : "模型哈希值", + "Model Name" : "模型名称", + "model of the upscaler to use. 'realesr-animevideov3' is much faster but yields smoother, less detailed results. the other models only do x4" : "需要使用的超分模型。 'realesr-animevideov3' 速度更快但生成的结果更平滑、更详细。其他超分模型只支持 4 倍放大", + "Model path" : "模型路径", + "Model Path" : "模型路径", + "Model path filter" : "按模型路径过滤", + "models" : "模型相关", + "Models" : "模型", + "Models..." : "模型列表...", + "Model Toolkit" : "模型工具箱", + "model to use" : "使用的模型", + "Model Type" : "模型种类", + "Model Types" : "模型种类", + "Model Version" : "模型版本", + "Mode to add the extra tags to the main tag list" : "选择将额外标签添加到主要标签列表的模式", + "Mode to use for model list" : "模型列表模式", + "Modules" : "模块", + "monochromatic" : "monochromatic (单色调)", + "More info about Anti Burn" : "关于 Anti Burn 的更多信息", + "Motion" : "运动参数", + "Mov2Mov output path for image" : "Mov2Mov 图片输出路径", + "Mov2Mov output path for vedio" : "Mov2Mov 视频输出路径", + "Mov2Mov output path for video" : "Mov2Mov 视频输出路径", + "Move buttons copy instead of move" : "将图库浏览器内所有 \"移动\" 按钮改为 \"复制\" 按钮", + "Move completion popup together with text cursor" : "将弹出窗口与文本光标一起移动", + "Move ControlNet images to CPU (if applicable)" : "将 ControlNet 图像移动到 CPU (如果适用)", + "Move ControlNet tensor to CPU (if applicable)" : "将 ControlNet tensor 移至CPU (如果适用)", + "Move/Copy/Delete matching .txt files" : "将图片的移动、复制、删除操作应用到与之同名的 txt 文件", + "Move face restoration model from VRAM into RAM after processing" : "处理完成后,将面部修复模型从显存卸载到内存", + "Move File(s)" : "移动文件", + "Move Mode (X key)" : "移动模式(X 键)", + "Move or Delete" : "移动或删除", + "Move quicksettings to image setting panel" : "移动快速设置到左侧图像设置面板", + "Move to favorites" : " 移动到收藏夹", + "Move VAE and CLIP to RAM when training hypernetwork. Saves VRAM." : "训练超网络时将 VAE 和 CLIP 模型移动到内存,可节省显存", + "Move VAE and CLIP to RAM when training if possible" : "训练时尽可能将 VAE 与 CLIP 模型移动到内存", + "Move VAE and CLIP to RAM when training if possible. Saves VRAM." : "如果可行,训练时将 VAE 和 CLIP 模型从显存移动到内存,可节省显存", + "Move VAE to GPU" : "将 VAE 移动到 GPU", + "Move VAE to GPU (if possible)" : "将 VAE 移动到 GPU (如果允许)", + "Moving the canvas" : "移动画布", + "Multi ControlNet: Max models amount (requires restart)" : "ControlNet Unit 的最大数量 (需重启)", + "Multi-frame rendering" : "多帧渲染", + "Multi Merge" : "多重合并", + "Multi Model Merge" : "多模型合并", + "Multiplication (2^N)" : "倍率 (2^N)", + "multiplier" : "倍率", + "Multiplier" : "倍率", + "Multiplier for extra networks" : "扩展模型默认权重", + "Multiplier (M) - set to 0 to get model A" : "融合比例 (M) - 设为 0 等价于直接输出模型 A", + "multiply" : "乘积", + "Multi Proc Cmd" : "多进程命令", + "(must be < sampling steps)" : "(需小于迭代步数)", + "My prompt is more important" : "更偏向提示词", + "naive" : "朴素卷积算法", + "naive_interpolating" : "朴素插值算法", + "name" : "名称", + "Name" : "名称", + "Name 0" : "名称 0", + "Name 1" : "名称 1", + "Name 10" : "名称 10", + "Name 11" : "名称 11", + "Name 12" : "名称 12", + "Name 13" : "名称 13", + "Name 14" : "名称 14", + "Name 15" : "名称 15", + "Name 2" : "名称 2", + "Name 3" : "名称 3", + "Name 4" : "名称 4", + "Name 5" : "名称 5", + "Name 6" : "名称 6", + "Name 7" : "名称 7", + "Name 8" : "名称 8", + "Name 9" : "名称 9", + "nature" : "nature (自然主义)", + "Navigate image viewer with gamepad" : "使用游戏手柄导航图像查看器", + "Near clip" : "近端衰减", + "need input your want to translate" : "请输入你想翻译的内容", + "negative" : "反向", + "Negative Guidance minimum sigma" : "反向提示词引导最小 sigma", + "Negative prompt" : "反向提示词", + "Negative Prompt" : "反向提示词", + "Negative prompt for hires fix pass.\nLeave empty to use the same negative prompt as in first pass." : "用于高分修复层的反向提示词\n留空以使用与第一层相同的提示词", + "Negative prompt (press Ctrl+Enter or Alt+Enter to generate)" : "反向提示词 (按 Ctrl+Enter 或 Alt+Enter 开始生成)\nNegative prompt", + "Negative Prompts" : "反向提示词", + "negative prompt to be appended to *all* prompts. DON'T use --neg here!" : "反向提示词会被添加到左右提示词内,请勿在此处使用 --neg 字段", + "Negative Prompt Weight" : "反向提示词权重", + "Negative Prompt, will also be appended" : "追加反向提示词", + "Net height" : "深度图高度", + "Net width" : "深度图宽度", + "Network module" : "附加网络模块", + "Network module 1" : "附加模型 1", + "Network module 2" : "附加模型 2", + "Network module 3" : "附加模型 3", + "Network module 4" : "附加模型 4", + "Network module 5" : "附加模型 5", + "Never" : "从不", + "Nevysha Cozy Nest Settings" : "Nevysha Cozy Nest 设置", + "Nevysha Cozy Nest Update Info" : "Nevysha Cozy Nest 更新信息", + "New Canvas Height" : "新画布高度", + "New Canvas Width" : "新画布宽度", + "New defaults will apply after you restart the UI." : "新的默认设置将会在重启 UI 后应用。", + "newest first" : "按发布日期倒序", + "New preset name " : "新预设名称", + "New Scribble Drawing Height" : "新线稿画板高度", + "New Scribble Drawing Width" : "新线稿画板宽度", + "Next batch" : "下一批", + "Next Page" : "下一页", + "no" : "否", + "No" : "否", + "no-ema" : "删除 EMA 权重", + "no find:" : "未找到:", + "no image selected" : "没有图片被选中", + "No interpolation" : "原样输出", + "No interpolation will be used. Requires one model; A. Allows for format conversion and VAE baking." : "直接输出主要模型。需要一个模型 A。可用于模型格式转换和嵌入 VAE。", + "Noise" : "噪声", + "Noise Inversion" : "噪声反转", + "Noise mask schedule" : "噪点蒙版参数表", + "(noise multiplier; applies to Euler a and other samplers that have a in them)" : "(噪声倍数: 适用于 Euler a 和其它具有 a 的采样方法)", + "Noise multiplier for img2img" : "图生图噪声倍率", + "(noise multiplier; higher = more unperdictable results)" : "(噪声倍数: 越高=结果越难以预测)", + "Noise multiplier schedule" : "噪声乘法调度(Noise multiplier schedule)", + "Noise schedule" : "噪点值表", + "Noise Tolerance" : "噪声容忍度", + "Noise type" : "噪声类型", + "No model has new version" : "所有模型均是最新版本", + "none" : "无", + "None" : "无", + "NONE" : "无", + "None (just grayscale)" : "什么都不做(灰度模式)", + "None - prompt only" : "无 - 仅提示词", + "normal" : "正常", + "Normal" : "常规", + "normal_bae" : "normal_bae (Bae 法线贴图提取)", + "Normally, it creates a single random prompt. With prompt compounder, it will generate multiple prompts and compound them together." : "一般情况下只能创建一个单一的随机提示。但有了提示词混合,可以生成多个提示词并将它们复合在一起。", + "(normally you'd do less with less denoising)" : "(正常情况下越小的重绘幅度需要的迭代步数更少)", + "normal_midas" : "normal_midas (Midas 法线贴图提取)", + "Normal with batch" : "正常(带批处理)", + "not" : "不会", + "Note that parseq overrides:" : "以下参数将会被参数定序器覆盖设置:", + "(not for Video Input mode)" : " (不用于视频输入模式)", + "Nothing here. Add some content to the following directories:" : "暂无内容。请添加模型到以下目录:", + "nudity" : "nudity (裸体)", + "NUl Image Enhancer" : "NUI 图像增强", + "Number of columns on the page" : "每页列数", + "Number of frames" : "总帧数", + "Number of iterations" : "迭代次数", + "Number of negative vectors per token" : "每个词元的反向向量数", + "Number of repeats for a single input image per epoch; used only for displaying epoch number" : "每期 (epoch) 中单个输入图像的重复次数; 仅用于显示期数", + "Number of rows on the page" : "每页行数", + "Number of samples to generate" : "要生成的样本数量", + "Number of Samples to Generate" : "要生成的样本数量", + "Number of sampling steps for upscaled picture. If 0, uses same as for original." : "高分辨率修复图片的迭代步数。如果为0,则使用与文生图设置相同的迭代步数。", + "number of the frames that we will blend between current imagined image and input frame image" : "当前想象图像和输入帧图像之间混合的帧数", + "Number of vectors per token" : "每个词元的向量数", + "(O10) Output ckpt Name" : "(O10) 输出模型文件名", + "(O1) Output ckpt Name" : "(O1) 输出模型文件名", + "(O2) Output ckpt Name" : "(O2) 输出模型文件名", + "(O3) Output ckpt Name" : "(O3) 输出模型文件名", + "(O4) Output ckpt Name" : "(O4) 输出模型文件名", + "(O5) Output ckpt Name" : "(O5) 输出模型文件名", + "(O6) Output ckpt Name" : "(O6) 输出模型文件名", + "(O7) Output ckpt Name" : "(O7) 输出模型文件名", + "(O8) Output ckpt Name" : "(O8) 输出模型文件名", + "(O9) Output ckpt Name" : "(O9) 输出模型文件名", + "object" : "object (物件)", + "object - Can be a random object, a building or a vehicle." : "object - 物件 - 可以是一个随机的物体,也可以是一个建筑物或一辆车。", + "octane render" : "octane render (OC渲染)", + "official Deforum Discord" : " Deforum 官方 Discord 频道", + "Official Deforum Wiki:" : "Deforum 官方 Wiki: ", + "# of threads to use for hash calculation (increase if using an SSD)" : "用于哈希计算的线程数 (如果使用 SSD 可适当增加)", + "oldest first" : "按发布日期正序", + "Once turned on, it will retry for n amount of times to get an image with the quality score. If not, it will take the best image so far and continue." : "一旦启用,它将持续生成 N 次以获得具有一定质量分数的图像。如果没有,它将保留评分最好的图像持续生成。", + "One Button Prompt" : "One Button Prompt (一键生成提示词)", + "One Button Run and Upscale" : "一键运行并放大", + "online" : "线上服务", + "Online 3D Openpose Editor" : "在线 3D Openpose 编辑器", + "(only applies if non-zero and overrides above)" : "(仅在数值设置为非零时启用, 启用时覆盖原 Token 合并比率设置)", + "Only applies to inpainting models. Determines how strongly to mask off the original image for inpainting and img2img. 1.0 means fully masked, which is the default behaviour. 0.0 means a fully unmasked conditioning. Lower values will help preserve the overall composition of the image, but will struggle with large changes." : "仅适用于局部重绘专用的模型(模型后缀为 inpainting.ckpt 的模型)。决定了蒙版在局部重绘以及图生图中屏蔽原图内容的强度。 1.0 表示完全屏蔽原图,这是默认行为。0.0 表示完全不屏蔽让原图进行图像调节。较低的值将有助于保持原图的整体构图,但很难遇到较大的变化", + "Only copy to models with no metadata" : "仅复制到不含元数据的模型", + "Only copy to models with same session ID" : "仅复制到具有相同 Session ID 的模型", + "Only Hand" : "仅显示手部(移除脚部)", + "*Only in use with pix2pix checkpoints!*" : "*仅在加载 Pix2Pix 模型时生效!*", + "Only masked" : "仅蒙版区域", + "Only masked padding, pixels" : "仅蒙版区域下边缘预留像素", + "only other types --> Will pick only from the more unique types, such as stained glass window or a funko pop" : "only other types -- 仅其它类型 --> 只从其它更独特的类型中挑选,如彩色玻璃窗或一只玩具人偶。", + "Only show alias" : "仅展示别名", + "Only Show Models have no Info" : "只显示缺少信息的模型", + "Only show models that have/don't have user-added metadata" : "按是否有元数据过滤模型", + "Only show .safetensors format models" : "只显示 .safetensors 格式的模型", + "Only store preferences locally" : "仅在本地保存设置", + "Only upscale will not use txt2img to generate an image." : "仅放大时不会通过文生图功能生成图像", + "Only use mid-control when inference" : "仅在生成图片时使用中间层控制 (mid-control)", + "Onnx model filename" : "Onnx 模型文件名 (包含路径)", + "ONNX opset version" : "ONNX 算子集版本", + "(O)Output Model Name" : "输出模型文件名", + "Opacity" : "不透明度", + "Open..." : "打开...", + "Open images output directory" : "打开图像输出目录", + "Open intermediate results" : "立即打开当前效果图", + "Open new canvas" : "打开新画布", + "Open New Canvas" : "打开新画布", + "Open New Scribble Drawing Canvas" : "创建新的线稿画板", + "Open output directory" : "打开输出目录", + "openpose" : "openpose (OpenPose 姿态)", + "OpenPose" : "OpenPose (姿态)", + "OpenPose Editor" : "OpenPose 编辑器", + "openpose_face" : "openpose_face (OpenPose 姿态及脸部)", + "openpose_faceonly" : "openpose_faceonly (OpenPose 仅脸部)", + "openpose_full" : "openpose_full (OpenPose 姿态、手部及脸部)", + "openpose_hand" : "openpose_hand (OpenPose 姿态及手部)", + "Open results" : "打开最终效果图", + "Open TextEditor" : "打开文本编辑器", + "Open the generated .ebs under project directory and press [Run All] button." : "打开工程目录下生成的 .ebs 文件,按[Run All]按钮。", + "Open this model's civitai url" : "在新标签页打开本模型的 Civitai 页面", + "Open Url At Client Side" : "在浏览器侧打开链接", + "Optical Flow" : "光流法", + "Optical flow cadence" : "生成间隔中启用光流法", + "Optimizations" : "优化设置", + "Options are all options hardcoded, and additional you added in additional_components.py" : "选项都是硬编码的选项,并且是您在 additional_components.py 中添加的附加选项", + "Options in main UI" : "主界面额外选项", + "- or -" : "- 或 -", + "or" : "或", + "Order" : "排序", + "original" : "原图", + "Original:" : "原项目:", + ": Original extension" : ": 原始扩展名", + ": Original extension\nAvailable algorithms:" : ": 原始扩展名\n可用算法: ", + ": Original filename without extension" : ": 没有扩展名的原始文件名", + "Original filename without extension" : "没有扩展名的原始文件名", + "Original file’s hash (good for deleting duplication)" : "原始文件哈希值 (有助于检测重复项)", + "Original First" : "原文在上", + "Original Image" : "原始图像", + "OriginalImg" : "OriginalImg (原始输入的第一帧)", + "Original Movie Path" : "原始视频路径", + "Original negative prompt" : "原始反向提示词", + "Original prompt" : "原始正向提示词", + "original video frame" : "原始视频帧", + "Original Weights" : "原始权重", + "or, manually enhance the image" : "↓手动控制图像增强参数↓", + "(or open as text in a new page)" : "(或在新的标签页查看)", + "or to CTRL+SHIFT" : "将 CTRL 绑定更改为 CTRL+SHIFT", + "Other" : "其他", + "Other prompt fields" : "其它提示词段", + "others" : "其它", + "- Others" : "- 其它", + "Others" : "其它", + "Other Setting" : "其他设置", + "OUT00" : "输出层 00", + "OUT01" : "输出层 01", + "OUT02" : "输出层 02", + "OUT03" : "输出层 03", + "OUT04" : "输出层 04", + "OUT05" : "输出层 05", + "OUT06" : "输出层 06", + "OUT07" : "输出层 07", + "OUT08" : "输出层 08", + "OUT09" : "输出层 09", + "OUT10" : "输出层 10", + "OUT11" : "输出层 11", + "OUT_A_00" : "模型 A 输出层 00", + "OUT_A_01" : "模型 A 输出层 01", + "OUT_A_02" : "模型 A 输出层 02", + "OUT_A_03" : "模型 A 输出层 03", + "OUT_A_04" : "模型 A 输出层 04", + "OUT_A_05" : "模型 A 输出层 05", + "OUT_A_06" : "模型 A 输出层 06", + "OUT_A_07" : "模型 A 输出层 07", + "OUT_A_08" : "模型 A 输出层 08", + "OUT_A_09" : "模型 A 输出层 09", + "OUT_A_10" : "模型 A 输出层 10", + "OUT_A_11" : "模型 A 输出层 11", + "OUT_B_00" : "模型 B 输出层 00", + "OUT_B_01" : "模型 B 输出层 01", + "OUT_B_02" : "模型 B 输出层 02", + "OUT_B_03" : "模型 B 输出层 03", + "OUT_B_04" : "模型 B 输出层 04", + "OUT_B_05" : "模型 B 输出层 05", + "OUT_B_06" : "模型 B 输出层 06", + "OUT_B_07" : "模型 B 输出层 07", + "OUT_B_08" : "模型 B 输出层 08", + "OUT_B_09" : "模型 B 输出层 09", + "OUT_B_10" : "模型 B 输出层 10", + "OUT_B_11" : "模型 B 输出层 11", + "Outpainting direction" : "向外绘制的方向", + "output" : "输出", + "Output" : "输出", + "Output animation path" : "动画输出路径", + "Output directory" : "输出目录", + "Output Directory" : "输出目录", + "Output directory for grids" : "网格图输出文件夹", + "Output directory for grids; if empty, defaults to two directories below" : "网格图统一输出文件夹; 如果为空,则按以下两个文件夹分别输出", + "Output directory for images from extras tab" : "后期处理输出文件夹", + "Output directory for images; if empty, defaults to three directories below" : "统一输出文件夹; 如果为空,则按以下三个文件夹分别输出", + "Output directory for img2img grids" : "图生图网格输出文件夹", + "Output directory for img2img images" : "图生图输出文件夹", + "Output directory for txt2img grids" : "文生图网格输出文件夹", + "Output directory for txt2img images" : "文生图输出文件夹", + ": Output extension (has no dot)" : "输出扩展名 (没有 '.' 点)", + "Output filename" : "输出文件名", + "Output filename format" : "输出文件名格式", + "Output filename formats" : "输出文件名格式", + "Output format" : "输出格式", + "output height resolution" : "输出高度分辨率", + "Output Image Width" : "输出图像宽度", + "Output Model Name" : "输出模型文件名", + "Output name" : "输出名称", + "Output path" : "输出路径", + "Output Paths" : "输出路径", + "Output per image:" : "单独输出每张图像:", + "output resolution" : "输出分辨率", + "outputs" : "输出", + "Output settings: all settings (including fps and max frames)" : "输出设置:所有设置(包括帧率和最大帧数)", + "Output type" : "输出类型", + "output video resolution" : "输出视频的分辨率", + "Out Res" : "输出分辨率", + "overlay" : "叠加", + "Overlay mask" : "覆盖蒙版", + "override:" : "覆盖以下参数:", + "Override" : "覆盖", + "Override `Denoising strength` to 1?" : "覆写 `重绘幅度` 为 1?", + "Override options (choose the related subject type first for better results)" : "覆盖选项 (首选相关的主题类型以获得更好的结果)", + "Override `prompt` to the same value as `original prompt`?(and `negative prompt`)" : "覆写 `提示词` 为 `初始提示词`?` (反向提示词` 同理)", + "Override `Sampling method` to Euler?(this method is built for it)" : "覆写 `采样方法` 为 Euler? (这个方法就是为它设计的)", + "Override `Sampling Steps` to the same value as `Decode steps`?" : "覆写 `采样迭代步数` 为 `解码迭代步数`?", + "Override settings" : "覆盖设置", + "overwrite" : "允许覆盖", + "Overwrite" : "覆写", + "Overwrite extracted frames" : "覆盖已有帧", + "Overwrite image size" : "覆盖图像尺寸", + "Overwrite input frames" : "覆盖输入帧", + "Overwrite Old Embedding" : "覆盖同名嵌入式模型文件", + "Overwrite Old Hypernetwork" : "覆盖同名超网络文件", + "Overwrite subject" : "覆盖主题", + "Overwrite subject:" : "覆盖主题:", + "Overwrite type of image:" : "覆盖图像类型", + "Padding token (ID or single token)" : "填充提示词(完整ID或者单个提示词)", + "Pad prompt/negative prompt to be same length" : "补齐正向/反向提示词到相同长度", + "Pad Tokens" : "词元填充", + "Page Index" : "页码", + "painting" : "painting (画作)", + "Panorama to 3D mesh" : "全景图转 3D 网格", + "Parse!" : "解析", + "Parseq" : "参数定序器 (parameter sequencer)", + "Parseq does" : "参数定序器将", + "Parseq Manifest (JSON or URL)" : "参数定序器配置文件(JSON 或者链接)", + "Passing ControlNet parameters with \"Send to img2img\"" : "使用\"发送到图生图\"时传输 ControlNet 参数", + "Paste available values into the field" : "将可用值粘贴到字段中", + "path name" : "路径名", + "Path relative to the webui folder" : "相对于 webui 文件夹的路径", + "Paths for saving" : "保存路径", + "Path to directory containing annotator model directories (requires restart, overrides corresponding command line flag)" : "预处理器模型 (annotator model) 的文件路径 (需重启,以覆盖相应的命令行标志)", + "Path to directory where to write outputs" : "进行输出的目录路径", + "Path to directory with input images" : "带有输入图像的目录路径", + "/path/to/images or /path/to/images/**/*" : "/path/to/images 或 /path/to/images/**/*", + "Path to settings file you want to load. Path can be relative to webui folder OR full - absolute" : "需要加载的设置文件路径。该路径可以相对于 SD-WebUI 根目录,也可以是完整的绝对路径", + "Pause" : "暂停", + "PBRemTools" : "精确背景去除工具", + "performance" : "性能", + "Perform warmup" : "进行预热", + "per side" : "每边数量", + "persistent cond cache" : "持久化调整缓存", + "Perspective" : "透视", + "Perspective Flip" : "透视翻转", + "Perspective flip gamma" : "透视翻转伽马值", + "Perspective flip phi" : "透视翻转角度(垂直)", + "Perspective flip theta" : "透视翻转角度(水平)", + "photograph" : "photograph (照片)", + "photography" : "photography (摄影)", + "Pick Subfolder and Model Version" : "选择子目录与模型版本", + "pin_light" : "点光", + "Pixelize" : "像素化", + "Pixel Perfect" : "完美像素模式", + "Pixels to expand" : "拓展的像素数", + "Place options in main UI into an accordion" : "将选项置入主界面的一个手风琴式的容器中", + "Place this at back of generated prompt (suffix)" : "此框填写的提示词放在生成提示词的后面 (后缀)", + "Place this in front of generated prompt (prefix)" : "此框填写的提示词放在生成提示词的前面 (前缀)", + "Platform" : "运行平台", + "Please add text prompts to generate masks" : "请添加文本提示词以生成蒙版", + "Please always keep values in math functions above 0." : "请始终保持数学函数中的值大于 0。", + "Please enable the following settings to use controlnet from this script." : "请启用以下设置,以保证可以在此脚本中调用ControlNet。", + "Please use smaller tile size when got CUDA error: out of memory." : "当出现 CUDA error: out of memory 时,使用更小的分块尺寸", + "Please use smaller tile size when see CUDA error: out of memory." : "当出现 CUDA error: out of memory 时,使用更小的尺寸大小", + "PNG info" : "PNG 图片信息", + "PNG Info" : "PNG 图片信息", + "PNGs" : "图片(PNG格式)", + "point1 x" : "X 轴点 1", + "point1 y" : "Y 轴点 1", + "point2 x" : "X 轴点 2", + "point2 y" : "Y 轴点 2", + "point3 y" : "Y 轴点 3", + "points_per_batch" : "每批采样点", + "points_per_side" : "每边采样点", + "polylines_sharp" : "多边形算法 - 锐利", + "polylines_soft" : "多边形算法 - 柔和", + "Pooling Avg" : "池化平均值", + "Pooling Max" : "池化最大值", + "pop art" : "pop art (波普艺术)", + "popular" : "popular (流行艺术)", + ", port for AUTOMATIC1111's webui maintained by" : ", 是为 AUTOMATIC1111's webui 提供的插件项目,项目维护者: ", + "portrait" : "portrait (肖像)", + "Pose" : "姿势", + "Position (center to edge)" : "位置 (中心到边缘)", + "Position (left to right)" : "位置 (从左到右)", + "Positions" : "分区位置", + "positive" : "正向", + "Positive / Negative Prompts" : "正向 / 反向提示词", + "positive prompt to be appended to *all* prompts" : "正向提示词会被添加到所有提示词中", + "Postprocessing" : "后期处理", + "Post Processing" : "后期处理", + "Post-Processing" : "后处理", + "Postprocessing operation order" : "后处理操作顺序", + "Precision" : "精度", + "predicted_iou_threshold" : "预测交并比阈值", + "pred_iou_thresh" : "预测滤波阈值", + "Prefix" : "前缀", + "prefix AND prompt + suffix" : "prefix AND prompt + suffix (前缀 AND 提示词 + 后缀)", + "prefix + prefix + prompt + suffix" : "prefix + prefix + prompt + suffix (前缀 + 前缀 + 提示词 + 后缀)", + "Preload images at startup for first tab" : "在启动时为第一个选项卡预载图像", + "prepare ebsynth" : "预处理 Ebsynth", + "prepend" : "前置", + "Prepend" : "添加到开头", + "Prepend additional tags" : "将额外标签前置", + "Preprocess" : "预处理", + "Preprocess images" : "图像预处理", + "Pre-Processing" : "预处理", + "Preprocessor" : "预处理器", + "Preprocessor Preview" : "预处理结果预览", + "Preprocessor resolution" : "预处理器分辨率", + "Preprocessor Resolution" : "预处理器分辨率", + "Prerequisites and Important Info:" : "前提条件和重要信息:", + "Preset" : "预设", + "Preset Manager" : "预设管理器", + "Presets" : "预设", + "Preset Weights" : "预设权重", + "Preset_Weights" : "预设权重", + "Prev batch" : "上一批", + "Prevent empty spots in grid (when set to autodetect)" : "自动检测并消除网格图中的空位", + "Preview annotator result" : "预览预处理结果", + "Preview as Input" : "预处理结果作为输入", + "Preview automatically when add/remove points" : "添加/删除标记点时自动预览", + "Preview image negative prompt" : "预览图反向提示词", + "Preview image prompt" : "预览图提示词", + "Preview mask" : "预览蒙版", + "Preview Segmentation" : "预览分离结果", + "Preview segmentation image" : "预览语义分割图像", + "Previous" : "Previous (上一生成帧)", + "Prev Page" : "上一页", + "Primary model (A)" : "模型 A", + "primitivism" : "primitivism (原始主义画派)", + "Print" : "输出", + "Print all deviations" : "输出所有偏移量", + "print change" : "打印变更", + "Print debug logs to the console" : "将调试日志输出到控制台", + "Print extra hypernetwork information to console." : "将额外的超网络 (hypernetwork) 信息输出到控制台", + "Print image deletion messages to the console" : "打印图像删除信息到控制台", + "Print warning logs to the console" : "将警告信息输出到控制台", + "Process given file(s) under the input folder, seperate by comma" : "指定在输入文件夹中要处理图像的文件名 (使用逗号隔开)", + "Process images in a directory on the same machine where the server is running." : "处理服务器主机上某一目录里的图像", + "processing |" : "处理中 |", + "Process Stage" : "过程步骤", + "Produce an image that can be tiled." : "生成可用于平铺(tiled)的图像", + "Progressbar and preview update period" : "进度条/预览图更新周期", + "Progressbar/preview update period, in milliseconds" : "进度条/预览图更新周期 (毫秒)", + "Project directory" : "工程目录", + "project setting" : "工程设置", + "Prompt" : "提示词", + "prompt 1" : "提示词①", + "prompt 2" : "提示词②", + "prompt 4" : "提示词④", + "prompt 5" : "提示词⑤", + "Prompt attention parser" : "提示词注意力解析器", + "Prompt compounder" : "提示词混合", + "Prompt fields" : "提示词段", + "Prompt for face" : "针对脸部的提示词", + "Prompt for Face" : "脸部提示词", + "Prompt for hires fix pass.\nLeave empty to use the same prompt as in first pass." : "用于高分修复层的正向提示词\n留空以使用与第一层相同的提示词", + "prompting" : "提示词相关", + "Prompt matrix" : "提示词矩阵", + "Prompt (press Ctrl+Enter or Alt+Enter to generate)" : "正向提示词 (按 Ctrl+Enter 或 Alt+Enter 开始生成)\nPrompt", + "Prompts" : "提示词", + "Prompts are stored in JSON format. If you've got an error, check it in a" : "提示词以 JSON 格式存储。如果有错误,请在", + "Prompts are stored in JSON format. If you've got an error, check it in validator," : "提示词以 JSON 格式存储。如果您有错误,请在验证器中检查,", + "Prompt seperator" : "提示词分隔符", + "Prompt seperator mode" : "提示词分隔模式", + "prompts for your animation in a JSON format. Use --neg words to add 'words' as negative prompt" : "动画的提示词以 JSON 格式储存。使用 --neg 字段去添加反向提示词", + "Prompts from file or textbox" : "从文本框或文件载入提示词", + "Prompts negative" : "反向提示词", + "Prompts positive" : "正向提示词", + "Prompt template" : "提示词模板", + "Prompt Translator" : "提示词翻译器", + "Prompt, will append to your t2i prompt" : "追加提示词", + "Prompt word wrap length limit" : "提示词换组长度限制", + "Provider" : "提供方", + "Proxy" : "代理", + "Pruning Methods" : "模型修剪", + "psychedelic" : "psychedelic (迷幻艺术)", + "Put variable parts at start of prompt" : "把可变部分放在提示词文本的开头", + "Put weight sets. float number x 25" : "输入权重,共 25 个浮点数,逗号分隔", + "quad" : "二阶", + "Quality" : "质量", + "Quality for saved jpeg images" : "保存 JPEG 图片的质量", + "Quality Gate" : "质量把关", + "Quantize" : "量化", + "query" : "查询", + "queue:" : "排队中: ", + "Quick" : "快速设置", + "Quick batch" : "快速批处理", + "Quick Guide" : "快速指引", + "Quick Save" : "快速保存", + "Quicksettings list" : "快捷设置列表", + "Quicksettings position" : "快速设置位置", + "random" : "随机", + "Randomness" : "随机度", + "Random number generator source." : "随机数生成来源", + "Random number generator source. Changes seeds drastically. Use CPU to produce the same picture across different vidocard vendors." : "随机数的生成来源。大幅度改变种子。使用CPU来在不同型号显卡间产生相同的图像", + "range" : "范围", + "Range" : "范围", + "ranking" : "评分", + "ranking filter" : "按图片评分过滤", + "Ranking filter" : "评分过滤器", + "rating" : "评分", + "Rating" : "评分", + "Rating confidents" : "评级置信度", + "Read generation parameters from prompt or last generation if prompt is empty into user interface." : "从提示词或上次生成的图片中读取生成参数", + "read_last_image" : "载入上次图像", + "read_last_settings" : "载入上次设置", + "*READ ME before you use this mode!*" : "请在使用前认真阅读", + "Read parameters (prompt, etc...) from txt2img tab when making previews" : "进行预览时,从文生图选项卡中读取参数(提示词等)", + "Read tabular commands" : "读取 tabular 命令", + "Read tags from text files" : "从文本文件中读取提示词", + "realism" : "realism (现实主义)", + "Reapply ranking after moving files" : "移动文件后重新评分", + "Rebuild exif cache" : "重建 EXIF 缓存", + "Recipe" : "配方", + "recombine ebsynth" : "重组 Ebsynth", + "Recommended settings: Sampling Steps: 80-100, Sampler: Euler a, Denoising strength: 0.8" : "推荐设置: 采样迭代步数: 80-100, 采样器: Euler a, 重绘幅度: 0.8", + "Recommended to set tile sizes as large as possible before got CUDA error: out of memory." : "建议在得到 CUDA error: out of memory 报错前尽可能大的设置编码器分块大小", + "Recommend enabling the following settings." : "建议启用以下设置:", + "Reconstruct prompt from existing image and put it into the prompt field." : "从现有的图像中重构出提示词,并将其放入提示词的输入文本框", + "Rectangular" : "矩形", + "red-cyan-anaglyph" : "红蓝浮雕效果", + "Reference" : "Reference (参考)", + "reference_adain" : "reference_adain (仅参考输入图 - 自适应实例规范)", + "reference_adain+attn" : "reference_adain+attn (仅参考输入图 - 自适应实例规范 + Attention链接)", + "reference_only" : "reference_only (仅参考输入图)", + "Ref image (for conviently locate regions)" : "参考图(用于方便定位区域)", + "refresh" : "刷新", + "Refresh" : "刷新", + "Refresh Civitai Helper" : "刷新 Civitai 助手", + "Refresh Civitai Helper's additional buttons" : "刷新 Civitai 助手的附加按钮", + "Refresh Civitai Helper's model card buttons" : "刷新 Civitai 助手 的模型卡片按钮", + "Refresh data" : "刷新数据", + "Refresh extension list" : "刷新扩展列表", + "Refresh models" : "刷新模型列表", + "Refresh openOutpaint" : "刷新 openOutpaint", + "Refresh page" : "刷新页面", + "Refresh TAC temp files" : "刷新 TAC 缓存文件", + "regex - e.g. ^(?!.*Hires).*$" : "正则表达式 - 如 ^(?!.*Hires).*$", + "Region 1" : "区域 1", + "Region 2" : "区域 2", + "Region 3" : "区域 3", + "Region 4" : "区域 4", + "Region 5" : "区域 5", + "Region 6" : "区域 6", + "Region 7" : "区域 7", + "Region 8" : "区域 8", + "Region Prompt Control" : "分区提示词控制", + "Regions" : "分区", + "Regular expression; if weights's name matches it, the weights is not written to the resulting checkpoint. Use ^model_ema to discard EMA weights." : "输入正则表达式。键名匹配该表达式的权重将从最终合并模型中剔除。使用 ^model_ema 可剔除 EMA 权重。", + "Related to original file" : "与原始文件相关", + "Related to output file" : "与输出文件相关", + "Reload Cache List" : "重载缓存列表", + "Reload checkpoint" : "刷新模型列表", + "Reload Checkpoints" : "重新加载模型", + "Reload custom script bodies (No ui updates, No restart)" : "重新加载自定义脚本主体(不进行界面更新及重启)", + "Reloading..." : "正在重新加载...", + "Reload Presets" : "重载预设", + "Reload/Save Settings (config.json)" : "重新载入/保存设置 (config.json)", + "Reload scripts" : "重载脚本", + "Reload settings" : "重新载入设置", + "Reload Tags" : "重载标签", + "Reload the last SD checkpoint back into VRAM" : "重新将上次使用的 Stable Diffusion 模型加载到显存中", + "Reload UI" : "重载前端", + "Reload UI needed to apply" : "需重启前端", + "Reloat List" : "重新加载列表", + "remake dimension" : "重制维度", + "Remember this choice?" : "记住这个选择?", + "➖ Remove" : "➖ 移除", + "Remove" : "移除", + "Remove all point prompts" : "移除所有标记点", + "Remove Auto Trans" : "移除自动翻译", + "Remove background" : "移除背景", + "Remove background image" : "移除背景图片", + "Remove duplicated tag" : "删除重复标签", + "Remove occluded edges" : "移除遮挡边缘", + "Remove selected" : "移除已选择的图片", + "renaissance" : "renaissance (文艺复兴)", + "Rename keyframes." : "重命名关键帧。", + "Renoise kernel size" : "重铺噪声大小", + "Renoise strength" : "重铺噪声强度", + "Replace or save the selected component." : "替换或保存所选组件", + "replace preview image with currently selected in gallery" : "用当前网页输出中选中的图像替换预览图像", + "Replace underscores with spaces on insertion" : "插入时用空格替换下划线", + "Replace '_' with ' '(Does not affect the function to add tokens using add_token.txt.)" : "用空格替换下划线(不影响使用 add_token.txt 添加 Token 的功能)", + "replicate" : "复制", + "Request browser notifications" : "请求浏览器通知权限", + "(requires restart)" : "(需要重启)", + "Requires the" : "需要安装", + "reroll" : "回滚", + "Reroll blank frames" : "回滚空白帧", + "reset" : "重置", + "↻ Reset" : "↻ 重置", + "Reset" : "重置", + "\uD83C\uDFA5 Reset Camera" : "\uD83C\uDFA5 重置镜头", + "Reset default (Reload UI needed to apply)" : "重置为默认值(需重载UI)", + "Reset mixer" : "重置合并设置", + "\uD83E\uDDCD Reset Pose" : "\uD83E\uDDCD 重置姿态", + "Reset Tile Size" : "重置区块大小", + "resizable" : "可缩放", + "Resize" : "缩放比例", + "Resize and fill" : "缩放后填充空白", + "Resize and Fill" : "缩放后填充空白", + "Resize by" : "重绘尺寸倍数", + "Resize height to" : "将高度调整为", + "Resize image to target resolution. Unless height and width match, you will get incorrect aspect ratio." : "将图像大小调整为目标分辨率。除非高度和宽度匹配,否则你将获得不正确的纵横比", + "Resize mode" : "缩放模式", + "Resize Mode" : "缩放模式", + "Resize seed from height" : "从高度中调整种子", + "Resize seed from width" : "从宽度中调整种子", + "Resizes image to this height. If 0, height is inferred from either of two nearby sliders." : "将图像调整到此高度。如果为0,则从附近的两个滑块中的任意一个推断其高度。", + "Resizes image to this width. If 0, width is inferred from either of two nearby sliders." : "将图像调整到此宽度。如果为0,则从附近的两个滑块中的任意一个推断其宽度。", + "Resize the image so that entirety of image is inside target resolution. Fill empty space with image's colors." : "调整图像大小,使整个图像位于目标分辨率内\n用图像的颜色填充空白区域", + "Resize the image so that entirety of target resolution is filled with the image. Crop parts that stick out." : "调整图像大小,使整个目标分辨率都被图像填充\n裁剪多余部分", + "Resize to" : "重绘尺寸", + "Resize width to" : "将宽度调整为", + "Resizing objective" : "缩放设置", + "Resolution" : "分辨率", + "Restart" : "重启", + "Restart debug" : "重启调试", + "Restart server" : "重启服务器", + "Restart UI" : "重载前端", + "Restore defaults" : "恢复默认", + "Restore Face" : "面部修复", + "Restore faces" : "面部修复", + "Restore Faces" : "面部修复", + "Restore faces after ADetailer" : "在 After Detailer 之后修复面部", + "Restore faces after ADetailer 2nd" : "在 After Detailer 之后修复面部", + "Restore faces after ADetailer 3rd" : "在 After Detailer 之后修复面部", + "Restore faces after ADetailer 4th" : "在 After Detailer 之后修复面部", + "Restore faces after ADetailer 5th" : "在 After Detailer 之后修复面部", + "Restore Faces, Tiling & more" : "面部修复,平铺图等更多选项", + "Restore Last Scene" : "恢复上次场景", + "Restore low quality faces using GFPGAN neural network" : "使用 GFPGAN 神经网络修复低质量面部", + "Restore progress" : "恢复进程", + "Restore Selected Config" : "恢复所选配置", + "Result = A" : "结果 = A", + "Result = A * (1 - M) + B * M" : "结果 = A * (1 - M) + B * M", + "Result = A + (B - C) * M" : "结果 = A + (B - C) * M", + "Results" : "结果", + "Resume Animation" : "恢复制作动画过程", + "Resume & Run from file" : "恢复动画与加载设置", + "Retouch" : "修复程度", + "Reuse original image" : "复用原图", + "Reuse seed from last generation, mostly useful if it was randomed" : "使用上一次生成的随机数种子,用于重现结果", + "Reverse model sort order" : "逆序排序", + "RGB to BGR" : "RGB 转 BGR", + "RIFE v4.6 and FILM." : "RIFE v4.6 和 FILM.", + "right" : "右", + "right-left" : "右 - 左", + "Roll Channels" : "色彩通道轮替", + "Rolling factor" : "梯度放大倍数", + "romanticism" : "romanticism (浪漫主义)", + "Rotate images (clockwise)" : "旋转图像 (顺时针)", + "run" : "运行", + "Run" : "运行参数", + "Run benchmark" : "运行基准测试", + "Run from Settings file" : "加载配置文件", + "Run Merge" : "开始合并", + "Running ebsynth.(on your self)" : "运行 Ebsynth。(自行操作)", + "Run on incomplete" : "中断后仍然运行", + "Run preprocessor" : "运行预处理", + "Run: Sampler, Width, Height, tiling, resize seed." : "运行参数: 采样器,宽度,高度,平铺图,种子大小调整", + "Run: seed, subseed, subseed strength." : "运行参数:第二种子,第二种子强度", + "safetensors" : "safetensors", + "SAG Mask Threshold" : "SAG 蒙版阈值", + "same to Strength" : "与强度相同", + "SAM Model" : "SAM 模型", + "sampler" : "采样器", + "Sampler" : "采样方法", + "Sampler parameters" : "采样器参数", + "Sampler schedule" : "采样器参数表", + "Sampler Settings" : "采样器设置", + "Sampling method" : "采样方法 (Sampler)", + "Sampling settings" : "采样器设置", + "Sampling steps" : "迭代步数 (Steps)", + "Sampling Steps" : "迭代步数 (Steps)", + "SAM requires an input image. Please upload an image first." : "SAM 需要你先上传一张图片。", + "saturation" : "饱和度", + "save" : "保存", + "\uD83D\uDCBE Save" : "\uD83D\uDCBE 保存", + "Save" : "保存", + "Save a copy of embedding to log directory every N steps, 0 to disable" : "每 N 步将 Embedding 的副本保存到日志目录,0 表示禁用", + "Save a copy of image before applying color correction to img2img results" : "在对图生图结果应用颜色校正之前保存图像副本", + "Save a copy of image before applying highres fix." : "在进行高分辨率修复前保存初始图像副本", + "Save a copy of image before doing face restoration." : "在进行面部修复前保存图像副本", + "Save all changes" : "保存所有更改", + "Save an csv containing the loss to log directory every N steps, 0 to disable" : "每 N 步保存一个包含 loss 的 csv 表格到日志目录,0 表示禁用", + "Save an image to log directory every N steps, 0 to disable" : "每 N 步保存一张图像到日志目录,0 表示禁用", + "Save as float16" : "储存半精度 (float16) 模型", + "Save as half" : "保存半精度模型", + "Save as safetensors" : "存为 SafeTensors 格式", + "Save background instead of foreground" : "保存背景而不是前景", + "Save changes" : "保存更改", + "Save copy of large images as JPG" : "将超过大小限制的图像保存JPG副本", + "Save Current Config" : "保存当前配置", + "Save current settings" : "保存当前设置", + "Save current settings as default" : "将当前设置保存为默认值", + "Save depth map" : "保存深度图", + "Save DepthMap" : "保存深度图", + "Save depth maps" : "保存深度图", + "Save generated images within tensorboard." : "在 tensorboard 中保存所生成的图像", + "Save grids to a subdirectory" : "将网格图保存到子目录", + "Save images before ADetailer" : "在进行后期细节修复前保存原始生成图片", + "Save images to a subdirectory" : "将图像保存到子目录", + "Save images with embedding in PNG chunks" : "保存嵌入 Embedding 模型的 PNG 图片", + "Save init images when using img2img" : "使用图生图时保存初始图像", + "Save JSON" : "保存为 JSON 格式", + "Save mask" : "保存蒙版", + "Save masked image" : "保存蒙版后图像", + "Save mask previews" : "保存蒙版预览", + "Save Metadata" : "保存元数据", + "Save metadata (.safetensors only)" : "保存元数据 (仅限 .safetensors)", + "save model" : "保存模型", + "Save original image" : "保存原始图像", + "Save original image with mask and bounding box" : "保存带有蒙版和箱体的原始图像", + "Save PNG" : "保存为 PNG 格式", + "\uD83D\uDCBE\uD83E\uDDCD Save Pose" : "\uD83D\uDCBE\uD83E\uDDCD 保存姿态", + "Save preprocessed" : "保存预处理", + "Save Preset" : "保存预设", + "Save Presets" : "保存预设", + "Save preview" : "保存预览", + "Save Preview(s) Frequency" : "保存预览图的频率", + "Save ranking in image's pnginfo" : "在PNG图片信息中保存评分", + "Save & Restart" : "保存并重启", + "Save Scene" : "保存场景", + "save setting" : "保存设置", + "Save Setting" : "保存设置", + "save settings" : "储存设置", + "Save Settings" : "保存设置", + "Saves Optimizer state as separate *.optim file. Training of embedding or HN can be resumed with the matching optim file." : "将优化器状态保存为单独的 optim 文件。在训练嵌入式模型或者超网格化模型时可以根据匹配上的 optim 文件恢复训练进度", + "Save style" : "将当前提示词储存为预设样式", + "save successful" : "保存成功", + "Save text information about generation parameters as chunks to png files" : "将图片生成参数保存到 PNG 文件中", + "Save textual inversion and hypernet settings to a text file whenever training starts." : "每次训练开始时保存 TI 和 Hypernetwork 设置到文本文件中", + "Save to Presets" : "保存到预设", + "Save vector to text file" : "将向量保存到文本文件", + "Save with JSON" : "保存为 JSON 格式", + "Saving images/grids" : "图片保存设置", + "Saving to a directory" : "保存到文件夹", + "Scale" : "尺度", + "Scale by" : "缩放倍数", + "Scale Factor" : "放大倍数", + "Scale to" : "缩放到", + "Scan" : "扫描", + "Scan Exif-/.txt-data (initially slower, but required for many features to work)" : "扫描图片的 Exif 信息与同名 txt 数据文件(初始读取速度较慢,许多功能都需要需要本选项启用)", + "Scan Models for Civitai" : "扫描并匹配 Civitai 模型记录", + "Scanning takes time, just wait. Check console log for detail" : "扫描需要一段时间,请耐心等待。检查控制台日志以查看详情。", + "scene" : "scene (情景)", + "schedule" : "参数表", + "scheduler type" : "调度器类型", + "sci-fi" : "sci-fi (科幻电影)", + "Scoring type" : "评分类型", + "screen" : "屏幕", + "Scribble" : "Scribble (涂鸦)", + "scribble_hed" : "scribble_hed (涂鸦 - 合成)", + "scribble_pidinet" : "scribble_pidinet (涂鸦 - 手绘)", + "scribble_xdog" : "scribble_xdog (涂鸦 - 强化边缘)", + "script" : "脚本", + "Script" : "脚本", + "Script Enabled" : "启用脚本", + "Script names to apply to ADetailer (separated by comma)" : "应用于 After Detailer 的脚本名称 (用逗号分隔)", + "scroll" : "滚动", + "sculpture" : "sculpture (雕塑)", + "sd-parseq manifest" : "sd-parseq 配置文件", + "SD VAE" : "外挂 VAE 模型", + "Seams denoise strenght" : "接缝重绘幅度", + "Seams fix" : "接缝修复", + "Seams Mask blur (offset pass only)" : "接缝蒙版边缘模糊程度 (仅偏移层)", + "Seams padding" : "接缝填充度", + "Seams Width" : "接缝宽度", + "search" : "搜索", + "Search" : "搜索", + "Search..." : "检索...", + "Search and Replace" : "搜索与替换", + "Search anything : Prompt, Size, Model, ..." : "检索任意内容: 提示词, 尺寸, 模型, ...", + "Search by alias" : "按别名检索", + "Search by translation" : "按照译文检索", + "Search for embeddings" : "检索嵌入式模型 (Embeddings)", + "Search for hypernetworks" : "检索超网络", + "Search for Loras" : "检索 Lora 模型", + "Search for LyCORIS/LoHa" : "检索 LyCORIS/LoHa 模型", + "Search for wildcards" : "检索通配符", + "Search Mode" : "搜索模式", + "Search negative prompt" : "检索反向提示词", + "Search Text" : "搜索文本", + "seascape" : "seascape (海景)", + "Secondary model (B)" : "模型 B", + "See" : "查看", + "seed" : "随机数种子 (seed)", + "Seed" : "随机数种子 (Seed)", + "Seed behavior" : "种子生成方式", + "Seed iter N" : "种子迭代量 N", + "Seed of a different picture to be mixed into the generation." : "将要参与生成的另一张图的随机种子", + "Seed schedule" : "种子数表", + "seed_schedule should start and end on the same seed." : "种子数表应该在同一种子上开始和结束。", + "See here for explanation of each parameter." : "有关每个参数的说明,请点击 这里 查看。", + "See the progress." : "查看图像增强的实时预览进程", + "Seg" : "Seg (语义分割)", + "Segment Anything" : "Segment Anything (分离图像元素)", + "Segment Anything Output" : "分离元素结果", + "Segment Anything status" : "Segment Anything 状态", + "segmentation prompt" : "图像切分提示词", + "Segmentation status" : "语义分割状态", + "seg_ofade20k" : "seg_ofade20k (语义分割 - OneFormer 算法 - ADE20k 协议)", + "seg_ofcoco" : "seg_ofcoco (语义分割 - OneFormer 算法 - COCO 协议)", + "seg_ufade20k" : "seg_ufade20k (语义分割 - UniFormer 算法 - ADE20k 协议)", + "Select a component class or specific component." : "选择一个组件类或特定组件", + "Select activation function of hypernetwork. Recommended : Swish / Linear(none)" : "超网络的激活函数。推荐 Swish / Linear (线性)", + "Select components to hide" : "选择要隐藏的组件", + "(select Disco output format)." : " (选择 Disco 输出格式) .", + "Selected" : "选择", + "(selected items appear first)" : "(选中组件优先显示)", + "Select joining char" : "选择分隔符", + "Select keyframes to be given to ebsynth." : "选择关键帧提交到 Ebsynth。", + "Select Layer weights initialization. Recommended: Kaiming for relu-like, Xavier for sigmoid-like, Normal otherwise" : "选择初始化层权重的方案。建议:类relu 用 Kaiming; 类sigmoid 用 Xavier;其它就用正态", + "Select prompt" : "选择提示词", + "Select Translater" : "选择翻译引擎", + "Select which Real-ESRGAN models to show in the web UI." : "选择在 web UI 显示的 Real-ESRGAN 模型", + "Select which Real-ESRGAN models to show in the web UI. (Requires restart)" : "选择在网页界面显示哪些 Real-ESRGAN 模型。(需重启)", + "Send dimensions to stable diffusion" : "将当前图片尺寸信息发送到生成设置", + "Send image to tag selection" : "发送到 标签 (Tag) 选择", + "Send pose to /openpose_editor_index for edit." : "发送姿态图到 openpose editor 页面编辑", + "Send prompt up" : "发送提示词到上方", + "Send seed when sending prompt or image to other interface" : "将提示词或者图像发送到其他界面时,同时传送种子数值", + "Send size when sending prompt or image to another interface" : "将提示词或者图像发送到其他界面时,同时传送图像尺寸", + "Send this image to ControlNet." : "将图片发送至 ControlNet", + "Send to" : "发送到", + "Send to Blend" : "发送到 混合", + "Send to Canvas Editor" : "发送到 Canvas Editor", + "Send to ControlNet" : "发送到 ControlNet", + "Send to Effect" : "发送到 效果", + "Send to extras" : "发送到 后期处理", + "Send to img2img" : "发送到 图生图", + "Send to img2img:" : "发送到 图生图:", + "Send to img2img ControlNet" : "发送到 图生图 ControlNet", + "Send to inpaint" : "发送到 重绘", + "Send to inpaint upload" : "发送到 重绘蒙版", + "Send to ip2p" : "发送到 图生图 pix2pix", + "Send to Layer1" : "发送到图层 1", + "Send to Layer2" : "发送到图层 2", + "Send to Layer3" : "发送到图层 3", + "Send to Layer4" : "发送到图层 4", + "Send to Layer5" : "发送到图层 5", + "Send to Multi-Merge" : "发送到 多重合并", + "Send to openOutpaint" : "发送到 openOutpaint", + "Send to txt2img" : "发送到 文生图", + "Send to txt2img:" : "发送到 文生图:", + "Send to txt2img and img2img" : "发送到 文生图和图生图", + "Send to txt2img ControlNet" : "发送到 文生图 ControlNet", + "(separate by comma)" : "(用逗号分隔)", + "Separate UNet/Text Encoder weights" : "单独设置 UNet/Text Encoder 权重", + "Separate values for X axis using commas." : "使用逗号分隔 X 轴的值", + "Separate values for Y axis using commas." : "使用逗号分隔 Y 轴的值", + "Sequential Merge Parameters" : "合并参数序列", + "Sequential XY Merge and Generation" : "顺序合并并生成 XY 图", + "Server start time" : "服务器启动时间", + "\uD83D\uDDBC Set" : "\uD83D\uDDBC 设置", + "Set \"Hires steps\" to [0], if you need" : "设置 \"高分迭代步数\" 为 [0], 如果你需要", + "Set Init tab's strength slider greater than 0. Recommended value (.65 - .80)." : "将Init选项卡的强度滑块设置为大于0。建议值(.65-.80)。", + "Set Random Pose" : "设置随机姿势", + "Set 'seed_behavior' to 'schedule' under the Seed Scheduling section below." : "在下面的“种子调度”部分下,将 “seed_behavior” 设置为 “schedule” 。", + "Set the Latent Couple extension to 2 area’s (standard setting)" : "设置 Latent Couple 插件为 2 分区域 (标准设置)", + "Set the preprocessor to [invert] If your image has white background and black lines." : "如果使用白底黑线图片,请使用 \"invert\" 预处理器。", + "Set the prompt compounder to: 2" : "设置提示词混合为: 2", + "Set the Prompt Seperator mode to: automatic" : "设置提示词分隔模式为: 自动", + "Set the Prompt Seperator mode to: prefix AND prompt + suffix" : "设置提示词分隔模式为: prefix AND prompt + suffix (前缀 AND 提示词 + 后缀)", + "Set the Prompt seperator to: AND" : "设置提示词分隔符为: AND", + "Set the strength to 0 automatically when no init image is used" : "当无初始化图像在再被使用时,强度值将自动设置为 0", + " Setting" : "设置", + "(setting entries that appear at the top of page rather than in settings tab)" : "(添加位于网页界面顶部的选项, 而不是在设置标签栏中)", + "settings" : "设置", + "Settings" : "设置", + "Settings->ControlNet->Allow other script to control this extension" : "设置->ControlNet->允许其他脚本控制此插件", + "Settings File" : "设置文件", + "Settings file Path can be relative to webui folder OR full - absolute" : "设置文件路径可以相对于 SD-WebUI 根目录,也可以是完整的绝对路径", + "settings for" : "设置。包括: ", + "Settings->Interrogate Option->Interrogate: include ranks of model tags matches in results" : "设置->反推设置->反推结果包含模型标签匹配等级", + "Settings stack. If it's not checked, it wont overwrite. Apply one, then another. Reset is old, update how you need." : "设置堆栈。如果未选中,则不会覆盖。应用一个,再应用另一个。重置已过时,请根据需要进行更新。", + "Set your total number of keyframes to be 21 more than the last inserted keyframe image." : "将关键帧总数设置为比上次插入的关键帧图像多21个。", + "SFW mode \uD83D\uDC40 (blur all images)" : "健全模式 \uD83D\uDC40 (模糊所有图像)", + "Shapes" : "形状", + "Sharpness:" : "锐化度", + "should be 2 or lower." : "应小于等于2", + "Show all pages" : "显示所有设置页", + "Show all results" : "展示所有候选标签", + "Show batch images in gradio gallerie output" : "在 Gradio Gallerie 输出中批量显示图像", + "Show batch images in gradio gallery output" : "在 Gradio Gallery 输出中批量显示图像", + "Show Button On Thumb Mode" : "在缩略图模式下显示按钮", + "Show cards for models in hidden directories" : "显示隐藏目录中的模型卡片", + "Show Civitai Link events in the console" : "在控制台输出 Civitai Link 事件", + "Show command for conversion" : "显示转换命令行", + "Show console debug" : "在控制台显示调试信息", + "Show DepthMap" : "展示深度图", + "Show extra networks" : "显示扩展模型面板", + "Show extra options" : "显示额外选项", + "Show generation progress in window title." : "在窗口标题中显示生成进度", + "Show grid in results for web" : "在网页输出结果中显示网格图", + "Show HeatMap" : "展示热力图", + "Show hidden directories" : "显示隐藏目录", + "Show/hide extra networks" : "显示/隐藏扩展模型", + "Show/Hide Generation Info" : "显示/隐藏生成信息", + "Show images zoomed in by default in full page image viewer" : "在网页全屏图像查看器中,默认放大显示图像", + "Show intermediate steps" : "显示中间步骤", + "Show live previews of the created image" : "显示当前生成图像的实时预览", + "Show live tag translation below prompt (WIP, expect some bugs)" : "在提示词下方显示实时标签翻译 (未完成,预计会有一些bug)", + "Show more info" : "显示更多信息", + "Show '?' next to tags, linking to its Danbooru or e621 wiki page (Warning: This is an external site and very likely contains NSFW examples!)" : "在 Tag 旁边显示 '?' , 链接到其 Danbooru 或 e621 维基页面(警告:外部网站可能包含 NSFW 内容!)", + "Show Preview" : "显示预览", + "Show previews of all images generated in a batch as a grid" : "通过网格图预览单个批次的所有图像", + "Show progressbar" : "显示进度条", + "Show progress indicator" : "显示进度指示器", + "Show result images" : "显示输出图像", + "Show verbose debug info at console" : "在控制台中输出详尽的调试信息", + "Show warnings in console." : "在控制台中显示警告", + "Show Width/Height and Batch sliders in same row" : "将批次与批量设置整合到长宽设置的右侧", + "shuffle" : "shuffle (随机洗牌)", + "Shuffle" : "Shuffle (随机洗牌)", + "Shuffleing tags by ',' when create texts." : "创建文本时打乱以 ',' 分割的标签", + "Shuffle tags by ',' when creating prompts." : "创建提示词时按 ',' 打乱标签(tags)", + "Shutdown server" : "关闭服务器", + "Sidebar" : "侧边栏", + "Sides" : "每边张数", + "Sigma adjustment for finding noise for image" : "为寻找图中噪点的 Sigma 调整", + "sigma churn" : "sigma churn (流失率)", + "sigma max" : "最大 Sigma", + "sigma min" : "最小 Sigma", + "sigma noise" : "sigma noise (噪声标准差)", + "Sigma noise" : "Sigma 噪声", + "Sigma Noise" : "Sigma 噪声", + "Sigma schedule" : "Sigma 值表", + "sigma tmin" : "sigma tmin (最小时间步长)", + "Simple" : "单一值", + "Simple (Auto-value)" : "单一值(自动取值)", + "Single" : "单次处理", + "single image" : "单张图片", + "Single Image" : "单张图片", + "Single process" : "单次处理", + "Size of the face when recreating" : "重建脸部的尺寸", + "Size of the thumbnails (px)" : "缩略图大小 (单位: 像素)", + "Size to generate" : "生成规格", + "sketch" : "涂鸦", + "Sketch" : "涂鸦", + "Skip" : "跳过", + "Skip generation and use (edited/custom) depthmaps in output directory when a file exists." : "当文件已存在时, 跳过生成并在输出目录中使用 (编辑后/自定义) 的深度图", + "Skip img2img processing when using img2img initial image" : "使用图生图初始图像时跳过图生图处理", + "(skip negative prompt for some steps when the image is almost ready; 0=disable, higher=faster)" : "(当图像接近生成完成时, 跳过部分步数的负面提示词影响; 0=禁用, 数值越大=越快速)", + "Skip negative prompt for steps where image is already mostly denoised; the higher this value, the more skips there will be; provides increased performance in exchange for minor quality reduction." : "对图像已经完成大部分去噪的采样步数, 跳过反向提示词; 这个值越高, 跳过的步数就越多; 以轻微的质量降低换取更高的性能", + "Skip NSFW Preview Images" : "下载预览图时跳过含成人内容的图像", + "SKip NSFW Preview images" : "下载预览图时跳过含成人内容的图像", + "SKip NSFW Preview Images" : "下载预览图时跳过含成人内容的图像", + "Skip/Reset CLIP position_ids" : "跳过或重置 CLIP position_ids 键值", + "Skip video creation" : "跳过视频生成", + "Smart subject" : "智能主题", + "Smart subject tries to determine what to and not to generate based on your subject. Example, if your Overwrite subject is formed like this: Obese man wearing a kimono" : "智能主题会尝试根据你的主题决定要生成什么和避免生成什么。\n比如说,如果你的覆盖主题是这样的格式:穿着和服的肥胖男子", + "Socket port for image browser" : "Cozy 图库浏览器的 Socket 端口", + "SoftEdge" : "SoftEdge (软边缘)", + "softedge_hed" : "softedge_hed (HED 软边缘检测)", + "softedge_hedsafe" : "SoftEdge_HEDSafe (软边缘检测 - 保守 HED 算法)", + "softedge_pidinet" : "SoftEdge_PiDiNet (软边缘检测 - PiDiNet 算法)", + "softedge_pidisafe" : "SoftEdge_PiDiNetSafe (软边缘检测 - 保守 PiDiNet 算法)", + "soft_light" : "柔光", + "solution." : "的解决方法。", + "Sort bounding boxes by" : "按以下方式对边界框进行排序", + "sort by" : "排序方式", + "Sort by" : "排序方式", + "Sort by alphabetical order" : "按首字母顺序排序", + "Sort LoRA models by" : "低秩微调 (LoRA) 模型排序方式", + "Sort Order" : "排序方式", + "Sort tags" : "排序标签", + "(so they are used as literal brackets and not for emphasis)" : "(启用后作为字面意义上的括号使用, 不起强调作用)", + "Soundtrack path" : "音轨路径", + "Source" : "来源", + "Source Checkpoint" : "源模型", + "Source directory" : "源目录", + "Source URL where this model could be found" : "该模型发布的原始网址", + "space" : "space (空格/空间艺术)", + "Specific branch name" : "特定分支名", + "specify a custom settings file and ignore settings displayed in the interface" : "指定自定义设置文件并忽略界面中显示的设置", + "Specify the amount that you wish to expand the mask by (recommend 0-10)" : "设定蒙版扩展量(建议0-10)", + "Specify the amount that you wish to expand the mask by (recommend 30)" : "设定蒙版扩展量(建议30)", + "specify your own seed schedule (found on the Keyframes page)" : "指定你自己的种子数表(可在关键帧选项卡中找到)", + "split" : "分离", + "Split based on cuts (as well)" : "基于分割进行提取(同时)", + "Split image overlap ratio" : "分割图像重叠比率", + "Split image threshold" : "图像分割阈值", + "Split over-sized images" : "分割过大的图像", + "Split oversized images" : "分割过大的图像", + "Split oversized images into two" : "将过大的图像分为两份", + "Split Video" : "分割视频", + "square" : "square (方图)", + "SSAA" : "超级采样抗锯齿", + "stability_score_offset" : "稳定性得分偏移", + "stability_score_thresh" : "稳定性得分阈值", + "stability_score_threshold" : "稳定性得分阈值", + "Stable Diffusion" : "Stable Diffusion", + "Stable Diffusion checkpoint" : "Stable Diffusion 模型", + "Stable Diffusion checkpoint autoload on server start" : "在服务器启动时自动加载 Stable Diffusion 模型", + "Stackable" : "可堆叠", + "Stackable checkbox is not used for saves, it's used when making a selection from the dropdown, whether to apply as stackable or not" : "可堆叠复选框不用于保存,它用于从下拉列表中进行选择,无论是否应用为可堆叠", + "stage 1" : "步骤 1", + "stage 2" : "步骤 2", + "stage 3" : "步骤 3", + "(Stage 3, 4, and 6 only show a guide and do nothing actual processing.)" : "(步骤 3、4和6只显示指南,不做实际的操作。)", + "stage 3.5" : "步骤 3.5", + "stage 4" : "步骤 4", + "stage 5" : "步骤 5", + "stage 6" : "步骤 6", + "stage 7" : "步骤 7", + "stage 8" : "步骤 8", + "stained glass" : "stained glass (彩色玻璃)", + "Start Auto Translate" : "开始自动翻译", + "Start batch process" : "开始批量处理", + "Start drawing" : "开始绘制", + "start extracting the input video only from this frame number" : "你所需要提取开始初始化视频的帧数", + "Start generating and upscaling!" : "开始生成并放大", + "Starting Control Step" : "引导介入时机", + "Start steps" : "开始步数", + "Start training." : "开始训练", + "Start WebUi with option --api for this to work." : "启动 WebUi 时加入 --api 启动参数来保证本标签页的功能正常工作。", + "State" : "运行状态", + "status" : "状态", + "Status:" : "状态: ", + "Std" : "标准差", + "step" : "迭代步数", + "Step" : "迭代步数", + "Steps" : "迭代步数", + "Steps schedule" : "迭代步数计划表", + "Sticker" : "贴纸", + "still life" : "still life (静物画)", + "*Stitch frames to video*" : "*将帧缝合为视频*", + "Stop" : "停止", + "Stop processing current image and continue processing." : "停止处理当前图像,并继续处理下一个", + "Stop processing images and return any results accumulated so far." : "停止处理图像,并返回迄今为止累积的所有结果", + "stop the extraction of the video at this frame number. -1 for no limits" : "你所需要提取结束初始化视频的帧数,-1 表示无限制(全部)", + "Stop XY" : "停止生成 X/Y 图", + "Store frames in ram" : "将帧保存到内存", + "Store preferences and SVG content locally" : "在本地保存设置和SVG图像", + "storybook realism" : "storybook realism (故事书写实主义/迪士尼艺术)", + "straight-line" : "直线", + "street art" : "street art (街头艺术)", + "streetscape" : "streetscape (街景)", + "strength" : "强度", + "Strength" : "强度", + "Strength 0 no init" : "强度为 0 时停用初始化", + "Style 1" : "模版风格 1", + "Style 2" : "模版风格 2", + "Styles" : "预设样式", + "Sub directory depth" : "子目录深度", + "Sub-folder" : "子文件夹", + "Subject Types" : "主题类型", + "Submit" : "提交", + "Submit results" : "提交结果", + "SubSeed" : "第二种子", + "Subseed schedule" : "第二种子参数表", + "Subseed strength schedule" : "第二种子强度参数表", + "Sum" : "和", + "sum Twice:(A*(1-alpha)+B*alpha)*(1-beta)+C*beta" : "两次求和: (A*(1-α)+B*α)*(1-β)+C*β", + "SuperMerger" : "超级模型融合", + "Supported engines:" : "支持的引擎:", + "Supports boolean operations: (! - negation, & - and, | - or, ^ - xor, \\ - difference, () - nested operations)" : "支持布尔操作符:(!-否定/取反,&-与,|-或,^-异或,\\-差分,()-嵌套操作)", + "surrealism" : "surrealism (超现实主义)", + "Swap axes" : "互换坐标轴", + "Swap hotkey combinations for Zoom and Adjust brush resize" : "交换缩放和调整画笔大小的热键组合", + "Swap X/Y axes" : "X/Y 轴互换", + "Swap X/Z axes" : "X/Z 轴互换", + "Swap Y/Z axes" : "Y/Z 轴互换", + "Swipe left/right navigates to the next image" : "左右滑动时导航到下一张图片", + "Switch prompt between Native language and English" : "切换提示词显示语言 (母语/英语)", + "Switch to Inpaint Upload" : "发送到 重绘蒙版", + "symbolism" : "symbolism (象征主义)", + "Sysinfo" : "系统信息", + "System" : "系统设置", + "System data" : "系统信息", + "System Info" : "系统信息", + "T2IA" : "T2IA (自适应)", + "t2ia_color_grid" : "T2ia_Color_Grid (自适应 色彩像素化处理)", + "t2ia_sketch_pidi" : "T2ia_Sketch_PiDi (自适应 手绘边缘处理)", + "t2ia_style_clipvision" : "T2ia_Style_Clipvision (自适应 风格迁移处理)", + "tab" : "选项卡", + "Tag Autocomplete" : "标签自动补全", + "Tag confidents" : "标签置信度", + "Tag filename" : "选择使用的标签文件名", + "Tagger" : "WD 1.4 标签器 (Tagger)", + "Tagging" : "打标", + "Tagging Confidence Threshold" : "标签置信度阈值", + "Tag images" : "多图打标", + "Tag one image" : "单图打标", + "Tags" : "标签", + "Target Folder" : "目标文件夹", + "Target language" : "目标语言", + "Target Language" : "目标语言", + "Target tokens (comma separated)" : "分隔目标提示词(逗号分隔)", + "Task History" : "任务历史", + "Task Queue" : "任务队列", + "Tattoo" : "纹身", + "temparature" : "色温", + "Temporal-Warp" : "Temporal 修复", + "TEnc Weight 1" : "Text Encoder 权重 1", + "TEnc Weight 2" : "Text Encoder 权重 2", + "TEnc Weight 3" : "Text Encoder 权重 3", + "TEnc Weight 4" : "Text Encoder 权重 4", + "TEnc Weight 5" : "Text Encoder 权重 5", + "Tertiary model (C)" : "模型 C", + "TEST-MAX-ALL" : "全部测试", + "Textbox" : "文本框", + "text encoder" : "文本编码器", + "Text files directory (optional, will load from input dir if not specified)" : "文本文件目录 (可选, 如不指定将从输入目录加载)", + "Text files directory (Optional, will load from input dir if not specified)" : "文本文件目录 (可选, 如不指定将从输入目录加载)", + "textile" : "textile (纺织艺术)", + "Text input" : "文本输入", + "Textual Inversion" : "嵌入式(T.I. Embedding)", + "The 1st and last keyframe images should match." : "第一个和最后一个关键帧图像应该匹配。", + "The algorithm is not able to enhance all images." : "本算法不能增强所有图像", + "The annotator directory inside the SAM extension directory is only a symbolic link. This is to save your space and make the extension repository clean." : "SAM 扩展目录中的解释器目录只是符号链接。这样能够节省你的硬盘空间,并使扩展库更加有序。", + "The code for this extension:" : "本插件的源码仓库: ", + "The current workflow is [text prompt]->[object detection]->[segmentation]. Semantic segmentation support is in Auto SAM panel." : "目前的工作流是 [文本提示词]->[对象检测]->[语义分割]。语义分割支持在自动 SAM 面板中。", + "The denoising curve controls the rate of denoising strength change each loop. Aggressive: Most of the change will happen towards the start of the loops. Linear: Change will be constant through all loops. Lazy: Most of the change will happen towards the end of the loops." : "重绘幅度曲线控制每次处理的重绘幅度变化率\n激进: 处理的 开始阶段 大规模变动重绘幅度\n线性: 处理的 全部阶段 重绘幅度变化率一致\n保守: 处理的 结束阶段 大规模变动重绘幅度", + "The denoising strength for the final loop of each image in the batch." : "每一批次中每个图像的最终循环时的重绘幅度", + "The difference between the last two models will be added to the first. Requires three models; A, B and C. The result is calculated as A + (B - C) * M" : "后两个模型的差值将叠加在主要模型上。需要输入 A、B、C 三个模型。计算公式为 A + (B - C) * M", + "the directory in which your mask video is located." : "你所需要使用的视频蒙版路径", + "the directory / URL at which your video file is located for Video Input mode only" : "视频文件所在的目录/链接,仅适用于视频输入模式", + "The existing prompt and negative prompt fields are ignored." : "会使现有的正向提示词和反向提示词段被忽略。", + "The frames per second that the video will run at" : "视频的每秒播放帧数", + "The height of the output images, in pixels (must be a multiple of 64)" : "输出图像的高度(像素)(必须能整除于 64)", + "then use" : "然后使用", + "The other site allows for making keyframes using" : "另一方面,允许关键帧使用 ", + "the path to a custom settings file" : "自定义设置文件的路径", + "the path to your init image" : "初始化图像的路径", + "the path to your mask image" : "蒙版文件的路径", + "the path/ URL to an audio file to accompany the video" : "视频附带的音频文件的路径 / 链接", + "The process of creating a video can be divided into the following stages." : "创作视频需要以下几个步骤。", + "There are a lot of special things build in, based on various research papers. Just try it, and let it surprise you." : "根据各种研究论文构建了许多特殊效果。尽管试一下,让它给你带来惊喜。", + "There are an immense number of image types, not only paintings and photo's, but also isometric renders and funko pops.\nYou can however, overwrite it with the most popular ones." : "大量的图像类型,不仅有画作和照片,还有 等距/等轴渲染 和 Funko Pops (玩具人偶) 。\n不过你可以用最流行的图像类型覆盖它。", + "There is *no* Batch mode like in vanilla deforum. Please Use the txt2img tab for that." : "本插件没有批处理模式,请使用文生图选项卡。", + "The results are stored in timestamp_prompts.txt." : "将结果保存在 timestamp_prompts.txt 中。", + "the roll effect angle" : "所旋转的角度(X轴,一般性指水平)", + "These can be used to add textual inversion and LoRA’s. They can also be used to add your models trigger words." : "这里用来添加 嵌入式(T.I. Embedding) 和 LoRA 。同样可以用来添加模型触发词。", + "the seed value will increment by 1 for each subsequent frame of the animation" : "对于动画的每个后续帧,种子数将增加 1", + "the seed will remain fixed across all frames of animation" : "动画中所有帧的随机种子将被固定", + "the tilt effect angle" : "所翻转的垂直角度(Y轴)", + "The untranslated characters will be translated automatically and will not affect the old translations. Use the function in the lower right corner to easily check and quickly modify the current translation.1,Save the setting;2,Click start button;3,Reload your browser." : "未翻译的提示词将自动翻译,不会影响已翻译过的提示词。使用右下方的功能按钮可以快速检查和修改当前的翻译。1.保存设置;2.点击启动按钮;3.重载浏览器。", + "The WebSocket is currently" : "WebSocket 当前状态为", + "the whole folder, generated before, not just the output folder" : "提前建立好的整个工程目录,而不仅仅是输出文件夹", + "The width of the output images, in pixels (must be a multiple of 64)" : "输出图像的宽度(像素,必须能整除于 64)", + "Third column (reference) image" : "第三列 (参考) 图像", + "[this]" : "[这里]", + "This generator will generate a complete full prompt for you, based on randomness. You can increase the slider, to include more things to put into the prompt. \nRecommended is keeping it around 3-7. Use 10 at your own risk." : "本生成器会根据随机等级为你生成一段完整的提示词。可以通过滑块提高数值,以在提示词中包含更多的东西。\n建议保持在3-7左右。使用10的话后果自负。", + "This is an extra stage." : "这是一个额外的步骤。", + "This is ignored if neither batch run or ebsynth are checked" : "如果批量处理或 Ebsynth 模式都没有被选中,此项将被忽略", + "(this is optional. Perform color correction on the img2img results and expect flickering to decrease. Or, you can simply change the color tone from the generated result.)" : "(此步骤可选。对图生图的结果进行颜色校正,可能会减少视频闪烁。或者,你也可以简单地在生成结果中调色。)", + "This page allows you to change default values in UI elements on other tabs." : "本页面允许你去修改其它标签页中的 UI 默认设置", + "This panel is for those who want to upload mask to ControlNet inpainting. It is not part of the SAM feature. It might be removed someday when ControlNet support uploading image and mask. It serves as a temporarily workaround to overcome the unavailability of image with mask uploading feature in ControlNet extension." : "此面板是为想把蒙版上传到 ControlNet 重绘的人准备的。这不是 SAM 的功能。当某天 ControlNet 支持上传图像和蒙版时,此功能可能会删除。这是一个临时解决方案,以解决 ControlNet 不能上传蒙版的问题。", + "This preset affects?" : "该预设中包含?", + "This regular expression will be used extract words from filename, and they will be joined using the option below into label text used for training. Leave empty to keep filename text as it is." : "该正则表达式将用于从文件名中提取单词,并将它们合并到用于训练的标签文本中。留空以保持文件名文本不变。", + "This requires Controlnet 1.1 extension and the tile resample model, install this if you haven't\nIn settings for Controlnet, enable \"Allow other script to control this extension\"" : "这需要 ControlNet 1.1 插件和 tile resample 预处理器对应的模型,如果没有请安装!\n在设置页面的 ControlNet 设置中启用 ”允许其它脚本控制本插件“ 。", + "This requires the Ultimate SD Upscale extension, install this if you haven't" : "这需要 Ultimate SD Upscale 插件,如果没有请安装!", + "This string will be used to join split words into a single line if the option above is enabled." : "如果启用了上述选项,则此处的字符会用于将拆分的单词接合为同一行", + "this subreddit" : "此页面", + "This was originally a bug in the first release when using multiple batches, now brought back as a feature.\nRaised by redditor drone2222, to bring this back as a toggle, since it did create interesting results. So here it is." : "这原本是第一个版本中使用多批次时的一个 bug ,现在作为一个功能回归。\n由 redditor: drone2222提出,让它作为一个切换选项功能回归,因为它确实创造了有趣的结果。就是这样一个功能。", + "This way, you can create unlimited variants of a subject." : "通过这种方法,你可以创建同一个主题的无数变种图像。", + "This way, you don’t ever have to add it manually again. This file won’t be overwritten during upgrades." : "通过这个方法,就不需要每次都手动添加。这个文件不会在本插件更新时被覆盖。", + "Those settings are heavy on DOM modification and might conflict with some others extensions" : "这些设置对 DOM 修改程度很大, 可能与其它扩展冲突", + "threshold" : "threshold (阈值)", + "Threshold" : "阈值", + "Threshold A" : "阈值 A", + "Threshold B" : "阈值 B", + "Thresholding Mode" : "阈值模式", + "Threshold of delta frame edge" : "增量帧边缘阈值", + "Threshold schedule" : "阈值表", + "Threshold Value Lower" : "阈值下限", + "Threshold Value Upper" : "阈值上限", + "thumbs" : "缩略视图", + "Tile" : "Tile (分块)", + "tile_colorfix" : "tile_colorfix (分块 - 固定颜色)", + "tile_colorfix+sharp" : "tile_colorfix+sharp (分块 - 固定颜色 + 锐化)", + "tile division BG Removers" : "分块化背景去除", + "tile_gaussian" : "Tile_Gaussian (拼贴画模糊处理)", + "tile height" : "分块高度", + "Tile height" : "分块高度", + "Tile overlap" : "分块重叠像素宽度", + "Tile overlap for ESRGAN upscalers." : "ESRGAN 超分辨率的分块块重叠像素大小", + "Tile overlap for SCUNET upscalers." : "SCUNET 超分辨率的分块块重叠像素大小", + "Tile overlap, in pixels for ESRGAN upscalers. Low values = visible seam." : "ESRGAN 超分辨率的分块块重叠像素大小。数值越低意味着分块间的接缝越明显", + "Tile overlap, in pixels for SCUNET upscalers. Low values = visible seam." : "SCUNET 超分辨率的分块重叠像素大小。数值越低意味着分块间的接缝越明显", + "Tile overlap, in pixels for SwinIR. Low values = visible seam." : "SwinIR 的分块重叠像素大小。数值越低意味着分块间的接缝越明显", + "tile_resample" : "tile_resample (分块 - 重采样)", + "Tile size for all SwinIR." : "适用所有 SwinIR 系算法的分块尺寸", + "Tile size for ESRGAN upscalers." : "ESRGAN 使用的分块尺寸", + "Tile size for ESRGAN upscalers. 0 = no tiling." : "ESRGAN 使用的分块尺寸 。数值设为0意味着不分块", + "Tile size for SCUNET upscalers." : "SCUNET 超分辨率的分块尺寸", + "Tile size for SCUNET upscalers. 0 = no tiling." : "SCUNET 超分辨率的分块尺寸。数值设为0意味着不分块", + "tile width" : "分块宽度", + "Tile width" : "分块宽度", + "Tiling" : "平铺图 (Tiling)", + "Time" : "时间", + "Time in ms to wait before triggering completion again (Requires restart)" : "再次显示自动补全标签的等待时间 (单位: 毫秒) (需保存并重启UI)", + "timestamp" : "时间戳", + "Tips" : "小提示", + "title" : "标题", + "to" : "到", + "To apply, go to quick set. Save now works immediately in other tab without restart, filters out non-common between tabs." : "要应用,请转到快速设置。现在保存可以立即在其他选项卡中工作,无需重新启动,过滤掉选项卡之间的不常见内容。", + "to discuss about Cozy Nest" : "去讨论关于 Cozy Nest 的话题~", + "To enable, check use_mask in the Init tab" : "如果需要启用,请检查初始化选项卡中启用蒙版选项是否其启用", + "to (full path)" : "到 (输入完整路径)", + "Toggle overlap ( Technical button, neededs for testing )" : "重叠切换 (技术性快捷键, 用于测试)", + "Token" : "词元", + "Tokenize" : "拆分词元", + "Token Length" : "词元长度", + "Token Merging" : "高分修复TOME", + "Token Merging - Max downsample" : "TOME - 最大降采样", + "Token merging ratio" : "Token 合并比率", + "Token Merging - Ratio" : "TOME 合并比率", + "Token merging ratio for high-res pass" : "高分层的 Token 合并比率", + "Token merging ratio for img2img" : "图生图的 Token 合并比率", + "To Language" : "目标语言", + "ToMe for Hires. fix" : "为 Hires. fix 启用 ToMe 优化", + "ToMe Merging Ratio" : "ToMe 合并比率", + "Toolkit" : "模型工具箱", + "top" : "顶部", + "top-bottom" : "上 - 下", + "top_centered" : "顶部居中", + "to share your creations and suggestions." : "来分享你的创意和提出意见.", + "(Total)" : "(合计)", + "Train" : "训练", + "Train an embedding or Hypernetwork; you must specify a directory with a set of 1:1 ratio images" : "训练嵌入式或超网络模型;必须指定一个具有一组 1:1 宽高比图像的数据集目录", + "Train EMA" : "训练 EMA", + "Train Embedding" : "训练嵌入式模型", + "Train Hypernetwork" : "训练超网络", + "training" : "训练相关", + "Training" : "训练", + "Training info" : "训练信息", + "Training parameters" : "训练参数", + "Train Model" : "训练模型", + "Train Text Encoder" : "训练文本编码器", + "Trajectory" : "运动轨迹", + "Transform Center X" : "旋转中心点 X 轴", + "Transform Center Y" : "旋转中心点 Y 轴", + "translate" : "翻译", + "Translate" : "翻译", + "Translated Negative Prompt" : "反向提示词翻译", + "Translated Prompt" : "提示词翻译", + "Translate Negative Prompt" : "翻译反向提示词", + "Translate Prompt" : "翻译提示词", + "Translate: x, y, z" : "移动幅度:x, y, z", + "Translation display order" : "翻译显示顺序", + "Translation filename" : "翻译文件名", + "Translation file uses old 3-column translation format instead of the new 2-column one" : "翻译文件使用旧的三栏式翻译格式,而不是新的二栏式格式", + "Translation First" : "译文在上", + "Translation Service Setting" : "翻译服务设置", + "Translation X" : "平移 X", + "Translation Y" : "平移 Y", + "Translation Z" : "平移 Z", + "Transparent" : "透明", + "[transparent-background]" : "[透明背景]", + "transparent-background" : "透明背景", + "transparent-background AND clipseg" : "透明背景和CLIP分割", + "transparent-background options" : "透明背景选项", + "Transparent PNG" : "透明PNG", + "Triple sum:A*(1-alpha-beta)+B*alpha+C*beta" : "三重加权和: A*(1-α-β)+B*α+C*β", + "Truncate tags by token count" : "按词元长度截断标签", + "Truncate tags by token count." : "按词元长度截断标签", + "Turn on pin_memory for DataLoader. Makes training slightly faster but can increase memory usage." : "为数据加载器 (DataLoader) 启用 pin_memory 参数,以提升内存占用的代价提高训练速度", + "Tweening frames schedule" : "中间计算帧参数表", + "txt2img" : "文生图", + "TXT2IMG" : "文生图", + "txt2img-grids" : "文生图 (网格)", + "txt2img history" : "文生图历史记录", + "txt2img/img2img UI item order" : "文生图/图生图界面参数组件顺序", + "Type" : "类型", + "type of image" : "图像类型", + "UI related" : "UI 界面相关", + "UI tab order" : "UI 标签栏顺序", + "ui text" : "UI 文本", + "ukiyo-e" : "ukiyo-e (浮世绘)", + "ultrawide" : "ultrawide (超宽图)", + "Uncheck all copies" : "取消勾选所有选择", + "U-Net features" : "U-Net 特征值", + "UNet Weight 1" : "UNet 权重 1", + "UNet Weight 2" : "UNet 权重 2", + "UNet Weight 3" : "UNet 权重 3", + "UNet Weight 4" : "UNet 权重 4", + "UNet Weight 5" : "UNet 权重 5", + "Unfreeze seed" : "不固定种子", + "Unified Predictor-Corrector Framework for Fast Sampling of Diffusion Models" : "用于扩散模型快速采样的统一预测-校正框架", + "uniform" : "均匀", + "UniPC lower order final" : "最后几步采样应用低阶 UniPC 采样方法", + "UniPC order" : "UniPC 低阶步数", + "UniPC Order" : "UniPC 低阶步数", + "UniPC order (must be < sampling steps)" : "UniPC 的预测校正次数 (需小于采样步数)", + "UniPC skip type" : "UniPC 跳过类型", + "UniPC variant" : "UniPC 变体", + "unknown" : "未知", + "Unload" : "卸载", + "Unload all interrogate models" : "卸载所有反推模型", + "Unload all models from memory" : "从内存中卸载所有模型", + "unload model" : "卸载模型", + "Unload model after running" : "反推完成后卸载模型", + "Unload models" : "卸载模型", + "Unload SD checkpoint to free VRAM" : "卸载 Stable Diffusion 模型以释放显存", + "Unload VAE and CLIP from VRAM when training" : "训练时从显存中卸载 VAE 和 CLIP 模型", + "Unnecessary Javascript file" : "多余的 Javascript 文件", + "unzip the file to" : "将文件解压缩到", + "up" : "上", + "Upcast cross attention layer to float32" : "将交叉关注层向上转换到 float32", + "Upcast cross attention layer to FP32" : "将交叉关注层向上转换到 FP32", + "update" : "更新", + "Update" : "更新", + "Update directory names in database" : "更新数据库中的文件夹名字", + "Update installed extensions" : "更新已安装扩展", + "update list" : "更新列表", + "Update Mask" : "更新蒙版", + "uploaded video FPS" : "上传视频的帧率", + "uploaded video resolution" : "上传视频的分辨率", + "uploaded video total frame count" : "上传视频的总帧数", + "Upload mask" : "上传蒙版图片", + "Upload mask image" : "上传蒙版图片", + "Upload Mask to ControlNet Inpainting" : "上传蒙版到 ControNet 重绘", + "Upload prompt inputs" : "上传提示词输入文件", + "Upper Arm" : "上臂长度", + "Upscale" : "图像放大", + "Upscale Before Restoring Faces" : "放大后再进行面部修复", + "Upscale by" : "放大倍数", + "Upscale factor" : "放大倍数", + "Upscale height" : "放大高度", + "Upscale image with IMG2IMG" : "通过图生图放大图像", + "Upscale model" : "超分模型", + "Upscaler" : "放大算法", + "upscaler 1" : "放大算法 1", + "Upscaler 1" : "放大算法 1", + "upscaler 2" : "放大算法 2", + "Upscaler 2" : "放大算法 2", + "Upscaler 2 vis." : "放大算法 2 可见程度", + "Upscaler 2 visibility" : "放大算法 2 强度", + "Upscale ratio" : "放大倍率", + "Upscale resize" : "放大倍数", + "Upscaler for img2img" : "图生图放大算法", + "*Upscale uploaded video*" : "*放大已上传的视频*", + "Upscale width" : "放大宽度", + "Upscaling" : "放大", + "URL" : "地址", + "URL for extension's git repository" : "扩展的 git 仓库网址", + "Use" : "使用 ", + "Use alpha as mask" : "启用透明度蒙版", + "Use an" : "使用一个", + "Use an empty output directory to save pictures normally instead of writing to the output directory." : "输出图像到一个空目录,而非设置里指定的输出目录", + "Use another image as ControlNet input" : "使用另外的图像输入 ControlNet", + "Use another image as mask" : "使用另外的图像作为遮罩", + "Use a two step process to partially create an image at smaller resolution, upscale, and then improve details in it without changing composition" : "两步生成\n以较小的分辨率生成初步图像后再放大\n然后在不改变构图的情况下改善细节", + "Use BLIP for caption" : "使用 BLIP 生成标签 (自然语言)", + "Use Control Net inpaint model" : "使用 ControlNet 的 inpait 模型", + "Use CPU for SAM" : "使用 CPU 进行 SAM 处理", + "Use CPU Only (SLOW)" : "只用 CPU (很慢)", + "Use cross attention optimizations while training" : "训练时开启 Cross Attention 优化", + "Use custom colors" : "使用自定义颜色", + "Use custom DepthMap" : "使用自定义深度图", + "Use deepbooru for caption" : "使用 Deepbooru 生成标签", + "Use delta values for movement parameters" : "使用增量值作为运动参数", + "Use Depth Map If exists in /video_key_depth" : "使用深度图(如果存在/video_key_depth目录)", + "Use different seed for each picture" : "为每张图片使用不同随机种子", + "Use dropdown for sampler selection instead of radio group" : "采样器列表处使用下拉菜单取代单选框", + "Use dropout" : "使用 dropout", + "Use EMA for finetuning" : "使用 EMA 权重进行微调", + "use Face Crop img2img" : "使用图生图脸部修复", + "Use Fast Mode(It will be faster, but the quality of the mask will be lower.)" : "使用快速模式(它会更快,但蒙版质量会较低)。", + "Use half floats" : "启用半精度浮点", + "Use init" : "使用初始化", + "Use inpaint width/height" : "启用自定义重绘宽高", + "Use input image's alpha channel as mask" : "使用输入图像的透明度通道作为遮罩", + "Use Jit" : "使用实时产出模式", + "Use local groundingdino to bypass C++ problem" : "使用本地 Groundingdino 以绕过 C++ 问题", + "Use Lora in uc diffusion model" : "在反向扩散模型中使用 LoRA", + "Use Lora in uc text model encoder" : "在反向文本编码器中使用 LoRA", + "Use lossless compression for webp images" : "对 WebP 图像使用无损压缩", + "Use LyCoris handler for all Lora types" : "使用 LyCORIS 处理器加载所有 Lora 模型", + "Use main sampler" : "使用文生图采样方法", + "Use mask" : "使用蒙版", + "Use mask as output alpha channel" : "使用遮罩作为透明度通道输出", + "Use mask video" : "使用视频蒙版", + "use MBW" : "使用分块合并", + "Use mid-control on highres pass (second pass)" : "进行高分辨率修复时使用中间层控制 (mid-control)", + "Use minimal area for face selection" : "用最小面积进行脸部选择", + "Use noise mask" : "使用噪点蒙版", + "Use old emphasis implementation. Can be useful to reproduce old seeds." : "使用旧的强调符号解析器,可用于复现早期种子结果 (2022-09-29)", + "Use old karras scheduler sigmas (0.1 to 10)." : "对于 Karras 调度器使用旧的 sigma 值范围 (0.1 - 10) (2023-01-01)", + "Use only-mid-control on high-res. fix (second pass)" : "在高分辨率修复 (第二通道) 中仅使用中间层 (mid-control) 控制", + "Use optimized images in the thumbnail interface (significantly reduces the amount of data transferred)" : "在缩略图界面中使用优化的图像 (显著减少传输数据量)", + "Use original name for output filename during batch process in extras tab" : "在后期处理选项卡中的批量处理过程中,使用原始名称作为输出文件名", + "Use PNG alpha channel as loss weight" : "使用 PNG 图片的透明通道作为 loss 权重", + "Use Preprocess image If exists in /controlnet_preprocess" : "使用预处理图像(如果存在/controlnet_preprocess目录)", + "Use prompt from preview image" : "一键使用本模型预览图所使用的提示词", + "Use random seeds for sub-generations when doing a rolling generation (WARNING!!! The result will be non-deterministic!!!)" : "在进行梯度放大倍数生成时, 对子代生成应用随机种子 (警告!!! 图像结果随机无法复现!!!)", + "Use raw CLIP token to calculate token count (without emphasis or embeddings)" : "使用原始 CLIP 词元数计算词元长度(不含 emphasis 或 embeddings)", + "Use recursive with glob pattern" : "使用 glob 模式递归搜索", + "Use recycle bin when deleting images" : "将删除的图片放入回收站而非直接彻底删除", + "Use regex" : "使用正则表达式", + "User interface" : "用户界面", + "username" : "用户名", + "Username" : "用户名", + "Uses aesthetic image scorer extension to check the quality of the image." : "使用 aesthetic image scorer (美学图像评分) 插件来检测图像质量", + "Use same random seed for all lines" : "每行输入都使用同一个随机种子", + "Use same sampler" : "使用相同采样方法", + "Use separate CFG scale" : "使用独立的提示词引导系数", + "Use separate CFG scale 2nd" : "使用独立的提示词引导系数", + "Use separate CFG scale 3rd" : "使用独立的提示词引导系数", + "Use separate CFG scale 4th" : "使用独立的提示词引导系数", + "Use separate CFG scale 5th" : "使用独立的提示词引导系数", + "Use separate steps" : "使用独立迭代步数", + "Use separate steps 2nd" : "使用独立迭代步数", + "Use separate steps 3rd" : "使用独立迭代步数", + "Use separate steps 4th" : "使用独立迭代步数", + "Use separate steps 5th" : "使用独立迭代步数", + "Use separate width/height" : "使用独立重绘宽高", + "Use separate width/height 2nd" : "使用独立重绘宽高", + "Use separate width/height 3rd" : "使用独立重绘宽高", + "Use separate width/height 4th" : "使用独立重绘宽高", + "Use separate width/height 5th" : "使用独立重绘宽高", + "Use Smart-Steps" : "优化迭代次数", + "Use Space Instead Of _" : "使用 \"空格 \" 代替 \"下划线_\"", + "Use spaces instead of underscore" : "使用空格代替下划线", + "Uses your" : "使用你的", + "Use tags like [seed] and [date] to define how filenames for images are chosen. Leave empty for default." : "使用[seed]和[date]等标记来选择如何定义图像的文件名。留空使用默认值", + "Use tags like [seed] and [date] to define how subdirectories for images and grids are chosen. Leave empty for default." : "使用[seed]和[date]等标记来选择如何定义图像和网格的子目录。留空使用默认值", + "Use Text Escape" : "使用文本转义", + "(use (text) to make model pay more attention to text and [text] to make it pay less attention)" : "(使用 (提示词) 使模型更关注该文本, 使用 [提示词] 减少其关注度)", + "Use the negative_prompts field to automatically append all words as a negative prompt. *Don't* add --neg in the negative_prompts field!" : "使用 negative_prompts 字段自动将所有单词附加为反向提示词,不要在 negative_prempts 字段中添加 --neg !", + "Use this negative prompt" : "使用此框填写的反向提示词", + "Use this when scanning can not find a local model on civitai" : "无法通过扫描获取本地模型信息时使用此功能", + "Use Ultimate SD Upscale script instead" : "使用 Ultimate SD Upscale 脚本作为替代", + "Use upscaler name as filename suffix in the extras tab" : "后期处理时将超分算法名称添加到文件名后缀中", + "Use via API" : "使用 via API", + "VAE Checkpoints to cache in RAM" : "保留在内存中的 VAE 模型数量", + "Variation seed" : "变异随机种子", + "Variation strength" : "变异强度", + "Vectors" : "向量", + "Vector Studio" : "Vector Studio - 矢量工作室", + "verbose console output" : "将详细信息输出到控制台", + "version" : "版本", + "Version" : "版本", + "Vertical" : "垂直", + "Vertical Mirroring" : "垂直镜像", + "vertical split num" : "垂直分割数", + "Very cheap approximation. Very fast compared to VAE, but produces pictures with 8 times smaller horizontal/vertical resolution and extremely low quality." : "性能很好的近似值。与VAE相比速度非常快,但生成的图片的水平/垂直分辨率是VAE的八分之一,质量极低", + "vibrant" : "vibrant (自然饱和度)", + "Vid2depth" : "视频转深度", + "Video" : "视频", + "Video Depth" : "视频深度", + "Video Init" : "视频初始化", + "Video init path" : "初始化视频路径", + "video_init_path, extract_nth_frame, overwrite_extracted_frames" : "初始视频路径, 提取第N帧, 覆盖提取帧", + "Video Input" : "视频输入 ", + "video_input mode only, enables the extraction and use of a separate video file intended for use as a mask. White areas of the extracted video frames will not be affected by diffusion, while black areas will be fully effected. Lighter/darker areas are affected dynamically." : "仅视频输入模式使用,提取和使用单独的视频文件作为蒙版。提取的视频帧的白色区域将不受生成器的影响,而黑色区域将完全受到影响。较亮/较暗的区域会受到动态影响。", + "Video mask path" : "视频蒙版路径", + "Video output" : "视频输出", + "Video Output Settings" : "视频输出设置", + "Video to get Depth from" : "从视频中获取深度", + "Video to Upscale" : "待放大视频", + "Video Upscaling" : "视频放大", + "View changes" : "查看更改", + "View the wiki for usage tips." : "点击查看 Wiki 获取使用说明", + ". Visit" : " 分隔。查看", + "Visualize" : "可视化预览", + "Visualize Cross-Attention" : "Cross-Attention 可视化", + "Visual style" : "视觉风格", + "vivid_light" : "亮光", + "VRAM usage polls per second during generation." : "生成图像时, 每秒查询显存 (VRAM) 使用情况的次数", + "VRAM usage polls per second during generation. Set to 0 to disable." : "生成图像时,每秒查询显存 (VRAM) 使用情况的次数。设置为 0 可禁用", + "WARNING : Settings are immediately applied but will not be saved until you click \"Save\"" : "警告:设置修改后会立即应用,但在点击“保存”之前不会被保存", + "WARNING : Some visual settings are immediately applied but will not be saved until you click \"Save\"" : "警告: 部分视觉设置修改后会立即应用, 但在点击 ”保存“ 之前不会被保存", + "watercolor" : "watercolor (水彩)", + "Waves color" : "波形颜色", + "WebUI State" : "WebUI 状态", + "Weight" : "权重", + "Weight 1" : "权重 1", + "Weight 2" : "权重 2", + "Weight 3" : "权重 3", + "Weight 4" : "权重 4", + "Weight 5" : "权重 5", + "Weighted sum" : "加权和", + "Weights" : "权重", + "weights alpha" : "权重 α", + "Weights alpha" : "权重 α", + "weights beta" : "权重 β", + "Weights beta" : "权重 β", + "Weights Presets" : "权重预设", + "Weights setting" : "权重设置", + "Weights Setting" : "权重设置", + "Weight sum:A*(1-alpha)+B*alpha" : "加权和: A*(1-α)+B*α", + "Weight values" : "权重值", + "Weight_values" : "权重值", + "What to put inside the masked area before processing it with Stable Diffusion." : "在使用 Stable Diffusion 处理蒙版区域前在其中放置什么", + "When adding extra network such as Hypernetwork or Lora to prompt, use this multiplier for it." : "当添加扩展模型 (如 Hypernetwork 或 Lora) 到提示词中时,默认使用此倍率。", + "When adding to prompt, refer to lora by" : "在添加到提示词时,通过以下格式提及lora", + "When adding to prompt, refer to Lora by" : "将扩展模型添加到提示词时,通过以下格式提及lora", + "when checked, do not output a video" : "启用时, 不输出视频", + "when enabled, will re-extract video frames each run. When using video_input mode, the run will be instructed to write video frames to the drive. If you’ve already populated the frames needed, uncheck this box to skip past redundant extraction, and immediately start the render. If you have not extracted frames, you must run at least once with this box checked to write the necessary frames." : "启用时,将在每次运行时重新提取视频帧。使用video_input模式时,运行程序将视频帧写入驱动器。如果已经填充了所需的帧,请取消选中此框以跳过多余的提取,然后立即开始渲染。如果尚未提取帧,则必须在选中此框的情况下至少运行一次,以写入必要的帧。", + "When loading models attempt stream loading optimized for slow or network storage" : "为低速硬盘或网络存储使用流式模型加载优化", + "When loading models attempt to reuse previous model dictionary" : "加载模型时尝试复用上一模型的字典", + "(when reading generation parameters from text into UI)" : "(适用于从文本中读取生成参数并应用到用户界面时)", + "(when reading generation parameters from text into UI))" : "(适用于从文本中读取生成参数并应用到用户界面时)", + "When reading generation parameters from text into UI (from PNG info or pasted text), do not change the selected model/checkpoint." : "当从 PNG 图片信息或粘贴文本读取生成参数到用户界面时,不根据参数更改当前选定模型", + "When searched" : "检索时", + "(\"When searched\" option will only show the item when the search string has 4 characters or more)" : "(\"检索时\" 选项只有当搜索字符串有4个或更多字符时, 才会显示隐藏栏目)", + "when this box is checked, and FFMPEG mp4 is selected as the output format, an audio file will be multiplexed with the video." : "选中此框并以 FFMPEG mp4 为输出格式时, 音频文件将与视频复用", + "When using 'Save' button, only save a single selected image" : "使用“保存”按钮时,只保存一个选定的图像", + "When using \"Save\" button, save images to a subdirectory" : "使用 “保存” 按钮时,将图像保存到子目录", + "When you fill in the Overwrite subject field, that subject will be used to build the dynamic prompt around. It is best, if you set the subject type to match the subject. For example, set it to humanoid if you place a person in the override subject field." : "填写覆盖主题词段将被用来建立动态提示词。最好把主题类型设置为与主题相匹配。例如:如果你在覆盖主题词段中放置一个人,就把它设置为人形。", + "Whether to use optical flow to blend frames during cadence (if cadence more than 1)" : "在生成间隔期间,使用光流法渲染帧(即使间隔大于1)", + "Which algorithm to use to produce the image" : "使用哪种算法生成图像", + "whimsical" : "whimsical (奇幻)", + "White is Opaque" : "白色不透明", + "Whitelist" : "白名单", + "Whole picture" : "整张图片", + "wide" : "wide (宽图)", + "width" : "宽度", + "Width" : "宽度", + "Width/height limit for the above option, in pixels" : "上述选项的 宽/高 限制 (单位: 像素)", + "[wiki]" : "[Wiki]", + "wiki" : "Wiki", + "will do nothing!" : "将不生效!", + "will output a greyscale depth map image alongside the output images." : "将与输出图像一起输出灰度深度图图像。", + "Will upscale the image by the selected scale factor; use width and height sliders to set tile size" : "按照选定的比例放大图像;使用长/宽拖动条以设置分块大小", + "With confidence" : "输出置信度权重", + "With img2img, do exactly the amount of steps the slider specifies." : "图生图时,准确执行滑块指定的迭代步数", + "With img2img, fill image's transparent parts with this color." : "在图生图中使用以下颜色填充透明区域", + "With Workflow mode, you turn off the automatic generation of new prompts on ‘generate’, and it will use the Workflow prompt field instead. So you can work and finetune any fun prompts without turning of the script." : "在工作流模式下,关闭了 \"生成 \"时自动生成新提示词的功能,它会使用工作流提示词作为代替。因此可以在不打开脚本的情况下工作和对有趣的提示词进行微调。", + "word masks" : " ", + "Workflow assist" : "工作流协助", + "Workflow assist, suggestions by redditor Woisek." : "工作流协助,由 redditor: Woisek 提出。", + "Workflow mode, turns off prompt generation and uses below Workflow prompt instead." : "工作流模式:关闭提示词生成,使用以下的工作流提示词代替。", + "Workflow prompt" : "工作流提示词", + "*Work In Progress*. All params below are going to be keyframable at some point. If you want to speedup the integration, join Deforum's development. \uD83D\uDE09" : "*正在开发*. 下面的所有参数在某些点是关键的。如果你想加快集成,请加入 Deforum 的开发。\uD83D\uDE09", + "Write all generated prompts to a file" : "将所有生成的提示词写入文件", + "Write image to a directory (default - log/images) and generation parameters into csv file." : "将图像写入目录(默认 - log/images)并将生成参数写入 csv 表格文件", + "write merged model ID to" : "将融合模型 ID 写入到", + "x center axis for 2D angle/zoom *only*" : "2D 旋转/缩放中 X 轴的中心点", + "xmenber" : "X 值", + "X panning" : "X 轴平移量", + "xtype" : "X 类型", + "X type" : "X 轴类型", + "X Types" : "X 轴类型", + "X values" : "X 轴值", + "X/Y plot" : "X/Y 图表", + "X/Y/Z plot" : "X/Y/Z 图表", + "XYZ plot" : "XYZ 图", + "y center axis for 2D angle/zoom *only*" : "2D 旋转/缩放中 Y 轴中心点", + "Yes" : "是", + "ymenber" : "Y 值", + "You can also choose the prompt seperator mode for use with Latent Couple extension" : "可以选择提示词分隔模式来使用 Latent Couple 插件", + ". You can also join this" : ". 你同样可以加入这个", + "You can change the maximum execution time, by default it’s 30seconds." : "你可以调节最大执行时间,默认 30 秒。", + "You can choose a certain subject type, if you want to generate something more specific. It has the following types:" : "需要生成更具体的图像, 可以选择主题类型。有以下几种:", + "You can enhance semantic segmentation for control_v11p_sd15_seg from lllyasviel. Non-semantic segmentation for Edit-Anything will be supported when they convert their models to lllyasviel format." : "你可以使用 lllyasviel 的 control_v11p_sd15_seg 模型进行语义分割。当模型转换为 lllyasviel 格式时,将还将支持Edit-Anything 的非语义分割。", + "You can enhance semantic segmentation for control_v11p_sd15_seg from lllyasviel. You can also utilize" : "可以使用 lllyasviel 的 control_v11p_sd15_seg 模型强化语义分割功能。也可以使用 ", + "You can generate image layout either in single image or in batch. Since there might be A LOT of outputs, there is no gallery for preview. You need to go to the output folder for either single image or batch process." : "你可以生成单张或批量的图像分布。由于可能有大量图片输出,所以无法预览。你需要进入输出文件夹,查看和进行后续操作。", + "You can mask images by their categories via semantic segmentation. Please enter category ids (integers), separated by" : "可通过语义分割将图像分类屏蔽。请输入类别ID (整数) , 以", + "You can mask images by their categories via semantic segmentation. Please enter category ids (integers), separated by +. Visit here for ade20k and here for coco to get category->id map. Note that coco jumps some numbers, so the actual ID is line_number - 21." : "你可以通过语义分割模型按类别创建蒙版。请输入类别 ID(整数),用+分隔。可以访问 [这里] 获取 ade20k 的分类列表,或者 [这里] 获取 coco 的分类列表。注意,coco 会略过一些数字,所以实际的 ID 是列表中编号 -21。", + "You can put any image or images or video you like in the background." : "你可以任何你喜欢的图像或者视频放在背景中。", + "You can put comma seperated values here, those will be ignored from any list processing. For example, adding \"\"film grain, sepia\"\", will make these values not appear during generation." : "可以填入用逗号隔开的提示词,这些提示词包含的值将会在所有列表处理中被忽略。例如,添加 “”film grain, sepia“” ,将会使得这些提示词包含的值在生成时不出现。", + "You can specify in this field -> [Ebsynth Utility]->[configuration]->[stage 8]->[Background source]" : "你可以在这里设置 -> [Ebsynth Utility]->[插件配置]->[步骤 8]->[背景源]", + "You can specify \"path_to_project_dir/inv/crossfade_tmp\"." : "可以将其设置为“你的工程目录/inv/crossfade_tmp”。", + "You can stop the algorithm at any time" : "你可以在任意时间停止图像增强算法", + "You can toggle the separator mode. Standardly this is a comma, but you can choose an AND or a BREAK." : "可以切换提示词分隔符。标准设置应该为逗号,但现在可以选择 AND 或者 BREAK 。", + "You can try it by own, to dig more deeper into Abyss ..." : "可自行探索,以窥深渊...", + "You can turn it off and maybe add your own in the prefix or suffix prompt fields" : "可以关闭本选项,然后可以在前缀或后缀提示词段中添加自己想要指定的艺术家。", + "You can use this as a guided image tool or as a looper depending on your settings in the keyframe images field. \n Set the keyframes and the images that you want to show up. \n Note: the number of frames between each keyframe should be greater than the tweening frames." : "根据关键帧图像字段中的设置,可以将其用作引导图像工具或循环器。\n设置要显示的关键帧和图像。\n注意:每个关键帧之间的帧数应大于中间帧。", + "You can use this as a guided image tool or as a looper depending on your settings in the keyframe images field. \n Set the keyframes and the images that you want to show up. \n Note: the number of frames between each keyframe should be greater than the tweening frames." : "根据关键帧图像字段中的设置,可以将其用作引导图像工具或循环器。\n设置要显示的关键帧和图像。\n注意:每个关键帧之间的帧数应大于中间帧。", + "You may configurate automatic sam generation. " : "你可以配置自动 SAM 的参数。", + "You may configurate automatic sam generation. See" : "可以配置以下项目来自动 SAM 。查看", + "You may configurate the following items and generate masked image for all images under a directory. This mode is designed for generating LoRA/LyCORIS training set." : "配置以下项目,为目录下所有图像生成蒙版。该模式用于生成 LoRA / LyCORIS 训练集。", + "You must enter text prompts to enable groundingdino. Otherwise this extension will fall back to point prompts only." : "必须输入文本提示词才能启用 GroundingDINO,否则将仅使用标记点。", + "You probably want this to be 'fp16'." : "你可能想要设置为半精度 (fp16)。", + "Your Civitai API Key" : "Civitai API 密钥", + "Your Civitai Link Key" : "Civitai Link 密钥", + "Y panning" : "Y 轴平移量", + "ytype" : "Y 类型", + "Y type" : "Y 轴类型", + "Y Types" : "Y 轴类型", + "Y values" : "Y 轴值", + "Y Values" : "Y 轴值", + "Zip" : "打包下载", + "ZoeDepth was not trained on panoramic images. It doesn't know anything about panoramas or spherical projection. Here, we just treat the estimated depth as radius and some projection errors are expected. Nonetheless, ZoeDepth still works surprisingly well on 360 reconstruction." : "ZoeDepth 不是基于全景图像上训练的。它无法识别全景图或球形投影的特征。在这个选项卡,它仅把估计的深度当作半径,所以会产生一些预料中的投影误差。尽管如此,ZoeDepth 在 360° 重建模型上仍有令人惊讶的效果。", + "ZoeDepth was not trained on panoramic images. It doesn’t know anything about panoramas or spherical projection. Here, we just treat the estimated depth as radius and some projection errors are expected. Nonetheless, ZoeDepth still works surprisingly well on 360 reconstruction." : "ZoeDepth 不是基于全景图像上训练的。它无法识别全景图或球形投影的特征。在这个选项卡,它仅把估计的深度当作半径,所以会产生一些预料中的投影误差。尽管如此,ZoeDepth 在 360° 重建模型上仍有令人惊讶的效果。", + "Zoom" : "缩放参数", + "Zoom in masked area" : "缩放遮罩区域", + "Z type" : "Z 轴类型", + "Z values" : "Z 轴值" +} \ No newline at end of file From b59bdf80bc12485d6e9d3977740ec7e03cc02ce2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?zombieyang=28=E6=9D=A8=E6=B5=A9=29?= Date: Fri, 23 Jun 2023 10:34:27 +0800 Subject: [PATCH 039/143] localization for old system --- index.html | 41 ++++++----- typescripts/globalstore.ts | 2 +- typescripts/locale/locale.ts | 12 +++- typescripts/main/locale-for-old-html.ts | 94 +++++++++++++++++++++++++ typescripts/main/main.tsx | 1 + 5 files changed, 130 insertions(+), 20 deletions(-) create mode 100644 typescripts/main/locale-for-old-html.ts diff --git a/index.html b/index.html index d9e2b179..e9d29d7d 100644 --- a/index.html +++ b/index.html @@ -1300,8 +1300,10 @@ >
- Upscaler 1: + Upscaler 1:
- Upscaler 2: + Upscaler 2: Upscaler 2 visibility: @@ -1361,6 +1366,7 @@ value="0" > GFPGAN visibility: @@ -1385,6 +1391,7 @@ value="0" > CodeFormer visibility: @@ -1409,6 +1416,7 @@ value="0" > CodeFormer weight: @@ -2263,7 +2271,7 @@ >
- CFG Scale: + CFG Scale: @@ -2432,7 +2440,7 @@ max="100" value="70" > - Denoising Strength: - Mask Content: + Mask Content:
-->
Generate txt2img @@ -1796,7 +1799,7 @@ class="chLiveProgressImageClass" />
-
-
+ --> + +
+
) }) + +const ToolbarGenerateButtons = observer(() => { + const button_style: any = { + width: '30px', + height: '30px', + marginBottom: '3px', + } + const generate_more_display = + session_ts.store.data.can_generate && + session_ts.store.data.can_generate_more + ? 'inline-flex' + : 'none' + const interrupt_display = session_ts.store.data.can_generate + ? 'none' + : 'inline-flex' + return ( +
+ + + +
+ ) +}) const canStartSession = async () => { // check for automatic1111 connection: fail if false // check for automatic1111 api: fail if false @@ -190,3 +237,13 @@ extraRoot.render(
) + +const toolBarButtonsContainer = document.getElementById( + 'toolbarGenerateButtonsContainer' +)! +const toolBarButtonsContainerRoot = ReactDOM.createRoot(toolBarButtonsContainer) +toolBarButtonsContainerRoot.render( + + + +) diff --git a/typescripts/viewer/viewer.tsx b/typescripts/viewer/viewer.tsx index 86c7a1b4..b0edf49c 100644 --- a/typescripts/viewer/viewer.tsx +++ b/typescripts/viewer/viewer.tsx @@ -461,6 +461,45 @@ const Viewer = observer(() => { ) }) +const ToolbarViewerButtons = observer(() => { + const display_button: Boolean = + session_ts.store.data.is_active && session_ts.store.data.can_generate + const button_style = { + // display: display_button ? 'block' : 'none', + display: 'block', + marginRight: '3px', + marginBottom: '3px', + } + return ( +
+ + + +
+ ) +}) + // const node = document.getElementById('reactViewerContainer')! const containers = document.querySelectorAll('.reactViewerContainer') @@ -476,3 +515,11 @@ containers.forEach((container) => {
) }) + +const button_container = document.getElementById('viewerButtonContainer')! +const root = ReactDOM.createRoot(button_container) +root.render( + + + +) From b4acbdf4a8a95cb4311b06d6cd2c3e018c114d3c Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Mon, 26 Jun 2023 14:59:25 +0300 Subject: [PATCH 068/143] update all progress bars when progress value is updated --- typescripts/viewer/preview.tsx | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/typescripts/viewer/preview.tsx b/typescripts/viewer/preview.tsx index 6c91fc08..19972e3b 100644 --- a/typescripts/viewer/preview.tsx +++ b/typescripts/viewer/preview.tsx @@ -6,11 +6,22 @@ import { observer } from 'mobx-react' import { AStore } from '../main/astore' import { progress } from '../entry' import './style/preview.css' +import { reaction } from 'mobx' export const store = new AStore({ // image: '', // progress_value: 0, }) - +// update all progress bar when progress store progress_value update +reaction( + () => { + return progress.store.data.progress_value + }, + (value: number) => { + document.querySelectorAll('.pProgressBars').forEach((progress: any) => { + progress.value = value?.toFixed(2) + }) + } +) const Previewer = observer(() => { const renderImage = () => { let preview_img_html From 0bca345cd48fe01c6ea76bbaa9583dacbc7d5fb3 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Mon, 26 Jun 2023 22:40:48 +0300 Subject: [PATCH 069/143] add support to one button prompt script --- index.html | 3 + index.js | 1 + typescripts/entry.ts | 1 + .../one_button_prompt/one_button_prompt.tsx | 158 ++++++++++++++++++ typescripts/util/elements.tsx | 1 + typescripts/util/ts/api.ts | 82 +++++++++ utility/api.js | 4 + 7 files changed, 250 insertions(+) create mode 100644 typescripts/one_button_prompt/one_button_prompt.tsx create mode 100644 typescripts/util/ts/api.ts diff --git a/index.html b/index.html index 27893e9f..c84f2204 100644 --- a/index.html +++ b/index.html @@ -2804,6 +2804,9 @@
+
+ + diff --git a/index.js b/index.js index dd2c6e4b..bf55e032 100644 --- a/index.js +++ b/index.js @@ -69,6 +69,7 @@ const { sd_tab_ts, sam, settings_tab_ts, + one_button_prompt, } = require('./typescripts/dist/bundle') const io = require('./utility/io') diff --git a/typescripts/entry.ts b/typescripts/entry.ts index b250a117..931f5367 100644 --- a/typescripts/entry.ts +++ b/typescripts/entry.ts @@ -14,5 +14,6 @@ export * as generate from './session/generate' export * as sd_tab_ts from './sd_tab/sd_tab' export * as sam from './sam/sam' export * as settings_tab_ts from './settings/settings' +export * as one_button_prompt from './one_button_prompt/one_button_prompt' export { toJS } from 'mobx' diff --git a/typescripts/one_button_prompt/one_button_prompt.tsx b/typescripts/one_button_prompt/one_button_prompt.tsx new file mode 100644 index 00000000..d07b878c --- /dev/null +++ b/typescripts/one_button_prompt/one_button_prompt.tsx @@ -0,0 +1,158 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' + +import Collapsible from '../after_detailer/after_detailer' +import { observer } from 'mobx-react' +import { AStore } from '../main/astore' + +import { requestPost } from '../util/ts/api' + +declare let g_sd_url: string +export const store = new AStore({ + prompts: [], + number: 3, +}) + +export async function requestRandomPrompts(number_of_prompts: number = 1) { + const payload = { + numberofprompts: number_of_prompts, + insanitylevel: 5, + forcesubject: 'all', + artists: 'all', + imagetype: 'all', + onlyartists: false, + antivalues: '', + prefixprompt: '', + suffixprompt: '', + promptcompounderlevel: '1', + seperator: 'comma', + givensubject: '', + smartsubject: true, + giventypeofimage: '', + imagemodechance: 20, + } + try { + const full_url = `${g_sd_url}/one_button_prompt/prompt/random` + + const randomPrompts = (await requestPost(full_url, payload))?.prompts + return randomPrompts + } catch (e) { + console.warn(e) + } +} + +function autoResize(textarea: any) { + // const textarea = event.target + let measure = document.getElementById('measure')! + if (!measure) { + measure = document.createElement('div') + measure.setAttribute('id', 'measure') + measure.style.visibility = 'hidden' + measure.style.whiteSpace = 'pre-wrap' + measure.style.position = 'absolute' + measure.style.fontSize = '14px' + // measure.style.paddingBottom = '10px' + // measure.style.paddingTop = '10px' + // measure.style.lineHeight = '14px' + + document.body.appendChild(measure) + } + measure.style.width = textarea.offsetWidth + 'px' + // getComputedStyle(textarea).width + + measure.textContent = textarea.value + try { + clearTimeout(g_style_timeout) + g_style_timeout = setTimeout(() => { + let height = measure.offsetHeight + //height between [60,450] + height = Math.max(60, height) + height = Math.min(450, height) + textarea.style.height = height + 'px' + }, 300) + } catch (e) { + console.warn(e) + } +} +let g_timeout: any +let g_style_timeout: any +function handleInput(event: any) { + try { + // clearTimeout(g_timeout) + // g_timeout = setTimeout(() => autoResize(event.target), 1000) + autoResize(event.target) + } catch (e) { + console.warn(e) + } +} + +const OneButtonPrompt = observer(() => { + const renderContainer = () => { + return ( +
+
+ {/* */} + +
+ {store.data.prompts.map((prompt: string, index: number) => { + return ( +
+ + +
+ ) + })} +
+ ) + } + return
{renderContainer()}
+}) + +const containers = document.querySelectorAll('.oneButtonPromptContainer')! + +containers.forEach((container) => { + const root = ReactDOM.createRoot(container) + + root.render( + +
+ + + +
+
+ ) +}) diff --git a/typescripts/util/elements.tsx b/typescripts/util/elements.tsx index a00548ff..0a915f89 100644 --- a/typescripts/util/elements.tsx +++ b/typescripts/util/elements.tsx @@ -20,6 +20,7 @@ declare global { 'sp-divider': any 'sp-detail': any 'sp-textarea': any + 'sp-textfield': any 'sp-action-button': any 'sp-progressbar': any } diff --git a/typescripts/util/ts/api.ts b/typescripts/util/ts/api.ts new file mode 100644 index 00000000..c1ffec8b --- /dev/null +++ b/typescripts/util/ts/api.ts @@ -0,0 +1,82 @@ +export async function requestGet(url: string) { + let json = null + + const full_url = url + try { + let request = await fetch(full_url) + if (request.status === 404) { + return null + } + + json = await request.json() + + console.log('json: ', json) + } catch (e) { + console.warn(`issues requesting from ${full_url}`, e) + } + return json +} +export async function requestPost(url: string, payload: any) { + let json = null + + const full_url = url + try { + let request = await fetch(full_url, { + method: 'POST', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + body: JSON.stringify(payload), + }) + + if (request.status === 404) { + return null + } + + json = await request.json() + + console.log('json: ', json) + } catch (e) { + console.warn(`issues requesting from ${full_url}`, e) + } + return json +} +export async function requestFormDataPost(url: string, payload: any) { + try { + var myHeaders = new Headers() + myHeaders.append('Cookie', 'PHPSESSID=n70fa2vmvm6tfmktf4jmstmd1i') + + var formdata = new FormData() + + for (const [key, value] of Object.entries(payload)) { + //@ts-ignore + formdata.append(key, value) + } + // formdata.append( + // 'source', + // 'iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=' + // ) + // formdata.append('key', '6d207e02198a847aa98d0a2a901485a5') + + var requestOptions = { + method: 'POST', + headers: myHeaders, + body: formdata, + redirect: 'follow', + } + + //@ts-ignore + const response = await fetch(url, requestOptions) + const result_json = response.json() + return result_json + } catch (e) { + console.warn(e) + } +} + +module.exports = { + requestGet, + requestPost, + requestFormDataPost, +} diff --git a/utility/api.js b/utility/api.js index d68d7f16..bac32964 100644 --- a/utility/api.js +++ b/utility/api.js @@ -1,3 +1,7 @@ +//deprecated file don't use + +console.warn('api.js is deprecated, use typescript/util/ts/api.ts') + async function requestGet(url) { let json = null From 84970ce3683f58e728c5eef24312099d6db1b400 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Mon, 26 Jun 2023 22:43:06 +0300 Subject: [PATCH 070/143] add color coding to generation buttons --- typescripts/session/generate.tsx | 10 +++++----- typescripts/session/style/generate.css | 15 +++++++++++++++ typescripts/viewer/preview.tsx | 13 ------------- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/typescripts/session/generate.tsx b/typescripts/session/generate.tsx index 9cf85742..35c03976 100644 --- a/typescripts/session/generate.tsx +++ b/typescripts/session/generate.tsx @@ -21,7 +21,7 @@ const GenerateButtons = observer(() => {
{ + handleInput(event) + store.data.prompts[index] = + event.target.value + }} placeholder={`random prompt ${index}`} value={prompt} > From 15697d204fccf8cc00360ea1468ebef08f266a73 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Wed, 28 Jun 2023 15:26:27 +0300 Subject: [PATCH 080/143] hide generate button when generation is active --- typescripts/session/generate.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/typescripts/session/generate.tsx b/typescripts/session/generate.tsx index 35c03976..619e70cc 100644 --- a/typescripts/session/generate.tsx +++ b/typescripts/session/generate.tsx @@ -23,6 +23,11 @@ const GenerateButtons = observer(() => { id="btnNewGenerate" className="btnSquare generateButtonMargin generateColor" onClick={handleGenerate} + style={{ + display: session_ts.store.data.can_generate + ? void 0 + : 'none', + }} > Generate {modeDisplayNames[sd_tab_ts.store.data.mode]} @@ -71,6 +76,9 @@ const ToolbarGenerateButtons = observer(() => { height: '30px', marginBottom: '3px', } + const generate_display = session_ts.store.data.can_generate + ? 'inline-flex' + : 'none' const generate_more_display = session_ts.store.data.can_generate && session_ts.store.data.can_generate_more @@ -84,7 +92,7 @@ const ToolbarGenerateButtons = observer(() => { From 1c4a97f19b00a6f31413388f978a4d1207be7e5c Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Wed, 28 Jun 2023 18:31:07 +0300 Subject: [PATCH 081/143] fix bug: only include guess mode when using old api --- typescripts/controlnet/entry.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/typescripts/controlnet/entry.ts b/typescripts/controlnet/entry.ts index 1b11f23f..927287dc 100644 --- a/typescripts/controlnet/entry.ts +++ b/typescripts/controlnet/entry.ts @@ -121,12 +121,17 @@ function mapPluginSettingsToControlNet(plugin_settings: any) { // guidance: , guidance_start: store.controlNetUnitData[index].guidance_start, guidance_end: store.controlNetUnitData[index].guidance_end, - guessmode: false, } if (store.controlnetApiVersion > 1) { + //new controlnet v2 controlnet_units[index].control_mode = store.controlNetUnitData[index].control_mode - controlnet_units[index].pixel_perfect = true + controlnet_units[index].pixel_perfect = + store.controlNetUnitData[index].pixel_perfect + } else { + // old controlnet v1 + controlnet_units[index].guessmode = + store.controlNetUnitData[index].guessmode } } From 4dc8c200f0dad92bcde9cf0643fb881991826e43 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Wed, 28 Jun 2023 18:32:42 +0300 Subject: [PATCH 082/143] deprecate the proxy server files --- start_server.bat => deprecated-do-not-use-start_server.bat | 0 start_server.sh => deprecated-do-not-use-start_server.sh | 0 ...server_MacOS.sh => deprecated-do-not-use-start_server_MacOS.sh | 0 update_plugin.bat => deprecated-do-not-use-update_plugin.bat | 0 update_plugin.sh => deprecated-do-not-use-update_plugin.sh | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename start_server.bat => deprecated-do-not-use-start_server.bat (100%) rename start_server.sh => deprecated-do-not-use-start_server.sh (100%) mode change 100755 => 100644 rename start_server_MacOS.sh => deprecated-do-not-use-start_server_MacOS.sh (100%) mode change 100755 => 100644 rename update_plugin.bat => deprecated-do-not-use-update_plugin.bat (100%) rename update_plugin.sh => deprecated-do-not-use-update_plugin.sh (100%) diff --git a/start_server.bat b/deprecated-do-not-use-start_server.bat similarity index 100% rename from start_server.bat rename to deprecated-do-not-use-start_server.bat diff --git a/start_server.sh b/deprecated-do-not-use-start_server.sh old mode 100755 new mode 100644 similarity index 100% rename from start_server.sh rename to deprecated-do-not-use-start_server.sh diff --git a/start_server_MacOS.sh b/deprecated-do-not-use-start_server_MacOS.sh old mode 100755 new mode 100644 similarity index 100% rename from start_server_MacOS.sh rename to deprecated-do-not-use-start_server_MacOS.sh diff --git a/update_plugin.bat b/deprecated-do-not-use-update_plugin.bat similarity index 100% rename from update_plugin.bat rename to deprecated-do-not-use-update_plugin.bat diff --git a/update_plugin.sh b/deprecated-do-not-use-update_plugin.sh similarity index 100% rename from update_plugin.sh rename to deprecated-do-not-use-update_plugin.sh From 2f51204b6681a2b3ebb141b570c82e7b5e7bc411 Mon Sep 17 00:00:00 2001 From: Amir Amirkhanov Date: Sat, 1 Jul 2023 21:21:51 +0300 Subject: [PATCH 083/143] Update index.html changing the correct size writing-icon.svg background-size: 30px; --- index.html | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/index.html b/index.html index bc55fb05..91c74639 100644 --- a/index.html +++ b/index.html @@ -592,12 +592,10 @@ font-family: Arial, Verdana; background-image: url(./icon/writing-icon.svg); /* background-color: transparent; */ - background-size: 25px; + background-size: 30px; width: 30px; height: 30px; background-repeat: no-repeat; - background-position: center; - background-position-x: 4px; } .svg-buttons-container *:not(:last-child) { margin-right: 3px; From d013d9129308d530479ac6fd18b6d375f8b8affd Mon Sep 17 00:00:00 2001 From: Amir Amirkhanov Date: Sat, 1 Jul 2023 21:56:47 +0300 Subject: [PATCH 084/143] Update index.html changing the correct size search.svg background-size: 30px; --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 91c74639..d4d12ffe 100644 --- a/index.html +++ b/index.html @@ -495,7 +495,7 @@ font-family: Arial, Verdana; background-image: url(./icon/search.svg); background-color: #777; - background-size: 20px; + background-size: 30px; width: 30px; height: 30px; background-repeat: no-repeat; From a6ac7bbd090e4ebbf60daf2228648f503cd723f3 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Sun, 2 Jul 2023 00:56:18 +0300 Subject: [PATCH 085/143] reenable "set all CtrlNet Images" button --- typescripts/controlnet/ControlNetTab.tsx | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/typescripts/controlnet/ControlNetTab.tsx b/typescripts/controlnet/ControlNetTab.tsx index 6fff7cff..1f5e284a 100644 --- a/typescripts/controlnet/ControlNetTab.tsx +++ b/typescripts/controlnet/ControlNetTab.tsx @@ -164,7 +164,7 @@ class ControlNetTab extends React.Component<{ )} )} - {/*
@@ -174,12 +174,13 @@ class ControlNetTab extends React.Component<{ id="bSetAllControlImage" onClick={this.onSetAllControlImage.bind(this)} > - {Locale('controlnet.setall')} + {Locale('Set All CtrlNet Images')}
- {Locale('controlnet.disableall')} -
*/} + + {Locale('Disable ControlNet Tab')} + +
{Array(this.props.appState.maxControlNet) .fill(0) From 6f2cd8c814b45dc840d534757172d0a0cb522e58 Mon Sep 17 00:00:00 2001 From: unknown <348063288@qq.com> Date: Sun, 2 Jul 2023 22:53:38 +0800 Subject: [PATCH 086/143] localization optimize && add locale setting UI --- i18n/zh_CN/ps-plugin.json | 24 +++++--- typescripts/after_detailer/after_detailer.tsx | 16 +++--- typescripts/controlnet/ControlNetTab.tsx | 3 +- typescripts/controlnet/ControlNetUnit.tsx | 6 +- typescripts/globalstore.ts | 5 +- typescripts/settings/settings.tsx | 57 +++++++++++-------- typescripts/util/elements.tsx | 5 +- typescripts/viewer/viewer.tsx | 2 +- 8 files changed, 70 insertions(+), 48 deletions(-) diff --git a/i18n/zh_CN/ps-plugin.json b/i18n/zh_CN/ps-plugin.json index d445a8f1..3a1cddc1 100644 --- a/i18n/zh_CN/ps-plugin.json +++ b/i18n/zh_CN/ps-plugin.json @@ -70,12 +70,13 @@ "Select A Script": "选择脚本", "Activate": "激活", "Viewer": "查看器", + "Preview": "预览器", "View your generated images on the canvas": "在画布上查看生成的图像", "Set Mask": "设置蒙版", "Set Init Image": "设置初始图像", "Interrupt": "中断", "Selection Area": "选择区域", - "Thumbnail Size:": "缩略图大小:", + "Thumbnail Size": "缩略图大小", "Square 1:1": "正方形 1:1", "Prompts Library": "提示库", "Prompt Shortcut: a single word that represent a prompt": "提示快捷方式:代表提示的单个单词", @@ -100,13 +101,13 @@ "User the selected area (image) on canvas to Search Lexica": "用户在画布上选择的区域(图像)搜索词典", "Image Search": "图像搜索", "Image Search Engine": "图像搜索引擎", - "ControlNet": "控制网络", - "The Controlnet Extension is missing from Automatic1111.Please install it to use it through the plugin.": "Automatic1111缺少控制网络扩展。请安装它以通过插件使用它。", - "ControlNet Preset": "控制网络预设", - "auto fill the ControlNet with smart settings, to speed up your working process.": "自动填充智能设置的控制网络,以加快您的工作流程。", + "ControlNet": "ControlNet", + "The Controlnet Extension is missing from Automatic1111.Please install it to use it through the plugin.": "Automatic1111缺少ControlNet扩展。请安装它以通过插件使用它。", + "ControlNet Preset": "ControlNet预设", + "auto fill the ControlNet with smart settings, to speed up your working process.": "自动填充智能设置的ControlNet,以加快您的工作流程。", "Set All CtrlNet Images": "设置所有 CtrlNet 图像", - "Disable ControlNet Tab": "禁用控制网络选项卡", - "Control Net Settings Slot 0": "控制网络设置插槽0", + "Disable ControlNet Tab": "禁用ControlNet选项卡", + "Control Net Settings Slot 0": "ControlNet设置插槽0", "Set CtrlNet Img": "设置 CtrlNet 图像", "Preview Annotator": "预览注释器", "Enable": "启用", @@ -169,6 +170,11 @@ "SD Preset": "SD 预设", "Save Preset": "保存预设", "Delete Preset": "删除预设", - "The Controlnet Extension is missing from Automatic1111.\nPlease install it to use it through the plugin.": "本地SD中缺少控制网扩展。\n请安装该插件后再使用。", - "Set CtrlImg": "设置原始图" + "The Controlnet Extension is missing from Automatic1111.\nPlease install it to use it through the plugin.": "本地SD中缺少ControlNet扩展。\n请安装该插件后再使用。", + "Set CtrlImg": "设置原始图", + "ControlNet Tab": "ControlNet", + "ControlNet Unit": "ControlNet #", + "Select Filter": "选择过滤器", + "Select Module": "选择预处理器", + "Select Model": "选择模型" } \ No newline at end of file diff --git a/typescripts/after_detailer/after_detailer.tsx b/typescripts/after_detailer/after_detailer.tsx index ba67b7c8..8014dd94 100644 --- a/typescripts/after_detailer/after_detailer.tsx +++ b/typescripts/after_detailer/after_detailer.tsx @@ -2,7 +2,7 @@ import React, { ReactPropTypes } from 'react' import ReactDOM from 'react-dom/client' // import { action, makeAutoObservable, reaction, toJS } from 'mobx' -import { observer } from 'mobx-react' +import { observer, useObserver } from 'mobx-react' import { SliderType, @@ -90,7 +90,7 @@ export class AfterDetailerComponent extends React.Component<{ async componentDidUpdate( prevProps: ReactPropTypes, prevState: ReactPropTypes - ) {} + ) { } handleRefresh = async () => { if (await this.isInstalled()) { await this.getInpaintModels() @@ -259,6 +259,7 @@ const domNode = document.getElementById('alwaysOnScriptsContainer')! const root = ReactDOM.createRoot(domNode) import { useState, ReactNode } from 'react' +import Locale from '../locale/locale' interface CollapsibleProps { label: string @@ -269,7 +270,8 @@ interface CollapsibleProps { checkboxCallback?: (checked: boolean) => void children: ReactNode } -const Collapsible = ({ + +function Collapsible({ label, labelStyle, containerStyle, @@ -277,14 +279,14 @@ const Collapsible = ({ checkboxCallback, checked, children, -}: CollapsibleProps) => { +}: CollapsibleProps) { const [isOpen, setIsOpen] = useState(defaultIsOpen) const handleToggle = () => { setIsOpen(!isOpen) } - return ( + return useObserver(()=> (
- {label} + {Locale(label as any)} {children}
} */}
{children}
- ) + )) } export default Collapsible diff --git a/typescripts/controlnet/ControlNetTab.tsx b/typescripts/controlnet/ControlNetTab.tsx index 6fff7cff..1bdcc04d 100644 --- a/typescripts/controlnet/ControlNetTab.tsx +++ b/typescripts/controlnet/ControlNetTab.tsx @@ -187,13 +187,12 @@ class ControlNetTab extends React.Component<{ const storeData = this.props.appState.controlNetUnitData[index] - let controlNetLabel = `CtrlNet Unit ${index}: ${ + let controlNetLabel = `${Locale('ControlNet Unit')} ${index}: ${ storeData.module && storeData.module !== 'none' ? `${storeData.module}` : '' }` - console.log('controlNetLabel: ', controlNetLabel) return (
({ - Locale: host.uiLocale == 'zh_CN' ? host.uiLocale : 'default', + Locale: initialLocale == 'zh_CN' ? initialLocale : 'en_US', }) export default globalStore diff --git a/typescripts/settings/settings.tsx b/typescripts/settings/settings.tsx index e422c128..bf3fa453 100644 --- a/typescripts/settings/settings.tsx +++ b/typescripts/settings/settings.tsx @@ -4,6 +4,8 @@ import { observer } from 'mobx-react' import { AStore } from '../main/astore' import { SpMenu } from '../util/elements' +import Locale from '../locale/locale' +import globalStore from '../globalstore' // import { Jimp } from '../util/oldSystem' declare const Jimp: any // make sure you import jimp before importing settings.tsx @@ -36,30 +38,39 @@ export const store = new AStore({ const Settings = observer(() => { return (
- { - { - return ( - interpolationMethods[key].photoshop === - store.data.scale_interpolation_method - .photoshop && - interpolationMethods[key].jimp === - store.data.scale_interpolation_method.jimp - ) - } - )} - onChange={(id: any, value: any) => { - store.updateProperty( - 'scale_interpolation_method', - interpolationMethods[value.item] + { + return ( + interpolationMethods[key].photoshop === + store.data.scale_interpolation_method + .photoshop && + interpolationMethods[key].jimp === + store.data.scale_interpolation_method.jimp ) - }} - > - } + } + )} + onChange={(id: any, value: any) => { + store.updateProperty( + 'scale_interpolation_method', + interpolationMethods[value.item] + ) + }} + > + select language + { + globalStore.Locale = value.item; + localStorage.setItem('last_selected_locale', value); + }} + >
) }) diff --git a/typescripts/util/elements.tsx b/typescripts/util/elements.tsx index 0a915f89..4174a366 100644 --- a/typescripts/util/elements.tsx +++ b/typescripts/util/elements.tsx @@ -1,6 +1,8 @@ import React, { CSSProperties, ComponentType } from 'react' // import ReactDOM from 'react-dom' import ReactDOM from 'react-dom/client' +import Locale from '../locale/locale' +import { observer } from 'mobx-react' // import { versions } from 'uxp' export { ReactComponent as MoveToCanvasSvg } from '../../icon/move_to_canvas.svg' export { ReactComponent as PenSvg } from '../../icon/pen.svg' @@ -41,6 +43,7 @@ export enum SliderType { Integer = 'integer', Float = 'float', } +@observer export class SpSliderWithLabel extends React.Component<{ onSliderChange?: any onSliderInput?: any @@ -171,7 +174,7 @@ export class SpSliderWithLabel extends React.Component<{ } onChange={this.onSliderValueChangeHandler.bind(this)} > - {this.props.label}: + {Locale(this.props.label as any)}: { show-value={false} steps={1} output_value={store.data.width} - label="Thumbnail Size:" + label="Thumbnail Size" >
Date: Thu, 6 Jul 2023 11:15:14 +0300 Subject: [PATCH 087/143] refactor background layer initialization in typescript --- enum.js | 9 +- typescripts/session/generate.tsx | 9 +- typescripts/util/ts/document.ts | 192 +++++++++++++++++++++++++++++++ 3 files changed, 202 insertions(+), 8 deletions(-) create mode 100644 typescripts/util/ts/document.ts diff --git a/enum.js b/enum.js index 1cf996a2..522ba2d2 100644 --- a/enum.js +++ b/enum.js @@ -30,12 +30,7 @@ const RequestStateEnum = { Interrupted: 'interrupted', // canceled/ interrupted Finished: 'finished', // finished generating } -const DocumentTypeEnum = { - NoBackground: 'no_background', - ImageBackground: 'image_background', - SolidBackground: 'solid_background', - ArtBoard: 'artboard', -} + const BackgroundHistoryEnum = { CorrectBackground: 'correct_background', NoBackground: 'no_background', @@ -51,7 +46,7 @@ module.exports = { AutomaticStatusEnum, ViewerObjectTypeEnum, RequestStateEnum, - DocumentTypeEnum, + BackgroundHistoryEnum, PresetTypeEnum, } diff --git a/typescripts/session/generate.tsx b/typescripts/session/generate.tsx index 619e70cc..d683d7c0 100644 --- a/typescripts/session/generate.tsx +++ b/typescripts/session/generate.tsx @@ -5,8 +5,9 @@ import { observer } from 'mobx-react' import { sd_tab_ts, session_ts, viewer } from '../entry' import './style/generate.css' -import { io, note, psapi } from '../util/oldSystem' +import { io, note, psapi, selection } from '../util/oldSystem' import { GenerationModeEnum } from '../util/ts/enum' +import { initializeBackground } from '../util/ts/document' //example: take 'oI' in 'LassoInpaint' and replace it with 'o I' thus creating 'Lasso Inpaint' const modeDisplayNames = Object.fromEntries( @@ -149,8 +150,14 @@ const canStartSession = async () => { } return can_start_session } + // declare let g_sd_mode: any const handleGenerate = async () => { + //save user input for later + //1) save selection as channel + await selection.selectionToChannel('mask') + + await initializeBackground() //fix background if there is a need console.log('mode: ', sd_tab_ts.store.data.mode) try { if (!(await canStartSession())) { diff --git a/typescripts/util/ts/document.ts b/typescripts/util/ts/document.ts new file mode 100644 index 00000000..0675acf3 --- /dev/null +++ b/typescripts/util/ts/document.ts @@ -0,0 +1,192 @@ +import { app, core, action } from 'photoshop' +import { layer_util, psapi } from '../oldSystem' +const executeAsModal = core.executeAsModal +const batchPlay = action.batchPlay + +enum DocumentTypeEnum { + NoBackground = 'no_background', + ImageBackground = 'image_background', + SolidBackground = 'solid_background', + ArtBoard = 'artboard', +} + +async function isCorrectBackground() { + const historylist = app.activeDocument.historyStates.filter( + (h) => h.name === 'Correct Background' + ) + console.log('historylist:', historylist) + const is_correct_background = historylist.length > 0 ? true : false + return is_correct_background +} + +async function getColor(X: any, Y: any) { + // const background_layer_id = await app.activeDocument.backgroundLayer.id + + try { + const result = await batchPlay( + [ + { + _obj: 'colorSampler', + _target: { + _ref: 'document', + _enum: 'ordinal', + _value: 'targetEnum', + }, + samplePoint: { + horizontal: X, + vertical: Y, + }, + }, + ], + {} + ) + + const red = result[0].colorSampler.red + const green = result[0].colorSampler.grain + const blue = result[0].colorSampler.blue + + return [red, green, blue] + } catch (e) { + console.warn(e) + } +} + +//REFACTOR: move to document.js +async function findDocumentType() { + //check if the background layer exsit + //if it doesn't return false + //if it does: + //duplicate the background layer and place it on the top of the document. + //sampler 10 random pixles + //and check if all the pixels has the same values. + //if it doesn't duplicate the background layer and place it above the background layer. + // make a white background layer. + //return true + + let document_type + const background_layer = await app.activeDocument.backgroundLayer + const has_background_layer = app.activeDocument.backgroundLayer + ? true + : false + const artboards = Array.from(await app.activeDocument.artboards) + if (artboards.length > 0) { + document_type = DocumentTypeEnum['ArtBoard'] + // } else if (layer_util.Layer.doesLayerExist(background_layer)) { + } else if (has_background_layer) { + //assume it's solid white background if correctHistory > 1 || layers.length > 5 + const b_correct_background = await isCorrectBackground() // check the history for correct operation + if (b_correct_background) { + document_type = DocumentTypeEnum['SolidBackground'] + } else { + //else + + //background layer does exist + //check if it's solid color background or an image background + //sampler 10 random pixels + let width = app.activeDocument.width + let height = app.activeDocument.height + let old_rgb: any + let same_color = true + + await executeAsModal( + async () => { + if (app.activeDocument.layers.length > 1) { + await layer_util.toggleBackgroundLayerExe() // hide all layers except the background layer + } + for (let i = 0; i < 10; ++i) { + let x = Math.floor(Math.random() * width) + let y = Math.floor(Math.random() * height) + + const rgb = (await getColor(x, y))! + if (old_rgb) { + if ( + Math.round(old_rgb[0]) === Math.round(rgb[0]) && + Math.round(old_rgb[1]) === Math.round(rgb[1]) && + Math.round(old_rgb[2]) === Math.round(rgb[2]) + ) { + } else { + same_color = false //it's an image background + break + } + } + old_rgb = rgb + } + if (app.activeDocument.layers.length > 1) { + await layer_util.toggleBackgroundLayerExe() // undo the toggle operation; display all layers + } + }, + { + commandName: 'Checking Document Type...', + } + ) + + document_type = same_color + ? DocumentTypeEnum['SolidBackground'] + : DocumentTypeEnum['ImageBackground'] + } + } else { + //create the background layer since it doesn't exsit + document_type = DocumentTypeEnum['NoBackground'] + } + + return document_type +} + +async function correctDocumentType(documentType: any) { + if (documentType === DocumentTypeEnum['SolidBackground']) { + //do nothing + } else if (documentType === DocumentTypeEnum['ImageBackground']) { + //duplicate the layer + await executeAsModal( + async () => { + const image_layer: any = + await app.activeDocument.backgroundLayer!.duplicate() // + image_layer.name = 'Image' + await app.activeDocument.backgroundLayer!.delete() + await layer_util.createBackgroundLayer(255, 255, 255) + }, + { + commandName: 'Correct Background', + } + ) + } else if (documentType === DocumentTypeEnum['ArtBoard']) { + //duplicate the layer + await app.showAlert( + "the plugin doesn't work with artboards, create normal document with no artboard to use the plugin" + ) + throw "the plugin doesn't work with artboards, create normal document with no artboard to use the plugin" + } else if (documentType === DocumentTypeEnum['NoBackground']) { + await layer_util.createBackgroundLayer(255, 255, 255) + } +} + +export async function initializeBackground() { + await executeAsModal( + async (context) => { + const document_type = await findDocumentType() + + const history_id = await context.hostControl.suspendHistory({ + documentID: app.activeDocument.id, //TODO: change this to the session document id + name: 'Correct Background', + }) + //store selection + //store active layer + const selectionInfo = await psapi.getSelectionInfoExe() + await psapi.unSelectMarqueeExe() + const active_layers = app.activeDocument.activeLayers + + //1)check if the documnet has a background layer + + await correctDocumentType(document_type) + + //retore selection + //restore active layer + await psapi.reSelectMarqueeExe(selectionInfo) + await psapi.selectLayersExe(active_layers) + await context.hostControl.resumeHistory(history_id) + }, + { + commandName: 'Initialize Background', + } + ) +} From 9c048654f431c35441d7649c49123da759b26613 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 6 Jul 2023 11:52:47 +0300 Subject: [PATCH 088/143] use blur slider to add blur to the expanded mask --- scripts/main.py | 3 ++- server/python_server/img2imgapi.py | 8 +++--- server/python_server/serverMain.py | 3 ++- typescripts/session/session.ts | 32 ++++++++++++++++++++++ utility/sdapi/python_replacement.js | 5 ++-- utility/session.js | 5 ++-- utility/tab/sd.js | 42 +++++++++++++++++++---------- 7 files changed, 74 insertions(+), 24 deletions(-) diff --git a/scripts/main.py b/scripts/main.py index 2fac52de..44150321 100644 --- a/scripts/main.py +++ b/scripts/main.py @@ -67,13 +67,14 @@ async def maskExpansionHandler(request:Request): # keywords = json.get('keywords','cute dogs') base64_mask_image = json['mask'] mask_expansion = json['mask_expansion'] + blur = json['blur'] #convert base64 to img await img2imgapi.base64ToPng(base64_mask_image,"original_mask.png")#save a copy of the mask mask_image = img2imgapi.b64_2_img(base64_mask_image) - expanded_mask_img = img2imgapi.maskExpansion(mask_image,mask_expansion) + expanded_mask_img = img2imgapi.maskExpansion(mask_image,mask_expansion,blur) base64_expanded_mask_image = img2imgapi.img_2_b64(expanded_mask_img) await img2imgapi.base64ToPng(base64_expanded_mask_image,"expanded_mask.png")#save a copy of the mask diff --git a/server/python_server/img2imgapi.py b/server/python_server/img2imgapi.py index 1d6c22cf..e451b976 100644 --- a/server/python_server/img2imgapi.py +++ b/server/python_server/img2imgapi.py @@ -32,7 +32,7 @@ def reserveBorderPixels(img,dilation_img): width, height = img.size dilation_pixels = dilation_img.load() all_pixels = [] - depth = 20 # five pixel depth + depth = 1 # five pixel depth for x in range(width): for d in range(depth): dilation_pixels[x,d] = pixels[x, d] @@ -44,7 +44,7 @@ def reserveBorderPixels(img,dilation_img): dilation_pixels[width-(d+1),y] = pixels[width-(d+1), y] return dilation_img -def maskExpansion(mask_img,mask_expansion): +def maskExpansion(mask_img,mask_expansion,blur =10): #only if image exist then try to open it @@ -53,8 +53,8 @@ def maskExpansion(mask_img,mask_expansion): # if(payload['use_sharp_mask'] == False):# use blurry mask iteration = mask_expansion dilated_img = applyDilation(mask_img,iteration) - mask_with_border = reserveBorderPixels(mask_img,dilated_img) - mask_with_border = mask_with_border.filter(ImageFilter.GaussianBlur(radius = 10)) + blurred_image = dilated_img.filter(ImageFilter.GaussianBlur(radius = blur)) + mask_with_border = reserveBorderPixels(mask_img,blurred_image) return mask_with_border async def base64ToPng(base64_image,image_path): diff --git a/server/python_server/serverMain.py b/server/python_server/serverMain.py index a1f83129..4da5dc4b 100644 --- a/server/python_server/serverMain.py +++ b/server/python_server/serverMain.py @@ -323,13 +323,14 @@ async def maskExpansionHandler(request:Request): # keywords = json.get('keywords','cute dogs') base64_mask_image = json['mask'] mask_expansion = json['mask_expansion'] + blur = json['blur'] #convert base64 to img await img2imgapi.base64ToPng(base64_mask_image,"original_mask.png")#save a copy of the mask for debugging mask_image = img2imgapi.b64_2_img(base64_mask_image) - expanded_mask_img = img2imgapi.maskExpansion(mask_image,mask_expansion) + expanded_mask_img = img2imgapi.maskExpansion(mask_image,mask_expansion,blur) base64_expanded_mask_image = img2imgapi.img_2_b64(expanded_mask_img) await img2imgapi.base64ToPng(base64_expanded_mask_image,"expanded_mask.png")#save a copy of the mask of the expanded_mask for debugging diff --git a/typescripts/session/session.ts b/typescripts/session/session.ts index 63da9246..6c2a5306 100644 --- a/typescripts/session/session.ts +++ b/typescripts/session/session.ts @@ -103,6 +103,38 @@ const modeToClassMap: ModeToClassMap = { [GenerationModeEnum.Outpaint]: OutpaintMode, [GenerationModeEnum.Upscale]: UpscaleMode, } + +export async function getExpandedMask( + mask: string, + expansion_value: number, + blur: number +) { + try { + let use_sharp_mask = false + + let expanded_mask = mask + + if ( + use_sharp_mask === false && + mask && + expansion_value >= 0 && + blur >= 0 + ) { + //only if mask is available and sharp_mask is off + // use blurry and expanded mask + const iterations = expansion_value + expanded_mask = await python_replacement.maskExpansionRequest( + mask, + iterations, + blur + ) + } + + return expanded_mask + } catch (e) { + console.warn(e) + } +} export class Session { constructor() {} static async initializeSession(mode: GenerationModeEnum): Promise { diff --git a/utility/sdapi/python_replacement.js b/utility/sdapi/python_replacement.js index d47578d5..01cf8fce 100644 --- a/utility/sdapi/python_replacement.js +++ b/utility/sdapi/python_replacement.js @@ -262,7 +262,7 @@ async function openUrlRequest(url) { console.warn(e) } } -async function maskExpansionRequest(original_mask, mask_expansion_value) { +async function maskExpansionRequest(original_mask, mask_expansion_value, blur) { // const endpoint = 'sdapi/v1/img2img' // const full_url = `${g_sd_url}/${endpoint}` @@ -270,6 +270,7 @@ async function maskExpansionRequest(original_mask, mask_expansion_value) { const payload = { mask: original_mask, mask_expansion: mask_expansion_value, + blur: blur, } const extension_url = getExtensionUrl() @@ -286,7 +287,7 @@ async function maskExpansionRequest(original_mask, mask_expansion_value) { let r = await request.json() - console.log('maskExpansionRequest json:', r) + // console.log('maskExpansionRequest json:', r) return r['mask'] } catch (e) { console.warn(e) diff --git a/utility/session.js b/utility/session.js index 6a87d779..b78087b9 100644 --- a/utility/session.js +++ b/utility/session.js @@ -374,10 +374,11 @@ async function getSettings(session_data) { ) { //only if mask is available and sharp_mask is off // use blurry and expanded mask - const iterations = payload['mask_expansion'] + const expanded_mask = await py_re.maskExpansionRequest( payload['mask'], - iterations + payload['mask_expansion'], + mask_blur ) if (expanded_mask) { payload['expanded_mask'] = expanded_mask diff --git a/utility/tab/sd.js b/utility/tab/sd.js index 75934892..fa601b6d 100644 --- a/utility/tab/sd.js +++ b/utility/tab/sd.js @@ -273,23 +273,37 @@ document.getElementById('btnUpdate').addEventListener('click', async () => { document .getElementById('slMaskExpansion') .addEventListener('change', async (evt) => { - document.getElementById('slMaskExpansion') - const original_mask = g_generation_session.activeBase64MaskImage - if (original_mask) { - //only if mask is available - // use blurry and expanded mask - const iterations = evt.target.value - const modified_mask = await py_re.maskExpansionRequest( - original_mask, - iterations - ) - if (modified_mask) { - g_generation_session.base64maskExpansionImage = modified_mask - viewMaskExpansion() - } + const mask = session_ts.store.data.preprocessed_mask + const iterations = parseInt(evt.target.value) + + const mask_blur = html_manip.getMaskBlur() + session_ts.store.data.expanded_mask = await session_ts.getExpandedMask( + mask, + iterations, + mask_blur + ) + if (session_ts.store.data.expanded_mask) { + viewMaskExpansion() } }) +document + .getElementById('slMaskBlur') + .addEventListener('change', async (evt) => { + const mask = session_ts.store.data.preprocessed_mask + const iterations = parseInt( + document.getElementById('slMaskExpansion').value + ) + const mask_blur = parseInt(evt.target.value) + session_ts.store.data.expanded_mask = await session_ts.getExpandedMask( + mask, + iterations, + mask_blur + ) + if (session_ts.store.data.expanded_mask) { + viewMaskExpansion() + } + }) document .getElementById('btnInterrogate') .addEventListener('click', async () => { From bd6cc7243b23290fb30d4a9292aa5d7dcd20ade8 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 6 Jul 2023 11:56:47 +0300 Subject: [PATCH 089/143] button stylization for segment anything --- typescripts/sam/sam.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/typescripts/sam/sam.tsx b/typescripts/sam/sam.tsx index 572556f6..a56b22eb 100644 --- a/typescripts/sam/sam.tsx +++ b/typescripts/sam/sam.tsx @@ -52,6 +52,7 @@ const Sam = observer(() => { }} > + +
{store.data.prompts.map((prompt: string, index: number) => { return ( @@ -142,8 +244,11 @@ const OneButtonPrompt = observer(() => {
) } - return
{renderContainer()}
-}) + + render() { + return
{this.renderContainer()}
+ } +} const containers = document.querySelectorAll('.oneButtonPromptContainer')! From b5916f4cf4b3cb90d3133bbfe93aef05e1dc908c Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 6 Jul 2023 12:17:11 +0300 Subject: [PATCH 091/143] separate controlnet detect_map from mask --- sdapi_py_re.js | 4 +-- typescripts/controlnet/ControlNetUnit.tsx | 44 +++++++++++++++++------ typescripts/controlnet/entry.ts | 41 ++++++++++++++------- typescripts/controlnet/store.ts | 4 +-- typescripts/session/modes.ts | 4 +-- 5 files changed, 67 insertions(+), 30 deletions(-) diff --git a/sdapi_py_re.js b/sdapi_py_re.js index cde3dc52..d50d98ae 100644 --- a/sdapi_py_re.js +++ b/sdapi_py_re.js @@ -524,7 +524,7 @@ async function requestControlNetTxt2Img(plugin_settings) { mask_index >= numberOfAnnotations ) continue - control_net.setControlMaskSrc(base64_mask[mask_index], index) + control_net.setControlDetectMapSrc(base64_mask[mask_index], index) g_generation_session.controlNetMask[index] = base64_mask[mask_index] mask_index++ } @@ -614,7 +614,7 @@ async function requestControlNetImg2Img(plugin_settings) { mask_index >= numberOfAnnotations ) continue - control_net.setControlMaskSrc(base64_mask[mask_index], index) + control_net.setControlDetectMapSrc(base64_mask[mask_index], index) g_generation_session.controlNetMask[index] = base64_mask[mask_index] mask_index++ } diff --git a/typescripts/controlnet/ControlNetUnit.tsx b/typescripts/controlnet/ControlNetUnit.tsx index 33007b69..087adc6b 100644 --- a/typescripts/controlnet/ControlNetUnit.tsx +++ b/typescripts/controlnet/ControlNetUnit.tsx @@ -268,23 +268,41 @@ export default class ControlNetUnit extends React.Component< const rgb_detect_map_url = await io.convertBlackAndWhiteImageToRGBChannels3(detect_map) const rgb_detect_map = general.base64UrlToBase64(rgb_detect_map_url) - g_generation_session.controlNetMask[index] = rgb_detect_map - - storeData.mask = rgb_detect_map + // g_generation_session.controlNetMask[index] = rgb_detect_map + storeData.detect_map = rgb_detect_map } catch (e) { console.warn('PreviewAnnotator click(): index: ', index, e) } } + async setMask() { + try { + const selectionInfo = await psapi.getSelectionInfoExe() + if (selectionInfo) { + const mask_base64 = await io.getMaskFromCanvas() + this.props.appState.controlNetUnitData[this.props.index].mask = + mask_base64 + this.props.appState.controlNetUnitData[ + this.props.index + ].detect_map = mask_base64 + } else { + // await note.Notification.inactiveSelectionArea() + app.showAlert('No Selection is available') + } + } catch (e) { + console.warn(e) + } + } async toCanvas() { if ( g_generation_session.control_net_preview_selection_info && - g_generation_session.controlNetMask[this.props.index] + this.props.appState.controlNetUnitData[this.props.index].detect_map ) { const selection_info = g_generation_session.control_net_preview_selection_info const layer = await io.IO.base64ToLayer( - g_generation_session.controlNetMask[this.props.index], - 'ControlNet Mask.png', + this.props.appState.controlNetUnitData[this.props.index] + .detect_map, + 'ControlNet Detection Map.png', selection_info.left, selection_info.top, selection_info.width, @@ -292,7 +310,7 @@ export default class ControlNetUnit extends React.Component< ) } else { // await note.Notification.inactiveSelectionArea() - app.showAlert('Mask Image is not available') + app.showAlert('Detection Map is not available') } } async toControlNetInitImage() { @@ -314,7 +332,7 @@ export default class ControlNetUnit extends React.Component< const storeData = this.props.appState.controlNetUnitData[this.props.index] - storeData.input_image = storeData.mask + storeData.input_image = storeData.detect_map } async previewAnnotatorFromCanvas() { try { @@ -357,7 +375,7 @@ export default class ControlNetUnit extends React.Component< await io.convertBlackAndWhiteImageToRGBChannels3(detect_map) g_generation_session.controlNetMask[this.props.index] = detect_map - storeData.mask = general.base64UrlToBase64(rgb_detect_map_url) + storeData.detect_map = general.base64UrlToBase64(rgb_detect_map_url) } catch (e) { console.warn( 'PreviewAnnotator click(): index: ', @@ -441,9 +459,9 @@ export default class ControlNetUnit extends React.Component< id={`control_net_mask_${this.props.index}`} className="column-item-image" src={ - storeData.mask + storeData.detect_map ? 'data:image/png;base64,' + - storeData.mask + storeData.detect_map : 'https://source.unsplash.com/random' } width="300px" @@ -465,6 +483,10 @@ export default class ControlNetUnit extends React.Component< this )} > +
diff --git a/typescripts/controlnet/entry.ts b/typescripts/controlnet/entry.ts index 927287dc..bdce8134 100644 --- a/typescripts/controlnet/entry.ts +++ b/typescripts/controlnet/entry.ts @@ -96,8 +96,14 @@ function mapPluginSettingsToControlNet(plugin_settings: any) { store.controlNetUnitData[index].auto_image let input_image = store.controlNetUnitData[index].input_image if (b_sync_input_image && session_ts.store.data.init_image) { + // img2img mode input_image = session_ts.store.data.init_image store.controlNetUnitData[index].input_image = input_image + } else if ( + b_sync_input_image && + store.controlNetUnitData[index].enabled + ) { + //txt2img mode } return input_image @@ -105,11 +111,27 @@ function mapPluginSettingsToControlNet(plugin_settings: any) { console.warn(e) } } + function getControlNetMask(index: number) { + try { + const b_sync_input_image = + store.controlNetUnitData[index].auto_image + let mask = store.controlNetUnitData[index].mask // the user created mask + if (b_sync_input_image && session_ts.store.data.expanded_mask) { + //use the mask from inpaint and outpaint mode + mask = '' // this will tell controlnet to use SD mask + store.controlNetUnitData[index].mask = '' + } + + return mask + } catch (e) { + console.warn(e) + } + } for (let index = 0; index < store.maxControlNet; index++) { controlnet_units[index] = { enabled: getEnableControlNet(index), input_image: getControlNetInputImage(index), - mask: '', + mask: '', //getControlNetMask(index) ?? '', module: store.controlNetUnitData[index].module, model: store.controlNetUnitData[index].model, weight: store.controlNetUnitData[index].weight, @@ -135,15 +157,6 @@ function mapPluginSettingsToControlNet(plugin_settings: any) { } } - if ( - plugin_settings['mode'] === Enum.generationModeEnum['Img2Img'] || - plugin_settings['mode'] === Enum.generationModeEnum['Inpaint'] || - plugin_settings['mode'] === Enum.generationModeEnum['Outpaint'] - ) { - const b_use_guess_mode = store.controlNetUnitData[0].guessmode - controlnet_units[0]['guessmode'] = b_use_guess_mode - } - const controlnet_payload = { ...ps, controlnet_units, //keep for backward compatibility for now @@ -166,8 +179,9 @@ function getControlNetMaxModelsNumber() { function getUnitsData() { return store.controlNetUnitData } -function setControlMaskSrc(base64: string, index: number) { - store.controlNetUnitData[index].mask = base64 +function setControlDetectMapSrc(base64: string, index: number) { + // store.controlNetUnitData[index].mask = base64 + store.controlNetUnitData[index].detect_map = base64 } function setControlInputImageSrc(base64: string, index: number) { store.controlNetUnitData[index].input_image = base64 @@ -204,8 +218,9 @@ export { mapPluginSettingsToControlNet, getControlNetMaxModelsNumber, getUnitsData, - setControlMaskSrc, + setControlDetectMapSrc, setControlInputImageSrc, isControlNetModeEnable, getModuleDetail, + store, } diff --git a/typescripts/controlnet/store.ts b/typescripts/controlnet/store.ts index f81565e1..56994b09 100644 --- a/typescripts/controlnet/store.ts +++ b/typescripts/controlnet/store.ts @@ -4,7 +4,7 @@ export const DefaultControlNetUnitData = { enabled: false, input_image: '', mask: '', - + detect_map: '', module: '', model: '', weight: 1.0, @@ -27,7 +27,7 @@ export interface controlNetUnitData { enabled: boolean input_image: string mask: string - + detect_map: string module_list: string[] model_list: string[] module: string diff --git a/typescripts/session/modes.ts b/typescripts/session/modes.ts index 3b3d00d4..9ebdcd7f 100644 --- a/typescripts/session/modes.ts +++ b/typescripts/session/modes.ts @@ -209,7 +209,7 @@ export class Txt2ImgMode extends Mode { mask_index >= numberOfAnnotations ) continue - control_net.setControlMaskSrc(base64_mask[mask_index], index) + control_net.setControlDetectMapSrc(base64_mask[mask_index], index) g_generation_session.controlNetMask[index] = base64_mask[mask_index] mask_index++ } @@ -352,7 +352,7 @@ export class Img2ImgMode extends Mode { mask_index >= numberOfAnnotations ) continue - control_net.setControlMaskSrc(base64_mask[mask_index], index) + control_net.setControlDetectMapSrc(base64_mask[mask_index], index) g_generation_session.controlNetMask[index] = base64_mask[mask_index] mask_index++ } From 07e275cfcfe039e4d4ce455d57a8c7b5711c556b Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 6 Jul 2023 13:01:46 +0300 Subject: [PATCH 092/143] add scroll to buttons to toolbar --- index.html | 5 ++-- index.js | 10 +++++--- typescripts/controlnet/main.tsx | 44 +++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/index.html b/index.html index 49321a78..439a3324 100644 --- a/index.html +++ b/index.html @@ -2919,9 +2919,10 @@ style="margin-right: 3px" title="Reselect the selection area for the current session" > - + +
diff --git a/index.js b/index.js index 3d7e9b6a..cf52bfde 100644 --- a/index.js +++ b/index.js @@ -4511,11 +4511,15 @@ Array.from(document.querySelectorAll('.rbSubTab')).forEach((rb) => { switchMenu(rb) }) -// document.getElementById('scrollToPrompt').addEventListener('click', () => { -// document.getElementById('taPrompt').scrollIntoView() -// }) +document.getElementById('scrollToPrompt').addEventListener('click', () => { + document + .querySelector('#search_second_panel > div.previewContainer') + .scrollIntoView() + // document.getElementById('taPrompt').scrollIntoView() +}) // document.getElementById('scrollToViewer').addEventListener('click', () => { + // document // .querySelector('#sp-stable-diffusion-ui-tab-page .reactViewerContainer') // .scrollIntoView() diff --git a/typescripts/controlnet/main.tsx b/typescripts/controlnet/main.tsx index 3e10acce..61a710a2 100644 --- a/typescripts/controlnet/main.tsx +++ b/typescripts/controlnet/main.tsx @@ -35,4 +35,48 @@ if (elem2) { ) } +function scrollToEnabledControlNetUnit() {} + +const button = document.getElementById('scrollToControlNetUnitContainer')! +const button_root = ReactDOM.createRoot(button) +let controlnet_unit_index = 0 +button_root.render( + +) + export { store, versionCompare } From 049501820da51c1f93bf509ffac9f3965bd500b7 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 6 Jul 2023 13:13:38 +0300 Subject: [PATCH 093/143] update new selection event handler on addition and subtraction to selection area --- index.js | 317 ++----------------------------------------------------- 1 file changed, 8 insertions(+), 309 deletions(-) diff --git a/index.js b/index.js index cf52bfde..51bb8c93 100644 --- a/index.js +++ b/index.js @@ -5,7 +5,7 @@ const _log = console.log const _warn = console.warn const _error = console.error - +let g_timer_value = 300 // temporary global variable for testing the timer pause function let g_version = 'v1.2.6' let g_sd_url = 'http://127.0.0.1:7860' let g_online_data_url = @@ -182,7 +182,7 @@ async function calcWidthHeightFromSelection() { //change (width and height) and (hrWidth, hrHeight) to match the ratio of selection const [width, height, hr_width, hr_height] = await selection.selectionToFinalWidthHeight() - + // console.log('width,height: ', width, height) html_manip.autoFillInWidth(width) html_manip.autoFillInHeight(height) html_manip.autoFillInHRWidth(hr_width) @@ -209,43 +209,11 @@ const eventHandler = async (event, descriptor) => { new_selection_info ) - const isSelectionActive = await psapi.checkIfSelectionAreaIsActive() - if (isSelectionActive) { - const current_selection = isSelectionActive // Note: don't use checkIfSelectionAreaIsActive to return the selection object, change this. + // const isSelectionActive = await psapi.checkIfSelectionAreaIsActive() + if (new_selection_info) { + const current_selection = new_selection_info // Note: don't use checkIfSelectionAreaIsActive to return the selection object, change this. await calcWidthHeightFromSelection() - - // console.log(` (${final_width}* ${final_height})/(${current_selection.width} * ${current_selection.height})`) - // console.log("detail density: ",(final_width* final_height)/(current_selection.width * current_selection.height)) - - // const new_selection = await psapi.getSelectionInfoExe() - - if ( - await hasSelectionChanged( - current_selection, - g_generation_session.selectionInfo - ) //new selection - ) { - // endSessionUI //red color - // if selection has changed : change the color and text generate btn "Generate" color "red" - // g_ui.endSessionUI() - // const selected_mode = html_manip.getMode() - const selected_mode = getCurrentGenerationModeByValue(g_sd_mode) - g_ui.generateModeUI(selected_mode) - } else { - // it's the same selection and the session is active - - //indicate that the session will continue. only if the session we are in the same mode as the session's mode - // startSessionUI// green color - const current_mode = html_manip.getMode() - if ( - g_generation_session.isActive() && // the session is active - g_generation_session.isSameMode(current_mode) //same mode - ) { - // g_ui.startSessionUI() - g_ui.generateMoreUI() - } - } } } catch (e) { console.warn(e) @@ -265,7 +233,7 @@ function getCurrentGenerationModeByValue(value) { } require('photoshop').action.addNotificationListener( - ['set', 'move'], + ['set', 'move', 'addTo', 'subtractFrom'], eventHandler ) //REFACTOR: move to document.js @@ -2018,7 +1986,7 @@ async function easyModeGenerate(mode) { try { //save laso selection if (g_is_laso_inapint_mode) { - await selection.makeMaskChannelExe('inpaint_laso_mask') + await selection.makeMaskChannelExe('mask') } } catch (e) { console.warn(e) @@ -2165,7 +2133,7 @@ async function easyModeGenerate(mode) { // await btnInitInpaintHandler() if (g_is_laso_inapint_mode) { - await selection.channelToSelectionExe('inpaint_laso_mask') + await selection.channelToSelectionExe('mask') const [init_image_base64, mask_base64] = await selection.inpaintLassoInitImageAndMask() init_image = init_image_base64 @@ -4118,146 +4086,6 @@ document .addEventListener('click', async () => { await horde_native.HordeSettings.saveSettings() }) -//REFACTOR: move to psapi.js -async function getColor(X, Y) { - // const background_layer_id = await app.activeDocument.backgroundLayer.id - - const batchPlay = require('photoshop').action.batchPlay - try { - const result = await batchPlay( - [ - { - _obj: 'colorSampler', - _target: { - _ref: 'document', - _enum: 'ordinal', - _value: 'targetEnum', - }, - samplePoint: { - horizontal: X, - vertical: Y, - }, - }, - ], - {} - ) - - const red = result[0].colorSampler.red - const green = result[0].colorSampler.grain - const blue = result[0].colorSampler.blue - - return [red, green, blue] - } catch (e) { - console.warn(e) - } -} -//REFACTOR: move to document.js -async function findDocumentType() { - //check if the background layer exsit - //if it doesn't return false - //if it does: - //duplicate the background layer and place it on the top of the document. - //sampler 10 random pixles - //and check if all the pixels has the same values. - //if it doesn't duplicate the background layer and place it above the background layer. - // make a white background layer. - //return true - - let document_type - const background_layer = await app.activeDocument.backgroundLayer - const has_background_layer = app.activeDocument.backgroundLayer - ? true - : false - const artboards = Array.from(await app.activeDocument.artboards) - if (artboards.length > 0) { - document_type = Enum.DocumentTypeEnum['ArtBoard'] - // } else if (layer_util.Layer.doesLayerExist(background_layer)) { - } else if (has_background_layer) { - //assume it's solid white background if correctHistory > 1 || layers.length > 5 - const b_correct_background = await isCorrectBackground() // check the history for correct operation - if (b_correct_background) { - document_type = Enum.DocumentTypeEnum['SolidBackground'] - } else { - //else - - //background layer does exist - //check if it's solid color background or an image background - //sampler 10 random pixels - let width = app.activeDocument.width - let height = app.activeDocument.height - let old_rgb - let same_color = true - - await executeAsModal(async () => { - if (app.activeDocument.layers.length > 1) { - await layer_util.toggleBackgroundLayerExe() // hide all layers except the background layer - } - for (let i = 0; i < 10; ++i) { - let x = Math.floor(Math.random() * width) - let y = Math.floor(Math.random() * height) - - const rgb = await getColor(x, y) - if (old_rgb) { - if ( - Math.round(old_rgb[0]) === Math.round(rgb[0]) && - Math.round(old_rgb[1]) === Math.round(rgb[1]) && - Math.round(old_rgb[2]) === Math.round(rgb[2]) - ) { - } else { - same_color = false //it's an image background - break - } - } - old_rgb = rgb - } - if (app.activeDocument.layers.length > 1) { - await layer_util.toggleBackgroundLayerExe() // undo the toggle operation; display all layers - } - }) - - document_type = same_color - ? Enum.DocumentTypeEnum['SolidBackground'] - : Enum.DocumentTypeEnum['ImageBackground'] - } - } else { - //create the background layer since it doesn't exsit - document_type = Enum.DocumentTypeEnum['NoBackground'] - } - - return document_type -} -//REFACTOR: move to document.js -async function correctDocumentType(documentType) { - if (documentType === Enum.DocumentTypeEnum['SolidBackground']) { - //do nothing - } else if (documentType === Enum.DocumentTypeEnum['ImageBackground']) { - //duplicate the layer - await executeAsModal(async () => { - const image_layer = - await app.activeDocument.backgroundLayer.duplicate() // - image_layer.name = 'Image' - await app.activeDocument.backgroundLayer.delete() - await layer_util.createBackgroundLayer(255, 255, 255) - }) - } else if (documentType === Enum.DocumentTypeEnum['ArtBoard']) { - //duplicate the layer - await app.showAlert( - "the plugin doesn't work with artboards, create normal document with no artboard to use the plugin" - ) - throw "the plugin doesn't work with artboards, create normal document with no artboard to use the plugin" - } else if (documentType === Enum.DocumentTypeEnum['NoBackground']) { - await layer_util.createBackgroundLayer(255, 255, 255) - } -} - -async function isCorrectBackground() { - const historylist = app.activeDocument.historyStates.filter( - (h) => h.name === 'Correct Background' - ) - console.log('historylist:', historylist) - const is_correct_background = historylist.length > 0 ? true : false - return is_correct_background -} document .getElementById('btnSaveHordeSettings') @@ -4265,135 +4093,6 @@ document await horde_native.HordeSettings.saveSettings() }) -async function getColor(X, Y) { - // const background_layer_id = await app.activeDocument.backgroundLayer.id - - const batchPlay = require('photoshop').action.batchPlay - try { - const result = await batchPlay( - [ - { - _obj: 'colorSampler', - _target: { - _ref: 'document', - _enum: 'ordinal', - _value: 'targetEnum', - }, - samplePoint: { - horizontal: X, - vertical: Y, - }, - }, - ], - {} - ) - - const red = result[0].colorSampler.red - const green = result[0].colorSampler.grain - const blue = result[0].colorSampler.blue - - return [red, green, blue] - } catch (e) { - console.warn(e) - } -} - -// async function findDocumentType() { -// //check if the background layer exsit -// //if it doesn't return false -// //if it does: -// //duplicate the background layer and place it on the top of the document. -// //sampler 10 random pixles -// //and check if all the pixels has the same values. -// //if it doesn't duplicate the background layer and place it above the background layer. -// // make a white background layer. -// //return true - -// let document_type -// const background_layer = await app.activeDocument.backgroundLayer -// const artboards = Array.from(await app.activeDocument.artboards) -// if (artboards.length > 0) { -// document_type = Enum.DocumentTypeEnum['ArtBoard'] -// } else if (layer_util.Layer.doesLayerExist(background_layer)) { -// //assume it's solid white background if correctHistory > 1 || layers.length > 5 -// const b_correct_background = await isCorrectBackground() -// if (b_correct_background) { -// document_type = Enum.DocumentTypeEnum['SolidBackground'] -// } else { -// //else - -// //background layer does exist -// //check if it's solid color background or an image background -// //sampler 10 random pixels -// let width = app.activeDocument.width -// let height = app.activeDocument.height -// let old_rgb -// let same_color = true -// await executeAsModal(async () => { -// for (let i = 0; i < 10; ++i) { -// let x = Math.floor(Math.random() * width) -// let y = Math.floor(Math.random() * height) - -// const rgb = await getColor(x, y) -// if (old_rgb) { -// if ( -// Math.round(old_rgb[0]) === Math.round(rgb[0]) && -// Math.round(old_rgb[1]) === Math.round(rgb[1]) && -// Math.round(old_rgb[2]) === Math.round(rgb[2]) -// ) { -// } else { -// same_color = false //it's an image background -// break -// } -// } -// old_rgb = rgb -// } -// }) - -// document_type = same_color -// ? Enum.DocumentTypeEnum['SolidBackground'] -// : Enum.DocumentTypeEnum['ImageBackground'] -// } -// } else { -// //create the background layer since it doesn't exsit -// document_type = Enum.DocumentTypeEnum['NoBackground'] -// } - -// return document_type -// } - -async function correctDocumentType(documentType) { - if (documentType === Enum.DocumentTypeEnum['SolidBackground']) { - //do nothing - } else if (documentType === Enum.DocumentTypeEnum['ImageBackground']) { - //duplicate the layer - await executeAsModal(async () => { - const image_layer = - await app.activeDocument.backgroundLayer.duplicate() // - image_layer.name = 'Image' - await app.activeDocument.backgroundLayer.delete() - await layer_util.createBackgroundLayer(255, 255, 255) - }) - } else if (documentType === Enum.DocumentTypeEnum['ArtBoard']) { - //duplicate the layer - await app.showAlert( - "the plugin doesn't work with artboards, create normal document with no artboard to use the plugin" - ) - throw "the plugin doesn't work with artboards, create normal document with no artboard to use the plugin" - } else if (documentType === Enum.DocumentTypeEnum['NoBackground']) { - await layer_util.createBackgroundLayer(255, 255, 255) - } -} - -async function isCorrectBackground() { - const historylist = app.activeDocument.historyStates.filter( - (h) => h.name === 'Correct Background' - ) - console.log('historylist:', historylist) - const is_correct_background = historylist.length > 0 ? true : false - return is_correct_background -} - let g_viewer_sub_menu_list = [] const submenu = { From 2120f51cf4aba3e8c2cf35824c24d5171696a0d2 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 6 Jul 2023 13:30:27 +0300 Subject: [PATCH 094/143] auto mask the output image when mask is available --- index.html | 44 +--- selection.js | 391 ++++++++++++++++++++++++++------ typescripts/session/modes.ts | 29 ++- typescripts/session/progress.ts | 2 + typescripts/session/session.ts | 157 +++++++++---- typescripts/util/elements.tsx | 2 +- typescripts/util/grid.tsx | 16 +- typescripts/util/ts/io.ts | 5 +- typescripts/viewer/preview.tsx | 6 +- typescripts/viewer/viewer.tsx | 100 +++++--- utility/io.js | 64 +++++- utility/tab/sd.js | 10 +- 12 files changed, 614 insertions(+), 212 deletions(-) diff --git a/index.html b/index.html index 439a3324..6e90a9e7 100644 --- a/index.html +++ b/index.html @@ -2847,50 +2847,8 @@ " >
-
- -
+
- -
+
+ { + store.data.auto_mask = event.target.checked + }} + checked={store.data.auto_mask} + > + { + //@ts-ignore + Locale('Apply Auto Masking') + } + +
{ callback: async (index: number) => { await moveImageToLayer( mask_store.data.images[index], - session_ts.store.data.selectionInfo - ) - }, - }, - { - ComponentType: MoveToCanvasSvg, - callback: async (index: number) => { - const base64_monochrome_mask = - await io.convertGrayscaleToMonochrome( - mask_store.data.images[index] - ) - await moveImageToLayer( - base64_monochrome_mask, - session_ts.store.data.selectionInfo + session_ts.store.data.selectionInfo, + 'mask' ) }, }, diff --git a/utility/io.js b/utility/io.js index 214e6036..fbeb5eb2 100644 --- a/utility/io.js +++ b/utility/io.js @@ -312,15 +312,37 @@ class IO { ) { let layer if (format === 'png') { - layer = await IOBase64ToLayer.base64PngToLayer( - base64_png, - image_name - ) + try { + await executeAsModal(async (context) => { + // let history_id + // try { + // history_id = await context.hostControl.suspendHistory({ + // documentID: app.activeDocument.id, + // name: 'Place Image', + // }) + // } catch (e) { + // console.warn(e) + // } + + layer = await IOBase64ToLayer.base64PngToLayer( + base64_png, + image_name + ) - psapi.setVisibleExe(layer, true) - await layer_util.Layer.scaleTo(layer, width, height) // - await layer_util.Layer.moveTo(layer, to_x, to_y) //move to the top left corner - psapi.setVisibleExe(layer, true) + await psapi.setVisibleExe(layer, true) + await layer_util.Layer.scaleTo(layer, width, height) // + await layer_util.Layer.moveTo(layer, to_x, to_y) //move to the top left corner + await psapi.setVisibleExe(layer, true) + + // try { + // await context.hostControl.resumeHistory(history_id) + // } catch (e) { + // console.warn(e) + // } + }) + } catch (e) { + console.warn(e) + } } return layer } @@ -739,7 +761,7 @@ class IOLog { append: true, }) } catch (e) { - console.warn(e) + _warn(e) } } } @@ -995,6 +1017,29 @@ async function getOutpaintInitImageAndMask() { } } +//generate black and white mask image from +async function getMaskFromCanvas() { + try { + await executeAsModal(async () => await layer_util.toggleActiveLayer()) //only white mark layer should be visible + let mask_base64 = await getImageFromCanvas() + await executeAsModal(async () => { + await layer_util.toggleActiveLayer() // undo the toggling operation, active layer will be visible + app.activeDocument.activeLayers[0].visible = false //hide the white mark + }) + let jimp_mask = await Jimp.read(Buffer.from(mask_base64, 'base64')) //make jimp object + jimp_mask = await jimp_mask.scan( + 0, + 0, + jimp_mask.bitmap.width, + jimp_mask.bitmap.height, + inpaintTransparentToMask + ) //convert transparent image to black and white image + mask_base64 = await getBase64FromJimp(jimp_mask) + return mask_base64 + } catch (e) { + warn(e) + } +} async function getInpaintInitImageAndMask() { try { await executeAsModal(async () => await layer_util.toggleActiveLayer()) //only white mark layer should be visible @@ -1307,4 +1352,5 @@ module.exports = { getImageSize, convertGrayscaleToMonochrome, deleteFileIfLargerThan, + getMaskFromCanvas, } diff --git a/utility/tab/sd.js b/utility/tab/sd.js index fa601b6d..e9ab674d 100644 --- a/utility/tab/sd.js +++ b/utility/tab/sd.js @@ -92,9 +92,9 @@ async function updateClickEventHandler(current_version) { } function viewMaskExpansion() { - if (g_generation_session.base64maskExpansionImage) { + if (session_ts.store.data.expanded_mask) { const mask_src = general.base64ToBase64Url( - g_generation_session.base64maskExpansionImage + session_ts.store.data.expanded_mask ) html_manip.setInitImageMaskSrc(mask_src) } else { @@ -105,10 +105,8 @@ function viewMaskExpansion() { } function viewDrawnMask() { //this is the generated mask or user drawn mask, but it's not the mask after expansion - if (g_generation_session.activeBase64MaskImage) { - const mask_src = general.base64ToBase64Url( - g_generation_session.activeBase64MaskImage - ) + if (session_ts.store.data.mask) { + const mask_src = general.base64ToBase64Url(session_ts.store.data.mask) html_manip.setInitImageMaskSrc(mask_src) } else { console.log('no mask is available') From a8ddc75f87eec119751123b845579f506e63f4f4 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 6 Jul 2023 13:30:39 +0300 Subject: [PATCH 095/143] disable mobx warning temporarily --- typescripts/entry.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/typescripts/entry.ts b/typescripts/entry.ts index 931f5367..9f327c74 100644 --- a/typescripts/entry.ts +++ b/typescripts/entry.ts @@ -1,3 +1,7 @@ +import { configure } from 'mobx' +configure({ + enforceActions: 'never', // disable mobx warning temporarily +}) export * as control_net from './controlnet/entry' export * as after_detailer_script from './after_detailer/after_detailer' export * as ultimate_sd_upscaler from './ultimate_sd_upscaler/ultimate_sd_upscaler' From 2948dad4e3fff2b118de8cf53f5f8884d654522a Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 6 Jul 2023 16:08:28 +0300 Subject: [PATCH 096/143] add setting's option to log errors to files --- index.js | 107 +++++++++++++++--------------- typescripts/settings/settings.tsx | 74 ++++++++++++++++++++- 2 files changed, 126 insertions(+), 55 deletions(-) diff --git a/index.js b/index.js index 51bb8c93..337f9151 100644 --- a/index.js +++ b/index.js @@ -78,66 +78,69 @@ const { const io = require('./utility/io') -const should_log = true -if (should_log) { - setInterval(async () => { - await io.deleteFileIfLargerThan('log.txt', 200) - }, 2 * 60 * 1000) - window.addEventListener('error', (event) => { - const [a, b, c, d, e] = [1, 2, 3, 4, 5] - console.log(`message: ${a}`) - console.log(`source: ${b}`) - console.log(`lineno: ${c}`) - console.log(`colno: ${d}`) - console.log(`error: ${e}`) - }) - - console.log = (data, ...optional_param) => { - try { - _log(data, ...optional_param) +function setLogMethod(should_log_to_file = true) { + let timer_id + if (should_log_to_file) { + console.log = (data, ...optional_param) => { + try { + _log(data, ...optional_param) - // const error = new Error({ data, ...optional_param }); - const formattedOutput = logger.formateLog(data, ...optional_param) - io.IOLog.saveLogToFile({ log: formattedOutput }, 'log.txt') - } catch (e) { - _warn('error while logging: ') - _warn(e) + // const error = new Error({ data, ...optional_param }); + const formattedOutput = logger.formateLog( + data, + ...optional_param + ) + io.IOLog.saveLogToFile({ log: formattedOutput }, 'log.txt') + } catch (e) { + _warn('error while logging: ') + _warn(e) + } } - } - console.warn = (data, ...optional_param) => { - try { - _warn(data, ...optional_param) - const error = new Error() - const stackTrace = error.stack - const formattedOutput = logger.formateLog(data, ...optional_param) - io.IOLog.saveLogToFile( - { warning: formattedOutput, stackTrace }, - 'log.txt' - ) - } catch (e) { - _warn('error while logging: ') - _warn(e) + console.warn = (data, ...optional_param) => { + try { + _warn(data, ...optional_param) + const error = new Error() + const stackTrace = error.stack + const formattedOutput = logger.formateLog( + data, + ...optional_param + ) + io.IOLog.saveLogToFile( + { warning: formattedOutput, stackTrace }, + 'log.txt' + ) + } catch (e) { + _warn('error while logging: ') + _warn(e) + } } - } - console.error = (data, ...optional_param) => { - try { - _error(data, ...optional_param) - const error = new Error() - const stackTrace = error.stack - const formattedOutput = logger.formateLog(data, ...optional_param) - io.IOLog.saveLogToFile( - { error: formattedOutput, stackTrace }, - 'log.txt' - ) - } catch (e) { - _error('error while logging: ') - _error(e) + console.error = (data, ...optional_param) => { + try { + _error(data, ...optional_param) + const error = new Error() + const stackTrace = error.stack + const formattedOutput = logger.formateLog( + data, + ...optional_param + ) + io.IOLog.saveLogToFile( + { error: formattedOutput, stackTrace }, + 'log.txt' + ) + } catch (e) { + _error('error while logging: ') + _error(e) + } } + } else { + console.log = _log + console.warn = _warn + console.error = _error } } - +setLogMethod(settings_tab_ts.store.data.should_log_to_file) // const ultimate_sd_upscaler_script_test = require('./ultimate_sd_upscaler/dist/main') // const { diff --git a/typescripts/settings/settings.tsx b/typescripts/settings/settings.tsx index bf3fa453..792ae730 100644 --- a/typescripts/settings/settings.tsx +++ b/typescripts/settings/settings.tsx @@ -3,9 +3,11 @@ import ReactDOM from 'react-dom/client' import { observer } from 'mobx-react' import { AStore } from '../main/astore' -import { SpMenu } from '../util/elements' +import { SpCheckBox, SpMenu } from '../util/elements' import Locale from '../locale/locale' import globalStore from '../globalstore' +import { io } from '../util/oldSystem' +import { reaction } from 'mobx' // import { Jimp } from '../util/oldSystem' declare const Jimp: any // make sure you import jimp before importing settings.tsx @@ -33,8 +35,62 @@ const interpolationMethods: InterpolationMethod = { export const store = new AStore({ scale_interpolation_method: interpolationMethods.bilinear, + should_log_to_file: false, + delete_log_file_timer_id: null, }) +function onShouldLogToFileChange(event: any) { + try { + const should_log_to_file: boolean = event.target.checked + store.data.should_log_to_file = should_log_to_file + if (should_log_to_file && !store.data.delete_log_file_timer_id) { + store.data.delete_log_file_timer_id = setDeleteLogTimer() + } else { + //don't log and clear delete file timer + try { + store.data.delete_log_file_timer_id = clearInterval( + store.data.delete_log_file_timer_id + ) + } catch (e) { + console.warn(e) + } + } + //@ts-ignore + setLogMethod(should_log_to_file) + } catch (e) { + console.warn(e) + } +} + +function setDeleteLogTimer() { + const timer_id = setInterval(async () => { + await io.deleteFileIfLargerThan('log.txt', 200) + }, 2 * 60 * 1000) + console.log('setDeleteLogTimer() timer_id :', timer_id) + return timer_id +} +// reaction( +// () => { +// return store.data.should_log_to_file +// }, +// (should_log_to_file) => { +// if (should_log_to_file && !store.data.delete_log_file_timer_id) { +// store.data.delete_log_file_timer_id = setDeleteLogTimer() +// } else { +// //don't log and clear delete file timer +// try { +// store.data.delete_log_file_timer_id = clearInterval( +// store.data.delete_log_file_timer_id +// ) +// } catch (e) { +// console.warn(e) +// } +// } + +// //@ts-ignore +// setLogMethod(should_log_to_file) +// } +// ) const Settings = observer(() => { return (
@@ -67,10 +123,22 @@ const Settings = observer(() => { label_item="select language" selected_index={['en_US', 'zh_CN'].indexOf(globalStore.Locale)} onChange={(id: any, value: any) => { - globalStore.Locale = value.item; - localStorage.setItem('last_selected_locale', value); + globalStore.Locale = value.item + localStorage.setItem('last_selected_locale', value) }} > + + { + //@ts-ignore + Locale('Log Errors To File') + } +
) }) From 4a9bd30970e4b5c780a297f604b75631b0b47b60 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 6 Jul 2023 16:34:36 +0300 Subject: [PATCH 097/143] Fix bug: the last seed is not being stored --- index.js | 4 ++-- typescripts/session/modes.ts | 4 +++- utility/sdapi/prompt_shortcut.js | 2 +- utility/sdapi/python_replacement.js | 6 +++--- utility/session.js | 2 +- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/index.js b/index.js index 337f9151..d34d5c13 100644 --- a/index.js +++ b/index.js @@ -1599,14 +1599,14 @@ document.getElementById('btnRandomSeed').addEventListener('click', async () => { //REFACTOR: move to events.js document.getElementById('btnLastSeed').addEventListener('click', async () => { try { - console.log('click on Last seed') + // console.log('click on Last seed') let seed = '-1' if (g_last_seed >= 0) { seed = g_last_seed.toString() //make sure the seed is a string } - console.log('seed:', seed) + // console.log('seed:', seed) document.querySelector('#tiSeed').value = seed } catch (e) { console.warn(e) diff --git a/typescripts/session/modes.ts b/typescripts/session/modes.ts index 89b4f5bb..36911c9e 100644 --- a/typescripts/session/modes.ts +++ b/typescripts/session/modes.ts @@ -22,7 +22,7 @@ declare let g_inpaint_mask_layer: any declare let g_sd_url: any declare let g_controlnet_max_models: any declare let g_generation_session: any - +declare let g_last_seed: any interface SessionData { init_image?: string mask?: string @@ -47,6 +47,8 @@ async function saveOutputImagesToDrive(images_info: any, settings: any) { ) //save the settings index += 1 } + g_last_seed = + images_info?.length > 0 ? images_info[0]?.auto_metadata?.Seed : '-1' return base64OutputImages } class Mode { diff --git a/utility/sdapi/prompt_shortcut.js b/utility/sdapi/prompt_shortcut.js index 408cf5eb..713156b1 100644 --- a/utility/sdapi/prompt_shortcut.js +++ b/utility/sdapi/prompt_shortcut.js @@ -29,7 +29,7 @@ function replaceShortcut(text, prompt_shortcut_json) { // print("word: ",word) if (word.length > 0 && prompt_shortcut_json.hasOwnProperty(word)) { const prompt = prompt_shortcut_json[word] - console.log('prompt: ', prompt) + // console.log('prompt: ', prompt) text = text.replace(original_keywords[i], prompt) } } diff --git a/utility/sdapi/python_replacement.js b/utility/sdapi/python_replacement.js index 01cf8fce..9644d2fa 100644 --- a/utility/sdapi/python_replacement.js +++ b/utility/sdapi/python_replacement.js @@ -17,10 +17,10 @@ function convertMetadataToJson(metadata_str) { const prompt = metadata_str.slice(0, last_new_line_index) const other_settings = metadata_str.slice(last_new_line_index + 1, -1) - console.log('prompt:', prompt) - console.log('other_settings:', other_settings) + // console.log('prompt:', prompt) + // console.log('other_settings:', other_settings) const sub_settings = other_settings.split(',') - console.log('sub_settings: ', sub_settings) + // console.log('sub_settings: ', sub_settings) const settings_json = {} settings_json['prompt'] = prompt diff --git a/utility/session.js b/utility/session.js index b78087b9..e11dc712 100644 --- a/utility/session.js +++ b/utility/session.js @@ -435,7 +435,7 @@ async function getSettings(session_data) { // payload['script_name'] = 'after detailer' function setAlwaysOnScripts() { const data = after_detailer_script.store.toJsFunc().data - console.log('setAlwaysOnScripts=> data:', data) + // console.log('setAlwaysOnScripts=> data:', data) const alwayson_scripts = { 'After Detailer': { From f862e603ac45d69410e4e6f3e9c1104a3d47e315 Mon Sep 17 00:00:00 2001 From: unknown <348063288@qq.com> Date: Fri, 7 Jul 2023 00:44:12 +0800 Subject: [PATCH 098/143] add some localization --- i18n/zh_CN/ps-plugin.json | 5 ++++- typescripts/after_detailer/after_detailer.tsx | 4 ++-- typescripts/controlnet/main.tsx | 3 ++- typescripts/locale/locale.ts | 2 +- typescripts/session/progress.ts | 3 ++- typescripts/session/session.ts | 3 ++- typescripts/settings/settings.tsx | 3 ++- typescripts/viewer/preview.tsx | 7 ++++--- typescripts/viewer/viewer.tsx | 18 +++++++++--------- 9 files changed, 28 insertions(+), 20 deletions(-) diff --git a/i18n/zh_CN/ps-plugin.json b/i18n/zh_CN/ps-plugin.json index 3a1cddc1..596ccd84 100644 --- a/i18n/zh_CN/ps-plugin.json +++ b/i18n/zh_CN/ps-plugin.json @@ -176,5 +176,8 @@ "ControlNet Unit": "ControlNet #", "Select Filter": "选择过滤器", "Select Module": "选择预处理器", - "Select Model": "选择模型" + "Select Model": "选择模型", + "Keep all generated images on the canvas": "在画布上保留所有生成图像", + "Delete all generated images from the canvas": "在画布上删除所有生成图像", + "Keep only the highlighted images": "在画布上保留选中的图像" } \ No newline at end of file diff --git a/typescripts/after_detailer/after_detailer.tsx b/typescripts/after_detailer/after_detailer.tsx index 8014dd94..45eac890 100644 --- a/typescripts/after_detailer/after_detailer.tsx +++ b/typescripts/after_detailer/after_detailer.tsx @@ -286,7 +286,7 @@ function Collapsible({ setIsOpen(!isOpen) } - return useObserver(()=> ( + return /*useObserver(()=>*/( (
- {Locale(label as any)} + {label} - +
{ selected_index={['en_US', 'zh_CN'].indexOf(globalStore.Locale)} onChange={(id: any, value: any) => { globalStore.Locale = value.item - localStorage.setItem('last_selected_locale', value) + localStorage.setItem('last_selected_locale', value.item) + console.log(localStorage.getItem('last_selected_locale')) }} > { progress.value = value?.toFixed(2) }) - } + } ) const Previewer = observer(() => { const renderImage = () => { @@ -61,9 +62,9 @@ const PreviewerContainer = observer(() => { return (
{ }} >
) -}) +}) // const node = document.getElementById('reactViewerContainer')! const containers = document.querySelectorAll('.reactViewerContainer') @@ -555,7 +555,7 @@ containers.forEach((container) => { root.render(
- +
From 2b668a48c28b04da7b834055bb0932d64c794fb5 Mon Sep 17 00:00:00 2001 From: unknown <348063288@qq.com> Date: Fri, 7 Jul 2023 00:50:25 +0800 Subject: [PATCH 099/143] add more localization --- i18n/zh_CN/ps-plugin.json | 3 ++- typescripts/session/generate.tsx | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/i18n/zh_CN/ps-plugin.json b/i18n/zh_CN/ps-plugin.json index 596ccd84..5cb2e7c7 100644 --- a/i18n/zh_CN/ps-plugin.json +++ b/i18n/zh_CN/ps-plugin.json @@ -179,5 +179,6 @@ "Select Model": "选择模型", "Keep all generated images on the canvas": "在画布上保留所有生成图像", "Delete all generated images from the canvas": "在画布上删除所有生成图像", - "Keep only the highlighted images": "在画布上保留选中的图像" + "Keep only the highlighted images": "在画布上保留选中的图像", + "Generate More": "生成更多" } \ No newline at end of file diff --git a/typescripts/session/generate.tsx b/typescripts/session/generate.tsx index d683d7c0..3bd43193 100644 --- a/typescripts/session/generate.tsx +++ b/typescripts/session/generate.tsx @@ -8,6 +8,7 @@ import './style/generate.css' import { io, note, psapi, selection } from '../util/oldSystem' import { GenerationModeEnum } from '../util/ts/enum' import { initializeBackground } from '../util/ts/document' +import Locale from '../locale/locale' //example: take 'oI' in 'LassoInpaint' and replace it with 'o I' thus creating 'Lasso Inpaint' const modeDisplayNames = Object.fromEntries( @@ -91,6 +92,7 @@ const ToolbarGenerateButtons = observer(() => { return (
- - // base64 - // ? 'data:image/png;base64,' + base64 - // : 'https://source.unsplash.com/random' - // )} - thumbnails={store.data.thumbnails} - width={store.data.width} - height={store.data.height} - action_buttons={[ - { - ComponentType: PenSvg, - callback: async (index: number) => { - try { - const base64 = general.base64UrlToBase64( - store.data.thumbnails[index] - ) - await selection.base64ToLassoSelection( - base64, - store.data.selection_info_list[index] +@observer +export class Sam extends React.Component<{ + // store: AStore +}> { + async initScript() { + const is_installed = await isScriptInstalled(store.data.script_name) + await store.updateProperty('is_installed', is_installed) + } + async componentDidMount(): Promise { + await this.initScript() + } + + renderScript() { + return ( +
+ { + store.data.prompt = event.target.value + }} + > + + + // base64 + // ? 'data:image/png;base64,' + base64 + // : 'https://source.unsplash.com/random' + // )} + thumbnails={store.data.thumbnails} + width={store.data.width} + height={store.data.height} + action_buttons={[ + { + ComponentType: PenSvg, + callback: async (index: number) => { + try { + const base64 = general.base64UrlToBase64( store.data.thumbnails[index] - ), - 'segment_anything_mask.png', - to_x, - to_y, - width, - height - ) - } catch (e) { - console.warn(e) - } + ) + await selection.base64ToLassoSelection( + base64, + store.data.selection_info_list[index] + ) + } catch (e) { + console.warn(e) + } + }, }, - }, - ]} - > -
- ) -}) + { + ComponentType: MoveToCanvasSvg, + callback: async (index: number) => { + try { + const to_x = + store.data.selection_info_list[index] + ?.left + const to_y = + store.data.selection_info_list[index] + ?.top + const width = + store.data.selection_info_list[index] + ?.width + const height = + store.data.selection_info_list[index] + ?.height + + await io.IO.base64ToLayer( + general.base64UrlToBase64( + store.data.thumbnails[index] + ), + 'segment_anything_mask.png', + to_x, + to_y, + width, + height + ) + } catch (e) { + console.warn(e) + } + }, + }, + ]} + >
+
+ ) + } + render() { + return ( +
+ {store.data.is_installed ? ( + this.renderScript() + ) : ( + { + console.log(`Refresh ${store.data.script_name}`) + await this.initScript() + }} + > + )} +
+ ) + } +} const containers = document.querySelectorAll('.samContainer') containers.forEach((container) => { diff --git a/typescripts/settings/settings.tsx b/typescripts/settings/settings.tsx index 792ae730..7a9b322f 100644 --- a/typescripts/settings/settings.tsx +++ b/typescripts/settings/settings.tsx @@ -69,28 +69,7 @@ function setDeleteLogTimer() { console.log('setDeleteLogTimer() timer_id :', timer_id) return timer_id } -// reaction( -// () => { -// return store.data.should_log_to_file -// }, -// (should_log_to_file) => { -// if (should_log_to_file && !store.data.delete_log_file_timer_id) { -// store.data.delete_log_file_timer_id = setDeleteLogTimer() -// } else { -// //don't log and clear delete file timer -// try { -// store.data.delete_log_file_timer_id = clearInterval( -// store.data.delete_log_file_timer_id -// ) -// } catch (e) { -// console.warn(e) -// } -// } -// //@ts-ignore -// setLogMethod(should_log_to_file) -// } -// ) const Settings = observer(() => { return (
diff --git a/typescripts/util/elements.tsx b/typescripts/util/elements.tsx index f70dbaf1..fe64d26b 100644 --- a/typescripts/util/elements.tsx +++ b/typescripts/util/elements.tsx @@ -174,7 +174,9 @@ export class SpSliderWithLabel extends React.Component<{ } onChange={this.onSliderValueChangeHandler.bind(this)} > - {Locale(this.props.label as any)}: + + {Locale(this.props.label as any)}: + { + return ( +
+ + Script is not available; Make sure to install it from + Automatic1111 webui + + +
+ ) + } +) diff --git a/typescripts/util/ts/api.ts b/typescripts/util/ts/api.ts index 33d9e6b4..0177d037 100644 --- a/typescripts/util/ts/api.ts +++ b/typescripts/util/ts/api.ts @@ -1,3 +1,4 @@ +declare let g_sd_url: string export async function requestGet(url: string) { let json = null @@ -74,3 +75,18 @@ export async function requestFormDataPost(url: string, payload: any) { console.warn(e) } } + +export async function isScriptInstalled(script_name: string): Promise { + let is_installed = false + try { + const full_url = `${g_sd_url}/sdapi/v1/scripts` + const scripts = await requestGet(full_url) + is_installed = + scripts?.txt2img?.includes(script_name) || + scripts?.img2img?.includes(script_name) + } catch (e) { + console.error(e) + } + console.log('is_installed: ', is_installed) + return is_installed +} From bf1543ac8a045adce102bc1a3c40e7b0db798c8d Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Sun, 9 Jul 2023 11:29:48 +0300 Subject: [PATCH 102/143] add support to controlnet 'Auto Image' in txt2img mode --- sdapi_py_re.js | 4 +--- typescripts/controlnet/entry.ts | 22 +++++++++++++++++++++- typescripts/session/modes.ts | 8 ++++++++ typescripts/session/session.ts | 5 +++++ utility/sdapi/prompt_shortcut.js | 10 +--------- 5 files changed, 36 insertions(+), 13 deletions(-) diff --git a/sdapi_py_re.js b/sdapi_py_re.js index d50d98ae..530ae0f5 100644 --- a/sdapi_py_re.js +++ b/sdapi_py_re.js @@ -209,14 +209,12 @@ async function loadPromptShortcut() { prompt_shortcut_json = await py_re.loadPromptShortcut( 'prompt_shortcut.json' ) - console.log('loadPromptShortcut:', prompt_shortcut_json) - // console.log('loadPromptShortcut: request: ',request) + // console.log('loadPromptShortcut:', prompt_shortcut_json) } catch (e) { console.warn(e) prompt_shortcut_json = {} } return prompt_shortcut_json - // return json['prompt_shortcut'] } async function savePromptShortcut(prompt_shortcut) { diff --git a/typescripts/controlnet/entry.ts b/typescripts/controlnet/entry.ts index 34a297ec..0e12f51d 100644 --- a/typescripts/controlnet/entry.ts +++ b/typescripts/controlnet/entry.ts @@ -1,6 +1,7 @@ import { setControlImageSrc } from '../../utility/html_manip' import { session_ts } from '../entry' import { Enum, api, python_replacement } from '../util/oldSystem' +import { GenerationModeEnum } from '../util/ts/enum' import { store, versionCompare } from './main' const { getExtensionUrl } = python_replacement @@ -117,7 +118,26 @@ function mapPluginSettingsToControlNet(plugin_settings: any) { const b_sync_input_image = store.controlNetUnitData[index].auto_image let input_image = store.controlNetUnitData[index].input_image - if (b_sync_input_image && session_ts.store.data.init_image) { + if ( + b_sync_input_image && + [GenerationModeEnum.Txt2Img].includes( + session_ts.store.data.mode + ) + ) { + //conditions: 1) txt2img mode 2)auto image on 3)first generation of session + + input_image = session_ts.store.data.controlnet_input_image ?? '' + store.controlNetUnitData[index].input_image = input_image + } + if ( + b_sync_input_image && + [ + GenerationModeEnum.Img2Img, + GenerationModeEnum.Inpaint, + GenerationModeEnum.Outpaint, + GenerationModeEnum.LassoInpaint, + ].includes(session_ts.store.data.mode) + ) { // img2img mode input_image = session_ts.store.data.init_image store.controlNetUnitData[index].input_image = input_image diff --git a/typescripts/session/modes.ts b/typescripts/session/modes.ts index 36911c9e..d4d354db 100644 --- a/typescripts/session/modes.ts +++ b/typescripts/session/modes.ts @@ -241,6 +241,14 @@ export class Txt2ImgMode extends Mode { if (b_enable_control_net) { //use control net + if (session_ts.store.data.generation_number === 1) { + session_ts.store.data.controlnet_input_image = + await io.getImg2ImgInitImage() + } + console.log( + 'session_ts.store.data.controlnet_input_image: ', + session_ts.store.data.controlnet_input_image + ) response_json = await this.requestControlNetTxt2Img(settings) } else { diff --git a/typescripts/session/session.ts b/typescripts/session/session.ts index 0ec1b624..80524bc3 100644 --- a/typescripts/session/session.ts +++ b/typescripts/session/session.ts @@ -40,6 +40,8 @@ export const store = new AStore({ can_generate_more: false, // is_active: false, // is session active is_interrupted: false, // did we interrupt the generation + generation_number: 0, // generation number per session, 0 mean first generation + controlnet_input_image: '', // the controlnet the image that will controlnet load }) function hasSelectionChanged(new_selection: any, old_selection: any) { @@ -230,6 +232,7 @@ export class Session { static async initializeGeneration() { store.data.is_interrupted = false store.data.can_generate = false + store.data.generation_number += 1 } static async generate(mode: GenerationModeEnum): Promise<{ output_images: any @@ -408,6 +411,8 @@ export class Session { store.data.init_image = '' store.data.mask = '' store.data.expanded_mask = '' + store.data.generation_number = 0 + store.data.controlnet_input_image = '' } static async getOutput() {} diff --git a/utility/sdapi/prompt_shortcut.js b/utility/sdapi/prompt_shortcut.js index 713156b1..cbe38b4a 100644 --- a/utility/sdapi/prompt_shortcut.js +++ b/utility/sdapi/prompt_shortcut.js @@ -17,23 +17,15 @@ function replaceShortcut(text, prompt_shortcut_json) { return content }) - // original_substrings = list(map(lambda s: '{'+s+'}',raw_keywords)) - - // print("strip_keywords: ", strip_keywords) - // print("original_substrings: ",original_substrings) - // # print ("text:",text) - let i = 0 for (const word of strip_keywords) { - // # word = word.strip() - // print("word: ",word) if (word.length > 0 && prompt_shortcut_json.hasOwnProperty(word)) { const prompt = prompt_shortcut_json[word] // console.log('prompt: ', prompt) text = text.replace(original_keywords[i], prompt) } } - console.log('final text: ', text) + // console.log('final text: ', text) return text } module.exports = { From f819cece389777e90b1ea0bb296f22fa86099d53 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Sun, 9 Jul 2023 12:47:30 +0300 Subject: [PATCH 103/143] new icon for reselect-area button by @amir167 --- icon/reselect-area.svg | 35 +++++++++++++++++++++++++++++++++++ index.html | 2 +- 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 icon/reselect-area.svg diff --git a/icon/reselect-area.svg b/icon/reselect-area.svg new file mode 100644 index 00000000..9bfd19c2 --- /dev/null +++ b/icon/reselect-area.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/index.html b/index.html index 0f87c8f9..07b63974 100644 --- a/index.html +++ b/index.html @@ -598,7 +598,7 @@ background-repeat: no-repeat; } .selectionAreaButton { - background-image: url(./icon/selection-area_2.svg); + background-image: url(./icon/reselect-area.svg); } .interrogateButton { font-family: Arial, Verdana; From fc42949830eb1781b12626b1cfa86fb8c8e03745 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Sun, 9 Jul 2023 19:20:54 +0300 Subject: [PATCH 104/143] rename 'Continue Session' btn to 'Reuse Selection' --- index.js | 2 +- selection.js | 2 ++ typescripts/session/generate.tsx | 9 +++++---- typescripts/session/modes.ts | 10 +++++----- utility/notification.js | 9 ++++++--- 5 files changed, 19 insertions(+), 13 deletions(-) diff --git a/index.js b/index.js index d34d5c13..9f619974 100644 --- a/index.js +++ b/index.js @@ -1276,7 +1276,7 @@ function pastImage2Layer() { ], { synchronousExecution: true, - modalBehavior: 'fail', + modalBehavior: 'execute', } ) }, diff --git a/selection.js b/selection.js index 2a340136..f57afe6e 100644 --- a/selection.js +++ b/selection.js @@ -1111,11 +1111,13 @@ async function black_white_layer_to_mask_multi_batchplay( await timer(g_timer_value) await executeAsModal(async () => { + await layer_util.toggleActiveLayer() // toggle active layer will be visible, note: doesn't solve the issue in outpaint mode result = await psAction.batchPlay(command2, {}) }) await timer(g_timer_value) await executeAsModal(async () => { + await layer_util.toggleActiveLayer() // undo the toggling operation, active layer will be visible, note: doesn't solve the issue in outpaint mode result = await psAction.batchPlay(command3, {}) }) } diff --git a/typescripts/session/generate.tsx b/typescripts/session/generate.tsx index 3bd43193..d5267599 100644 --- a/typescripts/session/generate.tsx +++ b/typescripts/session/generate.tsx @@ -92,7 +92,7 @@ const ToolbarGenerateButtons = observer(() => { return (
+ + {!this.props.appState.controlNetUnitData[ + this.props.index + ].model + .toLowerCase() + .includes('inpaint') ? ( + void 0 + ) : ( +
+
+ + + + + + +
+
+ +
+
+ )}
Date: Mon, 10 Jul 2023 09:09:49 +0300 Subject: [PATCH 107/143] store should_log_to_file value in localStorage --- typescripts/settings/settings.tsx | 116 ++++++++++++++++-------------- 1 file changed, 64 insertions(+), 52 deletions(-) diff --git a/typescripts/settings/settings.tsx b/typescripts/settings/settings.tsx index f016c910..99f065ef 100644 --- a/typescripts/settings/settings.tsx +++ b/typescripts/settings/settings.tsx @@ -8,6 +8,7 @@ import Locale from '../locale/locale' import globalStore from '../globalstore' import { io } from '../util/oldSystem' import { reaction } from 'mobx' +import { storage } from 'uxp' // import { Jimp } from '../util/oldSystem' declare const Jimp: any // make sure you import jimp before importing settings.tsx @@ -35,13 +36,16 @@ const interpolationMethods: InterpolationMethod = { export const store = new AStore({ scale_interpolation_method: interpolationMethods.bilinear, - should_log_to_file: false, + should_log_to_file: + JSON.parse(storage.localStorage.getItem('should_log_to_file')) || false, delete_log_file_timer_id: null, }) + function onShouldLogToFileChange(event: any) { try { const should_log_to_file: boolean = event.target.checked store.data.should_log_to_file = should_log_to_file + storage.localStorage.setItem('should_log_to_file', should_log_to_file) if (should_log_to_file && !store.data.delete_log_file_timer_id) { store.data.delete_log_file_timer_id = setDeleteLogTimer() } else { @@ -70,59 +74,67 @@ function setDeleteLogTimer() { return timer_id } -const Settings = observer(() => { - return ( -
- { - return ( - interpolationMethods[key].photoshop === - store.data.scale_interpolation_method - .photoshop && - interpolationMethods[key].jimp === - store.data.scale_interpolation_method.jimp +@observer +export class Settings extends React.Component<{}> { + componentDidMount(): void {} + + render() { + return ( +
+ { + return ( + interpolationMethods[key].photoshop === + store.data.scale_interpolation_method + .photoshop && + interpolationMethods[key].jimp === + store.data.scale_interpolation_method.jimp + ) + } + )} + onChange={(id: any, value: any) => { + store.updateProperty( + 'scale_interpolation_method', + interpolationMethods[value.item] ) + }} + > + select language + { + globalStore.Locale = value.item + localStorage.setItem('last_selected_locale', value.item) + console.log( + localStorage.getItem('last_selected_locale') + ) + }} + > + + { + //@ts-ignore + Locale('Log Errors To File') } - )} - onChange={(id: any, value: any) => { - store.updateProperty( - 'scale_interpolation_method', - interpolationMethods[value.item] - ) - }} - > - select language - { - globalStore.Locale = value.item - localStorage.setItem('last_selected_locale', value.item) - console.log(localStorage.getItem('last_selected_locale')) - }} - > - - { - //@ts-ignore - Locale('Log Errors To File') - } - -
- ) -}) - + +
+ ) + } +} const containerNode = document.getElementById('reactSettingsContainer')! const root = ReactDOM.createRoot(containerNode) From a7f9ef7cdf696439f8fc129ce056f413abc53546 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Mon, 10 Jul 2023 10:27:37 +0300 Subject: [PATCH 108/143] can select segment anything mask even if a selection is active --- typescripts/sam/sam.tsx | 11 ++- typescripts/util/ts/selection.ts | 153 +++++++++++++++++++++++++++++++ 2 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 typescripts/util/ts/selection.ts diff --git a/typescripts/sam/sam.tsx b/typescripts/sam/sam.tsx index d122491f..f7815f28 100644 --- a/typescripts/sam/sam.tsx +++ b/typescripts/sam/sam.tsx @@ -11,6 +11,11 @@ import { PenSvg, ScriptInstallComponent, } from '../util/elements' +import { + applyMaskFromBlackAndWhiteImage, + selectionFromBlackAndWhiteImage, +} from '../util/ts/selection' +import { app } from 'photoshop' declare let g_sd_url: string export async function getSamMap(base64: string, prompt: string) { @@ -112,13 +117,17 @@ export class Sam extends React.Component<{ ComponentType: PenSvg, callback: async (index: number) => { try { + await psapi.unSelectMarqueeExe() const base64 = general.base64UrlToBase64( store.data.thumbnails[index] ) - await selection.base64ToLassoSelection( + + await selectionFromBlackAndWhiteImage( base64, store.data.selection_info_list[index] ) + //@ts-ignore + await eventHandler() // this will trigger the recalculation of the width and height sliders } catch (e) { console.warn(e) } diff --git a/typescripts/util/ts/selection.ts b/typescripts/util/ts/selection.ts new file mode 100644 index 00000000..4ce0e4d6 --- /dev/null +++ b/typescripts/util/ts/selection.ts @@ -0,0 +1,153 @@ +import { moveImageToLayer } from './io' +import { io, layer_util } from '../oldSystem' +import { session_ts } from '../../entry' + +import { action, core } from 'photoshop' +const executeAsModal = core.executeAsModal +const batchPlay = action.batchPlay + +export async function applyMaskFromBlackAndWhiteImage( + black_and_white_base64: string, + layer_id: any, + selectionInfo: any +) { + let mask_layer + try { + const transparent_mask_base64 = + await io.convertBlackToTransparentKeepBorders( + black_and_white_base64 + ) + mask_layer = await moveImageToLayer( + transparent_mask_base64, + selectionInfo + ) + + let cmd = [ + { + _obj: 'select', + _target: [{ _id: mask_layer.id, _ref: 'layer' }], + makeVisible: false, + }, + { + _obj: 'set', + _target: [ + { + _ref: 'channel', + _property: 'selection', + }, + ], + to: { + _ref: 'channel', + _enum: 'channel', + _value: 'transparencyEnum', + }, + _isCommand: true, + }, + { + _obj: 'expand', + by: { + _unit: 'pixelsUnit', + _value: 10, + }, + selectionModifyEffectAtCanvasBounds: true, + _isCommand: true, + }, + { + _obj: 'select', + _target: [{ _id: layer_id, _ref: 'layer' }], + + makeVisible: false, + }, + { + _obj: 'make', + new: { + _class: 'channel', + }, + at: { + _ref: 'channel', + _enum: 'channel', + _value: 'mask', + }, + using: { + _enum: 'userMaskEnabled', + _value: 'revealSelection', + }, + _isCommand: true, + }, + ] + //@ts-ignore + // await timer(g_timer_value) + await executeAsModal( + async () => { + const result = await batchPlay(cmd, { + synchronousExecution: true, + modalBehavior: 'execute', + }) + }, + { + commandName: 'select opaque pixels', + } + ) + } catch (e) { + console.error(e) + } finally { + await layer_util.deleteLayers([mask_layer]) + } +} + +export async function selectionFromBlackAndWhiteImage( + black_and_white_base64: string, + selectionInfo: any +) { + let mask_layer + try { + const transparent_mask_base64 = + await io.convertBlackToTransparentKeepBorders( + black_and_white_base64 + ) + mask_layer = await moveImageToLayer( + transparent_mask_base64, + selectionInfo + ) + + let cmd = [ + { + _obj: 'select', + _target: [{ _id: mask_layer.id, _ref: 'layer' }], + makeVisible: false, + }, + { + _obj: 'set', + _target: [ + { + _ref: 'channel', + _property: 'selection', + }, + ], + to: { + _ref: 'channel', + _enum: 'channel', + _value: 'transparencyEnum', + }, + _isCommand: true, + }, + ] + //@ts-ignore + // await timer(g_timer_value) + await executeAsModal( + async () => { + const result = await batchPlay(cmd, { + synchronousExecution: true, + modalBehavior: 'execute', + }) + }, + { + commandName: 'select opaque pixels', + } + ) + } catch (e) { + console.error(e) + } finally { + await layer_util.deleteLayers([mask_layer]) + } +} From bcab5b6f64dcab750ba996760e121e4ac47838c0 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Mon, 10 Jul 2023 10:30:17 +0300 Subject: [PATCH 109/143] more stable solution for masking output image from a black and white base64 --- typescripts/viewer/viewer.tsx | 107 +++++----------------------------- 1 file changed, 15 insertions(+), 92 deletions(-) diff --git a/typescripts/viewer/viewer.tsx b/typescripts/viewer/viewer.tsx index a70c4118..81fc5643 100644 --- a/typescripts/viewer/viewer.tsx +++ b/typescripts/viewer/viewer.tsx @@ -19,6 +19,7 @@ import { GenerationModeEnum } from '../util/ts/enum' import { base64ToLassoSelection } from '../../selection' import { action, core } from 'photoshop' import Locale from '../locale/locale' +import { applyMaskFromBlackAndWhiteImage } from '../util/ts/selection' const executeAsModal = core.executeAsModal const batchPlay = action.batchPlay declare let g_generation_session: any @@ -177,91 +178,11 @@ const add = async (base64: string) => { const selectionInfo = session_ts.store.data.selectionInfo // await selection.base64ToChannel(channel_mask, selectionInfo, 'mask') - const transparent_mask_base64 = - await io.convertBlackToTransparentKeepBorders(channel_mask) - const mask_layer = await moveImageToLayer( - transparent_mask_base64, - session_ts.store.data.selectionInfo + await applyMaskFromBlackAndWhiteImage( + channel_mask, + layer.id, + selectionInfo ) - // const mask_layer = await moveImageToLayer( - // channel_mask, - // session_ts.store.data.selectionInfo - // ) - let cmd = [ - { - _obj: 'select', - _target: [{ _id: mask_layer.id, _ref: 'layer' }], - // layerID: [3862], - makeVisible: false, - }, - { - _obj: 'set', - _target: [ - { - _ref: 'channel', - _property: 'selection', - }, - ], - to: { - _ref: 'channel', - _enum: 'channel', - _value: 'transparencyEnum', - }, - _isCommand: true, - }, - { - _obj: 'expand', - by: { - _unit: 'pixelsUnit', - _value: 10, - }, - selectionModifyEffectAtCanvasBounds: true, - _isCommand: true, - }, - { - _obj: 'select', - _target: [{ _id: layer.id, _ref: 'layer' }], - // layerID: [3862], - makeVisible: false, - }, - { - _obj: 'make', - new: { - _class: 'channel', - }, - at: { - _ref: 'channel', - _enum: 'channel', - _value: 'mask', - }, - using: { - _enum: 'userMaskEnabled', - _value: 'revealSelection', - }, - _isCommand: true, - }, - ] - //@ts-ignore - // await timer(g_timer_value) - await executeAsModal( - async () => { - const result = await batchPlay(cmd, { - synchronousExecution: true, - modalBehavior: 'execute', - }) - }, - { - commandName: 'select opaque pixels', - } - ) - //@ts-ignore - // await timer(g_timer_value) - // await selection.black_white_layer_to_mask_multi_batchplay( - // mask_layer.id, - // layer.id, - // 'mask' - // ) - await layer_util.deleteLayers([mask_layer]) } return layer @@ -474,19 +395,21 @@ const Viewer = observer(() => { }} >
) -}) +}) // const node = document.getElementById('reactViewerContainer')! const containers = document.querySelectorAll('.reactViewerContainer') From 7413b1d360de64985d4db302f74598f2a91ab567 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Mon, 10 Jul 2023 11:03:53 +0300 Subject: [PATCH 110/143] wait for updateProgressImage() to finish before updating progress layer again --- typescripts/session/progress.ts | 55 ++++++++++++++++++++++++++++++++- typescripts/session/session.ts | 3 +- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/typescripts/session/progress.ts b/typescripts/session/progress.ts index dc5e34be..acb76c87 100644 --- a/typescripts/session/progress.ts +++ b/typescripts/session/progress.ts @@ -2,6 +2,10 @@ import { reaction } from 'mobx' import { AStore } from '../main/astore' import { io, layer_util } from '../util/oldSystem' import Locale from '../locale/locale' +import { session_ts } from '../entry' +import { app, core } from 'photoshop' + +const executeAsModal = core.executeAsModal export const store = new AStore({ progress_layer: null, @@ -11,9 +15,48 @@ export const store = new AStore({ progress_image_height: 0, progress_label: Locale('Progress..'), can_update: true, + can_update_progress_layer: true, }) declare let g_sd_url: string +async function updateProgressImage(progress_base64: string) { + try { + store.data.can_update_progress_layer = false + await executeAsModal( + async (context: any) => { + const history_id = await context.hostControl.suspendHistory({ + documentID: app.activeDocument.id, //TODO: change this to the session document id + name: 'Progress Image', + }) + await Progress.deleteProgressLayer() // delete the old progress layer + + //update the progress image + const selection_info = await session_ts.store.data.selectionInfo + + const b_exsit = layer_util.Layer.doesLayerExist( + store.data.progress_layer + ) + if (!b_exsit && progress_base64) { + const layer = await io.IO.base64ToLayer( + progress_base64, + 'temp_progress_image.png', + selection_info.left, + selection_info.top, + selection_info.width, + selection_info.height + ) + store.data.progress_layer = layer // sotre the new progress layer// TODO: make sure you delete the progress layer when the geneeration request end + } + await context.hostControl.resumeHistory(history_id) + }, + { commandName: 'update progress layer' } + ) + } catch (e) { + console.warn(e) + } finally { + store.data.can_update_progress_layer = true + } +} reaction( () => { return store.data.progress_image @@ -23,6 +66,16 @@ reaction( const { width, height } = await io.getImageSize(progress_image) store.data.progress_image_height = height } + const b_update_progress_layer: Boolean = ( + document.querySelector('.chLiveProgressImageClass') as any + ).checked + if ( + b_update_progress_layer && + parseInt(session_ts.store.data.ui_settings?.batch_size) === 1 && + store.data.can_update_progress_layer + ) { + await updateProgressImage(progress_image) + } } ) @@ -83,7 +136,7 @@ export class Progress { console.warn(e) } try { - callback() + callback() // may cause an issue if this an async } catch (e) { console.warn(e) } diff --git a/typescripts/session/session.ts b/typescripts/session/session.ts index 80524bc3..f876fcb6 100644 --- a/typescripts/session/session.ts +++ b/typescripts/session/session.ts @@ -399,10 +399,11 @@ export class Session { }, 1000) } static endProgress() { - progress.Progress.endTimer(() => { + progress.Progress.endTimer(async () => { progress.store.data.progress_value = 0 progress.store.data.progress_image = '' progress.store.data.progress_image_height = 0 + await progress.Progress.deleteProgressLayer() }) } static endSession() { From 5f158f84b6c7623a99358db480dfb19a51fe4801 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Mon, 10 Jul 2023 11:04:44 +0300 Subject: [PATCH 111/143] keep black edges instead of black corners, fro more stability. --- utility/io.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/utility/io.js b/utility/io.js index 8ac1e6bc..7906f45a 100644 --- a/utility/io.js +++ b/utility/io.js @@ -1314,15 +1314,15 @@ async function convertBlackToTransparentKeepBorders(base64) { width, height, function (x, y, idx) { - // if (x === 0 || y === 0 || x === width - 1 || y === height - 1) - // return - if ( - (x === 0 && y === 0) || - (x === 0 && y === height - 1) || - (x === width - 1 && y === 0) || - (x === width - 1 && y === height - 1) - ) + if (x === 0 || y === 0 || x === width - 1 || y === height - 1) return + // if ( + // (x === 0 && y === 0) || + // (x === 0 && y === height - 1) || + // (x === width - 1 && y === 0) || + // (x === width - 1 && y === height - 1) + // ) + // return const red = this.bitmap.data[idx + 0] const green = this.bitmap.data[idx + 1] const blue = this.bitmap.data[idx + 2] From 869fbf0fc6064df164bc12e5b6fb20a8472b1741 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Tue, 11 Jul 2023 10:50:16 +0300 Subject: [PATCH 112/143] reset init_image and mask ui after session --- typescripts/session/session.ts | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/typescripts/session/session.ts b/typescripts/session/session.ts index f876fcb6..7afa89a9 100644 --- a/typescripts/session/session.ts +++ b/typescripts/session/session.ts @@ -21,7 +21,7 @@ import { Progress } from './progress' import { reaction } from 'mobx' declare let g_inpaint_mask_layer: any - +declare const g_image_not_found_url: string export const store = new AStore({ // activeBase64InitImage: '', // activeBase64Mask: '', @@ -44,6 +44,21 @@ export const store = new AStore({ controlnet_input_image: '', // the controlnet the image that will controlnet load }) +reaction( + () => { + return [store.data.init_image, store.data.mask] as [string, string] + }, + ([init_image, mask]: [string, string]) => { + html_manip.setInitImageSrc( + init_image + ? 'data:image/png;base64,' + init_image + : g_image_not_found_url + ) + html_manip.setInitImageMaskSrc( + mask ? 'data:image/png;base64,' + mask : g_image_not_found_url + ) + } +) function hasSelectionChanged(new_selection: any, old_selection: any) { try { if ( @@ -412,6 +427,7 @@ export class Session { store.data.init_image = '' store.data.mask = '' store.data.expanded_mask = '' + store.data.preprocessed_mask = '' store.data.generation_number = 0 store.data.controlnet_input_image = '' } From 96bb318266a862631cd6922c67307bdd2d764ea4 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Tue, 11 Jul 2023 11:00:21 +0300 Subject: [PATCH 113/143] notify the user if the auto-photoshop-sd extension is missing --- enum.js | 1 + index.js | 19 +++++++++++++++++++ server/python_server/serverMain.py | 6 ++++++ typescripts/session/session.ts | 17 +++++++++++++++++ 4 files changed, 43 insertions(+) diff --git a/enum.js b/enum.js index 522ba2d2..163017bf 100644 --- a/enum.js +++ b/enum.js @@ -17,6 +17,7 @@ const AutomaticStatusEnum = { Offline: 'offline', RunningNoApi: 'running_no_api', RunningWithApi: 'running_with_api', + AutoPhotoshopSDExtensionMissing: 'auto_photoshop_sd_missing', } const ViewerObjectTypeEnum = { diff --git a/index.js b/index.js index 9f619974..7e92d437 100644 --- a/index.js +++ b/index.js @@ -2,6 +2,8 @@ // helloHelper2 = require('./helper.js') // for organizational proposes // let g_sdapi_path = 'sdapi' +const g_image_not_found_url = + 'https://images.unsplash.com/source-404?fit=crop&fm=jpg&h=800&q=60&w=1200' const _log = console.log const _warn = console.warn const _error = console.error @@ -57,6 +59,7 @@ const history_tab = require('./utility/tab/history_tab') const image_search_tab = require('./utility/tab/image_search_tab') const lexica_tab = require('./utility/tab/lexica_tab') const share_tab = require('./utility/tab/share_tab') +const api = require('./utility/api') // const ultimate_sd_upscaler = require('./ultimate_sd_upscaler/dist/ultimate_sd_upscaler') // const ultimate_sd_upscaler_script = require('./ultimate_sd_upscaler/dist/ultimate_sd_upscaler.bundle') const { @@ -437,10 +440,26 @@ async function checkAutoStatus() { if (options) { //means both automatic1111 and proxy server are online html_manip.setAutomaticStatus('connected', 'disconnected') + g_automatic_status = Enum.AutomaticStatusEnum['RunningWithApi'] + + const extension_url = py_re.getExtensionUrl() + const full_url = `${extension_url}/heartbeat` + const heartbeat = (await api.requestGet(full_url))?.heartbeat + + if (heartbeat) { + html_manip.setProxyServerStatus('connected', 'disconnected') + session_ts.store.data.auto_photoshop_sd_extension_status = true + } else { + html_manip.setProxyServerStatus('disconnected', 'connected') + g_automatic_status = + Enum.AutomaticStatusEnum['AutoPhotoshopSDExtensionMissing'] + session_ts.store.data.auto_photoshop_sd_extension_status = false + } // html_manip.setProxyServerStatus('connected','disconnected') } else { html_manip.setAutomaticStatus('disconnected', 'connected') + if (await sdapi.isWebuiRunning()) { //running with no api g_automatic_status = Enum.AutomaticStatusEnum['RunningNoApi'] diff --git a/server/python_server/serverMain.py b/server/python_server/serverMain.py index c9254bab..f3303b8f 100644 --- a/server/python_server/serverMain.py +++ b/server/python_server/serverMain.py @@ -531,6 +531,12 @@ async def filter(keyword:str = Body('All',title="keyword to filter by"), "default_option":default_option, "default_model":default_model } + +@router.get('/heartbeat') +async def heartbeat(): + + return {'heartbeat':True} + app = FastAPI() app.include_router(router) diff --git a/typescripts/session/session.ts b/typescripts/session/session.ts index 7afa89a9..b599be5c 100644 --- a/typescripts/session/session.ts +++ b/typescripts/session/session.ts @@ -1,3 +1,4 @@ +import { app } from 'photoshop' import { control_net, preview, viewer, progress } from '../entry' import Locale from '../locale/locale' import { AStore } from '../main/astore' @@ -42,6 +43,9 @@ export const store = new AStore({ is_interrupted: false, // did we interrupt the generation generation_number: 0, // generation number per session, 0 mean first generation controlnet_input_image: '', // the controlnet the image that will controlnet load + + //plugin related state: + auto_photoshop_sd_extension_status: true, }) reaction( @@ -59,6 +63,19 @@ reaction( ) } ) +reaction( + () => { + return store.data.auto_photoshop_sd_extension_status + }, + (auto_photoshop_sd_extension_status: boolean) => { + if (auto_photoshop_sd_extension_status) { + } else { + app.showAlert( + 'Please install the Auto-Photoshop-SD Extension from Automatic1111 Extensions tab ' + ) + } + } +) function hasSelectionChanged(new_selection: any, old_selection: any) { try { if ( From a33ce8e51a542c31d52a462cd11f850221475cf4 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Tue, 11 Jul 2023 11:25:25 +0300 Subject: [PATCH 114/143] wait for the progress layer update to finish before loading output image on canvas --- typescripts/session/generate.tsx | 7 +++++++ typescripts/session/progress.ts | 15 ++++++++++++--- typescripts/session/session.ts | 8 ++++---- typescripts/util/grid.tsx | 2 +- typescripts/viewer/viewer.tsx | 27 +++++++++++++++++++++++---- 5 files changed, 47 insertions(+), 12 deletions(-) diff --git a/typescripts/session/generate.tsx b/typescripts/session/generate.tsx index d5267599..d50dbfd1 100644 --- a/typescripts/session/generate.tsx +++ b/typescripts/session/generate.tsx @@ -9,6 +9,7 @@ import { io, note, psapi, selection } from '../util/oldSystem' import { GenerationModeEnum } from '../util/ts/enum' import { initializeBackground } from '../util/ts/document' import Locale from '../locale/locale' +declare let g_automatic_status: any //example: take 'oI' in 'LassoInpaint' and replace it with 'o I' thus creating 'Lasso Inpaint' const modeDisplayNames = Object.fromEntries( @@ -133,6 +134,7 @@ const canStartSession = async () => { let can_start_session = false try { const selection_info = await psapi.getSelectionInfoExe() + if (selection_info) { session_ts.Session.endSession() @@ -150,9 +152,14 @@ const canStartSession = async () => { ) } } + //@ts-ignore + g_automatic_status = await checkAutoStatus() + //@ts-ignore + await displayNotification(g_automatic_status) } catch (e) { console.warn(e) } + return can_start_session } diff --git a/typescripts/session/progress.ts b/typescripts/session/progress.ts index acb76c87..d5b09deb 100644 --- a/typescripts/session/progress.ts +++ b/typescripts/session/progress.ts @@ -55,6 +55,10 @@ async function updateProgressImage(progress_base64: string) { console.warn(e) } finally { store.data.can_update_progress_layer = true + if (!store.data.can_update) { + //delete the last progress layer + await Progress.deleteProgressLayer() // delete the old progress layer + } } } reaction( @@ -72,7 +76,8 @@ reaction( if ( b_update_progress_layer && parseInt(session_ts.store.data.ui_settings?.batch_size) === 1 && - store.data.can_update_progress_layer + store.data.can_update_progress_layer && + store.data.can_update // progress is still active ) { await updateProgressImage(progress_image) } @@ -128,7 +133,7 @@ export class Progress { this.timer_id = setInterval(callback, interval) } - static endTimer(callback: any) { + static async endTimer(callback: any) { try { this.timer_id = clearInterval(this.timer_id) store.data.can_update = false @@ -136,7 +141,11 @@ export class Progress { console.warn(e) } try { - callback() // may cause an issue if this an async + if (callback?.constructor.name === 'AsyncFunction') { + await callback() // may cause an issue if this an async + } else { + callback() // may cause an issue if this an async + } } catch (e) { console.warn(e) } diff --git a/typescripts/session/session.ts b/typescripts/session/session.ts index b599be5c..77020251 100644 --- a/typescripts/session/session.ts +++ b/typescripts/session/session.ts @@ -330,7 +330,7 @@ export class Session { console.warn(e) } finally { store.data.can_generate = true - this.endProgress() + await this.endProgress() } return { output_images, response_json } @@ -383,7 +383,7 @@ export class Session { console.warn(e) } finally { store.data.can_generate = true - this.endProgress() + await this.endProgress() } return { output_images, response_json } } @@ -430,8 +430,8 @@ export class Session { } }, 1000) } - static endProgress() { - progress.Progress.endTimer(async () => { + static async endProgress() { + await progress.Progress.endTimer(async () => { progress.store.data.progress_value = 0 progress.store.data.progress_image = '' progress.store.data.progress_image_height = 0 diff --git a/typescripts/util/grid.tsx b/typescripts/util/grid.tsx index ec685189..8d022ab0 100644 --- a/typescripts/util/grid.tsx +++ b/typescripts/util/grid.tsx @@ -58,7 +58,7 @@ export class Grid extends React.Component<{ event ) } - this.props?.callback(index, event) + this.props?.callback(index, event) //todo: is this a typo why do we call callback twice? } } catch (e) { console.warn( diff --git a/typescripts/viewer/viewer.tsx b/typescripts/viewer/viewer.tsx index 81fc5643..6a206065 100644 --- a/typescripts/viewer/viewer.tsx +++ b/typescripts/viewer/viewer.tsx @@ -13,13 +13,14 @@ import { import { moveImageToLayer } from '../util/ts/io' import { io, layer_util, selection } from '../util/oldSystem' import Collapsible from '../after_detailer/after_detailer' -import { session_ts } from '../entry' +import { progress, session_ts } from '../entry' import { reaction } from 'mobx' import { GenerationModeEnum } from '../util/ts/enum' import { base64ToLassoSelection } from '../../selection' import { action, core } from 'photoshop' import Locale from '../locale/locale' import { applyMaskFromBlackAndWhiteImage } from '../util/ts/selection' + const executeAsModal = core.executeAsModal const batchPlay = action.batchPlay declare let g_generation_session: any @@ -72,6 +73,7 @@ export const store = new AStore({ auto_mask: true, }) +const timer = (ms: any) => new Promise((res) => setTimeout(res, ms)) //when a generation is done, add the last generated image from the viewer to tha canvas reaction( () => { @@ -79,9 +81,26 @@ reaction( }, async (images: string[]) => { try { - images.length > 0 - ? await handleOutputImageThumbnailClick(images.length - 1) - : void 0 + if (images.length > 0) { + let attempts: number = 5 + + while (attempts > 0) { + if (!progress.store.data.can_update) { + await timer(2000) + await handleOutputImageThumbnailClick(images.length - 1) + break + } + + attempts -= 1 + + console.log('waiting 1000:') + console.log( + 'progress.store.data.can_update:', + progress.store.data.can_update + ) + await timer(2000) + } + } } catch (e) { console.warn(e) } From 53d039a1d9c37f9ce40d539445ebb0fe196148da Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Tue, 11 Jul 2023 19:22:51 +0300 Subject: [PATCH 115/143] speed up switching between mode, for large history states --- index.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index 7e92d437..f691c87d 100644 --- a/index.js +++ b/index.js @@ -896,9 +896,13 @@ async function deleteTempInpaintMaskLayer() { 'g_inpaint_mask_layer_history_id: ', g_inpaint_mask_layer_history_id ) - const historyBrushTools = app.activeDocument.historyStates.filter( - (h) => h.id > g_inpaint_mask_layer_history_id && h.name === 'Brush Tool' - ) + const historyBrushTools = app.activeDocument.historyStates + .slice(-10) + .filter( + (h) => + h.id > g_inpaint_mask_layer_history_id && + h.name === 'Brush Tool' + ) console.log(historyBrushTools) if (historyBrushTools.length === 0 && g_b_mask_layer_exist) { await layer_util.deleteLayers([g_inpaint_mask_layer]) From 186940e274b9c0cb8b0f194149e981701366f586 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Wed, 12 Jul 2023 20:41:30 +0300 Subject: [PATCH 116/143] comment unnecessary logs --- sdapi_py_re.js | 2 +- typescripts/session/generate.tsx | 8 ++++---- typescripts/util/ts/api.ts | 4 ++-- utility/api.js | 4 ++-- utility/sdapi/python_replacement.js | 8 ++++---- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/sdapi_py_re.js b/sdapi_py_re.js index 530ae0f5..1a5f2b50 100644 --- a/sdapi_py_re.js +++ b/sdapi_py_re.js @@ -95,7 +95,7 @@ async function requestGetSamplers() { const full_url = `${g_sd_url}/sdapi/v1/samplers` let request = await fetch(full_url) json = await request.json() - console.log('samplers json:', json) + // console.log('samplers json:', json) } catch (e) { console.warn(e) } diff --git a/typescripts/session/generate.tsx b/typescripts/session/generate.tsx index d50dbfd1..85e62c25 100644 --- a/typescripts/session/generate.tsx +++ b/typescripts/session/generate.tsx @@ -227,10 +227,10 @@ const handleGenerateMore = async () => { ] // viewer.store.updateProperty('images', output_images) - console.log( - 'session_ts.store.toJsFunc(): ', - session_ts.store.toJsFunc() - ) + // console.log( + // 'session_ts.store.toJsFunc(): ', + // session_ts.store.toJsFunc() + // ) } catch (e) { console.error(e) console.warn('output_images: ', output_images) diff --git a/typescripts/util/ts/api.ts b/typescripts/util/ts/api.ts index 0177d037..7cafcc54 100644 --- a/typescripts/util/ts/api.ts +++ b/typescripts/util/ts/api.ts @@ -11,7 +11,7 @@ export async function requestGet(url: string) { json = await request.json() - console.log('json: ', json) + // console.log('json: ', json) } catch (e) { console.warn(`issues requesting from ${full_url}`, e) } @@ -37,7 +37,7 @@ export async function requestPost(url: string, payload: any) { json = await request.json() - console.log('json: ', json) + // console.log('json: ', json) } catch (e) { console.warn(`issues requesting from ${full_url}`, e) } diff --git a/utility/api.js b/utility/api.js index bac32964..0707c0ad 100644 --- a/utility/api.js +++ b/utility/api.js @@ -14,7 +14,7 @@ async function requestGet(url) { json = await request.json() - console.log('json: ', json) + // console.log('json: ', json) } catch (e) { console.warn(`issues requesting from ${full_url}`, e) } @@ -40,7 +40,7 @@ async function requestPost(url, payload) { json = await request.json() - console.log('json: ', json) + // console.log('json: ', json) } catch (e) { console.warn(`issues requesting from ${full_url}`, e) } diff --git a/utility/sdapi/python_replacement.js b/utility/sdapi/python_replacement.js index 9644d2fa..33b74047 100644 --- a/utility/sdapi/python_replacement.js +++ b/utility/sdapi/python_replacement.js @@ -85,10 +85,10 @@ async function convertToStandardResponse(settings, images, uuid) { try { const auto_metadata_str = await getAuto1111Metadata(i) auto_metadata_json = convertMetadataToJson(auto_metadata_str) - console.warn( - 'auto_metadata_json.Seed:', - auto_metadata_json?.Seed - ) + // console.warn( + // 'auto_metadata_json.Seed:', + // auto_metadata_json?.Seed + // ) } catch (e) { console.warn(e) auto_metadata_json = {} // set the metadata to empty if there an error while getting the metadata From 799dbfe32f2a0789519676f046f09a5073a39a50 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Wed, 12 Jul 2023 20:42:09 +0300 Subject: [PATCH 117/143] allow for NSFW in image search --- server/python_server/search.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/python_server/search.py b/server/python_server/search.py index 8cd901ad..36ba5f09 100644 --- a/server/python_server/search.py +++ b/server/python_server/search.py @@ -10,7 +10,7 @@ async def imageSearch(keywords="cute cats"): with DDGS() as ddgs: - return [x for x in islice(ddgs.images(keywords), 30)] + return [x for x in islice(ddgs.images(keywords,safesearch='off'), 50)] if __name__ == "__main__": From 08ca36b41ba087abdc9ba07ffad8198cb4b89407 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Wed, 12 Jul 2023 20:52:48 +0300 Subject: [PATCH 118/143] encapsulate react components in ErrorBoundary --- typescripts/after_detailer/after_detailer.tsx | 71 ++++------- typescripts/controlnet/main.tsx | 110 ++++++++++-------- typescripts/history/history.tsx | 5 +- typescripts/image_search/image_search.tsx | 5 +- typescripts/main/main.tsx | 5 +- .../one_button_prompt/one_button_prompt.tsx | 16 ++- typescripts/sam/sam.tsx | 16 ++- typescripts/sd_tab/sd_tab.tsx | 5 +- typescripts/session/generate.tsx | 13 ++- typescripts/settings/settings.tsx | 5 +- typescripts/ultimate_sd_upscaler/scripts.tsx | 11 +- typescripts/util/errorBoundary.tsx | 31 +++++ typescripts/viewer/preview.tsx | 5 +- typescripts/viewer/viewer.tsx | 16 ++- 14 files changed, 190 insertions(+), 124 deletions(-) create mode 100644 typescripts/util/errorBoundary.tsx diff --git a/typescripts/after_detailer/after_detailer.tsx b/typescripts/after_detailer/after_detailer.tsx index 45eac890..b7aa3fa0 100644 --- a/typescripts/after_detailer/after_detailer.tsx +++ b/typescripts/after_detailer/after_detailer.tsx @@ -90,24 +90,28 @@ export class AfterDetailerComponent extends React.Component<{ async componentDidUpdate( prevProps: ReactPropTypes, prevState: ReactPropTypes - ) { } + ) {} handleRefresh = async () => { if (await this.isInstalled()) { await this.getInpaintModels() } } async isInstalled() { - const full_url = `${g_sd_url}/sdapi/v1/scripts` + try { + const full_url = `${g_sd_url}/sdapi/v1/scripts` - const scripts = await requestGet(full_url) - const is_installed = - scripts?.txt2img?.includes(store.data.script_name) || - scripts?.img2img?.includes(store.data.script_name) || - false + const scripts = await requestGet(full_url) + const is_installed = + scripts?.txt2img?.includes(store.data.script_name) || + scripts?.img2img?.includes(store.data.script_name) || + false - console.log('is_installed: ', is_installed) - store.updateProperty('is_installed', is_installed) - return is_installed + console.log('is_installed: ', is_installed) + store.updateProperty('is_installed', is_installed) + return is_installed + } catch (e) { + console.error(e) + } } async getInpaintModels() { try { @@ -260,6 +264,7 @@ const root = ReactDOM.createRoot(domNode) import { useState, ReactNode } from 'react' import Locale from '../locale/locale' +import { ErrorBoundary } from '../util/errorBoundary' interface CollapsibleProps { label: string @@ -286,8 +291,8 @@ function Collapsible({ setIsOpen(!isOpen) } - return /*useObserver(()=>*/( ( -
+ return ( + /*useObserver(()=>*/
{children}
} */}
{children}
- )) + ) } export default Collapsible root.render( -
- {/* */} - {/*
{ - console.log('clicked') - event.target.classList.toggle('collapsible-active') - - let content = event.target.nextElementSibling - console.log('collapsible content: ', content) - let triangle = - event.target.getElementsByClassName('triangle')[0] - if (content.style.display === 'block') { - content.style.display = 'none' - triangle.innerText = '<' - } else { - content.style.display = 'block' - triangle.innerText = '∨' - } - }} - > - After Detailer - - {'<'} - -
*/} - - {/* */} - - - -
+ +
+ + + +
+
) diff --git a/typescripts/controlnet/main.tsx b/typescripts/controlnet/main.tsx index 926edb40..9e6dbdf5 100644 --- a/typescripts/controlnet/main.tsx +++ b/typescripts/controlnet/main.tsx @@ -5,34 +5,44 @@ import store from './store' import { versionCompare } from './util' import Collapsible from '../after_detailer/after_detailer' import Locale from '../locale/locale' +import { ErrorBoundary } from '../util/errorBoundary' const elem = document.getElementById('sp-control_net-tab-page') const elem2 = document.getElementById('sp-control_net-tab-page2') if (elem) { const root = ReactDOM.createRoot(elem) - root.render() + root.render( + + + + ) } if (elem2) { const root = ReactDOM.createRoot(elem2) root.render( -
- -
+
+ - -
- -
+
+ +
+
+
+
) } @@ -42,42 +52,46 @@ const button = document.getElementById('scrollToControlNetUnitContainer')! const button_root = ReactDOM.createRoot(button) let controlnet_unit_index = 0 button_root.render( - + }} + > + C + + ) export { store, versionCompare } diff --git a/typescripts/history/history.tsx b/typescripts/history/history.tsx index e885f907..00f6716b 100644 --- a/typescripts/history/history.tsx +++ b/typescripts/history/history.tsx @@ -5,6 +5,7 @@ import { AStore, toJS } from '../main/astore' import { Grid } from '../util/grid' import { io, settings_tab } from '../util/oldSystem' import { MoveToCanvasSvg, PenSvg } from '../util/elements' +import { ErrorBoundary } from '../util/errorBoundary' declare let g_ui_settings_object: any export const store = new AStore({ @@ -140,6 +141,8 @@ const gridRoot = ReactDOM.createRoot(gridContainerNode) gridRoot.render( - + + + ) diff --git a/typescripts/image_search/image_search.tsx b/typescripts/image_search/image_search.tsx index 9e3aea2b..45510a4a 100644 --- a/typescripts/image_search/image_search.tsx +++ b/typescripts/image_search/image_search.tsx @@ -5,6 +5,7 @@ import { AStore } from '../main/astore' import { Grid } from '../util/grid' import { MoveToCanvasSvg } from '../util/elements' import { io } from '../util/oldSystem' +import { ErrorBoundary } from '../util/errorBoundary' export const store = new AStore({ images: [], @@ -61,6 +62,8 @@ const gridRoot = ReactDOM.createRoot(gridContainerNode) let images: string[] = [] gridRoot.render( - + + + ) diff --git a/typescripts/main/main.tsx b/typescripts/main/main.tsx index d0f882cb..073764cb 100644 --- a/typescripts/main/main.tsx +++ b/typescripts/main/main.tsx @@ -7,6 +7,7 @@ import { SpMenu } from '../util/elements' import { api, python_replacement } from '../util/oldSystem' const { getExtensionUrl } = python_replacement import '../locale/locale-for-old-html' +import { ErrorBoundary } from '../util/errorBoundary' declare let g_sd_url: string // class SDStore extends AStore { @@ -105,6 +106,8 @@ export async function populateVAE() { vaeRoot.render( - + + + ) diff --git a/typescripts/one_button_prompt/one_button_prompt.tsx b/typescripts/one_button_prompt/one_button_prompt.tsx index 8ff813ee..94b008fd 100644 --- a/typescripts/one_button_prompt/one_button_prompt.tsx +++ b/typescripts/one_button_prompt/one_button_prompt.tsx @@ -11,6 +11,7 @@ import { SpMenu, SpSliderWithLabel, } from '../util/elements' +import { ErrorBoundary } from '../util/errorBoundary' declare let g_sd_url: string export const store = new AStore({ @@ -284,11 +285,16 @@ containers.forEach((container) => { root.render( -
- - - -
+ +
+ + + +
+
) }) diff --git a/typescripts/sam/sam.tsx b/typescripts/sam/sam.tsx index f7815f28..45304a6c 100644 --- a/typescripts/sam/sam.tsx +++ b/typescripts/sam/sam.tsx @@ -16,6 +16,7 @@ import { selectionFromBlackAndWhiteImage, } from '../util/ts/selection' import { app } from 'photoshop' +import { ErrorBoundary } from '../util/errorBoundary' declare let g_sd_url: string export async function getSamMap(base64: string, prompt: string) { @@ -193,11 +194,16 @@ containers.forEach((container) => { const root = ReactDOM.createRoot(container) root.render( -
- - - -
+ +
+ + + +
+
) }) diff --git a/typescripts/sd_tab/sd_tab.tsx b/typescripts/sd_tab/sd_tab.tsx index 6006a3a9..0952b062 100644 --- a/typescripts/sd_tab/sd_tab.tsx +++ b/typescripts/sd_tab/sd_tab.tsx @@ -7,6 +7,7 @@ import { AStore } from '../main/astore' import { GenerationModeEnum } from '../util/ts/enum' import { reaction } from 'mobx' import { SpCheckBox } from '../util/elements' +import { ErrorBoundary } from '../util/errorBoundary' export const store = new AStore({ is_lasso_mode: false, @@ -75,6 +76,8 @@ const root = ReactDOM.createRoot(container) root.render( - + + + ) diff --git a/typescripts/session/generate.tsx b/typescripts/session/generate.tsx index 85e62c25..ce5493e6 100644 --- a/typescripts/session/generate.tsx +++ b/typescripts/session/generate.tsx @@ -9,6 +9,7 @@ import { io, note, psapi, selection } from '../util/oldSystem' import { GenerationModeEnum } from '../util/ts/enum' import { initializeBackground } from '../util/ts/document' import Locale from '../locale/locale' +import { ErrorBoundary } from '../util/errorBoundary' declare let g_automatic_status: any //example: take 'oI' in 'LassoInpaint' and replace it with 'o I' thus creating 'Lasso Inpaint' @@ -252,7 +253,9 @@ const root = ReactDOM.createRoot(container) root.render( - + + + ) @@ -261,7 +264,9 @@ const extraRoot = ReactDOM.createRoot(extraContainer) extraRoot.render( - + + + ) @@ -271,6 +276,8 @@ const toolBarButtonsContainer = document.getElementById( const toolBarButtonsContainerRoot = ReactDOM.createRoot(toolBarButtonsContainer) toolBarButtonsContainerRoot.render( - + + + ) diff --git a/typescripts/settings/settings.tsx b/typescripts/settings/settings.tsx index 99f065ef..a88b2dcb 100644 --- a/typescripts/settings/settings.tsx +++ b/typescripts/settings/settings.tsx @@ -9,6 +9,7 @@ import globalStore from '../globalstore' import { io } from '../util/oldSystem' import { reaction } from 'mobx' import { storage } from 'uxp' +import { ErrorBoundary } from '../util/errorBoundary' // import { Jimp } from '../util/oldSystem' declare const Jimp: any // make sure you import jimp before importing settings.tsx @@ -140,6 +141,8 @@ const root = ReactDOM.createRoot(containerNode) root.render( - + + + ) diff --git a/typescripts/ultimate_sd_upscaler/scripts.tsx b/typescripts/ultimate_sd_upscaler/scripts.tsx index 119b19dd..f383a1e6 100644 --- a/typescripts/ultimate_sd_upscaler/scripts.tsx +++ b/typescripts/ultimate_sd_upscaler/scripts.tsx @@ -7,6 +7,7 @@ import { observer } from 'mobx-react' import { SpMenu } from '../util/elements' import * as ultimate_sd_upscale_script from './ultimate_sd_upscaler' import { ScriptMode } from './ultimate_sd_upscaler' +import { ErrorBoundary } from '../util/errorBoundary' export function toJsFunc(store: any) { return toJS(store) } @@ -164,10 +165,10 @@ const root = ReactDOM.createRoot(domNode) root.render( -
- -
- - {/* */} + +
+ +
+
) diff --git a/typescripts/util/errorBoundary.tsx b/typescripts/util/errorBoundary.tsx new file mode 100644 index 00000000..a9439e30 --- /dev/null +++ b/typescripts/util/errorBoundary.tsx @@ -0,0 +1,31 @@ +import React, { Component, ErrorInfo, ReactNode } from 'react' + +interface Props { + children: ReactNode +} + +interface State { + hasError: boolean +} + +export class ErrorBoundary extends Component { + public state: State = { + hasError: false, + } + + public static getDerivedStateFromError(_: Error): State { + return { hasError: true } + } + + public componentDidCatch(error: Error, errorInfo: ErrorInfo) { + console.error('Uncaught error:', error, errorInfo) + } + + public render() { + if (this.state.hasError) { + return

Sorry.. there was an error

+ } + + return this.props.children + } +} diff --git a/typescripts/viewer/preview.tsx b/typescripts/viewer/preview.tsx index a6fa3c13..cd9b73c3 100644 --- a/typescripts/viewer/preview.tsx +++ b/typescripts/viewer/preview.tsx @@ -8,6 +8,7 @@ import { progress } from '../entry' import './style/preview.css' import { reaction } from 'mobx' import Locale from '../locale/locale' +import { ErrorBoundary } from '../util/errorBoundary' export const store = new AStore({ // image: '', // progress_value: 0, @@ -82,7 +83,9 @@ containers.forEach((container) => { root.render( - + + + ) }) diff --git a/typescripts/viewer/viewer.tsx b/typescripts/viewer/viewer.tsx index 6a206065..8db20466 100644 --- a/typescripts/viewer/viewer.tsx +++ b/typescripts/viewer/viewer.tsx @@ -575,11 +575,13 @@ containers.forEach((container) => { const root = ReactDOM.createRoot(container) root.render( -
- - - -
+ +
+ + + +
+
) }) @@ -588,6 +590,8 @@ const button_container = document.getElementById('viewerButtonContainer')! const root = ReactDOM.createRoot(button_container) root.render( - + + + ) From bc8c1ab687601d0ef131e6edf4c2b2755da37902 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Wed, 12 Jul 2023 21:00:10 +0300 Subject: [PATCH 119/143] fix bug: generate more won't store selection area into metadata --- utility/session.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/utility/session.js b/utility/session.js index e11dc712..24f16795 100644 --- a/utility/session.js +++ b/utility/session.js @@ -270,8 +270,7 @@ async function getSettings(session_data) { try { const extension_type = settings_tab.getExtensionType() // get the extension type - const selectionInfo = await psapi.getSelectionInfoExe() - payload['selection_info'] = selectionInfo + payload['selection_info'] = session_data.selectionInfo const numberOfBatchSize = parseInt( document.querySelector('#tiNumberOfBatchSize').value ) From 8a7021bd6ac55fd0065097c1a387f578b5e54b83 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Wed, 12 Jul 2023 21:05:29 +0300 Subject: [PATCH 120/143] don't use automatic1111 mask_blur variable --- utility/session.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utility/session.js b/utility/session.js index 24f16795..4cf7decf 100644 --- a/utility/session.js +++ b/utility/session.js @@ -564,7 +564,7 @@ async function getSettings(session_data) { batch_size: numberOfBatchSize, cfg_scale: cfg_scale, seed: seed, - mask_blur: mask_blur, + // mask_blur: mask_blur, // don't use auto1111 blur, instead use Auto-Photoshop-SD blur use_sharp_mask: use_sharp_mask, use_prompt_shortcut: bUsePromptShortcut, prompt_shortcut_ui_dict: prompt_shortcut_ui_dict, From 494e11b5d7a4e9dca2fcf173e1f6fc8a393b4213 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Wed, 12 Jul 2023 21:09:15 +0300 Subject: [PATCH 121/143] encapsulate add() function into a 'Add Image to Canvas' history state --- typescripts/viewer/viewer.tsx | 53 +++++++++++++++++++++++++++++++---- 1 file changed, 47 insertions(+), 6 deletions(-) diff --git a/typescripts/viewer/viewer.tsx b/typescripts/viewer/viewer.tsx index 8db20466..e52f1efb 100644 --- a/typescripts/viewer/viewer.tsx +++ b/typescripts/viewer/viewer.tsx @@ -17,9 +17,10 @@ import { progress, session_ts } from '../entry' import { reaction } from 'mobx' import { GenerationModeEnum } from '../util/ts/enum' import { base64ToLassoSelection } from '../../selection' -import { action, core } from 'photoshop' +import { action, app, core } from 'photoshop' import Locale from '../locale/locale' import { applyMaskFromBlackAndWhiteImage } from '../util/ts/selection' +import { ErrorBoundary } from '../util/errorBoundary' const executeAsModal = core.executeAsModal const batchPlay = action.batchPlay @@ -128,6 +129,7 @@ export const init_store = new AStore({ export const mask_store = new AStore({ images: [], thumbnails: [], + output_images_masks: [], width: 50, height: 50, @@ -167,7 +169,7 @@ export async function updateViewerStoreImageAndThumbnail( } } -const add = async (base64: string) => { +const add = async (base64: string, mask?: string) => { try { //change the color of thumbnail border //add image to the canvas @@ -191,7 +193,8 @@ const add = async (base64: string) => { const timer = (ms: any) => new Promise((res) => setTimeout(res, ms)) const mask_monochrome = await io.convertGrayscaleToMonochrome( - session_ts.store.data.expanded_mask + // session_ts.store.data.expanded_mask + mask ) const channel_mask = mask_monochrome const selectionInfo = session_ts.store.data.selectionInfo @@ -209,6 +212,35 @@ const add = async (base64: string) => { console.error(e) } } +const addWithHistory = async (base64: string, mask?: string) => { + let layer + await executeAsModal( + async (context: any) => { + let history_id + try { + history_id = await context.hostControl.suspendHistory({ + documentID: app.activeDocument.id, + name: 'Add Image to Canvas', + }) + } catch (e) { + console.warn(e) + } + + layer = await add(base64, mask) + + try { + await context.hostControl.resumeHistory(history_id) + } catch (e) { + console.warn(e) + } + }, + { + commandName: 'Add Image to Canvas', + } + ) + return layer +} + const remove = async (layer: any) => { await layer_util.deleteLayers([layer]) // delete previous layer } @@ -234,7 +266,10 @@ const addAll = async () => { if (store.data.is_stored[i]) { continue } - await add(store.data.images[i]) + await addWithHistory( + store.data.images[i], + mask_store.data?.output_images_masks?.[i] ?? void 0 + ) } session_ts.Session.endSession() @@ -286,7 +321,10 @@ export const handleOutputImageThumbnailClick = async ( if (click_type === ClickTypeEnum.Click) { //1) modify layer stacks - const layer = await add(image) + const layer = await addWithHistory( + image, + mask_store.data?.output_images_masks?.[index] ?? void 0 + ) await remove(store.data.layers[index]) console.log('layer:', layer) store.data.layers[index] = layer @@ -316,7 +354,10 @@ export const handleOutputImageThumbnailClick = async ( // await remove(prev_layer) } - const layer = await add(image) + const layer = await addWithHistory( + image, + mask_store.data?.output_images_masks?.[index] ?? void 0 + ) await remove(store.data.layers[index]) store.data.layers[index] = layer //2)change style From f82784acfd470594487f1066e28bfb6a1b89b42e Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Wed, 12 Jul 2023 21:16:26 +0300 Subject: [PATCH 122/143] add appropriate title to thumbnails' buttons --- typescripts/controlnet/ControlNetUnit.tsx | 21 ++++++++++++++------- typescripts/history/history.tsx | 3 +++ typescripts/image_search/image_search.tsx | 1 + typescripts/sam/sam.tsx | 3 +++ typescripts/util/elements.tsx | 2 ++ typescripts/util/grid.tsx | 1 + typescripts/util/ts/io.ts | 2 +- typescripts/viewer/preview.tsx | 7 ++++--- 8 files changed, 29 insertions(+), 11 deletions(-) diff --git a/typescripts/controlnet/ControlNetUnit.tsx b/typescripts/controlnet/ControlNetUnit.tsx index 2f51e289..5db05fa4 100644 --- a/typescripts/controlnet/ControlNetUnit.tsx +++ b/typescripts/controlnet/ControlNetUnit.tsx @@ -474,20 +474,23 @@ export default class ControlNetUnit extends React.Component< onClick={this.toControlNetInitImage.bind( this )} + title={Locale( + 'use as controlnet input image' + )} > -
@@ -524,14 +527,18 @@ export default class ControlNetUnit extends React.Component< width="300px" height="100px" /> + -
diff --git a/typescripts/history/history.tsx b/typescripts/history/history.tsx index 00f6716b..c2517cb1 100644 --- a/typescripts/history/history.tsx +++ b/typescripts/history/history.tsx @@ -6,6 +6,7 @@ import { Grid } from '../util/grid' import { io, settings_tab } from '../util/oldSystem' import { MoveToCanvasSvg, PenSvg } from '../util/elements' import { ErrorBoundary } from '../util/errorBoundary' +import Locale from '../locale/locale' declare let g_ui_settings_object: any export const store = new AStore({ @@ -118,6 +119,7 @@ const History = observer(() => { console.warn(e) } }, + title: Locale('Copy Metadata to Settings'), }, { ComponentType: MoveToCanvasSvg, @@ -129,6 +131,7 @@ const History = observer(() => { ] ) }, + title: Locale('Copy Image to Canvas'), }, ]} >
diff --git a/typescripts/image_search/image_search.tsx b/typescripts/image_search/image_search.tsx index 45510a4a..c3328f23 100644 --- a/typescripts/image_search/image_search.tsx +++ b/typescripts/image_search/image_search.tsx @@ -46,6 +46,7 @@ const ImageSearch = observer(() => { callback: (index: number) => { urlToCanvas(store.data.images[index]) }, + title: 'Copy Image to Canvas', }, ]} > diff --git a/typescripts/sam/sam.tsx b/typescripts/sam/sam.tsx index 45304a6c..5e75f0a8 100644 --- a/typescripts/sam/sam.tsx +++ b/typescripts/sam/sam.tsx @@ -17,6 +17,7 @@ import { } from '../util/ts/selection' import { app } from 'photoshop' import { ErrorBoundary } from '../util/errorBoundary' +import Locale from '../locale/locale' declare let g_sd_url: string export async function getSamMap(base64: string, prompt: string) { @@ -133,6 +134,7 @@ export class Sam extends React.Component<{ console.warn(e) } }, + title: Locale('Select Masked Area'), }, { ComponentType: MoveToCanvasSvg, @@ -165,6 +167,7 @@ export class Sam extends React.Component<{ console.warn(e) } }, + title: Locale('Copy Image to Canvas'), }, ]} > diff --git a/typescripts/util/elements.tsx b/typescripts/util/elements.tsx index fe64d26b..8035f91c 100644 --- a/typescripts/util/elements.tsx +++ b/typescripts/util/elements.tsx @@ -442,6 +442,7 @@ export class Thumbnail extends React.Component<{ export class ActionButtonSVG extends React.Component<{ onClick?: any ComponentType: ComponentType + title?: string }> { render() { if (!this.props.ComponentType) { @@ -457,6 +458,7 @@ export class ActionButtonSVG extends React.Component<{ maxHeight: '32px' /* display: none; */, }} class="thumbnail-image-button" + title={this.props.title ?? void 0} >
{} diff --git a/typescripts/util/grid.tsx b/typescripts/util/grid.tsx index 8d022ab0..b0f967fc 100644 --- a/typescripts/util/grid.tsx +++ b/typescripts/util/grid.tsx @@ -83,6 +83,7 @@ export class Grid extends React.Component<{ onClick={() => { button.callback(index) }} + title={button?.title} > ) ) diff --git a/typescripts/util/ts/io.ts b/typescripts/util/ts/io.ts index e126932b..661246b6 100644 --- a/typescripts/util/ts/io.ts +++ b/typescripts/util/ts/io.ts @@ -3,7 +3,7 @@ import { io } from '../oldSystem' export async function moveImageToLayer( base64_image: string, selection_info: any, - layer_name: string = 'output_image' + layer_name: string = 'output_image.png' ) { let layer try { diff --git a/typescripts/viewer/preview.tsx b/typescripts/viewer/preview.tsx index cd9b73c3..c53efbb7 100644 --- a/typescripts/viewer/preview.tsx +++ b/typescripts/viewer/preview.tsx @@ -22,7 +22,7 @@ reaction( document.querySelectorAll('.pProgressBars').forEach((progress: any) => { progress.value = value?.toFixed(2) }) - } + } ) const Previewer = observer(() => { const renderImage = () => { @@ -63,9 +63,10 @@ const PreviewerContainer = observer(() => { return (
Date: Wed, 12 Jul 2023 21:20:40 +0300 Subject: [PATCH 123/143] store a mask image for each output image --- typescripts/session/generate.tsx | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/typescripts/session/generate.tsx b/typescripts/session/generate.tsx index ce5493e6..ac449979 100644 --- a/typescripts/session/generate.tsx +++ b/typescripts/session/generate.tsx @@ -191,7 +191,20 @@ const handleGenerate = async () => { viewer.store.updateProperty('thumbnails', thumbnail_list) viewer.store.updateProperty('images', output_images) - + if ( + [ + GenerationModeEnum.Inpaint, + GenerationModeEnum.LassoInpaint, + GenerationModeEnum.Outpaint, + ].includes(session_ts.store.data.mode) + ) { + viewer.mask_store.updateProperty( + 'output_images_masks', + Array(output_images.length).fill( + session_ts.store.data.expanded_mask + ) + ) + } console.log( 'session_ts.store.toJsFunc(): ', session_ts.store.toJsFunc() @@ -227,6 +240,20 @@ const handleGenerateMore = async () => { ...output_images, ] + if ( + [ + GenerationModeEnum.Inpaint, + GenerationModeEnum.LassoInpaint, + GenerationModeEnum.Outpaint, + ].includes(session_ts.store.data.mode) + ) { + viewer.mask_store.updatePropertyArray( + 'output_images_masks', + Array(output_images.length).fill( + session_ts.store.data.expanded_mask + ) + ) + } // viewer.store.updateProperty('images', output_images) // console.log( // 'session_ts.store.toJsFunc(): ', From 744fad61f1b07cc8ca294e059094930c7b547fb7 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Wed, 12 Jul 2023 21:24:46 +0300 Subject: [PATCH 124/143] reimplement batch count --- typescripts/session/generate.tsx | 63 ++++++++++++++++++++++++++++++-- typescripts/session/session.ts | 5 ++- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/typescripts/session/generate.tsx b/typescripts/session/generate.tsx index ac449979..a5faa30b 100644 --- a/typescripts/session/generate.tsx +++ b/typescripts/session/generate.tsx @@ -11,7 +11,7 @@ import { initializeBackground } from '../util/ts/document' import Locale from '../locale/locale' import { ErrorBoundary } from '../util/errorBoundary' declare let g_automatic_status: any - +declare let g_current_batch_index: number //example: take 'oI' in 'LassoInpaint' and replace it with 'o I' thus creating 'Lasso Inpaint' const modeDisplayNames = Object.fromEntries( Object.entries(GenerationModeEnum).map(([key, value]) => [ @@ -26,7 +26,7 @@ const GenerateButtons = observer(() => { {session_ts.store.data.can_generate ? (
- + {/* */} + + ) => { + this.props.appState.disableControlNetTab = + event.target.checked + }} + > {Locale('Disable ControlNet Tab')}
@@ -188,7 +201,9 @@ class ControlNetTab extends React.Component<{ const storeData = this.props.appState.controlNetUnitData[index] - let controlNetLabel = `${Locale('ControlNet Unit')} ${index}: ${ + let controlNetLabel = `${Locale( + 'ControlNet Unit' + )} ${index}: ${ storeData.module && storeData.module !== 'none' ? `${storeData.module}` : '' diff --git a/typescripts/controlnet/entry.ts b/typescripts/controlnet/entry.ts index b8569060..a35ad976 100644 --- a/typescripts/controlnet/entry.ts +++ b/typescripts/controlnet/entry.ts @@ -240,10 +240,7 @@ function setControlInputImageSrc(base64: string, index: number) { store.controlNetUnitData[index].input_image = base64 } function isControlNetModeEnable() { - let is_tab_enabled = - !document.getElementById('chDisableControlNetTab') || - //@ts-ignore - !document.getElementById('chDisableControlNetTab').checked + let is_tab_enabled = !store.disableControlNetTab let numOfEnabled = 0 if (is_tab_enabled) { diff --git a/typescripts/controlnet/store.ts b/typescripts/controlnet/store.ts index 56994b09..4cea5e21 100644 --- a/typescripts/controlnet/store.ts +++ b/typescripts/controlnet/store.ts @@ -52,6 +52,7 @@ export interface controlNetUnitData { auto_image: boolean // sync CtrlNet image with sd input image } interface ControlNetMobxStore { + disableControlNetTab: boolean maxControlNet: number controlnetApiVersion: number @@ -64,6 +65,7 @@ interface ControlNetMobxStore { } var ControlNetStore = observable({ + disableControlNetTab: false, maxControlNet: 0, controlnetApiVersion: 1, diff --git a/typescripts/session/progress.ts b/typescripts/session/progress.ts index d5b09deb..78fa37ac 100644 --- a/typescripts/session/progress.ts +++ b/typescripts/session/progress.ts @@ -117,7 +117,7 @@ export class Progress { } } - static startTimer(callback: any, interval: number = 1000) { + static startTimer(callback: any, interval: number = 1500) { store.data.can_update = true //clear the old timer if it exist try { From 06cab928b9f57156f91890617027b09c3376d3ae Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Wed, 12 Jul 2023 21:34:51 +0300 Subject: [PATCH 126/143] disable controlnet filters if none is selected --- typescripts/controlnet/ControlNetUnit.tsx | 31 +++++++++++++++-------- typescripts/controlnet/entry.ts | 4 ++- typescripts/session/modes.ts | 11 +++++--- 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/typescripts/controlnet/ControlNetUnit.tsx b/typescripts/controlnet/ControlNetUnit.tsx index 5db05fa4..071146ec 100644 --- a/typescripts/controlnet/ControlNetUnit.tsx +++ b/typescripts/controlnet/ControlNetUnit.tsx @@ -9,8 +9,10 @@ import { Thumbnail, PenSvg, PreviewSvg, + SpSliderWithLabel, + SliderType, } from '../util/elements' -import ControlNetStore from './store' +import ControlNetStore, { ControlnetMode, controlnetModes } from './store' import { mapRange, versionCompare } from './util' import { note, @@ -114,17 +116,24 @@ export default class ControlNetUnit extends React.Component< const storeData = this.props.appState.controlNetUnitData[this.props.index] storeData.filter_keyword = item - const filters = await requestControlNetFiltersKeywords( - storeData.filter_keyword, - this.props.appState.supportedPreprocessors, - this.props.appState.supportedModels - ) + if (storeData.filter_keyword.toLowerCase() === 'none') { + storeData.module_list = this.props.appState.supportedPreprocessors + storeData.model_list = ['None'].concat( + this.props.appState.supportedModels + ) + } else { + const filters = await requestControlNetFiltersKeywords( + storeData.filter_keyword, + this.props.appState.supportedPreprocessors, + this.props.appState.supportedModels + ) - storeData.module_list = filters.module_list - storeData.model_list = filters.model_list - storeData.model = filters.default_model - storeData.module = filters.default_option - storeData.model = filters.default_model + storeData.module_list = filters.module_list + storeData.model_list = filters.model_list + storeData.model = filters.default_model + storeData.module = filters.default_option + storeData.model = filters.default_model + } } onPreprocsesorChange( event: any, diff --git a/typescripts/controlnet/entry.ts b/typescripts/controlnet/entry.ts index a35ad976..53e62a79 100644 --- a/typescripts/controlnet/entry.ts +++ b/typescripts/controlnet/entry.ts @@ -88,7 +88,9 @@ async function initializeControlNetTab(controlnet_max_models: number) { store.supportedModels ) - store.filterKeywords = filters ? filters.keywords : [] + store.filterKeywords = filters + ? ['none'].concat(filters.keywords) + : ['none'] if (filters) { store.controlNetUnitData.forEach((unitData) => { unitData.module_list = filters.module_list diff --git a/typescripts/session/modes.ts b/typescripts/session/modes.ts index e1e891b7..42e4c0e0 100644 --- a/typescripts/session/modes.ts +++ b/typescripts/session/modes.ts @@ -40,6 +40,7 @@ async function saveOutputImagesToDrive(images_info: any, settings: any) { await io.saveFileInSubFolder(base64_image, document_name, image_name) //save the output image const json_file_name = `${image_name.split('.')[0]}.json` settings['auto_metadata'] = image_info?.auto_metadata + await io.saveJsonFileInSubFolder( settings, document_name, @@ -174,8 +175,9 @@ export class Txt2ImgMode extends Mode { 'module' ] ].model_free) || - control_net_settings['controlnet_units'][index]['model'] === - 'none' + control_net_settings['controlnet_units'][index][ + 'model' + ].toLowerCase() === 'none' ) { //@ts-ignore app.showAlert('you need to select a valid ControlNet Model') @@ -315,8 +317,9 @@ export class Img2ImgMode extends Mode { 'module' ] ].model_free) || - control_net_settings['controlnet_units'][index]['model'] === - 'none' + control_net_settings['controlnet_units'][index][ + 'model' + ].toLowerCase() === 'none' ) { //@ts-ignore app.showAlert('you need to select a valid ControlNet Model') From 33157603d142f72bf2b119c0583a0c464007abcd Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Wed, 12 Jul 2023 21:40:25 +0300 Subject: [PATCH 127/143] sync weight, guidance_start and end sliders between panels --- typescripts/controlnet/ControlNetUnit.tsx | 36 +++++++++++++++-------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/typescripts/controlnet/ControlNetUnit.tsx b/typescripts/controlnet/ControlNetUnit.tsx index 071146ec..ae7cb18e 100644 --- a/typescripts/controlnet/ControlNetUnit.tsx +++ b/typescripts/controlnet/ControlNetUnit.tsx @@ -644,29 +644,33 @@ export default class ControlNetUnit extends React.Component<
{Locale('Control Weight')} - + {storeData.weight} @@ -681,10 +685,18 @@ export default class ControlNetUnit extends React.Component< From 0e382c60eb70e4e91a8d59a9cc7751156e141e5e Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Wed, 12 Jul 2023 21:41:33 +0300 Subject: [PATCH 128/143] refactor controlnet mode options --- typescripts/controlnet/ControlNetUnit.tsx | 47 +++++++++++++++-------- typescripts/controlnet/store.ts | 12 ++++-- 2 files changed, 39 insertions(+), 20 deletions(-) diff --git a/typescripts/controlnet/ControlNetUnit.tsx b/typescripts/controlnet/ControlNetUnit.tsx index ae7cb18e..2a8ac697 100644 --- a/typescripts/controlnet/ControlNetUnit.tsx +++ b/typescripts/controlnet/ControlNetUnit.tsx @@ -616,27 +616,42 @@ export default class ControlNetUnit extends React.Component< {this.props.appState.controlnetApiVersion > 1 && ( { + this.props.appState.controlNetUnitData[ + this.props.index + ].control_mode = event.target.value + }} > {Locale('Control Mode')} - - {Locale('Balanced')} - - - {Locale('My prompt is more important')} - - - {Locale('ControlNet is more important')} - + {controlnetModes.map( + (mode: ControlnetMode, index: number) => { + console.log('mode:', mode, ' index:', index) + return ( + + {Locale(mode)} + + ) + } + )} )} diff --git a/typescripts/controlnet/store.ts b/typescripts/controlnet/store.ts index 4cea5e21..2a42711d 100644 --- a/typescripts/controlnet/store.ts +++ b/typescripts/controlnet/store.ts @@ -23,6 +23,13 @@ export const DefaultControlNetUnitData = { auto_image: true, } +export const controlnetModes = [ + 'Balanced', + 'My prompt is more important', + 'ControlNet is more important', +] as const +export type ControlnetMode = (typeof controlnetModes)[number] + export interface controlNetUnitData { enabled: boolean input_image: string @@ -44,10 +51,7 @@ export interface controlNetUnitData { guidance_end: number guessmode: boolean - control_mode: - | 'Balanced' - | 'My prompt is more important' - | 'ControlNet is more important' + control_mode: ControlnetMode pixel_perfect: boolean auto_image: boolean // sync CtrlNet image with sd input image } From 2d54b1b94d3b8f4955c1ab1b579776589e4037df Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Wed, 12 Jul 2023 21:43:23 +0300 Subject: [PATCH 129/143] :use colorRange to extract selection from black and white image for sam --- typescripts/sam/sam.tsx | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/typescripts/sam/sam.tsx b/typescripts/sam/sam.tsx index 5e75f0a8..39ad6afe 100644 --- a/typescripts/sam/sam.tsx +++ b/typescripts/sam/sam.tsx @@ -119,15 +119,30 @@ export class Sam extends React.Component<{ ComponentType: PenSvg, callback: async (index: number) => { try { - await psapi.unSelectMarqueeExe() - const base64 = general.base64UrlToBase64( - store.data.thumbnails[index] - ) + // await psapi.unSelectMarqueeExe() + // const base64 = general.base64UrlToBase64( + // store.data.thumbnails[index] + // ) - await selectionFromBlackAndWhiteImage( - base64, - store.data.selection_info_list[index] - ) + // await selectionFromBlackAndWhiteImage( + // base64, + // store.data.selection_info_list[index] + // ) + + try { + const base64 = + general.base64UrlToBase64( + store.data.thumbnails[index] + ) + await selection.base64ToLassoSelection( + base64, + store.data.selection_info_list[ + index + ] + ) + } catch (e) { + console.warn(e) + } //@ts-ignore await eventHandler() // this will trigger the recalculation of the width and height sliders } catch (e) { From ff23b9ceb58ffd78ce80deabd0441243e421fc02 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Wed, 12 Jul 2023 21:44:00 +0300 Subject: [PATCH 130/143] increment version to v1.2.7 --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index f691c87d..e380c570 100644 --- a/index.js +++ b/index.js @@ -8,7 +8,7 @@ const _log = console.log const _warn = console.warn const _error = console.error let g_timer_value = 300 // temporary global variable for testing the timer pause function -let g_version = 'v1.2.6' +let g_version = 'v1.2.7' let g_sd_url = 'http://127.0.0.1:7860' let g_online_data_url = 'https://raw.githubusercontent.com/AbdullahAlfaraj/Auto-Photoshop-StableDiffusion-Plugin/master/utility/online_data.json' From 2c9983b250ddff386e8ea0b9e1c74cfc214b3710 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 13 Jul 2023 15:59:10 +0300 Subject: [PATCH 131/143] add option to switch mask layer algo between borders or corners --- typescripts/settings/settings.tsx | 35 +++++++++++++++++++++++++++++++ typescripts/util/ts/selection.ts | 12 +++++++---- typescripts/viewer/viewer.tsx | 5 +++-- utility/io.js | 33 ++++++++++++++++++++--------- 4 files changed, 69 insertions(+), 16 deletions(-) diff --git a/typescripts/settings/settings.tsx b/typescripts/settings/settings.tsx index a88b2dcb..94efd4d1 100644 --- a/typescripts/settings/settings.tsx +++ b/typescripts/settings/settings.tsx @@ -40,6 +40,7 @@ export const store = new AStore({ should_log_to_file: JSON.parse(storage.localStorage.getItem('should_log_to_file')) || false, delete_log_file_timer_id: null, + b_borders_or_corners: false, }) function onShouldLogToFileChange(event: any) { @@ -132,6 +133,40 @@ export class Settings extends React.Component<{}> { Locale('Log Errors To File') } + + { + store.data.b_borders_or_corners = JSON.parse( + event.target.value + ) + }} + > + + {Locale('Mask Layer Mode:')} + + {[ + { label: 'keep borders', value: false }, + { label: 'keep corners', value: true }, + ].map((mode: any, index: number) => { + console.log('mode:', mode.label, ' index:', index) + return ( + + {Locale(mode.label)} + + ) + })} +
) } diff --git a/typescripts/util/ts/selection.ts b/typescripts/util/ts/selection.ts index 4ce0e4d6..543e011c 100644 --- a/typescripts/util/ts/selection.ts +++ b/typescripts/util/ts/selection.ts @@ -9,13 +9,15 @@ const batchPlay = action.batchPlay export async function applyMaskFromBlackAndWhiteImage( black_and_white_base64: string, layer_id: any, - selectionInfo: any + selectionInfo: any, + b_borders_or_corners: boolean = false ) { let mask_layer try { const transparent_mask_base64 = await io.convertBlackToTransparentKeepBorders( - black_and_white_base64 + black_and_white_base64, + b_borders_or_corners ) mask_layer = await moveImageToLayer( transparent_mask_base64, @@ -97,13 +99,15 @@ export async function applyMaskFromBlackAndWhiteImage( export async function selectionFromBlackAndWhiteImage( black_and_white_base64: string, - selectionInfo: any + selectionInfo: any, + b_borders_or_corners: boolean = false ) { let mask_layer try { const transparent_mask_base64 = await io.convertBlackToTransparentKeepBorders( - black_and_white_base64 + black_and_white_base64, + b_borders_or_corners ) mask_layer = await moveImageToLayer( transparent_mask_base64, diff --git a/typescripts/viewer/viewer.tsx b/typescripts/viewer/viewer.tsx index e52f1efb..52f23aab 100644 --- a/typescripts/viewer/viewer.tsx +++ b/typescripts/viewer/viewer.tsx @@ -13,7 +13,7 @@ import { import { moveImageToLayer } from '../util/ts/io' import { io, layer_util, selection } from '../util/oldSystem' import Collapsible from '../after_detailer/after_detailer' -import { progress, session_ts } from '../entry' +import { progress, session_ts, settings_tab_ts } from '../entry' import { reaction } from 'mobx' import { GenerationModeEnum } from '../util/ts/enum' import { base64ToLassoSelection } from '../../selection' @@ -203,7 +203,8 @@ const add = async (base64: string, mask?: string) => { await applyMaskFromBlackAndWhiteImage( channel_mask, layer.id, - selectionInfo + selectionInfo, + settings_tab_ts.store.data.b_borders_or_corners ) } diff --git a/utility/io.js b/utility/io.js index 7906f45a..c21dc22f 100644 --- a/utility/io.js +++ b/utility/io.js @@ -1302,7 +1302,10 @@ async function convertGrayscaleToMonochrome(base64) { } } -async function convertBlackToTransparentKeepBorders(base64) { +async function convertBlackToTransparentKeepBorders( + base64, + b_borders_or_corners = false // false for borders, true for corners +) { try { let jimp_mask = await Jimp.read(Buffer.from(base64, 'base64')) @@ -1314,15 +1317,25 @@ async function convertBlackToTransparentKeepBorders(base64) { width, height, function (x, y, idx) { - if (x === 0 || y === 0 || x === width - 1 || y === height - 1) - return - // if ( - // (x === 0 && y === 0) || - // (x === 0 && y === height - 1) || - // (x === width - 1 && y === 0) || - // (x === width - 1 && y === height - 1) - // ) - // return + if (b_borders_or_corners === false) { + // keep borders + if ( + x === 0 || + y === 0 || + x === width - 1 || + y === height - 1 + ) + return + } else { + // keep corners + if ( + (x === 0 && y === 0) || + (x === 0 && y === height - 1) || + (x === width - 1 && y === 0) || + (x === width - 1 && y === height - 1) + ) + return + } const red = this.bitmap.data[idx + 0] const green = this.bitmap.data[idx + 1] const blue = this.bitmap.data[idx + 2] From e398f7ac05507defa3f62bb1a39d4f221eceffbc Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 13 Jul 2023 16:02:35 +0300 Subject: [PATCH 132/143] comment mobx enforced action --- typescripts/entry.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/typescripts/entry.ts b/typescripts/entry.ts index 9f327c74..a2c9d51b 100644 --- a/typescripts/entry.ts +++ b/typescripts/entry.ts @@ -1,7 +1,7 @@ -import { configure } from 'mobx' -configure({ - enforceActions: 'never', // disable mobx warning temporarily -}) +// import { configure } from 'mobx' +// configure({ +// enforceActions: 'never', // disable mobx warning temporarily +// }) export * as control_net from './controlnet/entry' export * as after_detailer_script from './after_detailer/after_detailer' export * as ultimate_sd_upscaler from './ultimate_sd_upscaler/ultimate_sd_upscaler' From 7410e88423a5e3ee49421a328d32113ec15291c3 Mon Sep 17 00:00:00 2001 From: unknown <348063288@qq.com> Date: Thu, 13 Jul 2023 23:44:35 +0800 Subject: [PATCH 133/143] fix: correctly generate mask of outpaint area --- typescripts/util/oldSystem.tsx | 7 ++ typescripts/util/ts/document.ts | 123 ++++++++++++++++++++++++++++- typescripts/util/ts/enum.ts | 8 +- typescripts/util/ts/io.ts | 98 ++++++++++++++++++++--- typescripts/util/ts/layer.ts | 133 ++++++++++++++++++++++++++++++++ typescripts/viewer/viewer.tsx | 73 +++++++++--------- 6 files changed, 390 insertions(+), 52 deletions(-) create mode 100644 typescripts/util/ts/layer.ts diff --git a/typescripts/util/oldSystem.tsx b/typescripts/util/oldSystem.tsx index d4c4a6db..9b1417ba 100644 --- a/typescripts/util/oldSystem.tsx +++ b/typescripts/util/oldSystem.tsx @@ -1,3 +1,5 @@ +import type Jimp from 'jimp' + //@ts-ignore const req = window['require'] @@ -17,6 +19,10 @@ const io = req('./utility/io') const settings_tab = req('./utility/tab/settings') const layer_util = req('./utility/layer') const session = req('./utility/session') + +interface _Jimp extends Jimp {} +const _Jimp: typeof Jimp = (window as any)['Jimp'] + export { selection, note, @@ -33,4 +39,5 @@ export { settings_tab, layer_util, session, + _Jimp as Jimp, } diff --git a/typescripts/util/ts/document.ts b/typescripts/util/ts/document.ts index 0675acf3..01672cab 100644 --- a/typescripts/util/ts/document.ts +++ b/typescripts/util/ts/document.ts @@ -1,5 +1,9 @@ import { app, core, action } from 'photoshop' -import { layer_util, psapi } from '../oldSystem' +import { Jimp, layer_util, psapi } from '../oldSystem' +import { storage } from 'uxp' +import { Layer } from 'photoshop/dom/Layer' +import { changeDpiDataUrl } from 'changedpi' + const executeAsModal = core.executeAsModal const batchPlay = action.batchPlay @@ -190,3 +194,120 @@ export async function initializeBackground() { } ) } + +/** + * transfer a base64image to a layer. + * the image will located at the top-left corner of canvas. + * @param b64Image + * @param options + * @returns + */ +export async function base64ToFileAndGetLayer( + b64Image: string, + options: { + image_name?: string + } = {} +): Promise<{ layer: Layer; width: number; height: number }> { + const imageName = options.image_name || 'output_image.png' + + b64Image = changeDpiDataUrl( + 'data:image/png;base64,' + b64Image, + app.activeDocument.resolution + ) + const img = Buffer.from(b64Image.split(',')[1], 'base64') + const jimp_image = await Jimp.read(img) + + const folder = await storage.localFileSystem.getTemporaryFolder() + const file = await folder.createFile(imageName + '.png', { + overwrite: true, + }) + + await file.write(img.buffer, { format: storage.formats.binary }) + + const token = await storage.localFileSystem.createSessionToken(file) // batchPlay requires a token on _path + + const selection_info = await psapi.getSelectionInfoExe() + + let imported_layer + + await executeAsModal( + () => + batchPlay( + [ + { + _obj: 'set', + _target: [ + { + _property: 'selection', + _ref: 'channel', + }, + ], + to: { + _obj: 'rectangle', + bottom: { + _unit: 'pixelsUnit', + _value: jimp_image.bitmap.height, + }, + left: { + _unit: 'pixelsUnit', + _value: 0.0, + }, + right: { + _unit: 'pixelsUnit', + _value: jimp_image.bitmap.width, + }, + top: { + _unit: 'pixelsUnit', + _value: 0.0, + }, + }, + }, + ], + {} + ), + { + commandName: 'select import area', + } + ) + await executeAsModal( + async () => { + const result = await batchPlay( + [ + { + _obj: 'placeEvent', + // ID: 6, + null: { + _path: token, + _kind: 'local', + }, + freeTransformCenterState: { + _enum: 'quadCenterState', + _value: 'QCSAverage', + }, + _isCommand: true, + _options: { + dialogOptions: 'dontDisplay', + }, + }, + ], + {} + ) + console.log('placeEmbedd batchPlay result: ', result) + + imported_layer = await app.activeDocument.activeLayers[0] + }, + { + commandName: 'import base64', + } + ) + + await psapi.reSelectMarqueeExe(selection_info) + if (!imported_layer) { + throw new Error('base64ToFileAndGetLayer failed: layer is empty') + } + return { + layer: imported_layer, + height: jimp_image.bitmap.height, + width: jimp_image.bitmap.width, + } +} diff --git a/typescripts/util/ts/enum.ts b/typescripts/util/ts/enum.ts index e4167fb6..a20cc7d9 100644 --- a/typescripts/util/ts/enum.ts +++ b/typescripts/util/ts/enum.ts @@ -1,9 +1,9 @@ export enum GenerationModeEnum { - Txt2Img= 'txt2img', - Img2Img= 'img2img', - Inpaint ='inpaint', + Txt2Img = 'txt2img', + Img2Img = 'img2img', + Inpaint = 'inpaint', Outpaint = 'outpaint', Upscale = 'upscale', LassoInpaint = 'lasso_inpaint', LassoOutpaint = 'lasso_outpaint', -} \ No newline at end of file +} diff --git a/typescripts/util/ts/io.ts b/typescripts/util/ts/io.ts index 661246b6..294164fb 100644 --- a/typescripts/util/ts/io.ts +++ b/typescripts/util/ts/io.ts @@ -1,27 +1,105 @@ -import { io } from '../oldSystem' +import { app, core, action } from 'photoshop' +import { Jimp, io, psapi } from '../oldSystem' +import { base64ToFileAndGetLayer } from './document' +import { transformCurrentLayerTo } from './layer' +import { Layer } from 'photoshop/dom/Layer' +const executeAsModal = core.executeAsModal export async function moveImageToLayer( base64_image: string, selection_info: any, layer_name: string = 'output_image.png' -) { - let layer +): Promise { + if (!base64_image) throw new Error('moveImageToLayer: image is empty') + let layer: Layer | null try { const to_x = selection_info?.left const to_y = selection_info?.top const width = selection_info?.width const height = selection_info?.height - layer = await io.IO.base64ToLayer( - base64_image, - layer_name, - to_x, - to_y, - width, - height + + const res = await base64ToFileAndGetLayer(base64_image, { + image_name: layer_name, + }) + layer = res.layer + + await psapi.setVisibleExe(layer, true) + await transformCurrentLayerTo( + { + left: to_x, + top: to_y, + width, + height, + }, + { + width: res.width, + height: res.height, + left: 0, + top: 0, + } ) + await psapi.setVisibleExe(layer, true) } catch (e) { console.warn(e) layer = null } + if (!layer) { + throw new Error('moveImageToLayer failed: layer is empty') + } return layer } + +export async function convertGrayscaleToWhiteAndTransparent( + base64: string +): Promise<{ + base64: string + width: number + height: number +}> { + function grayToWhiteAndTransparent( + this: Jimp, + x: number, + y: number, + idx: number + ) { + let color + if ( + this.bitmap.data[idx] !== 0 && + this.bitmap.data[idx + 1] !== 0 && + this.bitmap.data[idx + 2] !== 0 + ) { + color = 0xffffffff + } else { + color = 0x00000000 + } + this.setPixelColor(color, x, y) + } + try { + const jimp_image = await Jimp.read(Buffer.from(base64, 'base64')) + + const jimp_mask = await jimp_image.scan( + 0, + 0, + jimp_image.bitmap.width, + jimp_image.bitmap.height, + grayToWhiteAndTransparent + ) + + const base64_monochrome_mask = await getBase64FromJimp(jimp_mask) + + return { + base64: base64_monochrome_mask, + height: jimp_image.bitmap.height, + width: jimp_image.bitmap.width, + } + } catch (e) { + console.warn(e) + throw e + } +} + +async function getBase64FromJimp(jimp_image: Jimp) { + const dataURL = await jimp_image.getBase64Async(Jimp.MIME_PNG) + const base64 = dataURL.replace(/^data:image\/png;base64,/, '') + return base64 +} diff --git a/typescripts/util/ts/layer.ts b/typescripts/util/ts/layer.ts new file mode 100644 index 00000000..1960af83 --- /dev/null +++ b/typescripts/util/ts/layer.ts @@ -0,0 +1,133 @@ +import { app, core, action } from 'photoshop' +import { layer_util, psapi } from '../oldSystem' +import { settings_tab_ts } from '../../entry' +const executeAsModal = core.executeAsModal +const { batchPlay } = action + +export interface RectArea { + top: number + left: number + height: number + width: number +} + +async function transformBatchPlay( + centerX: number, + centerY: number, + scaleRatioX: number, + scaleRatioY: number, + translateX: number, + translateY: number +) { + const setInterpolationMethodDesc = { + _obj: 'set', + _target: [ + { + _ref: 'property', + _property: 'generalPreferences', + }, + { + _ref: 'application', + _enum: 'ordinal', + _value: 'targetEnum', + }, + ], + to: { + _obj: 'generalPreferences', + interpolationMethod: { + _enum: 'interpolationType', + // _value: 'bilinear', + _value: settings_tab_ts.store.data.scale_interpolation_method + .photoshop, + }, + }, + _isCommand: true, + } + + let imageSizeDescriptor = { + _obj: 'transform', + _target: [ + { + _ref: 'layer', + _enum: 'ordinal', + _value: 'targetEnum', + }, + ], + freeTransformCenterState: { + _enum: 'quadCenterState', + _value: 'QCSIndependent', + }, + position: { + _obj: 'paint', + horizontal: { _unit: 'pixelsUnit', _value: centerX }, + vertical: { _unit: 'pixelsUnit', _value: centerY }, + }, + offset: { + _obj: 'offset', + horizontal: { + _unit: 'pixelsUnit', + _value: translateX, + }, + vertical: { + _unit: 'pixelsUnit', + _value: translateY, + }, + }, + width: { + _unit: 'percentUnit', + _value: scaleRatioX, + }, + height: { + _unit: 'percentUnit', + _value: scaleRatioY, + }, + linked: true, + interfaceIconFrameDimmed: { + _enum: 'interpolationType', + // _value: 'bilinear', + _value: settings_tab_ts.store.data.scale_interpolation_method + .photoshop, + }, + _isCommand: true, + } + return batchPlay([setInterpolationMethodDesc, imageSizeDescriptor], { + synchronousExecution: true, + modalBehavior: 'execute', + }) +} + +export async function transformCurrentLayerTo( + toRect: RectArea, + fromRect: RectArea +) { + const selection_info = await psapi.getSelectionInfoExe() + await psapi.unSelectMarqueeExe() + + const scale_x_ratio = (toRect.width / fromRect.width) * 100 + const scale_y_ratio = (toRect.height / fromRect.height) * 100 + + const top_dist = toRect.top - fromRect.top + const left_dist = toRect.left - fromRect.left + console.log( + 'transformCurrentLayer', + top_dist, + left_dist, + scale_x_ratio, + scale_y_ratio + ) + + await executeAsModal( + () => + transformBatchPlay( + fromRect.left, + fromRect.top, + scale_x_ratio, + scale_y_ratio, + left_dist, + top_dist + ), + { commandName: 'transform' } + ) + + await psapi.reSelectMarqueeExe(selection_info) +} diff --git a/typescripts/viewer/viewer.tsx b/typescripts/viewer/viewer.tsx index 52f23aab..e0147a33 100644 --- a/typescripts/viewer/viewer.tsx +++ b/typescripts/viewer/viewer.tsx @@ -10,7 +10,10 @@ import { SpSlider, SpSliderWithLabel, } from '../util/elements' -import { moveImageToLayer } from '../util/ts/io' +import { + convertGrayscaleToWhiteAndTransparent, + moveImageToLayer, +} from '../util/ts/io' import { io, layer_util, selection } from '../util/oldSystem' import Collapsible from '../after_detailer/after_detailer' import { progress, session_ts, settings_tab_ts } from '../entry' @@ -170,47 +173,43 @@ export async function updateViewerStoreImageAndThumbnail( } const add = async (base64: string, mask?: string) => { - try { - //change the color of thumbnail border - //add image to the canvas - const layer = await moveImageToLayer( - base64, - session_ts.store.data.selectionInfo - ) + //change the color of thumbnail border + //add image to the canvas + const layer = await moveImageToLayer( + base64, + session_ts.store.data.selectionInfo + ) - // create channel if the generated mode support masking - if ( - [ - GenerationModeEnum.Inpaint, - GenerationModeEnum.LassoInpaint, - GenerationModeEnum.Outpaint, - ].includes(session_ts.store.data.mode) && - store.data.auto_mask - ) { - // const base64_monochrome_mask = await io.convertGrayscaleToMonochrome( - // session_ts.store.data.selected_mask - // ) - const timer = (ms: any) => new Promise((res) => setTimeout(res, ms)) - - const mask_monochrome = await io.convertGrayscaleToMonochrome( - // session_ts.store.data.expanded_mask - mask - ) - const channel_mask = mask_monochrome - const selectionInfo = session_ts.store.data.selectionInfo - // await selection.base64ToChannel(channel_mask, selectionInfo, 'mask') - - await applyMaskFromBlackAndWhiteImage( - channel_mask, - layer.id, - selectionInfo, - settings_tab_ts.store.data.b_borders_or_corners + // create channel if the generated mode support masking + if ( + [ + GenerationModeEnum.Inpaint, + GenerationModeEnum.LassoInpaint, + GenerationModeEnum.Outpaint, + ].includes(session_ts.store.data.mode) && + store.data.auto_mask + ) { + const channel_mask_monochrome = + await convertGrayscaleToWhiteAndTransparent( + session_ts.store.data.expanded_mask ) + + const mask_layer = await moveImageToLayer( + channel_mask_monochrome.base64, + session_ts.store.data.selectionInfo + ) + if (!mask_layer) { + throw new Error('mask_layer is empty') } + await selection.black_white_layer_to_mask_multi_batchplay( + mask_layer.id, + layer.id, + 'mask' + ) + await layer_util.deleteLayers([mask_layer]) + return layer - } catch (e) { - console.error(e) } } const addWithHistory = async (base64: string, mask?: string) => { From 67e0cc752599c6c058d6fcc99301e4349c6d1f9b Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Thu, 13 Jul 2023 19:02:17 +0300 Subject: [PATCH 134/143] remove uncensored logs --- server/python_server/serverMain.py | 8 ++++---- typescripts/session/session.ts | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/server/python_server/serverMain.py b/server/python_server/serverMain.py index f3303b8f..26062d62 100644 --- a/server/python_server/serverMain.py +++ b/server/python_server/serverMain.py @@ -278,7 +278,7 @@ async def savePng(request:Request): except: json = {} - print("json:",json) + # print("json:",json) try: folder = './init_images' image_path = f"{folder}/{json['image_name']}" @@ -420,8 +420,8 @@ async def loadPromptShortcut(request: Request): json = {} try: - print("json: ",json) - print("json['prompt_shortcut']: ",json['prompt_shortcut']) + # print("json: ",json) + # print("json['prompt_shortcut']: ",json['prompt_shortcut']) # save the prompt shortcut to the prompt_shortcut.json prompt_shortcut_json = json['prompt_shortcut'] # response.body = {"prompt_shortcut":prompt_shortcut} @@ -456,7 +456,7 @@ async def openUrl(request:Request): json = {} url = "" - print("json: ",json) + # print("json: ",json) try: url = json['url'] webbrowser.open(url) # Go to example.com diff --git a/typescripts/session/session.ts b/typescripts/session/session.ts index 414b62c2..6ff27d5c 100644 --- a/typescripts/session/session.ts +++ b/typescripts/session/session.ts @@ -426,7 +426,7 @@ export class Session { progress.store.data.progress_label = Locale('Progress...') - console.log('progress object json: ', json) + // console.log('progress object json: ', json) } catch (e) { console.warn(e) } From 98706917c371d90dd07a366f55041b9091a9cb40 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Fri, 14 Jul 2023 14:34:08 +0300 Subject: [PATCH 135/143] Add an option to the masking settings to choose whether or not to use the colorRange() --- index.js | 1 + package-lock.json | 11 ++++++++ package.json | 1 + typescripts/@types/changedpi.d.ts | 1 + typescripts/entry.ts | 2 +- typescripts/sam/sam.tsx | 47 ++++++++++++++++--------------- typescripts/settings/settings.tsx | 15 ++++++---- typescripts/util/ts/enum.ts | 6 ++++ typescripts/util/ts/selection.ts | 5 ++-- typescripts/viewer/viewer.tsx | 43 +++++++++++++++++++--------- utility/io.js | 9 ++++-- 11 files changed, 93 insertions(+), 48 deletions(-) create mode 100644 typescripts/@types/changedpi.d.ts diff --git a/index.js b/index.js index e380c570..7482e63e 100644 --- a/index.js +++ b/index.js @@ -77,6 +77,7 @@ const { sam, settings_tab_ts, one_button_prompt, + enum_ts, } = require('./typescripts/dist/bundle') const io = require('./utility/io') diff --git a/package-lock.json b/package-lock.json index 9d7bf085..e2d4a9c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@types/photoshop": "^24.5.1", "@types/react": "^18.2.6", "@types/react-dom": "^18.2.4", + "changedpi": "^1.0.4", "fastify": "^4.10.2", "jimp": "^0.16.2", "madge": "^6.0.0", @@ -3879,6 +3880,11 @@ "node": ">=4" } }, + "node_modules/changedpi": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/changedpi/-/changedpi-1.0.4.tgz", + "integrity": "sha512-9r6MNQrbg+cFURvEy10wo9Q35PD5GVj2GvXCbUYv8mU0Uf/NbkR7KlzMrjT4Ycd8a2nxApFJXQX2lTOPRFyG2g==" + }, "node_modules/charenc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", @@ -12180,6 +12186,11 @@ "supports-color": "^5.3.0" } }, + "changedpi": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/changedpi/-/changedpi-1.0.4.tgz", + "integrity": "sha512-9r6MNQrbg+cFURvEy10wo9Q35PD5GVj2GvXCbUYv8mU0Uf/NbkR7KlzMrjT4Ycd8a2nxApFJXQX2lTOPRFyG2g==" + }, "charenc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", diff --git a/package.json b/package.json index bfef60bc..e059028c 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "@types/photoshop": "^24.5.1", "@types/react": "^18.2.6", "@types/react-dom": "^18.2.4", + "changedpi": "^1.0.4", "fastify": "^4.10.2", "jimp": "^0.16.2", "madge": "^6.0.0", diff --git a/typescripts/@types/changedpi.d.ts b/typescripts/@types/changedpi.d.ts new file mode 100644 index 00000000..13ef93d4 --- /dev/null +++ b/typescripts/@types/changedpi.d.ts @@ -0,0 +1 @@ +declare module 'changedpi' diff --git a/typescripts/entry.ts b/typescripts/entry.ts index 9f327c74..b2a2b8ec 100644 --- a/typescripts/entry.ts +++ b/typescripts/entry.ts @@ -19,5 +19,5 @@ export * as sd_tab_ts from './sd_tab/sd_tab' export * as sam from './sam/sam' export * as settings_tab_ts from './settings/settings' export * as one_button_prompt from './one_button_prompt/one_button_prompt' - +export * as enum_ts from './util/ts/enum' export { toJS } from 'mobx' diff --git a/typescripts/sam/sam.tsx b/typescripts/sam/sam.tsx index 39ad6afe..a4f4713c 100644 --- a/typescripts/sam/sam.tsx +++ b/typescripts/sam/sam.tsx @@ -18,6 +18,7 @@ import { import { app } from 'photoshop' import { ErrorBoundary } from '../util/errorBoundary' import Locale from '../locale/locale' +import { settings_tab_ts } from '../entry' declare let g_sd_url: string export async function getSamMap(base64: string, prompt: string) { @@ -119,30 +120,32 @@ export class Sam extends React.Component<{ ComponentType: PenSvg, callback: async (index: number) => { try { - // await psapi.unSelectMarqueeExe() - // const base64 = general.base64UrlToBase64( - // store.data.thumbnails[index] - // ) + await psapi.unSelectMarqueeExe() + const base64 = general.base64UrlToBase64( + store.data.thumbnails[index] + ) - // await selectionFromBlackAndWhiteImage( - // base64, - // store.data.selection_info_list[index] - // ) + await selectionFromBlackAndWhiteImage( + base64, + store.data.selection_info_list[index], + settings_tab_ts.store.data + .b_borders_or_corners + ) - try { - const base64 = - general.base64UrlToBase64( - store.data.thumbnails[index] - ) - await selection.base64ToLassoSelection( - base64, - store.data.selection_info_list[ - index - ] - ) - } catch (e) { - console.warn(e) - } + // try { + // const base64 = + // general.base64UrlToBase64( + // store.data.thumbnails[index] + // ) + // await selection.base64ToLassoSelection( + // base64, + // store.data.selection_info_list[ + // index + // ] + // ) + // } catch (e) { + // console.warn(e) + // } //@ts-ignore await eventHandler() // this will trigger the recalculation of the width and height sliders } catch (e) { diff --git a/typescripts/settings/settings.tsx b/typescripts/settings/settings.tsx index 94efd4d1..7475d9de 100644 --- a/typescripts/settings/settings.tsx +++ b/typescripts/settings/settings.tsx @@ -10,6 +10,7 @@ import { io } from '../util/oldSystem' import { reaction } from 'mobx' import { storage } from 'uxp' import { ErrorBoundary } from '../util/errorBoundary' +import { MaskModeEnum } from '../util/ts/enum' // import { Jimp } from '../util/oldSystem' declare const Jimp: any // make sure you import jimp before importing settings.tsx @@ -40,7 +41,7 @@ export const store = new AStore({ should_log_to_file: JSON.parse(storage.localStorage.getItem('should_log_to_file')) || false, delete_log_file_timer_id: null, - b_borders_or_corners: false, + b_borders_or_corners: MaskModeEnum.Transparent, }) function onShouldLogToFileChange(event: any) { @@ -138,17 +139,19 @@ export class Settings extends React.Component<{}> { style={{ display: 'flex' }} selected={store.data.b_borders_or_corners} onClick={(event: any) => { - store.data.b_borders_or_corners = JSON.parse( - event.target.value - ) + store.data.b_borders_or_corners = event.target.value }} > {Locale('Mask Layer Mode:')} {[ - { label: 'keep borders', value: false }, - { label: 'keep corners', value: true }, + { + label: 'fully transparent', + value: MaskModeEnum.Transparent, + }, + { label: 'keep borders', value: MaskModeEnum.Borders }, + { label: 'keep corners', value: MaskModeEnum.Corners }, ].map((mode: any, index: number) => { console.log('mode:', mode.label, ' index:', index) return ( diff --git a/typescripts/util/ts/enum.ts b/typescripts/util/ts/enum.ts index a20cc7d9..2984e0f6 100644 --- a/typescripts/util/ts/enum.ts +++ b/typescripts/util/ts/enum.ts @@ -7,3 +7,9 @@ export enum GenerationModeEnum { LassoInpaint = 'lasso_inpaint', LassoOutpaint = 'lasso_outpaint', } + +export enum MaskModeEnum { + Transparent = 'transparent', + Borders = 'border', + Corners = 'corner', +} diff --git a/typescripts/util/ts/selection.ts b/typescripts/util/ts/selection.ts index 543e011c..9f228c4b 100644 --- a/typescripts/util/ts/selection.ts +++ b/typescripts/util/ts/selection.ts @@ -3,6 +3,7 @@ import { io, layer_util } from '../oldSystem' import { session_ts } from '../../entry' import { action, core } from 'photoshop' +import { MaskModeEnum } from './enum' const executeAsModal = core.executeAsModal const batchPlay = action.batchPlay @@ -10,7 +11,7 @@ export async function applyMaskFromBlackAndWhiteImage( black_and_white_base64: string, layer_id: any, selectionInfo: any, - b_borders_or_corners: boolean = false + b_borders_or_corners: MaskModeEnum = MaskModeEnum.Transparent ) { let mask_layer try { @@ -100,7 +101,7 @@ export async function applyMaskFromBlackAndWhiteImage( export async function selectionFromBlackAndWhiteImage( black_and_white_base64: string, selectionInfo: any, - b_borders_or_corners: boolean = false + b_borders_or_corners: MaskModeEnum = MaskModeEnum.Transparent ) { let mask_layer try { diff --git a/typescripts/viewer/viewer.tsx b/typescripts/viewer/viewer.tsx index e0147a33..bf1d79c1 100644 --- a/typescripts/viewer/viewer.tsx +++ b/typescripts/viewer/viewer.tsx @@ -18,7 +18,7 @@ import { io, layer_util, selection } from '../util/oldSystem' import Collapsible from '../after_detailer/after_detailer' import { progress, session_ts, settings_tab_ts } from '../entry' import { reaction } from 'mobx' -import { GenerationModeEnum } from '../util/ts/enum' +import { GenerationModeEnum, MaskModeEnum } from '../util/ts/enum' import { base64ToLassoSelection } from '../../selection' import { action, app, core } from 'photoshop' import Locale from '../locale/locale' @@ -193,21 +193,36 @@ const add = async (base64: string, mask?: string) => { await convertGrayscaleToWhiteAndTransparent( session_ts.store.data.expanded_mask ) + if ( + settings_tab_ts.store.data.b_borders_or_corners === + MaskModeEnum.Transparent + ) { + //will use colorRange() which may or may not break + const mask_layer = await moveImageToLayer( + channel_mask_monochrome.base64, + session_ts.store.data.selectionInfo + ) - const mask_layer = await moveImageToLayer( - channel_mask_monochrome.base64, - session_ts.store.data.selectionInfo - ) - if (!mask_layer) { - throw new Error('mask_layer is empty') - } + if (!mask_layer) { + throw new Error('mask_layer is empty') + } - await selection.black_white_layer_to_mask_multi_batchplay( - mask_layer.id, - layer.id, - 'mask' - ) - await layer_util.deleteLayers([mask_layer]) + await selection.black_white_layer_to_mask_multi_batchplay( + mask_layer.id, + layer.id, + 'mask' + ) + await layer_util.deleteLayers([mask_layer]) + } else { + // if MaskModeEnum.Borders or MaskModeEnum.Corners + // another option that doesn't use colorRange() + await applyMaskFromBlackAndWhiteImage( + channel_mask_monochrome.base64, + layer.id, + session_ts.store.data.selectionInfo, + settings_tab_ts.store.data.b_borders_or_corners + ) + } return layer } diff --git a/utility/io.js b/utility/io.js index c21dc22f..f8bf3ae6 100644 --- a/utility/io.js +++ b/utility/io.js @@ -1304,7 +1304,7 @@ async function convertGrayscaleToMonochrome(base64) { async function convertBlackToTransparentKeepBorders( base64, - b_borders_or_corners = false // false for borders, true for corners + b_borders_or_corners = enum_ts.MaskModeEnum.Transparent // false for borders, true for corners ) { try { let jimp_mask = await Jimp.read(Buffer.from(base64, 'base64')) @@ -1317,7 +1317,7 @@ async function convertBlackToTransparentKeepBorders( width, height, function (x, y, idx) { - if (b_borders_or_corners === false) { + if (b_borders_or_corners === enum_ts.MaskModeEnum.Borders) { // keep borders if ( x === 0 || @@ -1326,7 +1326,9 @@ async function convertBlackToTransparentKeepBorders( y === height - 1 ) return - } else { + } else if ( + b_borders_or_corners === enum_ts.MaskModeEnum.Corners + ) { // keep corners if ( (x === 0 && y === 0) || @@ -1336,6 +1338,7 @@ async function convertBlackToTransparentKeepBorders( ) return } + const red = this.bitmap.data[idx + 0] const green = this.bitmap.data[idx + 1] const blue = this.bitmap.data[idx + 2] From 8a8b6cd16beed346db74f00e403fe2ddaaf972c8 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Fri, 14 Jul 2023 15:11:52 +0300 Subject: [PATCH 136/143] add title for Auto Image option --- typescripts/controlnet/ControlNetUnit.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/typescripts/controlnet/ControlNetUnit.tsx b/typescripts/controlnet/ControlNetUnit.tsx index 2a8ac697..5c56d954 100644 --- a/typescripts/controlnet/ControlNetUnit.tsx +++ b/typescripts/controlnet/ControlNetUnit.tsx @@ -613,6 +613,10 @@ export default class ControlNetUnit extends React.Component< //@ts-ignore Locale('Auto Image') } + title= + {Locale( + 'load the input image from canvas automatically' + )} {this.props.appState.controlnetApiVersion > 1 && ( Date: Fri, 14 Jul 2023 19:44:37 +0300 Subject: [PATCH 137/143] hide set mask and set init image buttons from viewer tab --- index.html | 12 ++++++++++-- typescripts/controlnet/ControlNetUnit.tsx | 7 +++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/index.html b/index.html index 07b63974..3afec64f 100644 --- a/index.html +++ b/index.html @@ -885,10 +885,18 @@
- - -
diff --git a/typescripts/controlnet/main.tsx b/typescripts/controlnet/main.tsx index 9e6dbdf5..1251e01a 100644 --- a/typescripts/controlnet/main.tsx +++ b/typescripts/controlnet/main.tsx @@ -88,6 +88,7 @@ button_root.render( console.warn(e) } }} + title="Quickly jump to the active ControlNet Unit" > C diff --git a/typescripts/settings/settings.tsx b/typescripts/settings/settings.tsx index 7475d9de..885048a0 100644 --- a/typescripts/settings/settings.tsx +++ b/typescripts/settings/settings.tsx @@ -41,7 +41,7 @@ export const store = new AStore({ should_log_to_file: JSON.parse(storage.localStorage.getItem('should_log_to_file')) || false, delete_log_file_timer_id: null, - b_borders_or_corners: MaskModeEnum.Transparent, + b_borders_or_corners: MaskModeEnum.Borders, }) function onShouldLogToFileChange(event: any) { @@ -146,10 +146,10 @@ export class Settings extends React.Component<{}> { {Locale('Mask Layer Mode:')} {[ - { - label: 'fully transparent', - value: MaskModeEnum.Transparent, - }, + // { + // label: 'fully transparent', + // value: MaskModeEnum.Transparent, + // }, { label: 'keep borders', value: MaskModeEnum.Borders }, { label: 'keep corners', value: MaskModeEnum.Corners }, ].map((mode: any, index: number) => { diff --git a/typescripts/util/ts/io.ts b/typescripts/util/ts/io.ts index 294164fb..6f75e335 100644 --- a/typescripts/util/ts/io.ts +++ b/typescripts/util/ts/io.ts @@ -5,6 +5,31 @@ import { transformCurrentLayerTo } from './layer' import { Layer } from 'photoshop/dom/Layer' const executeAsModal = core.executeAsModal +export async function moveImageToLayer_old( + base64_image: string, + selection_info: any, + layer_name: string = 'output_image.png' +) { + let layer + try { + const to_x = selection_info?.left + const to_y = selection_info?.top + const width = selection_info?.width + const height = selection_info?.height + layer = await io.IO.base64ToLayer( + base64_image, + layer_name, + to_x, + to_y, + width, + height + ) + } catch (e) { + console.warn(e) + layer = null + } + return layer +} export async function moveImageToLayer( base64_image: string, selection_info: any, diff --git a/typescripts/util/ts/selection.ts b/typescripts/util/ts/selection.ts index 9f228c4b..846cc011 100644 --- a/typescripts/util/ts/selection.ts +++ b/typescripts/util/ts/selection.ts @@ -1,4 +1,4 @@ -import { moveImageToLayer } from './io' +import { moveImageToLayer, moveImageToLayer_old } from './io' import { io, layer_util } from '../oldSystem' import { session_ts } from '../../entry' @@ -20,7 +20,7 @@ export async function applyMaskFromBlackAndWhiteImage( black_and_white_base64, b_borders_or_corners ) - mask_layer = await moveImageToLayer( + mask_layer = await moveImageToLayer_old( transparent_mask_base64, selectionInfo ) @@ -110,7 +110,7 @@ export async function selectionFromBlackAndWhiteImage( black_and_white_base64, b_borders_or_corners ) - mask_layer = await moveImageToLayer( + mask_layer = await moveImageToLayer_old( transparent_mask_base64, selectionInfo ) diff --git a/typescripts/viewer/viewer.tsx b/typescripts/viewer/viewer.tsx index ef9db45c..0dd6ca69 100644 --- a/typescripts/viewer/viewer.tsx +++ b/typescripts/viewer/viewer.tsx @@ -13,6 +13,7 @@ import { import { convertGrayscaleToWhiteAndTransparent, moveImageToLayer, + moveImageToLayer_old, } from '../util/ts/io' import { io, layer_util, psapi, selection } from '../util/oldSystem' import Collapsible from '../after_detailer/after_detailer' @@ -172,11 +173,11 @@ export async function updateViewerStoreImageAndThumbnail( } } -const add = async (base64: string, mask?: string) => { +const add_new = async (base64: string, mask?: string) => { //change the color of thumbnail border //add image to the canvas await psapi.unselectActiveLayersExe() - const layer = await moveImageToLayer( + const layer = await moveImageToLayer_old( base64, session_ts.store.data.selectionInfo ) @@ -229,6 +230,50 @@ const add = async (base64: string, mask?: string) => { } return layer } +const add = async (base64: string, mask?: string) => { + try { + //change the color of thumbnail border + //add image to the canvas + const layer = await moveImageToLayer_old( + base64, + session_ts.store.data.selectionInfo + ) + + // create channel if the generated mode support masking + if ( + [ + GenerationModeEnum.Inpaint, + GenerationModeEnum.LassoInpaint, + GenerationModeEnum.Outpaint, + ].includes(session_ts.store.data.mode) && + store.data.auto_mask + ) { + // const base64_monochrome_mask = await io.convertGrayscaleToMonochrome( + // session_ts.store.data.selected_mask + // ) + const timer = (ms: any) => new Promise((res) => setTimeout(res, ms)) + + const mask_monochrome = await io.convertGrayscaleToMonochrome( + // session_ts.store.data.expanded_mask + mask + ) + const channel_mask = mask_monochrome + const selectionInfo = session_ts.store.data.selectionInfo + // await selection.base64ToChannel(channel_mask, selectionInfo, 'mask') + + await applyMaskFromBlackAndWhiteImage( + channel_mask, + layer.id, + selectionInfo, + settings_tab_ts.store.data.b_borders_or_corners + ) + } + + return layer + } catch (e) { + console.error(e) + } +} const addWithHistory = async (base64: string, mask?: string) => { let layer await executeAsModal( @@ -548,7 +593,7 @@ const Viewer = observer(() => { { ComponentType: MoveToCanvasSvg, callback: async (index: number) => { - await moveImageToLayer( + await moveImageToLayer_old( mask_store.data.images[index], session_ts.store.data.selectionInfo, 'mask' From 43e3d91004c83e5ea3f0f9955dbea20706998638 Mon Sep 17 00:00:00 2001 From: Abdullah Alfaraj Date: Sat, 15 Jul 2023 23:22:16 +0300 Subject: [PATCH 143/143] rename the version from v1.2.7 to v1.3.0 --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 7482e63e..a5b3e8ce 100644 --- a/index.js +++ b/index.js @@ -8,7 +8,7 @@ const _log = console.log const _warn = console.warn const _error = console.error let g_timer_value = 300 // temporary global variable for testing the timer pause function -let g_version = 'v1.2.7' +let g_version = 'v1.3.0' let g_sd_url = 'http://127.0.0.1:7860' let g_online_data_url = 'https://raw.githubusercontent.com/AbdullahAlfaraj/Auto-Photoshop-StableDiffusion-Plugin/master/utility/online_data.json'