Browse Source

手机端模拟

naibo 2 years ago
parent
commit
4cca6a43fc

+ 1291 - 0
.temp_to_pub/EasySpider_windows_x64/easyspider_executestage.py

@@ -0,0 +1,1291 @@
+# -*- coding: utf-8 -*-
+# import atexit
+import io  # 遇到错误退出时应执行的代码
+import json
+# from lib2to3.pgen2 import driver
+import re
+# import shutil
+import subprocess
+import sys
+# from urllib import parse
+# import base64
+# import hashlib
+import time
+import keyboard
+import requests
+from lxml import etree
+from selenium.webdriver.chrome.options import Options
+from selenium.webdriver.common.keys import Keys
+from selenium.webdriver.common.action_chains import ActionChains
+from selenium import webdriver
+from selenium.webdriver.support.ui import WebDriverWait
+from selenium.webdriver.support import expected_conditions as EC
+from selenium.webdriver.common.by import By
+from selenium.common.exceptions import NoSuchElementException
+from selenium.common.exceptions import TimeoutException
+from selenium.common.exceptions import StaleElementReferenceException, InvalidSelectorException
+from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
+from selenium.webdriver.support.ui import Select
+from selenium.webdriver import ActionChains
+import undetected_chromedriver as uc
+import random
+# import numpy
+import csv
+import os
+from selenium.webdriver.common.by import By
+from commandline_config import Config
+import pytesseract
+from PIL import Image
+import uuid
+from threading import Thread, Event
+desired_capabilities = DesiredCapabilities.CHROME
+desired_capabilities["pageLoadStrategy"] = "none"
+
+# 控制流程的暂停和继续
+def check_file(filename, event):
+    while True:
+        if keyboard.is_pressed('p'):  # 按下p键,暂停程序
+            if event._flag == False:
+                print("任务执行中,长按p键暂停执行。")
+                print("Task is running, long press 'p' to pause.")
+                # 设置Event的值为True,使得线程b可以继续执行
+                event.set()
+            else:
+                # 设置Event的值为False,使得线程b暂停执行
+                print("任务已暂停,长按p键继续执行...")
+                print("Task paused, press 'p' to continue...")
+                event.clear()
+        time.sleep(1)  # 每秒检查一次
+
+
+def download_image(url, save_directory):
+    # 定义浏览器头信息
+    headers = {
+        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
+    }
+    
+    # 发送 GET 请求获取图片数据
+    response = requests.get(url, headers=headers)
+
+    # 检查响应状态码是否为成功状态
+    if response.status_code == requests.codes.ok:
+        # 提取文件名
+        file_name = url.split('/')[-1].split("?")[0]
+        
+        # 生成唯一的新文件名
+        new_file_name = file_name + '_' +  str(uuid.uuid4()) + '_' + file_name
+        
+        # 构建保存路径
+        save_path = os.path.join(save_directory, new_file_name)
+        
+        # 保存图片到本地
+        with open(save_path, 'wb') as file:
+            file.write(response.content)
+        
+        print("图片已成功下载到:", save_path)
+        print("The image has been successfully downloaded to:", save_path)
+    else:
+        print("下载图片失败,请检查此图片链接是否有效:", url)
+        print("Failed to download image, please check if this image link is valid:", url)
+
+def get_output_code(output):
+    try:
+        if output.find("rue") != -1: # 如果返回值中包含true
+            code = 1
+        else:
+            code = int(output)
+    except:
+        code = 0
+    return code
+
+# 判断字段是否为空
+def isnull(s):
+    return len(s) != 0
+
+class Time:
+    def __init__(self, type1=""):
+        self.t = int(round(time.time() * 1000))
+        self.type = type1
+
+    def end(self):
+        at = int(round(time.time() * 1000))
+        print("Time used for", self.type, ":", at - self.t, "ms")
+
+
+class BrowserThread(Thread):
+    def __init__(self, browser_t, id, service, version, event):
+        Thread.__init__(self)
+        self.browser = browser_t
+        self.id = id
+        self.event = event
+        self.saveName = saveName
+        self.log = ""
+        self.OUTPUT = ""
+        self.SAVED = False
+        stealth_path = driver_path[:driver_path.find("chromedriver")] + "stealth.min.js"
+        with open(stealth_path, 'r') as f:
+            js = f.read()
+            print("Loading stealth.min.js")
+        self.browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': js}) # TMALL 反扒
+        WebDriverWait(self.browser, 10)
+        self.browser.get('about:blank')
+        self.procedure = service["graph"]  # 程序执行流程
+        try:
+            if service["version"] >= "0.3.1": # 0.3.1及以上版本以上的EasySpider兼容从0.3.1版本开始的所有版本
+                pass
+            else: # 0.3.1以下版本的EasySpider不兼容0.3.1及以上版本的EasySpider
+                if service["version"] != version:
+                    print("版本不一致,请使用" + service["version"] + "版本的EasySpider运行该任务!")
+                    print("Version not match, please use EasySpider " + service["version"] + " to run this task!")
+                    self.browser.quit()
+                    sys.exit()
+        except: # 0.2.0版本没有version字段,所以直接退出
+            print("版本不一致,请使用v0.2.0版本的EasySpider运行该任务!")
+            print("Version not match, please use EasySpider v0.2.0 to run this task!")
+            self.browser.quit()
+            sys.exit()
+        try:
+            self.save_threshold = service["saveThreshold"]  # 保存最低阈值
+        except:
+            self.save_threshold = 10
+        self.links = list(filter(isnull, service["links"].split("\n")))  # 要执行的link的列表
+        self.OUTPUT = []  # 采集的数据
+        self.OUTPUT.append([])  # 添加表头
+        self.containJudge = service["containJudge"]  # 是否含有判断语句
+        self.bodyText = ""  # 记录bodyText
+        tOut = service["outputParameters"]  # 生成输出参数对象
+        self.outputParameters = {}
+        self.dataNotFoundKeys = {}  # 记录没有找到数据的key
+        self.log = ""  # 记下现在总共开了多少个标签页
+        self.history = {"index": 0, "handle": None}  # 记录页面现在所以在的历史记录的位置
+        self.SAVED = False  # 记录是否已经存储了
+        for para in tOut:
+            if para["name"] not in self.outputParameters.keys():
+                self.outputParameters[para["name"]] = ""
+                self.dataNotFoundKeys[para["name"]] = False
+                self.OUTPUT[0].append(para["name"])
+        self.urlId = 0  # 全局记录变量
+        self.preprocess() # 预处理,优化提取数据流程
+
+    # 检测如果没有复杂的操作,优化提取数据流程
+    def preprocess(self):
+        for node in self.procedure:
+            if node["option"] == 3: # 提取数据操作
+                paras = node["parameters"]["paras"]
+                for para in paras:
+                    if para["beforeJS"] == "" and para["afterJS"] == "" and para["contentType"] <= 1 and para["nodeType"] <= 2:
+                        para["optimizable"] = True
+                    else:
+                        para["optimizable"] = False
+
+    def run(self):
+        # 挨个执行程序
+        for i in range(len(self.links)):
+            self.executeNode(0)
+            self.urlId = self.urlId + 1
+
+        files = os.listdir("Data/" + self.saveName)
+        # 如果目录为空,则删除该目录
+        if not files:
+            os.rmdir("Data/" + self.saveName)
+        # os.remove("Data/" + self.saveName + "_control.txt")
+        print("Done!")
+        print("执行完成!")
+        self.recordLog("Done!")
+        self.saveData(exit=True)
+
+    def recordLog(self, str=""):
+        self.log = self.log + str + "\n"
+
+
+    # 控制台打印log函数
+    def Log(self, text, text2=""):
+        switch = False
+        if switch:
+            print(text, text2)
+
+    # @atexit.register
+    # def clean(self):
+    #     self.saveData(exit=True)
+    #     self.browser.quit()
+    #     sys.exit(0)
+
+    def saveData(self, exit=False):
+        if exit == True or len(self.OUTPUT) >= self.save_threshold: # 每save_threshold条保存一次
+            with open("Data/"+ self.saveName + '_log.txt', 'a', encoding='utf-8-sig') as file_obj:
+                file_obj.write(self.log)
+                file_obj.close()
+            with open("Data/"+ self.saveName + '.csv', 'a', encoding='utf-8-sig', newline="") as f:
+                f_csv = csv.writer(f)
+                for line in self.OUTPUT:
+                    f_csv.writerow(line)
+                f.close()
+            self.OUTPUT = []
+            self.log = ""
+
+    def scrollDown(self, para, rt=""):
+        time.sleep(para["scrollWaitTime"]) # 下拉前等待
+        scrollType = int(para["scrollType"])
+        try:
+            if scrollType != 0 and para["scrollCount"] > 0:  # 控制屏幕向下滚动
+                for i in range(para["scrollCount"]):
+                    self.Log("Wait for set second after screen scrolling")
+                    body = self.browser.find_element(By.CSS_SELECTOR, "body")
+                    if scrollType == 1:
+                        body.send_keys(Keys.PAGE_DOWN)
+                    elif scrollType == 2:
+                        body.send_keys(Keys.END)
+                    time.sleep(para["scrollWaitTime"])  # 下拉完等待
+        except:
+            self.Log('time out after set seconds when scrolling. ')
+            self.recordLog('time out after set seconds when scrolling')
+            self.browser.execute_script('window.stop()')
+            if scrollType != 0 and para["scrollCount"] > 0:  # 控制屏幕向下滚动
+                for i in range(para["scrollCount"]):
+                    self.Log("Wait for set second after screen scrolling")
+                    body = self.browser.find_element(By.CSS_SELECTOR, "body")
+                    if scrollType == 1:
+                        body.send_keys(Keys.PGDN)
+                    elif scrollType == 2:
+                        body.send_keys(Keys.END)
+                    time.sleep(para["scrollWaitTime"])  # 下拉完等待
+            if rt != "":
+                rt.end()
+
+    def execute_code(self, codeMode, code, max_wait_time, element=None):
+        output = ""
+        if code == "":
+            return ""
+        if max_wait_time == 0:
+            max_wait_time = 999999
+        # print(codeMode, code)
+        pattern = r'Field\["([^"]+)"\]' # 将value中的Field[""]替换为outputParameters中的键值
+        try:
+            replaced_text = re.sub(pattern, lambda match: self.outputParameters.get(match.group(1), ''), code)
+        except:
+            replaced_text = code
+        code = replaced_text
+        if int(codeMode) == 0:
+            self.recordLog("Execute JavaScript:" + code)
+            self.recordLog("执行JavaScript:" + code)
+            self.browser.set_script_timeout(max_wait_time)
+            try:
+                output = self.browser.execute_script(code)
+            except:
+                output = ""
+                self.recordLog("JavaScript execution failed")
+        elif int(codeMode) == 2:
+            self.recordLog("Execute JavaScript for element:" + code)
+            self.recordLog("对元素执行JavaScript:" + code)
+            self.browser.set_script_timeout(max_wait_time)
+            try:
+                output = self.browser.execute_script(code, element)
+            except:
+                output = ""
+                self.recordLog("JavaScript execution failed")
+        elif int(codeMode) == 1:
+            self.recordLog("Execute System Call:" + code)
+            self.recordLog("执行系统命令:" + code)
+            # 执行系统命令
+            try:
+                # output = subprocess.run(code, capture_output=True, text=True, timeout=max_wait_time, encoding="utf-8", shell=True)
+                output = subprocess.run(code, capture_output=True, text=True, timeout=max_wait_time, shell=True)
+                # 输出命令返回值
+                output = output.stdout
+                print(output)
+            except subprocess.TimeoutExpired:
+                # 命令执行时间超过指定值,抛出异常
+                self.recordLog("Command timed out")
+                self.recordLog("命令执行超时")
+            except Exception as e:
+                print(e) # 打印异常信息
+                self.recordLog("Command execution failed")
+                self.recordLog("命令执行失败")
+        return str(output)
+
+    def customOperation(self, node, loopValue, loopPath, index):
+        paras = node["parameters"]
+        codeMode = int(paras["codeMode"])
+        code = paras["code"]
+        max_wait_time = int(paras["waitTime"])
+        if codeMode == 2:  # 使用循环的情况下,传入的clickPath就是实际的xpath
+            try:
+                elements = self.browser.find_elements(By.XPATH, loopPath)
+                element = elements[index]
+                output = self.execute_code(codeMode, code, max_wait_time, element)
+            except:
+                output = ""
+                print("JavaScript execution failed")
+        else:
+            output = self.execute_code(codeMode, code, max_wait_time)
+        recordASField = int(paras["recordASField"])
+        if recordASField:
+            self.outputParameters[node["title"]] = output
+            line = []
+            for value in self.outputParameters.values():
+                line.append(value)
+                print(value[:15], " ", end="")
+            print("")
+            self.OUTPUT.append(line)
+
+    def switchSelect(self, para, loopValue):
+        optionMode = int(para["optionMode"])
+        optionValue = para["optionValue"]
+        try:
+            dropdown = Select(self.browser.find_element(By.XPATH, para["xpath"]))
+            try:
+                if optionMode == 0:
+                    # 获取当前选中的选项索引
+                    current_index = dropdown.options.index(dropdown.first_selected_option)
+                    # 计算下一个选项的索引
+                    next_index = (current_index + 1) % len(dropdown.options)
+                    # 选择下一个选项
+                    dropdown.select_by_index(next_index)
+                elif optionMode == 1:
+                    dropdown.select_by_index(int(optionValue))
+                elif optionMode == 2:
+                    dropdown.select_by_value(optionValue)
+                elif optionMode == 3:
+                    dropdown.select_by_visible_text(optionValue)
+            except:
+                print("切换下拉框选项失败:", para["xpath"], para["optionMode"], para["optionValue"])
+                print("Failed to change drop-down box option:", para["xpath"], para["optionMode"], para["optionValue"])
+        except:
+            print("找不到下拉框元素:", para["xpath"])
+            print("Cannot find drop-down box element:", para["xpath"])
+
+
+    def moveToElement(self, para, loopElement=None, loopPath="", index=0):
+        time.sleep(0.1)  # 移动之前等待0.1秒
+        if para["useLoop"]:  # 使用循环的情况下,传入的clickPath就是实际的xpath
+            path = loopPath
+        else:
+            index = 0
+            path = para["xpath"]  # 不然使用元素定义的xpath
+        try:
+            elements = self.browser.find_elements(By.XPATH, path)
+            element = elements[index]
+            try:
+                ActionChains(self.browser).move_to_element(element).perform()
+            except:
+                print("移动鼠标到元素失败:", para["xpath"])
+                print("Failed to move mouse to element:", para["xpath"])
+        except:
+            print("找不到元素:", para["xpath"])
+            print("Cannot find element:", para["xpath"])
+
+
+    # 执行节点关键函数部分
+    def executeNode(self, nodeId, loopValue="", loopPath="", index=0):
+        node = self.procedure[nodeId]
+        WebDriverWait(self.browser, 10).until
+        # 等待元素出现才进行操作,10秒内未出现则报错
+        (EC.visibility_of_element_located((By.XPATH, node["parameters"]["xpath"])))
+
+        # 根据不同选项执行不同操作
+        if node["option"] == 0 or node["option"] == 10:  # root操作,条件分支操作
+            for i in node["sequence"]:  # 从根节点开始向下读取
+                self.executeNode(i, loopValue, loopPath, index)
+        elif node["option"] == 1:  # 打开网页操作
+            self.recordLog("openPage")
+            self.openPage(node["parameters"], loopValue)
+        elif node["option"] == 2:  # 点击元素
+            self.recordLog("Click")
+            self.clickElement(node["parameters"], loopValue, loopPath, index)
+        elif node["option"] == 3:  # 提取数据
+            self.recordLog("getData")
+            self.getData(node["parameters"], loopValue, node["isInLoop"],
+                    parentPath=loopPath, index=index)
+            self.saveData()
+        elif node["option"] == 4:  # 输入文字
+            self.inputInfo(node["parameters"], loopValue)
+        elif node["option"] == 5:  # 自定义操作
+            self.customOperation(node, loopValue, loopPath, index)
+            self.saveData()
+        elif node["option"] == 6:  # 切换下拉框
+            self.switchSelect(node["parameters"], loopValue)
+        elif node["option"] == 7:  # 鼠标移动到元素上
+            self.moveToElement(node["parameters"], loopValue, loopPath, index)
+        elif node["option"] == 8:  # 循环
+            self.recordLog("loop")
+            self.loopExecute(node, loopValue, loopPath, index)  # 执行循环
+        elif node["option"] == 9:  # 条件分支
+            self.recordLog("judge")
+            self.judgeExecute(node, loopValue, loopPath, index)
+
+        # 执行完之后进行等待
+        if node["option"] != 0 and node["option"] != 2: # 点击元素操作单独定义等待时间操作
+            waitTime = 0.01  # 默认等待0.01秒
+            if node["parameters"]["wait"] >= 0:
+                waitTime = node["parameters"]["wait"]
+            try:
+                waitType = int(node["parameters"]["waitType"])
+            except:
+                waitType = 0
+            if waitType == 0:  # 固定等待时间
+                time.sleep(waitTime)
+            elif waitType == 1:  # 随机等待时间
+                time.sleep(random.uniform(waitTime * 0.5, waitTime * 1.5))
+            self.Log("Wait seconds after node executing: ", waitTime)
+        self.event.wait()  # 等待事件结束
+
+
+    # 对判断条件的处理
+    def judgeExecute(self, node, loopElement, clickPath="", index=0):
+        executeBranchId = 0  # 要执行的BranchId
+        for i in node["sequence"]:
+            cnode = self.procedure[i]  # 获得条件分支
+            tType = int(cnode["parameters"]["class"])  # 获得判断条件类型
+            if tType == 0:  # 什么条件都没有
+                executeBranchId = i
+                break
+            elif tType == 1:  # 当前页面包含文本
+                try:
+                    if self.bodyText.find(cnode["parameters"]["value"]) >= 0:
+                        executeBranchId = i
+                        break
+                except:  # 找不到元素下一个条件
+                    continue
+            elif tType == 2:  # 当前页面包含元素
+                try:
+                    if self.browser.find_element(By.XPATH, cnode["parameters"]["value"]):
+                        executeBranchId = i
+                        break
+                except:  # 找不到元素或者xpath写错了,下一个条件
+                    continue
+            elif tType == 3:  # 当前循环元素包括文本
+                try:
+                    if loopElement.text.find(cnode["parameters"]["value"]) >= 0:
+                        executeBranchId = i
+                        break
+                except:  # 找不到元素或者xpath写错了,下一个条件
+                    continue
+            elif tType == 4:  # 当前循环元素包括元素
+                try:
+                    if loopElement.find_element(By.XPATH, cnode["parameters"]["value"][1:]):
+                        executeBranchId = i
+                        break
+                except:  # 找不到元素或者xpath写错了,下一个条件
+                    continue
+            elif tType <= 7:  # JS命令返回值
+                if tType == 5:  # JS命令返回值等于
+                    output = self.execute_code(0, cnode["parameters"]["code"], cnode["parameters"]["waitTime"])
+                elif tType == 6:  # System
+                    output = self.execute_code(1, cnode["parameters"]["code"], cnode["parameters"]["waitTime"])
+                elif tType == 7:  # 针对当前循环项的JS命令返回值
+                    output = self.execute_code(2, cnode["parameters"]["code"], cnode["parameters"]["waitTime"], loopElement)
+                try:
+                    if output.find("rue") != -1: # 如果返回值中包含true
+                        code = 1
+                    else:
+                        code = int(output)
+                except:
+                    code = 0
+                if code > 0:
+                    executeBranchId = i
+                    break
+        # rt.end()
+        if executeBranchId != 0:
+            self.executeNode(executeBranchId, loopElement, clickPath, index)
+
+    # 对循环的处理
+    def loopExecute(self, node, loopValue, clickPath="", index=0):
+        time.sleep(0.1)  # 第一次执行循环的时候强制等待1秒
+        # self.Log("循环执行前等待0.1秒")
+        self.Log("Wait 0.1 second before loop")
+        thisHandle = self.browser.current_window_handle  # 记录本次循环内的标签页的ID
+        thisHistoryLength = self.browser.execute_script(
+            'return history.length')  # 记录本次循环内的history的length
+        self.history["index"] = thisHistoryLength
+        self.history["handle"] = thisHandle
+
+        if int(node["parameters"]["loopType"]) == 0:  # 单个元素循环
+            # 无跳转标签页操作
+            count = 0  # 执行次数
+            while True:  # do while循环
+                try:
+                    finished = False
+                    element = self.browser.find_element(
+                        By.XPATH, node["parameters"]["xpath"])
+                    for i in node["sequence"]:  # 挨个执行操作
+                        self.executeNode(i, element, node["parameters"]["xpath"], 0)
+                    finished = True
+                    self.Log("click: ", node["parameters"]["xpath"])
+                    self.recordLog("click:" + node["parameters"]["xpath"])
+                except NoSuchElementException:
+                    # except:
+                    print("Single loop element not found: ", node["parameters"]["xpath"])
+                    print("找不到要循环的单个元素: ", node["parameters"]["xpath"])
+                    self.recordLog("Single loop element not found: " + node["parameters"]["xpath"])
+                    for i in node["sequence"]:  # 不带点击元素的把剩余的如提取数据的操作执行一遍
+                        if node["option"] != 2:
+                            self.executeNode(i, None, node["parameters"]["xpath"], 0)
+                    finished = True
+                    break  # 如果找不到元素,退出循环
+                finally:
+                    if not finished:
+                        print("\n\n-------Retrying-------\n\n")
+                        self.Log("-------Retrying-------: ",
+                            node["parameters"]["xpath"])
+                        self.recordLog("clickNotFound:" + node["parameters"]["xpath"])
+                        for i in node["sequence"]:  # 不带点击元素的把剩余的如提取数据的操作执行一遍
+                            if node["option"] != 2:
+                                self.executeNode(i, None, node["parameters"]["xpath"], 0)
+                        break  # 如果找不到元素,退出循环
+                count = count + 1
+                self.Log("Page: ", count)
+                self.recordLog("Page:" + str(count))
+                # print(node["parameters"]["exitCount"], "-------")
+                if node["parameters"]["exitCount"] == count:  # 如果达到设置的退出循环条件的话
+                    break
+                if int(node["parameters"]["breakMode"]) > 0:  # 如果设置了退出循环的脚本条件
+                    output = self.execute_code(int(node["parameters"]["breakMode"]) -1, node["parameters"]["breakCode"], node["parameters"]["breakCodeWaitTime"])
+                    code = get_output_code(output)
+                    if code <= 0:
+                        break
+        elif int(node["parameters"]["loopType"]) == 1:  # 不固定元素列表
+            try:
+                elements = self.browser.find_elements(By.XPATH,
+                                                node["parameters"]["xpath"])
+                if len(elements) == 0:
+                    print("Loop element not found: ", node["parameters"]["xpath"])
+                    print("找不到循环元素: ", node["parameters"]["xpath"])
+                    self.recordLog("pathNotFound: " + node["parameters"]["xpath"])
+                for index in range(len(elements)):
+                    for i in node["sequence"]:  # 挨个顺序执行循环里所有的操作
+                        self.executeNode(i, elements[index],
+                                node["parameters"]["xpath"], index)
+                    if self.browser.current_window_handle != thisHandle:  # 如果执行完一次循环之后标签页的位置发生了变化
+                        while True:  # 一直关闭窗口直到当前标签页
+                            self.browser.close()  # 关闭使用完的标签页
+                            self.browser.switch_to.window(self.browser.window_handles[-1])
+                            if self.browser.current_window_handle == thisHandle:
+                                break
+                    if self.history["index"] != thisHistoryLength and self.history[
+                            "handle"] == self.browser.current_window_handle:  # 如果执行完一次循环之后历史记录发生了变化,注意当前页面的判断
+                        difference = thisHistoryLength - \
+                            self.history["index"]  # 计算历史记录变化差值
+                        self.browser.execute_script(
+                            'history.go(' + str(difference) + ')')  # 回退历史记录
+                        # if node["parameters"]["historyWait"] > 2:  # 回退后要等待的时间
+                        time.sleep(node["parameters"]["historyWait"])
+                        # else:
+                            # time.sleep(2)
+                        # 切换历史记录等待2秒或者:
+                        self.Log("Change history back time or:",
+                            node["parameters"]["historyWait"])
+                        self.browser.execute_script('window.stop()')
+                    if int(node["parameters"]["breakMode"]) > 0:  # 如果设置了退出循环的脚本条件
+                        output = self.execute_code(int(node["parameters"]["breakMode"]) -1, node["parameters"]["breakCode"], node["parameters"]["breakCodeWaitTime"])
+                        code = get_output_code(output)
+                        if code <= 0:
+                            break
+            except NoSuchElementException:
+                print("Loop element not found: ", node["parameters"]["xpath"])
+                print("找不到循环元素: ", node["parameters"]["xpath"])
+                self.recordLog("pathNotFound: " + node["parameters"]["xpath"])
+            except Exception as e:
+                raise
+        elif int(node["parameters"]["loopType"]) == 2:  # 固定元素列表
+            for path in node["parameters"]["pathList"].split("\n"):  # 千万不要忘了分割!!
+                try:
+                    element = self.browser.find_element(By.XPATH, path)
+                    for i in node["sequence"]:  # 挨个执行操作
+                        self.executeNode(i, element, path, 0)
+                    if self.browser.current_window_handle != thisHandle:  # 如果执行完一次循环之后标签页的位置发生了变化
+                        while True:  # 一直关闭窗口直到当前标签页
+                            self.browser.close()  # 关闭使用完的标签页
+                            self.browser.switch_to.window(self.browser.window_handles[-1])
+                            if self.browser.current_window_handle == thisHandle:
+                                break
+                    if self.history["index"] != thisHistoryLength and self.history[
+                            "handle"] == self.browser.current_window_handle:  # 如果执行完一次循环之后历史记录发生了变化,注意当前页面的判断
+                        difference = thisHistoryLength - \
+                            self.history["index"]  # 计算历史记录变化差值
+                        self.browser.execute_script(
+                            'history.go(' + str(difference) + ')')  # 回退历史记录
+                        # if node["parameters"]["historyWait"] > 2:  # 回退后要等待的时间
+                        time.sleep(node["parameters"]["historyWait"])
+                        # else:
+                            # time.sleep(2)
+                        self.Log("Change history back time or:",
+                            node["parameters"]["historyWait"])
+                        self.browser.execute_script('window.stop()')
+                except NoSuchElementException:
+                    print("Loop element not found: ", path)
+                    print("找不到循环元素: ", path)
+                    self.recordLog("pathNotFound: " + path)
+                    continue  # 循环中找不到元素就略过操作
+                except Exception as e:
+                    raise
+                if int(node["parameters"]["breakMode"]) > 0:  # 如果设置了退出循环的脚本条件
+                    output = self.execute_code(int(node["parameters"]["breakMode"]) -1, node["parameters"]["breakCode"], node["parameters"]["breakCodeWaitTime"])
+                    code = get_output_code(output)
+                    if code <= 0:
+                        break
+        elif int(node["parameters"]["loopType"]) == 3:  # 固定文本列表
+            textList = node["parameters"]["textList"].split("\n")
+            for text in textList:
+                self.recordLog("input: " + text)
+                for i in node["sequence"]:  # 挨个执行操作
+                    self.executeNode(i, text, "", 0)
+                if int(node["parameters"]["breakMode"]) > 0:  # 如果设置了退出循环的脚本条件
+                    output = self.execute_code(int(node["parameters"]["breakMode"]) -1, node["parameters"]["breakCode"], node["parameters"]["breakCodeWaitTime"])
+                    code = get_output_code(output)
+                    if code <= 0:
+                        break
+        elif int(node["parameters"]["loopType"]) == 4:  # 固定网址列表
+            # tempList = node["parameters"]["textList"].split("\r\n")
+            urlList = list(
+                filter(isnull, node["parameters"]["textList"].split("\n")))  # 去空行
+            # urlList = []
+            # for url in tempList:
+            #     if url != "":
+            #         urlList.append(url)
+            for url in urlList:
+                self.recordLog("input: " + url)
+                for i in node["sequence"]:
+                    self.executeNode(i, url, "", 0)
+                if int(node["parameters"]["breakMode"]) > 0:  # 如果设置了退出循环的脚本条件
+                    output = self.execute_code(int(node["parameters"]["breakMode"]) -1, node["parameters"]["breakCode"], node["parameters"]["breakCodeWaitTime"])
+                    code = get_output_code(output)
+                    if code <= 0:
+                        break
+        elif int(node["parameters"]["loopType"]) <= 6:  # 命令返回值
+            while True:  # do while循环
+                if int(node["parameters"]["loopType"]) == 5:  # JS
+                    output = self.execute_code(0, node["parameters"]["code"], node["parameters"]["waitTime"])
+                elif int(node["parameters"]["loopType"]) == 6:  # System
+                    output = self.execute_code(1, node["parameters"]["code"], node["parameters"]["waitTime"])
+                code = get_output_code(output)
+                if code <= 0:
+                    break
+                for i in node["sequence"]:  # 挨个执行操作
+                    self.executeNode(i, code, node["parameters"]["xpath"], 0)
+        self.history["index"] = thisHistoryLength
+        self.history["handle"] = self.browser.current_window_handle
+        self.scrollDown(node["parameters"])
+
+
+    # 打开网页事件
+    def openPage(self, para, loopValue):
+        time.sleep(1)  # 打开网页后强行等待至少1秒
+        if len(self.browser.window_handles) > 1:
+            self.browser.switch_to.window(self.browser.window_handles[-1])  # 打开网页操作从第1个页面开始
+            self.browser.close()
+        self.browser.switch_to.window(self.browser.window_handles[0])  # 打开网页操作从第1个页面开始
+        self.history["handle"] = self.browser.current_window_handle
+        if para["useLoop"]:
+            url = loopValue
+        elif para["url"] != "about:blank":
+            url = self.links[self.urlId]
+            # clear output parameters
+            for key in self.outputParameters:
+                self.outputParameters[key] = ""
+        else:
+            url = list(filter(isnull, para["links"].split("\n")))[0]
+        pattern = r'Field\["([^"]+)"\]' # 将value中的Field[""]替换为outputParameters中的键值
+        try:
+            replaced_text = re.sub(pattern, lambda match: self.outputParameters.get(match.group(1), ''), url)
+        except:
+            replaced_text = url
+        url = replaced_text
+        try:
+            maxWaitTime = int(para["maxWaitTime"])
+        except:
+            maxWaitTime = 10 # 默认最大等待时间为10秒
+        try:
+            self.browser.set_page_load_timeout(maxWaitTime)  # 加载页面最大超时时间
+            self.browser.set_script_timeout(maxWaitTime)
+            self.browser.get(url)
+            self.Log('Loading page: ' + url)
+            self.recordLog('Loading page: ' + url)
+        except TimeoutException:
+            self.Log('time out after set seconds when loading page: ' + url)
+            self.recordLog('time out after set seconds when loading page: ' + url)
+            self.browser.execute_script('window.stop()')
+        try:
+            self.history["index"] = self.browser.execute_script("return history.length")
+        except TimeoutException:
+            self.browser.execute_script('window.stop()')
+            self.history["index"] = self.browser.execute_script("return history.length")
+        self.scrollDown(para)  # 控制屏幕向下滚动
+        if self.containJudge:
+            try:
+                self.bodyText = self.browser.find_element(By.CSS_SELECTOR, "body").text
+                self.Log('URL Page: ' + url)
+                self.recordLog('URL Page: ' + url)
+            except TimeoutException:
+                self.Log('Time out after set seconds when getting body text: ' + url)
+                self.recordLog('Time out after set seconds when getting body text:: ' + url)
+                self.browser.execute_script('window.stop()')
+                time.sleep(1)
+                self.Log("Need to wait 1 second to get body text")
+                # 再执行一遍
+                self.bodyText = self.browser.find_element(By.CSS_SELECTOR, "body").text
+            except Exception as e:
+                self.Log(e)
+                self.recordLog(str(e))
+
+
+    # 键盘输入事件
+    def inputInfo(self, para, loopValue):
+        time.sleep(0.1)  # 输入之前等待0.1秒
+        self.Log("Wait 0.1 second before input")
+        try:
+            textbox = self.browser.find_element(By.XPATH, para["xpath"])
+            #     textbox.send_keys(Keys.CONTROL, 'a')
+            #     textbox.send_keys(Keys.BACKSPACE)
+            self.execute_code(2, para["beforeJS"], para["beforeJSWaitTime"], textbox) # 执行前置JS
+            # Send the HOME key
+            textbox.send_keys(Keys.HOME)
+            # Send the SHIFT + END key combination
+            textbox.send_keys(Keys.SHIFT, Keys.END)
+            # Send the DELETE key
+            textbox.send_keys(Keys.DELETE)
+            value = ""
+            if para["useLoop"]:
+                value = loopValue
+            else:
+                value = para["value"]
+            pattern = r'Field\["([^"]+)"\]' # 将value中的Field[""]替换为outputParameters中的键值
+            try:
+                replaced_text = re.sub(pattern, lambda match: self.outputParameters.get(match.group(1), ''), value)
+                replaced_text = re.sub('<enter>', '', replaced_text, flags=re.IGNORECASE)
+            except:
+                replaced_text = value
+            textbox.send_keys(replaced_text)
+            if value.lower().find("<enter>") >= 0:
+                textbox.send_keys(Keys.ENTER)
+            self.execute_code(2, para["afterJS"], para["afterJSWaitTime"], textbox) # 执行后置js
+            # global bodyText  # 每次执行点击,输入元素和打开网页操作后,需要更新bodyText
+            self.bodyText = self.browser.find_element(By.CSS_SELECTOR, "body").text
+        except:
+            print("Cannot find input box element:" +
+                para["xpath"] + ", please try to set the wait time before executing this operation")
+            print("找不到输入框元素:" + para["xpath"] + ",请尝试在执行此操作前设置等待时间")
+            self.recordLog("Cannot find input box element:" +
+                    para["xpath"] + "Please try to set the wait time before executing this operation")
+
+
+    # 点击元素事件
+    def clickElement(self, para, loopElement=None, clickPath="", index=0):
+        time.sleep(0.1)  # 点击之前等待0.1秒
+        self.Log("Wait 0.1 second before clicking element")
+        if para["useLoop"]:  # 使用循环的情况下,传入的clickPath就是实际的xpath
+            path = clickPath
+        else:
+            path = para["xpath"]  # 不然使用元素定义的xpath
+        try:
+            maxWaitTime = int(para["maxWaitTime"])
+        except:
+            maxWaitTime = 10
+        self.browser.set_page_load_timeout(maxWaitTime)  # 加载页面最大超时时间
+        self.browser.set_script_timeout(maxWaitTime)
+        # 点击前对该元素执行一段JavaScript代码
+        try:
+            element = self.browser.find_element(By.XPATH, path)
+            if para["beforeJS"] != "":
+                self.execute_code(2, para["beforeJS"], para["beforeJSWaitTime"], element)
+        except:
+            print("Cannot find element:" +
+                path + ", please try to set the wait time before executing this operation")
+            print("找不到要点击的元素:" + path + ",请尝试在执行此操作前设置等待时间")
+            self.recordLog("Cannot find element:" +
+                    path + ", please try to set the wait time before executing this operation")
+        tempHandleNum = len(self.browser.window_handles)  # 记录之前的窗口位置
+        try:
+            click_way = int(para["clickWay"])
+        except:
+            click_way = 0
+        try:
+            if click_way == 0: # 用selenium的点击方法
+                actions = ActionChains(self.browser)  # 实例化一个action对象
+                actions.click(element).perform()
+            elif click_way == 1: # 用js的点击方法
+                script = 'var result = document.evaluate(`' + path + \
+                    '`, document, null, XPathResult.ANY_TYPE, null);for(let i=0;i<arguments[0];i++){result.iterateNext();} result.iterateNext().click();'
+                self.browser.execute_script(script, str(index))  # 用js的点击方法
+        except TimeoutException:
+            self.Log('time out after set seconds when loading clicked page')
+            self.recordLog('time out after set seconds when loading clicked page')
+            self.browser.execute_script('window.stop()')
+        except Exception as e:
+            self.Log(e)
+            self.recordLog(str(e))
+        # 点击前对该元素执行一段JavaScript代码
+        try:
+            if para["afterJS"] != "":
+                element = self.browser.find_element(By.XPATH, path)
+                self.execute_code(2, para["afterJS"], para["afterJSWaitTime"], element)
+        except:
+            print("Cannot find element:" + path)
+            self.recordLog("Cannot find element:" +
+                    path + ", please try to set the wait time before executing this operation")
+            print("找不到要点击的元素:" + path + ",请尝试在执行此操作前设置等待时间")
+        waitTime = float(para["wait"]) + 0.01  # 点击之后等待
+        try:
+            waitType = int(para["waitType"])
+        except:
+            waitType = 0
+        if waitType == 0:  # 固定等待时间
+            time.sleep(waitTime)
+        elif waitType == 1:  # 随机等待时间
+            time.sleep(random.uniform(waitTime * 0.5, waitTime * 1.5))
+        if tempHandleNum != len(self.browser.window_handles):  # 如果有新标签页的行为发生
+            self.browser.switch_to.window(self.browser.window_handles[-1])  # 跳转到新的标签页
+            self.history["handle"] = self.browser.current_window_handle
+            try:
+                self.history["index"] = self.browser.execute_script("return history.length")
+            except TimeoutException:
+                self.browser.execute_script('window.stop()')
+                self.history["index"] = self.browser.execute_script("return history.length")
+        else:
+            try:
+                self.history["index"] = self.browser.execute_script("return history.length")
+            except TimeoutException:
+                self.browser.execute_script('window.stop()')
+                self.history["index"] = self.browser.execute_script("return history.length")
+                # 如果打开了新窗口,切换到新窗口
+        self.scrollDown(para)  # 根据参数配置向下滚动
+        if self.containJudge:  # 有判断语句才执行以下操作
+            # global bodyText  # 每次执行点击,输入元素和打开网页操作后,需要更新bodyText
+            try:
+                self.bodyText = self.browser.find_element(By.CSS_SELECTOR, "body").text
+            except TimeoutException:
+                self.Log('time out after 10 seconds when getting body text')
+                self.recordLog('time out after 10 seconds when getting body text')
+                self.browser.execute_script('window.stop()')
+                time.sleep(1)
+                self.Log("wait one second after get body text")
+                # 再执行一遍
+                self.bodyText = self.browser.find_element(By.CSS_SELECTOR, "body").text
+                # rt.end()
+            except Exception as e:
+                self.Log(e)
+                self.recordLog(str(e))
+        # rt.end()
+
+    def get_content(self, p, element):
+        content = ""
+        if p["contentType"] == 0:
+            # 先处理特殊节点类型
+            if p["nodeType"] == 2:
+                if element.get_attribute("href") != None:
+                    content = element.get_attribute("href")
+                else:
+                    content = ""
+            elif p["nodeType"] == 3:
+                if element.get_attribute("value") != None:
+                    content = element.get_attribute("value")
+                else:
+                    content = ""
+            elif p["nodeType"] == 4:  # 图片
+                if element.get_attribute("src") != None:
+                    content = element.get_attribute("src")
+                else:
+                    content = ""
+                try:
+                    downloadPic = p["downloadPic"]
+                except:
+                    downloadPic = 0
+                if downloadPic == 1:
+                    download_image(content, "Data/" + self.saveName + "/")
+            else: # 普通节点
+                content = element.text
+        elif p["contentType"] == 1:  # 只采集当期元素下的文本,不包括子元素
+            command = 'var arr = [];\
+            var content = arguments[0];\
+            for(var i = 0, len = content.childNodes.length; i < len; i++) {\
+                if(content.childNodes[i].nodeType === 3){  \
+                    arr.push(content.childNodes[i].nodeValue);\
+                }\
+            }\
+            var str = arr.join(" "); \
+            return str;'
+            content = self.browser.execute_script(command, element).replace(
+                "\n", "").replace("\\s+", " ")
+        elif p["contentType"] == 2:
+            content = element.get_attribute('innerHTML')
+        elif p["contentType"] == 3:
+            content = element.get_attribute('outerHTML')
+        elif p["contentType"] == 4:
+            # 获取元素的背景图片地址
+            bg_url = element.value_of_css_property('background-image')
+            # 清除背景图片地址中的多余字符
+            bg_url = bg_url.replace('url("', '').replace('")', '')
+            content = bg_url
+        elif p["contentType"] == 5:
+            content = self.browser.current_url
+        elif p["contentType"] == 6:
+            content = self.browser.title
+        elif p["contentType"] == 7:
+            # 获取整个网页的高度和宽度
+            height = self.browser.execute_script("return document.body.scrollHeight");
+            width = self.browser.execute_script("return document.body.scrollWidth");
+            # 调整浏览器窗口的大小
+            self.browser.set_window_size(width, height)
+            element.screenshot("Data/" + self.saveName + "/"+ str(time.time()) + ".png")
+        elif p["contentType"] == 8:
+            try:
+                screenshot = element.screenshot_as_png
+                screenshot_stream = io.BytesIO(screenshot)
+                # 使用Pillow库打开截图,并转换为灰度图像
+                image = Image.open(screenshot_stream).convert('L')
+                # 使用Tesseract OCR引擎识别图像中的文本
+                text = pytesseract.image_to_string(image,  lang='chi_sim+eng')
+                content = text
+            except Exception as e:
+                content = "OCR Error"
+                print("To use OCR, You need to install Tesseract-OCR and add it to the environment variable PATH (need to restart EasySpider after you put in PATH): https://tesseract-ocr.github.io/tessdoc/Installation.html")
+                if sys.platform == "win32":
+                    print("要使用OCR识别功能,你需要安装Tesseract-OCR并将其添加到环境变量PATH中(添加后需重启EasySpider):https://blog.csdn.net/u010454030/article/details/80515501\nhttps://www.bilibili.com/video/BV1xz4y1b72D/")
+                elif sys.platform == "darwin":
+                    print(e)
+                    print("注意以上错误,要使用OCR识别功能,你需要安装Tesseract-OCR并将其添加到环境变量PATH中(添加后需重启EasySpider):https://zhuanlan.zhihu.com/p/146044810")
+                elif sys.platform == "linux":
+                    print(e)
+                    print("注意以上错误,要使用OCR识别功能,你需要安装Tesseract-OCR并将其添加到环境变量PATH中(添加后需重启EasySpider):https://zhuanlan.zhihu.com/p/420259031")
+                else:
+                    print(e)
+                    print("注意以上错误,要使用OCR识别功能,你需要安装Tesseract-OCR并将其添加到环境变量PATH中(添加后需重启EasySpider):https://blog.csdn.net/u010454030/article/details/80515501\nhttps://www.bilibili.com/video/BV1xz4y1b72D/")
+        elif p["contentType"] == 9:
+            content = self.execute_code(2, p["JS"], p["JSWaitTime"], element)
+        elif p["contentType"] == 10: # 下拉框选中的值
+            try:
+                select_element = Select(element)
+                content = select_element.first_selected_option.get_attribute("value")
+            except:
+                content = ""
+        elif p["contentType"] == 11: # 下拉框选中的文本
+            try:
+                select_element = Select(element)
+                content = select_element.first_selected_option.text
+            except:
+                content = ""
+        return content
+
+
+    # 提取数据事件
+    def getData(self, para, loopElement, isInLoop=True, parentPath="", index=0):
+        pageHTML = etree.HTML(self.browser.page_source)
+        loopElementOuterHTML = loopElement.get_attribute('outerHTML')
+        loopElementHTML = etree.HTML(loopElementOuterHTML)
+        for p in para["paras"]:
+            if p["optimizable"]:
+                try:
+                    p["relativeXPath"] = p["relativeXPath"].lower()
+                    if p["nodeType"] == 2:
+                        xpath = p["relativeXPath"] + "/@href"
+                    elif p["contentType"] == 1:
+                        xpath = p["relativeXPath"] + "/text()"
+                    elif p["contentType"] == 0:
+                        xpath = p["relativeXPath"] + "//text()"
+                    if p["relative"]:
+                        # if p["relativeXPath"] == "":
+                        #     content = [loopElementHTML]
+                        # else:
+                        if p["relativeXPath"].find("//") >= 0:  # 如果字串里有//即子孙查找,则不动语句
+                            full_path = "(" + parentPath + \
+                                xpath + ")" + \
+                                "[" + str(index + 1) + "]"
+                            content = pageHTML.xpath(full_path)
+                        else:
+                            content = loopElementHTML.xpath("/html/body/" + loopElementHTML[0][0].tag + xpath)
+                    else:
+                        if xpath.find("/html/body") < 0:
+                            xpath = "/html/body" + xpath
+                        content = pageHTML.xpath(xpath)
+                    if len(content) > 0:
+                        # html = etree.tostring(content[0], encoding='utf-8').decode('utf-8')
+                        # 拼接所有文本内容并去掉两边的空白
+                        content = ' '.join(result.strip() for result in content if result.strip())
+                    else:
+                        content = p["default"]
+                        try:
+                            if not self.dataNotFoundKeys[p["name"]]:
+                                print('Element %s not found with parameter name %s when extracting data, use default, this error will only show once' % (p["relativeXPath"], p["name"]))
+                                print("提取数据操作时,字段名 %s 对应XPath %s 未找到,使用默认值,本字段将不再重复报错" % (p["name"], p["relativeXPath"]))
+                                self.dataNotFoundKeys[p["name"]] = True
+                                self.recordLog('Element %s not found, use default' % p["relativeXPath"])
+                        except:
+                            pass
+                except Exception as e:
+                    print(e)
+                self.outputParameters[p["name"]] = content
+
+        # 对于不能优化的操作,使用selenium执行
+        for p in para["paras"]:
+            if not p["optimizable"]:
+                content = ""
+                if not (p["contentType"] == 5 or p["contentType"] == 6):  # 如果不是页面标题或URL,去找元素
+                    try:
+                        p["relativeXPath"] = p["relativeXPath"].lower()
+                        if p["relative"]:  # 是否相对xpath
+                            if p["relativeXPath"] == "":  # 相对xpath有时候就是元素本身,不需要二次查找
+                                element = loopElement
+                            else:
+                                if p["relativeXPath"].find("//") >= 0:  # 如果字串里有//即子孙查找,则不动语句
+                                    full_path = "(" + parentPath + \
+                                        p["relativeXPath"] + ")" + \
+                                        "[" + str(index + 1) + "]"
+                                    element = self.browser.find_element(By.XPATH, full_path)
+                                else:
+                                    element = loopElement.find_element(By.XPATH,
+                                                                    p["relativeXPath"][1:])
+                        else:
+                            element = self.browser.find_element(By.XPATH, p["relativeXPath"])
+                    except (NoSuchElementException, InvalidSelectorException, StaleElementReferenceException):  # 找不到元素的时候,使用默认值
+                        # print(p)
+                        try:
+                            content = p["default"]
+                        except Exception as e:
+                            content = ""
+                        self.outputParameters[p["name"]] = content
+                        try:
+                            if not self.dataNotFoundKeys[p["name"]]:
+                                print('Element %s not found with parameter name %s when extracting data, use default, this error will only show once' % (p["relativeXPath"], p["name"]))
+                                print("提取数据操作时,字段名 %s 对应XPath %s 未找到,使用默认值,本字段将不再重复报错" % (p["name"], p["relativeXPath"]))
+                                self.dataNotFoundKeys[p["name"]] = True
+                                self.recordLog('Element %s not found, use default' % p["relativeXPath"])
+                        except:
+                            pass
+                        continue
+                    except TimeoutException:  # 超时的时候设置超时值
+                        self.Log('time out after set seconds when getting data')
+                        self.recordLog('time out after set seconds when getting data')
+                        self.browser.execute_script('window.stop()')
+                        if p["relative"]:  # 是否相对xpath
+                            if p["relativeXPath"] == "":  # 相对xpath有时候就是元素本身,不需要二次查找
+                                element = loopElement
+                            else:
+                                element = loopElement.find_element(By.XPATH,
+                                                                p["relativeXPath"][1:])
+                        else:
+                            element = self.browser.find_element(By.XPATH, p["relativeXPath"])
+                        # rt.end()
+                else:
+                    element = self.browser.find_element(By.XPATH, "//body")
+                try:
+                    self.execute_code(2, p["beforeJS"], p["beforeJSWaitTime"], element) # 执行前置js
+                    content = self.get_content(p, element)
+                except StaleElementReferenceException:  # 发生找不到元素的异常后,等待几秒重新查找
+                    self.recordLog('StaleElementReferenceException: '+p["relativeXPath"])
+                    time.sleep(3)
+                    try:
+                        if p["relative"]:  # 是否相对xpath
+                            if p["relativeXPath"] == "":  # 相对xpath有时候就是元素本身,不需要二次查找
+                                element = loopElement
+                                self.recordLog('StaleElementReferenceException: loopElement')
+                            else:
+                                element = loopElement.find_element(By.XPATH,
+                                                                p["relativeXPath"][1:])
+                                self.recordLog(
+                                    'StaleElementReferenceException: loopElement+relativeXPath')
+                        else:
+                            element = self.browser.find_element(
+                                By.XPATH, p["relativeXPath"])
+                            self.recordLog('StaleElementReferenceException: relativeXPath')
+                        content = self.get_content(p, element)
+                    except StaleElementReferenceException:
+                        self.recordLog('StaleElementReferenceException: '+p["relativeXPath"])
+                        continue  # 再出现类似问题直接跳过
+                self.outputParameters[p["name"]] = content
+                self.execute_code(2, p["afterJS"], p["afterJSWaitTime"], element) # 执行后置JS
+        line = []
+        for value in self.outputParameters.values():
+            line.append(value)
+            print(value[:15], " ", end="")
+        print("")
+        self.OUTPUT.append(line)
+        # rt.end()
+
+
+if __name__ == '__main__':
+    config = {
+        "id": [0],
+        "saved_file_name": "",
+        "user_data": False,
+        "config_folder": "",
+        "config_file_name": "config.json",
+        "read_type": "remote",
+        "headless": False,
+        "server_address": "http://localhost:8074",
+        "version": "0.3.3",
+    }
+    c = Config(config)
+    print(c)
+    options = Options()
+    driver_path = "chromedriver.exe"
+    import platform
+    print(sys.platform, platform.architecture())
+    option = webdriver.ChromeOptions()
+    if not os.path.exists(os.getcwd()+"/Data"):
+        os.mkdir(os.getcwd()+"/Data")
+    if sys.platform == "darwin" and platform.architecture()[0] == "64bit":
+            options.binary_location = "EasySpider.app/Contents/Resources/app/chrome_mac64.app/Contents/MacOS/Google Chrome"
+            # MacOS需要用option而不是options!
+            option.binary_location = "EasySpider.app/Contents/Resources/app/chrome_mac64.app/Contents/MacOS/Google Chrome"
+            driver_path = "EasySpider.app/Contents/Resources/app/chromedriver_mac64"
+            # options.binary_location = "chrome_mac64.app/Contents/MacOS/Google Chrome"
+            # # MacOS需要用option而不是options!
+            # option.binary_location = "chrome_mac64.app/Contents/MacOS/Google Chrome"
+            # driver_path = os.getcwd()+ "/chromedriver_mac64"
+            print(driver_path)
+    elif os.path.exists(os.getcwd()+"/EasySpider/resources"): # 打包后的路径
+        print("Finding chromedriver in EasySpider",
+              os.getcwd()+"/EasySpider")
+        if sys.platform == "win32" and platform.architecture()[0] == "32bit":
+            options.binary_location = os.path.join(
+                os.getcwd(), "EasySpider/resources/app/chrome_win32/chrome.exe")  # 指定chrome位置
+            driver_path = os.path.join(
+                os.getcwd(), "EasySpider/resources/app/chrome_win32/chromedriver_win32.exe")
+        elif sys.platform == "win32" and platform.architecture()[0] == "64bit":
+            options.binary_location = os.path.join(
+                os.getcwd(), "EasySpider/resources/app/chrome_win64/chrome.exe")
+            driver_path = os.path.join(
+                os.getcwd(), "EasySpider/resources/app/chrome_win64/chromedriver_win64.exe")
+        elif sys.platform == "linux" and platform.architecture()[0] == "64bit":
+            options.binary_location = "EasySpider/resources/app/chrome_linux64/chrome"
+            driver_path = "EasySpider/resources/app/chrome_linux64/chromedriver_linux64"
+        else:
+            print("Unsupported platform")
+            sys.exit()
+        print("Chrome location:", options.binary_location)
+        print("Chromedriver location:", driver_path)
+    # elif os.getcwd().find("ExecuteStage") >= 0:  # 如果直接执行
+    #     print("Finding chromedriver in ./Chrome",
+    #           os.getcwd()+"/Chrome")
+    #     options.binary_location = "./Chrome/chrome.exe"  # 指定chrome位置
+    #     # option.binary_location = "C:\\Users\\q9823\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"
+    #     driver_path = "./Chrome/chromedriver.exe"
+    elif os.path.exists(os.getcwd()+"/../ElectronJS"): 
+        if os.getcwd().find("ElectronJS") >= 0:  # 软件dev用
+            print("Finding chromedriver in EasySpider",
+                os.getcwd())
+            option.binary_location = "chrome_win64/chrome.exe"
+            driver_path = "chrome_win64/chromedriver_win64.exe"
+        else: # 直接在executeStage文件夹内使用python easyspider_executestage.py时的路径
+            print("Finding chromedriver in EasySpider",
+                os.getcwd()+"/ElectronJS")
+            option.binary_location = "../ElectronJS/chrome_win64/chrome.exe"  # 指定chrome位置
+            driver_path = "../ElectronJS/chrome_win64/chromedriver_win64.exe"
+    else:
+        options.binary_location = "./chrome.exe"  # 指定chrome位置
+        driver_path = "./chromedriver.exe"
+
+    option.add_experimental_option(
+        'excludeSwitches', ['enable-automation'])  # 以开发者模式
+    options.add_argument('-ignore-certificate-errors')
+    options.add_argument('-ignore -ssl-errors')
+    option.add_argument('-ignore-certificate-errors')
+    option.add_argument('-ignore -ssl-errors')
+    # user_data_dir = r''  # 注意没有Default!
+
+    # options.add_argument('--user-data-dir='+p)
+
+    # 总结:
+    # 0. 带Cookie需要用userdatadir
+    # 1. chrome_options才是配置用户文件和chrome文件地址的正确选项
+    # 2. User Profile文件夹的路径是:C:\Users\用户名\AppData\Local\Google\Chrome\User Data不要加Default
+    # 3. 就算User Profile相同,chrome版本不同所存储的cookie信息也不同,也不能爬
+    # 4. TMALL如果一直弹出验证码,而且无法通过验证,那么需要在其他浏览器上用
+    if c.user_data:
+        with open(c.config_folder + c.config_file_name,"r", encoding='utf-8') as f:
+            config = json.load(f)
+            absolute_user_data_folder = config["absolute_user_data_folder"]
+            print("\nAbsolute_user_data_folder:",absolute_user_data_folder,"\n")
+        option.add_argument(f'--user-data-dir={absolute_user_data_folder}')  # TMALL 反扒
+        option.add_argument("--profile-directory=Default")
+
+    if c.headless:
+        print("Headless mode")
+        print("无头模式1")
+        option.add_argument("--headless")
+        options.add_argument("--headless")
+
+    # options.add_argument(
+    #     '--user-data-dir=C:\\Users\\q9823\\AppData\\Local\\Google\\Chrome\\User Data')  # TMALL 反扒
+    option.add_argument(
+        "--disable-blink-features=AutomationControlled")  # TMALL 反扒
+    options.add_argument("--disable-blink-features=AutomationControlled")  # TMALL 反扒
+    
+    threads = []
+    for i in c.id:
+        print(options)
+        print("id: ", i)
+        if c.saved_file_name != "":
+            saveName = "task_" + str(i) + "_" + c.saved_file_name  # 保存文件的名字
+        else:
+            saveName = "task_" + str(i) + "_" + \
+                str(random.randint(0, 999999999))  # 保存文件的名字
+        print("Save Name for task ID", i, "is:", saveName)
+        print("任务ID", i, "的保存文件名为:", saveName)
+        os.mkdir("Data/" + saveName)  # 创建保存文件夹用来保存截图
+        # with open("Data/" + saveName + "_control.txt", "w", encoding='utf-8') as f:
+        #     f.write("1")
+        #     f.close()
+        if c.read_type == "remote":
+            print("remote")
+            content = requests.get(c.server_address + "/queryExecutionInstance?id=" + str(i))
+            service = json.loads(content.text)  # 加载服务信息
+        else:
+            print("local")
+            with open("execution_instances/" + str(i) + ".json", 'r', encoding='utf-8') as f:
+                content = f.read()
+                service = json.loads(content)  # 加载服务信息
+        print("Task Name:", service["name"])
+        print("任务名称:", service["name"])
+        try:
+            cloudflare = service["cloudflare"]
+        except:
+            cloudflare = 0
+        if cloudflare == 0:
+            options.add_experimental_option("prefs", {
+                "download.default_directory": "Data/",  # 设置文件下载路径
+                "download.prompt_for_download": False,  # 禁止下载提示框
+                "plugins.plugins_list": [{"enabled": False, "name": "Chrome PDF Viewer"}],
+                "download.directory_upgrade": True,
+                "download.extensions_to_open": "applications/pdf",
+                "plugins.always_open_pdf_externally": True  # 总是在外部程序中打开PDF
+            })
+            option.add_experimental_option("prefs", {
+                "download.default_directory": "Data/",  # 设置文件下载路径
+                "download.prompt_for_download": False,  # 禁止下载提示框
+                "plugins.plugins_list": [{"enabled": False, "name": "Chrome PDF Viewer"}],
+                "download.directory_upgrade": True,
+                "download.extensions_to_open": "applications/pdf",
+                "plugins.always_open_pdf_externally": True  # 总是在外部程序中打开PDF
+            })
+            try:
+                if service["environment"] == 1:
+                    option.add_experimental_option('mobileEmulation', {'deviceName': 'iPhone X'})  # 模拟iPhone X浏览
+                    options.add_experimental_option('mobileEmulation', {'deviceName': 'iPhone X'})  # 模拟iPhone X浏览
+            except:
+                pass
+            browser_t = webdriver.Chrome(
+            options=options, chrome_options=option, executable_path=driver_path)
+        elif cloudflare == 1:
+            browser_t = uc.Chrome(
+            options=options, chrome_options=option, executable_path=driver_path)
+            print("Pass Cloudflare Mode")
+            print("过Cloudflare验证模式")
+        event = Event()
+        event.set()
+        thread = BrowserThread(browser_t, i, service, c.version, event)
+        print("Thread with task id: ", i, " is created")
+        threads.append(thread)
+        thread.start()
+        Thread(target=check_file, args=("Data/" + saveName + "_control.txt", event)).start()
+        time.sleep(5)
+        print("\n\n----------------------------------")
+        print("正在运行任务,长按键盘p键可暂停任务的执行以便手工操作浏览器如输入验证码;如果想恢复任务的执行,请再次长按p键。")
+        print("Running task, long press 'p' to pause the task for manual operation of the browser such as entering the verification code; If you want to resume the execution of the task, please long press 'p' again.")
+        print("----------------------------------\n\n")
+
+    for thread in threads:
+        thread.join()
+    
+    for thread in threads:
+        thread.browser.quit()
+        print("Thread with task id: ", thread.id, " is closed")

File diff suppressed because it is too large
+ 0 - 0
.temp_to_pub/EasySpider_windows_x64/execution_instances/10.json


File diff suppressed because it is too large
+ 0 - 0
.temp_to_pub/EasySpider_windows_x64/execution_instances/11.json


File diff suppressed because it is too large
+ 0 - 0
.temp_to_pub/EasySpider_windows_x64/execution_instances/12.json


+ 6928 - 0
.temp_to_pub/EasySpider_windows_x64/tasks/106.json

@@ -0,0 +1,6928 @@
+{
+    "id": 106,
+    "name": "京东全球版-专业的综合网上购物商城",
+    "url": "https://www.jd.com",
+    "links": "https://www.jd.com",
+    "create_time": "7/1/2023, 11:34:47 PM",
+    "version": "0.3.3",
+    "containJudge": false,
+    "desc": "https://www.jd.com",
+    "inputParameters": [
+        {
+            "id": 0,
+            "name": "urlList_0",
+            "nodeId": 1,
+            "nodeName": "打开网页",
+            "value": "https://www.jd.com",
+            "desc": "要采集的网址列表,多行以\\n分开",
+            "type": "string",
+            "exampleValue": "https://www.jd.com"
+        },
+        {
+            "id": 1,
+            "name": "inputText_1",
+            "nodeName": "输入文字",
+            "nodeId": 2,
+            "desc": "要输入的文本,如京东搜索框输入:电脑",
+            "type": "string",
+            "exampleValue": "123",
+            "value": "123"
+        }
+    ],
+    "outputParameters": [
+        {
+            "id": 0,
+            "name": "参数1_链接文本",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+        },
+        {
+            "id": 1,
+            "name": "参数2_链接地址",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "//item.jd.com/66144896261.html"
+        },
+        {
+            "id": 2,
+            "name": "参数3_图片地址",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "//img11.360buyimg.com/n7/jfs/t1/127924/20/28199/91846/63e5a0f3F37af0f1c/60f164f273a7f2c3.jpg"
+        },
+        {
+            "id": 3,
+            "name": "参数4_文本",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "¥"
+        },
+        {
+            "id": 4,
+            "name": "参数5_文本",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "339.00"
+        },
+        {
+            "id": 5,
+            "name": "参数6_链接文本",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "\n\t\t\t\t\t\t\t\t123婴儿推车高景观轻便可坐可躺折叠避震双向宝宝新生儿童手推车  【豪华版】四轮橡胶卡其色\n\t\t\t\t\t\t\t\t【可坐可躺可双向】买就送凉席蚊帐餐盘脚套等12种赠品(升级版+豪华版可享),超值超划算!\n\t\t\t\t\t\t\t"
+        },
+        {
+            "id": 6,
+            "name": "参数7_链接地址",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "//item.jd.com/66144896261.html"
+        },
+        {
+            "id": 7,
+            "name": "参数8_文本",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "婴儿推车高景观轻便可坐可躺折叠避震双向宝宝新生儿童手推车【豪华版】四轮橡胶卡其色"
+        },
+        {
+            "id": 8,
+            "name": "参数9_文本",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "123"
+        },
+        {
+            "id": 9,
+            "name": "参数10_文本",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "【可坐可躺可双向】买就送凉席蚊帐餐盘脚套等12种赠品(升级版+豪华版可享),超值超划算!"
+        },
+        {
+            "id": 10,
+            "name": "参数11_文本",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "条评价"
+        },
+        {
+            "id": 11,
+            "name": "参数12_链接文本",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "1万+"
+        },
+        {
+            "id": 12,
+            "name": "参数13_链接地址",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "//item.jd.com/66144896261.html#comment"
+        },
+        {
+            "id": 13,
+            "name": "参数14_图片地址",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "//m.360buyimg.com/cc/jfs/t1/197706/29/27826/4384/63314bc6E21b4c3e9/8b4d5fc44efc5b3f.png"
+        },
+        {
+            "id": 14,
+            "name": "参数15_链接文本",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "韵贝母婴专营店"
+        },
+        {
+            "id": 15,
+            "name": "参数16_链接地址",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "//mall.jd.com/index-872357.html?from=pc"
+        },
+        {
+            "id": 16,
+            "name": "参数17_链接文本",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "对比"
+        },
+        {
+            "id": 17,
+            "name": "参数18_链接地址",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "javascript:;"
+        },
+        {
+            "id": 18,
+            "name": "参数19_链接文本",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "关注"
+        },
+        {
+            "id": 19,
+            "name": "参数20_链接地址",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "javascript:;"
+        },
+        {
+            "id": 20,
+            "name": "参数21_链接文本",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "加入购物车"
+        },
+        {
+            "id": 21,
+            "name": "参数22_链接地址",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "//cart.jd.com/gate.action?pid=66144896261&pcount=1&ptype=1"
+        },
+        {
+            "id": 22,
+            "name": "参数23_文本",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "毕业租房季每满200减30"
+        },
+        {
+            "id": 23,
+            "name": "参数24_文本",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "7.1-7.3"
+        },
+        {
+            "id": 24,
+            "name": "参数25_文本",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "放心购"
+        },
+        {
+            "id": 25,
+            "name": "参数26_文本",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "免邮"
+        },
+        {
+            "id": 26,
+            "name": "参数27_文本",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "券300-20"
+        },
+        {
+            "id": 27,
+            "name": "参数28_文本",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "爱心东东"
+        },
+        {
+            "id": 28,
+            "name": "参数29_文本",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "赠"
+        },
+        {
+            "id": 29,
+            "name": "参数30_文本",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "满288-8"
+        },
+        {
+            "id": 30,
+            "name": "参数31_文本",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "赠"
+        },
+        {
+            "id": 31,
+            "name": "参数32_图片地址",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "//m.360buyimg.com/cc/jfs/t1/113659/27/28361/2962/62ecb1f0E6c5fc50c/b914680e87a2c8e9.png"
+        },
+        {
+            "id": 32,
+            "name": "参数33_文本",
+            "desc": "",
+            "type": "string",
+            "exampleValue": "..."
+        }
+    ],
+    "graph": [
+        {
+            "index": 0,
+            "id": 0,
+            "parentId": 0,
+            "type": -1,
+            "option": 0,
+            "title": "root",
+            "sequence": [
+                1,
+                2,
+                3,
+                4
+            ],
+            "parameters": {
+                "history": 1,
+                "tabIndex": 0,
+                "useLoop": false,
+                "xpath": "",
+                "wait": 0
+            },
+            "isInLoop": false
+        },
+        {
+            "id": 1,
+            "index": 1,
+            "parentId": 0,
+            "type": 0,
+            "option": 1,
+            "title": "打开网页",
+            "sequence": [],
+            "isInLoop": false,
+            "position": 0,
+            "parameters": {
+                "useLoop": false,
+                "xpath": "",
+                "wait": 0,
+                "waitType": 0,
+                "beforeJS": "",
+                "beforeJSWaitTime": 0,
+                "afterJS": "",
+                "afterJSWaitTime": 0,
+                "url": "https://www.jd.com",
+                "links": "https://www.jd.com",
+                "maxWaitTime": 10,
+                "scrollType": 0,
+                "scrollCount": 1,
+                "scrollWaitTime": 1
+            }
+        },
+        {
+            "id": 2,
+            "index": 2,
+            "parentId": 0,
+            "type": 0,
+            "option": 4,
+            "title": "输入文字",
+            "sequence": [],
+            "isInLoop": false,
+            "position": 1,
+            "parameters": {
+                "history": 4,
+                "tabIndex": -1,
+                "useLoop": false,
+                "xpath": "//*[@id=\"key\"]",
+                "wait": 0,
+                "waitType": 0,
+                "beforeJS": "",
+                "beforeJSWaitTime": 0,
+                "afterJS": "",
+                "afterJSWaitTime": 0,
+                "value": "123",
+                "allXPaths": [
+                    "/html/body/div[4]/div[1]/div[2]/div[1]/input[1]",
+                    "//input[contains(., '')]",
+                    "id(\"key\")",
+                    "//INPUT[@class='text defcolor']",
+                    "/html/body/div[last()-6]/div/div[last()-2]/div/input"
+                ]
+            }
+        },
+        {
+            "id": 3,
+            "index": 3,
+            "parentId": 0,
+            "type": 0,
+            "option": 2,
+            "title": "点击元素",
+            "sequence": [],
+            "isInLoop": false,
+            "position": 2,
+            "parameters": {
+                "history": 4,
+                "tabIndex": -1,
+                "useLoop": false,
+                "xpath": "//*[@id=\"search-btn\"]/i[1]",
+                "wait": 11,
+                "waitType": 0,
+                "beforeJS": "",
+                "beforeJSWaitTime": 0,
+                "afterJS": "",
+                "afterJSWaitTime": 0,
+                "scrollType": 0,
+                "scrollCount": 1,
+                "scrollWaitTime": 1,
+                "clickWay": 0,
+                "maxWaitTime": 10,
+                "paras": [],
+                "allXPaths": [
+                    "/html/body/div[4]/div[1]/div[2]/div[1]/button[1]/i[1]",
+                    "//i[contains(., '')]",
+                    "/html/body/div[last()-6]/div/div[last()-2]/div/button/i"
+                ]
+            }
+        },
+        {
+            "id": 4,
+            "index": 4,
+            "parentId": 0,
+            "type": 1,
+            "option": 8,
+            "title": "循环",
+            "sequence": [
+                5
+            ],
+            "isInLoop": false,
+            "position": 3,
+            "parameters": {
+                "history": 5,
+                "tabIndex": -1,
+                "useLoop": false,
+                "xpath": "/html/body/div[5]/div[2]/div[2]/div[1]/div[1]/div[2]/ul[1]/li/div[1]",
+                "wait": 0,
+                "waitType": 0,
+                "beforeJS": "",
+                "beforeJSWaitTime": 0,
+                "afterJS": "",
+                "afterJSWaitTime": 0,
+                "scrollType": 0,
+                "scrollCount": 1,
+                "scrollWaitTime": 1,
+                "loopType": 1,
+                "pathList": "",
+                "textList": "",
+                "code": "",
+                "waitTime": 0,
+                "exitCount": 0,
+                "historyWait": 2,
+                "breakMode": 0,
+                "breakCode": "",
+                "breakCodeWaitTime": 0,
+                "allXPaths": [
+                    "/html/body/div[5]/div[2]/div[2]/div[1]/div[1]/div[2]/ul[1]/li[1]/div[1]",
+                    "//div[contains(., '')]",
+                    "//DIV[@class='gl-i-wrap']",
+                    "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-59]/div"
+                ]
+            }
+        },
+        {
+            "id": 5,
+            "index": 5,
+            "parentId": 4,
+            "type": 0,
+            "option": 3,
+            "title": "提取数据",
+            "sequence": [],
+            "isInLoop": true,
+            "position": 0,
+            "parameters": {
+                "history": 5,
+                "tabIndex": -1,
+                "useLoop": false,
+                "xpath": "",
+                "wait": 0,
+                "waitType": 0,
+                "beforeJS": "",
+                "beforeJSWaitTime": 0,
+                "afterJS": "",
+                "afterJSWaitTime": 0,
+                "paras": [
+                    {
+                        "nodeType": 1,
+                        "contentType": 0,
+                        "relative": true,
+                        "name": "参数1_链接文本",
+                        "desc": "",
+                        "relativeXPath": "/div[1]/a[1]",
+                        "allXPaths": [
+                            "/div[1]/a[1]",
+                            "//a[contains(., '')]",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-59]/div/div[last()-7]/a"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 0,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 1,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 2,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 3,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t    \t        \n\t\t\t            \t\t\t毕业租房季每满200减30\n\t\t\t            \t\t\t\t7.1-7.3\n\t\t\t            \t\t\t\n\t\t\t            \t\t\n\t\t\t            \t"
+                            },
+                            {
+                                "num": 4,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t    \t        \n\t\t\t            \t\t\t毕业租房季每满200减30\n\t\t\t            \t\t\t\t7.1-7.3\n\t\t\t            \t\t\t\n\t\t\t            \t\t\n\t\t\t            \t"
+                            },
+                            {
+                                "num": 5,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 6,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t    \t        \n\t\t\t            \t\t\t毕业租房季每满200减30\n\t\t\t            \t\t\t\t7.1-7.3\n\t\t\t            \t\t\t\n\t\t\t            \t\t\n\t\t\t            \t"
+                            },
+                            {
+                                "num": 7,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 8,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 9,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t    \t        \n\t\t\t            \t\t\t毕业租房季每满200减30\n\t\t\t            \t\t\t\t7.1-7.3\n\t\t\t            \t\t\t\n\t\t\t            \t\t\n\t\t\t            \t"
+                            },
+                            {
+                                "num": 10,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 11,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 12,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 13,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 14,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 15,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t    \t        \n\t\t\t            \t\t\t全店 每满199立减30元\n\t\t\t            \t\t\t\t7.1-7.3\n\t\t\t            \t\t\t\n\t\t\t            \t\t\n\t\t\t            \t"
+                            },
+                            {
+                                "num": 16,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 17,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 18,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 19,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 20,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 21,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 22,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 23,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 24,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 25,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 26,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 27,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 28,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 29,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 30,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 31,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 32,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 33,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t    \t        \n\t\t\t            \t\t\t1件9.0折\n\t\t\t            \t\t\t\t7.1-8.1\n\t\t\t            \t\t\t\n\t\t\t            \t\t\n\t\t\t            \t"
+                            },
+                            {
+                                "num": 34,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 35,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 36,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 37,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 38,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 39,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 40,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 41,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 42,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 43,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 44,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 45,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 46,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 47,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 48,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 49,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 50,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t    \t        \n\t\t\t            \t\t\t满10元减1元\n\t\t\t            \t\t\t\t6.26-7.5\n\t\t\t            \t\t\t\n\t\t\t            \t\t\n\t\t\t            \t"
+                            },
+                            {
+                                "num": 51,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 52,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t    \t        \n\t\t\t            \t\t\t3件8.5折\n\t\t\t            \t\t\t\t6.30-7.31\n\t\t\t            \t\t\t\n\t\t\t            \t\t\n\t\t\t            \t"
+                            },
+                            {
+                                "num": 53,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 54,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 55,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 56,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 57,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 58,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t        \t"
+                            },
+                            {
+                                "num": 59,
+                                "value": "\n\t\t\t\t\t\t\t\t\n\t\t\t\t    \t        \n\t\t\t            \t\t\t毕业租房季每满200减30\n\t\t\t            \t\t\t\t7.1-7.3\n\t\t\t            \t\t\t\n\t\t\t            \t\t\n\t\t\t            \t"
+                            }
+                        ],
+                        "unique_index": "/div[1]/a[1]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 2,
+                        "contentType": 0,
+                        "relative": true,
+                        "name": "参数2_链接地址",
+                        "desc": "",
+                        "relativeXPath": "/div[1]/a[1]",
+                        "allXPaths": [
+                            "/div[1]/a[1]",
+                            "//a[contains(., '')]",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-59]/div/div[last()-7]/a"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 0,
+                                "value": "//item.jd.com/66144896261.html"
+                            },
+                            {
+                                "num": 1,
+                                "value": "//item.jd.com/66144896265.html"
+                            },
+                            {
+                                "num": 2,
+                                "value": "//item.jd.com/66144896264.html"
+                            },
+                            {
+                                "num": 3,
+                                "value": "//item.jd.com/10033531851583.html"
+                            },
+                            {
+                                "num": 4,
+                                "value": "//item.jd.com/10033531851582.html"
+                            },
+                            {
+                                "num": 5,
+                                "value": "//item.jd.com/10066088622463.html"
+                            },
+                            {
+                                "num": 6,
+                                "value": "//item.jd.com/10035712182850.html"
+                            },
+                            {
+                                "num": 7,
+                                "value": "//item.jd.com/10071785826677.html"
+                            },
+                            {
+                                "num": 8,
+                                "value": "//item.jd.com/10077849739040.html"
+                            },
+                            {
+                                "num": 9,
+                                "value": "//item.jd.com/10033531851584.html"
+                            },
+                            {
+                                "num": 10,
+                                "value": "//item.jd.com/10040733503774.html"
+                            },
+                            {
+                                "num": 11,
+                                "value": "//item.jd.com/10071785826674.html"
+                            },
+                            {
+                                "num": 12,
+                                "value": "//item.jd.com/10071785826678.html"
+                            },
+                            {
+                                "num": 13,
+                                "value": "//item.jd.com/10071785826682.html"
+                            },
+                            {
+                                "num": 14,
+                                "value": "//item.jd.com/10071785826684.html"
+                            },
+                            {
+                                "num": 15,
+                                "value": "//item.jd.com/10051994751480.html"
+                            },
+                            {
+                                "num": 16,
+                                "value": "//item.jd.com/10071785826675.html"
+                            },
+                            {
+                                "num": 17,
+                                "value": "//item.jd.com/10071785826676.html"
+                            },
+                            {
+                                "num": 18,
+                                "value": "//item.jd.com/10071785826679.html"
+                            },
+                            {
+                                "num": 19,
+                                "value": "//item.jd.com/10071785826680.html"
+                            },
+                            {
+                                "num": 20,
+                                "value": "//item.jd.com/10071785826683.html"
+                            },
+                            {
+                                "num": 21,
+                                "value": "//item.jd.com/10045335421289.html"
+                            },
+                            {
+                                "num": 22,
+                                "value": "//item.jd.com/11773766494.html"
+                            },
+                            {
+                                "num": 23,
+                                "value": "//item.jd.com/10076458552994.html"
+                            },
+                            {
+                                "num": 24,
+                                "value": "//item.jd.com/10074614929614.html"
+                            },
+                            {
+                                "num": 25,
+                                "value": "//item.jd.com/10074614929616.html"
+                            },
+                            {
+                                "num": 26,
+                                "value": "//item.jd.com/10074614929617.html"
+                            },
+                            {
+                                "num": 27,
+                                "value": "//item.jd.com/10075117517846.html"
+                            },
+                            {
+                                "num": 28,
+                                "value": "//item.jd.com/10076750833807.html"
+                            },
+                            {
+                                "num": 29,
+                                "value": "//item.jd.com/10074629310807.html"
+                            },
+                            {
+                                "num": 30,
+                                "value": "//item.jd.com/10074629310808.html"
+                            },
+                            {
+                                "num": 31,
+                                "value": "//item.jd.com/10078155456003.html"
+                            },
+                            {
+                                "num": 32,
+                                "value": "//item.jd.com/10078155456005.html"
+                            },
+                            {
+                                "num": 33,
+                                "value": "//item.jd.com/10077222703036.html"
+                            },
+                            {
+                                "num": 34,
+                                "value": "//item.jd.com/10078407670547.html"
+                            },
+                            {
+                                "num": 35,
+                                "value": "//item.jd.com/10078407670550.html"
+                            },
+                            {
+                                "num": 36,
+                                "value": "//item.jd.com/10077634039065.html"
+                            },
+                            {
+                                "num": 37,
+                                "value": "//item.jd.com/10077634039066.html"
+                            },
+                            {
+                                "num": 38,
+                                "value": "//item.jd.com/10076384967007.html"
+                            },
+                            {
+                                "num": 39,
+                                "value": "//item.jd.com/10077727026633.html"
+                            },
+                            {
+                                "num": 40,
+                                "value": "//item.jd.com/10077045237658.html"
+                            },
+                            {
+                                "num": 41,
+                                "value": "//item.jd.com/10074028982993.html"
+                            },
+                            {
+                                "num": 42,
+                                "value": "//item.jd.com/10074028982998.html"
+                            },
+                            {
+                                "num": 43,
+                                "value": "//item.jd.com/10074028982999.html"
+                            },
+                            {
+                                "num": 44,
+                                "value": "//item.jd.com/10074028983001.html"
+                            },
+                            {
+                                "num": 45,
+                                "value": "//item.jd.com/10074028983003.html"
+                            },
+                            {
+                                "num": 46,
+                                "value": "//item.jd.com/10074028983005.html"
+                            },
+                            {
+                                "num": 47,
+                                "value": "//item.jd.com/10074028983006.html"
+                            },
+                            {
+                                "num": 48,
+                                "value": "//item.jd.com/13256317.html"
+                            },
+                            {
+                                "num": 49,
+                                "value": "//item.jd.com/12830944.html"
+                            },
+                            {
+                                "num": 50,
+                                "value": "//item.jd.com/10069471945735.html"
+                            },
+                            {
+                                "num": 51,
+                                "value": "//item.jd.com/10065743084711.html"
+                            },
+                            {
+                                "num": 52,
+                                "value": "//item.jd.com/10057275997475.html"
+                            },
+                            {
+                                "num": 53,
+                                "value": "//item.jd.com/100040241781.html"
+                            },
+                            {
+                                "num": 54,
+                                "value": "//item.jd.com/11793245.html"
+                            },
+                            {
+                                "num": 55,
+                                "value": "//item.jd.com/10043774573916.html"
+                            },
+                            {
+                                "num": 56,
+                                "value": "//item.jd.com/57633600735.html"
+                            },
+                            {
+                                "num": 57,
+                                "value": "//item.jd.com/100049147902.html"
+                            },
+                            {
+                                "num": 58,
+                                "value": "//item.jd.com/12682998.html"
+                            },
+                            {
+                                "num": 59,
+                                "value": "//item.jd.com/100046068385.html"
+                            }
+                        ],
+                        "unique_index": "/div[1]/a[1]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 4,
+                        "contentType": 1,
+                        "relative": true,
+                        "name": "参数3_图片地址",
+                        "desc": "",
+                        "relativeXPath": "/div[1]/a[1]/img[1]",
+                        "allXPaths": [
+                            "/div[1]/a[1]/img[1]",
+                            "//img[contains(., '')]",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-59]/div/div[last()-7]/a/img"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 0,
+                                "value": "//img11.360buyimg.com/n7/jfs/t1/127924/20/28199/91846/63e5a0f3F37af0f1c/60f164f273a7f2c3.jpg"
+                            },
+                            {
+                                "num": 1,
+                                "value": "//img10.360buyimg.com/n7/jfs/t1/158541/30/34432/95709/63e5a431Fbc624086/663837dffb8cd4a4.jpg"
+                            },
+                            {
+                                "num": 2,
+                                "value": "//img14.360buyimg.com/n7/jfs/t1/146239/32/33664/107095/63e5a3d7Ffe8b57ea/12c5a3fcc9fe9bfa.jpg"
+                            },
+                            {
+                                "num": 3,
+                                "value": "//img13.360buyimg.com/n7/jfs/t1/105187/4/25308/58234/64423a86F8a0df3ec/2b8b1f2717dc6b8d.jpg"
+                            },
+                            {
+                                "num": 4,
+                                "value": "//img12.360buyimg.com/n7/jfs/t1/220723/25/28321/52521/64423a67F365b3a03/2e70ad303ed5f5d3.jpg"
+                            },
+                            {
+                                "num": 5,
+                                "value": "//img13.360buyimg.com/n7/jfs/t1/75141/19/22709/42322/6379f4c6E139338dc/1ece7ffcbf08655b.jpg"
+                            },
+                            {
+                                "num": 6,
+                                "value": "//img10.360buyimg.com/n7/jfs/t1/166818/38/36276/60378/64423aa7F87a9093c/66cf5b230e71776e.jpg"
+                            },
+                            {
+                                "num": 7,
+                                "value": "//img12.360buyimg.com/n7/jfs/t1/11731/33/20404/61621/6381de86E686a0634/2d15b07438fcfb28.jpg"
+                            },
+                            {
+                                "num": 8,
+                                "value": "//img10.360buyimg.com/n7/jfs/t1/74538/20/25914/132616/641e0394Ff39288a8/068c6fe71f077a3f.jpg"
+                            },
+                            {
+                                "num": 9,
+                                "value": "//img14.360buyimg.com/n7/jfs/t1/74533/16/25951/58348/64423a90Fa3f15cc4/aa01e36d5d750462.jpg"
+                            },
+                            {
+                                "num": 10,
+                                "value": "//img14.360buyimg.com/n7/jfs/t1/218410/1/4935/104585/6196006bEc7aea11f/701b20fb2bbe759f.jpg"
+                            },
+                            {
+                                "num": 11,
+                                "value": "//img14.360buyimg.com/n7/jfs/t1/214260/4/23739/96671/6381de84Ea7a2a7e4/22ae895d963fe711.jpg"
+                            },
+                            {
+                                "num": 12,
+                                "value": "//img13.360buyimg.com/n7/jfs/t1/167845/35/32863/62713/6381de85Ebd30a372/d26a829c09f5dc36.jpg"
+                            },
+                            {
+                                "num": 13,
+                                "value": "//img12.360buyimg.com/n7/jfs/t1/214260/4/23739/96671/6381de84Ea7a2a7e4/22ae895d963fe711.jpg"
+                            },
+                            {
+                                "num": 14,
+                                "value": "//img14.360buyimg.com/n7/jfs/t1/214260/4/23739/96671/6381de84Ea7a2a7e4/22ae895d963fe711.jpg"
+                            },
+                            {
+                                "num": 15,
+                                "value": "//img10.360buyimg.com/n7/jfs/t1/83169/15/17724/136993/627cac70Eda13f6e9/5b5e06f10974a3c6.jpg"
+                            },
+                            {
+                                "num": 16,
+                                "value": "//img10.360buyimg.com/n7/jfs/t1/191017/37/30757/104462/6381de87E93c3da4a/e69c322bfe53a952.jpg"
+                            },
+                            {
+                                "num": 17,
+                                "value": "//img11.360buyimg.com/n7/jfs/t1/174811/29/32055/105946/6381de88E923f0618/35b8f41a518e5436.jpg"
+                            },
+                            {
+                                "num": 18,
+                                "value": "//img14.360buyimg.com/n7/jfs/t1/94717/37/25765/70939/6381de8bE1b405602/9a98708f88ddb5ce.jpg"
+                            },
+                            {
+                                "num": 19,
+                                "value": "//img10.360buyimg.com/n7/jfs/t1/127426/19/28688/96694/6381de89Ed938579f/e31f20fd16d88f4a.jpg"
+                            },
+                            {
+                                "num": 20,
+                                "value": "//img13.360buyimg.com/n7/jfs/t1/214260/4/23739/96671/6381de84Ea7a2a7e4/22ae895d963fe711.jpg"
+                            },
+                            {
+                                "num": 21,
+                                "value": "//img14.360buyimg.com/n7/jfs/t1/121096/37/30694/102900/63dcd319Fe04b45a0/cdca6d8aea8b0d14.jpg"
+                            },
+                            {
+                                "num": 22,
+                                "value": "//img14.360buyimg.com/n7/jfs/t3085/57/9703018073/428836/6d9d4597/58d79bc7N174c01bd.jpg"
+                            },
+                            {
+                                "num": 23,
+                                "value": "//img14.360buyimg.com/n7/jfs/t1/122510/37/35221/172293/646f3974Fec11e347/f729d7b883259089.jpg"
+                            },
+                            {
+                                "num": 24,
+                                "value": "//img14.360buyimg.com/n7/jfs/t1/206817/19/32799/67076/6452574eF85da37f3/3a3f28ba1c72afe8.jpg"
+                            },
+                            {
+                                "num": 25,
+                                "value": "//img11.360buyimg.com/n7/jfs/t1/1627/22/22365/65427/64525759F3c940306/927b8d4529fa45c5.jpg"
+                            },
+                            {
+                                "num": 26,
+                                "value": "//img12.360buyimg.com/n7/jfs/t1/99328/29/33069/67014/64525750Fbf44aee2/45bd70696196eb46.jpg"
+                            },
+                            {
+                                "num": 27,
+                                "value": "//img11.360buyimg.com/n7/jfs/t1/95892/31/36917/86152/645868cfFbfaf60b6/09be854210f92fc5.jpg"
+                            },
+                            {
+                                "num": 28,
+                                "value": "//misc.360buyimg.com/lib/img/e/blank.gif"
+                            },
+                            {
+                                "num": 29,
+                                "value": "//img12.360buyimg.com/n7/jfs/t1/159297/26/37565/145825/64525780Feda164ad/0485369bb0b20bfb.jpg"
+                            },
+                            {
+                                "num": 30,
+                                "value": "//img13.360buyimg.com/n7/jfs/t1/210508/18/33774/136590/64525771F6199551e/5c1ca06adf7128a2.jpg"
+                            },
+                            {
+                                "num": 31,
+                                "value": "//img13.360buyimg.com/n7/jfs/t1/111433/12/37222/130025/6487d2acF7c444eec/e116d22e27d291b5.jpg"
+                            },
+                            {
+                                "num": 32,
+                                "value": "//img10.360buyimg.com/n7/jfs/t1/223490/23/24982/157918/6487d2adF9b4ab7d1/cb7a977c05f43381.jpg"
+                            },
+                            {
+                                "num": 33,
+                                "value": "//img11.360buyimg.com/n7/jfs/t1/219000/13/31660/70915/64786253F20368364/d73fccc8ca386203.jpg"
+                            },
+                            {
+                                "num": 34,
+                                "value": "//img12.360buyimg.com/n7/jfs/t1/213481/6/32176/145277/648bb28cF5bbfc814/656cc98de2a14d59.jpg"
+                            },
+                            {
+                                "num": 35,
+                                "value": "//img10.360buyimg.com/n7/jfs/t1/119820/6/40272/234763/648bb28eFe4357768/1886427e8177fa16.jpg"
+                            },
+                            {
+                                "num": 36,
+                                "value": "//img10.360buyimg.com/n7/jfs/t1/223817/3/24886/115068/647ff65cF2c3e06c1/9cc9a42bffa72e0d.jpg"
+                            },
+                            {
+                                "num": 37,
+                                "value": "//img11.360buyimg.com/n7/jfs/t1/112182/3/35692/99061/647ff65fFcae93928/ce4de53bbe8dc9dc.jpg"
+                            },
+                            {
+                                "num": 38,
+                                "value": "//img12.360buyimg.com/n7/jfs/t1/115793/10/36782/58217/646b122fF754ce827/59e3f882ef7d5a09.jpg"
+                            },
+                            {
+                                "num": 39,
+                                "value": "//img13.360buyimg.com/n7/jfs/t1/163080/29/28850/65830/64a01896Faaf514bb/1d86cea04f87f63f.jpg"
+                            },
+                            {
+                                "num": 40,
+                                "value": ""
+                            },
+                            {
+                                "num": 41,
+                                "value": ""
+                            },
+                            {
+                                "num": 42,
+                                "value": ""
+                            },
+                            {
+                                "num": 43,
+                                "value": ""
+                            },
+                            {
+                                "num": 44,
+                                "value": ""
+                            },
+                            {
+                                "num": 45,
+                                "value": ""
+                            },
+                            {
+                                "num": 46,
+                                "value": ""
+                            },
+                            {
+                                "num": 47,
+                                "value": ""
+                            },
+                            {
+                                "num": 48,
+                                "value": ""
+                            },
+                            {
+                                "num": 49,
+                                "value": ""
+                            },
+                            {
+                                "num": 50,
+                                "value": ""
+                            },
+                            {
+                                "num": 51,
+                                "value": ""
+                            },
+                            {
+                                "num": 52,
+                                "value": ""
+                            },
+                            {
+                                "num": 53,
+                                "value": ""
+                            },
+                            {
+                                "num": 54,
+                                "value": ""
+                            },
+                            {
+                                "num": 55,
+                                "value": ""
+                            },
+                            {
+                                "num": 56,
+                                "value": ""
+                            },
+                            {
+                                "num": 57,
+                                "value": ""
+                            },
+                            {
+                                "num": 58,
+                                "value": ""
+                            },
+                            {
+                                "num": 59,
+                                "value": ""
+                            }
+                        ],
+                        "unique_index": "/div[1]/a[1]/img[1]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 0,
+                        "contentType": 1,
+                        "relative": true,
+                        "name": "参数4_文本",
+                        "desc": "",
+                        "relativeXPath": "/div[2]/strong[1]/em[1]",
+                        "allXPaths": [
+                            "/div[2]/strong[1]/em[1]",
+                            "//em[contains(., '¥')]",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-59]/div/div[last()-6]/strong/em"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 0,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 1,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 2,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 3,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 4,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 5,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 6,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 7,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 8,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 9,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 10,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 11,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 12,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 13,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 14,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 15,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 16,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 17,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 18,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 19,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 20,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 21,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 22,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 23,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 24,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 25,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 26,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 27,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 28,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 29,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 30,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 31,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 32,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 33,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 34,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 35,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 36,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 37,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 38,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 39,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 40,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 41,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 42,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 43,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 44,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 45,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 46,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 47,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 48,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 49,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 50,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 51,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 52,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 53,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 54,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 55,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 56,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 57,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 58,
+                                "value": "¥"
+                            },
+                            {
+                                "num": 59,
+                                "value": "¥"
+                            }
+                        ],
+                        "unique_index": "/div[2]/strong[1]/em[1]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 0,
+                        "contentType": 1,
+                        "relative": true,
+                        "name": "参数5_文本",
+                        "desc": "",
+                        "relativeXPath": "/div[2]/strong[1]/i[1]",
+                        "allXPaths": [
+                            "/div[2]/strong[1]/i[1]",
+                            "//i[contains(., '339.00')]",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-59]/div/div[last()-6]/strong/i"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 0,
+                                "value": "339.00"
+                            },
+                            {
+                                "num": 1,
+                                "value": "339.00"
+                            },
+                            {
+                                "num": 2,
+                                "value": "339.00"
+                            },
+                            {
+                                "num": 3,
+                                "value": "549.00"
+                            },
+                            {
+                                "num": 4,
+                                "value": "549.00"
+                            },
+                            {
+                                "num": 5,
+                                "value": "179.00"
+                            },
+                            {
+                                "num": 6,
+                                "value": "549.00"
+                            },
+                            {
+                                "num": 7,
+                                "value": "25.00"
+                            },
+                            {
+                                "num": 8,
+                                "value": "39.00"
+                            },
+                            {
+                                "num": 9,
+                                "value": "549.00"
+                            },
+                            {
+                                "num": 10,
+                                "value": "718.00"
+                            },
+                            {
+                                "num": 11,
+                                "value": "115.00"
+                            },
+                            {
+                                "num": 12,
+                                "value": "25.00"
+                            },
+                            {
+                                "num": 13,
+                                "value": "55.00"
+                            },
+                            {
+                                "num": 14,
+                                "value": "105.00"
+                            },
+                            {
+                                "num": 15,
+                                "value": "17800.00"
+                            },
+                            {
+                                "num": 16,
+                                "value": "25.00"
+                            },
+                            {
+                                "num": 17,
+                                "value": "25.00"
+                            },
+                            {
+                                "num": 18,
+                                "value": "25.00"
+                            },
+                            {
+                                "num": 19,
+                                "value": "50.00"
+                            },
+                            {
+                                "num": 20,
+                                "value": "50.00"
+                            },
+                            {
+                                "num": 21,
+                                "value": "174.20"
+                            },
+                            {
+                                "num": 22,
+                                "value": "998.00"
+                            },
+                            {
+                                "num": 23,
+                                "value": "2258.00"
+                            },
+                            {
+                                "num": 24,
+                                "value": "2015.00"
+                            },
+                            {
+                                "num": 25,
+                                "value": "2015.00"
+                            },
+                            {
+                                "num": 26,
+                                "value": "2015.00"
+                            },
+                            {
+                                "num": 27,
+                                "value": "889.00"
+                            },
+                            {
+                                "num": 28,
+                                "value": "314.05"
+                            },
+                            {
+                                "num": 29,
+                                "value": "4355.00"
+                            },
+                            {
+                                "num": 30,
+                                "value": "4355.00"
+                            },
+                            {
+                                "num": 31,
+                                "value": "183.00"
+                            },
+                            {
+                                "num": 32,
+                                "value": "183.00"
+                            },
+                            {
+                                "num": 33,
+                                "value": "2278.00"
+                            },
+                            {
+                                "num": 34,
+                                "value": "41.00"
+                            },
+                            {
+                                "num": 35,
+                                "value": "207.00"
+                            },
+                            {
+                                "num": 36,
+                                "value": "16.00"
+                            },
+                            {
+                                "num": 37,
+                                "value": "16.00"
+                            },
+                            {
+                                "num": 38,
+                                "value": "1259.00"
+                            },
+                            {
+                                "num": 39,
+                                "value": "1034.00"
+                            },
+                            {
+                                "num": 40,
+                                "value": "228.00"
+                            },
+                            {
+                                "num": 41,
+                                "value": "10707.00"
+                            },
+                            {
+                                "num": 42,
+                                "value": "22069.00"
+                            },
+                            {
+                                "num": 43,
+                                "value": "28601.00"
+                            },
+                            {
+                                "num": 44,
+                                "value": "10707.00"
+                            },
+                            {
+                                "num": 45,
+                                "value": "16694.00"
+                            },
+                            {
+                                "num": 46,
+                                "value": "28397.00"
+                            },
+                            {
+                                "num": 47,
+                                "value": "14109.00"
+                            },
+                            {
+                                "num": 48,
+                                "value": "64.30"
+                            },
+                            {
+                                "num": 49,
+                                "value": "36.40"
+                            },
+                            {
+                                "num": 50,
+                                "value": "15.80"
+                            },
+                            {
+                                "num": 51,
+                                "value": "26.00"
+                            },
+                            {
+                                "num": 52,
+                                "value": "31.20"
+                            },
+                            {
+                                "num": 53,
+                                "value": "55.00"
+                            },
+                            {
+                                "num": 54,
+                                "value": "28.00"
+                            },
+                            {
+                                "num": 55,
+                                "value": "42.80"
+                            },
+                            {
+                                "num": 56,
+                                "value": "24.90"
+                            },
+                            {
+                                "num": 57,
+                                "value": "148.05"
+                            },
+                            {
+                                "num": 58,
+                                "value": "59.50"
+                            },
+                            {
+                                "num": 59,
+                                "value": "18.80"
+                            }
+                        ],
+                        "unique_index": "/div[2]/strong[1]/i[1]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 1,
+                        "contentType": 0,
+                        "relative": true,
+                        "name": "参数6_链接文本",
+                        "desc": "",
+                        "relativeXPath": "/div[3]/a[1]",
+                        "allXPaths": [
+                            "/div[3]/a[1]",
+                            "//a[contains(., '1')]",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-59]/div/div[last()-5]/a"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 0,
+                                "value": "\n\t\t\t\t\t\t\t\t123婴儿推车高景观轻便可坐可躺折叠避震双向宝宝新生儿童手推车  【豪华版】四轮橡胶卡其色\n\t\t\t\t\t\t\t\t【可坐可躺可双向】买就送凉席蚊帐餐盘脚套等12种赠品(升级版+豪华版可享),超值超划算!\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 1,
+                                "value": "\n\t\t\t\t\t\t\t\t123婴儿推车高景观轻便可坐可躺折叠避震双向宝宝新生儿童手推车  【豪华版】四轮橡胶快乐星球\n\t\t\t\t\t\t\t\t【可坐可躺可双向】买就送凉席蚊帐餐盘脚套等12种赠品(升级版+豪华版可享),超值超划算!\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 2,
+                                "value": "\n\t\t\t\t\t\t\t\t123婴儿推车高景观轻便可坐可躺折叠避震双向宝宝新生儿童手推车 【豪华版】四轮橡胶卡通白猫\n\t\t\t\t\t\t\t\t【可坐可躺可双向】买就送凉席蚊帐餐盘脚套等12种赠品(升级版+豪华版可享),超值超划算!\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 3,
+                                "value": "\n\t\t\t\t\t\t\t\t吉召 轻奢高档网红暴力熊摆件客厅大型落地托盘电视柜沙发家居软装饰 红色加底座123cm【带蓝牙音箱】\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 4,
+                                "value": "\n\t\t\t\t\t\t\t\t吉召 轻奢高档网红暴力熊摆件客厅大型落地托盘电视柜沙发家居软装饰 蓝色加底座123cm【带蓝牙音箱】\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 5,
+                                "value": "\n\t\t\t\t\t\t\t\tSLPC狗狗冲锋衣双层狗狗雨衣秋冬款保暖狗衣服防风防雪防雨大型犬衣服 灰色 4XL身长60-78胸围85-123CM\n\t\t\t\t\t\t\t\t衣服多处收口设计,防止雨水进入;背部有牵引点\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 6,
+                                "value": "\n\t\t\t\t\t\t\t\t吉召 轻奢高档网红暴力熊摆件客厅大型落地托盘电视柜沙发家居软装饰 绿色加底座123cm【带蓝牙音箱】\n\t\t\t\t\t\t\t\t1.新品上新,晒图赠好礼,详情咨询客服2.免费提供贺卡(需联系客服)3.运输破损,免费换新4.赠运费险,放心购!更多优质好物\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 7,
+                                "value": "\n\t\t\t\t\t\t\t\t爱心东东\t\n森尼熊保鲸书籍龙族全套小说6册123上中下4江南著幻想武侠书籍玩具礼物 龙族3 上  一本\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 8,
+                                "value": "\n\t\t\t\t\t\t\t\t格爵水千丞一醉经年小白杨针锋对决附加遗产娘娘腔谁把谁当真儿童玩具 附加遗产123本未删减\n\t\t\t\t\t\t\t\t新店刚刚开业,所以没有评价,放心下单,有问题联系客服\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 9,
+                                "value": "\n\t\t\t\t\t\t\t\t吉召 轻奢高档网红暴力熊摆件客厅大型落地托盘电视柜沙发家居软装饰 橙色加底座123cm【带蓝牙音箱】\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 10,
+                                "value": "\n\t\t\t\t\t\t\t\t点道(DIANDAO)创意客厅流水摆件电视柜旁边装饰品水景喷泉现代北欧办公室轻奢摆设 TT99045H+底座:长28宽28高123CM\n\t\t\t\t\t\t\t\t乔迁新居礼品开业礼物\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 11,
+                                "value": "\n\t\t\t\t\t\t\t\t爱心东东\t\n森尼熊保鲸书籍龙族全套小说6册123上中下4江南著幻想武侠书籍玩具礼物 龙族全套6册\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 12,
+                                "value": "\n\t\t\t\t\t\t\t\t爱心东东\t\n森尼熊保鲸书籍龙族全套小说6册123上中下4江南著幻想武侠书籍玩具礼物 龙族3中  一本\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 13,
+                                "value": "\n\t\t\t\t\t\t\t\t爱心东东\t\n森尼熊保鲸书籍龙族全套小说6册123上中下4江南著幻想武侠书籍玩具礼物 龙族  3册 联系客服备注\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 14,
+                                "value": "\n\t\t\t\t\t\t\t\t爱心东东\t\n森尼熊保鲸书籍龙族全套小说6册123上中下4江南著幻想武侠书籍玩具礼物 龙族 5册 联系客服备注\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 15,
+                                "value": "\n\t\t\t\t\t\t\t\t唯艺思佳 金丝楠木大型木雕摆件一帆风顺公司会所大堂办公室落地摆设别墅装饰根雕工艺品乔迁开业周年庆礼品 实物:长123宽32高72  总高150\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 16,
+                                "value": "\n\t\t\t\t\t\t\t\t爱心东东\t\n森尼熊保鲸书籍龙族全套小说6册123上中下4江南著幻想武侠书籍玩具礼物 龙族1  一本\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 17,
+                                "value": "\n\t\t\t\t\t\t\t\t爱心东东\t\n森尼熊保鲸书籍龙族全套小说6册123上中下4江南著幻想武侠书籍玩具礼物 龙族2  一本\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 18,
+                                "value": "\n\t\t\t\t\t\t\t\t爱心东东\t\n森尼熊保鲸书籍龙族全套小说6册123上中下4江南著幻想武侠书籍玩具礼物 龙族3下  一本\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 19,
+                                "value": "\n\t\t\t\t\t\t\t\t爱心东东\t\n森尼熊保鲸书籍龙族全套小说6册123上中下4江南著幻想武侠书籍玩具礼物 龙族4   一本\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 20,
+                                "value": "\n\t\t\t\t\t\t\t\t爱心东东\t\n森尼熊保鲸书籍龙族全套小说6册123上中下4江南著幻想武侠书籍玩具礼物 龙族  4册 联系客服备注\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 21,
+                                "value": "\n\t\t\t\t\t\t\t\t萨罗仿真足重样品金条金砖铜镀金收藏金块金店展示展示道具摆件 常规款500克123mm*43mm*3.5mm\n\t\t\t\t\t\t\t\t【京东云仓发货】品质服务生活!\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 22,
+                                "value": "\n\t\t\t\t\t\t\t\t人文家居 假山喷泉流水摆件工艺品客厅玄关桌面加湿器创意办公室高山水景装饰品开业礼品送朋友 大号配底座 51*33*123CM\n\t\t\t\t\t\t\t\t【活水养鱼】【破损换新】水泵雾化器质量问题六个月换新!\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 23,
+                                "value": "\n\t\t\t\t\t\t\t\t澳颜莱小型假山流水盆景假山流水喷泉循环水景摆件创意球景观客厅工艺室 加鱼黑色56*56*123cm\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 24,
+                                "value": "\n\t\t\t\t\t\t\t\tUOSO暴力熊摆件大号 1.5m大摆件电视柜轻奢家居乔迁开业礼品搬家礼物 蓝色熊托盘123cm【带蓝牙音箱和\n\t\t\t\t\t\t\t\t店铺部分产品为定制款,定制商品不退不换,详细咨询客户下单,定制商品发货时间为30天之内,请知悉!\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 25,
+                                "value": "\n\t\t\t\t\t\t\t\tUOSO暴力熊摆件大号 1.5m大摆件电视柜轻奢家居乔迁开业礼品搬家礼物 橙色熊托盘123cm【带蓝牙音箱和\n\t\t\t\t\t\t\t\t店铺部分产品为定制款,定制商品不退不换,详细咨询客户下单,定制商品发货时间为30天之内,请知悉!\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 26,
+                                "value": "\n\t\t\t\t\t\t\t\tUOSO暴力熊摆件大号 1.5m大摆件电视柜轻奢家居乔迁开业礼品搬家礼物 绿色熊托盘123cm【带蓝牙音箱和\n\t\t\t\t\t\t\t\t店铺部分产品为定制款,定制商品不退不换,详细咨询客户下单,定制商品发货时间为30天之内,请知悉!\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 27,
+                                "value": "\n\t\t\t\t\t\t\t\t酷奇象(KUQIXIANG)岫玉摆件原石天然玉石奇石裸石毛料岫岩玉室内家居装饰摆放 绿色123\n\t\t\t\t\t\t\t\t【精选高端质量商品】【七天无理由退换】【赠送运费险购物无忧】\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 28,
+                                "value": "\n\t\t\t\t\t\t\t\t跃森把把壶手玩件金丝楠阴沉雕小茶壶猪兔羊挂件吊坠项链汽车钥匙 孤品T123阴沉木水波把把壶\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 29,
+                                "value": "\n\t\t\t\t\t\t\t\tUOSO金蟾蜍摆件木雕落地摆件酒店大堂客厅办公室装饰开业礼品别墅 A款福运吉祥(紫檀色)整体高123厘\n\t\t\t\t\t\t\t\t店铺部分产品为定制款,定制商品不退不换,详细咨询客户下单,定制商品发货时间为30天之内,请知悉!\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 30,
+                                "value": "\n\t\t\t\t\t\t\t\tUOSO金蟾蜍摆件木雕落地摆件酒店大堂客厅办公室装饰开业礼品别墅 A款福运吉祥(沙金)整体高123厘米\n\t\t\t\t\t\t\t\t店铺部分产品为定制款,定制商品不退不换,详细咨询客户下单,定制商品发货时间为30天之内,请知悉!\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 31,
+                                "value": "\n\t\t\t\t\t\t\t\t妙普乐大象摆件一家三口 创意大象摆件四口轻奢可爱客厅电视柜玄关装饰 舐犊情深三只 花面绿釉530-123\n\t\t\t\t\t\t\t\t本店部分商品为定制商品,部分商品价格是定金,部分商品自提,超重及偏地区需要补运费,出售产品吊牌并非统一,详情请咨询客服\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 32,
+                                "value": "\n\t\t\t\t\t\t\t\t妙普乐大象摆件一家三口 创意大象摆件四口轻奢可爱客厅电视柜玄关装饰 舐犊情深 花面橙色釉530-123\n\t\t\t\t\t\t\t\t本店部分商品为定制商品,部分商品价格是定金,部分商品自提,超重及偏地区需要补运费,出售产品吊牌并非统一,详情请咨询客服\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 33,
+                                "value": "\n\t\t\t\t\t\t\t\t旭杉斯客厅摆件大件落地沙发旁大型暴力熊电视柜托盘乔迁新居礼品家居装 123cm特大加高升级款-亲子熊落地\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 34,
+                                "value": "\n\t\t\t\t\t\t\t\t少羽同款公主小妹可爱惊喜盲袋小萌粒盲盒创意节日礼物 M123招*财猫4颗 随机1个\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 35,
+                                "value": "\n\t\t\t\t\t\t\t\t少羽同款公主小妹可爱惊喜盲袋小萌粒盲盒创意节日礼物 M123招*财猫24颗 整套\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 36,
+                                "value": "\n\t\t\t\t\t\t\t\t乐高(LEGO)入门级中国积木军事工程车消防兼容拼插男孩子拼装玩具拼图 猛虎特警【123颗粒】6合1\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 37,
+                                "value": "\n\t\t\t\t\t\t\t\t乐高(LEGO)入门级中国积木军事工程车消防兼容拼插男孩子拼装玩具拼图 战地英豪【123颗粒】6合1\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 38,
+                                "value": "\n\t\t\t\t\t\t\t\t大咖之家暴力熊大摆件客厅网红落地家居饰品大型电视柜旁开业乔迁新居礼品 中国红 墨镜熊托盘123cm(带蓝牙\n\t\t\t\t\t\t\t\t【精选高端质量商品】【七天无理由退换】【赠送运费险购物无忧】\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 39,
+                                "value": "\n\t\t\t\t\t\t\t\t立赐网红暴力熊大型客厅摆件落地电视柜沙发旁家居装饰品乔迁开业礼品 红色熊托盘123cm加底座(带蓝牙\n\t\t\t\t\t\t\t\t【赠送运费险】【免费开发票】【收到宝贝后号平找客服领红包】【品类好店】\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 40,
+                                "value": "\n\t\t\t\t\t\t\t\t辉客映上仿真金条金砖纯铜镀金样品金条金店投资假金条道具摆件送礼收藏 黄色500克123mm*43mm*5mm\n\t\t\t\t\t\t\t\t本店部分商品为定制商品,部分商品价格是定金,部分商品自提,超重及偏远地区需补运费,出售产品吊牌并非统一,详情请咨询客服,私自下单表示认同不接受反驳不作为赔偿依据\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 41,
+                                "value": "\n\t\t\t\t\t\t\t\t千惠侬室内户外假山流水景观喷泉庭院阳台别墅酒店山水盆景瀑布造 D款长宽高 243*123*180厘米\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 42,
+                                "value": "\n\t\t\t\t\t\t\t\t千惠侬室内户外假山流水景观喷泉庭院阳台别墅酒店山水盆景瀑布造 I款长宽高 420*123*180厘米\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 43,
+                                "value": "\n\t\t\t\t\t\t\t\t千惠侬室内户外假山流水景观喷泉庭院阳台别墅酒店山水盆景瀑布造 J款长宽高 420*123*250厘米\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 44,
+                                "value": "\n\t\t\t\t\t\t\t\t千惠侬室内户外假山流水景观喷泉庭院阳台别墅酒店山水盆景瀑布造 L款长宽高 243*123*220厘米\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 45,
+                                "value": "\n\t\t\t\t\t\t\t\t千惠侬室内户外假山流水景观喷泉庭院阳台别墅酒店山水盆景瀑布造 N款长宽高 300*123*216厘米\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 46,
+                                "value": "\n\t\t\t\t\t\t\t\t千惠侬室内户外假山流水景观喷泉庭院阳台别墅酒店山水盆景瀑布造 P款长宽高 430*123*216厘米\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 47,
+                                "value": "\n\t\t\t\t\t\t\t\t千惠侬室内户外假山流水景观喷泉庭院阳台别墅酒店山水盆景瀑布造 Q款长宽高 300*123*200厘米\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 48,
+                                "value": "\n\t\t\t\t\t\t\t\t\n邦臣小红花有趣的创意学习书神奇数字123亲子共读撕不烂早教书数字启蒙认知书绘本1-2岁玩具幼小衔接入学准备童书\n\t\t\t\t\t\t\t\t幼儿数学英语启蒙创意认知书单册数量100本以上可联系团购电话4006186622\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 49,
+                                "value": "\n\t\t\t\t\t\t\t\t\n数字123英语abc(套装2册)小婴孩早教学习认知纸板书\n\t\t\t\t\t\t\t\t99元5件 幼儿启蒙 团购电话4006186622\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 50,
+                                "value": "\n\t\t\t\t\t\t\t\t【可选版本】2023新版高中地理课本全套书人教版高中地理必修一二册选择性必修一二三册高一二三上下学期高中地理必修一二12册选修123册课本书 【...\n\t\t\t\t\t\t\t\t【科目自选】高中地理必修12选修123\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 51,
+                                "value": "\n\t\t\t\t\t\t\t\t小彼恩毛毛虫点读笔配套书 幼儿0-9岁廖彩杏吴敏兰名师推荐 廖彩杏书单-123去动物园\n\t\t\t\t\t\t\t\t6.27-7.3全店直降一口价,价同618,会员满498/788赠礼品,布鲁伊新品上市买1赠6,会员签到1元秒湿巾更多活动进店查看\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 52,
+                                "value": "\n\t\t\t\t\t\t\t\t邦臣小红花·有趣的创意学习书-神奇数字123 新版宝宝书籍0-3岁早教启蒙翻翻看撕不烂 婴幼儿智力开发认知卡片\n\t\t\t\t\t\t\t\t七种阅读体验从一本书开始,奇妙的科普启蒙创意故事书。\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 53,
+                                "value": "\n\t\t\t\t\t\t\t\t\n多美(TAKARA TOMY)多美卡合金小汽车模型儿童玩具男孩123号嘎哩君长款运输车卡车160960\n\t\t\t\t\t\t\t\t合金长款嘎哩君长款运输车卡车,日本进口,抗摔耐玩【更多宝贝】\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 54,
+                                "value": "\n\t\t\t\t\t\t\t\t\n一起数数123\n\t\t\t\t\t\t\t\t故事里认数字,游戏中学数数,五味太郎好玩的数字绘本来啦! 团购电话4006186622\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 55,
+                                "value": "\n\t\t\t\t\t\t\t\t正版人民版高中历史教材全套必修3本课本 人民版高中历史必修123教材教科书 人民出版社\n\t\t\t\t\t\t\t\t人民历史必修123\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 56,
+                                "value": "\n\t\t\t\t\t\t\t\t后浪正版  一起数数123 五味太郎思维游戏书 3-6-8岁儿童绘本互动思维益智 认知与逻辑思维大挑战 全脑数学游戏想象力谜题语言表达左右大脑开发 提...\n\t\t\t\t\t\t\t\t小土大橙子推荐,数字认知绘本,让孩子跟着小熊去做客;在游戏中学会数字,适合亲子共读\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 57,
+                                "value": "\n\t\t\t\t\t\t\t\t\n松下(Panasonic)斜五孔开关插座斜位二、三极插座(10A)(10只装)悦畔系列WXXC123\n\t\t\t\t\t\t\t\t【清凉节来咯】爆品限时优惠价,雅悦系列弧线转角/性价比超高,到手低至5折,立即抢购\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 58,
+                                "value": "\n\t\t\t\t\t\t\t\t学而思 学前七大能力课堂思维启蒙第一课 幼儿园小班适用(3-4岁)123套装3册 幼小衔接必备 新老板交替发货\n\t\t\t\t\t\t\t\t基于教育部《3-6岁儿童学习与发展指南》及学前儿童认知发展规律,学而思研发3-6岁儿童七大能力六级体系100册以上团购优惠联系电话4006186622\n\t\t\t\t\t\t\t"
+                            },
+                            {
+                                "num": 59,
+                                "value": "\n\t\t\t\t\t\t\t\t狮洛德 生日宝宝周岁123数字气球立柱儿童卡通ins派对装饰套装 数字2\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t"
+                            }
+                        ],
+                        "unique_index": "/div[3]/a[1]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 2,
+                        "contentType": 0,
+                        "relative": true,
+                        "name": "参数7_链接地址",
+                        "desc": "",
+                        "relativeXPath": "/div[3]/a[1]",
+                        "allXPaths": [
+                            "/div[3]/a[1]",
+                            "//a[contains(., '1')]",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-59]/div/div[last()-5]/a"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 0,
+                                "value": "//item.jd.com/66144896261.html"
+                            },
+                            {
+                                "num": 1,
+                                "value": "//item.jd.com/66144896265.html"
+                            },
+                            {
+                                "num": 2,
+                                "value": "//item.jd.com/66144896264.html"
+                            },
+                            {
+                                "num": 3,
+                                "value": "//item.jd.com/10033531851583.html"
+                            },
+                            {
+                                "num": 4,
+                                "value": "//item.jd.com/10033531851582.html"
+                            },
+                            {
+                                "num": 5,
+                                "value": "//item.jd.com/10066088622463.html"
+                            },
+                            {
+                                "num": 6,
+                                "value": "//item.jd.com/10035712182850.html"
+                            },
+                            {
+                                "num": 7,
+                                "value": "//item.jd.com/10071785826677.html"
+                            },
+                            {
+                                "num": 8,
+                                "value": "//item.jd.com/10077849739040.html"
+                            },
+                            {
+                                "num": 9,
+                                "value": "//item.jd.com/10033531851584.html"
+                            },
+                            {
+                                "num": 10,
+                                "value": "//item.jd.com/10040733503774.html"
+                            },
+                            {
+                                "num": 11,
+                                "value": "//item.jd.com/10071785826674.html"
+                            },
+                            {
+                                "num": 12,
+                                "value": "//item.jd.com/10071785826678.html"
+                            },
+                            {
+                                "num": 13,
+                                "value": "//item.jd.com/10071785826682.html"
+                            },
+                            {
+                                "num": 14,
+                                "value": "//item.jd.com/10071785826684.html"
+                            },
+                            {
+                                "num": 15,
+                                "value": "//item.jd.com/10051994751480.html"
+                            },
+                            {
+                                "num": 16,
+                                "value": "//item.jd.com/10071785826675.html"
+                            },
+                            {
+                                "num": 17,
+                                "value": "//item.jd.com/10071785826676.html"
+                            },
+                            {
+                                "num": 18,
+                                "value": "//item.jd.com/10071785826679.html"
+                            },
+                            {
+                                "num": 19,
+                                "value": "//item.jd.com/10071785826680.html"
+                            },
+                            {
+                                "num": 20,
+                                "value": "//item.jd.com/10071785826683.html"
+                            },
+                            {
+                                "num": 21,
+                                "value": "//item.jd.com/10045335421289.html"
+                            },
+                            {
+                                "num": 22,
+                                "value": "//item.jd.com/11773766494.html"
+                            },
+                            {
+                                "num": 23,
+                                "value": "//item.jd.com/10076458552994.html"
+                            },
+                            {
+                                "num": 24,
+                                "value": "//item.jd.com/10074614929614.html"
+                            },
+                            {
+                                "num": 25,
+                                "value": "//item.jd.com/10074614929616.html"
+                            },
+                            {
+                                "num": 26,
+                                "value": "//item.jd.com/10074614929617.html"
+                            },
+                            {
+                                "num": 27,
+                                "value": "//item.jd.com/10075117517846.html"
+                            },
+                            {
+                                "num": 28,
+                                "value": "//item.jd.com/10076750833807.html"
+                            },
+                            {
+                                "num": 29,
+                                "value": "//item.jd.com/10074629310807.html"
+                            },
+                            {
+                                "num": 30,
+                                "value": "//item.jd.com/10074629310808.html"
+                            },
+                            {
+                                "num": 31,
+                                "value": "//item.jd.com/10078155456003.html"
+                            },
+                            {
+                                "num": 32,
+                                "value": "//item.jd.com/10078155456005.html"
+                            },
+                            {
+                                "num": 33,
+                                "value": "//item.jd.com/10077222703036.html"
+                            },
+                            {
+                                "num": 34,
+                                "value": "//item.jd.com/10078407670547.html"
+                            },
+                            {
+                                "num": 35,
+                                "value": "//item.jd.com/10078407670550.html"
+                            },
+                            {
+                                "num": 36,
+                                "value": "//item.jd.com/10077634039065.html"
+                            },
+                            {
+                                "num": 37,
+                                "value": "//item.jd.com/10077634039066.html"
+                            },
+                            {
+                                "num": 38,
+                                "value": "//item.jd.com/10076384967007.html"
+                            },
+                            {
+                                "num": 39,
+                                "value": "//item.jd.com/10077727026633.html"
+                            },
+                            {
+                                "num": 40,
+                                "value": "//item.jd.com/10077045237658.html"
+                            },
+                            {
+                                "num": 41,
+                                "value": "//item.jd.com/10074028982993.html"
+                            },
+                            {
+                                "num": 42,
+                                "value": "//item.jd.com/10074028982998.html"
+                            },
+                            {
+                                "num": 43,
+                                "value": "//item.jd.com/10074028982999.html"
+                            },
+                            {
+                                "num": 44,
+                                "value": "//item.jd.com/10074028983001.html"
+                            },
+                            {
+                                "num": 45,
+                                "value": "//item.jd.com/10074028983003.html"
+                            },
+                            {
+                                "num": 46,
+                                "value": "//item.jd.com/10074028983005.html"
+                            },
+                            {
+                                "num": 47,
+                                "value": "//item.jd.com/10074028983006.html"
+                            },
+                            {
+                                "num": 48,
+                                "value": "//item.jd.com/13256317.html"
+                            },
+                            {
+                                "num": 49,
+                                "value": "//item.jd.com/12830944.html"
+                            },
+                            {
+                                "num": 50,
+                                "value": "//item.jd.com/10069471945735.html"
+                            },
+                            {
+                                "num": 51,
+                                "value": "//item.jd.com/10065743084711.html"
+                            },
+                            {
+                                "num": 52,
+                                "value": "//item.jd.com/10057275997475.html"
+                            },
+                            {
+                                "num": 53,
+                                "value": "//item.jd.com/100040241781.html"
+                            },
+                            {
+                                "num": 54,
+                                "value": "//item.jd.com/11793245.html"
+                            },
+                            {
+                                "num": 55,
+                                "value": "//item.jd.com/10043774573916.html"
+                            },
+                            {
+                                "num": 56,
+                                "value": "//item.jd.com/57633600735.html"
+                            },
+                            {
+                                "num": 57,
+                                "value": "//item.jd.com/100049147902.html"
+                            },
+                            {
+                                "num": 58,
+                                "value": "//item.jd.com/12682998.html"
+                            },
+                            {
+                                "num": 59,
+                                "value": "//item.jd.com/100046068385.html"
+                            }
+                        ],
+                        "unique_index": "/div[3]/a[1]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 0,
+                        "contentType": 1,
+                        "relative": true,
+                        "name": "参数8_文本",
+                        "desc": "",
+                        "relativeXPath": "/div[3]/a[1]/em[1]",
+                        "allXPaths": [
+                            "/div[3]/a[1]/em[1]",
+                            "//em[contains(., '123婴儿推车高景观')]",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-59]/div/div[last()-5]/a/em"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 0,
+                                "value": "婴儿推车高景观轻便可坐可躺折叠避震双向宝宝新生儿童手推车【豪华版】四轮橡胶卡其色"
+                            },
+                            {
+                                "num": 1,
+                                "value": "婴儿推车高景观轻便可坐可躺折叠避震双向宝宝新生儿童手推车【豪华版】四轮橡胶快乐星球"
+                            },
+                            {
+                                "num": 2,
+                                "value": "婴儿推车高景观轻便可坐可躺折叠避震双向宝宝新生儿童手推车【豪华版】四轮橡胶卡通白猫"
+                            },
+                            {
+                                "num": 3,
+                                "value": "吉召轻奢高档网红暴力熊摆件客厅大型落地托盘电视柜沙发家居软装饰红色加底座cm【带蓝牙音箱】"
+                            },
+                            {
+                                "num": 4,
+                                "value": "吉召轻奢高档网红暴力熊摆件客厅大型落地托盘电视柜沙发家居软装饰蓝色加底座cm【带蓝牙音箱】"
+                            },
+                            {
+                                "num": 5,
+                                "value": "SLPC狗狗冲锋衣双层狗狗雨衣秋冬款保暖狗衣服防风防雪防雨大型犬衣服灰色4XL身长60-78胸围85-CM"
+                            },
+                            {
+                                "num": 6,
+                                "value": "吉召轻奢高档网红暴力熊摆件客厅大型落地托盘电视柜沙发家居软装饰绿色加底座cm【带蓝牙音箱】"
+                            },
+                            {
+                                "num": 7,
+                                "value": "森尼熊保鲸书籍龙族全套小说6册上中下4江南著幻想武侠书籍玩具礼物龙族3上一本"
+                            },
+                            {
+                                "num": 8,
+                                "value": "格爵水千丞一醉经年小白杨针锋对决附加遗产娘娘腔谁把谁当真儿童玩具附加遗产本未删减"
+                            },
+                            {
+                                "num": 9,
+                                "value": "吉召轻奢高档网红暴力熊摆件客厅大型落地托盘电视柜沙发家居软装饰橙色加底座cm【带蓝牙音箱】"
+                            },
+                            {
+                                "num": 10,
+                                "value": "点道(DIANDAO)创意客厅流水摆件电视柜旁边装饰品水景喷泉现代北欧办公室轻奢摆设TT99045H+底座:长28宽28高CM"
+                            },
+                            {
+                                "num": 11,
+                                "value": "森尼熊保鲸书籍龙族全套小说6册上中下4江南著幻想武侠书籍玩具礼物龙族全套6册"
+                            },
+                            {
+                                "num": 12,
+                                "value": "森尼熊保鲸书籍龙族全套小说6册上中下4江南著幻想武侠书籍玩具礼物龙族3中一本"
+                            },
+                            {
+                                "num": 13,
+                                "value": "森尼熊保鲸书籍龙族全套小说6册上中下4江南著幻想武侠书籍玩具礼物龙族3册联系客服备注"
+                            },
+                            {
+                                "num": 14,
+                                "value": "森尼熊保鲸书籍龙族全套小说6册上中下4江南著幻想武侠书籍玩具礼物龙族5册联系客服备注"
+                            },
+                            {
+                                "num": 15,
+                                "value": "唯艺思佳金丝楠木大型木雕摆件一帆风顺公司会所大堂办公室落地摆设别墅装饰根雕工艺品乔迁开业周年庆礼品实物:长宽32高72总高150"
+                            },
+                            {
+                                "num": 16,
+                                "value": "森尼熊保鲸书籍龙族全套小说6册上中下4江南著幻想武侠书籍玩具礼物龙族1一本"
+                            },
+                            {
+                                "num": 17,
+                                "value": "森尼熊保鲸书籍龙族全套小说6册上中下4江南著幻想武侠书籍玩具礼物龙族2一本"
+                            },
+                            {
+                                "num": 18,
+                                "value": "森尼熊保鲸书籍龙族全套小说6册上中下4江南著幻想武侠书籍玩具礼物龙族3下一本"
+                            },
+                            {
+                                "num": 19,
+                                "value": "森尼熊保鲸书籍龙族全套小说6册上中下4江南著幻想武侠书籍玩具礼物龙族4一本"
+                            },
+                            {
+                                "num": 20,
+                                "value": "森尼熊保鲸书籍龙族全套小说6册上中下4江南著幻想武侠书籍玩具礼物龙族4册联系客服备注"
+                            },
+                            {
+                                "num": 21,
+                                "value": "萨罗仿真足重样品金条金砖铜镀金收藏金块金店展示展示道具摆件常规款500克mm*43mm*3.5mm"
+                            },
+                            {
+                                "num": 22,
+                                "value": "人文家居假山喷泉流水摆件工艺品客厅玄关桌面加湿器创意办公室高山水景装饰品开业礼品送朋友大号配底座51*33*CM"
+                            },
+                            {
+                                "num": 23,
+                                "value": "澳颜莱小型假山流水盆景假山流水喷泉循环水景摆件创意球景观客厅工艺室加鱼黑色56*56*cm"
+                            },
+                            {
+                                "num": 24,
+                                "value": "UOSO暴力熊摆件大号1.5m大摆件电视柜轻奢家居乔迁开业礼品搬家礼物蓝色熊托盘cm【带蓝牙音箱和"
+                            },
+                            {
+                                "num": 25,
+                                "value": "UOSO暴力熊摆件大号1.5m大摆件电视柜轻奢家居乔迁开业礼品搬家礼物橙色熊托盘cm【带蓝牙音箱和"
+                            },
+                            {
+                                "num": 26,
+                                "value": "UOSO暴力熊摆件大号1.5m大摆件电视柜轻奢家居乔迁开业礼品搬家礼物绿色熊托盘cm【带蓝牙音箱和"
+                            },
+                            {
+                                "num": 27,
+                                "value": "酷奇象(KUQIXIANG)岫玉摆件原石天然玉石奇石裸石毛料岫岩玉室内家居装饰摆放绿色"
+                            },
+                            {
+                                "num": 28,
+                                "value": "跃森把把壶手玩件金丝楠阴沉雕小茶壶猪兔羊挂件吊坠项链汽车钥匙孤品T阴沉木水波把把壶"
+                            },
+                            {
+                                "num": 29,
+                                "value": "UOSO金蟾蜍摆件木雕落地摆件酒店大堂客厅办公室装饰开业礼品别墅A款福运吉祥(紫檀色)整体高厘"
+                            },
+                            {
+                                "num": 30,
+                                "value": "UOSO金蟾蜍摆件木雕落地摆件酒店大堂客厅办公室装饰开业礼品别墅A款福运吉祥(沙金)整体高厘米"
+                            },
+                            {
+                                "num": 31,
+                                "value": "妙普乐大象摆件一家三口创意大象摆件四口轻奢可爱客厅电视柜玄关装饰舐犊情深三只花面绿釉530-"
+                            },
+                            {
+                                "num": 32,
+                                "value": "妙普乐大象摆件一家三口创意大象摆件四口轻奢可爱客厅电视柜玄关装饰舐犊情深花面橙色釉530-"
+                            },
+                            {
+                                "num": 33,
+                                "value": "旭杉斯客厅摆件大件落地沙发旁大型暴力熊电视柜托盘乔迁新居礼品家居装cm特大加高升级款-亲子熊落地"
+                            },
+                            {
+                                "num": 34,
+                                "value": "少羽同款公主小妹可爱惊喜盲袋小萌粒盲盒创意节日礼物M招*财猫4颗随机1个"
+                            },
+                            {
+                                "num": 35,
+                                "value": "少羽同款公主小妹可爱惊喜盲袋小萌粒盲盒创意节日礼物M招*财猫24颗整套"
+                            },
+                            {
+                                "num": 36,
+                                "value": "乐高(LEGO)入门级中国积木军事工程车消防兼容拼插男孩子拼装玩具拼图猛虎特警【颗粒】6合1"
+                            },
+                            {
+                                "num": 37,
+                                "value": "乐高(LEGO)入门级中国积木军事工程车消防兼容拼插男孩子拼装玩具拼图战地英豪【颗粒】6合1"
+                            },
+                            {
+                                "num": 38,
+                                "value": "大咖之家暴力熊大摆件客厅网红落地家居饰品大型电视柜旁开业乔迁新居礼品中国红墨镜熊托盘cm(带蓝牙"
+                            },
+                            {
+                                "num": 39,
+                                "value": "立赐网红暴力熊大型客厅摆件落地电视柜沙发旁家居装饰品乔迁开业礼品红色熊托盘cm加底座(带蓝牙"
+                            },
+                            {
+                                "num": 40,
+                                "value": "辉客映上仿真金条金砖纯铜镀金样品金条金店投资假金条道具摆件送礼收藏黄色500克mm*43mm*5mm"
+                            },
+                            {
+                                "num": 41,
+                                "value": "千惠侬室内户外假山流水景观喷泉庭院阳台别墅酒店山水盆景瀑布造D款长宽高243**180厘米"
+                            },
+                            {
+                                "num": 42,
+                                "value": "千惠侬室内户外假山流水景观喷泉庭院阳台别墅酒店山水盆景瀑布造I款长宽高420**180厘米"
+                            },
+                            {
+                                "num": 43,
+                                "value": "千惠侬室内户外假山流水景观喷泉庭院阳台别墅酒店山水盆景瀑布造J款长宽高420**250厘米"
+                            },
+                            {
+                                "num": 44,
+                                "value": "千惠侬室内户外假山流水景观喷泉庭院阳台别墅酒店山水盆景瀑布造L款长宽高243**220厘米"
+                            },
+                            {
+                                "num": 45,
+                                "value": "千惠侬室内户外假山流水景观喷泉庭院阳台别墅酒店山水盆景瀑布造N款长宽高300**216厘米"
+                            },
+                            {
+                                "num": 46,
+                                "value": "千惠侬室内户外假山流水景观喷泉庭院阳台别墅酒店山水盆景瀑布造P款长宽高430**216厘米"
+                            },
+                            {
+                                "num": 47,
+                                "value": "千惠侬室内户外假山流水景观喷泉庭院阳台别墅酒店山水盆景瀑布造Q款长宽高300**200厘米"
+                            },
+                            {
+                                "num": 48,
+                                "value": "邦臣小红花有趣的创意学习书神奇数字亲子共读撕不烂早教书数字启蒙认知书绘本1-2岁玩具幼小衔接入学准备童书"
+                            },
+                            {
+                                "num": 49,
+                                "value": "数字英语abc(套装2册)小婴孩早教学习认知纸板书"
+                            },
+                            {
+                                "num": 50,
+                                "value": "【可选版本】2023新版高中地理课本全套书人教版高中地理必修一二册选择性必修一二三册高一二三上下学期高中地理必修一二12册选修册课本书【"
+                            },
+                            {
+                                "num": 51,
+                                "value": "小彼恩毛毛虫点读笔配套书幼儿0-9岁廖彩杏吴敏兰名师推荐廖彩杏书单-去动物园"
+                            },
+                            {
+                                "num": 52,
+                                "value": "邦臣小红花·有趣的创意学习书-神奇数字新版宝宝书籍0-3岁早教启蒙翻翻看撕不烂婴幼儿智力开发认知卡片"
+                            },
+                            {
+                                "num": 53,
+                                "value": "多美(TAKARATOMY)多美卡合金小汽车模型儿童玩具男孩号嘎哩君长款运输车卡车160960"
+                            },
+                            {
+                                "num": 54,
+                                "value": "一起数数"
+                            },
+                            {
+                                "num": 55,
+                                "value": "正版人民版高中历史教材全套必修3本课本人民版高中历史必修教材教科书人民出版社"
+                            },
+                            {
+                                "num": 56,
+                                "value": "后浪正版一起数数五味太郎思维游戏书3-6-8岁儿童绘本互动思维益智认知与逻辑思维大挑战全脑数学游戏想象力谜题语言表达左右大脑开发提"
+                            },
+                            {
+                                "num": 57,
+                                "value": "松下(Panasonic)斜五孔开关插座斜位二、三极插座(10A)(10只装)悦畔系列WXXC"
+                            },
+                            {
+                                "num": 58,
+                                "value": "学而思学前七大能力课堂思维启蒙第一课幼儿园小班适用(3-4岁)套装3册幼小衔接必备新老板交替发货"
+                            },
+                            {
+                                "num": 59,
+                                "value": "狮洛德生日宝宝周岁数字气球立柱儿童卡通ins派对装饰套装数字2"
+                            }
+                        ],
+                        "unique_index": "/div[3]/a[1]/em[1]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 0,
+                        "contentType": 1,
+                        "relative": true,
+                        "name": "参数9_文本",
+                        "desc": "",
+                        "relativeXPath": "/div[3]/a[1]/em[1]/font[1]",
+                        "allXPaths": [
+                            "/div[3]/a[1]/em[1]/font[1]",
+                            "//font[contains(., '123')]",
+                            "//FONT[@class='skcolor_ljg']",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-59]/div/div[last()-5]/a/em/font"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 0,
+                                "value": "123"
+                            },
+                            {
+                                "num": 1,
+                                "value": "123"
+                            },
+                            {
+                                "num": 2,
+                                "value": "123"
+                            },
+                            {
+                                "num": 3,
+                                "value": "123"
+                            },
+                            {
+                                "num": 4,
+                                "value": "123"
+                            },
+                            {
+                                "num": 5,
+                                "value": "123"
+                            },
+                            {
+                                "num": 6,
+                                "value": "123"
+                            },
+                            {
+                                "num": 7,
+                                "value": "123"
+                            },
+                            {
+                                "num": 8,
+                                "value": "123"
+                            },
+                            {
+                                "num": 9,
+                                "value": "123"
+                            },
+                            {
+                                "num": 10,
+                                "value": "123"
+                            },
+                            {
+                                "num": 11,
+                                "value": "123"
+                            },
+                            {
+                                "num": 12,
+                                "value": "123"
+                            },
+                            {
+                                "num": 13,
+                                "value": "123"
+                            },
+                            {
+                                "num": 14,
+                                "value": "123"
+                            },
+                            {
+                                "num": 15,
+                                "value": "123"
+                            },
+                            {
+                                "num": 16,
+                                "value": "123"
+                            },
+                            {
+                                "num": 17,
+                                "value": "123"
+                            },
+                            {
+                                "num": 18,
+                                "value": "123"
+                            },
+                            {
+                                "num": 19,
+                                "value": "123"
+                            },
+                            {
+                                "num": 20,
+                                "value": "123"
+                            },
+                            {
+                                "num": 21,
+                                "value": "123"
+                            },
+                            {
+                                "num": 22,
+                                "value": "123"
+                            },
+                            {
+                                "num": 23,
+                                "value": "123"
+                            },
+                            {
+                                "num": 24,
+                                "value": "123"
+                            },
+                            {
+                                "num": 25,
+                                "value": "123"
+                            },
+                            {
+                                "num": 26,
+                                "value": "123"
+                            },
+                            {
+                                "num": 27,
+                                "value": "123"
+                            },
+                            {
+                                "num": 28,
+                                "value": "123"
+                            },
+                            {
+                                "num": 29,
+                                "value": "123"
+                            },
+                            {
+                                "num": 30,
+                                "value": "123"
+                            },
+                            {
+                                "num": 31,
+                                "value": "123"
+                            },
+                            {
+                                "num": 32,
+                                "value": "123"
+                            },
+                            {
+                                "num": 33,
+                                "value": "123"
+                            },
+                            {
+                                "num": 34,
+                                "value": "123"
+                            },
+                            {
+                                "num": 35,
+                                "value": "123"
+                            },
+                            {
+                                "num": 36,
+                                "value": "123"
+                            },
+                            {
+                                "num": 37,
+                                "value": "123"
+                            },
+                            {
+                                "num": 38,
+                                "value": "123"
+                            },
+                            {
+                                "num": 39,
+                                "value": "123"
+                            },
+                            {
+                                "num": 40,
+                                "value": "123"
+                            },
+                            {
+                                "num": 41,
+                                "value": "123"
+                            },
+                            {
+                                "num": 42,
+                                "value": "123"
+                            },
+                            {
+                                "num": 43,
+                                "value": "123"
+                            },
+                            {
+                                "num": 44,
+                                "value": "123"
+                            },
+                            {
+                                "num": 45,
+                                "value": "123"
+                            },
+                            {
+                                "num": 46,
+                                "value": "123"
+                            },
+                            {
+                                "num": 47,
+                                "value": "123"
+                            },
+                            {
+                                "num": 48,
+                                "value": "123"
+                            },
+                            {
+                                "num": 49,
+                                "value": "123"
+                            },
+                            {
+                                "num": 50,
+                                "value": "123"
+                            },
+                            {
+                                "num": 51,
+                                "value": "123"
+                            },
+                            {
+                                "num": 52,
+                                "value": "123"
+                            },
+                            {
+                                "num": 53,
+                                "value": "123"
+                            },
+                            {
+                                "num": 54,
+                                "value": "123"
+                            },
+                            {
+                                "num": 55,
+                                "value": "123"
+                            },
+                            {
+                                "num": 56,
+                                "value": "123"
+                            },
+                            {
+                                "num": 57,
+                                "value": "123"
+                            },
+                            {
+                                "num": 58,
+                                "value": "123"
+                            },
+                            {
+                                "num": 59,
+                                "value": "123"
+                            }
+                        ],
+                        "unique_index": "/div[3]/a[1]/em[1]/font[1]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 0,
+                        "contentType": 1,
+                        "relative": true,
+                        "name": "参数10_文本",
+                        "desc": "",
+                        "relativeXPath": "/div[3]/a[1]/i[1]",
+                        "allXPaths": [
+                            "/div[3]/a[1]/i[1]",
+                            "//i[contains(., '【可坐可躺可双向】买')]",
+                            "id(\"J_AD_66144896261\")",
+                            "//I[@class='promo-words']",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-59]/div/div[last()-5]/a/i"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 0,
+                                "value": "【可坐可躺可双向】买就送凉席蚊帐餐盘脚套等12种赠品(升级版+豪华版可享),超值超划算!"
+                            },
+                            {
+                                "num": 1,
+                                "value": "【可坐可躺可双向】买就送凉席蚊帐餐盘脚套等12种赠品(升级版+豪华版可享),超值超划算!"
+                            },
+                            {
+                                "num": 2,
+                                "value": "【可坐可躺可双向】买就送凉席蚊帐餐盘脚套等12种赠品(升级版+豪华版可享),超值超划算!"
+                            },
+                            {
+                                "num": 3,
+                                "value": ""
+                            },
+                            {
+                                "num": 4,
+                                "value": ""
+                            },
+                            {
+                                "num": 5,
+                                "value": "衣服多处收口设计,防止雨水进入;背部有牵引点"
+                            },
+                            {
+                                "num": 6,
+                                "value": "1.新品上新,晒图赠好礼,详情咨询客服2.免费提供贺卡(需联系客服)3.运输破损,免费换新4.赠运费险,放心购!更多优质好物"
+                            },
+                            {
+                                "num": 7,
+                                "value": ""
+                            },
+                            {
+                                "num": 8,
+                                "value": "新店刚刚开业,所以没有评价,放心下单,有问题联系客服"
+                            },
+                            {
+                                "num": 9,
+                                "value": ""
+                            },
+                            {
+                                "num": 10,
+                                "value": "乔迁新居礼品开业礼物"
+                            },
+                            {
+                                "num": 11,
+                                "value": ""
+                            },
+                            {
+                                "num": 12,
+                                "value": ""
+                            },
+                            {
+                                "num": 13,
+                                "value": ""
+                            },
+                            {
+                                "num": 14,
+                                "value": ""
+                            },
+                            {
+                                "num": 15,
+                                "value": ""
+                            },
+                            {
+                                "num": 16,
+                                "value": ""
+                            },
+                            {
+                                "num": 17,
+                                "value": ""
+                            },
+                            {
+                                "num": 18,
+                                "value": ""
+                            },
+                            {
+                                "num": 19,
+                                "value": ""
+                            },
+                            {
+                                "num": 20,
+                                "value": ""
+                            },
+                            {
+                                "num": 21,
+                                "value": "【京东云仓发货】品质服务生活!"
+                            },
+                            {
+                                "num": 22,
+                                "value": "【活水养鱼】【破损换新】水泵雾化器质量问题六个月换新!"
+                            },
+                            {
+                                "num": 23,
+                                "value": ""
+                            },
+                            {
+                                "num": 24,
+                                "value": "店铺部分产品为定制款,定制商品不退不换,详细咨询客户下单,定制商品发货时间为30天之内,请知悉!"
+                            },
+                            {
+                                "num": 25,
+                                "value": "店铺部分产品为定制款,定制商品不退不换,详细咨询客户下单,定制商品发货时间为30天之内,请知悉!"
+                            },
+                            {
+                                "num": 26,
+                                "value": "店铺部分产品为定制款,定制商品不退不换,详细咨询客户下单,定制商品发货时间为30天之内,请知悉!"
+                            },
+                            {
+                                "num": 27,
+                                "value": "【精选高端质量商品】【七天无理由退换】【赠送运费险购物无忧】"
+                            },
+                            {
+                                "num": 28,
+                                "value": ""
+                            },
+                            {
+                                "num": 29,
+                                "value": "店铺部分产品为定制款,定制商品不退不换,详细咨询客户下单,定制商品发货时间为30天之内,请知悉!"
+                            },
+                            {
+                                "num": 30,
+                                "value": "店铺部分产品为定制款,定制商品不退不换,详细咨询客户下单,定制商品发货时间为30天之内,请知悉!"
+                            },
+                            {
+                                "num": 31,
+                                "value": "本店部分商品为定制商品,部分商品价格是定金,部分商品自提,超重及偏地区需要补运费,出售产品吊牌并非统一,详情请咨询客服"
+                            },
+                            {
+                                "num": 32,
+                                "value": "本店部分商品为定制商品,部分商品价格是定金,部分商品自提,超重及偏地区需要补运费,出售产品吊牌并非统一,详情请咨询客服"
+                            },
+                            {
+                                "num": 33,
+                                "value": ""
+                            },
+                            {
+                                "num": 34,
+                                "value": ""
+                            },
+                            {
+                                "num": 35,
+                                "value": ""
+                            },
+                            {
+                                "num": 36,
+                                "value": ""
+                            },
+                            {
+                                "num": 37,
+                                "value": ""
+                            },
+                            {
+                                "num": 38,
+                                "value": "【精选高端质量商品】【七天无理由退换】【赠送运费险购物无忧】"
+                            },
+                            {
+                                "num": 39,
+                                "value": "【赠送运费险】【免费开发票】【收到宝贝后号平找客服领红包】【品类好店】"
+                            },
+                            {
+                                "num": 40,
+                                "value": "本店部分商品为定制商品,部分商品价格是定金,部分商品自提,超重及偏远地区需补运费,出售产品吊牌并非统一,详情请咨询客服,私自下单表示认同不接受反驳不作为赔偿依据"
+                            },
+                            {
+                                "num": 41,
+                                "value": ""
+                            },
+                            {
+                                "num": 42,
+                                "value": ""
+                            },
+                            {
+                                "num": 43,
+                                "value": ""
+                            },
+                            {
+                                "num": 44,
+                                "value": ""
+                            },
+                            {
+                                "num": 45,
+                                "value": ""
+                            },
+                            {
+                                "num": 46,
+                                "value": ""
+                            },
+                            {
+                                "num": 47,
+                                "value": ""
+                            },
+                            {
+                                "num": 48,
+                                "value": "幼儿数学英语启蒙创意认知书单册数量100本以上可联系团购电话4006186622"
+                            },
+                            {
+                                "num": 49,
+                                "value": "99元5件幼儿启蒙团购电话4006186622"
+                            },
+                            {
+                                "num": 50,
+                                "value": "【科目自选】高中地理必修12选修123"
+                            },
+                            {
+                                "num": 51,
+                                "value": "6.27-7.3全店直降一口价,价同618,会员满498/788赠礼品,布鲁伊新品上市买1赠6,会员签到1元秒湿巾更多活动进店查看"
+                            },
+                            {
+                                "num": 52,
+                                "value": "七种阅读体验从一本书开始,奇妙的科普启蒙创意故事书。"
+                            },
+                            {
+                                "num": 53,
+                                "value": "合金长款嘎哩君长款运输车卡车,日本进口,抗摔耐玩【更多宝贝】"
+                            },
+                            {
+                                "num": 54,
+                                "value": "故事里认数字,游戏中学数数,五味太郎好玩的数字绘本来啦!团购电话4006186622"
+                            },
+                            {
+                                "num": 55,
+                                "value": "人民历史必修123"
+                            },
+                            {
+                                "num": 56,
+                                "value": "小土大橙子推荐,数字认知绘本,让孩子跟着小熊去做客;在游戏中学会数字,适合亲子共读"
+                            },
+                            {
+                                "num": 57,
+                                "value": "【清凉节来咯】爆品限时优惠价,雅悦系列弧线转角/性价比超高,到手低至5折,立即抢购"
+                            },
+                            {
+                                "num": 58,
+                                "value": "基于教育部《3-6岁儿童学习与发展指南》及学前儿童认知发展规律,学而思研发3-6岁儿童七大能力六级体系100册以上团购优惠联系电话4006186622"
+                            },
+                            {
+                                "num": 59,
+                                "value": ""
+                            }
+                        ],
+                        "unique_index": "/div[3]/a[1]/i[1]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 0,
+                        "contentType": 1,
+                        "relative": true,
+                        "name": "参数11_文本",
+                        "desc": "",
+                        "relativeXPath": "/div[4]/strong[1]",
+                        "allXPaths": [
+                            "/div[4]/strong[1]",
+                            "//strong[contains(., '1万+条评价')]",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-59]/div/div[last()-4]/strong"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 0,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 1,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 2,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 3,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 4,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 5,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 6,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 7,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 8,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 9,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 10,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 11,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 12,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 13,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 14,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 15,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 16,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 17,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 18,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 19,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 20,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 21,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 22,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 23,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 24,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 25,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 26,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 27,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 28,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 29,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 30,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 31,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 32,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 33,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 34,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 35,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 36,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 37,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 38,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 39,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 40,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 41,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 42,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 43,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 44,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 45,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 46,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 47,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 48,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 49,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 50,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 51,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 52,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 53,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 54,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 55,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 56,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 57,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 58,
+                                "value": "条评价"
+                            },
+                            {
+                                "num": 59,
+                                "value": "条评价"
+                            }
+                        ],
+                        "unique_index": "/div[4]/strong[1]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 1,
+                        "contentType": 0,
+                        "relative": true,
+                        "name": "参数12_链接文本",
+                        "desc": "",
+                        "relativeXPath": "/div[4]/strong[1]/a[1]",
+                        "allXPaths": [
+                            "/div[4]/strong[1]/a[1]",
+                            "//a[contains(., '1万+')]",
+                            "id(\"J_comment_66144896261\")",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-59]/div/div[last()-4]/strong/a"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 0,
+                                "value": "1万+"
+                            },
+                            {
+                                "num": 1,
+                                "value": "1万+"
+                            },
+                            {
+                                "num": 2,
+                                "value": "1万+"
+                            },
+                            {
+                                "num": 3,
+                                "value": "200+"
+                            },
+                            {
+                                "num": 4,
+                                "value": "200+"
+                            },
+                            {
+                                "num": 5,
+                                "value": "67"
+                            },
+                            {
+                                "num": 6,
+                                "value": "200+"
+                            },
+                            {
+                                "num": 7,
+                                "value": "9"
+                            },
+                            {
+                                "num": 8,
+                                "value": "3"
+                            },
+                            {
+                                "num": 9,
+                                "value": "200+"
+                            },
+                            {
+                                "num": 10,
+                                "value": "20"
+                            },
+                            {
+                                "num": 11,
+                                "value": "9"
+                            },
+                            {
+                                "num": 12,
+                                "value": "9"
+                            },
+                            {
+                                "num": 13,
+                                "value": "9"
+                            },
+                            {
+                                "num": 14,
+                                "value": "9"
+                            },
+                            {
+                                "num": 15,
+                                "value": "5"
+                            },
+                            {
+                                "num": 16,
+                                "value": "9"
+                            },
+                            {
+                                "num": 17,
+                                "value": "9"
+                            },
+                            {
+                                "num": 18,
+                                "value": "9"
+                            },
+                            {
+                                "num": 19,
+                                "value": "9"
+                            },
+                            {
+                                "num": 20,
+                                "value": "9"
+                            },
+                            {
+                                "num": 21,
+                                "value": "15"
+                            },
+                            {
+                                "num": 22,
+                                "value": "2000+"
+                            },
+                            {
+                                "num": 23,
+                                "value": "0"
+                            },
+                            {
+                                "num": 24,
+                                "value": "0"
+                            },
+                            {
+                                "num": 25,
+                                "value": "0"
+                            },
+                            {
+                                "num": 26,
+                                "value": "0"
+                            },
+                            {
+                                "num": 27,
+                                "value": "0"
+                            },
+                            {
+                                "num": 28,
+                                "value": "0"
+                            },
+                            {
+                                "num": 29,
+                                "value": "0"
+                            },
+                            {
+                                "num": 30,
+                                "value": "0"
+                            },
+                            {
+                                "num": 31,
+                                "value": "0"
+                            },
+                            {
+                                "num": 32,
+                                "value": "0"
+                            },
+                            {
+                                "num": 33,
+                                "value": "0"
+                            },
+                            {
+                                "num": 34,
+                                "value": "0"
+                            },
+                            {
+                                "num": 35,
+                                "value": "0"
+                            },
+                            {
+                                "num": 36,
+                                "value": "0"
+                            },
+                            {
+                                "num": 37,
+                                "value": "0"
+                            },
+                            {
+                                "num": 38,
+                                "value": "0"
+                            },
+                            {
+                                "num": 39,
+                                "value": "0"
+                            },
+                            {
+                                "num": 40,
+                                "value": "0"
+                            },
+                            {
+                                "num": 41,
+                                "value": "0"
+                            },
+                            {
+                                "num": 42,
+                                "value": "0"
+                            },
+                            {
+                                "num": 43,
+                                "value": "0"
+                            },
+                            {
+                                "num": 44,
+                                "value": "0"
+                            },
+                            {
+                                "num": 45,
+                                "value": "0"
+                            },
+                            {
+                                "num": 46,
+                                "value": "0"
+                            },
+                            {
+                                "num": 47,
+                                "value": "0"
+                            },
+                            {
+                                "num": 48,
+                                "value": "1万+"
+                            },
+                            {
+                                "num": 49,
+                                "value": "1万+"
+                            },
+                            {
+                                "num": 50,
+                                "value": "200+"
+                            },
+                            {
+                                "num": 51,
+                                "value": "2000+"
+                            },
+                            {
+                                "num": 52,
+                                "value": "100+"
+                            },
+                            {
+                                "num": 53,
+                                "value": "1万+"
+                            },
+                            {
+                                "num": 54,
+                                "value": "1万+"
+                            },
+                            {
+                                "num": 55,
+                                "value": "100+"
+                            },
+                            {
+                                "num": 56,
+                                "value": "100+"
+                            },
+                            {
+                                "num": 57,
+                                "value": "1万+"
+                            },
+                            {
+                                "num": 58,
+                                "value": "100万+"
+                            },
+                            {
+                                "num": 59,
+                                "value": "2000+"
+                            }
+                        ],
+                        "unique_index": "/div[4]/strong[1]/a[1]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 2,
+                        "contentType": 0,
+                        "relative": true,
+                        "name": "参数13_链接地址",
+                        "desc": "",
+                        "relativeXPath": "/div[4]/strong[1]/a[1]",
+                        "allXPaths": [
+                            "/div[4]/strong[1]/a[1]",
+                            "//a[contains(., '1万+')]",
+                            "id(\"J_comment_66144896261\")",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-59]/div/div[last()-4]/strong/a"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 0,
+                                "value": "//item.jd.com/66144896261.html#comment"
+                            },
+                            {
+                                "num": 1,
+                                "value": "//item.jd.com/66144896265.html#comment"
+                            },
+                            {
+                                "num": 2,
+                                "value": "//item.jd.com/66144896264.html#comment"
+                            },
+                            {
+                                "num": 3,
+                                "value": "//item.jd.com/10033531851583.html#comment"
+                            },
+                            {
+                                "num": 4,
+                                "value": "//item.jd.com/10033531851582.html#comment"
+                            },
+                            {
+                                "num": 5,
+                                "value": "//item.jd.com/10066088622463.html#comment"
+                            },
+                            {
+                                "num": 6,
+                                "value": "//item.jd.com/10035712182850.html#comment"
+                            },
+                            {
+                                "num": 7,
+                                "value": "//item.jd.com/10071785826677.html#comment"
+                            },
+                            {
+                                "num": 8,
+                                "value": "//item.jd.com/10077849739040.html#comment"
+                            },
+                            {
+                                "num": 9,
+                                "value": "//item.jd.com/10033531851584.html#comment"
+                            },
+                            {
+                                "num": 10,
+                                "value": "//item.jd.com/10040733503774.html#comment"
+                            },
+                            {
+                                "num": 11,
+                                "value": "//item.jd.com/10071785826674.html#comment"
+                            },
+                            {
+                                "num": 12,
+                                "value": "//item.jd.com/10071785826678.html#comment"
+                            },
+                            {
+                                "num": 13,
+                                "value": "//item.jd.com/10071785826682.html#comment"
+                            },
+                            {
+                                "num": 14,
+                                "value": "//item.jd.com/10071785826684.html#comment"
+                            },
+                            {
+                                "num": 15,
+                                "value": "//item.jd.com/10051994751480.html#comment"
+                            },
+                            {
+                                "num": 16,
+                                "value": "//item.jd.com/10071785826675.html#comment"
+                            },
+                            {
+                                "num": 17,
+                                "value": "//item.jd.com/10071785826676.html#comment"
+                            },
+                            {
+                                "num": 18,
+                                "value": "//item.jd.com/10071785826679.html#comment"
+                            },
+                            {
+                                "num": 19,
+                                "value": "//item.jd.com/10071785826680.html#comment"
+                            },
+                            {
+                                "num": 20,
+                                "value": "//item.jd.com/10071785826683.html#comment"
+                            },
+                            {
+                                "num": 21,
+                                "value": "//item.jd.com/10045335421289.html#comment"
+                            },
+                            {
+                                "num": 22,
+                                "value": "//item.jd.com/11773766494.html#comment"
+                            },
+                            {
+                                "num": 23,
+                                "value": "//item.jd.com/10076458552994.html#comment"
+                            },
+                            {
+                                "num": 24,
+                                "value": "//item.jd.com/10074614929614.html#comment"
+                            },
+                            {
+                                "num": 25,
+                                "value": "//item.jd.com/10074614929616.html#comment"
+                            },
+                            {
+                                "num": 26,
+                                "value": "//item.jd.com/10074614929617.html#comment"
+                            },
+                            {
+                                "num": 27,
+                                "value": "//item.jd.com/10075117517846.html#comment"
+                            },
+                            {
+                                "num": 28,
+                                "value": "//item.jd.com/10076750833807.html#comment"
+                            },
+                            {
+                                "num": 29,
+                                "value": "//item.jd.com/10074629310807.html#comment"
+                            },
+                            {
+                                "num": 30,
+                                "value": "//item.jd.com/10074629310808.html#comment"
+                            },
+                            {
+                                "num": 31,
+                                "value": "//item.jd.com/10078155456003.html#comment"
+                            },
+                            {
+                                "num": 32,
+                                "value": "//item.jd.com/10078155456005.html#comment"
+                            },
+                            {
+                                "num": 33,
+                                "value": "//item.jd.com/10077222703036.html#comment"
+                            },
+                            {
+                                "num": 34,
+                                "value": "//item.jd.com/10078407670547.html#comment"
+                            },
+                            {
+                                "num": 35,
+                                "value": "//item.jd.com/10078407670550.html#comment"
+                            },
+                            {
+                                "num": 36,
+                                "value": "//item.jd.com/10077634039065.html#comment"
+                            },
+                            {
+                                "num": 37,
+                                "value": "//item.jd.com/10077634039066.html#comment"
+                            },
+                            {
+                                "num": 38,
+                                "value": "//item.jd.com/10076384967007.html#comment"
+                            },
+                            {
+                                "num": 39,
+                                "value": "//item.jd.com/10077727026633.html#comment"
+                            },
+                            {
+                                "num": 40,
+                                "value": "//item.jd.com/10077045237658.html#comment"
+                            },
+                            {
+                                "num": 41,
+                                "value": "//item.jd.com/10074028982993.html#comment"
+                            },
+                            {
+                                "num": 42,
+                                "value": "//item.jd.com/10074028982998.html#comment"
+                            },
+                            {
+                                "num": 43,
+                                "value": "//item.jd.com/10074028982999.html#comment"
+                            },
+                            {
+                                "num": 44,
+                                "value": "//item.jd.com/10074028983001.html#comment"
+                            },
+                            {
+                                "num": 45,
+                                "value": "//item.jd.com/10074028983003.html#comment"
+                            },
+                            {
+                                "num": 46,
+                                "value": "//item.jd.com/10074028983005.html#comment"
+                            },
+                            {
+                                "num": 47,
+                                "value": "//item.jd.com/10074028983006.html#comment"
+                            },
+                            {
+                                "num": 48,
+                                "value": "//item.jd.com/13256317.html#comment"
+                            },
+                            {
+                                "num": 49,
+                                "value": "//item.jd.com/12830944.html#comment"
+                            },
+                            {
+                                "num": 50,
+                                "value": "//item.jd.com/10069471945735.html#comment"
+                            },
+                            {
+                                "num": 51,
+                                "value": "//item.jd.com/10065743084711.html#comment"
+                            },
+                            {
+                                "num": 52,
+                                "value": "//item.jd.com/10057275997475.html#comment"
+                            },
+                            {
+                                "num": 53,
+                                "value": "//item.jd.com/100040241781.html#comment"
+                            },
+                            {
+                                "num": 54,
+                                "value": "//item.jd.com/11793245.html#comment"
+                            },
+                            {
+                                "num": 55,
+                                "value": "//item.jd.com/10043774573916.html#comment"
+                            },
+                            {
+                                "num": 56,
+                                "value": "//item.jd.com/57633600735.html#comment"
+                            },
+                            {
+                                "num": 57,
+                                "value": "//item.jd.com/100049147902.html#comment"
+                            },
+                            {
+                                "num": 58,
+                                "value": "//item.jd.com/12682998.html#comment"
+                            },
+                            {
+                                "num": 59,
+                                "value": "//item.jd.com/100046068385.html#comment"
+                            }
+                        ],
+                        "unique_index": "/div[4]/strong[1]/a[1]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 4,
+                        "contentType": 1,
+                        "relative": true,
+                        "name": "参数14_图片地址",
+                        "desc": "",
+                        "relativeXPath": "/div[5]/img[1]",
+                        "allXPaths": [
+                            "/div[5]/img[1]",
+                            "//img[contains(., '')]",
+                            "//IMG[@class='shop-tag fl']",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-59]/div/div[last()-3]/img"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 0,
+                                "value": "//m.360buyimg.com/cc/jfs/t1/197706/29/27826/4384/63314bc6E21b4c3e9/8b4d5fc44efc5b3f.png"
+                            },
+                            {
+                                "num": 1,
+                                "value": "//m.360buyimg.com/cc/jfs/t1/197706/29/27826/4384/63314bc6E21b4c3e9/8b4d5fc44efc5b3f.png"
+                            },
+                            {
+                                "num": 2,
+                                "value": "//m.360buyimg.com/cc/jfs/t1/197706/29/27826/4384/63314bc6E21b4c3e9/8b4d5fc44efc5b3f.png"
+                            },
+                            {
+                                "num": 3,
+                                "value": "//m.360buyimg.com/cc/jfs/t1/197706/29/27826/4384/63314bc6E21b4c3e9/8b4d5fc44efc5b3f.png"
+                            },
+                            {
+                                "num": 4,
+                                "value": "//m.360buyimg.com/cc/jfs/t1/197706/29/27826/4384/63314bc6E21b4c3e9/8b4d5fc44efc5b3f.png"
+                            },
+                            {
+                                "num": 6,
+                                "value": "//m.360buyimg.com/cc/jfs/t1/197706/29/27826/4384/63314bc6E21b4c3e9/8b4d5fc44efc5b3f.png"
+                            },
+                            {
+                                "num": 9,
+                                "value": "//m.360buyimg.com/cc/jfs/t1/197706/29/27826/4384/63314bc6E21b4c3e9/8b4d5fc44efc5b3f.png"
+                            },
+                            {
+                                "num": 51,
+                                "value": "//m.360buyimg.com/cc/jfs/t1/197706/29/27826/4384/63314bc6E21b4c3e9/8b4d5fc44efc5b3f.png"
+                            },
+                            {
+                                "num": 52,
+                                "value": "//m.360buyimg.com/cc/jfs/t1/197706/29/27826/4384/63314bc6E21b4c3e9/8b4d5fc44efc5b3f.png"
+                            },
+                            {
+                                "num": 56,
+                                "value": "//m.360buyimg.com/cc/jfs/t1/197706/29/27826/4384/63314bc6E21b4c3e9/8b4d5fc44efc5b3f.png"
+                            }
+                        ],
+                        "unique_index": "/div[5]/img[1]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 1,
+                        "contentType": 0,
+                        "relative": true,
+                        "name": "参数15_链接文本",
+                        "desc": "",
+                        "relativeXPath": "/div[5]/span[1]/a[1]",
+                        "allXPaths": [
+                            "/div[5]/span[1]/a[1]",
+                            "//a[contains(., '韵贝母婴专营店')]",
+                            "//A[@class='curr-shop hd-shopname']",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-59]/div/div[last()-3]/span/a"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 0,
+                                "value": "韵贝母婴专营店"
+                            },
+                            {
+                                "num": 1,
+                                "value": "韵贝母婴专营店"
+                            },
+                            {
+                                "num": 2,
+                                "value": "韵贝母婴专营店"
+                            },
+                            {
+                                "num": 3,
+                                "value": "吉召官方旗舰店"
+                            },
+                            {
+                                "num": 4,
+                                "value": "吉召官方旗舰店"
+                            },
+                            {
+                                "num": 5,
+                                "value": "士林宠物生活专营店"
+                            },
+                            {
+                                "num": 6,
+                                "value": "吉召官方旗舰店"
+                            },
+                            {
+                                "num": 7,
+                                "value": "保鲸旗舰店"
+                            },
+                            {
+                                "num": 8,
+                                "value": "格爵玩具旗舰店"
+                            },
+                            {
+                                "num": 9,
+                                "value": "吉召官方旗舰店"
+                            },
+                            {
+                                "num": 10,
+                                "value": "点道家居旗舰店"
+                            },
+                            {
+                                "num": 11,
+                                "value": "保鲸旗舰店"
+                            },
+                            {
+                                "num": 12,
+                                "value": "保鲸旗舰店"
+                            },
+                            {
+                                "num": 13,
+                                "value": "保鲸旗舰店"
+                            },
+                            {
+                                "num": 14,
+                                "value": "保鲸旗舰店"
+                            },
+                            {
+                                "num": 15,
+                                "value": "唯艺思佳家居官方旗舰店"
+                            },
+                            {
+                                "num": 16,
+                                "value": "保鲸旗舰店"
+                            },
+                            {
+                                "num": 17,
+                                "value": "保鲸旗舰店"
+                            },
+                            {
+                                "num": 18,
+                                "value": "保鲸旗舰店"
+                            },
+                            {
+                                "num": 19,
+                                "value": "保鲸旗舰店"
+                            },
+                            {
+                                "num": 20,
+                                "value": "保鲸旗舰店"
+                            },
+                            {
+                                "num": 21,
+                                "value": "佑迪家居日用旗舰店"
+                            },
+                            {
+                                "num": 22,
+                                "value": "人文家居旗舰店"
+                            },
+                            {
+                                "num": 23,
+                                "value": "酷虾家装建材旗舰店"
+                            },
+                            {
+                                "num": 24,
+                                "value": "广绣家居专营店"
+                            },
+                            {
+                                "num": 25,
+                                "value": "广绣家居专营店"
+                            },
+                            {
+                                "num": 26,
+                                "value": "广绣家居专营店"
+                            },
+                            {
+                                "num": 27,
+                                "value": "酷奇象家居旗舰店"
+                            },
+                            {
+                                "num": 28,
+                                "value": "跃森旗舰店"
+                            },
+                            {
+                                "num": 29,
+                                "value": "广绣家居专营店"
+                            },
+                            {
+                                "num": 30,
+                                "value": "广绣家居专营店"
+                            },
+                            {
+                                "num": 31,
+                                "value": "澳量家旗舰店"
+                            },
+                            {
+                                "num": 32,
+                                "value": "澳量家旗舰店"
+                            },
+                            {
+                                "num": 33,
+                                "value": "嘉修家居日用专营店"
+                            },
+                            {
+                                "num": 34,
+                                "value": "勇度玩具专营店"
+                            },
+                            {
+                                "num": 35,
+                                "value": "勇度玩具专营店"
+                            },
+                            {
+                                "num": 36,
+                                "value": "云分表个护专营店"
+                            },
+                            {
+                                "num": 37,
+                                "value": "云分表个护专营店"
+                            },
+                            {
+                                "num": 38,
+                                "value": "网航家居专营店"
+                            },
+                            {
+                                "num": 39,
+                                "value": "立赐家居日用旗舰店"
+                            },
+                            {
+                                "num": 40,
+                                "value": "若与家居专营店"
+                            },
+                            {
+                                "num": 41,
+                                "value": "兴之沭居家专营店"
+                            },
+                            {
+                                "num": 42,
+                                "value": "兴之沭居家专营店"
+                            },
+                            {
+                                "num": 43,
+                                "value": "兴之沭居家专营店"
+                            },
+                            {
+                                "num": 44,
+                                "value": "兴之沭居家专营店"
+                            },
+                            {
+                                "num": 45,
+                                "value": "兴之沭居家专营店"
+                            },
+                            {
+                                "num": 46,
+                                "value": "兴之沭居家专营店"
+                            },
+                            {
+                                "num": 47,
+                                "value": "兴之沭居家专营店"
+                            },
+                            {
+                                "num": 48,
+                                "value": "小红花童书京东自营官方旗舰店"
+                            },
+                            {
+                                "num": 49,
+                                "value": "小婴孩京东自营官方旗舰店"
+                            },
+                            {
+                                "num": 50,
+                                "value": "慧语图书专营店"
+                            },
+                            {
+                                "num": 51,
+                                "value": "小彼恩官方旗舰店"
+                            },
+                            {
+                                "num": 52,
+                                "value": "邦臣小红花童书官方旗舰店"
+                            },
+                            {
+                                "num": 53,
+                                "value": "多美(TAKARA TOMY)京东自营旗舰店"
+                            },
+                            {
+                                "num": 54,
+                                "value": "浪花朵朵京东自营官方旗舰店"
+                            },
+                            {
+                                "num": 55,
+                                "value": "彬迪图书专营店"
+                            },
+                            {
+                                "num": 56,
+                                "value": "浪花朵朵图书旗舰店"
+                            },
+                            {
+                                "num": 57,
+                                "value": "松下开关京东自营旗舰店"
+                            },
+                            {
+                                "num": 58,
+                                "value": "学而思京东自营官方旗舰店"
+                            },
+                            {
+                                "num": 59,
+                                "value": "狮洛德京东自营旗舰店"
+                            }
+                        ],
+                        "unique_index": "/div[5]/span[1]/a[1]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 2,
+                        "contentType": 0,
+                        "relative": true,
+                        "name": "参数16_链接地址",
+                        "desc": "",
+                        "relativeXPath": "/div[5]/span[1]/a[1]",
+                        "allXPaths": [
+                            "/div[5]/span[1]/a[1]",
+                            "//a[contains(., '韵贝母婴专营店')]",
+                            "//A[@class='curr-shop hd-shopname']",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-59]/div/div[last()-3]/span/a"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 0,
+                                "value": "//mall.jd.com/index-872357.html?from=pc"
+                            },
+                            {
+                                "num": 1,
+                                "value": "//mall.jd.com/index-872357.html?from=pc"
+                            },
+                            {
+                                "num": 2,
+                                "value": "//mall.jd.com/index-872357.html?from=pc"
+                            },
+                            {
+                                "num": 3,
+                                "value": "//mall.jd.com/index-687099.html?from=pc"
+                            },
+                            {
+                                "num": 4,
+                                "value": "//mall.jd.com/index-687099.html?from=pc"
+                            },
+                            {
+                                "num": 5,
+                                "value": "//mall.jd.com/index-10325896.html?from=pc"
+                            },
+                            {
+                                "num": 6,
+                                "value": "//mall.jd.com/index-687099.html?from=pc"
+                            },
+                            {
+                                "num": 7,
+                                "value": "//mall.jd.com/index-12398758.html?from=pc"
+                            },
+                            {
+                                "num": 8,
+                                "value": "//mall.jd.com/index-12844617.html?from=pc"
+                            },
+                            {
+                                "num": 9,
+                                "value": "//mall.jd.com/index-687099.html?from=pc"
+                            },
+                            {
+                                "num": 10,
+                                "value": "//mall.jd.com/index-620850.html?from=pc"
+                            },
+                            {
+                                "num": 11,
+                                "value": "//mall.jd.com/index-12398758.html?from=pc"
+                            },
+                            {
+                                "num": 12,
+                                "value": "//mall.jd.com/index-12398758.html?from=pc"
+                            },
+                            {
+                                "num": 13,
+                                "value": "//mall.jd.com/index-12398758.html?from=pc"
+                            },
+                            {
+                                "num": 14,
+                                "value": "//mall.jd.com/index-12398758.html?from=pc"
+                            },
+                            {
+                                "num": 15,
+                                "value": "//mall.jd.com/index-10041800.html?from=pc"
+                            },
+                            {
+                                "num": 16,
+                                "value": "//mall.jd.com/index-12398758.html?from=pc"
+                            },
+                            {
+                                "num": 17,
+                                "value": "//mall.jd.com/index-12398758.html?from=pc"
+                            },
+                            {
+                                "num": 18,
+                                "value": "//mall.jd.com/index-12398758.html?from=pc"
+                            },
+                            {
+                                "num": 19,
+                                "value": "//mall.jd.com/index-12398758.html?from=pc"
+                            },
+                            {
+                                "num": 20,
+                                "value": "//mall.jd.com/index-12398758.html?from=pc"
+                            },
+                            {
+                                "num": 21,
+                                "value": "//mall.jd.com/index-11771989.html?from=pc"
+                            },
+                            {
+                                "num": 22,
+                                "value": "//mall.jd.com/index-658659.html?from=pc"
+                            },
+                            {
+                                "num": 23,
+                                "value": "//mall.jd.com/index-12608374.html?from=pc"
+                            },
+                            {
+                                "num": 24,
+                                "value": "//mall.jd.com/index-12601456.html?from=pc"
+                            },
+                            {
+                                "num": 25,
+                                "value": "//mall.jd.com/index-12601456.html?from=pc"
+                            },
+                            {
+                                "num": 26,
+                                "value": "//mall.jd.com/index-12601456.html?from=pc"
+                            },
+                            {
+                                "num": 27,
+                                "value": "//mall.jd.com/index-12720818.html?from=pc"
+                            },
+                            {
+                                "num": 28,
+                                "value": "//mall.jd.com/index-12797941.html?from=pc"
+                            },
+                            {
+                                "num": 29,
+                                "value": "//mall.jd.com/index-12601456.html?from=pc"
+                            },
+                            {
+                                "num": 30,
+                                "value": "//mall.jd.com/index-12601456.html?from=pc"
+                            },
+                            {
+                                "num": 31,
+                                "value": "//mall.jd.com/index-12769558.html?from=pc"
+                            },
+                            {
+                                "num": 32,
+                                "value": "//mall.jd.com/index-12769558.html?from=pc"
+                            },
+                            {
+                                "num": 33,
+                                "value": "//mall.jd.com/index-12681593.html?from=pc"
+                            },
+                            {
+                                "num": 34,
+                                "value": "//mall.jd.com/index-12690245.html?from=pc"
+                            },
+                            {
+                                "num": 35,
+                                "value": "//mall.jd.com/index-12690245.html?from=pc"
+                            },
+                            {
+                                "num": 36,
+                                "value": "//mall.jd.com/index-12748024.html?from=pc"
+                            },
+                            {
+                                "num": 37,
+                                "value": "//mall.jd.com/index-12748024.html?from=pc"
+                            },
+                            {
+                                "num": 38,
+                                "value": "//mall.jd.com/index-12326625.html?from=pc"
+                            },
+                            {
+                                "num": 39,
+                                "value": "//mall.jd.com/index-12601380.html?from=pc"
+                            },
+                            {
+                                "num": 40,
+                                "value": "//mall.jd.com/index-12775313.html?from=pc"
+                            },
+                            {
+                                "num": 41,
+                                "value": "//mall.jd.com/index-12489896.html?from=pc"
+                            },
+                            {
+                                "num": 42,
+                                "value": "//mall.jd.com/index-12489896.html?from=pc"
+                            },
+                            {
+                                "num": 43,
+                                "value": "//mall.jd.com/index-12489896.html?from=pc"
+                            },
+                            {
+                                "num": 44,
+                                "value": "//mall.jd.com/index-12489896.html?from=pc"
+                            },
+                            {
+                                "num": 45,
+                                "value": "//mall.jd.com/index-12489896.html?from=pc"
+                            },
+                            {
+                                "num": 46,
+                                "value": "//mall.jd.com/index-12489896.html?from=pc"
+                            },
+                            {
+                                "num": 47,
+                                "value": "//mall.jd.com/index-12489896.html?from=pc"
+                            },
+                            {
+                                "num": 48,
+                                "value": "//mall.jd.com/index-1000004568.html?from=pc"
+                            },
+                            {
+                                "num": 49,
+                                "value": "//mall.jd.com/index-1000011482.html?from=pc"
+                            },
+                            {
+                                "num": 50,
+                                "value": "//mall.jd.com/index-11615274.html?from=pc"
+                            },
+                            {
+                                "num": 51,
+                                "value": "//mall.jd.com/index-813090.html?from=pc"
+                            },
+                            {
+                                "num": 52,
+                                "value": "//mall.jd.com/index-11711130.html?from=pc"
+                            },
+                            {
+                                "num": 53,
+                                "value": "//mall.jd.com/index-1000131941.html?from=pc"
+                            },
+                            {
+                                "num": 54,
+                                "value": "//mall.jd.com/index-1000098531.html?from=pc"
+                            },
+                            {
+                                "num": 55,
+                                "value": "//mall.jd.com/index-10222375.html?from=pc"
+                            },
+                            {
+                                "num": 56,
+                                "value": "//mall.jd.com/index-10103749.html?from=pc"
+                            },
+                            {
+                                "num": 57,
+                                "value": "//mall.jd.com/index-1000077782.html?from=pc"
+                            },
+                            {
+                                "num": 58,
+                                "value": "//mall.jd.com/index-1000086605.html?from=pc"
+                            },
+                            {
+                                "num": 59,
+                                "value": "//mall.jd.com/index-1000168322.html?from=pc"
+                            }
+                        ],
+                        "unique_index": "/div[5]/span[1]/a[1]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 1,
+                        "contentType": 0,
+                        "relative": true,
+                        "name": "参数17_链接文本",
+                        "desc": "",
+                        "relativeXPath": "/div[7]/a[1]",
+                        "allXPaths": [
+                            "/div[7]/a[1]",
+                            "//a[contains(., '对比')]",
+                            "//A[@class='p-o-btn contrast J_contrast contrast']",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-59]/div/div[last()-1]/a[last()-2]"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 0,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 1,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 2,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 3,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 4,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 5,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 6,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 7,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 8,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 9,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 10,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 11,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 12,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 13,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 14,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 15,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 16,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 17,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 18,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 19,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 20,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 21,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 22,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 23,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 24,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 25,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 26,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 27,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 28,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 29,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 30,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 31,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 32,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 33,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 34,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 35,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 36,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 37,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 38,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 39,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 40,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 41,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 42,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 43,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 44,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 45,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 46,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 47,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 48,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 49,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 50,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 51,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 52,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 53,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 54,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 55,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 56,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 57,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 58,
+                                "value": "对比"
+                            },
+                            {
+                                "num": 59,
+                                "value": "对比"
+                            }
+                        ],
+                        "unique_index": "/div[7]/a[1]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 2,
+                        "contentType": 0,
+                        "relative": true,
+                        "name": "参数18_链接地址",
+                        "desc": "",
+                        "relativeXPath": "/div[7]/a[1]",
+                        "allXPaths": [
+                            "/div[7]/a[1]",
+                            "//a[contains(., '对比')]",
+                            "//A[@class='p-o-btn contrast J_contrast contrast']",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-59]/div/div[last()-1]/a[last()-2]"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 0,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 1,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 2,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 3,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 4,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 5,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 6,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 7,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 8,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 9,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 10,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 11,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 12,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 13,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 14,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 15,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 16,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 17,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 18,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 19,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 20,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 21,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 22,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 23,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 24,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 25,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 26,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 27,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 28,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 29,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 30,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 31,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 32,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 33,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 34,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 35,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 36,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 37,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 38,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 39,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 40,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 41,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 42,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 43,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 44,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 45,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 46,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 47,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 48,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 49,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 50,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 51,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 52,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 53,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 54,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 55,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 56,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 57,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 58,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 59,
+                                "value": "javascript:;"
+                            }
+                        ],
+                        "unique_index": "/div[7]/a[1]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 1,
+                        "contentType": 0,
+                        "relative": true,
+                        "name": "参数19_链接文本",
+                        "desc": "",
+                        "relativeXPath": "/div[7]/a[2]",
+                        "allXPaths": [
+                            "/div[7]/a[2]",
+                            "//a[contains(., '关注')]",
+                            "//A[@class='p-o-btn focus  J_focus']",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-59]/div/div[last()-1]/a[last()-1]"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 0,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 1,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 2,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 3,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 4,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 5,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 6,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 7,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 8,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 9,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 10,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 11,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 12,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 13,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 14,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 15,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 16,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 17,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 18,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 19,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 20,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 21,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 22,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 23,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 24,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 25,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 26,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 27,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 28,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 29,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 30,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 31,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 32,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 33,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 34,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 35,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 36,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 37,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 38,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 39,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 40,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 41,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 42,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 43,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 44,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 45,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 46,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 47,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 48,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 49,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 50,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 51,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 52,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 53,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 54,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 55,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 56,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 57,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 58,
+                                "value": "关注"
+                            },
+                            {
+                                "num": 59,
+                                "value": "关注"
+                            }
+                        ],
+                        "unique_index": "/div[7]/a[2]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 2,
+                        "contentType": 0,
+                        "relative": true,
+                        "name": "参数20_链接地址",
+                        "desc": "",
+                        "relativeXPath": "/div[7]/a[2]",
+                        "allXPaths": [
+                            "/div[7]/a[2]",
+                            "//a[contains(., '关注')]",
+                            "//A[@class='p-o-btn focus  J_focus']",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-59]/div/div[last()-1]/a[last()-1]"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 0,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 1,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 2,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 3,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 4,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 5,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 6,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 7,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 8,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 9,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 10,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 11,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 12,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 13,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 14,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 15,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 16,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 17,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 18,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 19,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 20,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 21,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 22,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 23,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 24,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 25,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 26,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 27,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 28,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 29,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 30,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 31,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 32,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 33,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 34,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 35,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 36,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 37,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 38,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 39,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 40,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 41,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 42,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 43,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 44,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 45,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 46,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 47,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 48,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 49,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 50,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 51,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 52,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 53,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 54,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 55,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 56,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 57,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 58,
+                                "value": "javascript:;"
+                            },
+                            {
+                                "num": 59,
+                                "value": "javascript:;"
+                            }
+                        ],
+                        "unique_index": "/div[7]/a[2]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 1,
+                        "contentType": 0,
+                        "relative": true,
+                        "name": "参数21_链接文本",
+                        "desc": "",
+                        "relativeXPath": "/div[7]/a[3]",
+                        "allXPaths": [
+                            "/div[7]/a[3]",
+                            "//a[contains(., '加入购物车')]",
+                            "//A[@class='p-o-btn addcart']",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-59]/div/div[last()-1]/a"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 0,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 1,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 2,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 3,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 4,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 5,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 6,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 7,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 8,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 9,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 10,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 11,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 12,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 13,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 14,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 15,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 16,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 17,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 18,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 19,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 20,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 21,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 22,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 23,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 24,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 25,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 26,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 27,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 28,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 29,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 30,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 31,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 32,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 33,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 34,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 35,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 36,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 37,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 38,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 39,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 40,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 41,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 42,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 43,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 44,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 45,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 46,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 47,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 48,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 49,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 50,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 51,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 52,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 53,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 54,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 55,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 56,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 57,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 58,
+                                "value": "加入购物车"
+                            },
+                            {
+                                "num": 59,
+                                "value": "加入购物车"
+                            }
+                        ],
+                        "unique_index": "/div[7]/a[3]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 2,
+                        "contentType": 0,
+                        "relative": true,
+                        "name": "参数22_链接地址",
+                        "desc": "",
+                        "relativeXPath": "/div[7]/a[3]",
+                        "allXPaths": [
+                            "/div[7]/a[3]",
+                            "//a[contains(., '加入购物车')]",
+                            "//A[@class='p-o-btn addcart']",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-59]/div/div[last()-1]/a"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 0,
+                                "value": "//cart.jd.com/gate.action?pid=66144896261&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 1,
+                                "value": "//cart.jd.com/gate.action?pid=66144896265&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 2,
+                                "value": "//cart.jd.com/gate.action?pid=66144896264&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 3,
+                                "value": "//cart.jd.com/gate.action?pid=10033531851583&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 4,
+                                "value": "//cart.jd.com/gate.action?pid=10033531851582&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 5,
+                                "value": "//cart.jd.com/gate.action?pid=10066088622463&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 6,
+                                "value": "//cart.jd.com/gate.action?pid=10035712182850&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 7,
+                                "value": "//cart.jd.com/gate.action?pid=10071785826677&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 8,
+                                "value": "//cart.jd.com/gate.action?pid=10077849739040&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 9,
+                                "value": "//cart.jd.com/gate.action?pid=10033531851584&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 10,
+                                "value": "//cart.jd.com/gate.action?pid=10040733503774&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 11,
+                                "value": "//cart.jd.com/gate.action?pid=10071785826674&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 12,
+                                "value": "//cart.jd.com/gate.action?pid=10071785826678&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 13,
+                                "value": "//cart.jd.com/gate.action?pid=10071785826682&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 14,
+                                "value": "//cart.jd.com/gate.action?pid=10071785826684&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 15,
+                                "value": "//cart.jd.com/gate.action?pid=10051994751480&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 16,
+                                "value": "//cart.jd.com/gate.action?pid=10071785826675&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 17,
+                                "value": "//cart.jd.com/gate.action?pid=10071785826676&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 18,
+                                "value": "//cart.jd.com/gate.action?pid=10071785826679&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 19,
+                                "value": "//cart.jd.com/gate.action?pid=10071785826680&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 20,
+                                "value": "//cart.jd.com/gate.action?pid=10071785826683&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 21,
+                                "value": "//cart.jd.com/gate.action?pid=10045335421289&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 22,
+                                "value": "//cart.jd.com/gate.action?pid=11773766494&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 23,
+                                "value": "//cart.jd.com/gate.action?pid=10076458552994&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 24,
+                                "value": "//cart.jd.com/gate.action?pid=10074614929614&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 25,
+                                "value": "//cart.jd.com/gate.action?pid=10074614929616&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 26,
+                                "value": "//cart.jd.com/gate.action?pid=10074614929617&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 27,
+                                "value": "//cart.jd.com/gate.action?pid=10075117517846&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 28,
+                                "value": "//cart.jd.com/gate.action?pid=10076750833807&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 29,
+                                "value": "//cart.jd.com/gate.action?pid=10074629310807&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 30,
+                                "value": "//cart.jd.com/gate.action?pid=10074629310808&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 31,
+                                "value": "//cart.jd.com/gate.action?pid=10078155456003&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 32,
+                                "value": "//cart.jd.com/gate.action?pid=10078155456005&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 33,
+                                "value": "//cart.jd.com/gate.action?pid=10077222703036&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 34,
+                                "value": "//cart.jd.com/gate.action?pid=10078407670547&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 35,
+                                "value": "//cart.jd.com/gate.action?pid=10078407670550&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 36,
+                                "value": "//cart.jd.com/gate.action?pid=10077634039065&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 37,
+                                "value": "//cart.jd.com/gate.action?pid=10077634039066&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 38,
+                                "value": "//cart.jd.com/gate.action?pid=10076384967007&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 39,
+                                "value": "//cart.jd.com/gate.action?pid=10077727026633&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 40,
+                                "value": "//cart.jd.com/gate.action?pid=10077045237658&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 41,
+                                "value": "//cart.jd.com/gate.action?pid=10074028982993&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 42,
+                                "value": "//cart.jd.com/gate.action?pid=10074028982998&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 43,
+                                "value": "//cart.jd.com/gate.action?pid=10074028982999&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 44,
+                                "value": "//cart.jd.com/gate.action?pid=10074028983001&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 45,
+                                "value": "//cart.jd.com/gate.action?pid=10074028983003&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 46,
+                                "value": "//cart.jd.com/gate.action?pid=10074028983005&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 47,
+                                "value": "//cart.jd.com/gate.action?pid=10074028983006&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 48,
+                                "value": "//cart.jd.com/gate.action?pid=13256317&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 49,
+                                "value": "//cart.jd.com/gate.action?pid=12830944&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 50,
+                                "value": "//cart.jd.com/gate.action?pid=10069471945735&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 51,
+                                "value": "//cart.jd.com/gate.action?pid=10065743084711&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 52,
+                                "value": "//cart.jd.com/gate.action?pid=10057275997475&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 53,
+                                "value": "//cart.jd.com/gate.action?pid=100040241781&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 54,
+                                "value": "//cart.jd.com/gate.action?pid=11793245&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 55,
+                                "value": "//cart.jd.com/gate.action?pid=10043774573916&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 56,
+                                "value": "//cart.jd.com/gate.action?pid=57633600735&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 57,
+                                "value": "//cart.jd.com/gate.action?pid=100049147902&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 58,
+                                "value": "//cart.jd.com/gate.action?pid=12682998&pcount=1&ptype=1"
+                            },
+                            {
+                                "num": 59,
+                                "value": "//cart.jd.com/gate.action?pid=100046068385&pcount=1&ptype=1"
+                            }
+                        ],
+                        "unique_index": "/div[7]/a[3]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 0,
+                        "contentType": 1,
+                        "relative": true,
+                        "name": "参数23_文本",
+                        "desc": "",
+                        "relativeXPath": "/div[1]/a[1]/div[1]/div[1]",
+                        "allXPaths": [
+                            "/div[1]/a[1]/div[1]/div[1]",
+                            "//div[contains(., '毕业租房季每满200')]",
+                            "//DIV[@class='sign-title ac']",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-56]/div/div[last()-7]/a/div/div"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 3,
+                                "value": "毕业租房季每满200减30"
+                            },
+                            {
+                                "num": 4,
+                                "value": "毕业租房季每满200减30"
+                            },
+                            {
+                                "num": 6,
+                                "value": "毕业租房季每满200减30"
+                            },
+                            {
+                                "num": 9,
+                                "value": "毕业租房季每满200减30"
+                            },
+                            {
+                                "num": 15,
+                                "value": "全店每满199立减30元"
+                            },
+                            {
+                                "num": 33,
+                                "value": "1件9.0折"
+                            },
+                            {
+                                "num": 50,
+                                "value": "满10元减1元"
+                            },
+                            {
+                                "num": 52,
+                                "value": "3件8.5折"
+                            },
+                            {
+                                "num": 59,
+                                "value": "毕业租房季每满200减30"
+                            }
+                        ],
+                        "unique_index": "/div[1]/a[1]/div[1]/div[1]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 0,
+                        "contentType": 1,
+                        "relative": true,
+                        "name": "参数24_文本",
+                        "desc": "",
+                        "relativeXPath": "/div[1]/a[1]/div[1]/div[1]/span[1]",
+                        "allXPaths": [
+                            "/div[1]/a[1]/div[1]/div[1]/span[1]",
+                            "//span[contains(., '7.1-7.3')]",
+                            "//SPAN[@class='sign-date']",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-56]/div/div[last()-7]/a/div/div/span"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 3,
+                                "value": "7.1-7.3"
+                            },
+                            {
+                                "num": 4,
+                                "value": "7.1-7.3"
+                            },
+                            {
+                                "num": 6,
+                                "value": "7.1-7.3"
+                            },
+                            {
+                                "num": 9,
+                                "value": "7.1-7.3"
+                            },
+                            {
+                                "num": 15,
+                                "value": "7.1-7.3"
+                            },
+                            {
+                                "num": 33,
+                                "value": "7.1-8.1"
+                            },
+                            {
+                                "num": 50,
+                                "value": "6.26-7.5"
+                            },
+                            {
+                                "num": 52,
+                                "value": "6.30-7.31"
+                            },
+                            {
+                                "num": 59,
+                                "value": "7.1-7.3"
+                            }
+                        ],
+                        "unique_index": "/div[1]/a[1]/div[1]/div[1]/span[1]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 0,
+                        "contentType": 1,
+                        "relative": true,
+                        "name": "参数25_文本",
+                        "desc": "",
+                        "relativeXPath": "/div[6]/i[1]",
+                        "allXPaths": [
+                            "/div[6]/i[1]",
+                            "//i[contains(., '放心购')]",
+                            "//I[@class='goods-icons4 J-picon-tips']",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-56]/div/div[last()-2]/i[last()-2]"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 3,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 4,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 5,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 6,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 9,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 10,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 15,
+                                "value": "券2000-100"
+                            },
+                            {
+                                "num": 21,
+                                "value": "京东物流"
+                            },
+                            {
+                                "num": 22,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 23,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 24,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 25,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 26,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 27,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 28,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 29,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 30,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 31,
+                                "value": "券5000-300"
+                            },
+                            {
+                                "num": 32,
+                                "value": "券5000-300"
+                            },
+                            {
+                                "num": 33,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 36,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 37,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 38,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 39,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 40,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 41,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 42,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 43,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 44,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 45,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 46,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 47,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 48,
+                                "value": "自营"
+                            },
+                            {
+                                "num": 49,
+                                "value": "自营"
+                            },
+                            {
+                                "num": 51,
+                                "value": "京东物流"
+                            },
+                            {
+                                "num": 53,
+                                "value": "自营"
+                            },
+                            {
+                                "num": 54,
+                                "value": "自营"
+                            },
+                            {
+                                "num": 55,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 56,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 57,
+                                "value": "自营"
+                            },
+                            {
+                                "num": 58,
+                                "value": "自营"
+                            },
+                            {
+                                "num": 59,
+                                "value": "自营"
+                            }
+                        ],
+                        "unique_index": "/div[6]/i[1]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 0,
+                        "contentType": 1,
+                        "relative": true,
+                        "name": "参数26_文本",
+                        "desc": "",
+                        "relativeXPath": "/div[6]/i[2]",
+                        "allXPaths": [
+                            "/div[6]/i[2]",
+                            "//i[contains(., '免邮')]",
+                            "//I[@class='goods-icons4 J-picon-tips']",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-56]/div/div[last()-2]/i[last()-1]"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 3,
+                                "value": "免邮"
+                            },
+                            {
+                                "num": 4,
+                                "value": "免邮"
+                            },
+                            {
+                                "num": 5,
+                                "value": "免邮"
+                            },
+                            {
+                                "num": 6,
+                                "value": "免邮"
+                            },
+                            {
+                                "num": 9,
+                                "value": "免邮"
+                            },
+                            {
+                                "num": 10,
+                                "value": "免邮"
+                            },
+                            {
+                                "num": 21,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 22,
+                                "value": "免邮"
+                            },
+                            {
+                                "num": 23,
+                                "value": "新品"
+                            },
+                            {
+                                "num": 24,
+                                "value": "新品"
+                            },
+                            {
+                                "num": 25,
+                                "value": "新品"
+                            },
+                            {
+                                "num": 26,
+                                "value": "新品"
+                            },
+                            {
+                                "num": 27,
+                                "value": "新品"
+                            },
+                            {
+                                "num": 28,
+                                "value": "新品"
+                            },
+                            {
+                                "num": 29,
+                                "value": "新品"
+                            },
+                            {
+                                "num": 30,
+                                "value": "新品"
+                            },
+                            {
+                                "num": 31,
+                                "value": "满800-35"
+                            },
+                            {
+                                "num": 32,
+                                "value": "满800-35"
+                            },
+                            {
+                                "num": 33,
+                                "value": "新品"
+                            },
+                            {
+                                "num": 36,
+                                "value": "每满200-20"
+                            },
+                            {
+                                "num": 37,
+                                "value": "每满200-20"
+                            },
+                            {
+                                "num": 38,
+                                "value": "新品"
+                            },
+                            {
+                                "num": 39,
+                                "value": "新品"
+                            },
+                            {
+                                "num": 40,
+                                "value": "新品"
+                            },
+                            {
+                                "num": 48,
+                                "value": "每满100-50"
+                            },
+                            {
+                                "num": 51,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 53,
+                                "value": "放心购"
+                            },
+                            {
+                                "num": 55,
+                                "value": "免邮"
+                            },
+                            {
+                                "num": 56,
+                                "value": "券59-5"
+                            },
+                            {
+                                "num": 57,
+                                "value": "1件8折"
+                            },
+                            {
+                                "num": 58,
+                                "value": "券100-30"
+                            }
+                        ],
+                        "unique_index": "/div[6]/i[2]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 0,
+                        "contentType": 1,
+                        "relative": true,
+                        "name": "参数27_文本",
+                        "desc": "",
+                        "relativeXPath": "/div[6]/i[3]",
+                        "allXPaths": [
+                            "/div[6]/i[3]",
+                            "//i[contains(., '券300-20')]",
+                            "//I[@class='goods-icons4 J-picon-tips']",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-56]/div/div[last()-2]/i"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 3,
+                                "value": "券300-20"
+                            },
+                            {
+                                "num": 4,
+                                "value": "券300-20"
+                            },
+                            {
+                                "num": 6,
+                                "value": "券300-20"
+                            },
+                            {
+                                "num": 9,
+                                "value": "券300-20"
+                            },
+                            {
+                                "num": 21,
+                                "value": "赠"
+                            },
+                            {
+                                "num": 22,
+                                "value": "券200-10"
+                            },
+                            {
+                                "num": 23,
+                                "value": "券7999-300"
+                            },
+                            {
+                                "num": 24,
+                                "value": "免邮"
+                            },
+                            {
+                                "num": 25,
+                                "value": "免邮"
+                            },
+                            {
+                                "num": 26,
+                                "value": "免邮"
+                            },
+                            {
+                                "num": 27,
+                                "value": "免邮"
+                            },
+                            {
+                                "num": 29,
+                                "value": "免邮"
+                            },
+                            {
+                                "num": 30,
+                                "value": "免邮"
+                            },
+                            {
+                                "num": 33,
+                                "value": "免邮"
+                            },
+                            {
+                                "num": 38,
+                                "value": "券300-20"
+                            },
+                            {
+                                "num": 39,
+                                "value": "券99-10"
+                            },
+                            {
+                                "num": 51,
+                                "value": "免邮"
+                            }
+                        ],
+                        "unique_index": "/div[6]/i[3]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 0,
+                        "contentType": 1,
+                        "relative": true,
+                        "name": "参数28_文本",
+                        "desc": "",
+                        "relativeXPath": "/div[3]/a[1]/em[1]/span[1]",
+                        "allXPaths": [
+                            "/div[3]/a[1]/em[1]/span[1]",
+                            "//span[contains(., '爱心东东')]",
+                            "//SPAN[@class='p-tag']",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-52]/div/div[last()-5]/a/em/span"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 7,
+                                "value": "爱心东东"
+                            },
+                            {
+                                "num": 11,
+                                "value": "爱心东东"
+                            },
+                            {
+                                "num": 12,
+                                "value": "爱心东东"
+                            },
+                            {
+                                "num": 13,
+                                "value": "爱心东东"
+                            },
+                            {
+                                "num": 14,
+                                "value": "爱心东东"
+                            },
+                            {
+                                "num": 16,
+                                "value": "爱心东东"
+                            },
+                            {
+                                "num": 17,
+                                "value": "爱心东东"
+                            },
+                            {
+                                "num": 18,
+                                "value": "爱心东东"
+                            },
+                            {
+                                "num": 19,
+                                "value": "爱心东东"
+                            },
+                            {
+                                "num": 20,
+                                "value": "爱心东东"
+                            }
+                        ],
+                        "unique_index": "/div[3]/a[1]/em[1]/span[1]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 0,
+                        "contentType": 1,
+                        "relative": true,
+                        "name": "参数29_文本",
+                        "desc": "",
+                        "relativeXPath": "/div[6]/i[4]",
+                        "allXPaths": [
+                            "/div[6]/i[4]",
+                            "//i[contains(., '赠')]",
+                            "//I[@class='goods-icons4 J-picon-tips']",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-37]/div/div[last()-2]/i"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 22,
+                                "value": "赠"
+                            },
+                            {
+                                "num": 23,
+                                "value": "满100-7"
+                            },
+                            {
+                                "num": 24,
+                                "value": "券99-6"
+                            },
+                            {
+                                "num": 25,
+                                "value": "券99-6"
+                            },
+                            {
+                                "num": 26,
+                                "value": "券99-6"
+                            },
+                            {
+                                "num": 27,
+                                "value": "券300-20"
+                            },
+                            {
+                                "num": 29,
+                                "value": "券99-6"
+                            },
+                            {
+                                "num": 30,
+                                "value": "券99-6"
+                            },
+                            {
+                                "num": 39,
+                                "value": "满50-1"
+                            }
+                        ],
+                        "unique_index": "/div[6]/i[4]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 0,
+                        "contentType": 1,
+                        "relative": true,
+                        "name": "参数30_文本",
+                        "desc": "",
+                        "relativeXPath": "/div[6]/i[5]",
+                        "allXPaths": [
+                            "/div[6]/i[5]",
+                            "//i[contains(., '满288-8')]",
+                            "//I[@class='goods-icons4 J-picon-tips']",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-35]/div/div[last()-2]/i[last()-1]"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 24,
+                                "value": "满288-8"
+                            },
+                            {
+                                "num": 25,
+                                "value": "满288-8"
+                            },
+                            {
+                                "num": 26,
+                                "value": "满288-8"
+                            },
+                            {
+                                "num": 29,
+                                "value": "满288-8"
+                            },
+                            {
+                                "num": 30,
+                                "value": "满288-8"
+                            },
+                            {
+                                "num": 39,
+                                "value": "赠"
+                            }
+                        ],
+                        "unique_index": "/div[6]/i[5]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 0,
+                        "contentType": 1,
+                        "relative": true,
+                        "name": "参数31_文本",
+                        "desc": "",
+                        "relativeXPath": "/div[6]/i[6]",
+                        "allXPaths": [
+                            "/div[6]/i[6]",
+                            "//i[contains(., '赠')]",
+                            "//I[@class='goods-icons4 J-picon-tips']",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-35]/div/div[last()-2]/i"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 24,
+                                "value": "赠"
+                            },
+                            {
+                                "num": 25,
+                                "value": "赠"
+                            },
+                            {
+                                "num": 26,
+                                "value": "赠"
+                            },
+                            {
+                                "num": 29,
+                                "value": "赠"
+                            },
+                            {
+                                "num": 30,
+                                "value": "赠"
+                            }
+                        ],
+                        "unique_index": "/div[6]/i[6]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 4,
+                        "contentType": 1,
+                        "relative": true,
+                        "name": "参数32_图片地址",
+                        "desc": "",
+                        "relativeXPath": "/div[3]/a[1]/em[1]/img[1]",
+                        "allXPaths": [
+                            "/div[3]/a[1]/em[1]/img[1]",
+                            "//img[contains(., '')]",
+                            "//IMG[@class='p-tag3']",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-11]/div/div[last()-5]/a/em/img"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 48,
+                                "value": "//m.360buyimg.com/cc/jfs/t1/113659/27/28361/2962/62ecb1f0E6c5fc50c/b914680e87a2c8e9.png"
+                            },
+                            {
+                                "num": 49,
+                                "value": "//m.360buyimg.com/cc/jfs/t1/113659/27/28361/2962/62ecb1f0E6c5fc50c/b914680e87a2c8e9.png"
+                            },
+                            {
+                                "num": 53,
+                                "value": "//m.360buyimg.com/cc/jfs/t1/113659/27/28361/2962/62ecb1f0E6c5fc50c/b914680e87a2c8e9.png"
+                            },
+                            {
+                                "num": 54,
+                                "value": "//m.360buyimg.com/cc/jfs/t1/113659/27/28361/2962/62ecb1f0E6c5fc50c/b914680e87a2c8e9.png"
+                            },
+                            {
+                                "num": 57,
+                                "value": "//m.360buyimg.com/cc/jfs/t1/113659/27/28361/2962/62ecb1f0E6c5fc50c/b914680e87a2c8e9.png"
+                            }
+                        ],
+                        "unique_index": "/div[3]/a[1]/em[1]/img[1]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    },
+                    {
+                        "nodeType": 0,
+                        "contentType": 1,
+                        "relative": true,
+                        "name": "参数33_文本",
+                        "desc": "",
+                        "relativeXPath": "/div[3]/a[1]/em[1]/font[2]",
+                        "allXPaths": [
+                            "/div[3]/a[1]/em[1]/font[2]",
+                            "//font[contains(., '...')]",
+                            "//FONT[@class='dot']",
+                            "/html/body/div[last()-11]/div/div/div[last()-1]/div/div[last()-1]/ul/li[last()-9]/div/div[last()-5]/a/em/font"
+                        ],
+                        "exampleValues": [
+                            {
+                                "num": 50,
+                                "value": "..."
+                            },
+                            {
+                                "num": 56,
+                                "value": "..."
+                            }
+                        ],
+                        "unique_index": "/div[3]/a[1]/em[1]/font[2]",
+                        "default": "",
+                        "beforeJS": "",
+                        "beforeJSWaitTime": 0,
+                        "JS": "",
+                        "JSWaitTime": 0,
+                        "afterJS": "",
+                        "afterJSWaitTime": 0,
+                        "downloadPic": 0
+                    }
+                ],
+                "loopType": 1
+            }
+        }
+    ]
+}

+ 1 - 0
ElectronJS/clean_and_release_win32.cmd

@@ -9,6 +9,7 @@ rmdir /s /q out\EasySpider\resources\app\user_data
 rmdir /s /q ..\.temp_to_pub\EasySpider_windows_x86\EasySpider
 del out\EasySpider\resources\app\vs_BuildTools.exe
 move out\EasySpider ..\.temp_to_pub\EasySpider_windows_x86\EasySpider
+copy ..\ExecuteStage\easyspider_executestage.py ..\.temp_to_pub\EasySpider_windows_x86
 rmdir /s /q ..\.temp_to_pub\EasySpider_windows_x86\user_data
 rmdir /s /q ..\.temp_to_pub\EasySpider_windows_x86\execution_instances
 mkdir ..\.temp_to_pub\EasySpider_windows_x86\execution_instances

+ 1 - 0
ElectronJS/clean_and_release_win64.cmd

@@ -9,6 +9,7 @@ rmdir /s /q out\EasySpider\resources\app\execution_instances
 rmdir /s /q ..\.temp_to_pub\EasySpider_windows_x64\EasySpider
 del out\EasySpider\resources\app\vs_BuildTools.exe
 move out\EasySpider ..\.temp_to_pub\EasySpider_windows_x64\EasySpider
+copy ..\ExecuteStage\easyspider_executestage.py ..\.temp_to_pub\EasySpider_windows_x64
 rmdir /s /q ..\.temp_to_pub\EasySpider_windows_x64\user_data
 rmdir /s /q ..\.temp_to_pub\EasySpider_windows_x64\execution_instances
 mkdir ..\.temp_to_pub\EasySpider_windows_x64\execution_instances

+ 18 - 6
ElectronJS/main.js

@@ -309,7 +309,7 @@ wss.on('connection', function (ws) {
 
 console.log(process.platform);
 
-async function runBrowser(lang = "en", user_data_folder = '') {
+async function runBrowser(lang = "en", user_data_folder = '', mobile = false) {
     const serviceBuilder = new ServiceBuilder(driverPath);
     let options = new chrome.Options();
     options.addArguments('--disable-blink-features=AutomationControlled');
@@ -329,6 +329,13 @@ async function runBrowser(lang = "en", user_data_folder = '') {
         config.user_data_folder = user_data_folder;
         fs.writeFileSync(path.join(task_server.getDir(), "config.json"), JSON.stringify(config));
     }
+    if (mobile) {
+        const mobileEmulation = {
+            deviceName: 'iPhone XR'
+        };
+        options.addArguments(`--user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 13_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"`);
+        options.setMobileEmulation(mobileEmulation);
+    }
     driver = new Builder()
         .forBrowser('chrome')
         .setChromeOptions(options)
@@ -343,7 +350,12 @@ async function runBrowser(lang = "en", user_data_folder = '') {
         source: stealth,
     });
     try {
-        await driver.get(server_address + "/taskGrid/taskList.html?wsport=" + websocket_port + "&backEndAddressServiceWrapper=" + server_address + "&lang=" + lang);
+        if(mobile){
+            await driver.get(server_address + "/taskGrid/taskList.html?wsport=" + websocket_port + "&backEndAddressServiceWrapper=" + server_address + "&mobile=1&lang=" + lang);
+        } else {
+            await driver.get(server_address + "/taskGrid/taskList.html?wsport=" + websocket_port + "&backEndAddressServiceWrapper=" + server_address + "&lang=" + lang);
+        }
+
         old_handles = await driver.getAllWindowHandles();
         current_handle = old_handles[old_handles.length - 1];
     } finally {
@@ -351,10 +363,10 @@ async function runBrowser(lang = "en", user_data_folder = '') {
     }
 }
 
-function handleOpenBrowser(event, lang = "en", user_data_folder = "") {
+function handleOpenBrowser(event, lang = "en", user_data_folder = "", mobile = false) {
     const webContents = event.sender;
     const win = BrowserWindow.fromWebContents(webContents);
-    runBrowser(lang, user_data_folder);
+    runBrowser(lang, user_data_folder, mobile);
     let size = screen.getPrimaryDisplay().workAreaSize;
     let width = parseInt(size.width);
     let height = parseInt(size.height * 0.6);
@@ -368,9 +380,9 @@ function handleOpenBrowser(event, lang = "en", user_data_folder = "") {
     let url = "";
     let id = -1;
     if (lang == "en") {
-        url = server_address + `/taskGrid/FlowChart.html?id=${id}&wsport=${websocket_port}&backEndAddressServiceWrapper=` + server_address;
+        url = server_address + `/taskGrid/FlowChart.html?id=${id}&wsport=${websocket_port}&backEndAddressServiceWrapper=` + server_address + "&mobile=" + mobile.toString();
     } else if (lang == "zh") {
-        url = server_address + `/taskGrid/FlowChart_CN.html?id=${id}&wsport=${websocket_port}&backEndAddressServiceWrapper=` + server_address;
+        url = server_address + `/taskGrid/FlowChart_CN.html?id=${id}&wsport=${websocket_port}&backEndAddressServiceWrapper=` + server_address+ "&mobile=" + mobile.toString();
     }
     // and load the index.html of the app.
     flowchart_window.loadURL(url);

+ 5492 - 5702
ElectronJS/package-lock.json

@@ -1,5706 +1,5496 @@
 {
-  "name": "easy-spider",
-  "version": "0.3.3",
-  "lockfileVersion": 3,
-  "requires": true,
-  "packages": {
-    "": {
-      "name": "easy-spider",
-      "version": "0.3.3",
-      "license": "GPL-3.0",
-      "dependencies": {
-        "electron-squirrel-startup": "^1.0.0",
-        "http": "^0.0.1-security",
-        "node-window-manager": "^2.2.4",
-        "selenium-webdriver": "^4.8.0",
-        "ws": "^8.12.0"
-      },
-      "devDependencies": {
-        "@electron-forge/cli": "^6.0.5",
-        "@electron-forge/maker-deb": "^6.0.5",
-        "@electron-forge/maker-rpm": "^6.0.5",
-        "@electron-forge/maker-squirrel": "^6.0.5",
-        "@electron-forge/maker-zip": "^6.0.5",
-        "electron": "^20.0.1"
-      }
-    },
-    "node_modules/@electron-forge/cli": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-6.0.5.tgz",
-      "integrity": "sha512-3xD4XKyV634cQCR8HobpVnb4LqVdTHDs+KwsU9zgjaBIJMBapCS3ZzpXYbxzPekTaVwu39ojMUg990JVYBhs2A==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://github.com/sponsors/malept"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/subscription/pkg/npm-.electron-forge-cli?utm_medium=referral&utm_source=npm_fund"
-        }
-      ],
-      "dependencies": {
-        "@electron-forge/core": "6.0.5",
-        "@electron-forge/shared-types": "6.0.5",
-        "@electron/get": "^2.0.0",
-        "chalk": "^4.0.0",
-        "commander": "^4.1.1",
-        "debug": "^4.3.1",
-        "fs-extra": "^10.0.0",
-        "listr2": "^5.0.3",
-        "semver": "^7.2.1"
-      },
-      "bin": {
-        "electron-forge": "dist/electron-forge.js",
-        "electron-forge-vscode-nix": "script/vscode.sh",
-        "electron-forge-vscode-win": "script/vscode.cmd"
-      },
-      "engines": {
-        "node": ">= 14.17.5"
-      }
-    },
-    "node_modules/@electron-forge/core": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-6.0.5.tgz",
-      "integrity": "sha512-lMtm3x2ZFEBOU7/JTIo2oI5dXm2hKqpdc4opHA7iOxja5YYDDvnqKt+tACJSCdnCOxYLS+0OSoaz/DJ8SNyStw==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://github.com/sponsors/malept"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/subscription/pkg/npm-.electron-forge-core?utm_medium=referral&utm_source=npm_fund"
-        }
-      ],
-      "dependencies": {
-        "@electron-forge/core-utils": "6.0.5",
-        "@electron-forge/maker-base": "6.0.5",
-        "@electron-forge/plugin-base": "6.0.5",
-        "@electron-forge/publisher-base": "6.0.5",
-        "@electron-forge/shared-types": "6.0.5",
-        "@electron-forge/template-base": "6.0.5",
-        "@electron-forge/template-webpack": "6.0.5",
-        "@electron-forge/template-webpack-typescript": "6.0.5",
-        "@electron/get": "^2.0.0",
-        "@electron/rebuild": "^3.2.10",
-        "@malept/cross-spawn-promise": "^2.0.0",
-        "chalk": "^4.0.0",
-        "debug": "^4.3.1",
-        "electron-packager": "^17.1.1",
-        "fast-glob": "^3.2.7",
-        "filenamify": "^4.1.0",
-        "find-up": "^5.0.0",
-        "fs-extra": "^10.0.0",
-        "got": "^11.8.5",
-        "interpret": "^3.1.1",
-        "listr2": "^5.0.3",
-        "lodash": "^4.17.20",
-        "log-symbols": "^4.0.0",
-        "node-fetch": "^2.6.7",
-        "progress": "^2.0.3",
-        "rechoir": "^0.8.0",
-        "resolve-package": "^1.0.1",
-        "semver": "^7.2.1",
-        "source-map-support": "^0.5.13",
-        "sudo-prompt": "^9.1.1",
-        "username": "^5.1.0",
-        "yarn-or-npm": "^3.0.1"
-      },
-      "engines": {
-        "node": ">= 14.17.5"
-      }
-    },
-    "node_modules/@electron-forge/core-utils": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/@electron-forge/core-utils/-/core-utils-6.0.5.tgz",
-      "integrity": "sha512-KCxTQOGRGITUwdxMu63xFn4SkuBE6Fvn188MjZHyztAHimiKBWdNGBrBHgjR2WyYTziT8y6JXcAntAW5d+jYHQ==",
-      "dev": true,
-      "dependencies": {
-        "@electron-forge/shared-types": "6.0.5",
-        "@electron/rebuild": "^3.2.10",
-        "@malept/cross-spawn-promise": "^2.0.0",
-        "chalk": "^4.0.0",
-        "debug": "^4.3.1",
-        "find-up": "^5.0.0",
-        "fs-extra": "^10.0.0",
-        "log-symbols": "^4.0.0",
-        "semver": "^7.2.1",
-        "yarn-or-npm": "^3.0.1"
-      },
-      "engines": {
-        "node": ">= 14.17.5"
-      }
-    },
-    "node_modules/@electron-forge/maker-base": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-6.0.5.tgz",
-      "integrity": "sha512-m3xS/Gd2XlYUjXO4o8bxZEcwN9AulMDjuIzq68FRH5VB1vuESJKtVZjSa331IjaA+0aRXbSCa108FLy8g5Qlaw==",
-      "dev": true,
-      "dependencies": {
-        "@electron-forge/shared-types": "6.0.5",
-        "fs-extra": "^10.0.0",
-        "which": "^2.0.2"
-      },
-      "engines": {
-        "node": ">= 14.17.5"
-      }
-    },
-    "node_modules/@electron-forge/maker-deb": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-6.0.5.tgz",
-      "integrity": "sha512-uaDxBeLhJcrySnPGPEZbGwJG7qeiBE05+rdkPpsfHzsTBYca1abQ2Ll66R5EmOrosIZv60OUt1eGyxOrWlo1+w==",
-      "dev": true,
-      "dependencies": {
-        "@electron-forge/maker-base": "6.0.5",
-        "@electron-forge/shared-types": "6.0.5"
-      },
-      "engines": {
-        "node": ">= 14.17.5"
-      },
-      "optionalDependencies": {
-        "electron-installer-debian": "^3.0.0"
-      }
-    },
-    "node_modules/@electron-forge/maker-rpm": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/@electron-forge/maker-rpm/-/maker-rpm-6.0.5.tgz",
-      "integrity": "sha512-qwrTMo8kBf6fsPi6S22qCvD5F2OeJ8F4c0vuHi9YCUoPVjU3wBsvxi+lJclkdTqgzRWidfZ1vsbltcOSZb+2fw==",
-      "dev": true,
-      "dependencies": {
-        "@electron-forge/maker-base": "6.0.5",
-        "@electron-forge/shared-types": "6.0.5"
-      },
-      "engines": {
-        "node": ">= 14.17.5"
-      },
-      "optionalDependencies": {
-        "electron-installer-redhat": "^3.2.0"
-      }
-    },
-    "node_modules/@electron-forge/maker-squirrel": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-6.0.5.tgz",
-      "integrity": "sha512-moP4OIytJlqxx3J7UCWrOv04tepjQIzK9RdzK4m9jfjPAxZtRObesFGXr/jLO18NHXk7fDcbYLf3sTIfaPU6jg==",
-      "dev": true,
-      "dependencies": {
-        "@electron-forge/maker-base": "6.0.5",
-        "@electron-forge/shared-types": "6.0.5",
-        "fs-extra": "^10.0.0"
-      },
-      "engines": {
-        "node": ">= 14.17.5"
-      },
-      "optionalDependencies": {
-        "electron-winstaller": "^5.0.0"
-      }
-    },
-    "node_modules/@electron-forge/maker-zip": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-6.0.5.tgz",
-      "integrity": "sha512-Yg256nGQUWT35EZyRIALpgtdM8WSvgZc0O4aA6Wy0S6ektaxyM2a+tO2ug/Vl+RgYA6oIeAADfkU2RxLiGnhbA==",
-      "dev": true,
-      "dependencies": {
-        "@electron-forge/maker-base": "6.0.5",
-        "@electron-forge/shared-types": "6.0.5",
-        "cross-zip": "^4.0.0",
-        "fs-extra": "^10.0.0"
-      },
-      "engines": {
-        "node": ">= 14.17.5"
-      }
-    },
-    "node_modules/@electron-forge/plugin-base": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-6.0.5.tgz",
-      "integrity": "sha512-Q2ywNq6Qzb9K1W59qzbJvI+NZaDPrHz7iq9W8UfyHoEDYLJsD368PzHtNaQFJx+ofZNgsSpukXoL9mGvN1lVbA==",
-      "dev": true,
-      "dependencies": {
-        "@electron-forge/shared-types": "6.0.5"
-      },
-      "engines": {
-        "node": ">= 14.17.5"
-      }
-    },
-    "node_modules/@electron-forge/publisher-base": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-6.0.5.tgz",
-      "integrity": "sha512-gwOaMC3RKPO1mq3dqP9ko8kJptO41XU+I+pM66W/wvCNIQzisFCqrsx3d8A9RWsMJug0I1xNsYdBt99j1/2haA==",
-      "dev": true,
-      "dependencies": {
-        "@electron-forge/shared-types": "6.0.5"
-      },
-      "engines": {
-        "node": ">= 14.17.5"
-      }
-    },
-    "node_modules/@electron-forge/shared-types": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.0.5.tgz",
-      "integrity": "sha512-FrJI11afw/Cxk0JwgWyKg9aPoHOdmMi4JHTY6pnmi95MjarQ1d0SIqKJUzX7q2lXPUAxqPKA2Wmykg6F2CThlg==",
-      "dev": true,
-      "dependencies": {
-        "@electron/rebuild": "^3.2.10",
-        "electron-packager": "^17.1.1",
-        "listr2": "^5.0.3"
-      },
-      "engines": {
-        "node": ">= 14.17.5"
-      }
-    },
-    "node_modules/@electron-forge/template-base": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-6.0.5.tgz",
-      "integrity": "sha512-/3nOKPltnL8nVdZS2EpnKx1VMBqgLjW8TLRt8vtc+WdHtCVJBiU1Pt0JxTYDM3Raq/CclWGqVFb1svqorAon7Q==",
-      "dev": true,
-      "dependencies": {
-        "@electron-forge/shared-types": "6.0.5",
-        "@malept/cross-spawn-promise": "^2.0.0",
-        "debug": "^4.3.1",
-        "fs-extra": "^10.0.0",
-        "username": "^5.1.0"
-      },
-      "engines": {
-        "node": ">= 14.17.5"
-      }
-    },
-    "node_modules/@electron-forge/template-webpack": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-6.0.5.tgz",
-      "integrity": "sha512-fDINYYCJ3D8rMYgS5tTHhgC8d73pRpQKtyBCQFC9KkfdNMYJr9MPZeep5pYQqrOMjSgBpgaYSBL9Unsa5I1F2g==",
-      "dev": true,
-      "dependencies": {
-        "@electron-forge/shared-types": "6.0.5",
-        "@electron-forge/template-base": "6.0.5",
-        "fs-extra": "^10.0.0"
-      },
-      "engines": {
-        "node": ">= 14.17.5"
-      }
-    },
-    "node_modules/@electron-forge/template-webpack-typescript": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-6.0.5.tgz",
-      "integrity": "sha512-YjKVszYRT4S3Sw3AOEpJokU7KPpmr0HWuO14+WHMO0FhQ1gaTMfPoz6QRHg0F1Ulz73mm6b3MLb9ID5igZv7Mw==",
-      "dev": true,
-      "dependencies": {
-        "@electron-forge/shared-types": "6.0.5",
-        "@electron-forge/template-base": "6.0.5",
-        "fs-extra": "^10.0.0"
-      },
-      "engines": {
-        "node": ">= 14.17.5"
-      }
-    },
-    "node_modules/@electron/asar": {
-      "version": "3.2.3",
-      "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.3.tgz",
-      "integrity": "sha512-wmOfE6szYyqZhRIiLH+eyZEp+bGcJI0OD/SCvSUrfBE0jvauyGYO2ZhpWxmNCcDojKu5DYrsVqT5BOCZZ01XIg==",
-      "dev": true,
-      "dependencies": {
-        "chromium-pickle-js": "^0.2.0",
-        "commander": "^5.0.0",
-        "glob": "^7.1.6",
-        "minimatch": "^3.0.4"
-      },
-      "bin": {
-        "asar": "bin/asar.js"
-      },
-      "engines": {
-        "node": ">=10.12.0"
-      },
-      "optionalDependencies": {
-        "@types/glob": "^7.1.1"
-      }
-    },
-    "node_modules/@electron/asar/node_modules/commander": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
-      "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/@electron/get": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz",
-      "integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==",
-      "dev": true,
-      "dependencies": {
-        "debug": "^4.1.1",
-        "env-paths": "^2.2.0",
-        "fs-extra": "^8.1.0",
-        "got": "^11.8.5",
-        "progress": "^2.0.3",
-        "semver": "^6.2.0",
-        "sumchecker": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "optionalDependencies": {
-        "global-agent": "^3.0.0"
-      }
-    },
-    "node_modules/@electron/get/node_modules/fs-extra": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
-      "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
-      "dev": true,
-      "dependencies": {
-        "graceful-fs": "^4.2.0",
-        "jsonfile": "^4.0.0",
-        "universalify": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=6 <7 || >=8"
-      }
-    },
-    "node_modules/@electron/get/node_modules/jsonfile": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
-      "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
-      "dev": true,
-      "optionalDependencies": {
-        "graceful-fs": "^4.1.6"
-      }
-    },
-    "node_modules/@electron/get/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/@electron/get/node_modules/universalify": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 4.0.0"
-      }
-    },
-    "node_modules/@electron/notarize": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.3.tgz",
-      "integrity": "sha512-9oRzT56rKh5bspk3KpAVF8lPKHYQrBnRwcgiOeR0hdilVEQmszDaAu0IPCPrwwzJN0ugNs0rRboTreHMt/6mBQ==",
-      "dev": true,
-      "dependencies": {
-        "debug": "^4.1.1",
-        "fs-extra": "^9.0.1"
-      },
-      "engines": {
-        "node": ">= 10.0.0"
-      }
-    },
-    "node_modules/@electron/notarize/node_modules/fs-extra": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
-      "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
-      "dev": true,
-      "dependencies": {
-        "at-least-node": "^1.0.0",
-        "graceful-fs": "^4.2.0",
-        "jsonfile": "^6.0.1",
-        "universalify": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@electron/osx-sign": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.4.tgz",
-      "integrity": "sha512-xfhdEcIOfAZg7scZ9RQPya1G1lWo8/zMCwUXAulq0SfY7ONIW+b9qGyKdMyuMctNYwllrIS+vmxfijSfjeh97g==",
-      "dev": true,
-      "dependencies": {
-        "compare-version": "^0.1.2",
-        "debug": "^4.3.4",
-        "fs-extra": "^10.0.0",
-        "isbinaryfile": "^4.0.8",
-        "minimist": "^1.2.6",
-        "plist": "^3.0.5"
-      },
-      "bin": {
-        "electron-osx-flat": "bin/electron-osx-flat.js",
-        "electron-osx-sign": "bin/electron-osx-sign.js"
-      },
-      "engines": {
-        "node": ">=12.0.0"
-      }
-    },
-    "node_modules/@electron/rebuild": {
-      "version": "3.2.10",
-      "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.2.10.tgz",
-      "integrity": "sha512-SUBM6Mwi3yZaDFQjZzfGKpYTtOp9m60glounwX6tfGeVc/ZOl4jbquktUcyy7gYSLDWFLtKkftkY2xgMJZLQgg==",
-      "dev": true,
-      "dependencies": {
-        "@malept/cross-spawn-promise": "^2.0.0",
-        "chalk": "^4.0.0",
-        "debug": "^4.1.1",
-        "detect-libc": "^2.0.1",
-        "fs-extra": "^10.0.0",
-        "got": "^11.7.0",
-        "lzma-native": "^8.0.5",
-        "node-abi": "^3.0.0",
-        "node-api-version": "^0.1.4",
-        "node-gyp": "^9.0.0",
-        "ora": "^5.1.0",
-        "semver": "^7.3.5",
-        "tar": "^6.0.5",
-        "yargs": "^17.0.1"
-      },
-      "bin": {
-        "electron-rebuild": "lib/src/cli.js"
-      },
-      "engines": {
-        "node": ">=12.13.0"
-      }
-    },
-    "node_modules/@electron/universal": {
-      "version": "1.3.4",
-      "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.3.4.tgz",
-      "integrity": "sha512-BdhBgm2ZBnYyYRLRgOjM5VHkyFItsbggJ0MHycOjKWdFGYwK97ZFXH54dTvUWEfha81vfvwr5On6XBjt99uDcg==",
-      "dev": true,
-      "dependencies": {
-        "@electron/asar": "^3.2.1",
-        "@malept/cross-spawn-promise": "^1.1.0",
-        "debug": "^4.3.1",
-        "dir-compare": "^3.0.0",
-        "fs-extra": "^9.0.1",
-        "minimatch": "^3.0.4",
-        "plist": "^3.0.4"
-      },
-      "engines": {
-        "node": ">=8.6"
-      }
-    },
-    "node_modules/@electron/universal/node_modules/@malept/cross-spawn-promise": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz",
-      "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://github.com/sponsors/malept"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund"
-        }
-      ],
-      "dependencies": {
-        "cross-spawn": "^7.0.1"
-      },
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@electron/universal/node_modules/fs-extra": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
-      "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
-      "dev": true,
-      "dependencies": {
-        "at-least-node": "^1.0.0",
-        "graceful-fs": "^4.2.0",
-        "jsonfile": "^6.0.1",
-        "universalify": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "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/@malept/cross-spawn-promise": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz",
-      "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://github.com/sponsors/malept"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund"
-        }
-      ],
-      "dependencies": {
-        "cross-spawn": "^7.0.1"
-      },
-      "engines": {
-        "node": ">= 12.13.0"
-      }
-    },
-    "node_modules/@nodelib/fs.scandir": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
-      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
-      "dev": true,
-      "dependencies": {
-        "@nodelib/fs.stat": "2.0.5",
-        "run-parallel": "^1.1.9"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@nodelib/fs.stat": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
-      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
-      "dev": true,
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@nodelib/fs.walk": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
-      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
-      "dev": true,
-      "dependencies": {
-        "@nodelib/fs.scandir": "2.1.5",
-        "fastq": "^1.6.0"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@npmcli/fs": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz",
-      "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==",
-      "dev": true,
-      "dependencies": {
-        "@gar/promisify": "^1.1.3",
-        "semver": "^7.3.5"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/@npmcli/move-file": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz",
-      "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==",
-      "deprecated": "This functionality has been moved to @npmcli/fs",
-      "dev": true,
-      "dependencies": {
-        "mkdirp": "^1.0.4",
-        "rimraf": "^3.0.2"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/@sindresorhus/is": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
-      "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/is?sponsor=1"
-      }
-    },
-    "node_modules/@szmarczak/http-timer": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
-      "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
-      "dev": true,
-      "dependencies": {
-        "defer-to-connect": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@tootallnate/once": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
-      "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
-      "dev": true,
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@types/cacheable-request": {
-      "version": "6.0.3",
-      "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz",
-      "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==",
-      "dev": true,
-      "dependencies": {
-        "@types/http-cache-semantics": "*",
-        "@types/keyv": "^3.1.4",
-        "@types/node": "*",
-        "@types/responselike": "^1.0.0"
-      }
-    },
-    "node_modules/@types/fs-extra": {
-      "version": "9.0.13",
-      "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz",
-      "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
-    "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,
-      "optional": true,
-      "dependencies": {
-        "@types/minimatch": "*",
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@types/http-cache-semantics": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz",
-      "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==",
-      "dev": true
-    },
-    "node_modules/@types/keyv": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
-      "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
-      "dev": true,
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
-    "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,
-      "optional": true
-    },
-    "node_modules/@types/node": {
-      "version": "16.18.16",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.16.tgz",
-      "integrity": "sha512-ZOzvDRWp8dCVBmgnkIqYCArgdFOO9YzocZp8Ra25N/RStKiWvMOXHMz+GjSeVNe5TstaTmTWPucGJkDw0XXJWA==",
-      "dev": true
-    },
-    "node_modules/@types/responselike": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
-      "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==",
-      "dev": true,
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@types/yauzl": {
-      "version": "2.10.0",
-      "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz",
-      "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
-    "node_modules/abbrev": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
-      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
-      "dev": true
-    },
-    "node_modules/agent-base": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
-      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
-      "dev": true,
-      "dependencies": {
-        "debug": "4"
-      },
-      "engines": {
-        "node": ">= 6.0.0"
-      }
-    },
-    "node_modules/agentkeepalive": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz",
-      "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==",
-      "dev": true,
-      "dependencies": {
-        "debug": "^4.1.0",
-        "depd": "^2.0.0",
-        "humanize-ms": "^1.2.1"
-      },
-      "engines": {
-        "node": ">= 8.0.0"
-      }
-    },
-    "node_modules/aggregate-error": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
-      "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
-      "dev": true,
-      "dependencies": {
-        "clean-stack": "^2.0.0",
-        "indent-string": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/ansi-escapes": {
-      "version": "4.3.2",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
-      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
-      "dev": true,
-      "dependencies": {
-        "type-fest": "^0.21.3"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/aproba": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
-      "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
-      "dev": true
-    },
-    "node_modules/are-we-there-yet": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz",
-      "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==",
-      "dev": true,
-      "dependencies": {
-        "delegates": "^1.0.0",
-        "readable-stream": "^3.6.0"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/asar": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/asar/-/asar-3.2.0.tgz",
-      "integrity": "sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg==",
-      "deprecated": "Please use @electron/asar moving forward.  There is no API change, just a package name change",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "chromium-pickle-js": "^0.2.0",
-        "commander": "^5.0.0",
-        "glob": "^7.1.6",
-        "minimatch": "^3.0.4"
-      },
-      "bin": {
-        "asar": "bin/asar.js"
-      },
-      "engines": {
-        "node": ">=10.12.0"
-      },
-      "optionalDependencies": {
-        "@types/glob": "^7.1.1"
-      }
-    },
-    "node_modules/asar/node_modules/commander": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
-      "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/astral-regex": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
-      "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/at-least-node": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
-      "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 4.0.0"
-      }
-    },
-    "node_modules/author-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz",
-      "integrity": "sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8"
-      }
-    },
-    "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==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
-    "node_modules/bl": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
-      "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
-      "dev": true,
-      "dependencies": {
-        "buffer": "^5.5.0",
-        "inherits": "^2.0.4",
-        "readable-stream": "^3.4.0"
-      }
-    },
-    "node_modules/bluebird": {
-      "version": "3.7.2",
-      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
-      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
-      "dev": true
-    },
-    "node_modules/boolean": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz",
-      "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==",
-      "dev": true,
-      "optional": 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==",
-      "dev": true,
-      "dependencies": {
-        "fill-range": "^7.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/buffer": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
-      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "dependencies": {
-        "base64-js": "^1.3.1",
-        "ieee754": "^1.1.13"
-      }
-    },
-    "node_modules/buffer-crc32": {
-      "version": "0.2.13",
-      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
-      "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
-      "dev": true,
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/buffer-equal": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz",
-      "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "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": "16.1.3",
-      "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz",
-      "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==",
-      "dev": true,
-      "dependencies": {
-        "@npmcli/fs": "^2.1.0",
-        "@npmcli/move-file": "^2.0.0",
-        "chownr": "^2.0.0",
-        "fs-minipass": "^2.1.0",
-        "glob": "^8.0.1",
-        "infer-owner": "^1.0.4",
-        "lru-cache": "^7.7.1",
-        "minipass": "^3.1.6",
-        "minipass-collect": "^1.0.2",
-        "minipass-flush": "^1.0.5",
-        "minipass-pipeline": "^1.2.4",
-        "mkdirp": "^1.0.4",
-        "p-map": "^4.0.0",
-        "promise-inflight": "^1.0.1",
-        "rimraf": "^3.0.2",
-        "ssri": "^9.0.0",
-        "tar": "^6.1.11",
-        "unique-filename": "^2.0.0"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/cacache/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
-      "dev": true,
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "node_modules/cacache/node_modules/glob": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
-      "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
-      "dev": true,
-      "dependencies": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^5.0.1",
-        "once": "^1.3.0"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/cacache/node_modules/minimatch": {
-      "version": "5.1.6",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
-      "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
-      "dev": true,
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/cacheable-lookup": {
-      "version": "5.0.4",
-      "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
-      "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
-      "dev": true,
-      "engines": {
-        "node": ">=10.6.0"
-      }
-    },
-    "node_modules/cacheable-request": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz",
-      "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==",
-      "dev": true,
-      "dependencies": {
-        "clone-response": "^1.0.2",
-        "get-stream": "^5.1.0",
-        "http-cache-semantics": "^4.0.0",
-        "keyv": "^4.0.0",
-        "lowercase-keys": "^2.0.0",
-        "normalize-url": "^6.0.1",
-        "responselike": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/camelcase": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/chownr": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
-      "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/chromium-pickle-js": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz",
-      "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==",
-      "dev": true
-    },
-    "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/cli-cursor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
-      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
-      "dev": true,
-      "dependencies": {
-        "restore-cursor": "^3.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/cli-spinners": {
-      "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz",
-      "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/cli-truncate": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
-      "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
-      "dev": true,
-      "dependencies": {
-        "slice-ansi": "^3.0.0",
-        "string-width": "^4.2.0"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/cliui": {
-      "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
-      "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
-      "dev": true,
-      "dependencies": {
-        "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.1",
-        "wrap-ansi": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/clone": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
-      "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8"
-      }
-    },
-    "node_modules/clone-response": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
-      "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
-      "dev": true,
-      "dependencies": {
-        "mimic-response": "^1.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/color-support": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
-      "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
-      "dev": true,
-      "bin": {
-        "color-support": "bin.js"
-      }
-    },
-    "node_modules/colorette": {
-      "version": "2.0.19",
-      "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
-      "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
-      "dev": true
-    },
-    "node_modules/commander": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
-      "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
-      "dev": true,
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/compare-version": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz",
-      "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "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/config-chain": {
-      "version": "1.1.13",
-      "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
-      "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "ini": "^1.3.4",
-        "proto-list": "~1.2.1"
-      }
-    },
-    "node_modules/console-control-strings": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
-      "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
-      "dev": true
-    },
-    "node_modules/core-util-is": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
-      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
-    },
-    "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/cross-spawn-windows-exe": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/cross-spawn-windows-exe/-/cross-spawn-windows-exe-1.2.0.tgz",
-      "integrity": "sha512-mkLtJJcYbDCxEG7Js6eUnUNndWjyUZwJ3H7bErmmtOYU/Zb99DyUkpamuIZE0b3bhmJyZ7D90uS6f+CGxRRjOw==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://github.com/sponsors/malept"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/subscription/pkg/npm-cross-spawn-windows-exe?utm_medium=referral&utm_source=npm_fund"
-        }
-      ],
-      "dependencies": {
-        "@malept/cross-spawn-promise": "^1.1.0",
-        "is-wsl": "^2.2.0",
-        "which": "^2.0.2"
-      },
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/cross-spawn-windows-exe/node_modules/@malept/cross-spawn-promise": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz",
-      "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://github.com/sponsors/malept"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund"
-        }
-      ],
-      "dependencies": {
-        "cross-spawn": "^7.0.1"
-      },
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/cross-zip": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/cross-zip/-/cross-zip-4.0.0.tgz",
-      "integrity": "sha512-MEzGfZo0rqE10O/B+AEcCSJLZsrWuRUvmqJTqHNqBtALhaJc3E3ixLGLJNTRzEA2K34wbmOHC4fwYs9sVsdcCA==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "engines": {
-        "node": ">=12.10"
-      }
-    },
-    "node_modules/debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.1.2"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/decamelize": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/decompress-response": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
-      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
-      "dev": true,
-      "dependencies": {
-        "mimic-response": "^3.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/decompress-response/node_modules/mimic-response": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
-      "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "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==",
-      "dev": true,
-      "dependencies": {
-        "clone": "^1.0.2"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/defer-to-connect": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
-      "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/define-properties": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz",
-      "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "has-property-descriptors": "^1.0.0",
-        "object-keys": "^1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/delegates": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
-      "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
-      "dev": true
-    },
-    "node_modules/depd": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
-      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/detect-libc": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
-      "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/detect-node": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
-      "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/dir-compare": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz",
-      "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==",
-      "dev": true,
-      "dependencies": {
-        "buffer-equal": "^1.0.0",
-        "minimatch": "^3.0.4"
-      }
-    },
-    "node_modules/duplexer3": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz",
-      "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==",
-      "dev": true
-    },
-    "node_modules/electron": {
-      "version": "20.0.1",
-      "resolved": "https://registry.npmjs.org/electron/-/electron-20.0.1.tgz",
-      "integrity": "sha512-5c7zr8oy1JsCV86BaoIPVLo4yevDfvPEsMQcGlgfJ5PS7ouAVvR1aHt0tjF65bL1vYdoQ1olvpextg2T8FyICA==",
-      "dev": true,
-      "hasInstallScript": true,
-      "dependencies": {
-        "@electron/get": "^1.14.1",
-        "@types/node": "^16.11.26",
-        "extract-zip": "^2.0.1"
-      },
-      "bin": {
-        "electron": "cli.js"
-      },
-      "engines": {
-        "node": ">= 10.17.0"
-      }
-    },
-    "node_modules/electron-installer-common": {
-      "version": "0.10.3",
-      "resolved": "https://registry.npmjs.org/electron-installer-common/-/electron-installer-common-0.10.3.tgz",
-      "integrity": "sha512-mYbP+6i+nHMIm0WZHXgGdmmXMe+KXncl6jZYQNcCF9C1WsNA9C5SZ2VP4TLQMSIoFO+X4ugkMEA5uld1bmyEvA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "@malept/cross-spawn-promise": "^1.0.0",
-        "asar": "^3.0.0",
-        "debug": "^4.1.1",
-        "fs-extra": "^9.0.0",
-        "glob": "^7.1.4",
-        "lodash": "^4.17.15",
-        "parse-author": "^2.0.0",
-        "semver": "^7.1.1",
-        "tmp-promise": "^3.0.2"
-      },
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/electron-userland/electron-installer-common?sponsor=1"
-      },
-      "optionalDependencies": {
-        "@types/fs-extra": "^9.0.1"
-      }
-    },
-    "node_modules/electron-installer-common/node_modules/@malept/cross-spawn-promise": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz",
-      "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://github.com/sponsors/malept"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund"
-        }
-      ],
-      "optional": true,
-      "dependencies": {
-        "cross-spawn": "^7.0.1"
-      },
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/electron-installer-common/node_modules/fs-extra": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
-      "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "at-least-node": "^1.0.0",
-        "graceful-fs": "^4.2.0",
-        "jsonfile": "^6.0.1",
-        "universalify": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/electron-installer-debian": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/electron-installer-debian/-/electron-installer-debian-3.1.0.tgz",
-      "integrity": "sha512-k6KChvx0Fw8XTlCqwwbBfh19yGQaKjGdbugokmr1IpzINOm4QFyACKMTHAYFHW5LCBUZQShZD96hwxUZ+8Kx+w==",
-      "dev": true,
-      "optional": true,
-      "os": [
-        "darwin",
-        "linux"
-      ],
-      "dependencies": {
-        "@malept/cross-spawn-promise": "^1.0.0",
-        "debug": "^4.1.1",
-        "electron-installer-common": "^0.10.2",
-        "fs-extra": "^9.0.0",
-        "get-folder-size": "^2.0.1",
-        "lodash": "^4.17.4",
-        "word-wrap": "^1.2.3",
-        "yargs": "^15.0.1"
-      },
-      "bin": {
-        "electron-installer-debian": "src/cli.js"
-      },
-      "engines": {
-        "node": ">= 10.0.0"
-      }
-    },
-    "node_modules/electron-installer-debian/node_modules/@malept/cross-spawn-promise": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz",
-      "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://github.com/sponsors/malept"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund"
-        }
-      ],
-      "optional": true,
-      "dependencies": {
-        "cross-spawn": "^7.0.1"
-      },
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/electron-installer-debian/node_modules/cliui": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
-      "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.0",
-        "wrap-ansi": "^6.2.0"
-      }
-    },
-    "node_modules/electron-installer-debian/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,
-      "optional": true,
-      "dependencies": {
-        "locate-path": "^5.0.0",
-        "path-exists": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/electron-installer-debian/node_modules/fs-extra": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
-      "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "at-least-node": "^1.0.0",
-        "graceful-fs": "^4.2.0",
-        "jsonfile": "^6.0.1",
-        "universalify": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/electron-installer-debian/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,
-      "optional": true,
-      "dependencies": {
-        "p-locate": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/electron-installer-debian/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,
-      "optional": true,
-      "dependencies": {
-        "p-try": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/electron-installer-debian/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,
-      "optional": true,
-      "dependencies": {
-        "p-limit": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/electron-installer-debian/node_modules/wrap-ansi": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
-      "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/electron-installer-debian/node_modules/y18n": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
-      "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/electron-installer-debian/node_modules/yargs": {
-      "version": "15.4.1",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
-      "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "cliui": "^6.0.0",
-        "decamelize": "^1.2.0",
-        "find-up": "^4.1.0",
-        "get-caller-file": "^2.0.1",
-        "require-directory": "^2.1.1",
-        "require-main-filename": "^2.0.0",
-        "set-blocking": "^2.0.0",
-        "string-width": "^4.2.0",
-        "which-module": "^2.0.0",
-        "y18n": "^4.0.0",
-        "yargs-parser": "^18.1.2"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/electron-installer-debian/node_modules/yargs-parser": {
-      "version": "18.1.3",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
-      "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "camelcase": "^5.0.0",
-        "decamelize": "^1.2.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/electron-installer-redhat": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/electron-installer-redhat/-/electron-installer-redhat-3.4.0.tgz",
-      "integrity": "sha512-gEISr3U32Sgtj+fjxUAlSDo3wyGGq6OBx7rF5UdpIgbnpUvMN4W5uYb0ThpnAZ42VEJh/3aODQXHbFS4f5J3Iw==",
-      "dev": true,
-      "optional": true,
-      "os": [
-        "darwin",
-        "linux"
-      ],
-      "dependencies": {
-        "@malept/cross-spawn-promise": "^1.0.0",
-        "debug": "^4.1.1",
-        "electron-installer-common": "^0.10.2",
-        "fs-extra": "^9.0.0",
-        "lodash": "^4.17.15",
-        "word-wrap": "^1.2.3",
-        "yargs": "^16.0.2"
-      },
-      "bin": {
-        "electron-installer-redhat": "src/cli.js"
-      },
-      "engines": {
-        "node": ">= 10.0.0"
-      }
-    },
-    "node_modules/electron-installer-redhat/node_modules/@malept/cross-spawn-promise": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz",
-      "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://github.com/sponsors/malept"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund"
-        }
-      ],
-      "optional": true,
-      "dependencies": {
-        "cross-spawn": "^7.0.1"
-      },
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/electron-installer-redhat/node_modules/cliui": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
-      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.0",
-        "wrap-ansi": "^7.0.0"
-      }
-    },
-    "node_modules/electron-installer-redhat/node_modules/fs-extra": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
-      "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "at-least-node": "^1.0.0",
-        "graceful-fs": "^4.2.0",
-        "jsonfile": "^6.0.1",
-        "universalify": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/electron-installer-redhat/node_modules/yargs": {
-      "version": "16.2.0",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
-      "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "cliui": "^7.0.2",
-        "escalade": "^3.1.1",
-        "get-caller-file": "^2.0.5",
-        "require-directory": "^2.1.1",
-        "string-width": "^4.2.0",
-        "y18n": "^5.0.5",
-        "yargs-parser": "^20.2.2"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/electron-installer-redhat/node_modules/yargs-parser": {
-      "version": "20.2.9",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
-      "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/electron-packager": {
-      "version": "17.1.1",
-      "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-17.1.1.tgz",
-      "integrity": "sha512-r1NDtlajsq7gf2EXgjRfblCVPquvD2yeg+6XGErOKblvxOpDi0iulZLVhgYDP4AEF1P5/HgbX/vwjlkEv7PEIQ==",
-      "dev": true,
-      "dependencies": {
-        "@electron/asar": "^3.2.1",
-        "@electron/get": "^2.0.0",
-        "@electron/notarize": "^1.2.3",
-        "@electron/osx-sign": "^1.0.1",
-        "@electron/universal": "^1.3.2",
-        "cross-spawn-windows-exe": "^1.2.0",
-        "debug": "^4.0.1",
-        "extract-zip": "^2.0.0",
-        "filenamify": "^4.1.0",
-        "fs-extra": "^10.1.0",
-        "galactus": "^0.2.1",
-        "get-package-info": "^1.0.0",
-        "junk": "^3.1.0",
-        "parse-author": "^2.0.0",
-        "plist": "^3.0.0",
-        "rcedit": "^3.0.1",
-        "resolve": "^1.1.6",
-        "semver": "^7.1.3",
-        "yargs-parser": "^21.1.1"
-      },
-      "bin": {
-        "electron-packager": "bin/electron-packager.js"
-      },
-      "engines": {
-        "node": ">= 14.17.5"
-      },
-      "funding": {
-        "url": "https://github.com/electron/electron-packager?sponsor=1"
-      }
-    },
-    "node_modules/electron-squirrel-startup": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/electron-squirrel-startup/-/electron-squirrel-startup-1.0.0.tgz",
-      "integrity": "sha512-Oce8mvgGdFmwr+DsAcXBmFK8jFfN6yaFAP9IvyhTfupM3nFkBku/7VS/mdtJteWumImkC6P+BKGsxScoDDkv9Q==",
-      "dependencies": {
-        "debug": "^2.2.0"
-      }
-    },
-    "node_modules/electron-squirrel-startup/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/electron-squirrel-startup/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
-    },
-    "node_modules/electron-winstaller": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.1.0.tgz",
-      "integrity": "sha512-4wlZzkUm5cJNiOtp5wL804+QpygdKTKkrZJXA3sSDEI2XnCVPv0kxmxUvVw4KHBwbNS+Yox89agEr+VkR7kxww==",
-      "dev": true,
-      "hasInstallScript": true,
-      "optional": true,
-      "dependencies": {
-        "@electron/asar": "^3.2.1",
-        "debug": "^4.1.1",
-        "fs-extra": "^7.0.1",
-        "lodash.template": "^4.2.2",
-        "temp": "^0.9.0"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/electron-winstaller/node_modules/fs-extra": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
-      "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "jsonfile": "^4.0.0",
-        "universalify": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=6 <7 || >=8"
-      }
-    },
-    "node_modules/electron-winstaller/node_modules/jsonfile": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
-      "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
-      "dev": true,
-      "optional": true,
-      "optionalDependencies": {
-        "graceful-fs": "^4.1.6"
-      }
-    },
-    "node_modules/electron-winstaller/node_modules/universalify": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">= 4.0.0"
-      }
-    },
-    "node_modules/electron/node_modules/@electron/get": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.14.1.tgz",
-      "integrity": "sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw==",
-      "dev": true,
-      "dependencies": {
-        "debug": "^4.1.1",
-        "env-paths": "^2.2.0",
-        "fs-extra": "^8.1.0",
-        "got": "^9.6.0",
-        "progress": "^2.0.3",
-        "semver": "^6.2.0",
-        "sumchecker": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=8.6"
-      },
-      "optionalDependencies": {
-        "global-agent": "^3.0.0",
-        "global-tunnel-ng": "^2.7.1"
-      }
-    },
-    "node_modules/electron/node_modules/@sindresorhus/is": {
-      "version": "0.14.0",
-      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
-      "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/electron/node_modules/@szmarczak/http-timer": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
-      "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
-      "dev": true,
-      "dependencies": {
-        "defer-to-connect": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/electron/node_modules/cacheable-request": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
-      "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
-      "dev": true,
-      "dependencies": {
-        "clone-response": "^1.0.2",
-        "get-stream": "^5.1.0",
-        "http-cache-semantics": "^4.0.0",
-        "keyv": "^3.0.0",
-        "lowercase-keys": "^2.0.0",
-        "normalize-url": "^4.1.0",
-        "responselike": "^1.0.2"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/electron/node_modules/decompress-response": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
-      "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==",
-      "dev": true,
-      "dependencies": {
-        "mimic-response": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/electron/node_modules/defer-to-connect": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
-      "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
-      "dev": true
-    },
-    "node_modules/electron/node_modules/fs-extra": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
-      "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
-      "dev": true,
-      "dependencies": {
-        "graceful-fs": "^4.2.0",
-        "jsonfile": "^4.0.0",
-        "universalify": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=6 <7 || >=8"
-      }
-    },
-    "node_modules/electron/node_modules/got": {
-      "version": "9.6.0",
-      "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
-      "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
-      "dev": true,
-      "dependencies": {
-        "@sindresorhus/is": "^0.14.0",
-        "@szmarczak/http-timer": "^1.1.2",
-        "cacheable-request": "^6.0.0",
-        "decompress-response": "^3.3.0",
-        "duplexer3": "^0.1.4",
-        "get-stream": "^4.1.0",
-        "lowercase-keys": "^1.0.1",
-        "mimic-response": "^1.0.1",
-        "p-cancelable": "^1.0.0",
-        "to-readable-stream": "^1.0.0",
-        "url-parse-lax": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8.6"
-      }
-    },
-    "node_modules/electron/node_modules/got/node_modules/get-stream": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
-      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
-      "dev": true,
-      "dependencies": {
-        "pump": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/electron/node_modules/got/node_modules/lowercase-keys": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
-      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/electron/node_modules/json-buffer": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
-      "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==",
-      "dev": true
-    },
-    "node_modules/electron/node_modules/jsonfile": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
-      "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
-      "dev": true,
-      "optionalDependencies": {
-        "graceful-fs": "^4.1.6"
-      }
-    },
-    "node_modules/electron/node_modules/keyv": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
-      "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
-      "dev": true,
-      "dependencies": {
-        "json-buffer": "3.0.0"
-      }
-    },
-    "node_modules/electron/node_modules/normalize-url": {
-      "version": "4.5.1",
-      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
-      "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/electron/node_modules/p-cancelable": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
-      "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/electron/node_modules/responselike": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
-      "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==",
-      "dev": true,
-      "dependencies": {
-        "lowercase-keys": "^1.0.0"
-      }
-    },
-    "node_modules/electron/node_modules/responselike/node_modules/lowercase-keys": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
-      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/electron/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/electron/node_modules/universalify": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 4.0.0"
-      }
-    },
-    "node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
-    },
-    "node_modules/encodeurl": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
-      "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/encoding": {
-      "version": "0.1.13",
-      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
-      "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "iconv-lite": "^0.6.2"
-      }
-    },
-    "node_modules/end-of-stream": {
-      "version": "1.4.4",
-      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
-      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
-      "dev": true,
-      "dependencies": {
-        "once": "^1.4.0"
-      }
-    },
-    "node_modules/env-paths": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
-      "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/err-code": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
-      "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
-      "dev": true
-    },
-    "node_modules/error-ex": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
-      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
-      "dev": true,
-      "dependencies": {
-        "is-arrayish": "^0.2.1"
-      }
-    },
-    "node_modules/es6-error": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
-      "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
-      "dev": true,
-      "optional": true
-    },
-    "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": "4.0.0",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
-      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/execa": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
-      "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
-      "dev": true,
-      "dependencies": {
-        "cross-spawn": "^6.0.0",
-        "get-stream": "^4.0.0",
-        "is-stream": "^1.1.0",
-        "npm-run-path": "^2.0.0",
-        "p-finally": "^1.0.0",
-        "signal-exit": "^3.0.0",
-        "strip-eof": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/execa/node_modules/cross-spawn": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-      "dev": true,
-      "dependencies": {
-        "nice-try": "^1.0.4",
-        "path-key": "^2.0.1",
-        "semver": "^5.5.0",
-        "shebang-command": "^1.2.0",
-        "which": "^1.2.9"
-      },
-      "engines": {
-        "node": ">=4.8"
-      }
-    },
-    "node_modules/execa/node_modules/get-stream": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
-      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
-      "dev": true,
-      "dependencies": {
-        "pump": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/execa/node_modules/path-key": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-      "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/execa/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/execa/node_modules/shebang-command": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-      "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
-      "dev": true,
-      "dependencies": {
-        "shebang-regex": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/execa/node_modules/shebang-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-      "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/execa/node_modules/which": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-      "dev": true,
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "which": "bin/which"
-      }
-    },
-    "node_modules/expand-tilde": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
-      "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==",
-      "dev": true,
-      "dependencies": {
-        "homedir-polyfill": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/extract-file-icon": {
-      "version": "0.3.3",
-      "resolved": "https://registry.npmjs.org/extract-file-icon/-/extract-file-icon-0.3.3.tgz",
-      "integrity": "sha512-We5/HaMDlioOx3c9zDjit8RtKWEvT94sJF8jTujaKVOyWL8Kkqu4QGnwDr5fID6XsbKvWT0JJNuWuV2Tmr7yiw==",
-      "hasInstallScript": true,
-      "dependencies": {
-        "node-addon-api": "1.7.1"
-      }
-    },
-    "node_modules/extract-file-icon/node_modules/node-addon-api": {
-      "version": "1.7.1",
-      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.1.tgz",
-      "integrity": "sha512-2+DuKodWvwRTrCfKOeR24KIc5unKjOh8mz17NCzVnHWfjAdDqbfbjqh7gUT+BkXBRQM52+xCHciKWonJ3CbJMQ=="
-    },
-    "node_modules/extract-zip": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
-      "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
-      "dev": true,
-      "dependencies": {
-        "debug": "^4.1.1",
-        "get-stream": "^5.1.0",
-        "yauzl": "^2.10.0"
-      },
-      "bin": {
-        "extract-zip": "cli.js"
-      },
-      "engines": {
-        "node": ">= 10.17.0"
-      },
-      "optionalDependencies": {
-        "@types/yauzl": "^2.9.1"
-      }
-    },
-    "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==",
-      "dev": true,
-      "dependencies": {
-        "@nodelib/fs.stat": "^2.0.2",
-        "@nodelib/fs.walk": "^1.2.3",
-        "glob-parent": "^5.1.2",
-        "merge2": "^1.3.0",
-        "micromatch": "^4.0.4"
-      },
-      "engines": {
-        "node": ">=8.6.0"
-      }
-    },
-    "node_modules/fastq": {
-      "version": "1.15.0",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
-      "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
-      "dev": true,
-      "dependencies": {
-        "reusify": "^1.0.4"
-      }
-    },
-    "node_modules/fd-slicer": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
-      "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
-      "dev": true,
-      "dependencies": {
-        "pend": "~1.2.0"
-      }
-    },
-    "node_modules/filename-reserved-regex": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
-      "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/filenamify": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz",
-      "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==",
-      "dev": true,
-      "dependencies": {
-        "filename-reserved-regex": "^2.0.0",
-        "strip-outer": "^1.0.1",
-        "trim-repeated": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/fill-range": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
-      "dev": true,
-      "dependencies": {
-        "to-regex-range": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/find-up": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
-      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
-      "dev": true,
-      "dependencies": {
-        "locate-path": "^6.0.0",
-        "path-exists": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/flora-colossus": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/flora-colossus/-/flora-colossus-1.0.1.tgz",
-      "integrity": "sha512-d+9na7t9FyH8gBJoNDSi28mE4NgQVGGvxQ4aHtFRetjyh5SXjuus+V5EZaxFmFdXVemSOrx0lsgEl/ZMjnOWJA==",
-      "dev": true,
-      "dependencies": {
-        "debug": "^4.1.1",
-        "fs-extra": "^7.0.0"
-      },
-      "engines": {
-        "node": ">= 6.0.0"
-      }
-    },
-    "node_modules/flora-colossus/node_modules/fs-extra": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
-      "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
-      "dev": true,
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "jsonfile": "^4.0.0",
-        "universalify": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=6 <7 || >=8"
-      }
-    },
-    "node_modules/flora-colossus/node_modules/jsonfile": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
-      "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
-      "dev": true,
-      "optionalDependencies": {
-        "graceful-fs": "^4.1.6"
-      }
-    },
-    "node_modules/flora-colossus/node_modules/universalify": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 4.0.0"
-      }
-    },
-    "node_modules/fs-extra": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
-      "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
-      "dev": true,
-      "dependencies": {
-        "graceful-fs": "^4.2.0",
-        "jsonfile": "^6.0.1",
-        "universalify": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/fs-minipass": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
-      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
-      "dev": true,
-      "dependencies": {
-        "minipass": "^3.0.0"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
-    },
-    "node_modules/function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
-    },
-    "node_modules/galactus": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/galactus/-/galactus-0.2.1.tgz",
-      "integrity": "sha512-mDc8EQJKtxjp9PMYS3PbpjjbX3oXhBTxoGaPahw620XZBIHJ4+nvw5KN/tRtmmSDR9dypstGNvqQ3C29QGoGHQ==",
-      "dev": true,
-      "dependencies": {
-        "debug": "^3.1.0",
-        "flora-colossus": "^1.0.0",
-        "fs-extra": "^4.0.0"
-      }
-    },
-    "node_modules/galactus/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/galactus/node_modules/fs-extra": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
-      "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
-      "dev": true,
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "jsonfile": "^4.0.0",
-        "universalify": "^0.1.0"
-      }
-    },
-    "node_modules/galactus/node_modules/jsonfile": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
-      "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
-      "dev": true,
-      "optionalDependencies": {
-        "graceful-fs": "^4.1.6"
-      }
-    },
-    "node_modules/galactus/node_modules/universalify": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 4.0.0"
-      }
-    },
-    "node_modules/gar": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/gar/-/gar-1.0.4.tgz",
-      "integrity": "sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/gauge": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz",
-      "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==",
-      "dev": true,
-      "dependencies": {
-        "aproba": "^1.0.3 || ^2.0.0",
-        "color-support": "^1.1.3",
-        "console-control-strings": "^1.1.0",
-        "has-unicode": "^2.0.1",
-        "signal-exit": "^3.0.7",
-        "string-width": "^4.2.3",
-        "strip-ansi": "^6.0.1",
-        "wide-align": "^1.1.5"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/get-caller-file": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-      "dev": true,
-      "engines": {
-        "node": "6.* || 8.* || >= 10.*"
-      }
-    },
-    "node_modules/get-folder-size": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz",
-      "integrity": "sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "gar": "^1.0.4",
-        "tiny-each-async": "2.0.3"
-      },
-      "bin": {
-        "get-folder-size": "bin/get-folder-size"
-      }
-    },
-    "node_modules/get-installed-path": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/get-installed-path/-/get-installed-path-2.1.1.tgz",
-      "integrity": "sha512-Qkn9eq6tW5/q9BDVdMpB8tOHljX9OSP0jRC5TRNVA4qRc839t4g8KQaR8t0Uv0EFVL0MlyG7m/ofjEgAROtYsA==",
-      "dev": true,
-      "dependencies": {
-        "global-modules": "1.0.0"
-      }
-    },
-    "node_modules/get-intrinsic": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
-      "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.3"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/get-package-info": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz",
-      "integrity": "sha512-SCbprXGAPdIhKAXiG+Mk6yeoFH61JlYunqdFQFHDtLjJlDjFf6x07dsS8acO+xWt52jpdVo49AlVDnUVK1sDNw==",
-      "dev": true,
-      "dependencies": {
-        "bluebird": "^3.1.1",
-        "debug": "^2.2.0",
-        "lodash.get": "^4.0.0",
-        "read-pkg-up": "^2.0.0"
-      },
-      "engines": {
-        "node": ">= 4.0"
-      }
-    },
-    "node_modules/get-package-info/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/get-package-info/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "dev": true
-    },
-    "node_modules/get-stream": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
-      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
-      "dev": true,
-      "dependencies": {
-        "pump": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/glob": {
-      "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
-      "dependencies": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.1.1",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      },
-      "engines": {
-        "node": "*"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/glob-parent": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
-      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
-      "dev": true,
-      "dependencies": {
-        "is-glob": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/global-agent": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz",
-      "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "boolean": "^3.0.1",
-        "es6-error": "^4.1.1",
-        "matcher": "^3.0.0",
-        "roarr": "^2.15.3",
-        "semver": "^7.3.2",
-        "serialize-error": "^7.0.1"
-      },
-      "engines": {
-        "node": ">=10.0"
-      }
-    },
-    "node_modules/global-modules": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
-      "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
-      "dev": true,
-      "dependencies": {
-        "global-prefix": "^1.0.1",
-        "is-windows": "^1.0.1",
-        "resolve-dir": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/global-prefix": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
-      "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==",
-      "dev": true,
-      "dependencies": {
-        "expand-tilde": "^2.0.2",
-        "homedir-polyfill": "^1.0.1",
-        "ini": "^1.3.4",
-        "is-windows": "^1.0.1",
-        "which": "^1.2.14"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/global-prefix/node_modules/which": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-      "dev": true,
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "which": "bin/which"
-      }
-    },
-    "node_modules/global-tunnel-ng": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz",
-      "integrity": "sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "encodeurl": "^1.0.2",
-        "lodash": "^4.17.10",
-        "npm-conf": "^1.1.3",
-        "tunnel": "^0.0.6"
-      },
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/globalthis": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
-      "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "define-properties": "^1.1.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/got": {
-      "version": "11.8.6",
-      "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz",
-      "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==",
-      "dev": true,
-      "dependencies": {
-        "@sindresorhus/is": "^4.0.0",
-        "@szmarczak/http-timer": "^4.0.5",
-        "@types/cacheable-request": "^6.0.1",
-        "@types/responselike": "^1.0.0",
-        "cacheable-lookup": "^5.0.3",
-        "cacheable-request": "^7.0.2",
-        "decompress-response": "^6.0.0",
-        "http2-wrapper": "^1.0.0-beta.5.2",
-        "lowercase-keys": "^2.0.0",
-        "p-cancelable": "^2.0.0",
-        "responselike": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10.19.0"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/got?sponsor=1"
-      }
-    },
-    "node_modules/graceful-fs": {
-      "version": "4.2.10",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
-      "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
-      "dev": true
-    },
-    "node_modules/has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "dev": true,
-      "dependencies": {
-        "function-bind": "^1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.4.0"
-      }
-    },
-    "node_modules/has-flag": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/has-property-descriptors": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
-      "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "get-intrinsic": "^1.1.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/has-symbols": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
-      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/has-unicode": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
-      "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
-      "dev": true
-    },
-    "node_modules/homedir-polyfill": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
-      "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
-      "dev": true,
-      "dependencies": {
-        "parse-passwd": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/hosted-git-info": {
-      "version": "2.8.9",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
-      "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
-      "dev": true
-    },
-    "node_modules/http": {
-      "version": "0.0.1-security",
-      "resolved": "https://registry.npmjs.org/http/-/http-0.0.1-security.tgz",
-      "integrity": "sha512-RnDvP10Ty9FxqOtPZuxtebw1j4L/WiqNMDtuc1YMH1XQm5TgDRaR1G9u8upL6KD1bXHSp9eSXo/ED+8Q7FAr+g=="
-    },
-    "node_modules/http-cache-semantics": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
-      "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
-      "dev": true
-    },
-    "node_modules/http-proxy-agent": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
-      "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
-      "dev": true,
-      "dependencies": {
-        "@tootallnate/once": "2",
-        "agent-base": "6",
-        "debug": "4"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/http2-wrapper": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
-      "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
-      "dev": true,
-      "dependencies": {
-        "quick-lru": "^5.1.1",
-        "resolve-alpn": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=10.19.0"
-      }
-    },
-    "node_modules/https-proxy-agent": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
-      "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
-      "dev": true,
-      "dependencies": {
-        "agent-base": "6",
-        "debug": "4"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/humanize-ms": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
-      "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
-      "dev": true,
-      "dependencies": {
-        "ms": "^2.0.0"
-      }
-    },
-    "node_modules/iconv-lite": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "safer-buffer": ">= 2.1.2 < 3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/ieee754": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
-      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
-    "node_modules/immediate": {
-      "version": "3.0.6",
-      "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
-      "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="
-    },
-    "node_modules/imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8.19"
-      }
-    },
-    "node_modules/indent-string": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
-      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/infer-owner": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
-      "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
-      "dev": true
-    },
-    "node_modules/inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
-      "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==",
-      "dev": true
-    },
-    "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": ">=10.13.0"
-      }
-    },
-    "node_modules/ip": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
-      "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==",
-      "dev": true
-    },
-    "node_modules/is-arrayish": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-      "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
-      "dev": true
-    },
-    "node_modules/is-core-module": {
-      "version": "2.11.0",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
-      "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
-      "dev": true,
-      "dependencies": {
-        "has": "^1.0.3"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-docker": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
-      "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
-      "dev": true,
-      "bin": {
-        "is-docker": "cli.js"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-glob": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
-      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
-      "dev": true,
-      "dependencies": {
-        "is-extglob": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-interactive": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
-      "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-lambda": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
-      "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==",
-      "dev": true
-    },
-    "node_modules/is-number": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.12.0"
-      }
-    },
-    "node_modules/is-stream": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
-      "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "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==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/is-windows": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
-      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-wsl": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
-      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
-      "dev": true,
-      "dependencies": {
-        "is-docker": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
-    },
-    "node_modules/isbinaryfile": {
-      "version": "4.0.10",
-      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz",
-      "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==",
-      "dev": true,
-      "engines": {
-        "node": ">= 8.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/gjtorikian/"
-      }
-    },
-    "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/json-buffer": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
-      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
-      "dev": true
-    },
-    "node_modules/json-stringify-safe": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/jsonfile": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
-      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
-      "dev": true,
-      "dependencies": {
-        "universalify": "^2.0.0"
-      },
-      "optionalDependencies": {
-        "graceful-fs": "^4.1.6"
-      }
-    },
-    "node_modules/jszip": {
-      "version": "3.10.1",
-      "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
-      "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
-      "dependencies": {
-        "lie": "~3.3.0",
-        "pako": "~1.0.2",
-        "readable-stream": "~2.3.6",
-        "setimmediate": "^1.0.5"
-      }
-    },
-    "node_modules/jszip/node_modules/readable-stream": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
-      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
-      "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "node_modules/jszip/node_modules/safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
-    },
-    "node_modules/jszip/node_modules/string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "dependencies": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "node_modules/junk": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz",
-      "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/keyv": {
-      "version": "4.5.2",
-      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz",
-      "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==",
-      "dev": true,
-      "dependencies": {
-        "json-buffer": "3.0.1"
-      }
-    },
-    "node_modules/lie": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
-      "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
-      "dependencies": {
-        "immediate": "~3.0.5"
-      }
-    },
-    "node_modules/listr2": {
-      "version": "5.0.8",
-      "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz",
-      "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==",
-      "dev": true,
-      "dependencies": {
-        "cli-truncate": "^2.1.0",
-        "colorette": "^2.0.19",
-        "log-update": "^4.0.0",
-        "p-map": "^4.0.0",
-        "rfdc": "^1.3.0",
-        "rxjs": "^7.8.0",
-        "through": "^2.3.8",
-        "wrap-ansi": "^7.0.0"
-      },
-      "engines": {
-        "node": "^14.13.1 || >=16.0.0"
-      },
-      "peerDependencies": {
-        "enquirer": ">= 2.3.0 < 3"
-      },
-      "peerDependenciesMeta": {
-        "enquirer": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/load-json-file": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
-      "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==",
-      "dev": true,
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "parse-json": "^2.2.0",
-        "pify": "^2.0.0",
-        "strip-bom": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/locate-path": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
-      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
-      "dev": true,
-      "dependencies": {
-        "p-locate": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/lodash": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
-      "dev": true
-    },
-    "node_modules/lodash._reinterpolate": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
-      "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/lodash.get": {
-      "version": "4.4.2",
-      "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
-      "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
-      "dev": true
-    },
-    "node_modules/lodash.template": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
-      "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "lodash._reinterpolate": "^3.0.0",
-        "lodash.templatesettings": "^4.0.0"
-      }
-    },
-    "node_modules/lodash.templatesettings": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
-      "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "lodash._reinterpolate": "^3.0.0"
-      }
-    },
-    "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==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^4.1.0",
-        "is-unicode-supported": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/log-update": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
-      "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
-      "dev": true,
-      "dependencies": {
-        "ansi-escapes": "^4.3.0",
-        "cli-cursor": "^3.1.0",
-        "slice-ansi": "^4.0.0",
-        "wrap-ansi": "^6.2.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/log-update/node_modules/slice-ansi": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
-      "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "astral-regex": "^2.0.0",
-        "is-fullwidth-code-point": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/slice-ansi?sponsor=1"
-      }
-    },
-    "node_modules/log-update/node_modules/wrap-ansi": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
-      "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/lowercase-keys": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
-      "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/lru-cache": {
-      "version": "7.18.3",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
-      "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/lzma-native": {
-      "version": "8.0.6",
-      "resolved": "https://registry.npmjs.org/lzma-native/-/lzma-native-8.0.6.tgz",
-      "integrity": "sha512-09xfg67mkL2Lz20PrrDeNYZxzeW7ADtpYFbwSQh9U8+76RIzx5QsJBMy8qikv3hbUPfpy6hqwxt6FcGK81g9AA==",
-      "dev": true,
-      "hasInstallScript": true,
-      "dependencies": {
-        "node-addon-api": "^3.1.0",
-        "node-gyp-build": "^4.2.1",
-        "readable-stream": "^3.6.0"
-      },
-      "bin": {
-        "lzmajs": "bin/lzmajs"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
-    "node_modules/lzma-native/node_modules/node-addon-api": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz",
-      "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==",
-      "dev": true
-    },
-    "node_modules/make-fetch-happen": {
-      "version": "10.2.1",
-      "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz",
-      "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==",
-      "dev": true,
-      "dependencies": {
-        "agentkeepalive": "^4.2.1",
-        "cacache": "^16.1.0",
-        "http-cache-semantics": "^4.1.0",
-        "http-proxy-agent": "^5.0.0",
-        "https-proxy-agent": "^5.0.0",
-        "is-lambda": "^1.0.1",
-        "lru-cache": "^7.7.1",
-        "minipass": "^3.1.6",
-        "minipass-collect": "^1.0.2",
-        "minipass-fetch": "^2.0.3",
-        "minipass-flush": "^1.0.5",
-        "minipass-pipeline": "^1.2.4",
-        "negotiator": "^0.6.3",
-        "promise-retry": "^2.0.1",
-        "socks-proxy-agent": "^7.0.0",
-        "ssri": "^9.0.0"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/map-age-cleaner": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
-      "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
-      "dev": true,
-      "dependencies": {
-        "p-defer": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/matcher": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz",
-      "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "escape-string-regexp": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/mem": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
-      "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
-      "dev": true,
-      "dependencies": {
-        "map-age-cleaner": "^0.1.1",
-        "mimic-fn": "^2.0.0",
-        "p-is-promise": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/merge2": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
-      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/micromatch": {
-      "version": "4.0.5",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
-      "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
-      "dev": true,
-      "dependencies": {
-        "braces": "^3.0.2",
-        "picomatch": "^2.3.1"
-      },
-      "engines": {
-        "node": ">=8.6"
-      }
-    },
-    "node_modules/mimic-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/mimic-response": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
-      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/minimatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/minimist": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
-      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
-      "dev": true,
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "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": ">=8"
-      }
-    },
-    "node_modules/minipass-collect": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
-      "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
-      "dev": true,
-      "dependencies": {
-        "minipass": "^3.0.0"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/minipass-fetch": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz",
-      "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==",
-      "dev": true,
-      "dependencies": {
-        "minipass": "^3.1.6",
-        "minipass-sized": "^1.0.3",
-        "minizlib": "^2.1.2"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      },
-      "optionalDependencies": {
-        "encoding": "^0.1.13"
-      }
-    },
-    "node_modules/minipass-flush": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
-      "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
-      "dev": true,
-      "dependencies": {
-        "minipass": "^3.0.0"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/minipass-pipeline": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
-      "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
-      "dev": true,
-      "dependencies": {
-        "minipass": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/minipass-sized": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
-      "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
-      "dev": true,
-      "dependencies": {
-        "minipass": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/minizlib": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
-      "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
-      "dev": true,
-      "dependencies": {
-        "minipass": "^3.0.0",
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/mkdirp": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-      "dev": true,
-      "bin": {
-        "mkdirp": "bin/cmd.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
-    },
-    "node_modules/negotiator": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
-      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/nice-try": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
-      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
-      "dev": true
-    },
-    "node_modules/node-abi": {
-      "version": "3.33.0",
-      "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.33.0.tgz",
-      "integrity": "sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog==",
-      "dev": true,
-      "dependencies": {
-        "semver": "^7.3.5"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/node-api-version": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.1.4.tgz",
-      "integrity": "sha512-KGXihXdUChwJAOHO53bv9/vXcLmdUsZ6jIptbvYvkpKfth+r7jw44JkVxQFA3kX5nQjzjmGu1uAu/xNNLNlI5g==",
-      "dev": true,
-      "dependencies": {
-        "semver": "^7.3.5"
-      }
-    },
-    "node_modules/node-fetch": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz",
-      "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==",
-      "dev": true,
-      "dependencies": {
-        "whatwg-url": "^5.0.0"
-      },
-      "engines": {
-        "node": "4.x || >=6.0.0"
-      },
-      "peerDependencies": {
-        "encoding": "^0.1.0"
-      },
-      "peerDependenciesMeta": {
-        "encoding": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/node-gyp": {
-      "version": "9.3.1",
-      "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz",
-      "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==",
-      "dev": true,
-      "dependencies": {
-        "env-paths": "^2.2.0",
-        "glob": "^7.1.4",
-        "graceful-fs": "^4.2.6",
-        "make-fetch-happen": "^10.0.3",
-        "nopt": "^6.0.0",
-        "npmlog": "^6.0.0",
-        "rimraf": "^3.0.2",
-        "semver": "^7.3.5",
-        "tar": "^6.1.2",
-        "which": "^2.0.2"
-      },
-      "bin": {
-        "node-gyp": "bin/node-gyp.js"
-      },
-      "engines": {
-        "node": "^12.13 || ^14.13 || >=16"
-      }
-    },
-    "node_modules/node-gyp-build": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz",
-      "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==",
-      "bin": {
-        "node-gyp-build": "bin.js",
-        "node-gyp-build-optional": "optional.js",
-        "node-gyp-build-test": "build-test.js"
-      }
-    },
-    "node_modules/node-window-manager": {
-      "version": "2.2.4",
-      "resolved": "https://registry.npmjs.org/node-window-manager/-/node-window-manager-2.2.4.tgz",
-      "integrity": "sha512-Dgq9a7qx6+Gi+BifWM79leteNz76QUtwSsdiqEe7SjvoJsc8TYQsRl1IA5uxqz5iSLeHS1iA/8YI/snoq0DblA==",
-      "hasInstallScript": true,
-      "dependencies": {
-        "extract-file-icon": "^0.3.3",
-        "node-addon-api": "2.0.0",
-        "node-gyp-build": "^4.2.1"
-      }
-    },
-    "node_modules/node-window-manager/node_modules/node-addon-api": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.0.tgz",
-      "integrity": "sha512-ASCL5U13as7HhOExbT6OlWJJUV/lLzL2voOSP1UVehpRD8FbSrSDjfScK/KwAvVTI5AS6r4VwbOMlIqtvRidnA=="
-    },
-    "node_modules/nopt": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz",
-      "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==",
-      "dev": true,
-      "dependencies": {
-        "abbrev": "^1.0.0"
-      },
-      "bin": {
-        "nopt": "bin/nopt.js"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/normalize-package-data": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
-      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
-      "dev": true,
-      "dependencies": {
-        "hosted-git-info": "^2.1.4",
-        "resolve": "^1.10.0",
-        "semver": "2 || 3 || 4 || 5",
-        "validate-npm-package-license": "^3.0.1"
-      }
-    },
-    "node_modules/normalize-package-data/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/normalize-url": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
-      "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/npm-conf": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz",
-      "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "config-chain": "^1.1.11",
-        "pify": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/npm-conf/node_modules/pify": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-      "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/npm-run-path": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
-      "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==",
-      "dev": true,
-      "dependencies": {
-        "path-key": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/npm-run-path/node_modules/path-key": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-      "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/npmlog": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz",
-      "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==",
-      "dev": true,
-      "dependencies": {
-        "are-we-there-yet": "^3.0.0",
-        "console-control-strings": "^1.1.0",
-        "gauge": "^4.0.3",
-        "set-blocking": "^2.0.0"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/object-keys": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "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": {
-        "wrappy": "1"
-      }
-    },
-    "node_modules/onetime": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
-      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
-      "dev": true,
-      "dependencies": {
-        "mimic-fn": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "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==",
-      "dev": true,
-      "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"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/p-cancelable": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
-      "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/p-defer": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
-      "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/p-finally": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
-      "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/p-is-promise": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
-      "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "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": {
-        "yocto-queue": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/p-locate": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
-      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/p-map": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
-      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
-      "dev": true,
-      "dependencies": {
-        "aggregate-error": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/p-try": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/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-author": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz",
-      "integrity": "sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==",
-      "dev": true,
-      "dependencies": {
-        "author-regex": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/parse-json": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
-      "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==",
-      "dev": true,
-      "dependencies": {
-        "error-ex": "^1.2.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/parse-passwd": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
-      "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/path-exists": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/path-key": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/path-parse": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
-      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
-      "dev": true
-    },
-    "node_modules/path-type": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
-      "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==",
-      "dev": true,
-      "dependencies": {
-        "pify": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/pend": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
-      "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
-      "dev": true
-    },
-    "node_modules/picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "dev": true,
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/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/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": {
-        "find-up": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/pkg-dir/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/pkg-dir/node_modules/locate-path": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-      "dev": true,
-      "dependencies": {
-        "p-locate": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/pkg-dir/node_modules/p-limit": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-      "dev": true,
-      "dependencies": {
-        "p-try": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/pkg-dir/node_modules/p-locate": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/plist": {
-      "version": "3.0.6",
-      "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.6.tgz",
-      "integrity": "sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA==",
-      "dev": true,
-      "dependencies": {
-        "base64-js": "^1.5.1",
-        "xmlbuilder": "^15.1.1"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/prepend-http": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
-      "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/process-nextick-args": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
-    },
-    "node_modules/progress": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
-      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/promise-inflight": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
-      "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==",
-      "dev": true
-    },
-    "node_modules/promise-retry": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
-      "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
-      "dev": true,
-      "dependencies": {
-        "err-code": "^2.0.2",
-        "retry": "^0.12.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/proto-list": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
-      "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/pump": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
-      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
-      "dev": true,
-      "dependencies": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
-      }
-    },
-    "node_modules/queue-microtask": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
-      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
-    "node_modules/quick-lru": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
-      "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/rcedit": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-3.0.1.tgz",
-      "integrity": "sha512-XM0Jv40/y4hVAqj/MO70o/IWs4uOsaSoo2mLyk3klFDW+SStLnCtzuQu+1OBTIMGlM8CvaK9ftlYCp6DJ+cMsw==",
-      "dev": true,
-      "dependencies": {
-        "cross-spawn-windows-exe": "^1.1.0"
-      },
-      "engines": {
-        "node": ">= 10.0.0"
-      }
-    },
-    "node_modules/read-pkg": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
-      "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==",
-      "dev": true,
-      "dependencies": {
-        "load-json-file": "^2.0.0",
-        "normalize-package-data": "^2.3.2",
-        "path-type": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/read-pkg-up": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
-      "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==",
-      "dev": true,
-      "dependencies": {
-        "find-up": "^2.0.0",
-        "read-pkg": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/read-pkg-up/node_modules/find-up": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-      "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==",
-      "dev": true,
-      "dependencies": {
-        "locate-path": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/read-pkg-up/node_modules/locate-path": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-      "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==",
-      "dev": true,
-      "dependencies": {
-        "p-locate": "^2.0.0",
-        "path-exists": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/read-pkg-up/node_modules/p-limit": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
-      "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
-      "dev": true,
-      "dependencies": {
-        "p-try": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/read-pkg-up/node_modules/p-locate": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-      "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/read-pkg-up/node_modules/p-try": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-      "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/read-pkg-up/node_modules/path-exists": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-      "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "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==",
-      "dev": true,
-      "dependencies": {
-        "inherits": "^2.0.3",
-        "string_decoder": "^1.1.1",
-        "util-deprecate": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "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": {
-        "resolve": "^1.20.0"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      }
-    },
-    "node_modules/require-directory": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/require-main-filename": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
-      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/resolve": {
-      "version": "1.22.1",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
-      "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
-      "dev": true,
-      "dependencies": {
-        "is-core-module": "^2.9.0",
-        "path-parse": "^1.0.7",
-        "supports-preserve-symlinks-flag": "^1.0.0"
-      },
-      "bin": {
-        "resolve": "bin/resolve"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/resolve-alpn": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
-      "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
-      "dev": true
-    },
-    "node_modules/resolve-dir": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
-      "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==",
-      "dev": true,
-      "dependencies": {
-        "expand-tilde": "^2.0.0",
-        "global-modules": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/resolve-package": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/resolve-package/-/resolve-package-1.0.1.tgz",
-      "integrity": "sha512-rzB7NnQpOkPHBWFPP3prUMqOP6yg3HkRGgcvR+lDyvyHoY3fZLFLYDkPXh78SPVBAE6VTCk/V+j8we4djg6o4g==",
-      "dev": true,
-      "dependencies": {
-        "get-installed-path": "^2.0.3"
-      },
-      "engines": {
-        "node": ">=4",
-        "npm": ">=2"
-      }
-    },
-    "node_modules/responselike": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
-      "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
-      "dev": true,
-      "dependencies": {
-        "lowercase-keys": "^2.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "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==",
-      "dev": true,
-      "dependencies": {
-        "onetime": "^5.1.0",
-        "signal-exit": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/retry": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
-      "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
-      "dev": true,
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/reusify": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
-      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
-      "dev": true,
-      "engines": {
-        "iojs": ">=1.0.0",
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/rfdc": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
-      "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
-      "dev": true
-    },
-    "node_modules/rimraf": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/roarr": {
-      "version": "2.15.4",
-      "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz",
-      "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "boolean": "^3.0.1",
-        "detect-node": "^2.0.4",
-        "globalthis": "^1.0.1",
-        "json-stringify-safe": "^5.0.1",
-        "semver-compare": "^1.0.0",
-        "sprintf-js": "^1.1.2"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "node_modules/run-parallel": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
-      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "dependencies": {
-        "queue-microtask": "^1.2.2"
-      }
-    },
-    "node_modules/rxjs": {
-      "version": "7.8.0",
-      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz",
-      "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==",
-      "dev": true,
-      "dependencies": {
-        "tslib": "^2.1.0"
-      }
-    },
-    "node_modules/safe-buffer": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
-    "node_modules/safer-buffer": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/selenium-webdriver": {
-      "version": "4.8.1",
-      "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.8.1.tgz",
-      "integrity": "sha512-p4MtfhCQdcV6xxkS7eI0tQN6+WNReRULLCAuT4RDGkrjfObBNXMJ3WT8XdK+aXTr5nnBKuh+PxIevM0EjJgkxA==",
-      "dependencies": {
-        "jszip": "^3.10.0",
-        "tmp": "^0.2.1",
-        "ws": ">=8.11.0"
-      },
-      "engines": {
-        "node": ">= 14.20.0"
-      }
-    },
-    "node_modules/semver": {
-      "version": "7.3.8",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
-      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
-      "dev": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/semver-compare": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
-      "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/semver/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/serialize-error": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz",
-      "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "type-fest": "^0.13.1"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/serialize-error/node_modules/type-fest": {
-      "version": "0.13.1",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
-      "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/set-blocking": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
-      "dev": true
-    },
-    "node_modules/setimmediate": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
-      "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="
-    },
-    "node_modules/shebang-command": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-      "dev": true,
-      "dependencies": {
-        "shebang-regex": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/shebang-regex": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/signal-exit": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
-      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
-      "dev": true
-    },
-    "node_modules/slice-ansi": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
-      "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "astral-regex": "^2.0.0",
-        "is-fullwidth-code-point": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/smart-buffer": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
-      "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 6.0.0",
-        "npm": ">= 3.0.0"
-      }
-    },
-    "node_modules/socks": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
-      "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
-      "dev": true,
-      "dependencies": {
-        "ip": "^2.0.0",
-        "smart-buffer": "^4.2.0"
-      },
-      "engines": {
-        "node": ">= 10.13.0",
-        "npm": ">= 3.0.0"
-      }
-    },
-    "node_modules/socks-proxy-agent": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz",
-      "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==",
-      "dev": true,
-      "dependencies": {
-        "agent-base": "^6.0.2",
-        "debug": "^4.3.3",
-        "socks": "^2.6.2"
-      },
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "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==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "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": {
-        "buffer-from": "^1.0.0",
-        "source-map": "^0.6.0"
-      }
-    },
-    "node_modules/spdx-correct": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
-      "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
-      "dev": true,
-      "dependencies": {
-        "spdx-expression-parse": "^3.0.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "node_modules/spdx-exceptions": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
-      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
-      "dev": true
-    },
-    "node_modules/spdx-expression-parse": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
-      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
-      "dev": true,
-      "dependencies": {
-        "spdx-exceptions": "^2.1.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "node_modules/spdx-license-ids": {
-      "version": "3.0.13",
-      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz",
-      "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==",
-      "dev": true
-    },
-    "node_modules/sprintf-js": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
-      "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/ssri": {
-      "version": "9.0.1",
-      "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz",
-      "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==",
-      "dev": true,
-      "dependencies": {
-        "minipass": "^3.1.1"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/string_decoder": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
-      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
-      "dev": true,
-      "dependencies": {
-        "safe-buffer": "~5.2.0"
-      }
-    },
-    "node_modules/string-width": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "dev": true,
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/strip-bom": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
-      "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/strip-eof": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
-      "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/strip-outer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
-      "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
-      "dev": true,
-      "dependencies": {
-        "escape-string-regexp": "^1.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/strip-outer/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/sudo-prompt": {
-      "version": "9.2.1",
-      "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz",
-      "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==",
-      "dev": true
-    },
-    "node_modules/sumchecker": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz",
-      "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==",
-      "dev": true,
-      "dependencies": {
-        "debug": "^4.1.0"
-      },
-      "engines": {
-        "node": ">= 8.0"
-      }
-    },
-    "node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/supports-preserve-symlinks-flag": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
-      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/tar": {
-      "version": "6.1.13",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz",
-      "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==",
-      "dev": true,
-      "dependencies": {
-        "chownr": "^2.0.0",
-        "fs-minipass": "^2.0.0",
-        "minipass": "^4.0.0",
-        "minizlib": "^2.1.1",
-        "mkdirp": "^1.0.3",
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/tar/node_modules/minipass": {
-      "version": "4.2.5",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz",
-      "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/temp": {
-      "version": "0.9.4",
-      "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz",
-      "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "mkdirp": "^0.5.1",
-        "rimraf": "~2.6.2"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/temp/node_modules/mkdirp": {
-      "version": "0.5.6",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
-      "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "minimist": "^1.2.6"
-      },
-      "bin": {
-        "mkdirp": "bin/cmd.js"
-      }
-    },
-    "node_modules/temp/node_modules/rimraf": {
-      "version": "2.6.3",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
-      "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      }
-    },
-    "node_modules/through": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
-      "dev": true
-    },
-    "node_modules/tiny-each-async": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz",
-      "integrity": "sha512-5ROII7nElnAirvFn8g7H7MtpfV1daMcyfTGQwsn/x2VtyV+VPiO5CjReCJtWLvoKTDEDmZocf3cNPraiMnBXLA==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/tmp": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
-      "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
-      "dependencies": {
-        "rimraf": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8.17.0"
-      }
-    },
-    "node_modules/tmp-promise": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz",
-      "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==",
-      "dev": true,
-      "optional": true,
-      "dependencies": {
-        "tmp": "^0.2.0"
-      }
-    },
-    "node_modules/to-readable-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
-      "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=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==",
-      "dev": true,
-      "dependencies": {
-        "is-number": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "node_modules/tr46": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
-      "dev": true
-    },
-    "node_modules/trim-repeated": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
-      "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==",
-      "dev": true,
-      "dependencies": {
-        "escape-string-regexp": "^1.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/trim-repeated/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/tslib": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
-      "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
-      "dev": true
-    },
-    "node_modules/tunnel": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
-      "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.6.11 <=0.7.0 || >=0.7.3"
-      }
-    },
-    "node_modules/type-fest": {
-      "version": "0.21.3",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
-      "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/unique-filename": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz",
-      "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==",
-      "dev": true,
-      "dependencies": {
-        "unique-slug": "^3.0.0"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/unique-slug": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz",
-      "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==",
-      "dev": true,
-      "dependencies": {
-        "imurmurhash": "^0.1.4"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/universalify": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
-      "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
-      "dev": true,
-      "engines": {
-        "node": ">= 10.0.0"
-      }
-    },
-    "node_modules/url-parse-lax": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
-      "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==",
-      "dev": true,
-      "dependencies": {
-        "prepend-http": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/username": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/username/-/username-5.1.0.tgz",
-      "integrity": "sha512-PCKbdWw85JsYMvmCv5GH3kXmM66rCd9m1hBEDutPNv94b/pqCMT4NtcKyeWYvLFiE8b+ha1Jdl8XAaUdPn5QTg==",
-      "dev": true,
-      "dependencies": {
-        "execa": "^1.0.0",
-        "mem": "^4.3.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "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/validate-npm-package-license": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
-      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
-      "dev": true,
-      "dependencies": {
-        "spdx-correct": "^3.0.0",
-        "spdx-expression-parse": "^3.0.0"
-      }
-    },
-    "node_modules/wcwidth": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
-      "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
-      "dev": true,
-      "dependencies": {
-        "defaults": "^1.0.3"
-      }
-    },
-    "node_modules/webidl-conversions": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
-      "dev": true
-    },
-    "node_modules/whatwg-url": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
-      "dev": true,
-      "dependencies": {
-        "tr46": "~0.0.3",
-        "webidl-conversions": "^3.0.0"
-      }
-    },
-    "node_modules/which": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "dev": true,
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "node-which": "bin/node-which"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/which-module": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
-      "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==",
-      "dev": true,
-      "optional": true
-    },
-    "node_modules/wide-align": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
-      "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
-      "dev": true,
-      "dependencies": {
-        "string-width": "^1.0.2 || 2 || 3 || 4"
-      }
-    },
-    "node_modules/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==",
-      "dev": true,
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/wrap-ansi": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
-      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
-      }
-    },
-    "node_modules/wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
-    },
-    "node_modules/ws": {
-      "version": "8.13.0",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
-      "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
-      "engines": {
-        "node": ">=10.0.0"
-      },
-      "peerDependencies": {
-        "bufferutil": "^4.0.1",
-        "utf-8-validate": ">=5.0.2"
-      },
-      "peerDependenciesMeta": {
-        "bufferutil": {
-          "optional": true
-        },
-        "utf-8-validate": {
-          "optional": true
+    "name": "easy-spider",
+    "version": "0.3.3",
+    "lockfileVersion": 3,
+    "requires": true,
+    "packages": {
+        "": {
+            "name": "easy-spider",
+            "version": "0.3.3",
+            "license": "GPL-3.0",
+            "dependencies": {
+                "electron-squirrel-startup": "^1.0.0",
+                "http": "^0.0.1-security",
+                "multer": "^1.4.5-lts.1",
+                "node-window-manager": "^2.2.4",
+                "selenium-webdriver": "^4.8.0",
+                "ws": "^8.12.0",
+                "xlsx": "^0.18.5"
+            },
+            "devDependencies": {
+                "@electron-forge/cli": "^6.0.5",
+                "@electron-forge/maker-deb": "^6.0.5",
+                "@electron-forge/maker-rpm": "^6.0.5",
+                "@electron-forge/maker-squirrel": "^6.0.5",
+                "@electron-forge/maker-zip": "^6.0.5",
+                "electron": "^20.0.1"
+            }
+        },
+        "node_modules/@electron-forge/cli": {
+            "version": "6.0.5",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "individual",
+                    "url": "https://github.com/sponsors/malept"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/subscription/pkg/npm-.electron-forge-cli?utm_medium=referral&utm_source=npm_fund"
+                }
+            ],
+            "license": "MIT",
+            "dependencies": {
+                "@electron-forge/core": "6.0.5",
+                "@electron-forge/shared-types": "6.0.5",
+                "@electron/get": "^2.0.0",
+                "chalk": "^4.0.0",
+                "commander": "^4.1.1",
+                "debug": "^4.3.1",
+                "fs-extra": "^10.0.0",
+                "listr2": "^5.0.3",
+                "semver": "^7.2.1"
+            },
+            "bin": {
+                "electron-forge": "dist/electron-forge.js",
+                "electron-forge-vscode-nix": "script/vscode.sh",
+                "electron-forge-vscode-win": "script/vscode.cmd"
+            },
+            "engines": {
+                "node": ">= 14.17.5"
+            }
+        },
+        "node_modules/@electron-forge/core": {
+            "version": "6.0.5",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "individual",
+                    "url": "https://github.com/sponsors/malept"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/subscription/pkg/npm-.electron-forge-core?utm_medium=referral&utm_source=npm_fund"
+                }
+            ],
+            "license": "MIT",
+            "dependencies": {
+                "@electron-forge/core-utils": "6.0.5",
+                "@electron-forge/maker-base": "6.0.5",
+                "@electron-forge/plugin-base": "6.0.5",
+                "@electron-forge/publisher-base": "6.0.5",
+                "@electron-forge/shared-types": "6.0.5",
+                "@electron-forge/template-base": "6.0.5",
+                "@electron-forge/template-webpack": "6.0.5",
+                "@electron-forge/template-webpack-typescript": "6.0.5",
+                "@electron/get": "^2.0.0",
+                "@electron/rebuild": "^3.2.10",
+                "@malept/cross-spawn-promise": "^2.0.0",
+                "chalk": "^4.0.0",
+                "debug": "^4.3.1",
+                "electron-packager": "^17.1.1",
+                "fast-glob": "^3.2.7",
+                "filenamify": "^4.1.0",
+                "find-up": "^5.0.0",
+                "fs-extra": "^10.0.0",
+                "got": "^11.8.5",
+                "interpret": "^3.1.1",
+                "listr2": "^5.0.3",
+                "lodash": "^4.17.20",
+                "log-symbols": "^4.0.0",
+                "node-fetch": "^2.6.7",
+                "progress": "^2.0.3",
+                "rechoir": "^0.8.0",
+                "resolve-package": "^1.0.1",
+                "semver": "^7.2.1",
+                "source-map-support": "^0.5.13",
+                "sudo-prompt": "^9.1.1",
+                "username": "^5.1.0",
+                "yarn-or-npm": "^3.0.1"
+            },
+            "engines": {
+                "node": ">= 14.17.5"
+            }
+        },
+        "node_modules/@electron-forge/core-utils": {
+            "version": "6.0.5",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@electron-forge/shared-types": "6.0.5",
+                "@electron/rebuild": "^3.2.10",
+                "@malept/cross-spawn-promise": "^2.0.0",
+                "chalk": "^4.0.0",
+                "debug": "^4.3.1",
+                "find-up": "^5.0.0",
+                "fs-extra": "^10.0.0",
+                "log-symbols": "^4.0.0",
+                "semver": "^7.2.1",
+                "yarn-or-npm": "^3.0.1"
+            },
+            "engines": {
+                "node": ">= 14.17.5"
+            }
+        },
+        "node_modules/@electron-forge/maker-base": {
+            "version": "6.0.5",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@electron-forge/shared-types": "6.0.5",
+                "fs-extra": "^10.0.0",
+                "which": "^2.0.2"
+            },
+            "engines": {
+                "node": ">= 14.17.5"
+            }
+        },
+        "node_modules/@electron-forge/maker-deb": {
+            "version": "6.0.5",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@electron-forge/maker-base": "6.0.5",
+                "@electron-forge/shared-types": "6.0.5"
+            },
+            "engines": {
+                "node": ">= 14.17.5"
+            },
+            "optionalDependencies": {
+                "electron-installer-debian": "^3.0.0"
+            }
+        },
+        "node_modules/@electron-forge/maker-deb/node_modules/@malept/cross-spawn-promise": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz",
+            "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "individual",
+                    "url": "https://github.com/sponsors/malept"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund"
+                }
+            ],
+            "optional": true,
+            "dependencies": {
+                "cross-spawn": "^7.0.1"
+            },
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/@electron-forge/maker-deb/node_modules/cliui": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+            "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+            "dev": true,
+            "optional": true,
+            "dependencies": {
+                "string-width": "^4.2.0",
+                "strip-ansi": "^6.0.0",
+                "wrap-ansi": "^6.2.0"
+            }
+        },
+        "node_modules/@electron-forge/maker-deb/node_modules/electron-installer-debian": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/electron-installer-debian/-/electron-installer-debian-3.1.0.tgz",
+            "integrity": "sha512-k6KChvx0Fw8XTlCqwwbBfh19yGQaKjGdbugokmr1IpzINOm4QFyACKMTHAYFHW5LCBUZQShZD96hwxUZ+8Kx+w==",
+            "dev": true,
+            "optional": true,
+            "os": [
+                "darwin",
+                "linux"
+            ],
+            "dependencies": {
+                "@malept/cross-spawn-promise": "^1.0.0",
+                "debug": "^4.1.1",
+                "electron-installer-common": "^0.10.2",
+                "fs-extra": "^9.0.0",
+                "get-folder-size": "^2.0.1",
+                "lodash": "^4.17.4",
+                "word-wrap": "^1.2.3",
+                "yargs": "^15.0.1"
+            },
+            "bin": {
+                "electron-installer-debian": "src/cli.js"
+            },
+            "engines": {
+                "node": ">= 10.0.0"
+            }
+        },
+        "node_modules/@electron-forge/maker-deb/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,
+            "optional": true,
+            "dependencies": {
+                "locate-path": "^5.0.0",
+                "path-exists": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/@electron-forge/maker-deb/node_modules/fs-extra": {
+            "version": "9.1.0",
+            "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+            "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+            "dev": true,
+            "optional": true,
+            "dependencies": {
+                "at-least-node": "^1.0.0",
+                "graceful-fs": "^4.2.0",
+                "jsonfile": "^6.0.1",
+                "universalify": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/@electron-forge/maker-deb/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,
+            "optional": true,
+            "dependencies": {
+                "p-locate": "^4.1.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/@electron-forge/maker-deb/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,
+            "optional": true,
+            "dependencies": {
+                "p-try": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/@electron-forge/maker-deb/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,
+            "optional": true,
+            "dependencies": {
+                "p-limit": "^2.2.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/@electron-forge/maker-deb/node_modules/wrap-ansi": {
+            "version": "6.2.0",
+            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+            "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+            "dev": true,
+            "optional": true,
+            "dependencies": {
+                "ansi-styles": "^4.0.0",
+                "string-width": "^4.1.0",
+                "strip-ansi": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/@electron-forge/maker-deb/node_modules/y18n": {
+            "version": "4.0.3",
+            "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+            "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+            "dev": true,
+            "optional": true
+        },
+        "node_modules/@electron-forge/maker-deb/node_modules/yargs": {
+            "version": "15.4.1",
+            "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+            "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+            "dev": true,
+            "optional": true,
+            "dependencies": {
+                "cliui": "^6.0.0",
+                "decamelize": "^1.2.0",
+                "find-up": "^4.1.0",
+                "get-caller-file": "^2.0.1",
+                "require-directory": "^2.1.1",
+                "require-main-filename": "^2.0.0",
+                "set-blocking": "^2.0.0",
+                "string-width": "^4.2.0",
+                "which-module": "^2.0.0",
+                "y18n": "^4.0.0",
+                "yargs-parser": "^18.1.2"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/@electron-forge/maker-deb/node_modules/yargs-parser": {
+            "version": "18.1.3",
+            "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+            "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+            "dev": true,
+            "optional": true,
+            "dependencies": {
+                "camelcase": "^5.0.0",
+                "decamelize": "^1.2.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/@electron-forge/maker-rpm": {
+            "version": "6.0.5",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@electron-forge/maker-base": "6.0.5",
+                "@electron-forge/shared-types": "6.0.5"
+            },
+            "engines": {
+                "node": ">= 14.17.5"
+            },
+            "optionalDependencies": {
+                "electron-installer-redhat": "^3.2.0"
+            }
+        },
+        "node_modules/@electron-forge/maker-rpm/node_modules/@malept/cross-spawn-promise": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz",
+            "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "individual",
+                    "url": "https://github.com/sponsors/malept"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund"
+                }
+            ],
+            "optional": true,
+            "dependencies": {
+                "cross-spawn": "^7.0.1"
+            },
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/@electron-forge/maker-rpm/node_modules/cliui": {
+            "version": "7.0.4",
+            "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+            "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+            "dev": true,
+            "optional": true,
+            "dependencies": {
+                "string-width": "^4.2.0",
+                "strip-ansi": "^6.0.0",
+                "wrap-ansi": "^7.0.0"
+            }
+        },
+        "node_modules/@electron-forge/maker-rpm/node_modules/electron-installer-redhat": {
+            "version": "3.4.0",
+            "resolved": "https://registry.npmjs.org/electron-installer-redhat/-/electron-installer-redhat-3.4.0.tgz",
+            "integrity": "sha512-gEISr3U32Sgtj+fjxUAlSDo3wyGGq6OBx7rF5UdpIgbnpUvMN4W5uYb0ThpnAZ42VEJh/3aODQXHbFS4f5J3Iw==",
+            "dev": true,
+            "optional": true,
+            "os": [
+                "darwin",
+                "linux"
+            ],
+            "dependencies": {
+                "@malept/cross-spawn-promise": "^1.0.0",
+                "debug": "^4.1.1",
+                "electron-installer-common": "^0.10.2",
+                "fs-extra": "^9.0.0",
+                "lodash": "^4.17.15",
+                "word-wrap": "^1.2.3",
+                "yargs": "^16.0.2"
+            },
+            "bin": {
+                "electron-installer-redhat": "src/cli.js"
+            },
+            "engines": {
+                "node": ">= 10.0.0"
+            }
+        },
+        "node_modules/@electron-forge/maker-rpm/node_modules/fs-extra": {
+            "version": "9.1.0",
+            "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+            "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+            "dev": true,
+            "optional": true,
+            "dependencies": {
+                "at-least-node": "^1.0.0",
+                "graceful-fs": "^4.2.0",
+                "jsonfile": "^6.0.1",
+                "universalify": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/@electron-forge/maker-rpm/node_modules/yargs": {
+            "version": "16.2.0",
+            "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+            "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+            "dev": true,
+            "optional": true,
+            "dependencies": {
+                "cliui": "^7.0.2",
+                "escalade": "^3.1.1",
+                "get-caller-file": "^2.0.5",
+                "require-directory": "^2.1.1",
+                "string-width": "^4.2.0",
+                "y18n": "^5.0.5",
+                "yargs-parser": "^20.2.2"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/@electron-forge/maker-rpm/node_modules/yargs-parser": {
+            "version": "20.2.9",
+            "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+            "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+            "dev": true,
+            "optional": true,
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/@electron-forge/maker-squirrel": {
+            "version": "6.0.5",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@electron-forge/maker-base": "6.0.5",
+                "@electron-forge/shared-types": "6.0.5",
+                "fs-extra": "^10.0.0"
+            },
+            "engines": {
+                "node": ">= 14.17.5"
+            },
+            "optionalDependencies": {
+                "electron-winstaller": "^5.0.0"
+            }
+        },
+        "node_modules/@electron-forge/maker-zip": {
+            "version": "6.0.5",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@electron-forge/maker-base": "6.0.5",
+                "@electron-forge/shared-types": "6.0.5",
+                "cross-zip": "^4.0.0",
+                "fs-extra": "^10.0.0"
+            },
+            "engines": {
+                "node": ">= 14.17.5"
+            }
+        },
+        "node_modules/@electron-forge/plugin-base": {
+            "version": "6.0.5",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@electron-forge/shared-types": "6.0.5"
+            },
+            "engines": {
+                "node": ">= 14.17.5"
+            }
+        },
+        "node_modules/@electron-forge/publisher-base": {
+            "version": "6.0.5",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@electron-forge/shared-types": "6.0.5"
+            },
+            "engines": {
+                "node": ">= 14.17.5"
+            }
+        },
+        "node_modules/@electron-forge/shared-types": {
+            "version": "6.0.5",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@electron/rebuild": "^3.2.10",
+                "electron-packager": "^17.1.1",
+                "listr2": "^5.0.3"
+            },
+            "engines": {
+                "node": ">= 14.17.5"
+            }
+        },
+        "node_modules/@electron-forge/template-base": {
+            "version": "6.0.5",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@electron-forge/shared-types": "6.0.5",
+                "@malept/cross-spawn-promise": "^2.0.0",
+                "debug": "^4.3.1",
+                "fs-extra": "^10.0.0",
+                "username": "^5.1.0"
+            },
+            "engines": {
+                "node": ">= 14.17.5"
+            }
+        },
+        "node_modules/@electron-forge/template-webpack": {
+            "version": "6.0.5",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@electron-forge/shared-types": "6.0.5",
+                "@electron-forge/template-base": "6.0.5",
+                "fs-extra": "^10.0.0"
+            },
+            "engines": {
+                "node": ">= 14.17.5"
+            }
+        },
+        "node_modules/@electron-forge/template-webpack-typescript": {
+            "version": "6.0.5",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@electron-forge/shared-types": "6.0.5",
+                "@electron-forge/template-base": "6.0.5",
+                "fs-extra": "^10.0.0"
+            },
+            "engines": {
+                "node": ">= 14.17.5"
+            }
+        },
+        "node_modules/@electron/asar": {
+            "version": "3.2.3",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "chromium-pickle-js": "^0.2.0",
+                "commander": "^5.0.0",
+                "glob": "^7.1.6",
+                "minimatch": "^3.0.4"
+            },
+            "bin": {
+                "asar": "bin/asar.js"
+            },
+            "engines": {
+                "node": ">=10.12.0"
+            },
+            "optionalDependencies": {
+                "@types/glob": "^7.1.1"
+            }
+        },
+        "node_modules/@electron/asar/node_modules/commander": {
+            "version": "5.1.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/@electron/get": {
+            "version": "2.0.2",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "debug": "^4.1.1",
+                "env-paths": "^2.2.0",
+                "fs-extra": "^8.1.0",
+                "got": "^11.8.5",
+                "progress": "^2.0.3",
+                "semver": "^6.2.0",
+                "sumchecker": "^3.0.1"
+            },
+            "engines": {
+                "node": ">=12"
+            },
+            "optionalDependencies": {
+                "global-agent": "^3.0.0"
+            }
+        },
+        "node_modules/@electron/get/node_modules/fs-extra": {
+            "version": "8.1.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "graceful-fs": "^4.2.0",
+                "jsonfile": "^4.0.0",
+                "universalify": "^0.1.0"
+            },
+            "engines": {
+                "node": ">=6 <7 || >=8"
+            }
+        },
+        "node_modules/@electron/get/node_modules/jsonfile": {
+            "version": "4.0.0",
+            "dev": true,
+            "license": "MIT",
+            "optionalDependencies": {
+                "graceful-fs": "^4.1.6"
+            }
+        },
+        "node_modules/@electron/get/node_modules/semver": {
+            "version": "6.3.0",
+            "dev": true,
+            "license": "ISC",
+            "bin": {
+                "semver": "bin/semver.js"
+            }
+        },
+        "node_modules/@electron/get/node_modules/universalify": {
+            "version": "0.1.2",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 4.0.0"
+            }
+        },
+        "node_modules/@electron/notarize": {
+            "version": "1.2.3",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "debug": "^4.1.1",
+                "fs-extra": "^9.0.1"
+            },
+            "engines": {
+                "node": ">= 10.0.0"
+            }
+        },
+        "node_modules/@electron/notarize/node_modules/fs-extra": {
+            "version": "9.1.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "at-least-node": "^1.0.0",
+                "graceful-fs": "^4.2.0",
+                "jsonfile": "^6.0.1",
+                "universalify": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/@electron/osx-sign": {
+            "version": "1.0.4",
+            "dev": true,
+            "license": "BSD-2-Clause",
+            "dependencies": {
+                "compare-version": "^0.1.2",
+                "debug": "^4.3.4",
+                "fs-extra": "^10.0.0",
+                "isbinaryfile": "^4.0.8",
+                "minimist": "^1.2.6",
+                "plist": "^3.0.5"
+            },
+            "bin": {
+                "electron-osx-flat": "bin/electron-osx-flat.js",
+                "electron-osx-sign": "bin/electron-osx-sign.js"
+            },
+            "engines": {
+                "node": ">=12.0.0"
+            }
+        },
+        "node_modules/@electron/rebuild": {
+            "version": "3.2.10",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@malept/cross-spawn-promise": "^2.0.0",
+                "chalk": "^4.0.0",
+                "debug": "^4.1.1",
+                "detect-libc": "^2.0.1",
+                "fs-extra": "^10.0.0",
+                "got": "^11.7.0",
+                "lzma-native": "^8.0.5",
+                "node-abi": "^3.0.0",
+                "node-api-version": "^0.1.4",
+                "node-gyp": "^9.0.0",
+                "ora": "^5.1.0",
+                "semver": "^7.3.5",
+                "tar": "^6.0.5",
+                "yargs": "^17.0.1"
+            },
+            "bin": {
+                "electron-rebuild": "lib/src/cli.js"
+            },
+            "engines": {
+                "node": ">=12.13.0"
+            }
+        },
+        "node_modules/@electron/universal": {
+            "version": "1.3.4",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@electron/asar": "^3.2.1",
+                "@malept/cross-spawn-promise": "^1.1.0",
+                "debug": "^4.3.1",
+                "dir-compare": "^3.0.0",
+                "fs-extra": "^9.0.1",
+                "minimatch": "^3.0.4",
+                "plist": "^3.0.4"
+            },
+            "engines": {
+                "node": ">=8.6"
+            }
+        },
+        "node_modules/@electron/universal/node_modules/@malept/cross-spawn-promise": {
+            "version": "1.1.1",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "individual",
+                    "url": "https://github.com/sponsors/malept"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund"
+                }
+            ],
+            "license": "Apache-2.0",
+            "dependencies": {
+                "cross-spawn": "^7.0.1"
+            },
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/@electron/universal/node_modules/fs-extra": {
+            "version": "9.1.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "at-least-node": "^1.0.0",
+                "graceful-fs": "^4.2.0",
+                "jsonfile": "^6.0.1",
+                "universalify": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/@gar/promisify": {
+            "version": "1.1.3",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/@malept/cross-spawn-promise": {
+            "version": "2.0.0",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "individual",
+                    "url": "https://github.com/sponsors/malept"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund"
+                }
+            ],
+            "license": "Apache-2.0",
+            "dependencies": {
+                "cross-spawn": "^7.0.1"
+            },
+            "engines": {
+                "node": ">= 12.13.0"
+            }
+        },
+        "node_modules/@nodelib/fs.scandir": {
+            "version": "2.1.5",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@nodelib/fs.stat": "2.0.5",
+                "run-parallel": "^1.1.9"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/@nodelib/fs.stat": {
+            "version": "2.0.5",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/@nodelib/fs.walk": {
+            "version": "1.2.8",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@nodelib/fs.scandir": "2.1.5",
+                "fastq": "^1.6.0"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/@npmcli/fs": {
+            "version": "2.1.2",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "@gar/promisify": "^1.1.3",
+                "semver": "^7.3.5"
+            },
+            "engines": {
+                "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+            }
+        },
+        "node_modules/@npmcli/move-file": {
+            "version": "2.0.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "mkdirp": "^1.0.4",
+                "rimraf": "^3.0.2"
+            },
+            "engines": {
+                "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+            }
+        },
+        "node_modules/@sindresorhus/is": {
+            "version": "4.6.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sindresorhus/is?sponsor=1"
+            }
+        },
+        "node_modules/@szmarczak/http-timer": {
+            "version": "4.0.6",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "defer-to-connect": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/@tootallnate/once": {
+            "version": "2.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/@types/cacheable-request": {
+            "version": "6.0.3",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@types/http-cache-semantics": "*",
+                "@types/keyv": "^3.1.4",
+                "@types/node": "*",
+                "@types/responselike": "^1.0.0"
+            }
+        },
+        "node_modules/@types/fs-extra": {
+            "version": "9.0.13",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "@types/node": "*"
+            }
+        },
+        "node_modules/@types/glob": {
+            "version": "7.2.0",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "@types/minimatch": "*",
+                "@types/node": "*"
+            }
+        },
+        "node_modules/@types/http-cache-semantics": {
+            "version": "4.0.1",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/@types/keyv": {
+            "version": "3.1.4",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@types/node": "*"
+            }
+        },
+        "node_modules/@types/minimatch": {
+            "version": "5.1.2",
+            "dev": true,
+            "license": "MIT",
+            "optional": true
+        },
+        "node_modules/@types/node": {
+            "version": "16.18.16",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/@types/responselike": {
+            "version": "1.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@types/node": "*"
+            }
+        },
+        "node_modules/@types/yauzl": {
+            "version": "2.10.0",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "@types/node": "*"
+            }
+        },
+        "node_modules/abbrev": {
+            "version": "1.1.1",
+            "dev": true,
+            "license": "ISC"
+        },
+        "node_modules/adler-32": {
+            "version": "1.3.1",
+            "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz",
+            "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==",
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/agent-base": {
+            "version": "6.0.2",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "debug": "4"
+            },
+            "engines": {
+                "node": ">= 6.0.0"
+            }
+        },
+        "node_modules/agentkeepalive": {
+            "version": "4.3.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "debug": "^4.1.0",
+                "depd": "^2.0.0",
+                "humanize-ms": "^1.2.1"
+            },
+            "engines": {
+                "node": ">= 8.0.0"
+            }
+        },
+        "node_modules/aggregate-error": {
+            "version": "3.1.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "clean-stack": "^2.0.0",
+                "indent-string": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/ansi-escapes": {
+            "version": "4.3.2",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "type-fest": "^0.21.3"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/ansi-regex": {
+            "version": "5.0.1",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/append-field": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
+            "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw=="
+        },
+        "node_modules/aproba": {
+            "version": "2.0.0",
+            "dev": true,
+            "license": "ISC"
+        },
+        "node_modules/are-we-there-yet": {
+            "version": "3.0.1",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "delegates": "^1.0.0",
+                "readable-stream": "^3.6.0"
+            },
+            "engines": {
+                "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+            }
+        },
+        "node_modules/asar": {
+            "version": "3.2.0",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "chromium-pickle-js": "^0.2.0",
+                "commander": "^5.0.0",
+                "glob": "^7.1.6",
+                "minimatch": "^3.0.4"
+            },
+            "bin": {
+                "asar": "bin/asar.js"
+            },
+            "engines": {
+                "node": ">=10.12.0"
+            },
+            "optionalDependencies": {
+                "@types/glob": "^7.1.1"
+            }
+        },
+        "node_modules/asar/node_modules/commander": {
+            "version": "5.1.0",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/astral-regex": {
+            "version": "2.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/at-least-node": {
+            "version": "1.0.0",
+            "dev": true,
+            "license": "ISC",
+            "engines": {
+                "node": ">= 4.0.0"
+            }
+        },
+        "node_modules/author-regex": {
+            "version": "1.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/balanced-match": {
+            "version": "1.0.2",
+            "license": "MIT"
+        },
+        "node_modules/base64-js": {
+            "version": "1.5.1",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ],
+            "license": "MIT"
+        },
+        "node_modules/bl": {
+            "version": "4.1.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "buffer": "^5.5.0",
+                "inherits": "^2.0.4",
+                "readable-stream": "^3.4.0"
+            }
+        },
+        "node_modules/bluebird": {
+            "version": "3.7.2",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/boolean": {
+            "version": "3.2.0",
+            "dev": true,
+            "license": "MIT",
+            "optional": true
+        },
+        "node_modules/brace-expansion": {
+            "version": "1.1.11",
+            "license": "MIT",
+            "dependencies": {
+                "balanced-match": "^1.0.0",
+                "concat-map": "0.0.1"
+            }
+        },
+        "node_modules/braces": {
+            "version": "3.0.2",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "fill-range": "^7.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/buffer": {
+            "version": "5.7.1",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ],
+            "license": "MIT",
+            "dependencies": {
+                "base64-js": "^1.3.1",
+                "ieee754": "^1.1.13"
+            }
+        },
+        "node_modules/buffer-crc32": {
+            "version": "0.2.13",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/buffer-equal": {
+            "version": "1.0.1",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/buffer-from": {
+            "version": "1.1.2",
+            "license": "MIT"
+        },
+        "node_modules/busboy": {
+            "version": "1.6.0",
+            "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
+            "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
+            "dependencies": {
+                "streamsearch": "^1.1.0"
+            },
+            "engines": {
+                "node": ">=10.16.0"
+            }
+        },
+        "node_modules/cacache": {
+            "version": "16.1.3",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "@npmcli/fs": "^2.1.0",
+                "@npmcli/move-file": "^2.0.0",
+                "chownr": "^2.0.0",
+                "fs-minipass": "^2.1.0",
+                "glob": "^8.0.1",
+                "infer-owner": "^1.0.4",
+                "lru-cache": "^7.7.1",
+                "minipass": "^3.1.6",
+                "minipass-collect": "^1.0.2",
+                "minipass-flush": "^1.0.5",
+                "minipass-pipeline": "^1.2.4",
+                "mkdirp": "^1.0.4",
+                "p-map": "^4.0.0",
+                "promise-inflight": "^1.0.1",
+                "rimraf": "^3.0.2",
+                "ssri": "^9.0.0",
+                "tar": "^6.1.11",
+                "unique-filename": "^2.0.0"
+            },
+            "engines": {
+                "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+            }
+        },
+        "node_modules/cacache/node_modules/brace-expansion": {
+            "version": "2.0.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "balanced-match": "^1.0.0"
+            }
+        },
+        "node_modules/cacache/node_modules/glob": {
+            "version": "8.1.0",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "fs.realpath": "^1.0.0",
+                "inflight": "^1.0.4",
+                "inherits": "2",
+                "minimatch": "^5.0.1",
+                "once": "^1.3.0"
+            },
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/cacache/node_modules/minimatch": {
+            "version": "5.1.6",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "brace-expansion": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/cacheable-lookup": {
+            "version": "5.0.4",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=10.6.0"
+            }
+        },
+        "node_modules/cacheable-request": {
+            "version": "7.0.2",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "clone-response": "^1.0.2",
+                "get-stream": "^5.1.0",
+                "http-cache-semantics": "^4.0.0",
+                "keyv": "^4.0.0",
+                "lowercase-keys": "^2.0.0",
+                "normalize-url": "^6.0.1",
+                "responselike": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/camelcase": {
+            "version": "5.3.1",
+            "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+            "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+            "dev": true,
+            "optional": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/cfb": {
+            "version": "1.2.2",
+            "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz",
+            "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
+            "dependencies": {
+                "adler-32": "~1.3.0",
+                "crc-32": "~1.2.0"
+            },
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/chalk": {
+            "version": "4.1.2",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/chownr": {
+            "version": "2.0.0",
+            "dev": true,
+            "license": "ISC",
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/chromium-pickle-js": {
+            "version": "0.2.0",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/clean-stack": {
+            "version": "2.2.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/cli-cursor": {
+            "version": "3.1.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "restore-cursor": "^3.1.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/cli-spinners": {
+            "version": "2.7.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/cli-truncate": {
+            "version": "2.1.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "slice-ansi": "^3.0.0",
+                "string-width": "^4.2.0"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/cliui": {
+            "version": "8.0.1",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "string-width": "^4.2.0",
+                "strip-ansi": "^6.0.1",
+                "wrap-ansi": "^7.0.0"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/clone": {
+            "version": "1.0.4",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/clone-response": {
+            "version": "1.0.3",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "mimic-response": "^1.0.0"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/codepage": {
+            "version": "1.15.0",
+            "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz",
+            "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==",
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/color-convert": {
+            "version": "2.0.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/color-name": {
+            "version": "1.1.4",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/color-support": {
+            "version": "1.1.3",
+            "dev": true,
+            "license": "ISC",
+            "bin": {
+                "color-support": "bin.js"
+            }
+        },
+        "node_modules/colorette": {
+            "version": "2.0.19",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/commander": {
+            "version": "4.1.1",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/compare-version": {
+            "version": "0.1.2",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/concat-map": {
+            "version": "0.0.1",
+            "license": "MIT"
+        },
+        "node_modules/concat-stream": {
+            "version": "1.6.2",
+            "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+            "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+            "engines": [
+                "node >= 0.8"
+            ],
+            "dependencies": {
+                "buffer-from": "^1.0.0",
+                "inherits": "^2.0.3",
+                "readable-stream": "^2.2.2",
+                "typedarray": "^0.0.6"
+            }
+        },
+        "node_modules/concat-stream/node_modules/readable-stream": {
+            "version": "2.3.8",
+            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+            "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+            "dependencies": {
+                "core-util-is": "~1.0.0",
+                "inherits": "~2.0.3",
+                "isarray": "~1.0.0",
+                "process-nextick-args": "~2.0.0",
+                "safe-buffer": "~5.1.1",
+                "string_decoder": "~1.1.1",
+                "util-deprecate": "~1.0.1"
+            }
+        },
+        "node_modules/concat-stream/node_modules/safe-buffer": {
+            "version": "5.1.2",
+            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+            "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+        },
+        "node_modules/concat-stream/node_modules/string_decoder": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+            "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+            "dependencies": {
+                "safe-buffer": "~5.1.0"
+            }
+        },
+        "node_modules/config-chain": {
+            "version": "1.1.13",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "ini": "^1.3.4",
+                "proto-list": "~1.2.1"
+            }
+        },
+        "node_modules/console-control-strings": {
+            "version": "1.1.0",
+            "dev": true,
+            "license": "ISC"
+        },
+        "node_modules/core-util-is": {
+            "version": "1.0.3",
+            "license": "MIT"
+        },
+        "node_modules/crc-32": {
+            "version": "1.2.2",
+            "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
+            "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
+            "bin": {
+                "crc32": "bin/crc32.njs"
+            },
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/cross-spawn": {
+            "version": "7.0.3",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "path-key": "^3.1.0",
+                "shebang-command": "^2.0.0",
+                "which": "^2.0.1"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/cross-spawn-windows-exe": {
+            "version": "1.2.0",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "individual",
+                    "url": "https://github.com/sponsors/malept"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/subscription/pkg/npm-cross-spawn-windows-exe?utm_medium=referral&utm_source=npm_fund"
+                }
+            ],
+            "license": "Apache-2.0",
+            "dependencies": {
+                "@malept/cross-spawn-promise": "^1.1.0",
+                "is-wsl": "^2.2.0",
+                "which": "^2.0.2"
+            },
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/cross-spawn-windows-exe/node_modules/@malept/cross-spawn-promise": {
+            "version": "1.1.1",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "individual",
+                    "url": "https://github.com/sponsors/malept"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund"
+                }
+            ],
+            "license": "Apache-2.0",
+            "dependencies": {
+                "cross-spawn": "^7.0.1"
+            },
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/cross-zip": {
+            "version": "4.0.0",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ],
+            "license": "MIT",
+            "engines": {
+                "node": ">=12.10"
+            }
+        },
+        "node_modules/debug": {
+            "version": "4.3.4",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ms": "2.1.2"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/decamelize": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+            "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+            "dev": true,
+            "optional": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/decompress-response": {
+            "version": "6.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "mimic-response": "^3.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/decompress-response/node_modules/mimic-response": {
+            "version": "3.1.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/defaults": {
+            "version": "1.0.4",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "clone": "^1.0.2"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/defer-to-connect": {
+            "version": "2.0.1",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/define-properties": {
+            "version": "1.2.0",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "has-property-descriptors": "^1.0.0",
+                "object-keys": "^1.1.1"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/delegates": {
+            "version": "1.0.0",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/depd": {
+            "version": "2.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/detect-libc": {
+            "version": "2.0.1",
+            "dev": true,
+            "license": "Apache-2.0",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/detect-node": {
+            "version": "2.1.0",
+            "dev": true,
+            "license": "MIT",
+            "optional": true
+        },
+        "node_modules/dir-compare": {
+            "version": "3.3.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "buffer-equal": "^1.0.0",
+                "minimatch": "^3.0.4"
+            }
+        },
+        "node_modules/duplexer3": {
+            "version": "0.1.5",
+            "dev": true,
+            "license": "BSD-3-Clause"
+        },
+        "node_modules/electron": {
+            "version": "20.0.1",
+            "dev": true,
+            "hasInstallScript": true,
+            "license": "MIT",
+            "dependencies": {
+                "@electron/get": "^1.14.1",
+                "@types/node": "^16.11.26",
+                "extract-zip": "^2.0.1"
+            },
+            "bin": {
+                "electron": "cli.js"
+            },
+            "engines": {
+                "node": ">= 10.17.0"
+            }
+        },
+        "node_modules/electron-installer-common": {
+            "version": "0.10.3",
+            "dev": true,
+            "license": "Apache-2.0",
+            "optional": true,
+            "dependencies": {
+                "@malept/cross-spawn-promise": "^1.0.0",
+                "asar": "^3.0.0",
+                "debug": "^4.1.1",
+                "fs-extra": "^9.0.0",
+                "glob": "^7.1.4",
+                "lodash": "^4.17.15",
+                "parse-author": "^2.0.0",
+                "semver": "^7.1.1",
+                "tmp-promise": "^3.0.2"
+            },
+            "engines": {
+                "node": ">= 10.0.0"
+            },
+            "funding": {
+                "url": "https://github.com/electron-userland/electron-installer-common?sponsor=1"
+            },
+            "optionalDependencies": {
+                "@types/fs-extra": "^9.0.1"
+            }
+        },
+        "node_modules/electron-installer-common/node_modules/@malept/cross-spawn-promise": {
+            "version": "1.1.1",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "individual",
+                    "url": "https://github.com/sponsors/malept"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund"
+                }
+            ],
+            "license": "Apache-2.0",
+            "optional": true,
+            "dependencies": {
+                "cross-spawn": "^7.0.1"
+            },
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/electron-installer-common/node_modules/fs-extra": {
+            "version": "9.1.0",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "at-least-node": "^1.0.0",
+                "graceful-fs": "^4.2.0",
+                "jsonfile": "^6.0.1",
+                "universalify": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/electron-packager": {
+            "version": "17.1.1",
+            "dev": true,
+            "license": "BSD-2-Clause",
+            "dependencies": {
+                "@electron/asar": "^3.2.1",
+                "@electron/get": "^2.0.0",
+                "@electron/notarize": "^1.2.3",
+                "@electron/osx-sign": "^1.0.1",
+                "@electron/universal": "^1.3.2",
+                "cross-spawn-windows-exe": "^1.2.0",
+                "debug": "^4.0.1",
+                "extract-zip": "^2.0.0",
+                "filenamify": "^4.1.0",
+                "fs-extra": "^10.1.0",
+                "galactus": "^0.2.1",
+                "get-package-info": "^1.0.0",
+                "junk": "^3.1.0",
+                "parse-author": "^2.0.0",
+                "plist": "^3.0.0",
+                "rcedit": "^3.0.1",
+                "resolve": "^1.1.6",
+                "semver": "^7.1.3",
+                "yargs-parser": "^21.1.1"
+            },
+            "bin": {
+                "electron-packager": "bin/electron-packager.js"
+            },
+            "engines": {
+                "node": ">= 14.17.5"
+            },
+            "funding": {
+                "url": "https://github.com/electron/electron-packager?sponsor=1"
+            }
+        },
+        "node_modules/electron-squirrel-startup": {
+            "version": "1.0.0",
+            "license": "Apache-2.0",
+            "dependencies": {
+                "debug": "^2.2.0"
+            }
+        },
+        "node_modules/electron-squirrel-startup/node_modules/debug": {
+            "version": "2.6.9",
+            "license": "MIT",
+            "dependencies": {
+                "ms": "2.0.0"
+            }
+        },
+        "node_modules/electron-squirrel-startup/node_modules/ms": {
+            "version": "2.0.0",
+            "license": "MIT"
+        },
+        "node_modules/electron-winstaller": {
+            "version": "5.1.0",
+            "dev": true,
+            "hasInstallScript": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "@electron/asar": "^3.2.1",
+                "debug": "^4.1.1",
+                "fs-extra": "^7.0.1",
+                "lodash.template": "^4.2.2",
+                "temp": "^0.9.0"
+            },
+            "engines": {
+                "node": ">=8.0.0"
+            }
+        },
+        "node_modules/electron-winstaller/node_modules/fs-extra": {
+            "version": "7.0.1",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "graceful-fs": "^4.1.2",
+                "jsonfile": "^4.0.0",
+                "universalify": "^0.1.0"
+            },
+            "engines": {
+                "node": ">=6 <7 || >=8"
+            }
+        },
+        "node_modules/electron-winstaller/node_modules/jsonfile": {
+            "version": "4.0.0",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "optionalDependencies": {
+                "graceful-fs": "^4.1.6"
+            }
+        },
+        "node_modules/electron-winstaller/node_modules/universalify": {
+            "version": "0.1.2",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "engines": {
+                "node": ">= 4.0.0"
+            }
+        },
+        "node_modules/electron/node_modules/@electron/get": {
+            "version": "1.14.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "debug": "^4.1.1",
+                "env-paths": "^2.2.0",
+                "fs-extra": "^8.1.0",
+                "got": "^9.6.0",
+                "progress": "^2.0.3",
+                "semver": "^6.2.0",
+                "sumchecker": "^3.0.1"
+            },
+            "engines": {
+                "node": ">=8.6"
+            },
+            "optionalDependencies": {
+                "global-agent": "^3.0.0",
+                "global-tunnel-ng": "^2.7.1"
+            }
+        },
+        "node_modules/electron/node_modules/@sindresorhus/is": {
+            "version": "0.14.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/electron/node_modules/@szmarczak/http-timer": {
+            "version": "1.1.2",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "defer-to-connect": "^1.0.1"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/electron/node_modules/cacheable-request": {
+            "version": "6.1.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "clone-response": "^1.0.2",
+                "get-stream": "^5.1.0",
+                "http-cache-semantics": "^4.0.0",
+                "keyv": "^3.0.0",
+                "lowercase-keys": "^2.0.0",
+                "normalize-url": "^4.1.0",
+                "responselike": "^1.0.2"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/electron/node_modules/decompress-response": {
+            "version": "3.3.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "mimic-response": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/electron/node_modules/defer-to-connect": {
+            "version": "1.1.3",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/electron/node_modules/fs-extra": {
+            "version": "8.1.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "graceful-fs": "^4.2.0",
+                "jsonfile": "^4.0.0",
+                "universalify": "^0.1.0"
+            },
+            "engines": {
+                "node": ">=6 <7 || >=8"
+            }
+        },
+        "node_modules/electron/node_modules/got": {
+            "version": "9.6.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@sindresorhus/is": "^0.14.0",
+                "@szmarczak/http-timer": "^1.1.2",
+                "cacheable-request": "^6.0.0",
+                "decompress-response": "^3.3.0",
+                "duplexer3": "^0.1.4",
+                "get-stream": "^4.1.0",
+                "lowercase-keys": "^1.0.1",
+                "mimic-response": "^1.0.1",
+                "p-cancelable": "^1.0.0",
+                "to-readable-stream": "^1.0.0",
+                "url-parse-lax": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8.6"
+            }
+        },
+        "node_modules/electron/node_modules/got/node_modules/get-stream": {
+            "version": "4.1.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "pump": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/electron/node_modules/got/node_modules/lowercase-keys": {
+            "version": "1.0.1",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/electron/node_modules/json-buffer": {
+            "version": "3.0.0",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/electron/node_modules/jsonfile": {
+            "version": "4.0.0",
+            "dev": true,
+            "license": "MIT",
+            "optionalDependencies": {
+                "graceful-fs": "^4.1.6"
+            }
+        },
+        "node_modules/electron/node_modules/keyv": {
+            "version": "3.1.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "json-buffer": "3.0.0"
+            }
+        },
+        "node_modules/electron/node_modules/normalize-url": {
+            "version": "4.5.1",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/electron/node_modules/p-cancelable": {
+            "version": "1.1.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/electron/node_modules/responselike": {
+            "version": "1.0.2",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "lowercase-keys": "^1.0.0"
+            }
+        },
+        "node_modules/electron/node_modules/responselike/node_modules/lowercase-keys": {
+            "version": "1.0.1",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/electron/node_modules/semver": {
+            "version": "6.3.0",
+            "dev": true,
+            "license": "ISC",
+            "bin": {
+                "semver": "bin/semver.js"
+            }
+        },
+        "node_modules/electron/node_modules/universalify": {
+            "version": "0.1.2",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 4.0.0"
+            }
+        },
+        "node_modules/emoji-regex": {
+            "version": "8.0.0",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/encodeurl": {
+            "version": "1.0.2",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/encoding": {
+            "version": "0.1.13",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "iconv-lite": "^0.6.2"
+            }
+        },
+        "node_modules/end-of-stream": {
+            "version": "1.4.4",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "once": "^1.4.0"
+            }
+        },
+        "node_modules/env-paths": {
+            "version": "2.2.1",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/err-code": {
+            "version": "2.0.3",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/error-ex": {
+            "version": "1.3.2",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "is-arrayish": "^0.2.1"
+            }
+        },
+        "node_modules/es6-error": {
+            "version": "4.1.1",
+            "dev": true,
+            "license": "MIT",
+            "optional": true
+        },
+        "node_modules/escalade": {
+            "version": "3.1.1",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/escape-string-regexp": {
+            "version": "4.0.0",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/execa": {
+            "version": "1.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "cross-spawn": "^6.0.0",
+                "get-stream": "^4.0.0",
+                "is-stream": "^1.1.0",
+                "npm-run-path": "^2.0.0",
+                "p-finally": "^1.0.0",
+                "signal-exit": "^3.0.0",
+                "strip-eof": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/execa/node_modules/cross-spawn": {
+            "version": "6.0.5",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "nice-try": "^1.0.4",
+                "path-key": "^2.0.1",
+                "semver": "^5.5.0",
+                "shebang-command": "^1.2.0",
+                "which": "^1.2.9"
+            },
+            "engines": {
+                "node": ">=4.8"
+            }
+        },
+        "node_modules/execa/node_modules/get-stream": {
+            "version": "4.1.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "pump": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/execa/node_modules/path-key": {
+            "version": "2.0.1",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/execa/node_modules/semver": {
+            "version": "5.7.1",
+            "dev": true,
+            "license": "ISC",
+            "bin": {
+                "semver": "bin/semver"
+            }
+        },
+        "node_modules/execa/node_modules/shebang-command": {
+            "version": "1.2.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "shebang-regex": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/execa/node_modules/shebang-regex": {
+            "version": "1.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/execa/node_modules/which": {
+            "version": "1.3.1",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "isexe": "^2.0.0"
+            },
+            "bin": {
+                "which": "bin/which"
+            }
+        },
+        "node_modules/expand-tilde": {
+            "version": "2.0.2",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "homedir-polyfill": "^1.0.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/extract-file-icon": {
+            "version": "0.3.2",
+            "hasInstallScript": true,
+            "license": "MIT",
+            "dependencies": {
+                "node-addon-api": "1.7.1"
+            }
+        },
+        "node_modules/extract-file-icon/node_modules/node-addon-api": {
+            "version": "1.7.1",
+            "license": "MIT"
+        },
+        "node_modules/extract-zip": {
+            "version": "2.0.1",
+            "dev": true,
+            "license": "BSD-2-Clause",
+            "dependencies": {
+                "debug": "^4.1.1",
+                "get-stream": "^5.1.0",
+                "yauzl": "^2.10.0"
+            },
+            "bin": {
+                "extract-zip": "cli.js"
+            },
+            "engines": {
+                "node": ">= 10.17.0"
+            },
+            "optionalDependencies": {
+                "@types/yauzl": "^2.9.1"
+            }
+        },
+        "node_modules/fast-glob": {
+            "version": "3.2.12",
+            "dev": true,
+            "license": "MIT",
+            "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/fastq": {
+            "version": "1.15.0",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "reusify": "^1.0.4"
+            }
+        },
+        "node_modules/fd-slicer": {
+            "version": "1.1.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "pend": "~1.2.0"
+            }
+        },
+        "node_modules/filename-reserved-regex": {
+            "version": "2.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/filenamify": {
+            "version": "4.3.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "filename-reserved-regex": "^2.0.0",
+                "strip-outer": "^1.0.1",
+                "trim-repeated": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/fill-range": {
+            "version": "7.0.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "to-regex-range": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/find-up": {
+            "version": "5.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "locate-path": "^6.0.0",
+                "path-exists": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/flora-colossus": {
+            "version": "1.0.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "debug": "^4.1.1",
+                "fs-extra": "^7.0.0"
+            },
+            "engines": {
+                "node": ">= 6.0.0"
+            }
+        },
+        "node_modules/flora-colossus/node_modules/fs-extra": {
+            "version": "7.0.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "graceful-fs": "^4.1.2",
+                "jsonfile": "^4.0.0",
+                "universalify": "^0.1.0"
+            },
+            "engines": {
+                "node": ">=6 <7 || >=8"
+            }
+        },
+        "node_modules/flora-colossus/node_modules/jsonfile": {
+            "version": "4.0.0",
+            "dev": true,
+            "license": "MIT",
+            "optionalDependencies": {
+                "graceful-fs": "^4.1.6"
+            }
+        },
+        "node_modules/flora-colossus/node_modules/universalify": {
+            "version": "0.1.2",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 4.0.0"
+            }
+        },
+        "node_modules/frac": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz",
+            "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==",
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/fs-extra": {
+            "version": "10.1.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "graceful-fs": "^4.2.0",
+                "jsonfile": "^6.0.1",
+                "universalify": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/fs-minipass": {
+            "version": "2.1.0",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "minipass": "^3.0.0"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/fs.realpath": {
+            "version": "1.0.0",
+            "license": "ISC"
+        },
+        "node_modules/function-bind": {
+            "version": "1.1.1",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/galactus": {
+            "version": "0.2.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "debug": "^3.1.0",
+                "flora-colossus": "^1.0.0",
+                "fs-extra": "^4.0.0"
+            }
+        },
+        "node_modules/galactus/node_modules/debug": {
+            "version": "3.2.7",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ms": "^2.1.1"
+            }
+        },
+        "node_modules/galactus/node_modules/fs-extra": {
+            "version": "4.0.3",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "graceful-fs": "^4.1.2",
+                "jsonfile": "^4.0.0",
+                "universalify": "^0.1.0"
+            }
+        },
+        "node_modules/galactus/node_modules/jsonfile": {
+            "version": "4.0.0",
+            "dev": true,
+            "license": "MIT",
+            "optionalDependencies": {
+                "graceful-fs": "^4.1.6"
+            }
+        },
+        "node_modules/galactus/node_modules/universalify": {
+            "version": "0.1.2",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 4.0.0"
+            }
+        },
+        "node_modules/gar": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/gar/-/gar-1.0.4.tgz",
+            "integrity": "sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==",
+            "dev": true,
+            "optional": true
+        },
+        "node_modules/gauge": {
+            "version": "4.0.4",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "aproba": "^1.0.3 || ^2.0.0",
+                "color-support": "^1.1.3",
+                "console-control-strings": "^1.1.0",
+                "has-unicode": "^2.0.1",
+                "signal-exit": "^3.0.7",
+                "string-width": "^4.2.3",
+                "strip-ansi": "^6.0.1",
+                "wide-align": "^1.1.5"
+            },
+            "engines": {
+                "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+            }
+        },
+        "node_modules/get-caller-file": {
+            "version": "2.0.5",
+            "dev": true,
+            "license": "ISC",
+            "engines": {
+                "node": "6.* || 8.* || >= 10.*"
+            }
+        },
+        "node_modules/get-folder-size": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz",
+            "integrity": "sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==",
+            "dev": true,
+            "optional": true,
+            "dependencies": {
+                "gar": "^1.0.4",
+                "tiny-each-async": "2.0.3"
+            },
+            "bin": {
+                "get-folder-size": "bin/get-folder-size"
+            }
+        },
+        "node_modules/get-installed-path": {
+            "version": "2.1.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "global-modules": "1.0.0"
+            }
+        },
+        "node_modules/get-intrinsic": {
+            "version": "1.2.0",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "function-bind": "^1.1.1",
+                "has": "^1.0.3",
+                "has-symbols": "^1.0.3"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/get-package-info": {
+            "version": "1.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "bluebird": "^3.1.1",
+                "debug": "^2.2.0",
+                "lodash.get": "^4.0.0",
+                "read-pkg-up": "^2.0.0"
+            },
+            "engines": {
+                "node": ">= 4.0"
+            }
+        },
+        "node_modules/get-package-info/node_modules/debug": {
+            "version": "2.6.9",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ms": "2.0.0"
+            }
+        },
+        "node_modules/get-package-info/node_modules/ms": {
+            "version": "2.0.0",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/get-stream": {
+            "version": "5.2.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "pump": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/glob": {
+            "version": "7.2.3",
+            "license": "ISC",
+            "dependencies": {
+                "fs.realpath": "^1.0.0",
+                "inflight": "^1.0.4",
+                "inherits": "2",
+                "minimatch": "^3.1.1",
+                "once": "^1.3.0",
+                "path-is-absolute": "^1.0.0"
+            },
+            "engines": {
+                "node": "*"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/glob-parent": {
+            "version": "5.1.2",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "is-glob": "^4.0.1"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/global-agent": {
+            "version": "3.0.0",
+            "dev": true,
+            "license": "BSD-3-Clause",
+            "optional": true,
+            "dependencies": {
+                "boolean": "^3.0.1",
+                "es6-error": "^4.1.1",
+                "matcher": "^3.0.0",
+                "roarr": "^2.15.3",
+                "semver": "^7.3.2",
+                "serialize-error": "^7.0.1"
+            },
+            "engines": {
+                "node": ">=10.0"
+            }
+        },
+        "node_modules/global-modules": {
+            "version": "1.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "global-prefix": "^1.0.1",
+                "is-windows": "^1.0.1",
+                "resolve-dir": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/global-prefix": {
+            "version": "1.0.2",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "expand-tilde": "^2.0.2",
+                "homedir-polyfill": "^1.0.1",
+                "ini": "^1.3.4",
+                "is-windows": "^1.0.1",
+                "which": "^1.2.14"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/global-prefix/node_modules/which": {
+            "version": "1.3.1",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "isexe": "^2.0.0"
+            },
+            "bin": {
+                "which": "bin/which"
+            }
+        },
+        "node_modules/global-tunnel-ng": {
+            "version": "2.7.1",
+            "dev": true,
+            "license": "BSD-3-Clause",
+            "optional": true,
+            "dependencies": {
+                "encodeurl": "^1.0.2",
+                "lodash": "^4.17.10",
+                "npm-conf": "^1.1.3",
+                "tunnel": "^0.0.6"
+            },
+            "engines": {
+                "node": ">=0.10"
+            }
+        },
+        "node_modules/globalthis": {
+            "version": "1.0.3",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "define-properties": "^1.1.3"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/got": {
+            "version": "11.8.6",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@sindresorhus/is": "^4.0.0",
+                "@szmarczak/http-timer": "^4.0.5",
+                "@types/cacheable-request": "^6.0.1",
+                "@types/responselike": "^1.0.0",
+                "cacheable-lookup": "^5.0.3",
+                "cacheable-request": "^7.0.2",
+                "decompress-response": "^6.0.0",
+                "http2-wrapper": "^1.0.0-beta.5.2",
+                "lowercase-keys": "^2.0.0",
+                "p-cancelable": "^2.0.0",
+                "responselike": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=10.19.0"
+            },
+            "funding": {
+                "url": "https://github.com/sindresorhus/got?sponsor=1"
+            }
+        },
+        "node_modules/graceful-fs": {
+            "version": "4.2.10",
+            "dev": true,
+            "license": "ISC"
+        },
+        "node_modules/has": {
+            "version": "1.0.3",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "function-bind": "^1.1.1"
+            },
+            "engines": {
+                "node": ">= 0.4.0"
+            }
+        },
+        "node_modules/has-flag": {
+            "version": "4.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/has-property-descriptors": {
+            "version": "1.0.0",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "get-intrinsic": "^1.1.1"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/has-symbols": {
+            "version": "1.0.3",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/has-unicode": {
+            "version": "2.0.1",
+            "dev": true,
+            "license": "ISC"
+        },
+        "node_modules/homedir-polyfill": {
+            "version": "1.0.3",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "parse-passwd": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/hosted-git-info": {
+            "version": "2.8.9",
+            "dev": true,
+            "license": "ISC"
+        },
+        "node_modules/http": {
+            "version": "0.0.1-security"
+        },
+        "node_modules/http-cache-semantics": {
+            "version": "4.1.1",
+            "dev": true,
+            "license": "BSD-2-Clause"
+        },
+        "node_modules/http-proxy-agent": {
+            "version": "5.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@tootallnate/once": "2",
+                "agent-base": "6",
+                "debug": "4"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/http2-wrapper": {
+            "version": "1.0.3",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "quick-lru": "^5.1.1",
+                "resolve-alpn": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=10.19.0"
+            }
+        },
+        "node_modules/https-proxy-agent": {
+            "version": "5.0.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "agent-base": "6",
+                "debug": "4"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/humanize-ms": {
+            "version": "1.2.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ms": "^2.0.0"
+            }
+        },
+        "node_modules/iconv-lite": {
+            "version": "0.6.3",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "safer-buffer": ">= 2.1.2 < 3.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/ieee754": {
+            "version": "1.2.1",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ],
+            "license": "BSD-3-Clause"
+        },
+        "node_modules/immediate": {
+            "version": "3.0.6",
+            "license": "MIT"
+        },
+        "node_modules/imurmurhash": {
+            "version": "0.1.4",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.8.19"
+            }
+        },
+        "node_modules/indent-string": {
+            "version": "4.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/infer-owner": {
+            "version": "1.0.4",
+            "dev": true,
+            "license": "ISC"
+        },
+        "node_modules/inflight": {
+            "version": "1.0.6",
+            "license": "ISC",
+            "dependencies": {
+                "once": "^1.3.0",
+                "wrappy": "1"
+            }
+        },
+        "node_modules/inherits": {
+            "version": "2.0.4",
+            "license": "ISC"
+        },
+        "node_modules/ini": {
+            "version": "1.3.8",
+            "dev": true,
+            "license": "ISC"
+        },
+        "node_modules/interpret": {
+            "version": "3.1.1",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=10.13.0"
+            }
+        },
+        "node_modules/ip": {
+            "version": "2.0.0",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/is-arrayish": {
+            "version": "0.2.1",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/is-core-module": {
+            "version": "2.11.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "has": "^1.0.3"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/is-docker": {
+            "version": "2.2.1",
+            "dev": true,
+            "license": "MIT",
+            "bin": {
+                "is-docker": "cli.js"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/is-extglob": {
+            "version": "2.1.1",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-fullwidth-code-point": {
+            "version": "3.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/is-glob": {
+            "version": "4.0.3",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "is-extglob": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-interactive": {
+            "version": "1.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/is-lambda": {
+            "version": "1.0.1",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/is-number": {
+            "version": "7.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.12.0"
+            }
+        },
+        "node_modules/is-stream": {
+            "version": "1.1.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-unicode-supported": {
+            "version": "0.1.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/is-windows": {
+            "version": "1.0.2",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-wsl": {
+            "version": "2.2.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "is-docker": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/isarray": {
+            "version": "1.0.0",
+            "license": "MIT"
+        },
+        "node_modules/isbinaryfile": {
+            "version": "4.0.10",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 8.0.0"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/gjtorikian/"
+            }
+        },
+        "node_modules/isexe": {
+            "version": "2.0.0",
+            "dev": true,
+            "license": "ISC"
+        },
+        "node_modules/json-buffer": {
+            "version": "3.0.1",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/json-stringify-safe": {
+            "version": "5.0.1",
+            "dev": true,
+            "license": "ISC",
+            "optional": true
+        },
+        "node_modules/jsonfile": {
+            "version": "6.1.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "universalify": "^2.0.0"
+            },
+            "optionalDependencies": {
+                "graceful-fs": "^4.1.6"
+            }
+        },
+        "node_modules/jszip": {
+            "version": "3.10.1",
+            "license": "(MIT OR GPL-3.0-or-later)",
+            "dependencies": {
+                "lie": "~3.3.0",
+                "pako": "~1.0.2",
+                "readable-stream": "~2.3.6",
+                "setimmediate": "^1.0.5"
+            }
+        },
+        "node_modules/jszip/node_modules/readable-stream": {
+            "version": "2.3.8",
+            "license": "MIT",
+            "dependencies": {
+                "core-util-is": "~1.0.0",
+                "inherits": "~2.0.3",
+                "isarray": "~1.0.0",
+                "process-nextick-args": "~2.0.0",
+                "safe-buffer": "~5.1.1",
+                "string_decoder": "~1.1.1",
+                "util-deprecate": "~1.0.1"
+            }
+        },
+        "node_modules/jszip/node_modules/safe-buffer": {
+            "version": "5.1.2",
+            "license": "MIT"
+        },
+        "node_modules/jszip/node_modules/string_decoder": {
+            "version": "1.1.1",
+            "license": "MIT",
+            "dependencies": {
+                "safe-buffer": "~5.1.0"
+            }
+        },
+        "node_modules/junk": {
+            "version": "3.1.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/keyv": {
+            "version": "4.5.2",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "json-buffer": "3.0.1"
+            }
+        },
+        "node_modules/lie": {
+            "version": "3.3.0",
+            "license": "MIT",
+            "dependencies": {
+                "immediate": "~3.0.5"
+            }
+        },
+        "node_modules/listr2": {
+            "version": "5.0.8",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "cli-truncate": "^2.1.0",
+                "colorette": "^2.0.19",
+                "log-update": "^4.0.0",
+                "p-map": "^4.0.0",
+                "rfdc": "^1.3.0",
+                "rxjs": "^7.8.0",
+                "through": "^2.3.8",
+                "wrap-ansi": "^7.0.0"
+            },
+            "engines": {
+                "node": "^14.13.1 || >=16.0.0"
+            },
+            "peerDependencies": {
+                "enquirer": ">= 2.3.0 < 3"
+            },
+            "peerDependenciesMeta": {
+                "enquirer": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/load-json-file": {
+            "version": "2.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "graceful-fs": "^4.1.2",
+                "parse-json": "^2.2.0",
+                "pify": "^2.0.0",
+                "strip-bom": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/locate-path": {
+            "version": "6.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "p-locate": "^5.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/lodash": {
+            "version": "4.17.21",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/lodash._reinterpolate": {
+            "version": "3.0.0",
+            "dev": true,
+            "license": "MIT",
+            "optional": true
+        },
+        "node_modules/lodash.get": {
+            "version": "4.4.2",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/lodash.template": {
+            "version": "4.5.0",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "lodash._reinterpolate": "^3.0.0",
+                "lodash.templatesettings": "^4.0.0"
+            }
+        },
+        "node_modules/lodash.templatesettings": {
+            "version": "4.2.0",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "lodash._reinterpolate": "^3.0.0"
+            }
+        },
+        "node_modules/log-symbols": {
+            "version": "4.1.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "chalk": "^4.1.0",
+                "is-unicode-supported": "^0.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/log-update": {
+            "version": "4.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ansi-escapes": "^4.3.0",
+                "cli-cursor": "^3.1.0",
+                "slice-ansi": "^4.0.0",
+                "wrap-ansi": "^6.2.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/log-update/node_modules/slice-ansi": {
+            "version": "4.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ansi-styles": "^4.0.0",
+                "astral-regex": "^2.0.0",
+                "is-fullwidth-code-point": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+            }
+        },
+        "node_modules/log-update/node_modules/wrap-ansi": {
+            "version": "6.2.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ansi-styles": "^4.0.0",
+                "string-width": "^4.1.0",
+                "strip-ansi": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/lowercase-keys": {
+            "version": "2.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/lru-cache": {
+            "version": "7.18.3",
+            "dev": true,
+            "license": "ISC",
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/lzma-native": {
+            "version": "8.0.6",
+            "dev": true,
+            "hasInstallScript": true,
+            "license": "MIT",
+            "dependencies": {
+                "node-addon-api": "^3.1.0",
+                "node-gyp-build": "^4.2.1",
+                "readable-stream": "^3.6.0"
+            },
+            "bin": {
+                "lzmajs": "bin/lzmajs"
+            },
+            "engines": {
+                "node": ">=10.0.0"
+            }
+        },
+        "node_modules/lzma-native/node_modules/node-addon-api": {
+            "version": "3.2.1",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/make-fetch-happen": {
+            "version": "10.2.1",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "agentkeepalive": "^4.2.1",
+                "cacache": "^16.1.0",
+                "http-cache-semantics": "^4.1.0",
+                "http-proxy-agent": "^5.0.0",
+                "https-proxy-agent": "^5.0.0",
+                "is-lambda": "^1.0.1",
+                "lru-cache": "^7.7.1",
+                "minipass": "^3.1.6",
+                "minipass-collect": "^1.0.2",
+                "minipass-fetch": "^2.0.3",
+                "minipass-flush": "^1.0.5",
+                "minipass-pipeline": "^1.2.4",
+                "negotiator": "^0.6.3",
+                "promise-retry": "^2.0.1",
+                "socks-proxy-agent": "^7.0.0",
+                "ssri": "^9.0.0"
+            },
+            "engines": {
+                "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+            }
+        },
+        "node_modules/map-age-cleaner": {
+            "version": "0.1.3",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "p-defer": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/matcher": {
+            "version": "3.0.0",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "escape-string-regexp": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/media-typer": {
+            "version": "0.3.0",
+            "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+            "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/mem": {
+            "version": "4.3.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "map-age-cleaner": "^0.1.1",
+                "mimic-fn": "^2.0.0",
+                "p-is-promise": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/merge2": {
+            "version": "1.4.1",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/micromatch": {
+            "version": "4.0.5",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "braces": "^3.0.2",
+                "picomatch": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=8.6"
+            }
+        },
+        "node_modules/mime-db": {
+            "version": "1.52.0",
+            "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+            "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/mime-types": {
+            "version": "2.1.35",
+            "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+            "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+            "dependencies": {
+                "mime-db": "1.52.0"
+            },
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/mimic-fn": {
+            "version": "2.1.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/mimic-response": {
+            "version": "1.0.1",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/minimatch": {
+            "version": "3.1.2",
+            "license": "ISC",
+            "dependencies": {
+                "brace-expansion": "^1.1.7"
+            },
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/minimist": {
+            "version": "1.2.8",
+            "license": "MIT",
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/minipass": {
+            "version": "3.3.6",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/minipass-collect": {
+            "version": "1.0.2",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "minipass": "^3.0.0"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/minipass-fetch": {
+            "version": "2.1.2",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "minipass": "^3.1.6",
+                "minipass-sized": "^1.0.3",
+                "minizlib": "^2.1.2"
+            },
+            "engines": {
+                "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+            },
+            "optionalDependencies": {
+                "encoding": "^0.1.13"
+            }
+        },
+        "node_modules/minipass-flush": {
+            "version": "1.0.5",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "minipass": "^3.0.0"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/minipass-pipeline": {
+            "version": "1.2.4",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "minipass": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/minipass-sized": {
+            "version": "1.0.3",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "minipass": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/minizlib": {
+            "version": "2.1.2",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "minipass": "^3.0.0",
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/mkdirp": {
+            "version": "1.0.4",
+            "dev": true,
+            "license": "MIT",
+            "bin": {
+                "mkdirp": "bin/cmd.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/ms": {
+            "version": "2.1.2",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/multer": {
+            "version": "1.4.5-lts.1",
+            "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz",
+            "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==",
+            "dependencies": {
+                "append-field": "^1.0.0",
+                "busboy": "^1.0.0",
+                "concat-stream": "^1.5.2",
+                "mkdirp": "^0.5.4",
+                "object-assign": "^4.1.1",
+                "type-is": "^1.6.4",
+                "xtend": "^4.0.0"
+            },
+            "engines": {
+                "node": ">= 6.0.0"
+            }
+        },
+        "node_modules/multer/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": {
+                "minimist": "^1.2.6"
+            },
+            "bin": {
+                "mkdirp": "bin/cmd.js"
+            }
+        },
+        "node_modules/negotiator": {
+            "version": "0.6.3",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/nice-try": {
+            "version": "1.0.5",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/node-abi": {
+            "version": "3.33.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "semver": "^7.3.5"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/node-api-version": {
+            "version": "0.1.4",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "semver": "^7.3.5"
+            }
+        },
+        "node_modules/node-fetch": {
+            "version": "2.6.9",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "whatwg-url": "^5.0.0"
+            },
+            "engines": {
+                "node": "4.x || >=6.0.0"
+            },
+            "peerDependencies": {
+                "encoding": "^0.1.0"
+            },
+            "peerDependenciesMeta": {
+                "encoding": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/node-gyp": {
+            "version": "9.3.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "env-paths": "^2.2.0",
+                "glob": "^7.1.4",
+                "graceful-fs": "^4.2.6",
+                "make-fetch-happen": "^10.0.3",
+                "nopt": "^6.0.0",
+                "npmlog": "^6.0.0",
+                "rimraf": "^3.0.2",
+                "semver": "^7.3.5",
+                "tar": "^6.1.2",
+                "which": "^2.0.2"
+            },
+            "bin": {
+                "node-gyp": "bin/node-gyp.js"
+            },
+            "engines": {
+                "node": "^12.13 || ^14.13 || >=16"
+            }
+        },
+        "node_modules/node-gyp-build": {
+            "version": "4.6.0",
+            "license": "MIT",
+            "bin": {
+                "node-gyp-build": "bin.js",
+                "node-gyp-build-optional": "optional.js",
+                "node-gyp-build-test": "build-test.js"
+            }
+        },
+        "node_modules/node-window-manager": {
+            "version": "2.2.4",
+            "hasInstallScript": true,
+            "license": "MIT",
+            "dependencies": {
+                "extract-file-icon": "^0.3.2",
+                "node-addon-api": "2.0.0",
+                "node-gyp-build": "^4.2.1"
+            }
+        },
+        "node_modules/node-window-manager/node_modules/node-addon-api": {
+            "version": "2.0.0",
+            "license": "MIT"
+        },
+        "node_modules/nopt": {
+            "version": "6.0.0",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "abbrev": "^1.0.0"
+            },
+            "bin": {
+                "nopt": "bin/nopt.js"
+            },
+            "engines": {
+                "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+            }
+        },
+        "node_modules/normalize-package-data": {
+            "version": "2.5.0",
+            "dev": true,
+            "license": "BSD-2-Clause",
+            "dependencies": {
+                "hosted-git-info": "^2.1.4",
+                "resolve": "^1.10.0",
+                "semver": "2 || 3 || 4 || 5",
+                "validate-npm-package-license": "^3.0.1"
+            }
+        },
+        "node_modules/normalize-package-data/node_modules/semver": {
+            "version": "5.7.1",
+            "dev": true,
+            "license": "ISC",
+            "bin": {
+                "semver": "bin/semver"
+            }
+        },
+        "node_modules/normalize-url": {
+            "version": "6.1.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/npm-conf": {
+            "version": "1.1.3",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "config-chain": "^1.1.11",
+                "pify": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/npm-conf/node_modules/pify": {
+            "version": "3.0.0",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/npm-run-path": {
+            "version": "2.0.2",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "path-key": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/npm-run-path/node_modules/path-key": {
+            "version": "2.0.1",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/npmlog": {
+            "version": "6.0.2",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "are-we-there-yet": "^3.0.0",
+                "console-control-strings": "^1.1.0",
+                "gauge": "^4.0.3",
+                "set-blocking": "^2.0.0"
+            },
+            "engines": {
+                "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+            }
+        },
+        "node_modules/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==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/object-keys": {
+            "version": "1.1.1",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
+        "node_modules/once": {
+            "version": "1.4.0",
+            "license": "ISC",
+            "dependencies": {
+                "wrappy": "1"
+            }
+        },
+        "node_modules/onetime": {
+            "version": "5.1.2",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "mimic-fn": "^2.1.0"
+            },
+            "engines": {
+                "node": ">=6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/ora": {
+            "version": "5.4.1",
+            "dev": true,
+            "license": "MIT",
+            "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"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/p-cancelable": {
+            "version": "2.1.1",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/p-defer": {
+            "version": "1.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/p-finally": {
+            "version": "1.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/p-is-promise": {
+            "version": "2.1.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/p-limit": {
+            "version": "3.1.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "yocto-queue": "^0.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/p-locate": {
+            "version": "5.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "p-limit": "^3.0.2"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/p-map": {
+            "version": "4.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "aggregate-error": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/p-try": {
+            "version": "2.2.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/pako": {
+            "version": "1.0.11",
+            "license": "(MIT AND Zlib)"
+        },
+        "node_modules/parse-author": {
+            "version": "2.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "author-regex": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/parse-json": {
+            "version": "2.2.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "error-ex": "^1.2.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/parse-passwd": {
+            "version": "1.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/path-exists": {
+            "version": "4.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/path-is-absolute": {
+            "version": "1.0.1",
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/path-key": {
+            "version": "3.1.1",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/path-parse": {
+            "version": "1.0.7",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/path-type": {
+            "version": "2.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "pify": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/pend": {
+            "version": "1.2.0",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/picomatch": {
+            "version": "2.3.1",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=8.6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/jonschlinkert"
+            }
+        },
+        "node_modules/pify": {
+            "version": "2.3.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/pkg-dir": {
+            "version": "4.2.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "find-up": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/pkg-dir/node_modules/find-up": {
+            "version": "4.1.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "locate-path": "^5.0.0",
+                "path-exists": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/pkg-dir/node_modules/locate-path": {
+            "version": "5.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "p-locate": "^4.1.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/pkg-dir/node_modules/p-limit": {
+            "version": "2.3.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "p-try": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/pkg-dir/node_modules/p-locate": {
+            "version": "4.1.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "p-limit": "^2.2.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/plist": {
+            "version": "3.0.6",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "base64-js": "^1.5.1",
+                "xmlbuilder": "^15.1.1"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/prepend-http": {
+            "version": "2.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/process-nextick-args": {
+            "version": "2.0.1",
+            "license": "MIT"
+        },
+        "node_modules/progress": {
+            "version": "2.0.3",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/promise-inflight": {
+            "version": "1.0.1",
+            "dev": true,
+            "license": "ISC"
+        },
+        "node_modules/promise-retry": {
+            "version": "2.0.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "err-code": "^2.0.2",
+                "retry": "^0.12.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/proto-list": {
+            "version": "1.2.4",
+            "dev": true,
+            "license": "ISC",
+            "optional": true
+        },
+        "node_modules/pump": {
+            "version": "3.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "end-of-stream": "^1.1.0",
+                "once": "^1.3.1"
+            }
+        },
+        "node_modules/queue-microtask": {
+            "version": "1.2.3",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ],
+            "license": "MIT"
+        },
+        "node_modules/quick-lru": {
+            "version": "5.1.1",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/rcedit": {
+            "version": "3.0.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "cross-spawn-windows-exe": "^1.1.0"
+            },
+            "engines": {
+                "node": ">= 10.0.0"
+            }
+        },
+        "node_modules/read-pkg": {
+            "version": "2.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "load-json-file": "^2.0.0",
+                "normalize-package-data": "^2.3.2",
+                "path-type": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/read-pkg-up": {
+            "version": "2.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "find-up": "^2.0.0",
+                "read-pkg": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/read-pkg-up/node_modules/find-up": {
+            "version": "2.1.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "locate-path": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/read-pkg-up/node_modules/locate-path": {
+            "version": "2.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "p-locate": "^2.0.0",
+                "path-exists": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/read-pkg-up/node_modules/p-limit": {
+            "version": "1.3.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "p-try": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/read-pkg-up/node_modules/p-locate": {
+            "version": "2.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "p-limit": "^1.1.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/read-pkg-up/node_modules/p-try": {
+            "version": "1.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/read-pkg-up/node_modules/path-exists": {
+            "version": "3.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/readable-stream": {
+            "version": "3.6.2",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "inherits": "^2.0.3",
+                "string_decoder": "^1.1.1",
+                "util-deprecate": "^1.0.1"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/rechoir": {
+            "version": "0.8.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "resolve": "^1.20.0"
+            },
+            "engines": {
+                "node": ">= 10.13.0"
+            }
+        },
+        "node_modules/require-directory": {
+            "version": "2.1.1",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/require-main-filename": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+            "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+            "dev": true,
+            "optional": true
+        },
+        "node_modules/resolve": {
+            "version": "1.22.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "is-core-module": "^2.9.0",
+                "path-parse": "^1.0.7",
+                "supports-preserve-symlinks-flag": "^1.0.0"
+            },
+            "bin": {
+                "resolve": "bin/resolve"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/resolve-alpn": {
+            "version": "1.2.1",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/resolve-dir": {
+            "version": "1.0.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "expand-tilde": "^2.0.0",
+                "global-modules": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/resolve-package": {
+            "version": "1.0.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "get-installed-path": "^2.0.3"
+            },
+            "engines": {
+                "node": ">=4",
+                "npm": ">=2"
+            }
+        },
+        "node_modules/responselike": {
+            "version": "2.0.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "lowercase-keys": "^2.0.0"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/restore-cursor": {
+            "version": "3.1.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "onetime": "^5.1.0",
+                "signal-exit": "^3.0.2"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/retry": {
+            "version": "0.12.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 4"
+            }
+        },
+        "node_modules/reusify": {
+            "version": "1.0.4",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "iojs": ">=1.0.0",
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/rfdc": {
+            "version": "1.3.0",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/rimraf": {
+            "version": "3.0.2",
+            "license": "ISC",
+            "dependencies": {
+                "glob": "^7.1.3"
+            },
+            "bin": {
+                "rimraf": "bin.js"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/roarr": {
+            "version": "2.15.4",
+            "dev": true,
+            "license": "BSD-3-Clause",
+            "optional": true,
+            "dependencies": {
+                "boolean": "^3.0.1",
+                "detect-node": "^2.0.4",
+                "globalthis": "^1.0.1",
+                "json-stringify-safe": "^5.0.1",
+                "semver-compare": "^1.0.0",
+                "sprintf-js": "^1.1.2"
+            },
+            "engines": {
+                "node": ">=8.0"
+            }
+        },
+        "node_modules/run-parallel": {
+            "version": "1.2.0",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ],
+            "license": "MIT",
+            "dependencies": {
+                "queue-microtask": "^1.2.2"
+            }
+        },
+        "node_modules/rxjs": {
+            "version": "7.8.0",
+            "dev": true,
+            "license": "Apache-2.0",
+            "dependencies": {
+                "tslib": "^2.1.0"
+            }
+        },
+        "node_modules/safe-buffer": {
+            "version": "5.2.1",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ],
+            "license": "MIT"
+        },
+        "node_modules/safer-buffer": {
+            "version": "2.1.2",
+            "dev": true,
+            "license": "MIT",
+            "optional": true
+        },
+        "node_modules/selenium-webdriver": {
+            "version": "4.8.1",
+            "license": "Apache-2.0",
+            "dependencies": {
+                "jszip": "^3.10.0",
+                "tmp": "^0.2.1",
+                "ws": ">=8.11.0"
+            },
+            "engines": {
+                "node": ">= 14.20.0"
+            }
+        },
+        "node_modules/semver": {
+            "version": "7.3.8",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "lru-cache": "^6.0.0"
+            },
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/semver-compare": {
+            "version": "1.0.0",
+            "dev": true,
+            "license": "MIT",
+            "optional": true
+        },
+        "node_modules/semver/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/serialize-error": {
+            "version": "7.0.1",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "type-fest": "^0.13.1"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/serialize-error/node_modules/type-fest": {
+            "version": "0.13.1",
+            "dev": true,
+            "license": "(MIT OR CC0-1.0)",
+            "optional": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/set-blocking": {
+            "version": "2.0.0",
+            "dev": true,
+            "license": "ISC"
+        },
+        "node_modules/setimmediate": {
+            "version": "1.0.5",
+            "license": "MIT"
+        },
+        "node_modules/shebang-command": {
+            "version": "2.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "shebang-regex": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/shebang-regex": {
+            "version": "3.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/signal-exit": {
+            "version": "3.0.7",
+            "dev": true,
+            "license": "ISC"
+        },
+        "node_modules/slice-ansi": {
+            "version": "3.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ansi-styles": "^4.0.0",
+                "astral-regex": "^2.0.0",
+                "is-fullwidth-code-point": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/smart-buffer": {
+            "version": "4.2.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 6.0.0",
+                "npm": ">= 3.0.0"
+            }
+        },
+        "node_modules/socks": {
+            "version": "2.7.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ip": "^2.0.0",
+                "smart-buffer": "^4.2.0"
+            },
+            "engines": {
+                "node": ">= 10.13.0",
+                "npm": ">= 3.0.0"
+            }
+        },
+        "node_modules/socks-proxy-agent": {
+            "version": "7.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "agent-base": "^6.0.2",
+                "debug": "^4.3.3",
+                "socks": "^2.6.2"
+            },
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/source-map": {
+            "version": "0.6.1",
+            "dev": true,
+            "license": "BSD-3-Clause",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/source-map-support": {
+            "version": "0.5.21",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "buffer-from": "^1.0.0",
+                "source-map": "^0.6.0"
+            }
+        },
+        "node_modules/spdx-correct": {
+            "version": "3.2.0",
+            "dev": true,
+            "license": "Apache-2.0",
+            "dependencies": {
+                "spdx-expression-parse": "^3.0.0",
+                "spdx-license-ids": "^3.0.0"
+            }
+        },
+        "node_modules/spdx-exceptions": {
+            "version": "2.3.0",
+            "dev": true,
+            "license": "CC-BY-3.0"
+        },
+        "node_modules/spdx-expression-parse": {
+            "version": "3.0.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "spdx-exceptions": "^2.1.0",
+                "spdx-license-ids": "^3.0.0"
+            }
+        },
+        "node_modules/spdx-license-ids": {
+            "version": "3.0.13",
+            "dev": true,
+            "license": "CC0-1.0"
+        },
+        "node_modules/sprintf-js": {
+            "version": "1.1.2",
+            "dev": true,
+            "license": "BSD-3-Clause",
+            "optional": true
+        },
+        "node_modules/ssf": {
+            "version": "0.11.2",
+            "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz",
+            "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
+            "dependencies": {
+                "frac": "~1.1.2"
+            },
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/ssri": {
+            "version": "9.0.1",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "minipass": "^3.1.1"
+            },
+            "engines": {
+                "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+            }
+        },
+        "node_modules/streamsearch": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
+            "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
+            "engines": {
+                "node": ">=10.0.0"
+            }
+        },
+        "node_modules/string_decoder": {
+            "version": "1.3.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "safe-buffer": "~5.2.0"
+            }
+        },
+        "node_modules/string-width": {
+            "version": "4.2.3",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "emoji-regex": "^8.0.0",
+                "is-fullwidth-code-point": "^3.0.0",
+                "strip-ansi": "^6.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/strip-ansi": {
+            "version": "6.0.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ansi-regex": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/strip-bom": {
+            "version": "3.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/strip-eof": {
+            "version": "1.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/strip-outer": {
+            "version": "1.0.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "escape-string-regexp": "^1.0.2"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/strip-outer/node_modules/escape-string-regexp": {
+            "version": "1.0.5",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.8.0"
+            }
+        },
+        "node_modules/sudo-prompt": {
+            "version": "9.2.1",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/sumchecker": {
+            "version": "3.0.1",
+            "dev": true,
+            "license": "Apache-2.0",
+            "dependencies": {
+                "debug": "^4.1.0"
+            },
+            "engines": {
+                "node": ">= 8.0"
+            }
+        },
+        "node_modules/supports-color": {
+            "version": "7.2.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/supports-preserve-symlinks-flag": {
+            "version": "1.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/tar": {
+            "version": "6.1.13",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "chownr": "^2.0.0",
+                "fs-minipass": "^2.0.0",
+                "minipass": "^4.0.0",
+                "minizlib": "^2.1.1",
+                "mkdirp": "^1.0.3",
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/tar/node_modules/minipass": {
+            "version": "4.2.5",
+            "dev": true,
+            "license": "ISC",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/temp": {
+            "version": "0.9.4",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "mkdirp": "^0.5.1",
+                "rimraf": "~2.6.2"
+            },
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/temp/node_modules/mkdirp": {
+            "version": "0.5.6",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "minimist": "^1.2.6"
+            },
+            "bin": {
+                "mkdirp": "bin/cmd.js"
+            }
+        },
+        "node_modules/temp/node_modules/rimraf": {
+            "version": "2.6.3",
+            "dev": true,
+            "license": "ISC",
+            "optional": true,
+            "dependencies": {
+                "glob": "^7.1.3"
+            },
+            "bin": {
+                "rimraf": "bin.js"
+            }
+        },
+        "node_modules/through": {
+            "version": "2.3.8",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/tiny-each-async": {
+            "version": "2.0.3",
+            "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz",
+            "integrity": "sha512-5ROII7nElnAirvFn8g7H7MtpfV1daMcyfTGQwsn/x2VtyV+VPiO5CjReCJtWLvoKTDEDmZocf3cNPraiMnBXLA==",
+            "dev": true,
+            "optional": true
+        },
+        "node_modules/tmp": {
+            "version": "0.2.1",
+            "license": "MIT",
+            "dependencies": {
+                "rimraf": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8.17.0"
+            }
+        },
+        "node_modules/tmp-promise": {
+            "version": "3.0.3",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "tmp": "^0.2.0"
+            }
+        },
+        "node_modules/to-readable-stream": {
+            "version": "1.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/to-regex-range": {
+            "version": "5.0.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "is-number": "^7.0.0"
+            },
+            "engines": {
+                "node": ">=8.0"
+            }
+        },
+        "node_modules/tr46": {
+            "version": "0.0.3",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/trim-repeated": {
+            "version": "1.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "escape-string-regexp": "^1.0.2"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/trim-repeated/node_modules/escape-string-regexp": {
+            "version": "1.0.5",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.8.0"
+            }
+        },
+        "node_modules/tslib": {
+            "version": "2.5.0",
+            "dev": true,
+            "license": "0BSD"
+        },
+        "node_modules/tunnel": {
+            "version": "0.0.6",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "engines": {
+                "node": ">=0.6.11 <=0.7.0 || >=0.7.3"
+            }
+        },
+        "node_modules/type-fest": {
+            "version": "0.21.3",
+            "dev": true,
+            "license": "(MIT OR CC0-1.0)",
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/type-is": {
+            "version": "1.6.18",
+            "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+            "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+            "dependencies": {
+                "media-typer": "0.3.0",
+                "mime-types": "~2.1.24"
+            },
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/typedarray": {
+            "version": "0.0.6",
+            "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+            "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
+        },
+        "node_modules/unique-filename": {
+            "version": "2.0.1",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "unique-slug": "^3.0.0"
+            },
+            "engines": {
+                "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+            }
+        },
+        "node_modules/unique-slug": {
+            "version": "3.0.0",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "imurmurhash": "^0.1.4"
+            },
+            "engines": {
+                "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+            }
+        },
+        "node_modules/universalify": {
+            "version": "2.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 10.0.0"
+            }
+        },
+        "node_modules/url-parse-lax": {
+            "version": "3.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "prepend-http": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/username": {
+            "version": "5.1.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "execa": "^1.0.0",
+                "mem": "^4.3.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/util-deprecate": {
+            "version": "1.0.2",
+            "license": "MIT"
+        },
+        "node_modules/validate-npm-package-license": {
+            "version": "3.0.4",
+            "dev": true,
+            "license": "Apache-2.0",
+            "dependencies": {
+                "spdx-correct": "^3.0.0",
+                "spdx-expression-parse": "^3.0.0"
+            }
+        },
+        "node_modules/wcwidth": {
+            "version": "1.0.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "defaults": "^1.0.3"
+            }
+        },
+        "node_modules/webidl-conversions": {
+            "version": "3.0.1",
+            "dev": true,
+            "license": "BSD-2-Clause"
+        },
+        "node_modules/whatwg-url": {
+            "version": "5.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "tr46": "~0.0.3",
+                "webidl-conversions": "^3.0.0"
+            }
+        },
+        "node_modules/which": {
+            "version": "2.0.2",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "isexe": "^2.0.0"
+            },
+            "bin": {
+                "node-which": "bin/node-which"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/which-module": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
+            "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==",
+            "dev": true,
+            "optional": true
+        },
+        "node_modules/wide-align": {
+            "version": "1.1.5",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "string-width": "^1.0.2 || 2 || 3 || 4"
+            }
+        },
+        "node_modules/wmf": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz",
+            "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==",
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/word": {
+            "version": "0.3.0",
+            "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz",
+            "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==",
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/word-wrap": {
+            "version": "1.2.3",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/wrap-ansi": {
+            "version": "7.0.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ansi-styles": "^4.0.0",
+                "string-width": "^4.1.0",
+                "strip-ansi": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+            }
+        },
+        "node_modules/wrappy": {
+            "version": "1.0.2",
+            "license": "ISC"
+        },
+        "node_modules/ws": {
+            "version": "8.13.0",
+            "license": "MIT",
+            "engines": {
+                "node": ">=10.0.0"
+            },
+            "peerDependencies": {
+                "bufferutil": "^4.0.1",
+                "utf-8-validate": ">=5.0.2"
+            },
+            "peerDependenciesMeta": {
+                "bufferutil": {
+                    "optional": true
+                },
+                "utf-8-validate": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/xlsx": {
+            "version": "0.18.5",
+            "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz",
+            "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==",
+            "dependencies": {
+                "adler-32": "~1.3.0",
+                "cfb": "~1.2.1",
+                "codepage": "~1.15.0",
+                "crc-32": "~1.2.1",
+                "ssf": "~0.11.2",
+                "wmf": "~1.0.1",
+                "word": "~0.3.0"
+            },
+            "bin": {
+                "xlsx": "bin/xlsx.njs"
+            },
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/xmlbuilder": {
+            "version": "15.1.1",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=8.0"
+            }
+        },
+        "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/y18n": {
+            "version": "5.0.8",
+            "dev": true,
+            "license": "ISC",
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/yallist": {
+            "version": "4.0.0",
+            "dev": true,
+            "license": "ISC"
+        },
+        "node_modules/yargs": {
+            "version": "17.7.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "cliui": "^8.0.1",
+                "escalade": "^3.1.1",
+                "get-caller-file": "^2.0.5",
+                "require-directory": "^2.1.1",
+                "string-width": "^4.2.3",
+                "y18n": "^5.0.5",
+                "yargs-parser": "^21.1.1"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/yargs-parser": {
+            "version": "21.1.1",
+            "dev": true,
+            "license": "ISC",
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/yarn-or-npm": {
+            "version": "3.0.1",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "cross-spawn": "^6.0.5",
+                "pkg-dir": "^4.2.0"
+            },
+            "bin": {
+                "yarn-or-npm": "bin/index.js",
+                "yon": "bin/index.js"
+            },
+            "engines": {
+                "node": ">=8.6.0"
+            }
+        },
+        "node_modules/yarn-or-npm/node_modules/cross-spawn": {
+            "version": "6.0.5",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "nice-try": "^1.0.4",
+                "path-key": "^2.0.1",
+                "semver": "^5.5.0",
+                "shebang-command": "^1.2.0",
+                "which": "^1.2.9"
+            },
+            "engines": {
+                "node": ">=4.8"
+            }
+        },
+        "node_modules/yarn-or-npm/node_modules/path-key": {
+            "version": "2.0.1",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/yarn-or-npm/node_modules/semver": {
+            "version": "5.7.1",
+            "dev": true,
+            "license": "ISC",
+            "bin": {
+                "semver": "bin/semver"
+            }
+        },
+        "node_modules/yarn-or-npm/node_modules/shebang-command": {
+            "version": "1.2.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "shebang-regex": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/yarn-or-npm/node_modules/shebang-regex": {
+            "version": "1.0.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/yarn-or-npm/node_modules/which": {
+            "version": "1.3.1",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "isexe": "^2.0.0"
+            },
+            "bin": {
+                "which": "bin/which"
+            }
+        },
+        "node_modules/yauzl": {
+            "version": "2.10.0",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "buffer-crc32": "~0.2.3",
+                "fd-slicer": "~1.1.0"
+            }
+        },
+        "node_modules/yocto-queue": {
+            "version": "0.1.0",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
         }
-      }
-    },
-    "node_modules/xmlbuilder": {
-      "version": "15.1.1",
-      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
-      "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "node_modules/y18n": {
-      "version": "5.0.8",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
-      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
-    },
-    "node_modules/yargs": {
-      "version": "17.7.1",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz",
-      "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==",
-      "dev": true,
-      "dependencies": {
-        "cliui": "^8.0.1",
-        "escalade": "^3.1.1",
-        "get-caller-file": "^2.0.5",
-        "require-directory": "^2.1.1",
-        "string-width": "^4.2.3",
-        "y18n": "^5.0.5",
-        "yargs-parser": "^21.1.1"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/yargs-parser": {
-      "version": "21.1.1",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
-      "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/yarn-or-npm": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/yarn-or-npm/-/yarn-or-npm-3.0.1.tgz",
-      "integrity": "sha512-fTiQP6WbDAh5QZAVdbMQkecZoahnbOjClTQhzv74WX5h2Uaidj1isf9FDes11TKtsZ0/ZVfZsqZ+O3x6aLERHQ==",
-      "dev": true,
-      "dependencies": {
-        "cross-spawn": "^6.0.5",
-        "pkg-dir": "^4.2.0"
-      },
-      "bin": {
-        "yarn-or-npm": "bin/index.js",
-        "yon": "bin/index.js"
-      },
-      "engines": {
-        "node": ">=8.6.0"
-      }
-    },
-    "node_modules/yarn-or-npm/node_modules/cross-spawn": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-      "dev": true,
-      "dependencies": {
-        "nice-try": "^1.0.4",
-        "path-key": "^2.0.1",
-        "semver": "^5.5.0",
-        "shebang-command": "^1.2.0",
-        "which": "^1.2.9"
-      },
-      "engines": {
-        "node": ">=4.8"
-      }
-    },
-    "node_modules/yarn-or-npm/node_modules/path-key": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-      "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/yarn-or-npm/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/yarn-or-npm/node_modules/shebang-command": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-      "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
-      "dev": true,
-      "dependencies": {
-        "shebang-regex": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/yarn-or-npm/node_modules/shebang-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-      "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/yarn-or-npm/node_modules/which": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-      "dev": true,
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "which": "bin/which"
-      }
-    },
-    "node_modules/yauzl": {
-      "version": "2.10.0",
-      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
-      "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
-      "dev": true,
-      "dependencies": {
-        "buffer-crc32": "~0.2.3",
-        "fd-slicer": "~1.1.0"
-      }
-    },
-    "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": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
     }
-  }
 }

+ 4 - 2
ElectronJS/package.json

@@ -33,9 +33,11 @@
     "dependencies": {
         "electron-squirrel-startup": "^1.0.0",
         "http": "^0.0.1-security",
+        "multer": "^1.4.5-lts.1",
         "node-window-manager": "^2.2.4",
         "selenium-webdriver": "^4.8.0",
-        "ws": "^8.12.0"
+        "ws": "^8.12.0",
+        "xlsx": "^0.18.5"
     },
     "config": {
         "forge": {
@@ -74,4 +76,4 @@
             "publishers": []
         }
     }
-}
+}

+ 1 - 0
ElectronJS/package_linux64.sh

@@ -14,6 +14,7 @@ rm -r out/EasySpider/resources/app/user_data
 rm -r ../.temp_to_pub/EasySpider_Linux_x64/EasySpider
 rm out/EasySpider/resources/app/vs_BuildTools.exe
 mv out/EasySpider ../.temp_to_pub/EasySpider_Linux_x64/EasySpider
+cp ../ExecuteStage/easyspider_executestage.py ../.temp_to_pub/EasySpider_Linux_x64
 chmod 777 ../.temp_to_pub/EasySpider_Linux_x64/easy-spider.sh
 
 rm -r ..\.temp_to_pub\EasySpider_Linux_x64\user_data

+ 1 - 0
ElectronJS/package_macos.sh

@@ -14,3 +14,4 @@ rm -r ../.temp_to_pub/EasySpider_MacOS_all_arch/EasySpider.app/Contents/Resource
 rm -r ../.temp_to_pub/EasySpider_MacOS_all_arch/EasySpider.app/Contents/Resources/app/tasks
 rm -r ../.temp_to_pub/EasySpider_MacOS_all_arch/EasySpider.app/Contents/Resources/app/execution_instances
 rm -r ../.temp_to_pub/EasySpider_MacOS_all_arch/EasySpider.app/Contents/Resources/app/user_data
+cp ../ExecuteStage/easyspider_executestage.py ../.temp_to_pub/EasySpider_MacOS_all_arch

+ 2 - 0
ElectronJS/server.js

@@ -4,6 +4,8 @@ const url = require('url');
 const fs = require('fs');
 const path=require('path');
 const {app, dialog} = require('electron');
+const XLSX = require('xlsx');
+const multer  = require('multer');
 function travel(dir,callback){
     fs.readdirSync(dir).forEach((file)=>{
         const pathname=path.join(dir,file)

+ 22 - 5
ElectronJS/src/index.html

@@ -85,6 +85,11 @@
                       style="margin-top: 15px; width: 300px;height:60px;padding-top:12px;color:white">Start Clean Mode</a>
                 </p>
 
+                <p><a @click="startDesign('en', false, true)"
+                      class="btn btn-primary btn-lg"
+                      style="margin-top: 15px; width: 300px;height:60px;padding-top:12px;color:white">Clean Mode (Mobile)</a>
+                </p>
+
                 <p><a @click="step = 2" @click
                       class="btn btn-primary btn-lg"
                       style="margin-top: 15px; width: 300px;height:60px;padding-top:12px;color:white">Start Data Mode</a>
@@ -107,6 +112,10 @@
                 <p><a @click="startDesign('en', true)"
                       class="btn btn-primary btn-lg"
                       style="margin-top: 15px; width: 300px;height:60px;padding-top:12px;color:white">Start Design</a></p>
+                <p>
+                <p><a @click="startDesign('en', true, true)"
+                      class="btn btn-primary btn-lg"
+                      style="margin-top: 15px; width: 300px;height:60px;padding-top:12px;color:white">Start Design (Mobile)</a></p>
                 <p>
                     <a @click="step = 0" class="btn btn-outline-primary btn-lg"style="margin-top: 10px; width: 300px;height:45px;padding-top:5px">Go to Home Page</a>
                 </p>
@@ -132,20 +141,24 @@
             </div>
             <div v-else-if="step == 1">
                 <h4 style="margin-top: 20px">请选择设计模式</h4>
-                <p style="margin-top: 20px; text-align: left; width:310px; margin-left: 18%">
+                <p style="margin-top: 20px; text-align: left; width:320px; margin-left: 18%">
                     纯净版浏览器:无任何用户信息的浏览器。</p>
-                <p style="text-align: left; width:310px; margin-left: 18%">
+                <p style="text-align: left; width:320px; margin-left: 18%">
                     带用户信息的浏览器:保存有用户数据,如网站的登录信息,cookie的浏览器。</p>
                 <p><a @click="startDesign('zh')"
                       class="btn btn-primary btn-lg"
-                      style="margin-top: 15px; width: 300px;height:60px;padding-top:12px;color:white">使用纯净版浏览器设计</a>
+                      style="margin-top: 15px; width: 320px;height:60px;padding-top:12px;color:white;">使用纯净版浏览器设计</a>
+                </p>
+                <p><a @click="startDesign('zh', false, true)"
+                      class="btn btn-primary btn-lg"
+                      style="margin-top: 15px; width: 320px;height:60px;padding-top:12px;color:white;">纯净版浏览器设计(手机模式)</a>
                 </p>
 
                 <p><a @click="step = 2" class="btn btn-primary btn-lg"
-                      style="margin-top: 15px; width: 300px;height:60px;padding-top:12px;color:white">使用带用户信息浏览器设计</a>
+                      style="margin-top: 15px; width: 320px;height:60px;padding-top:12px;color:white">使用带用户信息浏览器设计</a>
                 </p>
                 <p>
-                    <a @click="step = 0" class="btn btn-outline-primary btn-lg"style="margin-top: 10px; width: 300px;height:45px;padding-top:5px">返回首页</a>
+                    <a @click="step = 0" class="btn btn-outline-primary btn-lg"style="margin-top: 10px; width: 320px;height:45px;padding-top:5px">返回首页</a>
                 </p>
 
             </div>
@@ -163,6 +176,10 @@
                 <p><a @click="startDesign('zh', true)"
                       class="btn btn-primary btn-lg"
                       style="margin-top: 15px; width: 300px;height:60px;padding-top:12px;color:white">开始设计</a></p>
+                <p>
+                <p><a @click="startDesign('zh', true, true)"
+                      class="btn btn-primary btn-lg"
+                      style="margin-top: 15px; width: 300px;height:60px;padding-top:12px;color:white">开始设计(手机模式)</a></p>
                 <p>
                     <a @click="step = 0" class="btn btn-outline-primary btn-lg"style="margin-top: 10px; width: 300px;height:45px;padding-top:5px">返回首页</a>
                 </p>

+ 3 - 3
ElectronJS/src/index.js

@@ -50,7 +50,7 @@ var app = Vue.createApp({
             this.init = false;
             this.lang = lang;
         },
-        startDesign(lang, with_data = false) {
+        startDesign(lang, with_data = false, mobile=false) {
             if (with_data) {
                 console.log(this.user_data_folder)
                 if (this.user_data_folder == null || this.user_data_folder == "") {
@@ -61,9 +61,9 @@ var app = Vue.createApp({
                     }
                     return;
                 }
-                window.electronAPI.startDesign(lang, this.user_data_folder);
+                window.electronAPI.startDesign(lang, this.user_data_folder, mobile);
             } else {
-                window.electronAPI.startDesign(lang);
+                window.electronAPI.startDesign(lang, '', mobile);
             }
         },
         startInvoke(lang) {

+ 1 - 1
ElectronJS/src/js/preload.js

@@ -8,6 +8,6 @@
 const { contextBridge, ipcRenderer } = require('electron');
 
 contextBridge.exposeInMainWorld('electronAPI', {
-    startDesign: (lang="en", user_data_folder = '') => ipcRenderer.send('start-design', lang, user_data_folder),
+    startDesign: (lang="en", user_data_folder = '', mobile=false) => ipcRenderer.send('start-design', lang, user_data_folder, mobile),
     startInvoke: (lang="en") => ipcRenderer.send('start-invoke', lang),
 })

+ 20 - 2
ElectronJS/src/taskGrid/FlowChart.html

@@ -465,6 +465,12 @@
                 <div style="margin-top:5px">
                     <label>Seconds <b>after executed</b> (Can be set to a decimal, such as 0.5):</label>
                     <input onkeydown="inputDelete(event)" required type="number" class="form-control" v-model.number='list.nl[index.nowNodeIndex]["parameters"]["wait"]'></input>
+                    <label>等待类型</label>
+                    <label>Wait Type</label>
+                    <select v-model='list.nl[index.nowNodeIndex]["parameters"]["waitType"]' class="form-control">
+                        <option value = 0>Fixed wait (set to wait for 10 seconds then it will wait for 10 seconds)</option>
+                        <option value = 1>Random wait (set to wait for 10 seconds then it will randomly wait for 10 × 0.5 - 10 × 1.5 seconds)</option>
+                    </select>
                 </div>
                 <button class="btn btn-outline-primary" style="margin-top: 20px;" id="confirm">Confirm</button>
 
@@ -476,7 +482,7 @@
     </div>
 
     <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
-        <div class="modal-dialog">
+        <div class="modal-dialog modal-lg">
             <div class="modal-content">
                 <div class="modal-header">
                     <h4 class="modal-title" id="myModalLabel">Save Task</h4>
@@ -488,7 +494,19 @@
                     <label>Task Name:</label>
                     <input onkeydown="inputDelete(event)" required name="serviceName" value="New Crawler Task" id="serviceName" class="form-control"></input>
                     <label>Task Description:</label>
-                    <textarea onkeydown="inputDelete(event)" id="serviceDescription" name="serviceDescription" class="form-control" rows="3"></textarea>
+                    <input onkeydown="inputDelete(event)" id="serviceDescription" name="serviceDescription" class="form-control"></input>
+                    <label>How many data to save locally each time (the larger the value, the faster the collection speed, but there is a risk of data loss):</label>
+                    <input onkeydown="inputDelete(event)" type="number" value="10" id="saveThreshold" name="saveThreshold" class="form-control"></input>
+                    <label>Is the page an extreme anti-crawler website such as Cloudflare:</label>
+                    <select id="cloudflare" name="cloudflare" class="form-control">
+                        <option value = 0>No</option>
+                        <option value = 1>Yes</option>
+                    </select>
+                    <label>Browser simulation type:</label>
+                    <select id="environment" name="environment" class="form-control">
+                        <option value = 0>Personal Computer</option>
+                        <option value = 1>Mobile (not support on Cloudflare mode)</option>
+                    </select>
                 </div>
                 <div class="modal-footer">
                     <button type="button" id="saveAsButton" class="btn btn-outline-primary">Save as</button>

+ 21 - 3
ElectronJS/src/taskGrid/FlowChart_CN.html

@@ -110,7 +110,7 @@
                         <option value = 0>不滚动</option>
                         <option value = 1>向下滚动一屏</option>
                         <option value = 2>滚动到底部</option>
-                      </select>
+                    </select>
                     <label>滚动次数(滚动类型设置为<b>不滚动</b>时<b>无效</b>):</label>
                     <input onkeydown="inputDelete(event)" class="form-control" v-model.number="nowNode['parameters']['scrollCount']" type="number" required></input>
                     <label>滚动后等待时间(秒):</label>
@@ -464,6 +464,11 @@
                 <div style="margin-top:5px">
                     <label><b>执行后</b>等待秒数(所有等待时间均可设置为小数,如0.5):</label>
                     <input onkeydown="inputDelete(event)" required type="number" class="form-control" v-model.number='list.nl[index.nowNodeIndex]["parameters"]["wait"]'></input>
+                    <label>等待类型</label>
+                    <select v-model='list.nl[index.nowNodeIndex]["parameters"]["waitType"]' class="form-control">
+                        <option value = 0>固定等待(设置等10秒就等10秒)</option>
+                        <option value = 1>随机等待(设置等10秒会随机等10×0.5 - 10 × 1.5 秒)</option>
+                    </select>
                 </div>
                 <button class="btn btn-outline-primary" style="margin-top: 20px;" id="confirm">确定</button>
 
@@ -475,7 +480,7 @@
     </div>
 
     <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
-        <div class="modal-dialog">
+        <div class="modal-dialog modal-lg">
             <div class="modal-content">
                 <div class="modal-header">
                     <h4 class="modal-title" id="myModalLabel">保存任务</h4>
@@ -487,7 +492,20 @@
                     <label>任务名称:</label>
                     <input onkeydown="inputDelete(event)" required name="serviceName" value="新web采集任务" id="serviceName" class="form-control"></input>
                     <label>任务描述:</label>
-                    <textarea onkeydown="inputDelete(event)" id="serviceDescription" name="serviceDescription" class="form-control" rows="3"></textarea>
+                    <input onkeydown="inputDelete(event)" id="serviceDescription" name="serviceDescription" class="form-control"></input>
+                    <label>每采集多少条数据本地保存一次(值越大采集速度越快,但如果意外退出则有数据丢失风险):</label>
+                    <input onkeydown="inputDelete(event)" type="number" value="10" id="saveThreshold" name="saveThreshold" class="form-control"></input>
+                    <label>是否为cloudflare等极端反爬网站:</label>
+                    <select id="cloudflare" name="cloudflare" class="form-control">
+                        <option value = 0>否</option>
+                        <option value = 1>是</option>
+                    </select>
+                    <label>浏览器模拟类型:</label>
+                    <select id="environment" name="environment" class="form-control">
+                        <option value = 0>电脑端</option>
+                        <option value = 1>手机端(Cloudflare模式下不支持)</option>
+                    </select>
+
                 </div>
                 <div class="modal-footer">
                     <button type="button" id="saveAsButton" class="btn btn-outline-primary">另存为</button>

+ 1 - 0
ElectronJS/src/taskGrid/invokeTask.html

@@ -122,6 +122,7 @@
             lang}}
         </button>
         <!-- <button style="margin-left: 5px;" v-on:click="remoteExcuteInstant" class="btn btn-primary">Directly Run Remotely</button> -->
+        <label style="margin-top: 15px">{{"When running task, long press 'p' to pause the task for manual operation of the browser such as entering the verification code; If you want to resume the execution of the task, please long press 'p' again.:~任务执行过程中,长按键盘p键可暂停任务的执行以便手工操作浏览器如输入验证码;如果想恢复任务的执行,请再次长按p键。" | lang}}</label>
         <div style="margin-bottom: 10px;">
             <label style="margin-top: 10px;">{{"Execution ID (EID):~执行ID:" | lang}}</label>
             <input class="form-control" v-model="ID"></input>

+ 11 - 0
ElectronJS/src/taskGrid/logic.js

@@ -142,6 +142,7 @@ function addParameters(t) {
         useLoop: false, //是否使用循环中的元素
         xpath: "", //xpath
         wait: 0, //执行后等待
+        waitType: 0, //等待类型,0代表固定时间,1代表随机等待
         beforeJS: "", //执行前执行的js
         beforeJSWaitTime: 0, //执行前js等待时间
         afterJS: "", //执行后执行的js
@@ -277,6 +278,10 @@ function getUrlParam(name) {
 
 var sId = getUrlParam('id');
 var backEndAddressServiceWrapper = getUrlParam("backEndAddressServiceWrapper");
+let mobile = getUrlParam("mobile");
+if (mobile == "true") {
+    $("#environment").val(1);
+}
 
 function saveService(type) {
     let serviceId = $("#serviceId").val();
@@ -296,6 +301,9 @@ function saveService(type) {
         let outputIndex = 0;
         let links = ""; //记录所有的link
         let containJudge = false; //是否含有判断语句
+        let saveThreshold = parseInt($("#saveThreshold").val());
+        let cloudflare = parseInt($("#cloudflare").val());
+        let environment = parseInt($("#environment").val());
         for (let i = 1; i < nodeList.length; i++) {
             if (nodeList[i]["id"] != -1) { //已经被删除的节点不进行统计
                 if (nodeList[i]["option"] == 1) //打开网页操作,统计输入框输入操作
@@ -403,6 +411,9 @@ function saveService(type) {
             "links": links,
             "create_time": new Date().toLocaleString(),
             "version": "0.3.3",
+            "saveThreshold": saveThreshold,
+            "cloudflare": cloudflare,
+            "environment": environment,
             "containJudge": containJudge,
             "desc": serviceDescription,
             "inputParameters": inputParameters,

+ 11 - 0
ElectronJS/src/taskGrid/logic_CN.js

@@ -142,6 +142,7 @@ function addParameters(t) {
         useLoop: false, //是否使用循环中的元素
         xpath: "", //xpath
         wait: 0, //执行后等待
+        waitType: 0, //等待类型,0代表固定时间,1代表随机等待
         beforeJS: "", //执行前执行的js
         beforeJSWaitTime: 0, //执行前js等待时间
         afterJS: "", //执行后执行的js
@@ -277,6 +278,10 @@ function getUrlParam(name) {
 
 var sId = getUrlParam('id');
 var backEndAddressServiceWrapper = getUrlParam("backEndAddressServiceWrapper");
+let mobile = getUrlParam("mobile");
+if (mobile == "true") {
+    $("#environment").val(1);
+}
 
 function saveService(type) {
     let serviceId = $("#serviceId").val();
@@ -296,6 +301,9 @@ function saveService(type) {
         let outputIndex = 0;
         let links = ""; //记录所有的link
         let containJudge = false; //是否含有判断语句
+        let saveThreshold = parseInt($("#saveThreshold").val());
+        let cloudflare = parseInt($("#cloudflare").val());
+        let environment = parseInt($("#environment").val());
         for (let i = 1; i < nodeList.length; i++) {
             if (nodeList[i]["id"] != -1) { //已经被删除的节点不进行统计
                 if (nodeList[i]["option"] == 1) //打开网页操作,统计输入框输入操作
@@ -403,6 +411,9 @@ function saveService(type) {
             "links": links,
             "create_time": new Date().toLocaleString(),
             "version": "0.3.3",
+            "saveThreshold": saveThreshold,
+            "cloudflare": cloudflare,
+            "environment": environment,
             "containJudge": containJudge,
             "desc": serviceDescription,
             "inputParameters": inputParameters,

+ 10 - 2
ElectronJS/src/taskGrid/newTask.html

@@ -10,12 +10,20 @@
     <script src="vue.js"></script>
     <link rel="stylesheet" href="bootstrap/css/bootstrap.css"></link>
     <title>New Task</title>
+<style>
+    @media (max-width: 500px) {
+        #newTask{
+            margin-left:10%!important;
+        }
+    }
+</style>
 
 </head>
 
+
 <body>
-    <div class="row" style="margin-top: 40px;" id="newTask">
-        <div class="col-md-6" style="margin:0 auto" style="text-align: center;">
+    <div class="row" style="margin-top: 40px" id="newTask">
+        <div class="col-md-6" style="margin:0 auto;" style="text-align: center;">
             <nav aria-label="breadcrumb">
                 <ol class="breadcrumb" style="padding-left:0;background-color: white">
                     <li class="breadcrumb-item" @click="gotoHome"><a href="#">{{"Home~首页" | lang}}</a></li>

+ 11 - 2
ElectronJS/src/taskGrid/taskList.html

@@ -16,11 +16,18 @@
         text-align: left;
         vertical-align: middle!important;
     }
+    @media (max-width: 500px) {
+        .tasklist{
+            margin-left:10%!important;
+
+        }
+    }
 </style>
 <body>
     <div class="row" style="margin-top: 40px;">
-        <div style="margin:0 auto;min-width: 70%;" id="taskList">
+        <div style="margin:0 auto; min-width: 70%;" id="taskList" class="tasklist">
             <h4 style="text-align: center;">{{"Task List~任务列表" | lang}}</h4>
+            <h5 style="text-align: center;" v-if="mobile==1">{{"View this table by direction keys on keyboard~按键盘方向键浏览此表格" | lang}}</h5>
             <p><a v-if="type==3" href="javascript:void(0)" v-on:click="newTask" class="btn btn-primary">{{"New Task~创建新任务" | lang}}</a></p>
             <div v-if="type != 3" style="margin-bottom: 20px">
                 <a class="btn btn-primary" href="https://github.com/NaiboWang/EasySpider/wiki" target="_blank">{{"Software Documentation~软件使用说明文档" | lang}}</a>
@@ -64,11 +71,12 @@
         data: {
             list: [],
             type: 3, //记录服务行为
+            mobile: getUrlParam("mobile"),
             backEndAddressServiceWrapper: getUrlParam("backEndAddressServiceWrapper"),
         },
         methods: {
             newTask: function (){
-                window.location.href = "newTask.html?lang="+getUrlParam("lang")+"&wsport="+getUrlParam("wsport")+"&backEndAddressServiceWrapper="+ app.$data.backEndAddressServiceWrapper;
+                window.location.href = "newTask.html?lang="+getUrlParam("lang")+"&mobile="+getUrlParam("mobile")+"&wsport="+getUrlParam("wsport")+"&backEndAddressServiceWrapper="+ app.$data.backEndAddressServiceWrapper;
             },
             modifyTask: function(id, url) {
                 let message = { //显示flowchart
@@ -129,4 +137,5 @@
         // 关闭 websocket
         console.log("连接已关闭...");
     };
+
 </script>

+ 1 - 1
ElectronJS/tasks/106.json

@@ -1 +1 @@
-{"id":106,"name":"京东全球版-专业的综合网上购物商城","url":"https://www.jd.com","links":"https://www.jd.com","create_time":"7/1/2023, 9:20:10 PM","version":"0.3.3","containJudge":false,"desc":"https://www.jd.com","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.jd.com","desc":"要采集的网址列表,多行以\\n分开","type":"string","exampleValue":"https://www.jd.com"},{"id":1,"name":"inputText_1","nodeName":"输入文字","nodeId":2,"desc":"要输入的文本,如京东搜索框输入:电脑","type":"string","exampleValue":"iphone<enter>","value":"iphone<enter>"}],"outputParameters":[],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","wait":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"url":"https://www.jd.com","links":"https://www.jd.com","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1}},{"id":2,"index":2,"parentId":0,"type":0,"option":4,"title":"输入文字","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"key\"]","wait":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"value":"iphone<enter>","allXPaths":["/html/body/div[4]/div[1]/div[2]/div[1]/input[1]","//input[contains(., '')]","id(\"key\")","//INPUT[@class='text defcolor']","/html/body/div[last()-6]/div/div[last()-2]/div/input"]}}]}
+{"id":106,"name":"京东全球版-专业的综合网上购物商城","url":"https://www.jd.com","links":"https://www.jd.com","create_time":"7/1/2023, 10:51:18 PM","version":"0.3.3","saveThreshold":100,"cloudflare":0,"environment":0,"containJudge":false,"desc":"https://www.jd.com","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.jd.com","desc":"要采集的网址列表,多行以\\n分开","type":"string","exampleValue":"https://www.jd.com"},{"id":1,"name":"inputText_1","nodeName":"输入文字","nodeId":2,"desc":"要输入的文本,如京东搜索框输入:电脑","type":"string","exampleValue":"iphone<enter>","value":"iphone<enter>"}],"outputParameters":[],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","wait":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"url":"https://www.jd.com","links":"https://www.jd.com","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1}},{"id":2,"index":2,"parentId":0,"type":0,"option":4,"title":"输入文字","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"key\"]","wait":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"value":"iphone<enter>","allXPaths":["/html/body/div[4]/div[1]/div[2]/div[1]/input[1]","//input[contains(., '')]","id(\"key\")","//INPUT[@class='text defcolor']","/html/body/div[last()-6]/div/div[last()-2]/div/input"]}}]}

File diff suppressed because it is too large
+ 0 - 0
ElectronJS/tasks/107.json


File diff suppressed because it is too large
+ 0 - 0
ElectronJS/tasks/108.json


+ 1 - 0
ElectronJS/tasks/109.json

@@ -0,0 +1 @@
+{"id":109,"name":"Logo Design Jobs for July 2023 | Freelancer","url":"https://www.freelancer.com/jobs/logo-design","links":"https://www.freelancer.com/jobs/logo-design","create_time":"7/2/2023, 11:36:40 AM","version":"0.3.3","saveThreshold":10,"cloudflare":0,"environment":0,"containJudge":false,"desc":"https://www.freelancer.com/jobs/logo-design","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.freelancer.com/jobs/logo-design","desc":"要采集的网址列表,多行以\\n分开","type":"string","exampleValue":"https://www.freelancer.com/jobs/logo-design"}],"outputParameters":[],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","wait":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":2,"waitType":"1","beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"url":"https://www.freelancer.com/jobs/logo-design","links":"https://www.freelancer.com/jobs/logo-design","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1}},{"id":2,"index":2,"parentId":0,"type":0,"option":2,"title":"点击元素","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//a[@data-pagination-next-button]\n","wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"allXPaths":["/html/body/div[2]/main[1]/section[1]/div[4]/div[1]/div[2]/div[1]/div[1]/div[4]/ul[1]/li[6]/a[1]","//a[contains(., '')]","//A[@class='btn Pagination-link']","/html/body/div[last()-7]/main/section/div[last()-2]/div/div/div[last()-1]/div[last()-1]/div/ul/li[last()-1]/a"]}}]}

File diff suppressed because it is too large
+ 0 - 0
ElectronJS/tasks/110.json


File diff suppressed because it is too large
+ 0 - 1294
ElectronJS/tasks/49.json


+ 1 - 1
ExecuteStage/.vscode/launch.json

@@ -10,7 +10,7 @@
             "program": "${file}",
             "console": "integratedTerminal",
             "justMyCode": true,
-            "args": ["--id", "[104]", "--read_type", "remote", "--headless", "0"]
+            "args": ["--id", "[117]", "--read_type", "remote", "--headless", "0"]
             // "args": ["--id", "[44]", "--headless", "0", "--user_data", "1"]
         }
     ]

+ 156 - 64
ExecuteStage/easyspider_executestage.py

@@ -1,15 +1,17 @@
 # -*- coding: utf-8 -*-
-import atexit
+# import atexit
 import io  # 遇到错误退出时应执行的代码
 import json
-from lib2to3.pgen2 import driver
+# from lib2to3.pgen2 import driver
 import re
+# import shutil
 import subprocess
 import sys
-from urllib import parse
-import base64
-import hashlib
+# from urllib import parse
+# import base64
+# import hashlib
 import time
+import keyboard
 import requests
 from lxml import etree
 from selenium.webdriver.chrome.options import Options
@@ -25,7 +27,7 @@ from selenium.common.exceptions import StaleElementReferenceException, InvalidSe
 from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
 from selenium.webdriver.support.ui import Select
 from selenium.webdriver import ActionChains
-# import undetected_chromedriver as uc
+import undetected_chromedriver as uc
 import random
 # import numpy
 import csv
@@ -35,10 +37,27 @@ from commandline_config import Config
 import pytesseract
 from PIL import Image
 import uuid
-from threading import Thread
+from threading import Thread, Event
 desired_capabilities = DesiredCapabilities.CHROME
 desired_capabilities["pageLoadStrategy"] = "none"
 
+# 控制流程的暂停和继续
+def check_file(filename, event):
+    while True:
+        if keyboard.is_pressed('p'):  # 按下p键,暂停程序
+            if event._flag == False:
+                print("任务执行中,长按p键暂停执行。")
+                print("Task is running, long press 'p' to pause.")
+                # 设置Event的值为True,使得线程b可以继续执行
+                event.set()
+            else:
+                # 设置Event的值为False,使得线程b暂停执行
+                print("任务已暂停,长按p键继续执行...")
+                print("Task paused, press 'p' to continue...")
+                event.clear()
+        time.sleep(1)  # 每秒检查一次
+
+
 def download_image(url, save_directory):
     # 定义浏览器头信息
     headers = {
@@ -94,12 +113,12 @@ class Time:
 
 
 class BrowserThread(Thread):
-    def __init__(self, browser_t, id, saved_file_name, read_type, server_address, version):
+    def __init__(self, browser_t, id, service, version, event):
         Thread.__init__(self)
         self.browser = browser_t
         self.id = id
-        self.saved_file_name = saved_file_name
-        self.saveName = None
+        self.event = event
+        self.saveName = saveName
         self.log = ""
         self.OUTPUT = ""
         self.SAVED = False
@@ -110,26 +129,6 @@ class BrowserThread(Thread):
         self.browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': js}) # TMALL 反扒
         WebDriverWait(self.browser, 10)
         self.browser.get('about:blank')
-        print("id: ", id)
-        if saved_file_name != "":
-            self.saveName = "task_" + str(id) + "_" + saved_file_name  # 保存文件的名字
-        else:
-            self.saveName = "task_" + str(id) + "_" + \
-                str(random.randint(0, 999999999))  # 保存文件的名字
-        print("Save Name for task id", id, "is:", self.saveName)
-        print("任务id", id, "的保存文件名为:", self.saveName)
-        os.mkdir("Data/" + self.saveName)  # 创建保存文件夹用来保存截图
-        if read_type == "remote":
-            print("remote")
-            content = requests.get(server_address + "/queryExecutionInstance?id=" + str(id))
-            service = json.loads(content.text)  # 加载服务信息
-        else:
-            print("local")
-            with open("execution_instances/" + str(id) + ".json", 'r', encoding='utf-8') as f:
-                content = f.read()
-                service = json.loads(content)  # 加载服务信息
-        print("Task Name:", service["name"])
-        print("任务名称:", service["name"])
         self.procedure = service["graph"]  # 程序执行流程
         try:
             if service["version"] >= "0.3.1": # 0.3.1及以上版本以上的EasySpider兼容从0.3.1版本开始的所有版本
@@ -145,6 +144,10 @@ class BrowserThread(Thread):
             print("Version not match, please use EasySpider v0.2.0 to run this task!")
             self.browser.quit()
             sys.exit()
+        try:
+            self.save_threshold = service["saveThreshold"]  # 保存最低阈值
+        except:
+            self.save_threshold = 10
         self.links = list(filter(isnull, service["links"].split("\n")))  # 要执行的link的列表
         self.OUTPUT = []  # 采集的数据
         self.OUTPUT.append([])  # 添加表头
@@ -185,6 +188,7 @@ class BrowserThread(Thread):
         # 如果目录为空,则删除该目录
         if not files:
             os.rmdir("Data/" + self.saveName)
+        # os.remove("Data/" + self.saveName + "_control.txt")
         print("Done!")
         print("执行完成!")
         self.recordLog("Done!")
@@ -207,7 +211,7 @@ class BrowserThread(Thread):
     #     sys.exit(0)
 
     def saveData(self, exit=False):
-        if exit == True or len(self.OUTPUT) >= 10: # 每10条保存一次
+        if exit == True or len(self.OUTPUT) >= self.save_threshold: # 每save_threshold条保存一次
             with open("Data/"+ self.saveName + '_log.txt', 'a', encoding='utf-8-sig') as file_obj:
                 file_obj.write(self.log)
                 file_obj.close()
@@ -414,8 +418,16 @@ class BrowserThread(Thread):
             waitTime = 0.01  # 默认等待0.01秒
             if node["parameters"]["wait"] >= 0:
                 waitTime = node["parameters"]["wait"]
-            time.sleep(waitTime)
+            try:
+                waitType = int(node["parameters"]["waitType"])
+            except:
+                waitType = 0
+            if waitType == 0:  # 固定等待时间
+                time.sleep(waitTime)
+            elif waitType == 1:  # 随机等待时间
+                time.sleep(random.uniform(waitTime * 0.5, waitTime * 1.5))
             self.Log("Wait seconds after node executing: ", waitTime)
+        self.event.wait()  # 等待事件结束
 
 
     # 对判断条件的处理
@@ -812,7 +824,14 @@ class BrowserThread(Thread):
                     path + ", please try to set the wait time before executing this operation")
             print("找不到要点击的元素:" + path + ",请尝试在执行此操作前设置等待时间")
         waitTime = float(para["wait"]) + 0.01  # 点击之后等待
-        time.sleep(waitTime)  # 点击之后等待waitTime秒
+        try:
+            waitType = int(para["waitType"])
+        except:
+            waitType = 0
+        if waitType == 0:  # 固定等待时间
+            time.sleep(waitTime)
+        elif waitType == 1:  # 随机等待时间
+            time.sleep(random.uniform(waitTime * 0.5, waitTime * 1.5))
         if tempHandleNum != len(self.browser.window_handles):  # 如果有新标签页的行为发生
             self.browser.switch_to.window(self.browser.window_handles[-1])  # 跳转到新的标签页
             self.history["handle"] = self.browser.current_window_handle
@@ -875,17 +894,39 @@ class BrowserThread(Thread):
             else: # 普通节点
                 content = element.text
         elif p["contentType"] == 1:  # 只采集当期元素下的文本,不包括子元素
-            command = 'var arr = [];\
-            var content = arguments[0];\
-            for(var i = 0, len = content.childNodes.length; i < len; i++) {\
-                if(content.childNodes[i].nodeType === 3){  \
-                    arr.push(content.childNodes[i].nodeValue);\
+            if p["nodeType"] == 2:
+                if element.get_attribute("href") != None:
+                    content = element.get_attribute("href")
+                else:
+                    content = ""
+            elif p["nodeType"] == 3:
+                if element.get_attribute("value") != None:
+                    content = element.get_attribute("value")
+                else:
+                    content = ""
+            elif p["nodeType"] == 4:  # 图片
+                if element.get_attribute("src") != None:
+                    content = element.get_attribute("src")
+                else:
+                    content = ""
+                try:
+                    downloadPic = p["downloadPic"]
+                except:
+                    downloadPic = 0
+                if downloadPic == 1:
+                    download_image(content, "Data/" + self.saveName + "/")
+            else:
+                command = 'var arr = [];\
+                var content = arguments[0];\
+                for(var i = 0, len = content.childNodes.length; i < len; i++) {\
+                    if(content.childNodes[i].nodeType === 3){  \
+                        arr.push(content.childNodes[i].nodeValue);\
+                    }\
                 }\
-            }\
-            var str = arr.join(" "); \
-            return str;'
-            content = self.browser.execute_script(command, element).replace(
-                "\n", "").replace("\\s+", " ")
+                var str = arr.join(" "); \
+                return str;'
+                content = self.browser.execute_script(command, element).replace(
+                    "\n", "").replace("\\s+", " ")
         elif p["contentType"] == 2:
             content = element.get_attribute('innerHTML')
         elif p["contentType"] == 3:
@@ -950,7 +991,10 @@ class BrowserThread(Thread):
     # 提取数据事件
     def getData(self, para, loopElement, isInLoop=True, parentPath="", index=0):
         pageHTML = etree.HTML(self.browser.page_source)
-        loopElementOuterHTML = loopElement.get_attribute('outerHTML')
+        try:
+            loopElementOuterHTML = loopElement.get_attribute('outerHTML')
+        except:
+            loopElementOuterHTML = ""
         loopElementHTML = etree.HTML(loopElementOuterHTML)
         for p in para["paras"]:
             if p["optimizable"]:
@@ -1190,32 +1234,80 @@ if __name__ == '__main__':
     option.add_argument(
         "--disable-blink-features=AutomationControlled")  # TMALL 反扒
     options.add_argument("--disable-blink-features=AutomationControlled")  # TMALL 反扒
-    options.add_experimental_option("prefs", {
-            "download.default_directory": "Data/",  # 设置文件下载路径
-            "download.prompt_for_download": False,  # 禁止下载提示框
-            "plugins.plugins_list": [{"enabled": False, "name": "Chrome PDF Viewer"}],
-            "download.directory_upgrade": True,
-            "download.extensions_to_open": "applications/pdf",
-            "plugins.always_open_pdf_externally": True  # 总是在外部程序中打开PDF
-        })
-    option.add_experimental_option("prefs", {
-            "download.default_directory": "Data/",  # 设置文件下载路径
-            "download.prompt_for_download": False,  # 禁止下载提示框
-            "plugins.plugins_list": [{"enabled": False, "name": "Chrome PDF Viewer"}],
-            "download.directory_upgrade": True,
-            "download.extensions_to_open": "applications/pdf",
-            "plugins.always_open_pdf_externally": True  # 总是在外部程序中打开PDF
-        })
-    print(options)
+    
     threads = []
     for i in c.id:
-        browser_t = webdriver.Chrome(
+        print(options)
+        print("id: ", i)
+        if c.saved_file_name != "":
+            saveName = "task_" + str(i) + "_" + c.saved_file_name  # 保存文件的名字
+        else:
+            saveName = "task_" + str(i) + "_" + \
+                str(random.randint(0, 999999999))  # 保存文件的名字
+        print("Save Name for task ID", i, "is:", saveName)
+        print("任务ID", i, "的保存文件名为:", saveName)
+        os.mkdir("Data/" + saveName)  # 创建保存文件夹用来保存截图
+        # with open("Data/" + saveName + "_control.txt", "w", encoding='utf-8') as f:
+        #     f.write("1")
+        #     f.close()
+        if c.read_type == "remote":
+            print("remote")
+            content = requests.get(c.server_address + "/queryExecutionInstance?id=" + str(i))
+            service = json.loads(content.text)  # 加载服务信息
+        else:
+            print("local")
+            with open("execution_instances/" + str(i) + ".json", 'r', encoding='utf-8') as f:
+                content = f.read()
+                service = json.loads(content)  # 加载服务信息
+        print("Task Name:", service["name"])
+        print("任务名称:", service["name"])
+        try:
+            cloudflare = service["cloudflare"]
+        except:
+            cloudflare = 0
+        if cloudflare == 0:
+            options.add_experimental_option("prefs", {
+                "download.default_directory": "Data/",  # 设置文件下载路径
+                "download.prompt_for_download": False,  # 禁止下载提示框
+                "plugins.plugins_list": [{"enabled": False, "name": "Chrome PDF Viewer"}],
+                "download.directory_upgrade": True,
+                "download.extensions_to_open": "applications/pdf",
+                "plugins.always_open_pdf_externally": True  # 总是在外部程序中打开PDF
+            })
+            option.add_experimental_option("prefs", {
+                "download.default_directory": "Data/",  # 设置文件下载路径
+                "download.prompt_for_download": False,  # 禁止下载提示框
+                "plugins.plugins_list": [{"enabled": False, "name": "Chrome PDF Viewer"}],
+                "download.directory_upgrade": True,
+                "download.extensions_to_open": "applications/pdf",
+                "plugins.always_open_pdf_externally": True  # 总是在外部程序中打开PDF
+            })
+            try:
+                if service["environment"] == 1:
+                    option.add_experimental_option('mobileEmulation', {'deviceName': 'iPhone X'})  # 模拟iPhone X浏览
+                    options.add_experimental_option('mobileEmulation', {'deviceName': 'iPhone X'})  # 模拟iPhone X浏览
+            except:
+                pass
+            browser_t = webdriver.Chrome(
+            options=options, chrome_options=option, executable_path=driver_path)
+        elif cloudflare == 1:
+            browser_t = uc.Chrome(
             options=options, chrome_options=option, executable_path=driver_path)
-        thread = BrowserThread(browser_t, i, c.saved_file_name, c.read_type, c.server_address, c.version)
+            print("Pass Cloudflare Mode")
+            print("过Cloudflare验证模式")
+        event = Event()
+        event.set()
+        thread = BrowserThread(browser_t, i, service, c.version, event)
         print("Thread with task id: ", i, " is created")
         threads.append(thread)
         thread.start()
-    
+        Thread(target=check_file, args=("Data/" + saveName + "_control.txt", event)).start()
+        time.sleep(5)
+        print("\n\n----------------------------------")
+        print("正在运行任务,长按键盘p键可暂停任务的执行以便手工操作浏览器如输入验证码;如果想恢复任务的执行,请再次长按p键。")
+        print("Running task, long press 'p' to pause the task for manual operation of the browser such as entering the verification code; If you want to resume the execution of the task, please long press 'p' again.")
+        print("----------------------------------\n\n")
+
     for thread in threads:
         thread.join()
     

Some files were not shown because too many files changed in this diff