piclist
Version:
Modified PicGo core, A tool for picture uploading
6 lines • 178 kB
JavaScript
/*
* piclist@2.4.2, https://github.com/Kuingsmile/PicList-Core
* (c) 2022-2026 Kuingsmile
* Released under the MIT License.
*/
import{EventEmitter as e}from"node:events";import t,{dirname as r}from"node:path";import n from"axios";import i from"fs-extra";import{readJSONSync as a,ensureDirSync as s,emptyDirSync as o,pathExistsSync as E,createFileSync as S,outputFileSync as c,removeSync as l,moveSync as I,ensureFileSync as _,remove as u}from"fs-extra/esm";import P from"heic-convert";import{cloneDeep as p,merge as d,get as g,set as A,unset as f}from"lodash-es";import C from"sharp";import T from"node:crypto";import D,{URL as m,fileURLToPath as h,pathToFileURL as L}from"node:url";import{imageSize as B}from"image-size";import N from"mime";import{ulid as U}from"ulid";import{v4 as R}from"uuid";import M from"text-to-svg";import O,{homedir as y}from"node:os";import w from"node:vm";import G from"dotenv";import{ObjectAdapter as b,I18n as x}from"@piclist/i18n";import W from"js-yaml";import{Command as F}from"commander";import{input as $,checkbox as H,select as v,confirm as K,password as k}from"@inquirer/prompts";import Y from"node:util";import V from"chalk";import z from"dayjs";import{spawn as j}from"cross-spawn";import q from"resolve";import X from"node:https";import Q from"form-data";import{httpsOverHttp as Z}from"tunnel";import{S3Client as J,PutObjectCommand as ee,GetObjectCommand as te}from"@aws-sdk/client-s3";import{getSignedUrl as re}from"@aws-sdk/s3-request-presigner";import{NodeHttpHandler as ne}from"@smithy/node-http-handler";import{fileTypeFromBuffer as ie}from"file-type";import{HttpsProxyAgent as ae,HttpProxyAgent as se}from"hpagent";import oe from"qiniu";import{NodeSSH as Ee}from"node-ssh-no-cpu-features";import{AuthType as Se,createClient as ce}from"webdav";import{JSONStore as le}from"@piclist/store";import{spawn as Ie,execFile as _e}from"node:child_process";import ue from"is-wsl";const Pe=[],pe=e=>Pe.some(t=>e.startsWith(t)),de=e=>"object"==typeof e&&!Array.isArray(e)&&Object.keys(e).length>0;function ge(e){try{return JSON.parse(e)}catch(e){return JSON.parse("{}")}}const Ae=(e=0)=>isNaN(Number(e))?0:Number(e),fe=()=>"development"===process.env.NODE_ENV,Ce=(...e)=>e.every(e=>null!=e&&("string"==typeof e?""!==e:"number"==typeof e?e>0:"object"!=typeof e||Object.keys(e).length>0)),Te=["avif","dz","fits","gif","heif","input","jpeg","jpg","jp2","jxl","magick","openslide","pdf","png","ppm","raw","svg","tiff","tif","v","webp"],De=["jpg","jpeg","png","webp","bmp","tiff","tif","svg","ico","avif","heif","heic","gif"],me=Buffer.from("Exif\0\0","binary"),he=Buffer.from([137,80,78,71,13,10,26,10]),Le=e=>Te.includes(e);function Be(e){const t="string"==typeof e.formatConvertObj?ge(e.formatConvertObj):e.formatConvertObj;return{quality:Ae(e.quality),isConvert:e.isConvert||!1,convertFormat:e.convertFormat||"jpg",isReSize:e.isReSize||!1,reSizeHeight:Ae(e.reSizeHeight),reSizeWidth:Ae(e.reSizeWidth),skipReSizeOfSmallImg:e.skipReSizeOfSmallImg||!1,isReSizeByPercent:e.isReSizeByPercent||!1,longEdgeAsHeight:e.longEdgeAsHeight||!1,reSizePercent:Ae(e.reSizePercent),isRotate:e.isRotate||!1,isFlip:e.isFlip||!1,isFlop:e.isFlop||!1,rotateDegree:Ae(e.rotateDegree),picBed:e.picBed||"smms",formatConvertObj:t||{}}}function Ne(e,t){return"heif"===e?{quality:t,compression:"av1"}:{quality:t,mozjpeg:!0}}async function Ue(e,t){return t.isReSizeByPercent?async function(e,t){if(!t.isReSizeByPercent||!Ce(t.reSizePercent))return e;const{width:r,height:n}=await e.metadata();return r&&n?e.resize(Math.round(r*t.reSizePercent/100),Math.round(n*t.reSizePercent/100),{fit:"inside"}):e}(e,t):async function(e,t){if(t.isReSizeByPercent||!t.isReSize)return e;const r="number"==typeof t.reSizeHeight&&t.reSizeHeight>0,n="number"==typeof t.reSizeWidth&&t.reSizeWidth>0;if(r&&n)return e.resize(t.reSizeWidth,t.reSizeHeight,{fit:"fill"});const i=r&&("number"!=typeof t.reSizeWidth||0===t.reSizeWidth),a=n&&("number"!=typeof t.reSizeHeight||0===t.reSizeHeight);if(!i&&!a)return e;const{width:s,height:o}=await e.metadata();if(!s||!o)return e;if(i){const r=t.longEdgeAsHeight&&s>o?s:o;if(!t.skipReSizeOfSmallImg||t.skipReSizeOfSmallImg&&t.reSizeHeight<r){const n=t.reSizeHeight/r;return e.resize(Math.round(s*n),Math.round(o*n),{fit:"inside"})}}if(a&&(!t.skipReSizeOfSmallImg||t.skipReSizeOfSmallImg&&t.reSizeWidth<s)){const r=t.reSizeWidth/s;return e.resize(t.reSizeWidth,Math.round(o*r),{fit:"inside"})}return e}(e,t)}async function Re(e,t,r,n){t=Be(t);try{if(r=Me(r),!De.includes(r)||"gif"===r)return e;let n=C(e,{animated:!0});const a=(i=t.quality,Ce(i)&&i<100?Math.min(Math.max(Math.round(i),1),100):100);return n=await Ue(n,t),n=function(e,t){return t.isRotate&&t.rotateDegree&&(e=e.rotate(t.rotateDegree,{background:{r:255,g:255,b:255,alpha:0}})),t.isFlip&&(e=e.flip()),t.isFlop&&(e=e.flop()),e}(n,t),n=function(e,t,r,n){if(t.isConvert){const i=qe(t,r);return i!==r?e.toFormat(i,Ne(i,n)):e}return r&&Le(r)?e.toFormat(r,Ne(r,n)):e.toFormat("jpg",{quality:n,mozjpeg:!0})}(n,t,r,a),await n.toBuffer()}catch(t){return n.error(`Image process error: ${t}`),e}var i}const Me=e=>e.toLowerCase().replace(".","");function Oe(e){return 1===e||217===e||e>=208&&e<=215}function ye(e,t,r){if(0===r)return 0;if(r<0||r>8||t+r>e.length)return;let n=0n;for(let i=0;i<r;i++)n=(n<<8n)+BigInt(e[t+i]);return n>BigInt(Number.MAX_SAFE_INTEGER)?void 0:Number(n)}function we(e,t,r,n){if(0===r)return!0;if(r<0||r>8||t+r>e.length||n<0||!Number.isSafeInteger(n))return!1;const i=1n<<8n*BigInt(r);let a=BigInt(n);if(a>=i)return!1;for(let n=r-1;n>=0;n--)e[t+n]=Number(0xffn&a),a>>=8n;return!0}function Ge(e,t,r=e.length){if(t+8>r)return;let n=e.readUInt32BE(t),i=8;if(1===n){const r=ye(e,t+8,8);if(!r)return;n=r,i=16}else 0===n&&(n=r-t);return n<i||t+n>r?void 0:{type:e.subarray(t+4,t+8).toString("ascii"),start:t,size:n,headerSize:i,dataStart:t+i,end:t+n}}function be(e,t,r){const n=[];let i=t;for(;i<r;){const t=Ge(e,i,r);if(!t)return;n.push(t),i=t.end}return i===r?n:void 0}function xe(e,t){const r=Buffer.alloc(8+t.length);return r.writeUInt32BE(r.length,0),r.write(e,4,4,"ascii"),t.copy(r,8),r}function We(e){const t=Ge(e,0);if(!t||"infe"!==t.type||t.end!==e.length||t.dataStart+12>e.length)return;const r=e[t.dataStart];if(r<2)return;const n=2===r?2:4,i=ye(e,t.dataStart+4,n),a=t.dataStart+4+n+2;return void 0===i||a+4>e.length?void 0:"Exif"===e.subarray(a,a+4).toString("ascii")?i:void 0}function Fe(e){if(e.length<6)return;const t=e[0],r=0===t?2:4,n=ye(e,4,r);if(void 0===n)return;const i=[],a=new Set;let s=4+r,o=0;for(;s<e.length;){const t=Ge(e,s);if(!t||t.end>e.length)return;o++;const r=Buffer.from(e.subarray(t.start,t.end)),n=We(r);void 0===n?i.push(r):a.add(n),s=t.end}return o===n?{version:t,flags:Buffer.from(e.subarray(0,4)),countSize:r,keptEntries:i,exifItemIds:a}:void 0}function $e(e){const t=Buffer.alloc(4+e.countSize);if(e.flags.copy(t,0),we(t,4,e.countSize,e.keptEntries.length))return xe("iinf",Buffer.concat([t,...e.keptEntries]))}function He(e){if(e.length<8)return;const t=e[0],r=e[4]>>4,n=15&e[4],i=e[5]>>4,a=1===t||2===t?15&e[5]:0,s=t<2?2:4,o=t<2?2:4,E=ye(e,6,o);if(void 0===E)return;const S=[];let c=6+o;for(let o=0;o<E;o++){const o=ye(e,c,s);if(void 0===o)return;c+=s;let E=0,l=0;if(1===t||2===t){if(c+2>e.length)return;l=e.readUInt16BE(c),E=15&l,c+=2}if(c+2>e.length)return;const I=e.readUInt16BE(c);c+=2;const _=ye(e,c,i);if(void 0===_)return;if(c+=i,c+2>e.length)return;const u=e.readUInt16BE(c);c+=2;const P=[];for(let t=0;t<u;t++){const t=ye(e,c,a);if(void 0===t)return;c+=a;const i=ye(e,c,r);if(void 0===i)return;c+=r;const s=ye(e,c,n);if(void 0===s)return;c+=n,P.push({index:t,offset:i,length:s})}S.push({itemId:o,constructionMethod:E,constructionMethodField:l,dataReferenceIndex:I,baseOffset:_,extents:P})}return c===e.length?{version:t,flags:Buffer.from(e.subarray(0,4)),offsetSize:r,lengthSize:n,baseOffsetSize:i,indexSize:a,entries:S}:void 0}function ve(e,t,r){if(0!==t.constructionMethod||0!==t.dataReferenceIndex)return t;if(e.offsetSize>0){const e=t.extents.map(e=>({...e,offset:r(t.baseOffset+e.offset)}));return{...t,baseOffset:0,extents:e}}return 1===t.extents.length?{...t,baseOffset:r(t.baseOffset),extents:[{...t.extents[0],offset:0}]}:void 0}function Ke(e,t){const r=e.version<2?2:4,n=1===e.version||2===e.version?2:0,i=e.indexSize+e.offsetSize+e.lengthSize,a=r+n+2+e.baseOffsetSize+2+t.extents.length*i,s=Buffer.alloc(a);let o=0;if(we(s,o,r,t.itemId)&&(o+=r,n>0&&(s.writeUInt16BE(t.constructionMethodField,o),o+=n),s.writeUInt16BE(t.dataReferenceIndex,o),o+=2,we(s,o,e.baseOffsetSize,t.baseOffset))){o+=e.baseOffsetSize,s.writeUInt16BE(t.extents.length,o),o+=2;for(const r of t.extents){if(!we(s,o,e.indexSize,r.index))return;if(o+=e.indexSize,!we(s,o,e.offsetSize,r.offset))return;if(o+=e.offsetSize,!we(s,o,e.lengthSize,r.length))return;o+=e.lengthSize}return s}}function ke(e,t,r){const n=e.version<2?2:4,i=e.entries.filter(e=>!t.has(e.itemId)),a=Buffer.alloc(6+n);if(e.flags.copy(a,0),a[4]=e.offsetSize<<4|e.lengthSize,a[5]=e.baseOffsetSize<<4|(1===e.version||2===e.version?e.indexSize:0),!we(a,6,n,i.length))return;const s=[];for(const t of i){const n=ve(e,t,r);if(!n)return;const i=Ke(e,n);if(!i)return;s.push(i)}return xe("iloc",Buffer.concat([a,...s]))}function Ye(e,t){if(e.length<4)return;const r=0===e[0]?2:4,n=be(e,4,e.length);if(!n)return;const i=[];for(const a of n){let n=a.dataStart;const s=ye(e,n,r);if(void 0===s)return;if(n+=r,n+2>a.end)return;const o=e.readUInt16BE(n);n+=2;const E=[];for(let i=0;i<o;i++){const i=ye(e,n,r);if(void 0===i)return;n+=r,t.has(i)||E.push(i)}if(n!==a.end)return;if(t.has(s)||0===E.length)continue;const S=Buffer.alloc(r+2+E.length*r);let c=0;if(!we(S,c,r,s))return;c+=r,S.writeUInt16BE(E.length,c),c+=2;for(const e of E){if(!we(S,c,r,e))return;c+=r}i.push(xe(a.type,S))}return 0===i.length?null:xe("iref",Buffer.concat([e.subarray(0,4),...i]))}function Ve(e,t){if(e.length<8)return;const r=e[0]<1?2:4,n=1&~e.readUIntBE(1,3)?1:2,i=e.readUInt32BE(4),a=[];let s=8;for(let o=0;o<i;o++){const i=s,o=ye(e,s,r);if(void 0===o)return;if(s+=r,s>=e.length)return;const E=e[s];s++;const S=s+E*n;if(S>e.length)return;s=S,t.has(o)||a.push(Buffer.from(e.subarray(i,s)))}if(s!==e.length)return;const o=Buffer.alloc(8);return e.subarray(0,4).copy(o,0),o.writeUInt32BE(a.length,4),xe("ipma",Buffer.concat([o,...a]))}function ze(e,t){const r=be(e,0,e.length);if(!r)return;const n=[];for(const i of r)if("ipma"===i.type){const r=Ve(e.subarray(i.dataStart,i.end),t);if(!r)return;n.push(r)}else n.push(Buffer.from(e.subarray(i.start,i.end)));return xe("iprp",Buffer.concat(n))}function je(e){const t=be(e,0,e.length);if(!t)return e;const r=t.find(e=>"meta"===e.type);if(!r)return e;const n=function(e,t){const r=e.subarray(t.dataStart,t.end);if(r.length<4)return;const n=be(r,4,r.length);if(!n)return;let i,a;for(const e of n)"iinf"===e.type?i=Fe(r.subarray(e.dataStart,e.end)):"iloc"===e.type&&(a=He(r.subarray(e.dataStart,e.end)));if(!i||0===i.exifItemIds.size||!a)return;const s=function(e,t){if(0===e.lengthSize)return;const r=[];for(const n of e.entries)if(t.has(n.itemId)){if(0!==n.constructionMethod||0!==n.dataReferenceIndex)return;for(const e of n.extents){const t=n.baseOffset+e.offset,i=t+e.length;if(i<=t)return;r.push({start:t,end:i})}}return r}(a,i.exifItemIds);return s&&0!==s.length?{removedIntervals:s,buildMeta:e=>{const t=[];for(const s of n)if("iinf"===s.type){const e=$e(i);if(!e)return;t.push(e)}else if("iloc"===s.type){const r=ke(a,i.exifItemIds,e);if(!r)return;t.push(r)}else if("iref"===s.type){const e=Ye(r.subarray(s.dataStart,s.end),i.exifItemIds);if(void 0===e)return;e&&t.push(e)}else if("iprp"===s.type){const e=ze(r.subarray(s.dataStart,s.end),i.exifItemIds);if(!e)return;t.push(e)}else t.push(Buffer.from(r.subarray(s.start,s.end)));return xe("meta",Buffer.concat([r.subarray(0,4),...t]))}}:void 0}(e,r);if(!n)return e;const i=function(e){const t=[...e].sort((e,t)=>e.start-t.start);let r=-1;for(const e of t){if(e.end<=e.start||e.start<r)return;r=e.end}return t}(n.removedIntervals),a=t.filter(e=>"mdat"===e.type);if(!i||!i.every(e=>function(e,t){return t.some(t=>e.start>=t.dataStart&&e.end<=t.end)}(e,a)))return e;const s=n.buildMeta(e=>e);if(!s)return e;const o=s.length-r.size,E=function(e,t,r){return n=>{let i=e.start<n?t:0;for(const e of r)e.end<=n&&(i-=e.end-e.start);return n+i}}(r,o,i),S=n.buildMeta(E);if(!S||S.length!==s.length)return e;const c=t.map(t=>t.start===r.start?S:"mdat"===t.type?function(e,t,r){const n=r.filter(e=>e.start>=t.dataStart&&e.end<=t.end);if(0===n.length)return Buffer.from(e.subarray(t.start,t.end));const i=[];let a=t.dataStart;for(const t of n)a<t.start&&i.push(e.subarray(a,t.start)),a=t.end;return a<t.end&&i.push(e.subarray(a,t.end)),xe("mdat",Buffer.concat(i))}(e,t,i):Buffer.from(e.subarray(t.start,t.end)));return Buffer.concat(c)}function qe(e,t){if(e=Be(e||{}),"gif"===(t=Me(t)))return"gif";let r=e?.convertFormat||"jpg";if(e?.formatConvertObj&&Object.keys(e.formatConvertObj).length>0){const n=e.formatConvertObj;Object.keys(n).includes(t)&&(r=n[t],Le(r)||(r="jpg"))}return"imgur"===e?.picBed&&"webp"===r&&(r="jpg"),r}const Xe=(e,t)=>(t=Me(t),!!e&&!!e.isAddWatermark&&De.includes(t)&&"svg"!==t),Qe=(e,t)=>{if(!De.includes(Me(t))||!e)return!1;const{quality:r,isReSizeByPercent:n,reSizePercent:i,isReSize:a,reSizeHeight:s,reSizeWidth:o,isRotate:E,rotateDegree:S,isConvert:c,convertFormat:l,isFlip:I,isFlop:_}=Be(e);if(Ce(r)&&r<100)return!0;if(n&&Ce(i))return!0;if(a&&("number"==typeof s&&s>0||"number"==typeof o&&o>0))return!0;if(E&&S)return!0;if(I||_)return!0;if(c){const e=l||"jpg";return Me(t)!==Me(e)}return!1},Ze=async(e,t)=>(t=Me(t),De.includes(t)&&"svg"!==t?"jpg"===t||"jpeg"===t?function(e){if(e.length<4||255!==e[0]||216!==e[1])return e;const t=[e.subarray(0,2)];let r=2,n=!1;for(;r<e.length;){if(255!==e[r])return e;const i=r;for(;r<e.length&&255===e[r];)r++;if(r>=e.length)return e;const a=e[r];if(r++,218===a)return t.push(e.subarray(i)),n?Buffer.concat(t):e;if(Oe(a)){if(t.push(e.subarray(i,r)),217===a)return r<e.length&&t.push(e.subarray(r)),n?Buffer.concat(t):e;continue}if(r+2>e.length)return e;const s=e.readUInt16BE(r);if(s<2||r+s>e.length)return e;const o=r+s,E=r+2;225===a&&E+me.length<=o&&e.subarray(E,E+me.length).equals(me)?n=!0:t.push(e.subarray(i,o)),r=o}return n?Buffer.concat(t):e}(e):"png"===t?function(e){if(e.length<he.length+12||!e.subarray(0,he.length).equals(he))return e;const t=[e.subarray(0,he.length)];let r=he.length,n=!1;for(;r+12<=e.length;){const i=r,a=r+4,s=r+8,o=s+e.readUInt32BE(r)+4;if(o>e.length)return e;const E=e.subarray(a,s).toString("ascii");if("eXIf"===E?n=!0:t.push(e.subarray(i,o)),r=o,"IEND"===E)return r<e.length&&t.push(e.subarray(r)),n?Buffer.concat(t):e}return e}(e):"webp"===t?function(e){if(e.length<12||"RIFF"!==e.subarray(0,4).toString("ascii")||"WEBP"!==e.subarray(8,12).toString("ascii"))return e;const t=[Buffer.from(e.subarray(0,12))];let r=12,n=!1;for(;r+8<=e.length;){const i=r,a=e.subarray(r,r+4).toString("ascii"),s=e.readUInt32LE(r+4),o=r+8+s,E=o+s%2;if(o>e.length||E>e.length)return e;"EXIF"===a?n=!0:t.push(e.subarray(i,E)),r=E}if(!n||r!==e.length)return e;const i=Buffer.concat(t);return i.writeUInt32LE(i.length-8,4),i}(e):"avif"===t||"heic"===t||"heif"===t?je(e):e:e);function Je(e){return T.createHash("md5").update(e).digest("hex")}function et(e){return T.createHash("sha256").update(e).digest("hex")}function tt(e){return T.createHash("sha1").update(e).digest("hex")}const rt=e=>/^https?:\/\//.test(e),nt=e=>{e=e||"";try{return e!==decodeURI(e)}catch(e){return!1}},it=e=>(nt(e)||(e=encodeURI(e)),e),at=e=>{try{const{width:t=0,height:r=0,type:n}=B(e);return{real:!0,width:t,height:r,extname:n?`.${n}`:".png"}}catch(e){return{real:!1,width:200,height:200,extname:".png"}}},st=async e=>{try{return{extname:t.extname(e),fileName:t.basename(e),filePath:e,buffer:await i.readFile(e),success:!0}}catch{return{reason:`read file ${e} error`,success:!1}}};function ot(e){if(!e||e.length<4)return"";const t=(t,r)=>Array.from(e.subarray(t,r)).map(e=>e.toString(16).padStart(2,"0")).join("").toUpperCase(),r=t(0,4),n=t(0,3),i=t(0,2);if("FFD8FF"===n)return".jpg";if("89504E47"===r)return".png";if("47494638"===r)return".gif";if("424D"===i)return".bmp";if("52494646"===r){if("57454250"===t(8,12))return".webp"}return""}const Et=async(e,r)=>{let n;e=it(e);const i=new Promise((i,a)=>{(async()=>{try{const{res:a,headers:s}=await r.request({method:"get",url:e,resolveWithFullResponse:!0,responseType:"arraybuffer"}).then(e=>({res:e.data,headers:e.headers}));clearTimeout(n);const o=new m(e).pathname;let E="";try{E=new m(e).searchParams.get("wx_fmt")||t.extname(o)||""}catch(e){E=t.extname(o)||""}const S=s["content-type"]||s["Content-Type"]||"";!E&&S&&(E=function(e){if(!e)return"";const t=e.toLocaleLowerCase().split(";")[0].trim();if(!t.startsWith("image/"))return"";const r=N.getExtension(t);return r?`.${r}`:""}(String(S))),E||(E=ot(a)),!E.startsWith(".")&&E&&(E=`.${E}`),i({buffer:a,fileName:t.basename(o),extname:E,success:!0})}catch(t){clearTimeout(n),i({success:!1,reason:`request ${e} error, ${t?.message??""}`})}})().catch(a)}),a=new Promise(t=>{n=setTimeout(()=>{t({success:!1,reason:`request ${e} timeout`})},3e4)});return Promise.race([i,a])},St=e=>/^@[^/]+\/picgo-plugin-/.test(e)?"scope":e.startsWith("picgo-plugin-")?"normal":ct(e)?"simple":"unknown",ct=e=>{if(t.isAbsolute(e))return!1;const r=t.join(process.cwd(),e);return!i.existsSync(r)&&(!e.includes("/")&&!e.includes("\\"))},lt=(e,t="")=>t?`@${t}/picgo-plugin-${e}`:`picgo-plugin-${e}`,It=(e,r=console)=>{switch(St(e)){case"normal":case"scope":return e;case"simple":return lt(e);default:{let n=e;return t.isAbsolute(e)&&i.existsSync(e)?ut(n):(n=t.join(process.cwd(),e),i.existsSync(n)?ut(n):(r.warn(`Can't find plugin ${e}`),""))}}},_t=(e,r=console)=>{switch(St(e)){case"normal":return Pt(e);case"scope":return Pt(e,!0);case"simple":return Pt(lt(e));default:{if(!i.existsSync(e))return r.warn(`Can't find plugin: ${e}`),"";const n=t.posix.join(e,"package.json");if(i.existsSync(n)){const e=a(n)||{};return e.name?.includes("picgo-plugin-")?e.name:(r.warn(`The plugin package.json's name filed is ${e.name||"empty"}, need to include the prefix: picgo-plugin-`),"")}return r.warn(`Can't find plugin: ${e}`),""}}},ut=e=>e.split(t.sep).join("/"),Pt=(e,t=!1)=>{if(!e.includes("@"))return e;let r=/(.+\/)?(picgo-plugin-[\w-]+)(@.+)*/;t&&(r=/(.+\/)?(^@[^/]+\/picgo-plugin-\w+)(@.+)*/);const n=e.match(r);return n?n[2]:(console.warn("can not remove plugin version"),e)},pt=(e,t,r,n)=>e??t?.[r]??n,dt=(e,t,r,n)=>!!pt(e,t,r,n),gt=(e,t,r,n)=>Ae(pt(e,t,r,n));function At(e,t,r,n){e=e||{};return{isAddWatermark:dt(t.isAddWatermark,e.isAddWatermarkMap,r,e.isAddWatermark),watermarkType:pt(t.watermarkType,e.watermarkTypeMap,r,e.watermarkType)||"text",isFullScreenWatermark:dt(t.isFullScreenWatermark,e.isFullScreenWatermarkMap,r,e.isFullScreenWatermark),watermarkDegree:gt(t.watermarkDegree,e.watermarkDegreeMap,r,e.watermarkDegree),watermarkText:pt(t.watermarkText,e.watermarkTextMap,r,e.watermarkText)||"",watermarkFontPath:(t.watermarkFontPath??e.watermarkFontPath)||"",watermarkScaleRatio:gt(t.watermarkScaleRatio,e.watermarkScaleRatioMap,r,e.watermarkScaleRatio),watermarkColor:pt(t.watermarkColor,e.watermarkColorMap,r,e.watermarkColor)||"rgba(204, 204, 204, 0.45)",watermarkImagePath:pt(t.watermarkImagePath,e.watermarkImagePathMap,r,e.watermarkImagePath)||"",watermarkPosition:pt(t.watermarkPosition,e.watermarkPositionMap,r,e.watermarkPosition)||"southeast",watermarkImageOpacity:gt(t.watermarkImageOpacity,e.watermarkImageOpacityMap,r,e.watermarkImageOpacity),picBed:r,id:n}}function ft(e,t,r,n){e=e||{};return{quality:gt(t.quality,e.qualityMap,r,e.quality),isConvert:dt(t.isConvert,e.isConvertMap,r,e.isConvert),convertFormat:pt(t.convertFormat,e.convertFormatMap,r,e.convertFormat)||"jpg",isReSize:dt(t.isReSize,e.isReSizeMap,r,e.isReSize),reSizeHeight:gt(t.reSizeHeight,e.reSizeHeightMap,r,e.reSizeHeight),reSizeWidth:gt(t.reSizeWidth,e.reSizeWidthMap,r,e.reSizeWidth),skipReSizeOfSmallImg:dt(t.skipReSizeOfSmallImg,e.skipReSizeOfSmallImgMap,r,e.skipReSizeOfSmallImg),isReSizeByPercent:dt(t.isReSizeByPercent,e.isReSizeByPercentMap,r,e.isReSizeByPercent),reSizePercent:gt(t.reSizePercent,e.reSizePercentMap,r,e.reSizePercent),longEdgeAsHeight:dt(t.longEdgeAsHeight,e.longEdgeAsHeightMap,r,e.longEdgeAsHeight),isRotate:dt(t.isRotate,e.isRotateMap,r,e.isRotate),rotateDegree:gt(t.rotateDegree,e.rotateDegreeMap,r,e.rotateDegree),isRemoveExif:dt(t.isRemoveExif,e.isRemoveExifMap,r,e.isRemoveExif),isFlip:dt(t.isFlip,e.isFlipMap,r,e.isFlip),isFlop:dt(t.isFlop,e.isFlopMap,r,e.isFlop),formatConvertObj:pt(t.formatConvertObj,e.formatConvertObjMap,r,e.formatConvertObj)||{},picBed:r,id:n}}function Ct(e){const t=new Array(e);let r=0,n=0,i=0;for(;r<e;){if(i<6){n=n<<30|1073741824*Math.random()>>>0,i+=30;continue}const e=63&n;n>>>=6,i-=6,e<62&&(t[r++]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"[e])}return t.join("")}function Tt(e){return 1===e.toString().length?`0${e}`:e.toString()}function Dt(e,r,n,i){const a=new Date,s=a.getFullYear().toString(),o=t.basename(e,t.extname(e)),E={"{Y}":()=>s,"{y}":()=>s.slice(2),"{m}":()=>Tt(a.getMonth()+1),"{d}":()=>Tt(a.getDate()),"{h}":()=>Tt(a.getHours()),"{i}":()=>Tt(a.getMinutes()),"{s}":()=>Tt(a.getSeconds()),"{ms}":()=>a.getMilliseconds().toString().padStart(3,"0"),"{md5}":()=>Je(i||o),"{sha1}":()=>tt(i||o),"{sha256}":()=>et(i||o),"{md5-16}":()=>Je(i||o).slice(0,16),"{filename}":()=>n?t.basename(n,t.extname(n)):o,"{uuid}":()=>R().replace(/-/g,""),"{ulid}":()=>U(),"{timestampS}":()=>Math.floor(a.getTime()/1e3).toString(),"{timestamp}":()=>a.getTime().toString()};if(void 0===r||!Object.keys(E).some(e=>r.includes(e))&&!r.includes("localFolder:")&&!r.includes("str-")&&!/{sha256-\d+}/.test(r)&&!/{sha1-\d+}/.test(r))return e;const S=t.extname(e);let c=Object.keys(E).reduce((e,t)=>e.replace(new RegExp(t,"g"),E[t]()),r)+S;return c=c.replace(/{str-(\d+)}/gi,(e,t)=>Ct(parseInt(t,10))),c=c.replace(/{sha256-(\d+)}/gi,(e,t)=>{const r=parseInt(t,10);return et(i||o).slice(0,r)}),c=c.replace(/{sha1-(\d+)}/gi,(e,t)=>{const r=parseInt(t,10);return tt(i||o).slice(0,r)}),c=c.replace(/{(localFolder:?(\d+)?)}/gi,(r,n,i)=>{i=Math.max(1,i||0);return t.dirname(e).split(t.sep).slice(0-i).reduce((e,t)=>`${e}/${t}`).replace(/:/g,"")}),c}const mt=r(h(import.meta.url));const ht=(()=>{const e="common"===t.basename(mt)?t.dirname(mt):mt;return t.join(e,"assets","piclist.png")})();async function Lt(e,t,r,n,i,a,s,o,E,S,c,l){o=!o||o<0||o>1?.15:o;const I=C(e,{animated:!0}),{width:_=200}=await I.metadata(),u=await async function(e,t,r,n,i,a,s,o=200,E=0,S=255){let c;"image"===e?(S=Ae(S),s=s||ht,c=await C(s).composite([{input:Buffer.from([255,255,255,S>255?255:S]),raw:{width:1,height:1,channels:4},tile:!0,blend:"dest-in"}]).toBuffer()):c=await async function(e,t,r,n){t=t||"测试",n=n||e;const i={anchor:"top",attributes:{fill:r=r||"rgba(204, 204, 204, 0.45)"}},a=M.loadSync(n).getSVG(t,i);return Buffer.from(a)}(t,r,a,n||t);const{width:l,height:I}=await async function(e){const{width:t,height:r}=await C(e).metadata();return{width:t||200,height:r||200}}(c),_=Math.floor(o*Ae(i)),u=Math.floor(_*I/l);return await C(c).resize(_,u,{fit:"inside"}).rotate(E,{background:{r:255,g:255,b:255,alpha:0}}).toBuffer()}(t,r,a,s,o,E,S,_,i,l);return await I.composite([{input:u,gravity:c||"southeast",tile:n}]).toBuffer()}async function Bt(e,t,r,n){try{let n=C(e,{animated:!0});return n=C(await Lt(e,t.watermarkType||"text",r,t.isFullScreenWatermark,Ae(t.watermarkDegree),t.watermarkText,t.watermarkFontPath,Ae(t.watermarkScaleRatio),t.watermarkColor,t.watermarkImagePath,t.watermarkPosition,Ae(t.watermarkImageOpacity)),{animated:!0}),await n.toBuffer()}catch(t){return n.error(`Image add watermark error: ${t}`),e}}var Nt=Object.freeze({__proto__:null,AddWatermark:Lt,configBlackList:Pe,forceNumber:Ae,getConvertedFormat:qe,getFSFile:st,getImageSize:at,getImageTypeByMagicNumber:ot,getMd5:Je,getNormalPluginName:_t,getPluginNameType:St,getProcessPluginName:It,getTreatedCompressOptions:ft,getTreatedWaterMarkOptions:At,getURLFile:Et,handleCompletePluginName:lt,handleStreamlinePluginName:e=>/^@[^/]+\/picgo-plugin-/.test(e)?e.replace(/^@[^/]+\/picgo-plugin-/,""):e.replace(/picgo-plugin-/,""),handleUnixStylePath:ut,handleUrlEncode:it,imageAddWaterMark:Bt,imageCompress:Re,isConfigKeyInBlackList:pe,isDev:fe,isInputConfigValid:de,isNeedAddWatermark:Xe,isNeedCompress:Qe,isSimpleName:ct,isUrl:rt,isUrlEncode:nt,randomStringGenerator:Ct,removeExif:Ze,removePluginVersion:Pt,renameFileNameWithCustomString:Dt,renameFileNameWithRandomString:function(e,r=5){return`${Ct(r)}${t.extname(e)}`},renameFileNameWithTimestamp:function(e){return`${Math.floor(Date.now()/1e3)}${Ct(5)}${t.extname(e)}`},safeParse:ge});var Ut,Rt,Mt;function Ot(e){if(e instanceof Error)return`${e.name}: ${e.message}\n${e.stack}`;try{return JSON.stringify(e)}catch{return String(e)}}!function(e){e.success="success",e.info="info",e.warn="warn",e.error="error"}(Ut||(Ut={})),function(e){e.UPLOAD_PROGRESS="uploadProgress",e.FAILED="failed",e.BEFORE_TRANSFORM="beforeTransform",e.BEFORE_UPLOAD="beforeUpload",e.AFTER_UPLOAD="afterUpload",e.FINISHED="finished",e.INSTALL="install",e.UNINSTALL="uninstall",e.UPDATE="update",e.NOTIFICATION="notification"}(Rt||(Rt={})),function(e){e.CONFIG_CHANGE="CONFIG_CHANGE"}(Mt||(Mt={}));class yt{ctx;scriptCache=new Map;stages=["preProcess","beforeTransform","transform","beforeUpload","upload","afterUpload"];constructor(e){this.ctx=e}async refreshCache(){this.scriptCache.clear();const e=t.join(this.ctx.baseDir,"scripts"),r=this.ctx.getConfig()||{},n=r.scripts?.disabledList||[];await Promise.all(this.stages.map(async r=>{const a=r,s=t.join(e,r);try{const e=await i.readdir(s),o=[];for(const r of e)if(r.endsWith(".js")&&!n.includes(`${a}/${r}`)){const e=t.join(s,r),n=await i.readFile(e,"utf-8"),a=new w.Script(n,{filename:e});o.push({path:e,compiledScript:a})}this.scriptCache.set(r,o)}catch(e){this.scriptCache.set(r,[])}}))}async runStage(e,t={}){const r=this.scriptCache.get(e)||[];if(0!==r.length)for(const e of r)try{const r=this.createSandbox(t),n=w.createContext(r);if(e.compiledScript.runInContext(n),"function"==typeof n.main){const r=n.main(this.ctx,t);await(r instanceof Promise?r:Promise.resolve(r)),this.ctx.log.info(`[Script] ${e.path} executed successfully`)}}catch(t){this.ctx.log.error(`[Script] ${e.path} failed: ${t}`)}}createSandbox(e){const r=function(e){if(i.existsSync(e)){const t=i.readFileSync(e),r=G.parse(t);for(const e in r)process.env[e]=r[e];return r}return{}}(t.join(this.ctx.baseDir,".env"));return{ctx:this.ctx,extra:e,console:Object.freeze({log:(...e)=>this.ctx.log.info(e.map(Ot).join(" ")),info:(...e)=>this.ctx.log.info(e.map(Ot).join(" ")),error:(...e)=>this.ctx.log.error(e.map(Ot).join(" ")),debug:(...e)=>this.ctx.log.debug(e.map(Ot).join(" "))}),axios:n,crypto:T,fs:i,path:t,os:O,Buffer:Buffer,setTimeout:setTimeout,setInterval:setInterval,clearTimeout:clearTimeout,clearInterval:clearInterval,base64Decode:e=>Buffer.from(e,"base64").toString("utf-8"),base64Encode:e=>(Buffer.isBuffer(e)?e:Buffer.from(String(e))).toString("base64"),env:r}}}const wt="Add watermark to image",Gt="Compress or convert image",bt="Remove exif info",xt="Download ttf file",Wt="Download ttf file successfully",Ft="Download ttf file failed",$t="Download ttf file failed, skip add watermark",Ht=0,vt=30,Kt=60,kt=-1,Yt=["zip","rar","7z","tar","gz","tar.gz","tar.bz2","tar.xz"],Vt="smms",zt=(e,t)=>e.find(e=>e.id===t);class jt extends e{ctx;ttfPath;constructor(e){super(),this.ctx=e,this.ttfPath=t.join(e.baseDir,"assets","simhei.ttf"),this.initializeDirs()}initializeDirs(){s(t.join(this.ctx.baseDir,"imgTemp"));this.ctx.getConfig("settings.enableSecondUploader")||!1||o(t.join(this.ctx.baseDir,"piclistTemp"))}async downloadTTF(){try{if(s(t.dirname(this.ttfPath)),i.existsSync(this.ttfPath)&&i.statSync(this.ttfPath).size>0)return!0;this.ctx.log.info(xt);const e=await n.get("https://release.piclist.cn/simhei.ttf",{responseType:"arraybuffer"});return i.writeFileSync(this.ttfPath,e.data),this.ctx.log.info(Wt),!0}catch(e){return this.ctx.log.error(Ft),!1}}getProcessingOptions(e){const t=e.getConfig("buildIn.compress"),r=e.getConfig("buildIn.watermark"),n=e.getConfig("buildIn.list")||[],i=this.getUploaderType(e),a=zt(n,i.id),s=a?.compress||{},o=a?.watermark||{};if(t){t.picBed=i.picBed,t.id=i.id;const e="string"==typeof t.formatConvertObj?ge(t.formatConvertObj):t.formatConvertObj;t.formatConvertObj=e}r&&(r.picBed=i.picBed,r.id=i.id);return{compressOptions:ft(t,s,i.picBed,i.id),watermarkOptions:At(r,o,i.picBed,i.id)}}getUploaderType(e){const t=e.getConfig("picBed.uploader")||e.getConfig("picBed.current")||Vt,r=e.getConfig(`picBed.${t}`)||{};return{picBed:t,id:r._id||"",config:r}}getSkipExtensions(e){const t=e.getConfig("buildIn.skipProcess")||{},r=e.getConfig("buildIn.list")||[],n=this.getUploaderType(e),i=zt(r,n.id)?.skipProcess||{},a=(s=i.skipProcessExtList,o=t.skipProcessExtList,s?s.split(",").map(e=>e.trim()):o?o.split(",").map(e=>e.trim()):Yt);var s,o;return new Set(a.map(e=>{const t=e.trim().toLowerCase();return t.startsWith(".")?t:`.${t}`}))}async start(e,t=!1){const r=(e=>({configPath:e.configPath,baseDir:e.baseDir,log:e.log,cmd:e.cmd,output:[],input:[],rawInput:[],rawInputPath:[],processedInput:[],pluginLoader:e.pluginLoader,pluginHandler:e.pluginHandler,Request:e.Request,helper:e.helper,VERSION:e.VERSION,GUI_VERSION:e.GUI_VERSION,request:e.request,i18n:e.i18n,configManager:e.configManager,getConfig:e.getConfig.bind(e),saveConfig:e.saveConfig.bind(e),removeConfig:e.removeConfig.bind(e),setConfig:e.setConfig.bind(e),unsetConfig:e.unsetConfig.bind(e),upload:e.upload.bind(e),uploadReturnCtx:e.uploadReturnCtx.bind(e),addListener:e.addListener.bind(e),on:e.on.bind(e),once:e.once.bind(e),removeListener:e.removeListener.bind(e),off:e.off.bind(e),removeAllListeners:e.removeAllListeners.bind(e),setMaxListeners:e.setMaxListeners.bind(e),getMaxListeners:e.getMaxListeners.bind(e),listeners:e.listeners.bind(e),rawListeners:e.rawListeners.bind(e),emit:e.emit.bind(e),listenerCount:e.listenerCount.bind(e),prependListener:e.prependListener.bind(e),prependOnceListener:e.prependOnceListener.bind(e),eventNames:e.eventNames.bind(e),changeCurrentUploader:e.changeCurrentUploader.bind(e)}))(this.ctx);try{if(!Array.isArray(e))throw new Error("Input must be an array.");return this.initializeContext(r,e),t?await this.handleSkipProcess(r):await this.executeLifecycle(r)}catch(e){return this.handleError(r,e)}}initializeContext(e,t){e.input=t,e.output=[],e.processedInput=[],e.rawInputPath=[],e.rawInput=p(t)}async handleSkipProcess(e){const t=new yt(e);return await t.refreshCache(),e.output=e.input,await this.doUpload(e),await t.runStage("upload"),e.input=e.rawInput,await this.afterUpload(e),await t.runStage("afterUpload"),e}async executeLifecycle(e){const t=new yt(e);return await t.refreshCache(),await this.preprocess(e),await t.runStage("preProcess"),await this.beforeTransform(e),await t.runStage("beforeTransform"),await this.doTransform(e),await t.runStage("transform"),await this.buildInRename(e),await this.beforeUpload(e),await t.runStage("beforeUpload"),e.processedInput=p(e.output),await this.doUpload(e),await t.runStage("upload"),e.input=e.rawInput,await this.afterUpload(e),await t.runStage("afterUpload"),e}handleError(e,t){if(e.log.warn(Rt.FAILED),e.emit(Rt.UPLOAD_PROGRESS,kt),e.emit(Rt.FAILED,t),e.log.error(t),e.getConfig("debug"))throw t;return e}async preprocess(e){const{compressOptions:r,watermarkOptions:n}=this.getProcessingOptions(e),i=this.getSkipExtensions(e);if(e.emit(Rt.UPLOAD_PROGRESS,Ht),e.emit(Rt.BEFORE_TRANSFORM,e),e.log.info("Pre-processing images, please wait..."),r||n){const a=t.join(e.baseDir,"piclistTemp");await this.processImages(e,a,r,n,i)}else this.initializeRawInputPaths(e);return e}initializeRawInputPaths(e){for(const t of e.input)e.rawInputPath.push(t)}async processImages(e,t,r,n,i){const a=await Promise.allSettled(e.input.map(async(a,s)=>{await this.processImage(a,s,e,t,r,n,i)}));for(const t of a)"rejected"===t.status&&e.log.error("Error processing image:",t.reason)}async processImage(e,r,n,a,s,o,E){const S=rt(e),c=S?await Et(e,n):{success:!1};if(S&&(!c.success||!c.buffer))return;n.rawInputPath[r]=e;const l=S?void 0:i.readFileSync(e),I=S?c.extname||"":((e,r)=>{const n=t.extname(e);return n||ot(r)||n})(e,l),_=E.has(I.toLowerCase()),u=S?c.buffer:l,P=await this.applyProcessing(u,I,s,o,_,e,a,n);P&&await this.saveProcessedImage(e,r,n,a,P,I,s,S,c)}async applyProcessing(e,t,r,n,i,a,s,o){let E;return Qe(r,t)&&!i&&(E=await this.compressImage(e,E,t,r,a,s,o)),Xe(n,t)&&!i&&(E=await this.addWatermark(E??e,n,o)),E||!r?.isRemoveExif||i||(o.log.info(bt),E=await Ze(e,t)),E}async addWatermark(e,t,r){if(!t?.watermarkFontPath&&"image"!==t?.watermarkType){if(!await this.downloadTTF())return void this.ctx.log.warn($t)}return r.log.info(wt),await Bt(e,t,this.ttfPath,r.log)}async compressImage(e,t,r,n,i,a,s){s.log.info(Gt);const o=r.toLowerCase();return rt(i)||".heic"!==o&&".heif"!==o?await Re(t??e,n,r,s.log):await this.convertHeicAndCompress(e,i,r,a,n,s)}async convertHeicAndCompress(e,r,n,a,s,o){const E=await this.convertHeicToJpegBuffer(e),S=t.join(a,`${t.basename(r,n)}.jpg`);return i.writeFileSync(S,E),await Re(E,s,".jpg",o.log)}async convertHeicToJpegBuffer(e){try{return await C(e,{animated:!0}).jpeg({quality:100}).toBuffer()}catch(t){const r=await P({buffer:e,format:"JPEG",quality:1});return Buffer.from(r)}}async saveProcessedImage(e,r,n,a,s,o,E,S,c){let l=E?.isConvert?qe(E,o):o;l=l.startsWith(".")?l:`.${l}`;const I=S?t.join(a,`${this.getFileBaseName(c)}${l}`):t.join(a,`${t.basename(e,o)}${l}`);n.rawInputPath[r]=t.join(t.dirname(e),S?t.basename(I):`${t.basename(e,o)}${l}`),i.writeFileSync(I,s),n.input[r]=I}getFileBaseName(e){return e.fileName?t.basename(e.fileName,t.extname(e.fileName)):(new Date).getTime().toString()}async buildInRename(e){const t=this.getUploaderType(e),r=e.getConfig("buildIn.rename")||{},n=e.getConfig("buildIn.list")||[],i={...r,...n.find(e=>e.id===t.id)?.rename||{}};if(!i.enable)return e;const a=i.format||"{filename}";return e.output=e.output.map((t,r)=>{let n=t.fileName;return n=Dt(e.rawInputPath[r],a,void 0,t.base64Image?t.base64Image:t.buffer),n=n.replace(/\/+/g,"/"),"/"===n.slice(-1)&&(n+=r.toString()),t.fileName=n,t}),e}async beforeTransform(e){return await this.handlePlugins(e.helper.beforeTransformPlugins,e),e}async doTransform(e){e.emit(Rt.UPLOAD_PROGRESS,vt);const t=e.getConfig("picBed.transformer")||"path";let r=e.helper.transformer.get(t),n=t;return r||(r=e.helper.transformer.get("path"),n="path",e.log.warn(`Can't find transformer - ${t}, switch to default transformer - path`)),e.log.info(`Transforming... Current transformer is [${n}]`),await(r?.handle(e)),e}async beforeUpload(e){return e.emit(Rt.UPLOAD_PROGRESS,Kt),e.log.info("Before upload"),e.emit(Rt.BEFORE_UPLOAD,e),await this.handlePlugins(e.helper.beforeUploadPlugins,e),e}async doUpload(e){const t=this.getUploaderType(e);let r=e.helper.uploader.get(t.picBed),n=t.picBed;r||(e.log.warn(`Can't find uploader - ${n}, switch to default uploader - ${Vt}`),n=Vt,r=e.helper.uploader.get(Vt)),e.log.info(`Uploading... Current uploader is [${n}] with config id [${t.id||"default"}]`),await(r?.handle(e));for(const t of e.output)t.type=n;return e}async afterUpload(e){e.emit(Rt.AFTER_UPLOAD,e),e.emit(Rt.UPLOAD_PROGRESS,100),await this.handlePlugins(e.helper.afterUploadPlugins,e);let t="";const r=e.output.length,n=!0===e.getConfig("settings.encodeOutputURL");for(let i=0;i<r;i++)void 0!==e.output[i].imgUrl&&(t+=n?it(e.output[i].imgUrl):e.output[i].imgUrl,i!==r-1&&(t+="\n")),delete e.output[i].base64Image,delete e.output[i].buffer;return e.emit(Rt.FINISHED,e),e.log.success(`\n${t}`),e}async handlePlugins(e,t){const r=e.getList(),n=e.getIdList(),i=e.getName();return await Promise.all(r.map(async(e,r)=>{try{t.log.info(`${i}: ${n[r]} running`),await e.handle(t)}catch(e){throw t.log.error(`${i}: ${n[r]} error`),e}})),t}}const qt={"zh-CN":{UPLOAD_FAILED:"上传失败",CHECK_SETTINGS:"请检查你的配置项是否正确",CHECK_SETTINGS_AND_NETWORK:"请检查你的配置项以及网络",UPLOAD_FAILED_REASON:"错误码: ${code},请打开浏览器粘贴地址查看相关原因",SERVER_ERROR:"服务端出错,请重试",AUTH_FAILED:"认证失败",PICBED_SMMS:"SM.MS(S.EE)",PICBED_SMMS_TOKEN:"设定Token",PICBED_SMMS_MESSAGE_TOKEN:"请填写Token",PICBED_SMMS_BACKUPDOMAIN:"备用上传域名",PICBED_ADVANCEDPLIST:"高级自定义",PICBED_ADVANCEDPLIST_ENDPOINT:"设定接口网址",PICBED_ADVANCEDPLIST_MESSAGE_ENDPOINT:"例如: https://example.com/upload",PICBED_ADVANCEDPLIST_METHOD:"设定请求方法",PICBED_ADVANCEDPLIST_MESSAGE_METHOD:"请选择请求方法",PICBED_ADVANCEDPLIST_FORMDATAKEY:"设定表单参数名",PICBED_ADVANCEDPLIST_MESSAGE_FORMDATAKEY:"例如: file",PICBED_ADVANCEDPLIST_HEADERS:"设定请求头",PICBED_ADVANCEDPLIST_MESSAGE_HEADERS:'例如: {"Content-Type": "multipart/form-data"}',PICBED_ADVANCEDPLIST_BODY:"设定请求体",PICBED_ADVANCEDPLIST_MESSAGE_BODY:'例如: {"key": "value"}',PICBED_ADVANCEDPLIST_CUSTOMPREFIX:"设定自定义前缀",PICBED_ADVANCEDPLIST_MESSAGE_CUSTOMPREFIX:"例如: https://example.com/",PICBED_ADVANCEDPLIST_WEBPATH:"设定网站路径",PICBED_ADVANCEDPLIST_MESSAGE_WEBPATH:"用于拼接网址路径",PICBED_ADVANCEDPLIST_RESDATAPATH:"设定返回数据URL路径",PICBED_ADVANCEDPLIST_MESSAGE_RESDATAPATH:"例如: data.url",PICBED_ADVANCEDPLIST_UPLOADSCRIPTNAME:"设定上传脚本名称",PICBED_ADVANCEDPLIST_MESSAGE_UPLOADSCRIPTNAME:"请输入存放在脚本目录中的上传脚本名称",PICBED_LOCAL:"本地上传",PICBED_LOCAL_PATH:"设定路径",PICBED_LOCAL_MESSAGE_PATH:"例如 /usr/local/images/",PICBED_LOCAL_CUSTOMURL:"设定自定义域名",PICBED_LOCAL_MESSAGE_CUSTOMURL:"例如 https://test.com",PICBED_LOCAL_WEBPATH:"设定网站路径",PICBED_LOCAL_MESSAGE_WEBPATH:"用于拼接网址路径",PICBED_ALIST_PLIST:"AList",PICBED_ALIST_URL:"设定URL",PICBED_ALIST_MESSAGE_URL:"例如: https://alist.example.com",PICBED_ALIST_TOKEN:"设定Token",PICBED_ALIST_MESSAGE_TOKEN:"请输入Token(与用户名-密码二选一)",PICBED_ALIST_USERNAME:"设定用户名",PICBED_ALIST_MESSAGE_USERNAME:"请输入用户名(与Token二选一)",PICBED_ALIST_PASSWORD:"设定密码",PICBED_ALIST_MESSAGE_PASSWORD:"请输入密码",PICBED_ALIST_UPLOADPATH:"设定上传路径",PICBED_ALIST_MESSAGE_UPLOAD_PATH:"例如: /test",PICBED_ALIST_WEBPATH:"设定网站路径",PICBED_ALIST_MESSAGE_WEB_PATH:"用于拼接网址路径",PICBED_ALIST_CUSTOMURL:"设定自定义域名",PICBED_ALIST_MESSAGE_CUSTOMURL:"例如: https://test.com",PICBED_ALICLOUD:"阿里云OSS",PICBED_ALICLOUD_ACCESSKEYID:"设定accessKeyId",PICBED_ALICLOUD_ACCESSKEYSECRET:"设定accessKeySecret",PICBED_ALICLOUD_BUCKET:"设定Bucket",PICBED_ALICLOUD_AREA:"设定存储区域",PICBED_ALICLOUD_PATH:"设定存储路径",PICBED_ALICLOUD_WEBPATH:"设定网站路径",PICBED_ALICLOUD_CUSTOMURL:"设定自定义域名",PICBED_ALICLOUD_OPTIONS:"设定网址后缀",PICBED_ALICLOUD_MESSAGE_AREA:"例如: oss-cn-beijing",PICBED_ALICLOUD_MESSAGE_PATH:"例如: test/",PICBED_ALICLOUD_MESSAGE_WEBPATH:"用于拼接网址路径",PICBED_ALICLOUD_MESSAGE_OPTIONS:"例如: ?x-oss-process=xxx",PICBED_ALICLOUD_MESSAGE_CUSTOMURL:"例如: https://test.com",PICBED_TENCENTCLOUD:"腾讯云COS",PICBED_TENCENTCLOUD_VERSION:"COS版本",PICBED_TENCENTCLOUD_SECRETID:"设定SecretId",PICBED_TENCENTCLOUD_SECRETKEY:"设定SecretKey",PICBED_TENCENTCLOUD_APPID:"设定AppId",PICBED_TENCENTCLOUD_BUCKET:"设定Bucket",PICBED_TENCENTCLOUD_AREA:"设定存储区域",PICBED_TENCENTCLOUD_ENDPOINT:"设定接入点",PICBED_TENCENTCLOUD_PATH:"设定存储路径",PICBED_TENCENTCLOUD_WEBPATH:"设定网站路径",PICBED_TENCENTCLOUD_OPTIONS:"设定网址后缀",PICBED_TENCENTCLOUD_CUSTOMURL:"设定自定义域名",PICBED_TENCENTCLOUD_MESSAGE_APPID:"例如: 1234567890",PICBED_TENCENTCLOUD_MESSAGE_AREA:"例如: ap-beijing",PICBED_TENCENTCLOUD_MESSAGE_PATH:"例如: test/",PICBED_TENCENTCLOUD_MESSAGE_WEBPATH:"例如: /usr/local/images/",PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL:"例如: https://test.com",PICBED_TENCENTCLOUD_MESSAGE_OPTIONS:"例如: ?imageMogr2",PICBED_TENCENTCLOUD_MESSAGE_ENDPOINT:"例如: cos-internal.accelerate.tencentcos.cn",PICBED_TENCENTCLOUD_SLIM:"极智压缩",PICBED_TENCENTCLOUD_SLIM_TIP:"图片极智压缩,详情请参考[文档说明](https://cloud.tencent.com/document/product/436/86438)",PICBED_TENCENTCLOUD_SLIM_CONFIRM:"开启",PICBED_TENCENTCLOUD_SLIM_CANCEL:"关闭",PICBED_GITHUB:"GitHub",PICBED_GITHUB_TOKEN:"设定Token",PICBED_GITHUB_REPO:"设定仓库名",PICBED_GITHUB_PATH:"设定存储路径",PICBED_GITHUB_WEBPATH:"设定网站路径",PICBED_GITHUB_BRANCH:"设定分支名",PICBED_GITHUB_CUSTOMURL:"设定自定义域名",PICBED_GITHUB_MESSAGE_REPO:"格式: username/repo",PICBED_GITHUB_MESSAGE_BRANCH:"例如: main",PICBED_GITHUB_MESSAGE_PATH:"例如: test/",PICBED_GITHUB_MESSAGE_WEBPATH:"用于拼接网址路径",PICBED_GITHUB_MESSAGE_CUSTOMURL:"例如: https://test.com",PICBED_QINIU:"七牛云",PICBED_QINIU_ACCESSKEY:"设定AccessKey",PICBED_QINIU_SECRETKEY:"设定SecretKey",PICBED_QINIU_BUCKET:"设定Bucket",PICBED_QINIU_PATH:"设定存储路径",PICBED_QINIU_URL:"设定访问网址",PICBED_QINIU_OPTIONS:"设定网址后缀",PICBED_QINIU_AREA:"设定存储区域",PICBED_QINIU_MESSAGE_PATH:"例如: test/",PICBED_QINIU_MESSAGE_AREA:"例如: z0",PICBED_QINIU_MESSAGE_OPTIONS:"例如: ?imageslim",PICBED_QINIU_MESSAGE_URL:"例如: https://xxx.yyy.glb.clouddn.com",PICBED_IMGUR:"Imgur",PICBED_IMGUR_CLIENTID:"设定ClientId",PICBED_IMGUR_USERNAME:"设定用户名",PICBED_IMGUR_ACCESS_TOKEN:"设定accessToken",PICBED_IMGUR_ALBUM:"设定相册名",PICBED_IMGUR_PROXY:"设定代理",PICBED_IMGUR_MESSAGE_CLIENTID:"匿名上传时填写",PICBED_IMGUR_MESSAGE_USERNAME:"需要上传到账户时填写",PICBED_IMGUR_MESSAGE_ACCESS_TOKEN:"需要上传到账户时填写",PICBED_IMGUR_MESSAGE_ALBUM:"例如: test",PICBED_IMGUR_MESSAGE_PROXY:"例如: http://127.0.0.1:1080",PICBED_UPYUN:"又拍云",PICBED_UPYUN_BUCKET:"设定Bucket",PICBED_UPYUN_OPERATOR:"设定操作员",PICBED_UPYUN_PASSWORD:"设定操作员密码",PICBED_UPYUN_PATH:"设定存储路径",PICBED_UPYUN_URL:"设定加速域名",PICBED_UPYUN_OPTIONS:"设定网址后缀",PICBED_UPYUN_ENDPOINT:"设定自定义API接入点",PICBED_UPYUN_ANTILEECHTOKEN:"设定防盗链Token",PICBED_UPYUN_EXPIRETIME:"设定过期时间(秒)",PICBED_UPYUN_MESSAGE_OPERATOR:"例如: me",PICBED_UPYUN_MESSAGE_PASSWORD:"例如: 123456",PICBED_UPYUN_MESSAGE_URL:"例如: http://xxx.test.upcdn.net",PICBED_UPYUN_MESSAGE_OPTIONS:"例如: !imgslim",PICBED_UPYUN_MESSAGE_PATH:"例如: test/",PICBED_UPYUN_MESSAGE_ENDPOINT:"例如: https://v0.api.upyun.com",PICBED_WEBDAVPLIST:"WebDAV",PICBED_WEBDAVPLIST_HOST:"设定接口网址",PICBED_WEBDAVPLIST_SSLENABLED:"启用SSL",PICBED_WEBDAVPLIST_USERNAME:"设定用户名",PICBED_WEBDAVPLIST_PASSWORD:"设定密码",PICBED_WEBDAVPLIST_PATH:"设定存储路径",PICBED_WEBDAVPLIST_WEBPATH:"设定网址路径",PICBED_WEBDAVPLIST_CUSTOMURL:"设定自定义域名",PICBED_WEBDAVPLIST_AUTHTYPE:"设定认证方式",PICBED_WEBDAVPLIST_OPTIONS:"设定网址后缀",PICBED_WEBDAVPLIST_MESSAGE_HOST:"例如: https://example.com/webdav",PICBED_WEBDAVPLIST_MESSAGE_SSLENABLED:"需要HTTPS时启用",PICBED_WEBDAVPLIST_MESSAGE_USERNAME:"例如: me",PICBED_WEBDAVPLIST_MESSAGE_PASSWORD:"输入密码",PICBED_WEBDAVPLIST_MESSAGE_PATH:"例如: test/",PICBED_WEBDAVPLIST_MESSAGE_WEBSITE_PATH:"拼接网址时使用",PICBED_WEBDAVPLIST_MESSAGE_CUSTOMURL:"例如: https://test.com",PICBED_WEBDAVPLIST_MESSAGE_OPTIONS:"例如: ?key=123456",PICBED_SFTPPLIST:"内置SFTP",PICBED_SFTPPLIST_HOST:"设定主机",PICBED_SFTPPLIST_PORT:"设定端口",PICBED_SFTPPLIST_USERNAME:"设定用户名",PICBED_SFTPPLIST_PASSWORD:"设定密码",PICBED_SFTPPLIST_PRIVATEKEY:"设定私钥",PICBED_SFTPPLIST_PRIVATEKEY_PASSPHRASE:"设定私钥密码",PICBED_SFTPPLIST_UPLOADPATH:"设定上传路径",PICBED_SFTPPLIST_CUSTOMURL:"设定自定义域名",PICBED_SFTPPLIST_WEBSITE_PATH:"设定网站路径",PICBED_SFTPPLIST_FILE_USER:"设定文件用户:组",PICBED_SFTPPLIST_FILE_MODE:"设定文件权限",PICBED_SFTPPLIST_DIR_MODE:"设定文件夹权限",PICBED_SFTPPLIST_MESSAGE_HOST:"例如: 1.1.1.3",PICBED_SFTPPLIST_MESSAGE_PORT:"默认22",PICBED_SFTPPLIST_MESSAGE_PRIVATEKEY:"例如: /Users/xxx/.ssh/id_rsa",PICBED_SFTPPLIST_MESSAGE_PRIVATEKEY_PASSPHRASE:"输入私钥密码",PICBED_SFTPPLIST_MESSAGE_UPLOADPATH:"例如: test/",PICBED_SFTPPLIST_MESSAGE_CUSTOMURL:"例如: https://test.com",PICBED_SFTPPLIST_MESSAGE_WEBSITE_PATH:"拼接网址时使用",PICBED_SFTPPLIST_MESSAGE_FILE_USER:"例如: www:data",PICBED_SFTPPLIST_MESSAGE_FILE_MODE:"例如: 0664",PICBED_SFTPPLIST_MESSAGE_DIR_MODE:"例如: 0775",PICBED_PICLIST:"PicList",PICBED_PICLIST_HOST:"设定主机",PICBED_PICLIST_PORT:"设定端口",PICBED_PICLIST_PICBED:"设定图床",PICBED_PICLIST_CONFIGNAME:"设定配置名",PICBED_PICLIST_KEY:"设定鉴权Key",PICBED_LSKY_PLIST:"兰空图床",PICBED_LSKY_VERSION:"设定版本",PICBED_LSKY_MESSAGE_VERSION:"例如V1",PICBED_LSKY_HOST:"设定主机",PICBED_LSKY_MESSAGE_HOST:"例如: https://example.com",PICBED_LSKY_TOKEN:"设定Token",PICBED_LSKY_MESSAGE_TOKEN:"例如: 1234567890",PICBED_LSKY_STRATEGY_ID:"设定策略ID",PICBED_LSKY_MESSAGE_STRATEGY_ID:"例如: 1",PICBED_LSKY_ALBUM_ID:"设定相册ID",PICBED_LSKY_MESSAGE_ALBUM_ID:"选填,V2版本限定",PICBED_LSKY_PERMISSION:"设定权限",PICBED_LSKY_MESSAGE_PERMISSION:"例如: public",PICBED_AWSS3PLIST:"AWS S3",PICBED_AWSS3PLIST_ACCESSKEYID:"设定AccessKeyId",PICBED_AWSS3PLIST_SECRET_ACCESSKEY:"设定SecretAccessKey",PICBED_AWSS3PLIST_BUCKET:"设定Bucket",PICBED_AWSS3PLIST_REGION:"设定Region",PICBED_AWSS3PLIST_UPLOADPATH:"设定上传路径",PICBED_AWSS3PLIST_ENDPOINT:"设定自定义节点",PICBED_AWSS3PLIST_PROXY:"设定代理",PICBED_AWSS3PLIST_URLPREFIX:"设定自定义域名",PICBED_AWSS3PLIST_OPTIONS:"设定网址后缀",PICBED_AWSS3PLIST_MESSAGE_OPTIONS:"例如: ?x-oss-process=xxx",PICBED_AWSS3PLIST_PATHSTYLEACCESS:"启用s3ForcePathStyle",PICBED_AWSS3PLIST_REJECTUNAUTHORIZED:"拒绝无效TLS证书连接",PICBED_AWSS3PLIST_ACL:"设定上传资源的访问策略",PICBED_AWSS3PLIST_DISABLEBUCKETPREFIXTOURL:"开启 `pathStyleAccess` 时,是否要禁用最终生成URL中添加 bucket 前缀",PICBED_AWSS3PLIST_MESSAGE_ACCESSKEYID:"例如: AKIAxxxxxxxxxxxxx",PICBED_AWSS3PLIST_MESSAGE_SECRET_ACCESSKEY:"例如: xxxxxxxxxx",PICBED_AWSS3PLIST_MESSAGE_BUCKET:"例如: test",PICBED_AWSS3PLIST_MESSAGE_REGION:"例如: us-east-1",PICBED_AWSS3PLIST_MESSAGE_UPLOADPATH:"例如: test/",PICBED_AWSS3PLIST_MESSAGE_ENDPOINT:"例如: https://s3.us-east-1.amazonaws.com",PICBED_AWSS3PLIST_MESSAGE_PROXY:"例如: http://127.0.0.1:1080",PICBED_AWSS3PLIST_MESSAGE_URLPREFIX:"例如: https://test.com",PICBED_AWSS3PLIST_MESSAGE_PATHSTYLEACCESS:"需要时启用",PICBED_AWSS3PLIST_MESSAGE_REJECTUNAUTHORIZED:"需要时启用",PICBED_AWSS3PLIST_MESSAGE_ACL:"例如: public-read",PICBED_AWSS3PLIST_MESSAGE_DISABLEBUCKETPREFIXTOURL:"需要时启用",BUILDIN_WATERMARK:"水印设置",BUILDIN_WATERMARK_ISADDWATERMARK:"是否添加水印",BUILDIN_WATERMARK_MESSAGE_ISADDWATERMARK:"需要添加水印时启用",BUILDIN_WATERMARK_WATERMARKTYPE:"设定水印类型",BUILDIN_WATERMARK_MESSAGE_WATERMARKTYPE:"请选择水印类型",BUILDIN_WATERMARK_ISFULLSCREENWATERMARK:"是否全屏水印",BUILDIN_WATERMARK_MESSAGE_ISFULLSCREENWATERMARK:"需要全屏水印时启用",BUILDIN_WATERMARK_WATERMARKDEGREE:"设定水印角度",BUILDIN_WATERMARK_MESSAGE_WATERMARKDEGREE:"请输入数字",BUILDIN_WATERMARK_WATERMARKTEXT:"设定水印文字",BUILDIN_WATERMARK_MESSAGE_WATERMARKTEXT:"请输入水印文字",BUILDIN_WATERMARK_WATERMARKFONTPATH:"设定水印字体文件路径",BUILDIN_WATERMARK_MESSAGE_WATERMARKFONTPATH:"请输入水印字体文件路径",BUILDIN_WATERMARK_WATERMARKSCALERATIO:"设定水印相对于图片的比例",BUILDIN_WATERMARK_MESSAGE_WATERMARKFONTRATIO:"请输入0-1的小数",BUILDIN_WATERMARK_WATERMARKCOLOR:"设定水印字体颜色",BUILDIN_WATERMARK_MESSAGE_WATERMARKFONTCOLOR:"请输入rgb颜色值",BUILDIN_WATERMARK_WATERMARKIMAGEPATH:"设定水印图片路径",BUILDIN_WATERMARK_MESSAGE_WATERMARKIMAGEPATH:"请输入水印图片路径",BUILDIN_WATERMARK_WATERMARKPOSITION:"设定水印位置",BUILDIN_WATERMARK_MESSAGE_WATERMARKPOSITION:"请选择水印位置",BUILDIN_WATERMARK_WATERMARKIMAGEOPACITY:"设定水印图片透明度",BUILDIN_WATERMARK_MESSAGE_WATERMARKIMAGEOPACITY:"请输入0-255的整数",BUILDIN_SKIPPROCESS:"跳过处理设置",BUILDIN_SKIPPROCESS_SKIPPROCESSEXTLIST:"设定跳过处理的文件后缀列表",BUILDIN_RENAME:"重命名设置",BUILDIN_RENAME_FORMAT:"设定重命名格式",BUILDIN_RENAME_ENABLE:"是否启用重命名",BUILDIN_COMPRESS:"图片处理",BUILDIN_COMPRESS_QUALITY:"设定图片质量",BUILDIN_COMPRESS_MESSAGE_QUALITY:"请输入1-100的整数",BUILDIN_COMPRESS_ISCONVERT:"是否进行格式转换",BUILDIN_COMPRESS_MESSAGE_ISCONVERT:"需要转换时启用",BUILDIN_COMPRESS_CONVERTFORMAT:"设定转换格式",BUILDIN_COMPRESS_MESSAGE_CONVERTFORMAT:"请选择转换格式",BUILDIN_COMPRESS_ISRESIZE:"是否进行图片缩放",BUILDIN_COMPRESS_MESSAGE_ISRESIZE:"需要缩放时启用",BUILDIN_COMPRESS_RESIZEWIDTH:"设定缩放宽度",BUILDIN_COMPRESS_MESSAGE_RESIZEWIDTH:"请输入数字",BUILDIN_COMPRESS_RESIZEHEIGHT:"设定缩放高度",BUILDIN_COMPRESS_MESSAGE_RESIZEHEIGHT:"请输入数字",BUILDIN_COMPRESS_ISRESIZEBYPERCENT:"是否按百分比进行缩放",BUILDIN_COMPRESS_MESSAGE_ISRESIZEBYPERCENT:"需要按百分比缩放时启用",BUILDIN_COMPRESS_LONGEDGEASHEIGHT:"长边作为高度",BUILDIN_COMPRESS_MESSAGE_LONGEDGEASHEIGHT:"将最长边视为高度进行缩放",BUILDIN_COMPRESS_ISFLIP:"是否垂直翻转图片",BUILDIN_COMPRESS_ISFLOP:"是否水平翻转图片",BUILDIN_COMPRESS_RESIZEPERCENT:"设定缩放百分比",BUILDIN_COMPRESS_MESSAGE_RESIZEPERCENT:"请输入数字",BUILDIN_COMPRESS_SKIPRESIZEOFSMALLIMG:"是否跳过小图缩放",BUILDIN_COMPRESS_ISROTATE:"是否进行图片旋转",BUILDIN_COMPRESS_MESSAGE_ISROTATE:"需要旋转时启用",BUILDIN_COMPRESS_ROTATEDEGREE:"设定旋转角度",BUILDIN_COMPRESS_MESSAGE_ROTATEDEGREE:"请输入数字,可为负数",BUILDIN_COMPRESS_ISREMOVEEXIF:"是否移除EXIF信息",BUILDIN_COMPRESS_MESSAGE_ISREMOVEEXIF:"需要移除EXIF信息时启用",PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS:"插件安装成功",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED:"插件安装失败",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON:"插件安装失败,失败码为${code},错误日志为 \n ${data}",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH:"插件安装失败,请输入合法插件名或合法安装路径",PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS:"插件卸载成功",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED:"插件卸载失败",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON:"插件卸载失败,失败码为${code},错误日志为 \n ${data}",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID:"插件卸载失败,请输入合法插件名",PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS:"插件更新成功",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED:"插件更新失败",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON:"插件更新失败,失败码为${code},错误日志为 \n ${data}",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID:"插件更新失败,请输入合法插件名"},"zh-TW":{UPLOAD_FAILED:"上傳失敗",CHECK_SETTINGS:"請檢查你的設定是否正確",CHECK_SETTINGS_AND_NETWORK:"請檢查你的設定及網路",UPLOAD_FAILED_REASON:"錯誤碼: ${code},請打開瀏覽器貼上地址查看相關原因",SERVER_ERROR:"伺服器出錯,請重試",AUTH_FAILED:"認證失敗",PICBED_SMMS:"SM.MS(S.EE)",PICBED_SMMS_TOKEN:"設定Token",PICBED_SMMS_MESSAGE_TOKEN:"請輸入Token",PICBED_SMMS_BACKUPDOMAIN:"備用上傳網址",PICBED_ADVANCEDPLIST:"高級自定義",PICBED_ADVANCEDPLIST_ENDPOINT:"設定API主機",PICBED_ADVANCEDPLIST_MESSAGE_ENDPOINT:"例如: https://example.com/upload",PICBED_ADVANCEDPLIST_METHOD:"設定請求方法",PICBED_ADVANCEDPLIST_MESSAGE_METHOD:"請選擇請求方法",PICBED_ADVANCEDPLIST_FORMDATAKEY:"設定表單Key",PICBED_ADVANCEDPLIST_MESSAGE_FORMDATAKEY:"例如: file",PICBED_ADVANCEDPLIST_HEADERS:"設定請求頭",PICBED_ADVANCEDPLIST_MESSAGE_HEADERS:'例如: {"Content-Type": "multipart/form-data"}',PICBED_ADVANCEDPLIST_BODY:"設定請求體",PICBED_ADVANCEDPLIST_MESSAGE_BODY:'例如: {"key": "value"}',PICBED_ADVANCEDPLIST_CUSTOMPREFIX:"設定自定義前綴",PICBED_ADVANCEDPLIST_MESSAGE_CUSTOMPREFIX:"例如: https://example.com/",PICBED_ADVANCEDPLIST_WEBPATH:"設定網站路徑",PICBED_ADVANCEDPLIST_MESSAGE_WEBPATH:"用於網頁顯示的路徑",PICBED_ADVANCEDPLIST_RESDATAPATH:"設定返回數據路徑",PICBED_ADVANCEDPLIST_MESSAGE_RESDATAPATH:"例如: data.url",PICBED_ADVANCEDPLIST_UPLOADSCRIPTNAME:"設定上傳腳本名稱",PICBED_ADVANCEDPLIST_MESSAGE_UPLOADSCRIPTNAME:"請輸入存放在腳本目錄中的上傳腳本名稱",PICBED_LOCAL:"本地",PICBED_LOCAL_PATH:"設定儲存路徑",PICBED_LOCAL_MESSAGE_PATH:"例如 /usr/local/images/",PICBED_LOCAL_CUSTOMURL:"設定自訂網址",PICBED_LOCAL_MESSAGE_CUSTOMURL:"例如 https://test.com",PICBED_LOCAL_WEBPATH:"設定網址路徑",PICBED_LOCAL_MESSAGE_WEBPATH:"用於網頁顯示的路徑",PICBED_ALIST_PLIST:"AList",PICBED_