w-web-sso 1.0.66 → 1.0.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * w-web-sso v1.0.66
2
+ * w-web-sso v1.0.68
3
3
  * (c) 2018-2021 yuda-lyu(semisphere)
4
4
  * Released under the MIT License.
5
5
  */
@@ -10,5 +10,5 @@
10
10
  * Released under the MIT License.
11
11
  */!function(e){e.exports=function(e){var t=Array.isArray,i="object"==typeof bn&&bn&&bn.Object===Object&&bn,n="object"==typeof self&&self&&self.Object===Object&&self,s=i||n||Function("return this")(),o=s.Symbol,r=Object.prototype,a=r.hasOwnProperty,c=r.toString,l=o?o.toStringTag:void 0,u=Object.prototype.toString,p=o?o.toStringTag:void 0;function d(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":p&&p in Object(e)?function(e){var t=a.call(e,l),i=e[l];try{e[l]=void 0;var n=!0}catch(e){}var s=c.call(e);return n&&(t?e[l]=i:delete e[l]),s}(e):function(e){return u.call(e)}(e)}function m(e){return"symbol"==typeof e||function(e){return null!=e&&"object"==typeof e}(e)&&"[object Symbol]"==d(e)}var h=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,g=/^\w*$/;function f(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}var w,y=s["__core-js_shared__"],x=(w=/[^.]+$/.exec(y&&y.keys&&y.keys.IE_PROTO||""))?"Symbol(src)_1."+w:"",D=Function.prototype.toString,v=/^\[object .+?Constructor\]$/,M=Function.prototype,C=Object.prototype,I=M.toString,b=C.hasOwnProperty,L=RegExp("^"+I.call(b).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function A(e){if(!f(e)||x&&x in e)return!1;var t=function(e){if(!f(e))return!1;var t=d(e);return"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t}(e)?L:v;return t.test(function(e){if(null!=e){try{return D.call(e)}catch(e){}try{return e+""}catch(e){}}return""}(e))}function E(e,t){var i=function(e,t){return null==e?void 0:e[t]}(e,t);return A(i)?i:void 0}var T=E(Object,"create"),S=Object.prototype.hasOwnProperty,N=Object.prototype.hasOwnProperty;function k(e){var t=-1,i=null==e?0:e.length;for(this.clear();++t<i;){var n=e[t];this.set(n[0],n[1])}}function j(e,t){return e===t||e!=e&&t!=t}function Z(e,t){for(var i=e.length;i--;)if(j(e[i][0],t))return i;return-1}k.prototype.clear=function(){this.__data__=T?T(null):{},this.size=0},k.prototype.delete=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t},k.prototype.get=function(e){var t=this.__data__;if(T){var i=t[e];return"__lodash_hash_undefined__"===i?void 0:i}return S.call(t,e)?t[e]:void 0},k.prototype.has=function(e){var t=this.__data__;return T?void 0!==t[e]:N.call(t,e)},k.prototype.set=function(e,t){var i=this.__data__;return this.size+=this.has(e)?0:1,i[e]=T&&void 0===t?"__lodash_hash_undefined__":t,this};var X=Array.prototype.splice;function Y(e){var t=-1,i=null==e?0:e.length;for(this.clear();++t<i;){var n=e[t];this.set(n[0],n[1])}}Y.prototype.clear=function(){this.__data__=[],this.size=0},Y.prototype.delete=function(e){var t=this.__data__,i=Z(t,e);return!(i<0||(i==t.length-1?t.pop():X.call(t,i,1),--this.size,0))},Y.prototype.get=function(e){var t=this.__data__,i=Z(t,e);return i<0?void 0:t[i][1]},Y.prototype.has=function(e){return Z(this.__data__,e)>-1},Y.prototype.set=function(e,t){var i=this.__data__,n=Z(i,e);return n<0?(++this.size,i.push([e,t])):i[n][1]=t,this};var F=E(s,"Map");function z(e,t){var i,n,s=e.__data__;return("string"==(n=typeof(i=t))||"number"==n||"symbol"==n||"boolean"==n?"__proto__"!==i:null===i)?s["string"==typeof t?"string":"hash"]:s.map}function G(e){var t=-1,i=null==e?0:e.length;for(this.clear();++t<i;){var n=e[t];this.set(n[0],n[1])}}function H(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new TypeError("Expected a function");var i=function(){var n=arguments,s=t?t.apply(this,n):n[0],o=i.cache;if(o.has(s))return o.get(s);var r=e.apply(this,n);return i.cache=o.set(s,r)||o,r};return i.cache=new(H.Cache||G),i}G.prototype.clear=function(){this.size=0,this.__data__={hash:new k,map:new(F||Y),string:new k}},G.prototype.delete=function(e){var t=z(this,e).delete(e);return this.size-=t?1:0,t},G.prototype.get=function(e){return z(this,e).get(e)},G.prototype.has=function(e){return z(this,e).has(e)},G.prototype.set=function(e,t){var i=z(this,e),n=i.size;return i.set(e,t),this.size+=i.size==n?0:1,this},H.Cache=G;var K,P,U,B=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,W=/\\(\\)?/g,V=(K=function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(B,function(e,i,n,s){t.push(n?s.replace(W,"$1"):i||e)}),t},P=H(K,function(e){return 500===U.size&&U.clear(),e}),U=P.cache,P),R=V,_=o?o.prototype:void 0,Q=_?_.toString:void 0;function O(e){if("string"==typeof e)return e;if(t(e))return function(e,t){for(var i=-1,n=null==e?0:e.length,s=Array(n);++i<n;)s[i]=t(e[i],i,e);return s}(e,O)+"";if(m(e))return Q?Q.call(e):"";var i=e+"";return"0"==i&&1/e==-1/0?"-0":i}function J(e,i){return t(e)?e:function(e,i){if(t(e))return!1;var n=typeof e;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=e&&!m(e))||g.test(e)||!h.test(e)||null!=i&&e in Object(i)}(e,i)?[e]:R(function(e){return null==e?"":O(e)}(e))}function q(e){if("string"==typeof e||m(e))return e;var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}function $(e,t,i){var n=null==e?void 0:function(e,t){for(var i=0,n=(t=J(t,e)).length;null!=e&&i<n;)e=e[q(t[i++])];return i&&i==n?e:void 0}(e,t);return void 0===n?i:n}function ee(e){return"[object String]"===Object.prototype.toString.call(e)}function te(e){return!(!ee(t=e)||""===t)&&/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(e);var t}return function(t={}){let i=function(){let e,t,i=new Promise(function(){e=arguments[0],t=arguments[1]});return i.resolve=e,i.reject=t,i}(),n=$(t,"srcName","system by w-email"),s=$(t,"srcEmail","");if(!te(s))return i.reject("srcEmail is not email"),i;let o=$(t,"srcPW",""),r=$(t,"srcHost","smtp.gmail.com"),a=$(t,"srcPort",587),c=$(t,"emTitle",""),l=$(t,"emContent",""),u=$(t,"emAttachments",[]);var p;p=u,"[object Object]"===Object.prototype.toString.call(p)&&(u=[u]);let d=$(t,"toEmails",[]);ee(d)&&(d=[d]);let m=$(t,"toEmailsCC",[]);ee(m)&&(m=[m]);let h=$(t,"toEmailsBCC",[]);ee(h)&&(h=[h]);let g=e.createTransport({host:r,port:a,auth:{user:s,pass:o},secure:465===a}),f={from:`${n} <${s}>`,to:d.join(","),cc:m.join(","),bcc:h.join(","),subject:c,html:l,attachments:u};return g.sendMail(f,function(e,t){e?i.reject(e):i.resolve(t.response)}),i}}(Kl())}(sc);var Pl=Ln(sc.exports);let Ul=["1234","12345","123456","1234567","12345678","123456789","1234567890","12345678910","111111","000000","666666","888888","7777777","11111111","123123","123321","654321","987654321","qwerty","qwerty123","qwerty1","qwertyuiop","qazwsx","1q2w3e4r","1q2w3e4r5t","1q2w3e","1qaz2wsx","zxcvbnm","password","password1","passw0rd","admin","admin123","welcome","letmein","login","master","monkey","dragon","shadow","sunshine","superman","batman","football","baseball","soccer","hockey","michael","jordan","jennifer","hunter","ranger","harley","thomas","charlie","andrew","daniel","ashley","bailey","mustang","access","secret","ninja","jesus","hello","freedom","trustno1","1qaz@WSX","P@ssw0rd","Pass@123","Aa123456","Aa@123456","Admin@123","abc@123","abc123","abcdef","abcd1234","abc","iloveyou","fuckyou","f*ckyou","whatever","nothing","google","computer","internet","samsung","apple","killer","princess","lovely","tigger","starwars","pokemon","minecraft","123qwe","zaq1zaq1","photoshop","adobe123","18atcskd2w","mynoob"];function Bl(e,t={}){let i=[],n=Ie(t,"useKeyForError",null);$i(n)||(n=!1);let s=Ie(t,"useOnlyOneError",null);if($i(s)||(s=!1),bi(e)||(n?i.push("keyInvalidPassword"):i.push("密碼非有效字串")),dt(i)>0)throw new Error(i[0]);let o=Ie(t,"numLenMin","");(!Ki(o)||Vi(o)<0)&&(o=8),o=Vi(o);let r=Ie(t,"numLenMax","");if((!Ki(r)||Vi(r)<0)&&(r=30),r=Vi(r),o>r&&(n?i.push("keyLimNumLenMinOrMax"):i.push("設定密碼最小長度大於最大長度")),dt(i)>0)throw new Error(i[0]);let a=Ie(t,"noSpace",null);if($i(a)||(a=!0),a&&(Li(c=e)&&null!==c.match(/^.*\s+.*$/)&&(n?i.push("keyLimHasSpace"):i.push("密碼不可包含空白字元")),s&&dt(i)>0))throw new Error(i[0]);var c;let l=Ie(t,"onlyAscii",null);if($i(l)||(l=!0),l&&(/[^\x20-\x7e]/.test(e)&&(n?i.push("keyLimNonAsciiChar"):i.push("密碼僅允許使用英文大小寫、數字及特殊符號")),s&&dt(i)>0))throw new Error(i[0]);if(dt(e)<o&&(n?i.push("keyLimNumLenMin"):i.push(`密碼長度須大於等於${o}個字元`)),s&&dt(i)>0)throw new Error(i[0]);if(dt(e)>r&&(n?i.push("keyLimNumLenMax"):i.push(`密碼長度須小於等於${r}個字元`)),s&&dt(i)>0)throw new Error(i[0]);let u=Ie(t,"requireLetter",null);$i(u)||(u=!1);let p=Ie(t,"requireUppercase",null);$i(p)||(p=!0);let d=Ie(t,"requireLowercase",null);$i(d)||(d=!0);let m=Ie(t,"requireDigit",null);$i(m)||(m=!0);let h=Ie(t,"requireSpecial",null);if($i(h)||(h=!0),u&&!function(e){return!!Li(e)&&!(null===e.match(/^.*[a-zA-Z]+.*$/))}(e)&&(n?i.push("keyLimRequireLetter"):i.push("密碼須包含至少一個英文字母")),s&&dt(i)>0)throw new Error(i[0]);if(p&&!function(e){return!!Li(e)&&!(null===e.match(/^.*[A-Z]+.*$/))}(e)&&(n?i.push("keyLimRequireUppercase"):i.push("密碼須包含至少一個大寫英文字母")),s&&dt(i)>0)throw new Error(i[0]);if(d&&!function(e){return!!Li(e)&&!(null===e.match(/^.*[a-z]+.*$/))}(e)&&(n?i.push("keyLimRequireLowercase"):i.push("密碼須包含至少一個小寫英文字母")),s&&dt(i)>0)throw new Error(i[0]);if(m&&!function(e){return!!Li(e)&&!(null===e.match(/^.*[0-9]+.*$/))}(e)&&(n?i.push("keyLimRequireDigit"):i.push("密碼須包含至少一個數字")),s&&dt(i)>0)throw new Error(i[0]);if(h&&!function(e){return!!Li(e)&&/[!-/:-@[-`{-~]/.test(e);
12
12
  //!"#$%&'()*+,-./ :;<=>?@ [\]^_` {|}~
13
- }(e)&&(n?i.push("keyLimRequireSpecial"):i.push("密碼須包含至少一個特殊符號")),s&&dt(i)>0)throw new Error(i[0]);let g=Ie(t,"forbiddenChars",null);if(_i(g)||(g=[]),dt(g)>0){for(let t of g)if(e.includes(t)){if(n){i.push("keyLimForbiddenChar");break}i.push(`密碼不可包含字元:${t}`)}if(s&&dt(i)>0)throw new Error(i[0])}let f=Ie(t,"commonPasswordBlacklist",null);if(_i(f)||(f=Ul),dt(f)>0){let t=e.toLowerCase();if(f.some(e=>bi(e)&&t===e.toLowerCase())&&(n?i.push("keyLimCommonPassword"):i.push("此密碼為常見弱密碼,不允許使用")),s&&dt(i)>0)throw new Error(i[0])}let w=Ie(t,"account",""),y=Ie(t,"noConsecutiveCharsFromAccount",null);$i(y)||(y=!1);let x=Ie(t,"consecutiveCharsMinMatch","");if(Ri(x)||(x=3),x=Vi(x),y&&bi(w)&&dt(w)>=x){let t=[...w.toLowerCase()],o=e.toLowerCase(),r=!1;for(let e=0;e<=t.length-x;e++){let i=t.slice(e,e+x).join("");if(o.includes(i)){r=!0;break}}if(r&&(n?i.push("keyLimConsecutiveCharsFromAccount"):i.push(`密碼不可包含與帳號相同之${x}個以上連續字元`)),s&&dt(i)>0)throw new Error(i[0])}if(dt(i)>0)throw new Error(i.join(" | "));return!0}function Wl(e,t){return mi(e,t)}function Vl(){let e=Yn(),t={};function i(t,i){setTimeout(()=>{e.emit(t,i)},1)}function n(e,n={}){if(On(t,e))return;let s=Ie(n,"fun");pn(s)||(s=async()=>{});let o=Ie(n,"inputs");_i(o)||(o=[]);let r=Ie(n,"timeExpired");Ri(r)||(r=5e3),r=Vi(r);let a=Ie(n,"timeFrom");"end"!==a&&(a="start");let c=Ie(n,"cacheError");!1!==c&&(c=!0),t[e]={needExec:!0,fun:s,pm:null,gen:0,inputs:o,value:null,time:null,timeExpired:r,timeFrom:a,cacheError:c},i("message",{fun:"set",key:e,timeExpired:r,timeFrom:a,cacheError:c})}async function s(e){if(On(t,e)){let n=t[e];if(n.pm)return i("message",{fun:"get",key:e,msg:"waiting"}),await n.pm,Uo(n.value);let s=Date.now(),o=n.needExec,r=s-n.time;if(o?i("message",{fun:"get",key:e,msg:"execute first"}):n.timeExpired>0&&r>n.timeExpired&&(i("message",{fun:"get",key:e,msg:"execute by timeExpired",timeDiff:r}),o=!0),o){i("message",{fun:"get",key:e,msg:"fun start"}),n.needExec=!1;let t=n.gen,o=async()=>{try{let o;try{o=await n.fun(...n.inputs)}catch(s){if(i("error",{fun:"get",key:e,msg:s}),!n.cacheError)throw n.gen===t&&(n.needExec=!0),s;o=void 0}n.gen===t&&(n.value=o,n.time="end"===n.timeFrom?Date.now():s)}finally{n.pm=null,i("message",{fun:"get",key:e,msg:"fun end"})}};n.pm=o(),await n.pm}else i("message",{fun:"get",key:e,msg:"use cache"});return Uo(n.value)}return i("error",{fun:"get",key:e,msg:"invalid key"}),null}return e.set=n,e.getProxy=async function(e,t={}){return n(e,t),s(e)},e.get=s,e.update=function(e,n){On(t,e)&&(i("message",{fun:"updateValue",key:e}),t[e].value=n,t[e].time=Date.now(),t[e].gen+=1)},e.clear=function(e){On(t,e)&&(i("message",{fun:"clear",key:e}),t[e].needExec=!0)},e.remove=function(e){On(t,e)&&(i("message",{fun:"remove",key:e}),delete t[e])},e}function Rl(e){let t="";if(un(e))t=e.message;else{if(bi(e))return e;if(Ci(e))return On(e,"message")?e.message:JSON.stringify(e);if(_i(e))return JSON.stringify(e);t=Hn(e)}return t}function _l(e,t,i={}){let n=Ie(i,"mode","");if(Li(n)||(n="scrypt"),"scrypt"!==n)throw new Error("暫時不支援scrypt以外方法");let s=f.randomBytes(16),o=`${e}:${t||""}`,r=f.scryptSync(o,s,64);return`scrypt:${s.toString("hex")}:${r.toString("hex")}`}function Ql(e,t,i){if(!Li(t))return!1;let n=t.split(":");if(3!==n.length)return!1;let s,o,[r,a,c]=n;if("scrypt"!==r)return!1;if(!Li(a)||!Li(c))return!1;try{s=Buffer.from(a,"hex"),o=Buffer.from(c,"hex")}catch(e){return!1}if(16!==s.length||64!==o.length)return!1;let l=`${e}:${i||""}`,u=f.scryptSync(l,s,64);return u.length===o.length&&f.timingSafeEqual(u,o)}function Ol(e){return e[x.randomInt(e.length)]}function Jl(e){for(let t=e.length-1;t>0;t--){let i=x.randomInt(t+1),n=e[t];e[t]=e[i],e[i]=n}return e}function ql(e){return"string"!=typeof e&&(e=null==e?"":String(e)),e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function $l(e,t,{srLog:i,srEmail:n,salt:s,minExpired:o,kpLang:r,passwordPolicy:a,allowUserRegistration:c,siteUrl:l,verifyBaseUrl:u}){let p=new function(){let e=new Map,t=new Map;return async(i,n)=>{let s=(e.get(i)||Promise.resolve()).then(async()=>await n(),async()=>await n());e.set(i,s.catch(()=>{})),t.set(i,(t.get(i)||0)+1);try{return await s}finally{let n=t.get(i)-1;n<=0?(t.delete(i),e.delete(i)):t.set(i,n)}}},d=function(e={}){let t=Ie(e,"timeExpire",null);Ri(t)||(t=18e5),t=Vi(t);let i=Ie(e,"timeDetect",null);Ri(i)||(i=2e3),i=Vi(i);let n=Yn(),s={},o=e=>{if(On(s,e)){let t=`checkWithSet: key in use: ${e}`;return n.emit("checkWithSet",{state:"error",msg:t}),!1}s[e]={time:Date.now(),value:!0};let t=`checkWithSet: ${e}`;return n.emit("checkWithSet",{state:"success",msg:t}),!0},r=setInterval(()=>{n.emit("detect",{state:"start"});let e=Date.now();for(let i of Object.keys(s)){let n=s[i];n&&e-n.time>t&&delete s[i]}n.emit("detect",{state:"finish"})},i);return n.checkWithSet=o,n.setWithFree=async(e,t)=>{n.emit("setWithFree",{state:"start"});let i=[];for(let t of e){if(!o(t)){for(let e of i)delete s[e];let e=`setWithFree: key in use: ${t}`;return n.emit("setWithFree",{state:"error",msg:e}),Promise.reject(e)}i.push(t)}try{let i=await t(),s=`setWithFree: ${e.join(", ")}`;return n.emit("setWithFree",{state:"success",msg:s}),i}catch(e){let t=`setWithFree: fn threw: ${e&&e.message||e}`;throw n.emit("setWithFree",{state:"error",msg:t}),e}finally{for(let e of i)delete s[e]}},n.set=async(e,t=!0)=>{s[e]={time:Date.now(),value:t};let i=`set: ${e}`;n.emit("set",{state:"success",msg:i})},n.get=async e=>{let t=s[e],i=void 0===t?null:t.value,o=`get: ${e}`;return n.emit("get",{state:"success",msg:o}),i},n.check=async e=>{let t=On(s,e),i=`check: ${e} = ${t}`;return n.emit("check",{state:"success",msg:i}),t},n.del=async e=>{delete s[e];let t=`del: ${e}`;n.emit("del",{state:"success",msg:t})},n.waitExist=async(e,t={})=>{let i=Ie(t,"attemptNum",null);Ri(i)||(i=30),i=Vi(i);let o=Ie(t,"timeInterval",null);Ri(o)||(o=100),o=Vi(o),n.emit("waitExist",{state:"start"});try{await Fn(()=>On(s,e),{attemptNum:i,timeInterval:o})}catch(t){let s=`waitExist timeout (${i*o}ms): ${e}`;return n.emit("waitExist",{state:"error",msg:s}),Promise.reject(s)}let r=`waitExist resolved: ${e}`;n.emit("waitExist",{state:"success",msg:r})},n.waitNotExist=async(e,t={})=>{let i=Ie(t,"attemptNum",null);Ri(i)||(i=30),i=Vi(i);let o=Ie(t,"timeInterval",null);Ri(o)||(o=100),o=Vi(o),n.emit("waitNotExist",{state:"start"});try{await Fn(()=>!On(s,e),{attemptNum:i,timeInterval:o})}catch(t){let s=`waitNotExist timeout (${i*o}ms): ${e}`;return n.emit("waitNotExist",{state:"error",msg:s}),Promise.reject(s)}let r=`waitNotExist resolved: ${e}`;n.emit("waitNotExist",{state:"success",msg:r})},n.clear=()=>{clearInterval(r)},n}(),m=new Map,h=new Map,g=(e,t)=>Ie(r,`${t}.${e}`,""),f=(e,t,i={})=>{"eng"!==t&&"cht"!==t&&(t="eng");let n=Ie(r,`${t}.${e}`,"");for(let e in i)n=n.replaceAll(`{${e}}`,ql(i[e]));return n},w=async(t,n,s={})=>{let o=null,r=Ie(s,"deletePassword");$i(r)||(r=!0);let a=await e.users.select({[t]:n,isActive:"y"}).catch(e=>{o=e});if(o)return console.log(o),console.log("keyUser",t),console.log("valueUser",n),console.log("failed to find user"),Promise.reject("failed to find user");r&&(a=ds(a,e=>(delete e.password,e)));let c=dt(a);return 0===c?(i&&pn(i.debug)&&i.debug({event:"fun-getGenUserByKV",key:"userNotFound",keyUser:t,valueUser:n}),Promise.reject(`can not find the user by ${t}`)):c>=2?(i&&pn(i.debug)&&i.debug({event:"fun-getGenUserByKV",key:"userDuplicate",keyUser:t,valueUser:n}),Promise.reject(`duplicate ${t}`)):a[0]},y=async(e,t)=>await w(e,t),x=async(e,t={})=>await y("id",e),D=async t=>{let i=null;if(!en(o))return console.log("minExpired",o),console.log("invalid minExpired"),Promise.reject("invalid minExpired");let n=Ua.tokens.funNew({userId:t});n.timeEnd=Tn().add(o,"minute").format("YYYY-MM-DDTHH:mm:ss.SSSZ");let s=Ie(n,"token","");return await e.tokens.insert(n).catch(e=>{i=e}),i?(console.log(i),console.log("can not create a token from userId"),Promise.reject("can not create a token from userId")):s},v=async(t,n={})=>{let s=await e.tokens.select({token:t}),o=dt(s);if(0===o)return console.log("invalid token"),Promise.reject("invalid token");if(o>=2)return console.log("duplicate tokens"),Promise.reject("duplicate tokens");let r=Ie(s,0,""),a=Ie(r,"userId",""),c=await(async(e,t={})=>{let i=Ie(e,"timeEnd","");if(!Va(i))return console.log("timeEnd",i),console.log("invalid timeEnd"),Promise.reject("invalid timeEnd");let n=Ie(e,"isApp",""),s=Ie(t,"fun",null),o=Tn().format("YYYY-MM-DDTHH:mm:ss.SSSZ")<i,r=!0;if("y"!==n&&pn(s)){let t=Ie(e,"userId","");r=s(e,await x(t)),wn(r)&&(r=await r)}return o&&r})(r,n);return i.info({event:"fun-checkToken",token:ec(t),userId:a,res:c}),c},M=async(e,t={})=>{if(!Li(e))return Promise.reject("tokenExpired");let i=null;return await v(e,t).then(e=>{!1===e&&(i="tokenExpired")}).catch(e=>{console.log("checkToken inner reject",e),i="tokenExpired"}),null===i||Promise.reject(i)},C=(e,t,i={})=>{Li(e)||(e="eng");let n=Ie(i,"account",""),s="";try{Bl(t,{useKeyForError:!0,useOnlyOneError:!0,numLenMin:a.minLength,numLenMax:a.maxLength,requireLetter:a.requireLetter,requireUppercase:a.requireUppercase,requireLowercase:a.requireLowercase,requireDigit:a.requireDigit,requireSpecial:a.requireSpecial,noSpace:a.noSpace,onlyAscii:a.onlyAscii,forbiddenChars:a.forbiddenChars,commonPasswordBlacklist:a.commonPasswordBlacklist,account:n,noConsecutiveCharsFromAccount:a.noConsecutiveCharsFromAccount,consecutiveCharsMinMatch:a.consecutiveCharsMinMatch})}catch(e){s=e.message}let o=null;return Li(s)?(o={state:"error",key:`userPassword_${s}`},o):(o={state:"success",msg:"ok"},o)},I=async(n,o,r,a={})=>{let c=Ie(a,"resetOrder");$i(c)||(c=!1);let l=Ie(a,"operatorId",""),u=Ie(a,"lang","eng");Li(u)||(u="eng"),o=function(e,t,i=""){return qi(e)&&qi(t)?ds(e,e=>Fa(e,t,i)):[]}(o,Ua[n].keys),c&&(o=ds(o,(e,t)=>(e.order=t+1,e)));let p=(e,t)=>{let i=null,n={};return qn(e,(e,s)=>{let o=Ie(e,t,"");return Li(o)?On(n,o)?(i=`rows[${s}].${t}[${o}] is duplicate`,!1):void(n[o]=!0):(i=`rows[${s}].${t} is not an effective string`,!1)}),i},d=null;if(function(e,t){function i(e){return _i(e)?e:[e]}if(Ji(e))return!1;if(0===(e=i(e)).length)return!1;if(Ji(e))return!1;if(0===(t=i(t)).length)return!1;for(let i=0;i<e.length;i++)for(let n=0;n<t.length;n++)if(Wl(e[i],t[n]))return!0;return!1}(n,["users"])){if(d=p(o,"id"),null!==d)return Promise.reject(d);if(d=p(o,"email"),null!==d)return Promise.reject(d)}let m=await e[n].select();if("users"===n){let e={};qn(m,t=>{let i=Ie(t,"account","");Li(i)&&(e[i]=Ie(t,"id",""))});let t={},i=null;if(qn(o,n=>{let s=Ie(n,"account",""),o=Ie(n,"id","");return Li(s)?On(t,s)||On(e,s)&&e[s]!==o?(i="accountDuplicate",!1):void(t[s]=!0):(i="accountRequired",!1)}),null!==i)return Promise.reject(i)}if("users"===n){let e={};qn(m,t=>{e[t.id]=t}),qn(o,t=>{let i=e[t.id];i&&(t.password=i.password)})}let h=o,g=function(e,t,i,n={}){let s=Ie(n,"withInfor");$i(s)||(s=!0);let o={del:[],add:[],same:[],diff:[]};if(!Li(i))return console.log("invalid key"),s&&(o.infor={}),o;_i(e)||(e=[e]),_i(t)||(t=[t]),e=ga(e,e=>On(e,i)),t=ga(t,e=>On(e,i));let r=new Map(t.map(e=>[e[i],e]));for(let t of e){let e=r.get(t[i]);e?(JSON.stringify(t)===JSON.stringify(e)?o.same.push(e):o.diff.push(e),r.delete(t[i])):o.del.push(t)}if(o.add=Array.from(r.values()),s){let e={};for(let t of o.del)e[t[i]]="del";for(let t of o.add)e[t[i]]="add";for(let t of o.diff)e[t[i]]="diff";for(let t of o.same)e[t[i]]="same";o.infor=e}return o}(m,h,r);if(dt(g.del)>0&&(await t(l,n,"del",g.del),"users"===n))for(let t of g.del){let n=Ie(t,"id","");if(Li(n))try{let t=await e.tokens.select({userId:n});for(let i of t)await e.tokens.del({id:i.id})}catch(d){i.error({event:"fun-updateTabItems-revokeTokenOnDelete",userId:n,err:Rl(d)})}}if(dt(g.add)>0){if("users"===n){for(let e of g.add){let t=Ie(e,"password",""),i=Ie(e,"account",""),n=C(u,t,{account:i});if("error"===n.state)return Promise.reject(n.key);e.password=_l(t,s)}qn(g.add,e=>{Li(Ie(e,"timeVerified",""))||(e.timeVerified=Sn())})}await t(l,n,"insert",g.add)}return dt(g.diff)>0&&await t(l,n,"save",g.diff),"users"===n&&(h=ds(h,e=>{let t={...e};return delete t.password,t})),h},b=async t=>{let i=await e.tokens.select({token:t}),n=dt(i);if(0===n)return console.log("invalid token"),Promise.reject("invalid token");if(n>=2)return console.log("duplicate tokens"),Promise.reject("duplicate tokens");let s=Ie(i,0,null),o=Ie(s,"isApp",""),r=null;if("y"!==o){let e=Ie(s,"userId","");r=await x(e)}else{let e=Ie(s,"userId","");if(!Li(e))return console.log("invalid userId from token"),Promise.reject("invalid userId from token");r={id:e,account:"no account",name:"no name",email:"no email",description:"no description",from:"no from",redir:"no redir",isAdmin:"y",timeVerified:"2000-01-01T00:00:00.000+08:00",timeExpired:"",timeBlocked:"",isActive:"y"}}return{id:r.id,account:r.account,name:r.name,email:r.email,description:r.description,from:r.from,redir:r.redir,isApp:"y"===o?"y":"n",isAdmin:r.isAdmin,timeVerified:r.timeVerified,timeExpired:r.timeExpired,timeBlocked:r.timeBlocked,isActive:r.isActive,isForceChangePw:r.isForceChangePw}},L=async(e,t,i={})=>{let n=await y(e,t).catch(()=>null);return Ii(n)?{id:n.id,account:n.account,name:n.name,email:n.email,description:n.description,from:n.from,redir:n.redir,isAdmin:n.isAdmin,timeVerified:n.timeVerified,timeExpired:n.timeExpired,timeBlocked:n.timeBlocked,isActive:n.isActive}:null},A=async(t={})=>{let i=Ie(t,"needActive");$i(i)||(i=!1);let n=Ie(t,"deletePassword");$i(n)||(n=!0);let s={};i&&(s={isActive:"y"});let o=await e.users.select(s);return n&&(o=ds(o,e=>(delete e.password,e))),o},E=Vl(),T=async(e,t={})=>(await M(e,t),await A(t)),S=async(e,t={})=>e=await I("users",e,"id",{resetOrder:!0,...t}),N=async()=>await e.tokens.select(),k=Vl(),j=async()=>await e.ips.select(),Z=Vl(),X={getTokenByKV:async(t,i)=>{let n=null,s=await e.tokens.select({[t]:i}).catch(e=>{n=e});if(n)return console.log(n),console.log("failed to find token"),Promise.reject("failed to find token");let o=dt(s);return 0===o?Promise.reject(`can not find the token by keyToken[${t}]`):o>=2?(console.log(`duplicate token by keyToken[${t}]`),Promise.reject(`duplicate token by keyToken[${t}]`)):s[0]},createUser:async(i,o)=>{if(Li(i)||(i="eng"),!c)return Promise.reject("userRegistrationNotAllowed");let a=Ie(o,"account","");if(!Li(a))return Promise.reject("userRegistrationAccountInvalid");let l=Ie(o,"email","");if(!Li(l)||!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(l))return Promise.reject("userRegistrationEmailFormatInvalid");let p=Ie(o,"password",""),m=Ie(o,"confirmPassword","");if(p!==m)return Promise.reject("userChangePasswordNotSame");let h=C(i,p,{account:a});if("error"===h.state)return Promise.reject(h.key);let w=Ie(o,"name","");if(!Li(w))return Promise.reject("userRegistrationNameInvalid");let y,x=`createUser:account:${a}`,D=`createUser:email:${l}`;await d.setWithFree([x,D],async()=>{let i=await e.users.select(),n=i.some(e=>Ie(e,"account","")===a);if(n)return Promise.reject("userRegistrationAccountExists");let o=i.some(e=>Ie(e,"email","")===l);if(o)return Promise.reject("userRegistrationEmailExists");let r=_l(p,s);y=`${Ya()}`;let c=Ua.users.funNew({account:a,password:r,name:w,email:l,tokenVerify:y,isAdmin:"n",isActive:"y"});await t(c.id,"users","insert",[c])}).catch(e=>{let t=e&&"string"==typeof e?e:e&&e.message||String(e);return t.includes(x)?Promise.reject("userRegistrationAccountExists"):t.includes(D)?Promise.reject("userRegistrationEmailExists"):Promise.reject(e)});try{let e=Ie(r,`${i}.webName`,""),t=g("regVerifyEmTitle",i),s=f("regVerifyEmContent",i,{sender:e,name:w,verifyUrl:`${u}/api/verifyEmail?token=${y}&lang=${i}`});await n.send(e,t,s,l)}catch(e){console.log("send verify email error",e)}return{state:"success",msg:"ok"}},verifyEmail:async t=>{if(!Li(t))return Promise.reject("verifyEmailInvalidToken");let i=await e.users.select({tokenVerify:t});if(0===dt(i))return Promise.reject("verifyEmailInvalidToken");let n=i[0];return Li(Ie(n,"timeVerified",""))?Promise.reject("verifyEmailAlreadyVerified"):(await e.users.save({id:n.id,timeVerified:Sn()}),{state:"success",msg:"ok"})},resendVerifyEmail:async(t,i,s)=>(Li(t)||(t="eng"),Li(i)&&Li(s)?await p(`resendVerifyEmail:${i}`,async()=>{let o=Date.now(),a=m.get(i);if(a&&o-a<3e4)return Promise.reject("userRegistrationResendThrottled");let c=null;try{c=await w("account",i)}catch(e){}if(!c)return Promise.reject("userRegistrationResendInvalidEmail");if(Ie(c,"email","")!==s)return Promise.reject("userRegistrationResendInvalidEmail");if(Li(Ie(c,"timeVerified","")))return Promise.reject("userRegistrationAlreadyVerified");let l=Ie(c,"id",""),p=Ie(c,"name",""),d=`${Ya()}`;await e.users.save({id:l,tokenVerify:d}),m.set(i,o);try{let e=Ie(r,`${t}.webName`,""),i=g("regVerifyEmTitle",t),o=f("regVerifyEmContent",t,{sender:e,name:p,verifyUrl:`${u}/api/verifyEmail?token=${d}&lang=${t}`});await n.send(e,i,o,s)}catch(e){return console.log("resend verify email error",e),Promise.reject("userRegistrationResendFailed")}return{state:"success",msg:"ok"}}):Promise.reject("userRegistrationResendInvalidEmail")),checkUserPassword:C,checkTokenAndChangePassword:async(t,o,a,c)=>{if(await M(t),Li(o)||(o="eng"),!Li(a))return Promise.reject("userChangePasswordFail");let l=Ie(await b(t),"id","");return await p(`changeUserPassword:${l}`,async()=>{let u=await w("id",l,{deletePassword:!1}),p=Ie(u,"account",""),d=C(o,c,{account:p});if("error"===d.state)return Promise.reject(d.key);let m=Ie(u,"password","");if(!Ql(a,m,s))return Promise.reject("userChangePasswordIncorrectOld");let h=Ie(u,"email","");if(!Li(h))return Promise.reject("anUnexpectedErrorOccurred");let y=_l(c,s);await e.users.save({id:l,password:y,isForceChangePw:"n"});try{let e=Ie(r,`${o}.webName`,"");if(!Li(e))throw console.log("get(kpLang, lang)",Ie(r,o)),console.log("lang",o),new Error("invalid sender");let t=Ie(u,"name","unknow"),i=g("chpwEmTitle",o);if(!Li(i))throw console.log("chpwEmTitle 取不到, lang",o),new Error("invalid title");let s=f("chpwEmContent",o,{sender:e,name:t});await n.send(e,i,s,h)}catch(e){console.log(e),i.error({event:"fun-changePassword-sendEmail",token:ec(t),lang:o,err:Rl(e)})}})},adminResetUserPassword:async(t,o,c)=>{if(await M(t),Li(o)||(o="eng"),!Li(c))return Promise.reject("anUnexpectedErrorOccurred");let l=await b(t),u=Ie(l,"id","");return"y"!==Ie(l,"isAdmin","")?Promise.reject("adminResetPasswordForbidden"):u===c?Promise.reject("adminResetPasswordCannotResetSelf"):await p(`adminResetUserPassword:${c}`,async()=>{let l=Date.now(),u=h.get(c);if(u&&l-u<3e4)return Promise.reject("adminResetPasswordAlreadyTriggered");let p=null;try{p=await w("id",c,{deletePassword:!0})}catch(e){return Promise.reject("adminResetPasswordUserNotFound")}if(!Ii(p))return Promise.reject("adminResetPasswordUserNotFound");let d=Ie(p,"account",""),m=Ie(p,"name","unknow"),y=Ie(p,"email",""),x=function(e,t=""){let i=e.minLength||8,n=e.maxLength||16,s=Math.min(Math.max(i,12),n),o="abcdefghijklmnopqrstuvwxyz".split(""),r="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""),a="0123456789".split(""),c="!@#$%^&*()_+-=[]{}|;:,.<>?".split(""),l=e.forbiddenChars||[];c=c.filter(e=>!l.includes(e));let u=[];(e.requireLowercase||e.requireLetter)&&(u=u.concat(o)),e.requireUppercase&&(u=u.concat(r)),!e.requireLetter||e.requireUppercase||e.requireLowercase||(u=u.concat(r)),e.requireDigit&&(u=u.concat(a)),e.requireSpecial&&(u=u.concat(c)),0===u.length&&(u=o.concat(r).concat(a));for(let i=0;i<20;i++){let i=[];for(e.requireLetter&&i.push(Ol(o.concat(r))),e.requireUppercase&&i.push(Ol(r)),e.requireLowercase&&i.push(Ol(o)),e.requireDigit&&i.push(Ol(a)),e.requireSpecial&&i.push(Ol(c));i.length<s;)i.push(Ol(u));Jl(i);let n=i.join("");try{return Bl(n,{useKeyForError:!0,useOnlyOneError:!0,numLenMin:e.minLength,numLenMax:e.maxLength,requireLetter:e.requireLetter,requireUppercase:e.requireUppercase,requireLowercase:e.requireLowercase,requireDigit:e.requireDigit,requireSpecial:e.requireSpecial,noSpace:e.noSpace,onlyAscii:e.onlyAscii,forbiddenChars:e.forbiddenChars,commonPasswordBlacklist:e.commonPasswordBlacklist,account:t,noConsecutiveCharsFromAccount:e.noConsecutiveCharsFromAccount,consecutiveCharsMinMatch:e.consecutiveCharsMinMatch}),n}catch(e){}}throw new Error("cannot generate random password matching policy")}(a,d),D=_l(x,s);await e.users.save({id:c,password:D,isForceChangePw:"y"}),h.set(c,l);try{if(Li(y)){let e=Ie(r,`${o}.webName`,"");if(!Li(e))throw new Error("invalid sender");let t=g("resetPwEmTitle",o);if(!Li(t))throw new Error("invalid title");let i=f("resetPwEmContent",o,{sender:e,name:m,account:d,newPassword:x});await n.send(e,t,i,y)}else i.error({event:"fun-adminResetUserPassword-noEmail",token:ec(t),targetUserId:c})}catch(e){console.log(e),i.error({event:"fun-adminResetUserPassword-sendEmail",token:ec(t),targetUserId:c,err:Rl(e)})}return{state:"success"}})},getIpByKV:async(t,i)=>{let n=null,s=await e.ips.select({[t]:i}).catch(e=>{n=e});if(n)return console.log(n),console.log("keyIp",t),console.log("valueIp",i),console.log("failed to find ip"),Promise.reject("failed to find ip");let o=dt(s);return 0===o?Promise.reject(`can not find the ip by keyIp[${t}]`):o>=2?(console.log("keyIp",t),console.log("valueIp",i),console.log(`duplicate ip by keyIp[${t}]`),Promise.reject(`duplicate ip by keyIp[${t}]`)):s[0]},getGenUserByKV:y,getGenUserByUserId:x,getGenUserByAccount:async(e,t={})=>await y("account",e),loginByAccountAndPassword:async(t,i)=>{if(!Li(t)||!Li(i))return Promise.reject("failedLoginForCatch");let n=await e.users.select({account:t});if(0===dt(n))return Promise.reject("failedLoginForCatch");let o=n[0];if(!Ql(i,Ie(o,"password",""),s))return Promise.reject("failedLoginForCatch");if(!Li(Ie(o,"timeVerified","")))return Promise.reject("userRegistrationNotVerified");let r=Ie(o,"timeExpired","");if(Li(r)&&Va(r)){if(Tn().format("YYYY-MM-DDTHH:mm:ss.SSSZ")>r)return Promise.reject("loginAccountExpired")}let a=Ie(o,"id",""),c=await D(a);return{id:o.id,account:o.account,name:o.name,email:o.email,description:o.description,from:o.from,redir:o.redir,isAdmin:o.isAdmin,isActive:o.isActive,isForceChangePw:o.isForceChangePw,token:c}},logoutByToken:async t=>{if(!Li(t))return Promise.reject("tokenExpired");let n=null,s=await e.tokens.select({token:t}),o=dt(s);if(0===o)return console.log("invalid token"),Promise.reject("invalid token");if(o>=2)return console.log("duplicate tokens"),Promise.reject("duplicate tokens");let r=Ie(s,0,""),a=Ie(r,"userId",""),c=await e.tokens.del({id:r.id}).catch(e=>{n=e});return n?(console.log(n),console.log("failed to delete token"),Promise.reject("failed to delete token")):(c=Ie(c,"0.nDeleted",0),1!==c?(console.log("can not delete the token"),Promise.reject("can not delete the token")):(i.info({event:"fun-logout",token:ec(t),userId:a}),!0))},checkToken:M,refreshToken:async t=>{if(!Li(t))return Promise.reject("tokenExpired");let i=null,n=await e.tokens.select({token:t}),s=dt(n);if(0===s)return console.log("invalid token"),Promise.reject("invalid token");if(s>=2)return console.log("duplicate tokens"),Promise.reject("duplicate tokens");let r=Ie(n,0,""),a=Ie(r,"timeEnd","");if(!Va(a))return console.log("timeEnd",a),console.log("invalid timeEnd"),Promise.reject("invalid timeEnd");let c=Tn().format("YYYY-MM-DDTHH:mm:ss.SSSZ");if(c>=a)return console.log("tn",c),console.log("timeEnd",a),console.log("token expired"),Promise.reject("tokenExpired");let l=Tn().add(o,"minute").format("YYYY-MM-DDTHH:mm:ss.SSSZ"),u=Tn().format("YYYY-MM-DDTHH:mm:ss.SSSZ");return await e.tokens.save({id:r.id,timeEnd:l,timeUpdate:u}).catch(e=>{i=e}),i?(console.log(i),console.log("can not update timeEnd for token"),Promise.reject("can not update timeEnd for token")):l},getUserByToken:b,checkTokenAndGetUserByToken:async(e,t,i={})=>(await M(e,i),await b(t).catch(()=>null)),getUserInfor:L,checkTokenAndGetUserInfor:async(e,t,i,n={})=>(await M(e,n),await L(t,i)),getUsersList:A,getUsersListCache:async()=>await E.getProxy("fun",{fun:A,inputs:null,timeExpired:3e4}),checkTokenAndGetUsersList:T,checkTokenAndGetActiveUsersList:async(e,t={})=>await T(e,{...t,needActive:!0}),updateUsersList:S,checkTokenAndUpdateUsersList:async(t,n,s,o={})=>{await M(t,o),Li(n)||(n="eng");let r=Ie(await b(t),"id",""),a=null;if(qn(s,e=>{if(Ie(e,"id","")===r)return a=e,!1}),Li(r)&&!Ii(a))return Promise.reject("cannotDeleteSelf");if(Ii(a)){if("y"!==Ie(a,"isAdmin",""))return Promise.reject("cannotDemoteSelf");if("y"!==Ie(a,"isActive",""))return Promise.reject("cannotDisableSelf")}s=await S(s,{lang:n,operatorId:r});for(let t of s){if("n"!==Ie(t,"isActive",""))continue;let n=Ie(t,"id","");if(Li(n))try{let t=await e.tokens.select({userId:n});for(let i of t)await e.tokens.del({id:i.id})}catch(e){i.error({event:"fun-updateUsersList-revokeToken",userId:n,err:Rl(e)})}}return E.clear("fun"),s},getTokensList:N,getTokensListCache:async()=>await k.getProxy("fun",{fun:N,inputs:null,timeExpired:3e4}),checkTokenAndGetTokensList:async(e,t={})=>(await M(e,t),await N()),checkTokenAndUpdateTokensList:async(e,t,i={})=>(await M(e,i),t=await(async e=>await I("tokens",e,"id",{resetOrder:!1}))(t),k.clear("fun"),t),getIpsList:j,getIpsListCache:async()=>await Z.getProxy("fun",{fun:j,inputs:null,timeExpired:3e4}),checkTokenAndGetIpsList:async(e,t={})=>(await M(e,t),await j()),checkTokenAndUpdateIpsList:async(e,t,i={})=>(await M(e,i),t=await(async e=>await I("ips",e,"id",{resetOrder:!1}))(t),Z.clear("fun"),t)};return X}let eu={csIng:{eng:"Connecting...",cht:"連線中..."},csLogin:{eng:"Logged in",cht:"已登入"},csLogout:{eng:"Logged out",cht:"已登出"},csErrConn:{eng:"Unable to connect",cht:"無法連線"},csErrLogin:{eng:"Login denied",cht:"拒絕登入"},aggridLanguage:{eng:"en",cht:"zh-tw"},id:{eng:"ID",cht:"主鍵"},systemMessage:{eng:"System message",cht:"系統確認訊息"},ok:{eng:"OK",cht:"確認"},no:{eng:"No",cht:"取消"},yes:{eng:"Yes",cht:"確定"},y:{eng:"Yes",cht:"是"},n:{eng:"No",cht:"否"},empty:{eng:"Empty",cht:"無"},to:{eng:"To",cht:"至"},at:{eng:"At",cht:"於"},unknow:{eng:"Unknown",cht:"未知"},waitingData:{eng:"Waiting data...",cht:"等待數據中..."},saveChanges:{eng:"Save changes",cht:"儲存變更"},from:{eng:"From",cht:"來源"},save:{eng:"Save",cht:"儲存"},close:{eng:"Close",cht:"關閉"},send:{eng:"Send",cht:"送出"},cancel:{eng:"Cancel",cht:"取消"},processing:{eng:"Processing...",cht:"處理中請稍後..."},anUnexpectedErrorOccurred:{eng:"An unexpected error occurred, please contact the administrator",cht:"發生非預期錯誤,請洽管理員"},getDataError:{eng:"Failed to get data, please try again later",cht:"取得數據失敗,請稍後再試"},timeCreate:{eng:"Created time",cht:"創建時間"},userIdUpdate:{eng:"ID of the updated user",cht:"最新變更使用者主鍵"},timeUpdate:{eng:"Updated time",cht:"最新變更時間"},userId:{eng:"ID of the user",cht:"使用者主鍵"},account:{eng:"Account",cht:"帳號"},password:{eng:"Password",cht:"密碼"},toggleToShowPassword:{eng:"To show password",cht:"變更為顯示密碼模式"},toggleToHidePassword:{eng:"To hide password",cht:"變更為隱藏密碼模式"},username:{eng:"Username",cht:"使用者姓名"},email:{eng:"Email",cht:"電子郵件"},name:{eng:"Name",cht:"名稱"},description:{eng:"Description",cht:"說明"},redir:{eng:"Redirect",cht:"登入後轉至網址"},login:{eng:"Log in",cht:"登入"},logout:{eng:"Log out",cht:"登出"},menuTreeShow:{eng:"Show menu",cht:"顯示選單"},menuTreeHide:{eng:"Hide menu",cht:"隱藏選單"},mmStaInfor:{eng:"Statistics information",cht:"統計資訊"},mmUserInfor:{eng:"User information",cht:"使用者資訊"},mmUsersList:{eng:"Users list",cht:"使用者清單"},mmUsersListMsg:{eng:"Provide a list of users, which can be added, edited, deleted, etc.",cht:"提供目前使用者資料清單,可進行新增、編輯、刪除等作業。"},mmTokensList:{eng:"Tokens list",cht:"金鑰清單"},mmTokensListMsg:{eng:"Provide a list of tokens, which can be deleted, etc.",cht:"提供目前金鑰資料清單,可進行強制登出等作業。"},mmIpsList:{eng:"Ips list",cht:"IP清單"},mmIpsListMsg:{eng:"Provide a list of IPs, which can be blocked, etc.",cht:"提供目前存取IP清單,可進行封鎖等作業。"},failedLoginForNoWebKey:{eng:"Can not get the web key",cht:"無有效站台唯一識別資訊"},failedLoginForNoToken:{eng:"Can not get the token",cht:"無有效金鑰"},failedLoginForNoRedir:{eng:"Can not get the url for redirection",cht:"無有效轉址"},failedLoginForCatch:{eng:"User account or password is incorrect",cht:"使用者帳密錯誤無法登入"},failedLogoutForNoWebKey:{eng:"Can not get the web key",cht:"無有效站台唯一識別資訊"},failedLogoutForCatch:{eng:"Can not logout",cht:"使用者登出失敗"},userStatus:{eng:"Status",cht:"帳號狀態"},isVerified:{eng:"Verified",cht:"帳號是否驗證"},isVerifiedY:{eng:"Verified",cht:"帳號已驗證"},isVerifiedN:{eng:"Not verified",cht:"帳號未驗證"},userTimeVerified:{eng:"Verified time",cht:"帳號驗證狀態與時間"},isVerifiedWaiting:{eng:"Waiting for verification",cht:"等待驗證中"},isExpired:{eng:"Expired",cht:"帳號是否過期"},isExpiredY:{eng:"Expired",cht:"帳號已過期"},isExpiredN:{eng:"Not expired",cht:"帳號未過期"},userTimeExpired:{eng:"Expired time",cht:"帳號過期狀態與時間"},isExpiredDeny:{eng:"Account login prohibited",cht:"禁止帳號登入"},isExpiredNever:{eng:"Never expires",cht:"永不過期"},isBlocked:{eng:"Blocked",cht:"帳號是否被封鎖"},isBlockedY:{eng:"Blocked",cht:"帳號已封鎖"},isBlockedN:{eng:"Not blocked",cht:"帳號未封鎖"},userTimeBlocked:{eng:"Blocked time",cht:"帳號封鎖狀態與時間"},isBlockedNormalStatus:{eng:"Normal status",cht:"狀態正常"},isAdmin:{eng:"Administrator",cht:"是否為系統管理者"},userRole:{eng:"Role",cht:"角色"},userRoleAdmin:{eng:"Administrator",cht:"系統管理者"},userRoleGeneral:{eng:"General",cht:"一般使用者"},isActive:{eng:"Active",cht:"帳號是否有效"},isActiveY:{eng:"Active",cht:"帳號有效"},isActiveMsgY:{eng:"Enabling",cht:"啟用中"},isActiveN:{eng:"Inactive",cht:"帳號無效"},isActiveMsgN:{eng:"Deactivated",cht:"已停用"},errInAccounts:{eng:"Account errors",cht:"帳號出現錯誤待修復"},errItemsByRedir:{eng:"Redirect errors",cht:"登入後轉址出現錯誤待修復"},modeEdit:{eng:"Edit mode",cht:"編輯模式"},showTabCols:{eng:"Show columns",cht:"顯示欄位"},selectDate:{eng:"Select date",cht:"請選擇日期"},userName:{eng:"Name of user",cht:"使用者名稱"},userAccountEmpty:{eng:"Invalid account of user",cht:"尚未給予有效使用者帳號"},userAccountDuplicate:{eng:"Duplicate account of user",cht:"使用者帳號出現重複"},userEmailEmpty:{eng:"Empty email of user",cht:"尚未給予使用者Email"},userEmailError:{eng:"Invalid email of user",cht:"使用者Email格式錯誤"},userEmailDuplicate:{eng:"Duplicate email of user",cht:"使用者Email出現重複"},userRedirEmpty:{eng:"Invalid redirect of user",cht:"尚未給予有效登入後轉址"},userPasswordEmpty:{eng:"Empty password of user",cht:"尚未給予使用者密碼"},userAddEmpty:{eng:"No user",cht:"尚未新增使用者資料"},userAdd:{eng:"Add user",cht:"新增使用者"},userAddNameNew:{eng:"New user",cht:"新使用者"},userAddIdNew:{eng:"Waiting generation",cht:"待自動給予"},userCopy:{eng:"Copy user",cht:"複製使用者"},userCopyNameNew:{eng:"copy",cht:"複製"},userDeleteCheckUsers:{eng:"Delete user(s)",cht:"刪除勾選使用者"},userResetPassword:{eng:"Reset password",cht:"重設密碼"},userSaveUsersFail:{eng:"Failed to save users",cht:"儲存使用者數據失敗"},userSaveUsersSuccess:{eng:"Save users successfully",cht:"儲存使用者數據成功"},userEditNoUserId:{eng:"Can not find the id of user",cht:"無法找到使用者Id"},userEditNoUserData:{eng:"Can not find the data of user",cht:"無法找到使用者數據"},userPassword_keyInvalidPassword:{eng:"Invalid password",cht:"密碼非有效字串"},userPassword_keyLimNumLenMinOrMax:{eng:"The minimum password length is greater than the maximum length",cht:"設定密碼最小長度大於最大長度"},userPassword_keyLimHasSpace:{eng:"Password must not contain whitespace characters",cht:"密碼不可包含空白字元"},userPassword_keyLimNonAsciiChar:{eng:"Password may only contain ASCII printable characters (letters, digits, symbols)",cht:"密碼僅允許使用英文大小寫、數字及特殊符號"},userPassword_keyLimNumLenMin:{eng:"Password length must be at least {minLength} characters",cht:"密碼長度須大於等於{minLength}個字元"},userPassword_keyLimNumLenMax:{eng:"Password length must not exceed {maxLength} characters",cht:"密碼長度須小於等於{maxLength}個字元"},userPassword_keyLimRequireLetter:{eng:"Password must contain at least one letter",cht:"密碼須包含至少一個英文字母"},userPassword_keyLimRequireUppercase:{eng:"Password must contain at least one uppercase letter",cht:"密碼須包含至少一個大寫英文字母"},userPassword_keyLimRequireLowercase:{eng:"Password must contain at least one lowercase letter",cht:"密碼須包含至少一個小寫英文字母"},userPassword_keyLimRequireDigit:{eng:"Password must contain at least one digit",cht:"密碼須包含至少一個數字"},userPassword_keyLimRequireSpecial:{eng:"Password must contain at least one special character",cht:"密碼須包含至少一個特殊符號"},userPassword_keyLimForbiddenChar:{eng:"Password must not contain forbidden characters",cht:"密碼不可包含禁止字元"},userPassword_keyLimCommonPassword:{eng:"This password is too common and not allowed",cht:"此密碼為常見弱密碼,不允許使用"},userPassword_keyLimConsecutiveCharsFromAccount:{eng:"Password must not contain {consecutiveCharsMinMatch} or more consecutive characters from your account name",cht:"密碼不可包含與帳號相同之{consecutiveCharsMinMatch}個以上連續字元"},userChangePassword:{eng:"Change Password",cht:"變更密碼"},userChangePasswordOldPassword:{eng:"Old password",cht:"舊密碼"},userChangePasswordNewPassword:{eng:"New password",cht:"新密碼"},userChangePasswordConfirmPassword:{eng:"Confirm password",cht:"確認新密碼"},userChangePasswordForNoOldPassword:{eng:"Please enter old password",cht:"尚未給予舊密碼"},userChangePasswordForNoNewPassword:{eng:"Please enter new password",cht:"尚未給予新密碼"},userChangePasswordForNoConfirmPassword:{eng:"Please enter confirm password",cht:"尚未給予確認密碼"},userChangePasswordNotSame:{eng:"New password and confirm password do not match",cht:"新密碼與確認密碼不一致"},userChangePasswordSuccess:{eng:"Password change successful, please log in again.",cht:"密碼變更成功,請使用新密碼重新登入。"},userChangePasswordFail:{eng:"Password change failed.",cht:"密碼變更失敗,請確認輸入密碼是否正確"},userChangePasswordIncorrectOld:{eng:"The old password is incorrect.",cht:"舊密碼不正確。"},userChangePasswordForNetError:{eng:"Password validation failed. Please try again later.",cht:"密碼檢測失敗,請稍後再試"},userRegistration:{eng:"Register",cht:"申請帳號"},userRegistrationName:{eng:"Name",cht:"姓名"},userRegistrationEmail:{eng:"Email",cht:"電子郵件"},userRegistrationConfirmPassword:{eng:"Confirm password",cht:"確認密碼"},userRegistrationSubmit:{eng:"Submit",cht:"送出申請"},userRegistrationSuccess:{eng:"Registration successful. Please check your email to verify your account.",cht:"帳號申請成功,請至信箱收取驗證信以啟用帳號。"},userRegistrationNotAllowed:{eng:"User registration is not available.",cht:"目前不開放使用者自行申請帳號。"},userRegistrationAccountInvalid:{eng:"Please enter a valid account.",cht:"請輸入有效的帳號。"},userRegistrationEmailFormatInvalid:{eng:"Please enter a valid email address.",cht:"請輸入有效的電子郵件格式。"},userRegistrationNameInvalid:{eng:"Please enter a valid name.",cht:"請輸入有效的姓名。"},userRegistrationAccountExists:{eng:"This account already exists.",cht:"此帳號已存在。"},userRegistrationEmailExists:{eng:"This email already exists.",cht:"此電子郵件已存在。"},userRegistrationBackToLogin:{eng:"Back to login",cht:"返回登入"},userRegistrationNotVerified:{eng:"Your account has not been verified. Please check your email and click the verification link.",cht:"您的帳號尚未完成 email 驗證,請至信箱點擊驗證連結。"},userRegistrationResendVerify:{eng:"Resend verification email",cht:"重寄驗證信"},userRegistrationResendSuccess:{eng:"Verification email has been resent. Please check your inbox.",cht:"驗證信已重新寄出,請至信箱收取。"},userRegistrationAlreadyVerified:{eng:"This account has already been verified.",cht:"此帳號已完成驗證。"},userRegistrationResendSubmit:{eng:"Send verification email",cht:"寄送驗證信"},userRegistrationResendInvalidEmail:{eng:"The email address does not match the account. Please check and try again.",cht:"電子郵件與帳號不符,請確認後再試。"},userRegistrationResendFailed:{eng:"Failed to send verification email. Please try again later.",cht:"驗證信寄送失敗,請稍後再試。"},userRegistrationResendThrottled:{eng:"A verification email was just sent. Please wait a moment before trying again.",cht:"剛才已寄出驗證信,請稍候片刻再試。"},verifyEmailInvalidToken:{eng:"Invalid or expired verification link.",cht:"驗證連結無效或已失效。"},verifyEmailAlreadyVerified:{eng:"This account has already been verified.",cht:"此帳號已完成驗證。"},userRegistrationVerifySuccess:{eng:"Email verified successfully. Please log in.",cht:"電子郵件驗證成功,請登入。"},loginAccountBlocked:{eng:"Your account has been temporarily locked due to multiple failed login attempts. Please try again later.",cht:"您的帳號因多次登入失敗已被暫時鎖定,請稍後再試。"},loginAccountExpired:{eng:"Your account has expired. Please contact the administrator.",cht:"您的帳號已過期,請聯繫管理員。"},loginUnknownError:{eng:"An unexpected error occurred during login. Please try again later.",cht:"登入時發生未預期的錯誤,請稍後再試。"},tokenExpired:{eng:"Your session has expired. Please log in again.",cht:"登入逾時,請重新登入。"},tokenNoPermission:{eng:"Token does not have permission.",cht:"權杖無存取權限。"},invalidRows:{eng:"Invalid data format.",cht:"資料格式錯誤。"},accountRequired:{eng:"Account is required.",cht:"帳號為必填。"},accountDuplicate:{eng:"Account already exists.",cht:"帳號已存在。"},getStaDataFailed:{eng:"Failed to retrieve statistics data.",cht:"統計資料取得失敗。"},token:{eng:"Token",cht:"金鑰"},isApp:{eng:"For app",cht:"是否為應用系統金鑰"},tokenTimeCreate:{eng:"Created time",cht:"金鑰創建時間"},tokenTimeEnd:{eng:"End time",cht:"金鑰到期時間"},tokenTimeUpdate:{eng:"Updated time",cht:"金鑰更新時間"},tokenDeleteCheckTokens:{eng:"Delete checked token(s)",cht:"刪除勾選金鑰"},tokenSaveTokensFail:{eng:"Failed to save tokens",cht:"儲存金鑰數據失敗"},tokenSaveTokensSuccess:{eng:"Save tokens successfully",cht:"儲存金鑰數據成功"},ip:{eng:"IP",cht:"IP"},ipTimeBlocked:{eng:"Blocked time",cht:"IP封鎖時間"},ipDeleteCheckIps:{eng:"Delete checked IP(s)",cht:"刪除勾選IP"},ipSaveIpsFail:{eng:"Failed to save IPs",cht:"儲存IP數據失敗"},ipSaveIpsSuccess:{eng:"Save IPs successfully",cht:"儲存IP數據成功"},statisticsInformation:{eng:"Statistics Information",cht:"統計資訊"},statisticsInformationDescription:{eng:"Provides an overview of system usage and security metrics.",cht:"提供系統使用情況和安全指標的總覽。"},userGroupInfor:{eng:"User Information",cht:"使用者資訊區"},totalUsers:{eng:"Total Users",cht:"總使用者"},activeUsers:{eng:"Active Users",cht:"活躍使用者"},blockedUsers:{eng:"Blocked Users",cht:"已封鎖使用者"},expiredUsers:{eng:"Expired Users",cht:"已過期使用者"},accessActivityMonitoring:{eng:"Access Activity Monitoring",cht:"存取活動監測"},userLoginFrequency:{eng:"User Login Frequency",cht:"使用者登入頻率"},last7Days:{eng:"Last 7 days",cht:"最近7天"},tokenUsageFrequency:{eng:"Token Usage Frequency",cht:"金鑰使用頻率"},ipConnectionFrequency:{eng:"IP Connection Frequency",cht:"IP 連線頻率"},controlStatus:{eng:"Control Status",cht:"管控狀態"},tokenCharacteristic:{eng:"Token Characteristic",cht:"金鑰狀態"},activeTokens:{eng:"Active Tokens",cht:"有效金鑰數量"},createdLast24h:{eng:"Created in last 24h",cht:"最近24小時內創建"},endingNext24h:{eng:"Ending in next 24h",cht:"未來24小時內到期"},endedTokens:{eng:"Ended Tokens",cht:"已到期金鑰數量"},ipCharacteristic:{eng:"IP Characteristic",cht:"IP狀態"},conn24h:{eng:"Connections in last 24h",cht:"最近24小時內連線數量"},blockedIps:{eng:"Blocked IPs",cht:"當前已封鎖IP數量"},selectItem1hr:{eng:"1 hour",cht:"1小時"},selectItem4hr:{eng:"4 hour",cht:"4小時"},selectItem8hr:{eng:"8 hour",cht:"8小時"},selectItem1day:{eng:"1 day",cht:"1日"},countAttempt:{eng:"Attempt",cht:"嘗試登入"},countSuccess:{eng:"Success",cht:"登入成功"},countError:{eng:"Error",cht:"登入失敗"},count:{eng:"Count",cht:"總次數"},showIndividually:{eng:"Show individually",cht:"個別顯示"},numberOrder:{eng:"No.",cht:"排序"},total:{eng:"Total",cht:"總計"},last1Day:{eng:"Last 1 day",cht:"最近1天"},last8Hour:{eng:"Last 8 hour",cht:"最近8小時"},last4Hour:{eng:"Last 4 hour",cht:"最近4小時"},last1Hour:{eng:"Last 1 hour",cht:"最近1小時"},showMax5:{eng:"Show max 5 rows",cht:"顯示前5筆"},showAll:{eng:"Show all",cht:"顯示全部"},regVerifyEmTitle:{eng:"Please verify your email",cht:"請驗證您的電子郵件"},regVerifyEmContent:{eng:'Dear {name},<br><br>Thank you for registering at {sender}.<br><br>Please click the link below to verify your email and activate your account:<br><a href="{verifyUrl}">{verifyUrl}</a><br><br>If you did not register, please ignore this email.<br><br>This is an automated notification. Please do not reply.',cht:'{name} 您好:<br><br>感謝您註冊「{sender}」。<br><br>請點擊以下連結以驗證您的電子郵件並啟用帳號:<br><a href="{verifyUrl}">{verifyUrl}</a><br><br>若您未曾進行此操作,請忽略此信。<br><br>此為系統自動通知信件,請勿直接回覆。'},chpwEmTitle:{eng:"Password has been changed",cht:"密碼已進行變更"},chpwEmContent:{eng:"Dear User {name},<br><br>This is to inform you that the password for your {sender} account has been successfully changed.<br><br>If you did not perform this action or have any concerns regarding your account security, please contact the system administrator as soon as possible to ensure the safety of your account.<br><br>This is an automated system notification. Please do not reply to this email.",cht:"使用者 {name} 您好:<br><br>您於「{sender}」的密碼已成功變更。<br><br>若您未曾進行此操作,或對帳號安全有任何疑慮,請您儘速聯絡系統管理單位,以確保帳號安全。<br><br>此為系統自動通知信件,請勿直接回覆。"},resetPwEmTitle:{eng:"Your password has been reset",cht:"您的密碼已被重設"},resetPwEmContent:{eng:"Dear {name},<br><br>The administrator has reset the password for your {sender} account.<br><br>Account: {account}<br>New password: <strong>{newPassword}</strong><br><br>Please log in with this password and immediately set your own new password upon login.<br><br>If you did not expect this change, please contact the administrator.<br><br>This is an automated notification.",cht:"使用者 {name} 您好:<br><br>管理員已重設您於「{sender}」的密碼。<br><br>帳號:{account}<br>新密碼:<strong>{newPassword}</strong><br><br>請以此密碼登入後,立即變更為您自己的新密碼。<br><br>若非您預期之操作,請聯繫管理員。<br><br>此為系統自動通知信件。"},adminResetPasswordConfirm:{eng:"Confirm to reset password for {account}?",cht:"確定對 {account} 重設密碼?"},adminResetPasswordSuccess:{eng:"Password reset and new password sent to {email}",cht:"已重設並寄送新密碼至 {email}"},adminResetPasswordCannotResetSelf:{eng:"Cannot reset your own password via this action",cht:"不可對自己重設密碼"},adminResetPasswordForbidden:{eng:"Forbidden: admin permission required",cht:"權限不足:須具管理員身分"},adminResetPasswordUserNotFound:{eng:"User not found",cht:"查無使用者"},adminResetPasswordFailed:{eng:"Failed to reset password",cht:"重設密碼失敗"},adminResetPasswordAlreadyTriggered:{eng:"A password reset was just triggered. Please wait a moment before trying again.",cht:"剛才已觸發重設密碼,請稍候片刻再試。"},userForceChangePwPrompt:{eng:"Your password has been reset by the administrator. Please change it to your own new password.",cht:"您的密碼已由管理員重設,請按確認後變更為您自己的新密碼。"},cannotDemoteSelf:{eng:"Cannot demote yourself from admin",cht:"不可解除自己的管理員權限"},cannotDisableSelf:{eng:"Cannot disable yourself",cht:"不可停用自己的帳號"},cannotDeleteSelf:{eng:"Admin cannot delete yourself",cht:"管理員不得刪除自己"}},tu=(e={})=>{let t=Ie(e,"kpLangExtEmail");Ii(t)||(t={});let i=Ie(e,"kpLangExt");Ii(i)||(i={});let n=Ie(e,"webName");Ii(n)||(n={});let s=Ie(e,"webDescription");Ii(s)||(s={});let o={};o={...o,...eu},Ii(t)&&qn(t,(e,t)=>{o[t]={...Ie(o,t,{}),...e}}),Ii(i)&&(o={...o,...i}),Ii(n)&&(o={...o,webName:{...n}}),Ii(s)&&(o={...o,webDescription:{...s}});let r={};return qn(["eng","cht"],e=>{let t={};qn(o,(i,n)=>{t[n]=i[e]}),r[e]=t}),r};function iu(e,t,i={}){let{srLog:n,minForAccountLoginFailed:s,numForAccountLoginFailed:o,minBlockForAccountLoginFailed:r,minForTokenCallApi:a,numForTokenCallApi:c,minBlockForTokenCallApi:l,minForIpCallApi:u,numForIpCallApi:p,minBlockForIpCallApi:d}=i,m={},h=async e=>{if(!Ii(e))return Promise.reject("invalid u");let t=Ie(e,"timeBlocked","");if(Va(t)){return Tn().format("YYYY-MM-DDTHH:mm:ss.SSSZ")<=t}return""!==t&&Promise.reject(`invalid timeBlocked[${t}]`)},g=async e=>{let i=await t.getGenUserByAccount(e);return await h(i)},f=!1;setInterval(async()=>{if(f)return;f=!0;let e=Tn().add(-s,"minute").format("YYYY-MM-DDTHH:mm:ss.SSSZ");await er(m,async(t,i)=>{let n=t.filter(t=>t>=e);0===dt(n)?delete m[i]:m[i]=n}).finally(()=>{f=!1})},2e3);let w={},y=async e=>Ie(w,e,[]),x=!1;setInterval(async()=>{if(x)return;x=!0;let i=Tn().add(-a,"minute").format("YYYY-MM-DDTHH:mm:ss.SSSZ");await er(w,async(s,o)=>{let r=s.filter(e=>e>=i);w[o]=r,dt(r)>c&&await(async i=>{let s=await t.getTokenByKV("token",i);if("y"===Ie(s,"isApp",""))return void(n&&pn(n.debug)&&n.debug({event:"fun-blockAccountByToken",key:"appTokenSkipRateLimit",token:ec(i)}));let o=Ie(s,"userId","");if(!Li(o))return Promise.reject("invalid userId");let r=await t.getGenUserByUserId(o);if(await h(r))return;let a=Tn().add(l,"minute").format("YYYY-MM-DDTHH:mm:ss.SSSZ");await e.users.save({id:r.id,timeBlocked:a}),await e.tokens.del({id:s.id})})(o).catch(e=>{console.log(e)})}).finally(()=>{x=!1})},2e3);let D={},v=async e=>{if(!Ii(e))return Promise.reject("invalid oip");let t=Ie(e,"timeBlocked","");if(Va(t)){return Tn().format("YYYY-MM-DDTHH:mm:ss.SSSZ")<=t}return""!==t&&Promise.reject(`invalid timeBlocked[${t}]`)},M=async e=>Ie(D,e,[]),C=!1;setInterval(async()=>{if(C)return;C=!0;let i=zt(D),n=await t.getIpsList(),s={};qn(n,e=>{let t=e.ip;s[t]=!0});let o={};qn(i,e=>{o[e]=!0});let r=[];qn(o,(e,t)=>{On(s,t)||r.push(t)});let a=ds(r,e=>Ua.ips.funNew({ip:e}));await e.ips.insert(a).catch(e=>{console.log(e)}).finally(()=>{C=!1})},2e3);let I=!1;setInterval(async()=>{if(I)return;I=!0;let i=Tn().add(-u,"minute").format("YYYY-MM-DDTHH:mm:ss.SSSZ");await er(D,async(n,s)=>{let o=n.filter(e=>e>=i);D[s]=o,dt(o)>p&&await(async i=>{let n=null,s=()=>Tn().add(d,"minute").format("YYYY-MM-DDTHH:mm:ss.SSSZ"),o=null;if(await t.getIpByKV("ip",i).then(e=>{o=e}).catch(e=>{let t="can not find the ip by keyIp[ip]";e===t?o=null:n=t}),null!==n)return Promise.reject(n);if(null===o){let t=s();return o=Ua.ips.funNew({ip:i,timeBlocked:t}),await e.ips.insert(o).catch(e=>{n=e}),null!==n?Promise.reject(n):void 0}if(await v(o))return;let r=s();await e.ips.save({id:o.id,timeBlocked:r})})(s).catch(e=>{console.log(e)})}).catch(e=>{console.log(e)}).finally(()=>{I=!1})},2e3);let b={loginByAccountAndPassword:async(i,n)=>{let a=!1;try{a=await g(i)}catch(e){return Promise.reject("failedLoginForCatch")}if(a)return Promise.reject("failedLoginForCatch");let c=null;return await t.loginByAccountAndPassword(i,n).then(e=>{c={state:"success",msg:e},m[i]=[]}).catch(async n=>{m[i]||(m[i]=[]),m[i].push(Tn().format("YYYY-MM-DDTHH:mm:ss.SSSZ"));let a=Tn().add(-s,"minute").format("YYYY-MM-DDTHH:mm:ss.SSSZ"),l=m[i].filter(e=>e>=a);m[i]=l,dt(l)>o&&await(async i=>{let n=await t.getGenUserByAccount(i);if(await h(n))return;let s=Tn().add(r,"minute").format("YYYY-MM-DDTHH:mm:ss.SSSZ");await e.users.save({id:n.id,timeBlocked:s});let o=await e.tokens.select({userId:n.id});for(let t of o)await e.tokens.del({id:t.id})})(i).catch(e=>{console.log(e)}),c={state:"error",msg:n}}),"success"===c.state?c.msg:Promise.reject(c.msg)},cleanKpAccountLoginFailed:async()=>{m={}},cleanKpIpCallApi:async()=>{D={}},getBlockedByAccount:g,getBlockedByIp:async e=>{let i=null;if(!Li(e))return Promise.reject("invalid ip");let n=null;return await t.getIpByKV("ip",e).then(e=>{n=e}).catch(e=>{let t="can not find the ip by keyIp[ip]";e===t?n=null:i=t}),null!==i?Promise.reject(i):null!==n&&await v(n)},callApiByToken:async e=>{w[e]||(w[e]=[]),w[e].push(Tn().format("YYYY-MM-DDTHH:mm:ss.SSSZ"))},getInforsByTokenCallApi:y,getCountsByTokenCallApi:async e=>dt(await y(e)),getIpByHeaders:e=>{let t=Ie(e,"headers"),i="";if(!Li(i)){let e=Ie(t,"x-forwarded-for","");i=Ie(Ss(e,","),0,""),i=Ts(i)}return Li(i)||e&&e.info&&e.info.remoteAddress&&(i=e.info.remoteAddress,i=Ts(i)),Li(i)||e&&e.socket&&e.socket.remoteAddress&&(i=e.socket.remoteAddress,i=Ts(i)),Li(i)||e&&e.connection&&e.connection.remoteAddress&&(i=e.connection.remoteAddress,i=Ts(i)),Li(i)||(console.log("headers",t),console.log("can not get ip of user")),i},callApiByIp:async e=>{D[e]||(D[e]=[]),D[e].push(Tn().format("YYYY-MM-DDTHH:mm:ss.SSSZ"))},getInforsByIpCallApi:M,getCountsByIpCallApi:async e=>dt(await M(e))};return b}function nu(i,n=1){return function(e,t=1,i={}){let n=1,s=Ie(i,"path"),o=Ie(i,"fs");if(!Dn(e,{fs:o}))throw new Error(`fd[${e}] is not a folder`);return null!==t&&Ri(t)&&(t=Vi(t))<1&&(t=1),function e(i){let r=[];return Dn(i,{fs:o})?(qn(o.readdirSync(i),function(a){let c=s.resolve(i,a),l=null;try{l=o.statSync(c)}catch(e){}l&&l.isDirectory()?(r.push({isFolder:!0,level:n,path:c,name:s.basename(c)}),n+=1,(n<=t||null===t)&&(r=r.concat(e(c))),n-=1):r.push({isFolder:!1,level:n,path:c,name:s.basename(c)})}),r):r}(e)}(i,n,{path:e,fs:t})}let su=new Map,ou=new Map;function ru(e,i,n){let s=nu(e);s=s.filter(e=>!Ie(e,"isFolder",!1)),s=function(e,t,i){let n=t.format(i);return ga(e,e=>{let t=Ie(e,"name","").replace(/\.log$/,"");return!/^\d{4}-\d{2}-\d{2}/.test(t)||t>=n.slice(0,t.length)})}(s,i,n);let o=[];for(let e of s)try{let i=t.statSync(e.path);if(!i.isFile())continue;o.push({path:e.path,name:e.name,size:i.size,mtimeMs:i.mtimeMs})}catch(e){}return o}function au(e){let t=new Map;return i=>{let n=Math.floor(i/6e4),s=t.get(n);return void 0===s&&(s=Tn(6e4*n).format(e),t.set(n,s)),s}}async function cu(e,i,n,s=null){pn(s)||(s=au(n));let o={minTimeMs:null,token:{},ip:{},login:{}};return await function(e,i){return new Promise((n,s)=>{let o=null,r=t.createReadStream(e,{encoding:"utf8"}),a=D.createInterface({input:r,crlfDelay:1/0});a.on("line",i);let c=e=>{o=e,a.close()};r.on("error",c),a.on("error",c),r.on("close",()=>{o?s(o):n()})})}(e,e=>{let t=null;try{t=JSON.parse(e)}catch(e){return}if(null===t||"object"!=typeof t)return;let n=t.event,r=0;if("fun-checkToken"===n?r=1:"verifyConn"===n?r=2:"kpfun-loginByAccountAndPassword-before"===n?r=3:"kpfun-loginByAccountAndPassword-success"===n?r=4:"kpfun-loginByAccountAndPassword-error"===n&&(r=5),0===r)return;let a="number"==typeof(c=t.time)?c:Li(c)?Tn(c).valueOf():NaN;var c;if(Number.isNaN(a))return;if((null===o.minTimeMs||a<o.minTimeMs)&&(o.minTimeMs=a),!(a>i))return;let l=s(a);if(1===r){let e=o.token[l];void 0===e&&(e={count:0,kp:{}},o.token[l]=e),e.count+=1;let i=t.userId;e.kp[i]=(e.kp[i]||0)+1}else if(2===r){let e=o.ip[l];void 0===e&&(e={count:0,kp:{}},o.ip[l]=e),e.count+=1;let i=t.ip;e.kp[i]=(e.kp[i]||0)+1}else{let e=o.login[l];void 0===e&&(e={attempt:0,success:0,error:0},o.login[l]=e),3===r?e.attempt+=1:4===r?e.success+=1:e.error+=1}}),o}async function lu(e,t,i){let n=au(i),s=[];for(let o of e)try{let e=await cu(o.path,t,i,n);s.push({name:o.name,ok:!0,agg:e})}catch(e){s.push({name:o.name,ok:!1,err:String(Ie(e,"message",e))})}return s}function uu(e,t){for(let i in t.token){let n=t.token[i],s=e.token[i];void 0===s&&(s={count:0,kp:{}},e.token[i]=s),s.count+=n.count;for(let e in n.kp)s.kp[e]=(s.kp[e]||0)+n.kp[e]}for(let i in t.ip){let n=t.ip[i],s=e.ip[i];void 0===s&&(s={count:0,kp:{}},e.ip[i]=s),s.count+=n.count;for(let e in n.kp)s.kp[e]=(s.kp[e]||0)+n.kp[e]}for(let i in t.login){let n=t.login[i],s=e.login[i];void 0===s&&(s={attempt:0,success:0,error:0},e.login[i]=s),s.attempt+=n.attempt,s.success+=n.success,s.error+=n.error}return e}async function pu(t,i={}){let n=!1!==Ie(i,"useCache"),s=Ie(i,"scanFiles");pn(s)||(s=lu);let o=Ie(i,"srLog",null),r=ru(t.fdLog,t.tStart,t.fmt),a=function(e){let t=su.get(e);return t||(t=new Map,su.set(e,t)),t}((c=t.fdLog,l=t.fmt,`${e.resolve(c)}|${l}`));var c,l;let u=[],p={};for(let e of r){let i=n?a.get(e.name):void 0;void 0!==i&&i.size===e.size&&i.mtimeMs===e.mtimeMs&&(null===i.minTimeMs||i.minTimeMs>i.scanTStartMs&&i.minTimeMs>t.tStartMs)?p[e.name]=i.agg:u.push(e)}if(n){let e=new Set(r.map(e=>e.name));for(let t of a.keys())e.has(t)||a.delete(t)}let d=[];if(u.length>0){let e=await s(u.map(e=>({path:e.path,name:e.name})),t.tStartMs,t.fmt),i={};for(let t of e)i[t.name]=t;for(let e of u){let s=i[e.name];if(s&&s.ok)p[e.name]=s.agg,n&&a.set(e.name,{size:e.size,mtimeMs:e.mtimeMs,minTimeMs:s.agg.minTimeMs,scanTStartMs:t.tStartMs,agg:s.agg});else{let t=Ie(s,"err","no result");d.push({name:e.name,err:t}),n&&a.delete(e.name),o&&pn(o.warn)&&o.warn({event:"fun-staLogs",key:"staLogsFileSkipped",name:e.name,err:t})}}}let m={token:{},ip:{},login:{}};for(let e of r){let t=p[e.name];t&&uu(m,t)}let h=function(e,t){let i=(e,i,n)=>{let s={};for(let i of t)s[i]=e();for(let e in i)s[e]=n(i[e]);return Object.keys(s).sort().map(e=>({time:e,data:s[e]}))};return{token:i(()=>({count:0}),e.token,e=>({count:e.count,...e.kp})),ip:i(()=>({count:0}),e.ip,e=>({count:e.count,...e.kp})),login:i(()=>({attempt:0,success:0,error:0}),e.login,e=>({attempt:e.attempt,success:e.success,error:e.error}))}}(m,t.kpTime);return h.stat={nFiles:r.length,nScanned:u.length,nCached:r.length-u.length,errors:d},h}function du(t=7,i="hr",n={}){let s=function(e=7,t="hr",i={}){let n=Ie(i,"fdLog");Li(n)||(n="./logs");let s=function(e){return"day"===e?"day":"hr"}(t),o="day"===s?"YYYY-MM-DD":"YYYY-MM-DDTHH",r="day"===s?"day":"hour",a=Ie(i,"timeNow"),c="number"==typeof a?Tn(a):Tn(),l=c.subtract(e,"day"),u=l.valueOf(),p=l.startOf(r),d=c.startOf(r),m=[];for(;!p.isAfter(d);)m.push(p.format(o)),p=p.add(1,r);return{fdLog:n,timeInterval:s,fmt:o,unit:r,tStart:l,tStartMs:u,kpTime:m,timeNow:c.valueOf()}}(t,i,n),o=JSON.stringify([e.resolve(s.fdLog),t,s.timeInterval,Ie(n,"timeNow",null)]);if(ou.has(o))return ou.get(o);let r=pu(s,n).finally(()=>{ou.delete(o)});return ou.set(o,r),r}let mu=r.fileURLToPath("undefined"==typeof document&&"undefined"==typeof location?require("url").pathToFileURL(mu).href:"undefined"==typeof document?location.href:v&&"SCRIPT"===v.tagName.toUpperCase()&&v.src||new URL("w-web-sso.umd.js",document.baseURI).href),hu=e.dirname(mu),gu=e.resolve(hu,"staLogsCore.shellWorker.mjs");async function fu(e,t,i){return 0===e.length?[]:function(e,t=gu){let i=fn(),n=new o.Worker(t),s=!1,r=(e,t)=>{s||(s=!0,e(t));try{n.terminate()}catch(e){}};return n.on("message",e=>{"done"===e.mode?r(i.resolve,e.payload):"error"===e.mode&&r(i.reject,e.payload)}),n.on("error",e=>{r(i.reject,e)}),n.on("exit",e=>{r(i.reject,new Error(`staLogs worker exited without result, code=${e}`))}),n.postMessage(e),i}({files:e,tStartMs:t,fmt:i})}function wu(e=7,t="hr",i={}){return du(e,t,{...i,scanFiles:fu})}function yu(e,t,i={}){let{srLog:n,logFd:s}=i,o=async()=>{let e=await t.getUsersListCache(),i=dt(e),n=0;n=dt(ga(e,e=>Qa(e)));let s=0;s=dt(ga(e,e=>_a(e)));let o=0;o=dt(ga(e,e=>Ra(e)));return{total:i,active:n,blocked:s,expired:o}},r=async()=>{let e=Tn().add(-24,"hour").format("YYYY-MM-DDTHH:mm:ss.SSSZ"),i=Tn().format("YYYY-MM-DDTHH:mm:ss.SSSZ"),n=Tn().add(24,"hour").format("YYYY-MM-DDTHH:mm:ss.SSSZ"),s=await t.getTokensListCache(),o=dt(s),r=0;r=dt(ga(s,t=>t.timeCreate>=e));let a=0;a=dt(ga(s,e=>e.timeEnd>=i&&e.timeEnd<=n));let c=0;c=dt(ga(s,e=>function(e){let t=Ie(e,"timeEnd","");return!!Va(t)&&Tn().format("YYYY-MM-DDTHH:mm:ss.SSSZ")>t}(e)));return{active:o-c,created24h:r,ending24h:a,ended:c}},a=async()=>{let e=Tn().add(-24,"hour").format("YYYY-MM-DDTHH:mm:ss.SSSZ"),i=await t.getIpsListCache(),n=0;{let t=ga(await f(),t=>Tn(t.time,"YYYY-MM-DDTHH").format("YYYY-MM-DDTHH:mm:ss.SSSZ")>=e);o="data.count",n=(s=t)&&s.length?function(e,t){for(var i,n=-1,s=e.length;++n<s;){var o=t(e[n]);void 0!==o&&(i=void 0===i?o:i+o)}return i}(s,vi(o)):0}var s,o;let r=0;r=dt(ga(i,e=>_a(e)));return{conn24h:n,blocked:r}},c=async()=>{let e=await async function(e=7,t="hr",i={}){return(await wu(e,t,i)).login}(7,"hr",{fdLog:s,srLog:n});return e},l=Vl(),u=async()=>await l.getProxy("fun",{fun:c,inputs:null,timeExpired:3e4,timeFrom:"end",cacheError:!1}).catch(e=>(n&&n.error({event:"fun-getStaUserAccountLogin",key:"getStaDataFailed",err:String(Ie(e,"message",e))}),Promise.reject("getStaDataFailed"))),p=async()=>{let e=await async function(e=7,t="hr",i={}){return(await wu(e,t,i)).token}(7,"hr",{fdLog:s,srLog:n}),i={};qn(e,e=>{qn(e.data,(e,t)=>{if("count"===t)return!0;i[t]=0})});let o=await t.getUsersListCache(),r={count:0};return qn(o,e=>{r[e.id]=e.name}),e=ds(e,e=>{let t=Uo(i);var n,s,o;return qn(e.data,(e,i)=>{t[i]=e}),n=t,o={},s=vi(s=(e,t)=>"count"===t?t:Ie(r,t,t)),Gt(n,function(e,t,i){Rs(o,s(e,t,i),e)}),t=o,{time:e.time,data:{count:e.count,...t}}}),e},d=Vl(),m=async()=>await d.getProxy("fun",{fun:p,inputs:null,timeExpired:3e4,timeFrom:"end",cacheError:!1}).catch(e=>(n&&n.error({event:"fun-getStaToken",key:"getStaDataFailed",err:String(Ie(e,"message",e))}),Promise.reject("getStaDataFailed"))),h=async()=>{let e=await async function(e=7,t="hr",i={}){return(await wu(e,t,i)).ip}(7,"hr",{fdLog:s,srLog:n}),t={};return qn(e,e=>{qn(e.data,(e,i)=>{if("count"===i)return!0;t[i]=0})}),e=ds(e,e=>{let i=Uo(t);return qn(e.data,(e,t)=>{i[t]=e}),{time:e.time,data:{count:e.count,...i}}}),e},g=Vl(),f=async()=>await g.getProxy("fun",{fun:h,inputs:null,timeExpired:3e4,timeFrom:"end",cacheError:!1}).catch(e=>(n&&n.error({event:"fun-getStaIp",key:"getStaDataFailed",err:String(Ie(e,"message",e))}),Promise.reject("getStaDataFailed"))),w={getStaUserSummary:o,checkTokenAndGetStaUserSummary:async(e,i={})=>(await t.checkToken(e,i),await o()),getStaTokenSummary:r,checkTokenAndGetStaTokenSummary:async(e,i={})=>(await t.checkToken(e,i),await r()),getStaIpSummary:a,checkTokenAndGetStaIpSummary:async(e,i={})=>(await t.checkToken(e,i),await a()),getStaUserAccountLogin:u,checkTokenAndGetStaUserAccountLogin:async(e,i={})=>(await t.checkToken(e,i),await u()),getStaToken:m,checkTokenAndGetStaToken:async(e,i={})=>(await t.checkToken(e,i),await m()),getStaIp:f,checkTokenAndGetStaIp:async(e,i={})=>(await t.checkToken(e,i),await f())};return w}var xu={exports:{}};!function(e){e.exports=function(){function e(e,t){return e(t={exports:{}},t.exports),t.exports}var t=e(function(e){var t=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=t)}),i=e(function(e){var t=e.exports={version:"2.6.5"};"number"==typeof __e&&(__e=t)});i.version;var n=function(e){return"object"==typeof e?null!==e:"function"==typeof e},s=function(e){if(!n(e))throw TypeError(e+" is not an object!");return e},o=function(e){try{return!!e()}catch(e){return!0}},r=!o(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),a=t.document,c=n(a)&&n(a.createElement),l=function(e){return c?a.createElement(e):{}},u=!r&&!o(function(){return 7!=Object.defineProperty(l("div"),"a",{get:function(){return 7}}).a}),p=function(e,t){if(!n(e))return e;var i,s;if(t&&"function"==typeof(i=e.toString)&&!n(s=i.call(e)))return s;if("function"==typeof(i=e.valueOf)&&!n(s=i.call(e)))return s;if(!t&&"function"==typeof(i=e.toString)&&!n(s=i.call(e)))return s;throw TypeError("Can't convert object to primitive value")},d=Object.defineProperty,m={f:r?Object.defineProperty:function(e,t,i){if(s(e),t=p(t,!0),s(i),u)try{return d(e,t,i)}catch(e){}if("get"in i||"set"in i)throw TypeError("Accessors not supported!");return"value"in i&&(e[t]=i.value),e}},h=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},g=r?function(e,t,i){return m.f(e,t,h(1,i))}:function(e,t,i){return e[t]=i,e},f={}.hasOwnProperty,w=function(e,t){return f.call(e,t)},y=0,x=Math.random(),D=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++y+x).toString(36))},v=e(function(e){var n="__core-js_shared__",s=t[n]||(t[n]={});(e.exports=function(e,t){return s[e]||(s[e]=void 0!==t?t:{})})("versions",[]).push({version:i.version,mode:"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})}),M=v("native-function-to-string",Function.toString),C=e(function(e){var n=D("src"),s="toString",o=(""+M).split(s);i.inspectSource=function(e){return M.call(e)},(e.exports=function(e,i,s,r){var a="function"==typeof s;a&&(w(s,"name")||g(s,"name",i)),e[i]!==s&&(a&&(w(s,n)||g(s,n,e[i]?""+e[i]:o.join(String(i)))),e===t?e[i]=s:r?e[i]?e[i]=s:g(e,i,s):(delete e[i],g(e,i,s)))})(Function.prototype,s,function(){return"function"==typeof this&&this[n]||M.call(this)})}),I=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e},b=function(e,t,i){if(I(e),void 0===t)return e;switch(i){case 1:return function(i){return e.call(t,i)};case 2:return function(i,n){return e.call(t,i,n)};case 3:return function(i,n,s){return e.call(t,i,n,s)}}return function(){return e.apply(t,arguments)}},L="prototype",A=function(e,n,s){var o,r,a,c,l=e&A.F,u=e&A.G,p=e&A.S,d=e&A.P,m=e&A.B,h=u?t:p?t[n]||(t[n]={}):(t[n]||{})[L],f=u?i:i[n]||(i[n]={}),w=f[L]||(f[L]={});for(o in u&&(s=n),s)a=((r=!l&&h&&void 0!==h[o])?h:s)[o],c=m&&r?b(a,t):d&&"function"==typeof a?b(Function.call,a):a,h&&C(h,o,a,e&A.U),f[o]!=a&&g(f,o,c),d&&w[o]!=a&&(w[o]=a)};t.core=i,A.F=1,A.G=2,A.S=4,A.P=8,A.B=16,A.W=32,A.U=64,A.R=128;var E,T=A,S=Math.ceil,N=Math.floor,k=function(e){return isNaN(e=+e)?0:(e>0?N:S)(e)},j=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},Z=(E=!1,function(e,t){var i,n,s=String(j(e)),o=k(t),r=s.length;return o<0||o>=r?E?"":void 0:(i=s.charCodeAt(o))<55296||i>56319||o+1===r||(n=s.charCodeAt(o+1))<56320||n>57343?E?s.charAt(o):i:E?s.slice(o,o+2):n-56320+(i-55296<<10)+65536});T(T.P,"String",{codePointAt:function(e){return Z(this,e)}}),i.String.codePointAt;var X=Math.max,Y=Math.min,F=function(e,t){return(e=k(e))<0?X(e+t,0):Y(e,t)},z=String.fromCharCode,G=String.fromCodePoint;T(T.S+T.F*(!!G&&1!=G.length),"String",{fromCodePoint:function(e){for(var t,i=arguments,n=[],s=arguments.length,o=0;s>o;){if(t=+i[o++],F(t,1114111)!==t)throw RangeError(t+" is not a valid code point");n.push(t<65536?z(t):z(55296+((t-=65536)>>10),t%1024+56320))}return n.join("")}}),i.String.fromCodePoint;var H,K,P,U,B,W,V,R,_,Q,O,J,q,$,ee={Space_Separator:/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,ID_Start:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,ID_Continue:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/},te={isSpaceSeparator:function(e){return"string"==typeof e&&ee.Space_Separator.test(e)},isIdStartChar:function(e){return"string"==typeof e&&(e>="a"&&e<="z"||e>="A"&&e<="Z"||"$"===e||"_"===e||ee.ID_Start.test(e))},isIdContinueChar:function(e){return"string"==typeof e&&(e>="a"&&e<="z"||e>="A"&&e<="Z"||e>="0"&&e<="9"||"$"===e||"_"===e||"‌"===e||"‍"===e||ee.ID_Continue.test(e))},isDigit:function(e){return"string"==typeof e&&/[0-9]/.test(e)},isHexDigit:function(e){return"string"==typeof e&&/[0-9A-Fa-f]/.test(e)}},ie=function(e,t){H=String(e),K="start",P=[],U=0,B=1,W=0,V=void 0,R=void 0,_=void 0;do{V=se(),me[K]()}while("eof"!==V.type);return"function"==typeof t?ne({"":_},"",t):_};function ne(e,t,i){var n=e[t];if(null!=n&&"object"==typeof n)if(Array.isArray(n))for(var s=0;s<n.length;s++){var o=String(s),r=ne(n,o,i);void 0===r?delete n[o]:Object.defineProperty(n,o,{value:r,writable:!0,enumerable:!0,configurable:!0})}else for(var a in n){var c=ne(n,a,i);void 0===c?delete n[a]:Object.defineProperty(n,a,{value:c,writable:!0,enumerable:!0,configurable:!0})}return i.call(e,t,n)}function se(){for(Q="default",O="",J=!1,q=1;;){$=oe();var e=ae[Q]();if(e)return e}}function oe(){if(H[U])return String.fromCodePoint(H.codePointAt(U))}function re(){var e=oe();return"\n"===e?(B++,W=0):e?W+=e.length:W++,e&&(U+=e.length),e}var ae={default:function(){switch($){case"\t":case"\v":case"\f":case" ":case" ":case"\ufeff":case"\n":case"\r":case"\u2028":case"\u2029":return void re();case"/":return re(),void(Q="comment");case void 0:return re(),ce("eof")}if(!te.isSpaceSeparator($))return ae[K]();re()},comment:function(){switch($){case"*":return re(),void(Q="multiLineComment");case"/":return re(),void(Q="singleLineComment")}throw fe(re())},multiLineComment:function(){switch($){case"*":return re(),void(Q="multiLineCommentAsterisk");case void 0:throw fe(re())}re()},multiLineCommentAsterisk:function(){switch($){case"*":return void re();case"/":return re(),void(Q="default");case void 0:throw fe(re())}re(),Q="multiLineComment"},singleLineComment:function(){switch($){case"\n":case"\r":case"\u2028":case"\u2029":return re(),void(Q="default");case void 0:return re(),ce("eof")}re()},value:function(){switch($){case"{":case"[":return ce("punctuator",re());case"n":return re(),le("ull"),ce("null",null);case"t":return re(),le("rue"),ce("boolean",!0);case"f":return re(),le("alse"),ce("boolean",!1);case"-":case"+":return"-"===re()&&(q=-1),void(Q="sign");case".":return O=re(),void(Q="decimalPointLeading");case"0":return O=re(),void(Q="zero");case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return O=re(),void(Q="decimalInteger");case"I":return re(),le("nfinity"),ce("numeric",1/0);case"N":return re(),le("aN"),ce("numeric",NaN);case'"':case"'":return J='"'===re(),O="",void(Q="string")}throw fe(re())},identifierNameStartEscape:function(){if("u"!==$)throw fe(re());re();var e=de();switch(e){case"$":case"_":break;default:if(!te.isIdStartChar(e))throw ye()}O+=e,Q="identifierName"},identifierName:function(){switch($){case"$":case"_":case"‌":case"‍":return void(O+=re());case"\\":return re(),void(Q="identifierNameEscape")}if(!te.isIdContinueChar($))return ce("identifier",O);O+=re()},identifierNameEscape:function(){if("u"!==$)throw fe(re());re();var e=de();switch(e){case"$":case"_":case"‌":case"‍":break;default:if(!te.isIdContinueChar(e))throw ye()}O+=e,Q="identifierName"},sign:function(){switch($){case".":return O=re(),void(Q="decimalPointLeading");case"0":return O=re(),void(Q="zero");case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return O=re(),void(Q="decimalInteger");case"I":return re(),le("nfinity"),ce("numeric",q*(1/0));case"N":return re(),le("aN"),ce("numeric",NaN)}throw fe(re())},zero:function(){switch($){case".":return O+=re(),void(Q="decimalPoint");case"e":case"E":return O+=re(),void(Q="decimalExponent");case"x":case"X":return O+=re(),void(Q="hexadecimal")}return ce("numeric",0*q)},decimalInteger:function(){switch($){case".":return O+=re(),void(Q="decimalPoint");case"e":case"E":return O+=re(),void(Q="decimalExponent")}if(!te.isDigit($))return ce("numeric",q*Number(O));O+=re()},decimalPointLeading:function(){if(te.isDigit($))return O+=re(),void(Q="decimalFraction");throw fe(re())},decimalPoint:function(){switch($){case"e":case"E":return O+=re(),void(Q="decimalExponent")}return te.isDigit($)?(O+=re(),void(Q="decimalFraction")):ce("numeric",q*Number(O))},decimalFraction:function(){switch($){case"e":case"E":return O+=re(),void(Q="decimalExponent")}if(!te.isDigit($))return ce("numeric",q*Number(O));O+=re()},decimalExponent:function(){switch($){case"+":case"-":return O+=re(),void(Q="decimalExponentSign")}if(te.isDigit($))return O+=re(),void(Q="decimalExponentInteger");throw fe(re())},decimalExponentSign:function(){if(te.isDigit($))return O+=re(),void(Q="decimalExponentInteger");throw fe(re())},decimalExponentInteger:function(){if(!te.isDigit($))return ce("numeric",q*Number(O));O+=re()},hexadecimal:function(){if(te.isHexDigit($))return O+=re(),void(Q="hexadecimalInteger");throw fe(re())},hexadecimalInteger:function(){if(!te.isHexDigit($))return ce("numeric",q*Number(O));O+=re()},string:function(){switch($){case"\\":return re(),void(O+=ue());case'"':return J?(re(),ce("string",O)):void(O+=re());case"'":return J?void(O+=re()):(re(),ce("string",O));case"\n":case"\r":throw fe(re());case"\u2028":case"\u2029":xe($);break;case void 0:throw fe(re())}O+=re()},start:function(){switch($){case"{":case"[":return ce("punctuator",re())}Q="value"},beforePropertyName:function(){switch($){case"$":case"_":return O=re(),void(Q="identifierName");case"\\":return re(),void(Q="identifierNameStartEscape");case"}":return ce("punctuator",re());case'"':case"'":return J='"'===re(),void(Q="string")}if(te.isIdStartChar($))return O+=re(),void(Q="identifierName");throw fe(re())},afterPropertyName:function(){if(":"===$)return ce("punctuator",re());throw fe(re())},beforePropertyValue:function(){Q="value"},afterPropertyValue:function(){switch($){case",":case"}":return ce("punctuator",re())}throw fe(re())},beforeArrayValue:function(){if("]"===$)return ce("punctuator",re());Q="value"},afterArrayValue:function(){switch($){case",":case"]":return ce("punctuator",re())}throw fe(re())},end:function(){throw fe(re())}};function ce(e,t){return{type:e,value:t,line:B,column:W}}function le(e){for(var t=0,i=e;t<i.length;t+=1){var n=i[t];if(oe()!==n)throw fe(re());re()}}function ue(){switch(oe()){case"b":return re(),"\b";case"f":return re(),"\f";case"n":return re(),"\n";case"r":return re(),"\r";case"t":return re(),"\t";case"v":return re(),"\v";case"0":if(re(),te.isDigit(oe()))throw fe(re());return"\0";case"x":return re(),pe();case"u":return re(),de();case"\n":case"\u2028":case"\u2029":return re(),"";case"\r":return re(),"\n"===oe()&&re(),"";case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case void 0:throw fe(re())}return re()}function pe(){var e="",t=oe();if(!te.isHexDigit(t))throw fe(re());if(e+=re(),t=oe(),!te.isHexDigit(t))throw fe(re());return e+=re(),String.fromCodePoint(parseInt(e,16))}function de(){for(var e="",t=4;t-- >0;){var i=oe();if(!te.isHexDigit(i))throw fe(re());e+=re()}return String.fromCodePoint(parseInt(e,16))}var me={start:function(){if("eof"===V.type)throw we();he()},beforePropertyName:function(){switch(V.type){case"identifier":case"string":return R=V.value,void(K="afterPropertyName");case"punctuator":return void ge();case"eof":throw we()}},afterPropertyName:function(){if("eof"===V.type)throw we();K="beforePropertyValue"},beforePropertyValue:function(){if("eof"===V.type)throw we();he()},beforeArrayValue:function(){if("eof"===V.type)throw we();"punctuator"!==V.type||"]"!==V.value?he():ge()},afterPropertyValue:function(){if("eof"===V.type)throw we();switch(V.value){case",":return void(K="beforePropertyName");case"}":ge()}},afterArrayValue:function(){if("eof"===V.type)throw we();switch(V.value){case",":return void(K="beforeArrayValue");case"]":ge()}},end:function(){}};function he(){var e;switch(V.type){case"punctuator":switch(V.value){case"{":e={};break;case"[":e=[]}break;case"null":case"boolean":case"numeric":case"string":e=V.value}if(void 0===_)_=e;else{var t=P[P.length-1];Array.isArray(t)?t.push(e):Object.defineProperty(t,R,{value:e,writable:!0,enumerable:!0,configurable:!0})}if(null!==e&&"object"==typeof e)P.push(e),K=Array.isArray(e)?"beforeArrayValue":"beforePropertyName";else{var i=P[P.length-1];K=null==i?"end":Array.isArray(i)?"afterArrayValue":"afterPropertyValue"}}function ge(){P.pop();var e=P[P.length-1];K=null==e?"end":Array.isArray(e)?"afterArrayValue":"afterPropertyValue"}function fe(e){return ve(void 0===e?"JSON5: invalid end of input at "+B+":"+W:"JSON5: invalid character '"+De(e)+"' at "+B+":"+W)}function we(){return ve("JSON5: invalid end of input at "+B+":"+W)}function ye(){return ve("JSON5: invalid identifier character at "+B+":"+(W-=5))}function xe(e){console.warn("JSON5: '"+De(e)+"' in strings is not valid ECMAScript; consider escaping")}function De(e){var t={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(t[e])return t[e];if(e<" "){var i=e.charCodeAt(0).toString(16);return"\\x"+("00"+i).substring(i.length)}return e}function ve(e){var t=new SyntaxError(e);return t.lineNumber=B,t.columnNumber=W,t}var Me=function(e,t,i){var n,s,o,r=[],a="",c="";if(null==t||"object"!=typeof t||Array.isArray(t)||(i=t.space,o=t.quote,t=t.replacer),"function"==typeof t)s=t;else if(Array.isArray(t)){n=[];for(var l=0,u=t;l<u.length;l+=1){var p=u[l],d=void 0;"string"==typeof p?d=p:("number"==typeof p||p instanceof String||p instanceof Number)&&(d=String(p)),void 0!==d&&n.indexOf(d)<0&&n.push(d)}}return i instanceof Number?i=Number(i):i instanceof String&&(i=String(i)),"number"==typeof i?i>0&&(i=Math.min(10,Math.floor(i)),c=" ".substr(0,i)):"string"==typeof i&&(c=i.substr(0,10)),m("",{"":e});function m(e,t){var i=t[e];switch(null!=i&&("function"==typeof i.toJSON5?i=i.toJSON5(e):"function"==typeof i.toJSON&&(i=i.toJSON(e))),s&&(i=s.call(t,e,i)),i instanceof Number?i=Number(i):i instanceof String?i=String(i):i instanceof Boolean&&(i=i.valueOf()),i){case null:return"null";case!0:return"true";case!1:return"false"}return"string"==typeof i?h(i):"number"==typeof i?String(i):"object"==typeof i?Array.isArray(i)?w(i):g(i):void 0}function h(e){for(var t={"'":.1,'"':.2},i={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"},n="",s=0;s<e.length;s++){var r=e[s];switch(r){case"'":case'"':t[r]++,n+=r;continue;case"\0":if(te.isDigit(e[s+1])){n+="\\x00";continue}}if(i[r])n+=i[r];else if(r<" "){var a=r.charCodeAt(0).toString(16);n+="\\x"+("00"+a).substring(a.length)}else n+=r}var c=o||Object.keys(t).reduce(function(e,i){return t[e]<t[i]?e:i});return c+(n=n.replace(new RegExp(c,"g"),i[c]))+c}function g(e){if(r.indexOf(e)>=0)throw TypeError("Converting circular structure to JSON5");r.push(e);var t=a;a+=c;for(var i,s,o=[],l=0,u=n||Object.keys(e);l<u.length;l+=1){var p=u[l],d=m(p,e);if(void 0!==d){var h=f(p)+":";""!==c&&(h+=" "),h+=d,o.push(h)}}if(0===o.length)i="{}";else if(""===c)i="{"+(s=o.join(","))+"}";else{var g=",\n"+a;s=o.join(g),i="{\n"+a+s+",\n"+t+"}"}return r.pop(),a=t,i}function f(e){if(0===e.length)return h(e);var t=String.fromCodePoint(e.codePointAt(0));if(!te.isIdStartChar(t))return h(e);for(var i=t.length;i<e.length;i++)if(!te.isIdContinueChar(String.fromCodePoint(e.codePointAt(i))))return h(e);return e}function w(e){if(r.indexOf(e)>=0)throw TypeError("Converting circular structure to JSON5");r.push(e);var t=a;a+=c;for(var i,n=[],s=0;s<e.length;s++){var o=m(String(s),e);n.push(void 0!==o?o:"null")}if(0===n.length)i="[]";else if(""===c)i="["+n.join(",")+"]";else{var l=",\n"+a,u=n.join(l);i="[\n"+a+u+",\n"+t+"]"}return r.pop(),a=t,i}},Ce={parse:ie,stringify:Me},Ie=Ce,be=Ie;return be}()}(xu);var Du=Ln(xu.exports);let vu=e.resolve(),Mu=e.resolve(vu,"settings.json"),Cu=e=>{Mu=e},Iu=()=>{let e=t.readFileSync(Mu,"utf8");return Du.parse(e)},bu={minLength:8,maxLength:16,requireLetter:!0,requireUppercase:!1,requireLowercase:!1,requireDigit:!0,requireSpecial:!0,noSpace:!0,onlyAscii:!0,forbiddenChars:["\\"],noConsecutiveCharsFromAccount:!0,consecutiveCharsMinMatch:2,commonPasswordBlacklist:["1234","12345","123456","1234567","12345678","123456789","1234567890","12345678910","111111","000000","666666","888888","7777777","11111111","123123","123321","654321","987654321","qwerty","qwerty123","qwerty1","qwertyuiop","qazwsx","1q2w3e4r","1q2w3e4r5t","1q2w3e","1qaz2wsx","zxcvbnm","password","password1","passw0rd","admin","admin123","welcome","letmein","login","master","monkey","dragon","shadow","sunshine","superman","batman","football","baseball","soccer","hockey","michael","jordan","jennifer","hunter","ranger","harley","thomas","charlie","andrew","daniel","ashley","bailey","mustang","access","secret","ninja","jesus","hello","freedom","trustno1","1qaz@WSX","P@ssw0rd","Pass@123","Aa123456","Aa@123456","Admin@123","abc@123","abc123","abcdef","abcd1234","abc","iloveyou","fuckyou","f*ckyou","whatever","nothing","google","computer","internet","samsung","apple","killer","princess","lovely","tigger","starwars","pokemon","minecraft","123qwe","zaq1zaq1","photoshop","adobe123","18atcskd2w","mynoob"]};return function(i,n,s,o,r={}){let a=null;if(!pn(i))throw console.log("invalid WOrm",i),new Error("invalid WOrm");if(!Li(n))throw console.log("invalid url",n),new Error("invalid url");if(!Li(s))throw console.log("invalid db",s),new Error("invalid db");Cn(o)||(o="./settings.json"),Cu(o);let c=Iu();Ii(r)&&(c={...c,...r});let l=Ie(c,"serverPort");Ri(l)||(l=11007),l=Vi(l);let u=$a(c),p=(e,t)=>{console.log(`[${e.toUpperCase()}] ${t}`),u[e]({event:"boot",msg:t})},d=Ie(c,"useCheckUser",!1),m=Ie(c,"getUserById",null),h=Ie(c,"useExcludeWhenNotAdmin",!1),g=Ie(c,"webName",{}),f=Ie(c,"webDescription",{}),w=Ie(c,"webLogo",""),y=Ie(c,"webBackgoundGradientColors",[]);qi(y)||(y=["#FFE0B2","#FFCC80","#FFF59D","#F2D6A2","#F0CC88"]);let x=Ie(c,"webKey",""),D=Ie(c,"salt","");if(Li(process.env.SALT)&&(D=process.env.SALT),!Li(D)||"{salt}"===D){if(!Li(process.env.ALLOW_PLACEHOLDER_SALT))throw new Error("SALT pepper 未設定: 請以環境變數 SALT 注入真實高熵 pepper 後再啟動 (測試/開發可設 ALLOW_PLACEHOLDER_SALT=1 沿用佔位符)");p("warn","SALT pepper 為佔位符/空值, 因 ALLOW_PLACEHOLDER_SALT 啟用而放行 — 切勿用於生產環境")}let v=Ie(c,"minExpired","");en(v)||(v=30);let C=Ie(c,"minForAccountLoginFailed","");en(C)||(C=10);let I=Ie(c,"numForAccountLoginFailed","");en(I)||(I=3);let b=Ie(c,"minBlockForAccountLoginFailed","");en(b)||(b=30);let L=Ie(c,"minForTokenCallApi","");en(L)||(L=10);let A=Ie(c,"numForTokenCallApi","");en(A)||(A=1e3);let E=Ie(c,"minBlockForTokenCallApi","");en(E)||(E=30);let T=Ie(c,"minForIpCallApi","");en(T)||(T=10);let S=Ie(c,"numForIpCallApi","");en(S)||(S=1e4);let N=Ie(c,"minBlockForIpCallApi","");en(N)||(N=30);let k=Ie(c,"cleanKpIpCallApiForIps",[]);qi(k)||(k=["127.0.0.1","::1","::ffff:127.0.0.1"]);let j=Ie(c,"cleanKpIpCallApiForToken",""),Z=Ie(c,"cleanKpAccountLoginFailedForIps",[]);qi(Z)||(Z=["127.0.0.1","::1","::ffff:127.0.0.1"]);let X=Ie(c,"cleanKpAccountLoginFailedForToken",""),Y=!0===Ie(c,"allowUserRegistration",!1),F=Ie(c,"siteUrl","");Li(F)||(F="");let z=Ie(c,"passwordPolicy");Ii(z)?z={...bu,...z}:(z=bu,p("info","settings 未提供 passwordPolicy, 採用程式內建預設密碼政策"));let G=Ie(z,"minLength");if(!Ri(G)||Vi(G)<1)throw new Error("invalid passwordPolicy.minLength: must be a positive integer >= 1");let H=Ie(z,"maxLength");if(!Ri(H)||Vi(H)<Vi(G))throw new Error("invalid passwordPolicy.maxLength: must be a positive integer >= minLength");if(!$i(Ie(z,"requireLetter")))throw new Error("invalid passwordPolicy.requireLetter: must be a boolean");if(!$i(Ie(z,"requireUppercase")))throw new Error("invalid passwordPolicy.requireUppercase: must be a boolean");if(!$i(Ie(z,"requireLowercase")))throw new Error("invalid passwordPolicy.requireLowercase: must be a boolean");if(!$i(Ie(z,"requireDigit")))throw new Error("invalid passwordPolicy.requireDigit: must be a boolean");if(!$i(Ie(z,"requireSpecial")))throw new Error("invalid passwordPolicy.requireSpecial: must be a boolean");if(!$i(Ie(z,"noSpace")))throw new Error("invalid passwordPolicy.noSpace: must be a boolean");if(!$i(Ie(z,"onlyAscii")))throw new Error("invalid passwordPolicy.onlyAscii: must be a boolean");let K=Ie(z,"forbiddenChars");if(!_i(K))throw new Error("invalid passwordPolicy.forbiddenChars: must be an array");for(let e=0;e<dt(K);e++)if(!bi(K[e])||1!==dt(K[e]))throw new Error(`invalid passwordPolicy.forbiddenChars[${e}]: each element must be a single character string`);let P=Ie(z,"noConsecutiveCharsFromAccount");if(!$i(P))throw new Error("invalid passwordPolicy.noConsecutiveCharsFromAccount: must be a boolean");if(P){let e=Ie(z,"consecutiveCharsMinMatch");if(!Ri(e)||Vi(e)<2)throw new Error("invalid passwordPolicy.consecutiveCharsMinMatch: must be a positive integer >= 2")}let U=Ie(z,"commonPasswordBlacklist");if(!_i(U))throw new Error("invalid passwordPolicy.commonPasswordBlacklist: must be an array");if(!function(e,t,i){var n=M(e)?mt:Pt;return i&&Mi(e,t,i)&&(t=void 0),n(e,vi(t))}(U,e=>bi(e)))throw new Error("invalid passwordPolicy.commonPasswordBlacklist: each element must be a string");let B=Ie(c,"userLogo",""),W=Ie(c,"subfolder","");Li(W)&&("/"===hn(W,1)&&(W=gn(W,1)),"/"!==mn(W,1)&&(W=`/${W}`));let V=Ie(c,"showLanguage","n"),R=Ie(c,"language","eng"),_=Ie(c,"showModeEditUsers","n"),Q=Ie(c,"modeEditUsers","n"),O=Ie(c,"showModeEditTokens","n"),J=Ie(c,"modeEditTokens","n"),q=Ie(c,"showModeEditIps","n"),$=Ie(c,"modeEditIps","n");Ie(c,"mappingBy","");let ee=Ie(c,"kpLangExt",{}),te=(e=>{let t=Ie(e,"emSrcEmail","");if(!Li(t))throw new Error(`invalid srcEmail[${t}]`);let i=Ie(e,"emSrcPW","");if(!Li(i))throw new Error(`invalid srcPW[${i}]`);let n=Ie(e,"emSrcHost","");if(!Li(n))throw new Error(`invalid srcHost[${n}]`);let s=Ie(e,"emSrcPort","");if(!Ri(s))throw new Error(`invalid srcPort[${s}]`);return{send:async(e,o,r,a)=>{if(!Li(e))return Promise.reject(`invalid srcName[${e}]`);if(!Li(o))return Promise.reject(`invalid emTitle[${o}]`);if(!Li(r))return Promise.reject(`invalid emContent[${r}]`);if(Li(a)&&(a=[a]),!qi(a))return Promise.reject(`invalid toEmails[${a}]`);let c={srcName:e,srcEmail:t,srcPW:i,srcHost:n,srcPort:s,emTitle:o,emContent:r,toEmails:a};return await new Pl(c)}}})(c),ie=(i,n="")=>{if(!Li(i))return i;let s=e.resolve(i);return Cn(s)?t.readFileSync(s,"utf8"):((/^(\.{1,2}[\\/]|[\\/]|[A-Za-z]:[\\/])/.test(i)||/\.(html|txt)$/i.test(i))&&p("warn",`settings.${n} 疑似檔案路徑但檔案不存在(${s}), 將原樣視為文字`),i)},ne={},se=["chpwEmTitle","chpwEmContent","regVerifyEmTitle","regVerifyEmContent","resetPwEmTitle","resetPwEmContent"];se.forEach(e=>{let t=(e=>{let t=Ie(c,e);if(!Ii(t))return{};let i={};return Object.keys(t).forEach(n=>{i[n]=ie(t[n],`${e}.${n}`)}),i})(e);dt(t)>0&&(ne[e]=t)});let oe=tu({kpLangExtEmail:ne,kpLangExt:ee,webName:g,webDescription:f}),re={};Object.keys(oe).forEach(e=>{let t={...oe[e]};se.forEach(e=>{delete t[e]}),re[e]=t});let ae={useCheckUser:d,getUserById:m,useExcludeWhenNotAdmin:h},ce={};try{ce=Ea(Ua,i,n,s,ae)}catch(e){throw console.log("WServOrm init failed",e),e}let{woItems:le,procOrm:ue}=ce,pe=Ie(c,"verifyBaseUrl","");Li(pe)||(pe=`http://localhost:${l}`,Y&&p("warn",`settings 未提供 verifyBaseUrl, 註冊驗證信連結將採 ${pe}, 非本機部署時收信人將無法完成驗證, 請於 settings 提供對外可連之後端 base URL`));let de="./server/template",me="./node_modules/w-web-sso/server/template";vn(me)&&(de=me);let he=Ie(c,"pathTemplate","");Li(he)&&vn(he)||(Li(he)&&p("warn",`settings.pathTemplate 指定之資料夾不存在(${he}), 改採套件內建模板`),he=de);let ge=ie(Ie(c,"verifyEmailResultContent",""),"verifyEmailResultContent");if(!Li(ge)){let i=e.resolve(he,"verifyEmailResult.html");Cn(i)||(i=e.resolve(de,"verifyEmailResult.html")),ge=t.readFileSync(i,"utf8")}let fe=$l(le,ue,{srLog:u,srEmail:te,salt:D,minExpired:v,kpLang:oe,passwordPolicy:z,allowUserRegistration:Y,siteUrl:F,verifyBaseUrl:pe}),we=iu(le,fe,{srLog:u,minForAccountLoginFailed:C,numForAccountLoginFailed:I,minBlockForAccountLoginFailed:b,minForTokenCallApi:L,numForTokenCallApi:A,minBlockForTokenCallApi:E,minForIpCallApi:T,numForIpCallApi:S,minBlockForIpCallApi:N}),ye=Ie(c,"logFd",""),xe=yu(0,fe,{srLog:u,logFd:ye}),De=(...e)=>e.every(e=>Li(e)),ve=(e,t)=>Oa(t),Me="dist",Ce="./node_modules/w-web-sso/dist";vn(Ce)&&(Me=Ce);let be="index.html";try{let i=e.resolve(Me,"index.tmp");if(Cn(i)||(i=e.resolve(Me,be)),!Cn(i))throw console.log("fpEntryIn",i),new Error("invalid fpEntryIn");let n=e.resolve(Me,be),s=t.readFileSync(i,"utf8");s=In(s,"/msso/","{sfd}/"),s=In(s,"{sfd}",W),s=In(s,"{language}",R),t.writeFileSync(n,s,"utf8")}catch(e){console.log(e),console.log(`can not generate ${be}`)}let Le=[{method:"GET",path:"/api/cleanKpIpCallApi",handler:async function(e,t){let i=await yn(async function(){let t=Ie(e,"query.token","");if(!Li(j))return Promise.reject("invalid cleanKpIpCallApiForToken");if(t!==j)return Promise.reject("cleanKpIpCallApi invalid token");let i=Ie(e,"info.remoteAddress","");return Li(i)||(i=Ie(e,"socket.remoteAddress","")),Li(i)||(i=Ie(e,"connection.remoteAddress","")),k.includes(i)?(u.info({event:"api/cleanKpIpCallApi",realIp:i}),await we.cleanKpIpCallApi(),!0):Promise.reject(`cleanKpIpCallApi only allowed from cleanKpIpCallApiForIps, got realIp[${i}]`)})();return un(i.msg)&&(i.msg=i.msg.message),"error"===i.state&&u.error({event:"api-error",key:i.msg}),i}},{method:"GET",path:"/api/cleanKpAccountLoginFailed",handler:async function(e,t){let i=await yn(async function(){let t=Ie(e,"query.token","");if(!Li(X))return Promise.reject("invalid cleanKpAccountLoginFailedForToken");if(t!==X)return Promise.reject("cleanKpAccountLoginFailed invalid token");let i=Ie(e,"info.remoteAddress","");return Li(i)||(i=Ie(e,"socket.remoteAddress","")),Li(i)||(i=Ie(e,"connection.remoteAddress","")),Z.includes(i)?(u.info({event:"api/cleanKpAccountLoginFailed",realIp:i}),await we.cleanKpAccountLoginFailed(),!0):Promise.reject(`cleanKpAccountLoginFailed only allowed from cleanKpAccountLoginFailedForIps, got realIp[${i}]`)})();return un(i.msg)&&(i.msg=i.msg.message),"error"===i.state&&u.error({event:"api-error",key:i.msg}),i}},{method:"GET",path:"/api/logoutSsoUser",handler:async function(e,t){let i=await yn(async function(){let t=Ie(e,"query.token","");return u.info({event:"api/logoutSsoUser",token:ec(t)}),await fe.logoutByToken(t)})();return un(i.msg)&&(i.msg=i.msg.message),"error"===i.state&&u.error({event:"api-error",key:i.msg}),i}},{method:"GET",path:"/api/checkToken",handler:async function(e,t){let i=await yn(async function(){let t=Ie(e,"query.token","");return u.info({event:"api/checkToken",token:ec(t)}),we.callApiByToken(t),await fe.checkToken(t)})();return un(i.msg)&&(i.msg=i.msg.message),"error"===i.state&&u.error({event:"api-error",key:i.msg}),i}},{method:"GET",path:"/api/refreshToken",handler:async function(e,t){let i=await yn(async function(){let t=Ie(e,"query.token","");return u.info({event:"api/refreshToken",token:ec(t)}),we.callApiByToken(t),await fe.refreshToken(t)})();return un(i.msg)&&(i.msg=i.msg.message),"error"===i.state&&u.error({event:"api-error",key:i.msg}),i}},{method:"GET",path:"/api/logoutByToken",handler:async function(e,t){let i=await yn(async function(){let t=Ie(e,"query.token","");return u.info({event:"api/logoutByToken",token:ec(t)}),we.callApiByToken(t),await fe.logoutByToken(t)})();return un(i.msg)&&(i.msg=i.msg.message),"error"===i.state&&u.error({event:"api-error",key:i.msg}),i}},{method:"GET",path:"/api/getSsoUsersList",handler:async function(e,t){let i=await yn(async function(){let t=Ie(e,"query.token","");return u.info({event:"api/getSsoUsersList",token:ec(t)}),we.callApiByToken(t),await fe.checkTokenAndGetUsersList(t,{fun:ve})})();return un(i.msg)&&(i.msg=i.msg.message),"error"===i.state&&u.error({event:"api-error",key:i.msg}),i}},{method:"GET",path:"/api/getSsoUserInfor",handler:async function(e,t){let i=await yn(async function(){let t=Ie(e,"query.token",""),i=Ie(e,"query.key",""),n=Ie(e,"query.value","");if(!De(t,i,n))return Promise.reject("tokenExpired");let s="token"===i?ec(n):n;u.info({event:"api/getSsoUserInfor",token:ec(t),key:i,value:s}),we.callApiByToken(t);let o=null;return o="token"===i?await fe.checkTokenAndGetUserByToken(t,n,{fun:ve}):await fe.checkTokenAndGetUserInfor(t,i,n,{fun:ve}),Ii(o)?o:(console.log("token does not have permission"),Promise.reject("tokenNoPermission"))})();return un(i.msg)&&(i.msg=i.msg.message),"error"===i.state&&u.error({event:"api-error",key:i.msg}),i}},{method:"GET",path:"/api/verifyEmail",handler:async function(e,t){let i=await yn(async function(){let t=Ie(e,"query.token","");return u.info({event:"api/verifyEmail",token:ec(t)}),await fe.verifyEmail(t)})();un(i.msg)&&(i.msg=i.msg.message),"error"===i.state&&u.error({event:"api-error",key:i.msg});let n,s=Ie(e,"query.lang","");"eng"!==s&&"cht"!==s&&(s="eng"),n="success"===i.state?"userRegistrationVerifySuccess":i.msg&&"string"==typeof i.msg?i.msg:"verifyEmailInvalidToken";let o=Ie(oe,`${s}.webName`,""),r=Ie(oe,`${s}.${n}`,n),a=ge;return a=In(a,"{title}",o),a=In(a,"{message}",r),t.response(a).type("text/html; charset=utf-8")}}],Ae={port:c.serverPort,pathStaticFiles:Me,apiName:"api",apis:Le,tokenType:"Bearer",verifyConn:async({apiType:e,authorization:t,query:i,headers:n,req:s})=>{let o=we.getIpByHeaders(s),r=Ie(n,"origin",""),a=Ie(n,"referer","");u.info({event:"verifyConn",ip:o,origin:r,referer:a}),we.callApiByIp(o);let c=!0;return await we.getBlockedByIp(o).then(e=>{c=e}).catch(()=>{c=!0}),c=!c,c||console.log(`block ip[${o}]`),c},getUserIdByToken:async e=>"",corsOrigins:["*"],useDbOrm:!1,tableNamesExec:[],methodsExec:[],tableNamesSync:[],kpFunExt:{getWebInfor:async e=>({webLogo:w,webBackgoundGradientColors:y,webKey:x,userLogo:B,showLanguage:V,language:R,kpLang:re,showModeEditUsers:_,modeEditUsers:Q,showModeEditTokens:O,modeEditTokens:J,showModeEditIps:q,modeEditIps:$,allowUserRegistration:Y,passwordPolicyInfo:{minLength:z.minLength,maxLength:z.maxLength,requireLetter:z.requireLetter,requireUppercase:z.requireUppercase,requireLowercase:z.requireLowercase,requireDigit:z.requireDigit,requireSpecial:z.requireSpecial,consecutiveCharsMinMatch:z.consecutiveCharsMinMatch}}),checkToken:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-checkToken",token:ec(t)}),await fe.checkToken(t)},refreshToken:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-refreshToken",token:ec(t)}),await fe.refreshToken(t)},loginByAccountAndPassword:async(e,t,i,n)=>{if(!De(i,n))return Promise.reject("failedLoginForCatch");u.info({event:"kpfun-loginByAccountAndPassword-before",account:i});let s=null,o="";return await we.loginByAccountAndPassword(i,n).then(e=>{s=e}).catch(e=>{o=e}),Ii(s)?u.info({event:"kpfun-loginByAccountAndPassword-success",account:i}):u.info({event:"kpfun-loginByAccountAndPassword-error",account:i,msg:o}),Ii(s)?s:Promise.reject(o)},logoutByToken:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-logoutByToken",token:ec(t)}),await fe.logoutByToken(t)},createUser:async(e,t,i,n,s,o,r)=>{u.info({event:"kpfun-createUser",lang:t,account:i});let a={lang:t,account:i,password:n,confirmPassword:s,name:o,email:r};return await fe.createUser(t,a)},verifyEmail:async(e,t)=>(u.info({event:"kpfun-verifyEmail",token:ec(t)}),await fe.verifyEmail(t)),resendVerifyEmail:async(e,t,i,n)=>(u.info({event:"kpfun-resendVerifyEmail",lang:t,account:i}),await fe.resendVerifyEmail(t,i,n)),getUserByToken:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-getUserByToken",token:ec(t)}),await fe.checkTokenAndGetUserByToken(t,t)},getUserInfor:async(e,t,i,n)=>{if(!De(t,i,n))return Promise.reject("tokenExpired");let s="token"===i?ec(n):n;return u.info({event:"kpfun-getUserInfor",token:ec(t),key:i,value:s}),await fe.checkTokenAndGetUserInfor(t,i,n,{fun:ve})},checkUserPassword:async(e,t,i)=>(u.info({event:"kpfun-checkUserPassword",lang:t}),await fe.checkUserPassword(t,i)),changeUserPassword:async(e,t,i,n,s)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-changeUserPassword",token:ec(t),lang:i}),await fe.checkTokenAndChangePassword(t,i,n,s)},adminResetUserPassword:async(e,t,i,n)=>{if(!De(t,n))return Promise.reject("tokenExpired");return u.info({event:"kpfun-adminResetUserPassword",token:ec(t),lang:i,targetUserId:n}),await fe.adminResetUserPassword(t,i,n)},getUsersList:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-getUsersList",token:ec(t)}),await fe.checkTokenAndGetUsersList(t,{fun:ve})},updateUsersList:async(e,t,i,n)=>{if(!De(t))return Promise.reject("tokenExpired");if(!qi(n)||!n.every(e=>Li(Ie(e,"id",""))))return Promise.reject("invalidRows");return u.info({event:"kpfun-updateUsersList",token:ec(t),lang:i}),await fe.checkTokenAndUpdateUsersList(t,i,n,{fun:ve})},getTokensList:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-getTokensList",token:ec(t)}),await fe.checkTokenAndGetTokensList(t,{fun:ve})},updateTokensList:async(e,t,i,n)=>{if(!De(t))return Promise.reject("tokenExpired");if(!qi(n)||!n.every(e=>Li(Ie(e,"id",""))))return Promise.reject("invalidRows");return u.info({event:"kpfun-updateTokensList",token:ec(t),lang:i}),await fe.checkTokenAndUpdateTokensList(t,n,{fun:ve})},getIpsList:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-getIpsList",token:ec(t)}),await fe.checkTokenAndGetIpsList(t,{fun:ve})},updateIpsList:async(e,t,i,n)=>{if(!De(t))return Promise.reject("tokenExpired");if(!qi(n)||!n.every(e=>Li(Ie(e,"id",""))))return Promise.reject("invalidRows");return u.info({event:"kpfun-updateIpsList",token:ec(t),lang:i}),await fe.checkTokenAndUpdateIpsList(t,n,{fun:ve})},getStaUserSummary:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-getStaUserSummary",token:ec(t)}),await xe.checkTokenAndGetStaUserSummary(t,{fun:ve})},getStaTokenSummary:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-getStaTokenSummary",token:ec(t)}),await xe.checkTokenAndGetStaTokenSummary(t,{fun:ve})},getStaIpSummary:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-getStaIpSummary",token:ec(t)}),await xe.checkTokenAndGetStaIpSummary(t,{fun:ve})},getStaUserAccountLogin:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-getStaUserAccountLogin",token:ec(t)}),await xe.checkTokenAndGetStaUserAccountLogin(t,{fun:ve})},getStaToken:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-getStaToken",token:ec(t)}),await xe.checkTokenAndGetStaToken(t,{fun:ve})},getStaIp:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-getStaIp",token:ec(t)}),await xe.checkTokenAndGetStaIp(t,{fun:ve})}},fnTableTags:"tableTags-web-sso.json"};return Ae.kpFunExt=Object.fromEntries(Object.entries(Ae.kpFunExt).map(([e,t])=>[e,async(...i)=>{try{return await t(...i)}catch(t){throw u.error({event:"kpfun-error",fun:e,key:Li(t)?t:un(t)?t.message:String(t)}),t}}])),a=new $o(Ae),a}});
13
+ }(e)&&(n?i.push("keyLimRequireSpecial"):i.push("密碼須包含至少一個特殊符號")),s&&dt(i)>0)throw new Error(i[0]);let g=Ie(t,"forbiddenChars",null);if(_i(g)||(g=[]),dt(g)>0){for(let t of g)if(e.includes(t)){if(n){i.push("keyLimForbiddenChar");break}i.push(`密碼不可包含字元:${t}`)}if(s&&dt(i)>0)throw new Error(i[0])}let f=Ie(t,"commonPasswordBlacklist",null);if(_i(f)||(f=Ul),dt(f)>0){let t=e.toLowerCase();if(f.some(e=>bi(e)&&t===e.toLowerCase())&&(n?i.push("keyLimCommonPassword"):i.push("此密碼為常見弱密碼,不允許使用")),s&&dt(i)>0)throw new Error(i[0])}let w=Ie(t,"account",""),y=Ie(t,"noConsecutiveCharsFromAccount",null);$i(y)||(y=!1);let x=Ie(t,"consecutiveCharsMinMatch","");if(Ri(x)||(x=3),x=Vi(x),y&&bi(w)&&dt(w)>=x){let t=[...w.toLowerCase()],o=e.toLowerCase(),r=!1;for(let e=0;e<=t.length-x;e++){let i=t.slice(e,e+x).join("");if(o.includes(i)){r=!0;break}}if(r&&(n?i.push("keyLimConsecutiveCharsFromAccount"):i.push(`密碼不可包含與帳號相同之${x}個以上連續字元`)),s&&dt(i)>0)throw new Error(i[0])}if(dt(i)>0)throw new Error(i.join(" | "));return!0}function Wl(e,t){return mi(e,t)}function Vl(){let e=Yn(),t={};function i(t,i){setTimeout(()=>{e.emit(t,i)},1)}function n(e,n={}){if(On(t,e))return;let s=Ie(n,"fun");pn(s)||(s=async()=>{});let o=Ie(n,"inputs");_i(o)||(o=[]);let r=Ie(n,"timeExpired");Ri(r)||(r=5e3),r=Vi(r);let a=Ie(n,"timeFrom");"end"!==a&&(a="start");let c=Ie(n,"useCacheWhenError");$i(c)||(c=!1);let l=Ie(n,"useCloneDeep");$i(l)||(l=!0),t[e]={needExec:!0,fun:s,pm:null,gen:0,inputs:o,value:null,time:null,timeExpired:r,timeFrom:a,useCacheWhenError:c,useCloneDeep:l},i("message",{fun:"set",key:e,timeExpired:r,timeFrom:a,useCacheWhenError:c,useCloneDeep:l})}async function s(e,n={}){if(On(t,e)){let s=t[e],o=Ie(n,"useCloneDeep");if($i(o)||(o=s.useCloneDeep),s.pm)return i("message",{fun:"get",key:e,msg:"waiting"}),await s.pm,o?Uo(s.value):s.value;let r=Date.now(),a=s.needExec,c=r-s.time;if(a?i("message",{fun:"get",key:e,msg:"execute first"}):s.timeExpired>0&&c>s.timeExpired&&(i("message",{fun:"get",key:e,msg:"execute by timeExpired",timeDiff:c}),a=!0),a){i("message",{fun:"get",key:e,msg:"fun start"}),s.needExec=!1;let t=s.gen,n=async()=>{try{let n;try{n=await s.fun(...s.inputs)}catch(o){if(i("error",{fun:"get",key:e,msg:o}),!s.useCacheWhenError)throw s.gen===t&&(s.needExec=!0),o;n=void 0}s.gen===t&&(s.value=n,s.time="end"===s.timeFrom?Date.now():r)}finally{s.pm=null,i("message",{fun:"get",key:e,msg:"fun end"})}};s.pm=n(),await s.pm}else i("message",{fun:"get",key:e,msg:"use cache"});return o?Uo(s.value):s.value}return i("error",{fun:"get",key:e,msg:"invalid key"}),null}return e.set=n,e.getProxy=async function(e,t={}){return n(e,t),s(e,t)},e.get=s,e.update=function(e,n){On(t,e)&&(i("message",{fun:"updateValue",key:e}),t[e].value=n,t[e].time=Date.now(),t[e].gen+=1)},e.clear=function(e){On(t,e)&&(i("message",{fun:"clear",key:e}),t[e].needExec=!0)},e.remove=function(e){On(t,e)&&(i("message",{fun:"remove",key:e}),delete t[e])},e}function Rl(e){let t="";if(un(e))t=e.message;else{if(bi(e))return e;if(Ci(e))return On(e,"message")?e.message:JSON.stringify(e);if(_i(e))return JSON.stringify(e);t=Hn(e)}return t}function _l(e,t,i={}){let n=Ie(i,"mode","");if(Li(n)||(n="scrypt"),"scrypt"!==n)throw new Error("暫時不支援scrypt以外方法");let s=f.randomBytes(16),o=`${e}:${t||""}`,r=f.scryptSync(o,s,64);return`scrypt:${s.toString("hex")}:${r.toString("hex")}`}function Ql(e,t,i){if(!Li(t))return!1;let n=t.split(":");if(3!==n.length)return!1;let s,o,[r,a,c]=n;if("scrypt"!==r)return!1;if(!Li(a)||!Li(c))return!1;try{s=Buffer.from(a,"hex"),o=Buffer.from(c,"hex")}catch(e){return!1}if(16!==s.length||64!==o.length)return!1;let l=`${e}:${i||""}`,u=f.scryptSync(l,s,64);return u.length===o.length&&f.timingSafeEqual(u,o)}function Ol(e){return e[x.randomInt(e.length)]}function Jl(e){for(let t=e.length-1;t>0;t--){let i=x.randomInt(t+1),n=e[t];e[t]=e[i],e[i]=n}return e}function ql(e){return"string"!=typeof e&&(e=null==e?"":String(e)),e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function $l(e,t,{srLog:i,srEmail:n,salt:s,minExpired:o,kpLang:r,passwordPolicy:a,allowUserRegistration:c,siteUrl:l,verifyBaseUrl:u}){let p=new function(){let e=new Map,t=new Map;return async(i,n)=>{let s=(e.get(i)||Promise.resolve()).then(async()=>await n(),async()=>await n());e.set(i,s.catch(()=>{})),t.set(i,(t.get(i)||0)+1);try{return await s}finally{let n=t.get(i)-1;n<=0?(t.delete(i),e.delete(i)):t.set(i,n)}}},d=function(e={}){let t=Ie(e,"timeExpire",null);Ri(t)||(t=18e5),t=Vi(t);let i=Ie(e,"timeDetect",null);Ri(i)||(i=2e3),i=Vi(i);let n=Yn(),s={},o=e=>{if(On(s,e)){let t=`checkWithSet: key in use: ${e}`;return n.emit("checkWithSet",{state:"error",msg:t}),!1}s[e]={time:Date.now(),value:!0};let t=`checkWithSet: ${e}`;return n.emit("checkWithSet",{state:"success",msg:t}),!0},r=setInterval(()=>{n.emit("detect",{state:"start"});let e=Date.now();for(let i of Object.keys(s)){let n=s[i];n&&e-n.time>t&&delete s[i]}n.emit("detect",{state:"finish"})},i);return n.checkWithSet=o,n.setWithFree=async(e,t)=>{n.emit("setWithFree",{state:"start"});let i=[];for(let t of e){if(!o(t)){for(let e of i)delete s[e];let e=`setWithFree: key in use: ${t}`;return n.emit("setWithFree",{state:"error",msg:e}),Promise.reject(e)}i.push(t)}try{let i=await t(),s=`setWithFree: ${e.join(", ")}`;return n.emit("setWithFree",{state:"success",msg:s}),i}catch(e){let t=`setWithFree: fn threw: ${e&&e.message||e}`;throw n.emit("setWithFree",{state:"error",msg:t}),e}finally{for(let e of i)delete s[e]}},n.set=async(e,t=!0)=>{s[e]={time:Date.now(),value:t};let i=`set: ${e}`;n.emit("set",{state:"success",msg:i})},n.get=async e=>{let t=s[e],i=void 0===t?null:t.value,o=`get: ${e}`;return n.emit("get",{state:"success",msg:o}),i},n.check=async e=>{let t=On(s,e),i=`check: ${e} = ${t}`;return n.emit("check",{state:"success",msg:i}),t},n.del=async e=>{delete s[e];let t=`del: ${e}`;n.emit("del",{state:"success",msg:t})},n.waitExist=async(e,t={})=>{let i=Ie(t,"attemptNum",null);Ri(i)||(i=30),i=Vi(i);let o=Ie(t,"timeInterval",null);Ri(o)||(o=100),o=Vi(o),n.emit("waitExist",{state:"start"});try{await Fn(()=>On(s,e),{attemptNum:i,timeInterval:o})}catch(t){let s=`waitExist timeout (${i*o}ms): ${e}`;return n.emit("waitExist",{state:"error",msg:s}),Promise.reject(s)}let r=`waitExist resolved: ${e}`;n.emit("waitExist",{state:"success",msg:r})},n.waitNotExist=async(e,t={})=>{let i=Ie(t,"attemptNum",null);Ri(i)||(i=30),i=Vi(i);let o=Ie(t,"timeInterval",null);Ri(o)||(o=100),o=Vi(o),n.emit("waitNotExist",{state:"start"});try{await Fn(()=>!On(s,e),{attemptNum:i,timeInterval:o})}catch(t){let s=`waitNotExist timeout (${i*o}ms): ${e}`;return n.emit("waitNotExist",{state:"error",msg:s}),Promise.reject(s)}let r=`waitNotExist resolved: ${e}`;n.emit("waitNotExist",{state:"success",msg:r})},n.clear=()=>{clearInterval(r)},n}(),m=new Map,h=new Map,g=(e,t)=>Ie(r,`${t}.${e}`,""),f=(e,t,i={})=>{"eng"!==t&&"cht"!==t&&(t="eng");let n=Ie(r,`${t}.${e}`,"");for(let e in i)n=n.replaceAll(`{${e}}`,ql(i[e]));return n},w=async(t,n,s={})=>{let o=null,r=Ie(s,"deletePassword");$i(r)||(r=!0);let a=await e.users.select({[t]:n,isActive:"y"}).catch(e=>{o=e});if(o)return console.log(o),console.log("keyUser",t),console.log("valueUser",n),console.log("failed to find user"),Promise.reject("failed to find user");r&&(a=ds(a,e=>(delete e.password,e)));let c=dt(a);return 0===c?(i&&pn(i.debug)&&i.debug({event:"fun-getGenUserByKV",key:"userNotFound",keyUser:t,valueUser:n}),Promise.reject(`can not find the user by ${t}`)):c>=2?(i&&pn(i.debug)&&i.debug({event:"fun-getGenUserByKV",key:"userDuplicate",keyUser:t,valueUser:n}),Promise.reject(`duplicate ${t}`)):a[0]},y=async(e,t)=>await w(e,t),x=async(e,t={})=>await y("id",e),D=async t=>{let i=null;if(!en(o))return console.log("minExpired",o),console.log("invalid minExpired"),Promise.reject("invalid minExpired");let n=Ua.tokens.funNew({userId:t});n.timeEnd=Tn().add(o,"minute").format("YYYY-MM-DDTHH:mm:ss.SSSZ");let s=Ie(n,"token","");return await e.tokens.insert(n).catch(e=>{i=e}),i?(console.log(i),console.log("can not create a token from userId"),Promise.reject("can not create a token from userId")):s},v=async(t,n={})=>{let s=await e.tokens.select({token:t}),o=dt(s);if(0===o)return console.log("invalid token"),Promise.reject("invalid token");if(o>=2)return console.log("duplicate tokens"),Promise.reject("duplicate tokens");let r=Ie(s,0,""),a=Ie(r,"userId",""),c=await(async(e,t={})=>{let i=Ie(e,"timeEnd","");if(!Va(i))return console.log("timeEnd",i),console.log("invalid timeEnd"),Promise.reject("invalid timeEnd");let n=Ie(e,"isApp",""),s=Ie(t,"fun",null),o=Tn().format("YYYY-MM-DDTHH:mm:ss.SSSZ")<i,r=!0;if("y"!==n&&pn(s)){let t=Ie(e,"userId","");r=s(e,await x(t)),wn(r)&&(r=await r)}return o&&r})(r,n);return i.info({event:"fun-checkToken",token:ec(t),userId:a,res:c}),c},M=async(e,t={})=>{if(!Li(e))return Promise.reject("tokenExpired");let i=null;return await v(e,t).then(e=>{!1===e&&(i="tokenExpired")}).catch(e=>{console.log("checkToken inner reject",e),i="tokenExpired"}),null===i||Promise.reject(i)},C=(e,t,i={})=>{Li(e)||(e="eng");let n=Ie(i,"account",""),s="";try{Bl(t,{useKeyForError:!0,useOnlyOneError:!0,numLenMin:a.minLength,numLenMax:a.maxLength,requireLetter:a.requireLetter,requireUppercase:a.requireUppercase,requireLowercase:a.requireLowercase,requireDigit:a.requireDigit,requireSpecial:a.requireSpecial,noSpace:a.noSpace,onlyAscii:a.onlyAscii,forbiddenChars:a.forbiddenChars,commonPasswordBlacklist:a.commonPasswordBlacklist,account:n,noConsecutiveCharsFromAccount:a.noConsecutiveCharsFromAccount,consecutiveCharsMinMatch:a.consecutiveCharsMinMatch})}catch(e){s=e.message}let o=null;return Li(s)?(o={state:"error",key:`userPassword_${s}`},o):(o={state:"success",msg:"ok"},o)},I=async(n,o,r,a={})=>{let c=Ie(a,"resetOrder");$i(c)||(c=!1);let l=Ie(a,"operatorId",""),u=Ie(a,"lang","eng");Li(u)||(u="eng"),o=function(e,t,i=""){return qi(e)&&qi(t)?ds(e,e=>Fa(e,t,i)):[]}(o,Ua[n].keys),c&&(o=ds(o,(e,t)=>(e.order=t+1,e)));let p=(e,t)=>{let i=null,n={};return qn(e,(e,s)=>{let o=Ie(e,t,"");return Li(o)?On(n,o)?(i=`rows[${s}].${t}[${o}] is duplicate`,!1):void(n[o]=!0):(i=`rows[${s}].${t} is not an effective string`,!1)}),i},d=null;if(function(e,t){function i(e){return _i(e)?e:[e]}if(Ji(e))return!1;if(0===(e=i(e)).length)return!1;if(Ji(e))return!1;if(0===(t=i(t)).length)return!1;for(let i=0;i<e.length;i++)for(let n=0;n<t.length;n++)if(Wl(e[i],t[n]))return!0;return!1}(n,["users"])){if(d=p(o,"id"),null!==d)return Promise.reject(d);if(d=p(o,"email"),null!==d)return Promise.reject(d)}let m=await e[n].select();if("users"===n){let e={};qn(m,t=>{let i=Ie(t,"account","");Li(i)&&(e[i]=Ie(t,"id",""))});let t={},i=null;if(qn(o,n=>{let s=Ie(n,"account",""),o=Ie(n,"id","");return Li(s)?On(t,s)||On(e,s)&&e[s]!==o?(i="accountDuplicate",!1):void(t[s]=!0):(i="accountRequired",!1)}),null!==i)return Promise.reject(i)}if("users"===n){let e={};qn(m,t=>{e[t.id]=t}),qn(o,t=>{let i=e[t.id];i&&(t.password=i.password)})}let h=o,g=function(e,t,i,n={}){let s=Ie(n,"withInfor");$i(s)||(s=!0);let o={del:[],add:[],same:[],diff:[]};if(!Li(i))return console.log("invalid key"),s&&(o.infor={}),o;_i(e)||(e=[e]),_i(t)||(t=[t]),e=ga(e,e=>On(e,i)),t=ga(t,e=>On(e,i));let r=new Map(t.map(e=>[e[i],e]));for(let t of e){let e=r.get(t[i]);e?(JSON.stringify(t)===JSON.stringify(e)?o.same.push(e):o.diff.push(e),r.delete(t[i])):o.del.push(t)}if(o.add=Array.from(r.values()),s){let e={};for(let t of o.del)e[t[i]]="del";for(let t of o.add)e[t[i]]="add";for(let t of o.diff)e[t[i]]="diff";for(let t of o.same)e[t[i]]="same";o.infor=e}return o}(m,h,r);if(dt(g.del)>0&&(await t(l,n,"del",g.del),"users"===n))for(let t of g.del){let n=Ie(t,"id","");if(Li(n))try{let t=await e.tokens.select({userId:n});for(let i of t)await e.tokens.del({id:i.id})}catch(d){i.error({event:"fun-updateTabItems-revokeTokenOnDelete",userId:n,err:Rl(d)})}}if(dt(g.add)>0){if("users"===n){for(let e of g.add){let t=Ie(e,"password",""),i=Ie(e,"account",""),n=C(u,t,{account:i});if("error"===n.state)return Promise.reject(n.key);e.password=_l(t,s)}qn(g.add,e=>{Li(Ie(e,"timeVerified",""))||(e.timeVerified=Sn())})}await t(l,n,"insert",g.add)}return dt(g.diff)>0&&await t(l,n,"save",g.diff),"users"===n&&(h=ds(h,e=>{let t={...e};return delete t.password,t})),h},b=async t=>{let i=await e.tokens.select({token:t}),n=dt(i);if(0===n)return console.log("invalid token"),Promise.reject("invalid token");if(n>=2)return console.log("duplicate tokens"),Promise.reject("duplicate tokens");let s=Ie(i,0,null),o=Ie(s,"isApp",""),r=null;if("y"!==o){let e=Ie(s,"userId","");r=await x(e)}else{let e=Ie(s,"userId","");if(!Li(e))return console.log("invalid userId from token"),Promise.reject("invalid userId from token");r={id:e,account:"no account",name:"no name",email:"no email",description:"no description",from:"no from",redir:"no redir",isAdmin:"y",timeVerified:"2000-01-01T00:00:00.000+08:00",timeExpired:"",timeBlocked:"",isActive:"y"}}return{id:r.id,account:r.account,name:r.name,email:r.email,description:r.description,from:r.from,redir:r.redir,isApp:"y"===o?"y":"n",isAdmin:r.isAdmin,timeVerified:r.timeVerified,timeExpired:r.timeExpired,timeBlocked:r.timeBlocked,isActive:r.isActive,isForceChangePw:r.isForceChangePw}},L=async(e,t,i={})=>{let n=await y(e,t).catch(()=>null);return Ii(n)?{id:n.id,account:n.account,name:n.name,email:n.email,description:n.description,from:n.from,redir:n.redir,isAdmin:n.isAdmin,timeVerified:n.timeVerified,timeExpired:n.timeExpired,timeBlocked:n.timeBlocked,isActive:n.isActive}:null},A=async(t={})=>{let i=Ie(t,"needActive");$i(i)||(i=!1);let n=Ie(t,"deletePassword");$i(n)||(n=!0);let s={};i&&(s={isActive:"y"});let o=await e.users.select(s);return n&&(o=ds(o,e=>(delete e.password,e))),o},E=Vl(),T=async(e,t={})=>(await M(e,t),await A(t)),S=async(e,t={})=>e=await I("users",e,"id",{resetOrder:!0,...t}),N=async()=>await e.tokens.select(),k=Vl(),j=async()=>await e.ips.select(),Z=Vl(),X={getTokenByKV:async(t,i)=>{let n=null,s=await e.tokens.select({[t]:i}).catch(e=>{n=e});if(n)return console.log(n),console.log("failed to find token"),Promise.reject("failed to find token");let o=dt(s);return 0===o?Promise.reject(`can not find the token by keyToken[${t}]`):o>=2?(console.log(`duplicate token by keyToken[${t}]`),Promise.reject(`duplicate token by keyToken[${t}]`)):s[0]},createUser:async(i,o)=>{if(Li(i)||(i="eng"),!c)return Promise.reject("userRegistrationNotAllowed");let a=Ie(o,"account","");if(!Li(a))return Promise.reject("userRegistrationAccountInvalid");let l=Ie(o,"email","");if(!Li(l)||!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(l))return Promise.reject("userRegistrationEmailFormatInvalid");let p=Ie(o,"password",""),m=Ie(o,"confirmPassword","");if(p!==m)return Promise.reject("userChangePasswordNotSame");let h=C(i,p,{account:a});if("error"===h.state)return Promise.reject(h.key);let w=Ie(o,"name","");if(!Li(w))return Promise.reject("userRegistrationNameInvalid");let y,x=`createUser:account:${a}`,D=`createUser:email:${l}`;await d.setWithFree([x,D],async()=>{let i=await e.users.select(),n=i.some(e=>Ie(e,"account","")===a);if(n)return Promise.reject("userRegistrationAccountExists");let o=i.some(e=>Ie(e,"email","")===l);if(o)return Promise.reject("userRegistrationEmailExists");let r=_l(p,s);y=`${Ya()}`;let c=Ua.users.funNew({account:a,password:r,name:w,email:l,tokenVerify:y,isAdmin:"n",isActive:"y"});await t(c.id,"users","insert",[c])}).catch(e=>{let t=e&&"string"==typeof e?e:e&&e.message||String(e);return t.includes(x)?Promise.reject("userRegistrationAccountExists"):t.includes(D)?Promise.reject("userRegistrationEmailExists"):Promise.reject(e)});try{let e=Ie(r,`${i}.webName`,""),t=g("regVerifyEmTitle",i),s=f("regVerifyEmContent",i,{sender:e,name:w,verifyUrl:`${u}/api/verifyEmail?token=${y}&lang=${i}`});await n.send(e,t,s,l)}catch(e){console.log("send verify email error",e)}return{state:"success",msg:"ok"}},verifyEmail:async t=>{if(!Li(t))return Promise.reject("verifyEmailInvalidToken");let i=await e.users.select({tokenVerify:t});if(0===dt(i))return Promise.reject("verifyEmailInvalidToken");let n=i[0];return Li(Ie(n,"timeVerified",""))?Promise.reject("verifyEmailAlreadyVerified"):(await e.users.save({id:n.id,timeVerified:Sn()}),{state:"success",msg:"ok"})},resendVerifyEmail:async(t,i,s)=>(Li(t)||(t="eng"),Li(i)&&Li(s)?await p(`resendVerifyEmail:${i}`,async()=>{let o=Date.now(),a=m.get(i);if(a&&o-a<3e4)return Promise.reject("userRegistrationResendThrottled");let c=null;try{c=await w("account",i)}catch(e){}if(!c)return Promise.reject("userRegistrationResendInvalidEmail");if(Ie(c,"email","")!==s)return Promise.reject("userRegistrationResendInvalidEmail");if(Li(Ie(c,"timeVerified","")))return Promise.reject("userRegistrationAlreadyVerified");let l=Ie(c,"id",""),p=Ie(c,"name",""),d=`${Ya()}`;await e.users.save({id:l,tokenVerify:d}),m.set(i,o);try{let e=Ie(r,`${t}.webName`,""),i=g("regVerifyEmTitle",t),o=f("regVerifyEmContent",t,{sender:e,name:p,verifyUrl:`${u}/api/verifyEmail?token=${d}&lang=${t}`});await n.send(e,i,o,s)}catch(e){return console.log("resend verify email error",e),Promise.reject("userRegistrationResendFailed")}return{state:"success",msg:"ok"}}):Promise.reject("userRegistrationResendInvalidEmail")),checkUserPassword:C,checkTokenAndChangePassword:async(t,o,a,c)=>{if(await M(t),Li(o)||(o="eng"),!Li(a))return Promise.reject("userChangePasswordFail");let l=Ie(await b(t),"id","");return await p(`changeUserPassword:${l}`,async()=>{let u=await w("id",l,{deletePassword:!1}),p=Ie(u,"account",""),d=C(o,c,{account:p});if("error"===d.state)return Promise.reject(d.key);let m=Ie(u,"password","");if(!Ql(a,m,s))return Promise.reject("userChangePasswordIncorrectOld");let h=Ie(u,"email","");if(!Li(h))return Promise.reject("anUnexpectedErrorOccurred");let y=_l(c,s);await e.users.save({id:l,password:y,isForceChangePw:"n"});try{let e=Ie(r,`${o}.webName`,"");if(!Li(e))throw console.log("get(kpLang, lang)",Ie(r,o)),console.log("lang",o),new Error("invalid sender");let t=Ie(u,"name","unknow"),i=g("chpwEmTitle",o);if(!Li(i))throw console.log("chpwEmTitle 取不到, lang",o),new Error("invalid title");let s=f("chpwEmContent",o,{sender:e,name:t});await n.send(e,i,s,h)}catch(e){console.log(e),i.error({event:"fun-changePassword-sendEmail",token:ec(t),lang:o,err:Rl(e)})}})},adminResetUserPassword:async(t,o,c)=>{if(await M(t),Li(o)||(o="eng"),!Li(c))return Promise.reject("anUnexpectedErrorOccurred");let l=await b(t),u=Ie(l,"id","");return"y"!==Ie(l,"isAdmin","")?Promise.reject("adminResetPasswordForbidden"):u===c?Promise.reject("adminResetPasswordCannotResetSelf"):await p(`adminResetUserPassword:${c}`,async()=>{let l=Date.now(),u=h.get(c);if(u&&l-u<3e4)return Promise.reject("adminResetPasswordAlreadyTriggered");let p=null;try{p=await w("id",c,{deletePassword:!0})}catch(e){return Promise.reject("adminResetPasswordUserNotFound")}if(!Ii(p))return Promise.reject("adminResetPasswordUserNotFound");let d=Ie(p,"account",""),m=Ie(p,"name","unknow"),y=Ie(p,"email",""),x=function(e,t=""){let i=e.minLength||8,n=e.maxLength||16,s=Math.min(Math.max(i,12),n),o="abcdefghijklmnopqrstuvwxyz".split(""),r="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""),a="0123456789".split(""),c="!@#$%^&*()_+-=[]{}|;:,.<>?".split(""),l=e.forbiddenChars||[];c=c.filter(e=>!l.includes(e));let u=[];(e.requireLowercase||e.requireLetter)&&(u=u.concat(o)),e.requireUppercase&&(u=u.concat(r)),!e.requireLetter||e.requireUppercase||e.requireLowercase||(u=u.concat(r)),e.requireDigit&&(u=u.concat(a)),e.requireSpecial&&(u=u.concat(c)),0===u.length&&(u=o.concat(r).concat(a));for(let i=0;i<20;i++){let i=[];for(e.requireLetter&&i.push(Ol(o.concat(r))),e.requireUppercase&&i.push(Ol(r)),e.requireLowercase&&i.push(Ol(o)),e.requireDigit&&i.push(Ol(a)),e.requireSpecial&&i.push(Ol(c));i.length<s;)i.push(Ol(u));Jl(i);let n=i.join("");try{return Bl(n,{useKeyForError:!0,useOnlyOneError:!0,numLenMin:e.minLength,numLenMax:e.maxLength,requireLetter:e.requireLetter,requireUppercase:e.requireUppercase,requireLowercase:e.requireLowercase,requireDigit:e.requireDigit,requireSpecial:e.requireSpecial,noSpace:e.noSpace,onlyAscii:e.onlyAscii,forbiddenChars:e.forbiddenChars,commonPasswordBlacklist:e.commonPasswordBlacklist,account:t,noConsecutiveCharsFromAccount:e.noConsecutiveCharsFromAccount,consecutiveCharsMinMatch:e.consecutiveCharsMinMatch}),n}catch(e){}}throw new Error("cannot generate random password matching policy")}(a,d),D=_l(x,s);await e.users.save({id:c,password:D,isForceChangePw:"y"}),h.set(c,l);try{if(Li(y)){let e=Ie(r,`${o}.webName`,"");if(!Li(e))throw new Error("invalid sender");let t=g("resetPwEmTitle",o);if(!Li(t))throw new Error("invalid title");let i=f("resetPwEmContent",o,{sender:e,name:m,account:d,newPassword:x});await n.send(e,t,i,y)}else i.error({event:"fun-adminResetUserPassword-noEmail",token:ec(t),targetUserId:c})}catch(e){console.log(e),i.error({event:"fun-adminResetUserPassword-sendEmail",token:ec(t),targetUserId:c,err:Rl(e)})}return{state:"success"}})},getIpByKV:async(t,i)=>{let n=null,s=await e.ips.select({[t]:i}).catch(e=>{n=e});if(n)return console.log(n),console.log("keyIp",t),console.log("valueIp",i),console.log("failed to find ip"),Promise.reject("failed to find ip");let o=dt(s);return 0===o?Promise.reject(`can not find the ip by keyIp[${t}]`):o>=2?(console.log("keyIp",t),console.log("valueIp",i),console.log(`duplicate ip by keyIp[${t}]`),Promise.reject(`duplicate ip by keyIp[${t}]`)):s[0]},getGenUserByKV:y,getGenUserByUserId:x,getGenUserByAccount:async(e,t={})=>await y("account",e),loginByAccountAndPassword:async(t,i)=>{if(!Li(t)||!Li(i))return Promise.reject("failedLoginForCatch");let n=await e.users.select({account:t});if(0===dt(n))return Promise.reject("failedLoginForCatch");let o=n[0];if(!Ql(i,Ie(o,"password",""),s))return Promise.reject("failedLoginForCatch");if(!Li(Ie(o,"timeVerified","")))return Promise.reject("userRegistrationNotVerified");let r=Ie(o,"timeExpired","");if(Li(r)&&Va(r)){if(Tn().format("YYYY-MM-DDTHH:mm:ss.SSSZ")>r)return Promise.reject("loginAccountExpired")}let a=Ie(o,"id",""),c=await D(a);return{id:o.id,account:o.account,name:o.name,email:o.email,description:o.description,from:o.from,redir:o.redir,isAdmin:o.isAdmin,isActive:o.isActive,isForceChangePw:o.isForceChangePw,token:c}},logoutByToken:async t=>{if(!Li(t))return Promise.reject("tokenExpired");let n=null,s=await e.tokens.select({token:t}),o=dt(s);if(0===o)return console.log("invalid token"),Promise.reject("invalid token");if(o>=2)return console.log("duplicate tokens"),Promise.reject("duplicate tokens");let r=Ie(s,0,""),a=Ie(r,"userId",""),c=await e.tokens.del({id:r.id}).catch(e=>{n=e});return n?(console.log(n),console.log("failed to delete token"),Promise.reject("failed to delete token")):(c=Ie(c,"0.nDeleted",0),1!==c?(console.log("can not delete the token"),Promise.reject("can not delete the token")):(i.info({event:"fun-logout",token:ec(t),userId:a}),!0))},checkToken:M,refreshToken:async t=>{if(!Li(t))return Promise.reject("tokenExpired");let i=null,n=await e.tokens.select({token:t}),s=dt(n);if(0===s)return console.log("invalid token"),Promise.reject("invalid token");if(s>=2)return console.log("duplicate tokens"),Promise.reject("duplicate tokens");let r=Ie(n,0,""),a=Ie(r,"timeEnd","");if(!Va(a))return console.log("timeEnd",a),console.log("invalid timeEnd"),Promise.reject("invalid timeEnd");let c=Tn().format("YYYY-MM-DDTHH:mm:ss.SSSZ");if(c>=a)return console.log("tn",c),console.log("timeEnd",a),console.log("token expired"),Promise.reject("tokenExpired");let l=Tn().add(o,"minute").format("YYYY-MM-DDTHH:mm:ss.SSSZ"),u=Tn().format("YYYY-MM-DDTHH:mm:ss.SSSZ");return await e.tokens.save({id:r.id,timeEnd:l,timeUpdate:u}).catch(e=>{i=e}),i?(console.log(i),console.log("can not update timeEnd for token"),Promise.reject("can not update timeEnd for token")):l},getUserByToken:b,checkTokenAndGetUserByToken:async(e,t,i={})=>(await M(e,i),await b(t).catch(()=>null)),getUserInfor:L,checkTokenAndGetUserInfor:async(e,t,i,n={})=>(await M(e,n),await L(t,i)),getUsersList:A,getUsersListCache:async()=>await E.getProxy("fun",{fun:A,inputs:null,timeExpired:3e4}),checkTokenAndGetUsersList:T,checkTokenAndGetActiveUsersList:async(e,t={})=>await T(e,{...t,needActive:!0}),updateUsersList:S,checkTokenAndUpdateUsersList:async(t,n,s,o={})=>{await M(t,o),Li(n)||(n="eng");let r=Ie(await b(t),"id",""),a=null;if(qn(s,e=>{if(Ie(e,"id","")===r)return a=e,!1}),Li(r)&&!Ii(a))return Promise.reject("cannotDeleteSelf");if(Ii(a)){if("y"!==Ie(a,"isAdmin",""))return Promise.reject("cannotDemoteSelf");if("y"!==Ie(a,"isActive",""))return Promise.reject("cannotDisableSelf")}s=await S(s,{lang:n,operatorId:r});for(let t of s){if("n"!==Ie(t,"isActive",""))continue;let n=Ie(t,"id","");if(Li(n))try{let t=await e.tokens.select({userId:n});for(let i of t)await e.tokens.del({id:i.id})}catch(e){i.error({event:"fun-updateUsersList-revokeToken",userId:n,err:Rl(e)})}}return E.clear("fun"),s},getTokensList:N,getTokensListCache:async()=>await k.getProxy("fun",{fun:N,inputs:null,timeExpired:3e4}),checkTokenAndGetTokensList:async(e,t={})=>(await M(e,t),await N()),checkTokenAndUpdateTokensList:async(e,t,i={})=>(await M(e,i),t=await(async e=>await I("tokens",e,"id",{resetOrder:!1}))(t),k.clear("fun"),t),getIpsList:j,getIpsListCache:async()=>await Z.getProxy("fun",{fun:j,inputs:null,timeExpired:3e4}),checkTokenAndGetIpsList:async(e,t={})=>(await M(e,t),await j()),checkTokenAndUpdateIpsList:async(e,t,i={})=>(await M(e,i),t=await(async e=>await I("ips",e,"id",{resetOrder:!1}))(t),Z.clear("fun"),t)};return X}let eu={csIng:{eng:"Connecting...",cht:"連線中..."},csLogin:{eng:"Logged in",cht:"已登入"},csLogout:{eng:"Logged out",cht:"已登出"},csErrConn:{eng:"Unable to connect",cht:"無法連線"},csErrLogin:{eng:"Login denied",cht:"拒絕登入"},aggridLanguage:{eng:"en",cht:"zh-tw"},id:{eng:"ID",cht:"主鍵"},systemMessage:{eng:"System message",cht:"系統確認訊息"},ok:{eng:"OK",cht:"確認"},no:{eng:"No",cht:"取消"},yes:{eng:"Yes",cht:"確定"},y:{eng:"Yes",cht:"是"},n:{eng:"No",cht:"否"},empty:{eng:"Empty",cht:"無"},to:{eng:"To",cht:"至"},at:{eng:"At",cht:"於"},unknow:{eng:"Unknown",cht:"未知"},waitingData:{eng:"Waiting data...",cht:"等待數據中..."},saveChanges:{eng:"Save changes",cht:"儲存變更"},from:{eng:"From",cht:"來源"},save:{eng:"Save",cht:"儲存"},close:{eng:"Close",cht:"關閉"},send:{eng:"Send",cht:"送出"},cancel:{eng:"Cancel",cht:"取消"},processing:{eng:"Processing...",cht:"處理中請稍後..."},anUnexpectedErrorOccurred:{eng:"An unexpected error occurred, please contact the administrator",cht:"發生非預期錯誤,請洽管理員"},getDataError:{eng:"Failed to get data, please try again later",cht:"取得數據失敗,請稍後再試"},timeCreate:{eng:"Created time",cht:"創建時間"},userIdUpdate:{eng:"ID of the updated user",cht:"最新變更使用者主鍵"},timeUpdate:{eng:"Updated time",cht:"最新變更時間"},userId:{eng:"ID of the user",cht:"使用者主鍵"},account:{eng:"Account",cht:"帳號"},password:{eng:"Password",cht:"密碼"},toggleToShowPassword:{eng:"To show password",cht:"變更為顯示密碼模式"},toggleToHidePassword:{eng:"To hide password",cht:"變更為隱藏密碼模式"},username:{eng:"Username",cht:"使用者姓名"},email:{eng:"Email",cht:"電子郵件"},name:{eng:"Name",cht:"名稱"},description:{eng:"Description",cht:"說明"},redir:{eng:"Redirect",cht:"登入後轉至網址"},login:{eng:"Log in",cht:"登入"},logout:{eng:"Log out",cht:"登出"},menuTreeShow:{eng:"Show menu",cht:"顯示選單"},menuTreeHide:{eng:"Hide menu",cht:"隱藏選單"},mmStaInfor:{eng:"Statistics information",cht:"統計資訊"},mmUserInfor:{eng:"User information",cht:"使用者資訊"},mmUsersList:{eng:"Users list",cht:"使用者清單"},mmUsersListMsg:{eng:"Provide a list of users, which can be added, edited, deleted, etc.",cht:"提供目前使用者資料清單,可進行新增、編輯、刪除等作業。"},mmTokensList:{eng:"Tokens list",cht:"金鑰清單"},mmTokensListMsg:{eng:"Provide a list of tokens, which can be deleted, etc.",cht:"提供目前金鑰資料清單,可進行強制登出等作業。"},mmIpsList:{eng:"Ips list",cht:"IP清單"},mmIpsListMsg:{eng:"Provide a list of IPs, which can be blocked, etc.",cht:"提供目前存取IP清單,可進行封鎖等作業。"},failedLoginForNoWebKey:{eng:"Can not get the web key",cht:"無有效站台唯一識別資訊"},failedLoginForNoToken:{eng:"Can not get the token",cht:"無有效金鑰"},failedLoginForNoRedir:{eng:"Can not get the url for redirection",cht:"無有效轉址"},failedLoginForCatch:{eng:"User account or password is incorrect",cht:"使用者帳密錯誤無法登入"},failedLogoutForNoWebKey:{eng:"Can not get the web key",cht:"無有效站台唯一識別資訊"},failedLogoutForCatch:{eng:"Can not logout",cht:"使用者登出失敗"},userStatus:{eng:"Status",cht:"帳號狀態"},isVerified:{eng:"Verified",cht:"帳號是否驗證"},isVerifiedY:{eng:"Verified",cht:"帳號已驗證"},isVerifiedN:{eng:"Not verified",cht:"帳號未驗證"},userTimeVerified:{eng:"Verified time",cht:"帳號驗證狀態與時間"},isVerifiedWaiting:{eng:"Waiting for verification",cht:"等待驗證中"},isExpired:{eng:"Expired",cht:"帳號是否過期"},isExpiredY:{eng:"Expired",cht:"帳號已過期"},isExpiredN:{eng:"Not expired",cht:"帳號未過期"},userTimeExpired:{eng:"Expired time",cht:"帳號過期狀態與時間"},isExpiredDeny:{eng:"Account login prohibited",cht:"禁止帳號登入"},isExpiredNever:{eng:"Never expires",cht:"永不過期"},isBlocked:{eng:"Blocked",cht:"帳號是否被封鎖"},isBlockedY:{eng:"Blocked",cht:"帳號已封鎖"},isBlockedN:{eng:"Not blocked",cht:"帳號未封鎖"},userTimeBlocked:{eng:"Blocked time",cht:"帳號封鎖狀態與時間"},isBlockedNormalStatus:{eng:"Normal status",cht:"狀態正常"},isAdmin:{eng:"Administrator",cht:"是否為系統管理者"},userRole:{eng:"Role",cht:"角色"},userRoleAdmin:{eng:"Administrator",cht:"系統管理者"},userRoleGeneral:{eng:"General",cht:"一般使用者"},isActive:{eng:"Active",cht:"帳號是否有效"},isActiveY:{eng:"Active",cht:"帳號有效"},isActiveMsgY:{eng:"Enabling",cht:"啟用中"},isActiveN:{eng:"Inactive",cht:"帳號無效"},isActiveMsgN:{eng:"Deactivated",cht:"已停用"},errInAccounts:{eng:"Account errors",cht:"帳號出現錯誤待修復"},errItemsByRedir:{eng:"Redirect errors",cht:"登入後轉址出現錯誤待修復"},modeEdit:{eng:"Edit mode",cht:"編輯模式"},showTabCols:{eng:"Show columns",cht:"顯示欄位"},selectDate:{eng:"Select date",cht:"請選擇日期"},userName:{eng:"Name of user",cht:"使用者名稱"},userAccountEmpty:{eng:"Invalid account of user",cht:"尚未給予有效使用者帳號"},userAccountDuplicate:{eng:"Duplicate account of user",cht:"使用者帳號出現重複"},userEmailEmpty:{eng:"Empty email of user",cht:"尚未給予使用者Email"},userEmailError:{eng:"Invalid email of user",cht:"使用者Email格式錯誤"},userEmailDuplicate:{eng:"Duplicate email of user",cht:"使用者Email出現重複"},userRedirEmpty:{eng:"Invalid redirect of user",cht:"尚未給予有效登入後轉址"},userPasswordEmpty:{eng:"Empty password of user",cht:"尚未給予使用者密碼"},userAddEmpty:{eng:"No user",cht:"尚未新增使用者資料"},userAdd:{eng:"Add user",cht:"新增使用者"},userAddNameNew:{eng:"New user",cht:"新使用者"},userAddIdNew:{eng:"Waiting generation",cht:"待自動給予"},userCopy:{eng:"Copy user",cht:"複製使用者"},userCopyNameNew:{eng:"copy",cht:"複製"},userDeleteCheckUsers:{eng:"Delete user(s)",cht:"刪除勾選使用者"},userResetPassword:{eng:"Reset password",cht:"重設密碼"},userSaveUsersFail:{eng:"Failed to save users",cht:"儲存使用者數據失敗"},userSaveUsersSuccess:{eng:"Save users successfully",cht:"儲存使用者數據成功"},userEditNoUserId:{eng:"Can not find the id of user",cht:"無法找到使用者Id"},userEditNoUserData:{eng:"Can not find the data of user",cht:"無法找到使用者數據"},userPassword_keyInvalidPassword:{eng:"Invalid password",cht:"密碼非有效字串"},userPassword_keyLimNumLenMinOrMax:{eng:"The minimum password length is greater than the maximum length",cht:"設定密碼最小長度大於最大長度"},userPassword_keyLimHasSpace:{eng:"Password must not contain whitespace characters",cht:"密碼不可包含空白字元"},userPassword_keyLimNonAsciiChar:{eng:"Password may only contain ASCII printable characters (letters, digits, symbols)",cht:"密碼僅允許使用英文大小寫、數字及特殊符號"},userPassword_keyLimNumLenMin:{eng:"Password length must be at least {minLength} characters",cht:"密碼長度須大於等於{minLength}個字元"},userPassword_keyLimNumLenMax:{eng:"Password length must not exceed {maxLength} characters",cht:"密碼長度須小於等於{maxLength}個字元"},userPassword_keyLimRequireLetter:{eng:"Password must contain at least one letter",cht:"密碼須包含至少一個英文字母"},userPassword_keyLimRequireUppercase:{eng:"Password must contain at least one uppercase letter",cht:"密碼須包含至少一個大寫英文字母"},userPassword_keyLimRequireLowercase:{eng:"Password must contain at least one lowercase letter",cht:"密碼須包含至少一個小寫英文字母"},userPassword_keyLimRequireDigit:{eng:"Password must contain at least one digit",cht:"密碼須包含至少一個數字"},userPassword_keyLimRequireSpecial:{eng:"Password must contain at least one special character",cht:"密碼須包含至少一個特殊符號"},userPassword_keyLimForbiddenChar:{eng:"Password must not contain forbidden characters",cht:"密碼不可包含禁止字元"},userPassword_keyLimCommonPassword:{eng:"This password is too common and not allowed",cht:"此密碼為常見弱密碼,不允許使用"},userPassword_keyLimConsecutiveCharsFromAccount:{eng:"Password must not contain {consecutiveCharsMinMatch} or more consecutive characters from your account name",cht:"密碼不可包含與帳號相同之{consecutiveCharsMinMatch}個以上連續字元"},userChangePassword:{eng:"Change Password",cht:"變更密碼"},userChangePasswordOldPassword:{eng:"Old password",cht:"舊密碼"},userChangePasswordNewPassword:{eng:"New password",cht:"新密碼"},userChangePasswordConfirmPassword:{eng:"Confirm password",cht:"確認新密碼"},userChangePasswordForNoOldPassword:{eng:"Please enter old password",cht:"尚未給予舊密碼"},userChangePasswordForNoNewPassword:{eng:"Please enter new password",cht:"尚未給予新密碼"},userChangePasswordForNoConfirmPassword:{eng:"Please enter confirm password",cht:"尚未給予確認密碼"},userChangePasswordNotSame:{eng:"New password and confirm password do not match",cht:"新密碼與確認密碼不一致"},userChangePasswordSuccess:{eng:"Password change successful, please log in again.",cht:"密碼變更成功,請使用新密碼重新登入。"},userChangePasswordFail:{eng:"Password change failed.",cht:"密碼變更失敗,請確認輸入密碼是否正確"},userChangePasswordIncorrectOld:{eng:"The old password is incorrect.",cht:"舊密碼不正確。"},userChangePasswordForNetError:{eng:"Password validation failed. Please try again later.",cht:"密碼檢測失敗,請稍後再試"},userRegistration:{eng:"Register",cht:"申請帳號"},userRegistrationName:{eng:"Name",cht:"姓名"},userRegistrationEmail:{eng:"Email",cht:"電子郵件"},userRegistrationConfirmPassword:{eng:"Confirm password",cht:"確認密碼"},userRegistrationSubmit:{eng:"Submit",cht:"送出申請"},userRegistrationSuccess:{eng:"Registration successful. Please check your email to verify your account.",cht:"帳號申請成功,請至信箱收取驗證信以啟用帳號。"},userRegistrationNotAllowed:{eng:"User registration is not available.",cht:"目前不開放使用者自行申請帳號。"},userRegistrationAccountInvalid:{eng:"Please enter a valid account.",cht:"請輸入有效的帳號。"},userRegistrationEmailFormatInvalid:{eng:"Please enter a valid email address.",cht:"請輸入有效的電子郵件格式。"},userRegistrationNameInvalid:{eng:"Please enter a valid name.",cht:"請輸入有效的姓名。"},userRegistrationAccountExists:{eng:"This account already exists.",cht:"此帳號已存在。"},userRegistrationEmailExists:{eng:"This email already exists.",cht:"此電子郵件已存在。"},userRegistrationBackToLogin:{eng:"Back to login",cht:"返回登入"},userRegistrationNotVerified:{eng:"Your account has not been verified. Please check your email and click the verification link.",cht:"您的帳號尚未完成 email 驗證,請至信箱點擊驗證連結。"},userRegistrationResendVerify:{eng:"Resend verification email",cht:"重寄驗證信"},userRegistrationResendSuccess:{eng:"Verification email has been resent. Please check your inbox.",cht:"驗證信已重新寄出,請至信箱收取。"},userRegistrationAlreadyVerified:{eng:"This account has already been verified.",cht:"此帳號已完成驗證。"},userRegistrationResendSubmit:{eng:"Send verification email",cht:"寄送驗證信"},userRegistrationResendInvalidEmail:{eng:"The email address does not match the account. Please check and try again.",cht:"電子郵件與帳號不符,請確認後再試。"},userRegistrationResendFailed:{eng:"Failed to send verification email. Please try again later.",cht:"驗證信寄送失敗,請稍後再試。"},userRegistrationResendThrottled:{eng:"A verification email was just sent. Please wait a moment before trying again.",cht:"剛才已寄出驗證信,請稍候片刻再試。"},verifyEmailInvalidToken:{eng:"Invalid or expired verification link.",cht:"驗證連結無效或已失效。"},verifyEmailAlreadyVerified:{eng:"This account has already been verified.",cht:"此帳號已完成驗證。"},userRegistrationVerifySuccess:{eng:"Email verified successfully. Please log in.",cht:"電子郵件驗證成功,請登入。"},loginAccountBlocked:{eng:"Your account has been temporarily locked due to multiple failed login attempts. Please try again later.",cht:"您的帳號因多次登入失敗已被暫時鎖定,請稍後再試。"},loginAccountExpired:{eng:"Your account has expired. Please contact the administrator.",cht:"您的帳號已過期,請聯繫管理員。"},loginUnknownError:{eng:"An unexpected error occurred during login. Please try again later.",cht:"登入時發生未預期的錯誤,請稍後再試。"},tokenExpired:{eng:"Your session has expired. Please log in again.",cht:"登入逾時,請重新登入。"},tokenNoPermission:{eng:"Token does not have permission.",cht:"權杖無存取權限。"},invalidRows:{eng:"Invalid data format.",cht:"資料格式錯誤。"},accountRequired:{eng:"Account is required.",cht:"帳號為必填。"},accountDuplicate:{eng:"Account already exists.",cht:"帳號已存在。"},getStaDataFailed:{eng:"Failed to retrieve statistics data.",cht:"統計資料取得失敗。"},token:{eng:"Token",cht:"金鑰"},isApp:{eng:"For app",cht:"是否為應用系統金鑰"},tokenTimeCreate:{eng:"Created time",cht:"金鑰創建時間"},tokenTimeEnd:{eng:"End time",cht:"金鑰到期時間"},tokenTimeUpdate:{eng:"Updated time",cht:"金鑰更新時間"},tokenDeleteCheckTokens:{eng:"Delete checked token(s)",cht:"刪除勾選金鑰"},tokenSaveTokensFail:{eng:"Failed to save tokens",cht:"儲存金鑰數據失敗"},tokenSaveTokensSuccess:{eng:"Save tokens successfully",cht:"儲存金鑰數據成功"},ip:{eng:"IP",cht:"IP"},ipTimeBlocked:{eng:"Blocked time",cht:"IP封鎖時間"},ipDeleteCheckIps:{eng:"Delete checked IP(s)",cht:"刪除勾選IP"},ipSaveIpsFail:{eng:"Failed to save IPs",cht:"儲存IP數據失敗"},ipSaveIpsSuccess:{eng:"Save IPs successfully",cht:"儲存IP數據成功"},statisticsInformation:{eng:"Statistics Information",cht:"統計資訊"},statisticsInformationDescription:{eng:"Provides an overview of system usage and security metrics.",cht:"提供系統使用情況和安全指標的總覽。"},userGroupInfor:{eng:"User Information",cht:"使用者資訊區"},totalUsers:{eng:"Total Users",cht:"總使用者"},activeUsers:{eng:"Active Users",cht:"活躍使用者"},blockedUsers:{eng:"Blocked Users",cht:"已封鎖使用者"},expiredUsers:{eng:"Expired Users",cht:"已過期使用者"},accessActivityMonitoring:{eng:"Access Activity Monitoring",cht:"存取活動監測"},userLoginFrequency:{eng:"User Login Frequency",cht:"使用者登入頻率"},last7Days:{eng:"Last 7 days",cht:"最近7天"},tokenUsageFrequency:{eng:"Token Usage Frequency",cht:"金鑰使用頻率"},ipConnectionFrequency:{eng:"IP Connection Frequency",cht:"IP 連線頻率"},controlStatus:{eng:"Control Status",cht:"管控狀態"},tokenCharacteristic:{eng:"Token Characteristic",cht:"金鑰狀態"},activeTokens:{eng:"Active Tokens",cht:"有效金鑰數量"},createdLast24h:{eng:"Created in last 24h",cht:"最近24小時內創建"},endingNext24h:{eng:"Ending in next 24h",cht:"未來24小時內到期"},endedTokens:{eng:"Ended Tokens",cht:"已到期金鑰數量"},ipCharacteristic:{eng:"IP Characteristic",cht:"IP狀態"},conn24h:{eng:"Connections in last 24h",cht:"最近24小時內連線數量"},blockedIps:{eng:"Blocked IPs",cht:"當前已封鎖IP數量"},selectItem1hr:{eng:"1 hour",cht:"1小時"},selectItem4hr:{eng:"4 hour",cht:"4小時"},selectItem8hr:{eng:"8 hour",cht:"8小時"},selectItem1day:{eng:"1 day",cht:"1日"},countAttempt:{eng:"Attempt",cht:"嘗試登入"},countSuccess:{eng:"Success",cht:"登入成功"},countError:{eng:"Error",cht:"登入失敗"},count:{eng:"Count",cht:"總次數"},showIndividually:{eng:"Show individually",cht:"個別顯示"},numberOrder:{eng:"No.",cht:"排序"},total:{eng:"Total",cht:"總計"},last1Day:{eng:"Last 1 day",cht:"最近1天"},last8Hour:{eng:"Last 8 hour",cht:"最近8小時"},last4Hour:{eng:"Last 4 hour",cht:"最近4小時"},last1Hour:{eng:"Last 1 hour",cht:"最近1小時"},showMax5:{eng:"Show max 5 rows",cht:"顯示前5筆"},showAll:{eng:"Show all",cht:"顯示全部"},regVerifyEmTitle:{eng:"Please verify your email",cht:"請驗證您的電子郵件"},regVerifyEmContent:{eng:'Dear {name},<br><br>Thank you for registering at {sender}.<br><br>Please click the link below to verify your email and activate your account:<br><a href="{verifyUrl}">{verifyUrl}</a><br><br>If you did not register, please ignore this email.<br><br>This is an automated notification. Please do not reply.',cht:'{name} 您好:<br><br>感謝您註冊「{sender}」。<br><br>請點擊以下連結以驗證您的電子郵件並啟用帳號:<br><a href="{verifyUrl}">{verifyUrl}</a><br><br>若您未曾進行此操作,請忽略此信。<br><br>此為系統自動通知信件,請勿直接回覆。'},chpwEmTitle:{eng:"Password has been changed",cht:"密碼已進行變更"},chpwEmContent:{eng:"Dear User {name},<br><br>This is to inform you that the password for your {sender} account has been successfully changed.<br><br>If you did not perform this action or have any concerns regarding your account security, please contact the system administrator as soon as possible to ensure the safety of your account.<br><br>This is an automated system notification. Please do not reply to this email.",cht:"使用者 {name} 您好:<br><br>您於「{sender}」的密碼已成功變更。<br><br>若您未曾進行此操作,或對帳號安全有任何疑慮,請您儘速聯絡系統管理單位,以確保帳號安全。<br><br>此為系統自動通知信件,請勿直接回覆。"},resetPwEmTitle:{eng:"Your password has been reset",cht:"您的密碼已被重設"},resetPwEmContent:{eng:"Dear {name},<br><br>The administrator has reset the password for your {sender} account.<br><br>Account: {account}<br>New password: <strong>{newPassword}</strong><br><br>Please log in with this password and immediately set your own new password upon login.<br><br>If you did not expect this change, please contact the administrator.<br><br>This is an automated notification.",cht:"使用者 {name} 您好:<br><br>管理員已重設您於「{sender}」的密碼。<br><br>帳號:{account}<br>新密碼:<strong>{newPassword}</strong><br><br>請以此密碼登入後,立即變更為您自己的新密碼。<br><br>若非您預期之操作,請聯繫管理員。<br><br>此為系統自動通知信件。"},adminResetPasswordConfirm:{eng:"Confirm to reset password for {account}?",cht:"確定對 {account} 重設密碼?"},adminResetPasswordSuccess:{eng:"Password reset and new password sent to {email}",cht:"已重設並寄送新密碼至 {email}"},adminResetPasswordCannotResetSelf:{eng:"Cannot reset your own password via this action",cht:"不可對自己重設密碼"},adminResetPasswordForbidden:{eng:"Forbidden: admin permission required",cht:"權限不足:須具管理員身分"},adminResetPasswordUserNotFound:{eng:"User not found",cht:"查無使用者"},adminResetPasswordFailed:{eng:"Failed to reset password",cht:"重設密碼失敗"},adminResetPasswordAlreadyTriggered:{eng:"A password reset was just triggered. Please wait a moment before trying again.",cht:"剛才已觸發重設密碼,請稍候片刻再試。"},userForceChangePwPrompt:{eng:"Your password has been reset by the administrator. Please change it to your own new password.",cht:"您的密碼已由管理員重設,請按確認後變更為您自己的新密碼。"},cannotDemoteSelf:{eng:"Cannot demote yourself from admin",cht:"不可解除自己的管理員權限"},cannotDisableSelf:{eng:"Cannot disable yourself",cht:"不可停用自己的帳號"},cannotDeleteSelf:{eng:"Admin cannot delete yourself",cht:"管理員不得刪除自己"}},tu=(e={})=>{let t=Ie(e,"kpLangExtEmail");Ii(t)||(t={});let i=Ie(e,"kpLangExt");Ii(i)||(i={});let n=Ie(e,"webName");Ii(n)||(n={});let s=Ie(e,"webDescription");Ii(s)||(s={});let o={};o={...o,...eu},Ii(t)&&qn(t,(e,t)=>{o[t]={...Ie(o,t,{}),...e}}),Ii(i)&&(o={...o,...i}),Ii(n)&&(o={...o,webName:{...n}}),Ii(s)&&(o={...o,webDescription:{...s}});let r={};return qn(["eng","cht"],e=>{let t={};qn(o,(i,n)=>{t[n]=i[e]}),r[e]=t}),r};function iu(e,t,i={}){let{srLog:n,minForAccountLoginFailed:s,numForAccountLoginFailed:o,minBlockForAccountLoginFailed:r,minForTokenCallApi:a,numForTokenCallApi:c,minBlockForTokenCallApi:l,minForIpCallApi:u,numForIpCallApi:p,minBlockForIpCallApi:d}=i,m={},h=async e=>{if(!Ii(e))return Promise.reject("invalid u");let t=Ie(e,"timeBlocked","");if(Va(t)){return Tn().format("YYYY-MM-DDTHH:mm:ss.SSSZ")<=t}return""!==t&&Promise.reject(`invalid timeBlocked[${t}]`)},g=async e=>{let i=await t.getGenUserByAccount(e);return await h(i)},f=!1;setInterval(async()=>{if(f)return;f=!0;let e=Tn().add(-s,"minute").format("YYYY-MM-DDTHH:mm:ss.SSSZ");await er(m,async(t,i)=>{let n=t.filter(t=>t>=e);0===dt(n)?delete m[i]:m[i]=n}).finally(()=>{f=!1})},2e3);let w={},y=async e=>Ie(w,e,[]),x=!1;setInterval(async()=>{if(x)return;x=!0;let i=Tn().add(-a,"minute").format("YYYY-MM-DDTHH:mm:ss.SSSZ");await er(w,async(s,o)=>{let r=s.filter(e=>e>=i);w[o]=r,dt(r)>c&&await(async i=>{let s=await t.getTokenByKV("token",i);if("y"===Ie(s,"isApp",""))return void(n&&pn(n.debug)&&n.debug({event:"fun-blockAccountByToken",key:"appTokenSkipRateLimit",token:ec(i)}));let o=Ie(s,"userId","");if(!Li(o))return Promise.reject("invalid userId");let r=await t.getGenUserByUserId(o);if(await h(r))return;let a=Tn().add(l,"minute").format("YYYY-MM-DDTHH:mm:ss.SSSZ");await e.users.save({id:r.id,timeBlocked:a}),await e.tokens.del({id:s.id})})(o).catch(e=>{console.log(e)})}).finally(()=>{x=!1})},2e3);let D={},v=async e=>{if(!Ii(e))return Promise.reject("invalid oip");let t=Ie(e,"timeBlocked","");if(Va(t)){return Tn().format("YYYY-MM-DDTHH:mm:ss.SSSZ")<=t}return""!==t&&Promise.reject(`invalid timeBlocked[${t}]`)},M=async e=>Ie(D,e,[]),C=!1;setInterval(async()=>{if(C)return;C=!0;let i=zt(D),n=await t.getIpsList(),s={};qn(n,e=>{let t=e.ip;s[t]=!0});let o={};qn(i,e=>{o[e]=!0});let r=[];qn(o,(e,t)=>{On(s,t)||r.push(t)});let a=ds(r,e=>Ua.ips.funNew({ip:e}));await e.ips.insert(a).catch(e=>{console.log(e)}).finally(()=>{C=!1})},2e3);let I=!1;setInterval(async()=>{if(I)return;I=!0;let i=Tn().add(-u,"minute").format("YYYY-MM-DDTHH:mm:ss.SSSZ");await er(D,async(n,s)=>{let o=n.filter(e=>e>=i);D[s]=o,dt(o)>p&&await(async i=>{let n=null,s=()=>Tn().add(d,"minute").format("YYYY-MM-DDTHH:mm:ss.SSSZ"),o=null;if(await t.getIpByKV("ip",i).then(e=>{o=e}).catch(e=>{let t="can not find the ip by keyIp[ip]";e===t?o=null:n=t}),null!==n)return Promise.reject(n);if(null===o){let t=s();return o=Ua.ips.funNew({ip:i,timeBlocked:t}),await e.ips.insert(o).catch(e=>{n=e}),null!==n?Promise.reject(n):void 0}if(await v(o))return;let r=s();await e.ips.save({id:o.id,timeBlocked:r})})(s).catch(e=>{console.log(e)})}).catch(e=>{console.log(e)}).finally(()=>{I=!1})},2e3);let b={loginByAccountAndPassword:async(i,n)=>{let a=!1;try{a=await g(i)}catch(e){return Promise.reject("failedLoginForCatch")}if(a)return Promise.reject("failedLoginForCatch");let c=null;return await t.loginByAccountAndPassword(i,n).then(e=>{c={state:"success",msg:e},m[i]=[]}).catch(async n=>{m[i]||(m[i]=[]),m[i].push(Tn().format("YYYY-MM-DDTHH:mm:ss.SSSZ"));let a=Tn().add(-s,"minute").format("YYYY-MM-DDTHH:mm:ss.SSSZ"),l=m[i].filter(e=>e>=a);m[i]=l,dt(l)>o&&await(async i=>{let n=await t.getGenUserByAccount(i);if(await h(n))return;let s=Tn().add(r,"minute").format("YYYY-MM-DDTHH:mm:ss.SSSZ");await e.users.save({id:n.id,timeBlocked:s});let o=await e.tokens.select({userId:n.id});for(let t of o)await e.tokens.del({id:t.id})})(i).catch(e=>{console.log(e)}),c={state:"error",msg:n}}),"success"===c.state?c.msg:Promise.reject(c.msg)},cleanKpAccountLoginFailed:async()=>{m={}},cleanKpIpCallApi:async()=>{D={}},getBlockedByAccount:g,getBlockedByIp:async e=>{let i=null;if(!Li(e))return Promise.reject("invalid ip");let n=null;return await t.getIpByKV("ip",e).then(e=>{n=e}).catch(e=>{let t="can not find the ip by keyIp[ip]";e===t?n=null:i=t}),null!==i?Promise.reject(i):null!==n&&await v(n)},callApiByToken:async e=>{w[e]||(w[e]=[]),w[e].push(Tn().format("YYYY-MM-DDTHH:mm:ss.SSSZ"))},getInforsByTokenCallApi:y,getCountsByTokenCallApi:async e=>dt(await y(e)),getIpByHeaders:e=>{let t=Ie(e,"headers"),i="";if(!Li(i)){let e=Ie(t,"x-forwarded-for","");i=Ie(Ss(e,","),0,""),i=Ts(i)}return Li(i)||e&&e.info&&e.info.remoteAddress&&(i=e.info.remoteAddress,i=Ts(i)),Li(i)||e&&e.socket&&e.socket.remoteAddress&&(i=e.socket.remoteAddress,i=Ts(i)),Li(i)||e&&e.connection&&e.connection.remoteAddress&&(i=e.connection.remoteAddress,i=Ts(i)),Li(i)||(console.log("headers",t),console.log("can not get ip of user")),i},callApiByIp:async e=>{D[e]||(D[e]=[]),D[e].push(Tn().format("YYYY-MM-DDTHH:mm:ss.SSSZ"))},getInforsByIpCallApi:M,getCountsByIpCallApi:async e=>dt(await M(e))};return b}function nu(i,n=1){return function(e,t=1,i={}){let n=1,s=Ie(i,"path"),o=Ie(i,"fs");if(!Dn(e,{fs:o}))throw new Error(`fd[${e}] is not a folder`);return null!==t&&Ri(t)&&(t=Vi(t))<1&&(t=1),function e(i){let r=[];return Dn(i,{fs:o})?(qn(o.readdirSync(i),function(a){let c=s.resolve(i,a),l=null;try{l=o.statSync(c)}catch(e){}l&&l.isDirectory()?(r.push({isFolder:!0,level:n,path:c,name:s.basename(c)}),n+=1,(n<=t||null===t)&&(r=r.concat(e(c))),n-=1):r.push({isFolder:!1,level:n,path:c,name:s.basename(c)})}),r):r}(e)}(i,n,{path:e,fs:t})}let su=new Map,ou=new Map;function ru(e,i,n){let s=nu(e);s=s.filter(e=>!Ie(e,"isFolder",!1)),s=function(e,t,i){let n=t.format(i);return ga(e,e=>{let t=Ie(e,"name","").replace(/\.log$/,"");return!/^\d{4}-\d{2}-\d{2}/.test(t)||t>=n.slice(0,t.length)})}(s,i,n);let o=[];for(let e of s)try{let i=t.statSync(e.path);if(!i.isFile())continue;o.push({path:e.path,name:e.name,size:i.size,mtimeMs:i.mtimeMs})}catch(e){}return o}function au(e){let t=new Map;return i=>{let n=Math.floor(i/6e4),s=t.get(n);return void 0===s&&(s=Tn(6e4*n).format(e),t.set(n,s)),s}}async function cu(e,i,n,s=null){pn(s)||(s=au(n));let o={minTimeMs:null,token:{},ip:{},login:{}};return await function(e,i){return new Promise((n,s)=>{let o=null,r=t.createReadStream(e,{encoding:"utf8"}),a=D.createInterface({input:r,crlfDelay:1/0});a.on("line",i);let c=e=>{o=e,a.close()};r.on("error",c),a.on("error",c),r.on("close",()=>{o?s(o):n()})})}(e,e=>{let t=null;try{t=JSON.parse(e)}catch(e){return}if(null===t||"object"!=typeof t)return;let n=t.event,r=0;if("fun-checkToken"===n?r=1:"verifyConn"===n?r=2:"kpfun-loginByAccountAndPassword-before"===n?r=3:"kpfun-loginByAccountAndPassword-success"===n?r=4:"kpfun-loginByAccountAndPassword-error"===n&&(r=5),0===r)return;let a="number"==typeof(c=t.time)?c:Li(c)?Tn(c).valueOf():NaN;var c;if(Number.isNaN(a))return;if((null===o.minTimeMs||a<o.minTimeMs)&&(o.minTimeMs=a),!(a>i))return;let l=s(a);if(1===r){let e=o.token[l];void 0===e&&(e={count:0,kp:{}},o.token[l]=e),e.count+=1;let i=t.userId;e.kp[i]=(e.kp[i]||0)+1}else if(2===r){let e=o.ip[l];void 0===e&&(e={count:0,kp:{}},o.ip[l]=e),e.count+=1;let i=t.ip;e.kp[i]=(e.kp[i]||0)+1}else{let e=o.login[l];void 0===e&&(e={attempt:0,success:0,error:0},o.login[l]=e),3===r?e.attempt+=1:4===r?e.success+=1:e.error+=1}}),o}async function lu(e,t,i){let n=au(i),s=[];for(let o of e)try{let e=await cu(o.path,t,i,n);s.push({name:o.name,ok:!0,agg:e})}catch(e){s.push({name:o.name,ok:!1,err:String(Ie(e,"message",e))})}return s}function uu(e,t){for(let i in t.token){let n=t.token[i],s=e.token[i];void 0===s&&(s={count:0,kp:{}},e.token[i]=s),s.count+=n.count;for(let e in n.kp)s.kp[e]=(s.kp[e]||0)+n.kp[e]}for(let i in t.ip){let n=t.ip[i],s=e.ip[i];void 0===s&&(s={count:0,kp:{}},e.ip[i]=s),s.count+=n.count;for(let e in n.kp)s.kp[e]=(s.kp[e]||0)+n.kp[e]}for(let i in t.login){let n=t.login[i],s=e.login[i];void 0===s&&(s={attempt:0,success:0,error:0},e.login[i]=s),s.attempt+=n.attempt,s.success+=n.success,s.error+=n.error}return e}async function pu(t,i={}){let n=!1!==Ie(i,"useCache"),s=Ie(i,"scanFiles");pn(s)||(s=lu);let o=Ie(i,"srLog",null),r=ru(t.fdLog,t.tStart,t.fmt),a=function(e){let t=su.get(e);return t||(t=new Map,su.set(e,t)),t}((c=t.fdLog,l=t.fmt,`${e.resolve(c)}|${l}`));var c,l;let u=[],p={};for(let e of r){let i=n?a.get(e.name):void 0;void 0!==i&&i.size===e.size&&i.mtimeMs===e.mtimeMs&&(null===i.minTimeMs||i.minTimeMs>i.scanTStartMs&&i.minTimeMs>t.tStartMs)?p[e.name]=i.agg:u.push(e)}if(n){let e=new Set(r.map(e=>e.name));for(let t of a.keys())e.has(t)||a.delete(t)}let d=[];if(u.length>0){let e=await s(u.map(e=>({path:e.path,name:e.name})),t.tStartMs,t.fmt),i={};for(let t of e)i[t.name]=t;for(let e of u){let s=i[e.name];if(s&&s.ok)p[e.name]=s.agg,n&&a.set(e.name,{size:e.size,mtimeMs:e.mtimeMs,minTimeMs:s.agg.minTimeMs,scanTStartMs:t.tStartMs,agg:s.agg});else{let t=Ie(s,"err","no result");d.push({name:e.name,err:t}),n&&a.delete(e.name),o&&pn(o.warn)&&o.warn({event:"fun-staLogs",key:"staLogsFileSkipped",name:e.name,err:t})}}}let m={token:{},ip:{},login:{}};for(let e of r){let t=p[e.name];t&&uu(m,t)}let h=function(e,t){let i=(e,i,n)=>{let s={};for(let i of t)s[i]=e();for(let e in i)s[e]=n(i[e]);return Object.keys(s).sort().map(e=>({time:e,data:s[e]}))};return{token:i(()=>({count:0}),e.token,e=>({count:e.count,...e.kp})),ip:i(()=>({count:0}),e.ip,e=>({count:e.count,...e.kp})),login:i(()=>({attempt:0,success:0,error:0}),e.login,e=>({attempt:e.attempt,success:e.success,error:e.error}))}}(m,t.kpTime);return h.stat={nFiles:r.length,nScanned:u.length,nCached:r.length-u.length,errors:d},h}function du(t=7,i="hr",n={}){let s=function(e=7,t="hr",i={}){let n=Ie(i,"fdLog");Li(n)||(n="./logs");let s=function(e){return"day"===e?"day":"hr"}(t),o="day"===s?"YYYY-MM-DD":"YYYY-MM-DDTHH",r="day"===s?"day":"hour",a=Ie(i,"timeNow"),c="number"==typeof a?Tn(a):Tn(),l=c.subtract(e,"day"),u=l.valueOf(),p=l.startOf(r),d=c.startOf(r),m=[];for(;!p.isAfter(d);)m.push(p.format(o)),p=p.add(1,r);return{fdLog:n,timeInterval:s,fmt:o,unit:r,tStart:l,tStartMs:u,kpTime:m,timeNow:c.valueOf()}}(t,i,n),o=JSON.stringify([e.resolve(s.fdLog),t,s.timeInterval,Ie(n,"timeNow",null)]);if(ou.has(o))return ou.get(o);let r=pu(s,n).finally(()=>{ou.delete(o)});return ou.set(o,r),r}let mu=r.fileURLToPath("undefined"==typeof document&&"undefined"==typeof location?require("url").pathToFileURL(mu).href:"undefined"==typeof document?location.href:v&&"SCRIPT"===v.tagName.toUpperCase()&&v.src||new URL("w-web-sso.umd.js",document.baseURI).href),hu=e.dirname(mu),gu=e.resolve(hu,"staLogsCore.shellWorker.mjs");async function fu(e,t,i){return 0===e.length?[]:function(e,t=gu){let i=fn(),n=new o.Worker(t),s=!1,r=(e,t)=>{s||(s=!0,e(t));try{n.terminate()}catch(e){}};return n.on("message",e=>{"done"===e.mode?r(i.resolve,e.payload):"error"===e.mode&&r(i.reject,e.payload)}),n.on("error",e=>{r(i.reject,e)}),n.on("exit",e=>{r(i.reject,new Error(`staLogs worker exited without result, code=${e}`))}),n.postMessage(e),i}({files:e,tStartMs:t,fmt:i})}function wu(e=7,t="hr",i={}){return du(e,t,{...i,scanFiles:fu})}function yu(e,t,i={}){let{srLog:n,logFd:s}=i,o=async()=>{let e=await t.getUsersListCache(),i=dt(e),n=0;n=dt(ga(e,e=>Qa(e)));let s=0;s=dt(ga(e,e=>_a(e)));let o=0;o=dt(ga(e,e=>Ra(e)));return{total:i,active:n,blocked:s,expired:o}},r=async()=>{let e=Tn().add(-24,"hour").format("YYYY-MM-DDTHH:mm:ss.SSSZ"),i=Tn().format("YYYY-MM-DDTHH:mm:ss.SSSZ"),n=Tn().add(24,"hour").format("YYYY-MM-DDTHH:mm:ss.SSSZ"),s=await t.getTokensListCache(),o=dt(s),r=0;r=dt(ga(s,t=>t.timeCreate>=e));let a=0;a=dt(ga(s,e=>e.timeEnd>=i&&e.timeEnd<=n));let c=0;c=dt(ga(s,e=>function(e){let t=Ie(e,"timeEnd","");return!!Va(t)&&Tn().format("YYYY-MM-DDTHH:mm:ss.SSSZ")>t}(e)));return{active:o-c,created24h:r,ending24h:a,ended:c}},a=async()=>{let e=Tn().add(-24,"hour").format("YYYY-MM-DDTHH:mm:ss.SSSZ"),i=await t.getIpsListCache(),n=0;{let t=ga(await f(),t=>Tn(t.time,"YYYY-MM-DDTHH").format("YYYY-MM-DDTHH:mm:ss.SSSZ")>=e);o="data.count",n=(s=t)&&s.length?function(e,t){for(var i,n=-1,s=e.length;++n<s;){var o=t(e[n]);void 0!==o&&(i=void 0===i?o:i+o)}return i}(s,vi(o)):0}var s,o;let r=0;r=dt(ga(i,e=>_a(e)));return{conn24h:n,blocked:r}},c=async()=>{let e=await async function(e=7,t="hr",i={}){return(await wu(e,t,i)).login}(7,"hr",{fdLog:s,srLog:n});return e},l=Vl(),u=async()=>await l.getProxy("fun",{fun:c,inputs:null,timeExpired:3e4,timeFrom:"end",useCacheWhenError:!1}).catch(e=>(n&&n.error({event:"fun-getStaUserAccountLogin",key:"getStaDataFailed",err:String(Ie(e,"message",e))}),Promise.reject("getStaDataFailed"))),p=async()=>{let e=await async function(e=7,t="hr",i={}){return(await wu(e,t,i)).token}(7,"hr",{fdLog:s,srLog:n}),i={};qn(e,e=>{qn(e.data,(e,t)=>{if("count"===t)return!0;i[t]=0})});let o=await t.getUsersListCache(),r={count:0};return qn(o,e=>{r[e.id]=e.name}),e=ds(e,e=>{let t=Uo(i);var n,s,o;return qn(e.data,(e,i)=>{t[i]=e}),n=t,o={},s=vi(s=(e,t)=>"count"===t?t:Ie(r,t,t)),Gt(n,function(e,t,i){Rs(o,s(e,t,i),e)}),t=o,{time:e.time,data:{count:e.count,...t}}}),e},d=Vl(),m=async()=>await d.getProxy("fun",{fun:p,inputs:null,timeExpired:3e4,timeFrom:"end",useCacheWhenError:!1}).catch(e=>(n&&n.error({event:"fun-getStaToken",key:"getStaDataFailed",err:String(Ie(e,"message",e))}),Promise.reject("getStaDataFailed"))),h=async()=>{let e=await async function(e=7,t="hr",i={}){return(await wu(e,t,i)).ip}(7,"hr",{fdLog:s,srLog:n}),t={};return qn(e,e=>{qn(e.data,(e,i)=>{if("count"===i)return!0;t[i]=0})}),e=ds(e,e=>{let i=Uo(t);return qn(e.data,(e,t)=>{i[t]=e}),{time:e.time,data:{count:e.count,...i}}}),e},g=Vl(),f=async()=>await g.getProxy("fun",{fun:h,inputs:null,timeExpired:3e4,timeFrom:"end",useCacheWhenError:!1}).catch(e=>(n&&n.error({event:"fun-getStaIp",key:"getStaDataFailed",err:String(Ie(e,"message",e))}),Promise.reject("getStaDataFailed"))),w={getStaUserSummary:o,checkTokenAndGetStaUserSummary:async(e,i={})=>(await t.checkToken(e,i),await o()),getStaTokenSummary:r,checkTokenAndGetStaTokenSummary:async(e,i={})=>(await t.checkToken(e,i),await r()),getStaIpSummary:a,checkTokenAndGetStaIpSummary:async(e,i={})=>(await t.checkToken(e,i),await a()),getStaUserAccountLogin:u,checkTokenAndGetStaUserAccountLogin:async(e,i={})=>(await t.checkToken(e,i),await u()),getStaToken:m,checkTokenAndGetStaToken:async(e,i={})=>(await t.checkToken(e,i),await m()),getStaIp:f,checkTokenAndGetStaIp:async(e,i={})=>(await t.checkToken(e,i),await f())};return w}var xu={exports:{}};!function(e){e.exports=function(){function e(e,t){return e(t={exports:{}},t.exports),t.exports}var t=e(function(e){var t=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=t)}),i=e(function(e){var t=e.exports={version:"2.6.5"};"number"==typeof __e&&(__e=t)});i.version;var n=function(e){return"object"==typeof e?null!==e:"function"==typeof e},s=function(e){if(!n(e))throw TypeError(e+" is not an object!");return e},o=function(e){try{return!!e()}catch(e){return!0}},r=!o(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),a=t.document,c=n(a)&&n(a.createElement),l=function(e){return c?a.createElement(e):{}},u=!r&&!o(function(){return 7!=Object.defineProperty(l("div"),"a",{get:function(){return 7}}).a}),p=function(e,t){if(!n(e))return e;var i,s;if(t&&"function"==typeof(i=e.toString)&&!n(s=i.call(e)))return s;if("function"==typeof(i=e.valueOf)&&!n(s=i.call(e)))return s;if(!t&&"function"==typeof(i=e.toString)&&!n(s=i.call(e)))return s;throw TypeError("Can't convert object to primitive value")},d=Object.defineProperty,m={f:r?Object.defineProperty:function(e,t,i){if(s(e),t=p(t,!0),s(i),u)try{return d(e,t,i)}catch(e){}if("get"in i||"set"in i)throw TypeError("Accessors not supported!");return"value"in i&&(e[t]=i.value),e}},h=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},g=r?function(e,t,i){return m.f(e,t,h(1,i))}:function(e,t,i){return e[t]=i,e},f={}.hasOwnProperty,w=function(e,t){return f.call(e,t)},y=0,x=Math.random(),D=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++y+x).toString(36))},v=e(function(e){var n="__core-js_shared__",s=t[n]||(t[n]={});(e.exports=function(e,t){return s[e]||(s[e]=void 0!==t?t:{})})("versions",[]).push({version:i.version,mode:"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})}),M=v("native-function-to-string",Function.toString),C=e(function(e){var n=D("src"),s="toString",o=(""+M).split(s);i.inspectSource=function(e){return M.call(e)},(e.exports=function(e,i,s,r){var a="function"==typeof s;a&&(w(s,"name")||g(s,"name",i)),e[i]!==s&&(a&&(w(s,n)||g(s,n,e[i]?""+e[i]:o.join(String(i)))),e===t?e[i]=s:r?e[i]?e[i]=s:g(e,i,s):(delete e[i],g(e,i,s)))})(Function.prototype,s,function(){return"function"==typeof this&&this[n]||M.call(this)})}),I=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e},b=function(e,t,i){if(I(e),void 0===t)return e;switch(i){case 1:return function(i){return e.call(t,i)};case 2:return function(i,n){return e.call(t,i,n)};case 3:return function(i,n,s){return e.call(t,i,n,s)}}return function(){return e.apply(t,arguments)}},L="prototype",A=function(e,n,s){var o,r,a,c,l=e&A.F,u=e&A.G,p=e&A.S,d=e&A.P,m=e&A.B,h=u?t:p?t[n]||(t[n]={}):(t[n]||{})[L],f=u?i:i[n]||(i[n]={}),w=f[L]||(f[L]={});for(o in u&&(s=n),s)a=((r=!l&&h&&void 0!==h[o])?h:s)[o],c=m&&r?b(a,t):d&&"function"==typeof a?b(Function.call,a):a,h&&C(h,o,a,e&A.U),f[o]!=a&&g(f,o,c),d&&w[o]!=a&&(w[o]=a)};t.core=i,A.F=1,A.G=2,A.S=4,A.P=8,A.B=16,A.W=32,A.U=64,A.R=128;var E,T=A,S=Math.ceil,N=Math.floor,k=function(e){return isNaN(e=+e)?0:(e>0?N:S)(e)},j=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},Z=(E=!1,function(e,t){var i,n,s=String(j(e)),o=k(t),r=s.length;return o<0||o>=r?E?"":void 0:(i=s.charCodeAt(o))<55296||i>56319||o+1===r||(n=s.charCodeAt(o+1))<56320||n>57343?E?s.charAt(o):i:E?s.slice(o,o+2):n-56320+(i-55296<<10)+65536});T(T.P,"String",{codePointAt:function(e){return Z(this,e)}}),i.String.codePointAt;var X=Math.max,Y=Math.min,F=function(e,t){return(e=k(e))<0?X(e+t,0):Y(e,t)},z=String.fromCharCode,G=String.fromCodePoint;T(T.S+T.F*(!!G&&1!=G.length),"String",{fromCodePoint:function(e){for(var t,i=arguments,n=[],s=arguments.length,o=0;s>o;){if(t=+i[o++],F(t,1114111)!==t)throw RangeError(t+" is not a valid code point");n.push(t<65536?z(t):z(55296+((t-=65536)>>10),t%1024+56320))}return n.join("")}}),i.String.fromCodePoint;var H,K,P,U,B,W,V,R,_,Q,O,J,q,$,ee={Space_Separator:/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,ID_Start:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,ID_Continue:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/},te={isSpaceSeparator:function(e){return"string"==typeof e&&ee.Space_Separator.test(e)},isIdStartChar:function(e){return"string"==typeof e&&(e>="a"&&e<="z"||e>="A"&&e<="Z"||"$"===e||"_"===e||ee.ID_Start.test(e))},isIdContinueChar:function(e){return"string"==typeof e&&(e>="a"&&e<="z"||e>="A"&&e<="Z"||e>="0"&&e<="9"||"$"===e||"_"===e||"‌"===e||"‍"===e||ee.ID_Continue.test(e))},isDigit:function(e){return"string"==typeof e&&/[0-9]/.test(e)},isHexDigit:function(e){return"string"==typeof e&&/[0-9A-Fa-f]/.test(e)}},ie=function(e,t){H=String(e),K="start",P=[],U=0,B=1,W=0,V=void 0,R=void 0,_=void 0;do{V=se(),me[K]()}while("eof"!==V.type);return"function"==typeof t?ne({"":_},"",t):_};function ne(e,t,i){var n=e[t];if(null!=n&&"object"==typeof n)if(Array.isArray(n))for(var s=0;s<n.length;s++){var o=String(s),r=ne(n,o,i);void 0===r?delete n[o]:Object.defineProperty(n,o,{value:r,writable:!0,enumerable:!0,configurable:!0})}else for(var a in n){var c=ne(n,a,i);void 0===c?delete n[a]:Object.defineProperty(n,a,{value:c,writable:!0,enumerable:!0,configurable:!0})}return i.call(e,t,n)}function se(){for(Q="default",O="",J=!1,q=1;;){$=oe();var e=ae[Q]();if(e)return e}}function oe(){if(H[U])return String.fromCodePoint(H.codePointAt(U))}function re(){var e=oe();return"\n"===e?(B++,W=0):e?W+=e.length:W++,e&&(U+=e.length),e}var ae={default:function(){switch($){case"\t":case"\v":case"\f":case" ":case" ":case"\ufeff":case"\n":case"\r":case"\u2028":case"\u2029":return void re();case"/":return re(),void(Q="comment");case void 0:return re(),ce("eof")}if(!te.isSpaceSeparator($))return ae[K]();re()},comment:function(){switch($){case"*":return re(),void(Q="multiLineComment");case"/":return re(),void(Q="singleLineComment")}throw fe(re())},multiLineComment:function(){switch($){case"*":return re(),void(Q="multiLineCommentAsterisk");case void 0:throw fe(re())}re()},multiLineCommentAsterisk:function(){switch($){case"*":return void re();case"/":return re(),void(Q="default");case void 0:throw fe(re())}re(),Q="multiLineComment"},singleLineComment:function(){switch($){case"\n":case"\r":case"\u2028":case"\u2029":return re(),void(Q="default");case void 0:return re(),ce("eof")}re()},value:function(){switch($){case"{":case"[":return ce("punctuator",re());case"n":return re(),le("ull"),ce("null",null);case"t":return re(),le("rue"),ce("boolean",!0);case"f":return re(),le("alse"),ce("boolean",!1);case"-":case"+":return"-"===re()&&(q=-1),void(Q="sign");case".":return O=re(),void(Q="decimalPointLeading");case"0":return O=re(),void(Q="zero");case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return O=re(),void(Q="decimalInteger");case"I":return re(),le("nfinity"),ce("numeric",1/0);case"N":return re(),le("aN"),ce("numeric",NaN);case'"':case"'":return J='"'===re(),O="",void(Q="string")}throw fe(re())},identifierNameStartEscape:function(){if("u"!==$)throw fe(re());re();var e=de();switch(e){case"$":case"_":break;default:if(!te.isIdStartChar(e))throw ye()}O+=e,Q="identifierName"},identifierName:function(){switch($){case"$":case"_":case"‌":case"‍":return void(O+=re());case"\\":return re(),void(Q="identifierNameEscape")}if(!te.isIdContinueChar($))return ce("identifier",O);O+=re()},identifierNameEscape:function(){if("u"!==$)throw fe(re());re();var e=de();switch(e){case"$":case"_":case"‌":case"‍":break;default:if(!te.isIdContinueChar(e))throw ye()}O+=e,Q="identifierName"},sign:function(){switch($){case".":return O=re(),void(Q="decimalPointLeading");case"0":return O=re(),void(Q="zero");case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return O=re(),void(Q="decimalInteger");case"I":return re(),le("nfinity"),ce("numeric",q*(1/0));case"N":return re(),le("aN"),ce("numeric",NaN)}throw fe(re())},zero:function(){switch($){case".":return O+=re(),void(Q="decimalPoint");case"e":case"E":return O+=re(),void(Q="decimalExponent");case"x":case"X":return O+=re(),void(Q="hexadecimal")}return ce("numeric",0*q)},decimalInteger:function(){switch($){case".":return O+=re(),void(Q="decimalPoint");case"e":case"E":return O+=re(),void(Q="decimalExponent")}if(!te.isDigit($))return ce("numeric",q*Number(O));O+=re()},decimalPointLeading:function(){if(te.isDigit($))return O+=re(),void(Q="decimalFraction");throw fe(re())},decimalPoint:function(){switch($){case"e":case"E":return O+=re(),void(Q="decimalExponent")}return te.isDigit($)?(O+=re(),void(Q="decimalFraction")):ce("numeric",q*Number(O))},decimalFraction:function(){switch($){case"e":case"E":return O+=re(),void(Q="decimalExponent")}if(!te.isDigit($))return ce("numeric",q*Number(O));O+=re()},decimalExponent:function(){switch($){case"+":case"-":return O+=re(),void(Q="decimalExponentSign")}if(te.isDigit($))return O+=re(),void(Q="decimalExponentInteger");throw fe(re())},decimalExponentSign:function(){if(te.isDigit($))return O+=re(),void(Q="decimalExponentInteger");throw fe(re())},decimalExponentInteger:function(){if(!te.isDigit($))return ce("numeric",q*Number(O));O+=re()},hexadecimal:function(){if(te.isHexDigit($))return O+=re(),void(Q="hexadecimalInteger");throw fe(re())},hexadecimalInteger:function(){if(!te.isHexDigit($))return ce("numeric",q*Number(O));O+=re()},string:function(){switch($){case"\\":return re(),void(O+=ue());case'"':return J?(re(),ce("string",O)):void(O+=re());case"'":return J?void(O+=re()):(re(),ce("string",O));case"\n":case"\r":throw fe(re());case"\u2028":case"\u2029":xe($);break;case void 0:throw fe(re())}O+=re()},start:function(){switch($){case"{":case"[":return ce("punctuator",re())}Q="value"},beforePropertyName:function(){switch($){case"$":case"_":return O=re(),void(Q="identifierName");case"\\":return re(),void(Q="identifierNameStartEscape");case"}":return ce("punctuator",re());case'"':case"'":return J='"'===re(),void(Q="string")}if(te.isIdStartChar($))return O+=re(),void(Q="identifierName");throw fe(re())},afterPropertyName:function(){if(":"===$)return ce("punctuator",re());throw fe(re())},beforePropertyValue:function(){Q="value"},afterPropertyValue:function(){switch($){case",":case"}":return ce("punctuator",re())}throw fe(re())},beforeArrayValue:function(){if("]"===$)return ce("punctuator",re());Q="value"},afterArrayValue:function(){switch($){case",":case"]":return ce("punctuator",re())}throw fe(re())},end:function(){throw fe(re())}};function ce(e,t){return{type:e,value:t,line:B,column:W}}function le(e){for(var t=0,i=e;t<i.length;t+=1){var n=i[t];if(oe()!==n)throw fe(re());re()}}function ue(){switch(oe()){case"b":return re(),"\b";case"f":return re(),"\f";case"n":return re(),"\n";case"r":return re(),"\r";case"t":return re(),"\t";case"v":return re(),"\v";case"0":if(re(),te.isDigit(oe()))throw fe(re());return"\0";case"x":return re(),pe();case"u":return re(),de();case"\n":case"\u2028":case"\u2029":return re(),"";case"\r":return re(),"\n"===oe()&&re(),"";case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case void 0:throw fe(re())}return re()}function pe(){var e="",t=oe();if(!te.isHexDigit(t))throw fe(re());if(e+=re(),t=oe(),!te.isHexDigit(t))throw fe(re());return e+=re(),String.fromCodePoint(parseInt(e,16))}function de(){for(var e="",t=4;t-- >0;){var i=oe();if(!te.isHexDigit(i))throw fe(re());e+=re()}return String.fromCodePoint(parseInt(e,16))}var me={start:function(){if("eof"===V.type)throw we();he()},beforePropertyName:function(){switch(V.type){case"identifier":case"string":return R=V.value,void(K="afterPropertyName");case"punctuator":return void ge();case"eof":throw we()}},afterPropertyName:function(){if("eof"===V.type)throw we();K="beforePropertyValue"},beforePropertyValue:function(){if("eof"===V.type)throw we();he()},beforeArrayValue:function(){if("eof"===V.type)throw we();"punctuator"!==V.type||"]"!==V.value?he():ge()},afterPropertyValue:function(){if("eof"===V.type)throw we();switch(V.value){case",":return void(K="beforePropertyName");case"}":ge()}},afterArrayValue:function(){if("eof"===V.type)throw we();switch(V.value){case",":return void(K="beforeArrayValue");case"]":ge()}},end:function(){}};function he(){var e;switch(V.type){case"punctuator":switch(V.value){case"{":e={};break;case"[":e=[]}break;case"null":case"boolean":case"numeric":case"string":e=V.value}if(void 0===_)_=e;else{var t=P[P.length-1];Array.isArray(t)?t.push(e):Object.defineProperty(t,R,{value:e,writable:!0,enumerable:!0,configurable:!0})}if(null!==e&&"object"==typeof e)P.push(e),K=Array.isArray(e)?"beforeArrayValue":"beforePropertyName";else{var i=P[P.length-1];K=null==i?"end":Array.isArray(i)?"afterArrayValue":"afterPropertyValue"}}function ge(){P.pop();var e=P[P.length-1];K=null==e?"end":Array.isArray(e)?"afterArrayValue":"afterPropertyValue"}function fe(e){return ve(void 0===e?"JSON5: invalid end of input at "+B+":"+W:"JSON5: invalid character '"+De(e)+"' at "+B+":"+W)}function we(){return ve("JSON5: invalid end of input at "+B+":"+W)}function ye(){return ve("JSON5: invalid identifier character at "+B+":"+(W-=5))}function xe(e){console.warn("JSON5: '"+De(e)+"' in strings is not valid ECMAScript; consider escaping")}function De(e){var t={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(t[e])return t[e];if(e<" "){var i=e.charCodeAt(0).toString(16);return"\\x"+("00"+i).substring(i.length)}return e}function ve(e){var t=new SyntaxError(e);return t.lineNumber=B,t.columnNumber=W,t}var Me=function(e,t,i){var n,s,o,r=[],a="",c="";if(null==t||"object"!=typeof t||Array.isArray(t)||(i=t.space,o=t.quote,t=t.replacer),"function"==typeof t)s=t;else if(Array.isArray(t)){n=[];for(var l=0,u=t;l<u.length;l+=1){var p=u[l],d=void 0;"string"==typeof p?d=p:("number"==typeof p||p instanceof String||p instanceof Number)&&(d=String(p)),void 0!==d&&n.indexOf(d)<0&&n.push(d)}}return i instanceof Number?i=Number(i):i instanceof String&&(i=String(i)),"number"==typeof i?i>0&&(i=Math.min(10,Math.floor(i)),c=" ".substr(0,i)):"string"==typeof i&&(c=i.substr(0,10)),m("",{"":e});function m(e,t){var i=t[e];switch(null!=i&&("function"==typeof i.toJSON5?i=i.toJSON5(e):"function"==typeof i.toJSON&&(i=i.toJSON(e))),s&&(i=s.call(t,e,i)),i instanceof Number?i=Number(i):i instanceof String?i=String(i):i instanceof Boolean&&(i=i.valueOf()),i){case null:return"null";case!0:return"true";case!1:return"false"}return"string"==typeof i?h(i):"number"==typeof i?String(i):"object"==typeof i?Array.isArray(i)?w(i):g(i):void 0}function h(e){for(var t={"'":.1,'"':.2},i={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"},n="",s=0;s<e.length;s++){var r=e[s];switch(r){case"'":case'"':t[r]++,n+=r;continue;case"\0":if(te.isDigit(e[s+1])){n+="\\x00";continue}}if(i[r])n+=i[r];else if(r<" "){var a=r.charCodeAt(0).toString(16);n+="\\x"+("00"+a).substring(a.length)}else n+=r}var c=o||Object.keys(t).reduce(function(e,i){return t[e]<t[i]?e:i});return c+(n=n.replace(new RegExp(c,"g"),i[c]))+c}function g(e){if(r.indexOf(e)>=0)throw TypeError("Converting circular structure to JSON5");r.push(e);var t=a;a+=c;for(var i,s,o=[],l=0,u=n||Object.keys(e);l<u.length;l+=1){var p=u[l],d=m(p,e);if(void 0!==d){var h=f(p)+":";""!==c&&(h+=" "),h+=d,o.push(h)}}if(0===o.length)i="{}";else if(""===c)i="{"+(s=o.join(","))+"}";else{var g=",\n"+a;s=o.join(g),i="{\n"+a+s+",\n"+t+"}"}return r.pop(),a=t,i}function f(e){if(0===e.length)return h(e);var t=String.fromCodePoint(e.codePointAt(0));if(!te.isIdStartChar(t))return h(e);for(var i=t.length;i<e.length;i++)if(!te.isIdContinueChar(String.fromCodePoint(e.codePointAt(i))))return h(e);return e}function w(e){if(r.indexOf(e)>=0)throw TypeError("Converting circular structure to JSON5");r.push(e);var t=a;a+=c;for(var i,n=[],s=0;s<e.length;s++){var o=m(String(s),e);n.push(void 0!==o?o:"null")}if(0===n.length)i="[]";else if(""===c)i="["+n.join(",")+"]";else{var l=",\n"+a,u=n.join(l);i="[\n"+a+u+",\n"+t+"]"}return r.pop(),a=t,i}},Ce={parse:ie,stringify:Me},Ie=Ce,be=Ie;return be}()}(xu);var Du=Ln(xu.exports);let vu=e.resolve(),Mu=e.resolve(vu,"settings.json"),Cu=e=>{Mu=e},Iu=()=>{let e=t.readFileSync(Mu,"utf8");return Du.parse(e)},bu={minLength:8,maxLength:16,requireLetter:!0,requireUppercase:!1,requireLowercase:!1,requireDigit:!0,requireSpecial:!0,noSpace:!0,onlyAscii:!0,forbiddenChars:["\\"],noConsecutiveCharsFromAccount:!0,consecutiveCharsMinMatch:2,commonPasswordBlacklist:["1234","12345","123456","1234567","12345678","123456789","1234567890","12345678910","111111","000000","666666","888888","7777777","11111111","123123","123321","654321","987654321","qwerty","qwerty123","qwerty1","qwertyuiop","qazwsx","1q2w3e4r","1q2w3e4r5t","1q2w3e","1qaz2wsx","zxcvbnm","password","password1","passw0rd","admin","admin123","welcome","letmein","login","master","monkey","dragon","shadow","sunshine","superman","batman","football","baseball","soccer","hockey","michael","jordan","jennifer","hunter","ranger","harley","thomas","charlie","andrew","daniel","ashley","bailey","mustang","access","secret","ninja","jesus","hello","freedom","trustno1","1qaz@WSX","P@ssw0rd","Pass@123","Aa123456","Aa@123456","Admin@123","abc@123","abc123","abcdef","abcd1234","abc","iloveyou","fuckyou","f*ckyou","whatever","nothing","google","computer","internet","samsung","apple","killer","princess","lovely","tigger","starwars","pokemon","minecraft","123qwe","zaq1zaq1","photoshop","adobe123","18atcskd2w","mynoob"]};return function(i,n,s,o,r={}){let a=null;if(!pn(i))throw console.log("invalid WOrm",i),new Error("invalid WOrm");if(!Li(n))throw console.log("invalid url",n),new Error("invalid url");if(!Li(s))throw console.log("invalid db",s),new Error("invalid db");Cn(o)||(o="./settings.json"),Cu(o);let c=Iu();Ii(r)&&(c={...c,...r});let l=Ie(c,"serverPort");Ri(l)||(l=11007),l=Vi(l);let u=$a(c),p=(e,t)=>{console.log(`[${e.toUpperCase()}] ${t}`),u[e]({event:"boot",msg:t})},d=Ie(c,"useCheckUser",!1),m=Ie(c,"getUserById",null),h=Ie(c,"useExcludeWhenNotAdmin",!1),g=Ie(c,"webName",{}),f=Ie(c,"webDescription",{}),w=Ie(c,"webLogo",""),y=Ie(c,"webBackgoundGradientColors",[]);qi(y)||(y=["#FFE0B2","#FFCC80","#FFF59D","#F2D6A2","#F0CC88"]);let x=Ie(c,"webKey",""),D=Ie(c,"salt","");if(Li(process.env.SALT)&&(D=process.env.SALT),!Li(D)||"{salt}"===D){if(!Li(process.env.ALLOW_PLACEHOLDER_SALT))throw new Error("SALT pepper 未設定: 請以環境變數 SALT 注入真實高熵 pepper 後再啟動 (測試/開發可設 ALLOW_PLACEHOLDER_SALT=1 沿用佔位符)");p("warn","SALT pepper 為佔位符/空值, 因 ALLOW_PLACEHOLDER_SALT 啟用而放行 — 切勿用於生產環境")}let v=Ie(c,"minExpired","");en(v)||(v=30);let C=Ie(c,"minForAccountLoginFailed","");en(C)||(C=10);let I=Ie(c,"numForAccountLoginFailed","");en(I)||(I=3);let b=Ie(c,"minBlockForAccountLoginFailed","");en(b)||(b=30);let L=Ie(c,"minForTokenCallApi","");en(L)||(L=10);let A=Ie(c,"numForTokenCallApi","");en(A)||(A=1e3);let E=Ie(c,"minBlockForTokenCallApi","");en(E)||(E=30);let T=Ie(c,"minForIpCallApi","");en(T)||(T=10);let S=Ie(c,"numForIpCallApi","");en(S)||(S=1e4);let N=Ie(c,"minBlockForIpCallApi","");en(N)||(N=30);let k=Ie(c,"cleanKpIpCallApiForIps",[]);qi(k)||(k=["127.0.0.1","::1","::ffff:127.0.0.1"]);let j=Ie(c,"cleanKpIpCallApiForToken",""),Z=Ie(c,"cleanKpAccountLoginFailedForIps",[]);qi(Z)||(Z=["127.0.0.1","::1","::ffff:127.0.0.1"]);let X=Ie(c,"cleanKpAccountLoginFailedForToken",""),Y=!0===Ie(c,"allowUserRegistration",!1),F=Ie(c,"siteUrl","");Li(F)||(F="");let z=Ie(c,"passwordPolicy");Ii(z)?z={...bu,...z}:(z=bu,p("info","settings 未提供 passwordPolicy, 採用程式內建預設密碼政策"));let G=Ie(z,"minLength");if(!Ri(G)||Vi(G)<1)throw new Error("invalid passwordPolicy.minLength: must be a positive integer >= 1");let H=Ie(z,"maxLength");if(!Ri(H)||Vi(H)<Vi(G))throw new Error("invalid passwordPolicy.maxLength: must be a positive integer >= minLength");if(!$i(Ie(z,"requireLetter")))throw new Error("invalid passwordPolicy.requireLetter: must be a boolean");if(!$i(Ie(z,"requireUppercase")))throw new Error("invalid passwordPolicy.requireUppercase: must be a boolean");if(!$i(Ie(z,"requireLowercase")))throw new Error("invalid passwordPolicy.requireLowercase: must be a boolean");if(!$i(Ie(z,"requireDigit")))throw new Error("invalid passwordPolicy.requireDigit: must be a boolean");if(!$i(Ie(z,"requireSpecial")))throw new Error("invalid passwordPolicy.requireSpecial: must be a boolean");if(!$i(Ie(z,"noSpace")))throw new Error("invalid passwordPolicy.noSpace: must be a boolean");if(!$i(Ie(z,"onlyAscii")))throw new Error("invalid passwordPolicy.onlyAscii: must be a boolean");let K=Ie(z,"forbiddenChars");if(!_i(K))throw new Error("invalid passwordPolicy.forbiddenChars: must be an array");for(let e=0;e<dt(K);e++)if(!bi(K[e])||1!==dt(K[e]))throw new Error(`invalid passwordPolicy.forbiddenChars[${e}]: each element must be a single character string`);let P=Ie(z,"noConsecutiveCharsFromAccount");if(!$i(P))throw new Error("invalid passwordPolicy.noConsecutiveCharsFromAccount: must be a boolean");if(P){let e=Ie(z,"consecutiveCharsMinMatch");if(!Ri(e)||Vi(e)<2)throw new Error("invalid passwordPolicy.consecutiveCharsMinMatch: must be a positive integer >= 2")}let U=Ie(z,"commonPasswordBlacklist");if(!_i(U))throw new Error("invalid passwordPolicy.commonPasswordBlacklist: must be an array");if(!function(e,t,i){var n=M(e)?mt:Pt;return i&&Mi(e,t,i)&&(t=void 0),n(e,vi(t))}(U,e=>bi(e)))throw new Error("invalid passwordPolicy.commonPasswordBlacklist: each element must be a string");let B=Ie(c,"userLogo",""),W=Ie(c,"subfolder","");Li(W)&&("/"===hn(W,1)&&(W=gn(W,1)),"/"!==mn(W,1)&&(W=`/${W}`));let V=Ie(c,"showLanguage","n"),R=Ie(c,"language","eng"),_=Ie(c,"showModeEditUsers","n"),Q=Ie(c,"modeEditUsers","n"),O=Ie(c,"showModeEditTokens","n"),J=Ie(c,"modeEditTokens","n"),q=Ie(c,"showModeEditIps","n"),$=Ie(c,"modeEditIps","n");Ie(c,"mappingBy","");let ee=Ie(c,"kpLangExt",{}),te=(e=>{let t=Ie(e,"emSrcEmail","");if(!Li(t))throw new Error(`invalid srcEmail[${t}]`);let i=Ie(e,"emSrcPW","");if(!Li(i))throw new Error(`invalid srcPW[${i}]`);let n=Ie(e,"emSrcHost","");if(!Li(n))throw new Error(`invalid srcHost[${n}]`);let s=Ie(e,"emSrcPort","");if(!Ri(s))throw new Error(`invalid srcPort[${s}]`);return{send:async(e,o,r,a)=>{if(!Li(e))return Promise.reject(`invalid srcName[${e}]`);if(!Li(o))return Promise.reject(`invalid emTitle[${o}]`);if(!Li(r))return Promise.reject(`invalid emContent[${r}]`);if(Li(a)&&(a=[a]),!qi(a))return Promise.reject(`invalid toEmails[${a}]`);let c={srcName:e,srcEmail:t,srcPW:i,srcHost:n,srcPort:s,emTitle:o,emContent:r,toEmails:a};return await new Pl(c)}}})(c),ie=(i,n="")=>{if(!Li(i))return i;let s=e.resolve(i);return Cn(s)?t.readFileSync(s,"utf8"):((/^(\.{1,2}[\\/]|[\\/]|[A-Za-z]:[\\/])/.test(i)||/\.(html|txt)$/i.test(i))&&p("warn",`settings.${n} 疑似檔案路徑但檔案不存在(${s}), 將原樣視為文字`),i)},ne={},se=["chpwEmTitle","chpwEmContent","regVerifyEmTitle","regVerifyEmContent","resetPwEmTitle","resetPwEmContent"];se.forEach(e=>{let t=(e=>{let t=Ie(c,e);if(!Ii(t))return{};let i={};return Object.keys(t).forEach(n=>{i[n]=ie(t[n],`${e}.${n}`)}),i})(e);dt(t)>0&&(ne[e]=t)});let oe=tu({kpLangExtEmail:ne,kpLangExt:ee,webName:g,webDescription:f}),re={};Object.keys(oe).forEach(e=>{let t={...oe[e]};se.forEach(e=>{delete t[e]}),re[e]=t});let ae={useCheckUser:d,getUserById:m,useExcludeWhenNotAdmin:h},ce={};try{ce=Ea(Ua,i,n,s,ae)}catch(e){throw console.log("WServOrm init failed",e),e}let{woItems:le,procOrm:ue}=ce,pe=Ie(c,"verifyBaseUrl","");Li(pe)||(pe=`http://localhost:${l}`,Y&&p("warn",`settings 未提供 verifyBaseUrl, 註冊驗證信連結將採 ${pe}, 非本機部署時收信人將無法完成驗證, 請於 settings 提供對外可連之後端 base URL`));let de="./server/template",me="./node_modules/w-web-sso/server/template";vn(me)&&(de=me);let he=Ie(c,"pathTemplate","");Li(he)&&vn(he)||(Li(he)&&p("warn",`settings.pathTemplate 指定之資料夾不存在(${he}), 改採套件內建模板`),he=de);let ge=ie(Ie(c,"verifyEmailResultContent",""),"verifyEmailResultContent");if(!Li(ge)){let i=e.resolve(he,"verifyEmailResult.html");Cn(i)||(i=e.resolve(de,"verifyEmailResult.html")),ge=t.readFileSync(i,"utf8")}let fe=$l(le,ue,{srLog:u,srEmail:te,salt:D,minExpired:v,kpLang:oe,passwordPolicy:z,allowUserRegistration:Y,siteUrl:F,verifyBaseUrl:pe}),we=iu(le,fe,{srLog:u,minForAccountLoginFailed:C,numForAccountLoginFailed:I,minBlockForAccountLoginFailed:b,minForTokenCallApi:L,numForTokenCallApi:A,minBlockForTokenCallApi:E,minForIpCallApi:T,numForIpCallApi:S,minBlockForIpCallApi:N}),ye=Ie(c,"logFd",""),xe=yu(0,fe,{srLog:u,logFd:ye}),De=(...e)=>e.every(e=>Li(e)),ve=(e,t)=>Oa(t),Me="dist",Ce="./node_modules/w-web-sso/dist";vn(Ce)&&(Me=Ce);let be="index.html";try{let i=e.resolve(Me,"index.tmp");if(Cn(i)||(i=e.resolve(Me,be)),!Cn(i))throw console.log("fpEntryIn",i),new Error("invalid fpEntryIn");let n=e.resolve(Me,be),s=t.readFileSync(i,"utf8");s=In(s,"/msso/","{sfd}/"),s=In(s,"{sfd}",W),s=In(s,"{language}",R),t.writeFileSync(n,s,"utf8")}catch(e){console.log(e),console.log(`can not generate ${be}`)}let Le=[{method:"GET",path:"/api/cleanKpIpCallApi",handler:async function(e,t){let i=await yn(async function(){let t=Ie(e,"query.token","");if(!Li(j))return Promise.reject("invalid cleanKpIpCallApiForToken");if(t!==j)return Promise.reject("cleanKpIpCallApi invalid token");let i=Ie(e,"info.remoteAddress","");return Li(i)||(i=Ie(e,"socket.remoteAddress","")),Li(i)||(i=Ie(e,"connection.remoteAddress","")),k.includes(i)?(u.info({event:"api/cleanKpIpCallApi",realIp:i}),await we.cleanKpIpCallApi(),!0):Promise.reject(`cleanKpIpCallApi only allowed from cleanKpIpCallApiForIps, got realIp[${i}]`)})();return un(i.msg)&&(i.msg=i.msg.message),"error"===i.state&&u.error({event:"api-error",key:i.msg}),i}},{method:"GET",path:"/api/cleanKpAccountLoginFailed",handler:async function(e,t){let i=await yn(async function(){let t=Ie(e,"query.token","");if(!Li(X))return Promise.reject("invalid cleanKpAccountLoginFailedForToken");if(t!==X)return Promise.reject("cleanKpAccountLoginFailed invalid token");let i=Ie(e,"info.remoteAddress","");return Li(i)||(i=Ie(e,"socket.remoteAddress","")),Li(i)||(i=Ie(e,"connection.remoteAddress","")),Z.includes(i)?(u.info({event:"api/cleanKpAccountLoginFailed",realIp:i}),await we.cleanKpAccountLoginFailed(),!0):Promise.reject(`cleanKpAccountLoginFailed only allowed from cleanKpAccountLoginFailedForIps, got realIp[${i}]`)})();return un(i.msg)&&(i.msg=i.msg.message),"error"===i.state&&u.error({event:"api-error",key:i.msg}),i}},{method:"GET",path:"/api/logoutSsoUser",handler:async function(e,t){let i=await yn(async function(){let t=Ie(e,"query.token","");return u.info({event:"api/logoutSsoUser",token:ec(t)}),await fe.logoutByToken(t)})();return un(i.msg)&&(i.msg=i.msg.message),"error"===i.state&&u.error({event:"api-error",key:i.msg}),i}},{method:"GET",path:"/api/checkToken",handler:async function(e,t){let i=await yn(async function(){let t=Ie(e,"query.token","");return u.info({event:"api/checkToken",token:ec(t)}),we.callApiByToken(t),await fe.checkToken(t)})();return un(i.msg)&&(i.msg=i.msg.message),"error"===i.state&&u.error({event:"api-error",key:i.msg}),i}},{method:"GET",path:"/api/refreshToken",handler:async function(e,t){let i=await yn(async function(){let t=Ie(e,"query.token","");return u.info({event:"api/refreshToken",token:ec(t)}),we.callApiByToken(t),await fe.refreshToken(t)})();return un(i.msg)&&(i.msg=i.msg.message),"error"===i.state&&u.error({event:"api-error",key:i.msg}),i}},{method:"GET",path:"/api/logoutByToken",handler:async function(e,t){let i=await yn(async function(){let t=Ie(e,"query.token","");return u.info({event:"api/logoutByToken",token:ec(t)}),we.callApiByToken(t),await fe.logoutByToken(t)})();return un(i.msg)&&(i.msg=i.msg.message),"error"===i.state&&u.error({event:"api-error",key:i.msg}),i}},{method:"GET",path:"/api/getSsoUsersList",handler:async function(e,t){let i=await yn(async function(){let t=Ie(e,"query.token","");return u.info({event:"api/getSsoUsersList",token:ec(t)}),we.callApiByToken(t),await fe.checkTokenAndGetUsersList(t,{fun:ve})})();return un(i.msg)&&(i.msg=i.msg.message),"error"===i.state&&u.error({event:"api-error",key:i.msg}),i}},{method:"GET",path:"/api/getSsoUserInfor",handler:async function(e,t){let i=await yn(async function(){let t=Ie(e,"query.token",""),i=Ie(e,"query.key",""),n=Ie(e,"query.value","");if(!De(t,i,n))return Promise.reject("tokenExpired");let s="token"===i?ec(n):n;u.info({event:"api/getSsoUserInfor",token:ec(t),key:i,value:s}),we.callApiByToken(t);let o=null;return o="token"===i?await fe.checkTokenAndGetUserByToken(t,n,{fun:ve}):await fe.checkTokenAndGetUserInfor(t,i,n,{fun:ve}),Ii(o)?o:(console.log("token does not have permission"),Promise.reject("tokenNoPermission"))})();return un(i.msg)&&(i.msg=i.msg.message),"error"===i.state&&u.error({event:"api-error",key:i.msg}),i}},{method:"GET",path:"/api/verifyEmail",handler:async function(e,t){let i=await yn(async function(){let t=Ie(e,"query.token","");return u.info({event:"api/verifyEmail",token:ec(t)}),await fe.verifyEmail(t)})();un(i.msg)&&(i.msg=i.msg.message),"error"===i.state&&u.error({event:"api-error",key:i.msg});let n,s=Ie(e,"query.lang","");"eng"!==s&&"cht"!==s&&(s="eng"),n="success"===i.state?"userRegistrationVerifySuccess":i.msg&&"string"==typeof i.msg?i.msg:"verifyEmailInvalidToken";let o=Ie(oe,`${s}.webName`,""),r=Ie(oe,`${s}.${n}`,n),a=ge;return a=In(a,"{title}",o),a=In(a,"{message}",r),t.response(a).type("text/html; charset=utf-8")}}],Ae={port:c.serverPort,pathStaticFiles:Me,apiName:"api",apis:Le,tokenType:"Bearer",verifyConn:async({apiType:e,authorization:t,query:i,headers:n,req:s})=>{let o=we.getIpByHeaders(s),r=Ie(n,"origin",""),a=Ie(n,"referer","");u.info({event:"verifyConn",ip:o,origin:r,referer:a}),we.callApiByIp(o);let c=!0;return await we.getBlockedByIp(o).then(e=>{c=e}).catch(()=>{c=!0}),c=!c,c||console.log(`block ip[${o}]`),c},getUserIdByToken:async e=>"",corsOrigins:["*"],useDbOrm:!1,tableNamesExec:[],methodsExec:[],tableNamesSync:[],kpFunExt:{getWebInfor:async e=>({webLogo:w,webBackgoundGradientColors:y,webKey:x,userLogo:B,showLanguage:V,language:R,kpLang:re,showModeEditUsers:_,modeEditUsers:Q,showModeEditTokens:O,modeEditTokens:J,showModeEditIps:q,modeEditIps:$,allowUserRegistration:Y,passwordPolicyInfo:{minLength:z.minLength,maxLength:z.maxLength,requireLetter:z.requireLetter,requireUppercase:z.requireUppercase,requireLowercase:z.requireLowercase,requireDigit:z.requireDigit,requireSpecial:z.requireSpecial,consecutiveCharsMinMatch:z.consecutiveCharsMinMatch}}),checkToken:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-checkToken",token:ec(t)}),await fe.checkToken(t)},refreshToken:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-refreshToken",token:ec(t)}),await fe.refreshToken(t)},loginByAccountAndPassword:async(e,t,i,n)=>{if(!De(i,n))return Promise.reject("failedLoginForCatch");u.info({event:"kpfun-loginByAccountAndPassword-before",account:i});let s=null,o="";return await we.loginByAccountAndPassword(i,n).then(e=>{s=e}).catch(e=>{o=e}),Ii(s)?u.info({event:"kpfun-loginByAccountAndPassword-success",account:i}):u.info({event:"kpfun-loginByAccountAndPassword-error",account:i,msg:o}),Ii(s)?s:Promise.reject(o)},logoutByToken:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-logoutByToken",token:ec(t)}),await fe.logoutByToken(t)},createUser:async(e,t,i,n,s,o,r)=>{u.info({event:"kpfun-createUser",lang:t,account:i});let a={lang:t,account:i,password:n,confirmPassword:s,name:o,email:r};return await fe.createUser(t,a)},verifyEmail:async(e,t)=>(u.info({event:"kpfun-verifyEmail",token:ec(t)}),await fe.verifyEmail(t)),resendVerifyEmail:async(e,t,i,n)=>(u.info({event:"kpfun-resendVerifyEmail",lang:t,account:i}),await fe.resendVerifyEmail(t,i,n)),getUserByToken:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-getUserByToken",token:ec(t)}),await fe.checkTokenAndGetUserByToken(t,t)},getUserInfor:async(e,t,i,n)=>{if(!De(t,i,n))return Promise.reject("tokenExpired");let s="token"===i?ec(n):n;return u.info({event:"kpfun-getUserInfor",token:ec(t),key:i,value:s}),await fe.checkTokenAndGetUserInfor(t,i,n,{fun:ve})},checkUserPassword:async(e,t,i)=>(u.info({event:"kpfun-checkUserPassword",lang:t}),await fe.checkUserPassword(t,i)),changeUserPassword:async(e,t,i,n,s)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-changeUserPassword",token:ec(t),lang:i}),await fe.checkTokenAndChangePassword(t,i,n,s)},adminResetUserPassword:async(e,t,i,n)=>{if(!De(t,n))return Promise.reject("tokenExpired");return u.info({event:"kpfun-adminResetUserPassword",token:ec(t),lang:i,targetUserId:n}),await fe.adminResetUserPassword(t,i,n)},getUsersList:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-getUsersList",token:ec(t)}),await fe.checkTokenAndGetUsersList(t,{fun:ve})},updateUsersList:async(e,t,i,n)=>{if(!De(t))return Promise.reject("tokenExpired");if(!qi(n)||!n.every(e=>Li(Ie(e,"id",""))))return Promise.reject("invalidRows");return u.info({event:"kpfun-updateUsersList",token:ec(t),lang:i}),await fe.checkTokenAndUpdateUsersList(t,i,n,{fun:ve})},getTokensList:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-getTokensList",token:ec(t)}),await fe.checkTokenAndGetTokensList(t,{fun:ve})},updateTokensList:async(e,t,i,n)=>{if(!De(t))return Promise.reject("tokenExpired");if(!qi(n)||!n.every(e=>Li(Ie(e,"id",""))))return Promise.reject("invalidRows");return u.info({event:"kpfun-updateTokensList",token:ec(t),lang:i}),await fe.checkTokenAndUpdateTokensList(t,n,{fun:ve})},getIpsList:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-getIpsList",token:ec(t)}),await fe.checkTokenAndGetIpsList(t,{fun:ve})},updateIpsList:async(e,t,i,n)=>{if(!De(t))return Promise.reject("tokenExpired");if(!qi(n)||!n.every(e=>Li(Ie(e,"id",""))))return Promise.reject("invalidRows");return u.info({event:"kpfun-updateIpsList",token:ec(t),lang:i}),await fe.checkTokenAndUpdateIpsList(t,n,{fun:ve})},getStaUserSummary:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-getStaUserSummary",token:ec(t)}),await xe.checkTokenAndGetStaUserSummary(t,{fun:ve})},getStaTokenSummary:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-getStaTokenSummary",token:ec(t)}),await xe.checkTokenAndGetStaTokenSummary(t,{fun:ve})},getStaIpSummary:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-getStaIpSummary",token:ec(t)}),await xe.checkTokenAndGetStaIpSummary(t,{fun:ve})},getStaUserAccountLogin:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-getStaUserAccountLogin",token:ec(t)}),await xe.checkTokenAndGetStaUserAccountLogin(t,{fun:ve})},getStaToken:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-getStaToken",token:ec(t)}),await xe.checkTokenAndGetStaToken(t,{fun:ve})},getStaIp:async(e,t)=>{if(!De(t))return Promise.reject("tokenExpired");return u.info({event:"kpfun-getStaIp",token:ec(t)}),await xe.checkTokenAndGetStaIp(t,{fun:ve})}},fnTableTags:"tableTags-web-sso.json"};return Ae.kpFunExt=Object.fromEntries(Object.entries(Ae.kpFunExt).map(([e,t])=>[e,async(...i)=>{try{return await t(...i)}catch(t){throw u.error({event:"kpfun-error",fun:e,key:Li(t)?t:un(t)?t.message:String(t)}),t}}])),a=new $o(Ae),a}});
14
14
  //# sourceMappingURL=w-web-sso.umd.js.map