From 61a65c854347969c6e4b6848baab536711c99176 Mon Sep 17 00:00:00 2001 From: coderhxl Date: Sat, 22 Apr 2023 20:25:54 +0800 Subject: [PATCH 01/17] Feat: Device fingerprint change --- CHANGELOG.md | 14 ++- README.md | 4 +- package.json | 2 +- src/api.ts | 215 +++++++++++++++++++++++++------------------- src/default.ts | 70 ++++++++++++--- src/types/api.ts | 42 ++++----- test/start/index.js | 2 +- test/start/index.ts | 112 +++++++++++------------ 8 files changed, 269 insertions(+), 192 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b59b242..d26f0a0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +# [v7.0.0](https://github.com/coder-hxl/x-crawl/compare/v6.0.1...v7.0.0) (2023-04-23) + +### 🚨 重大改变 + +- 进阶写法的配置指纹改用数组写法,里面存放 DetailTargetFingerprintCommon 类型的对象,方便定制。内部会将里面的对象随机分配给目标。 +- CrawlPageDetailTargetConfig 和 CrawlPageDetailTargetConfig 类型的指纹配置的最大宽高改为可选项。 + +### 🚀 特征 + +- DetailTargetFingerprintCommon 里的 userAgent 选项改写对象写法,并允许定制里面的主版本、次版本以及修订号的最大值和最小值。每个爬取目标都会获取一个新的 userAgent 。 +- 指纹配置的 mobile 选项添加 'random' 属性值,允许由内部随机决定。 + # [v6.0.1](https://github.com/coder-hxl/x-crawl/compare/v6.0.0...v6.0.1) (2023-04-21) ### 🚀 Features @@ -6,7 +18,7 @@ --- -### 特征 +### 🚀 特征 - 完善文档。 diff --git a/README.md b/README.md index 61f5a091..715f2d1a 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,9 @@ x-crawl is a flexible Node.js multipurpose crawler library. The usage is flexibl ## Features - **🔥 Asynchronous Synchronous** - Just change the mode property to toggle asynchronous or synchronous crawling mode. -- **⚙️Multiple purposes** - It can crawl pages, crawl interfaces, crawl files and poll crawls to meet the needs of various scenarios. +- **⚙️ Multiple purposes** - It can crawl pages, crawl interfaces, crawl files and poll crawls to meet the needs of various scenarios. - **🖋️ Flexible writing style** - The same crawling API can be adapted to multiple configurations, and each configuration method is very unique. -- **👀Device Fingerprinting** - Zero configuration or custom configuration, avoid fingerprinting to identify and track us from different locations. +- **👀 Device Fingerprinting** - Zero configuration or custom configuration, avoid fingerprinting to identify and track us from different locations. - **⏱️ Interval Crawling** - No interval, fixed interval and random interval to generate or avoid high concurrent crawling. - **🔄 Failed Retry** - Avoid crawling failure due to transient problems, unlimited retries. - **🚀 Priority Queue** - According to the priority of a single crawling target, it can be crawled ahead of other targets. diff --git a/package.json b/package.json index eaf93e6a..6a827640 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "x-crawl", - "version": "6.0.1", + "version": "7.0.0", "author": "coderHXL", "description": "x-crawl is a flexible Node.js multifunctional crawler library.", "license": "MIT", diff --git a/src/api.ts b/src/api.ts index d0f205e6..b7105732 100644 --- a/src/api.ts +++ b/src/api.ts @@ -31,13 +31,11 @@ import { CrawlFileAdvancedConfig, CrawlDataAdvancedConfig, IntervalTime, - DetailTargetFingerprintCommon, - Platform, - Mobile + DetailTargetFingerprintCommon } from './types/api' import { LoaderXCrawlConfig } from './types' import { AnyObject } from './types/common' -import { randomFingerprint } from './default' +import { fingerprints } from './default' /* Types */ @@ -104,6 +102,9 @@ interface PageSingleCrawlResult { interface CrawlPageConfigOriginal { detailTargets: CrawlPageDetailTargetConfig[] intervalTime: IntervalTime | undefined + + selectFingerprintIndexs: number[] + onCrawlItemComplete: | ((crawlPageSingleRes: CrawlPageSingleRes) => void) | undefined @@ -112,6 +113,9 @@ interface CrawlPageConfigOriginal { interface CrawlDataConfigOriginal { detailTargets: CrawlDataDetailTargetConfig[] intervalTime: IntervalTime | undefined + + selectFingerprintIndexs: number[] + onCrawlItemComplete: | ((crawlDataSingleRes: CrawlDataSingleRes) => void) | undefined @@ -120,6 +124,9 @@ interface CrawlDataConfigOriginal { interface CrawlFileConfigOriginal { detailTargets: CrawlFileDetailTargetConfig[] intervalTime: IntervalTime | undefined + + selectFingerprintIndexs: number[] + onBeforeSaveItemFile: | ((info: { id: number @@ -225,7 +232,7 @@ function loaderCommonFingerprintToDetailTarget( | CrawlFileDetailTargetConfig, fingerprint: DetailTargetFingerprintCommon ) { - const { userAgent, ua, platform, platformVersion, mobile, acceptLanguage } = + const { ua, platform, platformVersion, mobile, acceptLanguage, userAgent } = fingerprint let headers = detail.headers @@ -234,16 +241,17 @@ function loaderCommonFingerprintToDetailTarget( detail.headers = headers = {} } - // 1.user-agent - if (userAgent) { - headers['user-agent'] = userAgent - } - - // 2.sec-ch-ua + // 1.sec-ch-ua if (ua) { headers['sec-ch-ua'] = ua } + // 2.sec-ch-ua-mobile + if (mobile) { + headers['sec-ch-ua-mobile'] = + mobile === 'random' ? (random(2) ? '?1' : '?0') : mobile + } + // 3.sec-ch-platform if (platform) { headers['sec-ch-platform'] = platform @@ -254,38 +262,85 @@ function loaderCommonFingerprintToDetailTarget( headers['sec-ch-ua-platform-version'] = platformVersion } - // 5.sec-ch-mobile - if (mobile) { - headers['sec-ch-mobile'] = mobile - } - - // 6.accept-language + // 5.accept-language if (acceptLanguage) { headers['accept-language'] = acceptLanguage } + + // 6.user-agent + if (userAgent) { + let value = userAgent.value + + userAgent.versions?.forEach((version) => { + const { + name, + maxMajorVersion, + minMajorVersion, + maxMinorVersion, + minMinorVersion, + maxPatchVersion, + minPatchVersion + } = version + + const nameSplit = value.split(`${name}/`) + const versionSplit: any[] = nameSplit[1].split(' ')[0].split('.') + const originalVersion = versionSplit.join('.') + + if (!isUndefined(maxMajorVersion)) { + versionSplit[0] = + maxMajorVersion === minMajorVersion + ? maxMajorVersion + : random(maxMajorVersion, minMajorVersion) + } + + if (!isUndefined(maxMinorVersion)) { + versionSplit[1] = + maxMinorVersion === minMinorVersion + ? maxMinorVersion + : random(maxMinorVersion, minMinorVersion) + } + + if (!isUndefined(maxPatchVersion)) { + versionSplit[2] = + maxPatchVersion === minPatchVersion + ? maxPatchVersion + : random(maxPatchVersion, minPatchVersion) + } + + const searchValue = `${name}/${originalVersion}` + const replaceValue = `${name}/${versionSplit.join('.')}` + value = value.replace(searchValue, replaceValue) + }) + + headers['user-agent'] = value + } } function loaderPageFingerprintToDetailTarget( detail: CrawlPageDetailTargetConfig, fingerprint: { - maxWidth: number + maxWidth?: number minWidth?: number - maxHeight: number + maxHeight?: number minHidth?: number } ) { const { maxWidth, minWidth, maxHeight, minHidth } = fingerprint + const viewport: any = detail.viewport ?? {} // 1.width / height - const width = maxWidth === minWidth ? maxWidth : random(maxWidth, minWidth) - const height = - maxHeight === minHidth ? maxHeight : random(maxHeight, minHidth) - const viewport = detail.viewport - if (!viewport) { - detail.viewport = { width, height } - } else { - viewport.width = width - viewport.height = height + if (maxWidth) { + viewport.width = + maxWidth === minWidth ? maxWidth : random(maxWidth, minWidth) + } + + if (maxHeight) { + viewport.height = + maxHeight === minHidth ? maxHeight : random(maxHeight, minHidth) + } + + if (Object.hasOwn(viewport, 'width') && Object.hasOwn(viewport, 'height')) { + detail.viewport = viewport } } @@ -353,73 +408,30 @@ function loaderCommonConfigToCrawlConfig( // detaileTarget loaderCommonFingerprintToDetailTarget(detail, fingerprint) - } else if (isUndefined(fingerprint) && advancedConfig.fingerprint) { + } else if ( + isUndefined(fingerprint) && + isArray(advancedConfig.fingerprints) && + advancedConfig.fingerprints.length + ) { // advancedConfig - const { - userAgents, - uas, - platforms, - platformVersions, - mobiles, - acceptLanguages - } = advancedConfig.fingerprint - - // 1.user-agent - const userAgent = userAgents - ? userAgents[random(userAgents.length)] - : undefined - - // 2.sec-ch-ua - const ua = uas ? uas[random(uas.length)] : undefined - - // 3.sec-ch-platform - const platform = platforms - ? platforms[random(platforms.length)] - : undefined - - // 4.sec-ch-platform-version - const platformVersion = platformVersions - ? platformVersions[random(platformVersions.length)] - : undefined - - // 5.sec-ch-mobile - const mobile = mobiles ? mobiles[random(mobiles.length)] : undefined - - // 6.accept-language - const acceptLanguage = acceptLanguages - ? acceptLanguages[random(acceptLanguages.length)] - : undefined - - loaderCommonFingerprintToDetailTarget(detail, { - userAgent, - ua, - platform, - platformVersion, - mobile, - acceptLanguage - }) - } else if (xCrawlConfig.enableRandomFingerprint) { - // xCrawlConfig + const fingerprints = advancedConfig.fingerprints + const selectFingerprintIndex = random(fingerprints.length) + const fingerprint = fingerprints[selectFingerprintIndex] - const { platforms, mobiles } = randomFingerprint + // 记录每个目标选中的指纹索引 + crawlConfig.selectFingerprintIndexs.push(selectFingerprintIndex) - // 1.user-agent - const userAgent = `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.${random( - 10 - )}.${random(10000)}.${random(1000)} Safari/537.36` - - // 2.sec-ch-platform - const platform = platforms[random(platforms.length)] as Platform - - // 3.sec-ch-mobile - const mobile = mobiles[random(mobiles.length)] as Mobile + loaderCommonFingerprintToDetailTarget(detail, fingerprint) + } else if ( + isUndefined(fingerprint) && + !isArray(advancedConfig.fingerprints) && + xCrawlConfig.enableRandomFingerprint + ) { + // xCrawlConfig + const fingerprint = fingerprints[random(fingerprints.length)] - loaderCommonFingerprintToDetailTarget(detail, { - userAgent, - platform, - mobile - }) + loaderCommonFingerprintToDetailTarget(detail, fingerprint) } }) @@ -453,6 +465,9 @@ function createCrawlPageConfig( const crawlPageConfig: CrawlPageConfigOriginal = { detailTargets: [], intervalTime: undefined, + + selectFingerprintIndexs: [], + onCrawlItemComplete: undefined } @@ -482,7 +497,7 @@ function createCrawlPageConfig( loaderCommonConfigToCrawlConfig(xCrawlConfig, advancedConfig, crawlPageConfig) // 装载单独配置 - crawlPageConfig.detailTargets.forEach((detail) => { + crawlPageConfig.detailTargets.forEach((detail, index) => { // detail > advanced > xCrawl const { cookies, viewport, fingerprint } = detail @@ -499,8 +514,16 @@ function createCrawlPageConfig( // 3.fingerprint if (fingerprint) { loaderPageFingerprintToDetailTarget(detail, fingerprint) - } else if (isUndefined(fingerprint) && advancedConfig.fingerprint) { - loaderPageFingerprintToDetailTarget(detail, advancedConfig.fingerprint) + } else if ( + isUndefined(fingerprint) && + advancedConfig.fingerprints?.length + ) { + // 从对应的选中记录中取出指纹索引 + const selectFingerprintIndex = + crawlPageConfig.selectFingerprintIndexs[index] + const fingerprint = advancedConfig.fingerprints[selectFingerprintIndex] + + loaderPageFingerprintToDetailTarget(detail, fingerprint) } }) @@ -514,6 +537,9 @@ function createCrawlDataConfig( const crawlDataConfig: CrawlDataConfigOriginal = { detailTargets: [], intervalTime: undefined, + + selectFingerprintIndexs: [], + onCrawlItemComplete: undefined } @@ -551,6 +577,9 @@ function createCrawlFileConfig( const crawlFileConfig: CrawlFileConfigOriginal = { detailTargets: [], intervalTime: undefined, + + selectFingerprintIndexs: [], + onBeforeSaveItemFile: undefined, onCrawlItemComplete: undefined } diff --git a/src/default.ts b/src/default.ts index 12acc3b2..3646b746 100644 --- a/src/default.ts +++ b/src/default.ts @@ -1,12 +1,58 @@ -export const randomFingerprint = { - platforms: [ - 'Android', - 'Chrome OS', - 'Chromium OS', - 'iOS', - 'Linux', - 'macOS', - 'Windows' - ], - mobiles: ['?0', '?1'] -} +import { DetailTargetFingerprintCommon } from './types/api' + +export const fingerprints: DetailTargetFingerprintCommon[] = [ + { + platform: 'Windows', + mobile: 'random', + userAgent: { + value: + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', + versions: [ + { + name: 'Chrome', + maxMajorVersion: 112, + minMajorVersion: 100, + maxMinorVersion: 10, + maxPatchVersion: 5615 + }, + { name: 'Safari', maxMinorVersion: 36, maxPatchVersion: 2333 } + ] + } + }, + { + platform: 'Windows', + mobile: 'random', + userAgent: { + value: + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59', + versions: [ + { + name: 'Chrome', + maxMajorVersion: 91, + minMajorVersion: 88, + maxMinorVersion: 10, + maxPatchVersion: 5615 + }, + { name: 'Safari', maxMinorVersion: 36, maxPatchVersion: 2333 }, + { name: 'Edg', maxMinorVersion: 10, maxPatchVersion: 864 } + ] + } + }, + { + platform: 'Windows', + mobile: 'random', + userAgent: { + value: + 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0', + versions: [ + { + name: 'Firefox', + maxMajorVersion: 47, + minMajorVersion: 43, + maxMinorVersion: 10, + maxPatchVersion: 5000 + } + ] + } + } +] diff --git a/src/types/api.ts b/src/types/api.ts index 438acfc1..fc5cb868 100644 --- a/src/types/api.ts +++ b/src/types/api.ts @@ -47,24 +47,24 @@ export type Platform = | 'Windows' | 'Unknown' -export type Mobile = '?0' | '?1' - export interface DetailTargetFingerprintCommon { - userAgent?: string ua?: string + mobile?: '?0' | '?1' | 'random' platform?: Platform platformVersion?: string - mobile?: Mobile acceptLanguage?: string -} - -export interface AdvancedFingerprintCommon { - userAgents?: string[] - uas?: string[] - platforms?: Platform[] - platformVersions?: string[] - mobiles?: Mobile[] - acceptLanguages?: string[] + userAgent?: { + value: string + versions?: { + name: string + maxMajorVersion?: number + minMajorVersion?: number + maxMinorVersion?: number + minMinorVersion?: number + maxPatchVersion?: number + minPatchVersion?: number + }[] + } } export interface CrawlCommonConfig { @@ -82,9 +82,9 @@ export interface CrawlPageDetailTargetConfig extends CrawlCommonConfig { viewport?: Viewport | null fingerprint?: | (DetailTargetFingerprintCommon & { - maxWidth: number + maxWidth?: number minWidth?: number - maxHeight: number + maxHeight?: number minHidth?: number }) | null @@ -114,12 +114,12 @@ export interface CrawlFileDetailTargetConfig extends CrawlCommonConfig { export interface CrawlPageAdvancedConfig extends CrawlCommonConfig { targets: (string | CrawlPageDetailTargetConfig)[] intervalTime?: IntervalTime - fingerprint?: AdvancedFingerprintCommon & { - maxWidth: number + fingerprints?: (DetailTargetFingerprintCommon & { + maxWidth?: number minWidth?: number - maxHeight: number + maxHeight?: number minHidth?: number - } + })[] headers?: AnyObject cookies?: PageCookies @@ -131,7 +131,7 @@ export interface CrawlPageAdvancedConfig extends CrawlCommonConfig { export interface CrawlDataAdvancedConfig extends CrawlCommonConfig { targets: (string | CrawlDataDetailTargetConfig)[] intervalTime?: IntervalTime - fingerprint?: AdvancedFingerprintCommon + fingerprints?: DetailTargetFingerprintCommon[] headers?: AnyObject @@ -141,7 +141,7 @@ export interface CrawlDataAdvancedConfig extends CrawlCommonConfig { export interface CrawlFileAdvancedConfig extends CrawlCommonConfig { targets: (string | CrawlFileDetailTargetConfig)[] intervalTime?: IntervalTime - fingerprint?: AdvancedFingerprintCommon + fingerprints?: DetailTargetFingerprintCommon[] headers?: AnyObject storeDir?: string diff --git a/test/start/index.js b/test/start/index.js index 568522c4..4299fd4d 100644 --- a/test/start/index.js +++ b/test/start/index.js @@ -1 +1 @@ -"use strict";var e=require("node:fs"),t=require("node:fs/promises"),r=require("node:path"),o=require("puppeteer"),a=require("chalk"),n=require("node:http"),i=require("node:https"),s=require("node:url"),l=require("https-proxy-agent"),c=require("sharp"),u=require("path");function d(e,t=0){let r=Math.floor(Math.random()*e);for(;r1){const e=t?r:d(r.max,r.min);p(`Id: ${m(o)} - Crawl needs to sleep for ${m(e+"ms")} milliseconds before sending`),await function(e){return new Promise((t=>setTimeout(t,e)))}(e)}else p(`Id: ${m(o)} - Crawl does not need to sleep, send immediately`)}async function x(e,t,r,o){const{intervalTime:a}=t,n=!w(a),i=y(a),s=[];for(const l of e){const{id:e}=l;await C(n,i,a,e);const c=r(l,t).catch((e=>(l.crawlErrorQueue.push(e),!1))).then((e=>{"boolean"!=typeof e?(l.isSuccess=!0,l.detailTargetRes=e,o(l,t)):l.retryCount===l.maxRetry&&o(l,t)}));s.push(c)}await Promise.all(s)}async function S(e,t,r,o){const{intervalTime:a}=t,n=!w(a),i=y(a);for(const s of e){const{id:e}=s;await C(n,i,a,e);try{s.detailTargetRes=await r(s,t),s.isSuccess=!0}catch(e){s.crawlErrorQueue.push(e)}(s.isSuccess||s.retryCount===s.maxRetry)&&o(s,t)}}function b(e,t,r){const o=e[t];e[t]=e[r],e[r]=o}function $(e){if(1===e.length)return e;const t=Math.floor(e.length/2),r=$(e.slice(0,t)),o=$(e.slice(t)),a=[];let n=0,i=0;for(;n=o[i]?(a.push(r[n]),n++):(a.push(o[i]),i++);return ne.priority===r[0].priority))?$(r.map((e=>({...e,valueOf:()=>e.priority})))):r).map(((e,t)=>({id:t+1,isSuccess:!1,maxRetry:e.maxRetry,retryCount:0,crawlErrorQueue:[],data:null,detailTarget:e,detailTargetRes:null})));p(`${h("Start crawling")} - name: ${f(e)}, mode: ${f(t)}, total: ${m(i.length)} `);const s="async"===t?x:S;let l=0,c=i;for(;c.length;)if(await s(c,o,a,n),c=c.filter((e=>e.maxRetry&&!e.isSuccess&&e.retryCount(e.retryCount++,e.id)));p(f(`Retry: ${++l} - Ids to retry: [ ${e.join(" - ")} ]`))}const u=[],d=[];return i.forEach((e=>{e.isSuccess?u.push(e.id):d.push(e.id)})),p("Crawl the final result:"),p(h(` Success - total: ${u.length}, ids: [ ${u.join(" - ")} ]`)),p(g(` Error - total: ${d.length}, ids: [ ${d.join(" - ")} ]`)),i}function I(e,t){let r=e?`${e}`:"?";if(t)for(const e in t){r+=`&${e}=${t[e]}`}else r=e;return r}function O(e){const{protocol:t,hostname:r,port:o,pathname:a,search:c}=new s.URL(e.url),u="http:"===t,d={agent:e.proxy?l(e.proxy):u?new n.Agent:new i.Agent,protocol:t,hostname:r,port:o,path:a,search:I(c,e.params),method:e.method?.toLocaleUpperCase()??"GET",headers:{},timeout:e.timeout};return d.headers=function(e,t){const r={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",...e.headers??{}};return"POST"===t.method&&e.data&&(r["Content-Type"]="application/json",r["Content-Length"]=Buffer.byteLength(e.data)),r}(e,d),d}const E={platforms:["Android","Chrome OS","Chromium OS","iOS","Linux","macOS","Windows"],mobiles:["?0","?1"]};function F(e){return T(e)?e.map((e=>v(e)?e:{url:e})):[v(e)?e:{url:e}]}function j(e,t){const{userAgent:r,ua:o,platform:a,platformVersion:n,mobile:i,acceptLanguage:s}=t;let l=e.headers;l||(e.headers=l={}),r&&(l["user-agent"]=r),o&&(l["sec-ch-ua"]=o),a&&(l["sec-ch-platform"]=a),n&&(l["sec-ch-ua-platform-version"]=n),i&&(l["sec-ch-mobile"]=i),s&&(l["accept-language"]=s)}function P(e,t){const{maxWidth:r,minWidth:o,maxHeight:a,minHidth:n}=t,i=r===o?r:d(r,o),s=a===n?a:d(a,n),l=e.viewport;l?(l.width=i,l.height=s):e.viewport={width:i,height:s}}function A(e,t,r){r.detailTargets.forEach((r=>{const{url:o,timeout:a,proxy:n,maxRetry:i,priority:s,headers:l,fingerprint:c}=r;if(w(e.baseUrl)||(r.url=e.baseUrl+o),w(a)&&(w(t.timeout)?r.timeout=e.timeout:r.timeout=t.timeout),w(n)&&(w(t.proxy)?w(e.proxy)||(r.proxy=e.proxy):r.proxy=t.proxy),w(i)&&(w(t.maxRetry)?r.maxRetry=e.maxRetry:r.maxRetry=t.maxRetry),w(s)&&(r.priority=0),w(l)&&t.headers&&(r.headers={...t.headers}),c)j(r,c);else if(w(c)&&t.fingerprint){const{userAgents:e,uas:o,platforms:a,platformVersions:n,mobiles:i,acceptLanguages:s}=t.fingerprint;j(r,{userAgent:e?e[d(e.length)]:void 0,ua:o?o[d(o.length)]:void 0,platform:a?a[d(a.length)]:void 0,platformVersion:n?n[d(n.length)]:void 0,mobile:i?i[d(i.length)]:void 0,acceptLanguage:s?s[d(s.length)]:void 0})}else if(e.enableRandomFingerprint){const{platforms:e,mobiles:t}=E;j(r,{userAgent:`Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.${d(10)}.${d(1e4)}.${d(1e3)} Safari/537.36`,platform:e[d(e.length)],mobile:t[d(t.length)]})}})),r.intervalTime=t.intervalTime,w(t.intervalTime)&&!w(e.intervalTime)&&(r.intervalTime=e.intervalTime),r.onCrawlItemComplete=t.onCrawlItemComplete}async function k(e,t){const{id:r,detailTarget:o}=e,{errorPageMap:a,browser:n}=t,i=await n.newPage();o.viewport&&await i.setViewport(o.viewport);let s=null;try{if(o.proxy?await n.createIncognitoBrowserContext({proxyServer:o.proxy}):await n.createIncognitoBrowserContext({proxyServer:void 0}),o.cookies){const e=function(e,t){const r=[];return"string"==typeof t?t.split("; ").forEach((t=>{const o=t.split("=");r.push({name:o[0],value:o[1],url:e})})):Array.isArray(t)?t.forEach((t=>{t.url||(t.url=e),r.push(t)})):"object"==typeof t&&t&&(t.url||(t.url=e),r.push(t)),r}(o.url,o.cookies);await i.setCookie(...e)}else{const e=await i.cookies(o.url);await i.deleteCookie(...e)}o.headers&&await i.setExtraHTTPHeaders(o.headers),s=await i.goto(o.url,{timeout:o.timeout})}catch(e){throw a.get(r)||a.set(r,i),e}return{response:s,page:i}}async function q(e){const{detailTarget:t}=e;return await(r=t,new Promise(((e,t)=>{const o=w(r.data);r.data=o?r.data:JSON.stringify(r.data);const a=O(r);function s(t){const{statusCode:r,headers:o}=t,a=[];t.on("data",(e=>a.push(e))),t.on("end",(()=>{const t=Buffer.concat(a);e({statusCode:r,headers:o,data:t})}))}let l;l="http:"===a.protocol?n.request(a,s):i.request(a,s),l.on("timeout",(()=>{t(new Error(`Timeout ${r.timeout}ms`))})),l.on("error",(e=>{t(e)})),"POST"!==a.method||o||l.write(r.data),l.end()})));var r}function B(e,t){const{id:r,isSuccess:o,detailTargetRes:a}=e,{errorPageMap:n,browser:i,onCrawlItemComplete:s}=t;let l=null;if(o&&a)l={browser:i,...a};else{l={browser:i,response:null,page:n.get(r)}}e.data=l;const c=e;delete c.detailTarget,delete c.detailTargetRes,s&&s(c)}function M(o,a){const{id:n,isSuccess:i,detailTarget:s,detailTargetRes:l}=o,{saveFileErrorArr:c,saveFilePendingQueue:u,onCrawlItemComplete:d,onBeforeSaveFile:p}=a,m=o;if(delete m.detailTarget,delete m.detailTargetRes,i&&l){const a=l.headers["content-type"]??"",i=s.fileName??`${n}-${(new Date).getTime()}`,g=s.extension??`.${a.split("/").pop()}`;s.storeDir&&!e.existsSync(s.storeDir)&&(h=s.storeDir,r.resolve(h).split(r.sep).reduce(((t,o,a)=>{const n=0!==a?r.join(t,o):o;return e.existsSync(n)||e.mkdirSync(n),n}),""));const f=s.storeDir??__dirname,w=r.resolve(f,i+g),y=l.data;let v=Promise.resolve(y);p&&(v=p({id:n,fileName:i,filePath:w,data:y}));const T=v.then((async e=>{let r=!0;try{await t.writeFile(w,e)}catch(e){r=!1;const t=`File save error at id ${n}: ${e.message}`,o=()=>n;c.push({message:t,valueOf:o})}const s=e.length;o.data={...l,data:{isSuccess:r,fileName:i,fileExtension:g,mimeType:a,size:s,filePath:w}},d&&d(m)}));u.push(T)}else d&&d(m);var h}function D(e){let t=null,r=null,a=!1;return async function(n,i){a||(a=!0,r=o.launch(e.crawlPage?.launchBrowser).then((e=>{t=e}))),r&&(await r,r&&(r=null));const{detailTargets:s,intervalTime:l,onCrawlItemComplete:c}=function(e,t){const r={detailTargets:[],intervalTime:void 0,onCrawlItemComplete:void 0};let o={targets:[]};if(v(t)&&Object.hasOwn(t,"targets")){const{targets:e}=t;o=t,r.detailTargets.push(...F(e))}else{const e=F(t);r.detailTargets.push(...e)}return A(e,o,r),r.detailTargets.forEach((e=>{const{cookies:t,viewport:r,fingerprint:a}=e;w(t)&&o.cookies&&(e.cookies=o.cookies),w(r)&&o.viewport&&(e.viewport=o.viewport),a?P(e,a):w(a)&&o.fingerprint&&P(e,o.fingerprint)})),r}(e,n),u={errorPageMap:new Map,browser:t,intervalTime:l,onCrawlItemComplete:c},d=await R("page",e.mode,s,u,k,B),p=T(n)||v(n)&&Object.hasOwn(n,"targets")?d:d[0];return i&&i(p),p}}function L(e){return async function(t,r){const{detailTargets:o,intervalTime:a,onCrawlItemComplete:n}=function(e,t){const r={detailTargets:[],intervalTime:void 0,onCrawlItemComplete:void 0};let o={targets:[]};if(v(t)&&Object.hasOwn(t,"targets")){const{targets:e}=t;o=t,r.detailTargets.push(...F(e))}else{const e=F(t);r.detailTargets.push(...e)}return A(e,o,r),r}(e,t),i={intervalTime:a,onCrawlItemComplete:n},s=await R("data",e.mode,o,i,q,(function(e,t){const{isSuccess:r,detailTargetRes:o}=e,{onCrawlItemComplete:a}=t;if(r&&o){const t=(o.headers["content-type"]??"").includes("text")?o.data.toString():JSON.parse(o.data.toString());e.data={...o,data:t}}const n=e;delete n.detailTarget,delete n.detailTargetRes,a&&a(n)})),l=T(t)||v(t)&&Object.hasOwn(t,"targets")?s:s[0];return r&&r(l),l}}function W(e){return async function(t,r){const{detailTargets:o,intervalTime:a,onBeforeSaveFile:n,onCrawlItemComplete:i}=function(e,t){const r={detailTargets:[],intervalTime:void 0,onBeforeSaveFile:void 0,onCrawlItemComplete:void 0};let o={targets:[]};if(v(t)&&Object.hasOwn(t,"targets")){const{targets:e}=t;o=t,r.detailTargets.push(...F(e))}else r.detailTargets.push(...T(t)?t:[t]);A(e,o,r);const a=!w(o?.storeDir),n=!w(o?.extension);return r.detailTargets.forEach((e=>{w(e.storeDir)&&a&&(e.storeDir=o.storeDir),w(e.extension)&&n&&(e.extension=o.extension)})),r.onBeforeSaveFile=o.onBeforeSaveFile,r}(e,t);p(o);const s={saveFileErrorArr:[],saveFilePendingQueue:[],intervalTime:a,onCrawlItemComplete:i,onBeforeSaveFile:n},l=await R("file",e.mode,o,s,q,M),{saveFilePendingQueue:c,saveFileErrorArr:u}=s;var d;await Promise.all(c),(d=u,function e(t,r){if(t>=r)return;const o=d[r];let a=t,n=r-1;for(;a<=n;){for(;d[a]o;)n--;a<=n&&(b(d,a,n),a++,n--)}b(d,a,r),e(t,a-1),e(a+1,r)}(0,d.length-1),d).forEach((e=>p(g(e.message))));const m=[],f=[];l.forEach((e=>{e.data?.data.isSuccess?m.push(e.id):f.push(e.id)})),p("Save file final result:"),p(h(` Success - total: ${m.length}, ids: [ ${m.join(" - ")} ]`)),p(g(` Error - total: ${f.length}, ids: [ ${f.join(" - ")} ]`));const y=T(t)||v(t)&&Object.hasOwn(t,"targets")?l:l[0];return r&&r(y),y}}function N(e,t){const{d:r,h:o,m:a}=e,n=(w(r)?0:1e3*r*60*60*24)+(w(o)?0:1e3*o*60*60)+(w(a)?0:1e3*a*60);let i=0;l();const s=setInterval(l,n);function l(){console.log(h(`Start the ${f.bold(++i)} polling`)),t(i,c)}function c(){clearInterval(s),console.log(h("Stop the polling"))}}const H=function(e){const t=function(e){const t=e||{};return w(t.mode)&&(t.mode="async"),w(t.enableRandomFingerprint)&&(t.enableRandomFingerprint=!0),w(e?.timeout)&&(t.timeout=1e4),w(e?.maxRetry)&&(t.maxRetry=0),t}(e);return function(e){return{crawlPage:D(e),crawlData:L(e),crawlFile:W(e),startPolling:N}}(t)}({enableRandomFingerprint:!1,baseUrl:"https://raw.githubusercontent.com/coder-hxl/airbnb-upload/master/area",intervalTime:{max:5e3,min:3e3}});H.crawlFile({targets:["/4401.jpg","/4403.jpg","/4404.jpg","/4406.jpg","/4407.jpg"],proxy:"http://localhost:14892",headers:{test:"test"},storeDir:u.resolve(__dirname,"./upload"),onBeforeSaveFile:e=>c(e.data).resize(200).toBuffer(),onCrawlItemComplete(e){}}).then((async e=>{e.forEach((e=>{console.log(e.data?.data.isSuccess)}))})); +"use strict";var e=require("node:fs"),t=require("node:fs/promises"),r=require("node:path"),n=require("puppeteer"),o=require("chalk"),a=require("node:http"),i=require("node:https"),s=require("node:url"),l=require("https-proxy-agent");function c(e,t=0){let r=Math.floor(Math.random()*e);for(;r1){const e=t?r:c(r.max,r.min);m(`Id: ${u(n)} - Crawl needs to sleep for ${u(e+"ms")} milliseconds before sending`),await function(e){return new Promise((t=>setTimeout(t,e)))}(e)}else m(`Id: ${u(n)} - Crawl does not need to sleep, send immediately`)}async function y(e,t,r,n){const{intervalTime:o}=t,a=!f(o),i=g(o),s=[];for(const l of e){const{id:e}=l;await v(a,i,o,e);const c=r(l,t).catch((e=>(l.crawlErrorQueue.push(e),!1))).then((e=>{"boolean"!=typeof e?(l.isSuccess=!0,l.detailTargetRes=e,n(l,t)):l.retryCount===l.maxRetry&&n(l,t)}));s.push(c)}await Promise.all(s)}async function T(e,t,r,n){const{intervalTime:o}=t,a=!f(o),i=g(o);for(const s of e){const{id:e}=s;await v(a,i,o,e);try{s.detailTargetRes=await r(s,t),s.isSuccess=!0}catch(e){s.crawlErrorQueue.push(e)}(s.isSuccess||s.retryCount===s.maxRetry)&&n(s,t)}}function C(e,t,r){const n=e[t];e[t]=e[r],e[r]=n}function M(e){if(1===e.length)return e;const t=Math.floor(e.length/2),r=M(e.slice(0,t)),n=M(e.slice(t)),o=[];let a=0,i=0;for(;a=n[i]?(o.push(r[a]),a++):(o.push(n[i]),i++);return ae.priority===r[0].priority))?M(r.map((e=>({...e,valueOf:()=>e.priority})))):r).map(((e,t)=>({id:t+1,isSuccess:!1,maxRetry:e.maxRetry,retryCount:0,crawlErrorQueue:[],data:null,detailTarget:e,detailTargetRes:null})));m(`${d("Start crawling")} - name: ${h(e)}, mode: ${h(t)}, total: ${u(i.length)} `);const s="async"===t?y:T;let l=0,c=i;for(;c.length;)if(await s(c,n,o,a),c=c.filter((e=>e.maxRetry&&!e.isSuccess&&e.retryCount(e.retryCount++,e.id)));m(h(`Retry: ${++l} - Ids to retry: [ ${e.join(" - ")} ]`))}const f=[],g=[];return i.forEach((e=>{e.isSuccess?f.push(e.id):g.push(e.id)})),m("Crawl the final result:"),m(d(` Success - total: ${f.length}, ids: [ ${f.join(" - ")} ]`)),m(p(` Error - total: ${g.length}, ids: [ ${g.join(" - ")} ]`)),i}function V(e,t){let r=e?`${e}`:"?";if(t)for(const e in t){r+=`&${e}=${t[e]}`}else r=e;return r}function b(e){const{protocol:t,hostname:r,port:n,pathname:o,search:c}=new s.URL(e.url),m="http:"===t,u={agent:e.proxy?l(e.proxy):m?new a.Agent:new i.Agent,protocol:t,hostname:r,port:n,path:o,search:V(c,e.params),method:e.method?.toLocaleUpperCase()??"GET",headers:{},timeout:e.timeout};return u.headers=function(e,t){const r={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",...e.headers??{}};return"POST"===t.method&&e.data&&(r["Content-Type"]="application/json",r["Content-Length"]=Buffer.byteLength(e.data)),r}(e,u),u}const P=[{platform:"Windows",mobile:"random",userAgent:{value:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",versions:[{name:"Chrome",maxMajorVersion:112,minMajorVersion:100,maxMinorVersion:10,maxPatchVersion:5615},{name:"Safari",maxMinorVersion:36,maxPatchVersion:2333}]}},{platform:"Windows",mobile:"random",userAgent:{value:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59",versions:[{name:"Chrome",maxMajorVersion:91,minMajorVersion:88,maxMinorVersion:10,maxPatchVersion:5615},{name:"Safari",maxMinorVersion:36,maxPatchVersion:2333},{name:"Edg",maxMinorVersion:10,maxPatchVersion:864}]}},{platform:"Windows",mobile:"random",userAgent:{value:"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0",versions:[{name:"Firefox",maxMajorVersion:47,minMajorVersion:43,maxMinorVersion:10,maxPatchVersion:5e3}]}}];function j(e){return x(e)?e.map((e=>w(e)?e:{url:e})):[w(e)?e:{url:e}]}function I(e,t){const{ua:r,platform:n,platformVersion:o,mobile:a,acceptLanguage:i,userAgent:s}=t;let l=e.headers;if(l||(e.headers=l={}),r&&(l["sec-ch-ua"]=r),a&&(l["sec-ch-ua-mobile"]="random"===a?c(2)?"?1":"?0":a),n&&(l["sec-ch-platform"]=n),o&&(l["sec-ch-ua-platform-version"]=o),i&&(l["accept-language"]=i),s){let e=s.value;s.versions?.forEach((t=>{const{name:r,maxMajorVersion:n,minMajorVersion:o,maxMinorVersion:a,minMinorVersion:i,maxPatchVersion:s,minPatchVersion:l}=t,m=e.split(`${r}/`)[1].split(" ")[0].split("."),u=m.join(".");f(n)||(m[0]=n===o?n:c(n,o)),f(a)||(m[1]=a===i?a:c(a,i)),f(s)||(m[2]=s===l?s:c(s,l));const d=`${r}/${u}`,p=`${r}/${m.join(".")}`;e=e.replace(d,p)})),l["user-agent"]=e}}function $(e,t){const{maxWidth:r,minWidth:n,maxHeight:o,minHidth:a}=t,i=e.viewport??{};r&&(i.width=r===n?r:c(r,n)),o&&(i.height=o===a?o:c(o,a)),Object.hasOwn(i,"width")&&Object.hasOwn(i,"height")&&(e.viewport=i)}function R(e,t,r){r.detailTargets.forEach((n=>{const{url:o,timeout:a,proxy:i,maxRetry:s,priority:l,headers:m,fingerprint:u}=n;if(f(e.baseUrl)||(n.url=e.baseUrl+o),f(a)&&(f(t.timeout)?n.timeout=e.timeout:n.timeout=t.timeout),f(i)&&(f(t.proxy)?f(e.proxy)||(n.proxy=e.proxy):n.proxy=t.proxy),f(s)&&(f(t.maxRetry)?n.maxRetry=e.maxRetry:n.maxRetry=t.maxRetry),f(l)&&(n.priority=0),f(m)&&t.headers&&(n.headers={...t.headers}),u)I(n,u);else if(f(u)&&x(t.fingerprints)&&t.fingerprints.length){const e=t.fingerprints,o=c(e.length),a=e[o];r.selectFingerprintIndexs.push(o),I(n,a)}else if(f(u)&&!x(t.fingerprints)&&e.enableRandomFingerprint){I(n,P[c(P.length)])}})),r.intervalTime=t.intervalTime,f(t.intervalTime)&&!f(e.intervalTime)&&(r.intervalTime=e.intervalTime),r.onCrawlItemComplete=t.onCrawlItemComplete}async function E(e,t){const{id:r,detailTarget:n}=e,{errorPageMap:o,browser:a}=t,i=await a.newPage();n.viewport&&await i.setViewport(n.viewport);let s=null;try{if(n.proxy?await a.createIncognitoBrowserContext({proxyServer:n.proxy}):await a.createIncognitoBrowserContext({proxyServer:void 0}),n.cookies){const e=function(e,t){const r=[];return"string"==typeof t?t.split("; ").forEach((t=>{const n=t.split("=");r.push({name:n[0],value:n[1],url:e})})):Array.isArray(t)?t.forEach((t=>{t.url||(t.url=e),r.push(t)})):"object"==typeof t&&t&&(t.url||(t.url=e),r.push(t)),r}(n.url,n.cookies);await i.setCookie(...e)}else{const e=await i.cookies(n.url);await i.deleteCookie(...e)}n.headers&&await i.setExtraHTTPHeaders(n.headers),s=await i.goto(n.url,{timeout:n.timeout})}catch(e){throw o.get(r)||o.set(r,i),e}return{response:s,page:i}}async function F(e){const{detailTarget:t}=e;return await(r=t,new Promise(((e,t)=>{const n=f(r.data);r.data=n?r.data:JSON.stringify(r.data);const o=b(r);function s(t){const{statusCode:r,headers:n}=t,o=[];t.on("data",(e=>o.push(e))),t.on("end",(()=>{const t=Buffer.concat(o);e({statusCode:r,headers:n,data:t})}))}let l;l="http:"===o.protocol?a.request(o,s):i.request(o,s),l.on("timeout",(()=>{t(new Error(`Timeout ${r.timeout}ms`))})),l.on("error",(e=>{t(e)})),"POST"!==o.method||n||l.write(r.data),l.end()})));var r}function W(e,t){const{id:r,isSuccess:n,detailTargetRes:o}=e,{errorPageMap:a,browser:i,onCrawlItemComplete:s}=t;let l=null;if(n&&o)l={browser:i,...o};else{l={browser:i,response:null,page:a.get(r)}}e.data=l;const c=e;delete c.detailTarget,delete c.detailTargetRes,s&&s(c)}function k(n,o){const{id:a,isSuccess:i,detailTarget:s,detailTargetRes:l}=n,{saveFileErrorArr:c,saveFilePendingQueue:m,onCrawlItemComplete:u,onBeforeSaveItemFile:d}=o,p=n;if(delete p.detailTarget,delete p.detailTargetRes,i&&l){const o=l.headers["content-type"]??"",i=s.fileName??`${a}-${(new Date).getTime()}`,f=s.extension??`.${o.split("/").pop()}`;s.storeDir&&!e.existsSync(s.storeDir)&&(h=s.storeDir,r.resolve(h).split(r.sep).reduce(((t,n,o)=>{const a=0!==o?r.join(t,n):n;return e.existsSync(a)||e.mkdirSync(a),a}),""));const g=s.storeDir??__dirname,w=r.resolve(g,i+f),x=l.data;let v=Promise.resolve(x);d&&(v=d({id:a,fileName:i,filePath:w,data:x}));const y=v.then((async e=>{let r=!0;try{await t.writeFile(w,e)}catch(e){r=!1;const t=`File save error at id ${a}: ${e.message}`,n=()=>a;c.push({message:t,valueOf:n})}const s=e.length;n.data={...l,data:{isSuccess:r,fileName:i,fileExtension:f,mimeType:o,size:s,filePath:w}},u&&u(p)}));m.push(y)}else u&&u(p);var h}function A(e){let t=null,r=null,o=!1;return async function(a,i){o||(o=!0,r=n.launch(e.crawlPage?.launchBrowser).then((e=>{t=e}))),r&&(await r,r&&(r=null));const{detailTargets:s,intervalTime:l,onCrawlItemComplete:c}=function(e,t){const r={detailTargets:[],intervalTime:void 0,selectFingerprintIndexs:[],onCrawlItemComplete:void 0};let n={targets:[]};if(w(t)&&Object.hasOwn(t,"targets")){const{targets:e}=t;n=t,r.detailTargets.push(...j(e))}else{const e=j(t);r.detailTargets.push(...e)}return R(e,n,r),r.detailTargets.forEach(((e,t)=>{const{cookies:o,viewport:a,fingerprint:i}=e;if(f(o)&&n.cookies&&(e.cookies=n.cookies),f(a)&&n.viewport&&(e.viewport=n.viewport),i)$(e,i);else if(f(i)&&n.fingerprints?.length){const o=r.selectFingerprintIndexs[t];$(e,n.fingerprints[o])}})),r}(e,a);m("detailTargets",s);const u={errorPageMap:new Map,browser:t,intervalTime:l,onCrawlItemComplete:c},d=await S("page",e.mode,s,u,E,W),p=x(a)||w(a)&&Object.hasOwn(a,"targets")?d:d[0];return i&&i(p),p}}function O(e){return async function(t,r){const{detailTargets:n,intervalTime:o,onCrawlItemComplete:a}=function(e,t){const r={detailTargets:[],intervalTime:void 0,selectFingerprintIndexs:[],onCrawlItemComplete:void 0};let n={targets:[]};if(w(t)&&Object.hasOwn(t,"targets")){const{targets:e}=t;n=t,r.detailTargets.push(...j(e))}else{const e=j(t);r.detailTargets.push(...e)}return R(e,n,r),r}(e,t),i={intervalTime:o,onCrawlItemComplete:a},s=await S("data",e.mode,n,i,F,(function(e,t){const{isSuccess:r,detailTargetRes:n}=e,{onCrawlItemComplete:o}=t;if(r&&n){const t=(n.headers["content-type"]??"").includes("text")?n.data.toString():JSON.parse(n.data.toString());e.data={...n,data:t}}const a=e;delete a.detailTarget,delete a.detailTargetRes,o&&o(a)})),l=x(t)||w(t)&&Object.hasOwn(t,"targets")?s:s[0];return r&&r(l),l}}function q(e){return async function(t,r){const{detailTargets:n,intervalTime:o,onBeforeSaveItemFile:a,onCrawlItemComplete:i}=function(e,t){const r={detailTargets:[],intervalTime:void 0,selectFingerprintIndexs:[],onBeforeSaveItemFile:void 0,onCrawlItemComplete:void 0};let n={targets:[]};if(w(t)&&Object.hasOwn(t,"targets")){const{targets:e}=t;n=t,r.detailTargets.push(...j(e))}else r.detailTargets.push(...x(t)?t:[t]);R(e,n,r);const o=!f(n?.storeDir),a=!f(n?.extension);return r.detailTargets.forEach((e=>{f(e.storeDir)&&o&&(e.storeDir=n.storeDir),f(e.extension)&&a&&(e.extension=n.extension)})),r.onBeforeSaveItemFile=n.onBeforeSaveItemFile,r}(e,t),s={saveFileErrorArr:[],saveFilePendingQueue:[],intervalTime:o,onCrawlItemComplete:i,onBeforeSaveItemFile:a},l=await S("file",e.mode,n,s,F,k),{saveFilePendingQueue:c,saveFileErrorArr:u}=s;var h;await Promise.all(c),(h=u,function e(t,r){if(t>=r)return;const n=h[r];let o=t,a=r-1;for(;o<=a;){for(;h[o]n;)a--;o<=a&&(C(h,o,a),o++,a--)}C(h,o,r),e(t,o-1),e(o+1,r)}(0,h.length-1),h).forEach((e=>m(p(e.message))));const g=[],v=[];l.forEach((e=>{e.data?.data.isSuccess?g.push(e.id):v.push(e.id)})),m("Save file final result:"),m(d(` Success - total: ${g.length}, ids: [ ${g.join(" - ")} ]`)),m(p(` Error - total: ${v.length}, ids: [ ${v.join(" - ")} ]`));const y=x(t)||w(t)&&Object.hasOwn(t,"targets")?l:l[0];return r&&r(y),y}}function B(e,t){const{d:r,h:n,m:o}=e,a=(f(r)?0:1e3*r*60*60*24)+(f(n)?0:1e3*n*60*60)+(f(o)?0:1e3*o*60);let i=0;l();const s=setInterval(l,a);function l(){console.log(d(`Start the ${h.bold(++i)} polling`)),t(i,c)}function c(){clearInterval(s),console.log(d("Stop the polling"))}}const N=function(e){const t=function(e){const t=e||{};return f(t.mode)&&(t.mode="async"),f(t.enableRandomFingerprint)&&(t.enableRandomFingerprint=!0),f(e?.timeout)&&(t.timeout=1e4),f(e?.maxRetry)&&(t.maxRetry=0),t}(e);return function(e){return{crawlPage:A(e),crawlData:O(e),crawlFile:q(e),startPolling:B}}(t)}({intervalTime:{max:5e3,min:3e3}});N.crawlPage({targets:["https://github.com/coder-hxl",{url:"https://github.com/coder-hxl/x-crawl",fingerprint:null},{url:"https://github.com/coder-hxl/x-crawl/stargazers",fingerprint:{platform:"Windows",mobile:"random",userAgent:{value:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59",versions:[{name:"Chrome",maxMajorVersion:91,minMajorVersion:88,maxMinorVersion:10,maxPatchVersion:5615},{name:"Safari",maxMinorVersion:36,maxPatchVersion:2333},{name:"Edg",maxMinorVersion:10,maxPatchVersion:864}]}}}],fingerprints:[{platform:"Windows",mobile:"random",userAgent:{value:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",versions:[{name:"Chrome",maxMajorVersion:112,minMajorVersion:100,maxMinorVersion:20,maxPatchVersion:5e3},{name:"Safari",maxMajorVersion:537,minMajorVersion:500,maxMinorVersion:36,maxPatchVersion:5e3}]}}]}); diff --git a/test/start/index.ts b/test/start/index.ts index e4d0c58a..7b726de5 100644 --- a/test/start/index.ts +++ b/test/start/index.ts @@ -3,70 +3,60 @@ import sharp from 'sharp' import path from 'path' const testXCrawl = xCrawl({ - enableRandomFingerprint: false, - baseUrl: - 'https://raw.githubusercontent.com/coder-hxl/airbnb-upload/master/area', intervalTime: { max: 5000, min: 3000 } }) -// testXCrawl -// .crawlFile({ -// targets: ['/4401.jpg', '/4403.jpg', '/4404.jpg', '/4406.jpg', '/4407.jpg'], -// proxy: 'http://localhost:14892', -// headers: { -// test: 'test' -// }, -// storeDir: path.resolve(__dirname, './upload'), -// onBeforeSaveItemFile(info) { -// return sharp(info.data).resize(200).toBuffer() -// }, -// onCrawlItemComplete(crawlFileSingleRes) { -// // console.log(111, crawlFileSingleRes) -// } -// }) -// .then(async (res) => { -// // console.log(res) - -// res.forEach((item) => { -// console.log(item.data?.data.isSuccess) -// }) -// }) - -testXCrawl - .crawlPage({ - targets: [ - 'https://github.com/coder-hxl', - { - url: 'https://github.com/coder-hxl/x-crawl', - fingerprint: null - }, - { - url: 'https://github.com/coder-hxl/x-crawl/stargazers', - fingerprint: { - maxWidth: 1980, - minWidth: 1980, - maxHeight: 1080, - minHidth: 1080, - platform: 'Android' +testXCrawl.crawlPage({ + targets: [ + 'https://github.com/coder-hxl', + { url: 'https://github.com/coder-hxl/x-crawl', fingerprint: null }, + { + url: 'https://github.com/coder-hxl/x-crawl/stargazers', + fingerprint: { + platform: 'Windows', + mobile: 'random', + userAgent: { + value: + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59', + versions: [ + { + name: 'Chrome', + maxMajorVersion: 91, + minMajorVersion: 88, + maxMinorVersion: 10, + maxPatchVersion: 5615 + }, + { name: 'Safari', maxMinorVersion: 36, maxPatchVersion: 2333 }, + { name: 'Edg', maxMinorVersion: 10, maxPatchVersion: 864 } + ] } } - ], - fingerprint: { - maxWidth: 1980, - maxHeight: 1080, - userAgents: [ - 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0', - 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36', - 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0', - 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1' - ], - platforms: ['Chromium OS', 'iOS', 'Linux', 'macOS', 'Windows'] } - }) - .then((res) => { - res.forEach((item, i) => { - item.data.page.screenshot({ path: `./img${i}.jpg` }).then(() => { - console.log(i, 'success') - }) - }) - }) + ], + fingerprints: [ + { + platform: 'Windows', + mobile: 'random', + userAgent: { + value: + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', + versions: [ + { + name: 'Chrome', + maxMajorVersion: 112, + minMajorVersion: 100, + maxMinorVersion: 20, + maxPatchVersion: 5000 + }, + { + name: 'Safari', + maxMajorVersion: 537, + minMajorVersion: 500, + maxMinorVersion: 36, + maxPatchVersion: 5000 + } + ] + } + } + ] +}) From 4c02071e9406eea748bf11ce6c35212e687f5f46 Mon Sep 17 00:00:00 2001 From: coderhxl Date: Sun, 23 Apr 2023 09:37:51 +0800 Subject: [PATCH 02/17] Feat: Create configuration adjustments in-house --- CHANGELOG.md | 2 +- src/api.ts | 346 ++++++++++++++++++++++++++++----------------------- 2 files changed, 191 insertions(+), 157 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d26f0a0f..5a3538f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ### 🚨 重大改变 - 进阶写法的配置指纹改用数组写法,里面存放 DetailTargetFingerprintCommon 类型的对象,方便定制。内部会将里面的对象随机分配给目标。 -- CrawlPageDetailTargetConfig 和 CrawlPageDetailTargetConfig 类型的指纹配置的最大宽高改为可选项。 +- crawlPage 的进阶写法和详细目标写法的指纹配置的最大宽高改为可选项。 ### 🚀 特征 diff --git a/src/api.ts b/src/api.ts index b7105732..b67e6290 100644 --- a/src/api.ts +++ b/src/api.ts @@ -39,22 +39,6 @@ import { fingerprints } from './default' /* Types */ -// Loader -type LoaderHasConfig = { - timeout: number - maxRetry: number - priority: number -} - -export type LoaderCrawlPageDetail = CrawlPageDetailTargetConfig & - LoaderHasConfig - -export type LoaderCrawlDataDetail = CrawlDataDetailTargetConfig & - LoaderHasConfig - -export type LoaderCrawlFileDetail = CrawlFileDetailTargetConfig & - LoaderHasConfig - // Extra config export interface ExtraCommonConfig { intervalTime: IntervalTime | undefined @@ -99,8 +83,39 @@ interface PageSingleCrawlResult { } // Create config -interface CrawlPageConfigOriginal { +// Loader +type LoaderHasConfig = { + timeout: number + maxRetry: number + priority: number +} + +export type LoaderCrawlPageDetail = CrawlPageDetailTargetConfig & + LoaderHasConfig + +export type LoaderCrawlDataDetail = CrawlDataDetailTargetConfig & + LoaderHasConfig + +export type LoaderCrawlFileDetail = CrawlFileDetailTargetConfig & + LoaderHasConfig + +// AdvancedDetailTargets +interface CrawlPageAdvancedDetailTargetsConfig extends CrawlPageAdvancedConfig { detailTargets: CrawlPageDetailTargetConfig[] +} + +interface CrawlDataAdvancedDetailTargetsConfig + extends CrawlDataAdvancedConfig { + detailTargets: CrawlDataDetailTargetConfig[] +} + +interface CrawlFileAdvancedDetailTargetsConfig extends CrawlFileAdvancedConfig { + detailTargets: CrawlFileDetailTargetConfig[] +} + +// CrawlConfig +interface CrawlPageConfig { + detailTargets: LoaderCrawlPageDetail[] intervalTime: IntervalTime | undefined selectFingerprintIndexs: number[] @@ -110,8 +125,8 @@ interface CrawlPageConfigOriginal { | undefined } -interface CrawlDataConfigOriginal { - detailTargets: CrawlDataDetailTargetConfig[] +interface CrawlDataConfig { + detailTargets: LoaderCrawlDataDetail[] intervalTime: IntervalTime | undefined selectFingerprintIndexs: number[] @@ -121,8 +136,8 @@ interface CrawlDataConfigOriginal { | undefined } -interface CrawlFileConfigOriginal { - detailTargets: CrawlFileDetailTargetConfig[] +interface CrawlFileConfig { + detailTargets: LoaderCrawlFileDetail[] intervalTime: IntervalTime | undefined selectFingerprintIndexs: number[] @@ -140,18 +155,6 @@ interface CrawlFileConfigOriginal { | undefined } -type CrawlPageConfig = Omit & { - detailTargets: LoaderCrawlPageDetail[] -} - -type CrawlDataConfig = Omit & { - detailTargets: LoaderCrawlDataDetail[] -} - -type CrawlFileConfig = Omit & { - detailTargets: LoaderCrawlFileDetail[] -} - // API unite config type UniteCrawlPageConfig = | string @@ -346,111 +349,119 @@ function loaderPageFingerprintToDetailTarget( function loaderCommonConfigToCrawlConfig( xCrawlConfig: LoaderXCrawlConfig, - advancedConfig: - | CrawlPageAdvancedConfig - | CrawlDataAdvancedConfig - | CrawlFileAdvancedConfig, - crawlConfig: - | CrawlPageConfigOriginal - | CrawlDataConfigOriginal - | CrawlFileConfigOriginal + advancedDetailTargetsConfig: + | CrawlPageAdvancedDetailTargetsConfig + | CrawlDataAdvancedDetailTargetsConfig + | CrawlFileAdvancedDetailTargetsConfig, + crawlConfig: CrawlPageConfig | CrawlDataConfig | CrawlFileConfig ) { // 1.detailTargets - crawlConfig.detailTargets.forEach((detail) => { - // detail > advanced > app - const { url, timeout, proxy, maxRetry, priority, headers, fingerprint } = - detail - - // 1.1.baseUrl - if (!isUndefined(xCrawlConfig.baseUrl)) { - detail.url = xCrawlConfig.baseUrl + url - } + crawlConfig.detailTargets = advancedDetailTargetsConfig.detailTargets.map( + (rawDetail) => { + // detail > advanced > app - // 1.2.timeout - if (isUndefined(timeout)) { - if (!isUndefined(advancedConfig.timeout)) { - detail.timeout = advancedConfig.timeout - } else { - detail.timeout = xCrawlConfig.timeout - } - } + const detail = rawDetail as + | LoaderCrawlPageDetail + | LoaderCrawlDataDetail + | LoaderCrawlFileDetail - // 1.3.porxy - if (isUndefined(proxy)) { - if (!isUndefined(advancedConfig.proxy)) { - detail.proxy = advancedConfig.proxy - } else if (!isUndefined(xCrawlConfig.proxy)) { - detail.proxy = xCrawlConfig.proxy - } - } + const { url, timeout, proxy, maxRetry, priority, headers, fingerprint } = + detail - // 1.4.maxRetry - if (isUndefined(maxRetry)) { - if (!isUndefined(advancedConfig.maxRetry)) { - detail.maxRetry = advancedConfig.maxRetry - } else { - detail.maxRetry = xCrawlConfig.maxRetry + // 1.1.baseUrl + if (!isUndefined(xCrawlConfig.baseUrl)) { + detail.url = xCrawlConfig.baseUrl + url } - } - // 1.5.priority - if (isUndefined(priority)) { - detail.priority = 0 - } - - // 1.6.header - if (isUndefined(headers) && advancedConfig.headers) { - detail.headers = { ...advancedConfig.headers } - } + // 1.2.timeout + if (isUndefined(timeout)) { + if (!isUndefined(advancedDetailTargetsConfig.timeout)) { + detail.timeout = advancedDetailTargetsConfig.timeout + } else { + detail.timeout = xCrawlConfig.timeout + } + } - // 1.7.fingerprint(公共部分) - if (fingerprint) { - // detaileTarget + // 1.3.porxy + if (isUndefined(proxy)) { + if (!isUndefined(advancedDetailTargetsConfig.proxy)) { + detail.proxy = advancedDetailTargetsConfig.proxy + } else if (!isUndefined(xCrawlConfig.proxy)) { + detail.proxy = xCrawlConfig.proxy + } + } - loaderCommonFingerprintToDetailTarget(detail, fingerprint) - } else if ( - isUndefined(fingerprint) && - isArray(advancedConfig.fingerprints) && - advancedConfig.fingerprints.length - ) { - // advancedConfig + // 1.4.maxRetry + if (isUndefined(maxRetry)) { + if (!isUndefined(advancedDetailTargetsConfig.maxRetry)) { + detail.maxRetry = advancedDetailTargetsConfig.maxRetry + } else { + detail.maxRetry = xCrawlConfig.maxRetry + } + } - const fingerprints = advancedConfig.fingerprints - const selectFingerprintIndex = random(fingerprints.length) - const fingerprint = fingerprints[selectFingerprintIndex] + // 1.5.priority + if (isUndefined(priority)) { + detail.priority = 0 + } - // 记录每个目标选中的指纹索引 - crawlConfig.selectFingerprintIndexs.push(selectFingerprintIndex) + // 1.6.header + if (isUndefined(headers) && advancedDetailTargetsConfig.headers) { + detail.headers = { ...advancedDetailTargetsConfig.headers } + } - loaderCommonFingerprintToDetailTarget(detail, fingerprint) - } else if ( - isUndefined(fingerprint) && - !isArray(advancedConfig.fingerprints) && - xCrawlConfig.enableRandomFingerprint - ) { - // xCrawlConfig - const fingerprint = fingerprints[random(fingerprints.length)] + // 1.7.fingerprint(公共部分) + if (fingerprint) { + // detaileTarget + + loaderCommonFingerprintToDetailTarget(detail, fingerprint) + } else if ( + isUndefined(fingerprint) && + isArray(advancedDetailTargetsConfig.fingerprints) && + advancedDetailTargetsConfig.fingerprints.length + ) { + // advancedConfig + + const fingerprints = advancedDetailTargetsConfig.fingerprints + const selectFingerprintIndex = random(fingerprints.length) + const fingerprint = fingerprints[selectFingerprintIndex] + + // 记录每个目标选中的指纹索引 + crawlConfig.selectFingerprintIndexs.push(selectFingerprintIndex) + + loaderCommonFingerprintToDetailTarget(detail, fingerprint) + } else if ( + isUndefined(fingerprint) && + !isArray(advancedDetailTargetsConfig.fingerprints) && + xCrawlConfig.enableRandomFingerprint + ) { + // xCrawlConfig + const fingerprint = fingerprints[random(fingerprints.length)] + + loaderCommonFingerprintToDetailTarget(detail, fingerprint) + } - loaderCommonFingerprintToDetailTarget(detail, fingerprint) + return detail } - }) + ) // 2.intervalTime - crawlConfig.intervalTime = advancedConfig.intervalTime + crawlConfig.intervalTime = advancedDetailTargetsConfig.intervalTime if ( - isUndefined(advancedConfig.intervalTime) && + isUndefined(advancedDetailTargetsConfig.intervalTime) && !isUndefined(xCrawlConfig.intervalTime) ) { crawlConfig.intervalTime = xCrawlConfig.intervalTime } // 3.onCrawlItemComplete - crawlConfig.onCrawlItemComplete = advancedConfig.onCrawlItemComplete + crawlConfig.onCrawlItemComplete = + advancedDetailTargetsConfig.onCrawlItemComplete } /* Create config */ /* - 每个创建配置函数的返回值都是类似于进阶版配置 + 每个创建配置函数的返回值都是类似于进阶配置 不同点: - detailTargets 里面将存放的是详细版目标配置 - 不会保留与详细版目标配置相同的选项 @@ -462,7 +473,7 @@ function createCrawlPageConfig( xCrawlConfig: LoaderXCrawlConfig, originalConfig: UniteCrawlPageConfig ): CrawlPageConfig { - const crawlPageConfig: CrawlPageConfigOriginal = { + const crawlPageConfig: CrawlPageConfig = { detailTargets: [], intervalTime: undefined, @@ -471,30 +482,35 @@ function createCrawlPageConfig( onCrawlItemComplete: undefined } - let advancedConfig: CrawlPageAdvancedConfig = { targets: [] } + let advancedDetailTargetsConfig: CrawlPageAdvancedDetailTargetsConfig = { + targets: [], + detailTargets: [] + } if (isObject(originalConfig) && Object.hasOwn(originalConfig, 'targets')) { // CrawlPageAdvancedConfig 处理 const { targets } = originalConfig as CrawlPageAdvancedConfig - advancedConfig = originalConfig as CrawlPageAdvancedConfig - crawlPageConfig.detailTargets.push( - ...transformTargetToDetailTargets(targets) - ) + advancedDetailTargetsConfig = + originalConfig as CrawlPageAdvancedDetailTargetsConfig + advancedDetailTargetsConfig.detailTargets = + transformTargetToDetailTargets(targets) } else { // string | CrawlPageDetailTargetConfig | (string | CrawlPageDetailTargetConfig)[] 处理 - const detaileTargets = transformTargetToDetailTargets( + advancedDetailTargetsConfig.detailTargets = transformTargetToDetailTargets( originalConfig as | string | CrawlPageDetailTargetConfig | (string | CrawlPageDetailTargetConfig)[] ) - - crawlPageConfig.detailTargets.push(...detaileTargets) } // 装载公共配置 - loaderCommonConfigToCrawlConfig(xCrawlConfig, advancedConfig, crawlPageConfig) + loaderCommonConfigToCrawlConfig( + xCrawlConfig, + advancedDetailTargetsConfig, + crawlPageConfig + ) // 装载单独配置 crawlPageConfig.detailTargets.forEach((detail, index) => { @@ -502,13 +518,13 @@ function createCrawlPageConfig( const { cookies, viewport, fingerprint } = detail // 1.cookies - if (isUndefined(cookies) && advancedConfig.cookies) { - detail.cookies = advancedConfig.cookies + if (isUndefined(cookies) && advancedDetailTargetsConfig.cookies) { + detail.cookies = advancedDetailTargetsConfig.cookies } // 2.viewport - if (isUndefined(viewport) && advancedConfig.viewport) { - detail.viewport = advancedConfig.viewport + if (isUndefined(viewport) && advancedDetailTargetsConfig.viewport) { + detail.viewport = advancedDetailTargetsConfig.viewport } // 3.fingerprint @@ -516,25 +532,26 @@ function createCrawlPageConfig( loaderPageFingerprintToDetailTarget(detail, fingerprint) } else if ( isUndefined(fingerprint) && - advancedConfig.fingerprints?.length + advancedDetailTargetsConfig.fingerprints?.length ) { // 从对应的选中记录中取出指纹索引 const selectFingerprintIndex = crawlPageConfig.selectFingerprintIndexs[index] - const fingerprint = advancedConfig.fingerprints[selectFingerprintIndex] + const fingerprint = + advancedDetailTargetsConfig.fingerprints[selectFingerprintIndex] loaderPageFingerprintToDetailTarget(detail, fingerprint) } }) - return crawlPageConfig as CrawlPageConfig + return crawlPageConfig } function createCrawlDataConfig( xCrawlConfig: LoaderXCrawlConfig, originalConfig: UniteCrawlDataConfig ): CrawlDataConfig { - const crawlDataConfig: CrawlDataConfigOriginal = { + const crawlDataConfig: CrawlDataConfig = { detailTargets: [], intervalTime: undefined, @@ -543,29 +560,35 @@ function createCrawlDataConfig( onCrawlItemComplete: undefined } - let advancedConfig: CrawlDataAdvancedConfig = { targets: [] } + let advancedDetailTargetsConfig: CrawlDataAdvancedDetailTargetsConfig = { + targets: [], + detailTargets: [] + } if (isObject(originalConfig) && Object.hasOwn(originalConfig, 'targets')) { // CrawlDataAdvancedConfig 处理 const { targets } = originalConfig as CrawlDataAdvancedConfig - advancedConfig = originalConfig as CrawlDataAdvancedConfig - crawlDataConfig.detailTargets.push( - ...transformTargetToDetailTargets(targets) - ) + advancedDetailTargetsConfig = + originalConfig as CrawlDataAdvancedDetailTargetsConfig + + advancedDetailTargetsConfig.detailTargets = + transformTargetToDetailTargets(targets) } else { // string | CrawlDataDetailTargetConfig | (string | CrawlDataDetailTargetConfig)[] 处理 - const detaileTargets = transformTargetToDetailTargets( + advancedDetailTargetsConfig.detailTargets = transformTargetToDetailTargets( originalConfig as | string | CrawlDataDetailTargetConfig | (string | CrawlDataDetailTargetConfig)[] ) - - crawlDataConfig.detailTargets.push(...detaileTargets) } - loaderCommonConfigToCrawlConfig(xCrawlConfig, advancedConfig, crawlDataConfig) + loaderCommonConfigToCrawlConfig( + xCrawlConfig, + advancedDetailTargetsConfig, + crawlDataConfig + ) return crawlDataConfig as CrawlDataConfig } @@ -574,7 +597,7 @@ function createCrawlFileConfig( xCrawlConfig: LoaderXCrawlConfig, originalConfig: UniteCrawlFileConfig ): CrawlFileConfig { - const crawlFileConfig: CrawlFileConfigOriginal = { + const crawlFileConfig: CrawlFileConfig = { detailTargets: [], intervalTime: undefined, @@ -584,42 +607,53 @@ function createCrawlFileConfig( onCrawlItemComplete: undefined } - let advancedConfig: CrawlFileAdvancedConfig = { targets: [] } + let advancedDetailTargetsConfig: CrawlFileAdvancedDetailTargetsConfig = { + targets: [], + detailTargets: [] + } if (isObject(originalConfig) && Object.hasOwn(originalConfig, 'targets')) { // CrawlFileAdvancedConfig 处理 const { targets } = originalConfig as CrawlFileAdvancedConfig - advancedConfig = originalConfig as CrawlFileAdvancedConfig - crawlFileConfig.detailTargets.push( - ...transformTargetToDetailTargets(targets) - ) + advancedDetailTargetsConfig = + originalConfig as CrawlFileAdvancedDetailTargetsConfig + + advancedDetailTargetsConfig.detailTargets = + transformTargetToDetailTargets(targets) } else { // CrawlFileDetailTargetConfig | CrawlFileDetailTargetConfig[] 处理 - crawlFileConfig.detailTargets.push( - ...(isArray(originalConfig) - ? originalConfig - : [originalConfig as CrawlFileDetailTargetConfig]) - ) + advancedDetailTargetsConfig.detailTargets = isArray(originalConfig) + ? originalConfig + : [originalConfig as CrawlFileDetailTargetConfig] } - loaderCommonConfigToCrawlConfig(xCrawlConfig, advancedConfig, crawlFileConfig) - - const haveAdvancedStoreDir = !isUndefined(advancedConfig?.storeDir) - const haveAdvancedExtension = !isUndefined(advancedConfig?.extension) + loaderCommonConfigToCrawlConfig( + xCrawlConfig, + advancedDetailTargetsConfig, + crawlFileConfig + ) + + const haveAdvancedStoreDir = !isUndefined( + advancedDetailTargetsConfig?.storeDir + ) + const haveAdvancedExtension = !isUndefined( + advancedDetailTargetsConfig?.extension + ) crawlFileConfig.detailTargets.forEach((detail) => { // 1.storeDir if (isUndefined(detail.storeDir) && haveAdvancedStoreDir) { - detail.storeDir = advancedConfig!.storeDir + detail.storeDir = advancedDetailTargetsConfig!.storeDir } // 2.extension if (isUndefined(detail.extension) && haveAdvancedExtension) { - detail.extension = advancedConfig!.extension + detail.extension = advancedDetailTargetsConfig!.extension } }) - crawlFileConfig.onBeforeSaveItemFile = advancedConfig.onBeforeSaveItemFile + crawlFileConfig.onBeforeSaveItemFile = + advancedDetailTargetsConfig.onBeforeSaveItemFile return crawlFileConfig as CrawlFileConfig } From b5ad3690cb7a907c50c6821a837fad9d31938d97 Mon Sep 17 00:00:00 2001 From: coderhxl Date: Sun, 23 Apr 2023 20:54:02 +0800 Subject: [PATCH 03/17] Adjustment: Processing of data returned by the server --- src/api.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/api.ts b/src/api.ts index b67e6290..e3d280cf 100644 --- a/src/api.ts +++ b/src/api.ts @@ -962,9 +962,12 @@ export function createCrawlData(xCrawlConfig: LoaderXCrawlConfig) { if (isSuccess && detailTargetRes) { const contentType = detailTargetRes.headers['content-type'] ?? '' - const data: T = contentType.includes('text') - ? detailTargetRes.data.toString() - : JSON.parse(detailTargetRes.data.toString()) + const data: T = + contentType === 'application/json' + ? JSON.parse(detailTargetRes.data.toString()) + : contentType.includes('text') + ? detailTargetRes.data.toString() + : detailTargetRes.data detaileInfo.data = { ...detailTargetRes, data } } From 704e5fa2ea21b0603f1f32ee05d1255e7c100778 Mon Sep 17 00:00:00 2001 From: coderhxl Date: Sun, 23 Apr 2023 21:22:47 +0800 Subject: [PATCH 04/17] Feat: Adding a test server --- package.json | 1 + script/server.mjs | 12 ++++++++++++ script/start.mjs | 2 +- test/environment/crawlData.test.ts | 27 +++++++++++---------------- test/environment/crawlFile.test.ts | 12 ++++++------ test/environment/crawlPage.test.ts | 10 +++++----- test/server/index.js | 1 + test/server/index.ts | 10 ++++++++++ 8 files changed, 47 insertions(+), 28 deletions(-) create mode 100644 script/server.mjs create mode 100644 test/server/index.js create mode 100644 test/server/index.ts diff --git a/package.json b/package.json index 6a827640..0f6d1882 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "build-dts": "tsc && prettier --write ./publish/src", "build-strict": "pnpm test-dev && pnpm build && pnpm test-pro", "start": "rollup --config script/start.mjs", + "start-server": "rollup --config script/server.mjs", "test-dev": "jest test/environment/test.ts dev", "test-pro": "jest test/environment/test.ts pro", "test-crawlPage": "jest test/environment/crawlPage.test.ts dev", diff --git a/script/server.mjs b/script/server.mjs new file mode 100644 index 00000000..b8b59e41 --- /dev/null +++ b/script/server.mjs @@ -0,0 +1,12 @@ +import tsPlugin from 'rollup-plugin-typescript2' +import terserPlugin from '@rollup/plugin-terser' +import runPlugin from '@rollup/plugin-run' + +export default { + input: 'test/server/index.ts', + output: { + file: 'test/server/index.js', + format: 'cjs' + }, + plugins: [tsPlugin(), terserPlugin(), runPlugin({ stdin: { clear: true } })] +} diff --git a/script/start.mjs b/script/start.mjs index 7085d671..286be811 100644 --- a/script/start.mjs +++ b/script/start.mjs @@ -8,5 +8,5 @@ export default { file: 'test/start/index.js', format: 'cjs' }, - plugins: [tsPlugin(), terserPlugin(), runPlugin({ stdin: { clear: true } })] + plugins: [tsPlugin(), runPlugin({ stdin: { clear: true } })] } diff --git a/test/environment/crawlData.test.ts b/test/environment/crawlData.test.ts index 3f61f578..a3500b2c 100644 --- a/test/environment/crawlData.test.ts +++ b/test/environment/crawlData.test.ts @@ -21,9 +21,7 @@ jest.setTimeout(60000) async function writtenString() { const testXCrawl = xCrawl() - const res = await testXCrawl.crawlData( - 'http://localhost:9001/api/room/193581217' - ) + const res = await testXCrawl.crawlData('http://localhost:8888') return res.isSuccess } @@ -33,7 +31,7 @@ async function writtenCrawlDataDetailConfig() { const testXCrawl = xCrawl() const res = await testXCrawl.crawlData({ - url: 'http://localhost:9001/api/room/193581217' + url: 'http://localhost:8888' }) return res.isSuccess @@ -44,8 +42,8 @@ async function writtenStringAndCrawlDataDetailConfigArr() { const testXCrawl = xCrawl() const res = await testXCrawl.crawlData([ - 'http://localhost:9001/api/room/193581217', - { url: 'http://localhost:9001/api/room/193581217' } + 'http://localhost:8888', + { url: 'http://localhost:8888' } ]) return res.reduce((prev, item) => prev && item.isSuccess, true) @@ -56,10 +54,7 @@ async function writtenCrawlDataAdvancedConfig() { const testXCrawl = xCrawl() const res = await testXCrawl.crawlData({ - targets: [ - 'http://localhost:9001/api/room/193581217', - { url: 'http://localhost:9001/api/room/193581217' } - ] + targets: ['http://localhost:8888', { url: 'http://localhost:8888' }] }) return res.reduce((prev, item) => prev && item.isSuccess, true) @@ -69,14 +64,14 @@ async function writtenCrawlDataAdvancedConfig() { // 2.1.Loader Base Config async function loaderBaseConfig() { const testXCrawl = xCrawl({ - baseUrl: 'http://localhost:9001/api', - proxy: 'http://localhost:14892', + baseUrl: 'http://localhost:8888', + proxy: { urls: ['http://localhost:14892'] }, timeout: 10000, intervalTime: { max: 1000 }, maxRetry: 0 }) - const res = await testXCrawl.crawlData(['/room/193581217', '/room/193581217']) + const res = await testXCrawl.crawlData(['/', '/']) return res.reduce((prev, item) => prev && item.isSuccess, true) } @@ -84,12 +79,12 @@ async function loaderBaseConfig() { // 2.2.Loader Advanced Config async function loaderAdvancedConfig() { const testXCrawl = xCrawl({ - baseUrl: 'http://localhost:9001/api' + baseUrl: 'http://localhost:8888' }) const res = await testXCrawl.crawlData({ - targets: ['/room/193581217', '/room/193581217'], - proxy: 'http://localhost:14892', + targets: ['/', '/'], + proxy: { urls: ['http://localhost:14892'] }, timeout: 10000, intervalTime: { max: 1000 }, maxRetry: 0 diff --git a/test/environment/crawlFile.test.ts b/test/environment/crawlFile.test.ts index f1ce850a..2087679a 100644 --- a/test/environment/crawlFile.test.ts +++ b/test/environment/crawlFile.test.ts @@ -27,7 +27,7 @@ const storeDir = path.resolve(__dirname, './upload') /* 1.Written */ // 1.1.written CrawlFileDetailConfig async function writtenCrawlFileDetailConfig() { - const testXCrawl = xCrawl({ proxy: 'http://localhost:14892' }) + const testXCrawl = xCrawl({ proxy: { urls: ['http://localhost:14892'] } }) const res = await testXCrawl.crawlFile({ url: urls[0], storeDir }) @@ -36,7 +36,7 @@ async function writtenCrawlFileDetailConfig() { // 1.2.written CrawlFileDetailConfig[] async function writtenCrawlFileDetailConfigArr() { - const testXCrawl = xCrawl({ proxy: 'http://localhost:14892' }) + const testXCrawl = xCrawl({ proxy: { urls: ['http://localhost:14892'] } }) const res = await testXCrawl.crawlFile(urls.map((url) => ({ url, storeDir }))) @@ -48,7 +48,7 @@ async function writtenCrawlFileDetailConfigArr() { // 1.3.written CrawlFileAdvancedConfig async function writtenCrawlFileAdvancedConfig() { - const testXCrawl = xCrawl({ proxy: 'http://localhost:14892' }) + const testXCrawl = xCrawl({ proxy: { urls: ['http://localhost:14892'] } }) const res = await testXCrawl.crawlFile({ targets: urls, @@ -67,7 +67,7 @@ async function loaderBaseConfig() { const testXCrawl = xCrawl({ baseUrl: 'https://raw.githubusercontent.com/coder-hxl/airbnb-upload/master/area', - proxy: 'http://localhost:14892', + proxy: { urls: ['http://localhost:14892'] }, timeout: 10000, intervalTime: { max: 1000 }, maxRetry: 0 @@ -90,7 +90,7 @@ async function loaderAdvancedConfig() { const res = await testXCrawl.crawlFile({ targets: ['/4401.jpg', '/4403.jpg'], - proxy: 'http://localhost:14892', + proxy: { urls: ['http://localhost:14892'] }, timeout: 10000, storeDir, intervalTime: { max: 1000 }, @@ -105,7 +105,7 @@ async function storeConfig() { const testXCrawl = xCrawl({ baseUrl: 'https://raw.githubusercontent.com/coder-hxl/airbnb-upload/master/area', - proxy: 'http://localhost:14892' + proxy: { urls: ['http://localhost:14892'] } }) const record: string[] = [] diff --git a/test/environment/crawlPage.test.ts b/test/environment/crawlPage.test.ts index 13e82ab6..00f80f64 100644 --- a/test/environment/crawlPage.test.ts +++ b/test/environment/crawlPage.test.ts @@ -30,7 +30,7 @@ async function writtenString() { // 1.2.written CrawlPageDetailConfig async function writtenCrawlPageDetailConfig() { - const testXCrawl = xCrawl({ proxy: 'http://localohst:14892' }) + const testXCrawl = xCrawl({ proxy: { urls: ['http://localhost:14892'] } }) const res = await testXCrawl.crawlPage({ url: 'https://github.com/coder-hxl/x-crawl' @@ -43,7 +43,7 @@ async function writtenCrawlPageDetailConfig() { // 1.3.written (string | CrawlPageDetailConfig)[] async function writtenStringAndCrawlPageDetailConfigArr() { - const testXCrawl = xCrawl({ proxy: 'http://localohst:14892' }) + const testXCrawl = xCrawl({ proxy: { urls: ['http://localhost:14892'] } }) const res = await testXCrawl.crawlPage([ 'https://github.com/coder-hxl/x-crawl', @@ -57,7 +57,7 @@ async function writtenStringAndCrawlPageDetailConfigArr() { // 1.4.written CrawlPageAdvancedConfig async function writtenCrawlPageAdvancedConfig() { - const testXCrawl = xCrawl({ proxy: 'http://localohst:14892' }) + const testXCrawl = xCrawl({ proxy: { urls: ['http://localhost:14892'] } }) const res = await testXCrawl.crawlPage({ targets: [ @@ -76,7 +76,7 @@ async function writtenCrawlPageAdvancedConfig() { async function loaderBaseConfig() { const testXCrawl = xCrawl({ baseUrl: 'https://github.com', - proxy: 'http://localhost:14892', + proxy: { urls: ['http://localhost:14892'] }, timeout: 10000, intervalTime: { max: 1000 }, maxRetry: 0 @@ -95,7 +95,7 @@ async function loaderAdvancedConfig() { const res = await testXCrawl.crawlPage({ targets: ['/coder-hxl', '/coder-hxl/x-crawl'], - proxy: 'http://localhost:14892', + proxy: { urls: ['http://localhost:14892'] }, timeout: 10000, intervalTime: { max: 1000 }, maxRetry: 0 diff --git a/test/server/index.js b/test/server/index.js new file mode 100644 index 00000000..62cc4cf4 --- /dev/null +++ b/test/server/index.js @@ -0,0 +1 @@ +"use strict";require("node:http").createServer(((e,t)=>{t.setHeader("Content-type","text/plain"),t.end("success")})).listen(8888,(()=>{console.log("服务器在 8888 端口启动成功~")})); diff --git a/test/server/index.ts b/test/server/index.ts new file mode 100644 index 00000000..c8ffe398 --- /dev/null +++ b/test/server/index.ts @@ -0,0 +1,10 @@ +import http from 'node:http' + +http + .createServer((req, res) => { + res.setHeader('Content-type', 'text/plain') + res.end('success') + }) + .listen(8888, () => { + console.log(`服务器在 8888 端口启动成功~`) + }) From 667d758aa08adbf1e7a418e130affe9310926315 Mon Sep 17 00:00:00 2001 From: coderhxl Date: Sun, 23 Apr 2023 21:34:00 +0800 Subject: [PATCH 05/17] Feat: Added Rotating Proxy Feature --- CHANGELOG.md | 3 +- docs/cn.md | 1 + src/api.ts | 57 +- src/batchCrawlHandle.ts | 44 +- src/controller.ts | 105 +++- src/request.ts | 4 +- src/types/api.ts | 8 +- test/start/index.js | 1136 ++++++++++++++++++++++++++++++++++++++- test/start/index.ts | 132 +++-- 9 files changed, 1391 insertions(+), 99 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a3538f2..a070cf3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,10 @@ -# [v7.0.0](https://github.com/coder-hxl/x-crawl/compare/v6.0.1...v7.0.0) (2023-04-23) +# [v7.0.0](https://github.com/coder-hxl/x-crawl/compare/v6.0.1...v7.0.0) (2023-04-24) ### 🚨 重大改变 - 进阶写法的配置指纹改用数组写法,里面存放 DetailTargetFingerprintCommon 类型的对象,方便定制。内部会将里面的对象随机分配给目标。 - crawlPage 的进阶写法和详细目标写法的指纹配置的最大宽高改为可选项。 +- 创建爬虫实例、进阶写法以及详细目标写法的 proxy 更改为对象写法, 拥有 urls、switchByHttpStatus 以及 switchByErrorCount 这三个属性,urls 可以设置多个代理 URL ,内部默认先采用第一个,switchByHttpStatus 设置遇到哪些不符合的响应状态码需要切换代理,switchByErrorCount 设置像超时等错误时到达多少次需要切换代理。该代理轮换功能需要配合错误重试才能使用。 ### 🚀 特征 diff --git a/docs/cn.md b/docs/cn.md index 2867c06e..0b3c2d38 100644 --- a/docs/cn.md +++ b/docs/cn.md @@ -14,6 +14,7 @@ x-crawl 是一个灵活的 Node.js 多功能爬虫库。用法灵活,并且内 - **👀 设备指纹** - 零配置或自定义配置,避免指纹识别从不同位置识别并跟踪我们。 - **⏱️ 间隔爬取** - 无间隔、固定间隔以及随机间隔,产生或避免高并发爬取。 - **🔄 失败重试** - 避免因短暂的问题而造成爬取失败,无限制重试次数。 +- **➡️ 轮换代理** - 配合失败重试,根据自定义错误次数以及 HTTP 状态码自动轮换代理。 - **🚀 优先队列** - 根据单个爬取目标的优先级可以优先于其他目标提前爬取。 - **☁️ 爬取 SPA** - 爬取 SPA(单页应用程序)生成预渲染内容(即“SSR”(服务器端渲染))。 - **⚒️ 控制页面** - 可以表单提交、键盘输入、事件操作、生成页面的屏幕截图等。 diff --git a/src/api.ts b/src/api.ts index e3d280cf..e34d7d9e 100644 --- a/src/api.ts +++ b/src/api.ts @@ -84,20 +84,30 @@ interface PageSingleCrawlResult { // Create config // Loader +export type ProxyDetails = { url: string; state: boolean }[] + +type LoaderCommonConfig = { + proxyUrl?: string + proxyDetails: ProxyDetails +} + type LoaderHasConfig = { timeout: number maxRetry: number priority: number } -export type LoaderCrawlPageDetail = CrawlPageDetailTargetConfig & - LoaderHasConfig +export type LoaderCrawlPageDetail = LoaderCommonConfig & + LoaderHasConfig & + CrawlPageDetailTargetConfig -export type LoaderCrawlDataDetail = CrawlDataDetailTargetConfig & - LoaderHasConfig +export type LoaderCrawlDataDetail = LoaderCommonConfig & + LoaderHasConfig & + CrawlDataDetailTargetConfig -export type LoaderCrawlFileDetail = CrawlFileDetailTargetConfig & - LoaderHasConfig +export type LoaderCrawlFileDetail = LoaderCommonConfig & + LoaderHasConfig & + CrawlFileDetailTargetConfig // AdvancedDetailTargets interface CrawlPageAdvancedDetailTargetsConfig extends CrawlPageAdvancedConfig { @@ -382,7 +392,16 @@ function loaderCommonConfigToCrawlConfig( } } - // 1.3.porxy + // 1.3.maxRetry + if (isUndefined(maxRetry)) { + if (!isUndefined(advancedDetailTargetsConfig.maxRetry)) { + detail.maxRetry = advancedDetailTargetsConfig.maxRetry + } else { + detail.maxRetry = xCrawlConfig.maxRetry + } + } + + // 1.4.proxy if (isUndefined(proxy)) { if (!isUndefined(advancedDetailTargetsConfig.proxy)) { detail.proxy = advancedDetailTargetsConfig.proxy @@ -391,26 +410,24 @@ function loaderCommonConfigToCrawlConfig( } } - // 1.4.maxRetry - if (isUndefined(maxRetry)) { - if (!isUndefined(advancedDetailTargetsConfig.maxRetry)) { - detail.maxRetry = advancedDetailTargetsConfig.maxRetry - } else { - detail.maxRetry = xCrawlConfig.maxRetry - } + // 1.5.proxyUrl & proxyDetail + if (!isUndefined(detail.proxy?.urls)) { + const urls = detail.proxy!.urls + detail.proxyUrl = urls[0] + detail.proxyDetails = urls.map((url) => ({ url, state: true })) } - // 1.5.priority + // 1.6.priority if (isUndefined(priority)) { detail.priority = 0 } - // 1.6.header + // 1.7.header if (isUndefined(headers) && advancedDetailTargetsConfig.headers) { detail.headers = { ...advancedDetailTargetsConfig.headers } } - // 1.7.fingerprint(公共部分) + // 1.8.fingerprint(公共部分) if (fingerprint) { // detaileTarget @@ -675,9 +692,9 @@ async function pageSingleCrawlHandle( let response: HTTPResponse | null = null try { - if (detailTarget.proxy) { + if (detailTarget.proxyUrl) { await browser.createIncognitoBrowserContext({ - proxyServer: detailTarget.proxy + proxyServer: detailTarget.proxyUrl }) } else { await browser.createIncognitoBrowserContext({ @@ -973,8 +990,6 @@ export function createCrawlData(xCrawlConfig: LoaderXCrawlConfig) { } const crawlDataSingleRes: AnyObject = detaileInfo - delete crawlDataSingleRes.detailTarget - delete crawlDataSingleRes.detailTargetRes if (onCrawlItemComplete) { onCrawlItemComplete(crawlDataSingleRes as CrawlDataSingleRes) diff --git a/src/batchCrawlHandle.ts b/src/batchCrawlHandle.ts index dcb68fda..372abdbc 100644 --- a/src/batchCrawlHandle.ts +++ b/src/batchCrawlHandle.ts @@ -1,7 +1,7 @@ import { isNumber, isUndefined, log, logNumber, random, sleep } from './utils' import type { ExtraCommonConfig } from './api' -import type { DetailInfo, CrawlDetail } from './controller' +import { DetailInfo, CrawlDetail, getCrawlStatus } from './controller' async function useSleepByBatch( isHaventervalTime: boolean, @@ -45,8 +45,8 @@ export async function asyncBatchCrawl< const isNumberIntervalTime = isNumber(intervalTime) const crawlPendingQueue: Promise[] = [] - for (const detaileInfo of detailInfos) { - const { id } = detaileInfo + for (const detailInfo of detailInfos) { + const { id } = detailInfo await useSleepByBatch( isHaventervalTime, @@ -55,24 +55,34 @@ export async function asyncBatchCrawl< id ) - const crawlSinglePending = singleCrawlHandle(detaileInfo, extraConfig) + const crawlSinglePending = singleCrawlHandle(detailInfo, extraConfig) .catch((error) => { - detaileInfo.crawlErrorQueue.push(error) + detailInfo.crawlErrorQueue.push(error) return false }) .then((detailTargetRes) => { + const notAllowRetry = detailInfo.retryCount === detailInfo.maxRetry + if (typeof detailTargetRes === 'boolean') { - if (detaileInfo.retryCount === detaileInfo.maxRetry) { - singleResultHandle(detaileInfo, extraConfig) + if (notAllowRetry) { + singleResultHandle(detailInfo, extraConfig) } return } - detaileInfo.isSuccess = true - detaileInfo.detailTargetRes = detailTargetRes + detailInfo.isSuccess = true + detailInfo.detailTargetRes = detailTargetRes - singleResultHandle(detaileInfo, extraConfig) + // 根据 状态码/是否无法重试 决定处理结果 + const { detailTarget } = detailInfo + + const status = getCrawlStatus(detailTargetRes) + const switchByHttpStatus = detailTarget.proxy?.switchByHttpStatus ?? [] + if ((status && !switchByHttpStatus.includes(status)) || notAllowRetry) { + singleResultHandle(detailInfo, extraConfig) + delete detailInfo._notHandle + } }) crawlPendingQueue.push(crawlSinglePending) @@ -120,8 +130,20 @@ export async function syncBatchCrawl< detailInfo.crawlErrorQueue.push(error) } - if (detailInfo.isSuccess || detailInfo.retryCount === detailInfo.maxRetry) { + // 根据 是否成功和状态码/是否无法重试 决定处理结果 + const { detailTarget, detailTargetRes } = detailInfo + + const status = getCrawlStatus(detailTargetRes) + const switchByHttpStatus = detailTarget.proxy?.switchByHttpStatus ?? [] + const notAllowRetry = detailInfo.retryCount === detailInfo.maxRetry + if ( + (detailInfo.isSuccess && + status && + !switchByHttpStatus.includes(status)) || + notAllowRetry + ) { singleResultHandle(detailInfo, extraConfig) + delete detailInfo._notHandle } } } diff --git a/src/controller.ts b/src/controller.ts index 05297001..e4bc9c9c 100644 --- a/src/controller.ts +++ b/src/controller.ts @@ -5,10 +5,21 @@ import { ExtraCommonConfig, LoaderCrawlDataDetail, LoaderCrawlFileDetail, - LoaderCrawlPageDetail + LoaderCrawlPageDetail, + ProxyDetails } from './api' -import { log, logError, logNumber, logSuccess, logWarn } from './utils' +import { + isObject, + isUndefined, + log, + logError, + logNumber, + logSuccess, + logWarn +} from './utils' +import { HTTPResponse } from 'puppeteer' +import { Request } from './request' export type CrawlDetail = | LoaderCrawlPageDetail @@ -16,11 +27,14 @@ export type CrawlDetail = | LoaderCrawlFileDetail export interface DetailInfo { + _notHandle: any + id: number isSuccess: boolean maxRetry: number retryCount: number crawlErrorQueue: Error[] + proxyDetailes: ProxyDetails data: any | null detailTarget: T @@ -32,6 +46,25 @@ type TargetSingleRes = Omit< 'detailTarget' | 'detailTargetRes' > +export function getCrawlStatus(detailTargetRes: any) { + let status: number | null = null + + if ( + isObject(detailTargetRes) && + Object.hasOwn(detailTargetRes, 'response') && + (detailTargetRes as any).response + ) { + // crawlPage + const response: HTTPResponse = (detailTargetRes as any).response + status = response.status() + } else if (isObject(detailTargetRes)) { + // crawlData / crawlFie + status = (detailTargetRes as any as Request).statusCode ?? null + } + + return status +} + export async function controller< T extends CrawlDetail, E extends ExtraCommonConfig, @@ -63,11 +96,14 @@ export async function controller< // 通过映射生成新的配置数组 const detailInfos: DetailInfo[] = detailTargetConfigs.map( (detailTarget, index) => ({ + _notHandle: true, + id: index + 1, isSuccess: false, maxRetry: detailTarget.maxRetry, retryCount: 0, crawlErrorQueue: [], + proxyDetailes: detailTarget.proxyDetails, data: null, detailTarget, @@ -94,12 +130,65 @@ export async function controller< singleResultHandle ) - crawlQueue = crawlQueue.filter( - (config) => - config.maxRetry && - !config.isSuccess && - config.retryCount < config.maxRetry - ) + crawlQueue = crawlQueue.filter((detailInfo) => { + const { + isSuccess, + maxRetry, + retryCount, + proxyDetailes, + crawlErrorQueue, + detailTarget, + detailTargetRes + } = detailInfo + + let isRetry = false + const haveRetryChance = maxRetry && retryCount < maxRetry + + // 没有被处理/没成功/状态码不符合 + if (Object.hasOwn(detailInfo, '_notHandle') && haveRetryChance) { + // 1.不成功 + if (!isSuccess) { + isRetry = true + } + + // 2.代理多, 轮换代理 + if (proxyDetailes.length >= 2) { + // 获取状态码 + const status = getCrawlStatus(detailTargetRes) + + // 错误次数 / 检测状态码 + const switchByErrorCount = detailTarget.proxy?.switchByErrorCount ?? 0 + const switchByHttpStatus = + detailTarget.proxy?.switchByHttpStatus ?? [] + if ( + (status && switchByHttpStatus.includes(status)) || + switchByErrorCount >= crawlErrorQueue.length + ) { + isRetry = true + proxyDetailes.find( + (detail) => detail.url === detailTarget.proxyUrl + )!.state = false + + // 寻找新代理 URL + const newProxyUrl = proxyDetailes.find( + (detaile) => detaile.state + )?.url + + // 无则不切换 + if (!isUndefined(newProxyUrl)) { + detailTarget.proxyUrl = newProxyUrl + } + } + } + } + + // 重置需要重试的 isSuccess + if (isRetry) { + detailInfo.isSuccess = false + } + + return isRetry + }) if (crawlQueue.length) { const retriedIds = crawlQueue.map((item) => { diff --git a/src/request.ts b/src/request.ts index 9d194eac..a1342d3d 100644 --- a/src/request.ts +++ b/src/request.ts @@ -63,8 +63,8 @@ function handleRequestConfig( const isHttp = protocol === 'http:' const config: RequestOptions & MapTypeEmptyObject = { - agent: rawConfig.proxy - ? HttpsProxyAgent(rawConfig.proxy) + agent: rawConfig.proxyUrl + ? HttpsProxyAgent(rawConfig.proxyUrl) : isHttp ? new http.Agent() : new https.Agent(), diff --git a/src/types/api.ts b/src/types/api.ts index fc5cb868..6d0f9774 100644 --- a/src/types/api.ts +++ b/src/types/api.ts @@ -2,6 +2,7 @@ import { IncomingHttpHeaders } from 'node:http' import { Browser, HTTPResponse, Page, Protocol, Viewport } from 'puppeteer' import { AnyObject } from './common' +import { ProxyDetails } from '../api' /* API Config */ @@ -69,7 +70,11 @@ export interface DetailTargetFingerprintCommon { export interface CrawlCommonConfig { timeout?: number - proxy?: string + proxy?: { + urls: string[] + switchByHttpStatus?: number[] + switchByErrorCount?: number + } maxRetry?: number } @@ -169,6 +174,7 @@ export interface CrawlCommonRes { maxRetry: number retryCount: number crawlErrorQueue: Error[] + proxyDetailes: ProxyDetails } export interface CrawlPageSingleRes extends CrawlCommonRes { diff --git a/test/start/index.js b/test/start/index.js index 4299fd4d..f5a4ad2f 100644 --- a/test/start/index.js +++ b/test/start/index.js @@ -1 +1,1135 @@ -"use strict";var e=require("node:fs"),t=require("node:fs/promises"),r=require("node:path"),n=require("puppeteer"),o=require("chalk"),a=require("node:http"),i=require("node:https"),s=require("node:url"),l=require("https-proxy-agent");function c(e,t=0){let r=Math.floor(Math.random()*e);for(;r1){const e=t?r:c(r.max,r.min);m(`Id: ${u(n)} - Crawl needs to sleep for ${u(e+"ms")} milliseconds before sending`),await function(e){return new Promise((t=>setTimeout(t,e)))}(e)}else m(`Id: ${u(n)} - Crawl does not need to sleep, send immediately`)}async function y(e,t,r,n){const{intervalTime:o}=t,a=!f(o),i=g(o),s=[];for(const l of e){const{id:e}=l;await v(a,i,o,e);const c=r(l,t).catch((e=>(l.crawlErrorQueue.push(e),!1))).then((e=>{"boolean"!=typeof e?(l.isSuccess=!0,l.detailTargetRes=e,n(l,t)):l.retryCount===l.maxRetry&&n(l,t)}));s.push(c)}await Promise.all(s)}async function T(e,t,r,n){const{intervalTime:o}=t,a=!f(o),i=g(o);for(const s of e){const{id:e}=s;await v(a,i,o,e);try{s.detailTargetRes=await r(s,t),s.isSuccess=!0}catch(e){s.crawlErrorQueue.push(e)}(s.isSuccess||s.retryCount===s.maxRetry)&&n(s,t)}}function C(e,t,r){const n=e[t];e[t]=e[r],e[r]=n}function M(e){if(1===e.length)return e;const t=Math.floor(e.length/2),r=M(e.slice(0,t)),n=M(e.slice(t)),o=[];let a=0,i=0;for(;a=n[i]?(o.push(r[a]),a++):(o.push(n[i]),i++);return ae.priority===r[0].priority))?M(r.map((e=>({...e,valueOf:()=>e.priority})))):r).map(((e,t)=>({id:t+1,isSuccess:!1,maxRetry:e.maxRetry,retryCount:0,crawlErrorQueue:[],data:null,detailTarget:e,detailTargetRes:null})));m(`${d("Start crawling")} - name: ${h(e)}, mode: ${h(t)}, total: ${u(i.length)} `);const s="async"===t?y:T;let l=0,c=i;for(;c.length;)if(await s(c,n,o,a),c=c.filter((e=>e.maxRetry&&!e.isSuccess&&e.retryCount(e.retryCount++,e.id)));m(h(`Retry: ${++l} - Ids to retry: [ ${e.join(" - ")} ]`))}const f=[],g=[];return i.forEach((e=>{e.isSuccess?f.push(e.id):g.push(e.id)})),m("Crawl the final result:"),m(d(` Success - total: ${f.length}, ids: [ ${f.join(" - ")} ]`)),m(p(` Error - total: ${g.length}, ids: [ ${g.join(" - ")} ]`)),i}function V(e,t){let r=e?`${e}`:"?";if(t)for(const e in t){r+=`&${e}=${t[e]}`}else r=e;return r}function b(e){const{protocol:t,hostname:r,port:n,pathname:o,search:c}=new s.URL(e.url),m="http:"===t,u={agent:e.proxy?l(e.proxy):m?new a.Agent:new i.Agent,protocol:t,hostname:r,port:n,path:o,search:V(c,e.params),method:e.method?.toLocaleUpperCase()??"GET",headers:{},timeout:e.timeout};return u.headers=function(e,t){const r={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",...e.headers??{}};return"POST"===t.method&&e.data&&(r["Content-Type"]="application/json",r["Content-Length"]=Buffer.byteLength(e.data)),r}(e,u),u}const P=[{platform:"Windows",mobile:"random",userAgent:{value:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",versions:[{name:"Chrome",maxMajorVersion:112,minMajorVersion:100,maxMinorVersion:10,maxPatchVersion:5615},{name:"Safari",maxMinorVersion:36,maxPatchVersion:2333}]}},{platform:"Windows",mobile:"random",userAgent:{value:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59",versions:[{name:"Chrome",maxMajorVersion:91,minMajorVersion:88,maxMinorVersion:10,maxPatchVersion:5615},{name:"Safari",maxMinorVersion:36,maxPatchVersion:2333},{name:"Edg",maxMinorVersion:10,maxPatchVersion:864}]}},{platform:"Windows",mobile:"random",userAgent:{value:"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0",versions:[{name:"Firefox",maxMajorVersion:47,minMajorVersion:43,maxMinorVersion:10,maxPatchVersion:5e3}]}}];function j(e){return x(e)?e.map((e=>w(e)?e:{url:e})):[w(e)?e:{url:e}]}function I(e,t){const{ua:r,platform:n,platformVersion:o,mobile:a,acceptLanguage:i,userAgent:s}=t;let l=e.headers;if(l||(e.headers=l={}),r&&(l["sec-ch-ua"]=r),a&&(l["sec-ch-ua-mobile"]="random"===a?c(2)?"?1":"?0":a),n&&(l["sec-ch-platform"]=n),o&&(l["sec-ch-ua-platform-version"]=o),i&&(l["accept-language"]=i),s){let e=s.value;s.versions?.forEach((t=>{const{name:r,maxMajorVersion:n,minMajorVersion:o,maxMinorVersion:a,minMinorVersion:i,maxPatchVersion:s,minPatchVersion:l}=t,m=e.split(`${r}/`)[1].split(" ")[0].split("."),u=m.join(".");f(n)||(m[0]=n===o?n:c(n,o)),f(a)||(m[1]=a===i?a:c(a,i)),f(s)||(m[2]=s===l?s:c(s,l));const d=`${r}/${u}`,p=`${r}/${m.join(".")}`;e=e.replace(d,p)})),l["user-agent"]=e}}function $(e,t){const{maxWidth:r,minWidth:n,maxHeight:o,minHidth:a}=t,i=e.viewport??{};r&&(i.width=r===n?r:c(r,n)),o&&(i.height=o===a?o:c(o,a)),Object.hasOwn(i,"width")&&Object.hasOwn(i,"height")&&(e.viewport=i)}function R(e,t,r){r.detailTargets.forEach((n=>{const{url:o,timeout:a,proxy:i,maxRetry:s,priority:l,headers:m,fingerprint:u}=n;if(f(e.baseUrl)||(n.url=e.baseUrl+o),f(a)&&(f(t.timeout)?n.timeout=e.timeout:n.timeout=t.timeout),f(i)&&(f(t.proxy)?f(e.proxy)||(n.proxy=e.proxy):n.proxy=t.proxy),f(s)&&(f(t.maxRetry)?n.maxRetry=e.maxRetry:n.maxRetry=t.maxRetry),f(l)&&(n.priority=0),f(m)&&t.headers&&(n.headers={...t.headers}),u)I(n,u);else if(f(u)&&x(t.fingerprints)&&t.fingerprints.length){const e=t.fingerprints,o=c(e.length),a=e[o];r.selectFingerprintIndexs.push(o),I(n,a)}else if(f(u)&&!x(t.fingerprints)&&e.enableRandomFingerprint){I(n,P[c(P.length)])}})),r.intervalTime=t.intervalTime,f(t.intervalTime)&&!f(e.intervalTime)&&(r.intervalTime=e.intervalTime),r.onCrawlItemComplete=t.onCrawlItemComplete}async function E(e,t){const{id:r,detailTarget:n}=e,{errorPageMap:o,browser:a}=t,i=await a.newPage();n.viewport&&await i.setViewport(n.viewport);let s=null;try{if(n.proxy?await a.createIncognitoBrowserContext({proxyServer:n.proxy}):await a.createIncognitoBrowserContext({proxyServer:void 0}),n.cookies){const e=function(e,t){const r=[];return"string"==typeof t?t.split("; ").forEach((t=>{const n=t.split("=");r.push({name:n[0],value:n[1],url:e})})):Array.isArray(t)?t.forEach((t=>{t.url||(t.url=e),r.push(t)})):"object"==typeof t&&t&&(t.url||(t.url=e),r.push(t)),r}(n.url,n.cookies);await i.setCookie(...e)}else{const e=await i.cookies(n.url);await i.deleteCookie(...e)}n.headers&&await i.setExtraHTTPHeaders(n.headers),s=await i.goto(n.url,{timeout:n.timeout})}catch(e){throw o.get(r)||o.set(r,i),e}return{response:s,page:i}}async function F(e){const{detailTarget:t}=e;return await(r=t,new Promise(((e,t)=>{const n=f(r.data);r.data=n?r.data:JSON.stringify(r.data);const o=b(r);function s(t){const{statusCode:r,headers:n}=t,o=[];t.on("data",(e=>o.push(e))),t.on("end",(()=>{const t=Buffer.concat(o);e({statusCode:r,headers:n,data:t})}))}let l;l="http:"===o.protocol?a.request(o,s):i.request(o,s),l.on("timeout",(()=>{t(new Error(`Timeout ${r.timeout}ms`))})),l.on("error",(e=>{t(e)})),"POST"!==o.method||n||l.write(r.data),l.end()})));var r}function W(e,t){const{id:r,isSuccess:n,detailTargetRes:o}=e,{errorPageMap:a,browser:i,onCrawlItemComplete:s}=t;let l=null;if(n&&o)l={browser:i,...o};else{l={browser:i,response:null,page:a.get(r)}}e.data=l;const c=e;delete c.detailTarget,delete c.detailTargetRes,s&&s(c)}function k(n,o){const{id:a,isSuccess:i,detailTarget:s,detailTargetRes:l}=n,{saveFileErrorArr:c,saveFilePendingQueue:m,onCrawlItemComplete:u,onBeforeSaveItemFile:d}=o,p=n;if(delete p.detailTarget,delete p.detailTargetRes,i&&l){const o=l.headers["content-type"]??"",i=s.fileName??`${a}-${(new Date).getTime()}`,f=s.extension??`.${o.split("/").pop()}`;s.storeDir&&!e.existsSync(s.storeDir)&&(h=s.storeDir,r.resolve(h).split(r.sep).reduce(((t,n,o)=>{const a=0!==o?r.join(t,n):n;return e.existsSync(a)||e.mkdirSync(a),a}),""));const g=s.storeDir??__dirname,w=r.resolve(g,i+f),x=l.data;let v=Promise.resolve(x);d&&(v=d({id:a,fileName:i,filePath:w,data:x}));const y=v.then((async e=>{let r=!0;try{await t.writeFile(w,e)}catch(e){r=!1;const t=`File save error at id ${a}: ${e.message}`,n=()=>a;c.push({message:t,valueOf:n})}const s=e.length;n.data={...l,data:{isSuccess:r,fileName:i,fileExtension:f,mimeType:o,size:s,filePath:w}},u&&u(p)}));m.push(y)}else u&&u(p);var h}function A(e){let t=null,r=null,o=!1;return async function(a,i){o||(o=!0,r=n.launch(e.crawlPage?.launchBrowser).then((e=>{t=e}))),r&&(await r,r&&(r=null));const{detailTargets:s,intervalTime:l,onCrawlItemComplete:c}=function(e,t){const r={detailTargets:[],intervalTime:void 0,selectFingerprintIndexs:[],onCrawlItemComplete:void 0};let n={targets:[]};if(w(t)&&Object.hasOwn(t,"targets")){const{targets:e}=t;n=t,r.detailTargets.push(...j(e))}else{const e=j(t);r.detailTargets.push(...e)}return R(e,n,r),r.detailTargets.forEach(((e,t)=>{const{cookies:o,viewport:a,fingerprint:i}=e;if(f(o)&&n.cookies&&(e.cookies=n.cookies),f(a)&&n.viewport&&(e.viewport=n.viewport),i)$(e,i);else if(f(i)&&n.fingerprints?.length){const o=r.selectFingerprintIndexs[t];$(e,n.fingerprints[o])}})),r}(e,a);m("detailTargets",s);const u={errorPageMap:new Map,browser:t,intervalTime:l,onCrawlItemComplete:c},d=await S("page",e.mode,s,u,E,W),p=x(a)||w(a)&&Object.hasOwn(a,"targets")?d:d[0];return i&&i(p),p}}function O(e){return async function(t,r){const{detailTargets:n,intervalTime:o,onCrawlItemComplete:a}=function(e,t){const r={detailTargets:[],intervalTime:void 0,selectFingerprintIndexs:[],onCrawlItemComplete:void 0};let n={targets:[]};if(w(t)&&Object.hasOwn(t,"targets")){const{targets:e}=t;n=t,r.detailTargets.push(...j(e))}else{const e=j(t);r.detailTargets.push(...e)}return R(e,n,r),r}(e,t),i={intervalTime:o,onCrawlItemComplete:a},s=await S("data",e.mode,n,i,F,(function(e,t){const{isSuccess:r,detailTargetRes:n}=e,{onCrawlItemComplete:o}=t;if(r&&n){const t=(n.headers["content-type"]??"").includes("text")?n.data.toString():JSON.parse(n.data.toString());e.data={...n,data:t}}const a=e;delete a.detailTarget,delete a.detailTargetRes,o&&o(a)})),l=x(t)||w(t)&&Object.hasOwn(t,"targets")?s:s[0];return r&&r(l),l}}function q(e){return async function(t,r){const{detailTargets:n,intervalTime:o,onBeforeSaveItemFile:a,onCrawlItemComplete:i}=function(e,t){const r={detailTargets:[],intervalTime:void 0,selectFingerprintIndexs:[],onBeforeSaveItemFile:void 0,onCrawlItemComplete:void 0};let n={targets:[]};if(w(t)&&Object.hasOwn(t,"targets")){const{targets:e}=t;n=t,r.detailTargets.push(...j(e))}else r.detailTargets.push(...x(t)?t:[t]);R(e,n,r);const o=!f(n?.storeDir),a=!f(n?.extension);return r.detailTargets.forEach((e=>{f(e.storeDir)&&o&&(e.storeDir=n.storeDir),f(e.extension)&&a&&(e.extension=n.extension)})),r.onBeforeSaveItemFile=n.onBeforeSaveItemFile,r}(e,t),s={saveFileErrorArr:[],saveFilePendingQueue:[],intervalTime:o,onCrawlItemComplete:i,onBeforeSaveItemFile:a},l=await S("file",e.mode,n,s,F,k),{saveFilePendingQueue:c,saveFileErrorArr:u}=s;var h;await Promise.all(c),(h=u,function e(t,r){if(t>=r)return;const n=h[r];let o=t,a=r-1;for(;o<=a;){for(;h[o]n;)a--;o<=a&&(C(h,o,a),o++,a--)}C(h,o,r),e(t,o-1),e(o+1,r)}(0,h.length-1),h).forEach((e=>m(p(e.message))));const g=[],v=[];l.forEach((e=>{e.data?.data.isSuccess?g.push(e.id):v.push(e.id)})),m("Save file final result:"),m(d(` Success - total: ${g.length}, ids: [ ${g.join(" - ")} ]`)),m(p(` Error - total: ${v.length}, ids: [ ${v.join(" - ")} ]`));const y=x(t)||w(t)&&Object.hasOwn(t,"targets")?l:l[0];return r&&r(y),y}}function B(e,t){const{d:r,h:n,m:o}=e,a=(f(r)?0:1e3*r*60*60*24)+(f(n)?0:1e3*n*60*60)+(f(o)?0:1e3*o*60);let i=0;l();const s=setInterval(l,a);function l(){console.log(d(`Start the ${h.bold(++i)} polling`)),t(i,c)}function c(){clearInterval(s),console.log(d("Stop the polling"))}}const N=function(e){const t=function(e){const t=e||{};return f(t.mode)&&(t.mode="async"),f(t.enableRandomFingerprint)&&(t.enableRandomFingerprint=!0),f(e?.timeout)&&(t.timeout=1e4),f(e?.maxRetry)&&(t.maxRetry=0),t}(e);return function(e){return{crawlPage:A(e),crawlData:O(e),crawlFile:q(e),startPolling:B}}(t)}({intervalTime:{max:5e3,min:3e3}});N.crawlPage({targets:["https://github.com/coder-hxl",{url:"https://github.com/coder-hxl/x-crawl",fingerprint:null},{url:"https://github.com/coder-hxl/x-crawl/stargazers",fingerprint:{platform:"Windows",mobile:"random",userAgent:{value:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59",versions:[{name:"Chrome",maxMajorVersion:91,minMajorVersion:88,maxMinorVersion:10,maxPatchVersion:5615},{name:"Safari",maxMinorVersion:36,maxPatchVersion:2333},{name:"Edg",maxMinorVersion:10,maxPatchVersion:864}]}}}],fingerprints:[{platform:"Windows",mobile:"random",userAgent:{value:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",versions:[{name:"Chrome",maxMajorVersion:112,minMajorVersion:100,maxMinorVersion:20,maxPatchVersion:5e3},{name:"Safari",maxMajorVersion:537,minMajorVersion:500,maxMinorVersion:36,maxPatchVersion:5e3}]}}]}); +'use strict'; + +var fs = require('node:fs'); +var promises = require('node:fs/promises'); +var path = require('node:path'); +var puppeteer = require('puppeteer'); +var chalk = require('chalk'); +var http = require('node:http'); +var https = require('node:https'); +var Url = require('node:url'); +var HttpsProxyAgent = require('https-proxy-agent'); + +function sleep(timeout) { + return new Promise((resolve) => setTimeout(resolve, timeout)); +} +function random(max, min = 0) { + let res = Math.floor(Math.random() * max); + while (res < min) { + res = Math.floor(Math.random() * max); + } + return res; +} +function mkdirDirSync(dir) { + const dirSplit = path.resolve(dir).split(path.sep); + dirSplit.reduce((prev, item, index) => { + const currentDir = index !== 0 ? path.join(prev, item) : item; + if (!fs.existsSync(currentDir)) { + fs.mkdirSync(currentDir); + } + return currentDir; + }, ''); +} +const log = console.log; +const logNumber = chalk.hex('#a57fff'); +const logSuccess = chalk.green; +const logError = chalk.red; +const logWarn = chalk.yellow; +function isUndefined(value) { + return typeof value === 'undefined'; +} +function isNumber(value) { + return typeof value === 'number'; +} +function isObject(value) { + return typeof value === 'object' && value && !Array.isArray(value); +} +function isArray(value) { + return Array.isArray(value); +} + +async function useSleepByBatch(isHaventervalTime, isNumberIntervalTime, intervalTime, id) { + if (isHaventervalTime && id > 1) { + const timeout = isNumberIntervalTime + ? intervalTime + : random(intervalTime.max, intervalTime.min); + log(`Id: ${logNumber(id)} - Crawl needs to sleep for ${logNumber(timeout + 'ms')} milliseconds before sending`); + await sleep(timeout); + } + else { + log(`Id: ${logNumber(id)} - Crawl does not need to sleep, send immediately`); + } +} +async function asyncBatchCrawl(detailInfos, extraConfig, singleCrawlHandle, singleResultHandle) { + const { intervalTime } = extraConfig; + const isHaventervalTime = !isUndefined(intervalTime); + const isNumberIntervalTime = isNumber(intervalTime); + const crawlPendingQueue = []; + for (const detailInfo of detailInfos) { + const { id } = detailInfo; + await useSleepByBatch(isHaventervalTime, isNumberIntervalTime, intervalTime, id); + const crawlSinglePending = singleCrawlHandle(detailInfo, extraConfig) + .catch((error) => { + detailInfo.crawlErrorQueue.push(error); + return false; + }) + .then((detailTargetRes) => { + const notAllowRetry = detailInfo.retryCount === detailInfo.maxRetry; + if (typeof detailTargetRes === 'boolean') { + if (notAllowRetry) { + singleResultHandle(detailInfo, extraConfig); + } + return; + } + detailInfo.isSuccess = true; + detailInfo.detailTargetRes = detailTargetRes; + // 根据 状态码/是否无法重试 决定处理结果 + const { detailTarget } = detailInfo; + const status = getCrawlStatus(detailTargetRes); + const switchByHttpStatus = detailTarget.proxy?.switchByHttpStatus ?? []; + if ((status && !switchByHttpStatus.includes(status)) || notAllowRetry) { + log(status, switchByHttpStatus); + singleResultHandle(detailInfo, extraConfig); + delete detailInfo._notHandle; + } + }); + crawlPendingQueue.push(crawlSinglePending); + } + // 等待所有爬取结束 + await Promise.all(crawlPendingQueue); +} +async function syncBatchCrawl(detailInfos, extraConfig, singleCrawlHandle, singleResultHandle) { + const { intervalTime } = extraConfig; + const isHaventervalTime = !isUndefined(intervalTime); + const isNumberIntervalTime = isNumber(intervalTime); + for (const detailInfo of detailInfos) { + const { id } = detailInfo; + await useSleepByBatch(isHaventervalTime, isNumberIntervalTime, intervalTime, id); + try { + detailInfo.detailTargetRes = await singleCrawlHandle(detailInfo, extraConfig); + detailInfo.isSuccess = true; + } + catch (error) { + detailInfo.crawlErrorQueue.push(error); + } + // 根据 是否成功和状态码/是否无法重试 决定处理结果 + const { detailTarget, detailTargetRes } = detailInfo; + const status = getCrawlStatus(detailTargetRes); + const switchByHttpStatus = detailTarget.proxy?.switchByHttpStatus ?? []; + const notAllowRetry = detailInfo.retryCount === detailInfo.maxRetry; + if ((detailInfo.isSuccess && + status && + !switchByHttpStatus.includes(status)) || + notAllowRetry) { + singleResultHandle(detailInfo, extraConfig); + delete detailInfo._notHandle; + } + } +} + +function swap(arr, i, j) { + const temp = arr[i]; + arr[i] = arr[j]; + arr[j] = temp; +} +function quickSort(arr) { + const n = arr.length; + partition(0, n - 1); + function partition(left, right) { + if (left >= right) + return; + // 1.找基准元素 + const pivot = arr[right]; + // 2.定义双指针进行交换(左小右大) + let i = left; + let j = right - 1; + while (i <= j) { + while (arr[i] < pivot) { + i++; + } + while (arr[j] > pivot) { + j--; + } + if (i <= j) { + swap(arr, i, j); + i++; + j--; + } + } + // 3.将 pivot 放到正确位置 + swap(arr, i, right); + // 4.左右划分区域 + partition(left, i - 1); + partition(i + 1, right); + } + return arr; +} +function priorityQueueMergeSort(arr) { + if (arr.length === 1) + return arr; + const mid = Math.floor(arr.length / 2); + const newLeftArr = priorityQueueMergeSort(arr.slice(0, mid)); + const newRightArr = priorityQueueMergeSort(arr.slice(mid)); + const newArr = []; + let i = 0; + let j = 0; + while (i < newLeftArr.length && j < newRightArr.length) { + if (newLeftArr[i] >= newRightArr[j]) { + newArr.push(newLeftArr[i]); + i++; + } + else { + newArr.push(newRightArr[j]); + j++; + } + } + if (i < newLeftArr.length) { + newArr.push(...newLeftArr.slice(i)); + } + if (j < newRightArr.length) { + newArr.push(...newRightArr.splice(j)); + } + return newArr; +} + +function getCrawlStatus(detailTargetRes) { + let status = null; + if (isObject(detailTargetRes) && + Object.hasOwn(detailTargetRes, 'response') && + detailTargetRes.response) { + // crawlPage + const response = detailTargetRes.response; + status = response.status(); + } + else if (isObject(detailTargetRes)) { + // crawlData / crawlFie + status = detailTargetRes.statusCode ?? null; + } + return status; +} +async function controller(name, mode, detailTargets, extraConfig, singleCrawlHandle, singleResultHandle) { + // 是否使用优先爬取 + const isPriorityCrawl = !detailTargets.every((item) => item.priority === detailTargets[0].priority); + const detailTargetConfigs = isPriorityCrawl + ? priorityQueueMergeSort(detailTargets.map((item) => ({ + ...item, + valueOf: () => item.priority + }))) + : detailTargets; + // 通过映射生成新的配置数组 + const detailInfos = detailTargetConfigs.map((detailTarget, index) => ({ + _notHandle: true, + id: index + 1, + isSuccess: false, + maxRetry: detailTarget.maxRetry, + retryCount: 0, + crawlErrorQueue: [], + proxyDetailes: detailTarget.proxyDetails, + data: null, + detailTarget, + detailTargetRes: null + })); + log(`${logSuccess(`Start crawling`)} - name: ${logWarn(name)}, mode: ${logWarn(mode)}, total: ${logNumber(detailInfos.length)} `); + // 选择爬取模式 + const batchCrawl = mode === 'async' ? asyncBatchCrawl : syncBatchCrawl; + let i = 0; + let crawlQueue = detailInfos; + while (crawlQueue.length) { + await batchCrawl(crawlQueue, extraConfig, singleCrawlHandle, singleResultHandle); + crawlQueue = crawlQueue.filter((detailInfo) => { + const { isSuccess, maxRetry, retryCount, proxyDetailes, crawlErrorQueue, detailTarget, detailTargetRes } = detailInfo; + let isRetry = false; + const haveRetryChance = maxRetry && retryCount < maxRetry; + // 没有被处理/没成功/状态码不符合 + if (Object.hasOwn(detailInfo, '_notHandle') && haveRetryChance) { + // 1.不成功 + if (!isSuccess) { + isRetry = true; + } + // 2.代理多, 轮换代理 + if (proxyDetailes.length >= 2) { + // 获取状态码 + const status = getCrawlStatus(detailTargetRes); + // 错误次数 / 检测状态码 + const switchByErrorCount = detailTarget.proxy?.switchByErrorCount ?? 0; + const switchByHttpStatus = detailTarget.proxy?.switchByHttpStatus ?? []; + if ((status && switchByHttpStatus.includes(status)) || + switchByErrorCount >= crawlErrorQueue.length) { + isRetry = true; + proxyDetailes.find((detail) => detail.url === detailTarget.proxyUrl).state = false; + // 寻找新代理 URL + const newProxyUrl = proxyDetailes.find((detaile) => detaile.state)?.url; + // 无则不切换 + if (!isUndefined(newProxyUrl)) { + detailTarget.proxyUrl = newProxyUrl; + } + } + } + } + // 重置需要重试的 isSuccess + if (isRetry) { + detailInfo.isSuccess = false; + } + return isRetry; + }); + if (crawlQueue.length) { + const retriedIds = crawlQueue.map((item) => { + item.retryCount++; + return item.id; + }); + log(logWarn(`Retry: ${++i} - Ids to retry: [ ${retriedIds.join(' - ')} ]`)); + } + } + // 统计结果 + const succssIds = []; + const errorIds = []; + detailInfos.forEach((item) => { + if (item.isSuccess) { + succssIds.push(item.id); + } + else { + errorIds.push(item.id); + } + }); + log('Crawl the final result:'); + log(logSuccess(` Success - total: ${succssIds.length}, ids: [ ${succssIds.join(' - ')} ]`)); + log(logError(` Error - total: ${errorIds.length}, ids: [ ${errorIds.join(' - ')} ]`)); + return detailInfos; +} + +function parseParams(urlSearch, params) { + let res = urlSearch ? `${urlSearch}` : '?'; + if (params) { + for (const key in params) { + const value = params[key]; + res += `&${key}=${value}`; + } + } + else { + res = urlSearch; + } + return res; +} +function parseHeaders(rawConfig, config) { + const rawHeaders = rawConfig.headers ?? {}; + const headers = { + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', + ...rawHeaders + }; + if (config.method === 'POST' && rawConfig.data) { + headers['Content-Type'] = 'application/json'; + headers['Content-Length'] = Buffer.byteLength(rawConfig.data); + } + return headers; +} +function handleRequestConfig(rawConfig) { + const { protocol, hostname, port, pathname, search } = new Url.URL(rawConfig.url); + const isHttp = protocol === 'http:'; + const config = { + agent: rawConfig.proxyUrl + ? HttpsProxyAgent(rawConfig.proxyUrl) + : isHttp + ? new http.Agent() + : new https.Agent(), + protocol, + hostname, + port, + path: pathname, + search: parseParams(search, rawConfig.params), + method: rawConfig.method?.toLocaleUpperCase() ?? 'GET', + headers: {}, + timeout: rawConfig.timeout + }; + config.headers = parseHeaders(rawConfig, config); + return config; +} +function request(config) { + return new Promise((resolve, reject) => { + const isDataUndefine = isUndefined(config.data); + config.data = !isDataUndefine ? JSON.stringify(config.data) : config.data; + const requestConfig = handleRequestConfig(config); + function handleRes(res) { + const { statusCode, headers } = res; + const container = []; + res.on('data', (chunk) => container.push(chunk)); + res.on('end', () => { + const data = Buffer.concat(container); + const resolveRes = { + statusCode, + headers, + data + }; + resolve(resolveRes); + }); + } + let req; + if (requestConfig.protocol === 'http:') { + req = http.request(requestConfig, handleRes); + } + else { + req = https.request(requestConfig, handleRes); + } + req.on('timeout', () => { + reject(new Error(`Timeout ${config.timeout}ms`)); + }); + req.on('error', (err) => { + reject(err); + }); + // 其他处理 + if (requestConfig.method === 'POST' && !isDataUndefine) { + req.write(config.data); + } + req.end(); + }); +} + +const fingerprints = [ + { + platform: 'Windows', + mobile: 'random', + userAgent: { + value: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', + versions: [ + { + name: 'Chrome', + maxMajorVersion: 112, + minMajorVersion: 100, + maxMinorVersion: 10, + maxPatchVersion: 5615 + }, + { name: 'Safari', maxMinorVersion: 36, maxPatchVersion: 2333 } + ] + } + }, + { + platform: 'Windows', + mobile: 'random', + userAgent: { + value: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59', + versions: [ + { + name: 'Chrome', + maxMajorVersion: 91, + minMajorVersion: 88, + maxMinorVersion: 10, + maxPatchVersion: 5615 + }, + { name: 'Safari', maxMinorVersion: 36, maxPatchVersion: 2333 }, + { name: 'Edg', maxMinorVersion: 10, maxPatchVersion: 864 } + ] + } + }, + { + platform: 'Windows', + mobile: 'random', + userAgent: { + value: 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0', + versions: [ + { + name: 'Firefox', + maxMajorVersion: 47, + minMajorVersion: 43, + maxMinorVersion: 10, + maxPatchVersion: 5000 + } + ] + } + } +]; + +/* Function */ +function parsePageCookies(url, cookies) { + const cookiesArr = []; + if (typeof cookies === 'string') { + cookies.split('; ').forEach((item) => { + const cookie = item.split('='); + cookiesArr.push({ name: cookie[0], value: cookie[1], url }); + }); + } + else if (Array.isArray(cookies)) { + cookies.forEach((cookie) => { + if (!cookie.url) { + cookie.url = url; + } + cookiesArr.push(cookie); + }); + } + else if (typeof cookies === 'object' && cookies) { + if (!cookies.url) { + cookies.url = url; + } + cookiesArr.push(cookies); + } + return cookiesArr; +} +function transformTargetToDetailTargets(config) { + return isArray(config) + ? config.map((item) => (isObject(item) ? item : { url: item })) + : [isObject(config) ? config : { url: config }]; +} +/* Loader config */ +function loaderCommonFingerprintToDetailTarget(detail, fingerprint) { + const { ua, platform, platformVersion, mobile, acceptLanguage, userAgent } = fingerprint; + let headers = detail.headers; + if (!headers) { + detail.headers = headers = {}; + } + // 1.sec-ch-ua + if (ua) { + headers['sec-ch-ua'] = ua; + } + // 2.sec-ch-ua-mobile + if (mobile) { + headers['sec-ch-ua-mobile'] = + mobile === 'random' ? (random(2) ? '?1' : '?0') : mobile; + } + // 3.sec-ch-platform + if (platform) { + headers['sec-ch-platform'] = platform; + } + // 4.sec-ch-ua-platform-version + if (platformVersion) { + headers['sec-ch-ua-platform-version'] = platformVersion; + } + // 5.accept-language + if (acceptLanguage) { + headers['accept-language'] = acceptLanguage; + } + // 6.user-agent + if (userAgent) { + let value = userAgent.value; + userAgent.versions?.forEach((version) => { + const { name, maxMajorVersion, minMajorVersion, maxMinorVersion, minMinorVersion, maxPatchVersion, minPatchVersion } = version; + const nameSplit = value.split(`${name}/`); + const versionSplit = nameSplit[1].split(' ')[0].split('.'); + const originalVersion = versionSplit.join('.'); + if (!isUndefined(maxMajorVersion)) { + versionSplit[0] = + maxMajorVersion === minMajorVersion + ? maxMajorVersion + : random(maxMajorVersion, minMajorVersion); + } + if (!isUndefined(maxMinorVersion)) { + versionSplit[1] = + maxMinorVersion === minMinorVersion + ? maxMinorVersion + : random(maxMinorVersion, minMinorVersion); + } + if (!isUndefined(maxPatchVersion)) { + versionSplit[2] = + maxPatchVersion === minPatchVersion + ? maxPatchVersion + : random(maxPatchVersion, minPatchVersion); + } + const searchValue = `${name}/${originalVersion}`; + const replaceValue = `${name}/${versionSplit.join('.')}`; + value = value.replace(searchValue, replaceValue); + }); + headers['user-agent'] = value; + } +} +function loaderPageFingerprintToDetailTarget(detail, fingerprint) { + const { maxWidth, minWidth, maxHeight, minHidth } = fingerprint; + const viewport = detail.viewport ?? {}; + // 1.width / height + if (maxWidth) { + viewport.width = + maxWidth === minWidth ? maxWidth : random(maxWidth, minWidth); + } + if (maxHeight) { + viewport.height = + maxHeight === minHidth ? maxHeight : random(maxHeight, minHidth); + } + if (Object.hasOwn(viewport, 'width') && Object.hasOwn(viewport, 'height')) { + detail.viewport = viewport; + } +} +function loaderCommonConfigToCrawlConfig(xCrawlConfig, advancedDetailTargetsConfig, crawlConfig) { + // 1.detailTargets + crawlConfig.detailTargets = advancedDetailTargetsConfig.detailTargets.map((rawDetail) => { + // detail > advanced > app + const detail = rawDetail; + const { url, timeout, proxy, maxRetry, priority, headers, fingerprint } = detail; + // 1.1.baseUrl + if (!isUndefined(xCrawlConfig.baseUrl)) { + detail.url = xCrawlConfig.baseUrl + url; + } + // 1.2.timeout + if (isUndefined(timeout)) { + if (!isUndefined(advancedDetailTargetsConfig.timeout)) { + detail.timeout = advancedDetailTargetsConfig.timeout; + } + else { + detail.timeout = xCrawlConfig.timeout; + } + } + // 1.3.maxRetry + if (isUndefined(maxRetry)) { + if (!isUndefined(advancedDetailTargetsConfig.maxRetry)) { + detail.maxRetry = advancedDetailTargetsConfig.maxRetry; + } + else { + detail.maxRetry = xCrawlConfig.maxRetry; + } + } + // 1.4.proxy + if (isUndefined(proxy)) { + if (!isUndefined(advancedDetailTargetsConfig.proxy)) { + detail.proxy = advancedDetailTargetsConfig.proxy; + } + else if (!isUndefined(xCrawlConfig.proxy)) { + detail.proxy = xCrawlConfig.proxy; + } + } + // 1.5.proxyUrl & proxyDetail + if (!isUndefined(detail.proxy?.urls)) { + const urls = detail.proxy.urls; + detail.proxyUrl = urls[0]; + detail.proxyDetails = urls.map((url) => ({ url, state: true })); + } + // 1.6.priority + if (isUndefined(priority)) { + detail.priority = 0; + } + // 1.7.header + if (isUndefined(headers) && advancedDetailTargetsConfig.headers) { + detail.headers = { ...advancedDetailTargetsConfig.headers }; + } + // 1.8.fingerprint(公共部分) + if (fingerprint) { + // detaileTarget + loaderCommonFingerprintToDetailTarget(detail, fingerprint); + } + else if (isUndefined(fingerprint) && + isArray(advancedDetailTargetsConfig.fingerprints) && + advancedDetailTargetsConfig.fingerprints.length) { + // advancedConfig + const fingerprints = advancedDetailTargetsConfig.fingerprints; + const selectFingerprintIndex = random(fingerprints.length); + const fingerprint = fingerprints[selectFingerprintIndex]; + // 记录每个目标选中的指纹索引 + crawlConfig.selectFingerprintIndexs.push(selectFingerprintIndex); + loaderCommonFingerprintToDetailTarget(detail, fingerprint); + } + else if (isUndefined(fingerprint) && + !isArray(advancedDetailTargetsConfig.fingerprints) && + xCrawlConfig.enableRandomFingerprint) { + // xCrawlConfig + const fingerprint = fingerprints[random(fingerprints.length)]; + loaderCommonFingerprintToDetailTarget(detail, fingerprint); + } + return detail; + }); + // 2.intervalTime + crawlConfig.intervalTime = advancedDetailTargetsConfig.intervalTime; + if (isUndefined(advancedDetailTargetsConfig.intervalTime) && + !isUndefined(xCrawlConfig.intervalTime)) { + crawlConfig.intervalTime = xCrawlConfig.intervalTime; + } + // 3.onCrawlItemComplete + crawlConfig.onCrawlItemComplete = + advancedDetailTargetsConfig.onCrawlItemComplete; +} +/* Create config */ +/* + 每个创建配置函数的返回值都是类似于进阶配置 + 不同点: + - detailTargets 里面将存放的是详细版目标配置 + - 不会保留与详细版目标配置相同的选项 + + 生成 advancedConfig 对象对每个详细版目标配置进行装载, 如果是传入进阶版配置会覆盖生成的 advancedConfig 对象 +*/ +function createCrawlPageConfig(xCrawlConfig, originalConfig) { + const crawlPageConfig = { + detailTargets: [], + intervalTime: undefined, + selectFingerprintIndexs: [], + onCrawlItemComplete: undefined + }; + let advancedDetailTargetsConfig = { + targets: [], + detailTargets: [] + }; + if (isObject(originalConfig) && Object.hasOwn(originalConfig, 'targets')) { + // CrawlPageAdvancedConfig 处理 + const { targets } = originalConfig; + advancedDetailTargetsConfig = + originalConfig; + advancedDetailTargetsConfig.detailTargets = + transformTargetToDetailTargets(targets); + } + else { + // string | CrawlPageDetailTargetConfig | (string | CrawlPageDetailTargetConfig)[] 处理 + advancedDetailTargetsConfig.detailTargets = transformTargetToDetailTargets(originalConfig); + } + // 装载公共配置 + loaderCommonConfigToCrawlConfig(xCrawlConfig, advancedDetailTargetsConfig, crawlPageConfig); + // 装载单独配置 + crawlPageConfig.detailTargets.forEach((detail, index) => { + // detail > advanced > xCrawl + const { cookies, viewport, fingerprint } = detail; + // 1.cookies + if (isUndefined(cookies) && advancedDetailTargetsConfig.cookies) { + detail.cookies = advancedDetailTargetsConfig.cookies; + } + // 2.viewport + if (isUndefined(viewport) && advancedDetailTargetsConfig.viewport) { + detail.viewport = advancedDetailTargetsConfig.viewport; + } + // 3.fingerprint + if (fingerprint) { + loaderPageFingerprintToDetailTarget(detail, fingerprint); + } + else if (isUndefined(fingerprint) && + advancedDetailTargetsConfig.fingerprints?.length) { + // 从对应的选中记录中取出指纹索引 + const selectFingerprintIndex = crawlPageConfig.selectFingerprintIndexs[index]; + const fingerprint = advancedDetailTargetsConfig.fingerprints[selectFingerprintIndex]; + loaderPageFingerprintToDetailTarget(detail, fingerprint); + } + }); + return crawlPageConfig; +} +function createCrawlDataConfig(xCrawlConfig, originalConfig) { + const crawlDataConfig = { + detailTargets: [], + intervalTime: undefined, + selectFingerprintIndexs: [], + onCrawlItemComplete: undefined + }; + let advancedDetailTargetsConfig = { + targets: [], + detailTargets: [] + }; + if (isObject(originalConfig) && Object.hasOwn(originalConfig, 'targets')) { + // CrawlDataAdvancedConfig 处理 + const { targets } = originalConfig; + advancedDetailTargetsConfig = + originalConfig; + advancedDetailTargetsConfig.detailTargets = + transformTargetToDetailTargets(targets); + } + else { + // string | CrawlDataDetailTargetConfig | (string | CrawlDataDetailTargetConfig)[] 处理 + advancedDetailTargetsConfig.detailTargets = transformTargetToDetailTargets(originalConfig); + } + loaderCommonConfigToCrawlConfig(xCrawlConfig, advancedDetailTargetsConfig, crawlDataConfig); + return crawlDataConfig; +} +function createCrawlFileConfig(xCrawlConfig, originalConfig) { + const crawlFileConfig = { + detailTargets: [], + intervalTime: undefined, + selectFingerprintIndexs: [], + onBeforeSaveItemFile: undefined, + onCrawlItemComplete: undefined + }; + let advancedDetailTargetsConfig = { + targets: [], + detailTargets: [] + }; + if (isObject(originalConfig) && Object.hasOwn(originalConfig, 'targets')) { + // CrawlFileAdvancedConfig 处理 + const { targets } = originalConfig; + advancedDetailTargetsConfig = + originalConfig; + advancedDetailTargetsConfig.detailTargets = + transformTargetToDetailTargets(targets); + } + else { + // CrawlFileDetailTargetConfig | CrawlFileDetailTargetConfig[] 处理 + advancedDetailTargetsConfig.detailTargets = isArray(originalConfig) + ? originalConfig + : [originalConfig]; + } + loaderCommonConfigToCrawlConfig(xCrawlConfig, advancedDetailTargetsConfig, crawlFileConfig); + const haveAdvancedStoreDir = !isUndefined(advancedDetailTargetsConfig?.storeDir); + const haveAdvancedExtension = !isUndefined(advancedDetailTargetsConfig?.extension); + crawlFileConfig.detailTargets.forEach((detail) => { + // 1.storeDir + if (isUndefined(detail.storeDir) && haveAdvancedStoreDir) { + detail.storeDir = advancedDetailTargetsConfig.storeDir; + } + // 2.extension + if (isUndefined(detail.extension) && haveAdvancedExtension) { + detail.extension = advancedDetailTargetsConfig.extension; + } + }); + crawlFileConfig.onBeforeSaveItemFile = + advancedDetailTargetsConfig.onBeforeSaveItemFile; + return crawlFileConfig; +} +/* Single crawl handle */ +async function pageSingleCrawlHandle(detaileInfo, extraConfig) { + const { id, detailTarget } = detaileInfo; + const { errorPageMap, browser } = extraConfig; + const page = await browser.newPage(); + if (detailTarget.viewport) { + await page.setViewport(detailTarget.viewport); + } + let response = null; + try { + if (detailTarget.proxyUrl) { + await browser.createIncognitoBrowserContext({ + proxyServer: detailTarget.proxyUrl + }); + } + else { + await browser.createIncognitoBrowserContext({ + proxyServer: undefined + }); + } + if (detailTarget.cookies) { + const cookies = parsePageCookies(detailTarget.url, detailTarget.cookies); + await page.setCookie(...cookies); + } + else { + const cookies = await page.cookies(detailTarget.url); + await page.deleteCookie(...cookies); + } + if (detailTarget.headers) { + await page.setExtraHTTPHeaders(detailTarget.headers); + } + response = await page.goto(detailTarget.url, { + timeout: detailTarget.timeout + }); + } + catch (error) { + // 收集报错的 page + if (!errorPageMap.get(id)) { + errorPageMap.set(id, page); + } + // 让外面收集错误 + throw error; + } + return { response, page }; +} +async function dataAndFileSingleCrawlHandle(detaileInfo) { + const { detailTarget } = detaileInfo; + return await request(detailTarget); +} +/* Single result handle */ +function pageSingleResultHandle(detaileInfo, extraConfig) { + const { id, isSuccess, detailTargetRes } = detaileInfo; + const { errorPageMap, browser, onCrawlItemComplete } = extraConfig; + let data = null; + if (isSuccess && detailTargetRes) { + data = { browser: browser, ...detailTargetRes }; + } + else { + const page = errorPageMap.get(id); + data = { browser: browser, response: null, page }; + } + detaileInfo.data = data; + const crawlPageSingleRes = detaileInfo; + delete crawlPageSingleRes.detailTarget; + delete crawlPageSingleRes.detailTargetRes; + if (onCrawlItemComplete) { + onCrawlItemComplete(crawlPageSingleRes); + } +} +function fileSingleResultHandle(detaileInfo, extraConfig) { + const { id, isSuccess, detailTarget, detailTargetRes } = detaileInfo; + const { saveFileErrorArr, saveFilePendingQueue, onCrawlItemComplete, onBeforeSaveItemFile } = extraConfig; + const crawlFileSingleRes = detaileInfo; + delete crawlFileSingleRes.detailTarget; + delete crawlFileSingleRes.detailTargetRes; + if (isSuccess && detailTargetRes) { + const mimeType = detailTargetRes.headers['content-type'] ?? ''; + const fileName = detailTarget.fileName ?? `${id}-${new Date().getTime()}`; + const fileExtension = detailTarget.extension ?? `.${mimeType.split('/').pop()}`; + if (detailTarget.storeDir && !fs.existsSync(detailTarget.storeDir)) { + mkdirDirSync(detailTarget.storeDir); + } + const storePath = detailTarget.storeDir ?? __dirname; + const filePath = path.resolve(storePath, fileName + fileExtension); + // 在保存前的回调 + const data = detailTargetRes.data; + let dataPromise = Promise.resolve(data); + if (onBeforeSaveItemFile) { + dataPromise = onBeforeSaveItemFile({ + id, + fileName, + filePath, + data + }); + } + const saveFileItemPending = dataPromise.then(async (newData) => { + let isSuccess = true; + try { + await promises.writeFile(filePath, newData); + } + catch (err) { + isSuccess = false; + const message = `File save error at id ${id}: ${err.message}`; + const valueOf = () => id; + saveFileErrorArr.push({ message, valueOf }); + } + const size = newData.length; + detaileInfo.data = { + ...detailTargetRes, + data: { + isSuccess, + fileName, + fileExtension, + mimeType, + size, + filePath + } + }; + if (onCrawlItemComplete) { + onCrawlItemComplete(crawlFileSingleRes); + } + }); + // 存放保存文件 Promise , 后续等待即可回到 crawlFile 函数内部等待完成即可 + saveFilePendingQueue.push(saveFileItemPending); + } + else { + if (onCrawlItemComplete) { + onCrawlItemComplete(crawlFileSingleRes); + } + } +} +/* Create crawl API */ +function createCrawlPage(xCrawlConfig) { + let browser = null; + let createBrowserPending = null; + let haveCreateBrowser = false; + async function crawlPage(config, callback) { + // 创建浏览器 + if (!haveCreateBrowser) { + haveCreateBrowser = true; + createBrowserPending = puppeteer + .launch(xCrawlConfig.crawlPage?.launchBrowser) + .then((res) => { + browser = res; + }); + } + // 等待浏览器创建完毕 + if (createBrowserPending) { + await createBrowserPending; + // 防止对 createBrowserPending 重复赋值 + if (createBrowserPending) + createBrowserPending = null; + } + // 创建新配置 + const { detailTargets, intervalTime, onCrawlItemComplete } = createCrawlPageConfig(xCrawlConfig, config); + const extraConfig = { + errorPageMap: new Map(), + browser: browser, + intervalTime, + onCrawlItemComplete + }; + const crawlResArr = (await controller('page', xCrawlConfig.mode, detailTargets, extraConfig, pageSingleCrawlHandle, pageSingleResultHandle)); + const crawlRes = isArray(config) || (isObject(config) && Object.hasOwn(config, 'targets')) + ? crawlResArr + : crawlResArr[0]; + if (callback) { + callback(crawlRes); + } + return crawlRes; + } + return crawlPage; +} +function createCrawlData(xCrawlConfig) { + async function crawlData(config, callback) { + const { detailTargets, intervalTime, onCrawlItemComplete } = createCrawlDataConfig(xCrawlConfig, config); + function dataSingleResultHandle(detaileInfo, extraConfig) { + const { isSuccess, detailTargetRes } = detaileInfo; + const { onCrawlItemComplete } = extraConfig; + if (isSuccess && detailTargetRes) { + const contentType = detailTargetRes.headers['content-type'] ?? ''; + const data = contentType === 'application/json' + ? JSON.parse(detailTargetRes.data.toString()) + : contentType.includes('text') + ? detailTargetRes.data.toString() + : detailTargetRes.data; + detaileInfo.data = { ...detailTargetRes, data }; + } + const crawlDataSingleRes = detaileInfo; + if (onCrawlItemComplete) { + onCrawlItemComplete(crawlDataSingleRes); + } + } + const extraConfig = { + intervalTime, + onCrawlItemComplete + }; + const crawlResArr = (await controller('data', xCrawlConfig.mode, detailTargets, extraConfig, dataAndFileSingleCrawlHandle, dataSingleResultHandle)); + const crawlRes = isArray(config) || (isObject(config) && Object.hasOwn(config, 'targets')) + ? crawlResArr + : crawlResArr[0]; + if (callback) { + callback(crawlRes); + } + return crawlRes; + } + return crawlData; +} +function createCrawlFile(xCrawlConfig) { + async function crawlFile(config, callback) { + const { detailTargets, intervalTime, onBeforeSaveItemFile, onCrawlItemComplete } = createCrawlFileConfig(xCrawlConfig, config); + const extraConfig = { + saveFileErrorArr: [], + saveFilePendingQueue: [], + intervalTime, + onCrawlItemComplete, + onBeforeSaveItemFile + }; + const crawlResArr = (await controller('file', xCrawlConfig.mode, detailTargets, extraConfig, dataAndFileSingleCrawlHandle, fileSingleResultHandle)); + const { saveFilePendingQueue, saveFileErrorArr } = extraConfig; + // 等待保存文件完成 + await Promise.all(saveFilePendingQueue); + // 打印保存错误 + quickSort(saveFileErrorArr).forEach((item) => log(logError(item.message))); + // 统计保存 + const succssIds = []; + const errorIds = []; + crawlResArr.forEach((item) => { + if (item.data?.data.isSuccess) { + succssIds.push(item.id); + } + else { + errorIds.push(item.id); + } + }); + log('Save file final result:'); + log(logSuccess(` Success - total: ${succssIds.length}, ids: [ ${succssIds.join(' - ')} ]`)); + log(logError(` Error - total: ${errorIds.length}, ids: [ ${errorIds.join(' - ')} ]`)); + const crawlRes = isArray(config) || (isObject(config) && Object.hasOwn(config, 'targets')) + ? crawlResArr + : crawlResArr[0]; + if (callback) { + callback(crawlRes); + } + return crawlRes; + } + return crawlFile; +} +function startPolling(config, callback) { + const { d, h, m } = config; + const day = !isUndefined(d) ? d * 1000 * 60 * 60 * 24 : 0; + const hour = !isUndefined(h) ? h * 1000 * 60 * 60 : 0; + const minute = !isUndefined(m) ? m * 1000 * 60 : 0; + const total = day + hour + minute; + let count = 0; + startCallback(); + const intervalId = setInterval(startCallback, total); + function startCallback() { + console.log(logSuccess(`Start the ${logWarn.bold(++count)} polling`)); + callback(count, stopPolling); + } + function stopPolling() { + clearInterval(intervalId); + console.log(logSuccess(`Stop the polling`)); + } +} + +function loaderBaseConfig(baseConfig) { + const loaderBaseConfig = baseConfig ? baseConfig : {}; + if (isUndefined(loaderBaseConfig.mode)) { + loaderBaseConfig.mode = 'async'; + } + if (isUndefined(loaderBaseConfig.enableRandomFingerprint)) { + loaderBaseConfig.enableRandomFingerprint = true; + } + if (isUndefined(baseConfig?.timeout)) { + loaderBaseConfig.timeout = 10000; + } + if (isUndefined(baseConfig?.maxRetry)) { + loaderBaseConfig.maxRetry = 0; + } + return loaderBaseConfig; +} +function createnInstance(baseConfig) { + const instance = { + crawlPage: createCrawlPage(baseConfig), + crawlData: createCrawlData(baseConfig), + crawlFile: createCrawlFile(baseConfig), + startPolling + }; + return instance; +} +function xCrawl(baseConfig) { + const newBaseConfig = loaderBaseConfig(baseConfig); + const instance = createnInstance(newBaseConfig); + return instance; +} + +const testXCrawl = xCrawl({ + intervalTime: { max: 5000, min: 3000 } +}); +// testXCrawl.crawlPage({ +// targets: [ +// 'https://github.com/coder-hxl', +// { url: 'https://github.com/coder-hxl/x-crawl', fingerprint: null }, +// { +// url: 'https://github.com/coder-hxl/x-crawl/stargazers', +// fingerprint: { +// platform: 'Windows', +// mobile: 'random', +// userAgent: { +// value: +// 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59', +// versions: [ +// { +// name: 'Chrome', +// maxMajorVersion: 91, +// minMajorVersion: 88, +// maxMinorVersion: 10, +// maxPatchVersion: 5615 +// }, +// { name: 'Safari', maxMinorVersion: 36, maxPatchVersion: 2333 }, +// { name: 'Edg', maxMinorVersion: 10, maxPatchVersion: 864 } +// ] +// } +// } +// } +// ], +// fingerprints: [ +// { +// platform: 'Windows', +// mobile: 'random', +// userAgent: { +// value: +// 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', +// versions: [ +// { +// name: 'Chrome', +// maxMajorVersion: 112, +// minMajorVersion: 100, +// maxMinorVersion: 20, +// maxPatchVersion: 5000 +// }, +// { +// name: 'Safari', +// maxMajorVersion: 537, +// minMajorVersion: 500, +// maxMinorVersion: 36, +// maxPatchVersion: 5000 +// } +// ] +// } +// } +// ] +// }) +testXCrawl + .crawlPage({ + targets: [ + 'https://www.google.com/search?q=1', + 'https://github.com/coder-hxl' + ], + proxy: { + urls: ['https://www.npmjs.com/package/x-crawl', 'http://localhost:14892'], + switchByErrorCount: 1, + switchByHttpStatus: [200] + }, + maxRetry: 4 +}) + .then((res) => { + res.forEach((item, i) => { + console.log(item.proxyDetailes); + // item.data.page.screenshot({ path: `${i}page.jpg` }) + }); + res[0].data.browser.close(); +}); diff --git a/test/start/index.ts b/test/start/index.ts index 7b726de5..019f2802 100644 --- a/test/start/index.ts +++ b/test/start/index.ts @@ -6,57 +6,81 @@ const testXCrawl = xCrawl({ intervalTime: { max: 5000, min: 3000 } }) -testXCrawl.crawlPage({ - targets: [ - 'https://github.com/coder-hxl', - { url: 'https://github.com/coder-hxl/x-crawl', fingerprint: null }, - { - url: 'https://github.com/coder-hxl/x-crawl/stargazers', - fingerprint: { - platform: 'Windows', - mobile: 'random', - userAgent: { - value: - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59', - versions: [ - { - name: 'Chrome', - maxMajorVersion: 91, - minMajorVersion: 88, - maxMinorVersion: 10, - maxPatchVersion: 5615 - }, - { name: 'Safari', maxMinorVersion: 36, maxPatchVersion: 2333 }, - { name: 'Edg', maxMinorVersion: 10, maxPatchVersion: 864 } - ] - } - } - } - ], - fingerprints: [ - { - platform: 'Windows', - mobile: 'random', - userAgent: { - value: - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', - versions: [ - { - name: 'Chrome', - maxMajorVersion: 112, - minMajorVersion: 100, - maxMinorVersion: 20, - maxPatchVersion: 5000 - }, - { - name: 'Safari', - maxMajorVersion: 537, - minMajorVersion: 500, - maxMinorVersion: 36, - maxPatchVersion: 5000 - } - ] - } - } - ] -}) +// testXCrawl.crawlPage({ +// targets: [ +// 'https://github.com/coder-hxl', +// { url: 'https://github.com/coder-hxl/x-crawl', fingerprint: null }, +// { +// url: 'https://github.com/coder-hxl/x-crawl/stargazers', +// fingerprint: { +// platform: 'Windows', +// mobile: 'random', +// userAgent: { +// value: +// 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59', +// versions: [ +// { +// name: 'Chrome', +// maxMajorVersion: 91, +// minMajorVersion: 88, +// maxMinorVersion: 10, +// maxPatchVersion: 5615 +// }, +// { name: 'Safari', maxMinorVersion: 36, maxPatchVersion: 2333 }, +// { name: 'Edg', maxMinorVersion: 10, maxPatchVersion: 864 } +// ] +// } +// } +// } +// ], +// fingerprints: [ +// { +// platform: 'Windows', +// mobile: 'random', +// userAgent: { +// value: +// 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', +// versions: [ +// { +// name: 'Chrome', +// maxMajorVersion: 112, +// minMajorVersion: 100, +// maxMinorVersion: 20, +// maxPatchVersion: 5000 +// }, +// { +// name: 'Safari', +// maxMajorVersion: 537, +// minMajorVersion: 500, +// maxMinorVersion: 36, +// maxPatchVersion: 5000 +// } +// ] +// } +// } +// ] +// }) + +testXCrawl + .crawlPage({ + targets: [ + 'https://www.google.com/search?q=1', + 'https://github.com/coder-hxl' + ], + proxy: { + urls: ['https://www.npmjs.com/package/x-crawl', 'http://localhost:14892'], + switchByErrorCount: 1, + switchByHttpStatus: [200] + }, + maxRetry: 4 + }) + .then((res) => { + console.log('================== res ==================') + + res.forEach((item, i) => { + console.log(item.proxyDetailes) + // item.data.page.screenshot({ path: `${i}page.jpg` }) + }) + + res[0].data.browser.close() + }) From 507ebadcf98591d98e1da412fe7586b6063a108e Mon Sep 17 00:00:00 2001 From: coderhxl Date: Mon, 24 Apr 2023 19:34:15 +0800 Subject: [PATCH 06/17] Feat: Perfect the rotation agent and refactor the bulk crawl function --- src/api.ts | 260 +++++--- src/batchCrawl.ts | 87 +++ src/batchCrawlHandle.ts | 149 ----- src/controller.ts | 191 +++--- src/types/api.ts | 2 +- test/environment/mode.test.ts | 49 ++ test/environment/proxy.test.ts | 39 ++ test/environment/test.ts | 3 + test/server/index.js | 2 +- test/server/index.ts | 2 +- test/start/index.js | 1136 +------------------------------- test/start/index.ts | 15 +- 12 files changed, 441 insertions(+), 1494 deletions(-) create mode 100644 src/batchCrawl.ts delete mode 100644 src/batchCrawlHandle.ts create mode 100644 test/environment/mode.test.ts create mode 100644 test/environment/proxy.test.ts diff --git a/src/api.ts b/src/api.ts index e34d7d9e..ee8dcd55 100644 --- a/src/api.ts +++ b/src/api.ts @@ -3,7 +3,7 @@ import { writeFile } from 'node:fs/promises' import path from 'node:path' import puppeteer, { Browser, HTTPResponse, Page, Protocol } from 'puppeteer' -import { DetailInfo, controller } from './controller' +import { Device, controller, isCrawlStatusInHttpStatus } from './controller' import { Request, request } from './request' import { quickSort } from './sort' import { @@ -34,7 +34,6 @@ import { DetailTargetFingerprintCommon } from './types/api' import { LoaderXCrawlConfig } from './types' -import { AnyObject } from './types/common' import { fingerprints } from './default' /* Types */ @@ -44,23 +43,28 @@ export interface ExtraCommonConfig { intervalTime: IntervalTime | undefined } -interface ExtraPageConfig extends ExtraCommonConfig { - // 存放报错的 Page - errorPageMap: Map +export interface ExtraDataAndFileCommonConfig { + type: 'data' | 'file' +} +interface ExtraPageConfig extends ExtraCommonConfig { browser: Browser onCrawlItemComplete: | ((crawlPageSingleRes: CrawlPageSingleRes) => void) | undefined } -interface ExtraDataConfig extends ExtraCommonConfig { +interface ExtraDataConfig + extends ExtraCommonConfig, + ExtraDataAndFileCommonConfig { onCrawlItemComplete: | ((crawlDataSingleRes: CrawlDataSingleRes) => void) | undefined } -interface ExtraFileConfig extends ExtraCommonConfig { +interface ExtraFileConfig + extends ExtraCommonConfig, + ExtraDataAndFileCommonConfig { saveFileErrorArr: { message: string; valueOf: () => number }[] saveFilePendingQueue: Promise[] onCrawlItemComplete: @@ -678,23 +682,32 @@ function createCrawlFileConfig( /* Single crawl handle */ async function pageSingleCrawlHandle( - detaileInfo: DetailInfo, + device: Device, extraConfig: ExtraPageConfig ): Promise { - const { id, detailTarget } = detaileInfo - const { errorPageMap, browser } = extraConfig - - const page = await browser.newPage() - - if (detailTarget.viewport) { - await page.setViewport(detailTarget.viewport) + const { + detailTargetConfig, + detailTargetResult, + retryCount, + maxRetry, + crawlErrorQueue + } = device + const { browser } = extraConfig + const notAllowRetry = retryCount === maxRetry + + // 是否创建过 Page + const page = detailTargetResult?.page ?? (await browser.newPage()) + + if (detailTargetConfig.viewport) { + await page.setViewport(detailTargetConfig.viewport) } let response: HTTPResponse | null = null + let notError = true try { - if (detailTarget.proxyUrl) { + if (detailTargetConfig.proxyUrl) { await browser.createIncognitoBrowserContext({ - proxyServer: detailTarget.proxyUrl + proxyServer: detailTargetConfig.proxyUrl }) } else { await browser.createIncognitoBrowserContext({ @@ -702,84 +715,145 @@ async function pageSingleCrawlHandle( }) } - if (detailTarget.cookies) { - const cookies = parsePageCookies(detailTarget.url, detailTarget.cookies) + if (detailTargetConfig.cookies) { + const cookies = parsePageCookies( + detailTargetConfig.url, + detailTargetConfig.cookies + ) await page.setCookie(...cookies) } else { - const cookies = await page.cookies(detailTarget.url) + const cookies = await page.cookies(detailTargetConfig.url) await page.deleteCookie(...cookies) } - if (detailTarget.headers) { - await page.setExtraHTTPHeaders(detailTarget.headers) + if (detailTargetConfig.headers) { + await page.setExtraHTTPHeaders(detailTargetConfig.headers) } - response = await page.goto(detailTarget.url, { - timeout: detailTarget.timeout + response = await page.goto(detailTargetConfig.url, { + timeout: detailTargetConfig.timeout }) - } catch (error) { - // 收集报错的 page - if (!errorPageMap.get(id)) { - errorPageMap.set(id, page) - } + } catch (error: any) { + notError = false + crawlErrorQueue.push(error) + } + + // 保存结果 + device.detailTargetResult = { response, page } + + // 处理结果 + const isStatusNormal = !isCrawlStatusInHttpStatus(device) + const isSuccess = notError && isStatusNormal + + device.isStatusNormal = isStatusNormal + device.isSuccess = isSuccess + if (isSuccess || notAllowRetry) { + device.isHandle = true - // 让外面收集错误 - throw error + pageSingleResultHandle(device, extraConfig) } return { response, page } } async function dataAndFileSingleCrawlHandle( - detaileInfo: DetailInfo< - LoaderCrawlDataDetail | LoaderCrawlFileDetail, - Request - > + device: Device, + extraConfig: ExtraDataConfig | ExtraFileConfig ) { - const { detailTarget } = detaileInfo + const { detailTargetConfig, crawlErrorQueue, maxRetry, retryCount } = device + const notAllowRetry = maxRetry === retryCount - return await request(detailTarget) + let detailTargetResult = null + let notError = true + try { + detailTargetResult = await request(detailTargetConfig) + } catch (error: any) { + notError = false + crawlErrorQueue.push(error) + } + + // 保存结果 + device.detailTargetResult = detailTargetResult + + // 处理结果 + const isStatusNormal = !isCrawlStatusInHttpStatus(device) + const isSuccess = notError && isStatusNormal + + device.isStatusNormal = isStatusNormal + device.isSuccess = isSuccess + if (isSuccess || notAllowRetry) { + device.isHandle = true + + if (extraConfig.type === 'data') { + dataSingleResultHandle(device, extraConfig as ExtraDataConfig) + } else if (extraConfig.type === 'file') { + fileSingleResultHandle(device, extraConfig as ExtraFileConfig) + } + } + + return await request(detailTargetConfig) } /* Single result handle */ +const resultEssentialOtherKeys = ['isSuccess', 'retryCount'] as const + +function handleResultEssentialOtherValue(device: any) { + Object.keys(device).forEach((key) => { + if (resultEssentialOtherKeys.includes(key as any)) { + device.result[key] = device[key] + } + }) +} function pageSingleResultHandle( - detaileInfo: DetailInfo, + device: Device, extraConfig: ExtraPageConfig ) { - const { id, isSuccess, detailTargetRes } = detaileInfo - const { errorPageMap, browser, onCrawlItemComplete } = extraConfig + const { detailTargetResult, result } = device + const { browser, onCrawlItemComplete } = extraConfig - let data: { - browser: Browser - response: HTTPResponse | null - page: Page - } | null = null + handleResultEssentialOtherValue(device) - if (isSuccess && detailTargetRes) { - data = { browser: browser!, ...detailTargetRes } - } else { - const page = errorPageMap.get(id)! + result.data = { browser, ...detailTargetResult } - data = { browser: browser!, response: null, page } + if (onCrawlItemComplete) { + onCrawlItemComplete(device.result as CrawlPageSingleRes) } +} + +function dataSingleResultHandle( + device: Device, + extraConfig: ExtraDataConfig +) { + const { isSuccess, detailTargetResult, result } = device + const { onCrawlItemComplete } = extraConfig + + handleResultEssentialOtherValue(device) + + if (isSuccess && detailTargetResult) { + const contentType = detailTargetResult.headers['content-type'] ?? '' - detaileInfo.data = data + const data = + contentType === 'application/json' + ? JSON.parse(detailTargetResult.data.toString()) + : contentType.includes('text') + ? detailTargetResult.data.toString() + : detailTargetResult.data - const crawlPageSingleRes: AnyObject = detaileInfo - delete crawlPageSingleRes.detailTarget - delete crawlPageSingleRes.detailTargetRes + result.data = { ...detailTargetResult, data } + } if (onCrawlItemComplete) { - onCrawlItemComplete(crawlPageSingleRes as CrawlPageSingleRes) + onCrawlItemComplete(result as CrawlDataSingleRes) } } function fileSingleResultHandle( - detaileInfo: DetailInfo, + device: Device, extraConfig: ExtraFileConfig ) { - const { id, isSuccess, detailTarget, detailTargetRes } = detaileInfo + const { id, isSuccess, detailTargetConfig, detailTargetResult, result } = + device const { saveFileErrorArr, saveFilePendingQueue, @@ -788,26 +862,28 @@ function fileSingleResultHandle( onBeforeSaveItemFile } = extraConfig - const crawlFileSingleRes: AnyObject = detaileInfo - delete crawlFileSingleRes.detailTarget - delete crawlFileSingleRes.detailTargetRes + handleResultEssentialOtherValue(device) - if (isSuccess && detailTargetRes) { - const mimeType = detailTargetRes.headers['content-type'] ?? '' + if (isSuccess && detailTargetResult) { + const mimeType = detailTargetResult.headers['content-type'] ?? '' - const fileName = detailTarget.fileName ?? `${id}-${new Date().getTime()}` + const fileName = + detailTargetConfig.fileName ?? `${id}-${new Date().getTime()}` const fileExtension = - detailTarget.extension ?? `.${mimeType.split('/').pop()}` + detailTargetConfig.extension ?? `.${mimeType.split('/').pop()}` - if (detailTarget.storeDir && !fs.existsSync(detailTarget.storeDir)) { - mkdirDirSync(detailTarget.storeDir) + if ( + detailTargetConfig.storeDir && + !fs.existsSync(detailTargetConfig.storeDir) + ) { + mkdirDirSync(detailTargetConfig.storeDir) } - const storePath = detailTarget.storeDir ?? __dirname + const storePath = detailTargetConfig.storeDir ?? __dirname const filePath = path.resolve(storePath, fileName + fileExtension) // 在保存前的回调 - const data = detailTargetRes.data + const data = detailTargetResult.data let dataPromise = Promise.resolve(data) if (onBeforeSaveItemFile) { dataPromise = onBeforeSaveItemFile({ @@ -832,8 +908,8 @@ function fileSingleResultHandle( } const size = newData.length - detaileInfo.data = { - ...detailTargetRes, + result.data = { + ...detailTargetResult, data: { isSuccess, fileName, @@ -845,7 +921,7 @@ function fileSingleResultHandle( } if (onCrawlItemComplete) { - onCrawlItemComplete(crawlFileSingleRes as CrawlFileSingleRes) + onCrawlItemComplete(device.result as CrawlFileSingleRes) } }) @@ -853,7 +929,7 @@ function fileSingleResultHandle( saveFilePendingQueue.push(saveFileItemPending) } else { if (onCrawlItemComplete) { - onCrawlItemComplete(crawlFileSingleRes as CrawlFileSingleRes) + onCrawlItemComplete(device.result as CrawlFileSingleRes) } } } @@ -911,7 +987,6 @@ export function createCrawlPage(xCrawlConfig: LoaderXCrawlConfig) { createCrawlPageConfig(xCrawlConfig, config) const extraConfig: ExtraPageConfig = { - errorPageMap: new Map(), browser: browser!, intervalTime, onCrawlItemComplete @@ -922,8 +997,7 @@ export function createCrawlPage(xCrawlConfig: LoaderXCrawlConfig) { xCrawlConfig.mode, detailTargets, extraConfig, - pageSingleCrawlHandle, - pageSingleResultHandle + pageSingleCrawlHandle )) as CrawlPageSingleRes[] const crawlRes = @@ -969,34 +1043,8 @@ export function createCrawlData(xCrawlConfig: LoaderXCrawlConfig) { const { detailTargets, intervalTime, onCrawlItemComplete } = createCrawlDataConfig(xCrawlConfig, config) - function dataSingleResultHandle( - detaileInfo: DetailInfo, - extraConfig: ExtraDataConfig - ) { - const { isSuccess, detailTargetRes } = detaileInfo - const { onCrawlItemComplete } = extraConfig - - if (isSuccess && detailTargetRes) { - const contentType = detailTargetRes.headers['content-type'] ?? '' - - const data: T = - contentType === 'application/json' - ? JSON.parse(detailTargetRes.data.toString()) - : contentType.includes('text') - ? detailTargetRes.data.toString() - : detailTargetRes.data - - detaileInfo.data = { ...detailTargetRes, data } - } - - const crawlDataSingleRes: AnyObject = detaileInfo - - if (onCrawlItemComplete) { - onCrawlItemComplete(crawlDataSingleRes as CrawlDataSingleRes) - } - } - const extraConfig: ExtraDataConfig = { + type: 'data', intervalTime, onCrawlItemComplete } @@ -1006,8 +1054,7 @@ export function createCrawlData(xCrawlConfig: LoaderXCrawlConfig) { xCrawlConfig.mode, detailTargets, extraConfig, - dataAndFileSingleCrawlHandle, - dataSingleResultHandle + dataAndFileSingleCrawlHandle )) as CrawlDataSingleRes[] const crawlRes = @@ -1053,6 +1100,8 @@ export function createCrawlFile(xCrawlConfig: LoaderXCrawlConfig) { } = createCrawlFileConfig(xCrawlConfig, config) const extraConfig: ExtraFileConfig = { + type: 'file', + saveFileErrorArr: [], saveFilePendingQueue: [], @@ -1066,8 +1115,7 @@ export function createCrawlFile(xCrawlConfig: LoaderXCrawlConfig) { xCrawlConfig.mode, detailTargets, extraConfig, - dataAndFileSingleCrawlHandle, - fileSingleResultHandle + dataAndFileSingleCrawlHandle )) as CrawlFileSingleRes[] const { saveFilePendingQueue, saveFileErrorArr } = extraConfig diff --git a/src/batchCrawl.ts b/src/batchCrawl.ts new file mode 100644 index 00000000..93a35090 --- /dev/null +++ b/src/batchCrawl.ts @@ -0,0 +1,87 @@ +import { isNumber, isUndefined, log, logNumber, random, sleep } from './utils' + +import type { ExtraCommonConfig } from './api' +import { CrawlDetail, Device } from './controller' + +async function useSleepByBatch( + isHaventervalTime: boolean, + isNumberIntervalTime: boolean, + intervalTime: any, + id: number +) { + if (isHaventervalTime && id > 1) { + const timeout: number = isNumberIntervalTime + ? intervalTime + : random(intervalTime.max, intervalTime.min) + + log( + `Id: ${logNumber(id)} - Crawl needs to sleep for ${logNumber( + timeout + 'ms' + )} milliseconds before sending` + ) + + await sleep(timeout) + } else { + log(`Id: ${logNumber(id)} - Crawl does not need to sleep, send immediately`) + } +} + +export async function asyncBatchCrawl< + T extends CrawlDetail, + E extends ExtraCommonConfig, + R +>( + devices: Device[], + extraConfig: E, + singleCrawlHandle: (device: Device, extraConfig: E) => Promise +) { + const { intervalTime } = extraConfig + + const isHaventervalTime = !isUndefined(intervalTime) + const isNumberIntervalTime = isNumber(intervalTime) + + const crawlPendingQueue: Promise[] = [] + for (const device of devices) { + const { id } = device + + await useSleepByBatch( + isHaventervalTime, + isNumberIntervalTime, + intervalTime, + id + ) + + crawlPendingQueue.push(singleCrawlHandle(device, extraConfig)) + } + + // 等待所有爬取结束 + await Promise.all(crawlPendingQueue) +} + +export async function syncBatchCrawl< + T extends CrawlDetail, + E extends ExtraCommonConfig, + R +>( + devices: Device[], + extraConfig: E, + singleCrawlHandle: (device: Device, extraConfig: E) => Promise +) { + const { intervalTime } = extraConfig + + const isHaventervalTime = !isUndefined(intervalTime) + const isNumberIntervalTime = isNumber(intervalTime) + + for (const device of devices) { + const { id } = device + + await useSleepByBatch( + isHaventervalTime, + isNumberIntervalTime, + intervalTime, + id + ) + + await singleCrawlHandle(device, extraConfig) + } +} diff --git a/src/batchCrawlHandle.ts b/src/batchCrawlHandle.ts deleted file mode 100644 index 372abdbc..00000000 --- a/src/batchCrawlHandle.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { isNumber, isUndefined, log, logNumber, random, sleep } from './utils' - -import type { ExtraCommonConfig } from './api' -import { DetailInfo, CrawlDetail, getCrawlStatus } from './controller' - -async function useSleepByBatch( - isHaventervalTime: boolean, - isNumberIntervalTime: boolean, - intervalTime: any, - id: number -) { - if (isHaventervalTime && id > 1) { - const timeout: number = isNumberIntervalTime - ? intervalTime - : random(intervalTime.max, intervalTime.min) - - log( - `Id: ${logNumber(id)} - Crawl needs to sleep for ${logNumber( - timeout + 'ms' - )} milliseconds before sending` - ) - - await sleep(timeout) - } else { - log(`Id: ${logNumber(id)} - Crawl does not need to sleep, send immediately`) - } -} - -export async function asyncBatchCrawl< - T extends CrawlDetail, - E extends ExtraCommonConfig, - R ->( - detailInfos: DetailInfo[], - extraConfig: E, - singleCrawlHandle: ( - detailInfo: DetailInfo, - extraConfig: E - ) => Promise, - singleResultHandle: (detailInfo: DetailInfo, extraConfig: E) => void -) { - const { intervalTime } = extraConfig - - const isHaventervalTime = !isUndefined(intervalTime) - const isNumberIntervalTime = isNumber(intervalTime) - - const crawlPendingQueue: Promise[] = [] - for (const detailInfo of detailInfos) { - const { id } = detailInfo - - await useSleepByBatch( - isHaventervalTime, - isNumberIntervalTime, - intervalTime, - id - ) - - const crawlSinglePending = singleCrawlHandle(detailInfo, extraConfig) - .catch((error) => { - detailInfo.crawlErrorQueue.push(error) - return false - }) - .then((detailTargetRes) => { - const notAllowRetry = detailInfo.retryCount === detailInfo.maxRetry - - if (typeof detailTargetRes === 'boolean') { - if (notAllowRetry) { - singleResultHandle(detailInfo, extraConfig) - } - - return - } - - detailInfo.isSuccess = true - detailInfo.detailTargetRes = detailTargetRes - - // 根据 状态码/是否无法重试 决定处理结果 - const { detailTarget } = detailInfo - - const status = getCrawlStatus(detailTargetRes) - const switchByHttpStatus = detailTarget.proxy?.switchByHttpStatus ?? [] - if ((status && !switchByHttpStatus.includes(status)) || notAllowRetry) { - singleResultHandle(detailInfo, extraConfig) - delete detailInfo._notHandle - } - }) - - crawlPendingQueue.push(crawlSinglePending) - } - - // 等待所有爬取结束 - await Promise.all(crawlPendingQueue) -} - -export async function syncBatchCrawl< - T extends CrawlDetail, - E extends ExtraCommonConfig, - R ->( - detailInfos: DetailInfo[], - extraConfig: E, - singleCrawlHandle: ( - detaileInfo: DetailInfo, - extraConfig: E - ) => Promise, - singleResultHandle: (detaileInfo: DetailInfo, extraConfig: E) => void -) { - const { intervalTime } = extraConfig - - const isHaventervalTime = !isUndefined(intervalTime) - const isNumberIntervalTime = isNumber(intervalTime) - - for (const detailInfo of detailInfos) { - const { id } = detailInfo - - await useSleepByBatch( - isHaventervalTime, - isNumberIntervalTime, - intervalTime, - id - ) - - try { - detailInfo.detailTargetRes = await singleCrawlHandle( - detailInfo, - extraConfig - ) - detailInfo.isSuccess = true - } catch (error: any) { - detailInfo.crawlErrorQueue.push(error) - } - - // 根据 是否成功和状态码/是否无法重试 决定处理结果 - const { detailTarget, detailTargetRes } = detailInfo - - const status = getCrawlStatus(detailTargetRes) - const switchByHttpStatus = detailTarget.proxy?.switchByHttpStatus ?? [] - const notAllowRetry = detailInfo.retryCount === detailInfo.maxRetry - if ( - (detailInfo.isSuccess && - status && - !switchByHttpStatus.includes(status)) || - notAllowRetry - ) { - singleResultHandle(detailInfo, extraConfig) - delete detailInfo._notHandle - } - } -} diff --git a/src/controller.ts b/src/controller.ts index e4bc9c9c..fb2ee51d 100644 --- a/src/controller.ts +++ b/src/controller.ts @@ -1,4 +1,4 @@ -import { asyncBatchCrawl, syncBatchCrawl } from './batchCrawlHandle' +import { asyncBatchCrawl, syncBatchCrawl } from './batchCrawl' import { priorityQueueMergeSort } from './sort' import { @@ -20,49 +20,60 @@ import { } from './utils' import { HTTPResponse } from 'puppeteer' import { Request } from './request' +import { CrawlCommonRes } from './types/api' export type CrawlDetail = | LoaderCrawlPageDetail | LoaderCrawlDataDetail | LoaderCrawlFileDetail -export interface DetailInfo { - _notHandle: any +interface DeviceResult extends CrawlCommonRes { + data: any +} +export interface Device { id: number + + isHandle: boolean isSuccess: boolean + isStatusNormal: boolean + + detailTargetConfig: T + detailTargetResult: R | null + maxRetry: number retryCount: number + proxyDetails: ProxyDetails crawlErrorQueue: Error[] - proxyDetailes: ProxyDetails - data: any | null - detailTarget: T - detailTargetRes: R | null + result: DeviceResult } -type TargetSingleRes = Omit< - DetailInfo, - 'detailTarget' | 'detailTargetRes' -> +export function isCrawlStatusInHttpStatus(device: Device) { + const { detailTargetConfig, detailTargetResult } = device -export function getCrawlStatus(detailTargetRes: any) { let status: number | null = null if ( - isObject(detailTargetRes) && - Object.hasOwn(detailTargetRes, 'response') && - (detailTargetRes as any).response + isObject(detailTargetResult) && + Object.hasOwn(detailTargetResult, 'response') && + (detailTargetResult as any).response ) { // crawlPage - const response: HTTPResponse = (detailTargetRes as any).response + const response: HTTPResponse = (detailTargetResult as any).response status = response.status() - } else if (isObject(detailTargetRes)) { + } else if (isObject(detailTargetResult)) { // crawlData / crawlFie - status = (detailTargetRes as any as Request).statusCode ?? null + status = (detailTargetResult as any as Request).statusCode ?? null } - return status + let res = false + const switchByHttpStatus = detailTargetConfig.proxy?.switchByHttpStatus + if (status && switchByHttpStatus && switchByHttpStatus.includes(status)) { + res = true + } + + return res } export async function controller< @@ -74,12 +85,8 @@ export async function controller< mode: 'async' | 'sync', detailTargets: T[], extraConfig: E, - singleCrawlHandle: ( - detailInfo: DetailInfo, - extraConfig: E - ) => Promise, - singleResultHandle: (detailInfo: DetailInfo, extraConfig: E) => void -): Promise { + singleCrawlHandle: (device: Device, extraConfig: E) => Promise +) { // 是否使用优先爬取 const isPriorityCrawl = !detailTargets.every( (item) => item.priority === detailTargets[0].priority @@ -93,100 +100,100 @@ export async function controller< ) : detailTargets - // 通过映射生成新的配置数组 - const detailInfos: DetailInfo[] = detailTargetConfigs.map( - (detailTarget, index) => ({ - _notHandle: true, - - id: index + 1, - isSuccess: false, - maxRetry: detailTarget.maxRetry, - retryCount: 0, - crawlErrorQueue: [], - proxyDetailes: detailTarget.proxyDetails, - data: null, - - detailTarget, - detailTargetRes: null - }) + // 生成装置 + const devices: Device[] = detailTargetConfigs.map( + (detailTargetConfig, index) => { + const id = ++index + const { maxRetry, proxyDetails } = detailTargetConfig + const crawlErrorQueue: Error[] = [] + + return { + id, + + isHandle: false, + isSuccess: false, + isStatusNormal: false, + + detailTargetConfig, + detailTargetResult: null, + + maxRetry, + retryCount: 0, + proxyDetails, + crawlErrorQueue, + + result: { + id, + isSuccess: false, + maxRetry, + retryCount: 0, + proxyDetails, + crawlErrorQueue, + data: null + } + } + } ) log( `${logSuccess(`Start crawling`)} - name: ${logWarn(name)}, mode: ${logWarn( mode - )}, total: ${logNumber(detailInfos.length)} ` + )}, total: ${logNumber(devices.length)} ` ) // 选择爬取模式 const batchCrawl = mode === 'async' ? asyncBatchCrawl : syncBatchCrawl let i = 0 - let crawlQueue: DetailInfo[] = detailInfos + let crawlQueue: Device[] = devices while (crawlQueue.length) { - await batchCrawl( - crawlQueue, - extraConfig, - singleCrawlHandle, - singleResultHandle - ) + await batchCrawl(crawlQueue, extraConfig, singleCrawlHandle) - crawlQueue = crawlQueue.filter((detailInfo) => { + crawlQueue = crawlQueue.filter((device) => { const { - isSuccess, - maxRetry, + isHandle, retryCount, - proxyDetailes, + maxRetry, + detailTargetConfig, + proxyDetails, crawlErrorQueue, - detailTarget, - detailTargetRes - } = detailInfo + isStatusNormal + } = device + // 没有被处理 / 没成功 / 状态码不符合 let isRetry = false - const haveRetryChance = maxRetry && retryCount < maxRetry - - // 没有被处理/没成功/状态码不符合 - if (Object.hasOwn(detailInfo, '_notHandle') && haveRetryChance) { - // 1.不成功 - if (!isSuccess) { - isRetry = true - } - - // 2.代理多, 轮换代理 - if (proxyDetailes.length >= 2) { - // 获取状态码 - const status = getCrawlStatus(detailTargetRes) - - // 错误次数 / 检测状态码 - const switchByErrorCount = detailTarget.proxy?.switchByErrorCount ?? 0 - const switchByHttpStatus = - detailTarget.proxy?.switchByHttpStatus ?? [] + const haveRetryChance = retryCount < maxRetry + if (!isHandle && haveRetryChance) { + isRetry = true + + // 轮换代理 + if (proxyDetails.length >= 2) { + // 状态码 / 失败次数 + const switchByErrorCount = + detailTargetConfig.proxy?.switchByErrorCount if ( - (status && switchByHttpStatus.includes(status)) || - switchByErrorCount >= crawlErrorQueue.length + !isStatusNormal || + (!isUndefined(switchByErrorCount) && + switchByErrorCount >= crawlErrorQueue.length) ) { - isRetry = true - proxyDetailes.find( - (detail) => detail.url === detailTarget.proxyUrl + // 设置当前代理 URL 状态 + proxyDetails.find( + (detail) => detail.url === detailTargetConfig.proxyUrl )!.state = false // 寻找新代理 URL - const newProxyUrl = proxyDetailes.find( + const newProxyUrl = proxyDetails.find( (detaile) => detaile.state )?.url - // 无则不切换 + // 使用新代理 URL if (!isUndefined(newProxyUrl)) { - detailTarget.proxyUrl = newProxyUrl + detailTargetConfig.proxyUrl = newProxyUrl } } } } - // 重置需要重试的 isSuccess - if (isRetry) { - detailInfo.isSuccess = false - } - return isRetry }) @@ -205,11 +212,11 @@ export async function controller< // 统计结果 const succssIds: number[] = [] const errorIds: number[] = [] - detailInfos.forEach((item) => { - if (item.isSuccess) { - succssIds.push(item.id) + devices.forEach((device) => { + if (device.isSuccess) { + succssIds.push(device.id) } else { - errorIds.push(item.id) + errorIds.push(device.id) } }) @@ -227,5 +234,5 @@ export async function controller< ) ) - return detailInfos as TargetSingleRes[] + return devices.map((device) => device.result) } diff --git a/src/types/api.ts b/src/types/api.ts index 6d0f9774..b597dbf7 100644 --- a/src/types/api.ts +++ b/src/types/api.ts @@ -173,8 +173,8 @@ export interface CrawlCommonRes { isSuccess: boolean maxRetry: number retryCount: number + proxyDetails: ProxyDetails crawlErrorQueue: Error[] - proxyDetailes: ProxyDetails } export interface CrawlPageSingleRes extends CrawlCommonRes { diff --git a/test/environment/mode.test.ts b/test/environment/mode.test.ts new file mode 100644 index 00000000..91a5c660 --- /dev/null +++ b/test/environment/mode.test.ts @@ -0,0 +1,49 @@ +import process from 'node:process' +import { expect, test, jest } from '@jest/globals' +import chalk from 'chalk' + +import IXCrawl from '../../src' + +const args = process.argv.slice(3) +const environment = args[0] + +let xCrawl: typeof IXCrawl +if (environment === 'dev') { + xCrawl = require('../../src').default +} else if (environment === 'pro') { + xCrawl = require('../../publish/dist') +} + +jest.setTimeout(60000) + +async function async() { + const testXCrawl = xCrawl() + + const res = await testXCrawl.crawlData([ + 'http://localhost:8888', + 'http://localhost:8888' + ]) + + return res.reduce((prev, item) => prev && item.isSuccess, true) +} + +async function sync() { + const testXCrawl = xCrawl({ mode: 'sync' }) + + const res = await testXCrawl.crawlData([ + 'http://localhost:8888', + 'http://localhost:8888' + ]) + + return res.reduce((prev, item) => prev && item.isSuccess, true) +} + +test('mode - async', async () => { + console.log(chalk.bgGreen('================ mode - async ================')) + await expect(async()).resolves.toBe(true) +}) + +test('mode - sync', async () => { + console.log(chalk.bgGreen('================ mode - sync ================')) + await expect(sync()).resolves.toBe(true) +}) diff --git a/test/environment/proxy.test.ts b/test/environment/proxy.test.ts new file mode 100644 index 00000000..f5c8404d --- /dev/null +++ b/test/environment/proxy.test.ts @@ -0,0 +1,39 @@ +import process from 'node:process' +import { expect, test, jest } from '@jest/globals' +import chalk from 'chalk' + +import IXCrawl from '../../src' + +const args = process.argv.slice(3) +const environment = args[0] + +let xCrawl: typeof IXCrawl +if (environment === 'dev') { + xCrawl = require('../../src').default +} else if (environment === 'pro') { + xCrawl = require('../../publish/dist') +} + +jest.setTimeout(60000) + +async function proxy() { + const testXCrawl = xCrawl() + + const res = await testXCrawl.crawlPage({ + targets: ['https://www.google.com', 'https://github.com/coder-hxl'], + maxRetry: 3, + proxy: { + urls: ['http://localhost:129032', 'http://localhost:14892'], + switchByErrorCount: 2 + } + }) + + await res[0].data.browser.close() + + return res.reduce((prev, item) => prev && item.isSuccess, true) +} + +test('proxy', async () => { + console.log(chalk.bgGreen('================ proxy ================')) + await expect(proxy()).resolves.toBe(true) +}) diff --git a/test/environment/test.ts b/test/environment/test.ts index e1048a52..bf8103e0 100644 --- a/test/environment/test.ts +++ b/test/environment/test.ts @@ -2,3 +2,6 @@ import './crawlPage.test' import './crawlData.test' import './crawlFile.test' import './startPolling.test' + +import './mode.test' +import './proxy.test' diff --git a/test/server/index.js b/test/server/index.js index 62cc4cf4..2364a48f 100644 --- a/test/server/index.js +++ b/test/server/index.js @@ -1 +1 @@ -"use strict";require("node:http").createServer(((e,t)=>{t.setHeader("Content-type","text/plain"),t.end("success")})).listen(8888,(()=>{console.log("服务器在 8888 端口启动成功~")})); +"use strict";require("node:http").createServer(((e,t)=>{t.setHeader("Content-Type","text/plain"),t.end("success")})).listen(8888,(()=>{console.log("服务器在 8888 端口启动成功~")})); diff --git a/test/server/index.ts b/test/server/index.ts index c8ffe398..6608c890 100644 --- a/test/server/index.ts +++ b/test/server/index.ts @@ -2,7 +2,7 @@ import http from 'node:http' http .createServer((req, res) => { - res.setHeader('Content-type', 'text/plain') + res.setHeader('Content-Type', 'text/plain') res.end('success') }) .listen(8888, () => { diff --git a/test/start/index.js b/test/start/index.js index f5a4ad2f..19c19ed3 100644 --- a/test/start/index.js +++ b/test/start/index.js @@ -1,1135 +1 @@ -'use strict'; - -var fs = require('node:fs'); -var promises = require('node:fs/promises'); -var path = require('node:path'); -var puppeteer = require('puppeteer'); -var chalk = require('chalk'); -var http = require('node:http'); -var https = require('node:https'); -var Url = require('node:url'); -var HttpsProxyAgent = require('https-proxy-agent'); - -function sleep(timeout) { - return new Promise((resolve) => setTimeout(resolve, timeout)); -} -function random(max, min = 0) { - let res = Math.floor(Math.random() * max); - while (res < min) { - res = Math.floor(Math.random() * max); - } - return res; -} -function mkdirDirSync(dir) { - const dirSplit = path.resolve(dir).split(path.sep); - dirSplit.reduce((prev, item, index) => { - const currentDir = index !== 0 ? path.join(prev, item) : item; - if (!fs.existsSync(currentDir)) { - fs.mkdirSync(currentDir); - } - return currentDir; - }, ''); -} -const log = console.log; -const logNumber = chalk.hex('#a57fff'); -const logSuccess = chalk.green; -const logError = chalk.red; -const logWarn = chalk.yellow; -function isUndefined(value) { - return typeof value === 'undefined'; -} -function isNumber(value) { - return typeof value === 'number'; -} -function isObject(value) { - return typeof value === 'object' && value && !Array.isArray(value); -} -function isArray(value) { - return Array.isArray(value); -} - -async function useSleepByBatch(isHaventervalTime, isNumberIntervalTime, intervalTime, id) { - if (isHaventervalTime && id > 1) { - const timeout = isNumberIntervalTime - ? intervalTime - : random(intervalTime.max, intervalTime.min); - log(`Id: ${logNumber(id)} - Crawl needs to sleep for ${logNumber(timeout + 'ms')} milliseconds before sending`); - await sleep(timeout); - } - else { - log(`Id: ${logNumber(id)} - Crawl does not need to sleep, send immediately`); - } -} -async function asyncBatchCrawl(detailInfos, extraConfig, singleCrawlHandle, singleResultHandle) { - const { intervalTime } = extraConfig; - const isHaventervalTime = !isUndefined(intervalTime); - const isNumberIntervalTime = isNumber(intervalTime); - const crawlPendingQueue = []; - for (const detailInfo of detailInfos) { - const { id } = detailInfo; - await useSleepByBatch(isHaventervalTime, isNumberIntervalTime, intervalTime, id); - const crawlSinglePending = singleCrawlHandle(detailInfo, extraConfig) - .catch((error) => { - detailInfo.crawlErrorQueue.push(error); - return false; - }) - .then((detailTargetRes) => { - const notAllowRetry = detailInfo.retryCount === detailInfo.maxRetry; - if (typeof detailTargetRes === 'boolean') { - if (notAllowRetry) { - singleResultHandle(detailInfo, extraConfig); - } - return; - } - detailInfo.isSuccess = true; - detailInfo.detailTargetRes = detailTargetRes; - // 根据 状态码/是否无法重试 决定处理结果 - const { detailTarget } = detailInfo; - const status = getCrawlStatus(detailTargetRes); - const switchByHttpStatus = detailTarget.proxy?.switchByHttpStatus ?? []; - if ((status && !switchByHttpStatus.includes(status)) || notAllowRetry) { - log(status, switchByHttpStatus); - singleResultHandle(detailInfo, extraConfig); - delete detailInfo._notHandle; - } - }); - crawlPendingQueue.push(crawlSinglePending); - } - // 等待所有爬取结束 - await Promise.all(crawlPendingQueue); -} -async function syncBatchCrawl(detailInfos, extraConfig, singleCrawlHandle, singleResultHandle) { - const { intervalTime } = extraConfig; - const isHaventervalTime = !isUndefined(intervalTime); - const isNumberIntervalTime = isNumber(intervalTime); - for (const detailInfo of detailInfos) { - const { id } = detailInfo; - await useSleepByBatch(isHaventervalTime, isNumberIntervalTime, intervalTime, id); - try { - detailInfo.detailTargetRes = await singleCrawlHandle(detailInfo, extraConfig); - detailInfo.isSuccess = true; - } - catch (error) { - detailInfo.crawlErrorQueue.push(error); - } - // 根据 是否成功和状态码/是否无法重试 决定处理结果 - const { detailTarget, detailTargetRes } = detailInfo; - const status = getCrawlStatus(detailTargetRes); - const switchByHttpStatus = detailTarget.proxy?.switchByHttpStatus ?? []; - const notAllowRetry = detailInfo.retryCount === detailInfo.maxRetry; - if ((detailInfo.isSuccess && - status && - !switchByHttpStatus.includes(status)) || - notAllowRetry) { - singleResultHandle(detailInfo, extraConfig); - delete detailInfo._notHandle; - } - } -} - -function swap(arr, i, j) { - const temp = arr[i]; - arr[i] = arr[j]; - arr[j] = temp; -} -function quickSort(arr) { - const n = arr.length; - partition(0, n - 1); - function partition(left, right) { - if (left >= right) - return; - // 1.找基准元素 - const pivot = arr[right]; - // 2.定义双指针进行交换(左小右大) - let i = left; - let j = right - 1; - while (i <= j) { - while (arr[i] < pivot) { - i++; - } - while (arr[j] > pivot) { - j--; - } - if (i <= j) { - swap(arr, i, j); - i++; - j--; - } - } - // 3.将 pivot 放到正确位置 - swap(arr, i, right); - // 4.左右划分区域 - partition(left, i - 1); - partition(i + 1, right); - } - return arr; -} -function priorityQueueMergeSort(arr) { - if (arr.length === 1) - return arr; - const mid = Math.floor(arr.length / 2); - const newLeftArr = priorityQueueMergeSort(arr.slice(0, mid)); - const newRightArr = priorityQueueMergeSort(arr.slice(mid)); - const newArr = []; - let i = 0; - let j = 0; - while (i < newLeftArr.length && j < newRightArr.length) { - if (newLeftArr[i] >= newRightArr[j]) { - newArr.push(newLeftArr[i]); - i++; - } - else { - newArr.push(newRightArr[j]); - j++; - } - } - if (i < newLeftArr.length) { - newArr.push(...newLeftArr.slice(i)); - } - if (j < newRightArr.length) { - newArr.push(...newRightArr.splice(j)); - } - return newArr; -} - -function getCrawlStatus(detailTargetRes) { - let status = null; - if (isObject(detailTargetRes) && - Object.hasOwn(detailTargetRes, 'response') && - detailTargetRes.response) { - // crawlPage - const response = detailTargetRes.response; - status = response.status(); - } - else if (isObject(detailTargetRes)) { - // crawlData / crawlFie - status = detailTargetRes.statusCode ?? null; - } - return status; -} -async function controller(name, mode, detailTargets, extraConfig, singleCrawlHandle, singleResultHandle) { - // 是否使用优先爬取 - const isPriorityCrawl = !detailTargets.every((item) => item.priority === detailTargets[0].priority); - const detailTargetConfigs = isPriorityCrawl - ? priorityQueueMergeSort(detailTargets.map((item) => ({ - ...item, - valueOf: () => item.priority - }))) - : detailTargets; - // 通过映射生成新的配置数组 - const detailInfos = detailTargetConfigs.map((detailTarget, index) => ({ - _notHandle: true, - id: index + 1, - isSuccess: false, - maxRetry: detailTarget.maxRetry, - retryCount: 0, - crawlErrorQueue: [], - proxyDetailes: detailTarget.proxyDetails, - data: null, - detailTarget, - detailTargetRes: null - })); - log(`${logSuccess(`Start crawling`)} - name: ${logWarn(name)}, mode: ${logWarn(mode)}, total: ${logNumber(detailInfos.length)} `); - // 选择爬取模式 - const batchCrawl = mode === 'async' ? asyncBatchCrawl : syncBatchCrawl; - let i = 0; - let crawlQueue = detailInfos; - while (crawlQueue.length) { - await batchCrawl(crawlQueue, extraConfig, singleCrawlHandle, singleResultHandle); - crawlQueue = crawlQueue.filter((detailInfo) => { - const { isSuccess, maxRetry, retryCount, proxyDetailes, crawlErrorQueue, detailTarget, detailTargetRes } = detailInfo; - let isRetry = false; - const haveRetryChance = maxRetry && retryCount < maxRetry; - // 没有被处理/没成功/状态码不符合 - if (Object.hasOwn(detailInfo, '_notHandle') && haveRetryChance) { - // 1.不成功 - if (!isSuccess) { - isRetry = true; - } - // 2.代理多, 轮换代理 - if (proxyDetailes.length >= 2) { - // 获取状态码 - const status = getCrawlStatus(detailTargetRes); - // 错误次数 / 检测状态码 - const switchByErrorCount = detailTarget.proxy?.switchByErrorCount ?? 0; - const switchByHttpStatus = detailTarget.proxy?.switchByHttpStatus ?? []; - if ((status && switchByHttpStatus.includes(status)) || - switchByErrorCount >= crawlErrorQueue.length) { - isRetry = true; - proxyDetailes.find((detail) => detail.url === detailTarget.proxyUrl).state = false; - // 寻找新代理 URL - const newProxyUrl = proxyDetailes.find((detaile) => detaile.state)?.url; - // 无则不切换 - if (!isUndefined(newProxyUrl)) { - detailTarget.proxyUrl = newProxyUrl; - } - } - } - } - // 重置需要重试的 isSuccess - if (isRetry) { - detailInfo.isSuccess = false; - } - return isRetry; - }); - if (crawlQueue.length) { - const retriedIds = crawlQueue.map((item) => { - item.retryCount++; - return item.id; - }); - log(logWarn(`Retry: ${++i} - Ids to retry: [ ${retriedIds.join(' - ')} ]`)); - } - } - // 统计结果 - const succssIds = []; - const errorIds = []; - detailInfos.forEach((item) => { - if (item.isSuccess) { - succssIds.push(item.id); - } - else { - errorIds.push(item.id); - } - }); - log('Crawl the final result:'); - log(logSuccess(` Success - total: ${succssIds.length}, ids: [ ${succssIds.join(' - ')} ]`)); - log(logError(` Error - total: ${errorIds.length}, ids: [ ${errorIds.join(' - ')} ]`)); - return detailInfos; -} - -function parseParams(urlSearch, params) { - let res = urlSearch ? `${urlSearch}` : '?'; - if (params) { - for (const key in params) { - const value = params[key]; - res += `&${key}=${value}`; - } - } - else { - res = urlSearch; - } - return res; -} -function parseHeaders(rawConfig, config) { - const rawHeaders = rawConfig.headers ?? {}; - const headers = { - 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', - ...rawHeaders - }; - if (config.method === 'POST' && rawConfig.data) { - headers['Content-Type'] = 'application/json'; - headers['Content-Length'] = Buffer.byteLength(rawConfig.data); - } - return headers; -} -function handleRequestConfig(rawConfig) { - const { protocol, hostname, port, pathname, search } = new Url.URL(rawConfig.url); - const isHttp = protocol === 'http:'; - const config = { - agent: rawConfig.proxyUrl - ? HttpsProxyAgent(rawConfig.proxyUrl) - : isHttp - ? new http.Agent() - : new https.Agent(), - protocol, - hostname, - port, - path: pathname, - search: parseParams(search, rawConfig.params), - method: rawConfig.method?.toLocaleUpperCase() ?? 'GET', - headers: {}, - timeout: rawConfig.timeout - }; - config.headers = parseHeaders(rawConfig, config); - return config; -} -function request(config) { - return new Promise((resolve, reject) => { - const isDataUndefine = isUndefined(config.data); - config.data = !isDataUndefine ? JSON.stringify(config.data) : config.data; - const requestConfig = handleRequestConfig(config); - function handleRes(res) { - const { statusCode, headers } = res; - const container = []; - res.on('data', (chunk) => container.push(chunk)); - res.on('end', () => { - const data = Buffer.concat(container); - const resolveRes = { - statusCode, - headers, - data - }; - resolve(resolveRes); - }); - } - let req; - if (requestConfig.protocol === 'http:') { - req = http.request(requestConfig, handleRes); - } - else { - req = https.request(requestConfig, handleRes); - } - req.on('timeout', () => { - reject(new Error(`Timeout ${config.timeout}ms`)); - }); - req.on('error', (err) => { - reject(err); - }); - // 其他处理 - if (requestConfig.method === 'POST' && !isDataUndefine) { - req.write(config.data); - } - req.end(); - }); -} - -const fingerprints = [ - { - platform: 'Windows', - mobile: 'random', - userAgent: { - value: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', - versions: [ - { - name: 'Chrome', - maxMajorVersion: 112, - minMajorVersion: 100, - maxMinorVersion: 10, - maxPatchVersion: 5615 - }, - { name: 'Safari', maxMinorVersion: 36, maxPatchVersion: 2333 } - ] - } - }, - { - platform: 'Windows', - mobile: 'random', - userAgent: { - value: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59', - versions: [ - { - name: 'Chrome', - maxMajorVersion: 91, - minMajorVersion: 88, - maxMinorVersion: 10, - maxPatchVersion: 5615 - }, - { name: 'Safari', maxMinorVersion: 36, maxPatchVersion: 2333 }, - { name: 'Edg', maxMinorVersion: 10, maxPatchVersion: 864 } - ] - } - }, - { - platform: 'Windows', - mobile: 'random', - userAgent: { - value: 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0', - versions: [ - { - name: 'Firefox', - maxMajorVersion: 47, - minMajorVersion: 43, - maxMinorVersion: 10, - maxPatchVersion: 5000 - } - ] - } - } -]; - -/* Function */ -function parsePageCookies(url, cookies) { - const cookiesArr = []; - if (typeof cookies === 'string') { - cookies.split('; ').forEach((item) => { - const cookie = item.split('='); - cookiesArr.push({ name: cookie[0], value: cookie[1], url }); - }); - } - else if (Array.isArray(cookies)) { - cookies.forEach((cookie) => { - if (!cookie.url) { - cookie.url = url; - } - cookiesArr.push(cookie); - }); - } - else if (typeof cookies === 'object' && cookies) { - if (!cookies.url) { - cookies.url = url; - } - cookiesArr.push(cookies); - } - return cookiesArr; -} -function transformTargetToDetailTargets(config) { - return isArray(config) - ? config.map((item) => (isObject(item) ? item : { url: item })) - : [isObject(config) ? config : { url: config }]; -} -/* Loader config */ -function loaderCommonFingerprintToDetailTarget(detail, fingerprint) { - const { ua, platform, platformVersion, mobile, acceptLanguage, userAgent } = fingerprint; - let headers = detail.headers; - if (!headers) { - detail.headers = headers = {}; - } - // 1.sec-ch-ua - if (ua) { - headers['sec-ch-ua'] = ua; - } - // 2.sec-ch-ua-mobile - if (mobile) { - headers['sec-ch-ua-mobile'] = - mobile === 'random' ? (random(2) ? '?1' : '?0') : mobile; - } - // 3.sec-ch-platform - if (platform) { - headers['sec-ch-platform'] = platform; - } - // 4.sec-ch-ua-platform-version - if (platformVersion) { - headers['sec-ch-ua-platform-version'] = platformVersion; - } - // 5.accept-language - if (acceptLanguage) { - headers['accept-language'] = acceptLanguage; - } - // 6.user-agent - if (userAgent) { - let value = userAgent.value; - userAgent.versions?.forEach((version) => { - const { name, maxMajorVersion, minMajorVersion, maxMinorVersion, minMinorVersion, maxPatchVersion, minPatchVersion } = version; - const nameSplit = value.split(`${name}/`); - const versionSplit = nameSplit[1].split(' ')[0].split('.'); - const originalVersion = versionSplit.join('.'); - if (!isUndefined(maxMajorVersion)) { - versionSplit[0] = - maxMajorVersion === minMajorVersion - ? maxMajorVersion - : random(maxMajorVersion, minMajorVersion); - } - if (!isUndefined(maxMinorVersion)) { - versionSplit[1] = - maxMinorVersion === minMinorVersion - ? maxMinorVersion - : random(maxMinorVersion, minMinorVersion); - } - if (!isUndefined(maxPatchVersion)) { - versionSplit[2] = - maxPatchVersion === minPatchVersion - ? maxPatchVersion - : random(maxPatchVersion, minPatchVersion); - } - const searchValue = `${name}/${originalVersion}`; - const replaceValue = `${name}/${versionSplit.join('.')}`; - value = value.replace(searchValue, replaceValue); - }); - headers['user-agent'] = value; - } -} -function loaderPageFingerprintToDetailTarget(detail, fingerprint) { - const { maxWidth, minWidth, maxHeight, minHidth } = fingerprint; - const viewport = detail.viewport ?? {}; - // 1.width / height - if (maxWidth) { - viewport.width = - maxWidth === minWidth ? maxWidth : random(maxWidth, minWidth); - } - if (maxHeight) { - viewport.height = - maxHeight === minHidth ? maxHeight : random(maxHeight, minHidth); - } - if (Object.hasOwn(viewport, 'width') && Object.hasOwn(viewport, 'height')) { - detail.viewport = viewport; - } -} -function loaderCommonConfigToCrawlConfig(xCrawlConfig, advancedDetailTargetsConfig, crawlConfig) { - // 1.detailTargets - crawlConfig.detailTargets = advancedDetailTargetsConfig.detailTargets.map((rawDetail) => { - // detail > advanced > app - const detail = rawDetail; - const { url, timeout, proxy, maxRetry, priority, headers, fingerprint } = detail; - // 1.1.baseUrl - if (!isUndefined(xCrawlConfig.baseUrl)) { - detail.url = xCrawlConfig.baseUrl + url; - } - // 1.2.timeout - if (isUndefined(timeout)) { - if (!isUndefined(advancedDetailTargetsConfig.timeout)) { - detail.timeout = advancedDetailTargetsConfig.timeout; - } - else { - detail.timeout = xCrawlConfig.timeout; - } - } - // 1.3.maxRetry - if (isUndefined(maxRetry)) { - if (!isUndefined(advancedDetailTargetsConfig.maxRetry)) { - detail.maxRetry = advancedDetailTargetsConfig.maxRetry; - } - else { - detail.maxRetry = xCrawlConfig.maxRetry; - } - } - // 1.4.proxy - if (isUndefined(proxy)) { - if (!isUndefined(advancedDetailTargetsConfig.proxy)) { - detail.proxy = advancedDetailTargetsConfig.proxy; - } - else if (!isUndefined(xCrawlConfig.proxy)) { - detail.proxy = xCrawlConfig.proxy; - } - } - // 1.5.proxyUrl & proxyDetail - if (!isUndefined(detail.proxy?.urls)) { - const urls = detail.proxy.urls; - detail.proxyUrl = urls[0]; - detail.proxyDetails = urls.map((url) => ({ url, state: true })); - } - // 1.6.priority - if (isUndefined(priority)) { - detail.priority = 0; - } - // 1.7.header - if (isUndefined(headers) && advancedDetailTargetsConfig.headers) { - detail.headers = { ...advancedDetailTargetsConfig.headers }; - } - // 1.8.fingerprint(公共部分) - if (fingerprint) { - // detaileTarget - loaderCommonFingerprintToDetailTarget(detail, fingerprint); - } - else if (isUndefined(fingerprint) && - isArray(advancedDetailTargetsConfig.fingerprints) && - advancedDetailTargetsConfig.fingerprints.length) { - // advancedConfig - const fingerprints = advancedDetailTargetsConfig.fingerprints; - const selectFingerprintIndex = random(fingerprints.length); - const fingerprint = fingerprints[selectFingerprintIndex]; - // 记录每个目标选中的指纹索引 - crawlConfig.selectFingerprintIndexs.push(selectFingerprintIndex); - loaderCommonFingerprintToDetailTarget(detail, fingerprint); - } - else if (isUndefined(fingerprint) && - !isArray(advancedDetailTargetsConfig.fingerprints) && - xCrawlConfig.enableRandomFingerprint) { - // xCrawlConfig - const fingerprint = fingerprints[random(fingerprints.length)]; - loaderCommonFingerprintToDetailTarget(detail, fingerprint); - } - return detail; - }); - // 2.intervalTime - crawlConfig.intervalTime = advancedDetailTargetsConfig.intervalTime; - if (isUndefined(advancedDetailTargetsConfig.intervalTime) && - !isUndefined(xCrawlConfig.intervalTime)) { - crawlConfig.intervalTime = xCrawlConfig.intervalTime; - } - // 3.onCrawlItemComplete - crawlConfig.onCrawlItemComplete = - advancedDetailTargetsConfig.onCrawlItemComplete; -} -/* Create config */ -/* - 每个创建配置函数的返回值都是类似于进阶配置 - 不同点: - - detailTargets 里面将存放的是详细版目标配置 - - 不会保留与详细版目标配置相同的选项 - - 生成 advancedConfig 对象对每个详细版目标配置进行装载, 如果是传入进阶版配置会覆盖生成的 advancedConfig 对象 -*/ -function createCrawlPageConfig(xCrawlConfig, originalConfig) { - const crawlPageConfig = { - detailTargets: [], - intervalTime: undefined, - selectFingerprintIndexs: [], - onCrawlItemComplete: undefined - }; - let advancedDetailTargetsConfig = { - targets: [], - detailTargets: [] - }; - if (isObject(originalConfig) && Object.hasOwn(originalConfig, 'targets')) { - // CrawlPageAdvancedConfig 处理 - const { targets } = originalConfig; - advancedDetailTargetsConfig = - originalConfig; - advancedDetailTargetsConfig.detailTargets = - transformTargetToDetailTargets(targets); - } - else { - // string | CrawlPageDetailTargetConfig | (string | CrawlPageDetailTargetConfig)[] 处理 - advancedDetailTargetsConfig.detailTargets = transformTargetToDetailTargets(originalConfig); - } - // 装载公共配置 - loaderCommonConfigToCrawlConfig(xCrawlConfig, advancedDetailTargetsConfig, crawlPageConfig); - // 装载单独配置 - crawlPageConfig.detailTargets.forEach((detail, index) => { - // detail > advanced > xCrawl - const { cookies, viewport, fingerprint } = detail; - // 1.cookies - if (isUndefined(cookies) && advancedDetailTargetsConfig.cookies) { - detail.cookies = advancedDetailTargetsConfig.cookies; - } - // 2.viewport - if (isUndefined(viewport) && advancedDetailTargetsConfig.viewport) { - detail.viewport = advancedDetailTargetsConfig.viewport; - } - // 3.fingerprint - if (fingerprint) { - loaderPageFingerprintToDetailTarget(detail, fingerprint); - } - else if (isUndefined(fingerprint) && - advancedDetailTargetsConfig.fingerprints?.length) { - // 从对应的选中记录中取出指纹索引 - const selectFingerprintIndex = crawlPageConfig.selectFingerprintIndexs[index]; - const fingerprint = advancedDetailTargetsConfig.fingerprints[selectFingerprintIndex]; - loaderPageFingerprintToDetailTarget(detail, fingerprint); - } - }); - return crawlPageConfig; -} -function createCrawlDataConfig(xCrawlConfig, originalConfig) { - const crawlDataConfig = { - detailTargets: [], - intervalTime: undefined, - selectFingerprintIndexs: [], - onCrawlItemComplete: undefined - }; - let advancedDetailTargetsConfig = { - targets: [], - detailTargets: [] - }; - if (isObject(originalConfig) && Object.hasOwn(originalConfig, 'targets')) { - // CrawlDataAdvancedConfig 处理 - const { targets } = originalConfig; - advancedDetailTargetsConfig = - originalConfig; - advancedDetailTargetsConfig.detailTargets = - transformTargetToDetailTargets(targets); - } - else { - // string | CrawlDataDetailTargetConfig | (string | CrawlDataDetailTargetConfig)[] 处理 - advancedDetailTargetsConfig.detailTargets = transformTargetToDetailTargets(originalConfig); - } - loaderCommonConfigToCrawlConfig(xCrawlConfig, advancedDetailTargetsConfig, crawlDataConfig); - return crawlDataConfig; -} -function createCrawlFileConfig(xCrawlConfig, originalConfig) { - const crawlFileConfig = { - detailTargets: [], - intervalTime: undefined, - selectFingerprintIndexs: [], - onBeforeSaveItemFile: undefined, - onCrawlItemComplete: undefined - }; - let advancedDetailTargetsConfig = { - targets: [], - detailTargets: [] - }; - if (isObject(originalConfig) && Object.hasOwn(originalConfig, 'targets')) { - // CrawlFileAdvancedConfig 处理 - const { targets } = originalConfig; - advancedDetailTargetsConfig = - originalConfig; - advancedDetailTargetsConfig.detailTargets = - transformTargetToDetailTargets(targets); - } - else { - // CrawlFileDetailTargetConfig | CrawlFileDetailTargetConfig[] 处理 - advancedDetailTargetsConfig.detailTargets = isArray(originalConfig) - ? originalConfig - : [originalConfig]; - } - loaderCommonConfigToCrawlConfig(xCrawlConfig, advancedDetailTargetsConfig, crawlFileConfig); - const haveAdvancedStoreDir = !isUndefined(advancedDetailTargetsConfig?.storeDir); - const haveAdvancedExtension = !isUndefined(advancedDetailTargetsConfig?.extension); - crawlFileConfig.detailTargets.forEach((detail) => { - // 1.storeDir - if (isUndefined(detail.storeDir) && haveAdvancedStoreDir) { - detail.storeDir = advancedDetailTargetsConfig.storeDir; - } - // 2.extension - if (isUndefined(detail.extension) && haveAdvancedExtension) { - detail.extension = advancedDetailTargetsConfig.extension; - } - }); - crawlFileConfig.onBeforeSaveItemFile = - advancedDetailTargetsConfig.onBeforeSaveItemFile; - return crawlFileConfig; -} -/* Single crawl handle */ -async function pageSingleCrawlHandle(detaileInfo, extraConfig) { - const { id, detailTarget } = detaileInfo; - const { errorPageMap, browser } = extraConfig; - const page = await browser.newPage(); - if (detailTarget.viewport) { - await page.setViewport(detailTarget.viewport); - } - let response = null; - try { - if (detailTarget.proxyUrl) { - await browser.createIncognitoBrowserContext({ - proxyServer: detailTarget.proxyUrl - }); - } - else { - await browser.createIncognitoBrowserContext({ - proxyServer: undefined - }); - } - if (detailTarget.cookies) { - const cookies = parsePageCookies(detailTarget.url, detailTarget.cookies); - await page.setCookie(...cookies); - } - else { - const cookies = await page.cookies(detailTarget.url); - await page.deleteCookie(...cookies); - } - if (detailTarget.headers) { - await page.setExtraHTTPHeaders(detailTarget.headers); - } - response = await page.goto(detailTarget.url, { - timeout: detailTarget.timeout - }); - } - catch (error) { - // 收集报错的 page - if (!errorPageMap.get(id)) { - errorPageMap.set(id, page); - } - // 让外面收集错误 - throw error; - } - return { response, page }; -} -async function dataAndFileSingleCrawlHandle(detaileInfo) { - const { detailTarget } = detaileInfo; - return await request(detailTarget); -} -/* Single result handle */ -function pageSingleResultHandle(detaileInfo, extraConfig) { - const { id, isSuccess, detailTargetRes } = detaileInfo; - const { errorPageMap, browser, onCrawlItemComplete } = extraConfig; - let data = null; - if (isSuccess && detailTargetRes) { - data = { browser: browser, ...detailTargetRes }; - } - else { - const page = errorPageMap.get(id); - data = { browser: browser, response: null, page }; - } - detaileInfo.data = data; - const crawlPageSingleRes = detaileInfo; - delete crawlPageSingleRes.detailTarget; - delete crawlPageSingleRes.detailTargetRes; - if (onCrawlItemComplete) { - onCrawlItemComplete(crawlPageSingleRes); - } -} -function fileSingleResultHandle(detaileInfo, extraConfig) { - const { id, isSuccess, detailTarget, detailTargetRes } = detaileInfo; - const { saveFileErrorArr, saveFilePendingQueue, onCrawlItemComplete, onBeforeSaveItemFile } = extraConfig; - const crawlFileSingleRes = detaileInfo; - delete crawlFileSingleRes.detailTarget; - delete crawlFileSingleRes.detailTargetRes; - if (isSuccess && detailTargetRes) { - const mimeType = detailTargetRes.headers['content-type'] ?? ''; - const fileName = detailTarget.fileName ?? `${id}-${new Date().getTime()}`; - const fileExtension = detailTarget.extension ?? `.${mimeType.split('/').pop()}`; - if (detailTarget.storeDir && !fs.existsSync(detailTarget.storeDir)) { - mkdirDirSync(detailTarget.storeDir); - } - const storePath = detailTarget.storeDir ?? __dirname; - const filePath = path.resolve(storePath, fileName + fileExtension); - // 在保存前的回调 - const data = detailTargetRes.data; - let dataPromise = Promise.resolve(data); - if (onBeforeSaveItemFile) { - dataPromise = onBeforeSaveItemFile({ - id, - fileName, - filePath, - data - }); - } - const saveFileItemPending = dataPromise.then(async (newData) => { - let isSuccess = true; - try { - await promises.writeFile(filePath, newData); - } - catch (err) { - isSuccess = false; - const message = `File save error at id ${id}: ${err.message}`; - const valueOf = () => id; - saveFileErrorArr.push({ message, valueOf }); - } - const size = newData.length; - detaileInfo.data = { - ...detailTargetRes, - data: { - isSuccess, - fileName, - fileExtension, - mimeType, - size, - filePath - } - }; - if (onCrawlItemComplete) { - onCrawlItemComplete(crawlFileSingleRes); - } - }); - // 存放保存文件 Promise , 后续等待即可回到 crawlFile 函数内部等待完成即可 - saveFilePendingQueue.push(saveFileItemPending); - } - else { - if (onCrawlItemComplete) { - onCrawlItemComplete(crawlFileSingleRes); - } - } -} -/* Create crawl API */ -function createCrawlPage(xCrawlConfig) { - let browser = null; - let createBrowserPending = null; - let haveCreateBrowser = false; - async function crawlPage(config, callback) { - // 创建浏览器 - if (!haveCreateBrowser) { - haveCreateBrowser = true; - createBrowserPending = puppeteer - .launch(xCrawlConfig.crawlPage?.launchBrowser) - .then((res) => { - browser = res; - }); - } - // 等待浏览器创建完毕 - if (createBrowserPending) { - await createBrowserPending; - // 防止对 createBrowserPending 重复赋值 - if (createBrowserPending) - createBrowserPending = null; - } - // 创建新配置 - const { detailTargets, intervalTime, onCrawlItemComplete } = createCrawlPageConfig(xCrawlConfig, config); - const extraConfig = { - errorPageMap: new Map(), - browser: browser, - intervalTime, - onCrawlItemComplete - }; - const crawlResArr = (await controller('page', xCrawlConfig.mode, detailTargets, extraConfig, pageSingleCrawlHandle, pageSingleResultHandle)); - const crawlRes = isArray(config) || (isObject(config) && Object.hasOwn(config, 'targets')) - ? crawlResArr - : crawlResArr[0]; - if (callback) { - callback(crawlRes); - } - return crawlRes; - } - return crawlPage; -} -function createCrawlData(xCrawlConfig) { - async function crawlData(config, callback) { - const { detailTargets, intervalTime, onCrawlItemComplete } = createCrawlDataConfig(xCrawlConfig, config); - function dataSingleResultHandle(detaileInfo, extraConfig) { - const { isSuccess, detailTargetRes } = detaileInfo; - const { onCrawlItemComplete } = extraConfig; - if (isSuccess && detailTargetRes) { - const contentType = detailTargetRes.headers['content-type'] ?? ''; - const data = contentType === 'application/json' - ? JSON.parse(detailTargetRes.data.toString()) - : contentType.includes('text') - ? detailTargetRes.data.toString() - : detailTargetRes.data; - detaileInfo.data = { ...detailTargetRes, data }; - } - const crawlDataSingleRes = detaileInfo; - if (onCrawlItemComplete) { - onCrawlItemComplete(crawlDataSingleRes); - } - } - const extraConfig = { - intervalTime, - onCrawlItemComplete - }; - const crawlResArr = (await controller('data', xCrawlConfig.mode, detailTargets, extraConfig, dataAndFileSingleCrawlHandle, dataSingleResultHandle)); - const crawlRes = isArray(config) || (isObject(config) && Object.hasOwn(config, 'targets')) - ? crawlResArr - : crawlResArr[0]; - if (callback) { - callback(crawlRes); - } - return crawlRes; - } - return crawlData; -} -function createCrawlFile(xCrawlConfig) { - async function crawlFile(config, callback) { - const { detailTargets, intervalTime, onBeforeSaveItemFile, onCrawlItemComplete } = createCrawlFileConfig(xCrawlConfig, config); - const extraConfig = { - saveFileErrorArr: [], - saveFilePendingQueue: [], - intervalTime, - onCrawlItemComplete, - onBeforeSaveItemFile - }; - const crawlResArr = (await controller('file', xCrawlConfig.mode, detailTargets, extraConfig, dataAndFileSingleCrawlHandle, fileSingleResultHandle)); - const { saveFilePendingQueue, saveFileErrorArr } = extraConfig; - // 等待保存文件完成 - await Promise.all(saveFilePendingQueue); - // 打印保存错误 - quickSort(saveFileErrorArr).forEach((item) => log(logError(item.message))); - // 统计保存 - const succssIds = []; - const errorIds = []; - crawlResArr.forEach((item) => { - if (item.data?.data.isSuccess) { - succssIds.push(item.id); - } - else { - errorIds.push(item.id); - } - }); - log('Save file final result:'); - log(logSuccess(` Success - total: ${succssIds.length}, ids: [ ${succssIds.join(' - ')} ]`)); - log(logError(` Error - total: ${errorIds.length}, ids: [ ${errorIds.join(' - ')} ]`)); - const crawlRes = isArray(config) || (isObject(config) && Object.hasOwn(config, 'targets')) - ? crawlResArr - : crawlResArr[0]; - if (callback) { - callback(crawlRes); - } - return crawlRes; - } - return crawlFile; -} -function startPolling(config, callback) { - const { d, h, m } = config; - const day = !isUndefined(d) ? d * 1000 * 60 * 60 * 24 : 0; - const hour = !isUndefined(h) ? h * 1000 * 60 * 60 : 0; - const minute = !isUndefined(m) ? m * 1000 * 60 : 0; - const total = day + hour + minute; - let count = 0; - startCallback(); - const intervalId = setInterval(startCallback, total); - function startCallback() { - console.log(logSuccess(`Start the ${logWarn.bold(++count)} polling`)); - callback(count, stopPolling); - } - function stopPolling() { - clearInterval(intervalId); - console.log(logSuccess(`Stop the polling`)); - } -} - -function loaderBaseConfig(baseConfig) { - const loaderBaseConfig = baseConfig ? baseConfig : {}; - if (isUndefined(loaderBaseConfig.mode)) { - loaderBaseConfig.mode = 'async'; - } - if (isUndefined(loaderBaseConfig.enableRandomFingerprint)) { - loaderBaseConfig.enableRandomFingerprint = true; - } - if (isUndefined(baseConfig?.timeout)) { - loaderBaseConfig.timeout = 10000; - } - if (isUndefined(baseConfig?.maxRetry)) { - loaderBaseConfig.maxRetry = 0; - } - return loaderBaseConfig; -} -function createnInstance(baseConfig) { - const instance = { - crawlPage: createCrawlPage(baseConfig), - crawlData: createCrawlData(baseConfig), - crawlFile: createCrawlFile(baseConfig), - startPolling - }; - return instance; -} -function xCrawl(baseConfig) { - const newBaseConfig = loaderBaseConfig(baseConfig); - const instance = createnInstance(newBaseConfig); - return instance; -} - -const testXCrawl = xCrawl({ - intervalTime: { max: 5000, min: 3000 } -}); -// testXCrawl.crawlPage({ -// targets: [ -// 'https://github.com/coder-hxl', -// { url: 'https://github.com/coder-hxl/x-crawl', fingerprint: null }, -// { -// url: 'https://github.com/coder-hxl/x-crawl/stargazers', -// fingerprint: { -// platform: 'Windows', -// mobile: 'random', -// userAgent: { -// value: -// 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59', -// versions: [ -// { -// name: 'Chrome', -// maxMajorVersion: 91, -// minMajorVersion: 88, -// maxMinorVersion: 10, -// maxPatchVersion: 5615 -// }, -// { name: 'Safari', maxMinorVersion: 36, maxPatchVersion: 2333 }, -// { name: 'Edg', maxMinorVersion: 10, maxPatchVersion: 864 } -// ] -// } -// } -// } -// ], -// fingerprints: [ -// { -// platform: 'Windows', -// mobile: 'random', -// userAgent: { -// value: -// 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', -// versions: [ -// { -// name: 'Chrome', -// maxMajorVersion: 112, -// minMajorVersion: 100, -// maxMinorVersion: 20, -// maxPatchVersion: 5000 -// }, -// { -// name: 'Safari', -// maxMajorVersion: 537, -// minMajorVersion: 500, -// maxMinorVersion: 36, -// maxPatchVersion: 5000 -// } -// ] -// } -// } -// ] -// }) -testXCrawl - .crawlPage({ - targets: [ - 'https://www.google.com/search?q=1', - 'https://github.com/coder-hxl' - ], - proxy: { - urls: ['https://www.npmjs.com/package/x-crawl', 'http://localhost:14892'], - switchByErrorCount: 1, - switchByHttpStatus: [200] - }, - maxRetry: 4 -}) - .then((res) => { - res.forEach((item, i) => { - console.log(item.proxyDetailes); - // item.data.page.screenshot({ path: `${i}page.jpg` }) - }); - res[0].data.browser.close(); -}); +"use strict";var e=require("node:fs"),t=require("node:fs/promises"),r=require("node:path"),n=require("puppeteer"),o=require("chalk"),a=require("node:http"),i=require("node:https"),s=require("node:url"),l=require("https-proxy-agent");function c(e,t=0){let r=Math.floor(Math.random()*e);for(;r1){const e=t?r:c(r.max,r.min);u(`Id: ${m(n)} - Crawl needs to sleep for ${m(e+"ms")} milliseconds before sending`),await function(e){return new Promise((t=>setTimeout(t,e)))}(e)}else u(`Id: ${m(n)} - Crawl does not need to sleep, send immediately`)}async function v(e,t,r){const{intervalTime:n}=t,o=!h(n),a=g(n),i=[];for(const s of e){const{id:e}=s;await x(o,a,n,e),i.push(r(s,t))}await Promise.all(i)}async function T(e,t,r){const{intervalTime:n}=t,o=!h(n),a=g(n);for(const i of e){const{id:e}=i;await x(o,a,n,e),await r(i,t)}}function C(e,t,r){const n=e[t];e[t]=e[r],e[r]=n}function S(e){if(1===e.length)return e;const t=Math.floor(e.length/2),r=S(e.slice(0,t)),n=S(e.slice(t)),o=[];let a=0,i=0;for(;a=n[i]?(o.push(r[a]),a++):(o.push(n[i]),i++);return ae.priority===r[0].priority))?S(r.map((e=>({...e,valueOf:()=>e.priority})))):r).map(((e,t)=>{const r=++t,{maxRetry:n,proxyDetails:o}=e,a=[];return{id:r,isHandle:!1,isSuccess:!1,isStatusNormal:!1,detailTargetConfig:e,detailTargetResult:null,maxRetry:n,retryCount:0,proxyDetails:o,crawlErrorQueue:a,result:{id:r,isSuccess:!1,maxRetry:n,retryCount:0,proxyDetails:o,crawlErrorQueue:a,data:null}}}));u(`${p("Start crawling")} - name: ${f(e)}, mode: ${f(t)}, total: ${m(a.length)} `);const i="async"===t?v:T;let s=0,l=a;for(;l.length;)if(await i(l,n,o),l=l.filter((e=>{const{isHandle:t,detailTargetConfig:r,proxyDetails:n,crawlErrorQueue:o,isStatusNormal:a}=e;let i=!1;if(!t&&(i=!0,n.length>=2)){const e=r.proxy?.switchByErrorCount;if(!a||!h(e)&&e>=o.length){n.find((e=>e.url===r.proxyUrl)).state=!1;const e=n.find((e=>e.state))?.url;h(e)||(r.proxyUrl=e)}}return i})),l.length){const e=l.map((e=>(e.retryCount++,e.id)));u(f(`Retry: ${++s} - Ids to retry: [ ${e.join(" - ")} ]`))}const c=[],g=[];return a.forEach((e=>{e.isSuccess?c.push(e.id):g.push(e.id)})),u("Crawl the final result:"),u(p(` Success - total: ${c.length}, ids: [ ${c.join(" - ")} ]`)),u(d(` Error - total: ${g.length}, ids: [ ${g.join(" - ")} ]`)),a.map((e=>e.result))}function $(e,t){let r=e?`${e}`:"?";if(t)for(const e in t){r+=`&${e}=${t[e]}`}else r=e;return r}function j(e){const{protocol:t,hostname:r,port:n,pathname:o,search:c}=new s.URL(e.url),u="http:"===t,m={agent:e.proxyUrl?l(e.proxyUrl):u?new a.Agent:new i.Agent,protocol:t,hostname:r,port:n,path:o,search:$(c,e.params),method:e.method?.toLocaleUpperCase()??"GET",headers:{},timeout:e.timeout};return m.headers=function(e,t){const r={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",...e.headers??{}};return"POST"===t.method&&e.data&&(r["Content-Type"]="application/json",r["Content-Length"]=Buffer.byteLength(e.data)),r}(e,m),m}function E(e){return new Promise(((t,r)=>{const n=h(e.data);e.data=n?e.data:JSON.stringify(e.data);const o=j(e);function s(e){const{statusCode:r,headers:n}=e,o=[];e.on("data",(e=>o.push(e))),e.on("end",(()=>{const e=Buffer.concat(o);t({statusCode:r,headers:n,data:e})}))}let l;l="http:"===o.protocol?a.request(o,s):i.request(o,s),l.on("timeout",(()=>{r(new Error(`Timeout ${e.timeout}ms`))})),l.on("error",(e=>{r(e)})),"POST"!==o.method||n||l.write(e.data),l.end()}))}const M=[{platform:"Windows",mobile:"random",userAgent:{value:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",versions:[{name:"Chrome",maxMajorVersion:112,minMajorVersion:100,maxMinorVersion:10,maxPatchVersion:5615},{name:"Safari",maxMinorVersion:36,maxPatchVersion:2333}]}},{platform:"Windows",mobile:"random",userAgent:{value:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59",versions:[{name:"Chrome",maxMajorVersion:91,minMajorVersion:88,maxMinorVersion:10,maxPatchVersion:5615},{name:"Safari",maxMinorVersion:36,maxPatchVersion:2333},{name:"Edg",maxMinorVersion:10,maxPatchVersion:864}]}},{platform:"Windows",mobile:"random",userAgent:{value:"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0",versions:[{name:"Firefox",maxMajorVersion:47,minMajorVersion:43,maxMinorVersion:10,maxPatchVersion:5e3}]}}];function R(e){return y(e)?e.map((e=>w(e)?e:{url:e})):[w(e)?e:{url:e}]}function P(e,t){const{ua:r,platform:n,platformVersion:o,mobile:a,acceptLanguage:i,userAgent:s}=t;let l=e.headers;if(l||(e.headers=l={}),r&&(l["sec-ch-ua"]=r),a&&(l["sec-ch-ua-mobile"]="random"===a?c(2)?"?1":"?0":a),n&&(l["sec-ch-platform"]=n),o&&(l["sec-ch-ua-platform-version"]=o),i&&(l["accept-language"]=i),s){let e=s.value;s.versions?.forEach((t=>{const{name:r,maxMajorVersion:n,minMajorVersion:o,maxMinorVersion:a,minMinorVersion:i,maxPatchVersion:s,minPatchVersion:l}=t,u=e.split(`${r}/`)[1].split(" ")[0].split("."),m=u.join(".");h(n)||(u[0]=n===o?n:c(n,o)),h(a)||(u[1]=a===i?a:c(a,i)),h(s)||(u[2]=s===l?s:c(s,l));const p=`${r}/${m}`,d=`${r}/${u.join(".")}`;e=e.replace(p,d)})),l["user-agent"]=e}}function V(e,t){const{maxWidth:r,minWidth:n,maxHeight:o,minHidth:a}=t,i=e.viewport??{};r&&(i.width=r===n?r:c(r,n)),o&&(i.height=o===a?o:c(o,a)),Object.hasOwn(i,"width")&&Object.hasOwn(i,"height")&&(e.viewport=i)}function F(e,t,r){r.detailTargets=t.detailTargets.map((n=>{const o=n,{url:a,timeout:i,proxy:s,maxRetry:l,priority:u,headers:m,fingerprint:p}=o;if(h(e.baseUrl)||(o.url=e.baseUrl+a),h(i)&&(h(t.timeout)?o.timeout=e.timeout:o.timeout=t.timeout),h(l)&&(h(t.maxRetry)?o.maxRetry=e.maxRetry:o.maxRetry=t.maxRetry),h(s)&&(h(t.proxy)?h(e.proxy)||(o.proxy=e.proxy):o.proxy=t.proxy),!h(o.proxy?.urls)){const e=o.proxy.urls;o.proxyUrl=e[0],o.proxyDetails=e.map((e=>({url:e,state:!0})))}if(h(u)&&(o.priority=0),h(m)&&t.headers&&(o.headers={...t.headers}),p)P(o,p);else if(h(p)&&y(t.fingerprints)&&t.fingerprints.length){const e=t.fingerprints,n=c(e.length),a=e[n];r.selectFingerprintIndexs.push(n),P(o,a)}else if(h(p)&&!y(t.fingerprints)&&e.enableRandomFingerprint){P(o,M[c(M.length)])}return o})),r.intervalTime=t.intervalTime,h(t.intervalTime)&&!h(e.intervalTime)&&(r.intervalTime=e.intervalTime),r.onCrawlItemComplete=t.onCrawlItemComplete}async function O(e,t){const{detailTargetConfig:r,detailTargetResult:n,retryCount:o,maxRetry:a,crawlErrorQueue:i}=e,{browser:s}=t,l=o===a,c=n?.page??await s.newPage();r.viewport&&await c.setViewport(r.viewport);let u=null,m=!0;try{if(r.proxyUrl?await s.createIncognitoBrowserContext({proxyServer:r.proxyUrl}):await s.createIncognitoBrowserContext({proxyServer:void 0}),r.cookies){const e=function(e,t){const r=[];return"string"==typeof t?t.split("; ").forEach((t=>{const n=t.split("=");r.push({name:n[0],value:n[1],url:e})})):Array.isArray(t)?t.forEach((t=>{t.url||(t.url=e),r.push(t)})):"object"==typeof t&&t&&(t.url||(t.url=e),r.push(t)),r}(r.url,r.cookies);await c.setCookie(...e)}else{const e=await c.cookies(r.url);await c.deleteCookie(...e)}r.headers&&await c.setExtraHTTPHeaders(r.headers),u=await c.goto(r.url,{timeout:r.timeout})}catch(e){m=!1,i.push(e)}e.detailTargetResult={response:u,page:c};const p=!b(e),d=m&&p;return e.isStatusNormal=p,e.isSuccess=d,(d||l)&&(e.isHandle=!0,function(e,t){const{detailTargetResult:r,result:n}=e,{browser:o,onCrawlItemComplete:a}=t;D(e),n.data={browser:o,...r},a&&a(e.result)}(e,t)),{response:u,page:c}}async function k(n,o){const{detailTargetConfig:a,crawlErrorQueue:i,maxRetry:s,retryCount:l}=n,c=s===l;let u=null,m=!0;try{u=await E(a)}catch(e){m=!1,i.push(e)}n.detailTargetResult=u;const p=!b(n),d=m&&p;return n.isStatusNormal=p,n.isSuccess=d,(d||c)&&(n.isHandle=!0,"data"===o.type?function(e,t){const{isSuccess:r,detailTargetResult:n,result:o}=e,{onCrawlItemComplete:a}=t;if(D(e),r&&n){const e=n.headers["content-type"]??"",t="application/json"===e?JSON.parse(n.data.toString()):e.includes("text")?n.data.toString():n.data;o.data={...n,data:t}}a&&a(o)}(n,o):"file"===o.type&&function(n,o){const{id:a,isSuccess:i,detailTargetConfig:s,detailTargetResult:l,result:c}=n,{saveFileErrorArr:u,saveFilePendingQueue:m,onCrawlItemComplete:p,onBeforeSaveItemFile:d}=o;if(D(n),i&&l){const o=l.headers["content-type"]??"",i=s.fileName??`${a}-${(new Date).getTime()}`,h=s.extension??`.${o.split("/").pop()}`;s.storeDir&&!e.existsSync(s.storeDir)&&(f=s.storeDir,r.resolve(f).split(r.sep).reduce(((t,n,o)=>{const a=0!==o?r.join(t,n):n;return e.existsSync(a)||e.mkdirSync(a),a}),""));const g=s.storeDir??__dirname,w=r.resolve(g,i+h),y=l.data;let x=Promise.resolve(y);d&&(x=d({id:a,fileName:i,filePath:w,data:y}));const v=x.then((async e=>{let r=!0;try{await t.writeFile(w,e)}catch(e){r=!1;const t=`File save error at id ${a}: ${e.message}`,n=()=>a;u.push({message:t,valueOf:n})}const s=e.length;c.data={...l,data:{isSuccess:r,fileName:i,fileExtension:h,mimeType:o,size:s,filePath:w}},p&&p(n.result)}));m.push(v)}else p&&p(n.result);var f}(n,o)),await E(a)}const A=["isSuccess","retryCount"];function D(e){Object.keys(e).forEach((t=>{A.includes(t)&&(e.result[t]=e[t])}))}function W(e){let t=null,r=null,o=!1;return async function(a,i){o||(o=!0,r=n.launch(e.crawlPage?.launchBrowser).then((e=>{t=e}))),r&&(await r,r&&(r=null));const{detailTargets:s,intervalTime:l,onCrawlItemComplete:c}=function(e,t){const r={detailTargets:[],intervalTime:void 0,selectFingerprintIndexs:[],onCrawlItemComplete:void 0};let n={targets:[],detailTargets:[]};if(w(t)&&Object.hasOwn(t,"targets")){const{targets:e}=t;n=t,n.detailTargets=R(e)}else n.detailTargets=R(t);return F(e,n,r),r.detailTargets.forEach(((e,t)=>{const{cookies:o,viewport:a,fingerprint:i}=e;if(h(o)&&n.cookies&&(e.cookies=n.cookies),h(a)&&n.viewport&&(e.viewport=n.viewport),i)V(e,i);else if(h(i)&&n.fingerprints?.length){const o=r.selectFingerprintIndexs[t];V(e,n.fingerprints[o])}})),r}(e,a),u={browser:t,intervalTime:l,onCrawlItemComplete:c},m=await I("page",e.mode,s,u,O),p=y(a)||w(a)&&Object.hasOwn(a,"targets")?m:m[0];return i&&i(p),p}}function B(e){return async function(t,r){const{detailTargets:n,intervalTime:o,onCrawlItemComplete:a}=function(e,t){const r={detailTargets:[],intervalTime:void 0,selectFingerprintIndexs:[],onCrawlItemComplete:void 0};let n={targets:[],detailTargets:[]};if(w(t)&&Object.hasOwn(t,"targets")){const{targets:e}=t;n=t,n.detailTargets=R(e)}else n.detailTargets=R(t);return F(e,n,r),r}(e,t),i={type:"data",intervalTime:o,onCrawlItemComplete:a},s=await I("data",e.mode,n,i,k),l=y(t)||w(t)&&Object.hasOwn(t,"targets")?s:s[0];return r&&r(l),l}}function N(e){return async function(t,r){const{detailTargets:n,intervalTime:o,onBeforeSaveItemFile:a,onCrawlItemComplete:i}=function(e,t){const r={detailTargets:[],intervalTime:void 0,selectFingerprintIndexs:[],onBeforeSaveItemFile:void 0,onCrawlItemComplete:void 0};let n={targets:[],detailTargets:[]};if(w(t)&&Object.hasOwn(t,"targets")){const{targets:e}=t;n=t,n.detailTargets=R(e)}else n.detailTargets=y(t)?t:[t];F(e,n,r);const o=!h(n?.storeDir),a=!h(n?.extension);return r.detailTargets.forEach((e=>{h(e.storeDir)&&o&&(e.storeDir=n.storeDir),h(e.extension)&&a&&(e.extension=n.extension)})),r.onBeforeSaveItemFile=n.onBeforeSaveItemFile,r}(e,t),s={type:"file",saveFileErrorArr:[],saveFilePendingQueue:[],intervalTime:o,onCrawlItemComplete:i,onBeforeSaveItemFile:a},l=await I("file",e.mode,n,s,k),{saveFilePendingQueue:c,saveFileErrorArr:m}=s;var f;await Promise.all(c),(f=m,function e(t,r){if(t>=r)return;const n=f[r];let o=t,a=r-1;for(;o<=a;){for(;f[o]n;)a--;o<=a&&(C(f,o,a),o++,a--)}C(f,o,r),e(t,o-1),e(o+1,r)}(0,f.length-1),f).forEach((e=>u(d(e.message))));const g=[],x=[];l.forEach((e=>{e.data?.data.isSuccess?g.push(e.id):x.push(e.id)})),u("Save file final result:"),u(p(` Success - total: ${g.length}, ids: [ ${g.join(" - ")} ]`)),u(d(` Error - total: ${x.length}, ids: [ ${x.join(" - ")} ]`));const v=y(t)||w(t)&&Object.hasOwn(t,"targets")?l:l[0];return r&&r(v),v}}function H(e,t){const{d:r,h:n,m:o}=e,a=(h(r)?0:1e3*r*60*60*24)+(h(n)?0:1e3*n*60*60)+(h(o)?0:1e3*o*60);let i=0;l();const s=setInterval(l,a);function l(){console.log(p(`Start the ${f.bold(++i)} polling`)),t(i,c)}function c(){clearInterval(s),console.log(p("Stop the polling"))}}const q=function(e){const t=function(e){const t=e||{};return h(t.mode)&&(t.mode="async"),h(t.enableRandomFingerprint)&&(t.enableRandomFingerprint=!0),h(e?.timeout)&&(t.timeout=1e4),h(e?.maxRetry)&&(t.maxRetry=0),t}(e);return function(e){return{crawlPage:W(e),crawlData:B(e),crawlFile:N(e),startPolling:H}}(t)}({intervalTime:{max:5e3,min:3e3}});q.crawlPage({targets:["https://www.google.com","https://github.com/coder-hxl"],proxy:{urls:["http://localhost:14897","http://localhost:14892"],switchByErrorCount:1},maxRetry:3}).then((e=>{console.log("================== res =================="),console.log(e),e.forEach(((e,t)=>{console.log(e.proxyDetails)})),e[0].data.browser.close()})); diff --git a/test/start/index.ts b/test/start/index.ts index 019f2802..cc156c59 100644 --- a/test/start/index.ts +++ b/test/start/index.ts @@ -63,22 +63,19 @@ const testXCrawl = xCrawl({ testXCrawl .crawlPage({ - targets: [ - 'https://www.google.com/search?q=1', - 'https://github.com/coder-hxl' - ], + targets: ['https://www.google.com', 'https://github.com/coder-hxl'], proxy: { - urls: ['https://www.npmjs.com/package/x-crawl', 'http://localhost:14892'], - switchByErrorCount: 1, - switchByHttpStatus: [200] + urls: ['http://localhost:14897', 'http://localhost:14892'], + switchByErrorCount: 1 }, - maxRetry: 4 + maxRetry: 3 }) .then((res) => { console.log('================== res ==================') + console.log(res) res.forEach((item, i) => { - console.log(item.proxyDetailes) + console.log(item.proxyDetails) // item.data.page.screenshot({ path: `${i}page.jpg` }) }) From 423a7d0d468f22fc879cdf77883a78c275e8f8b2 Mon Sep 17 00:00:00 2001 From: coderhxl Date: Mon, 24 Apr 2023 20:28:33 +0800 Subject: [PATCH 07/17] Feat: Terminal Prompt --- src/api.ts | 14 +++++++------- src/batchCrawl.ts | 8 ++------ src/controller.ts | 19 ++++++++++++------- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/api.ts b/src/api.ts index ee8dcd55..f8f5c219 100644 --- a/src/api.ts +++ b/src/api.ts @@ -1136,19 +1136,19 @@ export function createCrawlFile(xCrawlConfig: LoaderXCrawlConfig) { errorIds.push(item.id) } }) - log('Save file final result:') + log('Save statistics for the targets:') log( logSuccess( - ` Success - total: ${succssIds.length}, ids: [ ${succssIds.join( - ' - ' - )} ]` + ` Success - target total: ${ + succssIds.length + }, targets id: [ ${succssIds.join(', ')} ]` ) ) log( logError( - ` Error - total: ${errorIds.length}, ids: [ ${errorIds.join( - ' - ' - )} ]` + ` Error - target total: ${ + errorIds.length + }, targets id: [ ${errorIds.join(', ')} ]` ) ) diff --git a/src/batchCrawl.ts b/src/batchCrawl.ts index 93a35090..99f67dc4 100644 --- a/src/batchCrawl.ts +++ b/src/batchCrawl.ts @@ -14,15 +14,11 @@ async function useSleepByBatch( ? intervalTime : random(intervalTime.max, intervalTime.min) - log( - `Id: ${logNumber(id)} - Crawl needs to sleep for ${logNumber( - timeout + 'ms' - )} milliseconds before sending` - ) + log(`Target id: ${logNumber(id)} - sleep: ${logNumber(timeout + 'ms')}`) await sleep(timeout) } else { - log(`Id: ${logNumber(id)} - Crawl does not need to sleep, send immediately`) + log(`Target id: ${logNumber(id)} - sleep: ${logNumber('0ms')}`) } } diff --git a/src/controller.ts b/src/controller.ts index fb2ee51d..e750ef8b 100644 --- a/src/controller.ts +++ b/src/controller.ts @@ -138,7 +138,7 @@ export async function controller< log( `${logSuccess(`Start crawling`)} - name: ${logWarn(name)}, mode: ${logWarn( mode - )}, total: ${logNumber(devices.length)} ` + )}, target total: ${logNumber(devices.length)} ` ) // 选择爬取模式 @@ -203,8 +203,11 @@ export async function controller< return item.id }) + log( - logWarn(`Retry: ${++i} - Ids to retry: [ ${retriedIds.join(' - ')} ]`) + logWarn( + `Start retrying: ${++i} - Targets id: [ ${retriedIds.join(' - ')} ]` + ) ) } } @@ -220,17 +223,19 @@ export async function controller< } }) - log('Crawl the final result:') + log('Crawl statistics of the targets:') log( logSuccess( - ` Success - total: ${succssIds.length}, ids: [ ${succssIds.join( - ' - ' - )} ]` + ` Success - target total: ${ + succssIds.length + }, targets id: [ ${succssIds.join(', ')} ]` ) ) log( logError( - ` Error - total: ${errorIds.length}, ids: [ ${errorIds.join(' - ')} ]` + ` Error - target total: ${ + errorIds.length + }, targets id: [ ${errorIds.join(', ')} ]` ) ) From f2dbc11e6b7ccdf45b3c0f9a926010346471edf4 Mon Sep 17 00:00:00 2001 From: coderhxl Date: Tue, 25 Apr 2023 08:49:40 +0800 Subject: [PATCH 08/17] Chore: Remove the return value of a single crawl function --- src/api.ts | 6 +----- src/batchCrawl.ts | 4 ++-- src/controller.ts | 2 +- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/api.ts b/src/api.ts index f8f5c219..10fc9060 100644 --- a/src/api.ts +++ b/src/api.ts @@ -684,7 +684,7 @@ function createCrawlFileConfig( async function pageSingleCrawlHandle( device: Device, extraConfig: ExtraPageConfig -): Promise { +) { const { detailTargetConfig, detailTargetResult, @@ -752,8 +752,6 @@ async function pageSingleCrawlHandle( pageSingleResultHandle(device, extraConfig) } - - return { response, page } } async function dataAndFileSingleCrawlHandle( @@ -790,8 +788,6 @@ async function dataAndFileSingleCrawlHandle( fileSingleResultHandle(device, extraConfig as ExtraFileConfig) } } - - return await request(detailTargetConfig) } /* Single result handle */ diff --git a/src/batchCrawl.ts b/src/batchCrawl.ts index 99f67dc4..fe52605f 100644 --- a/src/batchCrawl.ts +++ b/src/batchCrawl.ts @@ -29,7 +29,7 @@ export async function asyncBatchCrawl< >( devices: Device[], extraConfig: E, - singleCrawlHandle: (device: Device, extraConfig: E) => Promise + singleCrawlHandle: (device: Device, extraConfig: E) => Promise ) { const { intervalTime } = extraConfig @@ -61,7 +61,7 @@ export async function syncBatchCrawl< >( devices: Device[], extraConfig: E, - singleCrawlHandle: (device: Device, extraConfig: E) => Promise + singleCrawlHandle: (device: Device, extraConfig: E) => Promise ) { const { intervalTime } = extraConfig diff --git a/src/controller.ts b/src/controller.ts index e750ef8b..70cf579d 100644 --- a/src/controller.ts +++ b/src/controller.ts @@ -85,7 +85,7 @@ export async function controller< mode: 'async' | 'sync', detailTargets: T[], extraConfig: E, - singleCrawlHandle: (device: Device, extraConfig: E) => Promise + singleCrawlHandle: (device: Device, extraConfig: E) => Promise ) { // 是否使用优先爬取 const isPriorityCrawl = !detailTargets.every( From d840e70c802d3160c9d404585a65b89af1d245c7 Mon Sep 17 00:00:00 2001 From: coderhxl Date: Tue, 25 Apr 2023 09:01:53 +0800 Subject: [PATCH 09/17] Feat: Type and internal value name changes --- src/api.ts | 130 ++++++++++++++++++++++----------------------- src/controller.ts | 10 ++-- src/types/api.ts | 14 ++--- src/types/index.ts | 50 ++++++++--------- src/utils.ts | 8 +-- 5 files changed, 106 insertions(+), 106 deletions(-) diff --git a/src/api.ts b/src/api.ts index 10fc9060..ac5def16 100644 --- a/src/api.ts +++ b/src/api.ts @@ -23,11 +23,11 @@ import { CrawlFileDetailTargetConfig, CrawlPageDetailTargetConfig, PageCookies, - CrawlPageSingleRes, + CrawlPageSingleResult, StartPollingConfig, CrawlPageAdvancedConfig, - CrawlDataSingleRes, - CrawlFileSingleRes, + CrawlDataSingleResult, + CrawlFileSingleResult, CrawlFileAdvancedConfig, CrawlDataAdvancedConfig, IntervalTime, @@ -50,7 +50,7 @@ export interface ExtraDataAndFileCommonConfig { interface ExtraPageConfig extends ExtraCommonConfig { browser: Browser onCrawlItemComplete: - | ((crawlPageSingleRes: CrawlPageSingleRes) => void) + | ((crawlPageSingleRes: CrawlPageSingleResult) => void) | undefined } @@ -58,7 +58,7 @@ interface ExtraDataConfig extends ExtraCommonConfig, ExtraDataAndFileCommonConfig { onCrawlItemComplete: - | ((crawlDataSingleRes: CrawlDataSingleRes) => void) + | ((crawlDataSingleRes: CrawlDataSingleResult) => void) | undefined } @@ -68,7 +68,7 @@ interface ExtraFileConfig saveFileErrorArr: { message: string; valueOf: () => number }[] saveFilePendingQueue: Promise[] onCrawlItemComplete: - | ((crawlFileSingleRes: CrawlFileSingleRes) => void) + | ((crawlFileSingleRes: CrawlFileSingleResult) => void) | undefined onBeforeSaveItemFile: | ((info: { @@ -135,7 +135,7 @@ interface CrawlPageConfig { selectFingerprintIndexs: number[] onCrawlItemComplete: - | ((crawlPageSingleRes: CrawlPageSingleRes) => void) + | ((crawlPageSingleRes: CrawlPageSingleResult) => void) | undefined } @@ -146,7 +146,7 @@ interface CrawlDataConfig { selectFingerprintIndexs: number[] onCrawlItemComplete: - | ((crawlDataSingleRes: CrawlDataSingleRes) => void) + | ((crawlDataSingleRes: CrawlDataSingleResult) => void) | undefined } @@ -165,7 +165,7 @@ interface CrawlFileConfig { }) => Promise) | undefined onCrawlItemComplete: - | ((crawlDataSingleRes: CrawlDataSingleRes) => void) + | ((crawlDataSingleRes: CrawlDataSingleResult) => void) | undefined } @@ -813,7 +813,7 @@ function pageSingleResultHandle( result.data = { browser, ...detailTargetResult } if (onCrawlItemComplete) { - onCrawlItemComplete(device.result as CrawlPageSingleRes) + onCrawlItemComplete(device.result as CrawlPageSingleResult) } } @@ -840,7 +840,7 @@ function dataSingleResultHandle( } if (onCrawlItemComplete) { - onCrawlItemComplete(result as CrawlDataSingleRes) + onCrawlItemComplete(result as CrawlDataSingleResult) } } @@ -917,7 +917,7 @@ function fileSingleResultHandle( } if (onCrawlItemComplete) { - onCrawlItemComplete(device.result as CrawlFileSingleRes) + onCrawlItemComplete(device.result as CrawlFileSingleResult) } }) @@ -925,7 +925,7 @@ function fileSingleResultHandle( saveFilePendingQueue.push(saveFileItemPending) } else { if (onCrawlItemComplete) { - onCrawlItemComplete(device.result as CrawlFileSingleRes) + onCrawlItemComplete(device.result as CrawlFileSingleResult) } } } @@ -939,35 +939,35 @@ export function createCrawlPage(xCrawlConfig: LoaderXCrawlConfig) { function crawlPage( config: string, - callback?: (res: CrawlPageSingleRes) => void - ): Promise + callback?: (result: CrawlPageSingleResult) => void + ): Promise function crawlPage( config: CrawlPageDetailTargetConfig, - callback?: (res: CrawlPageSingleRes) => void - ): Promise + callback?: (result: CrawlPageSingleResult) => void + ): Promise function crawlPage( config: (string | CrawlPageDetailTargetConfig)[], - callback?: (res: CrawlPageSingleRes[]) => void - ): Promise + callback?: (result: CrawlPageSingleResult[]) => void + ): Promise function crawlPage( config: CrawlPageAdvancedConfig, - callback?: (res: CrawlPageSingleRes[]) => void - ): Promise + callback?: (result: CrawlPageSingleResult[]) => void + ): Promise async function crawlPage( config: UniteCrawlPageConfig, - callback?: (res: any) => void - ): Promise { + callback?: (result: any) => void + ): Promise { // 创建浏览器 if (!haveCreateBrowser) { haveCreateBrowser = true createBrowserPending = puppeteer .launch(xCrawlConfig.crawlPage?.launchBrowser) - .then((res) => { - browser = res + .then((result) => { + browser = result }) } @@ -988,24 +988,24 @@ export function createCrawlPage(xCrawlConfig: LoaderXCrawlConfig) { onCrawlItemComplete } - const crawlResArr = (await controller( + const crawlResultArr = (await controller( 'page', xCrawlConfig.mode, detailTargets, extraConfig, pageSingleCrawlHandle - )) as CrawlPageSingleRes[] + )) as CrawlPageSingleResult[] - const crawlRes = + const crawlResult = isArray(config) || (isObject(config) && Object.hasOwn(config, 'targets')) - ? crawlResArr - : crawlResArr[0] + ? crawlResultArr + : crawlResultArr[0] if (callback) { - callback(crawlRes) + callback(crawlResult) } - return crawlRes + return crawlResult } return crawlPage @@ -1014,28 +1014,28 @@ export function createCrawlPage(xCrawlConfig: LoaderXCrawlConfig) { export function createCrawlData(xCrawlConfig: LoaderXCrawlConfig) { function crawlData( config: string, - callback?: (res: CrawlDataSingleRes) => void - ): Promise> + callback?: (result: CrawlDataSingleResult) => void + ): Promise> function crawlData( config: CrawlDataDetailTargetConfig, - callback?: (res: CrawlDataSingleRes) => void - ): Promise> + callback?: (result: CrawlDataSingleResult) => void + ): Promise> function crawlData( config: (string | CrawlDataDetailTargetConfig)[], - callback?: (res: CrawlDataSingleRes[]) => void - ): Promise[]> + callback?: (result: CrawlDataSingleResult[]) => void + ): Promise[]> function crawlData( config: CrawlDataAdvancedConfig, - callback?: (res: CrawlDataSingleRes[]) => void - ): Promise[]> + callback?: (result: CrawlDataSingleResult[]) => void + ): Promise[]> async function crawlData( config: UniteCrawlDataConfig, - callback?: (res: any) => void - ): Promise | CrawlDataSingleRes[]> { + callback?: (result: any) => void + ): Promise | CrawlDataSingleResult[]> { const { detailTargets, intervalTime, onCrawlItemComplete } = createCrawlDataConfig(xCrawlConfig, config) @@ -1045,24 +1045,24 @@ export function createCrawlData(xCrawlConfig: LoaderXCrawlConfig) { onCrawlItemComplete } - const crawlResArr = (await controller( + const crawlResultArr = (await controller( 'data', xCrawlConfig.mode, detailTargets, extraConfig, dataAndFileSingleCrawlHandle - )) as CrawlDataSingleRes[] + )) as CrawlDataSingleResult[] - const crawlRes = + const crawlResult = isArray(config) || (isObject(config) && Object.hasOwn(config, 'targets')) - ? crawlResArr - : crawlResArr[0] + ? crawlResultArr + : crawlResultArr[0] if (callback) { - callback(crawlRes) + callback(crawlResult) } - return crawlRes + return crawlResult } return crawlData @@ -1071,23 +1071,23 @@ export function createCrawlData(xCrawlConfig: LoaderXCrawlConfig) { export function createCrawlFile(xCrawlConfig: LoaderXCrawlConfig) { function crawlFile( config: CrawlFileDetailTargetConfig, - callback?: (res: CrawlFileSingleRes) => void - ): Promise + callback?: (result: CrawlFileSingleResult) => void + ): Promise function crawlFile( config: CrawlFileDetailTargetConfig[], - callback?: (res: CrawlFileSingleRes[]) => void - ): Promise + callback?: (result: CrawlFileSingleResult[]) => void + ): Promise function crawlFile( config: CrawlFileAdvancedConfig, - callback?: (res: CrawlFileSingleRes[]) => void - ): Promise + callback?: (result: CrawlFileSingleResult[]) => void + ): Promise async function crawlFile( config: UniteCrawlFileConfig, - callback?: (res: any) => void - ): Promise { + callback?: (result: any) => void + ): Promise { const { detailTargets, intervalTime, @@ -1106,13 +1106,13 @@ export function createCrawlFile(xCrawlConfig: LoaderXCrawlConfig) { onBeforeSaveItemFile } - const crawlResArr = (await controller( + const crawlResultArr = (await controller( 'file', xCrawlConfig.mode, detailTargets, extraConfig, dataAndFileSingleCrawlHandle - )) as CrawlFileSingleRes[] + )) as CrawlFileSingleResult[] const { saveFilePendingQueue, saveFileErrorArr } = extraConfig @@ -1125,7 +1125,7 @@ export function createCrawlFile(xCrawlConfig: LoaderXCrawlConfig) { // 统计保存 const succssIds: number[] = [] const errorIds: number[] = [] - crawlResArr.forEach((item) => { + crawlResultArr.forEach((item) => { if (item.data?.data.isSuccess) { succssIds.push(item.id) } else { @@ -1148,16 +1148,16 @@ export function createCrawlFile(xCrawlConfig: LoaderXCrawlConfig) { ) ) - const crawlRes = + const crawlResult = isArray(config) || (isObject(config) && Object.hasOwn(config, 'targets')) - ? crawlResArr - : crawlResArr[0] + ? crawlResultArr + : crawlResultArr[0] if (callback) { - callback(crawlRes) + callback(crawlResult) } - return crawlRes + return crawlResult } return crawlFile diff --git a/src/controller.ts b/src/controller.ts index 70cf579d..83d07321 100644 --- a/src/controller.ts +++ b/src/controller.ts @@ -20,14 +20,14 @@ import { } from './utils' import { HTTPResponse } from 'puppeteer' import { Request } from './request' -import { CrawlCommonRes } from './types/api' +import { CrawlCommonResult } from './types/api' export type CrawlDetail = | LoaderCrawlPageDetail | LoaderCrawlDataDetail | LoaderCrawlFileDetail -interface DeviceResult extends CrawlCommonRes { +interface DeviceResult extends CrawlCommonResult { data: any } @@ -67,13 +67,13 @@ export function isCrawlStatusInHttpStatus(device: Device) { status = (detailTargetResult as any as Request).statusCode ?? null } - let res = false + let result = false const switchByHttpStatus = detailTargetConfig.proxy?.switchByHttpStatus if (status && switchByHttpStatus && switchByHttpStatus.includes(status)) { - res = true + result = true } - return res + return result } export async function controller< diff --git a/src/types/api.ts b/src/types/api.ts index b597dbf7..2ad5c43e 100644 --- a/src/types/api.ts +++ b/src/types/api.ts @@ -130,7 +130,7 @@ export interface CrawlPageAdvancedConfig extends CrawlCommonConfig { cookies?: PageCookies viewport?: Viewport - onCrawlItemComplete?: (crawlPageSingleRes: CrawlPageSingleRes) => void + onCrawlItemComplete?: (crawlPageSingleRes: CrawlPageSingleResult) => void } export interface CrawlDataAdvancedConfig extends CrawlCommonConfig { @@ -140,7 +140,7 @@ export interface CrawlDataAdvancedConfig extends CrawlCommonConfig { headers?: AnyObject - onCrawlItemComplete?: (crawlDataSingleRes: CrawlDataSingleRes) => void + onCrawlItemComplete?: (crawlDataSingleRes: CrawlDataSingleResult) => void } export interface CrawlFileAdvancedConfig extends CrawlCommonConfig { @@ -152,7 +152,7 @@ export interface CrawlFileAdvancedConfig extends CrawlCommonConfig { storeDir?: string extension?: string - onCrawlItemComplete?: (crawlFileSingleRes: CrawlFileSingleRes) => void + onCrawlItemComplete?: (crawlFileSingleRes: CrawlFileSingleResult) => void onBeforeSaveItemFile?: (info: { id: number fileName: string @@ -168,7 +168,7 @@ export interface StartPollingConfig { } /* API Result */ -export interface CrawlCommonRes { +export interface CrawlCommonResult { id: number isSuccess: boolean maxRetry: number @@ -177,7 +177,7 @@ export interface CrawlCommonRes { crawlErrorQueue: Error[] } -export interface CrawlPageSingleRes extends CrawlCommonRes { +export interface CrawlPageSingleResult extends CrawlCommonResult { data: { browser: Browser response: HTTPResponse | null @@ -185,7 +185,7 @@ export interface CrawlPageSingleRes extends CrawlCommonRes { } } -export interface CrawlDataSingleRes extends CrawlCommonRes { +export interface CrawlDataSingleResult extends CrawlCommonResult { data: { statusCode: number | undefined headers: IncomingHttpHeaders @@ -193,7 +193,7 @@ export interface CrawlDataSingleRes extends CrawlCommonRes { } | null } -export interface CrawlFileSingleRes extends CrawlCommonRes { +export interface CrawlFileSingleResult extends CrawlCommonResult { data: { statusCode: number | undefined headers: IncomingHttpHeaders diff --git a/src/types/index.ts b/src/types/index.ts index d6e22f5e..eb6ff1f4 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -2,9 +2,9 @@ import { PuppeteerLaunchOptions } from 'puppeteer' import { StartPollingConfig, IntervalTime, - CrawlPageSingleRes, - CrawlDataSingleRes, - CrawlFileSingleRes, + CrawlPageSingleResult, + CrawlDataSingleResult, + CrawlFileSingleResult, CrawlFileAdvancedConfig, CrawlFileDetailTargetConfig, CrawlDataDetailTargetConfig, @@ -35,62 +35,62 @@ export interface XCrawlInstance { crawlPage: { ( config: string, - callback?: (res: CrawlPageSingleRes) => void - ): Promise + callback?: (result: CrawlPageSingleResult) => void + ): Promise ( config: CrawlPageDetailTargetConfig, - callback?: (res: CrawlPageSingleRes) => void - ): Promise + callback?: (result: CrawlPageSingleResult) => void + ): Promise ( config: (string | CrawlPageDetailTargetConfig)[], - callback?: (res: CrawlPageSingleRes[]) => void - ): Promise + callback?: (result: CrawlPageSingleResult[]) => void + ): Promise ( config: CrawlPageAdvancedConfig, - callback?: (res: CrawlPageSingleRes[]) => void - ): Promise + callback?: (result: CrawlPageSingleResult[]) => void + ): Promise } crawlData: { ( config: CrawlDataDetailTargetConfig, - callback?: (res: CrawlDataSingleRes) => void - ): Promise> + callback?: (result: CrawlDataSingleResult) => void + ): Promise> ( config: string, - callback?: (res: CrawlDataSingleRes) => void - ): Promise> + callback?: (result: CrawlDataSingleResult) => void + ): Promise> ( config: (string | CrawlDataDetailTargetConfig)[], - callback?: (res: CrawlDataSingleRes[]) => void - ): Promise[]> + callback?: (result: CrawlDataSingleResult[]) => void + ): Promise[]> ( config: CrawlDataAdvancedConfig, - callback?: (res: CrawlDataSingleRes[]) => void - ): Promise[]> + callback?: (result: CrawlDataSingleResult[]) => void + ): Promise[]> } crawlFile: { ( config: CrawlFileDetailTargetConfig, - callback?: (res: CrawlFileSingleRes) => void - ): Promise + callback?: (result: CrawlFileSingleResult) => void + ): Promise ( config: CrawlFileDetailTargetConfig[], - callback?: (res: CrawlFileSingleRes[]) => void - ): Promise + callback?: (result: CrawlFileSingleResult[]) => void + ): Promise ( config: CrawlFileAdvancedConfig, - callback?: (res: CrawlFileSingleRes[]) => void - ): Promise + callback?: (result: CrawlFileSingleResult[]) => void + ): Promise } startPolling: ( diff --git a/src/utils.ts b/src/utils.ts index ec8f15a2..e8eb46a5 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -7,13 +7,13 @@ export function sleep(timeout: number) { } export function random(max: number, min = 0) { - let res = Math.floor(Math.random() * max) + let result = Math.floor(Math.random() * max) - while (res < min) { - res = Math.floor(Math.random() * max) + while (result < min) { + result = Math.floor(Math.random() * max) } - return res + return result } export function mkdirDirSync(dir: string) { From fedf73a13cc7aa592c57f21124eb736924818376 Mon Sep 17 00:00:00 2001 From: coderhxl Date: Tue, 25 Apr 2023 11:22:41 +0800 Subject: [PATCH 10/17] Feat: Terminal prompt adjustment --- src/api.ts | 51 +++++++++++++++++++++-------------------------- src/batchCrawl.ts | 6 ++++-- src/controller.ts | 29 ++++++++++++++++----------- src/types/api.ts | 6 +++--- src/utils.ts | 4 +++- 5 files changed, 50 insertions(+), 46 deletions(-) diff --git a/src/api.ts b/src/api.ts index ac5def16..e113a169 100644 --- a/src/api.ts +++ b/src/api.ts @@ -12,6 +12,8 @@ import { isUndefined, log, logError, + logStart, + logStatistics, logSuccess, logWarn, mkdirDirSync, @@ -40,35 +42,29 @@ import { fingerprints } from './default' // Extra config export interface ExtraCommonConfig { - intervalTime: IntervalTime | undefined -} + type: 'page' | 'data' | 'file' -export interface ExtraDataAndFileCommonConfig { - type: 'data' | 'file' + intervalTime: IntervalTime | undefined } interface ExtraPageConfig extends ExtraCommonConfig { browser: Browser onCrawlItemComplete: - | ((crawlPageSingleRes: CrawlPageSingleResult) => void) + | ((crawlPageSingleResult: CrawlPageSingleResult) => void) | undefined } -interface ExtraDataConfig - extends ExtraCommonConfig, - ExtraDataAndFileCommonConfig { +interface ExtraDataConfig extends ExtraCommonConfig { onCrawlItemComplete: - | ((crawlDataSingleRes: CrawlDataSingleResult) => void) + | ((crawlDataSingleResult: CrawlDataSingleResult) => void) | undefined } -interface ExtraFileConfig - extends ExtraCommonConfig, - ExtraDataAndFileCommonConfig { +interface ExtraFileConfig extends ExtraCommonConfig { saveFileErrorArr: { message: string; valueOf: () => number }[] saveFilePendingQueue: Promise[] onCrawlItemComplete: - | ((crawlFileSingleRes: CrawlFileSingleResult) => void) + | ((crawlFileSingleResult: CrawlFileSingleResult) => void) | undefined onBeforeSaveItemFile: | ((info: { @@ -135,7 +131,7 @@ interface CrawlPageConfig { selectFingerprintIndexs: number[] onCrawlItemComplete: - | ((crawlPageSingleRes: CrawlPageSingleResult) => void) + | ((crawlPageSingleResult: CrawlPageSingleResult) => void) | undefined } @@ -146,7 +142,7 @@ interface CrawlDataConfig { selectFingerprintIndexs: number[] onCrawlItemComplete: - | ((crawlDataSingleRes: CrawlDataSingleResult) => void) + | ((crawlDataSingleResult: CrawlDataSingleResult) => void) | undefined } @@ -165,7 +161,7 @@ interface CrawlFileConfig { }) => Promise) | undefined onCrawlItemComplete: - | ((crawlDataSingleRes: CrawlDataSingleResult) => void) + | ((crawlDataSingleResult: CrawlDataSingleResult) => void) | undefined } @@ -983,13 +979,14 @@ export function createCrawlPage(xCrawlConfig: LoaderXCrawlConfig) { createCrawlPageConfig(xCrawlConfig, config) const extraConfig: ExtraPageConfig = { + type: 'page', + browser: browser!, intervalTime, onCrawlItemComplete } const crawlResultArr = (await controller( - 'page', xCrawlConfig.mode, detailTargets, extraConfig, @@ -1046,7 +1043,6 @@ export function createCrawlData(xCrawlConfig: LoaderXCrawlConfig) { } const crawlResultArr = (await controller( - 'data', xCrawlConfig.mode, detailTargets, extraConfig, @@ -1107,7 +1103,6 @@ export function createCrawlFile(xCrawlConfig: LoaderXCrawlConfig) { } const crawlResultArr = (await controller( - 'file', xCrawlConfig.mode, detailTargets, extraConfig, @@ -1132,19 +1127,19 @@ export function createCrawlFile(xCrawlConfig: LoaderXCrawlConfig) { errorIds.push(item.id) } }) - log('Save statistics for the targets:') + log(logStatistics('Save files finish:')) log( logSuccess( - ` Success - target total: ${ - succssIds.length - }, targets id: [ ${succssIds.join(', ')} ]` + ` Success - total: ${succssIds.length}, targets id: [ ${succssIds.join( + ', ' + )} ]` ) ) log( logError( - ` Error - target total: ${ - errorIds.length - }, targets id: [ ${errorIds.join(', ')} ]` + ` Error - total: ${errorIds.length}, targets id: [ ${errorIds.join( + ', ' + )} ]` ) ) @@ -1180,13 +1175,13 @@ export function startPolling( const intervalId = setInterval(startCallback, total) function startCallback() { - console.log(logSuccess(`Start the ${logWarn.bold(++count)} polling`)) + console.log(logStart(`Start polling - count: ${++count}`)) callback(count, stopPolling) } function stopPolling() { clearInterval(intervalId) - console.log(logSuccess(`Stop the polling`)) + console.log(logWarn(`Stop the polling`)) } } diff --git a/src/batchCrawl.ts b/src/batchCrawl.ts index fe52605f..ac60b28d 100644 --- a/src/batchCrawl.ts +++ b/src/batchCrawl.ts @@ -14,11 +14,13 @@ async function useSleepByBatch( ? intervalTime : random(intervalTime.max, intervalTime.min) - log(`Target id: ${logNumber(id)} - sleep: ${logNumber(timeout + 'ms')}`) + log( + `Target id: ${logNumber(id)} - Sleep time: ${logNumber(timeout + 'ms')}` + ) await sleep(timeout) } else { - log(`Target id: ${logNumber(id)} - sleep: ${logNumber('0ms')}`) + log(`Target id: ${logNumber(id)} - Sleep time: ${logNumber('0ms')}`) } } diff --git a/src/controller.ts b/src/controller.ts index 83d07321..5c01f0fc 100644 --- a/src/controller.ts +++ b/src/controller.ts @@ -15,6 +15,8 @@ import { log, logError, logNumber, + logStart, + logStatistics, logSuccess, logWarn } from './utils' @@ -81,12 +83,13 @@ export async function controller< E extends ExtraCommonConfig, R >( - name: 'page' | 'data' | 'file', mode: 'async' | 'sync', detailTargets: T[], extraConfig: E, singleCrawlHandle: (device: Device, extraConfig: E) => Promise ) { + const { type } = extraConfig + // 是否使用优先爬取 const isPriorityCrawl = !detailTargets.every( (item) => item.priority === detailTargets[0].priority @@ -136,9 +139,9 @@ export async function controller< ) log( - `${logSuccess(`Start crawling`)} - name: ${logWarn(name)}, mode: ${logWarn( - mode - )}, target total: ${logNumber(devices.length)} ` + logStart( + `Start crawling - type: ${type}, mode: ${mode}, total: ${devices.length}` + ) ) // 选择爬取模式 @@ -206,7 +209,9 @@ export async function controller< log( logWarn( - `Start retrying: ${++i} - Targets id: [ ${retriedIds.join(' - ')} ]` + `Start retrying - count: ${++i}, targets id: [ ${retriedIds.join( + ', ' + )} ]` ) ) } @@ -223,19 +228,19 @@ export async function controller< } }) - log('Crawl statistics of the targets:') + log(logStatistics(`Crawl ${type}s finish:`)) log( logSuccess( - ` Success - target total: ${ - succssIds.length - }, targets id: [ ${succssIds.join(', ')} ]` + ` Success - total: ${succssIds.length}, targets id: [ ${succssIds.join( + ', ' + )} ]` ) ) log( logError( - ` Error - target total: ${ - errorIds.length - }, targets id: [ ${errorIds.join(', ')} ]` + ` Error - total: ${errorIds.length}, targets id: [ ${errorIds.join( + ', ' + )} ]` ) ) diff --git a/src/types/api.ts b/src/types/api.ts index 2ad5c43e..27109255 100644 --- a/src/types/api.ts +++ b/src/types/api.ts @@ -130,7 +130,7 @@ export interface CrawlPageAdvancedConfig extends CrawlCommonConfig { cookies?: PageCookies viewport?: Viewport - onCrawlItemComplete?: (crawlPageSingleRes: CrawlPageSingleResult) => void + onCrawlItemComplete?: (crawlPageSingleResult: CrawlPageSingleResult) => void } export interface CrawlDataAdvancedConfig extends CrawlCommonConfig { @@ -140,7 +140,7 @@ export interface CrawlDataAdvancedConfig extends CrawlCommonConfig { headers?: AnyObject - onCrawlItemComplete?: (crawlDataSingleRes: CrawlDataSingleResult) => void + onCrawlItemComplete?: (crawlDataSingleResult: CrawlDataSingleResult) => void } export interface CrawlFileAdvancedConfig extends CrawlCommonConfig { @@ -152,7 +152,7 @@ export interface CrawlFileAdvancedConfig extends CrawlCommonConfig { storeDir?: string extension?: string - onCrawlItemComplete?: (crawlFileSingleRes: CrawlFileSingleResult) => void + onCrawlItemComplete?: (crawlFileSingleResult: CrawlFileSingleResult) => void onBeforeSaveItemFile?: (info: { id: number fileName: string diff --git a/src/utils.ts b/src/utils.ts index e8eb46a5..dbea97db 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -31,10 +31,12 @@ export function mkdirDirSync(dir: string) { } export const log = console.log -export const logNumber = chalk.hex('#a57fff') +export const logStart = chalk.blueBright +export const logStatistics = chalk.whiteBright export const logSuccess = chalk.green export const logError = chalk.red export const logWarn = chalk.yellow +export const logNumber = chalk.hex('#a57fff') export function isUndefined(value: any): value is undefined { return typeof value === 'undefined' From fa19956d121732379c9d020aead192647ed15c18 Mon Sep 17 00:00:00 2001 From: coderhxl Date: Tue, 25 Apr 2023 14:46:05 +0800 Subject: [PATCH 11/17] Bug fixed: Unable to create multi-level non-existent folders on linux system --- src/api.ts | 3 +-- src/controller.ts | 1 - src/utils.ts | 14 -------------- 3 files changed, 1 insertion(+), 17 deletions(-) diff --git a/src/api.ts b/src/api.ts index e113a169..54d1015c 100644 --- a/src/api.ts +++ b/src/api.ts @@ -16,7 +16,6 @@ import { logStatistics, logSuccess, logWarn, - mkdirDirSync, random } from './utils' @@ -868,7 +867,7 @@ function fileSingleResultHandle( detailTargetConfig.storeDir && !fs.existsSync(detailTargetConfig.storeDir) ) { - mkdirDirSync(detailTargetConfig.storeDir) + fs.mkdirSync(detailTargetConfig.storeDir, { recursive: true }) } const storePath = detailTargetConfig.storeDir ?? __dirname diff --git a/src/controller.ts b/src/controller.ts index 5c01f0fc..2022e6c4 100644 --- a/src/controller.ts +++ b/src/controller.ts @@ -14,7 +14,6 @@ import { isUndefined, log, logError, - logNumber, logStart, logStatistics, logSuccess, diff --git a/src/utils.ts b/src/utils.ts index dbea97db..baa17017 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -16,20 +16,6 @@ export function random(max: number, min = 0) { return result } -export function mkdirDirSync(dir: string) { - const dirSplit = path.resolve(dir).split(path.sep) - - dirSplit.reduce((prev, item, index) => { - const currentDir = index !== 0 ? path.join(prev, item) : item - - if (!fs.existsSync(currentDir)) { - fs.mkdirSync(currentDir) - } - - return currentDir - }, '') -} - export const log = console.log export const logStart = chalk.blueBright export const logStatistics = chalk.whiteBright From 17ef66d1d4cf8d2cdab8b6368411f67b3d5d5a6d Mon Sep 17 00:00:00 2001 From: coderhxl Date: Tue, 25 Apr 2023 17:04:44 +0800 Subject: [PATCH 12/17] Bug Fixes: proxyDetails default --- src/api.ts | 3 +++ src/controller.ts | 5 +---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/api.ts b/src/api.ts index 54d1015c..4ef7be82 100644 --- a/src/api.ts +++ b/src/api.ts @@ -414,6 +414,9 @@ function loaderCommonConfigToCrawlConfig( const urls = detail.proxy!.urls detail.proxyUrl = urls[0] detail.proxyDetails = urls.map((url) => ({ url, state: true })) + } else { + // 默认值 + detail.proxyDetails = [] } // 1.6.priority diff --git a/src/controller.ts b/src/controller.ts index 2022e6c4..6fac256b 100644 --- a/src/controller.ts +++ b/src/controller.ts @@ -95,10 +95,7 @@ export async function controller< ) const detailTargetConfigs = isPriorityCrawl ? priorityQueueMergeSort( - detailTargets.map((item) => ({ - ...item, - valueOf: () => item.priority - })) + detailTargets.map((item) => ({ ...item, valueOf: () => item.priority })) ) : detailTargets From 6e6189e36460ecce47d6c4e61f36f826f9c12c13 Mon Sep 17 00:00:00 2001 From: coderhxl Date: Tue, 25 Apr 2023 17:07:24 +0800 Subject: [PATCH 13/17] Feat: Perfect the test --- jest.config.js | 6 +- package.json | 6 +- script/start.mjs | 2 +- test/environment/api/crawlData.test.ts | 32 +++++++ test/environment/api/crawlFile.test.ts | 44 ++++++++++ test/environment/api/crawlPage.test.ts | 38 ++++++++ .../{ => api}/startPolling.test.ts | 7 +- .../environment/arguments/fingerprint.test.ts | 87 +++++++++++++++++++ test/environment/{ => arguments}/mode.test.ts | 6 +- .../environment/{ => arguments}/proxy.test.ts | 14 +-- .../functions/errorCollect.test.ts | 37 ++++++++ test/environment/test.ts | 19 ++-- .../{ => written}/crawlData.test.ts | 6 +- .../{ => written}/crawlFile.test.ts | 6 +- .../{ => written}/crawlPage.test.ts | 6 +- test/start/index.js | 2 +- test/start/index.ts | 82 +---------------- tsconfig.json | 7 +- 18 files changed, 296 insertions(+), 111 deletions(-) create mode 100644 test/environment/api/crawlData.test.ts create mode 100644 test/environment/api/crawlFile.test.ts create mode 100644 test/environment/api/crawlPage.test.ts rename test/environment/{ => api}/startPolling.test.ts (85%) create mode 100644 test/environment/arguments/fingerprint.test.ts rename test/environment/{ => arguments}/mode.test.ts (90%) rename test/environment/{ => arguments}/proxy.test.ts (71%) create mode 100644 test/environment/functions/errorCollect.test.ts rename test/environment/{ => written}/crawlData.test.ts (97%) rename test/environment/{ => written}/crawlFile.test.ts (97%) rename test/environment/{ => written}/crawlPage.test.ts (97%) diff --git a/jest.config.js b/jest.config.js index adeab3b7..24686a18 100644 --- a/jest.config.js +++ b/jest.config.js @@ -3,5 +3,9 @@ module.exports = { preset: 'ts-jest', testEnvironment: 'node', collectCoverage: true, - detectOpenHandles: true + detectOpenHandles: true, + moduleNameMapper: { + '^src/(.*)$': '/src/$1', + '^publish/(.*)$': '/publish/$1' + } } diff --git a/package.json b/package.json index 0f6d1882..111f6ae0 100644 --- a/package.json +++ b/package.json @@ -25,9 +25,9 @@ "start-server": "rollup --config script/server.mjs", "test-dev": "jest test/environment/test.ts dev", "test-pro": "jest test/environment/test.ts pro", - "test-crawlPage": "jest test/environment/crawlPage.test.ts dev", - "test-crawlData": "jest test/environment/crawlData.test.ts dev", - "test-crawlFile": "jest test/environment/crawlFile.test.ts dev", + "test-crawlPage": "jest test/environment/api/crawlPage.test.ts dev", + "test-crawlData": "jest test/environment/api/crawlData.test.ts dev", + "test-crawlFile": "jest test/environment/api/crawlFile.test.ts dev", "prettier": "prettier --write ." }, "dependencies": { diff --git a/script/start.mjs b/script/start.mjs index 286be811..7085d671 100644 --- a/script/start.mjs +++ b/script/start.mjs @@ -8,5 +8,5 @@ export default { file: 'test/start/index.js', format: 'cjs' }, - plugins: [tsPlugin(), runPlugin({ stdin: { clear: true } })] + plugins: [tsPlugin(), terserPlugin(), runPlugin({ stdin: { clear: true } })] } diff --git a/test/environment/api/crawlData.test.ts b/test/environment/api/crawlData.test.ts new file mode 100644 index 00000000..f797bc1a --- /dev/null +++ b/test/environment/api/crawlData.test.ts @@ -0,0 +1,32 @@ +import process from 'node:process' +import { expect, test, jest } from '@jest/globals' +import chalk from 'chalk' + +import IXCrawl from 'src/' + +const args = process.argv.slice(3) +const environment = args[0] + +let xCrawl: typeof IXCrawl +if (environment === 'dev') { + xCrawl = require('src/').default +} else if (environment === 'pro') { + xCrawl = require('publish/dist') +} + +jest.setTimeout(60000) + +async function testCrawlData() { + const testXCrawl = xCrawl() + + const res = await testXCrawl.crawlData({ + targets: ['http://localhost:8888', { url: 'http://localhost:8888' }] + }) + + return res.reduce((prev, item) => prev && item.isSuccess, true) +} + +test('crawlData', async () => { + console.log(chalk.bgGreen('================ crawlData ================')) + await expect(testCrawlData()).resolves.toBe(true) +}) diff --git a/test/environment/api/crawlFile.test.ts b/test/environment/api/crawlFile.test.ts new file mode 100644 index 00000000..51d941da --- /dev/null +++ b/test/environment/api/crawlFile.test.ts @@ -0,0 +1,44 @@ +import process from 'node:process' +import path from 'node:path' +import { expect, test, jest } from '@jest/globals' +import chalk from 'chalk' + +import IXCrawl from 'src/' + +const args = process.argv.slice(3) +const environment = args[0] + +let xCrawl: typeof IXCrawl +if (environment === 'dev') { + xCrawl = require('src/').default +} else if (environment === 'pro') { + xCrawl = require('publish/dist') +} + +jest.setTimeout(60000) + +const urls: string[] = [ + 'https://raw.githubusercontent.com/coder-hxl/airbnb-upload/master/area/4401.jpg', + 'https://raw.githubusercontent.com/coder-hxl/airbnb-upload/master/area/4403.jpg' +] + +const storeDir = path.resolve(__dirname, './upload') + +async function testCrawlFile() { + const testXCrawl = xCrawl({ proxy: { urls: ['http://localhost:14892'] } }) + + const res = await testXCrawl.crawlFile({ + targets: urls, + storeDir + }) + + return res.reduce( + (prev, item) => prev && item.isSuccess && !!item.data?.data.isSuccess, + true + ) +} + +test('crawlFile', async () => { + console.log(chalk.bgGreen('================ crawlFile ================')) + await expect(testCrawlFile()).resolves.toBe(true) +}) diff --git a/test/environment/api/crawlPage.test.ts b/test/environment/api/crawlPage.test.ts new file mode 100644 index 00000000..47b46fdb --- /dev/null +++ b/test/environment/api/crawlPage.test.ts @@ -0,0 +1,38 @@ +import process from 'node:process' +import { expect, test, jest } from '@jest/globals' +import chalk from 'chalk' + +import IXCrawl from 'src/' + + +const args = process.argv.slice(3) +const environment = args[0] + +let xCrawl: typeof IXCrawl +if (environment === 'dev') { + xCrawl = require('src/').default +} else if (environment === 'pro') { + xCrawl = require('publish/dist') +} + +jest.setTimeout(60000) + +async function testCrawlPage() { + const testXCrawl = xCrawl({ proxy: { urls: ['http://localhost:14892'] } }) + + const res = await testXCrawl.crawlPage({ + targets: [ + 'https://github.com/coder-hxl/x-crawl', + { url: 'https://github.com/coder-hxl/x-crawl' } + ] + }) + + await res[0].data.browser.close() + + return res.reduce((prev, item) => prev && item.isSuccess, true) +} + +test('crawlPage', async () => { + console.log(chalk.bgGreen('================ crawlPage ================')) + await expect(testCrawlPage()).resolves.toBe(true) +}) diff --git a/test/environment/startPolling.test.ts b/test/environment/api/startPolling.test.ts similarity index 85% rename from test/environment/startPolling.test.ts rename to test/environment/api/startPolling.test.ts index 218a8efb..d0a3b306 100644 --- a/test/environment/startPolling.test.ts +++ b/test/environment/api/startPolling.test.ts @@ -2,16 +2,17 @@ import process from 'node:process' import { expect, test } from '@jest/globals' import chalk from 'chalk' -import IXCrawl from '../../src' +import IXCrawl from 'src/' + const args = process.argv.slice(3) const environment = args[0] let xCrawl: typeof IXCrawl if (environment === 'dev') { - xCrawl = require('../../src').default + xCrawl = require('src/').default } else if (environment === 'pro') { - xCrawl = require('../../publish/dist') + xCrawl = require('publish/dist') } function startPolling() { diff --git a/test/environment/arguments/fingerprint.test.ts b/test/environment/arguments/fingerprint.test.ts new file mode 100644 index 00000000..0cc269a0 --- /dev/null +++ b/test/environment/arguments/fingerprint.test.ts @@ -0,0 +1,87 @@ +import process from 'node:process' +import { expect, test, jest } from '@jest/globals' +import chalk from 'chalk' + +import IXCrawl from 'src/' + +const args = process.argv.slice(3) +const environment = args[0] + +let xCrawl: typeof IXCrawl +if (environment === 'dev') { + xCrawl = require('src/').default +} else if (environment === 'pro') { + xCrawl = require('publish/dist') +} + +jest.setTimeout(60000) + +async function fingerprint() { + const testXCrawl = xCrawl() + + const res = await testXCrawl.crawlPage({ + targets: [ + 'http://localhost:8888', + { url: 'http://localhost:8888', fingerprint: null }, + { + url: 'http://localhost:8888', + fingerprint: { + maxWidth: 1024, + maxHeight: 800, + ua: `Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99`, + mobile: 'random', + platform: 'Windows', + platformVersion: '10', + acceptLanguage: `zh-CN,zh;q=0.9,en;q=0.8`, + userAgent: { + value: + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', + versions: [ + { + name: 'Chrome', + maxMinorVersion: 10, + maxPatchVersion: 5615 + }, + { name: 'Safari', maxMinorVersion: 36, maxPatchVersion: 2333 } + ] + } + } + } + ], + fingerprints: [ + { + platform: 'Windows', + mobile: 'random', + userAgent: { + value: + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', + versions: [ + { + name: 'Chrome', + maxMajorVersion: 112, + minMajorVersion: 100, + maxMinorVersion: 20, + maxPatchVersion: 5000 + }, + { + name: 'Safari', + maxMajorVersion: 537, + minMajorVersion: 500, + maxMinorVersion: 36, + maxPatchVersion: 5000 + } + ] + } + } + ] + }) + + res[0].data.browser.close() + + return res.reduce((prev, item) => prev && item.isSuccess, true) +} + +test('fingerprint', async () => { + console.log(chalk.bgGreen('================ fingerprint ================')) + await expect(fingerprint()).resolves.toBe(true) +}) diff --git a/test/environment/mode.test.ts b/test/environment/arguments/mode.test.ts similarity index 90% rename from test/environment/mode.test.ts rename to test/environment/arguments/mode.test.ts index 91a5c660..d40fc036 100644 --- a/test/environment/mode.test.ts +++ b/test/environment/arguments/mode.test.ts @@ -2,16 +2,16 @@ import process from 'node:process' import { expect, test, jest } from '@jest/globals' import chalk from 'chalk' -import IXCrawl from '../../src' +import IXCrawl from 'src/' const args = process.argv.slice(3) const environment = args[0] let xCrawl: typeof IXCrawl if (environment === 'dev') { - xCrawl = require('../../src').default + xCrawl = require('src/').default } else if (environment === 'pro') { - xCrawl = require('../../publish/dist') + xCrawl = require('publish/dist') } jest.setTimeout(60000) diff --git a/test/environment/proxy.test.ts b/test/environment/arguments/proxy.test.ts similarity index 71% rename from test/environment/proxy.test.ts rename to test/environment/arguments/proxy.test.ts index f5c8404d..536da088 100644 --- a/test/environment/proxy.test.ts +++ b/test/environment/arguments/proxy.test.ts @@ -2,16 +2,16 @@ import process from 'node:process' import { expect, test, jest } from '@jest/globals' import chalk from 'chalk' -import IXCrawl from '../../src' +import IXCrawl from 'src/' const args = process.argv.slice(3) const environment = args[0] let xCrawl: typeof IXCrawl if (environment === 'dev') { - xCrawl = require('../../src').default + xCrawl = require('src/').default } else if (environment === 'pro') { - xCrawl = require('../../publish/dist') + xCrawl = require('publish/dist') } jest.setTimeout(60000) @@ -20,7 +20,7 @@ async function proxy() { const testXCrawl = xCrawl() const res = await testXCrawl.crawlPage({ - targets: ['https://www.google.com', 'https://github.com/coder-hxl'], + targets: ['https://', 'https://github.com/coder-hxl'], maxRetry: 3, proxy: { urls: ['http://localhost:129032', 'http://localhost:14892'], @@ -30,7 +30,11 @@ async function proxy() { await res[0].data.browser.close() - return res.reduce((prev, item) => prev && item.isSuccess, true) + return ( + res[0].proxyDetails[0].state === false && + res[1].isSuccess && + res[1].proxyDetails[1].state === true + ) } test('proxy', async () => { diff --git a/test/environment/functions/errorCollect.test.ts b/test/environment/functions/errorCollect.test.ts new file mode 100644 index 00000000..d99b34dc --- /dev/null +++ b/test/environment/functions/errorCollect.test.ts @@ -0,0 +1,37 @@ +import process from 'node:process' +import { expect, test, jest } from '@jest/globals' +import chalk from 'chalk' + +import IXCrawl from 'src/' + +const args = process.argv.slice(3) +const environment = args[0] + +let xCrawl: typeof IXCrawl +if (environment === 'dev') { + xCrawl = require('src/').default +} else if (environment === 'pro') { + xCrawl = require('publish/dist') +} + +jest.setTimeout(60000) + +async function errorCollect() { + const testXCrawl = xCrawl({ maxRetry: 2 }) + + const res = await testXCrawl.crawlPage(['https://', 'https://', 'https://']) + + await res[0].data.browser.close() + + const errorCount = res.reduce( + (prev, curr) => prev + curr.crawlErrorQueue.length, + 0 + ) + + return errorCount === 9 +} + +test('errorCollect', async () => { + console.log(chalk.bgGreen('================ errorCollect ================')) + await expect(errorCollect()).resolves.toBe(true) +}) diff --git a/test/environment/test.ts b/test/environment/test.ts index bf8103e0..39b9ba06 100644 --- a/test/environment/test.ts +++ b/test/environment/test.ts @@ -1,7 +1,14 @@ -import './crawlPage.test' -import './crawlData.test' -import './crawlFile.test' -import './startPolling.test' +import './arguments/mode.test' +import './arguments/fingerprint.test' +import './arguments/proxy.test' -import './mode.test' -import './proxy.test' +import './written/crawlPage.test' +import './written/crawlData.test' +import './written/crawlFile.test' + +import './functions/errorCollect.test' + +import './api/crawlPage.test' +import './api/crawlData.test' +import './api/crawlFile.test' +import './api/startPolling.test' diff --git a/test/environment/crawlData.test.ts b/test/environment/written/crawlData.test.ts similarity index 97% rename from test/environment/crawlData.test.ts rename to test/environment/written/crawlData.test.ts index a3500b2c..5a4c85b2 100644 --- a/test/environment/crawlData.test.ts +++ b/test/environment/written/crawlData.test.ts @@ -2,16 +2,16 @@ import process from 'node:process' import { expect, test, jest } from '@jest/globals' import chalk from 'chalk' -import IXCrawl from '../../src' +import IXCrawl from 'src/' const args = process.argv.slice(3) const environment = args[0] let xCrawl: typeof IXCrawl if (environment === 'dev') { - xCrawl = require('../../src').default + xCrawl = require('src/').default } else if (environment === 'pro') { - xCrawl = require('../../publish/dist') + xCrawl = require('publish/dist') } jest.setTimeout(60000) diff --git a/test/environment/crawlFile.test.ts b/test/environment/written/crawlFile.test.ts similarity index 97% rename from test/environment/crawlFile.test.ts rename to test/environment/written/crawlFile.test.ts index 2087679a..928f3229 100644 --- a/test/environment/crawlFile.test.ts +++ b/test/environment/written/crawlFile.test.ts @@ -3,16 +3,16 @@ import path from 'node:path' import { expect, test, jest } from '@jest/globals' import chalk from 'chalk' -import IXCrawl from '../../src' +import IXCrawl from 'src/' const args = process.argv.slice(3) const environment = args[0] let xCrawl: typeof IXCrawl if (environment === 'dev') { - xCrawl = require('../../src').default + xCrawl = require('src/').default } else if (environment === 'pro') { - xCrawl = require('../../publish/dist') + xCrawl = require('publish/dist') } jest.setTimeout(60000) diff --git a/test/environment/crawlPage.test.ts b/test/environment/written/crawlPage.test.ts similarity index 97% rename from test/environment/crawlPage.test.ts rename to test/environment/written/crawlPage.test.ts index 00f80f64..cbe36ff3 100644 --- a/test/environment/crawlPage.test.ts +++ b/test/environment/written/crawlPage.test.ts @@ -2,16 +2,16 @@ import process from 'node:process' import { expect, test, jest } from '@jest/globals' import chalk from 'chalk' -import IXCrawl from '../../src' +import IXCrawl from 'src/' const args = process.argv.slice(3) const environment = args[0] let xCrawl: typeof IXCrawl if (environment === 'dev') { - xCrawl = require('../../src').default + xCrawl = require('src/').default } else if (environment === 'pro') { - xCrawl = require('../../publish/dist') + xCrawl = require('publish/dist') } jest.setTimeout(60000) diff --git a/test/start/index.js b/test/start/index.js index 19c19ed3..8cde044e 100644 --- a/test/start/index.js +++ b/test/start/index.js @@ -1 +1 @@ -"use strict";var e=require("node:fs"),t=require("node:fs/promises"),r=require("node:path"),n=require("puppeteer"),o=require("chalk"),a=require("node:http"),i=require("node:https"),s=require("node:url"),l=require("https-proxy-agent");function c(e,t=0){let r=Math.floor(Math.random()*e);for(;r1){const e=t?r:c(r.max,r.min);u(`Id: ${m(n)} - Crawl needs to sleep for ${m(e+"ms")} milliseconds before sending`),await function(e){return new Promise((t=>setTimeout(t,e)))}(e)}else u(`Id: ${m(n)} - Crawl does not need to sleep, send immediately`)}async function v(e,t,r){const{intervalTime:n}=t,o=!h(n),a=g(n),i=[];for(const s of e){const{id:e}=s;await x(o,a,n,e),i.push(r(s,t))}await Promise.all(i)}async function T(e,t,r){const{intervalTime:n}=t,o=!h(n),a=g(n);for(const i of e){const{id:e}=i;await x(o,a,n,e),await r(i,t)}}function C(e,t,r){const n=e[t];e[t]=e[r],e[r]=n}function S(e){if(1===e.length)return e;const t=Math.floor(e.length/2),r=S(e.slice(0,t)),n=S(e.slice(t)),o=[];let a=0,i=0;for(;a=n[i]?(o.push(r[a]),a++):(o.push(n[i]),i++);return ae.priority===r[0].priority))?S(r.map((e=>({...e,valueOf:()=>e.priority})))):r).map(((e,t)=>{const r=++t,{maxRetry:n,proxyDetails:o}=e,a=[];return{id:r,isHandle:!1,isSuccess:!1,isStatusNormal:!1,detailTargetConfig:e,detailTargetResult:null,maxRetry:n,retryCount:0,proxyDetails:o,crawlErrorQueue:a,result:{id:r,isSuccess:!1,maxRetry:n,retryCount:0,proxyDetails:o,crawlErrorQueue:a,data:null}}}));u(`${p("Start crawling")} - name: ${f(e)}, mode: ${f(t)}, total: ${m(a.length)} `);const i="async"===t?v:T;let s=0,l=a;for(;l.length;)if(await i(l,n,o),l=l.filter((e=>{const{isHandle:t,detailTargetConfig:r,proxyDetails:n,crawlErrorQueue:o,isStatusNormal:a}=e;let i=!1;if(!t&&(i=!0,n.length>=2)){const e=r.proxy?.switchByErrorCount;if(!a||!h(e)&&e>=o.length){n.find((e=>e.url===r.proxyUrl)).state=!1;const e=n.find((e=>e.state))?.url;h(e)||(r.proxyUrl=e)}}return i})),l.length){const e=l.map((e=>(e.retryCount++,e.id)));u(f(`Retry: ${++s} - Ids to retry: [ ${e.join(" - ")} ]`))}const c=[],g=[];return a.forEach((e=>{e.isSuccess?c.push(e.id):g.push(e.id)})),u("Crawl the final result:"),u(p(` Success - total: ${c.length}, ids: [ ${c.join(" - ")} ]`)),u(d(` Error - total: ${g.length}, ids: [ ${g.join(" - ")} ]`)),a.map((e=>e.result))}function $(e,t){let r=e?`${e}`:"?";if(t)for(const e in t){r+=`&${e}=${t[e]}`}else r=e;return r}function j(e){const{protocol:t,hostname:r,port:n,pathname:o,search:c}=new s.URL(e.url),u="http:"===t,m={agent:e.proxyUrl?l(e.proxyUrl):u?new a.Agent:new i.Agent,protocol:t,hostname:r,port:n,path:o,search:$(c,e.params),method:e.method?.toLocaleUpperCase()??"GET",headers:{},timeout:e.timeout};return m.headers=function(e,t){const r={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",...e.headers??{}};return"POST"===t.method&&e.data&&(r["Content-Type"]="application/json",r["Content-Length"]=Buffer.byteLength(e.data)),r}(e,m),m}function E(e){return new Promise(((t,r)=>{const n=h(e.data);e.data=n?e.data:JSON.stringify(e.data);const o=j(e);function s(e){const{statusCode:r,headers:n}=e,o=[];e.on("data",(e=>o.push(e))),e.on("end",(()=>{const e=Buffer.concat(o);t({statusCode:r,headers:n,data:e})}))}let l;l="http:"===o.protocol?a.request(o,s):i.request(o,s),l.on("timeout",(()=>{r(new Error(`Timeout ${e.timeout}ms`))})),l.on("error",(e=>{r(e)})),"POST"!==o.method||n||l.write(e.data),l.end()}))}const M=[{platform:"Windows",mobile:"random",userAgent:{value:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",versions:[{name:"Chrome",maxMajorVersion:112,minMajorVersion:100,maxMinorVersion:10,maxPatchVersion:5615},{name:"Safari",maxMinorVersion:36,maxPatchVersion:2333}]}},{platform:"Windows",mobile:"random",userAgent:{value:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59",versions:[{name:"Chrome",maxMajorVersion:91,minMajorVersion:88,maxMinorVersion:10,maxPatchVersion:5615},{name:"Safari",maxMinorVersion:36,maxPatchVersion:2333},{name:"Edg",maxMinorVersion:10,maxPatchVersion:864}]}},{platform:"Windows",mobile:"random",userAgent:{value:"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0",versions:[{name:"Firefox",maxMajorVersion:47,minMajorVersion:43,maxMinorVersion:10,maxPatchVersion:5e3}]}}];function R(e){return y(e)?e.map((e=>w(e)?e:{url:e})):[w(e)?e:{url:e}]}function P(e,t){const{ua:r,platform:n,platformVersion:o,mobile:a,acceptLanguage:i,userAgent:s}=t;let l=e.headers;if(l||(e.headers=l={}),r&&(l["sec-ch-ua"]=r),a&&(l["sec-ch-ua-mobile"]="random"===a?c(2)?"?1":"?0":a),n&&(l["sec-ch-platform"]=n),o&&(l["sec-ch-ua-platform-version"]=o),i&&(l["accept-language"]=i),s){let e=s.value;s.versions?.forEach((t=>{const{name:r,maxMajorVersion:n,minMajorVersion:o,maxMinorVersion:a,minMinorVersion:i,maxPatchVersion:s,minPatchVersion:l}=t,u=e.split(`${r}/`)[1].split(" ")[0].split("."),m=u.join(".");h(n)||(u[0]=n===o?n:c(n,o)),h(a)||(u[1]=a===i?a:c(a,i)),h(s)||(u[2]=s===l?s:c(s,l));const p=`${r}/${m}`,d=`${r}/${u.join(".")}`;e=e.replace(p,d)})),l["user-agent"]=e}}function V(e,t){const{maxWidth:r,minWidth:n,maxHeight:o,minHidth:a}=t,i=e.viewport??{};r&&(i.width=r===n?r:c(r,n)),o&&(i.height=o===a?o:c(o,a)),Object.hasOwn(i,"width")&&Object.hasOwn(i,"height")&&(e.viewport=i)}function F(e,t,r){r.detailTargets=t.detailTargets.map((n=>{const o=n,{url:a,timeout:i,proxy:s,maxRetry:l,priority:u,headers:m,fingerprint:p}=o;if(h(e.baseUrl)||(o.url=e.baseUrl+a),h(i)&&(h(t.timeout)?o.timeout=e.timeout:o.timeout=t.timeout),h(l)&&(h(t.maxRetry)?o.maxRetry=e.maxRetry:o.maxRetry=t.maxRetry),h(s)&&(h(t.proxy)?h(e.proxy)||(o.proxy=e.proxy):o.proxy=t.proxy),!h(o.proxy?.urls)){const e=o.proxy.urls;o.proxyUrl=e[0],o.proxyDetails=e.map((e=>({url:e,state:!0})))}if(h(u)&&(o.priority=0),h(m)&&t.headers&&(o.headers={...t.headers}),p)P(o,p);else if(h(p)&&y(t.fingerprints)&&t.fingerprints.length){const e=t.fingerprints,n=c(e.length),a=e[n];r.selectFingerprintIndexs.push(n),P(o,a)}else if(h(p)&&!y(t.fingerprints)&&e.enableRandomFingerprint){P(o,M[c(M.length)])}return o})),r.intervalTime=t.intervalTime,h(t.intervalTime)&&!h(e.intervalTime)&&(r.intervalTime=e.intervalTime),r.onCrawlItemComplete=t.onCrawlItemComplete}async function O(e,t){const{detailTargetConfig:r,detailTargetResult:n,retryCount:o,maxRetry:a,crawlErrorQueue:i}=e,{browser:s}=t,l=o===a,c=n?.page??await s.newPage();r.viewport&&await c.setViewport(r.viewport);let u=null,m=!0;try{if(r.proxyUrl?await s.createIncognitoBrowserContext({proxyServer:r.proxyUrl}):await s.createIncognitoBrowserContext({proxyServer:void 0}),r.cookies){const e=function(e,t){const r=[];return"string"==typeof t?t.split("; ").forEach((t=>{const n=t.split("=");r.push({name:n[0],value:n[1],url:e})})):Array.isArray(t)?t.forEach((t=>{t.url||(t.url=e),r.push(t)})):"object"==typeof t&&t&&(t.url||(t.url=e),r.push(t)),r}(r.url,r.cookies);await c.setCookie(...e)}else{const e=await c.cookies(r.url);await c.deleteCookie(...e)}r.headers&&await c.setExtraHTTPHeaders(r.headers),u=await c.goto(r.url,{timeout:r.timeout})}catch(e){m=!1,i.push(e)}e.detailTargetResult={response:u,page:c};const p=!b(e),d=m&&p;return e.isStatusNormal=p,e.isSuccess=d,(d||l)&&(e.isHandle=!0,function(e,t){const{detailTargetResult:r,result:n}=e,{browser:o,onCrawlItemComplete:a}=t;D(e),n.data={browser:o,...r},a&&a(e.result)}(e,t)),{response:u,page:c}}async function k(n,o){const{detailTargetConfig:a,crawlErrorQueue:i,maxRetry:s,retryCount:l}=n,c=s===l;let u=null,m=!0;try{u=await E(a)}catch(e){m=!1,i.push(e)}n.detailTargetResult=u;const p=!b(n),d=m&&p;return n.isStatusNormal=p,n.isSuccess=d,(d||c)&&(n.isHandle=!0,"data"===o.type?function(e,t){const{isSuccess:r,detailTargetResult:n,result:o}=e,{onCrawlItemComplete:a}=t;if(D(e),r&&n){const e=n.headers["content-type"]??"",t="application/json"===e?JSON.parse(n.data.toString()):e.includes("text")?n.data.toString():n.data;o.data={...n,data:t}}a&&a(o)}(n,o):"file"===o.type&&function(n,o){const{id:a,isSuccess:i,detailTargetConfig:s,detailTargetResult:l,result:c}=n,{saveFileErrorArr:u,saveFilePendingQueue:m,onCrawlItemComplete:p,onBeforeSaveItemFile:d}=o;if(D(n),i&&l){const o=l.headers["content-type"]??"",i=s.fileName??`${a}-${(new Date).getTime()}`,h=s.extension??`.${o.split("/").pop()}`;s.storeDir&&!e.existsSync(s.storeDir)&&(f=s.storeDir,r.resolve(f).split(r.sep).reduce(((t,n,o)=>{const a=0!==o?r.join(t,n):n;return e.existsSync(a)||e.mkdirSync(a),a}),""));const g=s.storeDir??__dirname,w=r.resolve(g,i+h),y=l.data;let x=Promise.resolve(y);d&&(x=d({id:a,fileName:i,filePath:w,data:y}));const v=x.then((async e=>{let r=!0;try{await t.writeFile(w,e)}catch(e){r=!1;const t=`File save error at id ${a}: ${e.message}`,n=()=>a;u.push({message:t,valueOf:n})}const s=e.length;c.data={...l,data:{isSuccess:r,fileName:i,fileExtension:h,mimeType:o,size:s,filePath:w}},p&&p(n.result)}));m.push(v)}else p&&p(n.result);var f}(n,o)),await E(a)}const A=["isSuccess","retryCount"];function D(e){Object.keys(e).forEach((t=>{A.includes(t)&&(e.result[t]=e[t])}))}function W(e){let t=null,r=null,o=!1;return async function(a,i){o||(o=!0,r=n.launch(e.crawlPage?.launchBrowser).then((e=>{t=e}))),r&&(await r,r&&(r=null));const{detailTargets:s,intervalTime:l,onCrawlItemComplete:c}=function(e,t){const r={detailTargets:[],intervalTime:void 0,selectFingerprintIndexs:[],onCrawlItemComplete:void 0};let n={targets:[],detailTargets:[]};if(w(t)&&Object.hasOwn(t,"targets")){const{targets:e}=t;n=t,n.detailTargets=R(e)}else n.detailTargets=R(t);return F(e,n,r),r.detailTargets.forEach(((e,t)=>{const{cookies:o,viewport:a,fingerprint:i}=e;if(h(o)&&n.cookies&&(e.cookies=n.cookies),h(a)&&n.viewport&&(e.viewport=n.viewport),i)V(e,i);else if(h(i)&&n.fingerprints?.length){const o=r.selectFingerprintIndexs[t];V(e,n.fingerprints[o])}})),r}(e,a),u={browser:t,intervalTime:l,onCrawlItemComplete:c},m=await I("page",e.mode,s,u,O),p=y(a)||w(a)&&Object.hasOwn(a,"targets")?m:m[0];return i&&i(p),p}}function B(e){return async function(t,r){const{detailTargets:n,intervalTime:o,onCrawlItemComplete:a}=function(e,t){const r={detailTargets:[],intervalTime:void 0,selectFingerprintIndexs:[],onCrawlItemComplete:void 0};let n={targets:[],detailTargets:[]};if(w(t)&&Object.hasOwn(t,"targets")){const{targets:e}=t;n=t,n.detailTargets=R(e)}else n.detailTargets=R(t);return F(e,n,r),r}(e,t),i={type:"data",intervalTime:o,onCrawlItemComplete:a},s=await I("data",e.mode,n,i,k),l=y(t)||w(t)&&Object.hasOwn(t,"targets")?s:s[0];return r&&r(l),l}}function N(e){return async function(t,r){const{detailTargets:n,intervalTime:o,onBeforeSaveItemFile:a,onCrawlItemComplete:i}=function(e,t){const r={detailTargets:[],intervalTime:void 0,selectFingerprintIndexs:[],onBeforeSaveItemFile:void 0,onCrawlItemComplete:void 0};let n={targets:[],detailTargets:[]};if(w(t)&&Object.hasOwn(t,"targets")){const{targets:e}=t;n=t,n.detailTargets=R(e)}else n.detailTargets=y(t)?t:[t];F(e,n,r);const o=!h(n?.storeDir),a=!h(n?.extension);return r.detailTargets.forEach((e=>{h(e.storeDir)&&o&&(e.storeDir=n.storeDir),h(e.extension)&&a&&(e.extension=n.extension)})),r.onBeforeSaveItemFile=n.onBeforeSaveItemFile,r}(e,t),s={type:"file",saveFileErrorArr:[],saveFilePendingQueue:[],intervalTime:o,onCrawlItemComplete:i,onBeforeSaveItemFile:a},l=await I("file",e.mode,n,s,k),{saveFilePendingQueue:c,saveFileErrorArr:m}=s;var f;await Promise.all(c),(f=m,function e(t,r){if(t>=r)return;const n=f[r];let o=t,a=r-1;for(;o<=a;){for(;f[o]n;)a--;o<=a&&(C(f,o,a),o++,a--)}C(f,o,r),e(t,o-1),e(o+1,r)}(0,f.length-1),f).forEach((e=>u(d(e.message))));const g=[],x=[];l.forEach((e=>{e.data?.data.isSuccess?g.push(e.id):x.push(e.id)})),u("Save file final result:"),u(p(` Success - total: ${g.length}, ids: [ ${g.join(" - ")} ]`)),u(d(` Error - total: ${x.length}, ids: [ ${x.join(" - ")} ]`));const v=y(t)||w(t)&&Object.hasOwn(t,"targets")?l:l[0];return r&&r(v),v}}function H(e,t){const{d:r,h:n,m:o}=e,a=(h(r)?0:1e3*r*60*60*24)+(h(n)?0:1e3*n*60*60)+(h(o)?0:1e3*o*60);let i=0;l();const s=setInterval(l,a);function l(){console.log(p(`Start the ${f.bold(++i)} polling`)),t(i,c)}function c(){clearInterval(s),console.log(p("Stop the polling"))}}const q=function(e){const t=function(e){const t=e||{};return h(t.mode)&&(t.mode="async"),h(t.enableRandomFingerprint)&&(t.enableRandomFingerprint=!0),h(e?.timeout)&&(t.timeout=1e4),h(e?.maxRetry)&&(t.maxRetry=0),t}(e);return function(e){return{crawlPage:W(e),crawlData:B(e),crawlFile:N(e),startPolling:H}}(t)}({intervalTime:{max:5e3,min:3e3}});q.crawlPage({targets:["https://www.google.com","https://github.com/coder-hxl"],proxy:{urls:["http://localhost:14897","http://localhost:14892"],switchByErrorCount:1},maxRetry:3}).then((e=>{console.log("================== res =================="),console.log(e),e.forEach(((e,t)=>{console.log(e.proxyDetails)})),e[0].data.browser.close()})); +"use strict";var e=require("node:fs"),t=require("node:fs/promises"),r=require("node:path"),n=require("puppeteer"),o=require("chalk"),a=require("node:http"),i=require("node:https"),s=require("node:url"),l=require("https-proxy-agent");function c(e,t=0){let r=Math.floor(Math.random()*e);for(;r1){const e=t?r:c(r.max,r.min);u(`Target id: ${h(n)} - Sleep time: ${h(e+"ms")}`),await function(e){return new Promise((t=>setTimeout(t,e)))}(e)}else u(`Target id: ${h(n)} - Sleep time: ${h("0ms")}`)}async function C(e,t,r){const{intervalTime:n}=t,o=!y(n),a=w(n),i=[];for(const s of e){const{id:e}=s;await T(o,a,n,e),i.push(r(s,t))}await Promise.all(i)}async function S(e,t,r){const{intervalTime:n}=t,o=!y(n),a=w(n);for(const i of e){const{id:e}=i;await T(o,a,n,e),await r(i,t)}}function b(e,t,r){const n=e[t];e[t]=e[r],e[r]=n}function $(e){if(1===e.length)return e;const t=Math.floor(e.length/2),r=$(e.slice(0,t)),n=$(e.slice(t)),o=[];let a=0,i=0;for(;a=n[i]?(o.push(r[a]),a++):(o.push(n[i]),i++);return ae.priority===t[0].priority))?$(t.map((e=>({...e,valueOf:()=>e.priority})))):t).map(((e,t)=>{const r=++t,{maxRetry:n,proxyDetails:o}=e,a=[];return{id:r,isHandle:!1,isSuccess:!1,isStatusNormal:!1,detailTargetConfig:e,detailTargetResult:null,maxRetry:n,retryCount:0,proxyDetails:o,crawlErrorQueue:a,result:{id:r,isSuccess:!1,maxRetry:n,retryCount:0,proxyDetails:o,crawlErrorQueue:a,data:null}}}));u(m(`Start crawling - type: ${o}, mode: ${e}, total: ${a.length}`));const i="async"===e?C:S;let s=0,l=a;for(;l.length;)if(await i(l,r,n),l=l.filter((e=>{const{isHandle:t,retryCount:r,maxRetry:n,detailTargetConfig:o,proxyDetails:a,crawlErrorQueue:i,isStatusNormal:s}=e;let l=!1;if(!t&&r=2)){const e=o.proxy?.switchByErrorCount;if(!s||!y(e)&&e>=i.length){a.find((e=>e.url===o.proxyUrl)).state=!1;const e=a.find((e=>e.state))?.url;y(e)||(o.proxyUrl=e)}}return l})),l.length){const e=l.map((e=>(e.retryCount++,e.id)));u(g(`Start retrying - count: ${++s}, targets id: [ ${e.join(", ")} ]`))}const c=[],h=[];return a.forEach((e=>{e.isSuccess?c.push(e.id):h.push(e.id)})),u(p(`Crawl ${o}s finish:`)),u(d(` Success - total: ${c.length}, targets id: [ ${c.join(", ")} ]`)),u(f(` Error - total: ${h.length}, targets id: [ ${h.join(", ")} ]`)),a.map((e=>e.result))}function M(e,t){let r=e?`${e}`:"?";if(t)for(const e in t){r+=`&${e}=${t[e]}`}else r=e;return r}function R(e){const{protocol:t,hostname:r,port:n,pathname:o,search:c}=new s.URL(e.url),u="http:"===t,m={agent:e.proxyUrl?l(e.proxyUrl):u?new a.Agent:new i.Agent,protocol:t,hostname:r,port:n,path:o,search:M(c,e.params),method:e.method?.toLocaleUpperCase()??"GET",headers:{},timeout:e.timeout};return m.headers=function(e,t){const r={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",...e.headers??{}};return"POST"===t.method&&e.data&&(r["Content-Type"]="application/json",r["Content-Length"]=Buffer.byteLength(e.data)),r}(e,m),m}const E=[{platform:"Windows",mobile:"random",userAgent:{value:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",versions:[{name:"Chrome",maxMajorVersion:112,minMajorVersion:100,maxMinorVersion:10,maxPatchVersion:5615},{name:"Safari",maxMinorVersion:36,maxPatchVersion:2333}]}},{platform:"Windows",mobile:"random",userAgent:{value:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59",versions:[{name:"Chrome",maxMajorVersion:91,minMajorVersion:88,maxMinorVersion:10,maxPatchVersion:5615},{name:"Safari",maxMinorVersion:36,maxPatchVersion:2333},{name:"Edg",maxMinorVersion:10,maxPatchVersion:864}]}},{platform:"Windows",mobile:"random",userAgent:{value:"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0",versions:[{name:"Firefox",maxMajorVersion:47,minMajorVersion:43,maxMinorVersion:10,maxPatchVersion:5e3}]}}];function V(e){return v(e)?e.map((e=>x(e)?e:{url:e})):[x(e)?e:{url:e}]}function F(e,t){const{ua:r,platform:n,platformVersion:o,mobile:a,acceptLanguage:i,userAgent:s}=t;let l=e.headers;if(l||(e.headers=l={}),r&&(l["sec-ch-ua"]=r),a&&(l["sec-ch-ua-mobile"]="random"===a?c(2)?"?1":"?0":a),n&&(l["sec-ch-platform"]=n),o&&(l["sec-ch-ua-platform-version"]=o),i&&(l["accept-language"]=i),s){let e=s.value;s.versions?.forEach((t=>{const{name:r,maxMajorVersion:n,minMajorVersion:o,maxMinorVersion:a,minMinorVersion:i,maxPatchVersion:s,minPatchVersion:l}=t,u=e.split(`${r}/`)[1].split(" ")[0].split("."),m=u.join(".");y(n)||(u[0]=n===o?n:c(n,o)),y(a)||(u[1]=a===i?a:c(a,i)),y(s)||(u[2]=s===l?s:c(s,l));const p=`${r}/${m}`,d=`${r}/${u.join(".")}`;e=e.replace(p,d)})),l["user-agent"]=e}}function O(e,t){const{maxWidth:r,minWidth:n,maxHeight:o,minHidth:a}=t,i=e.viewport??{};r&&(i.width=r===n?r:c(r,n)),o&&(i.height=o===a?o:c(o,a)),Object.hasOwn(i,"width")&&Object.hasOwn(i,"height")&&(e.viewport=i)}function P(e,t,r){r.detailTargets=t.detailTargets.map((n=>{const o=n,{url:a,timeout:i,proxy:s,maxRetry:l,priority:u,headers:m,fingerprint:p}=o;if(y(e.baseUrl)||(o.url=e.baseUrl+a),y(i)&&(y(t.timeout)?o.timeout=e.timeout:o.timeout=t.timeout),y(l)&&(y(t.maxRetry)?o.maxRetry=e.maxRetry:o.maxRetry=t.maxRetry),y(s)&&(y(t.proxy)?y(e.proxy)||(o.proxy=e.proxy):o.proxy=t.proxy),y(o.proxy?.urls))o.proxyDetails=[];else{const e=o.proxy.urls;o.proxyUrl=e[0],o.proxyDetails=e.map((e=>({url:e,state:!0})))}if(y(u)&&(o.priority=0),y(m)&&t.headers&&(o.headers={...t.headers}),p)F(o,p);else if(y(p)&&v(t.fingerprints)&&t.fingerprints.length){const e=t.fingerprints,n=c(e.length),a=e[n];r.selectFingerprintIndexs.push(n),F(o,a)}else if(y(p)&&!v(t.fingerprints)&&e.enableRandomFingerprint){F(o,E[c(E.length)])}return o})),r.intervalTime=t.intervalTime,y(t.intervalTime)&&!y(e.intervalTime)&&(r.intervalTime=e.intervalTime),r.onCrawlItemComplete=t.onCrawlItemComplete}async function k(e,t){const{detailTargetConfig:r,detailTargetResult:n,retryCount:o,maxRetry:a,crawlErrorQueue:i}=e,{browser:s}=t,l=o===a,c=n?.page??await s.newPage();r.viewport&&await c.setViewport(r.viewport);let u=null,m=!0;try{if(r.proxyUrl?await s.createIncognitoBrowserContext({proxyServer:r.proxyUrl}):await s.createIncognitoBrowserContext({proxyServer:void 0}),r.cookies){const e=function(e,t){const r=[];return"string"==typeof t?t.split("; ").forEach((t=>{const n=t.split("=");r.push({name:n[0],value:n[1],url:e})})):Array.isArray(t)?t.forEach((t=>{t.url||(t.url=e),r.push(t)})):"object"==typeof t&&t&&(t.url||(t.url=e),r.push(t)),r}(r.url,r.cookies);await c.setCookie(...e)}else{const e=await c.cookies(r.url);await c.deleteCookie(...e)}r.headers&&await c.setExtraHTTPHeaders(r.headers),u=await c.goto(r.url,{timeout:r.timeout})}catch(e){m=!1,i.push(e)}e.detailTargetResult={response:u,page:c};const p=!j(e),d=m&&p;e.isStatusNormal=p,e.isSuccess=d,(d||l)&&(e.isHandle=!0,function(e,t){const{detailTargetResult:r,result:n}=e,{browser:o,onCrawlItemComplete:a}=t;W(e),n.data={browser:o,...r},a&&a(e.result)}(e,t))}async function A(n,o){const{detailTargetConfig:s,crawlErrorQueue:l,maxRetry:c,retryCount:u}=n,m=c===u;let p=null,d=!0;try{p=await(f=s,new Promise(((e,t)=>{const r=y(f.data);f.data=r?f.data:JSON.stringify(f.data);const n=R(f);function o(t){const{statusCode:r,headers:n}=t,o=[];t.on("data",(e=>o.push(e))),t.on("end",(()=>{const t=Buffer.concat(o);e({statusCode:r,headers:n,data:t})}))}let s;s="http:"===n.protocol?a.request(n,o):i.request(n,o),s.on("timeout",(()=>{t(new Error(`Timeout ${f.timeout}ms`))})),s.on("error",(e=>{t(e)})),"POST"!==n.method||r||s.write(f.data),s.end()})))}catch(e){d=!1,l.push(e)}var f;n.detailTargetResult=p;const g=!j(n),h=d&&g;n.isStatusNormal=g,n.isSuccess=h,(h||m)&&(n.isHandle=!0,"data"===o.type?function(e,t){const{isSuccess:r,detailTargetResult:n,result:o}=e,{onCrawlItemComplete:a}=t;if(W(e),r&&n){const e=n.headers["content-type"]??"",t="application/json"===e?JSON.parse(n.data.toString()):e.includes("text")?n.data.toString():n.data;o.data={...n,data:t}}a&&a(o)}(n,o):"file"===o.type&&function(n,o){const{id:a,isSuccess:i,detailTargetConfig:s,detailTargetResult:l,result:c}=n,{saveFileErrorArr:u,saveFilePendingQueue:m,onCrawlItemComplete:p,onBeforeSaveItemFile:d}=o;if(W(n),i&&l){const o=l.headers["content-type"]??"",i=s.fileName??`${a}-${(new Date).getTime()}`,f=s.extension??`.${o.split("/").pop()}`;s.storeDir&&!e.existsSync(s.storeDir)&&e.mkdirSync(s.storeDir,{recursive:!0});const g=s.storeDir??__dirname,h=r.resolve(g,i+f),y=l.data;let w=Promise.resolve(y);d&&(w=d({id:a,fileName:i,filePath:h,data:y}));const x=w.then((async e=>{let r=!0;try{await t.writeFile(h,e)}catch(e){r=!1;const t=`File save error at id ${a}: ${e.message}`,n=()=>a;u.push({message:t,valueOf:n})}const s=e.length;c.data={...l,data:{isSuccess:r,fileName:i,fileExtension:f,mimeType:o,size:s,filePath:h}},p&&p(n.result)}));m.push(x)}else p&&p(n.result)}(n,o))}const D=["isSuccess","retryCount"];function W(e){Object.keys(e).forEach((t=>{D.includes(t)&&(e.result[t]=e[t])}))}function B(e){let t=null,r=null,o=!1;return async function(a,i){o||(o=!0,r=n.launch(e.crawlPage?.launchBrowser).then((e=>{t=e}))),r&&(await r,r&&(r=null));const{detailTargets:s,intervalTime:l,onCrawlItemComplete:c}=function(e,t){const r={detailTargets:[],intervalTime:void 0,selectFingerprintIndexs:[],onCrawlItemComplete:void 0};let n={targets:[],detailTargets:[]};if(x(t)&&Object.hasOwn(t,"targets")){const{targets:e}=t;n=t,n.detailTargets=V(e)}else n.detailTargets=V(t);return P(e,n,r),r.detailTargets.forEach(((e,t)=>{const{cookies:o,viewport:a,fingerprint:i}=e;if(y(o)&&n.cookies&&(e.cookies=n.cookies),y(a)&&n.viewport&&(e.viewport=n.viewport),i)O(e,i);else if(y(i)&&n.fingerprints?.length){const o=r.selectFingerprintIndexs[t];O(e,n.fingerprints[o])}})),r}(e,a),u={type:"page",browser:t,intervalTime:l,onCrawlItemComplete:c},m=await I(e.mode,s,u,k),p=v(a)||x(a)&&Object.hasOwn(a,"targets")?m:m[0];return i&&i(p),p}}function N(e){return async function(t,r){const{detailTargets:n,intervalTime:o,onCrawlItemComplete:a}=function(e,t){const r={detailTargets:[],intervalTime:void 0,selectFingerprintIndexs:[],onCrawlItemComplete:void 0};let n={targets:[],detailTargets:[]};if(x(t)&&Object.hasOwn(t,"targets")){const{targets:e}=t;n=t,n.detailTargets=V(e)}else n.detailTargets=V(t);return P(e,n,r),r}(e,t),i={type:"data",intervalTime:o,onCrawlItemComplete:a},s=await I(e.mode,n,i,A),l=v(t)||x(t)&&Object.hasOwn(t,"targets")?s:s[0];return r&&r(l),l}}function H(e){return async function(t,r){const{detailTargets:n,intervalTime:o,onBeforeSaveItemFile:a,onCrawlItemComplete:i}=function(e,t){const r={detailTargets:[],intervalTime:void 0,selectFingerprintIndexs:[],onBeforeSaveItemFile:void 0,onCrawlItemComplete:void 0};let n={targets:[],detailTargets:[]};if(x(t)&&Object.hasOwn(t,"targets")){const{targets:e}=t;n=t,n.detailTargets=V(e)}else n.detailTargets=v(t)?t:[t];P(e,n,r);const o=!y(n?.storeDir),a=!y(n?.extension);return r.detailTargets.forEach((e=>{y(e.storeDir)&&o&&(e.storeDir=n.storeDir),y(e.extension)&&a&&(e.extension=n.extension)})),r.onBeforeSaveItemFile=n.onBeforeSaveItemFile,r}(e,t),s={type:"file",saveFileErrorArr:[],saveFilePendingQueue:[],intervalTime:o,onCrawlItemComplete:i,onBeforeSaveItemFile:a},l=await I(e.mode,n,s,A),{saveFilePendingQueue:c,saveFileErrorArr:m}=s;var g;await Promise.all(c),(g=m,function e(t,r){if(t>=r)return;const n=g[r];let o=t,a=r-1;for(;o<=a;){for(;g[o]n;)a--;o<=a&&(b(g,o,a),o++,a--)}b(g,o,r),e(t,o-1),e(o+1,r)}(0,g.length-1),g).forEach((e=>u(f(e.message))));const h=[],w=[];l.forEach((e=>{e.data?.data.isSuccess?h.push(e.id):w.push(e.id)})),u(p("Save files finish:")),u(d(` Success - total: ${h.length}, targets id: [ ${h.join(", ")} ]`)),u(f(` Error - total: ${w.length}, targets id: [ ${w.join(", ")} ]`));const T=v(t)||x(t)&&Object.hasOwn(t,"targets")?l:l[0];return r&&r(T),T}}function q(e,t){const{d:r,h:n,m:o}=e,a=(y(r)?0:1e3*r*60*60*24)+(y(n)?0:1e3*n*60*60)+(y(o)?0:1e3*o*60);let i=0;l();const s=setInterval(l,a);function l(){console.log(m("Start polling - count: "+ ++i)),t(i,c)}function c(){clearInterval(s),console.log(g("Stop the polling"))}}const U=function(e){const t=function(e){const t=e||{};return y(t.mode)&&(t.mode="async"),y(t.enableRandomFingerprint)&&(t.enableRandomFingerprint=!0),y(e?.timeout)&&(t.timeout=1e4),y(e?.maxRetry)&&(t.maxRetry=0),t}(e);return function(e){return{crawlPage:B(e),crawlData:N(e),crawlFile:H(e),startPolling:q}}(t)}({maxRetry:2});U.crawlData(["https://","https://","https://"]).then((e=>{console.log(e)})); diff --git a/test/start/index.ts b/test/start/index.ts index cc156c59..0b2b6855 100644 --- a/test/start/index.ts +++ b/test/start/index.ts @@ -2,82 +2,8 @@ import xCrawl from 'x-crawl' import sharp from 'sharp' import path from 'path' -const testXCrawl = xCrawl({ - intervalTime: { max: 5000, min: 3000 } -}) - -// testXCrawl.crawlPage({ -// targets: [ -// 'https://github.com/coder-hxl', -// { url: 'https://github.com/coder-hxl/x-crawl', fingerprint: null }, -// { -// url: 'https://github.com/coder-hxl/x-crawl/stargazers', -// fingerprint: { -// platform: 'Windows', -// mobile: 'random', -// userAgent: { -// value: -// 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59', -// versions: [ -// { -// name: 'Chrome', -// maxMajorVersion: 91, -// minMajorVersion: 88, -// maxMinorVersion: 10, -// maxPatchVersion: 5615 -// }, -// { name: 'Safari', maxMinorVersion: 36, maxPatchVersion: 2333 }, -// { name: 'Edg', maxMinorVersion: 10, maxPatchVersion: 864 } -// ] -// } -// } -// } -// ], -// fingerprints: [ -// { -// platform: 'Windows', -// mobile: 'random', -// userAgent: { -// value: -// 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', -// versions: [ -// { -// name: 'Chrome', -// maxMajorVersion: 112, -// minMajorVersion: 100, -// maxMinorVersion: 20, -// maxPatchVersion: 5000 -// }, -// { -// name: 'Safari', -// maxMajorVersion: 537, -// minMajorVersion: 500, -// maxMinorVersion: 36, -// maxPatchVersion: 5000 -// } -// ] -// } -// } -// ] -// }) - -testXCrawl - .crawlPage({ - targets: ['https://www.google.com', 'https://github.com/coder-hxl'], - proxy: { - urls: ['http://localhost:14897', 'http://localhost:14892'], - switchByErrorCount: 1 - }, - maxRetry: 3 - }) - .then((res) => { - console.log('================== res ==================') - console.log(res) +const testXCrawl = xCrawl({ maxRetry: 2 }) - res.forEach((item, i) => { - console.log(item.proxyDetails) - // item.data.page.screenshot({ path: `${i}page.jpg` }) - }) - - res[0].data.browser.close() - }) +testXCrawl.crawlData(['https://', 'https://', 'https://']).then((res) => { + console.log(res) +}) diff --git a/tsconfig.json b/tsconfig.json index aa75f766..88b8822d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,7 +11,12 @@ "skipLibCheck": true, "composite": true, "outDir": "./publish", - "emitDeclarationOnly": false + "emitDeclarationOnly": false, + "baseUrl": ".", + "paths": { + "src/*": ["./src"], + "publish/*": ["./src"] + } }, "include": ["src/**/*", "test/**/*", "publish/dist/index.d.ts"] } From 62147e8265db74aec9ecad00a96f3c20e5367b46 Mon Sep 17 00:00:00 2001 From: coderhxl Date: Tue, 25 Apr 2023 19:56:02 +0800 Subject: [PATCH 14/17] Feat: It is possible to cancel the configuration of the upper-level unified setting by setting null in the option. --- src/api.ts | 8 ++++---- src/types/api.ts | 10 ++++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/api.ts b/src/api.ts index 4ef7be82..a53c1b28 100644 --- a/src/api.ts +++ b/src/api.ts @@ -91,7 +91,7 @@ type LoaderCommonConfig = { } type LoaderHasConfig = { - timeout: number + timeout?: number maxRetry: number priority: number } @@ -378,14 +378,14 @@ function loaderCommonConfigToCrawlConfig( detail // 1.1.baseUrl - if (!isUndefined(xCrawlConfig.baseUrl)) { + if (xCrawlConfig.baseUrl) { detail.url = xCrawlConfig.baseUrl + url } // 1.2.timeout if (isUndefined(timeout)) { if (!isUndefined(advancedDetailTargetsConfig.timeout)) { - detail.timeout = advancedDetailTargetsConfig.timeout + detail.timeout = advancedDetailTargetsConfig.timeout ?? undefined } else { detail.timeout = xCrawlConfig.timeout } @@ -394,7 +394,7 @@ function loaderCommonConfigToCrawlConfig( // 1.3.maxRetry if (isUndefined(maxRetry)) { if (!isUndefined(advancedDetailTargetsConfig.maxRetry)) { - detail.maxRetry = advancedDetailTargetsConfig.maxRetry + detail.maxRetry = advancedDetailTargetsConfig.maxRetry ?? 0 } else { detail.maxRetry = xCrawlConfig.maxRetry } diff --git a/src/types/api.ts b/src/types/api.ts index 27109255..2bae63a3 100644 --- a/src/types/api.ts +++ b/src/types/api.ts @@ -69,13 +69,13 @@ export interface DetailTargetFingerprintCommon { } export interface CrawlCommonConfig { - timeout?: number + timeout?: number | null proxy?: { urls: string[] switchByHttpStatus?: number[] switchByErrorCount?: number - } - maxRetry?: number + } | null + maxRetry?: number | null } // 1.Detail target @@ -140,7 +140,9 @@ export interface CrawlDataAdvancedConfig extends CrawlCommonConfig { headers?: AnyObject - onCrawlItemComplete?: (crawlDataSingleResult: CrawlDataSingleResult) => void + onCrawlItemComplete?: ( + crawlDataSingleResult: CrawlDataSingleResult + ) => void } export interface CrawlFileAdvancedConfig extends CrawlCommonConfig { From c83c222aadf45103f5c7fb616a9612b3107d4766 Mon Sep 17 00:00:00 2001 From: coderhxl Date: Tue, 25 Apr 2023 21:32:29 +0800 Subject: [PATCH 15/17] Feat: Update the documentation --- README.md | 480 ++++++++++++++++++++++++++++------------------ docs/cn.md | 446 +++++++++++++++++++++++++----------------- publish/README.md | 468 ++++++++++++++++++++++++++------------------ 3 files changed, 840 insertions(+), 554 deletions(-) diff --git a/README.md b/README.md index 715f2d1a..43b6b22d 100644 --- a/README.md +++ b/README.md @@ -11,18 +11,19 @@ x-crawl is a flexible Node.js multipurpose crawler library. The usage is flexibl - **🔥 Asynchronous Synchronous** - Just change the mode property to toggle asynchronous or synchronous crawling mode. - **⚙️ Multiple purposes** - It can crawl pages, crawl interfaces, crawl files and poll crawls to meet the needs of various scenarios. - **🖋️ Flexible writing style** - The same crawling API can be adapted to multiple configurations, and each configuration method is very unique. -- **👀 Device Fingerprinting** - Zero configuration or custom configuration, avoid fingerprinting to identify and track us from different locations. - **⏱️ Interval Crawling** - No interval, fixed interval and random interval to generate or avoid high concurrent crawling. -- **🔄 Failed Retry** - Avoid crawling failure due to transient problems, unlimited retries. +- **🔄 Failed Retry** - Avoid crawling failure due to short-term problems, and customize the number of retries. +- **➡️ Proxy Rotation** - Auto-rotate proxies with failure retry, custom error times and HTTP status codes. +- **👀 Device Fingerprinting** - Zero configuration or custom configuration, avoid fingerprinting to identify and track us from different locations. - **🚀 Priority Queue** - According to the priority of a single crawling target, it can be crawled ahead of other targets. - **☁️ Crawl SPA** - Crawl SPA (Single Page Application) to generate pre-rendered content (aka "SSR" (Server Side Rendering)). - **⚒️ Control Page** - You can submit form, keyboard input, event operation, generate screenshots of the page, etc. -- **🧾 Capture Record** - Capture and record the crawled information, and highlight it on the console. +- **🧾 Capture Record** - Capture and record crawling, and use colored strings to remind in the terminal. - **🦾 TypeScript** - Own types, implement complete types through generics. ## Relationship with Puppeteer -The crawlPage API has [puppeteer](https://github.com/puppeteer/puppeteer) built in, you only need to pass in some configuration options to complete some operations, and the result will expose Brower instances and Page instances. +The crawlPage API has built-in [puppeteer](https://github.com/puppeteer/puppeteer), you only need to pass in some configuration options to complete some operations, the result will expose the Brower instance and Page instance, you get Brower instance and Page instance will be intact, x-crawl will not rewrite them. # Table of Contents @@ -48,9 +49,10 @@ The crawlPage API has [puppeteer](https://github.com/puppeteer/puppeteer) built - [onBeforeSaveItemFile](#onBeforeSaveItemFile) - [Start Polling](#Start-Polling) - [Config Priority](#Config-Priority) - - [Custom Device Fingerprint](#Custom-Device-Fingerprint) - [Interval Time](#Interval-Time) - [Fail Retry](#Fail-Retry) + - [Rotate Proxy](#Rotate Proxy) + - [Custom Device Fingerprint](#Custom-Device-Fingerprint) - [Priority Queue](#Priority-Queue) - [About Results](#About-Results) - [TypeScript](#TypeScript) @@ -85,21 +87,20 @@ The crawlPage API has [puppeteer](https://github.com/puppeteer/puppeteer) built - [Type](#Type-4) - [Example](#Example-5) - [Types](#Types) - - [API Config](#API-config) + - [API Config](#API-Config) - [XCrawlConfig](#XCrawlConfig) - - [Detail target config](#Detail-target-config) + - [Detail Target Config](#Detail-Target-Config) - [CrawlPageDetailTargetConfig](#CrawlPageDetailTargetConfig) - [CrawlDataDetailTargetConfig](#CrawlDataDetailTargetConfig) - [CrawlFileDetailTargetConfig](#CrawlFileDetailTargetConfig) - - [Advanced config](#Advanced-config) + - [Advanced Config](#Advanced-Config) - [CrawlPageAdvancedConfig](#CrawlPageAdvancedConfig) - [CrawlDataAdvancedConfig](#CrawlDataAdvancedConfig) - [CrawlFileAdvancedConfig](#CrawlFileAdvancedConfig) - [StartPollingConfig](#StartPollingConfig) - - [Crawl other config](#Crawl-other-config) + - [Crawl Other Config](#Crawl-Other-Config) - [CrawlCommonConfig](#CrawlCommonConfig) - [DetailTargetFingerprintCommon](#DetailTargetFingerprintCommon) - - [AdvancedFingerprintCommon](#AdvancedFingerprintCommon) - [Mobile](#Mobile) - [Platform](#Platform) - [PageCookies](#PageCookies) @@ -107,10 +108,10 @@ The crawlPage API has [puppeteer](https://github.com/puppeteer/puppeteer) built - [IntervalTime](#IntervalTime) - [API Result](#API-Result) - [XCrawlInstance](#XCrawlInstance) - - [CrawlCommonRes](#CrawlCommonRes) - - [CrawlPageSingleRes](#CrawlPageSingleRes) - - [CrawlDataSingleRes](#CrawlDataSingleRes) - - [CrawlFileSingleRes](#CrawlFileSingleRes) + - [CrawlCommonResult](#CrawlCommonResult) + - [CrawlPageSingleResult](#CrawlPageSingleResult) + - [CrawlDataSingleResult](#CrawlDataSingleResult) + - [CrawlFileSingleResult](#CrawlFileSingleResult) - [API Other](#API-Other) - [AnyObject](#AnyObject) - [More](#More) @@ -125,7 +126,7 @@ npm install x-crawl ## Example -Take some pictures of Airbnb hawaii experience and Plus listings automatically every day as an example: +Take the automatic acquisition of photos of experiences and homes in hawaii every day as an example:: ```js // 1.Import module ES/CJS @@ -143,19 +144,23 @@ myXCrawl.startPolling({ d: 1 }, async (count, stopPolling) => { // Call crawlPage API to crawl Page const res = await myXCrawl.crawlPage([ 'https://zh.airbnb.com/s/hawaii/experiences', - 'https://zh.airbnb.com/s/hawaii/plus_homes' + 'https://zh.airbnb.com/s/hawaii/homes' ]) // Store the image URL to targets const targets = [] - const elSelectorMap = ['.c14whb16', '.a1stauiv'] + const elSelectorMap = ['.c14whb16', '.l196t2l1'] for (const item of res) { const { id } = item const { page } = item.data + const boxSelector = elSelectorMap[id - 1] + + // Wait for the image element to appear + await page.waitForSelector(`${boxSelector} img`) // Gets the URL of the page's wheel image element - const boxHandle = await page.$(elSelectorMap[id - 1]) - const urls = await boxHandle!.$$eval('picture img', (imgEls) => { + const boxHandle = await page.$(boxSelector) + const urls = await boxHandle.$$eval('picture img', (imgEls) => { return imgEls.map((item) => item.src) }) targets.push(...urls) @@ -304,7 +309,7 @@ myXCrawl.crawlPage('https://www.example.com').then(async (res) => { Lifecycle functions owned by the crawlPage API: -- onCrawlItemComplete: Called when each crawl item is completed and processed +- onCrawlItemComplete: Call back when each crawl is complete ##### onCrawlItemComplete @@ -340,7 +345,7 @@ myXCrawl.crawlData({ targets }).then((res) => { Life cycle functions owned by crawlData API: -- onCrawlItemComplete: Called when each crawl item is completed and processed +- onCrawlItemComplete: Call back when each crawl is complete ##### onCrawlItemComplete @@ -374,7 +379,7 @@ myXCrawl Life cycle functions owned by crawlFile API: -- onCrawlItemComplete: Called when each crawl item is completed and processed +- onCrawlItemComplete: Call back when each crawl is complete - onBeforeSaveItemFile: Callback before saving the file @@ -448,7 +453,7 @@ Some common configurations can be set in these three places: - Application instance configuration (global) - Advanced configuration (partial) -- detailed target configuration (separately) +- Detailed target configuration (separately) The priority is: detailed target configuration > advanced configuration > application instance configuration @@ -457,73 +462,45 @@ Take crawlPage to crawl two pages as an example: ```js import xCrawl from 'x-crawl' -// Application instance configuration -const myXCrawl = xCrawl({ - intervalTime: { max: 3000, min: 1000 } -}) - -// advanced configuration -myXCrawl.crawlPage({ - targets: [ - 'https://www.example.com/page-1', - { - // Detailed target configuration - url: 'https://www.example.com/page-1', - viewport: { width: 1920, height: 1080 } - } - ], - intervalTime: 1000, - viewport: { width: 800, height: 600 } +// Application instance configurationconst testXCrawl = xCrawl({ + proxy: { + urls: [ + 'https://www.example.com/proxy-1', + 'https://www.example.com/proxy-2', + 'https://www.example.com/proxy-3' + ], + switchByErrorCount: 3, + switchByHttpStatus: [401, 403] + } }) -``` - -### Custom Device Fingerprint - -Customize the configuration of device fingerprints to avoid identifying and tracking us from different locations through fingerprint recognition. - -Multiple information can be passed in the fingerprint through advanced usage, and internally it will help you randomly assign each target to targets. It is also possible to set a specific fingerprint for a target directly with the detailed target configuration. - -Take crawlPage as an example: - -```js -import xCrawl from 'x-crawl' -const myXCrawl = xCrawl({ intervalTime: { max: 5000, min: 3000 } }) - -myXCrawl +// Advanced configuration +testXCrawl .crawlPage({ targets: [ 'https://www.example.com/page-1', + 'https://www.example.com/page-2', + // Detailed target configuration { - // Specify the fingerprint - url: 'https://www.example.com/page-2', - fingerprint: { - maxWidth: 1980, - minWidth: 1200, - maxHeight: 1080, - minHidth: 800, - platform: 'Android' - } + url: 'https://www.example.com/page-3', + proxy: { urls: ['https://www.example.com/proxy-5'] } } ], - fingerprint: { - // set fingerprint for each target in targets - maxWidth: 1980, - maxHeight: 1080, - userAgents: [ - 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0', - 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36', - 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0' + maxRetry: 10, + proxy: { + urls: [ + 'https://www.example.com/proxy-3', + 'https://www.example.com/proxy-4' ], - platforms: ['Chromium OS', 'iOS', 'Linux', 'macOS', 'Windows'] + switchByErrorCount: 3, + switchByHttpStatus: [401, 403] } }) .then((res) => {}) +}) ``` -For more fingerprint options, you can go to the corresponding configuration to view. - -In the above example, the interval time is set in both **Application Instance Configuration** and **Advanced Configuration**, then the interval time of **Advanced Configuration** will prevail. If the viewport is set in **Advanced Configuration** and **Detailed Target Configuration**, then the second target will be based on the viewport of its **Detailed Target Configuration**. +In the above example, **Proxy** is set in **Application Instance Configuration**, **Advanced Configuration** and **Detailed Target Configuration**, page3 will use its own proxy configuration, page1 and page2 will use the proxy configuration of the advanced configuration. ### Interval Time @@ -555,6 +532,8 @@ The intervalTime option defaults to undefined . If there is a setting value, it It can avoid crawling failure due to temporary problems, and will wait for the end of this round of crawling targets to crawl again. +The number of failed retries can be set by creating crawler application instance, advanced usage, and detailed target. + ```js import xCrawl from 'x-crawl' @@ -567,6 +546,130 @@ myXCrawl The maxRetry attribute determines how many times to retry. +### Rotate Proxy + +With failed retries, custom error times and HTTP status codes, the proxy is automatically rotated for crawling targets. + +You can set the number of failed retries in the three places of creating a crawler application instance, advanced usage, and detailed goals. + +Take crawlPage as an example: + +```js +import xCrawl from 'x-crawl' + +const testXCrawl = xCrawl() + +testXCrawl + .crawlPage({ + targets: [ + 'https://www.example.com/page-1', + 'https://www.example.com/page-2', + 'https://www.example.com/page-3', + 'https://www.example.com/page-4', + // Undelegate for this target + { url: 'https://www.example.com/page-6', proxy: null }, + // Set the proxy individually for this target + { + url: 'https://www.example.com/page-6', + proxy: { + urls: [ + 'https://www.example.com/proxy-4', + 'https://www.example.com/proxy-5' + ], + switchByErrorCount: 3 + } + } + ], + maxRetry: 10, + // Set the proxy uniformly for this target + proxy: { + urls: [ + 'https://www.example.com/proxy-1', + 'https://www.example.com/proxy-2', + 'https://www.example.com/proxy-3' + ], + switchByErrorCount: 3, + switchByHttpStatus: [401, 403] + } + }) + .then((res) => {}) +``` + +**Note:** This function needs to cooperate with failure retry to work normally. + +### Custom Device Fingerprint + +Customize the configuration of device fingerprints to avoid identifying and tracking us from different locations through fingerprint recognition. + +Multiple information can be passed in fingerprints through advanced usage, and internally it will help you randomly assign each target to targets. It is also possible to set a specific fingerprint for a target directly with the detailed target configuration. + +Take crawlPage as an example: + +```js +import xCrawl from 'x-crawl' + +const myXCrawl = xCrawl({ intervalTime: { max: 5000, min: 3000 } }) + +myXCrawl.crawlPage({ + targets: [ + 'https://www.example.com/page-1', + 'https://www.example.com/page-2', + 'https://www.example.com/page-3', + // Unfingerprint for this target + { url: 'https://www.example.com/page-4', fingerprint: null }, + // Set the fingerprint individually for this target + { + url: 'https://www.example.com/page-5', + fingerprint: { + mobile: 'random', + platform: 'Windows', + acceptLanguage: `zh-CN,zh;q=0.9,en;q=0.8`, + userAgent: { + value: + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', + versions: [ + { name: 'Chrome', maxMinorVersion: 10, maxPatchVersion: 5615 }, + { name: 'Safari', maxMinorVersion: 36, maxPatchVersion: 2333 } + ] + } + } + } + ], + // Set the fingerprint uniformly for this target + fingerprints: [ + { + maxWidth: 1024, + maxHeight: 800, + platform: 'Windows', + mobile: 'random', + userAgent: { + value: + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', + versions: [ + { + name: 'Chrome', + // browser version + maxMajorVersion: 112, + minMajorVersion: 100, + maxMinorVersion: 20, + maxPatchVersion: 5000 + }, + { + name: 'Safari', + maxMajorVersion: 537, + minMajorVersion: 500, + maxMinorVersion: 36, + maxPatchVersion: 5000 + } + ] + } + } + ] +}) +``` + +For more fingerprint options, you can go to the corresponding configuration to view. + ### Priority Queue A priority queue allows a crawl target to be sent first. @@ -595,6 +698,7 @@ Each crawl target will generate a detail object, which will contain the followin - isSuccess: Whether to crawl successfully - maxRetry: The maximum number of retries for this crawling target - retryCount: The number of times the crawling target has been retried +- proxyDetails: record the proxy situation - crawlErrorQueue: Error collection of the crawl target - data: the crawling data of the crawling target @@ -657,23 +761,23 @@ The crawlPage API is a function. A type is an [overloaded function](https://www. type crawlPage = { ( config: string, - callback?: (res: CrawlPageSingleRes) => void - ): Promise + callback?: (res: CrawlPageSingleResult) => void + ): Promise ( config: CrawlPageDetailTargetConfig, - callback?: (res: CrawlPageSingleRes) => void - ): Promise + callback?: (res: CrawlPageSingleResult) => void + ): Promise ( config: (string | CrawlPageDetailTargetConfig)[], - callback?: (res: CrawlPageSingleRes[]) => void - ): Promise + callback?: (res: CrawlPageSingleResult[]) => void + ): Promise ( config: CrawlPageAdvancedConfig, - callback?: (res: CrawlPageSingleRes[]) => void - ): Promise + callback?: (res: CrawlPageSingleResult[]) => void + ): Promise } ``` @@ -684,7 +788,7 @@ type crawlPage = { **Return value type:** -- Look at the [CrawlPageSingleRes](#CrawlPageSingleRes) type +- Look at the [CrawlPageSingleResult](#CrawlPageSingleResult) type #### Example @@ -808,23 +912,23 @@ The crawlData API is a function. A type is an [overloaded function](https://www. type crawlData = { ( config: CrawlDataDetailTargetConfig, - callback?: (res: CrawlDataSingleRes) => void - ): Promise> + callback?: (res: CrawlDataSingleResult) => void + ): Promise> ( config: string, - callback?: (res: CrawlDataSingleRes) => void - ): Promise> + callback?: (res: CrawlDataSingleResult) => void + ): Promise> ( config: (string | CrawlDataDetailTargetConfig)[], - callback?: (res: CrawlDataSingleRes[]) => void - ): Promise[]> + callback?: (res: CrawlDataSingleResult[]) => void + ): Promise[]> ( config: CrawlDataAdvancedConfig, - callback?: (res: CrawlDataSingleRes[]) => void - ): Promise[]> + callback?: (res: CrawlDataSingleResult[]) => void + ): Promise[]> } ``` @@ -835,7 +939,7 @@ type crawlData = { **Return value type:** -- Look at the [CrawlDataSingleRes](#CrawlDataSingleRes) type +- Look at the [CrawlDataSingleResult](#CrawlDataSingleResult) type #### Example @@ -965,18 +1069,18 @@ The crawlFile API is a function. A type is an [overloaded function](https://www. type crawlFile = { ( config: CrawlFileDetailTargetConfig, - callback?: (res: CrawlFileSingleRes) => void - ): Promise + callback?: (res: CrawlFileSingleResult) => void + ): Promise ( config: CrawlFileDetailTargetConfig[], - callback?: (res: CrawlFileSingleRes[]) => void - ): Promise + callback?: (res: CrawlFileSingleResult[]) => void + ): Promise ( config: CrawlFileAdvancedConfig, - callback?: (res: CrawlFileSingleRes[]) => void - ): Promise + callback?: (res: CrawlFileSingleResult[]) => void + ): Promise } ``` @@ -987,7 +1091,7 @@ type crawlFile = { **Return value type:** -- Look at the [CrawlFileSingleRes](#CrawlFileSingleRes) type +- Look at the [CrawlFileSingleResult](#CrawlFileSingleResult) type #### Example @@ -1128,7 +1232,7 @@ myXCrawl.startPolling({ h: 2, m: 30 }, (count, stopPolling) => { ## Types -### API config +### API Config #### XCrawlConfig @@ -1165,9 +1269,9 @@ export interface CrawlPageDetailTargetConfig extends CrawlCommonConfig { viewport?: Viewport | null // puppeteer fingerprint?: | (DetailTargetFingerprintCommon & { - maxWidth: number + maxWidth?: number minWidth?: number - maxHeight: number + maxHeight?: number minHidth?: number }) | null @@ -1231,7 +1335,7 @@ export interface CrawlFileDetailTargetConfig extends CrawlCommonConfig { - extension: string - fingerprint: undefined -#### Advanced config +#### Advanced Config ##### CrawlPageAdvancedConfig @@ -1239,27 +1343,26 @@ export interface CrawlFileDetailTargetConfig extends CrawlCommonConfig { export interface CrawlPageAdvancedConfig extends CrawlCommonConfig { targets: (string | CrawlPageDetailTargetConfig)[] intervalTime?: IntervalTime - fingerprint?: AdvancedFingerprintCommon & { - maxWidth: number + fingerprints?: (DetailTargetFingerprintCommon & { + maxWidth?: number minWidth?: number - maxHeight: number + maxHeight?: number minHidth?: number - } + })[] headers?: AnyObject cookies?: PageCookies - viewport?: Viewport // puppeteer + viewport?: Viewport - onCrawlItemComplete?: (crawlPageSingleRes: CrawlPageSingleRes) => void + onCrawlItemComplete?: (crawlPageSingleResult: CrawlPageSingleResult) => void } ``` **Default Value** - targets: undefined - - intervalTime: undefined -- fingerprint: undefined +- fingerprints: undefined - headers: undefined - cookies: undefined - viewport: undefined @@ -1271,11 +1374,13 @@ export interface CrawlPageAdvancedConfig extends CrawlCommonConfig { export interface CrawlDataAdvancedConfig extends CrawlCommonConfig { targets: (string | CrawlDataDetailTargetConfig)[] intervalTime?: IntervalTime - fingerprint?: AdvancedFingerprintCommon + fingerprints?: DetailTargetFingerprintCommon[] headers?: AnyObject - onCrawlItemComplete?: (crawlDataSingleRes: CrawlDataSingleRes) => void + onCrawlItemComplete?: ( + crawlDataSingleResult: CrawlDataSingleResult + ) => void } ``` @@ -1283,7 +1388,7 @@ export interface CrawlDataAdvancedConfig extends CrawlCommonConfig { - targets: undefined - intervalTime: undefined -- fingerprint: undefined +- fingerprints: undefined - headers: undefined - onCrawlItemComplete: undefined @@ -1293,13 +1398,13 @@ export interface CrawlDataAdvancedConfig extends CrawlCommonConfig { export interface CrawlFileAdvancedConfig extends CrawlCommonConfig { targets: (string | CrawlFileDetailTargetConfig)[] intervalTime?: IntervalTime - fingerprint?: AdvancedFingerprintCommon + fingerprints?: DetailTargetFingerprintCommon[] headers?: AnyObject storeDir?: string extension?: string - onCrawlItemComplete?: (crawlFileSingleRes: CrawlFileSingleRes) => void + onCrawlItemComplete?: (crawlFileSingleResult: CrawlFileSingleResult) => void onBeforeSaveItemFile?: (info: { id: number fileName: string @@ -1313,7 +1418,7 @@ export interface CrawlFileAdvancedConfig extends CrawlCommonConfig { - targets: undefined - intervalTime: undefined -- fingerprint: undefined +- fingerprints: undefined - headers: undefined - storeDir: \_\_dirname - extension: string @@ -1336,15 +1441,19 @@ export interface StartPollingConfig { - h: undefined - m: undefined -#### Crawl other config +#### Crawl Other Config ##### CrawlCommonConfig ```ts export interface CrawlCommonConfig { - timeout?: number - proxy?: string - maxRetry?: number + timeout?: number | null + proxy?: { + urls: string[] + switchByHttpStatus?: number[] + switchByErrorCount?: number + } | null + maxRetry?: number | null } ``` @@ -1358,45 +1467,34 @@ export interface CrawlCommonConfig { ```ts export interface DetailTargetFingerprintCommon { - userAgent?: string ua?: string + mobile?: '?0' | '?1' | 'random' platform?: Platform platformVersion?: string - mobile?: Mobile acceptLanguage?: string + userAgent?: { + value: string + versions?: { + name: string + maxMajorVersion?: number + minMajorVersion?: number + maxMinorVersion?: number + minMinorVersion?: number + maxPatchVersion?: number + minPatchVersion?: number + }[] + } } ``` **Default Value** -- userAgent: undefined - ua: undefined +- mobile: undefined - platform: undefined - platformVersion: undefined -- mobile: undefined - acceptLanguage: undefined - -##### AdvancedFingerprintCommon - -```ts -export interface AdvancedFingerprintCommon { - userAgents?: string[] - uas?: string[] - platforms?: Platform[] - platformVersions?: string[] - mobiles?: Mobile[] - acceptLanguages?: string[] -} -``` - -**Default Value** - -- userAgents: undefined -- uas: undefined -- platforms: undefined -- platformVersions: undefined -- mobiles: undefined -- acceptLanguages: undefined +- userAgent: undefined ##### Mobile @@ -1423,8 +1521,8 @@ export type Platform = ```ts export type PageCookies = | string - | Protocol.Network.CookieParam - | Protocol.Network.CookieParam[] + | Protocol.Network.CookieParam // puppeteer + | Protocol.Network.CookieParam[] // puppeteer ``` ##### Method @@ -1459,7 +1557,7 @@ export type Method = export type IntervalTime = number | { max: number; min?: number } ``` -### API result +### API Result #### XCrawlInstance @@ -1468,62 +1566,62 @@ export interface XCrawlInstance { crawlPage: { ( config: string, - callback?: (res: CrawlPageSingleRes) => void - ): Promise + callback?: (res: CrawlPageSingleResult) => void + ): Promise ( config: CrawlPageDetailTargetConfig, - callback?: (res: CrawlPageSingleRes) => void - ): Promise + callback?: (res: CrawlPageSingleResult) => void + ): Promise ( config: (string | CrawlPageDetailTargetConfig)[], - callback?: (res: CrawlPageSingleRes[]) => void - ): Promise + callback?: (res: CrawlPageSingleResult[]) => void + ): Promise ( config: CrawlPageAdvancedConfig, - callback?: (res: CrawlPageSingleRes[]) => void - ): Promise + callback?: (res: CrawlPageSingleResult[]) => void + ): Promise } crawlData: { ( config: CrawlDataDetailTargetConfig, - callback?: (res: CrawlDataSingleRes) => void - ): Promise> + callback?: (res: CrawlDataSingleResult) => void + ): Promise> ( config: string, - callback?: (res: CrawlDataSingleRes) => void - ): Promise> + callback?: (res: CrawlDataSingleResult) => void + ): Promise> ( config: (string | CrawlDataDetailTargetConfig)[], - callback?: (res: CrawlDataSingleRes[]) => void - ): Promise[]> + callback?: (res: CrawlDataSingleResult[]) => void + ): Promise[]> ( config: CrawlDataAdvancedConfig, - callback?: (res: CrawlDataSingleRes[]) => void - ): Promise[]> + callback?: (res: CrawlDataSingleResult[]) => void + ): Promise[]> } crawlFile: { ( config: CrawlFileDetailTargetConfig, - callback?: (res: CrawlFileSingleRes) => void - ): Promise + callback?: (res: CrawlFileSingleResult) => void + ): Promise ( config: CrawlFileDetailTargetConfig[], - callback?: (res: CrawlFileSingleRes[]) => void - ): Promise + callback?: (res: CrawlFileSingleResult[]) => void + ): Promise ( config: CrawlFileAdvancedConfig, - callback?: (res: CrawlFileSingleRes[]) => void - ): Promise + callback?: (res: CrawlFileSingleResult[]) => void + ): Promise } startPolling: ( @@ -1533,28 +1631,30 @@ export interface XCrawlInstance { } ``` -#### CrawlCommonRes +#### CrawlCommonResult ```ts -export interface CrawlCommonRes { +export interface CrawlCommonResult { id: number isSuccess: boolean maxRetry: number retryCount: number + proxyDetails: ProxyDetails crawlErrorQueue: Error[] } ``` -- id: Generated according to the order of crawling targets, if there is a priority, it will be generated according to the priority -- isSuccess: Whether to crawl successfully -- maxRetry: The maximum number of retries for this crawling target -- retryCount: The number of times the crawling target has been retried -- crawlErrorQueue: Error collection of the crawl target +- id:Generated according to the order in which the target is climbed, or by priority, if any +- isSuccess:Whether the climb is successful +- maxRetry:Maximum number of retries of the crawl target +- retryCount:Maximum number of retries of the crawl target +- proxyDetails:Record agent status +- crawlErrorQueue:Error collection for the crawl target -#### CrawlPageSingleRes +#### CrawlPageSingleResult ```ts -export interface CrawlPageSingleRes extends CrawlCommonRes { +export interface CrawlPageSingleResult extends CrawlCommonResult { data: { browser: Browser // puppeteer response: HTTPResponse | null // puppeteer @@ -1563,25 +1663,25 @@ export interface CrawlPageSingleRes extends CrawlCommonRes { } ``` -#### CrawlDataSingleRes +#### CrawlDataSingleResult ```ts -export interface CrawlDataSingleRes extends CrawlCommonRes { +export interface CrawlDataSingleResult extends CrawlCommonResult { data: { statusCode: number | undefined - headers: IncomingHttpHeaders // node http + headers: IncomingHttpHeaders // nodejs http data: D } | null } ``` -#### CrawlFileSingleRes +#### CrawlFileSingleResult ```ts -export interface CrawlFileSingleRes extends CrawlCommonRes { +export interface CrawlFileSingleResult extends CrawlCommonResult { data: { statusCode: number | undefined - headers: IncomingHttpHeaders // node http + headers: IncomingHttpHeaders // nodejs http data: { isSuccess: boolean fileName: string @@ -1607,5 +1707,3 @@ export interface AnyObject extends Object { ## More If you have **problems, needs, good suggestions** please raise **Issues** in https://github.com/coder-hxl/x-crawl/issues. - -Thank you all for your support. diff --git a/docs/cn.md b/docs/cn.md index 0b3c2d38..8cb0c67e 100644 --- a/docs/cn.md +++ b/docs/cn.md @@ -2,7 +2,7 @@ [English](https://github.com/coder-hxl/x-crawl#x-crawl) | 简体中文 -x-crawl 是一个灵活的 Node.js 多功能爬虫库。用法灵活,并且内置众多功能用于爬页面、爬接口、爬文件等。 +x-crawl 是一个灵活的 Node.js 多功能爬虫库。用法灵活,并内置众多功能用于爬页面、爬接口、爬文件等。 > 如果你也喜欢 x-crawl ,可以给 [x-crawl 存储库](https://github.com/coder-hxl/x-crawl) 点个 star 支持一下,感谢大家的支持! @@ -11,19 +11,19 @@ x-crawl 是一个灵活的 Node.js 多功能爬虫库。用法灵活,并且内 - **🔥 异步同步** - 只需更改一下 mode 属性即可切换异步或同步爬取模式。 - **⚙️ 多种用途** - 可爬页面、爬接口、爬文件以及轮询爬,满足各种场景需求。 - **🖋️ 写法灵活** - 同种爬取 API 适配多种配置,每种配置方式都非常独特。 -- **👀 设备指纹** - 零配置或自定义配置,避免指纹识别从不同位置识别并跟踪我们。 - **⏱️ 间隔爬取** - 无间隔、固定间隔以及随机间隔,产生或避免高并发爬取。 -- **🔄 失败重试** - 避免因短暂的问题而造成爬取失败,无限制重试次数。 -- **➡️ 轮换代理** - 配合失败重试,根据自定义错误次数以及 HTTP 状态码自动轮换代理。 +- **🔄 失败重试** - 避免因短暂的问题而造成爬取失败,自定义重试次数。 +- **➡️ 轮换代理** - 配合失败重试,自定义错误次数以及 HTTP 状态码自动轮换代理。 +- **👀 设备指纹** - 零配置或自定义配置,避免指纹识别从不同位置识别并跟踪我们。 - **🚀 优先队列** - 根据单个爬取目标的优先级可以优先于其他目标提前爬取。 - **☁️ 爬取 SPA** - 爬取 SPA(单页应用程序)生成预渲染内容(即“SSR”(服务器端渲染))。 - **⚒️ 控制页面** - 可以表单提交、键盘输入、事件操作、生成页面的屏幕截图等。 -- **🧾 捕获记录** - 对爬取的信息进行捕获记录,并在控制台进行高亮的提醒。 +- **🧾 捕获记录** - 对爬取进行捕获记录,并在终端使用彩色字符串提醒。 - **🦾 TypeScript** - 拥有类型,通过泛型实现完整的类型。 ## 跟 puppeteer 的关系 -crawlPage API 内置了 [puppeteer](https://github.com/puppeteer/puppeteer) ,您只需要传入一些配置选项即可完成一些操作,结果会将 Brower 实例和 Page 实例暴露出来。 +crawlPage API 内置了 [puppeteer](https://github.com/puppeteer/puppeteer) ,您只需要传入一些配置选项即可完成一些操作,结果会将 Brower 实例和 Page 实例暴露出来,您拿到的 Brower 实例和 Page 实例将是完好的,x-crawl 并不会对其重写。 # 目录 @@ -49,9 +49,10 @@ crawlPage API 内置了 [puppeteer](https://github.com/puppeteer/puppeteer) , - [onBeforeSaveItemFile](#onBeforeSaveItemFile) - [启动轮询](#启动轮询) - [配置优先级](#配置优先级) - - [自定义设备指纹](#自定义设备指纹) - [间隔时间](#间隔时间) - [失败重试](#失败重试) + - [轮换代理](#轮换代理) + - [自定义设备指纹](#自定义设备指纹) - [优先队列](#优先队列) - [关于结果](#关于结果) - [TypeScript](#TypeScript) @@ -89,19 +90,18 @@ crawlPage API 内置了 [puppeteer](https://github.com/puppeteer/puppeteer) , - [类型](#类型-6) - [API Config](#API-config) - [XCrawlConfig](#XCrawlConfig) - - [Detail target config](#Detail-target-config) + - [Detail Target Config](#Detail-Target-Config) - [CrawlPageDetailTargetConfig](#CrawlPageDetailTargetConfig) - [CrawlDataDetailTargetConfig](#CrawlDataDetailTargetConfig) - [CrawlFileDetailTargetConfig](#CrawlFileDetailTargetConfig) - - [Advanced config](#Advanced-config) + - [Advanced Config](#Advanced-Config) - [CrawlPageAdvancedConfig](#CrawlPageAdvancedConfig) - [CrawlDataAdvancedConfig](#CrawlDataAdvancedConfig) - [CrawlFileAdvancedConfig](#CrawlFileAdvancedConfig) - [StartPollingConfig](#StartPollingConfig) - - [Crawl other config](#Crawl-other-config) + - [Crawl Other Config](#Crawl-Other-Config) - [CrawlCommonConfig](#CrawlCommonConfig) - [DetailTargetFingerprintCommon](#DetailTargetFingerprintCommon) - - [AdvancedFingerprintCommon](#AdvancedFingerprintCommon) - [Mobile](#Mobile) - [Platform](#Platform) - [PageCookies](#PageCookies) @@ -109,10 +109,10 @@ crawlPage API 内置了 [puppeteer](https://github.com/puppeteer/puppeteer) , - [IntervalTime](#IntervalTime) - [API Result](#API-Result) - [XCrawlInstance](#XCrawlInstance) - - [CrawlCommonRes](#CrawlCommonRes) - - [CrawlPageSingleRes](#CrawlPageSingleRes) - - [CrawlDataSingleRes](#CrawlDataSingleRes) - - [CrawlFileSingleRes](#CrawlFileSingleRes) + - [CrawlCommonResult](#CrawlCommonResult) + - [CrawlPageSingleResult](#CrawlPageSingleResult) + - [CrawlDataSingleResult](#CrawlDataSingleResult) + - [CrawlFileSingleResult](#CrawlFileSingleResult) - [API Other](#API-Other) - [AnyObject](#AnyObject) - [更多](#更多) @@ -127,7 +127,7 @@ npm install x-crawl ## 示例 -每天自动获取 bilibili 首页、国漫、电影这三个页面的轮播图片为例: +每天自动获取某站 首页、国漫、电影这三个页面的轮播图片为例: ```js // 1.导入模块 ES/CJS @@ -304,7 +304,7 @@ myXCrawl.crawlPage('https://www.example.com').then(async (res) => { crawlPage API 拥有的声明周期函数: -- onCrawlItemComplete: 当每个爬取目标完成并进行了处理后会回调 +- onCrawlItemComplete: 当每个爬取目标完成后会回调 ##### onCrawlItemComplete @@ -340,7 +340,7 @@ myXCrawl.crawlData({ targets }).then((res) => { crawlData API 拥有的声明周期函数: -- onCrawlItemComplete: 当每个爬取目标完成并进行了处理后会回调 +- onCrawlItemComplete: 当每个爬取目标完成后会回调 ##### onCrawlItemComplete @@ -370,7 +370,7 @@ myXCrawl crawlFile API 拥有的声明周期函数: -- onCrawlItemComplete: 当每个爬取目标完成并进行了处理后会回调 +- onCrawlItemComplete: 当每个爬取目标完成后会回调 - onBeforeSaveItemFile: 会在保存文件前回调 @@ -451,72 +451,44 @@ myXCrawl.startPolling({ h: 2, m: 30 }, async (count, stopPolling) => { import xCrawl from 'x-crawl' // 应用实例配置 -const myXCrawl = xCrawl({ - intervalTime: { max: 3000, min: 1000 } +const testXCrawl = xCrawl({ + proxy: { + urls: [ + 'https://www.example.com/proxy-1', + 'https://www.example.com/proxy-2', + 'https://www.example.com/proxy-3' + ], + switchByErrorCount: 3, + switchByHttpStatus: [401, 403] + } }) // 进阶配置 -myXCrawl.crawlPage({ - targets: [ - 'https://www.example.com/page-1', - { - // 详细目标配置 - url: 'https://www.example.com/page-1', - viewport: { width: 1920, height: 1080 } - } - ], - intervalTime: 1000, - viewport: { width: 800, height: 600 } -}) -``` - -在上面的实例中,**应用实例配置**和**进阶配置**中都设置了间隔时间,那么将会以**进阶配置**的间隔时间为准。在**进阶配置**和**详细目标配置**中设置了视口,那么第二个目标会以其**详细目标配置**的视口为准。 - -### 自定义设备指纹 - -自定义配置设备指纹,可避免通过指纹识别从不同位置识别并跟踪我们。 - -可以通过进阶用法在 fingerprint 传入多个信息,内部会帮助您随机分配给 targets 的每个目标。也可以直接用详细目标配置为目标设置特定的指纹。 - -以 crawlPage 为例: - -```js -import xCrawl from 'x-crawl' - -const myXCrawl = xCrawl({ intervalTime: { max: 5000, min: 3000 } }) - -myXCrawl +testXCrawl .crawlPage({ targets: [ 'https://www.example.com/page-1', + 'https://www.example.com/page-2', + // 详细目标配置 { - // 指定指纹 - url: 'https://www.example.com/page-2', - fingerprint: { - maxWidth: 1980, - minWidth: 1200, - maxHeight: 1080, - minHidth: 800, - platform: 'Android' - } + url: 'https://www.example.com/page-3', + proxy: { urls: ['https://www.example.com/proxy-5'] } } ], - fingerprint: { - // 为 targets 里的每个目标设置指纹 - maxWidth: 1980, - maxHeight: 1080, - userAgents: [ - 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0', - 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36', - 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0' + maxRetry: 10, + proxy: { + urls: [ + 'https://www.example.com/proxy-3', + 'https://www.example.com/proxy-4' ], - platforms: ['Chromium OS', 'iOS', 'Linux', 'macOS', 'Windows'] + switchByErrorCount: 3, + switchByHttpStatus: [401, 403] } }) .then((res) => {}) ``` -更多指纹选项可以前往对应的配置查看。 +在上面的实例中,**应用实例配置**、**进阶配置**以及**详细目标配置**中都设置了**代理**,page3 将会采用自己的代理配置,page1 和 page2 将采用进阶配置的代理配置。 ### 间隔时间 @@ -548,6 +520,8 @@ intervalTime 选项默认为 undefined 。若有设置值,则会在爬取目 可避免因一时问题而造成爬取失败,将会等待这一轮爬取目标结束后重新爬取目标。 +可以通过在 创建爬虫应用实例、进阶用法、详细目标 这三个地方设置失败重试次数。 + ```js import xCrawl from 'x-crawl' @@ -560,6 +534,130 @@ myXCrawl maxRetry 属性决定要重试几次。 +### 轮换代理 + +配合失败重试,自定义错误次数以及 HTTP 状态码为爬取目标自动轮换代理。 + +可以通过在 创建爬虫应用实例、进阶用法、详细目标 这三个地方设置失败重试次数。 + +以 crawlPage 为例: + +```js +import xCrawl from 'x-crawl' + +const testXCrawl = xCrawl() + +testXCrawl + .crawlPage({ + targets: [ + 'https://www.example.com/page-1', + 'https://www.example.com/page-2', + 'https://www.example.com/page-3', + 'https://www.example.com/page-4', + // 为此目标取消代理 + { url: 'https://www.example.com/page-6', proxy: null }, + // 为此目标单独设置代理 + { + url: 'https://www.example.com/page-6', + proxy: { + urls: [ + 'https://www.example.com/proxy-4', + 'https://www.example.com/proxy-5' + ], + switchByErrorCount: 3 + } + } + ], + maxRetry: 10, + // 为此次的目标统一设置代理 + proxy: { + urls: [ + 'https://www.example.com/proxy-1', + 'https://www.example.com/proxy-2', + 'https://www.example.com/proxy-3' + ], + switchByErrorCount: 3, + switchByHttpStatus: [401, 403] + } + }) + .then((res) => {}) +``` + +**注意:** 该功能需要配合失败重试才能正常使用。 + +### 自定义设备指纹 + +自定义配置设备指纹,可避免通过指纹识别从不同位置识别并跟踪我们。 + +可以通过进阶用法在 fingerprints 传入多个信息,内部会帮助您随机分配给 targets 的每个目标。也可以直接用详细目标配置为目标设置特定的指纹。 + +以 crawlPage 为例: + +```js +import xCrawl from 'x-crawl' + +const myXCrawl = xCrawl({ intervalTime: { max: 5000, min: 3000 } }) + +myXCrawl.crawlPage({ + targets: [ + 'https://www.example.com/page-1', + 'https://www.example.com/page-2', + 'https://www.example.com/page-3', + // 为此目标取消指纹 + { url: 'https://www.example.com/page-4', fingerprint: null }, + // 为此目标单独设置指纹 + { + url: 'https://www.example.com/page-5', + fingerprint: { + mobile: 'random', + platform: 'Windows', + acceptLanguage: `zh-CN,zh;q=0.9,en;q=0.8`, + userAgent: { + value: + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', + versions: [ + { name: 'Chrome', maxMinorVersion: 10, maxPatchVersion: 5615 }, + { name: 'Safari', maxMinorVersion: 36, maxPatchVersion: 2333 } + ] + } + } + } + ], + // 为此次的目标统一设置指纹 + fingerprints: [ + { + maxWidth: 1024, + maxHeight: 800, + platform: 'Windows', + mobile: 'random', + userAgent: { + value: + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', + versions: [ + { + name: 'Chrome', + // 浏览器版本 + maxMajorVersion: 112, + minMajorVersion: 100, + maxMinorVersion: 20, + maxPatchVersion: 5000 + }, + { + name: 'Safari', + maxMajorVersion: 537, + minMajorVersion: 500, + maxMinorVersion: 36, + maxPatchVersion: 5000 + } + ] + } + } + ] +}) +``` + +更多指纹选项可以前往对应的配置查看。 + ### 优先队列 优先队列可以让某个爬取目标优先发送。 @@ -588,6 +686,7 @@ priority 属性的值越大就在当前爬取队列中越优先。 - isSuccess:是否成功爬取 - maxRetry:该次爬取目标的最大重试次数 - retryCount:该次爬取目标已经重试的次数 +- proxyDetails:记录代理情况 - crawlErrorQueue:该次爬取目标的报错收集 - data:该次爬取目标的爬取数据 @@ -648,23 +747,23 @@ crawlPage API 是一个函数。类型是 [重载函数](https://www.typescriptl type crawlPage = { ( config: string, - callback?: (res: CrawlPageSingleRes) => void - ): Promise + callback?: (res: CrawlPageSingleResult) => void + ): Promise ( config: CrawlPageDetailTargetConfig, - callback?: (res: CrawlPageSingleRes) => void - ): Promise + callback?: (res: CrawlPageSingleResult) => void + ): Promise ( config: (string | CrawlPageDetailTargetConfig)[], - callback?: (res: CrawlPageSingleRes[]) => void - ): Promise + callback?: (res: CrawlPageSingleResult[]) => void + ): Promise ( config: CrawlPageAdvancedConfig, - callback?: (res: CrawlPageSingleRes[]) => void - ): Promise + callback?: (res: CrawlPageSingleResult[]) => void + ): Promise } ``` @@ -675,7 +774,7 @@ type crawlPage = { **返回值类型:** -- 查看 [CrawlPageSingleRes](#CrawlPageSingleRes) 类型 +- 查看 [CrawlPageSingleResult](#CrawlPageSingleResult) 类型 #### 示例 @@ -799,23 +898,23 @@ crawlData API 是一个函数。类型是 [重载函数](https://www.typescriptl type crawlData = { ( config: CrawlDataDetailTargetConfig, - callback?: (res: CrawlDataSingleRes) => void - ): Promise> + callback?: (res: CrawlDataSingleResult) => void + ): Promise> ( config: string, - callback?: (res: CrawlDataSingleRes) => void - ): Promise> + callback?: (res: CrawlDataSingleResult) => void + ): Promise> ( config: (string | CrawlDataDetailTargetConfig)[], - callback?: (res: CrawlDataSingleRes[]) => void - ): Promise[]> + callback?: (res: CrawlDataSingleResult[]) => void + ): Promise[]> ( config: CrawlDataAdvancedConfig, - callback?: (res: CrawlDataSingleRes[]) => void - ): Promise[]> + callback?: (res: CrawlDataSingleResult[]) => void + ): Promise[]> } ``` @@ -826,7 +925,7 @@ type crawlData = { **返回值类型:** -- 查看 [CrawlDataSingleRes](#CrawlDataSingleRes) 类型 +- 查看 [CrawlDataSingleResult](#CrawlDataSingleResult) 类型 #### 示例 @@ -957,18 +1056,18 @@ crawlFile API 是一个函数。类型是 [重载函数](https://www.typescriptl type crawlFile = { ( config: CrawlFileDetailTargetConfig, - callback?: (res: CrawlFileSingleRes) => void - ): Promise + callback?: (res: CrawlFileSingleResult) => void + ): Promise ( config: CrawlFileDetailTargetConfig[], - callback?: (res: CrawlFileSingleRes[]) => void - ): Promise + callback?: (res: CrawlFileSingleResult[]) => void + ): Promise ( config: CrawlFileAdvancedConfig, - callback?: (res: CrawlFileSingleRes[]) => void - ): Promise + callback?: (res: CrawlFileSingleResult[]) => void + ): Promise } ``` @@ -979,7 +1078,7 @@ type crawlFile = { **返回值类型:** -- 查看 [CrawlFileSingleRes](#CrawlFileSingleRes) 类型 +- 查看 [CrawlFileSingleResult](#CrawlFileSingleResult) 类型 #### 示例 @@ -1120,7 +1219,7 @@ myXCrawl.startPolling({ h: 2, m: 30 }, (count, stopPolling) => { ## 类型 -### API config +### API Config #### XCrawlConfig @@ -1144,7 +1243,7 @@ export interface XCrawlConfig extends CrawlCommonConfig { - intervalTime: undefined - crawlPage: undefined -#### Detail target config +#### Detail Target Config ##### CrawlPageDetailTargetConfig @@ -1157,9 +1256,9 @@ export interface CrawlPageDetailTargetConfig extends CrawlCommonConfig { viewport?: Viewport | null // puppeteer fingerprint?: | (DetailTargetFingerprintCommon & { - maxWidth: number + maxWidth?: number minWidth?: number - maxHeight: number + maxHeight?: number minHidth?: number }) | null @@ -1223,7 +1322,7 @@ export interface CrawlFileDetailTargetConfig extends CrawlCommonConfig { - extension: string - fingerprint: undefined -#### Advanced config +#### Advanced Config ##### CrawlPageAdvancedConfig @@ -1231,18 +1330,18 @@ export interface CrawlFileDetailTargetConfig extends CrawlCommonConfig { export interface CrawlPageAdvancedConfig extends CrawlCommonConfig { targets: (string | CrawlPageDetailTargetConfig)[] intervalTime?: IntervalTime - fingerprint?: AdvancedFingerprintCommon & { - maxWidth: number + fingerprints?: (DetailTargetFingerprintCommon & { + maxWidth?: number minWidth?: number - maxHeight: number + maxHeight?: number minHidth?: number - } + })[] headers?: AnyObject cookies?: PageCookies - viewport?: Viewport // puppeteer + viewport?: Viewport - onCrawlItemComplete?: (crawlPageSingleRes: CrawlPageSingleRes) => void + onCrawlItemComplete?: (crawlPageSingleResult: CrawlPageSingleResult) => void } ``` @@ -1250,7 +1349,7 @@ export interface CrawlPageAdvancedConfig extends CrawlCommonConfig { - targets: undefined - intervalTime: undefined -- fingerprint: undefined +- fingerprints: undefined - headers: undefined - cookies: undefined - viewport: undefined @@ -1262,11 +1361,13 @@ export interface CrawlPageAdvancedConfig extends CrawlCommonConfig { export interface CrawlDataAdvancedConfig extends CrawlCommonConfig { targets: (string | CrawlDataDetailTargetConfig)[] intervalTime?: IntervalTime - fingerprint?: AdvancedFingerprintCommon + fingerprints?: DetailTargetFingerprintCommon[] headers?: AnyObject - onCrawlItemComplete?: (crawlDataSingleRes: CrawlDataSingleRes) => void + onCrawlItemComplete?: ( + crawlDataSingleResult: CrawlDataSingleResult + ) => void } ``` @@ -1274,7 +1375,7 @@ export interface CrawlDataAdvancedConfig extends CrawlCommonConfig { - targets: undefined - intervalTime: undefined -- fingerprint: undefined +- fingerprints: undefined - headers: undefined - onCrawlItemComplete: undefined @@ -1284,13 +1385,13 @@ export interface CrawlDataAdvancedConfig extends CrawlCommonConfig { export interface CrawlFileAdvancedConfig extends CrawlCommonConfig { targets: (string | CrawlFileDetailTargetConfig)[] intervalTime?: IntervalTime - fingerprint?: AdvancedFingerprintCommon + fingerprints?: DetailTargetFingerprintCommon[] headers?: AnyObject storeDir?: string extension?: string - onCrawlItemComplete?: (crawlFileSingleRes: CrawlFileSingleRes) => void + onCrawlItemComplete?: (crawlFileSingleResult: CrawlFileSingleResult) => void onBeforeSaveItemFile?: (info: { id: number fileName: string @@ -1304,7 +1405,7 @@ export interface CrawlFileAdvancedConfig extends CrawlCommonConfig { - targets: undefined - intervalTime: undefined -- fingerprint: undefined +- fingerprints: undefined - headers: undefined - storeDir: \_\_dirname - extension: string @@ -1327,15 +1428,19 @@ export interface StartPollingConfig { - h: undefined - m: undefined -#### Crawl other config +#### Crawl Other Config ##### CrawlCommonConfig ```ts export interface CrawlCommonConfig { - timeout?: number - proxy?: string - maxRetry?: number + timeout?: number | null + proxy?: { + urls: string[] + switchByHttpStatus?: number[] + switchByErrorCount?: number + } | null + maxRetry?: number | null } ``` @@ -1349,45 +1454,34 @@ export interface CrawlCommonConfig { ```ts export interface DetailTargetFingerprintCommon { - userAgent?: string ua?: string + mobile?: '?0' | '?1' | 'random' platform?: Platform platformVersion?: string - mobile?: Mobile acceptLanguage?: string + userAgent?: { + value: string + versions?: { + name: string + maxMajorVersion?: number + minMajorVersion?: number + maxMinorVersion?: number + minMinorVersion?: number + maxPatchVersion?: number + minPatchVersion?: number + }[] + } } ``` **默认值** -- userAgent: undefined - ua: undefined +- mobile: undefined - platform: undefined - platformVersion: undefined -- mobile: undefined - acceptLanguage: undefined - -##### AdvancedFingerprintCommon - -```ts -export interface AdvancedFingerprintCommon { - userAgents?: string[] - uas?: string[] - platforms?: Platform[] - platformVersions?: string[] - mobiles?: Mobile[] - acceptLanguages?: string[] -} -``` - -**默认值** - -- userAgents: undefined -- uas: undefined -- platforms: undefined -- platformVersions: undefined -- mobiles: undefined -- acceptLanguages: undefined +- userAgent: undefined ##### Mobile @@ -1450,7 +1544,7 @@ export type Method = export type IntervalTime = number | { max: number; min?: number } ``` -### API result +### API Result #### XCrawlInstance @@ -1459,62 +1553,62 @@ export interface XCrawlInstance { crawlPage: { ( config: string, - callback?: (res: CrawlPageSingleRes) => void - ): Promise + callback?: (res: CrawlPageSingleResult) => void + ): Promise ( config: CrawlPageDetailTargetConfig, - callback?: (res: CrawlPageSingleRes) => void - ): Promise + callback?: (res: CrawlPageSingleResult) => void + ): Promise ( config: (string | CrawlPageDetailTargetConfig)[], - callback?: (res: CrawlPageSingleRes[]) => void - ): Promise + callback?: (res: CrawlPageSingleResult[]) => void + ): Promise ( config: CrawlPageAdvancedConfig, - callback?: (res: CrawlPageSingleRes[]) => void - ): Promise + callback?: (res: CrawlPageSingleResult[]) => void + ): Promise } crawlData: { ( config: CrawlDataDetailTargetConfig, - callback?: (res: CrawlDataSingleRes) => void - ): Promise> + callback?: (res: CrawlDataSingleResult) => void + ): Promise> ( config: string, - callback?: (res: CrawlDataSingleRes) => void - ): Promise> + callback?: (res: CrawlDataSingleResult) => void + ): Promise> ( config: (string | CrawlDataDetailTargetConfig)[], - callback?: (res: CrawlDataSingleRes[]) => void - ): Promise[]> + callback?: (res: CrawlDataSingleResult[]) => void + ): Promise[]> ( config: CrawlDataAdvancedConfig, - callback?: (res: CrawlDataSingleRes[]) => void - ): Promise[]> + callback?: (res: CrawlDataSingleResult[]) => void + ): Promise[]> } crawlFile: { ( config: CrawlFileDetailTargetConfig, - callback?: (res: CrawlFileSingleRes) => void - ): Promise + callback?: (res: CrawlFileSingleResult) => void + ): Promise ( config: CrawlFileDetailTargetConfig[], - callback?: (res: CrawlFileSingleRes[]) => void - ): Promise + callback?: (res: CrawlFileSingleResult[]) => void + ): Promise ( config: CrawlFileAdvancedConfig, - callback?: (res: CrawlFileSingleRes[]) => void - ): Promise + callback?: (res: CrawlFileSingleResult[]) => void + ): Promise } startPolling: ( @@ -1524,14 +1618,15 @@ export interface XCrawlInstance { } ``` -#### CrawlCommonRes +#### CrawlCommonResult ```ts -export interface CrawlCommonRes { +export interface CrawlCommonResult { id: number isSuccess: boolean maxRetry: number retryCount: number + proxyDetails: ProxyDetails crawlErrorQueue: Error[] } ``` @@ -1540,12 +1635,13 @@ export interface CrawlCommonRes { - isSuccess:是否成功爬取 - maxRetry:该次爬取目标的最大重试次数 - retryCount:该次爬取目标已经重试的次数 +- proxyDetails:记录代理情况 - crawlErrorQueue:该次爬取目标的报错收集 -#### CrawlPageSingleRes +#### CrawlPageSingleResult ```ts -export interface CrawlPageSingleRes extends CrawlCommonRes { +export interface CrawlPageSingleResult extends CrawlCommonResult { data: { browser: Browser // puppeteer response: HTTPResponse | null // puppeteer @@ -1554,10 +1650,10 @@ export interface CrawlPageSingleRes extends CrawlCommonRes { } ``` -#### CrawlDataSingleRes +#### CrawlDataSingleResult ```ts -export interface CrawlDataSingleRes extends CrawlCommonRes { +export interface CrawlDataSingleResult extends CrawlCommonResult { data: { statusCode: number | undefined headers: IncomingHttpHeaders // nodejs http @@ -1566,10 +1662,10 @@ export interface CrawlDataSingleRes extends CrawlCommonRes { } ``` -#### CrawlFileSingleRes +#### CrawlFileSingleResult ```ts -export interface CrawlFileSingleRes extends CrawlCommonRes { +export interface CrawlFileSingleResult extends CrawlCommonResult { data: { statusCode: number | undefined headers: IncomingHttpHeaders // nodejs http @@ -1598,5 +1694,3 @@ export interface AnyObject extends Object { ## 更多 如果您有 **问题 、需求、好的建议** 请在 https://github.com/coder-hxl/x-crawl/issues 中提 **Issues** 。 - -感谢大家的支持。 diff --git a/publish/README.md b/publish/README.md index 61f5a091..7b935236 100644 --- a/publish/README.md +++ b/publish/README.md @@ -9,20 +9,21 @@ x-crawl is a flexible Node.js multipurpose crawler library. The usage is flexibl ## Features - **🔥 Asynchronous Synchronous** - Just change the mode property to toggle asynchronous or synchronous crawling mode. -- **⚙️Multiple purposes** - It can crawl pages, crawl interfaces, crawl files and poll crawls to meet the needs of various scenarios. +- **⚙️ Multiple purposes** - It can crawl pages, crawl interfaces, crawl files and poll crawls to meet the needs of various scenarios. - **🖋️ Flexible writing style** - The same crawling API can be adapted to multiple configurations, and each configuration method is very unique. -- **👀Device Fingerprinting** - Zero configuration or custom configuration, avoid fingerprinting to identify and track us from different locations. - **⏱️ Interval Crawling** - No interval, fixed interval and random interval to generate or avoid high concurrent crawling. -- **🔄 Failed Retry** - Avoid crawling failure due to transient problems, unlimited retries. +- **🔄 Failed Retry** - Avoid crawling failure due to short-term problems, and customize the number of retries. +- **➡️ Proxy Rotation** - Auto-rotate proxies with failure retry, custom error times and HTTP status codes. +- **👀 Device Fingerprinting** - Zero configuration or custom configuration, avoid fingerprinting to identify and track us from different locations. - **🚀 Priority Queue** - According to the priority of a single crawling target, it can be crawled ahead of other targets. - **☁️ Crawl SPA** - Crawl SPA (Single Page Application) to generate pre-rendered content (aka "SSR" (Server Side Rendering)). - **⚒️ Control Page** - You can submit form, keyboard input, event operation, generate screenshots of the page, etc. -- **🧾 Capture Record** - Capture and record the crawled information, and highlight it on the console. +- **🧾 Capture Record** - Capture and record crawling, and use colored strings to remind in the terminal. - **🦾 TypeScript** - Own types, implement complete types through generics. ## Relationship with Puppeteer -The crawlPage API has [puppeteer](https://github.com/puppeteer/puppeteer) built in, you only need to pass in some configuration options to complete some operations, and the result will expose Brower instances and Page instances. +The crawlPage API has built-in [puppeteer](https://github.com/puppeteer/puppeteer), you only need to pass in some configuration options to complete some operations, the result will expose the Brower instance and Page instance, you get Brower instance and Page instance will be intact, x-crawl will not rewrite them. # Table of Contents @@ -48,9 +49,10 @@ The crawlPage API has [puppeteer](https://github.com/puppeteer/puppeteer) built - [onBeforeSaveItemFile](#onBeforeSaveItemFile) - [Start Polling](#Start-Polling) - [Config Priority](#Config-Priority) - - [Custom Device Fingerprint](#Custom-Device-Fingerprint) - [Interval Time](#Interval-Time) - [Fail Retry](#Fail-Retry) + - [Rotate Proxy](#Rotate Proxy) + - [Custom Device Fingerprint](#Custom-Device-Fingerprint) - [Priority Queue](#Priority-Queue) - [About Results](#About-Results) - [TypeScript](#TypeScript) @@ -85,21 +87,20 @@ The crawlPage API has [puppeteer](https://github.com/puppeteer/puppeteer) built - [Type](#Type-4) - [Example](#Example-5) - [Types](#Types) - - [API Config](#API-config) + - [API Config](#API-Config) - [XCrawlConfig](#XCrawlConfig) - - [Detail target config](#Detail-target-config) + - [Detail Target Config](#Detail-Target-Config) - [CrawlPageDetailTargetConfig](#CrawlPageDetailTargetConfig) - [CrawlDataDetailTargetConfig](#CrawlDataDetailTargetConfig) - [CrawlFileDetailTargetConfig](#CrawlFileDetailTargetConfig) - - [Advanced config](#Advanced-config) + - [Advanced Config](#Advanced-Config) - [CrawlPageAdvancedConfig](#CrawlPageAdvancedConfig) - [CrawlDataAdvancedConfig](#CrawlDataAdvancedConfig) - [CrawlFileAdvancedConfig](#CrawlFileAdvancedConfig) - [StartPollingConfig](#StartPollingConfig) - - [Crawl other config](#Crawl-other-config) + - [Crawl Other Config](#Crawl-Other-Config) - [CrawlCommonConfig](#CrawlCommonConfig) - [DetailTargetFingerprintCommon](#DetailTargetFingerprintCommon) - - [AdvancedFingerprintCommon](#AdvancedFingerprintCommon) - [Mobile](#Mobile) - [Platform](#Platform) - [PageCookies](#PageCookies) @@ -107,10 +108,10 @@ The crawlPage API has [puppeteer](https://github.com/puppeteer/puppeteer) built - [IntervalTime](#IntervalTime) - [API Result](#API-Result) - [XCrawlInstance](#XCrawlInstance) - - [CrawlCommonRes](#CrawlCommonRes) - - [CrawlPageSingleRes](#CrawlPageSingleRes) - - [CrawlDataSingleRes](#CrawlDataSingleRes) - - [CrawlFileSingleRes](#CrawlFileSingleRes) + - [CrawlCommonResult](#CrawlCommonResult) + - [CrawlPageSingleResult](#CrawlPageSingleResult) + - [CrawlDataSingleResult](#CrawlDataSingleResult) + - [CrawlFileSingleResult](#CrawlFileSingleResult) - [API Other](#API-Other) - [AnyObject](#AnyObject) - [More](#More) @@ -304,7 +305,7 @@ myXCrawl.crawlPage('https://www.example.com').then(async (res) => { Lifecycle functions owned by the crawlPage API: -- onCrawlItemComplete: Called when each crawl item is completed and processed +- onCrawlItemComplete: Call back when each crawl is complete ##### onCrawlItemComplete @@ -340,7 +341,7 @@ myXCrawl.crawlData({ targets }).then((res) => { Life cycle functions owned by crawlData API: -- onCrawlItemComplete: Called when each crawl item is completed and processed +- onCrawlItemComplete: Call back when each crawl is complete ##### onCrawlItemComplete @@ -374,7 +375,7 @@ myXCrawl Life cycle functions owned by crawlFile API: -- onCrawlItemComplete: Called when each crawl item is completed and processed +- onCrawlItemComplete: Call back when each crawl is complete - onBeforeSaveItemFile: Callback before saving the file @@ -448,7 +449,7 @@ Some common configurations can be set in these three places: - Application instance configuration (global) - Advanced configuration (partial) -- detailed target configuration (separately) +- Detailed target configuration (separately) The priority is: detailed target configuration > advanced configuration > application instance configuration @@ -457,73 +458,45 @@ Take crawlPage to crawl two pages as an example: ```js import xCrawl from 'x-crawl' -// Application instance configuration -const myXCrawl = xCrawl({ - intervalTime: { max: 3000, min: 1000 } -}) - -// advanced configuration -myXCrawl.crawlPage({ - targets: [ - 'https://www.example.com/page-1', - { - // Detailed target configuration - url: 'https://www.example.com/page-1', - viewport: { width: 1920, height: 1080 } - } - ], - intervalTime: 1000, - viewport: { width: 800, height: 600 } +// Application instance configurationconst testXCrawl = xCrawl({ + proxy: { + urls: [ + 'https://www.example.com/proxy-1', + 'https://www.example.com/proxy-2', + 'https://www.example.com/proxy-3' + ], + switchByErrorCount: 3, + switchByHttpStatus: [401, 403] + } }) -``` - -### Custom Device Fingerprint - -Customize the configuration of device fingerprints to avoid identifying and tracking us from different locations through fingerprint recognition. - -Multiple information can be passed in the fingerprint through advanced usage, and internally it will help you randomly assign each target to targets. It is also possible to set a specific fingerprint for a target directly with the detailed target configuration. - -Take crawlPage as an example: - -```js -import xCrawl from 'x-crawl' - -const myXCrawl = xCrawl({ intervalTime: { max: 5000, min: 3000 } }) -myXCrawl +// Advanced configuration +testXCrawl .crawlPage({ targets: [ 'https://www.example.com/page-1', + 'https://www.example.com/page-2', + // Detailed target configuration { - // Specify the fingerprint - url: 'https://www.example.com/page-2', - fingerprint: { - maxWidth: 1980, - minWidth: 1200, - maxHeight: 1080, - minHidth: 800, - platform: 'Android' - } + url: 'https://www.example.com/page-3', + proxy: { urls: ['https://www.example.com/proxy-5'] } } ], - fingerprint: { - // set fingerprint for each target in targets - maxWidth: 1980, - maxHeight: 1080, - userAgents: [ - 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0', - 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36', - 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0' + maxRetry: 10, + proxy: { + urls: [ + 'https://www.example.com/proxy-3', + 'https://www.example.com/proxy-4' ], - platforms: ['Chromium OS', 'iOS', 'Linux', 'macOS', 'Windows'] + switchByErrorCount: 3, + switchByHttpStatus: [401, 403] } }) .then((res) => {}) +}) ``` -For more fingerprint options, you can go to the corresponding configuration to view. - -In the above example, the interval time is set in both **Application Instance Configuration** and **Advanced Configuration**, then the interval time of **Advanced Configuration** will prevail. If the viewport is set in **Advanced Configuration** and **Detailed Target Configuration**, then the second target will be based on the viewport of its **Detailed Target Configuration**. +In the above example, **Proxy** is set in **Application Instance Configuration**, **Advanced Configuration** and **Detailed Target Configuration**, page3 will use its own proxy configuration, page1 and page2 will use the proxy configuration of the advanced configuration. ### Interval Time @@ -555,6 +528,8 @@ The intervalTime option defaults to undefined . If there is a setting value, it It can avoid crawling failure due to temporary problems, and will wait for the end of this round of crawling targets to crawl again. +The number of failed retries can be set by creating crawler application instance, advanced usage, and detailed target. + ```js import xCrawl from 'x-crawl' @@ -567,6 +542,130 @@ myXCrawl The maxRetry attribute determines how many times to retry. +### Rotate Proxy + +With failed retries, custom error times and HTTP status codes, the proxy is automatically rotated for crawling targets. + +You can set the number of failed retries in the three places of creating a crawler application instance, advanced usage, and detailed goals. + +Take crawlPage as an example: + +```js +import xCrawl from 'x-crawl' + +const testXCrawl = xCrawl() + +testXCrawl + .crawlPage({ + targets: [ + 'https://www.example.com/page-1', + 'https://www.example.com/page-2', + 'https://www.example.com/page-3', + 'https://www.example.com/page-4', + // Undelegate for this target + { url: 'https://www.example.com/page-6', proxy: null }, + // Set the proxy individually for this target + { + url: 'https://www.example.com/page-6', + proxy: { + urls: [ + 'https://www.example.com/proxy-4', + 'https://www.example.com/proxy-5' + ], + switchByErrorCount: 3 + } + } + ], + maxRetry: 10, + // Set the proxy uniformly for this target + proxy: { + urls: [ + 'https://www.example.com/proxy-1', + 'https://www.example.com/proxy-2', + 'https://www.example.com/proxy-3' + ], + switchByErrorCount: 3, + switchByHttpStatus: [401, 403] + } + }) + .then((res) => {}) +``` + +**Note:** This function needs to cooperate with failure retry to work normally. + +### Custom Device Fingerprint + +Customize the configuration of device fingerprints to avoid identifying and tracking us from different locations through fingerprint recognition. + +Multiple information can be passed in fingerprints through advanced usage, and internally it will help you randomly assign each target to targets. It is also possible to set a specific fingerprint for a target directly with the detailed target configuration. + +Take crawlPage as an example: + +```js +import xCrawl from 'x-crawl' + +const myXCrawl = xCrawl({ intervalTime: { max: 5000, min: 3000 } }) + +myXCrawl.crawlPage({ + targets: [ + 'https://www.example.com/page-1', + 'https://www.example.com/page-2', + 'https://www.example.com/page-3', + // Unfingerprint for this target + { url: 'https://www.example.com/page-4', fingerprint: null }, + // Set the fingerprint individually for this target + { + url: 'https://www.example.com/page-5', + fingerprint: { + mobile: 'random', + platform: 'Windows', + acceptLanguage: `zh-CN,zh;q=0.9,en;q=0.8`, + userAgent: { + value: + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', + versions: [ + { name: 'Chrome', maxMinorVersion: 10, maxPatchVersion: 5615 }, + { name: 'Safari', maxMinorVersion: 36, maxPatchVersion: 2333 } + ] + } + } + } + ], + // Set the fingerprint uniformly for this target + fingerprints: [ + { + maxWidth: 1024, + maxHeight: 800, + platform: 'Windows', + mobile: 'random', + userAgent: { + value: + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', + versions: [ + { + name: 'Chrome', + // browser version + maxMajorVersion: 112, + minMajorVersion: 100, + maxMinorVersion: 20, + maxPatchVersion: 5000 + }, + { + name: 'Safari', + maxMajorVersion: 537, + minMajorVersion: 500, + maxMinorVersion: 36, + maxPatchVersion: 5000 + } + ] + } + } + ] +}) +``` + +For more fingerprint options, you can go to the corresponding configuration to view. + ### Priority Queue A priority queue allows a crawl target to be sent first. @@ -595,6 +694,7 @@ Each crawl target will generate a detail object, which will contain the followin - isSuccess: Whether to crawl successfully - maxRetry: The maximum number of retries for this crawling target - retryCount: The number of times the crawling target has been retried +- proxyDetails: record the proxy situation - crawlErrorQueue: Error collection of the crawl target - data: the crawling data of the crawling target @@ -657,23 +757,23 @@ The crawlPage API is a function. A type is an [overloaded function](https://www. type crawlPage = { ( config: string, - callback?: (res: CrawlPageSingleRes) => void - ): Promise + callback?: (res: CrawlPageSingleResult) => void + ): Promise ( config: CrawlPageDetailTargetConfig, - callback?: (res: CrawlPageSingleRes) => void - ): Promise + callback?: (res: CrawlPageSingleResult) => void + ): Promise ( config: (string | CrawlPageDetailTargetConfig)[], - callback?: (res: CrawlPageSingleRes[]) => void - ): Promise + callback?: (res: CrawlPageSingleResult[]) => void + ): Promise ( config: CrawlPageAdvancedConfig, - callback?: (res: CrawlPageSingleRes[]) => void - ): Promise + callback?: (res: CrawlPageSingleResult[]) => void + ): Promise } ``` @@ -684,7 +784,7 @@ type crawlPage = { **Return value type:** -- Look at the [CrawlPageSingleRes](#CrawlPageSingleRes) type +- Look at the [CrawlPageSingleResult](#CrawlPageSingleResult) type #### Example @@ -808,23 +908,23 @@ The crawlData API is a function. A type is an [overloaded function](https://www. type crawlData = { ( config: CrawlDataDetailTargetConfig, - callback?: (res: CrawlDataSingleRes) => void - ): Promise> + callback?: (res: CrawlDataSingleResult) => void + ): Promise> ( config: string, - callback?: (res: CrawlDataSingleRes) => void - ): Promise> + callback?: (res: CrawlDataSingleResult) => void + ): Promise> ( config: (string | CrawlDataDetailTargetConfig)[], - callback?: (res: CrawlDataSingleRes[]) => void - ): Promise[]> + callback?: (res: CrawlDataSingleResult[]) => void + ): Promise[]> ( config: CrawlDataAdvancedConfig, - callback?: (res: CrawlDataSingleRes[]) => void - ): Promise[]> + callback?: (res: CrawlDataSingleResult[]) => void + ): Promise[]> } ``` @@ -835,7 +935,7 @@ type crawlData = { **Return value type:** -- Look at the [CrawlDataSingleRes](#CrawlDataSingleRes) type +- Look at the [CrawlDataSingleResult](#CrawlDataSingleResult) type #### Example @@ -965,18 +1065,18 @@ The crawlFile API is a function. A type is an [overloaded function](https://www. type crawlFile = { ( config: CrawlFileDetailTargetConfig, - callback?: (res: CrawlFileSingleRes) => void - ): Promise + callback?: (res: CrawlFileSingleResult) => void + ): Promise ( config: CrawlFileDetailTargetConfig[], - callback?: (res: CrawlFileSingleRes[]) => void - ): Promise + callback?: (res: CrawlFileSingleResult[]) => void + ): Promise ( config: CrawlFileAdvancedConfig, - callback?: (res: CrawlFileSingleRes[]) => void - ): Promise + callback?: (res: CrawlFileSingleResult[]) => void + ): Promise } ``` @@ -987,7 +1087,7 @@ type crawlFile = { **Return value type:** -- Look at the [CrawlFileSingleRes](#CrawlFileSingleRes) type +- Look at the [CrawlFileSingleResult](#CrawlFileSingleResult) type #### Example @@ -1128,7 +1228,7 @@ myXCrawl.startPolling({ h: 2, m: 30 }, (count, stopPolling) => { ## Types -### API config +### API Config #### XCrawlConfig @@ -1165,9 +1265,9 @@ export interface CrawlPageDetailTargetConfig extends CrawlCommonConfig { viewport?: Viewport | null // puppeteer fingerprint?: | (DetailTargetFingerprintCommon & { - maxWidth: number + maxWidth?: number minWidth?: number - maxHeight: number + maxHeight?: number minHidth?: number }) | null @@ -1231,7 +1331,7 @@ export interface CrawlFileDetailTargetConfig extends CrawlCommonConfig { - extension: string - fingerprint: undefined -#### Advanced config +#### Advanced Config ##### CrawlPageAdvancedConfig @@ -1239,27 +1339,26 @@ export interface CrawlFileDetailTargetConfig extends CrawlCommonConfig { export interface CrawlPageAdvancedConfig extends CrawlCommonConfig { targets: (string | CrawlPageDetailTargetConfig)[] intervalTime?: IntervalTime - fingerprint?: AdvancedFingerprintCommon & { - maxWidth: number + fingerprints?: (DetailTargetFingerprintCommon & { + maxWidth?: number minWidth?: number - maxHeight: number + maxHeight?: number minHidth?: number - } + })[] headers?: AnyObject cookies?: PageCookies - viewport?: Viewport // puppeteer + viewport?: Viewport - onCrawlItemComplete?: (crawlPageSingleRes: CrawlPageSingleRes) => void + onCrawlItemComplete?: (crawlPageSingleResult: CrawlPageSingleResult) => void } ``` **Default Value** - targets: undefined - - intervalTime: undefined -- fingerprint: undefined +- fingerprints: undefined - headers: undefined - cookies: undefined - viewport: undefined @@ -1271,11 +1370,13 @@ export interface CrawlPageAdvancedConfig extends CrawlCommonConfig { export interface CrawlDataAdvancedConfig extends CrawlCommonConfig { targets: (string | CrawlDataDetailTargetConfig)[] intervalTime?: IntervalTime - fingerprint?: AdvancedFingerprintCommon + fingerprints?: DetailTargetFingerprintCommon[] headers?: AnyObject - onCrawlItemComplete?: (crawlDataSingleRes: CrawlDataSingleRes) => void + onCrawlItemComplete?: ( + crawlDataSingleResult: CrawlDataSingleResult + ) => void } ``` @@ -1283,7 +1384,7 @@ export interface CrawlDataAdvancedConfig extends CrawlCommonConfig { - targets: undefined - intervalTime: undefined -- fingerprint: undefined +- fingerprints: undefined - headers: undefined - onCrawlItemComplete: undefined @@ -1293,13 +1394,13 @@ export interface CrawlDataAdvancedConfig extends CrawlCommonConfig { export interface CrawlFileAdvancedConfig extends CrawlCommonConfig { targets: (string | CrawlFileDetailTargetConfig)[] intervalTime?: IntervalTime - fingerprint?: AdvancedFingerprintCommon + fingerprints?: DetailTargetFingerprintCommon[] headers?: AnyObject storeDir?: string extension?: string - onCrawlItemComplete?: (crawlFileSingleRes: CrawlFileSingleRes) => void + onCrawlItemComplete?: (crawlFileSingleResult: CrawlFileSingleResult) => void onBeforeSaveItemFile?: (info: { id: number fileName: string @@ -1313,7 +1414,7 @@ export interface CrawlFileAdvancedConfig extends CrawlCommonConfig { - targets: undefined - intervalTime: undefined -- fingerprint: undefined +- fingerprints: undefined - headers: undefined - storeDir: \_\_dirname - extension: string @@ -1336,15 +1437,19 @@ export interface StartPollingConfig { - h: undefined - m: undefined -#### Crawl other config +#### Crawl Other Config ##### CrawlCommonConfig ```ts export interface CrawlCommonConfig { - timeout?: number - proxy?: string - maxRetry?: number + timeout?: number | null + proxy?: { + urls: string[] + switchByHttpStatus?: number[] + switchByErrorCount?: number + } | null + maxRetry?: number | null } ``` @@ -1358,45 +1463,34 @@ export interface CrawlCommonConfig { ```ts export interface DetailTargetFingerprintCommon { - userAgent?: string ua?: string + mobile?: '?0' | '?1' | 'random' platform?: Platform platformVersion?: string - mobile?: Mobile acceptLanguage?: string + userAgent?: { + value: string + versions?: { + name: string + maxMajorVersion?: number + minMajorVersion?: number + maxMinorVersion?: number + minMinorVersion?: number + maxPatchVersion?: number + minPatchVersion?: number + }[] + } } ``` **Default Value** -- userAgent: undefined - ua: undefined +- mobile: undefined - platform: undefined - platformVersion: undefined -- mobile: undefined - acceptLanguage: undefined - -##### AdvancedFingerprintCommon - -```ts -export interface AdvancedFingerprintCommon { - userAgents?: string[] - uas?: string[] - platforms?: Platform[] - platformVersions?: string[] - mobiles?: Mobile[] - acceptLanguages?: string[] -} -``` - -**Default Value** - -- userAgents: undefined -- uas: undefined -- platforms: undefined -- platformVersions: undefined -- mobiles: undefined -- acceptLanguages: undefined +- userAgent: undefined ##### Mobile @@ -1423,8 +1517,8 @@ export type Platform = ```ts export type PageCookies = | string - | Protocol.Network.CookieParam - | Protocol.Network.CookieParam[] + | Protocol.Network.CookieParam // puppeteer + | Protocol.Network.CookieParam[] // puppeteer ``` ##### Method @@ -1459,7 +1553,7 @@ export type Method = export type IntervalTime = number | { max: number; min?: number } ``` -### API result +### API Result #### XCrawlInstance @@ -1468,62 +1562,62 @@ export interface XCrawlInstance { crawlPage: { ( config: string, - callback?: (res: CrawlPageSingleRes) => void - ): Promise + callback?: (res: CrawlPageSingleResult) => void + ): Promise ( config: CrawlPageDetailTargetConfig, - callback?: (res: CrawlPageSingleRes) => void - ): Promise + callback?: (res: CrawlPageSingleResult) => void + ): Promise ( config: (string | CrawlPageDetailTargetConfig)[], - callback?: (res: CrawlPageSingleRes[]) => void - ): Promise + callback?: (res: CrawlPageSingleResult[]) => void + ): Promise ( config: CrawlPageAdvancedConfig, - callback?: (res: CrawlPageSingleRes[]) => void - ): Promise + callback?: (res: CrawlPageSingleResult[]) => void + ): Promise } crawlData: { ( config: CrawlDataDetailTargetConfig, - callback?: (res: CrawlDataSingleRes) => void - ): Promise> + callback?: (res: CrawlDataSingleResult) => void + ): Promise> ( config: string, - callback?: (res: CrawlDataSingleRes) => void - ): Promise> + callback?: (res: CrawlDataSingleResult) => void + ): Promise> ( config: (string | CrawlDataDetailTargetConfig)[], - callback?: (res: CrawlDataSingleRes[]) => void - ): Promise[]> + callback?: (res: CrawlDataSingleResult[]) => void + ): Promise[]> ( config: CrawlDataAdvancedConfig, - callback?: (res: CrawlDataSingleRes[]) => void - ): Promise[]> + callback?: (res: CrawlDataSingleResult[]) => void + ): Promise[]> } crawlFile: { ( config: CrawlFileDetailTargetConfig, - callback?: (res: CrawlFileSingleRes) => void - ): Promise + callback?: (res: CrawlFileSingleResult) => void + ): Promise ( config: CrawlFileDetailTargetConfig[], - callback?: (res: CrawlFileSingleRes[]) => void - ): Promise + callback?: (res: CrawlFileSingleResult[]) => void + ): Promise ( config: CrawlFileAdvancedConfig, - callback?: (res: CrawlFileSingleRes[]) => void - ): Promise + callback?: (res: CrawlFileSingleResult[]) => void + ): Promise } startPolling: ( @@ -1533,28 +1627,30 @@ export interface XCrawlInstance { } ``` -#### CrawlCommonRes +#### CrawlCommonResult ```ts -export interface CrawlCommonRes { +export interface CrawlCommonResult { id: number isSuccess: boolean maxRetry: number retryCount: number + proxyDetails: ProxyDetails crawlErrorQueue: Error[] } ``` -- id: Generated according to the order of crawling targets, if there is a priority, it will be generated according to the priority -- isSuccess: Whether to crawl successfully -- maxRetry: The maximum number of retries for this crawling target -- retryCount: The number of times the crawling target has been retried -- crawlErrorQueue: Error collection of the crawl target +- id:Generated according to the order in which the target is climbed, or by priority, if any +- isSuccess:Whether the climb is successful +- maxRetry:Maximum number of retries of the crawl target +- retryCount:Maximum number of retries of the crawl target +- proxyDetails:Record agent status +- crawlErrorQueue:Error collection for the crawl target -#### CrawlPageSingleRes +#### CrawlPageSingleResult ```ts -export interface CrawlPageSingleRes extends CrawlCommonRes { +export interface CrawlPageSingleResult extends CrawlCommonResult { data: { browser: Browser // puppeteer response: HTTPResponse | null // puppeteer @@ -1563,25 +1659,25 @@ export interface CrawlPageSingleRes extends CrawlCommonRes { } ``` -#### CrawlDataSingleRes +#### CrawlDataSingleResult ```ts -export interface CrawlDataSingleRes extends CrawlCommonRes { +export interface CrawlDataSingleResult extends CrawlCommonResult { data: { statusCode: number | undefined - headers: IncomingHttpHeaders // node http + headers: IncomingHttpHeaders // nodejs http data: D } | null } ``` -#### CrawlFileSingleRes +#### CrawlFileSingleResult ```ts -export interface CrawlFileSingleRes extends CrawlCommonRes { +export interface CrawlFileSingleResult extends CrawlCommonResult { data: { statusCode: number | undefined - headers: IncomingHttpHeaders // node http + headers: IncomingHttpHeaders // nodejs http data: { isSuccess: boolean fileName: string @@ -1607,5 +1703,3 @@ export interface AnyObject extends Object { ## More If you have **problems, needs, good suggestions** please raise **Issues** in https://github.com/coder-hxl/x-crawl/issues. - -Thank you all for your support. From c7d734431e50ef4d7c4b4fc13654d26babdfa4dd Mon Sep 17 00:00:00 2001 From: coderhxl Date: Wed, 26 Apr 2023 10:14:15 +0800 Subject: [PATCH 16/17] Feat: Examples and more --- README.md | 97 ++++++++++++++++++++++++++--------- assets/cn/crawler-result.png | Bin 457869 -> 403440 bytes assets/cn/crawler.png | Bin 96563 -> 80527 bytes assets/en/crawler-result.png | Bin 354378 -> 403440 bytes assets/en/crawler.png | Bin 104019 -> 80527 bytes docs/cn.md | 83 +++++++++++++++++++++++++----- publish/README.md | 95 ++++++++++++++++++++++++++-------- 7 files changed, 218 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index 43b6b22d..1afd81ce 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ The crawlPage API has built-in [puppeteer](https://github.com/puppeteer/puppetee - [Config Priority](#Config-Priority) - [Interval Time](#Interval-Time) - [Fail Retry](#Fail-Retry) - - [Rotate Proxy](#Rotate Proxy) + - [Rotate Proxy](#Rotate-Proxy) - [Custom Device Fingerprint](#Custom-Device-Fingerprint) - [Priority Queue](#Priority-Queue) - [About Results](#About-Results) @@ -115,6 +115,8 @@ The crawlPage API has built-in [puppeteer](https://github.com/puppeteer/puppetee - [API Other](#API-Other) - [AnyObject](#AnyObject) - [More](#More) + - [Community](#Community) + - [Issues](#Issues) ## Install @@ -126,14 +128,14 @@ npm install x-crawl ## Example -Take the automatic acquisition of photos of experiences and homes in hawaii every day as an example:: +Take the automatic acquisition of some photos of experiences and homes around the world every day as an example: ```js // 1.Import module ES/CJS import xCrawl from 'x-crawl' // 2.Create a crawler instance -const myXCrawl = xCrawl({ maxRetry: 3, intervalTime: { max: 3000, min: 2000 } }) +const myXCrawl = xCrawl({maxRetry: 3,intervalTime: { max: 3000, min: 2000 }}) // 3.Set the crawling task /* @@ -142,27 +144,31 @@ const myXCrawl = xCrawl({ maxRetry: 3, intervalTime: { max: 3000, min: 2000 } }) */ myXCrawl.startPolling({ d: 1 }, async (count, stopPolling) => { // Call crawlPage API to crawl Page - const res = await myXCrawl.crawlPage([ - 'https://zh.airbnb.com/s/hawaii/experiences', - 'https://zh.airbnb.com/s/hawaii/homes' - ]) + const res = await myXCrawl.crawlPage({ + targets: [ + 'https://www.airbnb.cn/s/experiences', + 'https://www.airbnb.cn/s/plus_homes' + ], + viewport: { width: 1920, height: 1080 } + }) // Store the image URL to targets const targets = [] - const elSelectorMap = ['.c14whb16', '.l196t2l1'] + const elSelectorMap = ['._fig15y', '._aov0j6'] for (const item of res) { const { id } = item const { page } = item.data - const boxSelector = elSelectorMap[id - 1] - // Wait for the image element to appear - await page.waitForSelector(`${boxSelector} img`) + // Wait for the page to load + await new Promise((r) => setTimeout(r, 300)) - // Gets the URL of the page's wheel image element - const boxHandle = await page.$(boxSelector) - const urls = await boxHandle.$$eval('picture img', (imgEls) => { - return imgEls.map((item) => item.src) - }) + // Gets the URL of the page image + const urls = await page!.$$eval( + `${elSelectorMap[id - 1]} img`, + (imgEls) => { + return imgEls.map((item) => item.src) + } + ) targets.push(...urls) // Close page @@ -532,7 +538,7 @@ The intervalTime option defaults to undefined . If there is a setting value, it It can avoid crawling failure due to temporary problems, and will wait for the end of this round of crawling targets to crawl again. -The number of failed retries can be set by creating crawler application instance, advanced usage, and detailed target. +You can create crawler application instance, advanced usage, detailed target these three places Settings. ```js import xCrawl from 'x-crawl' @@ -550,7 +556,7 @@ The maxRetry attribute determines how many times to retry. With failed retries, custom error times and HTTP status codes, the proxy is automatically rotated for crawling targets. -You can set the number of failed retries in the three places of creating a crawler application instance, advanced usage, and detailed goals. +You can create crawler application instance, advanced usage, detailed target these three places Settings. Take crawlPage as an example: @@ -615,9 +621,9 @@ myXCrawl.crawlPage({ 'https://www.example.com/page-1', 'https://www.example.com/page-2', 'https://www.example.com/page-3', - // Unfingerprint for this target + // Cancel the fingerprint for this target { url: 'https://www.example.com/page-4', fingerprint: null }, - // Set the fingerprint individually for this target + // Set a separate fingerprint for this target { url: 'https://www.example.com/page-5', fingerprint: { @@ -635,8 +641,9 @@ myXCrawl.crawlPage({ } } ], - // Set the fingerprint uniformly for this target + // Set fingerprints uniformly for this target fingerprints: [ + // Device fingerprint 1 { maxWidth: 1024, maxHeight: 800, @@ -648,7 +655,7 @@ myXCrawl.crawlPage({ versions: [ { name: 'Chrome', - // browser version + // Browser version maxMajorVersion: 112, minMajorVersion: 100, maxMinorVersion: 20, @@ -663,6 +670,44 @@ myXCrawl.crawlPage({ } ] } + }, + // Device fingerprint 2 + { + platform: 'Windows', + mobile: 'random', + userAgent: { + value: + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59', + versions: [ + { + name: 'Chrome', + maxMajorVersion: 91, + minMajorVersion: 88, + maxMinorVersion: 10, + maxPatchVersion: 5615 + }, + { name: 'Safari', maxMinorVersion: 36, maxPatchVersion: 2333 }, + { name: 'Edg', maxMinorVersion: 10, maxPatchVersion: 864 } + ] + } + }, + // Device fingerprint 3 + { + platform: 'Windows', + mobile: 'random', + userAgent: { + value: + 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0', + versions: [ + { + name: 'Firefox', + maxMajorVersion: 47, + minMajorVersion: 43, + maxMinorVersion: 10, + maxPatchVersion: 5000 + } + ] + } } ] }) @@ -1706,4 +1751,10 @@ export interface AnyObject extends Object { ## More -If you have **problems, needs, good suggestions** please raise **Issues** in https://github.com/coder-hxl/x-crawl/issues. +### Community + +**GitHub Discussions:** May be discussed through [GitHub Discussions](https://github.com/coder-hxl/x-crawl/discussions). + +### Issues + +If you have questions, needs, or good suggestions, you can raise them at [GitHub Issues](https://github.com/coder-hxl/x-crawl/issues). diff --git a/assets/cn/crawler-result.png b/assets/cn/crawler-result.png index e6e233e0dd38be393800ac9a0ff3744df3cb7996..e536995504d3a3cc5983624c429e624b9880fa4a 100644 GIT binary patch literal 403440 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%0DFSm1!T*OH+fvK}lDSOUiE(1|$o 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

fU_(ahYnAeq7wXp*INY0_ zpX)YSb2sbXzTc_`;$yR}^lcr}#r35-54!+Bk_j-*l5c$d>vJpTzxn#N9j{m}m*05f zjg^(9>3aRvty^)DJlfdk4|+ktyLIdB%%*co^SAHa7pSIZYPavdJ6kR>o5Q2yXxL|9 zA%u|1*pG5XiJ7gn<7CmOVj&2;OP4MMLD21Vws&@{wVF{W1&9oQTFun!mFcN44BvhD zz@`})qa4?FT}$M6h1uzvLEb&w?;q^myz%1on=k&s7ryY>&wh4(Zob`WzWMeWAN$y6 zn(c0qW{-Ea_Ku#Apq(dMVYmCWZ~m!qGvO-EQornU+s8YP?=P(^^|$xXhQn^eS<>&f z+R^dl=_|MIe5W=W6wChN((+&YW5>7Y>GZ7MlqG03ZNK zL_t)swM2?RI$B5qrYK6K5XjK$_cKFb91r7IYhCtTvcN=ynUd)F&P=&v8GCVtf?Z_- zCEj}X-TrX+>dUVH@YdGGh4brD38l1yjQLHhsOkg&*4wDQoF3*(;2B4kBSsI#Tn0mfDQw;zh%~C>Tjm>ot z%mj!MVHk#Qe*4>i=vSwbG-)(;fAcr~m;dg+{qKE0h~k*QI!fV4Ljoo-CZ)}-jm@16 zh3xs|U--FS7UcCh!^MSiJnZbZ`v=E^!G0TNpMN-+&yLdGPmoUk^gg}K`>4@JkN1z~ z&fXxt@2=)%8;m$MI>Pr1UU4uOepn^cjLg88_qk#TFzQP@PEqD>7#Mfv%D;pF0TvMX zWQhCz?Vm*8Lq9HOBl-Qt&CDo7mKl>76cQ1~jW_^+fr%Lbh=fHPjYSz4K_KCK*ik&7 z4=dnLowt9(O5RT_Pu2lXef_8S#mTQ{7|Y0;<>bronPuR8*VlN>qc^@MzkTne_q|@9 zWk>H@Pky(2YN-*qqSJ5mA=a#uFoG0fMyL@T;55x_-~~mm)M~V@T)+I_@qJ~oGuB@$SK+>asu7!w;~az^)TK|YJ^789JVEA z-XHa!{AGFT(>E7n8n}+Kk_`)`px}x^a4xhRK$$XxGCpiKF3&C)mmlmLH;&Ex{LHKl zp1d2zc4(EW$O2g=&I^n!(1#fCX9F_}DRM7eW?*2!3`km{BSq+v$K)`~D>;a=0lWKy zVCUQYa{Bt`fA!Z&+Wp+Mg$G*?Ue}E$G`QNtSEpH76YXwXUVY`O&bujrkW2t1P-=yU zGVf%hmDEycrL@uo2PL9Jt&}w;O(R2`q}JM0D-zPW1&@HzG-C$8;D7)jr4Z86N1Sh$ zC;=D*D~ZguUZ1{n<%+d-=ka!@-FCH;q(&>jKqN#^Dz2}tDTaf+{Z6|Bh)OHg4l+Bg zc1te!&i(Bz%fpqmx%1PP>+`cy^*Mj4bpGO{Ub8{mf8*`jPX_xhoV(dN%(}-zOS)1j zw%Z4t-jOI(WJQJp6WV0w@uObWU{Aex1xxpPpV>nX{?M!Wa>h1QUh(TYc?&GxM{TuV3EX z+8%a#5~V-{rf8UK51-7=WtB>>c7An#?;wnl+!^Krp5f0&StpfJ(wJ;iAx2h7Hts(!(fgJGD)rsisL)qWIy?K|HcgmJso$|u&kot9RjSPC+eW+q9Ktl4TE9v<#) zZ%5(qwO3#H#h?G#ASeJ*k|fO5WG0GYrLky2PoNZ@F2Bn^7T5n4&hEV9%G zD_Y0t@={4k)JjQd03b`EB(%)rc^)b>%+vLHx6^SP2LO}7upq^(M64B;mlsTu-G98} zD|Q3~ZXq4UQ>7sATx(J<2o4+l%!r4ZclVCB{Q?i3v|f4XHSRD%T0tl)XR1EE`(*e2 z{jHhW)ckDlLkMYpA-#_m@i-Cm{qBiBQq(BN-!RkvJ^u9cQp99|EutV43^-y(3@7vV zA7Tl0VpAB6SOu^I5X>2j*-k#Oon>Dv4pctP{a@1dYobE#=0K*Jyna0O*oER4JRKw+Hu z?3U_Q&-!cED_{7X-R9o^&)u8HNOs?MV&C8O?z*eGs?X`}>A6oH;w6caCDF3hx2*&T zcGp4TEF1&|76`CdBgn?s1i>Oe0@zq1*o6ZO~He0bh5n!RxO%)^!pCkLILE{Hp8gD5C=dRdy0(Qe1zU2;%=XSedK z2*ab^QEimVwWmJ&U+*-wp8nS7&YjFmj!jDL{`Hp@SGHQ!621Il*Ci9V3s%rgb9QNb z0ll72`%so zw>IYDwJ??heA7u8^ZH#s8S}I<(J;uB`MYz5`;Ad4S*Cv8h^090uMd( zV9qwPxqK#@?QSnO`#y{qnHnf1u5BeqDI0PgQPKcKC&%o*iqn=fk*26^qz%l|=}f15 zzBI8B?_675oFmGp4hKy{GX-Tyr8K2PX^Fsgz4IS>Wah~1!;gH(u-xe*M;>|Xv2wAH z$!0CbnVgy`6iaCo%}!43G@D$iqGvyNYHq5UKYQT>Ps4cNZ`F6S(hEoDl-86{Ovne_ z906q%A<$adwly_1IX*G&2f>}iMZv|$0FyB$w6sifd}=b2$#h!n{%%`p%rIpb5~Zwy zXIO5p6}@?BW#Pp9Fa7ebX|wNIJdR*#t9R^(hY=-)IX*r4`sEkyEU#GE%J~y6GXpLX zfzoWT*l2Fsj>imJN=!A1k~j)N$2Iel#X-NB=)Qq*mnXS-S}pPZlLeiZtVM$}N655rA=#mQ#I zCnw@^X=`;uDTNV68l;fTt({JbO-)Z9KYn7nUT-uT^j)8$_oO@03J9i@YJ|YHOwLoq z1tLHVIx#hlG0tQ%NJUY?x7)$`dUNQfQJf%zlu|rRDaEPMNfL7*BmgEj2!~l4FC3j3 zujKt`7}=&}xk(y>3?pA;Z6j08`+k}z;9-EnM_N5N~~e`RH5`BP7Q z%C_x|jg9T?ZO3sQe(3zv)VOOqS}UHWu5EL~d6L?;Q!JE(P(cueL8P=c3N^Jp>B&1`sI%8WR;Hy+*grVp^G=%I34{+a0PI9w7sOv=9U%iex^M z=?%LC42-m4P{cH*h#-tLxF)6qQA&{^2_hhoL_{kLfK(bQ$-B)u#yI9NrBtiPrs}i5 z_?c|M%6d+Fd*|$_Qzy@V$Rdm?Y$0k0l+o58itVi75BfJ(SKGsm0L6#mi3ctgUADe{ z6A^uE;mG3Bozg@xTXBxemK`e(@SZD=4zMHiR++)Q>(_XHVf$|K(cS+({F3kC?*91k zqkzjAKx_5#i{CLRcD)R08L;t6b2)u?k*Gja7g4`@^*d*c5(047@<9e7=YFwq*O{` zj1S;3jEM${G0|G1QE88mmYNWvG-$0bCUBo5)Q7L|gH*ijrS{hH@3uvI>o5CT?!nah zt}_elJ)`y-nu8Q+tpT(`dnRn7${e%?r4Qx_V2qWNdf)W_0B|_82l!B5v`5+6Z*LA5 zTyNP14iUyijxc+j=RVyFfZW>}jkY{^W;pD;`-G3;p-1QaP+Y&Vb?Vgk$DVw!(~qA0 z_IDn*@W7j|UGBG(NCzK%^5KEsC>FDte7V28GALJ^yi01>%4Z>pjbgSEB<#iSx637cbbjoi2an%cUOImk z?kw?MZ!lKEnKG48|IL>dA9{4WR<^!-WxaJLK5=r^tL3h&-n3U5o#y(7PM_~3L3aR~ z1K*nD>1}_xBW;#_<>^=YakF5d?sm)I&iK@LHt$;be7WG1^0Q%={@u6VJazK?)YucR zzw*tVG&PAC?iRB=m(5pPwcHu-kVKSA>K{Fy<1y+seK}O^Cd_ASAdqT_G$PFCax<@@ ziK*j(-zwzF@osaakuWkKh&HzSsoa<-mmT})(%PF!8VD3p5)@zspcIDpaq{as#Y-=} zJW(#>3WcSmWe*EDxKseNR*u2?2#JImF3DMeFO`|5RmTxIUMd>7EEBiB)f3nYhqY=x zLE=*nmTzrszVdBz;Yc>>Y3yo-iPnG+AwZH;TzdWWiMbQ6U%F&CnM@}0`s=SxO-`1} z<*V1PMR9y*d1=_`!9(KuwJUL)G?#Cs{q>9g)u%sv@x=A(uRs6lwR)?wRqslX5=w}{ z5XOYC4>W%ONFj_Y(>inZwBxv)PJ3x-S&u&3F;+@ZN*&iJm&+PpZDo~5F+&&(kO~ab z7@w%MhvDs;D+IwH>Ob<)hff_pHS~MC?PZnl0&!3xq|h79?a7&{T`8VCbu3KVS8lvm z&P~R;yVsh@Nf_elVQfq<+GJs z#%gX2Hg?uQ2*1~rJmpz8><&kG#gCZ{Jl&D}T<6bOJFEBgUUp0{>1U^&8>d7hezKofRczW-o7(CKRaHlG6QdJuD{D1zbD<1<2s;q%40$> zLVz)%HkBYS18e{w?I%Ow2c2$kbFJO&CBq;F%#lJ#l48(O0*r`S7=xCKLba5y6`ic9 zf^L&*ia-(_OpQ5?O#09dl9&=tQmPDFhjCdNicXxMp8(;XV z&p-b79LF#K5t)XOQouPUm{_K5+Ln@nrvf2rn@$*nZq`Xtk;ExRq|@yT z2E(b`Gpm=2mmY4NCRl1H3lUu%BGIZPM?yHw8C( zG|~zqG*PSU?zAXjz%V1&vn|UehLvE>2-BvcDIKji8VDndv{VVk8dIc%BuFtv2_;G@ zB?U3b_|%bek3N3<+-Xc{*b7!~UYnUYnkJGt*g~Yg+v43sV`=A-#iiS=!5{`-MtpW` z`r^Z<8;x}X8Tmq9GTj>_rdFDuM<08z*N*C9<-N}50q^LZdiO15(+Exa=>v-HTPUp% zs5tO@oz~RR6G~}=0uT^_3m*U7-#vZv=8b>;&;Qr^C84I8D3xw(-kBI5W6aSi4TGV< z7$!K5lOPNjV+0!jC{1}LlNnX!i%U1>=I04EvBp~K!^)B$j{N++xX?R3bGYoj7iaiE zfeycj28@wG7}AV$P6*~aRZ65v1EM3z2kbd114sz~O3KlqyJ?#DQL}zfs@`QD9^U3{ zhw!6O@8GQ|8a<90LO^&Q&)K6CYAi>f0UFT>F~XW?t|i$z?d0JGiNM|eg}ufS zy`|neAcl>^HV06~f#dDlPU78t-p|Q>)U2;>woV_P?^K8FUia0@S08)y5WBJ3s4r0i#q%Dmf@3EsII1G(s3_La;@dZ7|DZreQK>XoMwbr3F!Y zXxd12k1^RB=4WC>Fc6~RNOG=~0$e>FfvWkUnWe2zM?(e&4YobR>SBkjbYflEJedhdS_?Tyvl^(bF+Cng88 zN675l#L3x@z5D`RTxzavaG$WLkXxiuw%d(*XwhnRNu=5wo0)uI>duSL2aRNA z{MgkiYb&>IM-)GBVfw-+&fQwRRlgndVnaYLY7KZ$u9dRHt*mYg$Ez)-T{I+yYrgv0 z^-8H~ayqOBd4fwG&L9r{Xvf!b6Iy~qoI_hS}BPDAqiR|Jes|J9~1uL1|ejm3D5xhYmIvz zyo4|*rBc$B)CGP1m}RK6*|Dx|amw{t11cBJf95y;St3}q^G5gbOR<})M6XuP6FT5x zz&gDY@|a+30T!4Lx#x>JvL_j>Qc0-}Zfd19=Ui|R20;>sgKp>Ck@4L=x3Fl|moL5Y zGLHfb3NYMRT%J2R#V7@UkzVct41`soSe&0f>Nw8E#zwtf*IbMs?h(?R%je5urCzt& z@Ak-OvKc~}(y?k;O8xz-SN+(p3`~IK&>F1C_Ii5|Eq$j!xm#cX{KokDi(>tiY9UN%1bX(46AFa3Nbs=>h}V_?_;FAtmEX4M#JFt z;;qg4+WCtY9G>men>Yn6gu{&XR-@;3Cu)+x^!iCZ=JALtjho z8q_q6DDuyqK7RiE+3D%&5&G}@e$0hoTehY_oaD=S%fa=H_R9BPed5C(MuY$%L6qe4 zo{+*IIFh_G=qasFo<0T9;JrxNPZS)DW+DS1jSwI}l8%&(7-3D&Xl}Ze6agq>>CW2x z(bPN37->WhXkIH7hTUDPbdp5dgFb^~;`AAt)=aXC!KMxeBeWPom|I#9Or%mk zG$3FUB?<__#bT!0A0RLcY#_-+qHE)G13%SFaf-8J$J(vfM7%u3);fdj-4)Zx^`mI_ z=Bt6^8Y`TTW7E^eCZ~sf>Sf1|pR7?zUcY>Gx7Y87!OqT3yZeIH=%YV(=6y)0-j@!) zV^MfeRvx&f-`(t|3nhA2p|y&W(55gsHf|VH0O2Aa7~i>b`%nJlPkQ|x=y$7kJoH|g zYK$qPz~iV#kOWONA0lE?Vh|IFR67>ckZ>MH!(EeAxDZJa_j(P+j_(of_Tz`aI6rhB ze$YSv-X7rZk3F;dkrOfkfaT@o#l_oNOQoffTu5#(th63Uxd_3M^WJXV^;|y)gTN1i z;KYejQ^y{?UkSf^74IJiIza1Sf9e0AErbKK4INCL9__&0sfhZZ?c9@)!CPsHqrWgh z>TQVAXiJQ-(h8x2oF4984qol>QS|%$7hinw$tR!8X0rzZ<#*0LK)t^G^wUo#N%C92 z^;-vfesG9~U;og;2fB}%_0Dem%*yMD5X7k>8Xq^bLc|RGpx^GNDM1KN zPUQSy+Ug}rn@Oq&1xihViD58{nwDh-Vd#e(W2&`ei~!aMlTmI7#`|U#SdW?(Edh|$ zN+T^nkAT?G`NyL^Q0tU)p_C%P03pCyBTy0{Y#7X9jF1t4wD(71i~s`y(=;ieJWVyg zhYfL*V0=I5=U*nQtF^%dN&zj+o1hMPcgC2k5#`gKg&#zGS+UH*g+tF|SPycMSwH~@^t-f8I7n|Sz46?@k1}~wEIDz<2m>rFmC3jtesa1S-zkrqm=$Jb zvTN;Dr;T!+_G}QnL8?iVP^q=!Sd$YoL&DbAHjiW{VkH?P<5Sg=o%b69J8RiqK|~4> z-0J!oB!~o%ggqx1qBZ_tzpoaKEtIpKm(8X^@P4y346slHl+;vfMgWLLoRHlidFEvq z;)FBXh&_!2Dwogx!msq0WjF;dd)~E%U;FppzA&yn`Q*5Q&S9+Ub{0nRa;n?*{$0%bH{e;Ys#B= z`g?B}PPOJ>w7nb(tf_%99XVrv;A^83<73B;9gpK=X>qaDYHJO~XjCggj&0A*&qr~z zzP66EHW1OExmJa8sZbcZcJqdxbRT~7teG)0wNj(my0x-%;oOO_QsuEHekMuV-QAY& zcV4~x=GxZQ&;Qb=odOAmp_T-Dl40Jcw{BivdE%27s^#LeUfAAlT&-Ut7E6L;ePj7U zPhQBBEw0IM=yyB2*tBdYed*7>{E1I~^z6A4lH%=VeSPDON|9$||5N>|k39Zp5cHq; z$VW^&PYn+vdh^X|_4?L7`h}m*W$Z?$vD0Wi_nq&4_obI+CyyLIdbGZ_fn$!81}>w4 zzZ%?`JuT>F{i*4W9Haq((i~y3*Bl`vF;GAV&}bQuXa%4ZXh6s^?Zw+G$BxY(nV;O;Y6L@3 z%;mAdN{}!dJoCagzWSfPT(-!wCr|wD|MjmNm&iC~h%&3-noVX>MlFMql*d}Dd@d7) zArO|PsSLs89wydWvq`PQDtOm!-#T)1&dE5fX0yAoJ5i~{N?l*M<40j}YWj^guSc9K zqJ`pubIFrxwYJslZPZ)M-Nsdq(9NK`yKIfIdbsS?03!k{(2TgShH zQvYtHevkdy+iL5>0K(g_qaR#_|DaHZ+h&Zh(mGAU=fCrH(Mvd088gLc8tI(CL=Zv= zu?aG@QenLn2i=fZCd^D#4D8;=grmLj26rh?2n($NG(|uFNrbf8pDV2oJs!w}_I`j- zwLLO8+;?BtXWwZJ8t`FN$-W{*n)?QzuUMy4|hKtruT-er;pr$tR!u?ce@w z-ydkLGnuR$-MAQ`(E{GSs%dnNNAGbT6FxsvyK;R+GsLBS_4TV<(@ZJbU*9fStmGOG zKXmfc$%PnDn(}62*RpM;VucK?Moei*31);)f;FHhP1o0VY{wa^R)~YEwJ|T3u}zx` zjsXcFLO(Q^#f9KJUA(h2Ju^cIPSR9K>3N=z0%Jl5PE($wi4X#k1Y_LT*(uq!LI@+k zm=b~+r5GQKvBN@fN{CQ^ly)gg;zaH7CY91~7ZCygcq>MuY zQ13p^2Qkn%l`@ylQp^R~Elt_JAg^6(G&XkT4cqp5g(HRS9nP4Q^T2PXNeU>#0NjGd z-n_ir+_tCY!`n+utes57TEEd$$Z@O0b$L9nlc6jX^Q}1QviS0MU$z5r@@)B)8_#-U zFn7Wjgl4_bPy8M>eWf5v94AZK?GP#2NPGops{9}#BKv0m03ZNKL_t&}fH46pZkVep zF*S)F@{MFYpZ80XeY@=MG{dRMnQ8?$cRD+lyJl*4S$s5a5@2DfBh5nzOPlRWw|87& zr_*}&=(uH(T;3|0_Ow@S$IbbLS-%U5w{Pdl`I&{|6&smYDlN3)2skAmWqKbI{^Q2t z;+>$J&lgH-t7};%385fI{_$F4nPJ#qs6}N`DrCl{KKj%rrjO0-EO#`-WAn#%!X8x| z5frA>rLoR>|89}%=EYx_^zm>t14Q(cR-gfEMF}QS@$1*GFPyosxVUKAnTd(<+qZ8| zjMseMUtC-ygsiNr40`>1A-7fE^@pJ*rr{L=4sYIC-m15Fng)Y@caY=?`H@c~CYaI> zm|1uH`0*r37Z(?UAkZ3NOtsdO;9{vfR;zZpold(=0SF)jnlM@@7yD6g=e3t77REpN zkq0#oQePqEC}|{;U%hqxp)+S%_3icg4NR%)(#e@|%0TOwb8TBR2x7zZ=4R#%<|&Nx zg$$&U5$rm4xmwT!3C9D8xqx0A#T+Qu$B#X<)8Agbwao>m1ZO;ZrM}r7>+G3Rq3@@I zfG}zSl3K5>u8dDi9y@h>X=!EH>nNo$2B~nj(^vA{qNDFgca)@w5*%ZkN=^tN1REwv zc`BtW7Au?e_Hd9QOtTq=ks_cOL7a1*a?7R=$*gBr3+DV(u8_633<`M%Q4$hZ<~T zU~=`<@7c_}@c7THY&M?%?yFp~(+|wu-rRWR8_$0J3tv8c=D{RRPoF+fJ94BpHeMU6 z)pr_*aWCh-Cn@`hqU_lTPq~y5DTR#`SVlH$*wMM)+Y0{ z$y~n`qZFkfCz`BmtbFs?ul~}f9(n4~N5202bN|Et_}~A|zxbCI&t2eQ3JQCcXHvs5 z0kkwQMu^E!ncAX27~q}djcTs-aRHkYTSCZB%hnJ^3kfB4Cdek_)eY1yyc zycP=?aUQ3U?O2SEG!l_NjDz5FU-Z@InIW~Yqd;xP6q~DyEY(R%2)nf~|9H7Hn+!XY&{QM{BdrdX zV)wlMkKiwNZ#(qEIe0(nq3u=NfY5%2fWUB^Ol^!i!epdsa1+b6Rft1uu$<#r0{JTK zO}R7I*4M(Nj*YlQn7FT3+Sk7JH9`obbYv9`pi9Nf>CV}q^%^gHdyOc{1Ni`H^rgh2(y}@W6EW&`XLP%(hAO7&e zDS7F`KYM;|zBCAY1DIno$qk-5X&Q2_B(L=Sp-u%4BkD56f`G>wupg%VU_h9%Oed4^ z3>zcEZ1;z5p$s}fO-wMtT4RJp7siOHhcL!i11Q3f(i|a#3C0W)lS)uRYq?b z+dz7sM>n#vz!+-{d-f0-MlH0I3IHjkFxE;*t?wt%%fe-)9N&HT>99@rfSpvjhn&cD*H4x3!6UXQB4)9%(BwahFD}|C62pUtOjLxv<`+=V+v$Q@P!R+PV4{%(4GL1KcuDcOxnr6C=6}Y>D^HZQ zk>-w1In3w}C1qaN6Ik4zVu8m|8tL=jCM)FQh~Js1%x0IBZLvI)oPyS zRVo$J_8iA8m&>_AK9kFq$|WzGsZ__9VHYa3vB@LZD6P)Scl+%|H#m9r!A9qmBnS~m zTltRbU`jE@7}F2DJBo(M&0Dv^FeC&K3>a%f@Z{`_oQIZgb^@Jgq3%hnZ15< zWpiuuSAONwKlj<6eY1YMV$N*eTFtpxT?7MY5c^x5?bf&d225TnO*o}_Gh>-Vd!Ci6 z7N~?I-s$_T7hc^(AeD;3IL3x8q{`6D#gi9bx$$zlJ4i5Zw7Vs{7{>AOlMAnY|Fzz* zX$sQ}7B!slDnYd7%~1Ia0xY;l(%2m%eZ6C1YB?T5HrA;{V`k(o{>;x0 zlAzt&87oZv`5*nKm&405$0lZHCb}E-gmbEqR(f}9D@n`8PAn`huQr>z8UvYln5aOkVuR$ku1?Tohwy} zwi>T8%R-C+qM0B>-Cn{4!32~_QVC(i(^R&5?fPzaV{5C^A0`R!w445Lc=YIzhabLJ ztCq^8l9G}TNRmiO$qY*2cevoJQ(>2<5+DStR{y&R0h zBzx05G+@{xKJJzI??B3WM{&_%yyzX{UZu(p+VCyMb@&iR=#xe{EAtB<|2YEgPQN9g z+vsl1RToN5HD?tq*SvK5HL%8)?p&QdccDGFDTi&X2t>)>_r5^syQb{ZdfjvdO|fo5obb`S!+H}2+8df(1YJdDxp_g4x) zBaO5knYRJnm;Yf5T5HE~|LJf1cfa=8&;H#vzWMAk&nzu1MNtG&Q6N}~V&41AXMXna z4}UmUC|hpMvMk%SMx(1ogQwo{0N$nDhNMcKX9E9yC1R2?1 z9(QduwZ>DzQPtpch4v1gW-rU7Qi2f1M5sm>ZdrmCGBe^=n`L zMx9aP&aJfDp%f>#Zftd0fz~qX6a%FV;_PmPGA3al49}|+^OaJ@A|$rj_C#i5s~roz zxrL6-otRs&Ze0IP67wk1VXU%wSuJF^;!%neXNb_SKQy#V9fDaNSsY2y4HB=&qR?Et z1nbLb66Uc<8m)Ny<|ZS>FtES|1;SuNNa?3qQerX2TapA240(&H8`rlA88O`DhG|%~ z%4cz}y_@thQVf^_-Jl!p1K7d#nc2r^qCWGpPan)Pa- z97i!1c%$B&oSeznx$1m%qqDlRUGMuTMpBBnHa<2vJs$C3r`wbJtFiIv{O!eCNiRA%JKbzFMUo-}N~&(NC8e61ogpP=GoOciVzbD<% za5yX%3l4D*s9Y|mq!dzeE_&UeRsaacNg`!J3BiaUKm-FNU>lZesp&D4u}q=(t+n9` zFI+l%{O8wYFLJ z5Pj~2moLA0v+TL$Ql_=Jbo0{Y_n&9~2nLue)pjFzL4SDq_=$h<+ed%z z5B}}zuik$2!N)JXb~Rrp3m)%mG>*(#!yvG-wlY+vnn4Z-f$|emFTZ)s7cyTO^PGGf zMnN2 zl+y2O>w)(d`rlSC?U&tmnL_t&0Pj?M|Cbdb;fR)+AQFe++WKlfUqnP-zi~|=t+WIs z@AEf<1_0zZZjvV1Y++`4W_=@;2+vF$2O_kR#Lk>O`#_5PD~p#No_dVRgy>Wx5oo<9 z?NuYJWAD>YsRMGI-sgJ#J>~DcXYF3D-5$&92h31H@2K+MW1sDH*cvnd;z9|ft!!p0 zlUdpdGTGY03y(;Vq&zka{n*(LMQPOD*f@9efg3Nb2Udg&x%Az;lOBqXeeB6m*FRFy zU%zqv%U}ND{vnL^eh=|F{9F3a(!im^hI>1W!~TtX6^cF}#pweZhaYJ=rBeC*-~atMjz{j%pyd;fJoL$rf3#SwW%6Yp)?2_| zgwPMzfgh~_{;>mrMhGj7l|>L>&&n7CZ(m)kW^1Nl4n*v_Suluac~~l|WJM{i@2>iO zXqt>ta<_HV+G4h4f$J%u>KS?}V@+_;Ltt$;E@zy{j8~1ts+Xfu0aFSok#Q;j+st$o z1b);wI)7Tq)G{*$nT$nPMOi6`jIF=fh zmStg#rIKQwzj7ceI*j7po6my{@LM^q>b`m;7m+>wtHcGWM;h6+)aHQ zBC$(j*_DAsuME3(IuO3B*1Ta4edqZr&7DANnJIwD+`%9zS8dlL{hqcg%xur^x0R$? zkmhDI^b?7+g#mE}5q5s8Frh!X7w zaT;+I3YI17OWQ%&&>UeOFk{CS%B4(64y=`%-O*|WCWKNFhGCkfaUA=;KQS?J9~1uL zMzh((GN%9y`h5o_qr09cqyPhurl0t6fMnSF<`;Xu{#L!7D>@H7{_zJt@$tX@-g6Vi zBr%xCIz$KB-z~WMBafbW_KiEwU0RxY>fw{#&g%7DL=lnzAb=39k(5%6W-=-{GQF2V zDj@~uS}G}o6kIF8lPHa)lp+YjG!ZQ3ap;G`zDiRShptHop$HR%Fua$GDL+cIyB&lu zAw+6z+vdXYV@Z;%udWlN8KqKaZPD6PZhNP-y1Bh@V*KKTnfli1&<~PSjF)TcH*dR& z1?_>8%NdkfRz_%=DOK)lY@A-muWqmQdi_|UFeVeYBokgljONgg^O^CZ26u|Azyobz z)aAnjbD@xJt(E22 z{h+UojUXvfBl!A|ISO7U%DPe(b>}{2c4eZ z?^8?=KySC53UOp+Ml025G`UiU{8TdQD&-1BI*KCD$`67xNx4wH{;<>Yhf%^6285Am z3jstC2HIvi=aF*Go*ef8$>008|8cW1yuG@nHGb{-`q=omm&-iz@Ix-6pZmgJw+GPN zy}rHMXzXn9RGdC__QdJAv2vAQ12ZONDx|UEIp=Ab zKJ@tG|M$Q7-)}B%$F#_D7dN&W6yeImsjqzH>%D$Ih+-+z4^o z4=Fbb>VB@{zME(bdO)ddy9fYlgb?;c81dLp5lG!mhXx@OtWi;iw89u+EUU#5DBvRB ztanReHgyRmEbE#{5>sZGmKUd~A(4{ii_g7!df~WXn|`n7IN6Dbau5%Xo>}I?uiX1N&M4@4s0ANyTVqnyiO4ce9mGXF+ z0!K)Q7-_CGD7iNgPHTFEN%}gOx~i{-a`NodVhE8eG7yTB8(Z9fkS_w zwX$q83jA)njS!MjYA$N!`#PEz0cgYwlM({~cHOL<%}cDao~@Bmp>(LN5Yb3xvXx>! zF9n5kNXTev%V8K}WIPQAx|jW@-*Rw2;!gdLp6YEl(p$UYw>3@&*a*Pr($dKFOgD1! zl@g@76jXwAkab-J?l1^V(;x&hicKqH=EjUd$<&5v0A=@+cXZ{=%al?|X{l5yl}ZR{ zvS;OX7y7yP(%x6&!Qm-PKSCf4c#jtc2aj)G)w?&(BOTeEE(L+!cWpR)V~(``2%&Dj zpQZp0LGZq*2G9seP>kTgpl_IVCSO6!((n!%^tZLRKd9-wFTtcpfB{0t)-;YpXYhr; z_(~~la9S{kWmrkZ!U+8J)f-Ics(CDtR0>Kcu^p4AoTsVQ8Xgw$T4!#IAWB{%oV~;CpADS>4)hsR?IS( zt$Cuh>jRZw#7GbZT1iGIW_YL7FJyr#5%zacIgb$&Y8Z2&0JI|6{P4(e_S$#k#5i^g zX_&$)ILQ!|N>eC>4vD zOa=fZCnpWV81@I%QgL>AI*MeeRGgliD&%vnmz$cXwJA;qIFhMl;E{ViLRiBG>G%gQ z8e;)~z_RS)Cyx2P->laOAciRbVWv?St6saY$R+=|U--<02QF%iWN2VQIsgL&ViUNzWV01$%$-xr&;f{j%BU?_CrrJTkQuIX6I*4 z@Us_=C*IW{9YvOCkTgeN|DqW5d~TkO*ufqB_OPomctOa9xw$sMT*!KWt2>g zSK~n_5;T#kuGKgCsK*=}`PlNxDZpQR^XcFC)%=l4R)XsEdyc8sd-Y7gTCT6`ZiZJE zm(w({Y>QBWF`PPeN}FDPFo@!qOTi4L6=-%ZXXl)fs5b&rN>A$ zPca?#yZKx;mI4qsrpYi?2oP6D$ZEcDf8TWUm4gt$h*4q~h$tc~0vrfONMVeDnTnc1 znVf{$B#;`+9ErRc?AOqTkK!Jh+z&^G-nPx#ism1FmJj-kEyK`I2JjHjuEEtJ4yZ8}VvH0^oveqR57_=kUJnx<)*AOHBrpL*&k zr4%9Lo^-)sy&b$Yfj=a5_r?Kh@kcoY_r~4y9wd4H*EDE^5y5zQWtj^>2oVSX69B!v zvqMccRg{5&(K`@9?|tj{j$EgKV8WE*IY_;9aQ?((ryqDSF?30bslQ)v!VD6kQ6(?nwF2$_PET1W(-^<5kXjV6u(AdE33 z2zZ(%aUAbyh?G+MbCVA4xOYU52q6c}(uhU{`?HVU3(vZX=L!vfsUNEIGu5YWuXBm} zvHA~R+X}fkOoK31V_7|3%k&1j^)20Q^Nhz_Wc7TWa_u;UY+eugajV@O1`)ytnDAU{ zWvxMIQXX^CK<^CNPQ^{aG;5d;M{xp;a3CeuN-{<~*9c?2v3=99)v$*)R@z#yd^In{ zK*`WxEbvoG$ym+n4f+U>lF~4oMDVbmf)@D<$=DQt<;U~2TA54a5a8XSkOPA=6=S3% z!r?H$EHE8c)+Q|qXkt81DP~o>GG?^9U5&w(m0mAY3Zp&q6n$`N4tS3rR0Lr#v?wy2 z?l5pg!jNX55{f}5rj(7=ATF09(Tf>_b4MpH9N!48my?OhYpcD+8@UI@Zm$J%Mm#${ zsE0#%|rZC4^XCUvD)VNXy$dmo&otL2I+VQ7C4m?>9R=ztHEXR);7`_Q7SQJwv#Ouuid(>6g>6mpFMg0M61)T6vm`XZ!g{q zP*52wV6DX?+3YwNeS zR@eL7zp=bBUm6n#s`;@_D0wI%GtxvC-Q2iaE@F2u?B}xC?(SADS0)POoD3CGY3Mil zfHBg{H5|h*ilvG+glD=|#p(A4hGhi(9j(-0&?$I04Eo=C=F+Ki7Y4hV-A+?;9mRv4 z-R;^$`4gXf;-#0ay#B_OGiOd`85_1*2qUEBu-D&0>(evST#B7$<6S2CJ?W0Nnr%Of zhQlz5MJiRwm6S>dNa95B6k|*B`>tQ(bGPcKxXU;tM+_&z`E##+XYTtd~ zTPmcu#Q$nyJj3{Y0&Xk##hicVbP}H*vom^cs!0|6XM5CyOu?US>2+QjPfB znschPV;Ve_iQpz9%re3-H7J^#s>QyJ0!@)iEE1=KiOI3$ja5r)#*Epi3Ch*t;+=o@ zAO7^SpZ?SvmoL>@+qZVEeT1B(Dp$6tqyy0I001BWNkl)coch2vS1_r{iJR!Ix zY+DFVa0@g^)P@wHNtMiqQegy2#w-JdbgGpiLkvL~1pq|%j^=ky?LG0*K9t&3PPk_- z=K;#%-h>kDVPRul#Tg6hKP0t{ulC?W_wW9v`_r9(&Z4q$J`Z&exc0vNi`ZDaapBK7U9>V%C z^>(V<9su6wi)gRM)IMsu{TQb^?7lm^REq!KSE^l^n;-Yaa`~HY)B%<55 zd#l;gWVIS9O_R~_!sK|kDr41yj61b$+}S|KcFKby>xp_rMv1aqEDqS!jX1RJ>B-S@ zaiCJ&cHJB!%N3Y+a~z$V?+y;+I0{KT)@dhdN@+gv%oEAhO6}%rV6sdp!C5(%XKlZ( z+U4=`POUpLJYKCN{y;J}GlfQ>VjH#gm?*`mM&bmT$bd1Vbsx)`{)Z3Gq9}?z$M&-< z%N#I>s5zKEDXnQ?Yu)?EQQ1zc_3mf}|N4LYSBDED_2M^v>Yx4c3+piYVBwixdhW0P z4L`v)aK<(!lMp4vg zG}@g;x6^ifzuu@aMqIEg%Q~HInj|ugwbq{N!JhQuhv>S#aUm=r=I7_5C|X@zWr!9R zh9M8!++g|TSI%}?ZO8Hd=uiL5et|R2P(r8KX?Hu}wW}5fFxoOKYiBH%?{>Oh{qmo4 zW<1-mLyILQLqjf0I@yJDmlkiXrnMULLgffdjbO@6p?S6XTDvU+J+S5aK(b-b2I zqq8r+W;=eT+a{Jp$z??lwHHicU3+JlDU&v1!AaZPc74-L)3o=;fBHp(_ zu2t*QE4APHzy7_2T*}P#{J;2%@5XUE?RA>f>^HygyQ$GOSstKFpxx_!@B6QR^x4OQ zVxilpbAv>t*=QKVnVH#M9KBB`e<0|n(&%PVr5Q9QRi(?=& zS>34>i$yYOz+yx!lj`^X(;p<2)nE9Pf80%s2L0l9zW3=fr)0dPo9%CZgAmo%qbKUM%_+ht6-ZReKwC7nYWL5`A$mix`^GiyZrs>2)_~Y^F9l_IXOO$uVg7;YQ z|2I4m0w8BerVE8U6HY8;CyVDFcwpiBqF`2Nvm@o)ecc^XN+xM)02o8YFiO*a`HBo8 z*F?y`5+aq*jZ$Q&l0*=%R(FO+Mr_Ms$naoao%go)z)J+XBGr532HiCTZp+#IV0z(z z&>In%{xm#8wl7$0Sr!vcz1KxyTf#~*qcj*vmarKzqrvrD&biQ5lw{1dJ>N&2w%R)T z8_w*9voH*kBBG%PUC@7$Jef{KKj6kryq7_jvVRgxKnRa$@1#mC}a_{x|2A++<#8+hZ2GK#pbQ66z?fOqwaBhKJ|YYb%+uiELzzG&PpPEl(>-QSf$` zC{+Vtj%p`!PBrOvg=IwMxB$8b zwM=EP6}8Csy}-8@E;lnBd!B`0b*gC?h@(f!ji#JBlv}H86^8@nB}ay)uDo-(zEd9> z7^zokXn;u*r80|@Ar&_pIola4dn8@Ky`f?lTHZkD3pAeX2`CD|!vc2lhm$!5sI^Ls zgj~UiGue&1ow&Ezt#o23b(%@7jj;n_w%Fe6rV)MbrI-J~^CyQuBcf8$DEZS*ef-f! z=Ix@b5gN^%v-8S1KB1N}4nfq5&Xd`m+q|Lw#GFJbAKI z%=`JG;5@D@t!-@e6?ZiN0INswGVnpq1UlYXUKu=c)TF*QWR}*h80mQ9htJ-8r8GOD z3U)Q?blNKJrdb>pEXIZl%}%4QQzvYWeR(>UYierh(Z?Pw<_o!8 zPT1Di=$Ib_<#J(ia@-((_x`BWrE6D_gbslPBg+%}ovs zQkL2V*H*WCU~XQ$@e`l?NXpFQ_{7xI?8e$kN9!ovpBX+?a8?^kjUL$L7T0kSYoM7(cq48R$HaavChW`5cVh20rn0HgsZw#E9d$fAf8ph8U;64-e(|6Fqb%+wSu}U- zsFLQ~`8U?Dt-SuN3llRV!&AeK<9MOFwZ0>}=ECdOUVZ7!C!T!JE9R4CB$$%YG^!oW zs`K;5-lvm45OmaR_mnb98*NByBN%scwqT(^;Am`yKq{6dRn(|e8qIdM6WN?!y>h+T z>}E-3Gp)5=TVI)(n+bEd!$%I!&CLZtAcSDZv>{>XFbp>~HjRqL$H$_qV+-}a{j2|F zYh|mDEC2boU;Wj8{)>%H4^W|vrJ%@}`tp~*X4!&No1uB+@n?VU55JV@!aMJ54_BP} zPk!{oLl64sZLHs9$UgqL&rcmXWF_sdf9-|e{?^Mw44#`9W)^wraG@2ZWz zLq>!K5VXxQqgXrDQh)zje|he;*9e%@YHn^a!1z9L8AQgiEYG)Etu`V65-|jhgg`*T z5-6CGh71-9r8r7B38__~Fu*xuj2W%_AcyGQsP)c$-H{$fMEi1T_gw#AN*L~@dG4;& z-^N`F(;WpZbfA?g0Fg1q09sza5TrC!i$2R#~^5q4MG9qt8zZ)B83E#X;i-Y6q1S1Um3r~7&cE`b$# zBXQOOs^r5U%@V?{u(C{ToISUEWaiLR`H04}mu14X;;x&Sb4$be0z9u zwzXdQ#Iujv1>ZpkjKzSAR+&_prZ`h^D&tmbYkR$urtL__X(!cDny@61429r0IO0WV zFNzU)S|0I|h}Wtr?qz=9+72&|xwG>n&nv$1z16i_O~ZuNnlsXbJwt}E*WNgP{=(UT zFc>ZmJ~)45a%y&FeAdpB=jUXWv^$N0wc;|j({6DRo)Ms>WjjQSkoT*_)P0q~_+jnr z**8Xq%f-Qw>({OodCC}L#xO&G#DQnVyt30gJ?t|-?rkm~dvNB$#ddYQoeYmWaPk=` z^Xz8n%wvzfy>WivfmyDkle}H)c4v=`FmvcnUpvnk2LR5w5LO?npFMka{P6VaXJ5B{ zH}Jyq=g*G~kCe-UmoHyRlH}&io7Kuz=-D@JEPV81A3u5Wp~V|lJFWKW>gvUd7kkwT z$xbuTLI|yt5CReJuZYNxU`OYVGLF}8-b4Z}I3Wqg%jE~(IQLeo+4dd#xsN`*vU*E8 zbYtUIu3X-*Hg8_KIW{u(#A8pYcC)&bSQZe?U};^E_uw`Dg!Vr?vL0ON)6fgJOhgt?J1zlxns2QAcSG-!0F-rdO$9XWaC zva z)2w&(#?21bvF~M^9XUQ14BAd0jEgRJONr0UUIWd}UAXel=~HeF;!eZioD(*x72AEk z*XRR5M_OwjVn{*=Vul0>jtoI?9>-Cm(Ha>ZUf*th_oeS8acptsIyRy*vX}Q*vsu~R zT=zWt;fGH?^Yk;rLnE%^0AN2^R#*Z#7)smi-r7pDQn`Bk)g?)Cw}fT&oyh6t&JU>WIOeCJ(64N&2}$3eCpA)x-z=0 zHKl1vU~b;JUaQvuV0mfDbzRH0jWJ1_I=16F9w{A1aktYAayiSgqNrzELTha}-&|iC z8y#C&*#vOw&2F5gj2S62ooTHNkRnoqC=~#JZQGu2^?JP@n^*fG;~g(`yhE%O-gEAJ zKZgFhjE)e<=p^lFu81@Ps_ksQ@b#}LsSF5aFtCJdH}B^T85q(;$oXy|K0rUQ${-@4 zQCjIlYpt}B{S*QsO-3Uk8G{z<=kfHx>D?y-00*w-!Q!C(%S5*o)pmclL+oJ}9@8G~ z-IaVme0Pw44q-Mu}W-4Am6lPQ877uryBKq=|}q7zNc>-KuUc<@19K#;H5*T`p?K-09 z7Phj=^ypx&=m(zb2s1kDPfq#(_Wbjwxwb%S16&#RvAFG##iArmqU#r~calyf zb*iPzv@zTOQ%2dAuz{g1%41e5>s4DiEK4ygHWri>I2H%3m^U4Ap`)#s3pIH%ucExZ zR_`sSL}?>Tvjt1H+J_I1%s=qZ#`4RZRyRvi@C*QCsZvO5y4_A1vl)}g1_trX?Uj|K zy6d^~$EJNd$mh#~a!wFLQAR{IVZZ${AQCWS2#lxtLw-r&{(}I3GtNl?5F#010@zzO zwyF<4X0dA%vnQ5E!jFwT>Ov>y&%Jo@!rU9(c4|k@Kis2jgMkm-$4k*Wi_e~G0)Q|GZ(P2b$;`1GLa<$Lcx3#|w=WtbW-$b=WL7NZTUl?Y zR34w2t}WF7VR&#j2y>lgJ&U54WUto*Ci*o@4vO{q^86$7JB`(}lM*oraC2oz6pTMn zdi&Pp!T?{{S{N=56XLDyl@Ygea$?pK_IjMTfgKDDFoz9}4fB|#J6qkPH8C~Jh)Ujo z5S%;S`M1vJa)rDd_<8@q2Oc|q^yJsS_KkL@#YtpJZ|tn)>|*)YBmy8aQ={XZsA&oD z);kvs<6w-DN&>}T3Z7TY=X+Uecp&d6-w5OTIoD^G-oE_I<0mc3RFwL@ogXY+ym9$` zI{5=ZM*@Ku5+P~TPq^ymen)BA?si{$v`SW67ARp$XO1n|Cw7l5Z*|seh z9vS)UKl#PExnq9dlL0VHDH4JM5aXg3^<1Bm;fR7jE!?~@ePs0L$k^3ux0K;qJKdny zn#j|)zxK^nUVDA^=mRUOS@kDu(Aa;nVF{=J`@A0J-YtOS!&{=oGA@xT8kO55e} z(b>79JN207^OD(bzWn_Vto+d6*T3_Pg~g>XUzi;o%FRruIHFEkZ8km#kNs#ieduu7 zvKjf^Zrvz;<;uqSvp2(hNQm!TxuQrv|FP#!&mZT2q|>p{Lr*=M4UHe;3>L1{yA6kN z(wK~njb*AUxcTW%e(L(ww?r87BuS-KS;~3$+@%YHC1>!^R00$wktW@XBG+?~L8V&V ztZbLd<(Zio$F_ywhRA3W$8naVN=m_a7=)H>_q)zB&KUw@JnE(Et6R5jt^nAEA-DMW zezM|Iaac^O+ zzZ*ux7$k8IEdbYE+1j|Va7!yf0wQC8HQG_Ds|xpXhX!^lhBX2itpp+|MOquBRhl^t zBW8TtB2ca?P?OH2Qi|xVauIr$&)K^H(z^+tefsG3X5Ka2cKM70ANJP02fMgSE)n$S zbPgOI8qx#`NOL4knv(%Z76k-g5f{c`N&uyxQ$fn%kVG9NQ?2f2-BG1dSzKHk92}HV zLLYu`wh#JtD~w)CyEJLq}ilT&L;EA39q z{leH}m@;F}P92^Yub$RuPdpf0>uH-EJ+mu8x0!4T;XsA>5+jUFBdW?=1-meiWy# zTY6DQV;CS~oO3RO0kUlSsVASEo|^vXN1wAid+z8_NmR@i!Z0iri(_MB#bUA7>C7LU zcY|V-q*}qvo6Cdc($G-;ku#5ME-sMj<`M+}1i&~)#-vgoruzUk*4N`W=8OX(3O+V9 zdHKphEAE{*^Wgb6FX^7z+SnkF8Pfu=+i1y50>Rqqt!p=OBbL?cv^*%Lsj`T3Wh_TK zzSmxl|Li+|HWCbs49>P%9YtxJ7~6I#JJokKuTG2?bHyP7#sm|-9ZrliEoCg0`Cz$0 zK0jo;wq-jdZ_q3F$Bxb|T)R0nKCMG@o-XWEYfP)ziTSZ${PN8U7cadYH@XJ2ZIvd5 zM%Fi0M@OfgJ@eegjqNN=8AH;hRjVhM)Y{FNBXfQ%>uJL^*2D8BMV=Vb+9bodd~Lfa zj2bHXCm)e&mxMd;Zg(`t9HPLar15P%#&7_Ue_jjroU)56z5TSl%3;IFy#ASG(<8P&hev zSZ$nV3NKu`iZ*z?frn2$_7k6ZaFKL{i&t5-{#e=>u$)}z=@yzkccI8O+w?)ny0KV~!H{n6& z-2+zr7|MZ-kWUrsA+duhZ_erl)5|{Jd-B-*#a;Og(NNfBb=#hc@S4 z7|1v&mq*B0me{Q)1t2BSu>;%7J5~_Kv9Oq97mrMTk~3`>?d;UTTyAisuwacM87^bWiPz!+0X0g%?3zwfpr@3znX%+H$C zbh?dJue-Cexpk|taQRBNqf!;6Ns?w<%G3a885#g?#g5>f~XE{Z#$=P^fjqpgoW`mwjqU7H-8`1ybIPuH?qz1r?2`s9PBPR$?X zY4^?7zMEn+Fj6j$U}{YY001BWNklTD=+(sLYVo3=JTrMlvowdgf!f;c~sUb)#3!F)PTI z!+|h^o(`3lwwvOAh}8zaziATxWA8-AJ(p4zup-c&JXl%-n^Bg zE-|hM2@o}x$PiLPc=poL>7$2BvteWVYI%85CtaJ_X9f#HpZRHux4!Ye{&wl~#Q2G+ z*22<*WAK^Szn&L2-&qhmB*qzVFhGhJV=~icUwgGYF?sgvYmV#Np7+MaAl(9}nD-!1m{7A6T!g4Op_*>YbQ>=*GgeOV=(N!+M?e)c8bwr)t_b zHZ*kc%G;fK4>WA7Ru~D}a`Sd6OHHm&;9PKG1T-)*)b7@wJ@feD+FG1R%VC7Du(UXO zXxJi9Da4sf>fNUvIvM&_+}WO(EL(24-Rwv-rE<~4>ei)&_vz#h1RZrV%@8xGi7{i$ z_SSZg3zH-ZgP>7wWJ%I(HOEGW-nn=Y!5p1C^7x}aKRG$>_(8@X&9WqpeQqnkq}IZ9 zJ8_Q~I+p0Py90$nr`2X;SL?M?4?mT}(Jy@NzYbhpsqG97hntmZ97nI6-&v%}Kl#+k&Bg1r zZmOGwG#wqAasn%t&m|P|Kp4j~+f9J`Sp)EXZ0_jn+WOk?&~TC_uH%X($keXZT14D+ z-Evug;pL$sawScQ+ym`4>r|^`QI89PcDFe+HOvtky_UrZeRlZR-1yY=`pU+cN1ysP z4?XNV5ZaE*nB@qo*WNXp=&kY%X6nn%1S>+OAGa z&j0}5jpi8u9n{YtA|SSx?ud9N;d9q9^a+jKD}E;dwRb7|6jL8-^*`VN^tH=M5$spU z5FipEAZoKaMUI4kkR-C*iM3iqCKM^b#K!g#07xl?5S()W7#p2#)*7D81p}#|9qIe{ z(9uf&`mg``AO6uFA!9_ukO|}f2*^wy7STZ>bk`2hJG(ByJ3D^ugQ9&8AB0J_@#h`% z-46h^`?W{7zueviP2c(Zm#qJInV+9`U3X-3jF?4e?G_yYAhP{qfPH3fUxTRA8md8`_+H)`F|ca zGSEB1bD|_-#$p_h6CwdKLFl+{9>9u{`k|i@aS_Ccynf@VD-Oj8vjZ2A0T+fk%wkC=1{93DQf5eqU`d$)kAMV2 zi`yKz*qz1LHvl*w`gic>{fo{H%p>$u>JX7J&KP63`{zD7{5SufFCH16?sR*#ZrqK! zkY!RcWQ<#S;&2cMiet7@jf@BR5mp%ThD(#>u(Y(etyfk{1>mS=Pf#${eDtXYXXZwJ z_fLKwL=q=E!e+8ZtRof{ma-@+4-8#?^X#wugMZ9&-rHx-UwHM+|MTl#m!K`j`p8os zW1t#ay?Pw4w4171X~l6OyGar&#Sm?&q$Mn2Ycgv3@bJv^;LWS8Rwok3ii5UoiS70J z;mM(x3U9u4gCjRe0}yg%RA!9x!Z*I{6mq#-ekkxCICa#45n-%DjA4{yVB01^BM||KK`OrZ z?N|TVPabFM+n0B~Jv}(s+-k}}hI)AZsi&u({Yay;!ZY-p!g|HRqfh+7fBq}28Rr^N zFhn3=K>gXD!D3NZRv3nk>syxPI*w&oob!I$H(^;`5cq+g%jE!!ZCkGETDFCpTb6Bc zA%x(J6M!WwKqy<>g!R1&!5;;Cp zs?r8CdeARqo9*g)#bk-#Hn`~s{$D++JRZljO+Z z*_~eG1oq^yIW4;$=ZL)7X)a#d*xcA4qJPur^i`_=;CKGx2jR3I!L}>)D3+UBRbh!n zqhkyiB^r%{h^Up4p*PQ8x%tjwshndz-C9d!8l%>r?KDB7tHNSAFNo^xLXdNFE&!-h zx`FTK!&N-we z$Xf`(7>ncB_x&VE_92tj8X5P4LYOPZabgM78ZyNz^?0Yg?zwK%jfGcC6s+yE{Q#Au z<)zBeV@Ey|9%k?D&iZ*$w+Whp-|5wrGvw!@D zf86S|ilqUD_p{pr83P2luuv?Nh=_Au$en;ak$S0=ZCT7P&iIkZ2R+|6#xTUGLp=k? z7y~j043H6-+q&zto7jeX6Wa&l-FJQ6S6tX#{jRC*gNq&bKzIIv`_f00u<;KJa+^-1hu%0C>JXQWTN);Nt$a@6jK2U+83yMLMtnwuegz zakp-Yh-PPJM@B}E9Xp;c3=j&ueNpcKW4MpDc5xa5V%YDAv{#RGPw|Ey*>)K|{o_;FjI;mHW&(2KDj;(Jk2VP)VmJvxTBdK&LKP)WXC-gWt zK*F&dO%6dS&CXEih}P}FvZthO#5>!SEk7`ZcqyE=tzxCN;0V83TUR`DL}@TT93@*| z>VZF!FN#trv_zrSt1|+bD2_f_2?}KlC{V7)vaSR~ZgIw3#*mC=+C?rbArPS7I+pD! zec#C)-F4#}Xo7^h28dvc-UCbQ{+79)cyexhaD+1J`nAt+v{Q95&Y(9LD3OhsTP8BL5$&rAf91BF`WN^3p2e*IQub7S`K(I=jI{>qiBQ5rL8 z_o`rXWrDO)uP>}#|E0$s{lag4;l>*mJ~ll)gk3c-^w9ia*14oQwU8J>uvO8Oc4TY_ zJRA;6wOUh?Hnu4iJkJ9r(y^&vd1-rntL=I=5Fjxm3lQQcCd(y2vJ5eah+rVoOd)HV zwnfcuY;DvNyVR<5%I&0HEFE3H89A=)@v&Ta*krcKbdsi5wswx@54Ba2E94Fr-Layt z+~RlMUb>GC|6#3IEanUOT$n4B2B4F5dyxW8WMXgtFaVje44A08tiSPc?O*)-=WIvY z45wzhTU)DdeebWv#*R31bH|6Ksj1pYX=Css|Mr{b+l`*b?S4Z=BI=h;azw3F;QOxQ z_<`?vq3ziDd_I@U1wl|QmHK}>uIqVzsZ??tD-6TY(NWiRy|6GcG6LPUu)y|gV~ntD zK*rdIpB2IwW=a-Azc@7b^>2Qs;O8HI^o+wz93=#34B56D>$urV9oq+6NJ)ZFgF=nH zI7Qo6y|`GkJ8?%b&1@S;r#fMPwiOog#YUr@p$x2|uv|Njy#P^2qY$8gkUetZl5ul+;@-*A^>Fw`{Zm?pZDybcag0vNK|v9(CHy6EhF5 zF0V4dT^0&u9PTJEX}6~mUuKz6RNJl>iy?|^d1ZC5RF>=AQ6B!}b5C{FH#fGo#wRCB zqa(|=mRec#_O)|Kk}&`>Xbf4*Rb(=Wz&-uGWiUSwbOgo_kyh&58*j|d&U&`>*7>u` z%d69qhbJe;XAVt1^2kpW3OUbn8D~;TDKh{ZEEMB7{nnp-bWJ5Bx9SoePL)UoacX4HaqM1(i?@~?S6p4a*=<)X zN(~5&fiZ1qwCDNmfM+?5ZT)SL^9BHh1I2u?A5aRWIp>0LL_%b?Z4rS|5)G?$RMF0b zxiJOO;SOggEN)C@SsGTFfL32$&j%^bG3d1?wx^*kdvg5~(hheCcDwj%cR$dpj z(`vMA+dVb^z+j8yBlEk*{D2kfRCK=;-UO(x4 zba)gEGX_8W4+m;YVp1gB=_(pLLE?vXLf zvJ3!-%$~Q|o`VelPgA3nW}pr6C`%bKV+=AxFj{NQ1l;wqy2lsXtB<&Mc2@sKLk0oq zfU?@3PRdAAa~`VKD#9vrl)rajGKW za^!#(cDkK7j{6cIM1~2;kVk1(>3p?uD@kia#^w23ZkX{b&DxulMn2d!S`~9MQTC29 zZO+T2!o`J^oNt$gha{y7o39}EEL#|$|nsa7Z!f11wE!w++`|1n3j1b+^ZYwkZ;QgInnx30TBBKmwVMd0_4?S@5 zh3~w=G=k>cCJm2zV{?Ue7WzFHEsTXZhM8w8e{L!$_<4tu;Xbf1ZuY+VrMJ3KPiE;~ zf8+m-<478vMv*``JUdx(&DDjCoEL5_T;aXwlg~aqn6$+<&v;9=lE>@K4%nOZPGagjj?!WQ*~trkZF?|U`(?Dr@w#Hoy<|!vM+3?*DhTA4bcDn z&;QKU!orh(@A&DT`)TLRw{Bj3X|=kMd+zD=<#>DB{||rpT5CIVI5VI@fg!`V$cO+) z8>1xcRIA-?ui0!yaoX>0WLbi7-e@)kyF<-pvm5oIDB9TA=yu!9W^;XgJ)aBWOs}u6 zwQ4m#aB@6EM1~vz0T_PRn%)d42%WL1i8sz)NRy;6;9S0Zu@Ht>5OJKON&0WU@b8ty zBdO6rK&>-W0F9l_^5wM+q4SPguT$Ub7=OAFxW5l`86_w!Id~q}z*{T4!@_VA z$Y^7J>7ya(=jh*KEr}sV(bYxMoa&zJ3 zmtK15#g`E1*wLfPq^C|kaO%XVbLY=>o0ZRg<~fU70Gu>9mS+t1dc9h8W2aGT_S(pk z?d=UWZ9n(Xr&^tc?G}rrp(IPAUW;4cx;{t#@4oQw*4CDe&dogX$Rk3y!((GZL+-<; z=ZMmLK3^ylx2s#5?RaTp``Ea%)wUJlWG>DNr|BGBrhLg+r$p2vxUv?XDD<}07D|JM zLRToy9vvQ5gM-ZSqtwna8StGXjtYf>$?U_-*1gMmF>ua}He4{yEu(=*%Pd30 zRGNOkrisV^i?U2cGED=A31K)lUf}9PS2n9@Z?n6ZM8So@d6q#Z!--i}yn)Y9fQp$Wj@7OjG zX>DxV9v>PCose^zF`gtn*X0a}5eUJF3=(6+iGkGGvK%Q>r6lJ(g&&_D1`+iuF?PT9 z+c41nRQ4T8&AUPK-W=-QDhH;$|85x(N2ZkY!eC+P`mL3f!J*-?ffBlQ==*05JrD?o zii5S~t^2u4+E*v*e=*3IF&Yqo3>gBhr7?hnh=h!oK>{$)ue(JAWN7pqEphG)k#AQV z?WS8DEOFVRj9?Gr?n^J+-UuSy1_igd2-?rr0sv%v;;EmU#{h^h%~E7s6DZQ4_XZG9 ze~gg<0z$k!kPy)rBE){0AoYb3?(5q)P1Afn-%H|7rvsy7yX@%hFunr--Q~su1z!7U zazFIm5fRAj)i>S#`CSXXdx6`SZSP*|lXbf{BV){QoV&NOA9v&Jl^LQj#90574FPcw zd%WX)CXN7LV)SskxzlPi-nn?Quvr@#Zx^c-&Si$`8-Mk!;jw|^ld})bpUARQDU)SM zrWs`!T4ZrG5V-xkIz&XIUN>6Xyv{^uS<|66VsR%39MTB__ubLZuM^dyxZzmER;!^@ z?%MK;Dju?JuUIPGT3orYvaWQVJARz$8@JBo{9LV@Y68x=p&kQACISI^y}AvaV{<7p ztzySji~Q(>1d^mF@1UHJ{;PgPC8h++4uaxHVLp-chu)23GR)h-;cGr zt;2_o1$MsMZXTH$x0s9EFhFLQZHfTxKoY+X&wZ*FcX6^_t2QfFd&^O`*Gr-#(lSyp z8Ib51?x6(?NaP0cM~22Lo!+C5ogAAQf8m916>aA;AA5XrdGXez^H`v7ed+f^+MPW) z`<<8HzTQsq1HrP)-)v;{s)bCf_M|PiXY(MmJ1I2UJw=8Kl!>Y|(wX5>7>asxJ6E+k%v4a_n?K+w5kCIt#2gPG&-< z=rfnI=^~G$KDVit+Ks1Y2a68Yn~UH5>n}OMVEgMj|J|j0DSu-A(8=N4=H=?QFWh?d z)w4QI0BuQVObP@{I6??SmSq_cWnuB~;lss&;?(4%<#_pgetcr0SS$<-3`9{hFfgE$ za=RVh_lJguT-VO!a-~wqwr$(>!Z4ROj_bN%7$Tq$7C>Lp_CwCBvk^u|O06_$w>s0a zBd0%lDr&?+BhTA6FYP@2{KIpH$6}p~P9Iv_TxAYICcgG3-+cYWH<58*nky|Bq)a1l zH15ThFWrEvf{>WjObF1LaWZu6;tk)ias{7+&N4~NkvemduqwYO}B+Ih%uyd|?HhpGQmapn+-(z?D?##~4+S$b#0E-160iuKe zAW=XFQjiQ%5&R>85CBpjMUX+l5l%Fa;I)edupVp1?YN%lX>Y5#e5HT+{B`<~Rn^rq zv%Y5rI8l+2nU#6pd-uM4@0{~}=Q~CwS?b!B6!})a-KdSUC zMJ|Le1`#wOWt>u^gp$!!D9^L+ogMv#L`T2%Z+>NEb#=TsSu6PylT-KJci&@=y}da$ z@jJi$d!PQ~C+qc6v0(p$|K%SALBu#8M$sS$gjAA{=Jb@#MV_Z+Lu(nXe(7mCRTpFG z%+;mYxml7W*;e=9@jG10`@Ro-s2_H;mJV}^mNn>ZncVINL(6qnTWuuX!m-=8!rZNn zyLsQgKBP(a@dw_$y0t9D*g#UNFxTydS>C$T+N>{R-EjNV)wUq+osZn#+1kV$f^aa9 zd1a#HJEiHVIVDx6)2UP%(t3-vN^UZgN&^x^0@+9|!s52)j)D^aV2s6S?AW#@xj|#Q z8cAZn*sdQ&Lx(w4-y<1u8A6t(omSEx^ut&qsZY<1jg1uxg)GZJ1EUO(dVWJI(0~Y- zsU*vDnVV!7JD#JYnwpr@3}u!pr6{FB2+#APD6%Yzb3VFvQbet_Ow&|oO1J?aL}%In zqL9XD@ZEyZ5$POtAV8UqKm>vaXe`G8LMY{017*m$J%UL_W4(GKH(u`JF1~&v)bHN5wzke+ zxKOFrip3%TkR7hbO;hkXx0Zd%*rO7wo6-R{a}oD}uCJ~>g1sU!Fj|kOkNA4t#ti@m zcL{Mf{B5&WfOKQK`!}(Flp7G=Xje4>Vi8ovWO6%*wz-KZ1In0R5}c+Kd^Giks{h^Dv*$_^8)KNTvup(1*x1+! zZ?xG%ig344<_)}c^tT@{+DEb5S>rvj-L12!^0Bz1)_W_qRaxI?tt_vDVU|`ki`Fvr z^q>5BA~G#mI|y>1c9Ah=Rb8t*QE&H$)OVT-*5Z+cQn_*JH2Kc6XZr1yl)}q0JjBLxd} z#;G<{m)Zqhsnr)3#*6*B?XrsF+;iA3x}MFcZ*wJbB}6vtUp;q?NM#uXlnPFTR)i4O zDRPQI5Cq+D<9c^PW~e=zmKiCO%GI9kPfRpd*8+n;NBRT?^CY#55Kt(lkwNqS5HPrhJtqg`)T5xz?S>rk4BRW-Qx*Zg-PvnKkqDKYsnm!-wy@V{sPy z;l(Sf+wJz(U%47Z5djH?BSczT3N-^_lpH17w3GmtW!Z%b7iN#$cK-YYuTZQ{j$gfU zWo)dG=lSyTvg5hy>+3-{oSvBM_xi&y$g(t!<0MHack(XD1uA zDu$5^hgP|eD|PzpHNR9kIKMC)gt;X%r5(`JwzscuOf8H(^x)fiQ9ugL+}zw3zV;>C zbMH8KwB~qV+eVnxt7}J(+&(cmqmdR|FG->(8ie7%fFKkuUbu4f;IXOZG$P4$es%Tg z6ED9|ar|pnF4w$5%j?;GVXRn2P6z|7jmx~#FPzS#zWu(txJWD7^!q)>cCGT5&^kAe zBNb^z4cA~Oacg~%T6U@Ew>s^7nB6_MIERHu>t|0s z*NhhX&%XqUw68WF|JX+^FRi}x>@&sjCb6t$wah(tki`8?hh~(RTAV4jP?@ccef(n| z-|F|4*99Ad!vFvv07*naR9n7f%}*cP?q_Rj8{J;+q`@OiCufCc&unGe8+p_YEz--H ztbV9c(m?RS>C?kulng@+sy1G!*6l{AIt+p|P5p9#JC;k{EGPZjFx%pLD2HWn1k8m@ z(u`7Y9Geg(Qpt%^Din%EN{w{5gT{`+01&G6Isp}nq2;<7G!T?h? zrCKRz3?ZPUR#NCfnQ)pUiQ{^Vdx((dnP=Nck|?FJG)JViV^L-}=W!I~xe!t~a4TzF zzKN;bq}o38;0Dilr$z-3c9W*C8wTxs>jpLJ?_692aKj;meh{p0uDtD@d)ixVHO%ii zd`Ho*fYQC~R-VRi>y|_9v~%6J4@&Qnrgpe+qey8d`wRdEgv_%%saC3p#27Si1Ma&4 z3cY3pUK^|$b3^m)RSk@8a_C3p{dnW$o?rm%b*MrYl{4_VE z?bby@iESTDV?OA*PHmza3=Luw$3!rSX`BxU;RHlYpM0xf;XVVYh+*iRE#jdnkocXC&ZJR9sSU<%)C9Jtx}Nwul;zj}hOo8`F2P+KF?Q{@>N@ZVJ+h(RPwD zk$eos#`1RDc3quEUT2`4YT2=vOrn`a`5*t>PcsxmTWK=fYHxNstwDEv^Yh(a zS7|*pGqc(057SuZahm5eOLZ=#%yS{~JkRr7WO*7Vd7Nfx*6;VC;V?_HZl^O=uOafF z*N?&;=i2BBA`)&R7&JiM>YMxA!6Q$eJTn|bci(&WX1tDRAnaT^m4fG^2Cd|QgY)e{ z5GR6a?pvNQIybaFR-V6o(jojvdEU-Mb-a-xEUm6O^}_o<{{ELlO-yJV_Z6 zh9t>#x7W>*v{tK8%Hkx+K`1oUn%%m#R;`U^Ced`bc;dj(xdo(17-VVYP;cqVRTU@m zhZp)QOC(IZg5$U@5gG&#AcJ0D3_6@CL`u;Zqm)uoDy@w%1gX|WDWjAgHJkn(?G1^J ze&%QYrw1N*pja%ru1hJ6!Z3~$_uOL-Jm&w|XSc6hND}(b|F1v%;Ct>m{ru;D@Drby zUYujZK%Sj`=INPoxjHi;rz%&Uf3Z<6pMCLcb7o4#d39k%5ZsRA_0840ip4{-bGGda zh9Q-4xmMG;0tNGP3&^ZtlrV?OBno@&g*)z~+%;L84pzGZAClz0x!az7_T?*=t}9)& zO7j+vw|eoI?>+kPyFT!-_rCc2$^ZDi!o2w{xHpwSbMe`h22uATCTX;t+e0oG9=W{EXy;kUDp#b2Pra@ry|cY$p8^> z6chzP005LyEuGO#7DYy9LX#vs?ip5*7pjq8XjmB2J3M^62)drRns$l}bqn zA@k%Gy5ry6o;m$u#qn=HdK->#GNUyyIf5;jF$w@A!usY)nk0)0hX4SP?1`O?76os# z?|9XX|L;J&WB?43&2~$vI2Z&3n1jyy-~V2(Sk~I8T-c6PD7k~}Th$zDYsRH@DaM$_*^Y?9I|^3XOKpiG6Zs zd%N*1w|E1&f?bqp_b9Z<`_a0YO^`N%`>UA?;bvp@MyuU@})^7J!{2M;ys zO)v()`A(1Y8(F*6F$!F#Ak&;uTN`?Pbvun?LY*MUoMLfuW;Tg)L|198WIpKjfmlGS zMs*w%K|;t#5)?F2&8RDd2F!!>tYL#n{e;d)!S!<^C{t1;SuPMwl5d-Qx>QO9E@gRC z^bW)wb71=2iVs%S^1I%4bY|QsIF@2n%W`uX8_-JXVxgQ#k*68wJW9f%KjAy$#%RxT z7_p)-3Bst_s8=eLt@SM!MMQhJXeD06_?8y9BwU&SF zrI#crB`TYpD6Xyc!*#teAmxIs6Kz|T%puQHqSNWd`1MoI|M_2icC6@gB!(-I3(pV< z%n-wofCeFRW_cIZ`&vZUM{aYuPY8AG ziszKtoxw;qQyZy}=0K?BqXqzKfGK?QWME%wlg;sxU2-VMX01>g^RyvW>%n*2f93k- z#MIPSbFwcG99TF!)9QxRdd1e;NA9>|>iB)_PCE;eJMX^hg;S@A(GNU$KY9Ln$8irH zJb3l$m9epL*Y{Rd*G}Aa+v?h?G3MB9C(fNdj|L{16L;Tzk8Ru2lhenKAFtNx)oPV7 zHa9otI8KrzGcz-T!5|KY^?Lotkt3y2sak6+9#~jTdzD(XSS%WCDC0XRnp=BC{?2VP zl;_Vc%`GvNif!XQF zM9F%k$|So$ik5z4slD zb7T|cX(e^L*Yl~@Z}l9;T-S?-q0QOC^wd(CblUCQ7k;rA#1SBlH>QfJaO&de?Ul_) zWK#=sNL*zUQdX>0^Iwva&3*9lOBzQ!k$VSHJz~h)?>JG!tnnQUB==|NQ&k zeb=x3yI=c-U-?DixCPsZI_nQVc+cGY;;9#25K6v$@yZZnX|fq+(c|~tn@j!Bd){~Y z)C<4)?|$o_|I2?Bh?FsBx-s1jT8WNdIQimx-t)e8x99ranUgPl@k^h*zP|D^KmF5x z`N_ZNY;XM7_kUok)AlFpmzUR{II|WCQ*YXg#zgkxAlzz}V-_--I^{x^B}#B$HXuz%VmX!pAU2|v^@GT&mykH!Zr^daWjoxm z7*Yn5Sr!#if=;qb0wQOFAjplfk&K$KsXQl)A|U6CA^}2_(RrGRI1?;w6l%dB48y2Y zu5`M6p%f)htyC=A*2=7{tr5z~<&x3H_x-_OXxkR&Z{D<@ynd#t`0YoJBcL>fAr6w^ zb7!7sJ@M|xJ^&~;+8Zm|%M|$n0!0h8LNprnt`E0EzuRlH0yjB`f7=5jV*m-M)~YM3 z-9oXLM%kl}KIWGyQ4|mQeb;q4=fG~IHc8NLz0OX&`VGCy=R$3aHU^9~S}CdWJhN@P zQYsr{dS6(D`{EBuDJ3M&GCh(L-lg~4aJqM&?7Vu-4p2&w?9eI=7^PG$WjGAdXjm?n zre+Tyw+X@ygf-H5LxO~AZ3t4!vW+oXt1K0xV!(Z4;|@P>f3&oFAh(urG_s>7?w*;O z0zmE-lffVt!k{srafeMhDt_9xf4e92x9P%u%P?k-qB_FK447RF@o(Az>2*eX9ctg} zeqyxHgre4Jb^Yp}{N=x13(gH?7peHdQ-2JJ{Aa(i;#Dgr&%IcCu{vHUt62WPhkohX zIoNNvLypa;iHR zQbwXE0fImX0mA@Y+oAwUnK<7dlx3>b>0PS2w`FOv(Y+LfecQ{z(4!0;tJ3adwQ91o z@+1;lV2Ri(Nmi?unpL}?koLptU^F9D5Lyc4hEU{5lI13`-8>0&(i=Yh-bY)T{prcc zus0xtyN=)K^$kJGbqxX~6al2!!G-qQ{#bfHvu^Ld1nH>QP#Z8n^esh@xND;kj2h#q z+Tl`Smm70qN^53W+!nktn+7YzLd`DPGe_$OPaHtn*xc?s{nS@%*DkoYcw0G$wyP60 z%W~fS;KL8x_t+P|_=S3@?pmd!FHSvs*0cF`r=^rJvG}$BBFg~&{eWhzH zx5Cx!yzDxjMK{`3H^bSIN8>!n@{Ht^k%LpSoz3mFmK-l}4MK^`C?$<0QGr&Js5laq zWs5W&<{3dA$Li~6myQ;jQcnrP6=;WM-N^M`bFkY%mO|b1=)arGwudW?x z7B^Z+5QcNr^2%m=Wvkto#*>#?sny)vSnl@QwMOmK3omGHjnB+K_tKd{p@5e6+)HQX z=fiTbeBt~B->aTGcOl6#&#gZ9+zSL@Ve!C=CtvjaLZMhZb^3I(IWayycInb(rPa#H zY7~aP@1H$$CJKiqP8>UT?%aWeg)En6&z=ppw{j_L*OgK-N=KKHw>UNeIQ`0bi&Ese z)9c=T=q{wX*Xr7iGZ+N6$D=s9eBoly?+vKb3>;=%zkCfqIKF+y(K`p-c6)ofscXJl zN>Wrx7ah+e;^^T+nHuJ~oSK@P;|D(V^xEXu#MH#>*1478nl8E(Fe1@`W3iy0rjeOl zoVsxSoa^|Edxc`n;RVOWL2pxIR`h+xa!eAnwl~sJUanM2ULlbQMb=G}V*{cj60%rY z4KGdt31WVBVSA;GhEk*=O|=xwTG?|rAW4H*5+h8GAdqndfMy4d)>=y`wNb_Z7%inT z2Gj^V`kw8L(X0a?gt)Fd5~yvpTG#vC-~X-O=w8|+?lhUYTLk?<5bHtj>(4&DvAzNX zx$Q@3a$s)eN|^lqAN`SzA|JUzCndPN-3f!izxnsSzS#?WyKwC2!K)XqoO$K!f!mH} zS%N|p{L=dJMz_;lSzdne)Jso1{d8|_lQ`Bt`d|Oag$t*yUOnTN3$9b)Gzf;#+4IY* zTWfx`7AMzLni7L1PX~(q+u!*2fAQH*GS^z&+;l1X(R+X7{U7?EU#}=7|N5`~>QkTk zl;;#($JyGvg~jOKtHp81IcJQgX`;0F`*1flC#BN1@Rva>9C)8dN$aC2(>a6jt1PWkf6(!sff_3e%t_R?gSt8{Ja z^3|1VgJE*p@w*6;9lDj#quLO&U&Ze4Ud0gr01_}#aX{`kYfH-?dCx}*b+3*)sJwqpZ(hUqusA706>5!isCq`k5Adm)@G-6WmL3gj6nmGvJnGww`Se! z_0GDHbB7zD5$r)J`;e4dn^}MHg;VRRYg(nQU!c?$IclwOuVpIkhWNWjz2C=$Zxyh8 z7rXkpMJIdj?RTla&GBFVlZZkHMDz>QvGLDHG$90yCP1@XA|YCH0~V*vB$u{RXWSs+f~w-E=){Ubz;{mv)7l# zdy$M{)#`GgY`@_wj87gqcGqybRkNMBsqv`YdjEUg{X75mS3mHfN58y$C0B~e;h{15 z%J#4o(Ij@s^{_G4pxknDc4!)w+Yw=^=+}pt6iO2Uj5E;Ib~}nXYjK`QB^Wb#szHK5 zV{u?eY$P_Lgm4Wc6*)NUz|pCP?m5&EYcVrplkIMr3z`(EWpZty;7AgM1`u-NH7eAx zC=x33JPL_+q%smm=HRMqjN8v z9dFkCYMuC{{vc|HNs{KAQk{t~j=f@WdSPO9bA7DP0E-NVVWm*PW~w>5rP|uYhO|VO zC5!X7H75$ge(TD$3x^IKo}Zp6l*T-pcY7NfTai+Eg%IDb6m3W4dAqfJ^zacC=iy-3 zYqdN5t%o0a^ov_x-iWtLzT4?;4*ET>=DzsSvuQ6!1WKsIEJbN9g;D^BjG;D)6Qhli zh7kouO9QxfJuy4NnR=JNdux{H4T+9?-yiMi=nR{lp8m>bK7Z=;sX;$5R>GzZ=c$Br zo0{O<+0F6hEFo?b7;{`(%ecI`{6o0rbL z`~o03edd+Jcit96kq~*gTsrmgEAcRT`K6ZzL6;D{aCB~dX7O`>{Z~utSHY+|4xOkp z#`~RKd$q&8sq*wxI@rvEO@k@ZC0d+2gx%%A+WAXE4TNiW=LbIc(U1QSw=4>jGWM~L z{J_N6)bIYz?-~iiLG(t<*mq~eVo_`D`#z;R6&H+Plt#AAgD44Ok!2!CLdr;zOV719 z$)jQHIK@H6+yWd?GZ}k`NLO0*Y90Js5f00F-juDcHc0FijxI@*EL!DRUu9 zrBW_cn#M{g+jf#}mk=Uzp_L4RfOEdJwS|bqnZlbhs|=7*7UgLM)|tzvhv9ZAlVE$< zcFLdm;-~xJX1z9b*YUe&X66ad9S3|zkl{u>`X0CE*7~(?f*Alw3|OpMDv#fOcePLv z!<3e)xl)7>WeB(J5u5#18EX2fA}u6)7{bmR8bmapwMH;tv_YedG9#RWGtN1sj9Zr8 zDcac;TL%C@W6X%p!x)oNj%qhS->92GLtq~?g0CL{;GPRe2>~S3aL_98ePh(9Ypu|PeW6r72R7p^#j{@@4y-g_VUVcYh<_Vxer?H|auG}rgDTmV6-B_Tv|N;xMC zky6Tt;}x<@5zZ5#YL1uZqExCI&9z2`#O4lVj8aCmL130=70Z?7txXAPb!*k}F%e03 z@Z~g(r^Y^xf#t zUTZTKE+<$lR2B~%_}}jRxjg58{O5mhVe6d8Nz@(w;K#rJ`b*Dz{pqua?&+&%M4Y$o zd7CCe8zr+` zRA&zyJpRB#sq1+M4je${jE|4|o>y&59z1;5D^;aZhmIbXh7rJn2M)aFvBxaSI&|m| zqqJBqS1Xm~*!bk+Ug6PB@69*0~UOj(-5>hJFH`|?qhvqkeUOx

Kp;^R%_S;THhXFm6Fy<>k$NGL@sh_C}W%un@~+h7Zxo+ zgOn0?5}g1rO1Qv{MCYyXyWWuKC`l5>aYimeyWLKcWUI4AEh_Se!?x@dZQ=n?m+%MP z^=@#SUa(y(6ep)99{=GVcmL+gU;fIIttiSfp^X5;HFGs91l^b+{^Z~P$#WOZ*T%=+ z|9$Vz!yxJR6rlvEl*;wo&CQMF)#X9I*V)R}H#al^jiy*AMk=|uw&c3}db`t0^kC&O z@~Y5`7)$6N>xHM}z|ho6l;c;J?XIq@{ra!}=HL72pYn^og#-*f@W6w!Q!~H#i@!8I zHSJImr9i+Ny0GV zl=@!57-c(lzpowV&AXPXL{LKk84%N$tUdq26A#>fSC$6%-1nYJsmVR=xfNmz06~KQ z1V#y_*O2dF&-?!NiY5Nmn9&pknrgA^Ggsz19`t#ksI(>&9nUe^SoW<<^qzj@xgAFt zV5d$5*!qS6>z0?0>2C{>rb>csJpGH{lh=>>t4F)}9r7XKU;F zh15x17mu)1=Z_o+Ble z#VO~MQ@>J>MiXNfD`nSnlQbdBa*I0z8KNe{ay$N(=8dLAQ=bg4?sWjeLy|(tk$&)KrmN)Z`%2-Xr13BSV zFFx_L`ov^&vh>t*PhGma4nnQ3T&j8Q*|XQW>n*Ldq3o57aF8h^EKKs6#Sb1ic6E8< zN^9%nC$A?d*hN3l%3;iS7>BU{%1DNOAs(`^65H+uLTVwDGDx{4Fb6Fu7*07*M;e+4 z;}i)XZ}+n2Ubwh;aGqDZ$g;vgM5)1|4tn{gzWUX>4lOJkoT^P%T*kPBv7&3E9Vd}P z^2Kt|Av$+q7=-PC@0Sbpy5rLB{kOf9o=i8$k~HI+n?9G#k~3MTJ2b^u1nX;grEb1=;nL;HX_g|;C!c&$OI5EozWUX#*|u#oJoWTb^|8jp#Kh&xmyaAdva+%gMUfEV zsi&TbhQZY2#FI}xd2n$t%fz$KK9}`2;xw()Y9mH~kb)4cZUu4cd$H-csdmz~nBAyP z^s_GIRa zVHiuPyWM`P+s{!+Esat#Rle&lUBBK+(^_?WV{7a9p@T)gXcST#@-!2fym;Ya7@s=4 zwvq;YL}*TqD}_mtdTuV2@*R8FYY)SoB6NP?K+Ziw^wd;y{nAM(#h@2f%9T9N^EmS? zU!}?z6(_NjDo#?ZjmTv#B)2@!J54^MLO^1))?n1W+xkAkn|rB!_x6TFM}xs2O*7B) zHa9o7x3?ym6JeBYt}G*1QUS)1Q~@2@UhkmhGt`r$VoeO4JL7a5@{Z_XprPM-BHpjwr5ClVR zI{+9fU4b`A44f82+WQI z!cK&M27!PvpbaCSK@lUB5lWAy-B3ym03sQAz^@X)yQ#8&|B=4N$$tIaGv-yJ!OpS* zL1b)19Ysp$NWudEwALdc-~M6ujWcRO`szKoDJt06S-i#C(f|OkK--TT@jQs7qK26N z^4#->-|@a*{ncN6>|G!D@JBy3Ivl-Ig!MXGzY)^xJ?yh@9y`721N)xuVQ=5C?g)3( zBk^^^wr{=_LXaRTEfMkPk=u{xJA$yibp7O9{hp&g@GvK(GiSea=G=2jOUsls&MZBh z;jQEdShh?{LbSW+pSD!Wejm_ipnlJmghRm=G4xl)QD-GxUO#$mC_)g z1P}qzC^v#q?N&-IFd<3`zr(fsPgZmnL< z<*-~W*|z((yYI>Rcb~Xz!AOP5At+oAk>sce3X+FIo16MXjkzKTyTL$|od#nbMUYBz z&i77iN~w|(5Xr7Q9qi~{7#t};?jxhZu3+8hN2;X)Z8+mfN~L6;X18#{UE4W)V0M1K zeq#QR?^X{q4n2DRqf+D|iKDPL=x%PEU%uG>N}ePxwN);F3TE*%iLR}5MYZ4n9SXUe z2lvfA{LXhh((YZ>cw3>tFJ9P4*Fu(?r=NRvVRE9|@1!v-ZF9;C5NeVa3cmByGiN#j z6$8nX@3~mCyoqvidF`^ulx^FL@p^&kVS-XS99sjWH8GkIN{vQ>juyEwS~5Zm38S>g z{Ue7K&aJE)tznR@yu37aaBOjLqT|z)U=l>7`C2ITlc%p-4#L?qHSy4wW`26=da!k1 zzG&%Md%a&P`ZKlq)#c@_b?J3kDoGeer!H@(LjZJ6!4xfEjEs2&x9E*En%6>+s_}MSWGtsdb5u4%hMG|z6o4Y(%rHVM zW;E3dk#kBdO^8C&1SJ|_6rqF=10azAa;^y>2(E2sF(*hVr3l7=rU=qd1oSLU7$*o? zW`x-w-b!8~0IY1S4hBP!sz3P8f2bWpDCWbgT=M_()j!(Y-p(^I2s$x!WGEQRw`uf^Nb8f+6 zb{fX0^`&#^crfXhp3SFbMlw&glLK_XJqZncr%6Hh!@1UbtX0RV!DOu55_5=QG> zXdpn1Hb`L~-y3!jBx7Jiod4e4t~Vq)B7_=avMigLnrbu}BG2FP@H_tK5C1TUrO`QN z9p*PZ?q;d%g~PG&a{BgAmf|GnS(4{?;CGC+e0_gd8gCKg>*bOlfowU%*0H4 zYs+$+PkiFP)}2ARb!oG;JzlMxytouNb%NRGF;6J*3%~I5kH7Cj zKl)=oie8a2Q!4xa`_KR4=_mg3jhM9W!n6WL*hIZqE|>E(b6hu!`wsH@SR)(;q)51H z=M=WKg>4lF{hrZj!Sjn=RcRwszH|N{jOx_Em^{ll=c6PzK{GQum8Q|$;w&IeHK!cz z5YBpeJ_!28u+8PAJPxb%s^i<`MomkpjV1=PR)i2Cgb;!dfag{+O$x#M`YQ>#?6aF~R{YP}wW!&0fD#hce=YNB35l&)p%JN#xbc~N zr@GnuB;0)ZkERIshcY*eOBX-AzP0(4CqMPjeUIOH{DIcmcRj(cHcF{68VC|(lu{t17Y2U0#Dz|> z%n&pb3^!pEf}`Uk&V*`CO*_U-QsH<7&Nx9vP*E_Tvo!9b7M#dRp7f)Rw|%As3HKNu!yBD35anjPPcf;f(yOc$79 z6mxU|0JJm!fC|wzU~?O_7NuIXHsuy{{Ly=-4j*W)4)WpF# z{i17m)lR9kw!Es4Rwt`{TREOwy8MDF`-ks83eTQ9d0~4jr(0dI8JmMme&_t8$$K_? zE0qQ2?>Khw#EJXwf9Gfa;6JQiI!SD2DBdBQngy0o}Q}JE45m6a-wNO)~MGj z^7Ug2^I@7VE&b+Qciws5 zJx9-9Um+EzY|*S88n1le{I!Xx=KDVUJ~XPgwGD_ByGW6(Z2WO!tUf+jpFcQHI7*5^ zlJF4L&VRmEDSD1m@v3>4tt_4IZMQbp);U)0I9grb4kssOSFf&4Ow1&i2%^Ad?)G|X z;ot#HG~*D*y-dqazw4LWOr=X}*PC@o8!S%~qp4BM;&A7^w>Kwi+z<+^*B;p1{c;>B zFrWCuC;BT(YcD)Mx^oI42nC5+8&F15L?F1o<UzZNl-ufkRJz z<}W;=6sJipCdd5`|G?XydiMJBUw-1q;@tZleRQ+8S}&D?Ry;Y`oO9-rB zM?o;yZnqfc%4lj?mcwkzE)~k_Tg$B|pP8QN=KAc{m)15mx`V-kcfW1DFR5EVgyRb* zmX(Iqer0NIjxjzyG4a)}eBsnfPyEmS@Sjdk&Doq#_D1Pgd>3ZBw(B?|&pW-& zSiK%a!(0oS@+gauaRacq(TZeBDGO7@EWbZY*0$CQcDpfFDK|=5tC6mNHii()GC|0$ z$|{mbo59l3-29}=+*qaUpqFQ4I2?vyP$(3pn$uNxfmoISqfuol*V=#qW3FTZ8Cu(uTQGL$H z&qBhq0fNTXKme2mjhdnX1u1AvDKpG68VG_x2Mse|07uJ#LP`KIWLNtez!)>acQhg( zp#VxN(7VgB*Y0R%ZV(Z*(fifAM*%-Uvg6?!LlBIi3W+8R7$Tvdi9rKE3;;o*l%|v@ zsdhC+(cleUpFu-F0cZfCkr^NW5>WyYFdPjcYTOqA+*&*Gk^iyv(x-c8|FRQiXL|m- zKlX8B3^MlPKk?r#EnWZRU-{)9`0$6{`N+e_ETsXEA}BNp5R4&v=*{kw?JyKaPB0?A zPM^fR)WAqB zMuH?r4T3?p=r=#`==+=hKXdOHB-wdg3Eume=kle`@~*4BL8A@OFa$^epchGqA}NWI zW>->dtSBk8%hAL}?96Oz#KaoK#)LGpT1hKuW<-&p;Zg=7DN?i`2nvK{0}a={yIfag z+4TAR`^^4$S=9|A&^18aA01g)FS}me=e~3AIp-F3AG_sVlet^bb5?QJqP zVbX~(+>9fIM3hS-2nN#h(BUIC9TSoia)(@dDlEhKE8p2Qe&6cSg(t3_K6J}F($x3; zU}Jsb5B}fZwJ>ig%Qn$5@|%9ri^cNB;_m5UvMf*Tn_XC4>4yEX2pGDO2tt@hVrH5k zl@J0M%NTPvE>L!wMK>~CwNjbrh!7%$BvcVfvm;0;walBzo&J;miO`Amoe*8Api-BBjx&lx$}*zj$@?fm`nRg^zwv#Pw34 zpeX+0$3M>9;g?Q7E89)S=(n3Kt+b%=NHNEx(GEJEAKi6#)hcXY4&zSlOP}v5v=w$QTEgr{OP@SNT6QM+UaCUlr?iv$n-}G2nd4-Czt6Z+1 zU0zu4l#6bmU^F`6<}-79j-RmmTjfS?SI$nxt!I6=xw&poJ#}&qbsWPTDdug}Xm7Lv zAFRA&N*nC}o?1vZLcbqTwbr|d3IAc^=v}9d-tmsvU3-i#T7nQ^x--)g2j2dkp*!xm z`s{btpKoglh?+BInqb;iC1)FMe#5G+ZmxB^jjcUf8|!rh*=%=LHye&^S4Y~*D|H3v z<_qha&B?B}*=VO}((U=pc5`}WV(#jEv)QstC-9TzR+A`!pf=XmN(Hx7U-CV#F;rb% zUiSKatJPXrS*BDIYFt}h_BvgYY9aOzLNncwdS&PTClZZTHnnBC8bNx!9w%}nUlS0Xp;~n)a}3Lw z*i}k`xKJp>X^M;ik~oz}I76m638g~Lr9zo1f@=G@JP;iXRw+sj-0F}Fsxm)byeVsa z%Q8LBYqeUIW!3BT@$vB}Hg@gacmMtG{njJj^!sy~ASjA}fAU9v(rk5p_UArqS?1Gc zz9(e5|Io=@@FiBH1SgX@HdtvVDU;Fxf_uKypddLN;5d0{c=_V(;O$PK4hD$2C~$xr@vxj0lS)mlBpCDT5%|a5Lz;WCL&QHm7oY{ z08I$SNlYjqi~uzl0tn?8=9Q%-OGWug4NYvt-AE(~ktUirM$N2A(3RnuW7+*q7nCBl z?UeI@fnLxl3$q5bw23GE_r%^?7uT;=S;V|v3@_G3jzS%G_m8Wg0g{i6#yVoLI|NsYob*)T9<$ZAR4vS zL~9C22~nsCLq#MoovGTg(V_}7w7>mD)b?^s0ce7tvcAza>Vv_Ge8803{^GbZHep9! zK`FiQaAU^yBZLrC3bK(j3M4@S0GU^36h)?CY-?X2J0A!DY9)zCiPRdH2BM_OXoQ;J z_HsY7CLai~00Ke%zHWB>$KU^>U-_+Ha|?yP{ZD`XvETS#&MwY}eUA{L0B3gX`rZHY zcOUxe&;8!-J@wn4{2kjV2&n*+(lP^e8Hn8mNUsLlYTya}MsXv0d1Yty)fd$FjT<=? z+YiXW5r5Txb>nM7kdW(uD%)|;EbojjUt2VJnGi(0slFqWXpvn(nlO&G;kZ@Hv^SdT zrDBB|wt|F%NhFm@X`le4*X<{%BHTcrN=uCjkSPF(l2BbJ7>g?xt&%@fo@VVnf(AXL zq>>V%wC=}UAj6W^iK^6RI+emmF*jWsN~n}Fzt&ooS~CusXdzN11UI~rvreh( zUjWEde*{ryqkjjMk1CadaYhJXjAnJZo0xFhz|z?0>RRvC6Suznd>DlO{#y}g;m!`@KQ(s?u_xp3m{d3PsWyI8~lE?z3 zs z;ZXX+l4#}9<&U4BVr{FU3R9Doz1}(>s;hHXl5WqsW8du9SkASso;w%z zI+WO2NDUf5Qd9ylRa(D=Lo!|)-ony(`K%p@u-#&U7?xWZ9@}^P_CAs8S6>pL1kgwz z$E3@2!4xCa!dcHD!^6X4%+B{J<SeEO$uInaIY8ZxL zm~*<;oPz;!!UVftEhGMSosNN4*(`7r?_P(DMv>~4Tn~PB6!{U@=C?Y6HVeY z>;!$sGP`SQUcVitN!RyMnTC-+H-EKMEGm&&ITsCDDGX7{8D&nv-dx)NLC&8)x3;{M z$V5}^y2YW&$Y!tk)o*{}u6yrZU0p5M1(_r-yzq?YcL~*6CoA=(`Nf4|wGaedicY_~ zMVwN1&3~zWWtipmPVR~WVLQ~|R;S%56w6ZU;o1=8RA@CbHNzN*qI6Er|x_7=@%E5>xU1_&dkjELD28_g;0!f znTR-wz|=}=0z{{(-}i$s5>kEcbAR=~yWh!7LlNW7`|tOy$)$Q6$EhQeB9)ZT>i90J zP(1h2nO1Z2_EV>*Ss_Mg-~LLs)jNCfV)U~A&j%eXuWuA`(IoNty_)!W^N~FWlQb38LQx21Qf6BAX0y@iv?s?WY}4eF&aGUVIkL}Bq6GBv#>W1m zZxK3L>2?ntyX)B}z7u+l184-GafcP8-^k&$ z-PkDr<2I8C06=TzM?`iQ8B=FHGQlqR<0NU4;TI3TI1OlhQr20{^8 zHY!Ld0XGQnmC}HNinUS-_~1rI2m+8y6tu(q**4&Y42tX+cJHKuQba;D01~oulnEso z88bK#B#beGD@CMCcU(nx%osAyhU|k<6QYqQt&s_2N^7PQ2I)5KOcN9u=>RXiInUsb z@W1%fU%&Ic?|ApG{@cB~_nyCcDT9khKx?op>sNo}SAYNa{(YmdIX+<{60NjW5GR#scrme!;`ANJ0^{QPRU;!Muu^7**F(EQ5k7m>#A{m^^A{Dmhz^Qk{Q^|reo zf8w#AFE&-*&n0E*cwUQ01DPg@SiIz=9!R5PSD+NeQGhuv1n8_~1Sq9cT1h$RhQH!= zaYO#IYHkLWGz?hWQmG7}N+qdALWprw9lg7;x_#FnpsSBQb~;V^fa32TdGg_>UiNyv zX&L}B5Hbve7xw!7Ud{;(gHejDK8qz`h5#AfdT^q-`D}YFdH(~yTAmm(H0GRqq6jBx zbN%uiw;lV;3onZx;F>BKd$E_}oVrwk@#GV6zhPd!B)OUAj*>K%vGT*7LCrCqyXENN z>Dig}^^K{q2~E<4aW8je8F`-~Qgl10w(6DR=B@w7)B5(ph=&*`qIMkGB8-AOJ~3K~&X) zy-x1&rOj^47|~S9f#eZMc4R1hi>9l;Zp6zASLW+u!fP$eI|@X%XHY#cJ9Y8=%dJc2 zNZ=a^4NE%~RB}c&@2q?Bv6n9&V5R2fX0z3roESg1FvpPZn%Xsg`HE$kCWT99Us^BZ zQ=wX|4#i2FoUyhyM5;!cdWI;ey=~;?M6`~ zrA(4Uh&1DWW=sSrrDd6nF+`L~DXH*HC|dncapuhT;>Z`K83nQB6c*=J4vtn_$E}vD z8iCnnu3U_2pAQn$M)?zc<%gjangs(tXs*g z%?-w=6seYi5@s+WQ6gxiw3Jf7pjNx{5SLPAJ?uB25B#w4COLY$hGCRSB|=D&B$U!H z3K+9j>J0=!Kv1MWgi=~+ND_7W^x2iQ&1auFcl*f`v$I2jq!i;T%L`kZYdj`p*Vx+V zph;$?;O9QJYjz^HbfvLt#$Mn2`r?KDRxMZ$Hs0uS^DEYf2f|i?ZS{_BIAsg#`fPaa`olM zPd|I+;IVrPg>jj*az*pV$y-JE&&bhxCTHc`T)*$dapYDDQc98LQE4s2N`2XD^{8cR z_=+Hu%C$6!I0K8A%wigqMo=0E5|v%;h(bsqM5eeU$b()uGL+l>)3;MXE}p+wt(3P~ zz16iP%Pvr)DhY;$O0m>&5<59lDJ6xZ^g2R_!pJZT!!ST9gx%0Q(KM<+^UH!Ru3PVTL{88y~dcO4i%aqPBpFFZXv zHCxIRV{Rr%f=Dtd9d6s4y=oaV2d$>O>i)7VioqYd z9P>I61|A~e+|;1I_3$?VAQjSaoK~k3C!$oYwObv^X%vNHqa!Cz9usk>K^O8ltq_oA z`b$DkDW#Rp`ZhXCxKbibgb<990klI@ptI-Pj;EFoDW!CW90UMTiVWLiTp&sbAWf6R zv@AqaQW8qF0zi{9VmmegP6@?_B_LDHQb7R+6*xqaVbJxB^-`&X1h>hF zS}UnhW(_k00tiZz?Lxr~y_y@G;xh5o4IU1!4_Xj$hbjIBpy;(vyH}m1H&XBZsn2fH zB{jm}1jvR@A%!%B!v{`UCf&Tctn|&)6)?&OrHmVv<8Z?SiGHVF8y*TsssT)s130d2 zD?86B-n@0vW)k6Mj( zr`L-jfAyYwj~Dh=PM+LT%#Gb%;6p#@ zMM@Gc8Yvc6I-5sk_LuU;OP8MCz3Y&nnXOH3(I8Bv0>0g&i^5O|r76)j%zq9moC*)kc<#Oaeo z?cMjp`uw2}fAIWwo`|-#(oifw(R;Da85`eSZuLCygIlUr*T*PK+pAY&b85aGL}0ke zNfHU$k0(S#B$WIlIo{pYCN=W?waccAbRt!EWBtNQ5B=YN)LdEEyz~-L5*X!%_@VD>z|MVj3M~XKE9l3cI0Jy<>y&e)m7zM%~f8y!p)+#}zG##Iuv@Le| z;zfou@%_u^FI7hOU0O=~csUKD`|m&gjW7J&p#!tt=Cw()JXEPZdu{IceWhRj?Gvl3 zO)A*IVy1*rBvd4oSX#PTt`1L6&y0E_u;KQ}Cg-g$! ze*Bw9@BBHpGGWujB#rX?Epkr#L1Jm8NlBY920)iL)&am|SjbrfM5*j@6Gz8Kwpww$ zzS{0?9zL{>AyrZ*O7{X^C`txA8KpsLK+7@%-!lzEh}5=hohAge@3lE4prWwXO(RMY zbW9u>9cr{e6XNy#IEj@`9mm>MNer+-=4i}0&sjDnObcl;Zd+Eb-|u$%c_$Z#Awl8= zK4;7}9cJ^9qMOLnV659|`+@IA(Zc+-Fo=7eFSWem?uoZ1tGg=IH1=jDr&=rX-+K5< z2W~kTy16t>Uw7kIBcfOGh2T|7It@Ehb#}IVYta$B0YJK06_+12e9uQj#$rm@?Ck6d zFTALM#Bto~b@m-N82IVJ!V(gUqsZ&|4}arZ8uXsMvmgD)gWr1i5hUg*+*JuU&~&ph+Y>C>k_`q7W&3gw%X@J_qIV) zW7IKO38`&c&11J7+`oTX=*@ocJVR%*p#v`-9humFWdBBeVSTFm+@mk0rf+Clc*(81 zkF2kRm#!{UCe6j=){wzY>={Cn7!JK~?WJO|JX9Iq+G-ly4*iyCOJ-P1Qpa&@+v0{H zAk~CuCCT<&FTH)iK*mGfDH{=zc{4CdRW`XigHcKgEjVX*Q<-)3&6R6Q9x8F`t%p|D z>bIS`HFtS_ajBlfN~9u91?NN)pp;0hG(o}`Xdn!2E@t++SRhE)W-qo!ifz9un>`GA z{mxRoe&wC-|F!r3>?fk;=IE#lDo;&ZZHS?!o}X+tj3&(<@Y(#p1?eXFGL| z_!5}X%#sOVh^Un&jAS;OZ*Z}^1rdfV(P=%oxhTTaWQ4{(v{tvC`KI6VXe_1BF;z@} zt-&;TySc7QeDD5)Qxh|VLZvp`9~&M%vS%O4G+%JW$7>=V-4P^^|(y*Nk{#*JPtu&F7c2sBSLVV3pGQ%?&oh|=_(?|<*q zZkoVjosVtyr;FkX;5{`$-NsZE4%i=C;sIv zpa1OBfA_Z+-}S)cZ~XQVA*0$9tBr?it=z-k{MLW>-~Wpdo^dRt|#kjo3pp<86BPc7r*@9{=+}~ z&8hvnRu`^$x*0a=1ao`$9$8(x_S|>=cH-2}jF0Yh=tf7h-;9j?XtCVxxsL5x+GcvB zl(S63v~zvmmr98=j=gw&d2^-FlUg~B+wJrX%KV<+@%xcXhK9?UXelK_twcgNZ#3FU zVX;&Lt&~bFD`%Q?cxW{8gXQ`9`dXu(iZqoXBBDdvoxbP$MK|ZVImXF_1&tG}Dq2SS&T0Z6sjX=E&HXQnXwiN>jxR zzGu(ul`EHnz(02EXt|ub?bPjFKi0Ty6{zvL+5riGM$iUl6tUH6xsJm)&l)mFP$@+T zRojCRlu`r<*%ta62H%1D0HC$fdO&nel7ulv2mv5kOT#b#(6%j+iX@fUq0ZLgN~uID zB!qKgyVi&rC1S`W4ODS*_MW+O-+A)O520O|7@w||Ye+O_+7F{g9zXxcBae1E9k)>U z&ENQq2kv{vGiP4DSqcCBfBQeCsS^{ag(OOZLVfUKzm$z_Mg&4g6edzA%eIBg7={|Q zE%=nyB$H`@)_QyTF2JDa1h1|XeBapS!hQeEUuTQKJ4$O!G7FUKTfmOnIBpN20wft4 zLaiWMif0$8R$5A7n#{I~rfHg%(`ha~`dEE@{KOBM(C-%r8W4p{V3lvvIX-P!cBxzqgK%qg6A3|NmQ}UPvYj_TG1Rov zt=IWR&N%Ooy_P*e2&dF?jhRL_Fvw7SrRjN3j#dwij@{BvJlR9Xi>KY8YmypZ=7Hrj zZ>(*Mj+IPDaIVW>2q8;m;qtW=M&Y(SBNVjKGENmiGwk)8qDctf$vh5Vrrs&v?z~1s zz0GpW9QHFfnk9r}HY|vQ5-G$F2#O+sq$2y0^;4_DmlhA3l8H#mk$~*K|Kg2nCM3QXU;S?geCG zaz>Vi8jVGR7u?E_RV^FLF6GACV*${$O(`FyMEx3)I7R<2o0N-)+pR|%npS1?Nzja120DXr3!nbuD-djO?E zEoZr?5kVtJA;NvLyNXUhry4Z$qsS~4QXz}g8sW?-mLg9gfJ$U@qfsfB@@B3u>?kF@ zUOzL|A08UsT;CcU;gBOrD91D{ZX1mEdmY!#8%X!h?r&{$$A-tb>H2Bxg+0-erfKEN z<$W`=Im<2?ZlZKyVsvYHrE~WAO0C#MB~lh7VW-_}Y&Ik()mm-1Qe0Y`k0K92Xe}tC zS1!-hMyo;4Y_&I}6pS#?I*G!3J{S0X&M78}peB?KR9{*vPFUzl)jLic`{O_S!w-GvXAT}b zxO(Zr`0)6{k3A{0?0Nl1pM3nM-*E>4^tv1U_TuONzbjIS-p1BCAEk0Kq)=X$-Mz|F?;+P;JP-kPkM zPVW5td{Bw1M^4;!?Cuv|`0mi~aK2QI5x54bsR9Lfy=o5s1js=kI50#8L_n=HD9D&r z0}7IcZ7ECkkwGQvM9SQoQ`mx{}Ae~oqxn5bPzwz7MbU4>&G#KSTC?!CI&gJZU z(ItdvAcQdjh7WGEJlkH`lub$I0dL6jh=nXp)&n3``fbCWuN(07?j2 zmV=qZ4gs|$Iy2P(RGCbUq*`Vtt_F<&asXu|AyjKc2+7b<#swNU8WTk1lu}A5p;RWJ z27ql4#W~knBL$>f0Ygw4QVj$o1>}Ng!!;}@?Yi~;()f`xPd)awz$kFru|YnF8bh+05+zuRQt}Z@c>g;^ujJNzH*G=R^n<1hL-_ z0gP_<{PdogLa}i9$|aG6w&gzi%nM2@snq6H!-dp?6e=vNeyvqxK>_hZCh2xGU7UH^uI-xDX{;K(=Lt@@)E+YQhd=PP zi+w(~xLD$8HJ3lQTY4gxJvesZ>{*uLM!TJN?4e?5-^`xzN>#`RP%vg1rppM8g#rZE zEihz2GLuHk6fA=^ic$cuV_`B-1#HWW5HVxf$;_Ey@Fr;Wt2bqP59PQX=5i~hXy#Wg zFTJCt#$c&_wPzLg&Wuh}hDYM0J#lc)md9vgRe9l7sCBT_^Ph3=zh~1m_vZJ{oS0V8 z6U&>O2uy=$UuI<>O_6|Bj1u(|)w?E=BtWGmS}CefL>l{&r@rrpfmDnDO%+CjvBa{= z8%f8bTr4%`fgI1an&;ye? zr3b?>GD>!4!T>sx(xDzyNdH;tj^-B@f*?3>;6T6MkCUX|@6XOmuP$F<4%t6*`>iMM zU9LAM0|Dm!?|t9M_|RuQ{i*rO7rF9u+5v)zlIPA}EO1+Db8)rvum0Un&+h3ZI-T8P zAJ}VC*3uf2u+6kl8w!sfch8?|jZO_e^w8(-xby7~e(1q}eC%<<>^}9>6SI?JKmQ9q z_nA-sCta|q34H`Se9jWdhJ~Y57b=y z;AqXvb$|W#+<$pN(0zxBmEud!KYzKgK5_h~-;9j?Xt8J1H7(os!!!|Fu~=AZB0-De z#ORPQWX~@wXa@UcMsuzWpg3cVMyD4gwUSeI3m{Wu6c7oeny@%duPt4yl*%HFgme`U zMp0`$IXyl#J^AE!pYdb0wNg*gMIj^rq#~`B$`<2|%?&$eQ%17+6&XQ7YdtQF?({u3=V}d!f{yParA{eV zG7E26R?Aj#&#pZ*kxSPuA2@Jm@!DmB5Z5eZ4-~DbM)lgu?hPn**I(duCDQ8_*YWzS zm>YhC>xkx!k;(ThzyGkn=B;7bIfO*rUQBecT459jr-&v&hJ+%eKnQNDcce^|WJ#z~ zp|xg+5;fI&$4y;l@*W{X24J!&u|(@av6!_n;RYz1>23)jN`Y1&wcM$5D;%IKAtWJ0 zN+sp>j?j*gXh!8XO>_G{Mn#=!8lG40CZNk1%gPFCO4j|p6`uKO(g)x zP^Rj_%V##5o4@%#{AOcgvt8 z#;G2dQVin8qTu!huP02>2@^z8CJ8Fg1Oy0`r0IYC`_G*}clH;5{+I5)Z(?nE?z0url%@nkl}6tqUrs6j}9EA^#9ZuG*1=l4y#|7ImT(V&G)lN71> z?DH>r{V4C|XQroxmu|FIb*j=>sW`H1XLxwHQmLFieOkqOba=d2tR<<6!g$xz?$wn# z5}hProWy>dTE=)71UYl0oI5}j1%>t1l~&tNMR0NMg|*E~NP~&-L-SX!*)|EomXmiN z@aNAitK29lPPm2P)8Bid;#hts==Azw5G6jF+OsR4<06Sh+r0pWS6Au;sS*T%$086qr3U2;jvP34= zd+x<@ZJe8LKiez1d#h&842BBKW z!7lyeB9W*8rIw&I0!W2XoTOSOBH<=A2v`)#4tx8p6X!#rC=O4I>CxQS=u|#e^eg`O z(8QsAheetWRm#J|m42^dT4t1(lu;8%BqB)^pxQlIzVGeFC{yoy?>kQ%KSmIeB!2v{ z?;hAS7N_J(4?h{jW}@`;$mof?-@a@2EHSK3V{6y$-A8UcnRiRY(#XWvZk2|^<)K2Z zK)IEP=Ol=md%FGz5%!v`t+k-veg5>b>uYkVFzNsRAOJ~3K~$T)z8A;oEtBPA?>PL# znX`G<9UUHx`Y}-C7Axh7e40P^%nPpVaO9kuQl$Xe;+92althHnIMIbt$?pUz#zZAD zma&WrZox7wD=?2AI_6kTAHAGo*(UAxx#1mZRm7 z(Y1{_n$EG~Cx(WHo6TmU*>p+;-}ig{ZW=^ss(_;9I;Gl}=X+9%JMO&A>vcQL&OBQo zT#rtT@n#cbLKq9ez~aPUT%y*XwkJXi*wSh+5uPBSWYAes0NKO$pJnf;QmvKBYHn@; z3A(N;q*_{9GK}JbKl6*tX5X?!yHT&NYv2xMfWqGdc%9a)-R zY5A#?>{Fk8?qC0#Lk5=wwUj9*A*aQdBuW!T#C;EpGB%#emuF^XDz)0|%)aV}C%*RZ z*BYB^fAv?Nd(XSy^@&e>;?tk`ulL<`_t_WEUY)-RobKMYf9}fFtMiKo-gQ5%uSB5- zN>OImxk3VRb>*6Ni(hz={o);Cs~ert)Zw>JPd)kQciwhaZSMRF^(X!ee(Mk4jHLYt z(cEk(z?_q}95?8639>>ihlmTyjc&JtS_Z*d3Y;0tG_hRBRf>g?q0vgUxVE_(q>*i! z*&=}v5~OjjA9{hXOk*nNFrtJ^Q$g0&HXDs*#|vsBQ%LoAG4EJ*zu#-MTBsmzJHw;H zK^%l>Ae2azBw8UN=iGJOMx&v%W`uCc{Jys=u8j_lBvIzzM! z=COwt=dbKLbQpn40-7Mv_}YHXKS{CM@#X@e@paaDuMsJ|a;fVm*y5Nx3>RC zl^~8HN)SO92$2$m*G1z$P9X3>=Ti~Dtmme-O|G@py4`M0jE^ILM#2d_-<|)`BVT>^ zs}KAA7BQ`JFZ^+}-Fe{SKdZP68fiAkDVy#EM62uThJg_22RK{s`tYLb2NbSf5wDgf z>Fv=;p+Tu)1O+o<414VXInO- zB=A$E5ELVvZf$KvQ8Y9(bn4Wp)%xn@>W0H}sgOb6=Y&|?)F68OM%UZQ4Bvhn}TaAb*yW$+uY@@Xb_uT$7Ub5iH7cA<;aZsF|(Kt16WbcK)dx&vc znT0EB_0acM8a<70X=$@kFput^roaqjfSNESltiSQQbqwZDkO$!Mo}b%P?_D)_L0Kv zuHViV-{!asdP+*EZGoQ>LS&ar){nhuxds4$%~nV#4<#Td##60yEDY4zK*O;3!~yfj z+pN)voVRlH{Xg}~wiWgJ{c?UpfseKLw!8XAmQwbE#!63viX z7PnoZB}afTYFt@#0SH4t;DiwXWf)nVI~#I^*<>efXw&dSQt$SZ6r%18m)x;xi4g*n z-hJ;+0b`fXo;h{w`25n!`o`M+{d=ySJv+O5+A=s$q@WRL6p8OWe`%;Tx_|fNZFlUk zo$|#i^Upl{MBw#6#B|-?++5vv$5F#{7B+l|47JwO1np%`B$U!5Nwik{rkVu)uwgTz zDWO_ZU<`=Xnh-&iqKpvE4V{d-^q!Mr4bN-zG!jZxm&FZ;DWqN+wngar-76wZy{1%t z6QYPPjZ)#DkVfvjZQs$uv*YF5hd=uM(omJ5Lx2%f7I)wE?hn5IUH30uy<8hECenKB z=`%*^msHz`t-NY!>>BB2fv06#v1G-iy%bW8eQs#NNY=FwO1?>MqCa^2coWajM^S!+X4!hLg zTx*%2#e*=eudHqK`)%Lvc3K~J-}^>KhM#}_`BuAKC=`+;ZZ;ZgD_acNP^}hAO&$Bx zJMJzQ@+&I~J-@4BICS*j>BpZk3^p}09*D@V_oTtnSas5%RLBudAsg?306L?1L)IqB z{Am$%_V}ih8K!~Q`7x9Hrl2D!)ym4s=;)|rS^a+BG|hYNx%=vbKwhRCI$?bbSH!?smBbYS+0$G%$oz%MM4hP18Kl}6*KM*ZyEHQ(!-wlO|6zI!&Wq)GHnyJ0;L1rk7bgIRDzURDm}RWwpuMIrR%yxfs7LZXc)#{NoZ|$33FHfot^}wEFo1#M^Q#J_H+G8tDK^@T4VhPcF#C7AF>$>Je;o_$EEfNX zoyQxtxgIwHoLBz!*WG@wR|r{Q@3qDeH@By>v3j-L-U1Pct)<0tR~|imx-@g>10Q^_ zS}r3JN)Z8pWV#Zjlw_OLcMghDYI{sAFh+LX%ocN;^Bt;Kw%TKian1(aC#9rRh>*rn-|I8V$HvCu zIHr_<21-y0K?rin%p5y@+u;+p|9gUj08vU)!h{fpVJOgP904IWS0pe%h)6U0eSn=7 z%HY&(G#X>I;eoBVg8nrB$glpw9(VScNB;4F_q|Ufaqqd)FMal*TR#3#W#y^#rp3d>*eAAcw$L$^fl;pL@0lDXosjiy$I-L9Nd*3;~q++SS za_01)No6lvDm?a2{*ht%<&E0(-to=aBBfMl85xOS83Bw^!fm0U*=(Uy5|!mRQc7cV z;<{%HXbl80o6RO$Ftcm*c)RqQ1xU$tPu3H#yQlcR7{@za5sj%a7B{I}R2sKN$My}k z9nR>?%zkuO7cL&US4MsJ{>MMWlxvY(A)9G5HgowA$8#v*J%d zwwH6gR6iW1h9phO0tiwQsNnkItx}*;gMf1jEDAP910WP8Bwj>Bl9(a_uK(1#v;_K8Hb>jMiXtMP>z*V z0$#gx@yeCg=Euqp-~UL#;g3J^Fh}S#8=LDZ{XzGYbLVTD89zn6gq#=TVMFKC#T{dkkf@)H5x57ym`#$aC3RF7%lmlvCtt}TVB?v0FuCa zc_+dAAD}ve*s&dWwIHiB&CFM;(9g=jcr+j zem9#>b?X)Z&4}4pTTZ33g?zTQwXn3XQYjQg6j7vuZd5Lg86gya=Vpi@&8_;)jSZ#Y z^4ZIiGgE`WcT?$hdywYj@}0pu{&6wbEb! zj79@!6e0n$v&}?A0Fvw-GwIA=I8f?`<&M53)6u017fzfwUa3^#Sh%+3dS1O&ySaG% z`Db4UdVaf83kE~2fZN6U-tnkW?A2Gk*J`fsog3e`?}$`>5QM91tK~{*@ARIZQWjxE1`%hHb7HjCN>Lg=@ZjwBYWe!D>R^9sO zhn~E2)BDEi>ZDHP)^6Ooc>S*X-f{5QiE}T0@1lL~t?1YfRzVODLbW!Paz$w+MAY}& z?RKrxZj4ka`}Z9f9Vra6LP#T}YP4El7!XQrZ{P>5c5m-q3Lv#HfHa%UpFDaP4A`y{ z$HI0TZIsf?_r1ImJWZ< za}to}_L=x^e~$fqIMMFF@Spk#JO93k$oG1g?|<-Hs^ER)d(U6EyyA^bP874}&YZcq zxHVX)O-xR|{r>x2e(6O<@yL-QV^cGPvD?R4L>vx>&prSA+`fZK>tti36U`7{avo=l zMNx!^3FkAp3XD>v4NXR%H%MC&I0$z6ax|d>?Or(C6_F#N5CRifIoUy_b`JDAQwO~* z!%!+#LI%UZ`Lk!{=MR($rS-KHZKP4aIhP`)go0MwVj2Wv91uCyz~ZsX#(pdN4htGu|^w| zpfqYDIDX~&x6Ut|{YUqH&}ggQ=w>n*JDZuAoZT}u(^+4FZ0_tI{^foD{J$KI=FN_8 z`wkwcwT?yq?1dNZzUw|>I2v)+k;h)Uuy&^!?${`mA%GTlhJ&b9ZOia{yEycs>wY3@RSqGYp!(N=dcWiw3EZ1yoJr)a>k@XP$j7ov{-q z4x2bJghZ=cCN(oVRb5{ZC^eWciU5%yHCjt8l+w~*7=?BiCVj)d1?%nHFbQb5dx4WX zGc^U7&VH>(uEi>hjX9-ba4w?b)m?!)&m}VpO9>sl-U;v^z8hXYTiCfdExn z67(`@yWj6}4g?5NO9T47&XM`4@wr^kHIt=Ef4Fshg~iKPht;joefvgd4`X(O`Z23_ zEh!X16k4K202`S^Ly#CST8Tuj7+Xlo9t?)dwKZ^UW~UfN6B83$1(Dxxw_DUo5!bRD zXL)5sE-X|xRzr;so;vZ7_q^-k%YUPkR9Z`o)A{^=^NT;X)Na3U_T0+St(UKzl|gJI zJAUj)sXRI}IXycy<)u>p@W+`=Vi85qaEfR^ zGb18J3=jkhku!7OsR^F7uk=k63kPDZOceO;kTXLV1qD(G9fU#P$H8DAqc{$P6bjG+ zLl6l;JvKImsHF)}#U^Hy5^Vq}1*4=P3~gm7XO2W&93Q=P=FHjW&qxtAy5UB%yZ3?eDNoi|l5NH7+$F@`b(s>5WPYTmHI@n^(_?$$x9hayE-hX^ zbmUlNd{U#@*jOu;N1_v=zPWa;@w|wQ??-l|SL5}usmXUe^7t?ejii&adxF@{WHZ@p zo@qFF@JK9$0kCX~QYw`?F~83Uk#pJOZ$GJ&%49R5+grSJohu;R5fB+lLa80cA%toq z-A;!QD~gqLIAc_60AoNUq3;L)1gX{vff%i|QHhjM#Ia>rKm7dvmP|+QeE6ZEKOFSB zrBZn?7*sbmHn*!+uU%VRU5$sKow79Ms9l^sc>LOGpGg`FQb@St$*CFdm6u*n1Z&-z zjn1+8y=TrmlTS}=tqr$UywTaV?P|`LG6RjqXbVv>hPGWTl<##MzOb}hnwrXat~TIV z8GqQEnwo5O>#w}}qKM_c_>JHA-QW40>B-6a?t8G+tOY`JIvqds_s&kQZ*B>V#*lt5 zqE!C%=f0FL6w29Rb$#R0fBt7PQ~OSzyeE$2p4okw%zs9%3{uKC8iaAs>$Uu#H|Td5 z5qswL{LIh(!m*<#s9~Ec8-MnNFK^XaDJ$c7Y3f>%3TAW1=&(Oz8ngkamBp?4diDJI zE5%|Zm&>G6Je5vU&JZb~j4?te@rT`vla>-Xy}kiVdA0^sZPxv5ITUfOkSEM&A*5Cr zH_ZsoXA0Z(x|hi)g`i=2d~$Aj`jh|aH_yEK$}`V?cX?^KRom2HT+id&a$VQvHe(hc zoKkKyAW3Lw2wD?DA^Oo7?4V7@#>U{H*=jY4;2xZwe)&psa%SJ!+QR+norsj0gzNgB z`aa)p-j)0b_7~>?Cwimf9@Lrs5jQ%clh|eN4^or(#i1f z{om?u!$^0acx(OR4<8Cl-$~E*y^?S{8Os_ODK(ngpZ)BoONCq}Wfw2nEmp zs5KBIlwd+{R#G9+w`qO}gH9@yEW*v}d9qST1)L{-(Qy=MskBzZVOJ~3D77t%P)kYU zx^CqAw#B6sj4`7<#+laIwz*K!vMePHV~iP1C?S;GSyL}0+86_g)`&0z1`NHe+CqTg z&@YZv6amx_5nwW;6a!ac#_fb*wv?AcEFCx{1b*e;e(Is0{&4Ep0Y#_}lo~)#2{yHh zKq7hbXmq=WZ=zsn{l=jj0rf6S^v03t`<|tMDG>r#!h$a@{>{r5p8GEz`e{$O)F!R& zW+tCTPL+|ppyMKqGR3L8PF(uEKcD`UpH!7H=axYQ2!voP;#*5s%9VWJhY`jUiOcV# z(6LY`NF^Herfu1QuN>QpB7bDGG&i?*dV0bS2DZ%!VT9;nv6u|oj^m(1xXroCdVa6t z_p-Lts8tOJq_H-E@2hDi*Bf?A>HQ$ytt9&S&;amR46I#xy0ST*y>P>9I;)4x4G$A&g3?7`4ElQd-19 zYJ<#5lywQ|ATi{GoebsIFU=caRsFhS{!Zl4>ucRNk4$%}9=iYC{Z9JGK^6^kqlb>g zy;3fpu}2E&vC;@<7H~8)XB15~1IR3cgS?v^blbUn2GFJ4%4JgJtedv8)2EKkO&qZc z`C;Ur>2*ZlFJFK8=J{^`D?!x03!mh((?qhOm!+=DDW{HWrBWGW9FcQ=dxxSa8EDmB z9&Rlzo>^GPA3T~ZjpaSAl+qf3dugVPHqoFD1|K}OcOqlIcGLUJcV2$t-a})>^i|Hx zP#H7|fFTIKabPra_=E3>#rx`=&Y26ZZEbGUYa6u)hJU-v^$Bpiky3=szY!=HR^aB>1?LawJpnY%wT+WZzw~FvD5%@ z%xxa}{U2lZ0DvJSlxU*}8iEEuYcNWRTD_``9uE8cUM~znAp{{rh*&9!h)8)5NlJh! zUp(2AexnP}g=cBSjfU*>ozOD`ZmnSjKxM_A|z{(oThpPwaX5g%?0m z8VpN>9+=;c#!7n`rKFeghJHtDNwh|!CXyIS$91SeqYYKsA|OEZd%aGx7YWsmltC+% zF;2>k!^krh!~mQPhau+{;mWp=0P%$!41x?#?`#PTBzktEfdDZ(;dPKW&>DbVzsD`h z{Lm3xwcYsZAWPb?eca@scFi3-9cINQm zlMA;NI=wDsq}S_ZY}`LTXHiOIPsFJ|`qYho`CI!$Sf^m5=4flfs1dddslsliU>Azz zE7xy?k;=MIuWoy;Q{C$Cou8hZoqpk!m#-~c_+NkPfBIMd^S}O`PyY6~*UlCT`PsR- z6Q@p>vu-}^WlH0hZY&K$;SYL2EP%1~jZLLgHkSjS3)e4y{-sT|EC>7zLDKWu$c1$wPPFeb3zdEO*>aFL>_xb4xdthTVbGJXaj`2cp$z8-|LQ zV#*oK8ez(79Z9h{pP4*Cz?|8^DVC{*os zUn`SJIor*uHBugSx~U%hd))v9Jk$AM~igScWxx&WBKUa+%--#N%9B0_ESj?M6n zF5lcnZ3e-RQOYPPDG>~zG>Bscnp50Z->}?tp)xL!as&zzv`mB|hESyq?tHcbA{r?v zCI|^6PEkm~fY!=rr6}Q2O3StlBz9ni5~AO1BWA$tXm4&0N(K=@D@_oT7DyqEVoDgr zJIPtMviXR_wN|Hi;O>w8)W=uX77LTpGnI7I8{Bj1Xr(ebIW{38*{E&jb7`AX70LSM zcDvbPmL+1L!DujuNGLIY$)ExN31kFd68aD#0Yj8ANLg}12SiYbrV|KZyS~GTmqU^v zZ4i-J3@Ly{Mi~GwN|K={j$;B8G!RV8z>yIMqL5J3MjNduC<7Wm8ySI&w3J~SQ%*pc zIF5vtRHHH)q(DM7AfZHRmFSu%Biif;Gw7WbdTC8e!hk}O*whnHS}RJp(SRBUtu6sc z4RTF8vB+r9A!ID8m$Mhvmyf0oW>ci^cPoeY-#wB!^Odj7-dNoK?#G1Zg$!&Bh*X0y zs4=+#c4GUG5DKvKxn|ycM;onn$yYnZ73K}hwwMhZeG4|(+It6#f# z<)x3_`$Qb6OxB5`xE}{xsT8-2HtlY|tWkwg=E%I?9Japj(#R*?*A9Xh!dQnX$~Y&D z#=xj}*p2)_m!PsJ1-|D_HGFAteRl86;UmY9+O=B4ak_6g;+b>hiP8B(ldqmRyS}tCJvD+LUB@Zp^WAQ_V`~HPt&7CFV`D@eg0kx-RB2881^P=1b*bu25jiu`EK-FyLC7UcW!| z>*-uYfgwaAjX5XrF!s_p-yd2w3wYx3_TfR<&A-M9dfmFa%L+B?$v!9LC0G_nzLf|ICXo z9h@B-FXe<#77~k4eZXA3zsfb2Tfm0NhwbN03ZNKL_t(V{o%kEqR=7;8bA>%=`#|-ITu1` zB`wRkgAMDWd%byB|tMgI(2mJ z*xUr*z_G1SkEZ?F!V6#9bL`%O#||y3aBGmaCC#wG)pM`T9z3M{Zj8Q0kNybPwSQ+3 zgpo>VFc^ekfW{~MC77OF0vR2ycIP-wkI#g0gBLdOw4r{IUW}{(19X+%^ z=K8^_8BV>4&6G|{Mc+s%F$D983RqT@QlVW6biN$=jVti#)&v{K64CVCJW$Kr?Q z|Gy>EQK#FrZKu=e3MnchBbH@<^Q)hpo;=(QN09WG9*jD<#cDqmos47Fmd_HVCPwaF zTwRvYkWz{iV-aUZvaN1^|J;eSmFtf_`kq>?_SG-0eDr5CDi{hQbc|1Z>Bc+WJ`bkf z>AJbB)&eKl|_h>)-y(fAgn*`hPw3 zwXbeg>t4zms}%3K`>t$h^uS?n;0Nn#tF2ZGfRsy>YPH&Kw7actwvheCQ(wGx6&=(qP%gSdf zDbJ-0!Z1)uZEbG34lCqS$@VUrPNf(xsqA9PN&=N_x#~tFch(*NP{5yk#&_K zPM1c++<~Cke)YoHZ=QeY-V+a+HY-m|pE>*TJKy(yqv_vy+wI^x#y|pA5EO|G0~i8? z>hI^VC1*YGgW^^ZNmaN!+jB z@ZN#Dc2Z~0o^@S!de3aX-*;V?bKdQC^SRvi=H}4vZEtTHW9s$R)YPoS?wFAJo_Brt z`i)ytN5=Q;neT4hoREuTh=sZPb*B7Je&yGO{lF#a*=N7?jctp7%a3wC~3~ zH021Ll1gAKc`2??7;YlQ$tX#&V7qm-H5C3j-X4V))`zLb)4>vk)Q*|F_T z*j$=W0*NY#CGZ8M)UvGG^!+G`c75tlDQR}yiW60aFr-fa(wmKA z5!@BGCEQYTTi}%ZKDXQWMoh`saQ5rAP`Vq=*OK_Z*+V-=waG*MrS9Gl0ne0xbRZ` z=oFL-`-yQKT_|VvOqPp1*@>g}q|V#KEv3u(T&lVmM6rMQ>eVCDBPolbkbx1yVSjnO z(HX?3WZK~wg1LMqQz>})JQ&I-H^vA9gisL+A*9k84D4=fcl<_@VAupBg53-JreSHP zb|xZY450aYxxznCJ@NR5JlAvG6z4Vo5+qtjN=c!0s3Y65k?AwfeDSUa-tCU;(F$BD ziJ*>UhY~pV`mOCuu8;zKBIjINy1ce@V}ZI}X=)JYg`2nL4jt1Lrpxm^I~7!K+*o@p zn_-7$(rfj4Sij!guC?3knUV`&$v76ugc95RAX_R3KM00lzF5f>^AEk_-tE=Z>iYWh z_!wnOMzPU!d3EuNU-;6`KKW<}X06c~E05TWx0;<-Z`4MQdJdz2jB#*mi&7pdO;I{r zmQq%^Fgr6oT`H7^!-0%+quvq95F@GCiEtw(1VS05NQlxJ0SW!F9%K|ov0#)U0wqWY zP>2b|{YR$1{_1K~86`!^Vjwi(B<)e@hcO~aWu;U>pmS+U%h00KLSs3`u`%N@VMx&t zmWz=hLTGL)+tL=dEM}C5(12E&(jO3fx<1;9 zi?ps!c{-vbrGo1Dn@{Ii%2ByWrZOd?zdIfNM^?6N5kiCz$vB|3GJuTG`91RmJG*aU z{^8T79cFXJP^(y~we9Agacer0dE5N#mB@#b+wTrM&ucUC&9D4Nrup&1bH`5|K$mWA zY`ys0bMJls`@Z+|)0S<`&FxLQ&fx?5_Ro($_tG=9MoTMGE|#Bs{NBaIYbTB$CPs3g zOG~RW6ElrQi&K6Cr+GbwmZ+f@M5i6`{|GTKWf zs?F`d5891OMo7!92<5k1M$6%Pb^YxRy?teMZSTzfcDJ+d@cv>cH8DN&`1^n6#?^1H ztzDj(48N<;o)?mC=e&fzk%iH0!ltzj^Ym4+}77FJI2*%NzaW zjq1{`|Fd8F2wO*?cLYc)l zZtvbjL9 z=RWtj@$vB>2o4`UTrQU#*X<97y>54PWrZ<5IyNyeIoYUg->HV%x!maoA7k9&5cbw? zq~+lGYv0>*=zit6!(MOU;+fg8a(!!Sv{LH#dqaO{P+KX_4^$XvLMQ+O5QwO?N-XS> z?ewkzoz`0WevnF~cMP-uV0U`a#wevc*Nx*C5v5X`F{yR{oaCGA3`p7-t#_$(kXYFn zV+f@d=LSvUPP?n*L4X~((rpP-a$Yn-gEDa(E3K3wJO2RyU;yY2S_fuVD3weRK>zM} z{0A(v^t=H~KuBVUK@u7F+Va*nUp%|8SsjMMjrG;I)B5lJhkxl+O4V@7XpCY%NGl3*x+L}e+ec4s54BmluA zNp_c|nKXwGy1N40abqXD#L?YhDUsnJ0E$>@qY2U#z52&r{)@7m{pph*GKLIP-(g(D zl2GcVyd(lvD+94Gv604rGJTsAAHJ{i>}$6^_5aNL(+^sYHn*8 zqEWA0+_+;6HwFMYo%Y3x7jwDX%8hGD2= zWRSSo%*yggeY0A~77!hq7bvlWjD_keNEHi3hNkPU#=`g9T)WlmM~!B$$7yA>IM%4w z2}>KD>5F!weua5f#0J#d?60qM*S0epweVj(cPUfIjgF55!e8F3X=IVqHn%0Rh}jKa z*Vk)yvokw2i%J5bA}sN*PeMnMIOW8EfRKdc0=s-V1BeNON-L#r>jSlhH!K>o(aG-n z4pymDVvGerpp-HI2n3m7j8a25+OZH`D*NDL@A}4(3 zyS-MaFgCX5kfYmnx)j@^ZGlbgmB;oy_4M~fC&%gRzJ^c%udumC?%Pkw4!z66eS4;~ z!O#x~a-u`!w=5EO+qGu1F}?4&-`-kU-5NP^bY`q149w)yHfJIV`mH`;_Qgw={_@lR z;UgdTP@$0R2g9oiYj@4h3k?H>)!2IKO6$qv6T~RbbrFd{po}?|ji5ysFs0L()S;Pi z1+cidw7s?Y#ubCvh40Rv~?mDTy;?Og8ur^8YwI>~C}Tz|1K4P^ ziIRXI)6+)|AGRnEAe31PwT32)F~{g&W^(N4!6R4H<$ONZ?sUqf!omG> zubjQ8q;wpo-Rta~-@93_Yo)mBZEZDzVXxa6N~Hro>b5#x|H{`bHO%J=?N+nbYZ(J^ zOhC)Tn^qejxZ`U|DS6#P3U=IJ4ctx{_@U}8nT}q3@ulhM>1Lyai2eTH_kZvArzd7Z zObun2C2(u`x>k{k(hru1?s2#5rVByP_eIq0)HO=manfE&O1ZYaHoJG`$js?Rw;>5V za{6%Vb7N~vR)~0OYwP;O*BV=E|M^Tuzw^6)3SyXI2Em-UxWZG}Vm8Aa422=YWK%Sq zv#B6)Y$8K?p$uXn;|NJi33D8lNF68|t-%9j09j-|V zSVq`LjIpe2HoLgGdG+Q}E}bjn3dK@xWo4mI%-RlHUS539d)`|tlyBX*MZl_68xKEz z;78L{1E|qxB)03yNZfVg*j>j@5rG0wYSpY)Q!@qg1}CmJKGgsyG_7viNqgPF;QG>% z;3S>RgHX#GTg5^lIVWnPlL<*{ZCN(AoQEHNq<#FjQ8JZIzxd+wLdt#n4<0*l*VOc$ zmtT6(@3*@~7qjU~sW9la8MAaW5F&0hb+J@Qr89(CrE)p6{vs$gXo+p$XpPcya zv)?^+^2DpJyi~|#Y(_e*x;9_{9mfUGlv}n9S{q6!L86ToLJ&$n{_&4rzka=5uP-hx zZf$MFLL5GF_~wnP*RNjNw{QPoIFxsE(fj&r=4F+j~W+dlwr3fWzCs)Y;0w8LWm=sH;lb@(` zlCENm20%hkYhyrZ9mla&3K1D+NPrT;IY$J`;#zBNaiw(vz5Hou?{CqNpFaR1+d~q``!7z-=qx zHTHZz%Pc(zv_(ZEh?kC-Ret1==-HQV{kuQe|LZ?*+)O7FS!A3sf|{UZ+l-(AxMR~1 zpf-SDh!CRHYV~?OvkQy8A-tG#&Wtfg01>oN#(?cQ%(2rNgdb$m>ER%XqnJ{rl(INu zl+>HGe7YP((CKwK4@4{mT@A7fa@@r8r92fvF~Z|MsK^mUY}9LqX2($4X)JE8)O4(5 zMATMr@x}&fOu)`Y(kQxAl5OEwQ*M;nA^8mnL64FSF-XXXo zcjD`9KomkGS2GO5UEbZDH?IrAz_KjL8SL2q%2-CjKr+f1wGfGvx=`Nx-uHaq(|`F# zdk@@u;@(HCRF+Vi5IqcIO;{$K?+?1gy{E%&qu1O7-JPgR&7?+nG53j|`QTGu`_848 z&physx6!mSweO%!b=J+ay1ldYD8=E*YZu@4;Dc^%Bt3b=h;VYRo{R>v-^>;&shLB@ z$=Mh)es*WgosrAnL36kWPrj6cpTQx|GQ3k-6#BUw%fJFK&nT~RW zQY!0a(z(H4aO38Jmrk#5)I2>9g7mxm!0d?|SDx+E&gyszv>=qEa&Z_2olaB6L1kj3 zTrM>mtyZVwx*m7!K}hE2PH$E>M#m=#sZ;Tw)2@F9WyqNwV=fxpJ3e)2U_xVgBO|l9 zROV{^oRS)hky@NP|JuI8heKtEp_DO1?t0XA;oIMSYHt3($1_1fka zKKJ=sH*XrPl-B87=H#i9gD7k^>WK8n;lm<|*49?vijMtYWjmhbx>;KXer!A0NR!Rl zhEk|C5Bxxj!PrPHpC8%St_wg)8Ar^xZa$yi+TN6k2$2UQQVXWdXtBI^Vgvv^*B%Z! zm}1RFOJ;LGC@|LQbj?P!--~mFvM|Pv1t&H|#t2bD_PgD%XTph51^~c}k_MvTFid5# z%<(M7QjFhw_^6l4L{Z#ocBaQh3fYv1#PZ6D5Q^H4LWsg}d&|$~vhR4{{x5y`^JmYz z_TG2@L~Xmth}Y@#mHbi03lI%j5t7bk;~>tv*|A)KN?Z%;w&k?zt(jS!m?pfj(Cow= zf-y>i2DBV&ZEbm@Ry}g;BpPyP{=kiumC2E!=cTlPH$uVLY<6pFQycTbi!ULVU;L$C zJoD<=?OMZfQo~-STq?N}Bcr84FzjEudUa)axim6%?C^m&@awI16h*d|-q_l{@BaH| zW@m2Qx>c>$W@ct=*E#d*Ya?T$<#Gi9IVIh8b9HUCSSqzT-F%^hl)I^PK9`rV%x1Hh zOs3Ij+_-V$9q)KY5Cr@8@2}NrzVA;>O}UB^I!IW+jeDSq_bVUQ|*4w z!w+&NgMf_c{Rid*<(^W?AZ7Z22kw@HApk0$r9I(-kb6jdH&MP>ag_W$9~RGM`_Ut1EbWSvyN%EuY8sn?*y#_-Vtd; z5D!H-%n1nul^>aO24?qZJ&>{~o0}|u)R3Y!0Er0%5HJQ`Pd3_7=E2VSm6{y|6rw=@ z)aFgWQvje9D5C)Yk=$BX_`To%gCmCy9xWUa)G#|8%K$70qZkR3T3eh)B94R%V_^jX zLoKByKru45gW6S@$KD=(`y1E);8RC_^;bQ+;QPZ&+Dm@J#NFc#HryBuK$1XIW3*Bd zNg`2%MEj?eGJqCmfM~Qrf?DYy2oymcxnU4QaSYm690}9L7!l*ja&v8?M<{T@IM zM@j=|W0V8{1;hX~C^)6ZkDsuKHcAsDjIlr{rBuCM7eb)cNa$`BbAq0mL}U5-v}=sg zdgnF&x_^mzedyhJG2F?9$8kg{k&(C!#xkH_&|*Z&VBilLt>((g^3tvAp$uMr=}TXF z>T6Ro$4}q=wu1-uq;k2$vY9cvFCnw%?pW#eplbEfJ+QpCHj%?9B3)s1 zg;YwV982(Y5XBSohrj#ux5uVtC#Gj7Mn^1e5j(}L^dJnlBe;%wn+vreY;A9^t!*ye zyuP$_(@Up5^5GB8%uZ2)R0tHoNX`n4+z#R}@{J5BfgANu8OXR60M%dsfHA6#Mx)Re zBVr|0r!(NTw_R`Tpsq?WZfU7FqX3|dVw5lfrF=%o_zpJwA6y0zff3{sj4_6o{fEn! z7uG3fX*8M|v+CI+Q+9ceipLpz_b(rIF%*doX*mr*+iLQR$H*pftr zkpi*Lis#D4scU0oaPuQ)+1uK>QtIz&TZx9tm%H3YG)9L->M}MZ(*naw%@9dqN zZg)Ci7zwG6vQVmax2Lq(GduMYPdxG0pZ`o0hS4w(sDO}euW#G#lOOuP7ryZ2>PEfR zY=?0e40}pTrHz(xH0-_l>KU!%-FM%8b7^T9gn=J|)<+M_zwPwN$;m0uQpZ7~x+#Pn zpO~s{tTbwyHbcj@ON9bbrbGycN@+rOuxc=%ltBO_c-w+uM?!7xfP>UqG96XQqvI2~ z$Y)nBpSyZx$>MfQ!p7>$jx*LB(9eGUdttkQrfWG_(7ZA_Ht04Z*+Z^e&)c(aPru(| z+^)AfPrUE_<#KuGD`1`k3}ewWW~%hQRQeGieFQ_0m-AF>!!&AcvU%t1OE3QWKlqdo zLK6*K8xpUsEtD!#gD|u#HahKlsCc^Yg#(YdJ6H*cKp-lp39${^ei! zr%!$3Yu|bLTX9S*i*W*Jp7uNsl&&|bpvl2Q$KHyL{b0qF1j21cM?=&1duWKo8E|ei zNxNfovd8H@2-1^Ne}%XiUlx?L+Nl!MRBXu9Um?Gy(S_U%Gavf`_frv zjF2khc{!6gfA#8WryX#-S>K!=8JjLu#>yib)h#EJF60Z!7r9(oityZP7e`9tPrUER z*UnyOw%h%_FBODA{LUx#|Hv9kfq+rzRA$foTx`_l(%OlGhgP*N7c0Y_uOW%m`McR5 zTI*V)F+M#dMEKr!y|dbAT)uYW{s$lOqnKzdlbrHhn`t3Mr`PRvx|A}bbr1wwo9mTw zZfa)c(zTl>Pn}+0S>_ZxH+$~FrHPT^y?38Jd+vPB>#>! z^;$k(xV3QW*s)_HBO{ZOlQ(bPER{-+KKig0a^JrBGcUfdy|Mn4FMaXe`|o@39gh?% zBg){l8@FmJ(MNdz03ZNKL_t*58UYdn!R+kp3opEI^yty&o_lU~Zm%(BW@e^XEY|Dw zZ-4vgkA3{7jPKvPapU;$6ZhYL|975wX0lMcQ{7&?e%?xZsZ`2gmL^DzkXYp1W=-6wZUevz-}xp0BB47D9~y|U zq!JQwvDSY2!s5N}{vZ$@#XY7;>WcI>NPH+VVK^Ynmm)u&>vmfyo62fu#LN24mYsHD z2}~Gn5yrXB?E_N}hu1tDXQ`>k@MJdJS#J^`KyDwDZ+9%210lhV3~Jc89M?l@#HB!`0A&LsG!hZFm{efU4r9SN?`>?2TNxIDp_Z1$ zC=vzIFj{!myH)?Z2(Ey4)b%pMVc)eW5)e`RM}PdsNA7v#PBmPJSSdvaH3q<7;vK)E zd;@?TGq>3HhuLh_^W0{$(Qdax86G%zhyhZ@(zz@pL<>nM7!dVFz1iA8Mr_Bmt+Z2e zH@8=-+go5F6`6c$1R)-D2Kj7RgEGd>F~RyVe)wc6hO2cls=Rm=~& zo!+2j0ijxfl3E!JWDv%d?HU<#Fg7IsJFbEj=RyeA%W%#`q>M4Rn>es*o&kv!fqGqc z_xi$uG4}fHxyyt3;q}wsSDYnCAP@qC5@S>xitVk9)s=-?H?Q`(t-$Z=NQX*pcUwG* z(?@15TzL6A&pz!s-qg(O>ElQ5IlR9zHeuUVt8YsC?++Kw7{8~qWph_aS86>oUIZQ4 z*8j`gdj(0BUUz=ybJwP?EbptUt4+0^neH)|o*4`b0cZfwi6B6bAhpy|yK=G8Ziu^* zxS}L(=s{+=h>g`sWRL_Fge3tC29D!^aoyv(r+rso}K5t(4nWKm7Zp?1zg=7Q6 z^Hy0E85Jk*z4@JU{^$4SE(Bc4dh9byIil@&&gjU=z2ldzT#f1#K2Qwfh!QkLDMQj$ zP+7XwiNf#v=+(+@0|ckSM&f+<$tNdfrqA8Hb!6{+nUTRh@1OpspJ_;|(g@N{c>2`w z?d6-5dMhG^fDYrBF~%5GN-Cvfni{PkO|;U~&NyCfw-Jy#t`CB7B_*R&DFp;&ns|=o zSj^nhhRa_!2t`5AreKUoD2@&|2lfyD#SgBenpm8=)L0e7nQW^ze2hk`B3B#xdg0@}D5_TrzYtM0WzVC6Pm6S#>%XS#!292_XmBtU8$)n?_VfRMGc1&p0|%TE%IUb2t}tpq!19nBsdmd4oGP<-Mil z9`gVJz<^59LQjz$CHkS}B%&kK`88uW6R!J)x?)^Bu@M!PjQ zQ0lgI7^kOBK6vK!v&~lf_LCW)SnfOX)|)9B4Y;Pyo zP+$3LU;0X`8)?u^#(VLVR|b8NB&pO&tGFAqn$70Exw(yv%`gfJr9RGsZaZjo+FdC{ zCS!5NG3|y;Crt}Et5p@0vUaN@Z3UEY&dTNT(oUx*AY?$%{KU(fF=h-R^mtTo+g0N4 z=HAiXxv6g0xN&3o^)r_iZ?5NxHnpv+gPrbrZM$Zav@?jx(oz=6ewgmGf=agN7P5Up z*prhJtyV`cuN%aTMo_J`g_W6@E?JznI~^pvvePN|^$9BrfSfTvZL~BAPYt~Eqrdu- z|M%abG*Sgo+$P)@pyl%5K>u)~)le$Q<@287F5I|L+1fgH{z4MPpZUz^gvbcXx81Dc zPRLjN@+Bu%o1F1+G@49pRF2CKNQKvmUIci%xiW1Muj`R;= znQrgwYX4`)tTSjh073959UUCHx_tA6wY6gZkg>SkU)0i|(S&dyJwrnvNC6oTO$ek& zmUpV)WiKx-2kmB|kiW6IHnwMGv$CD>d`p{rE{g!Y(RQ=Cv%0$Ec}^O|*-UP5e2S7M zw|BM&%K2}7>uHVj?YG~2;)(a4dF{;5#8jfx`3vW+UcZscc(%pQT)kE<_XW-Rfx}0> z_00DtXAi`2N`UTEs*jz1;v3)i#^U0wnVIRMM~`ZP-~Yk0)y-8Rqjs}-^yrBfUVhc_ za(#W}haNn+wY7EO;-&HNi9)HwgjFo}4-XFm;8(x;72CE?pFX{@vC(d|l6LTKKL4)@ z#o{M^;pdb~_ZlnJ@W*a8LKZ~Vq@ym5K?UL|~IXNOX%lny$<+S>Z#k3YVDFsQ zg#txQP!amFpOz`A2He!zR~Y7l_7~!LV!@(o19QWD1btu zwIrwzb(|z9A(zc^+c8FVTFq{&hK##@Mx&NmNo|IQ1}^jTQsKD6X%p+V6XS>qsleW}I@?iDS?z zQ8Ln6S+1YNiA01nE&7h2++d1;2DQ13*?n%cyE~0H-*~&- zl4t}aTnL^diqjyUO`=YU5;Re0DMLC$sL`3BR4OE-9W<|AzdSfFHa$JDz1bX}m|j`k z^fS3eqn^tb3fXL{-2vOFwQ8A+BRB&z1Sut`Wcc+jf8lFi`Jz@y5=C*^0IC597_z;& z1IFneDo1fQpU*cMjYP>zA#Zu+<(FQBG&y9qX@9&V`QKQ|iwYmqVbDNu0Eo{%uFvM&&E46kl5ygZM>ezg! zzi*>nOQfVs#EFuS08xP0?RE$uXh?j=2kz5Hxgl?!b-j z{_wFwCt69oRj+}c?aTLNGk&G9nelQmNnFQJkPdmW{}!W97gC+ zREBEP?R2_~C}VcR4%;!4!=t{JZ8jT1aL;p6#Gu_F26dxFDfKhCq5iTE_Rli02tW}m zCVbcH24SUMU)iqYGC6{LWN45pkqC|etOpndM2ZX$5t`j@H%Yi-OO;+-xN%_rzDrlG zJvlP!aFGV#{QN-*5T$afva`Cp=n9%d?Mvs+&h6Rzoxk|{1E(IevzhykAJr=P^rt>` zYk6gLZR@Q!-_pj+%*+<^xq5Y{RomUOXST1eZ(?$?)oi};`q@k__xR(F&&R(-hyT^*KY!%N(bd(}`GfOY+ncWI=5o0xiuUi{-)gnK^rbINPEA!d*D5=^ z`}Xg@|G|gfeC5aYD%&f!u8&O3z4Fq_@Bi?}y)3i2(CGO;E-` ztGc{+t5K^D42}4?LXVSIU0$}GWq$~_@O4^`Kz=tytV=Jvb69k|22 z%Jl7c-$=gqmI}3^+OW9FohC8V@hKXTDnzYKsu2+AK)HYM)=GBRw#K+?TfWdCYo0rM z`4=C0svWk3G&W?6mPCPL+ndepv9TeeQc4LJ+j0vkZmZUcS#25{?C5{Au0Ha9Q!qRdpj7!D7D2?5$XN=z6tmLN#rIJ!9 z0MN!HCXIuz-_}tS)we5qbEB#qqc%wz0|!Dd4Z2zc`Ej2lIma&;2$Rk&D?cZ!ET(M) zVmbE=$p`?P3(mP^0b^`+ZIy9a$Yr$Ff)mC#r8W>^JC<#`nM~&9&6|^xlYM=CR5-Th zb)twdVRIp+OiiLe4-WPV0v6$0Yg}G%B2?2}&HG~nH63Aq&M@~QTjc56tg>?xnX{wbnoR;G@~`AF55<(d<1}UXVE2V%5#x0R(EnF`(I(<*=OkK_;N)3Y9YIMjZB6I%MO+|}A zq8L}9GMu8rSgK7e;vfV@sj7tiBAOY?`iv1Rfv|R?V+mxG8VbGjOxLz7W%iTmIkt&u-CM67#tecU_ zEpeYR6-Qkkh)S99oO{}^`fCSe{EiG*_Xa!yK?xD77`2oNDYcmmj0?x}yFs^`LMJ8M z;juJmVlc{aTw>_*>SiZOIT!V2=eZYNE?REhb>cXhm>lPXtgfx4T3e0_h6K&_=IUy> zSWIFWg~@JZn*x*6=1j#=cYUj(6*i(EYdfV(_WI>pwhL)$w3M!6Ys%U|IzBS8S=kyK zC^zc$AZiz~UOwyHTHV;(sm;!)n>UxIr>6ldq;U{*C=wMbZo86F1rP>7mNC?z3;_yC zr`jL@7=611g8;h6uf1#X{*mdcqE|4~D1uQy(kQ{W z8>y%?RGi*B942u$l$uzrW^;IO5P=nnh3%c~_065-wY5Ea4{ofl4Hk1?Qlqex%XE`8 zjtpv&@mhU{~!PRADnsRC8Jatcax+|ZLl3zN~JYsJ-@%Nl<~aDsqrL9ilx%> z@=`YnT`Rl2x$^wW-+A`AZxeKFf4VsR@YMce|KQg@G*B|0=lt4dKK;;rNB^Hc{z9wW z@mxn~buSjZ?qzK4>@X)|IZi9=8YaU?0nqJcGl|1|#xG>EoD0-?dwYWkVRJ6i6jBM8 zA}9(}MiE8mfxNU-rDDF@3G1z3r_)NLRElT-(3&B&9D8nhN=99aGtNl0zO!AcfC0`7 zC!81}II{%pFYoKNTb5;co}bI*!*0C3vElXg?N%$6>$;A^4H+r+$4OLa)+3|BG%*a; zE87mEzGM3t-*+6D=xU`_?knZ;c|_DkR~xk`icZ7q&nBw|fDvlYXaw7`5KT7k)uXCs zGmPWG=?Te!7()>VXaHjfF+dPdYTfDtouJ$5cC<ndH=ODXOG=?|E(JfgF|CC7p{He zqaO=`?#@nid~D*#!2=sBi|?F&d+*$VC!ToXjn~g!x^zjxwc)YpkA3W8l+u0s_7w^R z$8q-V-J8k!Z@>N4CqD7XKl!77`^3X1&!0PAC=_x7)uF+`)s5{mP515JfB4WLB=pCKvUhGepZ6%ILI`A(P)ZnMz!+s<&|oTM6h-aDn^%KY%@djr6c<+(!$^MO7d~Z> z^eE*&LCN(rS_HM};SInTV>A#zqvF@zxv|+*Q-irIM82)_`}(h3y*NMV#{pcqSUJZB3Ent;}rNTNH6 z^hnHt0H+3IB)KMN1`Bz|@vdE5o+SNxNc8(9q^dZ@0<0pxPKPq=$k=qqU(F0GI)-G!R0thwVm9v1dt48BET8NfMiGz=ddZZV*N(r*RTTNt~wX!qv+= zyOq9X$z#4&y4?+Q61lcbj8Vz}HDlvr`FxRcp3fHrXJ`mTjwlmjIOkGIN{P`x@8IUi z9mZhq8t&Encdq_Bo+khRz&Y;;jNuNk@Scn7!fvbHY=g*oeraTMYXAO&mB!lle)yy6 z!YU&`fh}Cyx_W8(eGfm}Y}6MQ7Z-0WuB>dVZB?k{jSiHKJo4c5#Kiyk`G5VNeeScP z1ASo}z4+?cH!oia!Z6aXQ{6!coKnPq0IjFV(pR6RjHgk;2~t6UkW40938U%JVb`-x z9-kj76!#q5TPhT{7MJ(!n`KmQ?{3yx?dM)Pdwk!_a9=*#mfd>bICaaDr8aM=rmz83iUUB_|nyl%52ar z6${n+E-DF-S~L?U+F}SGz)(b%8Uv_B<~{B6qU4kz)#X0xqmP~X*MIs}U8Bt+!=z!D z0t%yz)}aC*DQ7^Gon=&;(blc8QlPk$;O_431xm0GC=@U5!KJuUDAMBY7HFVI(Bf9y z-JwWvr})je=ljO}efhx%1IP&BefQpLtvTo8mujFm01sDy3$txX#u0sWU zT25uC=fX!0g`^QpJIyEkq~$bU9@$9_PBue&OGNCslmZ>OU#X4YdRI1k<37_6A>1-M zkxa^!Rj(^z^hWUojlk%t89(Ic{r5Uc<~O6af36E;JdRi`aSkyt%K^UN=Dzn)YMQ~MqA@% zUso4fb6;z7JG;$c)BCB@$D7kwO*JdGb|77RvBt>OL3bS@%k=3qh{yKGjn{1AOH%Mh zjLt-zmMZ6Df>0+X81DD)v`4HKO&hbmFbc)brVbHRhWq82lLhuB32TdXo<%PWQ+F%c zWzs%wO8So0rv*XJ4;?`#utsN2PC<(6_Bp|hb+ZpM!P~zhaW_Wor1wAf8rT9 z*Xe}c=$LC))U%UZ>R?#7INAb|p&}F`guyenQs^^?_=tQyt-rG+6mk_LB-=&X0@H|h z&>2gK?HhCv+WhzY)c^Li{7>^Pnxj7?h1xoy>isa%@)^BF zY?+5|=9dvzzR5H9=0WJ-!)Xxhk&<4uiLsG^Fe?iS3*ruGo#y+JAoZMn`Z;YZ@1Z%t z9}PJ-;G}s_>b4fV+Is6!mF)>ceb1_eecXDD3L0wBB95xrNu;$MSd}e}KK+cH?NwOJ z2X+WU4_@mZT-7>Sd3&>BJ@$kKQN{2o`ea`$IJSyNdR)cPN%hS@I3ePGNWF!-TD7@4 z2FA2LFP6ZDfIEM#eorACM>-|1ve2YwWs;E!y9cD!74S+Ak)`blx1|Ftk8XPI$G)v! z2`a^J+rmPE@k9A7!(GQP>EypqUl-UcO;m3Al1%1kZy#eFP+L;v(7PAfuS;YotKv;- z!B}AcLnR_50K{7UjmcJU z4;zU{4bJ@aYa_LkYsI7^z0mUY@nk{GC_IipnmLOO4pjn*;cRunVM>+Mkp%-kAgv6< zP2DP?2n)I(&J;FrX%r8)QQ*ZB4Kh9FuC^`o487?ohW=IY{z^}{2ssXr)ry$Fcpj$X z9HGF%U;`_sW?Cv|mfK*3sv}n-H(ZyCN zEt}$kzP=~b-Z4;_@cZbV=92~$GK@itJwEsg#BTxxZ11x9&CHv`Nv>4Yngxz-ssR;JLTs1q5l ztqGH_8PS7nFGr@2! z@+=*A_50i0sxILucI}Tat-0^{Z1Za0e+>}R@-aG4SktEVUq+~dfu3lY0$VQqWK3v) zl2C!Za(u~cOfqi_p>m6_hWQ@=9^vX=kYm^siwL1ib&><#>ASJPZj?OV3x2mWI1|vj z<6;sKdMYrN>v0am2~AfOyeVAZsbx|_4Z|GwJ9Y9b)*|Sx=Sv2K5+kK_4MA3E1v-(N z6glgg==?wV__Ts2Eg95wGCimU8USXo4xJx|ecLAW*mK2Qvkk9G=Ewi=KR-Tp`4;i< z@lBSCu+lN~^fVk6nI@P6Ly{e89} zD;+H!g?G{x=m6DqmY`POhL~f@LlgO9yW6uJT&)e?mb#ikJB?PVbQ--Y+8G?b&Sx4} z@C(Q&6zlR&{~%AC&=63c43Bw_`biMwK;pQv)z{cRjcaYy`LV<5Kc(u<4tzL`2SJpS z^*BZjXIyuVpn}&m;3%PjmK!tntS%zr;@Ioh>OQ7>;2z0{3pJB|Y4P6)V6RnneKCd*>Ja0TW=lLl>d-IWDt;eOwPWE)5 zp@=hqMe8C({N)_PlCHyI%Mq4g)S&Co=h`jitfbx(#~`^>PWbARU4$VlLMFjpS$h3r zz|&)m>C4@;0>dIUOBuDVOJE>1fz-TuVpEI9N!j=M4!Nc(3$5K|2;#j6|JtdgH3Z6P zA`vVR&eku%wji$6A86qGdMGuWWF|Q?FVo5D?Ah|ZU=o{6?rV1uA~g5U>osLE8$>*v zc$}TlLA7(0)sv%XGn#9L^ zmmwh+m*Y|r5)zHxkh!fRyug>B{Qxpx20IMS2L&$y!t#X>Fu)n{@4yPLI(WU0gQcbA z`CQ@7!uye(NweZwo}MnY3zv^eCnx>=bBGDQ!+iBJVp)-_|Mg2!QrO<_ zgu=N)XhjCUY>>45U*F4#chLOJ8zKR}syx3#6Q)Pfpt~eQm_pFb5ee~Oeq1RQveRaK zyvE4b@pd`l4r50SX$wxMc|@qkwZ zag%7Qwl2_s%Q@?yTth))BNg{PZ2rs1Tba2ZkZ@-HnSkeOxEG9Q;_4IB+0EKtwj3fv z#H6)g%d=`A7PLKU`q(?5aYPeW_>+a+{OTrY3E)W~?CW6Cnr%e0L3udtd@|gUu zvTft?iNL%%Tso-(_m{792+1sn{pzHwCIG0JgoX_CSJ^Ra_Lj-^P~QOvDj+dgrL@OZ zq`Y|sJn;&rF*WU%<4ON4g@B``S4%c)^K^Mw5!G;o(`mh-)3my!UQ0X8@PaqL>&&ZR zvP_EA<2k%z8TNFCFLUIw*l(x?eQ-KMbCplp-XNwqT2mh4IU&ylj2a=d^fwa=xp^vE zq6jLAnNpTlWm|i@$q5G@4h}msIoZHrEZk~Qc4rO|4KOt~n1rXN`?lE9Lg0a-HDz`6 zm6A>uQ)tKlJatNb7Un$s)4@=_-?d*L2eRB~46Eny$vmL7P0Y3ud&}z)(HG)+5&gke(c`LZGN&b{S3=B?>M!p3mhb!%|8SL(dsQA{(qK| zGFgbx4{;4g%JxD(!0;!e^{)Lk?}Sknvk`mxIDYRzqifkwgc&_5IXRV%;9KLkY5T9H zq~Qw~hYjd-x@bE?Yn=J1E;DsGZnU9XtEOpCeH6EgpTvM=CIeh5mpIt8ughuv=~sQH(kbbmc$<#8WEP|`gdI!GnxDlu|Vl8A=}8; zLn@7Ja1-R885LmZ6Ulz2zzBa=a6ddoMyb7ZK`x%N%M;usK;Uj{6dBX7$l*Rbx!gGz=qG-h1 z7D;{PAt?H7u5zB;9Hcx;-5y~%FV{hLd6CNfX?m$yapDEUan{&{8j4WjPEZuB91;wU zxYK%F6M2#mR=r+-s3pcbt>jX+Q@VmCCjepic|cU9ghY<+8*Ho!wPXKEucwqai^i&) zmkDK!m+mAMr&o~D{J09?gQGUj^yk~{=%^D8lG@x?9rx#W)^4vh?;99=o$Q7i9ES^& zSDXB`?C#Eb5?q$~yoLWEY0KvuL_0{B;YX$Mj@ih1DMnGhqJZA#GRlSM!lRhIA z85t!7l~cnKD#JFqoQe||aU^iB{^g~_QTJ<6&=xBKoc-Pc5uhio^s~M@*9spA1QfCb zvhhhtB_UbLrW>+0%+1+_xNd>tV7mLHZN<$;MPoMaV6*I`ive}0BN{Plo!1eDCX1Sx z$CKt>>otRy9C1VgxFQXW4XO}RY5paQP1b;Ar%+JLm!tK0^2z0Pm2i;#vM`ep5{dkk zM$GBl1}0tooHyggtCIlNv~KTedIi=)*M2}jD2m0Xs7jKKT|3d{?DcNDXetoQ?28@W>~V=Um)d#5lU zJ}@13%E-9IVOWnQYmp_Gu5gmPp57K9$IU>b3?v_WW%1UGvxGAE+C{Am&A?V0tHbx~ z)3^GH-pNQMJ4eULKe@^ncT8m(N0THp69lbiY|n@}YEu6`S7 z3+Yzz;AC^Eg3!e*)QVVs1X3Rv*n_70exdh>=>dhvaRyuqS+RQXF-7AA1O=1F_ncRn z_=5J&hK9t;ezj$rh2UJTOQJ31mzL?t@Pa{9!7+d)$^ZW)6#4^ zIdU!k%_W%OS5*d^@zGHYO`7ym3Q8%_#>nBG=_2n`p#?fqWSxCyJ(78Y{75N51vx7 z(k_4g_0^sJdfZYqsSyo2n|M4|#?`p7iW<`ANFO~95ZjL&+?m~-=l1*&ySi7ad=pR2 z{txYkZh3>((xHPy_c)4o*ie5ZPhP;`7Tg!VOpv1|)qCMh;eK_lpR13DqrI24*E)is zTQ=L$>;l`sgfVvAChz0y6Yoc9o*J7N8&;C1O~eK>z9P;S1f$It$-NKX5W|zD7)u}j4xk+x1R>Ly!L#sv);gN}M#YS#ahuiCLBtIDqwl#zGWWo6o$A}0SL4zW?>`d=FsTJ;|HKCxu+vW>rN|}_p z=h2iBN9fFPJw23t7Vg#R>0}nNn5##hy=YOCR8(Y9_i&5CRNa1$IBYKEW-O{PTi^$* z%Xl4?&w=fBT5dF~V6#o_&vWuH@}rY_M~*VfdhO3i;85`ob`|h<6X9Cxc(zgy8; zXmk!VZF9S`Nt(@08%+hq>8=jn;m$sV;$kP;+3bDl*Y`V)$X`C8p(uwhyTXRIQmucw zZQEOH9uLSoXhJ__^CN*`Y0cha5`H4CPyRyQ1wfH~FP+y&HU2(hlr->qI`8}HL4W_$ z{mon3>xJzyQqp<$Szi|5Mc>wQm@;+15vuHaI7#4M#;N4}L>LE$>S1N2vZnOE!;U8j z@F0uKjVmx?r-=b-pgTDdHt4`)W59OLK~vp-d>-0%MTtjYWG1LfrznQ zjV(yrLR`?0C_D)%hP}iH**TSY4>ukIx!)yvk<_vt@SCZWbpNNCKzJ`IZDxuhHl!Z( z-pwq5L!x91~BgONE9;{D`boTcf7;*g`7cZaNov@4XOdvMjuq*n)#%X)7$DA&t8vQ+TWBi<1ZM`Fs$ z_sUWjJ|4UNJjELOH?>7rAehI4LFXIU?MnHf5^*Yo(3!WHBor;&J^@Sk1q6BkB=Y!3 zuwo^$0oTmll%cT<(s3>xUCSkQpE)l$-6D7UY>dR}=5wv8?ZQc ze$JMzlK|zlUmkz&(oC-%^-7Et^+j-Ho(44!bn-gfUa64P_4)ksNakjP&Dk6; zC)deVI_2+k_vR72C7|wYBa#1SF3Q+C23%Z2>ldWe`SnKqHyuH{O9DJ?BucBvzRlUD z2`a@sIR-*W!w^R&o+>AtcpkHwp4$^zw>@QhpR?Pa z?}e3j@nsprY?eSU?fK1Q+pqTHg;mOiI6Kz=ZhUQiW}^Zh{v+N3r=ln>*Pz+R^C|`N zZizNnY1zke_+!2!99|gN`Yni$G;j_8$nPt``!ZyNKU_Uwljww@hA-qYIa2phtv6!J z0maTJ>GHe35mb1}e~@>xf@)d18+6PYyOq>ymHZF^bMtXEs{k62Jw=YlX{X*>=GS9| zYGflsH}t-_G~sgiO34DR`QrW{dR(7gkX{jbg~jfrzPVF^yPiBsbe~Ulwg2&bL<&yOLP^VqCV z8=G7G)ShP6o9i60%c0KB&VT>VkQVD~G$(LhzkbbH0{q?;vRP7M*eU@-aHM`$B)Rv9 zVvE;UJpd#7S^Ldg%BzV4x8Kp#Z3zzgHplKU3aN;Se2Jb@vY+>KnqOU5tEDtt&^@-;uVfAmt}K$}qu?y~;qcR6|=Vc2N$JZt*ohag2!0{}zTmojm& zPov#6!~hRRYr||8$a`mHT`gHbEWf~yJ_89x4q>z(5)r&K7Hk8R2|JTEuk))SJd@_5 z^`@G$!xvLO@3)Neo@=ikC5BghGjaoHeuPnNX=tI@0*lpE!;fo=Ym6+ZhcHr z?=-c6qAN$DlCO)?Q=ODjgWuJ%eoyRFq<5=1;>AmOE=DoFP?}w%NVq&=s)B+%T(%0R{Oc}8k9tQ`9xA1(tI zk5m;UD4PB^>)Hb8^P-mrIq09KNtu_P0cyVsiJ&JclFk_)U5@k%{$x-I@a3<}v&~q> z@j`k6E(0rPmLWjGwZy1JV4U=R#MQXv!NtD>7owk6LI1E!$Wmh2h-NUhK^ z%(}YxySbcenkhXuoBP9|C1>0@ZPKd+RQg%vwD>-lcX{mXX3YK1Iv4c z?T?AcV&WIFA|dl!_3)-YeI}N*6A~7-CZ9W-0BLLYAd=}X?(sTE8`U+Tq=APKVaf?K zp9MYpFGIl7wU4yvxf(Q5Ua>BSH4%}>WRvGdjl}w`A>Ipiy|9pe`jBdcPyojzXoBT& z`jhd|ZSslnr4TLYvmU&G?VJet&6|yUCy7BFH%G^A&((A*juN0^8iBb>QCZoZi}!8& zn8t8zWMm|v#*gOa&-*8`%t>|*4yq;KXdiO~jJ>2JLO@zdI@hD&XeM-1P3yfC`NYza zW#(MXwz7nHRt zs92G+ZkEV4r+VlXLy`HR1#SLB2h4t?f#YhDc2ztEICk>We9DIt~4)f{dTlyxS z1GlUl>C5e0!a(dHukw-K;adVD>Tgyf`)>k}&`Xp6Xt4yJZJ=SLW5$sGv|BmV7f>dbMx~E z!CNpNia}T+VR>qzRzEAo`0>+z&sr|tL1MOit$Wb0M8|V})!oL74qFxt&wU@cfHa>p zNRLL9$+6IC%=5C3b~oK~aH)_r;~jB?vzV}ex_7CE&8NZ|sP3KIeq`ble(2AQw=11I zExD$wzI{3t3iSFtu}vu5=_(j|vG($UlLle*z+g0aIU?ZuE6b^U+r39}5gD{hnS4RN zlJ8(%Z-2XIE!bpSdn4}|&&%2yoIzrY&D}S-xHi`PwMp6{(suw1v6gIFnpoWjE zlGp#XMXCbMQV{yTrBxw*UQwS`Q%t+1!RQ|^+ry{OpE}bk=a)2(7ONdV52*kzYw^`@ zUkqIzU|C_=18v{XGgFnyNVbzP@-Rg3gS^j`U#&;b7QZEBeBKt}UMI^EotO-)ErORo zJuNpNAK4L-nB%GOwOTO=m!@UDI9cMGMj`5BpUJd2SacU&b%4kD7LSoDv<~|8=kL>Q z&%m$J{$-QrW(B7a!Kp;-F-vrtnS3+DOzhjXm#&A70}74tKgoLR?1RDf(;7|P9f6nI z+bkN((LQY2l$6voWI0vQeFA?610Gs%bA5lorE~ckE?bJCG(D(bjX@Vhc%{ZeP!~~5 zxG)YiTDKspO(MbUlx;tDh1j+*0DVT}qgN~u`BPyrP7iPSE;e@9NAyWxrm$u&_OS4W z-;P-ii6ERvlGlI5!Urgad9e#EQtiaKci1&LKgFjO@NPHAk?|JD3VR7UC}@qz5nh?GeZoKe9i6eqX%$_zeePB+*t=$SQr|% zIxROsR<}~M=Nqc&v?H=S^uUOV@m_B7T5`V3nLFTrwE!?XM?Q6h-{zf``1q#0P+|}jmY7%u z18qIAI^P;Vb%^)s$u4XlPjqrsgqL5R6(u-UWBt{acuKD3E8C=#;eFN*+Lby>w~7|3 z%Ncbx7ZHymI{mjO{n#@2ESglF#+n%39{>4xT$tR}lnFo&j*pM$8**Gu1(RS!jE$kj zZ$FMoIBTdU^k(-CPM47%7?zeYpWdX2ddKvw?Em}u&8$MWq})tYxQ>&q`(s5s(vgf0 zMzAG6*>LS@qRqe-kb~}BeIs9xML8|T)yjSn7|66eRO3iJWyD%PSBj3ss8;s+<$~v> z%}V_E_+fcjyyK2#?^M~ALYDSwl{bxhrCsRLQalK&e#$_VPI4Wuhc`#VW@<4bBlfVR zFHw)Zxd0!02L>|%N;VbnJcFL!Wo%ghu2gHQ1odtAd{Kb@GW0JL|ajb?X(#r3&n!UXU zSHgpSg;f8L4MRU(80+}AUF|`$tjRW7D$uOPoi;i*Q#P}5O_59ptMq;tIgc*bEhZt| zT-Z3ipKI}umN;8m_28E9df4vbkdgBG6JERQpBIOXr-^+#BdVcl;V1Xyd6~vLa91RR z5R^%%gi(~N!c_ECrLYJMNfslz&%B*9Tio+t)wGRDz}9d;Zn@!kH804|-gimF92&XH zJSMsBU}vXo@Nz$YdKXg6ZtLiX+e0fQHM=qc2=7Ya&|6wwY87vt`g`?z-xd%vmzt{S z>l==r>f{=R+Bx&*&m@EL*S@JN=XTeNKhXR8NF8?1J&l+4fCqbRC|;F`IwPSF)KWTY zc+Y(>(~^^Vc&GMd4-w<*x2wkab~}4?L=7<~Zi2&(!yM*0hYya9ep}YYYK=8sWMBW< z%aIN^xZBG^jL|0y1eBsnfozH%M8P1S-Dv#`(9_FH1zP+iSAZ=!u>fBd!-^B5Cw-2b zSa!z1nx;j5x9TMo3{**;Ll=oQo9$Jnx(`z*!lAlG5Bovk6C%PdT%sH~*u9?ngQ>+L9Mj!L6rtUjnk6WT39V0d>lJ=Kx;J1;6pUKsPvn$0smo8bd`!(>$zqxFen%K>zp z1Yh~4QHIop%~tS%d)E9?ji-XAGU;kUC~($Uew`s)gh_63mFlpgr8*KmC-HgugyU|z zr1M8L!aS4Ic+c{5-jhJ((PM7SX>4NvU%^-{M6h=)3b!p=6CrfGghFicUkI^~lCfD) z6#-1LAKnv}=)`b6(Ovv4%iGNs7;84Og*Dr`XdsTUDN{579${dt{KJC-2YdUbt|AsB zJ6K`ax{^ARl)z;_h0NECw;?~L=z!WZLi+mC}L?D zmwtM$Y5MZdQrz?cQ>3Xxfo|>B-(NB**1RY1>a;^wcc{$?|+jF5S%qUud(zNo<(t1^hahnZ>2KfOuUsWFc&2U>L8> zLpLgtty2{#eJteNJAg&(0O8J;md-O-<(~CVaO0{O$eHQ142GC-> zm3}Fh9Yb>bvak#R`TT|}zucfU4AitP2IcNy(v_B#S=6NC)3@lCn31Pisp2GQYeyyI z0LaLo)z$9V>3yS{&&YJed#{sSAqJ4id3hvcoJ?0{AQQ=3se*V9ntG*yDCL2V9x@-1 zaEPx8qdq&X1&~p#{%zZNEq7aR;>ax_%8SU!^FFH^`Deq8ZvOqh$*9CZCAPk}+}jc?^Yd`a zrTAIf;LLk;6_0urSTdE($mOrU8Dzj_I|B_)6HZ^C13~0uTtZ3oi#Z~H>NOIu2_q&9l?Dgf|M$yip3;25TEhNZg!VMa)*MTi%)h94 z)Dn!ceB!*01pE2{CFooyDi)&$aJqYK%NS?sfR@W{guy`|lUs z`mz4pKT(^UJxj*N>12&)9{wX3jQ&>YJXDJvgh^fUN#~> z7|9lez2z#{-6Us$r7Y5LtLCxS2jX_Nos0L8KR324k?(|3@^dl#SWl+alBI1MPfFaQ ztnnk3xH#S)AY|q+TdALmf@+N)W4QIE4cK7jd;|PBgM-lsGDzE9 z-FyPIL_u*C%t7>gVq2kyft^u%@v2K9%8}(QmLkAgsygV?Sp;by$C>^E!eM(y+HoeS z#{mEU4*vc-|t(y zyED+a>`#P1q0rRS(pK-&F|~2Vt#j=%O)4?3;*O4&9Mh+RH+${hVh7d(ZdY4TpMcP( z*Ed=~L@>qOHqDD@3NS7%?&;+88KS3W6SNM48Bl5l-7H4-M?Qc5-da?YOo)UP>elb+ zF|Sb}#9El5D~_$eRHDb(3}M5kM?@~4mGA`Uzc-T@J1RQI$e{X(U-%^^m!8@f_Z=oG zmujFa6B$jOO8+(v)TasrAg{_8s?DO&w3+J5%?g0wrm-LUJ&)$rYg+*1Htw-Hx$aFG zc#ju$on>xq)pI6Y&M->esp7nI;EJ9iC+2L*6D=VQMz&pUC=6r~_w41xM*2b>MAnw% zj+KuSX2&IF0|xgO8fGT(W>cLynLT*7&{*ia4#~s&^^5c$N}raX72jMP;5 zud-ML(D*<#`eZGxz?bF$xTSN)_4K31%gF2E-GcOG-B4m|b!&=Fk!(UC9F&5{eEj|8 zR{)||-f5I9@Ihqm8A=#PzvrtQ8$^`cM~;_(JkAqmapJV?M&-63>~6&e(DXMWBQrBK za!zAe#g>4-kkv=WVW$#w;ct_adluA_JsX2gk_r|?V}PcSB?)y>u71cMEJ{I!uH-R`>mCQpLGKH%8;kRomUgd+1`e?=yPD;%lVLL>|X)bKz9XIr-zW`C+`!4g+VGXl>KvI+pt;9 zpploOxw);SkFEI#$9>LuW*N1#xvhx>qeh z&DjkL4PNXHj;=z+YCtips;2AHiA|o^^3vMP-pgi(^!aZEW2(5KqHR@ zEmauAyqeIE&4QZAf_ohVY%i$Z*pJ`&(f913VpdN_u|Ay)?=7`vpwh({2o5U^RwK=&z@utz7BU^+SQcN69c7KY6TC>f-#gE3Rz z^G(Mos#ubV49O~%9KB?uHfO)!vpi7gy+>6n=sS0uK$Cza&Hj^!R8;GC0 zBCoA&3_vRY-6d+`)HO7`txuJI8>2`kkJx5C?>4$n|Ko2&&{&N8l(WEFC$d3MovQ$u zwBbLO&GI$)XwqdK{^r@>OyKPPk6aZ^?_(Lz)k@;&9X)n2>t_gU@!n@M*4k#HnvcH` zy_3^bGJxpAk-(k5?i;91c`z>orGWekJ{GYpNH*9t^~-=jvpnnd%s&@DcMD_oNx#De zminoDvl}q>N0-|)b?zb<4Hbbr<@EDNSzd*+{jWQf1e)-tC+|G}t-+^<+a0&&=jXtA zPt1bzcO$$K@zhe*hI~wzA)j0}8qg7?kV+5lzyOP!Hng`WA={3e+$^>Q^1REU=KzMv zwt|Or6cp4e#%|>c>gna}z69oD6_>6g8$_7xN0~9}{Z!LNekU_zkV=xHPr53ThKxa1 zA6xaB4hc&Xw2Yz3LVG}x0}^7=a*Xn~Ntm9>QzWr)vU1nUBAyM#jKqj(@l zfI@7onK@-Z9BuF!%B>W z1I^^prwso#cY`bJJ(H-!l4JMQcmydwg!PNk3@}|jJeS2^rez|86_$by1(eWZ6bdt0 z31+9aavJ@;8vr3P3%`8g%Sw)!nr1>`ixN2LivMKlaEurDsL`gFCkgW2e!{!RBw77L z&$X-)({i>yd6Jm!(qlPzYtK0eDkIU(a5O-uNl=+=Xe^51Q}%(j@7Pj+cAye4U&bFK zacoq&?%;`i?zPJfC`Vs62wy%-7Bmzl%WEB8fQAodhsm+EeK^j;zxcgfhTRWEFG0rE z)_(qK+OEw`qOOshjym#f>I3*a0m^jUt?PH$EN1qY zl%Lx)gId}`K61}?zEb%LJw)i7W(0tQ;VCG26oN#_V2vr^96J#fLc(JD7<!T z!5xGY>%AT4jDwq$-E{Z-8Yh8~ZJs_S>(@oWmVoBtGU*X2mq7auXGgcMC6?@p!7f#b zti{Q|@MPbfMNmTXYjQ&<7E_8Lpy~8;v}K|eRyar=K$l-)m7cA&TpJTnn981^_A&Jp zIjcpi)7hpR!%51;aA_Pr7!t9$b%iu_{wzf^WmvQaj{Q!T!_?z&dme2O&F-wt7$A`5j^PWZlbt`C(Whi(>j92^FL?YQPP0-iB8lc+jh|5z8jp z@G_BdTNQY)FxhIcEv3MqJ`c(D>e~!3_8h>aIdE(ikUX#Cn2&Uy@cwI~nJs>H1#Q?G zS=gBPsWQ0#E|A$6`yGH#$th`}<#1ox3dmzxk27tC>mqQPhOJF4HSw$ZFhas&+VeGD z^hf?*z7{Rt?10REzA{J60{n?=R#H49b()PrGA}bWV54i-45$CIfj=t)(r0UPcWx{-GIB0esXsR4IbkhuFUOKSgU9k~A14cR?53q3 zz4D_YN}&VTlVQ8r^q0G*BY#mbBT&;ubs5g0fN{rDjoUCE#t|?8Zs&D+9ZrgmG~95Y z9giueK4s1*{lUWmb9f`w3K{1MW(;2;)NQK)SrDSVY@Mw&hB@2&DV9IXO{pB+{$INT zg)A9?e0qEVJQ+x4J%WcaFaty>TiVbljI=XlR|*CIRcSL_!`w=nO456}Lm7K(sY-&$ zVtKVWutEVE2wF61ktr=w;hq!-lAg>zln#!;$CvlXeT^iKvGZ9&vILGGaSd9!6{h3# zOx(UI5Hw}Ah1D+BJ7wOPs}N<5S&Hu6At+cQLcS&iAP>T5M_~ssFV43Vh$4fUdJR!s z6o7sgPXkrfy#v^l9U7m;wlXgZ`PYB@Nml&AY2Y>>T|iv&JI|e(zj> zvBqhN5LZ29y`2HstvPfGMD#UEz9m;#45wr$O%f`HR)7vGF6NuwsIRJG*1PEWnVyB6 zV|h>$rP1Mi%%Dj~M`C5U=@}dT4Y9p)1&$%eNf@DEs17S}?V_V}UIK)OrME#k9f&(Rfq&$1;gW`<3oyl3#v&Pr_5YJTirLk+H) z)_9!x$E$cNsK~lqshmYz(q6$oV!$p?1eqC*V?~qn2~H!KsJ0;ryUTD*KXfHukAY z#j~fu%k|SnW%vJknckY#jXe2I>v${2|9zPco=2?r5-r-tCI*gL``PY2yk6Zk3=2hK zJX$#mH1#?nj+Jj;qqi#od{WFdK17D-EqWaf9>u+?k9!F5W9VdGc;sK&I*dp9^lTz{ zdD3H%*)V$4*0J~Q1){2c<29zL!*%nTeHLfAyDuc9`W3o~)qkI;AWg?TcdviCi2#&rJkn=$F+^_CWZDjG9W}k=38!DY=17^GxnbU`^VHe ztt2g?zOnVYMZJ{`{_u0q%EMGi8G|kyLGhxiKXiOyP$xh6E8_W$Qc z!s$iD|NDImIwVS}|NdS$$g-!XNR@}c?PjOlkLcb+nqpPh`TWnUjHm?H#Z*a2$*88m zzlI%C*Xo5=G{)fW$GuY$eKYgLim{HmmHH1X5T!em;n}k8C~vEc!}LRvp_Okj0w&xe zDSPI2Arhiz7evFaOd2k-YM|G)dgvxKBUV&)JI?FjA9SlyI?VLY+naz6w${UYwgPj) z+Z_HrQLo#}!})~_a<>e8AJkd(He#-!MvWz}PF6ZOu0{@5(Hwu5&J`Ks`z*45u+`!? zEm^64+n&qS2f^{DGOU8*s<2NV&iQR(BW243QI8qz=VbYuOLpFUbr0h9F@xi!2E1%d zS-<@934C^XV`BQzBcuAb&BgjAr;T)slcV;rx7O;$L{#ARmi>bPG?xP0&{=!UCUDs* zdNf?bc?j!$Znzu$@~? zvmclIXz6L-u7vTEG!nOppTV7*=NgyN;31Qf{z9bw+l4{CJlXnC?yr>wH>0HE)hmp{ zDXsQ z&%>{746QdoKCsI16KsDtJIo@hm5f3^!OMSRXRky}%St2@!IL)ZxM0Xi=`c@2Zy(y* zD}&j*2M-3coa|r3t-;%BPNS;3^)`7@DUtlnvq-CgB<>%k9ICTl=H^>TgANc6JO38d z5j~hZFNtUb9UdyDkp})Pai8b$zwEP0GWFXT(F?Nq{QV6xH%HxV|IVdpHV5=!->zwG zy7B7rwxWKk_y3f3r9n+)S(uT<1!(O?K%2$savU@viAp!95FBZdQCzx_5C~aN1Z0tb z5Q30^(M~&ph}}bo0R-ttBU=K2ge40BL>eL>D1;DA0A-P|34sIz?1wrqOHI{O&HHz& z-aY4g=brn0=f3yq-qyRYh^_@sj_*3kY7?6NBk4vXr48i9Oxt=RxHPNF!?_sj(UxEa47))$F3O zK0~vrn#CR{ANgB%#^wN9(#$pg)Q-<x$-2f;7UCydF-M_Pc#=;>oMry&s23ljRhweV8R36<>XhK zFsZ>OuyQNg91oU9}=3JczohDjn8CrQ{s09STf5oM0e-9amwfi}PnBC!CPi z!<)J|0R9+!pP{0grC8j|-74 zNhT6YwQ;>z73&=YJxjL?5Mi-_Dnh(T7hSnhHt2%hTQAgj$Zpak=*2b;0#%Z&@+uGy z0#q-aFeJgFgqImA-oPz(V)O%|TOXL*!AXU&KO!%o(D#(PxYcm^siuLXaaG5JkpRsz zE%FS%Z6AiQ!{%PSXQjOsJh*V1Q(hT|uRS+th|Y5!RPl-*Sy{%;XJ66Hy!rwBs}=U$ z*#~#r!iw^|6nwT#SL+KU7!mDs$%t z`Tb!_(wffdz?M=D>FDSmJbv_uXGHX;8(cnL)!Z#&mZjCKkd&T9uEz6=-uA5(RjX>h zQejzN6%$8CMmpUubX((e93PVgw#9N^guaGhdM9ee$YfYfV^z^6ep+DzG_SCfinQWQ zfl#Hbq%AWF#+mCvb*C&FzdWsasT1*L*X7TkqqT97d{sq0;Cb%1BHZ}Wpp?IF3RJEB zVt%e!@$e_+yYM6BkIk^gJ$as1F?$eHh+q`3D%H)_v^mA72XL*hJLa{q)+|lmW;+c+ zxfv%UE&G1|8aU9co`J;1_a*%KAxA{7B`?(zt)F9q;eW-A*f*&}`iP)F7yOG{zc=AVH7&U*g!OBmQSH5i9m(&BKg(874N$s zgM=MGNCSY7ZU=@O2(YL8qn7Esk)o&ps4sr0Ffk!)fidwq+6~TWX!==(h z&K?61)a`V(?83%v+BjRmF~95P*5~?ERLqHQ&e1){K)^QoYFXuSU7RMia8vp%*U3{( zQMtr7cL~cWhRZ%``BdYK#Ky}BI(r{=N4t2@TDLaU%u?c=W@nI)mKXty$M>btf~!DTRNR0)CBg);ZDA_NyCn;rZ#6~WKiAe+TcHC8vxN1 z$gwU7SQ%AVKa6#DOx!Tq=?-MfOqWu2Dd+yL+nv`-K(y9dLP$I|K2O!Z=DTFMMzyah4(|%-Yz2tb$=?$pDwLY%eu8{-gS*m zbXKeR+zq#Hf3mSbXO)|_*8T5m0KL^-|Ao=k-2M}b>8!fleQlKo|9`MLi-}dXr6Yd# S|752FT*qBcA7#1tUHctEh#_SF literal 457869 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

^`^`O;Xd-)}nq$V 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
un)!zQhj*nt3?D@rcw8eJ!#l3M|=yn6y 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 Hd+V=TB#d@!5rDrLvUlm!AwMy>D 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 O7xcVpi diff --git a/assets/en/crawler.png b/assets/en/crawler.png index 0bd3560e84352c90da5efee64d5dab9f58ba8e88..dd2a554b18c61098da9fb6bd8bd234248debcc07 100644 GIT binary patch literal 80527 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%0AOq>=6_(8?F_Aiyil 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�M?=dSF`7&UM!#@?gLB?C@e6vM+!B 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 { - // 调用 crawlPage API 爬取 首页、国漫、电影 这三个页面 - const res = await myXCrawl.crawlPage([ - 'https://www.bilibili.com', - 'https://www.bilibili.com/guochuang', - 'https://www.bilibili.com/movie' - ]) + // 调用 crawlPage API 来爬取页面 + const res = await myXCrawl.crawlPage({ + targets: [ + 'https://www.airbnb.cn/s/experiences', + 'https://www.airbnb.cn/s/plus_homes' + ], + viewport: { width: 1920, height: 1080 } + }) // 存放图片 URL 到 targets const targets = [] - const elSelectorMap = ['.carousel-inner', '.chief-recom-item', '.bg-item'] + const elSelectorMap = ['._fig15y', '._aov0j6'] for (const item of res) { const { id } = item const { page } = item.data - // 获取页面轮播图片元素的 URL - const urls = await page.$$eval(`${elSelectorMap[id - 1]} img`, (imgEls) => - imgEls.map((item) => item.src) + // 等待页面加载完成 + await new Promise((r) => setTimeout(r, 300)) + + // 获取页面图片的 URL + const urls = await page!.$$eval( + `${elSelectorMap[id - 1]} img`, + (imgEls) => { + return imgEls.map((item) => item.src) + } ) targets.push(...urls) @@ -520,7 +530,7 @@ intervalTime 选项默认为 undefined 。若有设置值,则会在爬取目 可避免因一时问题而造成爬取失败,将会等待这一轮爬取目标结束后重新爬取目标。 -可以通过在 创建爬虫应用实例、进阶用法、详细目标 这三个地方设置失败重试次数。 +可以在 创建爬虫应用实例、进阶用法、详细目标 这三个地方设置。 ```js import xCrawl from 'x-crawl' @@ -538,7 +548,7 @@ maxRetry 属性决定要重试几次。 配合失败重试,自定义错误次数以及 HTTP 状态码为爬取目标自动轮换代理。 -可以通过在 创建爬虫应用实例、进阶用法、详细目标 这三个地方设置失败重试次数。 +可以在 创建爬虫应用实例、进阶用法、详细目标 这三个地方设置。 以 crawlPage 为例: @@ -625,6 +635,7 @@ myXCrawl.crawlPage({ ], // 为此次的目标统一设置指纹 fingerprints: [ + // 设备指纹 1 { maxWidth: 1024, maxHeight: 800, @@ -651,6 +662,44 @@ myXCrawl.crawlPage({ } ] } + }, + // 设备指纹 2 + { + platform: 'Windows', + mobile: 'random', + userAgent: { + value: + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59', + versions: [ + { + name: 'Chrome', + maxMajorVersion: 91, + minMajorVersion: 88, + maxMinorVersion: 10, + maxPatchVersion: 5615 + }, + { name: 'Safari', maxMinorVersion: 36, maxPatchVersion: 2333 }, + { name: 'Edg', maxMinorVersion: 10, maxPatchVersion: 864 } + ] + } + }, + // 设备指纹 3 + { + platform: 'Windows', + mobile: 'random', + userAgent: { + value: + 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0', + versions: [ + { + name: 'Firefox', + maxMajorVersion: 47, + minMajorVersion: 43, + maxMinorVersion: 10, + maxPatchVersion: 5000 + } + ] + } } ] }) @@ -1693,4 +1742,10 @@ export interface AnyObject extends Object { ## 更多 -如果您有 **问题 、需求、好的建议** 请在 https://github.com/coder-hxl/x-crawl/issues 中提 **Issues** 。 +### 社区 + +**GitHub Discussions:** 可以通过 [GitHub Discussions](https://github.com/coder-hxl/x-crawl/discussions) 进行讨论。 + +### Issues + +如果您有 **问题 、需求、好的建议** 可以在 [GitHub Issues](https://github.com/coder-hxl/x-crawl/issues) 中提 **Issues** 。 diff --git a/publish/README.md b/publish/README.md index 7b935236..1afd81ce 100644 --- a/publish/README.md +++ b/publish/README.md @@ -51,7 +51,7 @@ The crawlPage API has built-in [puppeteer](https://github.com/puppeteer/puppetee - [Config Priority](#Config-Priority) - [Interval Time](#Interval-Time) - [Fail Retry](#Fail-Retry) - - [Rotate Proxy](#Rotate Proxy) + - [Rotate Proxy](#Rotate-Proxy) - [Custom Device Fingerprint](#Custom-Device-Fingerprint) - [Priority Queue](#Priority-Queue) - [About Results](#About-Results) @@ -115,6 +115,8 @@ The crawlPage API has built-in [puppeteer](https://github.com/puppeteer/puppetee - [API Other](#API-Other) - [AnyObject](#AnyObject) - [More](#More) + - [Community](#Community) + - [Issues](#Issues) ## Install @@ -126,14 +128,14 @@ npm install x-crawl ## Example -Take some pictures of Airbnb hawaii experience and Plus listings automatically every day as an example: +Take the automatic acquisition of some photos of experiences and homes around the world every day as an example: ```js // 1.Import module ES/CJS import xCrawl from 'x-crawl' // 2.Create a crawler instance -const myXCrawl = xCrawl({ maxRetry: 3, intervalTime: { max: 3000, min: 2000 } }) +const myXCrawl = xCrawl({maxRetry: 3,intervalTime: { max: 3000, min: 2000 }}) // 3.Set the crawling task /* @@ -142,23 +144,31 @@ const myXCrawl = xCrawl({ maxRetry: 3, intervalTime: { max: 3000, min: 2000 } }) */ myXCrawl.startPolling({ d: 1 }, async (count, stopPolling) => { // Call crawlPage API to crawl Page - const res = await myXCrawl.crawlPage([ - 'https://zh.airbnb.com/s/hawaii/experiences', - 'https://zh.airbnb.com/s/hawaii/plus_homes' - ]) + const res = await myXCrawl.crawlPage({ + targets: [ + 'https://www.airbnb.cn/s/experiences', + 'https://www.airbnb.cn/s/plus_homes' + ], + viewport: { width: 1920, height: 1080 } + }) // Store the image URL to targets const targets = [] - const elSelectorMap = ['.c14whb16', '.a1stauiv'] + const elSelectorMap = ['._fig15y', '._aov0j6'] for (const item of res) { const { id } = item const { page } = item.data - // Gets the URL of the page's wheel image element - const boxHandle = await page.$(elSelectorMap[id - 1]) - const urls = await boxHandle!.$$eval('picture img', (imgEls) => { - return imgEls.map((item) => item.src) - }) + // Wait for the page to load + await new Promise((r) => setTimeout(r, 300)) + + // Gets the URL of the page image + const urls = await page!.$$eval( + `${elSelectorMap[id - 1]} img`, + (imgEls) => { + return imgEls.map((item) => item.src) + } + ) targets.push(...urls) // Close page @@ -528,7 +538,7 @@ The intervalTime option defaults to undefined . If there is a setting value, it It can avoid crawling failure due to temporary problems, and will wait for the end of this round of crawling targets to crawl again. -The number of failed retries can be set by creating crawler application instance, advanced usage, and detailed target. +You can create crawler application instance, advanced usage, detailed target these three places Settings. ```js import xCrawl from 'x-crawl' @@ -546,7 +556,7 @@ The maxRetry attribute determines how many times to retry. With failed retries, custom error times and HTTP status codes, the proxy is automatically rotated for crawling targets. -You can set the number of failed retries in the three places of creating a crawler application instance, advanced usage, and detailed goals. +You can create crawler application instance, advanced usage, detailed target these three places Settings. Take crawlPage as an example: @@ -611,9 +621,9 @@ myXCrawl.crawlPage({ 'https://www.example.com/page-1', 'https://www.example.com/page-2', 'https://www.example.com/page-3', - // Unfingerprint for this target + // Cancel the fingerprint for this target { url: 'https://www.example.com/page-4', fingerprint: null }, - // Set the fingerprint individually for this target + // Set a separate fingerprint for this target { url: 'https://www.example.com/page-5', fingerprint: { @@ -631,8 +641,9 @@ myXCrawl.crawlPage({ } } ], - // Set the fingerprint uniformly for this target + // Set fingerprints uniformly for this target fingerprints: [ + // Device fingerprint 1 { maxWidth: 1024, maxHeight: 800, @@ -644,7 +655,7 @@ myXCrawl.crawlPage({ versions: [ { name: 'Chrome', - // browser version + // Browser version maxMajorVersion: 112, minMajorVersion: 100, maxMinorVersion: 20, @@ -659,6 +670,44 @@ myXCrawl.crawlPage({ } ] } + }, + // Device fingerprint 2 + { + platform: 'Windows', + mobile: 'random', + userAgent: { + value: + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59', + versions: [ + { + name: 'Chrome', + maxMajorVersion: 91, + minMajorVersion: 88, + maxMinorVersion: 10, + maxPatchVersion: 5615 + }, + { name: 'Safari', maxMinorVersion: 36, maxPatchVersion: 2333 }, + { name: 'Edg', maxMinorVersion: 10, maxPatchVersion: 864 } + ] + } + }, + // Device fingerprint 3 + { + platform: 'Windows', + mobile: 'random', + userAgent: { + value: + 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0', + versions: [ + { + name: 'Firefox', + maxMajorVersion: 47, + minMajorVersion: 43, + maxMinorVersion: 10, + maxPatchVersion: 5000 + } + ] + } } ] }) @@ -1702,4 +1751,10 @@ export interface AnyObject extends Object { ## More -If you have **problems, needs, good suggestions** please raise **Issues** in https://github.com/coder-hxl/x-crawl/issues. +### Community + +**GitHub Discussions:** May be discussed through [GitHub Discussions](https://github.com/coder-hxl/x-crawl/discussions). + +### Issues + +If you have questions, needs, or good suggestions, you can raise them at [GitHub Issues](https://github.com/coder-hxl/x-crawl/issues). From dae3d737aff2fc528d8c813b7d9e672109cd275b Mon Sep 17 00:00:00 2001 From: coderhxl Date: Wed, 26 Apr 2023 10:22:27 +0800 Subject: [PATCH 17/17] Feat: Update version --- CHANGELOG.md | 39 +- pnpm-lock.yaml | 1440 +++++++++++++++++++++--------------------- publish/package.json | 2 +- 3 files changed, 765 insertions(+), 716 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a070cf3d..8a67392e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,46 @@ -# [v7.0.0](https://github.com/coder-hxl/x-crawl/compare/v6.0.1...v7.0.0) (2023-04-24) +# [v7.0.0](https://github.com/coder-hxl/x-crawl/compare/v6.0.1...v7.0.0) (2023-04-26) + +### 🚨 Breaking Changes + +- Fingerprint upgrade: + - The fingerprint of the advanced writing method is renamed to fingerprints, which is an array writing method, which stores objects of the DetailTargetFingerprintCommon type, which is convenient for customization. Internally, the objects inside will be randomly assigned to the target. + - Adjustment of crawlPage fingerprint options: the maximum width and height of the fingerprint configuration of advanced writing and detailed target writing are changed to optional. +- Proxy upgrade: create a crawler instance, change the proxy of the advanced writing method and the detailed target writing method to the object writing method, with three attributes: urls, switchByHttpStatus and switchByErrorCount, urls can set multiple proxy URLs, and the internal default uses the first one first, switchByHttpStatus Set which non-compliant response status codes need to switch the proxy, and switchByErrorCount sets how many times the proxy needs to be switched when errors such as timeouts arrive. The proxy rotation feature needs to be used with error retries. +- Return value type adjustment: CrawlCommonRes, CrawlPageSingleRes, CrawlDataSingleRes and CrawlFileSingleRes are renamed to CrawlCommonResult, CrawlPageSingleResult, CrawlDataSingleResult and CrawlFileSingleResult respectively + +### 🚀 Features + +- It is possible to cancel the configuration of the upper-level unified setting by setting null in the option. +- The userAgent option in DetailTargetFingerprintCommon overrides the object notation and allows customization of the maximum and minimum values of the major version, minor version, and revision number inside. Each crawl target gets a new userAgent . +- A new proxyDetails property is added to the crawling results to record the proxy status. +- Added 'random' attribute value to mobile option of fingerprint configuration, allowing internal randomization. +- Terminal prompts are simplified and color adjusted. + +### 🐞 Bug fixes + +- Unable to create multiple levels of non-existent folders on linux systems. + +--- ### 🚨 重大改变 -- 进阶写法的配置指纹改用数组写法,里面存放 DetailTargetFingerprintCommon 类型的对象,方便定制。内部会将里面的对象随机分配给目标。 -- crawlPage 的进阶写法和详细目标写法的指纹配置的最大宽高改为可选项。 -- 创建爬虫实例、进阶写法以及详细目标写法的 proxy 更改为对象写法, 拥有 urls、switchByHttpStatus 以及 switchByErrorCount 这三个属性,urls 可以设置多个代理 URL ,内部默认先采用第一个,switchByHttpStatus 设置遇到哪些不符合的响应状态码需要切换代理,switchByErrorCount 设置像超时等错误时到达多少次需要切换代理。该代理轮换功能需要配合错误重试才能使用。 +- 指纹升级: + - 进阶写法的 fingerprint 改名为 fingerprints ,为数组写法,里面存放 DetailTargetFingerprintCommon 类型的对象,方便定制。内部会将里面的对象随机分配给目标。 + - crawlPage 的指纹选项调整:进阶写法和详细目标写法的指纹配置的最大宽高改为可选项。 +- 代理升级:创建爬虫实例、进阶写法以及详细目标写法的 proxy 更改为对象写法, 拥有 urls、switchByHttpStatus 以及 switchByErrorCount 这三个属性,urls 可以设置多个代理 URL ,内部默认先采用第一个,switchByHttpStatus 设置遇到哪些不符合的响应状态码需要切换代理,switchByErrorCount 设置像超时等错误时到达多少次需要切换代理。该代理轮换功能需要配合错误重试才能使用。 +- 返回值类型调整:CrawlCommonRes、CrawlPageSingleRes、CrawlDataSingleRes 以及 CrawlFileSingleRes 分别更名为 CrawlCommonResult、CrawlPageSingleResult、CrawlDataSingleResult 以及 CrawlFileSingleResult ### 🚀 特征 +- 可以通过在选项设置为 null 取消上级统一设置的配置。 - DetailTargetFingerprintCommon 里的 userAgent 选项改写对象写法,并允许定制里面的主版本、次版本以及修订号的最大值和最小值。每个爬取目标都会获取一个新的 userAgent 。 +- 爬取结果新增 proxyDetails 属性,记录代理状态。 - 指纹配置的 mobile 选项添加 'random' 属性值,允许由内部随机决定。 +- 终端提示信息进行简化以及颜色调整。 + +### 🐞 漏洞修复 + +- 在 linux 系统上无法创建多级不存在的文件夹。 # [v6.0.1](https://github.com/coder-hxl/x-crawl/compare/v6.0.0...v6.0.1) (2023-04-21) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 55dd1e15..c35ba264 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,54 +1,72 @@ -lockfileVersion: 5.4 - -specifiers: - '@babel/core': ^7.20.12 - '@babel/preset-env': ^7.20.2 - '@jest/globals': ^29.3.1 - '@rollup/plugin-babel': ^6.0.3 - '@rollup/plugin-run': ^3.0.1 - '@rollup/plugin-terser': ^0.4.0 - '@types/node': ^18.11.18 - '@typescript-eslint/eslint-plugin': ^5.48.2 - '@typescript-eslint/parser': ^5.48.2 - chalk: 4.1.2 - eslint: ^8.32.0 - https-proxy-agent: ^5.0.1 - jest: ^29.3.1 - prettier: ^2.8.3 - puppeteer: 19.10.0 - rollup: ^3.10.1 - rollup-plugin-typescript2: ^0.34.1 - ts-jest: ^29.0.5 - typescript: 5.0.2 - x-crawl: 'link:' +lockfileVersion: '6.0' dependencies: - chalk: 4.1.2 - https-proxy-agent: 5.0.1 - puppeteer: 19.10.0_typescript@5.0.2 - x-crawl: 'link:' + chalk: + specifier: 4.1.2 + version: 4.1.2 + https-proxy-agent: + specifier: ^5.0.1 + version: 5.0.1 + puppeteer: + specifier: 19.10.0 + version: 19.10.0(typescript@5.0.2) + x-crawl: + specifier: 'link:' + version: 'link:' devDependencies: - '@babel/core': 7.20.12 - '@babel/preset-env': 7.20.2_@babel+core@7.20.12 - '@jest/globals': 29.3.1 - '@rollup/plugin-babel': 6.0.3_j5gl3ppangg6ywsqfpneorhloy - '@rollup/plugin-run': 3.0.1_rollup@3.10.1 - '@rollup/plugin-terser': 0.4.0_rollup@3.10.1 - '@types/node': 18.11.18 - '@typescript-eslint/eslint-plugin': 5.48.2_xcchhpd3ezyqg4jn72wfkiwhri - '@typescript-eslint/parser': 5.48.2_pydb3hde2stcjsf742jarbqbry - eslint: 8.32.0 - jest: 29.3.1_@types+node@18.11.18 - prettier: 2.8.3 - rollup: 3.10.1 - rollup-plugin-typescript2: 0.34.1_xzkd7boxfqp7uxzhulfcfesazm - ts-jest: 29.0.5_oi7nmolcnmyqply4ewqwuryc6q - typescript: 5.0.2 + '@babel/core': + specifier: ^7.20.12 + version: 7.20.12 + '@babel/preset-env': + specifier: ^7.20.2 + version: 7.20.2(@babel/core@7.20.12) + '@jest/globals': + specifier: ^29.3.1 + version: 29.3.1 + '@rollup/plugin-babel': + specifier: ^6.0.3 + version: 6.0.3(@babel/core@7.20.12)(rollup@3.10.1) + '@rollup/plugin-run': + specifier: ^3.0.1 + version: 3.0.1(rollup@3.10.1) + '@rollup/plugin-terser': + specifier: ^0.4.0 + version: 0.4.0(rollup@3.10.1) + '@types/node': + specifier: ^18.11.18 + version: 18.11.18 + '@typescript-eslint/eslint-plugin': + specifier: ^5.48.2 + version: 5.48.2(@typescript-eslint/parser@5.48.2)(eslint@8.32.0)(typescript@5.0.2) + '@typescript-eslint/parser': + specifier: ^5.48.2 + version: 5.48.2(eslint@8.32.0)(typescript@5.0.2) + eslint: + specifier: ^8.32.0 + version: 8.32.0 + jest: + specifier: ^29.3.1 + version: 29.3.1(@types/node@18.11.18) + prettier: + specifier: ^2.8.3 + version: 2.8.3 + rollup: + specifier: ^3.10.1 + version: 3.10.1 + rollup-plugin-typescript2: + specifier: ^0.34.1 + version: 0.34.1(rollup@3.10.1)(typescript@5.0.2) + ts-jest: + specifier: ^29.0.5 + version: 29.0.5(@babel/core@7.20.12)(jest@29.3.1)(typescript@5.0.2) + typescript: + specifier: 5.0.2 + version: 5.0.2 packages: - /@ampproject/remapping/2.2.0: + /@ampproject/remapping@2.2.0: resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} engines: {node: '>=6.0.0'} dependencies: @@ -56,25 +74,25 @@ packages: '@jridgewell/trace-mapping': 0.3.17 dev: true - /@babel/code-frame/7.18.6: + /@babel/code-frame@7.18.6: resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.18.6 - /@babel/compat-data/7.20.10: + /@babel/compat-data@7.20.10: resolution: {integrity: sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==} engines: {node: '>=6.9.0'} dev: true - /@babel/core/7.20.12: + /@babel/core@7.20.12: resolution: {integrity: sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.0 '@babel/code-frame': 7.18.6 '@babel/generator': 7.20.7 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.20.12) '@babel/helper-module-transforms': 7.20.11 '@babel/helpers': 7.20.13 '@babel/parser': 7.20.13 @@ -90,7 +108,7 @@ packages: - supports-color dev: true - /@babel/generator/7.20.7: + /@babel/generator@7.20.7: resolution: {integrity: sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==} engines: {node: '>=6.9.0'} dependencies: @@ -99,14 +117,14 @@ packages: jsesc: 2.5.2 dev: true - /@babel/helper-annotate-as-pure/7.18.6: + /@babel/helper-annotate-as-pure@7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 dev: true - /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: + /@babel/helper-builder-binary-assignment-operator-visitor@7.18.9: resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} engines: {node: '>=6.9.0'} dependencies: @@ -114,7 +132,7 @@ packages: '@babel/types': 7.20.7 dev: true - /@babel/helper-compilation-targets/7.20.7_@babel+core@7.20.12: + /@babel/helper-compilation-targets@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -128,7 +146,7 @@ packages: semver: 6.3.0 dev: true - /@babel/helper-create-class-features-plugin/7.20.12_@babel+core@7.20.12: + /@babel/helper-create-class-features-plugin@7.20.12(@babel/core@7.20.12): resolution: {integrity: sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -147,7 +165,7 @@ packages: - supports-color dev: true - /@babel/helper-create-regexp-features-plugin/7.20.5_@babel+core@7.20.12: + /@babel/helper-create-regexp-features-plugin@7.20.5(@babel/core@7.20.12): resolution: {integrity: sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==} engines: {node: '>=6.9.0'} peerDependencies: @@ -158,13 +176,13 @@ packages: regexpu-core: 5.2.2 dev: true - /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.20.12: + /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.20.12): resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} peerDependencies: '@babel/core': ^7.4.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.20.12) '@babel/helper-plugin-utils': 7.20.2 debug: 4.3.4 lodash.debounce: 4.0.8 @@ -174,19 +192,19 @@ packages: - supports-color dev: true - /@babel/helper-environment-visitor/7.18.9: + /@babel/helper-environment-visitor@7.18.9: resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-explode-assignable-expression/7.18.6: + /@babel/helper-explode-assignable-expression@7.18.6: resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 dev: true - /@babel/helper-function-name/7.19.0: + /@babel/helper-function-name@7.19.0: resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} engines: {node: '>=6.9.0'} dependencies: @@ -194,28 +212,28 @@ packages: '@babel/types': 7.20.7 dev: true - /@babel/helper-hoist-variables/7.18.6: + /@babel/helper-hoist-variables@7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 dev: true - /@babel/helper-member-expression-to-functions/7.20.7: + /@babel/helper-member-expression-to-functions@7.20.7: resolution: {integrity: sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 dev: true - /@babel/helper-module-imports/7.18.6: + /@babel/helper-module-imports@7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 dev: true - /@babel/helper-module-transforms/7.20.11: + /@babel/helper-module-transforms@7.20.11: resolution: {integrity: sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==} engines: {node: '>=6.9.0'} dependencies: @@ -231,19 +249,19 @@ packages: - supports-color dev: true - /@babel/helper-optimise-call-expression/7.18.6: + /@babel/helper-optimise-call-expression@7.18.6: resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 dev: true - /@babel/helper-plugin-utils/7.20.2: + /@babel/helper-plugin-utils@7.20.2: resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.20.12: + /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.20.12): resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -258,7 +276,7 @@ packages: - supports-color dev: true - /@babel/helper-replace-supers/7.20.7: + /@babel/helper-replace-supers@7.20.7: resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==} engines: {node: '>=6.9.0'} dependencies: @@ -272,42 +290,42 @@ packages: - supports-color dev: true - /@babel/helper-simple-access/7.20.2: + /@babel/helper-simple-access@7.20.2: resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 dev: true - /@babel/helper-skip-transparent-expression-wrappers/7.20.0: + /@babel/helper-skip-transparent-expression-wrappers@7.20.0: resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 dev: true - /@babel/helper-split-export-declaration/7.18.6: + /@babel/helper-split-export-declaration@7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 dev: true - /@babel/helper-string-parser/7.19.4: + /@babel/helper-string-parser@7.19.4: resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier/7.19.1: + /@babel/helper-validator-identifier@7.19.1: resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option/7.18.6: + /@babel/helper-validator-option@7.18.6: resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-wrap-function/7.20.5: + /@babel/helper-wrap-function@7.20.5: resolution: {integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==} engines: {node: '>=6.9.0'} dependencies: @@ -319,7 +337,7 @@ packages: - supports-color dev: true - /@babel/helpers/7.20.13: + /@babel/helpers@7.20.13: resolution: {integrity: sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==} engines: {node: '>=6.9.0'} dependencies: @@ -330,7 +348,7 @@ packages: - supports-color dev: true - /@babel/highlight/7.18.6: + /@babel/highlight@7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} dependencies: @@ -338,7 +356,7 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser/7.20.13: + /@babel/parser@7.20.13: resolution: {integrity: sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==} engines: {node: '>=6.0.0'} hasBin: true @@ -346,7 +364,7 @@ packages: '@babel/types': 7.20.7 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.20.12: + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -356,7 +374,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.20.7_@babel+core@7.20.12: + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -365,10 +383,10 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-proposal-optional-chaining': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-proposal-optional-chaining': 7.20.7(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-async-generator-functions/7.20.7_@babel+core@7.20.12: + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -377,40 +395,40 @@ packages: '@babel/core': 7.20.12 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.12 + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.20.12) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.20.12) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.20.12 + '@babel/helper-create-class-features-plugin': 7.20.12(@babel/core@7.20.12) '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-static-block/7.20.7_@babel+core@7.20.12: + /@babel/plugin-proposal-class-static-block@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.20.12 + '@babel/helper-create-class-features-plugin': 7.20.12(@babel/core@7.20.12) '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.12 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.20.12) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -418,10 +436,10 @@ packages: dependencies: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.20.12: + /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.20.12): resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -429,10 +447,10 @@ packages: dependencies: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -440,10 +458,10 @@ packages: dependencies: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-logical-assignment-operators/7.20.7_@babel+core@7.20.12: + /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} engines: {node: '>=6.9.0'} peerDependencies: @@ -451,10 +469,10 @@ packages: dependencies: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.12 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -462,10 +480,10 @@ packages: dependencies: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -473,10 +491,10 @@ packages: dependencies: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.12 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-object-rest-spread/7.20.7_@babel+core@7.20.12: + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -484,13 +502,13 @@ packages: dependencies: '@babel/compat-data': 7.20.10 '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.20.12) '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-transform-parameters': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-transform-parameters': 7.20.7(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -498,10 +516,10 @@ packages: dependencies: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-optional-chaining/7.20.7_@babel+core@7.20.12: + /@babel/plugin-proposal-optional-chaining@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -510,23 +528,23 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.20.12 + '@babel/helper-create-class-features-plugin': 7.20.12(@babel/core@7.20.12) '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-private-property-in-object/7.20.5_@babel+core@7.20.12: + /@babel/plugin-proposal-private-property-in-object@7.20.5(@babel/core@7.20.12): resolution: {integrity: sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -534,25 +552,25 @@ packages: dependencies: '@babel/core': 7.20.12 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.20.12 + '@babel/helper-create-class-features-plugin': 7.20.12(@babel/core@7.20.12) '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.12 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.20.12) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.20.12: + /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} engines: {node: '>=4'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/helper-create-regexp-features-plugin': 7.20.5(@babel/core@7.20.12) '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.20.12: + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.20.12): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -561,7 +579,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.20.12): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -570,7 +588,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.20.12: + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.20.12): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -579,7 +597,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.20.12: + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.20.12): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -589,7 +607,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.20.12): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -598,7 +616,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.20.12): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -607,7 +625,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.20.12: + /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.20.12): resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -617,7 +635,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.20.12: + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.20.12): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -626,7 +644,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.20.12): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -635,7 +653,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.12: + /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -645,7 +663,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.20.12: + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.20.12): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -654,7 +672,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.20.12): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -663,7 +681,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.20.12: + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.20.12): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -672,7 +690,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.20.12): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -681,7 +699,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.20.12): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -690,7 +708,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.20.12: + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.20.12): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -699,7 +717,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.20.12: + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.20.12): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -709,7 +727,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.20.12: + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.20.12): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -719,7 +737,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.20.12: + /@babel/plugin-syntax-typescript@7.20.0(@babel/core@7.20.12): resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -729,7 +747,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-arrow-functions/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-arrow-functions@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -739,7 +757,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-async-to-generator/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -748,12 +766,12 @@ packages: '@babel/core': 7.20.12 '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.12 + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.20.12) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -763,7 +781,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-block-scoping/7.20.11_@babel+core@7.20.12: + /@babel/plugin-transform-block-scoping@7.20.11(@babel/core@7.20.12): resolution: {integrity: sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -773,7 +791,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-classes/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-classes@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -781,7 +799,7 @@ packages: dependencies: '@babel/core': 7.20.12 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.20.12) '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.19.0 '@babel/helper-optimise-call-expression': 7.18.6 @@ -793,7 +811,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-computed-properties/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-computed-properties@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -804,7 +822,7 @@ packages: '@babel/template': 7.20.7 dev: true - /@babel/plugin-transform-destructuring/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-destructuring@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -814,18 +832,18 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/helper-create-regexp-features-plugin': 7.20.5(@babel/core@7.20.12) '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.20.12: + /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.20.12): resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -835,7 +853,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -846,7 +864,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.20.12: + /@babel/plugin-transform-for-of@7.18.8(@babel/core@7.20.12): resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -856,19 +874,19 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.20.12: + /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.20.12): resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.20.12) '@babel/helper-function-name': 7.19.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-literals/7.18.9_@babel+core@7.20.12: + /@babel/plugin-transform-literals@7.18.9(@babel/core@7.20.12): resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -878,7 +896,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -888,7 +906,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-modules-amd/7.20.11_@babel+core@7.20.12: + /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.20.12): resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} engines: {node: '>=6.9.0'} peerDependencies: @@ -901,7 +919,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-commonjs/7.20.11_@babel+core@7.20.12: + /@babel/plugin-transform-modules-commonjs@7.20.11(@babel/core@7.20.12): resolution: {integrity: sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -915,7 +933,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-systemjs/7.20.11_@babel+core@7.20.12: + /@babel/plugin-transform-modules-systemjs@7.20.11(@babel/core@7.20.12): resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -930,7 +948,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -943,18 +961,18 @@ packages: - supports-color dev: true - /@babel/plugin-transform-named-capturing-groups-regex/7.20.5_@babel+core@7.20.12: + /@babel/plugin-transform-named-capturing-groups-regex@7.20.5(@babel/core@7.20.12): resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/helper-create-regexp-features-plugin': 7.20.5(@babel/core@7.20.12) '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -964,7 +982,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -977,7 +995,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-parameters/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-parameters@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -987,7 +1005,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -997,7 +1015,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-regenerator/7.20.5_@babel+core@7.20.12: + /@babel/plugin-transform-regenerator@7.20.5(@babel/core@7.20.12): resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1008,7 +1026,7 @@ packages: regenerator-transform: 0.15.1 dev: true - /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1018,7 +1036,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1028,7 +1046,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-spread/7.20.7_@babel+core@7.20.12: + /@babel/plugin-transform-spread@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1039,7 +1057,7 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 dev: true - /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1049,7 +1067,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.20.12: + /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.20.12): resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1059,7 +1077,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.20.12: + /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.20.12): resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1069,7 +1087,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.20.12: + /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.20.12): resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1079,18 +1097,18 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/helper-create-regexp-features-plugin': 7.20.5(@babel/core@7.20.12) '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/preset-env/7.20.2_@babel+core@7.20.12: + /@babel/preset-env@7.20.2(@babel/core@7.20.12): resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1098,105 +1116,105 @@ packages: dependencies: '@babel/compat-data': 7.20.10 '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.20.12) '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-async-generator-functions': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-class-static-block': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-logical-assignment-operators': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-object-rest-spread': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-optional-chaining': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-proposal-private-property-in-object': 7.20.5_@babel+core@7.20.12 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.12 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.12 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.12 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-import-assertions': 7.20.0_@babel+core@7.20.12 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.12 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.12 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.12 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.12 - '@babel/plugin-transform-arrow-functions': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-async-to-generator': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-block-scoping': 7.20.11_@babel+core@7.20.12 - '@babel/plugin-transform-classes': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-computed-properties': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-destructuring': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.20.12 - '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-modules-amd': 7.20.11_@babel+core@7.20.12 - '@babel/plugin-transform-modules-commonjs': 7.20.11_@babel+core@7.20.12 - '@babel/plugin-transform-modules-systemjs': 7.20.11_@babel+core@7.20.12 - '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5_@babel+core@7.20.12 - '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-parameters': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-regenerator': 7.20.5_@babel+core@7.20.12 - '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-spread': 7.20.7_@babel+core@7.20.12 - '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.20.12 - '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.20.12 - '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.20.12 - '@babel/preset-modules': 0.1.5_@babel+core@7.20.12 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-proposal-class-static-block': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.20.12) + '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-proposal-optional-chaining': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-proposal-private-property-in-object': 7.20.5(@babel/core@7.20.12) + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.20.12) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.20.12) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.20.12) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.20.12) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.20.12) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.20.12) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.20.12) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.20.12) + '@babel/plugin-transform-arrow-functions': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-transform-async-to-generator': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-block-scoping': 7.20.11(@babel/core@7.20.12) + '@babel/plugin-transform-classes': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-transform-computed-properties': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-transform-destructuring': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.20.12) + '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-for-of': 7.18.8(@babel/core@7.20.12) + '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.20.12) + '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.20.12) + '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-modules-amd': 7.20.11(@babel/core@7.20.12) + '@babel/plugin-transform-modules-commonjs': 7.20.11(@babel/core@7.20.12) + '@babel/plugin-transform-modules-systemjs': 7.20.11(@babel/core@7.20.12) + '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5(@babel/core@7.20.12) + '@babel/plugin-transform-new-target': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-parameters': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-regenerator': 7.20.5(@babel/core@7.20.12) + '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-spread': 7.20.7(@babel/core@7.20.12) + '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.20.12) + '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.20.12) + '@babel/plugin-transform-unicode-escapes': 7.18.10(@babel/core@7.20.12) + '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.20.12) + '@babel/preset-modules': 0.1.5(@babel/core@7.20.12) '@babel/types': 7.20.7 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.20.12 - babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.20.12 - babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.20.12 + babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.20.12) + babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.20.12) + babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.20.12) core-js-compat: 3.27.2 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules/0.1.5_@babel+core@7.20.12: + /@babel/preset-modules@0.1.5(@babel/core@7.20.12): resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.20.12) '@babel/types': 7.20.7 esutils: 2.0.3 dev: true - /@babel/runtime/7.20.13: + /@babel/runtime@7.20.13: resolution: {integrity: sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 dev: true - /@babel/template/7.20.7: + /@babel/template@7.20.7: resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} engines: {node: '>=6.9.0'} dependencies: @@ -1205,7 +1223,7 @@ packages: '@babel/types': 7.20.7 dev: true - /@babel/traverse/7.20.13: + /@babel/traverse@7.20.13: resolution: {integrity: sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==} engines: {node: '>=6.9.0'} dependencies: @@ -1223,7 +1241,7 @@ packages: - supports-color dev: true - /@babel/types/7.20.7: + /@babel/types@7.20.7: resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==} engines: {node: '>=6.9.0'} dependencies: @@ -1232,11 +1250,11 @@ packages: to-fast-properties: 2.0.0 dev: true - /@bcoe/v8-coverage/0.2.3: + /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@eslint/eslintrc/1.4.1: + /@eslint/eslintrc@1.4.1: resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -1253,7 +1271,7 @@ packages: - supports-color dev: true - /@humanwhocodes/config-array/0.11.8: + /@humanwhocodes/config-array@0.11.8: resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} engines: {node: '>=10.10.0'} dependencies: @@ -1264,16 +1282,16 @@ packages: - supports-color dev: true - /@humanwhocodes/module-importer/1.0.1: + /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema/1.2.1: + /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@istanbuljs/load-nyc-config/1.1.0: + /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} dependencies: @@ -1284,12 +1302,12 @@ packages: resolve-from: 5.0.0 dev: true - /@istanbuljs/schema/0.1.3: + /@istanbuljs/schema@0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} dev: true - /@jest/console/29.3.1: + /@jest/console@29.3.1: resolution: {integrity: sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -1301,7 +1319,7 @@ packages: slash: 3.0.0 dev: true - /@jest/core/29.3.1: + /@jest/core@29.3.1: resolution: {integrity: sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -1322,7 +1340,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.10 jest-changed-files: 29.2.0 - jest-config: 29.3.1_@types+node@18.15.10 + jest-config: 29.3.1(@types/node@18.15.10) jest-haste-map: 29.3.1 jest-message-util: 29.3.1 jest-regex-util: 29.2.0 @@ -1343,7 +1361,7 @@ packages: - ts-node dev: true - /@jest/environment/29.3.1: + /@jest/environment@29.3.1: resolution: {integrity: sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -1353,14 +1371,14 @@ packages: jest-mock: 29.3.1 dev: true - /@jest/expect-utils/29.3.1: + /@jest/expect-utils@29.3.1: resolution: {integrity: sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.2.0 dev: true - /@jest/expect/29.3.1: + /@jest/expect@29.3.1: resolution: {integrity: sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -1370,7 +1388,7 @@ packages: - supports-color dev: true - /@jest/fake-timers/29.3.1: + /@jest/fake-timers@29.3.1: resolution: {integrity: sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -1382,7 +1400,7 @@ packages: jest-util: 29.3.1 dev: true - /@jest/globals/29.3.1: + /@jest/globals@29.3.1: resolution: {integrity: sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -1394,7 +1412,7 @@ packages: - supports-color dev: true - /@jest/reporters/29.3.1: + /@jest/reporters@29.3.1: resolution: {integrity: sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -1431,14 +1449,14 @@ packages: - supports-color dev: true - /@jest/schemas/29.0.0: + /@jest/schemas@29.0.0: resolution: {integrity: sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@sinclair/typebox': 0.24.51 dev: true - /@jest/source-map/29.2.0: + /@jest/source-map@29.2.0: resolution: {integrity: sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -1447,7 +1465,7 @@ packages: graceful-fs: 4.2.10 dev: true - /@jest/test-result/29.3.1: + /@jest/test-result@29.3.1: resolution: {integrity: sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -1457,7 +1475,7 @@ packages: collect-v8-coverage: 1.0.1 dev: true - /@jest/test-sequencer/29.3.1: + /@jest/test-sequencer@29.3.1: resolution: {integrity: sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -1467,7 +1485,7 @@ packages: slash: 3.0.0 dev: true - /@jest/transform/29.3.1: + /@jest/transform@29.3.1: resolution: {integrity: sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -1490,7 +1508,7 @@ packages: - supports-color dev: true - /@jest/types/29.3.1: + /@jest/types@29.3.1: resolution: {integrity: sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -1502,7 +1520,7 @@ packages: chalk: 4.1.2 dev: true - /@jridgewell/gen-mapping/0.1.1: + /@jridgewell/gen-mapping@0.1.1: resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} engines: {node: '>=6.0.0'} dependencies: @@ -1510,7 +1528,7 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@jridgewell/gen-mapping/0.3.2: + /@jridgewell/gen-mapping@0.3.2: resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} engines: {node: '>=6.0.0'} dependencies: @@ -1519,35 +1537,35 @@ packages: '@jridgewell/trace-mapping': 0.3.17 dev: true - /@jridgewell/resolve-uri/3.1.0: + /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/set-array/1.1.2: + /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/source-map/0.3.2: + /@jridgewell/source-map@0.3.2: resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==} dependencies: '@jridgewell/gen-mapping': 0.3.2 '@jridgewell/trace-mapping': 0.3.17 dev: true - /@jridgewell/sourcemap-codec/1.4.14: + /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true - /@jridgewell/trace-mapping/0.3.17: + /@jridgewell/trace-mapping@0.3.17: resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@nodelib/fs.scandir/2.1.5: + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} dependencies: @@ -1555,12 +1573,12 @@ packages: run-parallel: 1.2.0 dev: true - /@nodelib/fs.stat/2.0.5: + /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} dev: true - /@nodelib/fs.walk/1.2.8: + /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} dependencies: @@ -1568,7 +1586,7 @@ packages: fastq: 1.15.0 dev: true - /@puppeteer/browsers/0.4.1_typescript@5.0.2: + /@puppeteer/browsers@0.4.1(typescript@5.0.2): resolution: {integrity: sha512-4IICvy1McAkT/HyNZHIs7sp8ngBX1dmO0TPQ+FWq9ATQMqI8p+Ulm5A3kS2wYDh5HDHHkYrrETOu6rlj64VuTw==} engines: {node: '>=14.1.0'} hasBin: true @@ -1591,7 +1609,7 @@ packages: - supports-color dev: false - /@rollup/plugin-babel/6.0.3_j5gl3ppangg6ywsqfpneorhloy: + /@rollup/plugin-babel@6.0.3(@babel/core@7.20.12)(rollup@3.10.1): resolution: {integrity: sha512-fKImZKppa1A/gX73eg4JGo+8kQr/q1HBQaCGKECZ0v4YBBv3lFqi14+7xyApECzvkLTHCifx+7ntcrvtBIRcpg==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1606,11 +1624,11 @@ packages: dependencies: '@babel/core': 7.20.12 '@babel/helper-module-imports': 7.18.6 - '@rollup/pluginutils': 5.0.2_rollup@3.10.1 + '@rollup/pluginutils': 5.0.2(rollup@3.10.1) rollup: 3.10.1 dev: true - /@rollup/plugin-run/3.0.1_rollup@3.10.1: + /@rollup/plugin-run@3.0.1(rollup@3.10.1): resolution: {integrity: sha512-wbYR1Ahz8ohYnlyXzpBTwhGWfs+OO/uZMjgpDGr8AgnL/XfoTbO7BuNYY8ncR/j/1dhCJo+NDuTRkIeCxE434Q==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1623,7 +1641,7 @@ packages: rollup: 3.10.1 dev: true - /@rollup/plugin-terser/0.4.0_rollup@3.10.1: + /@rollup/plugin-terser@0.4.0(rollup@3.10.1): resolution: {integrity: sha512-Ipcf3LPNerey1q9ZMjiaWHlNPEHNU/B5/uh9zXLltfEQ1lVSLLeZSgAtTPWGyw8Ip1guOeq+mDtdOlEj/wNxQw==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1638,7 +1656,7 @@ packages: terser: 5.16.1 dev: true - /@rollup/pluginutils/4.2.1: + /@rollup/pluginutils@4.2.1: resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} engines: {node: '>= 8.0.0'} dependencies: @@ -1646,7 +1664,7 @@ packages: picomatch: 2.3.1 dev: true - /@rollup/pluginutils/5.0.2_rollup@3.10.1: + /@rollup/pluginutils@5.0.2(rollup@3.10.1): resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1661,23 +1679,23 @@ packages: rollup: 3.10.1 dev: true - /@sinclair/typebox/0.24.51: + /@sinclair/typebox@0.24.51: resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} dev: true - /@sinonjs/commons/1.8.6: + /@sinonjs/commons@1.8.6: resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} dependencies: type-detect: 4.0.8 dev: true - /@sinonjs/fake-timers/9.1.2: + /@sinonjs/fake-timers@9.1.2: resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} dependencies: '@sinonjs/commons': 1.8.6 dev: true - /@types/babel__core/7.20.0: + /@types/babel__core@7.20.0: resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} dependencies: '@babel/parser': 7.20.13 @@ -1687,95 +1705,95 @@ packages: '@types/babel__traverse': 7.18.3 dev: true - /@types/babel__generator/7.6.4: + /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: '@babel/types': 7.20.7 dev: true - /@types/babel__template/7.4.1: + /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: '@babel/parser': 7.20.13 '@babel/types': 7.20.7 dev: true - /@types/babel__traverse/7.18.3: + /@types/babel__traverse@7.18.3: resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==} dependencies: '@babel/types': 7.20.7 dev: true - /@types/estree/1.0.0: + /@types/estree@1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} dev: true - /@types/graceful-fs/4.1.6: + /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: '@types/node': 18.15.10 dev: true - /@types/istanbul-lib-coverage/2.0.4: + /@types/istanbul-lib-coverage@2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} dev: true - /@types/istanbul-lib-report/3.0.0: + /@types/istanbul-lib-report@3.0.0: resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} dependencies: '@types/istanbul-lib-coverage': 2.0.4 dev: true - /@types/istanbul-reports/3.0.1: + /@types/istanbul-reports@3.0.1: resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} dependencies: '@types/istanbul-lib-report': 3.0.0 dev: true - /@types/json-schema/7.0.11: + /@types/json-schema@7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true - /@types/node/14.18.30: + /@types/node@14.18.30: resolution: {integrity: sha512-8OEyg4oc/CqN5+LbInKNLA8MfbGzbC+k8lVPePXazuwEVrVeQ9gwMDX00HJwWbC7syc1FWRU6Mow0Lm+mibHAQ==} dev: true - /@types/node/18.11.18: + /@types/node@18.11.18: resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} dev: true - /@types/node/18.15.10: + /@types/node@18.15.10: resolution: {integrity: sha512-9avDaQJczATcXgfmMAW3MIWArOO7A+m90vuCFLr8AotWf8igO/mRoYukrk2cqZVtv38tHs33retzHEilM7FpeQ==} dev: true - /@types/node/18.15.11: + /@types/node@18.15.11: resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} dev: false optional: true - /@types/prettier/2.7.2: + /@types/prettier@2.7.2: resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} dev: true - /@types/semver/7.3.13: + /@types/semver@7.3.13: resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} dev: true - /@types/stack-utils/2.0.1: + /@types/stack-utils@2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true - /@types/yargs-parser/21.0.0: + /@types/yargs-parser@21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} dev: true - /@types/yargs/17.0.20: + /@types/yargs@17.0.20: resolution: {integrity: sha512-eknWrTHofQuPk2iuqDm1waA7V6xPlbgBoaaXEgYkClhLOnB0TtbW+srJaOToAgawPxPlHQzwypFA2bhZaUGP5A==} dependencies: '@types/yargs-parser': 21.0.0 dev: true - /@types/yauzl/2.10.0: + /@types/yauzl@2.10.0: resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} requiresBuild: true dependencies: @@ -1783,7 +1801,7 @@ packages: dev: false optional: true - /@typescript-eslint/eslint-plugin/5.48.2_xcchhpd3ezyqg4jn72wfkiwhri: + /@typescript-eslint/eslint-plugin@5.48.2(@typescript-eslint/parser@5.48.2)(eslint@8.32.0)(typescript@5.0.2): resolution: {integrity: sha512-sR0Gja9Ky1teIq4qJOl0nC+Tk64/uYdX+mi+5iB//MH8gwyx8e3SOyhEzeLZEFEEfCaLf8KJq+Bd/6je1t+CAg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1794,23 +1812,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.48.2_pydb3hde2stcjsf742jarbqbry + '@typescript-eslint/parser': 5.48.2(eslint@8.32.0)(typescript@5.0.2) '@typescript-eslint/scope-manager': 5.48.2 - '@typescript-eslint/type-utils': 5.48.2_pydb3hde2stcjsf742jarbqbry - '@typescript-eslint/utils': 5.48.2_pydb3hde2stcjsf742jarbqbry + '@typescript-eslint/type-utils': 5.48.2(eslint@8.32.0)(typescript@5.0.2) + '@typescript-eslint/utils': 5.48.2(eslint@8.32.0)(typescript@5.0.2) debug: 4.3.4 eslint: 8.32.0 ignore: 5.2.4 natural-compare-lite: 1.4.0 regexpp: 3.2.0 semver: 7.3.8 - tsutils: 3.21.0_typescript@5.0.2 + tsutils: 3.21.0(typescript@5.0.2) typescript: 5.0.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.48.2_pydb3hde2stcjsf742jarbqbry: + /@typescript-eslint/parser@5.48.2(eslint@8.32.0)(typescript@5.0.2): resolution: {integrity: sha512-38zMsKsG2sIuM5Oi/olurGwYJXzmtdsHhn5mI/pQogP+BjYVkK5iRazCQ8RGS0V+YLk282uWElN70zAAUmaYHw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1822,7 +1840,7 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.48.2 '@typescript-eslint/types': 5.48.2 - '@typescript-eslint/typescript-estree': 5.48.2_typescript@5.0.2 + '@typescript-eslint/typescript-estree': 5.48.2(typescript@5.0.2) debug: 4.3.4 eslint: 8.32.0 typescript: 5.0.2 @@ -1830,7 +1848,7 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager/5.48.2: + /@typescript-eslint/scope-manager@5.48.2: resolution: {integrity: sha512-zEUFfonQid5KRDKoI3O+uP1GnrFd4tIHlvs+sTJXiWuypUWMuDaottkJuR612wQfOkjYbsaskSIURV9xo4f+Fw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -1838,7 +1856,7 @@ packages: '@typescript-eslint/visitor-keys': 5.48.2 dev: true - /@typescript-eslint/type-utils/5.48.2_pydb3hde2stcjsf742jarbqbry: + /@typescript-eslint/type-utils@5.48.2(eslint@8.32.0)(typescript@5.0.2): resolution: {integrity: sha512-QVWx7J5sPMRiOMJp5dYshPxABRoZV1xbRirqSk8yuIIsu0nvMTZesKErEA3Oix1k+uvsk8Cs8TGJ6kQ0ndAcew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1848,22 +1866,22 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.48.2_typescript@5.0.2 - '@typescript-eslint/utils': 5.48.2_pydb3hde2stcjsf742jarbqbry + '@typescript-eslint/typescript-estree': 5.48.2(typescript@5.0.2) + '@typescript-eslint/utils': 5.48.2(eslint@8.32.0)(typescript@5.0.2) debug: 4.3.4 eslint: 8.32.0 - tsutils: 3.21.0_typescript@5.0.2 + tsutils: 3.21.0(typescript@5.0.2) typescript: 5.0.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types/5.48.2: + /@typescript-eslint/types@5.48.2: resolution: {integrity: sha512-hE7dA77xxu7ByBc6KCzikgfRyBCTst6dZQpwaTy25iMYOnbNljDT4hjhrGEJJ0QoMjrfqrx+j1l1B9/LtKeuqA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.48.2_typescript@5.0.2: + /@typescript-eslint/typescript-estree@5.48.2(typescript@5.0.2): resolution: {integrity: sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1878,13 +1896,13 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.8 - tsutils: 3.21.0_typescript@5.0.2 + tsutils: 3.21.0(typescript@5.0.2) typescript: 5.0.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.48.2_pydb3hde2stcjsf742jarbqbry: + /@typescript-eslint/utils@5.48.2(eslint@8.32.0)(typescript@5.0.2): resolution: {integrity: sha512-2h18c0d7jgkw6tdKTlNaM7wyopbLRBiit8oAxoP89YnuBOzCZ8g8aBCaCqq7h208qUTroL7Whgzam7UY3HVLow==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1894,17 +1912,17 @@ packages: '@types/semver': 7.3.13 '@typescript-eslint/scope-manager': 5.48.2 '@typescript-eslint/types': 5.48.2 - '@typescript-eslint/typescript-estree': 5.48.2_typescript@5.0.2 + '@typescript-eslint/typescript-estree': 5.48.2(typescript@5.0.2) eslint: 8.32.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.32.0 + eslint-utils: 3.0.0(eslint@8.32.0) semver: 7.3.8 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys/5.48.2: + /@typescript-eslint/visitor-keys@5.48.2: resolution: {integrity: sha512-z9njZLSkwmjFWUelGEwEbdf4NwKvfHxvGC0OcGN1Hp/XNDIcJ7D5DpPNPv6x6/mFvc1tQHsaWmpD/a4gOvvCJQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -1912,7 +1930,7 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /acorn-jsx/5.3.2_acorn@8.8.1: + /acorn-jsx@5.3.2(acorn@8.8.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1920,13 +1938,13 @@ packages: acorn: 8.8.1 dev: true - /acorn/8.8.1: + /acorn@8.8.1: resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /agent-base/6.0.2: + /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: @@ -1935,7 +1953,7 @@ packages: - supports-color dev: false - /ajv/6.12.6: + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: fast-deep-equal: 3.1.3 @@ -1944,35 +1962,35 @@ packages: uri-js: 4.4.1 dev: true - /ansi-escapes/4.3.2: + /ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} dependencies: type-fest: 0.21.3 dev: true - /ansi-regex/5.0.1: + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - /ansi-styles/3.2.1: + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} dependencies: color-convert: 1.9.3 - /ansi-styles/4.3.0: + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - /ansi-styles/5.2.0: + /ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} dev: true - /anymatch/3.1.3: + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} dependencies: @@ -1980,21 +1998,21 @@ packages: picomatch: 2.3.1 dev: true - /argparse/1.0.10: + /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 dev: true - /argparse/2.0.1: + /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - /array-union/2.1.0: + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} dev: true - /babel-jest/29.3.1_@babel+core@7.20.12: + /babel-jest@29.3.1(@babel/core@7.20.12): resolution: {integrity: sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -2004,7 +2022,7 @@ packages: '@jest/transform': 29.3.1 '@types/babel__core': 7.20.0 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.2.0_@babel+core@7.20.12 + babel-preset-jest: 29.2.0(@babel/core@7.20.12) chalk: 4.1.2 graceful-fs: 4.2.10 slash: 3.0.0 @@ -2012,7 +2030,7 @@ packages: - supports-color dev: true - /babel-plugin-istanbul/6.1.1: + /babel-plugin-istanbul@6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: @@ -2025,7 +2043,7 @@ packages: - supports-color dev: true - /babel-plugin-jest-hoist/29.2.0: + /babel-plugin-jest-hoist@29.2.0: resolution: {integrity: sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2035,63 +2053,63 @@ packages: '@types/babel__traverse': 7.18.3 dev: true - /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.20.12: + /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.20.12): resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.20.10 '@babel/core': 7.20.12 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.12 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.20.12) semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.20.12: + /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.20.12): resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.12 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.20.12) core-js-compat: 3.27.2 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.20.12: + /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.20.12): resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.12 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.20.12) transitivePeerDependencies: - supports-color dev: true - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.20.12: + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.20.12): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.20.12 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.12 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.12 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.20.12 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.12 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.12 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.12 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.12 - dev: true - - /babel-preset-jest/29.2.0_@babel+core@7.20.12: + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.20.12) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.20.12) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.20.12) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.20.12) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.20.12) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.20.12) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.20.12) + dev: true + + /babel-preset-jest@29.2.0(@babel/core@7.20.12): resolution: {integrity: sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -2099,18 +2117,18 @@ packages: dependencies: '@babel/core': 7.20.12 babel-plugin-jest-hoist: 29.2.0 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.12 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.20.12) dev: true - /balanced-match/1.0.2: + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /base64-js/1.5.1: + /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} dev: false - /bl/4.1.0: + /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: buffer: 5.7.1 @@ -2118,21 +2136,21 @@ packages: readable-stream: 3.6.2 dev: false - /brace-expansion/1.1.11: + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 dev: true - /braces/3.0.2: + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 dev: true - /browserslist/4.21.4: + /browserslist@4.21.4: resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -2140,56 +2158,56 @@ packages: caniuse-lite: 1.0.30001446 electron-to-chromium: 1.4.284 node-releases: 2.0.8 - update-browserslist-db: 1.0.10_browserslist@4.21.4 + update-browserslist-db: 1.0.10(browserslist@4.21.4) dev: true - /bs-logger/0.2.6: + /bs-logger@0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} engines: {node: '>= 6'} dependencies: fast-json-stable-stringify: 2.1.0 dev: true - /bser/2.1.1: + /bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: node-int64: 0.4.0 dev: true - /buffer-crc32/0.2.13: + /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} dev: false - /buffer-from/1.1.2: + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true - /buffer/5.7.1: + /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 dev: false - /callsites/3.1.0: + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - /camelcase/5.3.1: + /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} dev: true - /camelcase/6.3.0: + /camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} dev: true - /caniuse-lite/1.0.30001446: + /caniuse-lite@1.0.30001446: resolution: {integrity: sha512-fEoga4PrImGcwUUGEol/PoFCSBnSkA9drgdkxXkJLsUBOnJ8rs3zDv6ApqYXGQFOyMPsjh79naWhF4DAxbF8rw==} dev: true - /chalk/2.4.2: + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} dependencies: @@ -2197,23 +2215,23 @@ packages: escape-string-regexp: 1.0.5 supports-color: 5.5.0 - /chalk/4.1.2: + /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /char-regex/1.0.2: + /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} dev: true - /chownr/1.1.4: + /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} dev: false - /chromium-bidi/0.4.6_7yd6ibrwer4fxzjxd6md3toxiy: + /chromium-bidi@0.4.6(devtools-protocol@0.0.1107588): resolution: {integrity: sha512-TQOkWRaLI/IWvoP8XC+7jO4uHTIiAUiklXU1T0qszlUFEai9LgKXIBXy3pOS3EnQZ3bQtMbKUPkug0fTAEHCSw==} peerDependencies: devtools-protocol: '*' @@ -2222,16 +2240,16 @@ packages: mitt: 3.0.0 dev: false - /ci-info/3.7.1: + /ci-info@3.7.1: resolution: {integrity: sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==} engines: {node: '>=8'} dev: true - /cjs-module-lexer/1.2.2: + /cjs-module-lexer@1.2.2: resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} dev: true - /cliui/8.0.1: + /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} dependencies: @@ -2239,59 +2257,59 @@ packages: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - /co/4.6.0: + /co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: true - /collect-v8-coverage/1.0.1: + /collect-v8-coverage@1.0.1: resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} dev: true - /color-convert/1.9.3: + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 - /color-convert/2.0.1: + /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - /color-name/1.1.3: + /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - /color-name/1.1.4: + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - /commander/2.20.3: + /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: true - /commondir/1.0.1: + /commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true - /concat-map/0.0.1: + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /convert-source-map/1.9.0: + /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} dev: true - /convert-source-map/2.0.0: + /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true - /core-js-compat/3.27.2: + /core-js-compat@3.27.2: resolution: {integrity: sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg==} dependencies: browserslist: 4.21.4 dev: true - /cosmiconfig/8.1.3: + /cosmiconfig@8.1.3: resolution: {integrity: sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==} engines: {node: '>=14'} dependencies: @@ -2301,7 +2319,7 @@ packages: path-type: 4.0.0 dev: false - /cross-fetch/3.1.5: + /cross-fetch@3.1.5: resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} dependencies: node-fetch: 2.6.7 @@ -2309,7 +2327,7 @@ packages: - encoding dev: false - /cross-spawn/7.0.3: + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} dependencies: @@ -2318,7 +2336,7 @@ packages: which: 2.0.2 dev: true - /debug/4.3.4: + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -2329,89 +2347,89 @@ packages: dependencies: ms: 2.1.2 - /dedent/0.7.0: + /dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} dev: true - /deep-is/0.1.4: + /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /deepmerge/4.2.2: + /deepmerge@4.2.2: resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} engines: {node: '>=0.10.0'} dev: true - /detect-newline/3.1.0: + /detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} dev: true - /devtools-protocol/0.0.1107588: + /devtools-protocol@0.0.1107588: resolution: {integrity: sha512-yIR+pG9x65Xko7bErCUSQaDLrO/P1p3JUzEk7JCU4DowPcGHkTGUGQapcfcLc4qj0UaALwZ+cr0riFgiqpixcg==} dev: false - /diff-sequences/29.3.1: + /diff-sequences@29.3.1: resolution: {integrity: sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /dir-glob/3.0.1: + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} dependencies: path-type: 4.0.0 dev: true - /doctrine/3.0.0: + /doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 dev: true - /electron-to-chromium/1.4.284: + /electron-to-chromium@1.4.284: resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} dev: true - /emittery/0.13.1: + /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} dev: true - /emoji-regex/8.0.0: + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - /end-of-stream/1.4.4: + /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 dev: false - /error-ex/1.3.2: + /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 - /escalade/3.1.1: + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - /escape-string-regexp/1.0.5: + /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - /escape-string-regexp/2.0.0: + /escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} dev: true - /escape-string-regexp/4.0.0: + /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} dev: true - /eslint-scope/5.1.1: + /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} dependencies: @@ -2419,7 +2437,7 @@ packages: estraverse: 4.3.0 dev: true - /eslint-scope/7.1.1: + /eslint-scope@7.1.1: resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -2427,7 +2445,7 @@ packages: estraverse: 5.3.0 dev: true - /eslint-utils/3.0.0_eslint@8.32.0: + /eslint-utils@3.0.0(eslint@8.32.0): resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: @@ -2437,17 +2455,17 @@ packages: eslint-visitor-keys: 2.1.0 dev: true - /eslint-visitor-keys/2.1.0: + /eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} dev: true - /eslint-visitor-keys/3.3.0: + /eslint-visitor-keys@3.3.0: resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/8.32.0: + /eslint@8.32.0: resolution: {integrity: sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true @@ -2463,7 +2481,7 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.32.0 + eslint-utils: 3.0.0(eslint@8.32.0) eslint-visitor-keys: 3.3.0 espree: 9.4.1 esquery: 1.4.0 @@ -2495,55 +2513,55 @@ packages: - supports-color dev: true - /espree/9.4.1: + /espree@9.4.1: resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: acorn: 8.8.1 - acorn-jsx: 5.3.2_acorn@8.8.1 + acorn-jsx: 5.3.2(acorn@8.8.1) eslint-visitor-keys: 3.3.0 dev: true - /esprima/4.0.1: + /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true dev: true - /esquery/1.4.0: + /esquery@1.4.0: resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 dev: true - /esrecurse/4.3.0: + /esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 dev: true - /estraverse/4.3.0: + /estraverse@4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} dev: true - /estraverse/5.3.0: + /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} dev: true - /estree-walker/2.0.2: + /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} dev: true - /esutils/2.0.3: + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} dev: true - /execa/5.1.1: + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} dependencies: @@ -2558,12 +2576,12 @@ packages: strip-final-newline: 2.0.0 dev: true - /exit/0.1.2: + /exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} dev: true - /expect/29.3.1: + /expect@29.3.1: resolution: {integrity: sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2574,7 +2592,7 @@ packages: jest-util: 29.3.1 dev: true - /extract-zip/2.0.1: + /extract-zip@2.0.1: resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} engines: {node: '>= 10.17.0'} hasBin: true @@ -2588,11 +2606,11 @@ packages: - supports-color dev: false - /fast-deep-equal/3.1.3: + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-glob/3.2.12: + /fast-glob@3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} dependencies: @@ -2603,47 +2621,47 @@ packages: micromatch: 4.0.5 dev: true - /fast-json-stable-stringify/2.1.0: + /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true - /fast-levenshtein/2.0.6: + /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fastq/1.15.0: + /fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 dev: true - /fb-watchman/2.0.2: + /fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} dependencies: bser: 2.1.1 dev: true - /fd-slicer/1.1.0: + /fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} dependencies: pend: 1.2.0 dev: false - /file-entry-cache/6.0.1: + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.0.4 dev: true - /fill-range/7.0.1: + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 dev: true - /find-cache-dir/3.3.2: + /find-cache-dir@3.3.2: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} dependencies: @@ -2652,7 +2670,7 @@ packages: pkg-dir: 4.2.0 dev: true - /find-up/4.1.0: + /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} dependencies: @@ -2660,7 +2678,7 @@ packages: path-exists: 4.0.0 dev: true - /find-up/5.0.0: + /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} dependencies: @@ -2668,7 +2686,7 @@ packages: path-exists: 4.0.0 dev: true - /flat-cache/3.0.4: + /flat-cache@3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: @@ -2676,15 +2694,15 @@ packages: rimraf: 3.0.2 dev: true - /flatted/3.2.7: + /flatted@3.2.7: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true - /fs-constants/1.0.0: + /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} dev: false - /fs-extra/10.1.0: + /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} dependencies: @@ -2693,11 +2711,11 @@ packages: universalify: 2.0.0 dev: true - /fs.realpath/1.0.0: + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true - /fsevents/2.3.2: + /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -2705,51 +2723,51 @@ packages: dev: true optional: true - /function-bind/1.1.1: + /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: true - /gensync/1.0.0-beta.2: + /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} dev: true - /get-caller-file/2.0.5: + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - /get-package-type/0.1.0: + /get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} dev: true - /get-stream/5.2.0: + /get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} dependencies: pump: 3.0.0 dev: false - /get-stream/6.0.1: + /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} dev: true - /glob-parent/5.1.2: + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 dev: true - /glob-parent/6.0.2: + /glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 dev: true - /glob/7.2.3: + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 @@ -2760,19 +2778,19 @@ packages: path-is-absolute: 1.0.1 dev: true - /globals/11.12.0: + /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} dev: true - /globals/13.19.0: + /globals@13.19.0: resolution: {integrity: sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 dev: true - /globby/11.1.0: + /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} dependencies: @@ -2784,34 +2802,34 @@ packages: slash: 3.0.0 dev: true - /graceful-fs/4.2.10: + /graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} dev: true - /grapheme-splitter/1.0.4: + /grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true - /has-flag/3.0.0: + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} - /has-flag/4.0.0: + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - /has/1.0.3: + /has@1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 dev: true - /html-escaper/2.0.2: + /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true - /https-proxy-agent/5.0.1: + /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} dependencies: @@ -2821,28 +2839,28 @@ packages: - supports-color dev: false - /human-signals/2.1.0: + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} dev: true - /ieee754/1.2.1: + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: false - /ignore/5.2.4: + /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} dev: true - /import-fresh/3.3.0: + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - /import-local/3.1.0: + /import-local@3.1.0: resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} engines: {node: '>=8'} hasBin: true @@ -2851,76 +2869,76 @@ packages: resolve-cwd: 3.0.0 dev: true - /imurmurhash/0.1.4: + /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} dev: true - /inflight/1.0.6: + /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 dev: true - /inherits/2.0.4: + /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /is-arrayish/0.2.1: + /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - /is-core-module/2.11.0: + /is-core-module@2.11.0: resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} dependencies: has: 1.0.3 dev: true - /is-extglob/2.1.1: + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} dev: true - /is-fullwidth-code-point/3.0.0: + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - /is-generator-fn/2.1.0: + /is-generator-fn@2.1.0: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} dev: true - /is-glob/4.0.3: + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 dev: true - /is-number/7.0.0: + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} dev: true - /is-path-inside/3.0.3: + /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} dev: true - /is-stream/2.0.1: + /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} dev: true - /isexe/2.0.0: + /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /istanbul-lib-coverage/3.2.0: + /istanbul-lib-coverage@3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} dev: true - /istanbul-lib-instrument/5.2.1: + /istanbul-lib-instrument@5.2.1: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: @@ -2933,7 +2951,7 @@ packages: - supports-color dev: true - /istanbul-lib-report/3.0.0: + /istanbul-lib-report@3.0.0: resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} engines: {node: '>=8'} dependencies: @@ -2942,7 +2960,7 @@ packages: supports-color: 7.2.0 dev: true - /istanbul-lib-source-maps/4.0.1: + /istanbul-lib-source-maps@4.0.1: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: @@ -2953,7 +2971,7 @@ packages: - supports-color dev: true - /istanbul-reports/3.1.5: + /istanbul-reports@3.1.5: resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} engines: {node: '>=8'} dependencies: @@ -2961,7 +2979,7 @@ packages: istanbul-lib-report: 3.0.0 dev: true - /jest-changed-files/29.2.0: + /jest-changed-files@29.2.0: resolution: {integrity: sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2969,7 +2987,7 @@ packages: p-limit: 3.1.0 dev: true - /jest-circus/29.3.1: + /jest-circus@29.3.1: resolution: {integrity: sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2996,7 +3014,7 @@ packages: - supports-color dev: true - /jest-cli/29.3.1_@types+node@18.11.18: + /jest-cli@29.3.1(@types/node@18.11.18): resolution: {integrity: sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -3013,7 +3031,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.10 import-local: 3.1.0 - jest-config: 29.3.1_@types+node@18.11.18 + jest-config: 29.3.1(@types/node@18.11.18) jest-util: 29.3.1 jest-validate: 29.3.1 prompts: 2.4.2 @@ -3024,7 +3042,7 @@ packages: - ts-node dev: true - /jest-config/29.3.1_@types+node@18.11.18: + /jest-config@29.3.1(@types/node@18.11.18): resolution: {integrity: sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -3040,7 +3058,7 @@ packages: '@jest/test-sequencer': 29.3.1 '@jest/types': 29.3.1 '@types/node': 18.11.18 - babel-jest: 29.3.1_@babel+core@7.20.12 + babel-jest: 29.3.1(@babel/core@7.20.12) chalk: 4.1.2 ci-info: 3.7.1 deepmerge: 4.2.2 @@ -3063,7 +3081,7 @@ packages: - supports-color dev: true - /jest-config/29.3.1_@types+node@18.15.10: + /jest-config@29.3.1(@types/node@18.15.10): resolution: {integrity: sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -3079,7 +3097,7 @@ packages: '@jest/test-sequencer': 29.3.1 '@jest/types': 29.3.1 '@types/node': 18.15.10 - babel-jest: 29.3.1_@babel+core@7.20.12 + babel-jest: 29.3.1(@babel/core@7.20.12) chalk: 4.1.2 ci-info: 3.7.1 deepmerge: 4.2.2 @@ -3102,7 +3120,7 @@ packages: - supports-color dev: true - /jest-diff/29.3.1: + /jest-diff@29.3.1: resolution: {integrity: sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -3112,14 +3130,14 @@ packages: pretty-format: 29.3.1 dev: true - /jest-docblock/29.2.0: + /jest-docblock@29.2.0: resolution: {integrity: sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: detect-newline: 3.1.0 dev: true - /jest-each/29.3.1: + /jest-each@29.3.1: resolution: {integrity: sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -3130,7 +3148,7 @@ packages: pretty-format: 29.3.1 dev: true - /jest-environment-node/29.3.1: + /jest-environment-node@29.3.1: resolution: {integrity: sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -3142,12 +3160,12 @@ packages: jest-util: 29.3.1 dev: true - /jest-get-type/29.2.0: + /jest-get-type@29.2.0: resolution: {integrity: sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-haste-map/29.3.1: + /jest-haste-map@29.3.1: resolution: {integrity: sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -3166,7 +3184,7 @@ packages: fsevents: 2.3.2 dev: true - /jest-leak-detector/29.3.1: + /jest-leak-detector@29.3.1: resolution: {integrity: sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -3174,7 +3192,7 @@ packages: pretty-format: 29.3.1 dev: true - /jest-matcher-utils/29.3.1: + /jest-matcher-utils@29.3.1: resolution: {integrity: sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -3184,7 +3202,7 @@ packages: pretty-format: 29.3.1 dev: true - /jest-message-util/29.3.1: + /jest-message-util@29.3.1: resolution: {integrity: sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -3199,7 +3217,7 @@ packages: stack-utils: 2.0.6 dev: true - /jest-mock/29.3.1: + /jest-mock@29.3.1: resolution: {integrity: sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -3208,7 +3226,7 @@ packages: jest-util: 29.3.1 dev: true - /jest-pnp-resolver/1.2.3_jest-resolve@29.3.1: + /jest-pnp-resolver@1.2.3(jest-resolve@29.3.1): resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} peerDependencies: @@ -3220,12 +3238,12 @@ packages: jest-resolve: 29.3.1 dev: true - /jest-regex-util/29.2.0: + /jest-regex-util@29.2.0: resolution: {integrity: sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-resolve-dependencies/29.3.1: + /jest-resolve-dependencies@29.3.1: resolution: {integrity: sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -3235,14 +3253,14 @@ packages: - supports-color dev: true - /jest-resolve/29.3.1: + /jest-resolve@29.3.1: resolution: {integrity: sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 graceful-fs: 4.2.10 jest-haste-map: 29.3.1 - jest-pnp-resolver: 1.2.3_jest-resolve@29.3.1 + jest-pnp-resolver: 1.2.3(jest-resolve@29.3.1) jest-util: 29.3.1 jest-validate: 29.3.1 resolve: 1.22.1 @@ -3250,7 +3268,7 @@ packages: slash: 3.0.0 dev: true - /jest-runner/29.3.1: + /jest-runner@29.3.1: resolution: {integrity: sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -3279,7 +3297,7 @@ packages: - supports-color dev: true - /jest-runtime/29.3.1: + /jest-runtime@29.3.1: resolution: {integrity: sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -3309,14 +3327,14 @@ packages: - supports-color dev: true - /jest-snapshot/29.3.1: + /jest-snapshot@29.3.1: resolution: {integrity: sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/core': 7.20.12 '@babel/generator': 7.20.7 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.20.12 + '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.20.12) '@babel/traverse': 7.20.13 '@babel/types': 7.20.7 '@jest/expect-utils': 29.3.1 @@ -3324,7 +3342,7 @@ packages: '@jest/types': 29.3.1 '@types/babel__traverse': 7.18.3 '@types/prettier': 2.7.2 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.12 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.20.12) chalk: 4.1.2 expect: 29.3.1 graceful-fs: 4.2.10 @@ -3341,7 +3359,7 @@ packages: - supports-color dev: true - /jest-util/29.3.1: + /jest-util@29.3.1: resolution: {integrity: sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -3353,7 +3371,7 @@ packages: picomatch: 2.3.1 dev: true - /jest-validate/29.3.1: + /jest-validate@29.3.1: resolution: {integrity: sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -3365,7 +3383,7 @@ packages: pretty-format: 29.3.1 dev: true - /jest-watcher/29.3.1: + /jest-watcher@29.3.1: resolution: {integrity: sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -3379,7 +3397,7 @@ packages: string-length: 4.0.2 dev: true - /jest-worker/29.3.1: + /jest-worker@29.3.1: resolution: {integrity: sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -3389,7 +3407,7 @@ packages: supports-color: 8.1.1 dev: true - /jest/29.3.1_@types+node@18.11.18: + /jest@29.3.1(@types/node@18.11.18): resolution: {integrity: sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -3402,21 +3420,21 @@ packages: '@jest/core': 29.3.1 '@jest/types': 29.3.1 import-local: 3.1.0 - jest-cli: 29.3.1_@types+node@18.11.18 + jest-cli: 29.3.1(@types/node@18.11.18) transitivePeerDependencies: - '@types/node' - supports-color - ts-node dev: true - /js-sdsl/4.3.0: + /js-sdsl@4.3.0: resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==} dev: true - /js-tokens/4.0.0: + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - /js-yaml/3.14.1: + /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true dependencies: @@ -3424,41 +3442,41 @@ packages: esprima: 4.0.1 dev: true - /js-yaml/4.1.0: + /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true dependencies: argparse: 2.0.1 - /jsesc/0.5.0: + /jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true dev: true - /jsesc/2.5.2: + /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true dev: true - /json-parse-even-better-errors/2.3.1: + /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - /json-schema-traverse/0.4.1: + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true - /json-stable-stringify-without-jsonify/1.0.1: + /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /json5/2.2.3: + /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true dev: true - /jsonfile/6.1.0: + /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: universalify: 2.0.0 @@ -3466,17 +3484,17 @@ packages: graceful-fs: 4.2.10 dev: true - /kleur/3.0.3: + /kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} dev: true - /leven/3.1.0: + /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} dev: true - /levn/0.4.1: + /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} dependencies: @@ -3484,75 +3502,75 @@ packages: type-check: 0.4.0 dev: true - /lines-and-columns/1.2.4: + /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - /locate-path/5.0.0: + /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} dependencies: p-locate: 4.1.0 dev: true - /locate-path/6.0.0: + /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} dependencies: p-locate: 5.0.0 dev: true - /lodash.debounce/4.0.8: + /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} dev: true - /lodash.memoize/4.1.2: + /lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} dev: true - /lodash.merge/4.6.2: + /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true - /lru-cache/5.1.1: + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 dev: true - /lru-cache/6.0.0: + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 dev: true - /make-dir/3.1.0: + /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} dependencies: semver: 6.3.0 dev: true - /make-error/1.3.6: + /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true - /makeerror/1.0.12: + /makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: tmpl: 1.0.5 dev: true - /merge-stream/2.0.0: + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true - /merge2/1.4.1: + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} dev: true - /micromatch/4.0.5: + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: @@ -3560,37 +3578,37 @@ packages: picomatch: 2.3.1 dev: true - /mimic-fn/2.1.0: + /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} dev: true - /minimatch/3.1.2: + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true - /mitt/3.0.0: + /mitt@3.0.0: resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==} dev: false - /mkdirp-classic/0.5.3: + /mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} dev: false - /ms/2.1.2: + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - /natural-compare-lite/1.4.0: + /natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true - /natural-compare/1.4.0: + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /node-fetch/2.6.7: + /node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} peerDependencies: @@ -3602,39 +3620,39 @@ packages: whatwg-url: 5.0.0 dev: false - /node-int64/0.4.0: + /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: true - /node-releases/2.0.8: + /node-releases@2.0.8: resolution: {integrity: sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==} dev: true - /normalize-path/3.0.0: + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} dev: true - /npm-run-path/4.0.1: + /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} dependencies: path-key: 3.1.1 dev: true - /once/1.4.0: + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 - /onetime/5.1.2: + /onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 dev: true - /optionator/0.9.1: + /optionator@0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} dependencies: @@ -3646,46 +3664,46 @@ packages: word-wrap: 1.2.3 dev: true - /p-limit/2.3.0: + /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} dependencies: p-try: 2.2.0 dev: true - /p-limit/3.1.0: + /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 dev: true - /p-locate/4.1.0: + /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} dependencies: p-limit: 2.3.0 dev: true - /p-locate/5.0.0: + /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} dependencies: p-limit: 3.1.0 dev: true - /p-try/2.2.0: + /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} dev: true - /parent-module/1.0.1: + /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} dependencies: callsites: 3.1.0 - /parse-json/5.2.0: + /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: @@ -3694,66 +3712,66 @@ packages: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - /path-exists/4.0.0: + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} dev: true - /path-is-absolute/1.0.1: + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} dev: true - /path-key/3.1.1: + /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} dev: true - /path-parse/1.0.7: + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true - /path-type/4.0.0: + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - /pend/1.2.0: + /pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} dev: false - /picocolors/1.0.0: + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true - /picomatch/2.3.1: + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} dev: true - /pirates/4.0.5: + /pirates@4.0.5: resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} engines: {node: '>= 6'} dev: true - /pkg-dir/4.2.0: + /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} dependencies: find-up: 4.1.0 dev: true - /prelude-ls/1.2.1: + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} dev: true - /prettier/2.8.3: + /prettier@2.8.3: resolution: {integrity: sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==} engines: {node: '>=10.13.0'} hasBin: true dev: true - /pretty-format/29.3.1: + /pretty-format@29.3.1: resolution: {integrity: sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -3762,12 +3780,12 @@ packages: react-is: 18.2.0 dev: true - /progress/2.0.3: + /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} dev: false - /prompts/2.4.2: + /prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} dependencies: @@ -3775,23 +3793,23 @@ packages: sisteransi: 1.0.5 dev: true - /proxy-from-env/1.1.0: + /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: false - /pump/3.0.0: + /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: end-of-stream: 1.4.4 once: 1.4.0 dev: false - /punycode/2.3.0: + /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} dev: true - /puppeteer-core/19.10.0_typescript@5.0.2: + /puppeteer-core@19.10.0(typescript@5.0.2): resolution: {integrity: sha512-F6btgaEJXcpdw/kJszBhe7t4kx1C42oG159romCagX8ttComuk5dqkmAd/AQc/E4cS3onOUsHI5WgjIstuYsFw==} engines: {node: '>=14.14.0'} peerDependencies: @@ -3800,8 +3818,8 @@ packages: typescript: optional: true dependencies: - '@puppeteer/browsers': 0.4.1_typescript@5.0.2 - chromium-bidi: 0.4.6_7yd6ibrwer4fxzjxd6md3toxiy + '@puppeteer/browsers': 0.4.1(typescript@5.0.2) + chromium-bidi: 0.4.6(devtools-protocol@0.0.1107588) cross-fetch: 3.1.5 debug: 4.3.4 devtools-protocol: 0.0.1107588 @@ -3819,16 +3837,16 @@ packages: - utf-8-validate dev: false - /puppeteer/19.10.0_typescript@5.0.2: + /puppeteer@19.10.0(typescript@5.0.2): resolution: {integrity: sha512-u2ftBcAu1cL5x2uKD5FLhHkN60Z1d5T0iMftiUEyRfdwT0poObRvjpc69F0HbtN/7lFeW2v+VN4pgeVVSOZYWg==} requiresBuild: true dependencies: - '@puppeteer/browsers': 0.4.1_typescript@5.0.2 + '@puppeteer/browsers': 0.4.1(typescript@5.0.2) cosmiconfig: 8.1.3 https-proxy-agent: 5.0.1 progress: 2.0.3 proxy-from-env: 1.1.0 - puppeteer-core: 19.10.0_typescript@5.0.2 + puppeteer-core: 19.10.0(typescript@5.0.2) transitivePeerDependencies: - bufferutil - encoding @@ -3837,21 +3855,21 @@ packages: - utf-8-validate dev: false - /queue-microtask/1.2.3: + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true - /randombytes/2.1.0: + /randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 dev: true - /react-is/18.2.0: + /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: true - /readable-stream/3.6.2: + /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} dependencies: @@ -3860,33 +3878,33 @@ packages: util-deprecate: 1.0.2 dev: false - /regenerate-unicode-properties/10.1.0: + /regenerate-unicode-properties@10.1.0: resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} engines: {node: '>=4'} dependencies: regenerate: 1.4.2 dev: true - /regenerate/1.4.2: + /regenerate@1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} dev: true - /regenerator-runtime/0.13.11: + /regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} dev: true - /regenerator-transform/0.15.1: + /regenerator-transform@0.15.1: resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} dependencies: '@babel/runtime': 7.20.13 dev: true - /regexpp/3.2.0: + /regexpp@3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} dev: true - /regexpu-core/5.2.2: + /regexpu-core@5.2.2: resolution: {integrity: sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==} engines: {node: '>=4'} dependencies: @@ -3898,43 +3916,43 @@ packages: unicode-match-property-value-ecmascript: 2.1.0 dev: true - /regjsgen/0.7.1: + /regjsgen@0.7.1: resolution: {integrity: sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==} dev: true - /regjsparser/0.9.1: + /regjsparser@0.9.1: resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true dependencies: jsesc: 0.5.0 dev: true - /require-directory/2.1.1: + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - /resolve-cwd/3.0.0: + /resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} dependencies: resolve-from: 5.0.0 dev: true - /resolve-from/4.0.0: + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - /resolve-from/5.0.0: + /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} dev: true - /resolve.exports/1.1.1: + /resolve.exports@1.1.1: resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} engines: {node: '>=10'} dev: true - /resolve/1.22.1: + /resolve@1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true dependencies: @@ -3943,19 +3961,19 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /reusify/1.0.4: + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /rimraf/3.0.2: + /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: glob: 7.2.3 dev: true - /rollup-plugin-typescript2/0.34.1_xzkd7boxfqp7uxzhulfcfesazm: + /rollup-plugin-typescript2@0.34.1(rollup@3.10.1)(typescript@5.0.2): resolution: {integrity: sha512-P4cHLtGikESmqi1CA+tdMDUv8WbQV48mzPYt77TSTOPJpERyZ9TXdDgjSDix8Fkqce6soYz3+fa4lrC93IEkcw==} peerDependencies: rollup: '>=1.26.3' @@ -3970,7 +3988,7 @@ packages: typescript: 5.0.2 dev: true - /rollup/3.10.1: + /rollup@3.10.1: resolution: {integrity: sha512-3Er+yel3bZbZX1g2kjVM+FW+RUWDxbG87fcqFM5/9HbPCTpbVp6JOLn7jlxnNlbu7s/N/uDA4EV/91E2gWnxzw==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true @@ -3978,21 +3996,21 @@ packages: fsevents: 2.3.2 dev: true - /run-parallel/1.2.0: + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 dev: true - /safe-buffer/5.2.1: + /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - /semver/6.3.0: + /semver@6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true dev: true - /semver/7.3.8: + /semver@7.3.8: resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} engines: {node: '>=10'} hasBin: true @@ -4000,72 +4018,72 @@ packages: lru-cache: 6.0.0 dev: true - /serialize-javascript/6.0.1: + /serialize-javascript@6.0.1: resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} dependencies: randombytes: 2.1.0 dev: true - /shebang-command/2.0.0: + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 dev: true - /shebang-regex/3.0.0: + /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} dev: true - /signal-exit/3.0.7: + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true - /sisteransi/1.0.5: + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true - /slash/3.0.0: + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} dev: true - /smob/0.0.6: + /smob@0.0.6: resolution: {integrity: sha512-V21+XeNni+tTyiST1MHsa84AQhT1aFZipzPpOFAVB8DkHzwJyjjAmt9bgwnuZiZWnIbMo2duE29wybxv/7HWUw==} dev: true - /source-map-support/0.5.13: + /source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 dev: true - /source-map-support/0.5.21: + /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 dev: true - /source-map/0.6.1: + /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} dev: true - /sprintf-js/1.0.3: + /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true - /stack-utils/2.0.6: + /stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} dependencies: escape-string-regexp: 2.0.0 dev: true - /string-length/4.0.2: + /string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} dependencies: @@ -4073,7 +4091,7 @@ packages: strip-ansi: 6.0.1 dev: true - /string-width/4.2.3: + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} dependencies: @@ -4081,58 +4099,58 @@ packages: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string_decoder/1.3.0: + /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 dev: false - /strip-ansi/6.0.1: + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - /strip-bom/4.0.0: + /strip-bom@4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} dev: true - /strip-final-newline/2.0.0: + /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} dev: true - /strip-json-comments/3.1.1: + /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} dev: true - /supports-color/5.5.0: + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 - /supports-color/7.2.0: + /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 - /supports-color/8.1.1: + /supports-color@8.1.1: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} dependencies: has-flag: 4.0.0 dev: true - /supports-preserve-symlinks-flag/1.0.0: + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} dev: true - /tar-fs/2.1.1: + /tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} dependencies: chownr: 1.1.4 @@ -4141,7 +4159,7 @@ packages: tar-stream: 2.2.0 dev: false - /tar-stream/2.2.0: + /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} dependencies: @@ -4152,7 +4170,7 @@ packages: readable-stream: 3.6.2 dev: false - /terser/5.16.1: + /terser@5.16.1: resolution: {integrity: sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==} engines: {node: '>=10'} hasBin: true @@ -4163,7 +4181,7 @@ packages: source-map-support: 0.5.21 dev: true - /test-exclude/6.0.0: + /test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} dependencies: @@ -4172,35 +4190,35 @@ packages: minimatch: 3.1.2 dev: true - /text-table/0.2.0: + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /through/2.3.8: + /through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: false - /tmpl/1.0.5: + /tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} dev: true - /to-fast-properties/2.0.0: + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} dev: true - /to-regex-range/5.0.1: + /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 dev: true - /tr46/0.0.3: + /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: false - /ts-jest/29.0.5_oi7nmolcnmyqply4ewqwuryc6q: + /ts-jest@29.0.5(@babel/core@7.20.12)(jest@29.3.1)(typescript@5.0.2): resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -4224,7 +4242,7 @@ packages: '@babel/core': 7.20.12 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.3.1_@types+node@18.11.18 + jest: 29.3.1(@types/node@18.11.18) jest-util: 29.3.1 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -4234,15 +4252,15 @@ packages: yargs-parser: 21.1.1 dev: true - /tslib/1.14.1: + /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib/2.4.1: + /tslib@2.4.1: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} dev: true - /tsutils/3.21.0_typescript@5.0.2: + /tsutils@3.21.0(typescript@5.0.2): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: @@ -4252,46 +4270,46 @@ packages: typescript: 5.0.2 dev: true - /type-check/0.4.0: + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 dev: true - /type-detect/4.0.8: + /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} dev: true - /type-fest/0.20.2: + /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} dev: true - /type-fest/0.21.3: + /type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} dev: true - /typescript/5.0.2: + /typescript@5.0.2: resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} engines: {node: '>=12.20'} hasBin: true - /unbzip2-stream/1.4.3: + /unbzip2-stream@1.4.3: resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} dependencies: buffer: 5.7.1 through: 2.3.8 dev: false - /unicode-canonical-property-names-ecmascript/2.0.0: + /unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} dev: true - /unicode-match-property-ecmascript/2.0.0: + /unicode-match-property-ecmascript@2.0.0: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} dependencies: @@ -4299,22 +4317,22 @@ packages: unicode-property-aliases-ecmascript: 2.1.0 dev: true - /unicode-match-property-value-ecmascript/2.1.0: + /unicode-match-property-value-ecmascript@2.1.0: resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} engines: {node: '>=4'} dev: true - /unicode-property-aliases-ecmascript/2.1.0: + /unicode-property-aliases-ecmascript@2.1.0: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} dev: true - /universalify/2.0.0: + /universalify@2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} dev: true - /update-browserslist-db/1.0.10_browserslist@4.21.4: + /update-browserslist-db@1.0.10(browserslist@4.21.4): resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} hasBin: true peerDependencies: @@ -4325,17 +4343,17 @@ packages: picocolors: 1.0.0 dev: true - /uri-js/4.4.1: + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.0 dev: true - /util-deprecate/1.0.2: + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: false - /v8-to-istanbul/9.0.1: + /v8-to-istanbul@9.0.1: resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==} engines: {node: '>=10.12.0'} dependencies: @@ -4344,24 +4362,24 @@ packages: convert-source-map: 1.9.0 dev: true - /walker/1.0.8: + /walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: makeerror: 1.0.12 dev: true - /webidl-conversions/3.0.1: + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} dev: false - /whatwg-url/5.0.0: + /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 dev: false - /which/2.0.2: + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true @@ -4369,12 +4387,12 @@ packages: isexe: 2.0.0 dev: true - /word-wrap/1.2.3: + /word-wrap@1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} dev: true - /wrap-ansi/7.0.0: + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} dependencies: @@ -4382,10 +4400,10 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 - /wrappy/1.0.2: + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - /write-file-atomic/4.0.2: + /write-file-atomic@4.0.2: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: @@ -4393,7 +4411,7 @@ packages: signal-exit: 3.0.7 dev: true - /ws/8.13.0: + /ws@8.13.0: resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'} peerDependencies: @@ -4406,23 +4424,23 @@ packages: optional: true dev: false - /y18n/5.0.8: + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - /yallist/3.1.1: + /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true - /yallist/4.0.0: + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true - /yargs-parser/21.1.1: + /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - /yargs/17.7.1: + /yargs@17.7.1: resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} engines: {node: '>=12'} dependencies: @@ -4434,14 +4452,14 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 - /yauzl/2.10.0: + /yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} dependencies: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 dev: false - /yocto-queue/0.1.0: + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true diff --git a/publish/package.json b/publish/package.json index b050f2b9..3e559856 100644 --- a/publish/package.json +++ b/publish/package.json @@ -1,6 +1,6 @@ { "name": "x-crawl", - "version": "6.0.1", + "version": "7.0.0", "author": "coderHXL", "description": "x-crawl is a flexible Node.js multifunctional crawler library.", "license": "MIT",