From 153eedbaead1f30b86d72659eb5d6867d6337208 Mon Sep 17 00:00:00 2001 From: Paul Kilmurray Date: Wed, 16 Jul 2025 13:10:56 +0200 Subject: [PATCH 01/22] WIP: changes from main --- .github/workflows/reusable/setup.yml | 24 +++ ...edium.4401ca19be5f325e28ee45d96516a35e.ttf | Bin 0 -> 396752 bytes includes/Activator.php | 41 ++-- includes/Templates/Frontend.php | 31 +-- package.json | 2 +- readme.txt | 203 +----------------- woocommerce-pos.php | 6 +- 7 files changed, 67 insertions(+), 240 deletions(-) create mode 100644 .github/workflows/reusable/setup.yml create mode 100644 assets/fonts/Inter-Medium.4401ca19be5f325e28ee45d96516a35e.ttf diff --git a/.github/workflows/reusable/setup.yml b/.github/workflows/reusable/setup.yml new file mode 100644 index 0000000..4ceed5d --- /dev/null +++ b/.github/workflows/reusable/setup.yml @@ -0,0 +1,24 @@ +name: Build + +on: + workflow_call: + inputs: + node-version: + description: Version of Node to use + default: "20.x" + pnpm-version: + description: Version of pnpm to use + default: "10.8.0" + +jobs: + setup: + name: Setup + runs-on: ubuntu-latest + steps: + - name: 🏗 Checkout code + uses: actions/checkout@v4 + + - name: 🏗 Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: ${{ inputs.pnpm-version }} \ No newline at end of file diff --git a/assets/fonts/Inter-Medium.4401ca19be5f325e28ee45d96516a35e.ttf b/assets/fonts/Inter-Medium.4401ca19be5f325e28ee45d96516a35e.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9da6019bcf2305aae16281800b9d87084efacd7c GIT binary patch literal 396752 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�K%0S3=pvp zu@wq|loaR^F#s=%e;z|%jn{Mb#|tO6j4CZ!RKZKsXOo*J)NDC*$%n({&>6>`>m&AD zGBngonx!>iLmgxO3wWtIyhdt=jn?7iaM))U z%W6ZgCMNTZT#iTZOzvr8SzZp;B5@5+r+fBnx+lpw+&GPAy2W66MWqH}6{`a?!o7tV zvS5FJCR!z90-Dl}bH&#AAPfV(*F}Ab!fph|dC7};QM8U&V*o!+7v19gjf%^Jfa7Y< zKKj=`DgF9(e)`~OxAqzBlaU=J)i~|K>J~$Wv{-$CrKBac?3~uHL8`>;5o$Z_#J|A> z$b2YpL4d^`!9E_iu6jMS9aBDL<$(-Nf5cw^CKCEuWzJ+i=7%p%cu3d7h0k8Pq^F-Jc@n8euwM*CeR5rMyc540EZ_wvg=+iFxbnR!5 zK45$O!~plhiC64r!qG3YSzs>lC-&63AhR>zn5;jj;n|GVzcCCD;uwyBlc=`R+r#zZ>jau`Z=Z{h4`)9 zYtIHd;X2p_*W4WKQ{K)o3-?dwmbQPZ-?x98cYmhVU%TVT!u{-=Z2M&A{mJ@$?5l&? z28V}~1M86!Mu-CXPj$H}qb`?I2tW*fA=|q47b|tk+^`=zBzpU?dR_9_f_Sc z;S%F5wGGlNyvN(+wc-K5P#ic6J^1#zIB<7Y9Juo!(a`|{r#Ns?cl_uXR_bs-Y*1uZ zZNu~1WF@|-sP{?FOXptes10$<#k_IupTQPRep%1Tx#pd7N*lpvI5M&91$DP1{Jpf2 zIP0{KLM|-4l;Y0oB@=%2&|l?D=Ry3cqbKOBQ&$=QgMwZs z3j#Hv8kM159zGGai$sv{5B9?!QEHd4iJFH>NXG%h0`m(p!_dDu)2F00OiG!Ol+>vE zwDl9(d{`!GM4NHzKW)~zb2Iuo^SkPmD_2LzCvb1hpW1Og+0i*)_xA={f*(>ExNHgW zAwvCU@4#m;8PHd8Fpjeke!u=|fnx~E(X^*L)A1f~r&9w@g50bAIy9X;%48GjER#*B zZTP$Ybn4STh5hs3*s*)s(-wo@YqpB~l7Q!b=P`VaLm|4DDDd4cBG>||IIiW&zBZd z$zL#+P*VtAP)H;$1{3;O{+qqm0cD|a^z(hDn&SPf93vbJ&1L?@^9r8dk@MAJwX?a* zv-V~ZDGK4C+qrjNgNG~{QaU+$;Jls4>FcB^uETrZ*E+~=AwA~Yd-njJZ@B8H>u863B+he% zq?=HHs6f2fg23|lnL>g!!@0t*HrRy)&lS@*Vu09)L8L>(SK=JChKswlYu9!0wzHLEhG2_7(hYV@niyDRAO{Uo7Yg>C2z#b)9HmXic;nM|wWL zAoQxl9!M|}LX`X8*5jh;WQauzAv=XLH5Vf8>oi(mh8ukH;eKDw+3lzKwXN;8;8^*h7>klK#TdcIxVMFEfih~2rTJzP zZ-;6t%{ElReu={NF~f{U!V&31VPn8}A>N~^nb9bUyiy)F)rbjI!dWA$W!9_DV3x0W z1eBkGVT2{Z4Q^k8*VkuAvnybU5Y?ZZj);noj&-L*E&JHkv7O&ZYZl-9$Bko}56Ntl z(1e#@2y@9uPe#r&d`nJGPi~)P&hcAtuvV=$wY?S`!w2`S*8`3;si{ht`swg|cIFq& zIcfZcA8_*nJffv$0>>r>1pJy=^r zEQa}ohSQ`%eLeo;tSqmctM=m9ma&}&q&2M~<}_$vlep&2E0tT)EODhu6Vq>=!#<6P zNsRRzytHD)TCA7v(1n#M){J#~@AFDAiL{U3(U3sJ(G9#rnpjr~+yqM03pkd-U_mW1 zF#}bV24dAzK|j>)n3+lnZEC>A(|zzCFWsgT>Ck2Si9l`iv? z%Pe%qMS03aq_XE1w_noU)y%8{i@JOnLH}p2VSKs6H4iSsu3(l*3P}4QTQ}0@$R;vK zOGAabwBEPH6wg>dq~@{kIWqLtf2Mh`@fWwSV*JLI3up@7;;Hczf8qWkaLMMJrpj`i zb}GxAw3FG9LQNZMwgDFZTQYwTe1NsF!&a{zR-+|jEo&InIqwZ!I=W-6s_pT9A@eri z1Kp|%nb%1@aZKPMCKv(0-xL{t$U+-8Qlq{N3^oMrDO9OXlSePJ9bRov2()CZ4-8ANBk`^dBbk?c6*1HEF7`iEM&bI>mRqZ|`X@iA(oD3|D zo33EJPzu%)uNO?V?r!RIixz@Icmcz*D!xOl3lx^Ke)H%?!^@T(-gxZB&7&LR+Xwh2 z4@hp%ASLC0k@p?oQB-Z)=j`mx%x-#bq*ow7NJs*NvXoE*DFjG`B!nu>Py|GXbP$jx zA{_*&0)il*bVQnnQbhDqR9-7Dq9P^Po&E1;b~lA$dB5-buj{}5=*^TpbLN~gr#$_n zrsgPhdv#3h$$8Jz4!xCW<2NTaYLvWn%ySzO8#YXQeQdM7g(+?N^l3xKR>j5mzK6ve z^N;c^Ot4v059?SaNf7B6Nr;C9@loSBfBX#TH1tzYZr1+MW`7&*sUC z_V-lI%D3()1$WSl=pXmZ?+9;MMuI-CXZh)Vf9rR=-{1ZnO-^E#@PX_A8cs&Bb{f1IsOsKUSz( zt{nv|jJn!sYtxQ*jA;j*c^3qpA-VFHHJJa|GzJ{;hrQ-*^CMP8?+~OY{<=-W% z!R&(p(a`}AF{0j1Vq4(@$yBSIpTHy5YG;UWBd{|GId)k6Z-o#3h`*>@dG}rA>PJof z=msqJ7CucciudQ#{%*ut5UcbIP$yL5z)1bhKz891Hj%p@fQ%6=00ATkO_M z3c8GWMNh5c$cE!c#Iu`fs z)S*ui_07ujX03U%WiE@ikI8snSX^KVNB_vB6qv+7+{QJ8%eHkwhj}YFMITs;dwB){ zbo7z1i!CC!s+O--j*QM#insE7i$(4G6!MgADXn|7#{WA4=D*8}8U|pXG%P8J3#`lI z8}+ICUPMGj(|QejU7Z}A+!0SD%+=A++qul4Yl{Y zTTP1yRfdUiK&E1~3?i&QJXwaB9E$ukQ6;=sIV7&Xc1kHh!-1ZAOI)ukfBc=+xu1wR zFwtC7gslIeeF^8GK9JMiMR>%*5=}k&yr*b>L_OQ0p5E#^ZF+ke*pCZik+!xOKw>Bl zjjn8~IgNn9ci)zVTvbX=QyuQ34ySA8rrdU?zMHbYeqAZ~=_hJ~itq3aYWM%_9Uk-!G=^01-EqEg`V`(lxv3mDu)XF>_`|W{ zauz20VP>0Mh?o7T$uVv%+S3`JPH$!H1t zsz3q=gOpm`+xqL11k^e!spMfg)s~MOeYu^oc+|=pO8E_5PJO0wv^n2WX4wQ;+7Pww zuFwTDM~bV1&B7678C)3cGyu0?+y~``E{ebzaMa`4A+%~0)2gM)2yhp)+mnBXj35e3 zroA`l5(Jt{sVgM=!22dlB|)WVQ_Bx$4C|KIyGNtC9bMm$nhoofHf3DPmLuED$yIh5 zV;jV`Oz1EzyGfJSaH#TlWt14Bq{}WWjIE@yzm4cWysI^`L7)h#7$pX=BcY=}qlp6( zib=kO;#%FO!^nwFcNS(&8CN=c=*Yo65*lb{O&{2QVp*?_N$U5D7h{zkhE6P;wN<}gatP?YP*hoy z1}kn5ek3HRtuh9$2g;AL;6Ohg#5@V-Fs`gpUy@Lfz74H!QZ&3Kt;`+`C9*m&&FQte zbkNQrd;VRt^4+{vz2BKQF2DD)#aS6i5#fEM&Bl4p4qlV@&HF1qU(m~UMV&qeH_n_n zuy?;+exrQ?QCy~}%o9tLI)*(eWwgxN>&cteMSw)Y-%q2}Ipf1o*JtJ*Daog>bDjYHWfvSVM^dd2C}yncm*K ziQkg?^qiPl6tQ^BTPII*<&zHS?YoLam)Cd6F3A~?n16Xyz}`!|t)WA9FZwRL@`5

ZV==eVC7yxU6FLn%e;KbscF;JkMoTSc61GLYt%+R z`Ze=wnt`vS&X_IfmI}J&DXFN#0o37L^sPp0kXnaA1~CigdMOfd5h4uOhy#&b?FAonxEpb`6 z7dnV4A|p4BFjXQ*L~24}^|=rFRD6=TUru%#tu`mKY892upv>-s#bA;nY|IuTA@h`2<1G+3M7)4QT# zN8Se;H@|;sQ~Q)HJSH!b^Njr5%naR8?mcL|>yE3RzUjLCvZr#7FL{2T>%hsA2Dz3_ zQu**vx=1BaKbE`bmpokIa_y+P{%Q8RT(hlzOLbvtp9^3%n;%4ZV%{?5D=!QYL1iLA zT|lCXg@(*sG{qzw$c*%g@~C23t&xU^5T|ChX{nQG93+~uULWVvD8#`v(4$eC_2c}S z1UQC-#2LlWLUq3}O`P?TL3~AS+DaV<6~CcfHTt2Dt2S5rP$OCo(XyCB)4aH##(7cg z3P9&j1Sx^6WVnzS=H?#mXe}rIooL!gLnWbuK$y|NB%vqems(5W zcS=BmApSp8DzNVj^9ZZbsaU@&#ta5;R@5Xs3| zq{$BTh2yP;*f9H)CrOfv>Tit2&QTK%5+fXfX{LQhm^j`7DNJ{aI)8F-otbR0Yde! zN{$bgZMrlj-odlq&5y-F-~3jPap%EianOqkn$?~A%EM*P&1m7`lrodr(%jPW6|A1r zwlrs0+tQq2ZA)CMZE4Ox%aP99dV;o8Pe6ZGoD=scmkb|Zj5RhkRO3k?l!vNiL(pgR z1f;PGUNE;YprgClO}g^g zXOP7l7fq(Uf9pB8DkYlsnw``Kss8k=<@LYyEWNX^BG~%Q%7fcf01{&ISpEdV_9R6SA}HWX8F?65HptgUC}es z^oSj-GTZi`jr7jU!~~7nO|V-eND{DWh!W%N6K1|KWJ~+~7n9bf@OnSz@61Z z8ra_W!YS<0fqrAYpu1}6j`?5BpSr(;0r_`9rnRKgsfm=oTO#7d*n}yfmV_zM4K>gI z)MwI_KKm{wuWPPcx|Oo}wZulRA5h#rb@!GH4g*r#mLC=kIvw_$gKp_9rO2|@(hPm8 z0J^18Yu~zGYVTVQ*D6J(#p>^cmM@?9dolJQYL4go;P*%MZ5op(KeW8-um*h(J{d-E zFK|GEAchN2+M~8MFX19;vWzE~gHh**VzI`$HOf!joZ^Hc2zB?rD7g`{ZL)Gq`qw9) z9OKKC0a)k%OZ;6~uK(QLE@%?cL4i#E8|^~V9@>SYU6kdf4!n%JB3AxP>CDxu8h29U zkR79VQ27AyR#ZDi6qUZUpZ1J-xA*}_`azXzU?!rj$I@W?x2||ie8*B>AA@K5KZG?V z{_vCLwk&btKD!K~4spW*8Q7x$}ic0Um zs2W?xO@p0x?S)li`9}wxgUGUSsd@tNX*-xUYHWvBH_~Hp_ zzA;X!aV6+6&|+XiF@2IuVXPi96TLH{W;-CUtgEVw`k9gwc_N|+LdP?`Y{YQR-BWixN(R0$bKv1<5QLM{d;XoOphPkrazhnZC$g>9o6sA;_)&E z)=Pdp7Ny9Dx0oE#*NP|e6+j+`}c1%IzBydD`v9A;u83t zorPVG54hfH3nNhS5VS+I2C?EmurSPSUg+!V8{iw@LDqG&Q=?k88hl<&uAO^?3qnvq zc6MQ5c6NbzOn$E(`T0G17Vs16kKUFNvG;a60+iROFh=25mCtxIB$Q7r6J!%GcqG$% z>}U8NmMPLB^vPwKx`sRc@>rpEqFcfe%vL6S8u}sGGj>(Ks`2r!imwmWheTiyC+HWen%D(~N=Z_gI>Q=oEa(XY69z1GE#H?ck~ zrr#@ZajA_XOIF4=Zm$G9(%9&y@V^&hGy`Gpp|i)8Q74URH`uZ6uJ$R3(Rm5+fVV=caQAk^+q3b(Hi#;fDJxYD{2Cmzv*Q3?za?CM{Fvp1cF>3ni z>#^$fb}?4-jQXw#AR1(Fhr6`u0!*=Dt@YPnhevADimxC;IxDvT<#CAmh;?6MyDcyBXOw zJ0ir92h1*&vu4Nph#SuDN{-ukrzKR!yAp%$z5qHByG|Kp$I!G%$IuQMNLjJ!WQM_3 zC`2dQrip}jHD;L?!U?IeFEKp4;%@xNJu6IrZHYOHfxCb@gJc)aMhdzPIpT z=u9#(;&CC~#fmhTWIeRG33y%3++Fn&90j}}=#Xu?I>b>5Q-k2D^@p}0NTbyK>i3Sr zhR!K9jye3%-eIqm^^^8f_1kvwZ8CEmPN)p>{Wp~~O>60*DwnLwlCc|A4{*05*fzC9 zYrVOr5BKrpXRt0AHta?CvT!y69aT^{Omao`JgfczXF@TQh79 z0C~MIIFS1V^8jDJfWdCu$%DH%I=O(-ba2o^P^EV$#y$iNnZt(;89cCmzmlRp1^KzX zduC^4bnn)+bH@(t+ZtQ9Olj6MsY!g}Mh)td7z_K|kTHR3P!J;9B*0elQ=8+4uGSU& zJJ1|biN>Mf%4) z$Ww`vLFHb2P&!L7mWmOxJTDiWp2klWJiLk10vf}W2!yNL)sJQ2>|5%!R^@OaSTmYB z$|^4}rR-32a$3mE*Cl)>rlN0rs)shFKR|rqU)7HtPag>0xjL zlFjOG552r=#Q+2*Z^tIN*Ryr9ys z1>JEr2;vYM-hgM!=8VY@O7wA^Vj?~77(eT7Kz~Vrw zL(TANj8#Q%wFk4{=oQg5j3v#jj=A!b#KdM$@}%g8nq|#{{nZL9P2~`@NjtO&>8orS zS+s;Yd}wzR2tsjyAQVHwrlG2-nW|xYrEXCb?=8V6ty(jMD{s@)4X00U*!(`{?{Ch} zAT=`QnN{j0*Dar}o>Z!;n_LFGK>d!Y367GZOc}mYA@&0b@b-HZ|_lvbVtu3i8r6B49v6btXF+R*cO*t+fuX z@v}fpf?kS-7-&sqZ5sq)c5{V#-;?ZZXtQWk8YX*HMpCebQmsD7P67(^XnZhLqYr-6 zv~vFDjSDArJ+Z|pt!PAC!)Lo^W{4%9Z*u8mRsFepN%=sv*HE7st@xqN zZg$HEQa?K5AB4|E`LSgRO?jvmNEYn10|$P{=E&+23I+FYkE-Y<2(Lh71V#~&mlBSq zj$J2@fB8hyj)P*38TKecd#-p>>BRSEynYVLmyhj&ECJ z90NWS?U9G3NK-}ZC>E5pkm!N#gl{gbLRE$qUbZ$s4D*C|^SOw|L!*u__e>ohrGMst zcTa_D9^@3E4KZfl6Nj5;8e*9@Gpb`Y5sGb+7lK=z4pACx2k{MHDoQV^Av(mf-VD*U zJtE?3Sp?aG0Fdn*#g~VS!aQ?Ed$&l*sd?Q|{rKd`r(h4HyxLz7Uey|=kLM#^+rOX6 zf%#KurXLQ`R8{;)yg3ckB~wMPk}y582RNYEy@(*`;bXcn{j&1=9_9CsUviWd@h{9G zEd3+eQhsZYUm5bNihXL3wCFj=5>}5Y#Y9IC?Wk>4Fd%n#cY7o??vtD#kQHyZhhUmD zsr=h-Z{3(P`^K$r^}}!8RAwoYZr$Qj_&91qQ;^xweA<$Oncp_=VS_SkYWLJn6_1{4 z|5Q3Jnl`Avs^7}neA=Ud*U+dFD?C%jxre=Zz(LMd_GsGo?u#`9@2c1WyN{F7ShRit zeXqTakj<0(9c>mLVCCW2NEq;w$qNo#fchTNd-y8&tG}w&{g3{bYc!B!p<8u01FnWM zh*n9KXc1r28Y;zGMcSLcc{Vi3tPy3h4(M z9O3;48y`Bt%7;5>Afb4qCI8kVXvr|NWm1#Ijp{~+HVkW6t0hA?c6Y9_P5rZ$tZ4%S zix}_7>IOCMe`bAypy>mu8*+J%q6M2_29ukanFmWY<(Ell$D~1C4rsuvcBRz~*em<9 zZA6v4(BDdx^q+JL&Df$*UGzy!#c+(9Eoej90ep(uf)3Gv8aRh?F58>1E)fD+9Xg}R z3&5-pS|s=>W6M~i%4M?5i!oiugBi>V1`d?&Bs+=Rcao`mt84Cu?tl z)zdG-iGU8oTsT^nq|!-s*#WBgJI+p+5_B|ckkfmtb*Gy$_*-j5-6Sk~TnFQE8fL0t zrAz$SLmQy;3an@-hB{_Fv8SO)jVF!%ay-jZXWRdgs>w~UEa z4Yc70X`@>oC%eqfV%?4t$4dqA@qP?;N%IwPSle>k{(%K6i`JfOIDUbW+VExCK`YJ~JI z=$_g0n`zZGNyrZE)un4)rEAUVpzU*XU6gwINr=Z2&Gu5SwT3?M@xq2i!9g0Gh`o3q z3M4Z{IOTyRreCyA_{A18A)Lg9Fjf)=W6vlMlsbGhj9itbVUW(_LLJrETwBnJ<@kz! zkvP}rS0{k8u#kZ0I?+Dfp6*V>U;1-@eT_*F-##HeF;QJWtrT-I6s@8F2BDf_-jlYo zX+iAp#P`x(n0Mg7yxD0E+rOI9va5I8@SNURx-PBTJ>R6k+NRl`Z*<-ES#hSh&ZgJ+ zyY-`ZN_zPK*Z$=g-|f&(8|b$~OQyziHFola=7AzefIHTpJ{r`=#v8(Ri$*!^hihkt zP5P1(faATE5U8`zwq8$adz>e|+mJY-l!fZ^90amoeb|WNBhXq%OLPo z`V1e6BO*_=SgVReb7YPl?jBVnnp<)*g$59?b&s2=Ws?inlwY~=zrM&iVR+9x#duq} zpfu<0d)?M{0*%%O^mHir48gANsF6P!r)C^|4yMM`=fnxap2}mG2jG8*XYcDbLk9g1 zif>W(1<22lHB?uka9KxmE?Lll7=@q!iTYyPs>Q;N z6$mF|lcHlk$Z$6p3KO|#I`G3U@4vtNgX6cQE}A~r-u}L#=aq_1Xac=QOeB%W5+f*LIxBdxy zmzSNE#}vby4G^Z0sHwJD7zz&qcWlmXcSTV*DW!lSl809~B8rf`vuN_mX*xZvY;{5F zZRbxH^(|=7O@3o!{e-C_Ge*}{z7u)-Mw!MwFcRSKKN(=I&`)6DEJf`Xad;uTnY87Q zOoIELM2(83BZE>wbv+S^u@^4v+1=}gxyMw+e5i^yL}GQCs;QN%t0#89RlWMm$?Z#r zY}hh=-hqQstBxa5yUkts-i&p-`CiT7GDnufpzcv7k*af;gU&vKgRj)a& z23STzWe@X3cL)SX07JJlHE-EgnP8f#L;+^?7}BaBl8yqza1x1Gu);)uGqlQR{v;XJ z7Jom^LWBLH{G%`@!)60(i!b-Bv9{RhA6ihX{$8}_4@7uaS*U4M5#F#R+qW)FEe&_v z*~CR~^=TeFHnLN3au*-pu8Fog z<0Ek_FELT!p&>#3zHackBi&fl@`7H90b}oTaPN9uJ^_uH!C$C*?OI)Bsi) z?&r=+mMFjN$NnW2ebj1yQI2)h0Yb~cE?m#xkZ(}6v$|qu8S#edc0xOsx#*ydy^-Fb4_* zrq>&avF&5SZe%XQOE8b}dbB5AlfQZr>5*8=2UKOD$JWTcG0|;|O_QLMt{a^alY$T8 z6&48EWt54MklD^4o=sxLw0ulglyA3~SB_=As@FDoiu zzWm(D#oiH(+Hjv%4I_A~rY+X|axkM+)_Z*CvdmYOzolr(3U8(M(fNKep3}sA)?93ob14-7$>Y_0*4Hsj96dGacMq{Kk z87u$Obh$>?dUa!>-8{lQBOFOW+_rV=Hr>vO%(Kd`vj+6*O@C)U_v91*a0@lWIIyC0n(&Y*p4(X{(yJR!W%K7+qtcqax9| z9uX8x$JV-5NdWqvE3?lD%)>rsV5c~1+X`C|s;vCkXI|i`%E@1+eB8Ff=QDm%KIFXp z=+fsF@TN+JcAQp;S9BLm?Ot8F^i|=Ish#q(@?F1@l78Hed(-tR%a*>X^WU^-JGCw1 z-;A~xKwkx;SJ}MMF{04GpfoX#8C2&`yptY4JD6?>ec|7X^-xF;3k?qP@CbGH@WODR zTBsIY2<0w>V)Z6N7YrYw)``xe*(@2SJUP6=|2W_Ex#0K3iz^QB)B@jwZe4pH2!8vx z5I*ojD8BdcF3KK3YE>n(WBg*C*ErU4JTcCR6iwFrd z)w5)~%|m(3&}pV{?#jm~<;t&pGJEIu$<8Vi5!*v4(d_Tgx43j#8DQM2v<%yvSU)3>EC_QyBFkUX60)} zLG@c$2=%Yr&}I3_)~&Kz=$D;CtV5pMuCNd$oW(8L(=jg(HtY|@Gs+v7grdcQhg&Vz zV3Lqi(U4!G7@V-sBTr&=>vpS4G5X$Balf)i{}bf;o-D}-RvsLo8W|Rv8hjft!_y#V z)T(qOJ~?Ew_%t4FpdV$p^|*`hr+}Kqw(*(DR$!4t%`1OAOPiq0IIGO!4fA^TEbNn= zoiDe$cFk3p&L_HX*1lg+#}0i<&~GZf5wWR^9E%)%jb2doQ4y%0sX8Zjck`zo7xFMsgb2J^?tamy^!x3r?keLtH|hM(O|pUtp*DZeawYNDj2 z$Xb#Q>IyCMkqSOlmicNbNLI}!H3wKB$ggl?2*w>oAVuOPah+XAMa2TUNks~UV98q7 zXjQ~Sj4yY3bxjJRBxq#p&v z!8MCwzGtDW2 z8ihzTGpB(>*5(3YzF;W9h_CiuwNDsMH9Mmz3$77&lsTG#ebjE3S!iC6myuaeklDRJ z|2erzn8&v-DsE?l>2RAOm=NdXp;3%VmiB`7IjDqVu*6|Rk>1uCy_hxw;Kjtaqw64n ztD9G-PWHo&n4uv|UCF>PB_+DDP$Tcmr}Lvrm2ldr@ zVF3B@;j7`3k-Z9iQP``{x@FtP>`7k{?-Xi`xtd>5dCk<(sW2m*A`cW+&miRQ!t0VT zvazU7YfKyM>GQ$QrHgowB^j1u-sn?VP9sFjK`3dGSi${J!>an;C+K^t^k1s;MF>kV zHnq+e5@;QDzzUpPm1x2smQ7oNg-p<*3sUfu>S;r+Ii#O9E7q7oG(!tBG7Ae)6}2xG z_Q^nB{POyBSL~-V*~L7zUGby+v6XqV<{)>*O4HtGfIi(8x4-MI2IwKKDn&!xvIK)X zo@iVI3ImY?M%w1%h95LMD|c^XxT}D^O0<`Thyo8QQ_L6fnBTr`m>%ot-P=O?Cr~`M8d+i4H zS=*akFFCnhOtWUXFXt2&&mm|+xTsVp&oqmUXxcO)x*1hBS=^?(EF2`|>O0I$x|v z7d}<4%A&II)G40-o3fCPKwtkvT!+5yYwI^f`!LO;$6zg{Jt9I;8Vzj^jhAu(1OXZJ z)|$ftj3L$!^z3P%p_t9-ip{twdS>07o;Z`rqR7Is&>2iaC9@u<=ldxj8ASkD+uRRuMPwS#6s zl&X5~scLgQTENi%t@DO8)PZT_2_CC_rwDo7vvWAl$KOCDCaoA{@S1_VX6aY_Rpt7ZH#Flv#;#(YiAQ)o4YDu!Fa_FD zq2jVQRauKZW~Fyw7mfji7h1iw1kf^!1_AlYc5>tfQw6$GTn1A0^PEF$+9 z5wa6lW7?=#pX#Mfs9_>mv#*&CzQm`%H-W6|I+yQ&hb$tE8`ls=Rs`?&<*o*+PBHiZAaZv!{(#iX6WBLcb-tSlO#9EH{jBWaeJhG|u+3gwAX)oCH>jjWxFO?qOwT%#KZ6L`_f zQmyGN64RS5oMb)$&*vc2rDZ2b0Hp1*dx z7*@AY)co;-dS>crTzxFA(;D?7F|NW{XJZE!Ocwr-&Oo{hOG0NZcELzPT^Q-?G9|1KCltf0+HQ>~6mE$6~-9>PG>&VZ5Y`VLB$WxKV0oG4tiyhrUs@|j_|Tx!p||Bac$cHG ztvj)>5=jFOO3==}zD`)V$T!X3&%@2p#|bv=>dFOGtbj?uPN#&{IQIZoce}&j!5zBv z>t}v8b@1TSE~TY~JQ$9@E97MZQaknQ*C};?{m5@{qjD5;?>TvcQtt2q8z`1kcGoZ? zYgxcMio+}x;VUC+aof7zfOQTA@gjU>C0^{~!wVgT*5v<;-r`T`{K_k)E}G%!>zTdt zx@S^f&!Uhq={Zt9Hh2iI&9m)W^+89^$)Wj{%Ck;cTjl#VyX!7zS_^5eWw8DL`^B|o z)HOKE!-4S_^t9FKqEp z=-lpEd3hOGy*1-e+w|PtnVI>Q-a2ZMTG`geR&Db0ji@KTpj_iI=>J&zrYg(yfoOL> z*2$PkoF%#uqNRc7Pji90s!Hvmnh5A7XfS{=6fn4<$k1tuA@tRNZ-C`5wEGCZN3sQp zRsaycHRh)ponBdH>ZthwbI|~GE=rkGUaC$-Mm@y&$|`m0=^Cd_J#A^-gKXu9&K+?e zL|F4@8Pmb)>pVciB8oVS^bq`xBJ*^?l8slxSHe1jKqm^P2)m{QVqu6aL=sz&J(jDp zBhC1rlTX99fXPT zvBeuZ)Ttgq*11I8CE6BlG@7Qo=%nf?FZ~w(>D=j`f93_x3@hk;*`YL#^XGCMKmBY{ zH!SFzHcfApU(k1h5F8O3Jb74tS_jN}=&tOH=&xxnPl4Xh+xYnYjG$;eFe{M7zn64o zYUiExV>P1x-r2u48=JPeXfvLFDDKjXg1?kt_iaR`PnI>=z0BcU`Y@B%Js|FaH)}n# zk;z})Yk7!y%o|oLO^u0&wcuZvoo7`)GMc?iUw`n{l*|zW+BNIQkH0mgLqW$biOC%n+orI+;`-xl+xBYhxZ&NH zCUtxAsWgG9ZNuSO1|P{H#4AfR!aIhXW}w8w;zpu+H>xL=V>S?~5{;%v0|v!~niQ+G zYHy4?))2#pW)>Mip?yM0V^>3|>&D|JUmTxb9^ApJZKGj@;_d}U`UX1wCb0qOPT`_xcumC{C2pZkN} zM&Bd*g|@~j`?Bb+8^dRnwz+f`r6_)z*ltyZfMv7 zd9o00xNTpJ@YbjKj*usSl_|swXbap6cF-Ptl;lvNl}wQ+l$$rdp1(9VcWHk9E4jI^ zCe|4Ojt5$1l%1YXpEGPWV>t^fzyIdlPwEV@-B*94fAl{&L_ivY zKWPu^@V|f-|2$9Sg0#od07wF4;0xe`zn{;aKkr~*9cn^~XJ6OC6_&1dWfSf9WFNLh zJ_yk9=~zg=!B6pP{TFx^$0x(G6aFb*6U6oZTd=(USl+L)HFQtz=p{gShF52R~gDV)AFH6$1=7;Zi#jvP@CA#pLEQ?@0qrAbpABd zV_(aEhHY%3`ulODdyjo>_?dm}*xCAw{vbP|zs(Nnudu_8B0J=;k-h7%jvaBhzz!Sk zv4i-|2Mu}bkij1zNAM2)QdaV3X(^57KEbjP*aqwb&I6Zh_t$E_XD{G-J#Z5DB7h?} zUkgM6$E@ktVLA$LFelvGsGY+OBGl|*aUDA(8ri#I3w8tx|6$!ic2M^QJBT#M%d%ek z2Ro$Q%PCK_3_1;)_#dKv&F93!Y$D$Mg8T{Eauj=B9*Xnj>;>s0dtUmCJ#SAdMIqgH z>|6V_=+62*3Mn1^=n0TtVZjokY>4~A7Hty=ChFvt(BkcS;GO$K{DFk4lj07{tojIuH_fmEO|73 z_r>pj2SMyx=@X=F&H^P*w%{LQ9iFX=cmEld)c#!##CM;Kvf}u^33|t)kegfX)m&o? z$652ILCR*`pNLtko$SuKN;v){<}+tXqo2c4)MGa5<)CHh4y*9q>nzFsynZ3;0iTQp zkUqWsH?dx9$6owru&n%N>HjqU_iN^52xBkSg!m1c@y}p6|IgC@Y5re}-&nRGzpur! z;D6|7M{71sYy(^c+OjZ_uKx`7dYr}kezLw(`ku{_wm$j&4xh6b1ji$6mcgE8EZ#ww zU_08c|3{9Nb!y&!l9$$n8HF!ds@9Xo(>d%qjc6D8KC{##oj(n0(0(c`i^O%nB3uK8 zIXJFkXQVPVP+AQc&>H-<#xm6kw%+#4EbGylhvpD_9XO*oWSLD6{4L9I+-<{R9N)41 zJ`LwHfX%q(n)fZ0IH!AhV52pSn%4$gUj!CbgYH{q>n5nji`ovB`vly3(FRI?Q8xx< z3I;^mG1xLqy{3Cs1lr1S59yZ(Wfnz1cSvaFv}8+Vp&Vi(KG6O##YfY)^p1gq`^6OFVF+}{p^elAK*x^U#sn|wm;fk zT*1!BFX4E?a?Jis{_LnvN7}XMe>L&;BiA*5`){9Hc0cwmdS6Za-FK|Va|By@!>4S9 zQ+-_1*xtv^t4BJo#tf-Dn;|8z8S-(qM%x_UO@(C%jw#x?EJawt`Uq>-sp{WY4$jAG zn_Cndm)q{I#c=}eP1P144;9Fx>KxA$;P(QH1;^#K`)hH09`~l|{>7%N_|A5;U;p)S zviLpLRgrzI^@I}gL_GvY%q zjy3N8PoAsqp!d{(n8Gq@Lhr${2=ZMPU_XEKD7s=ksfo?FZi##d$60U8-#x3Y?f3t| zQPN}Gwn21bTT~bj2do3|j_ulhzs6AtV!I`8c16s?w*en5_W{3Ez+SmK}cmUqn+q{9L}GYJFp2=zuD8&IO@JY>_Xc*_rG>5WGjUb_Ms4B@w6Rh zTaRoF?yUuu<2oG2o4`ZhG_IX-+zd#;MNk9Oaz zo64GtqcHye2Oy7OtKfw3vOElHQz_f~zX{CgL&e4DLzusH?f}+cox5c;c%1}&CpM6v zo6m-etI@~$qki7N0)W{+Rl zb;VrR8*}Olj-O#}>5n-khIKQXXK7Lr+o$p}h3ugG3~R2+Y3#Bq1I9aeGUs8Cg$!k< z^%?AY$b?QgPC_0&urVmJ?34o78eIZtwIl2V0q=en^04LNC+w`am-P`9l&=r^)Nh#Q z6pU@8*H(Z(q47=WX5iTwn3s&~Ey>7t00PcG2G#>6;CE5+n+tWNmIcEqd zm{-TLD|FNg?27I*8}6`x4afO#oX@6fI%;Ehh&G0m;n>Cs)(h8!5;__-vc z%3crq=Wf?Juq5FmFA$QrJDux%*(nv}kdYc06s}h2F7bF9M&h^&^TBE0^GDM@EuAKp z&DS($O*Io)b4@9GTRQ;g#pVM|fh7E%sCk_&(Vk#S#BbRW)OShEYt1&cM>~e?5$dts zLLfT@yO1-Y4B8RrDq?Uyh;6|+-8&-$upL#u`Qu%#D&EAJ`L@`ey(#tJ?vJ1@t_dRG z4LI74NQZg82m2D&|M(fvo1N9UU~AL!>>bQadAjCoi0%-3n;_+}c?MVZJ%P@}i-^;) zmyMJzv5|6n%-dI3ISif3v7yv+f?hux5h z*kU<|y9p(hjglXmF3n?8#3VLMo5<3%tJo}rxap2#7TUYJ<}7QXeHG^~vgavJe%o?I z8-?>9k@r&2ZFq==YhF#_J+7uQmhOq|PAl8h|wf-pAzu5p` zJl^*@=*JJ(aP1BB#r5n3?O|4`O$S|e4A+O*V9i(T9iSC(0f^H67u%}h3wGlFsj`k` zIp}i*+GI9Fo5_l`gD}PtQSYv-m+&v}nOX4M?aJ~5LFuCXn`yBv-*Od$*$&MHwgG7R zf8$w06f1z8c7gtF94E74@D{_x2CSF;E$3JqH?lN` zgRHy59$+9#GyKldbmKJ9XooW0IKEZr1)XVEp04Z1uIkFse+$`VoeR4NT+)2PwhMdM z82U~0V8?}?*ptY>C~E2iM9}{ny3#PlDnl5ns07Y4L&X&)S17C-&#~>Qe3GX_;(fTYMk?t*E55aLg_XeDC{TiXw{iyH9eH}U=4Imz8zY|G(jCxi1aI~RupaB)UTGTS>Q>B?yx4Ap zwf|b{#MV1@!1`!p-#SBoric7P_GRx8Ehq=EAjyNRl)c$vLooXWwCFzM^(OGV=+4IC z{zCa4s|0_$NcLcpaQ`gw|45s|4q@(^A-)2-_bU4Yyx&8D=)|IshWNT&(gm!!Za@Lx z%AV6XvjO;hEb@8-&kg`>Hw|uSWh(7R^kWieO%2i-v6dg;N;24c=`X$rB{-($2dmKlS^+Ta|}R|3G{<$qrTC zpLl)n^u&i($pXN$(>*GSej58x)oFNvzrcHmry|}-g*U#hCm`Y*GxZ%dSsw96l#br7@=ql1 zabqu|t?y&qnN6}4wApQ3|B7#&1^bhM=&y^>2d?0_fZ709sP+kxYb^l}>qX&t4&*aKl@mY~VCBs% zFRC&~8xKudvya&=1SOPi#Owlj)o2zG2_W7udIkchGnDunag6W;k_c z8Lo*qC*2$MfyTHO0GS2!sOq;R`vT}n1;&<=92@=gb;xX97adrt+>^C)*vm4U%h28* z;+`wZ!*QU)95zsM2<;Heg2dC1+dyuNcU{2P*bP0zIJDUkwC8X7B8=5Sw##t{y9Pe! ztga`Ur*mYZ^#8!$q@Z9Uq#?iHQ0b#|O(zuBE+#)(_B9Y%bjN6`| z-If3!+m1_6=FK_}=(OVn<9e*tQPU2*!`n9O$8ndg z4?9cm1W&V@K<65nEkfBgRFxUe(LK;>am>ZE0JPi3Dm~|_8=1axALxMYNMC{Lg`gu(AzgPh4_0vzdAtnT@Lx<{VaD+*CRW7b-siafifJBp zW>Uo@W_Xyc<{?$OftFm2-*+&l%CpSb6pr-Ccsbb{!D*%9GrR-mm4|?{xLyv-1wI0X z;T~vN`m4By{7P_Ctm&wXm6vdR9{0N;!8}~g#Pv=b4+F3oGdTe`H-QqZSY^GgwBXzy zfXh%No~;}UEX4I&IJU(R&sDqxfU1RE9edag_v-^kfhho7{whHyRl?q{G7snvz^kwF z0G_G9aTKr==b)=A-o!cR@yZOK44~iXKI&HKjl9!<@r*r46ZV^nt>+czm{56wYK-fz ztw$5CA0AgBR35b6s{mU|elBVV~-}*-z+`*D=pbBA~x5wgYp~W~@#1(VrIy7!OEyNqd@ohG*~K{D#&M^AjLA zfe%4CyzeXEF5Wo^*o^ZfjNL~Y-2VpkMVZvLKz&U^aXti?0Z@Amu%1_}#&2Obe-EHE zYj7Qee6|3S0DO;%;kZxFV7#kP~U(y+v5qjAw(9?i}5-;VZZn$oM9g(avWumpnuoe^vh)!Q)ik5Z_1h9Wx1a*eXp1TdIEJ zJ#2y6Js3NRBfvv|_5fLKmIE7r)4&aIX<8r#Fao8(L|`p&68Hg}nrebcNDk@&QS(pfec^}xWzg^ z6QDgn*LX(S0GtGnUe*FggIz(GoDGx%%YX;4Peh)2q`^LN%-{>)8N&}YDIBiBVKK+{ z0G@*uf;pjl;KZ3T-t9aZKt9gz0XMKil_z7au0RaX6xa`^l4-zZ;5={>Fu_F(>D-Zr zJMwTJ1fV?bc-}(`;8~9}U?{KvcpJC|+(B>{Jm-mgJqv)*z+7MhfcJY|W^nrfe1R4~ z5rB7l;oV;60X*+rhcO>VAQnIxpB!K!umso+oCHt~p9e6vcLh)uU%bz^04N9WE?@lS zhj;re1NJlKKN1%2X|VtF1duimX#7tQOH1dfF0gz8j27q)ibAj!^dEgd8bvOdCKn{Si)m;f(1|Be0&lP9_qyZy= zCBS~*24nTLKn!36N`YCxcHkm#m$6vn8(Rm!yJI^6LjmL;i~M8X2F?RF8EYT|u>i`~ zU^Fln*Z?3+gKLa6Yy#u}cz?qMz-9o?HoU`FBToSNH!1+ifn~sZ0LmAq1!90SpcI$| ztOfQ17l9ubYs`QMpc60@K>m$414jX*X?&Nlc;p>l4xmi&C{z4N#u8!x!_*NOor0o-eid#&SuY+xL)5;zLnWXvc7u>kTn4g%%^yMW8UEymio z0x^IQ$N?q-YXRil26?wd-fdC7wgo^rumLy?++eJo7C;%>A^&!Gce|m$EC6ZR9RqZy^Adhai*X=Zb-@7B9?*E6h_kojY`s4r4y)&~j z_uT)rQG`VZ$^L8G2yOeP(yCRP{s_(P%079oTXLJ08*VG%+I zA%s3YeaPn%zOQrcxp!vE_xF1|em@@1?)#kcKJW8BfA6{H-rX$)sOz|SU=@I`<2DmA z9_e*RtE&Ylqi!Ks3D$!xU>6~$BhTqu37N1ItRQ6KAb_-b0tSH5AORMG)c|(ucM>uw zAC!aXAOjWwls#z^*iFb8{lN$j0Vwy3E`V~+*iOh~4HSZU&1(tv{U<=qq$T_fiP68|jtHEZlhmaZhU=Y{{U@Hv! zVU*PX+YP%3X+*xpQcw>%!7{K8Ab%tDBgh{?dSnWi2fDx-&<%DG5`}M3_#1`4(HUR? zSOH)o3L8=Q&;%Pz<)9A4z(TMTtOC$O6p8f(gr%fSY)mEf@t3;Ukk19oPioLSJFy@ilD@M%tr zkn>7GEl7cdpbMb<^SS}bpGQDnLM~VWQ2vD(u!xZPOTj9DxcTsDK76{!0s{f;U4(Kj zLgtHL?;_Z{2xVThi;#=q$HfCc6_^g@1K7HFEr6X%`~WsC84acY_;m?%E`iP^u(KdW z@cTmmbS_0XmqrM=9C}wE?Fy7}1uOG zsMpn9gj|ykb`Y`{`LFE@h6Ciib^%xh)`4wc459{#^$f*R2Gwcik33 zt|tICt}g`e;ds8N+zp+(p>y|Iu!)f6uyHSR?nB%P_^|@^R>0m0*t?&AzMv3{1~Wh>SWL(R z1HlL|g^&jafGuDbAuBb2@XFx;KCFcPO6ad#0oH-dU=JY=6#)48&~z{#ECp-9RSFrhs{%3#xB73icn30E8c10G5E2 zU_Bv^Z6{sDEE2fd7(dm{dIl-AJ!rNI{2_|3)n@-i+w>MKshhQzPABT3Ed5_v0*JCugxRm zb?ChTy*E~Y4PXZ$8xh_(5R3p*Kng4&cKkG)2B7!JXhOEY$1Tv=QVL*e z3-q?k1MuO~da#L*&ye=nazZ{w+E(aqO%U=0eESl1zuZE|S8D+DzS=>^Hu$w|5P;LF#@{|(Zkl;H3SBMI*>!dK`TV#BhU3qd768aW3v>h64elmV2w`OdKpKTiO9AZBd7uldCz3jyNLpV2JK7Ae z0IUET!A>IS@Ix;L(9`Dwr0FO_hkc^}j0P#N6s!Z=iDVLhG!yyEDMYdmwvgYN54yk_ zu!TrA;_U$dHtYmg3{XdVGuT5UoH0nf27x*d1B-~%8#eN5iPQ)2eW2F|dixcCDuA;0 zUrwaH2=`qAV5{#&u#-srV5?s_fFJ!}qaXD8Z2&unbbtj)0qhh$nL9lgPgh+!+0c;JNi?j+KX)kG@WM5LjxHFP_X%8_SSeA{2UPPo*kUpZ5NEL{$fbS#WSLJ#l;W<#MSx2N%tBEvv1d+x-_f+^gb`X(j zQRZoV0c?yP0B}7Wai^~&(!{Mqngn?gd^#fq7UE}{XMhDnnlc<9JQe9vQSLP4oz_L9 zGhugnIg!p92;j@v8T_^$?OC+|X|s?v3;AZj=Il~14=e+#!Db?Lh5&4J4hP87IUOXxBCryyCDI(| z%$Wk<=bVLr#i5+JbpU>ymk%}(X;= z27)Ru1IzG0G#9h3FNSCZ7(t>=j1R(uV#9dxaq=oSF3go#GcJPcLU4`-% zts>GtQ0CQxz&avbvyDiLQSP-U=h|IFx^4=9z3b5?H^AnNe$WY!_og}k`%AmP9wOZg zuxFQUjS*=X%2);+?9HXyM*#SUJ-O6H0Q~5J-klk+g-CbJ0LXjy66bh)`BEa?(;qAV zn}~ET^546hNcZIfHrwm>1M11Yc=tODI&Cy}18Kq06DDX@!3PYws`i1gF~fcmdN z9iNVXRYZDbA(5UP4d#O`0KI3o5@{^~1z-f20p^1)unue`(sKk9fDvE@m=C(ZIU z&l6ApMt~V$KIkIS3k1NQ7trSG{Gc9Wz!JdXHi2D4dNCiAf_jhvOTap?l}ImPJik;9 zP=}Y`|4XX@;$KGm%ZOjUjYzL7O1zL5akMA~S90?-B4 z6Y0$nU;)?)b`t5WDu8@%BhTAN@5Z$owy?*>-}xodJIMRa46qEKE#HC8yNG*t0oX;P z_d;MgNP$HFdEbNGO@06$HX&{kY`u^0`?Vkj76RzKzv2HsAM7B~hp_!&e=rCP2k>_@ z!kaq*>h@6~SWcvm`vUm+G0Ob}b@*g4k+u*3{Vi+2X0V$`pF-!;?L_))9+5t`0Mb97 z54wr8HA18>P~H~>0A+nK1!MqheX$a31jzd(biRbnm(ckVI$uKPOXz&Lj!0jHKq-K& zuNDI2`wHc5s{)+>;jfYYHLl+v{LLyNeG7ZvE+x|T(Ez&N!S;6x0PKAaogcOm>Bqic zEs=i0^{0UV{{O6jda#j5JLePW7sUTE1*{>`zXt&Lv@1rW|MUl&iS#RUej5Zf5NS8k zcP|9ni1a(^@%vJ+6Te3n@_*sm|M~*>wg=%obs$2dKVa*RT}1lR03HAl0pbo&FAp8l!pCJ4R!k^%7B8T!pA*cm0umE&{wO}*YMP$VSgTQDI0rSB! zum)@bJBds+Fc4IM8DJh*3RVNyp?ip|!nTTh>PoPd$QsJSvxlt1E}l1JqdzDG+W_=U zlw-n%30)KA*eJu^2vA>x7s=JHhN zO`QjzH+2oz0^q~6zMv3{01<$;oVFCK1zW*xBA?kGApK0FpNaG{SAz8bZ8Kd18v*Q1 zhrP29K5GCN4$u~7@4=tsT}I>?AUuP}4H+UgZU)F3App7&=tk;6CxHD3>_=cfvW4J7 zEntCx06s*gfE0jUbSYQ`Hh`@}Zt{cv0D4V(h};Yvyho5@@GriC$TMdUxdq{t%|uQt z085D6S`Maz`Cu{VB61sSw83r?@u@1XjmYP&BXT?Ru~(Nf`2aRMY60|S4B41fghSLgc&h!6qW# z4V!mE@16{i??u|Z(7$&vSWo2p`UA)-V0XoIuoUbj^8GOYd-tyZ2tQBp(Y= zpUwv;`{~gj0$}SI$j`*UJg^L`1zU*xY#~?xb`g0k@~uU_we~y0ox)JvdbZ`bOztc@*oH@(yE(Lpt{9Xbe?|a*b zya{dg{s1C>Fc8464>u4Q=fm`mn@86tm*xX)G)`E%I$9OZrv zn_H1@>vkf45dq7=E+T)q3hX5ESIF}f@@%s}A*cfj0gFT4uMz%w8G!r^Y<>fq->d{1 ziTv##fbh55h`hZDpuM)km+gq#zJti$!O!pJfptXwegJ^{{Z1nP0KFX=SVQC=Yr$3` z|FjzHCi2g)^YaXl07!u!hKc>cLtf|A8|9SVH7K2}lt6FN^rd4C0fP6QA5g ze7?=Z=U+g4fqLT0n@@bfQh>DJR^r26$`@J!RuiAn7i=UxIvVUGK6N_SKz!O3;?q|V zpRthmOxUn?6JM_w@%2U-`D=-)C_dJ%GD{7FT!Ldf_nhvZ2i`=J9*dENji zlTZsTvp;@!f{=rxUYa0e{81_CULh-_KzdlnD&)6>tU>-s$huS@8$vcnsc*25Ekb<_ zLdI9X*yZzbQPl!pr;za%QhjJy=8q(kIv-kt%RX{|U-$`sd-)F*@d0A_(VAQ*5Ao63!4h~Ewl_W`0WDaR3 zar_F~7|DGb(1k!|Wu1la@3WlOaLvnHz^vHDvuUQ%;CE-Z{at(%l5p10(d_V60(OOR*a@%SW z$}B+nZKy}jR*dtu3L`dy`h<}lMJ-v~S`e2+c?Dhz4fdo7&|t0B!E;w|yR28z_@DXC z`Y*TT-8LSKJW;gt|64liZ^yG5ZjX(IiQJnEna#apqruTg;MxeQZ77@dQvtkU^>juF z>u;tz5iL-Q>v)U@rdvR=mTP-h7=*OFd!h(E!Ei?6-<9in6DG6ZU!0GR2K>v)o{cc` zgY^I_w}PC`>eGugqW3cSZ*}wCJjizW$uQfrJ+0OPOYoX4Za2qc#idJ&HJ1)mNHU_f& zk%8B&eY3i`HJQ*uH(Mt*#@w8L=kq9d+|Fka8)p&ju{##hWD@$8jlrI+7Vl9OYe_Z= z@Oxq49qSiXB3mKZ6+fwr^eEQMFdrwZr^3)Hz)$4l)-H`y)>adFi!?)n^-r2xVix8g zgx^q%I~)G{^91s-BlY|j_eg?wxW6jDDZ7>5mH#ULQ}!r-D1Rz{QT$ysDpMcz(}1MX zJp5^s5LGCpD%Ge?4Qf)0+O!w#P4n?5hx$tgNeAPXIu}TXN{2~@O9P}Mq$8!HXdk*C z-CsHuf8w3}fzadeOOcE4=VVG~U)qlzKo6w-=|S{hdI&9$PNav@!|36306l^pNspof z>CyBUdaP7Q2T9fRI69afPYY=gEv6;3ln$X~bSN#S!{`b0L^_7kN7FI%R63T{($nZTIv&4EIZ98b6X--KF3pr$q=eKewMj`SMeC(@I*Fb^ zC(|i(DxF5pq|@nH^lW+#ok7F2fi}_zjnXFCOk*@oXVMm$psloxCTWVED=nh!G)*(K zgU+I}X{WS=&XI1UbLn}~&C)H>tPg*YBBi$?AC#{g~mmZKF zlvdL7=>_ycI-g!dFQ%8!1@uyS8NHk?q*u@@=~Z+Q{Rh38UPBktYo)c)bJFwD3;1)Z zFG?>-FH7sCSEN^^f70vd^>hinf!;`OqD$$`^cH$6T}E%Cx6?al7rm3-MenA|={@vb zdLLau@23yY2kA=s5Pg_FLRZm8>0|V9x|%*A{UGh2PtvF88u~PShCWNz(&y;&^aZ+( zzDQr9FVpq(75XauC*43_qp#C9=tlY`eT%*=`)IcupzqLk>3eh&eV=|HQ~Dv@Oh2L@ z(@*FY`l;NDenvm1Tjl-a{plC`W^kA{y=xoAL&o@XS$RAi~b@X zE)S58kdLJQrn~5W=&$rQx|{w^|4aWz_s~D+pY$)4{Q(78^{IX}AfF(gC=ZuUl24XT zkw?fC@<=sL4XPnk!CzigRZZ1ZLq1hCRZBiiwbfo~Z#7@-qwc5ful7~@sRyVBs{Pf2 zLF@@dZ>Dsdbm13JwiQFJxU#@9<3gu9;*&gk5dQB&Fb-Lp<1LCt0iiw+@=mu z%haK2xjIZeK|N6&uAZcxte&EdP%G4tYNcAGR;xAYD0Q?tMm<#>tJbQgspHh~YMpwz zIzgSN*2`C_lhiZR$?6n!syaRu`%NP_I_6Q5UP%s@JL4t4q`y z)Em{C)TQdp>MiQ6>N52<^>+0RwM)HIy-U4YU9R4v-mBiHu2An+A5b4uSE>)G537%; ztJFu;$JEEw)#?-Klj>9I8ue-Q8TDCpt@@n$y!wK=PJK~*Nqt#eufC$bD*vwjQ{AAx zroOJep>9;)RNqqHR=d@A)OXeQ)J^L9KEL{b`k}g6{Yd>-{Y2fOeyV<^ey(m+zfiyQ zS?X8nHuY=u8}(atyZW8_z50W?!`D~+QT<8%S>37rOZ`Rtx4KLHkNT_no4Q;5UHz}` zDD{8p9`z6PPxUX2Xp$ytKFzNMv^*`Sg)~K@nyP7l>-{(+6vc8qqcHb^^88>}6#6>3FV zu~wp$YD0WyYGv9`ty~+XouHkl4cAW6PS#G*Mrak5}7jn!(k z)3kBgc&$!5U7Mgy)atcK+8NqpZHhKko2H$qP1nxS&eqP+W@urpL2J|^TGY2tYtovv zm=@P&YAsqqYt`Dcq?Xdo)!MbRmeD%2S-zXJ*;=PIN1Lmir_IyO*Dla5)aGj!X%}mk zXbZGUwac{2wT0Rh+LhW>zI%Q5`BwPu*A{92(5}|5(H3jhYS(GkYfH2nv>UaXw58h3 z+AZ3x+A{4n?RMXDzUO@}_}2Me^u6SJS-V5)((csm((cxlYxnqG)9%&o(^hErYY%7- zYAdyew1>4veD7+jv`4kaw8yp8+7sH7+EdyZ?P={9?OAQD_MG;-_JX!fdr^Byds$nr zy`sIU{ZreZy{5gcy`gRN{j9yIy`{aab!+cv?`rR9o3!_}53~=p&DuxW$J!^_7VT5* zGwpM2tM-NVrS_G!P5WB=M*CLVu6?I{ul=Cy(0cjPu^po{d^bvZ6K2opLtMqFB6urhj&3~qU zy8kTy+5U6*MtCdYyi{ zK0%+T*Xxt?GxW*&6n&~bO+QnguAil!t)HXM(8GFz-l#|PsNSSE>oGm9&(vG=gx;#R z=}A4MpR2d)X+5KN=(F_M{$>8#{I~n>@OSy|^xx&b+rQj@kN;l(ef|~x`~462AM~&E zKjeSd|A>E;|55*A{>SxBeU3g?KTn^hpRZq_U#QR5FY-U{f5E@b|DyjT|I7aM`o;Ps z`U3w3|7-r&{crd;`rq`w<$v4X?SIGruKzv%Cja~X5BwkcH~T;Gf9(Inzs3KleyM($ ze!0F-zrz2Of1Cen|2O_`{oDQD`M>x7;NRi@(f^bGXa7$9O8qK*k^T?=F8_c0zv@@( z*XWD&YxV2&>-8o6KmC6N2>$Mhj6dq-4+H}E;~;@hKnc)*s^6gBsNbY7)o%{ifnI^$ zf&4(9z+Z?m)4=T)#)ZSHDkRq2C`E7C1qFATV5iP+zG(q(2;}&>zuP>5m4g^~dzb z_0{?l`jh%o`WpRd{TcmPeQn@${W<-4{RMrU{-XYp{<6Mae?@;)|EIn|e@%Z~e?#A> zzp1~aza5wn2D%6fV_3iq1`uF+|`VRd^{U`lreW(5}{TKb;`Y!!H`mg$L`fmMq{lEJE^ga3? z`k(q=1~DWdOKVyHR zuhGvqz&Oz8ZyaPCY#d?~7>62%8HXDKj3bOAjiZc##?i(x#<9jA<2YlmalBDz6dA=v ziBW0{G0KdgM!7M}IKep47;c8bwWt?lY8)+kBbQrUY*+!=^$CzuJXUsFsH!d(PH0B!@85bLu7z>O`jmrWb z8kZXjjVp{RjjN1B#y^a!jcbg>#Dl(EKm+IYrz z)>vyiXFPAbV5~DUn?BQT2FyG&XogJ1q^62L z(Wsk-X_}U4o4w55X1>|S+|S(K>}&Qj4=@ij`<~Vb_S!bSZPB15$_2wk=40EzM#hhwRGtV@qn`fD4 zo9CD_%&^&DHkuJLYBrh8X3UJ6GtCw=VYZrWX3|WV=bG(i+RT_8<}7oz*=f!(=bGo4 z^UU+j3(O16`Q}CD#pWgE0`pSyGV^kCp?QUQrFoUP$oz+SwRw%X*u2)f&b;1SV%}ih zXx?NlHE%X=F>f`OnYWp@n|GL9=AGtU=H2FU^B(hF^FDKhdB6F9`JlPde8_y*e8gO3 zK59N@K5niypD>>^pEB2&Pn*w}&zft^=gjBL7tD3$i{?w_%jSCX74uc|pXLVhHS=}z z4RfRUrumlnw%KjIW4>#?XKpgzH$N~xG&h?cnID^;+-d&H{KfpYxy$^I`K$Sxx!e5R{IB^xbC3Cl`KO74 zYD=Ez7d4URG}_-|A!SXYFtGwfb2HSO;4Dt%IzC ztwXE=>rm@3>u_s;b%b@Kb(A&GI@&tMI@TIw9cK-;j<*V}BCFUcu}ZBWR+%-_Dz}DN zCs-$1!>yC7ldV&%5mtpY(yFwotZJ*q8fA^P##pCXW35{2G;5qS-m0@swl|x_6}B3zMk``PttPA4 zidk`MrqyC4tX8YdN?IxFT&vwmTN$gvnq|$lI;}a@TN+*)W|VO?omWi7J)VO?!q6MQ4MG5BWit>D|i?%+GYcZ2T*HwE7heh~aH zxY=54U29!uU2iS1Zm@2&ZnBnIH(R#^w*|kpZnc(Kw^_GacUWE4oz`8}-PUsJ9_wD~ zK5K<_zx9CiptaI^$a>g%#9C!NYCUE>ZmqVSu%5J@vesBnThCa}T5GN6tmmy4LaMbc zq+2hBOzWkPZM|%*59M30Sg%_Dv^H3;S+84fSR1W3t+%YVt#0cb>s{+TYm@c9^?~)F zwb}Z}`q=u!+G2fbeP(?gDzvtSimfj~rPi0Bve3{_x%HK`&HCE_#uRivE z_WpKXyPti4eW2anJ}7i+Xj$mC(Cwi+LS3OdLwAMl4lNJe6S_BaUuZ?>e*0ki5W4_> z#^^Bn@X)HzqxJy%h|ucL6QL(VPleXlN7_e)p0x+sN888P$J&GJ+eG=MY53$Sap?0}F z%swIXm3^W;+&;-Z**?V{VOQ8A?Ml1KuC{CJQTAwijD4y-)~>Zrv&Y%v?K=B(dxAaD zuD2)IXV{bNDfU!*nti4{-9F1c+djvhVTbJoyU~u=QM<`*wqthOo@uw(3A@#9vy*np zKG$xy({{%0P!6$YDTgYDDTgZqlp~ZQm7|n__H5-C=X%W+kS?m6=M5l2BTe zHYKT~lymL5_IdU^`+WNX`$BuZeUUO(IZv6VoUdGbR5E>RXJmnxSjmn#eH zi|tG71@@)(W%lLvLi-B)O8Y8%k^K+*YUM`dCS|E|vvP}atFlbFO}SmUL+MiPRPIvl zR+cOGDEBJ&DJzuwl?Rjum6ggv%EQVd$|~hi+Kut8||CyrS{GCE%vSUGW$0BcKZ&y%f8dT%f8!QZr@|yYu{(D zu__d#?8oiZ_7nD#_EYv6`)T_b`&oOf@}u&T^0Ts2`IqvG z@^59A{amo3HQd;qY|E=?Xphc{1}l=y$+l=qUPWUVv1Uai9&L}N<7r2WRz#8+S8R{B zHHRBJGEt=>(vWCw56_Ak74f!N(e_L<;#liwix(Cbm(dEQ+Yn78XG1rc;S#NgC6g`T zhUBcMRnZu4Z|rDoN<=%k#oP#PI6p_@Z?k3MiAc0}j+R@D>Qs!I6*9MII`N({k;d&9 zPMT{XP?1Q*!j%7;Nwy`^LDZ|Lrm$RGhly*2xQ-OpN^z|c*J^RCajqjp{*fa8NS?p2 zxJ1|)IZ_EX#p6YVg+)V!M~!pZw1+K<{uf&gaef6MMq2x=JSWjc0BMh3EA~D#C#9*rw z`jx}nAyHh+3o9)w^kPcPF;QN9cd!L&nESNG>x@7R^UFU9-4__e($rDeHl?FHJ#AED zvb7Z>iH*~|QM~8!MmYm(lry+}qXrk{F++okg51>LB0b00;G)nd?#tjJEo*mhk&$be zDRJ9O;MNBhDZ)OYMvE?0M`xXMTDYj1j`o~Yn8*hKB(dbGqj}*x);}6v8r5yAzHZC( zu5OD&)2Lk}+U~|V?O8cYuWoCOc@vh$7S)vbsx#pb$mzsl(J95E6N^PB7K=_S7M)lu zI>}!r%awB2gf)anm2|wS#XS)uVb9~I>wu?V|vV2I>wtC${4o;{9~}VDeNEK zOd6A1Kb)GCh?v}F}TR`WOuZQcERAyX&H>YF?=Opg3#2*WCtOO=Iw~#Dq4?4iSds5^L+qDK5H0f z60vkK)Zvi0rjBFId2S!P`Ck^wY3Qrp8NtK>dUH2Xv-e;x;#PtGt+@rWlNF+u7c5cVnD9&ejG! zRVI(?kjKpojE^O8yBaSRg7JJH>*He`*rc|1v?jtGnY{5%1;#sLTNhU+hcezB(Z={5 zu9)sFs z|FlOVZsh(Vyti^*om1C3RKZ!j#IUIj)bU|BA(nIst**?Qz;(3=xr2RzGyNubqhdmj zQ9&noh7~6A(QkT^n4%NB*$~20R4Un)j>;1{oe@=9nKzM_t4_>zyEZY$2RboZ1{0k! zoJ?MdIgvZ+g?o9LUX(kzhLi^D@o<-!ous3p?XBT9)Ge*m=aiUNpPk~xMHRF@YlDf- z6tDLxWz}ar=V^g@*0#a=_6)!B=YW!GUwybEFo}()yh(g;1t*DFI*HHHz$Er~s87nB ztHDX)7Cwo4WKMEB*vV;lVcvwin-Al=taXiH}B*sW--WfbmIm1m*CubeYo6K$IP3EO2 zlU;x4WN3>AG$uOzHYFQ5#ntRRdfz*fGf`?PeU-6zU@CJ}otiDvajc}6PW8;?O?8@? z#W+RrT>Q~KZ>rPdd?=Jw2PcWg3326%hbaQCQ>=)hnjvBl86p;sA!5-OB6d;LVi#2{ z^s2>TQ#~?on$zmjJP*}r*$OBu+HrH5Hz;u$l{uODw4f4W#a9ZK4FWg-3oCw!ut`aw#pQGei&((5(W*iSi~7xl^sakmB+^~s5H8?vXOD006X#hh|;O^U)*ug}=#)SUy& zX;*gI#@X&-=P{J)i7|}bcD5f`O+@)xwo6&_^ypMr65YxqccX9h>{>h$^Uh@jc%AG9 zcsH}sL>>GMm^Q(NOfrRQpn+AGHlTgP8pK3r#x?9U<4P(6jZ8bx*x1pYP#d$&PaD1b zIv(M(r$YOsY{{$k;bTHz$C1yZTUW9ix zjd=DICOZB_JpV!w_v9#&b&4y=k-5Q$b7qu>EBp>b<|LbA{z$T|*(s%TXi$vkJm)ln zM!nL4QE_LBaz7NDm5RgDXpdeJ{tnZGCEl@afDcD2x|e5al=lbsQjhjHOk(9bRg8MW zG0#!YHM5UhUTS_$L0<0MY`oasIa*$6*?G+CQ#z!O#*=PGnen~OdZKLMP}4YXYIdIW z4K90aN1Hs+-xO_Y4m2}&{LL73YIC+RXtSrLHRo<`nt7AwImgyP3?sIY4aG!DX_<8P z%tVdM^v+KLF;+|{h7y?|$7Tg$+*AHZ}Z&=2A3`-hkb>#PUh53?GROLu+DKt~KsJa3x znw3>tI*gZzE7w%wZnfwfPn6>`&6((zbUG7`C%7KXhSizbX3d+)T@B4iW}GD;+hcNK zW}t;RspkPSJnhtS&Ii+Sqp0X zUvcV@2a`D8psnyy+!C0`YaDEI+SbRWa~o^fP+OvjPbs}E5pCxC4YnZUIZv-zTW(vo z@%nHFaNL5+2(HBtGVU2nSmrfH%N+^k>oQ&Pv$<0@iWC5$~L%;;zkiuekEvE6xpy)FdBUyk!hWc4xFEym6L%5pc$A(rq^izuj|# zWVTvd%gTvx7Vw;izs=?>;5k~k#kl7NyrsB3gNvRe=1Y4Uw}F<+JvT_^oEs#?xq-Om zo*NXh#=^OQI65xn?*$Mp5%J=Dpmc~69$Kz7#nI7XP4p+(Z1wIccG7J}SAlkThvvLj zO3P~kDdv4%${Cm`Z`{!AS$g1HrV>2Y8K0rk&vArcySO?lT2-K(-wOD@PKwsv6vvv4 z%y^}$c!5y6J0042sakvPNN#sljdpJ|VbhiKDwVc-E-FlPRu)fk#v*O^hPn^$G!)^f zyK^kXF)Hjh?+mbebKJoDj9f=pyt7CYsh%^~LiThA8^NqY*pGUSVBhM=j#Et4a|^r5 zbZ+yN)a0dkW2ouu7}nA`4MWq}iZjuvxRc3CG1J^-FWk%1^rF9` z3<57Rsc<5k2`6~3XB;mB8MY$jW%%|qkm2`+3`SchBlZkPVlT?IOs>lruT+JJ++~{a z8o|nB>&nxhCAI*09efrAI@l}<@CoDZKzYFqu|9S1^(oN7w&Z$8?kW}R5I67+?vdHy z+H`UnUYNIcHpsQJK|a5g4sRHC^caR&J?^;bxXWd$W3O6?L|&XJ{C9mq0dBjXs_uyi zuQk`FTy)kNF7Bn|tTjBvH58b|dM9rdPf}*N(aLPM%)o3uQDsl%; z%CGzz2m2xN?>*8c<~#toR?56@21<+FxY80&D)l7K$I>!4ZiwgO5Vux^UabmCz0}fS zeMZHicnXLl_*1jnCi!)L6X_W*={-6eZouM@j)&X4EU4W+k^02O7}g%KjmfW?yRV9{ zT9kEaNKqinzenQ#=Io*h#V)E)?4ks!;5r3i;bNe8)6Y?5afma`!6i zlnXoM!cMucQ!eb33p?e)&Pb7eq{u%~IDh~Nn;9E^%% zVsYiQ)J32%kxWM;ArUH4T>+adJ4bfZ%$yi^(JHDb5-t`A7mI|8MZ(1*;bM`y;Vkyg zg^NBA0y&LdEG!iZOU@@PMK#63Qn9d9EG#*%Jdy4;x=0@;>}3`s$D49%r+E+}jwhjKX5Lq~)eL1EWOv=6=~xBFZWe zWtE7sN`!AEqRbMvjv`zo>{N+5RtY;*Zu(F>PqVMjT1;S862aqUqxbFWBEgmXI4Sx)iFK{z%_V}nvn6IEIPlIN%VzjAeVKr5~WBb-j&AIDpk(@SF8?y!HL*B=?eu(`0o3P4W z|BJ@e)3L^E$Vw-hGMI~ArL9=FJ(3%t&55?}-C0%YoUpf-RTJ5xJGCt<+xYkx?qIoh zi>7gJKTPAELw(Soe{-8o{Y|9eH6~ha-#c<9cgMn-Xdjh)JV@>nX~yTq;u$=ZiWXws zSX}6Q(Ti)9KibjGzc)Z&SRjKD5Y0{OJsb>oU`G~C1Y_-U zX0^q`fwnM_b{#JZS z%Qp~1hL)9-1@Oi{oC&mdq@q!O0xxwGJOVp=zfe6Mh@0ZGqL^Rp$-(^4CWI(6iUZCd6LqGlT1g6XUsI^v0S*oG%g`0Yo;m4^Rg=nVd=~Q($nbP zHYP;bYefh_ZZXrO3ww?)s$-RxM1?z0)`V3auR12VtO+YTphPI95TJ2s`wiKr7a8*p6Q!b)_)77z0xoe0&*%pF#-mZ2c0 zcG-eOTC10)I$0gPtRFmV=Q_h{i02#2K6 zh?=Mr%)Sgu%FlXGcyE-~j4cP=xXON(>C8yS|N)w#4e7p##i zGUZ&(buL&OS!CL|;C&1WbvTz<&Skc9!RpD<<~WzR{GvEZFXEk*mkDeYWtw8mW1?7v zxy05|7U!(TOwUD|&@EHRhU5jk)NIHYVnbXBNyI&n)b8D_bF ziMh!2SW|F4$3-qW4Z#(;i(KNJ!jl~r9ZkNzGBL+R7R+^#g&h~0aO3ALa)G(X1mPkR z9Ty#mxybdHi(Jofk&BLtT#>uT6)_kxv3Pp~+l5*9VZP2xEX{UQEREfDa96@EjOUD{ z*~oE3m1&DujgK7>FmPkT78dVlJJR@w)LF6dO>bj362@mad3d7`O*Y~Cuf}9YTPE3L zgd-7r{+h-Z#nwI(;Lo|byH$2xxb}EtS94ybzzkj;Bceg$61H*p3A~iT56)S%>b|OI zY;B;HVzQkzi8`|wr&tjPxhLV+%j4OZABv+u9nq+ZP*Pc8LN+?s&-mc27&e&9 z823!11=||Zc#9d;+wfgi=J$x3y!HD)^S4H&*_W-chOBBU4|S$LemR*Bj8jv~f` zc^LDEup)S|AH^3+cxjA|j6_W*qKR#xW6^j8xoYER%JIi!*PE=vr zB~&XK!G5SIQ^9JkGpQDPC?3LwC?|vu84#@E+d`h)+fB}iqkMzqnU^VtbPB5M9$i(&vW|f(L6WB8mSMKEnJ)iQusGK7EdXY>o zCjlp9+>jE%5aE*Ak*acK-gKie7aY%cWwJqLlPB;k9CyX@f=79c$+e1k9Ct6r0UpWS z+siYa;52ZykltQ3f1Oo2U|IU4O5oAuUY z94tiZMG6ixdxUM~NspLbyzV`s)Y;*7+zgs0;*3UROA{Xd*mIwdXR`uS9y5_m{iw=g z9JwEtCtx9uL?e}0_OK2)Df#$m?r8gHdBb6CCL%#WN;SXU*Zk(M(U_ z+3`JDyTXk#3CF-(f%i88yb?TsJ3tDb9X7V~PQf7VWc(xm)0iD;1sm~*-JVQPJod1g z8E%nz$rM`x^TP=&nmA!WR7-S@^YZV22KEz+ZI!&y$Mskb`iIfycuCRNGCQ7*j>q%5 zqs4vb`+rNoVJV*J`5}Soh`hf8=u>=i7-cRwC2Q^cV@fAr;HJg~9~O0X0?Wr$eLR(& z2u4Q=;aYd5W0>_wcIKYb{obm9?}D-HX2N*XZp!FxfV+e5YMOD{8)6qWhVfNedvnyO zpT)bNmPI&Y24|$~T@41PGd9^RHyfAcLz2ZQ6@wjxh=LCdd5cDrN>9Rfjv}twlkjPy zh#TceqdjSiC!Oj^V?C+XlTP!bah^2Zlj=O_bWfV#NfSM(-jgPI(ixsK*^{Pt(o|2H z=1Lmhbc;&yQ!!U&n?@n)&PHE^oI^4%fYIsd@e?yQkF$q#Lwu*_>N%%rBB>Ym!1+8; zL|N=%gPjz*8BF(xPAJ&Ub5o9n#rCebS!}*r&5bdfV>{QT<(`qa5xuaLXuxWON$Exz z?rD|N>6&v^;si|ZxWozT;><#*@?E@JdvU(uBw5+B5GMlblye;71Tk0mly#lpldES8 zn;<=6oJG24RQ9gnTFTG8d$^I91=HWw;uQCzcnFX!|XBN1boDu3M=FS3@ih@dkIM8KN`A}nTstLhvuh_(=C3{EIJ3xuva3tYqQED+(G zS>VQGXMu>xods@G&MXj7J!gT4432bus6(!rhTjCzo(yM#RZdK(+IbgTwj|uP(GyL`J%RBaJ1pO2` z1MghY7&r3N387YO5!j8Cn<=W{FB0%=FMrvJD}QN1&BzqSoE;<+lCX^biSvkR8!XRq9R(R3^b*vF6f!J1einM@&Cg~-1_gB(b+Z&wul zFLT)!MN!_W{z#rY)}g~iS<#V9PU;9s8MDu#;qB^lM?mt$1dIA5k!*EnCKRoCz@(Ta=8 zOWn^KxVOPsPVf6?&uMFOe)OWO-1(7;39PemVjFD_Iyc%P%0F4=QT|js6%Dd~&|p+t z(L$8h-pR$^a5|r*R1B@DVb+Tahhh(apEhxd8i_|i1p4N5raKt;(VF|kRI&Fd*AVYh zuCgLGwZ!|VtHk@LtHk@LtHk@LtIW$=GEC=R3c4pu-ZxZbb~VOAyeXc2pKMRl#RDh&Q{6`#HhAwbZd`?_IZAmzDP)qY5)#-iS+xM>DSI?dVTVeLB>ss62i|JX)L6te50_^i{+roFz$;Mdr z+X@Tc7xH5?*RE2HZ?@uz;~MAmfhBzT))G$Ve*D&lFQ@K-oSUmR%@9uT*UQ5kimAhYs~h3QqGMr*$<55{t^ih-rJHGdR4ty4gY@V4b8{5E&sQn zSEIM=GxSP^I=h6Dq0Z7@QdOQe5vQQ7;b2wV`2>=W*TBSZYl?sRTv$@+{LoN|*l3hE zt3E!3bAAa)Nli_lh5a6xU@N}=z#C+_t%JK>GSu0DlnmvcZ{e4vI6IY+q0a54WGKJA zAfDew3QMYn<>6qJ`4SPn@CpRdSzoG#2H4k{MHc^@&^cbE=e&Ci7>e^% zBq)t!NhT(V9fDH~h2nnDrlw{3C-4XK;+4}*Lx-6%(_ZwVe?o6M!(}fzowgUug!H%1 z@3%)%aN21bPqgo|@4ox-?6c43?jH6LN|d&ko!3@0_SKE*lCRC#?7JJKl1~vh8l>58 zzjpg;a4cg(+SaX`9r$h5UwL``1|MGCdKKXhOpEVfYitlX;DUu(xH?X1t2wwM`|;N)Mgr~ zZ6-v@4LR<@g^qR&ym|oY$h*2%X9|2&~gkbXKfvz*#jMZ28cnz zof#e6FKOqGW?$dB0p0c%w;CKPn#g!Z1~wcZ$byP&a24;a!7d>Vs^T6|UvZBpQVycx z-cZ0COvSySfQ`(N8rdSXJ)%f$=^?eHhm^>xmeXN$)b`_pIf1u#IGz_@oaMu)BUyVRS$W(l zTX}AkMQU4Xk&^HEks%bYtVQubKawdx>k#kN9<4;cr9CoxKN=mtK3d}8bT&9ZE?ak@ z>0wv#OBm?V#;sGkvwPxDR!rIjoFGw{Goy4eh z5~J2hjGE#F<z}CIs})pjP&ZhjMw#}RghyvIG};McdmnU~NZnA_`GmYIUwXuz2q4LBns zVQ{1wAJxj&%#Ui$*hmyGs`b5Qbfg&_i4sSe*^y>wG_0V@FINI~w9w_aBMyeA$=nfn^@@N1{AJ75#o8PfLJ-gmKip||O*I&D}g=5^{{5zjK znw{-8AM(N$Wu!)r6P08Ek@u2cK1VlZ6?mKpsaOb)GXWM0;c+Iw{66rYFJQ3{9`prl zM1|C*2&q_z4*J%*rMQ+YS=ZJc7Oj|oPN3Dbn1F8Rt#w0hts8o4E+TxV#U_%dMGCb@ zpw>aKS_i>u9R#aov(`!N^Gq9sI&yWXu!08d(wF5bL#MT%LCtG>1Y@8(bEq;%@LXlbgAiEdj5fjimUuLWA zwr!A`u_rCFyf-|@B3{g5%Gc>=8Clj2vVw6GRqX8GLu;o>YkP9Xec0g>uWTH)Ed~_N zsP4FRe$Qv82$d=|O3Ik=XvTG0$5m!#cSlVpwDMqBr*p`dKU}cWnT=ZysRdejX?a(# zHg4_3-Nr3!xrP!t?ho47J1?cg?&fy&V)us+nLzYnr^gxX;<9YjaHgE`5O&x2o(V#2 z55eiK;qUI`ugu6E?CowEIu%f`t9K{Sr*f0~>tNe=u!Z4P4z}Rv$L-gS*|$60d}Cwg zMH~*evvlJ{9OK&(aK`{(8;8k6(x?RVi30=qw<7?Y*xgL_d}idAspn->w+@ftn;Uq2 zQZk0uMr0aB=KicOFTJs0Jg`y}u%hBoRa8Wf(tfNc9stuHSWz*l@Usv0z2h-%z~qsR z;-~_%;Cu3#$`$)j-+3MXPC6EzE>kf|Is%$>^fT$mXVN7INtYj_5_-~Q2T8}ela6yI z9pg@P6jXsHmvR1|ygTxYbrq=?A?5f2?|;X5Sq?XpaU8ODBYAUG=@Otc9tU}5;<5Eg zUL~Nn)GPe)(jdGyUW#^@y7C==wgdR23~?2Cc`Etpe-(vqT{P_~iu=UxTpE9;e4Qyz z>W`zW!@OvGn%9caVDyVJt)ij{nEk1!a8|C=!?Wmsg)jc>0$`ShhsyBhb(}xx?0RB( zm-I6YNk7k!^s@{}KR=RqNYSN%@G#JLq(~PYW+oO{XuH&BDMKIYKkjT!!J@(T=BWR2f1?IoKE&jK}LRQ-|7V{`YM;4iw+~# zAN-4)x4;wpSU26lu^6@l%N}R8&uar_#^T58<)Y!&Cj0 zQ*gnH{(Yfu8A3^P85E)p<>Gbn3CuI+HIDIU?Er74iy^gnLu%@A!oth+iqs4Yq?#w* zy#QGAL^=Yjd2*U3(lhckPo!(WHcv>^KJf@x?K`z!=z|6h*o)eyfdg3W)4&0&_G#b% z7M;+*0W3PvO>c4>SB|$L06(0EO6IrY?Fi_W<-4TY6_RdMNaZ{7YmkBFkH4pZ^+vdo z8Sk`}07vG?NA;@{Nw+X0{aQuRuT&)dIt9>d_{UZR>ddb2BVEp(^s5yqN^WSYLeLh4 zsC6j^Ii{QSxx#p&bBgw`{WBF4PByJ8?J0ijM8{6_?r6h8KV&@;p`>etlJp7%)W9~?uR`C{ zN2|bjMEx2!uNwk>#ostS{Fa)=r{6wHa;&AIKQKlp-D*4XaiU1qE zBb6RVISE+$1?44Rn^&YpZ%A!CNYy^&CSaorq-vk?GRf{ks`e=t0jqt=N5IlAC?^3M zeIix+l805{M_ezkZwfv|4~1^Zd{7?)eQCb5j=bFT6@5*ZN3BQdy?{yIj`|zy9MX4? z9TST^E1#XC9#?tseP7nM)~BQ1hk6P<*t`KYe1XhF*VO+o-|DaI46pU)$xor4vVWC) zg_Yv7a%4l@WPht7*Gj#zOC0q`sGlt7s5gSHxh}DXk#wuOzY@!%pH?2J#-X3JOZxf7 z!~i+gr^Y9Da+3QuDFBfacu2(_ARWRiML7gJhV@5~*sjKnMGSo6hojd>RR=tgCyU$8@9A&&#=hjij4Pb=wdmE!jm zw-Ts#JD|t!3j+YAGq#Q`nBawMuq}WMP%p?_k zLot#xmiJtDf&3HVmh%{ef6x7aRV1Ckei8ptI66untBRgn^dZs_#>4Va^ouR)h7T|M z(3klwa+mW9deZt<{a*T>=WaL9lk|XMmq^aKvfiba!mwd`x@$5qAN>+v(eE6k!ataz ze(|+p?@+IXJJjk!s`W#84_NDm{1~v-5BW7$^Yz%oT0xP?mzb1%Rg6Xzg8uGd!_waxT%QiO8mxY9XrvN zEBvGQ8|0^O#Xli?5IYJ)A8NPgAN(HTTKLue*hG3nzUW6W#iUqbDsn&@50b*usmM?9 zw@UVr*Kb58(i`gKdaO!&+_ece7}tX<{oyW8*k{H+kxHHuZxBbC_p$w@{;HlRe^HQL zRF!qi4GgfGjGo~}EbW&1#kcf3vq>8yQqgC)-wyVi=urGUYMn;n0q!HN%P4;8W$#7l z2~l!57QRdS82z$!1vjGRi*_IEOvy#PfRKFwjM40a; zXOW72HIGsHUX+}Sif2X5OVm6>>Vx>c@FVFr#qTZsBNn_!Z;0|YMd^1@e(ESaFN%*u z`N5+6m{EKnioPQ4Q|L|NcSZhbJywcORT_UKd^q~CV1HYGVFuYc0Bn31u+<0H_%l)) zA5y~;-rKrIDwyjGu;CNs^ga6txa1o>12+DO)Yb*QQ$M&q0he;*FO~dD@&h3Z$a!N9x-ihJBt_q@qLmd9YoA`OEY_VjQAZwhLJF#`TB(X4LniL8T&=a7eGH6H}w{bOY=#-1Xy%Y zt>}-91L1e85Bj&#La(&@yr+GGwDgDgDE==D$mUsbC)gVtXQlHOg+~D=B?B%4Se2Y!CoEQ2)F^EAm7@<%?MU6bQptO&BcY(dW~3>Arr769jPq>R}+bV zZE`WELQ*l>wHc`{&NDd^YC4zT%QfU8HfH@qYDDN_ac)U?dj(HwE)tYeKZ^1tqV;l8 zcx|4kNt|fM`UPU;;+0SXtVKvBk8;F=m^@(4nwUIb`yQzlcOgpR9rI)T!h7OXLIALs zQ(-C;z9?_yka9l6YygXRi?HS*bv2y`_}$}DpO^#}1$>}tpNj%8=YPC7NSvrg!ka&LA39sp2|Ds_}E(0oM2x+`!HH#($ig zf5J1?oz?5LX#gpitTqh*=KMM-EoD=Igd2pA_zaB_>|x+KP_Pp)-0j$)_qg z=>nA+2s5J($W*Hb$e0c?@`IGaAY~;;`3f?!gOs-* zV?W5)2vR13l=D!Oc5U*L5QUiG{EdaB@LzGf9#Yci09uGrqZ8zdFKGU>*$?@KKcwOd z91md81)Uw3XV&Lb&QTacs#-Z1>8!^|Npj@B@Ch$xaeF~xNHHX2tGL+a`O!HRWAEjn zM=|!wQDuUs)n*@Q`MkX6D9=-+@eq?X`tx*6qCB~#wo(EnHk?c|clom2+Jau&MVJPl z>joTR|94(s5IX=yvID?0+yO8q1Ni-}7Z}~{Quqbnyg56o;_j)q17I*a07kR}U|0rl zj8f;%OYd2hIk+rya+#bI-V;j7WpRpSar$L)SiC20&r#EWhC)hPCdc&4C12+0vdq$f z%!q;dvCNf?=ma^%a^c9L)N@o{p`DU*oTJ+uQB=;!d8xDKM6u^Yv4g^S=+1@W#qk80 z3tE{z=sT?_Tr|XS1xYd|Jjnd@K^mG?Bw&@-_~oAQ+OC3BD?u8V+=<91%^_}P^Ww;v zL5t$Rxts{QRZvZ{721m zq$Kr`oDwPf8!1TvbKWB74KUYQq$CAQyhqVRq$EYY+NUH1%yDX4osX0RNVyiHG%UGy zkgtA-4kE)e$QK?IrV+=%?s7`-60R2KLB6${oVLF>N-n^ZppNDsU~3Pl(H&A7H&V9e z#Us3Uj~DN`tZgxFoZ7tLJ8C-GehOIq3$+;>p<+TSBzQuBNn~QY5*;CQp2-C!G;+da zLNsE+kdRtPghrM`winr6WP6eAMYb2&USxZb?M1eyO*c-PdYm@(DAboK!@YDOxo$+_U@+(W)*Rl#xvbCXlBTzU^+wXa~g zHen)P?JHRB6fBosg!gKn&Sk(x%}8zaVv~_k4>sl4xM4&a_rm5GrQ|N~SqPT1(aBzN zWs`;Um9p7ik`2BL>mN1`*f;?jHNlsmc1!R=n@w=PS;i}zbb2p4)hYPkwMoj$>FX6- z^xE|5<*fJPU>E!CXPmBDMKKYV?WJ<_)PV1MHv6f~vha%- zy~EyPJvxkoa?~c}WJWpmQ$Y(jzd3&FUN!vba1ruV5A9UI_8pGm>w9VUPFlQz)3EQv z&$Zrs;X{RADY)n*-@JmHzVLH7o4x1&hn>mi6?FFs!g~eZz3AABj(zb1=#YljCZ{0z z6%@3KlFwfB>#2RhpCGwWHZO{fy`1S@L0B(7;>BmY_^vO(Sp`46g1Vl39DZ1hNAlWh z-O37q`-Ji_h`$Eu3xQS>VsgZ9(B^`m&ACCF41zWn$jU)^%Cn%&20@39f;P7X9To}V z??L=MC|DJ=IY3qqVuAF(1O<_Tg3m!g!JwdE&?dj2U|>+NBuJhH@zJ25MNm*VC|D5` zR1Vs#7Nq9{Z9WUyOdS*~4%G7yn<3v1l>d--M&C${o{>_YESr&ng3>{oTY`eqp=>gz zM*!bZ-_vF%z|{9DZdL$n>mtd&h1BQ>sra+>oG85_O72JLJyHBED)<)_oQnzqM*6dH z*0Z!@bb$JepCC1UhLq#g=5)Xuulz88jh`Wv{z`cdnB&o5UBGIG^oPCX8V~6Zu-Ydb z0#^H^L%_thqqPlK`nwJtYV$bqrN5IN0o(dOs`hp0P@At|tryPPg_5o{P&3;|MJK0 zbf=ak{^FN^`p&VEf8hB}YpOMI@4$~bGn4-^@r|AOTCEOS`IXo`aBZ;IwEInW?Z#p=(eKUo<`26a=Q85!TfYCKb>2fTU%XSoddR-nc+s$dUmC0 zUCo8(0nc4+K9rw6banmhqpgix;_ZE{>#M7q>#I$BVRcm_SnY0NJiWo{VzaN`P2Fbd z%sR%je|T-B+20#9o!$U5fKS#In`uKgFwx!I-hX}2%`fwC=h*%Hx9O~x8DQv{m9=Yg>(8#P^j7CryUnHNR`6~v<3(LrZ1(q?1H**}tqD$Z2Vif| z1G)4D>&?XV8%=uy9clKTU2G2YyScZAF|4W9breB=FRiWSB5Sqv_F(_Pfy1p~8l0UU z6V9RjUP78-E$sz#VThrxb<_RcdY)86c55zANYkA|Crd9ewY~M4P0YT}=gs5z3LlS$ zw)>;Qnf`l&w`ONrlL=Ea*PCBG3nD(!-=3IA&E|T&*c|O+2;FXTWcax}GCW|0nxh$d z7SK_fuVbj_s3D~b9BiQD&9UKH_x@V9IR>;XHplx{pI_OY+N@U}Z)Uf8cNd!z{j1Nc zTz!t2bMweQVfiQf+pXin7gn~9A0IaD^+9uNAul!Aj0=S22<+=>HYu?wzdnnZoT>>qHMo9yYC~AGF(T zTZO0kt?kxCdVZxj-WzmNa~R||+XKmg6i*^&4So3QM;~psjtAuKd7!(;H;?gk(XWqSd^zo5d^vp__n|AZ zw|=3QIsAWH0(809_%heqho@5}y~ds0-q${rR=^$eEQVd^dA~BT-(9wzFQYcrlYW(7 zfDJvgw>iIc`Y$1ITdn%(-i7VhK9$FM4*0+T9{SB1R?Yf_#pZl}>5+?z&4vG|C@6db z#h=0ywN9VuE_JVD-T>5o_Wu1Vy({2FE0BO-zYt9q+U-*(f#FYpiJfj9L9r?D)iYLX zd!{vL4hn^drW*VzOrMt~qW-gbWS$S)!yRSR<*3=XGKDau_ zEcYO|H`+%JdZV>w8neB3-C}9A7bu>lhHIO>W*?+0xZc!oeGboSt6&uG{bn6qgCOXQ z)-TNU(837gL}IO=zK1k|j%40EjYW*f*aw1xD0xp$P~&uI(i0v4N3m(~pXny$61>AZKyWr{C>e=KDzj+#e?E7#^AT)P)n zm$s|+Nvzw;d)_`fcWuwx!JfC}+uilO_lse_`NYER0_CI9VBK#%xo{ukmuc)iR{Hz( z4HLT5ROn)|A!jmvf|y^2rZ(WvGdcIL(w4CDIG|B~`yhl)rhcRR{~bwRc^HBHU#K|a zJM*!Ny$f^myXa+pRsFmI2Kjb@C3&jJOfxa^^(V1=JpYR+Mm zf9`$qucEs4$rH_al=*zWc?!uFG8Pli-5o(17i|4{KNEEG1)%wh{Rgeq2oKlr(9RFf z^dGb>=UF^h&U3lU6});rm&p$=6hl9#5)p&Zz`jww1FFzetO0Fm7iX=VHwO&^IA#@tDip;bSiIhLy=La+%-8$DbP4`YnU(i@SWxUwoU7 zx%hWb&!<@B@9;4f_%0uFf$yR0)8qPn*C4C!`+UsB@9{Ag|2=&9H0%3)KIQ^{z{gzR z4^j5hlvzBrE zd!1K1U+p|Iou-#NAKgDc(K)CWKbU@FdTaViQ&*=xHNCX&@s_u*qFd+O4g8_!!wyvYAuI{y9X+tV*jKR0z{>iqP__VwDG!)M=azx#t`>dzqW O>$mo8PPgj1)%q{?D11Wz literal 0 HcmV?d00001 diff --git a/includes/Activator.php b/includes/Activator.php index 40d1f34..6f9ba6b 100644 --- a/includes/Activator.php +++ b/includes/Activator.php @@ -12,9 +12,6 @@ use const DOING_AJAX; -/** - * - */ class Activator { public function __construct() { register_activation_hook( PLUGIN_FILE, array( $this, 'activate' ) ); @@ -29,7 +26,7 @@ public function init(): void { // Check for min requirements to run if ( $this->php_check() && $this->woocommerce_check() ) { // check permalinks - if ( is_admin() && ( ! defined( '\DOING_AJAX' ) || ! DOING_AJAX ) ) { + if ( is_admin() && ( ! \defined( '\DOING_AJAX' ) || ! DOING_AJAX ) ) { $this->permalink_check(); } @@ -50,7 +47,7 @@ public function init(): void { * @param $network_wide */ public function activate( $network_wide ): void { - if ( function_exists( 'is_multisite' ) && is_multisite() ) { + if ( \function_exists( 'is_multisite' ) && is_multisite() ) { if ( $network_wide ) { // Get all blog ids $blog_ids = $this->get_blog_ids(); @@ -79,7 +76,23 @@ public function single_activate(): void { // add pos capabilities to non POS roles $this->add_pos_capability( array( - 'administrator' => array( 'manage_woocommerce_pos', 'access_woocommerce_pos' ), + 'administrator' => array( + 'manage_woocommerce_pos', + 'access_woocommerce_pos', + 'edit_wcpos_store', + 'read_wcpos_store', + 'delete_wcpos_store', + 'edit_wcpos_stores', + 'edit_others_wcpos_stores', + 'publish_wcpos_stores', + 'read_private_wcpos_stores', + 'delete_wcpos_stores', + 'delete_private_wcpos_stores', + 'delete_published_wcpos_stores', + 'delete_others_wcpos_stores', + 'edit_private_wcpos_stores', + 'edit_published_wcpos_stores', + ), 'shop_manager' => array( 'manage_woocommerce_pos', 'access_woocommerce_pos' ), ) ); @@ -112,7 +125,7 @@ private function php_check() { return true; } - $message = sprintf( + $message = \sprintf( __( 'WooCommerce POS requires PHP %1$s or higher. Read more information about how you can update', 'woocommerce-pos' ), PHP_MIN_VERSION, 'http://www.wpupdatephp.com/update/' @@ -129,7 +142,7 @@ private function woocommerce_check() { return true; } - $message = sprintf( + $message = \sprintf( __( 'WooCommerce POS requires WooCommerce %2$s or higher. Please install and activate WooCommerce', 'woocommerce-pos' ), 'http://wordpress.org/plugins/woocommerce/', WC_MIN_VERSION, @@ -151,7 +164,7 @@ private function permalink_check(): void { } $message = __( 'WooCommerce REST API requires pretty permalinks to work correctly', 'woocommerce-pos' ) . '. '; - $message .= sprintf( '%s', admin_url( 'options-permalink.php' ), __( 'Enable permalinks', 'woocommerce-pos' ) ) . ' »'; + $message .= \sprintf( '%s', admin_url( 'options-permalink.php' ), __( 'Enable permalinks', 'woocommerce-pos' ) ) . ' »'; Admin\Notices::add( $message ); } @@ -263,23 +276,23 @@ private function db_upgrade( $old, $current ): void { } /** - * If \WCPOS\WooCommercePOSPro\ is installed, check the version is above MIN_PRO_VERSION + * If \WCPOS\WooCommercePOSPro\ is installed, check the version is above MIN_PRO_VERSION. */ - private function pro_version_check() { + private function pro_version_check(): void { if ( class_exists( '\WCPOS\WooCommercePOSPro\Activator' ) ) { if ( version_compare( \WCPOS\WooCommercePOSPro\VERSION, MIN_PRO_VERSION, '<' ) ) { - /** + /* * NOTE: the deactivate_plugins function is not available in the frontend or ajax * This is an extreme situation where the Pro plugin could crash the site, so we need to deactivate it */ - if ( ! function_exists( 'deactivate_plugins' ) ) { + if ( ! \function_exists( 'deactivate_plugins' ) ) { require_once ABSPATH . '/wp-admin/includes/plugin.php'; } // WooCommerce POS Pro is activated, but the version is too low deactivate_plugins( 'woocommerce-pos-pro/woocommerce-pos-pro.php' ); - $message = sprintf( + $message = \sprintf( __( 'WooCommerce POS requires WooCommerce POS Pro %2$s or higher. Please install and activate WooCommerce POS Pro', 'woocommerce-pos' ), 'https://wcpos.com/my-account', MIN_PRO_VERSION, diff --git a/includes/Templates/Frontend.php b/includes/Templates/Frontend.php index d391897..200856c 100644 --- a/includes/Templates/Frontend.php +++ b/includes/Templates/Frontend.php @@ -3,22 +3,20 @@ * @author Paul Kilmurray * * @see http://wcpos.com - * @package WooCommerce POS */ namespace WCPOS\WooCommercePOS\Templates; use Ramsey\Uuid\Uuid; +use const WCPOS\WooCommercePOS\PLUGIN_URL; use WCPOS\WooCommercePOS\Services\Auth; use const WCPOS\WooCommercePOS\SHORT_NAME; use const WCPOS\WooCommercePOS\VERSION; -use const WCPOS\WooCommercePOS\PLUGIN_URL; /** * Frontend class. */ class Frontend { - /** * @return void */ @@ -47,7 +45,7 @@ public function get_template(): void { // last chance before frontend template is rendered do_action( 'woocommerce_pos_frontend_template_redirect' ); - /** + /* * Deprecated action. * * @TODO remove in 1.5.0 @@ -150,13 +148,11 @@ function ( $store ) { $dev_bundle = site_url( '/entry.bundle?platform=web&dev=true&hot=false&transform.routerRoot=app' ); /** - * Add path to worker scripts + * Add path to worker scripts. */ $idbWorker = PLUGIN_URL . 'assets/js/indexeddb.worker.js'; - /** - * getScript helper and initialProps - */ + // getScript helper and initialProps echo "" . "\n"; - /** - * The actual app bundle - */ + // The actual app bundle if ( $development ) { // Development Mode echo " +

+
+ + WooCommerce POS + +
+ +
+ +
array(), 'em' => array(), 'a' => array( 'href' => array() ) ) ); ?>
+ + +

+ + +

+ +
+ +
+ + +
+
+ + + +

+ +

+
+ +
+ +
+ + \ No newline at end of file From dd5286802cccc8986c00bc4c4bff2a4d037b2efd Mon Sep 17 00:00:00 2001 From: Paul Kilmurray Date: Mon, 21 Jul 2025 18:42:56 +0200 Subject: [PATCH 03/22] (WIP): add state variable --- includes/Templates/Auth.php | 51 ++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/includes/Templates/Auth.php b/includes/Templates/Auth.php index e432771..7ed6b56 100644 --- a/includes/Templates/Auth.php +++ b/includes/Templates/Auth.php @@ -19,6 +19,13 @@ class Auth { */ private $redirect_uri; + /** + * The state parameter. + * + * @var string + */ + private $state; + /** * Error message. * @@ -35,8 +42,22 @@ public function __construct() { // Initialize properties $this->redirect_uri = esc_url( $_REQUEST['redirect_uri'] ?? '', array( 'https', 'http', 'wcpos' ) ); + $this->state = sanitize_text_field( $_REQUEST['state'] ?? '' ); $this->error = ''; + // Validate required parameters + if ( empty( $this->redirect_uri ) ) { + $this->error = 'Missing or invalid redirect_uri parameter.'; + + return; + } + + if ( empty( $this->state ) ) { + $this->error = 'Missing state parameter.'; + + return; + } + // Handle form submission $this->handle_form_submission(); } @@ -50,6 +71,15 @@ public function get_redirect_uri(): string { return $this->redirect_uri; } + /** + * Get the state parameter. + * + * @return string + */ + public function get_state(): string { + return $this->state; + } + /** * Get the error message. * @@ -121,14 +151,21 @@ private function handle_form_submission(): void { } // On success, redirect back to app (or fallback to dashboard) + $redirect_params = array( + 'access_token' => rawurlencode( $redirect_data['access_token'] ), + 'refresh_token' => rawurlencode( $redirect_data['refresh_token'] ), + 'token_type' => rawurlencode( $redirect_data['token_type'] ), + 'expires_in' => \intval( $redirect_data['expires_in'] ), + 'user_id' => \intval( $redirect_data['user_id'] ), + ); + + // Include state parameter if it was provided + if ( ! empty( $this->state ) ) { + $redirect_params['state'] = rawurlencode( $this->state ); + } + $target = $this->redirect_uri - ? add_query_arg( array( - 'access_token' => rawurlencode( $redirect_data['access_token'] ), - 'refresh_token' => rawurlencode( $redirect_data['refresh_token'] ), - 'token_type' => rawurlencode( $redirect_data['token_type'] ), - 'expires_in' => \intval( $redirect_data['expires_in'] ), - 'user_id' => \intval( $redirect_data['user_id'] ), - ), $this->redirect_uri ) + ? add_query_arg( $redirect_params, $this->redirect_uri ) : admin_url(); wp_redirect( $target ); From 51a2af420583113a46e6a5ddf6f6b50c027d95fe Mon Sep 17 00:00:00 2001 From: Paul Kilmurray Date: Mon, 28 Jul 2025 17:57:50 +0200 Subject: [PATCH 04/22] fix auth stylesheets --- assets/img/wcpos-icon.png | Bin 0 -> 9193 bytes assets/img/wcpos-pro-icon.png | Bin 0 -> 41774 bytes includes/Init.php | 124 ++++++++++++++++------------------ templates/auth.php | 10 +-- 4 files changed, 65 insertions(+), 69 deletions(-) create mode 100644 assets/img/wcpos-icon.png create mode 100644 assets/img/wcpos-pro-icon.png diff --git a/assets/img/wcpos-icon.png b/assets/img/wcpos-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c84cdc49c8769a7b96bec4838916c11535d9c666 GIT binary patch literal 9193 zcma)ibyOU|)8OKZyJm4hg1c{UcL@ZC#ogUm+#x`4_u%djAOsBrclRI*Aq0Zn=6>IM zci+A5k9+fGdb+x%x@xAZYdS_g&1E^+7a?*g8e@9_&MJgPE?jo<}4gj#z|2q+U%EY|jKr{~p6&bV>G!Ui$ zLf`9ZI14lY1!;-*KC9<>-lp%h|BUp*R0>+MX!F890%*m7D$=nuGPd@^zocYjz8b49 zHPyvZt`NUEEk2zs1wv;f5K93HHs}gKbYx)ZZC2U|5A5lgrh$&ZnK8>3-B0wz^4H;p zH*6i&dzA0L*@>kO@q7gM3R+WF0K`HM{tjT_4I|+bT)L5%{y_Dp2S;uj$Vn(;Y`vf^ zhLIPiA3bb)NKbZY%?p33Sr0E?Sd(T^*-#VU7F`(`7dZJz8B}}6>J<# z>{g1^hzc=rzUvv@PN^ZdCFS(b7Lw>U2YCisyJm-mS~UNjUg)_tKuuP6#}Aez6E8l@ zQ~J1T#%MyD{Qc^Q&o19UahFD(A-U4m>Etl^IS>K%#?{a>} zYVllCX|^AB-qFSiIV+4#zWi6GHm$J+<=@Q+`xEJIDc_Jakm#(Z7TBMv>?V4Eld?Zj zXiU^pITH0=&oA;v8;pF^zXZQTU5JqAV6^2E-})qL4exp_eq-dZ!y?g`U==jNN!*iW zN!k-6B6=UKKVsKQo}gmo`k<=OT6wV0?ACBVP*&-6T6ac}DU+M8G;XKPfbWerI%A-r zt;M15tIc;KSkxY?KSCFS`1)WM+si5rySqtA#^@nUDb2LGjQOhEG6uui0X&t@L0UU` z)^jb$pbaIot+li&6=Y1I?=O^Y5k4eN+pd(x;h`tC{)QMPrTMx^%^0sX(Rw;#FFsE$ zLAvKT`?YqcO2%jrsV&Larw1ee0d78?^{mNUm`WwG2Te)iu#}1n}uv9dkKtC@|RR&IG+i`0dooe0pN zb%7R@fs4I|aF&i{Xc$E{DKC-@yAl5MX~_&u3lIXQ8ecQ{5GYrN5Oo-s%*M^fTxthP z1dOxWIPkj*=8t?%7&E4XU}MWZ+8^{y1Xn2TzqNUW^bTu8;2dSX_@eY1^y2E|Y}g;@ zIeGG~gU`*kkDiUy7s$bUs8jBRJXvq~^cEkSzGvBhvJmU@Ho4WO z=`m@WYhRza#_UxvUrr=?)ITMQIjc!6o{Y1IK1f_dDaLrCcFXD{remC^;~@5;D=l3_ z%qban@3(*))cV{$t+HyBh#yjFO?;F8H?8&c*2jj?kd zWuGY^=N9{eMKkUqWq|65R%=#udk#iWM+N$_9j_cQfWt%7Gw0q+Oh3R~z?o}V?}fZy zPz~+ZhXw`G4RGeWNABk{55B?-?kg`#q1T4sS%+~Pb&{{5qrM81biEVc*|!V@h|{t} z$P`P)4*_G)gw?a=(M+nKMa~24hk{fwRla1)0w7um{iI3ItM-bW>hv)-wSstLZEotX z!js9@=hQd930{A?3*QZ3X?E7UxBU%VDwMMTuC4|9P|2%)9}qEdu)iYxY^|G{{dBd8JWk|7r)1t-ffqJ|PAeN3C=r0#?6C&TFMzUK^{em3#eFbVtZlSageQK#t;gH$_J+*$|i@&zFnlz9H!CJYs2D@xM(d-I7DM~7^dC;bk$!q9MO*2|RaH4jI&l>EIr zj0&u*apxckMd93l43bq-QB<71a?~au{=@9KycCH&YMi1EzWITS6%z+lX7p^F6HNBq z1%0Ynje-^nw@-jzEoM-eB-4u1b8}N-!NPg7>i5{*M=Pea6w^}_NjZ@>5sD|->ban( zp1EP&Hg@zVwY07+?_4kC)}Q!0Hg0-v;Vy$7gN=VQ;KwZ9Y_WI{OBy;3=Dm8yHw)Ko`H!;>_8BF#Ul|nM*Gq>-P!pj^+wHLS3!DV^#fszh z$$`JXi_T(RE9q-G3;-uDeSBvD+I3sWkU7*p0-hewP>EvcnD-GSntV7)`{(@P{*h?g z7fez!{b~Z?Q9lcHnCdD^#vEkyWGLO#NOz9%$ltQ^v{ZvpzqnLj4}ln^1t)(9vL%P~ zud@kqR%VQ9Flx{%mCMFThyJNEMdV{%7jq;-{pKYn?L+ezp#5Qf#;moZNipfMxokN* zIpz#H?sc1okc&irF6-f*4gd5s2QTe1lVK7_EK(8gBT_Z_{wSv7WgDQN{PGX*p@M7| zZu=gSqY}p>Z^jFok)du#KH*cHp>^j;L9(b?QDNTzOke18kG6-dZA{71xL85P>oL}V zaMb%^gJl_O84cfeyQ&8dL=^&YinT(c_x|_Lz(5k=3Mn=lc&(H4;M$nZ~i$=E4>$wQ#EvZ;*un>26 z4%%S7;s$PX$sg z-_diK-I+??oP}<0o7%Ke+}+=apO-{R)`dvY_Jg;LK=KG7Xw%o6Ic%H;lQuRs;l}lH z+S+^=(SnnFD;(b*04e}?9a z#7ld45WQEt#r-w&3Tt#?Vk9vSeYx{iyn^`Kxt7zw{8;J_jy8^fY-TfN`H|a)m4DW`c1|dSE`Hnc3L~ zW)G?xEI*h<#hC9dNAK9-}k6rV*2d=q374`TnA(sPoCi; z4t0nF|Enf{Ok zz81U3x=E0o3F3_~jO_1!Ms&&(q|&SsjIt93sWP0c#NmoQjoZJ`|DMZ5>3#(Mxe!|W zZc$2NK(EHAePAzaS9^rIVfgx0+fE?|-qwY^QF@jd5aqZ_h&m!qNX zLSad~DP}J6*@tB_A!%Qt$T#aYAE>v$WNr>+$KUcYZG!1vv>q&D5cq zRnpes5HgRG;-TdnImmp1l!lH@?Ch`4r&2Vm6K2QB1IZHyl(Rn1K|y2!Uc8@KSkzsn z{NuWdkRHrt266Gp$!8#xG8J=>^<@pX5=r@%Sx<2WTTO-e+zq^(5;3N;NTTE53_7NM z8~RWyexI_JXF`(^uuT~w$v&b&A6e2?j!}Vu@s1<$PB-BG%Kvy)W@#tyt6c53V-5P` zoSZeMlz4J3YlAMU4R`jo%QD<}cRU1l z_5~ZTkgAk1(lyZ|G||OOs4ExjlCUaSCw8Yq%J+^O{htL9xyXK|xYLo2aC4^wY~v}8 zR}b*P7_R|oZshQQ3Hd#`L&hyg6=-f&=(1PI(W)5H-+P4-n;(c`&5_pj;G2#iB>Hz7 z2E;ns^{N;XN{MUvO~0I;96nC*#8;1rKD*O~ZqDiUH6c3g6t+k~!`XldM|T82-d#KD zcWm)F(iNAKtlz7eo6}Db=Z|!{M~sSjqGqkUQP(%dj$3FozhEFBfzXDMQHTMa%pPcj znK3rHy~9+O+OAoKB&9?`N$rOPjyG7kjBquKHA2}8yiNc9OlVj!5+mi}29vo{<;55{ zkz-P~p2|@l9TW`KyfN-#?Q3h=?p@-t-Sx?+7cgL5Zs$PXdiEw(-0-0Az{Va-O%e;g zYL9ofCsA2$#&zy_s9N(RblZAyEC{e`8ap%-E6Ew0bmz%o&#Zh$8c{S!6W9r%gAAeSIhZv>p zNz{*aHC`yx@EZ8%coVy9Smv$Zhy5-++LY~K>my^VU|W>l&5($Kz|aVjfT;CH9^5f`d)0ijW#Lil4Hl2dmfkCUG{zIotuvC#+X-iy<2R|Q-jRvDAhQ*6|pKZo6;EP}A~hx!L!v@{H%{6N3DLV4MBA0#vXTbENk zxYEv5sCu2OvaPl4T|0mBtz{E?u_Awb3~(JepF^q76LsY7Gx$@YWL3j56*4}~?18F@ zYfXD|3HCUpfF9>>xb#&LMaWoEb@x|tC<}pbSnmV4+|=@}?Sxnsod)YR1~1-aDM#wz zZXPZ6Qg`@MNJ>Ic>L>gEMXAyMS&eG0!T{(dN(~knH62#4pURkAe(WLT~2fK6W5yY=TJ`Q)R3H& zQm6pRHxBhj&}VJ&<|>l5J^L>7sUIQnldJ=$yGE5r0Fbih`4d5{PFR%HW)j;g zot=kZwy$w&@1Xcndo;Z`&{swhL>!A*%}44w8gsP7kFI+!rH6xv6xv2^q79glCEic1R1yB5$)eZF% z^#hR{jQ!fn=Fk~9IQoZ}b+>G!HCz>{cR1ZTK~lR9w6D)~S>kr$L@sL~t@@2Tv}Hp- zyWFRP{>7hK98`%=qc7Jz+nWlhWAUx0L4!PM?`F!kCDIkq)0we$b|8*!U|m)cUS9s< zwsM>@OUuy-v4nl3leetwQJIZ9#hJQqR1dw6->T~~pQWFyl-#87F{rbUA!%zL_?hMl za2nK9ey$@q?qEjl?r1RXvZL3Wo0X|Y8{$;2dJja$k?ju({O65(F4whm`|tago1B<7 zgYBszzl|7EBf7pOIhkC!reww|QbiKyq!SR7e?#WyR9P=4XU^I3jHOvcL@QAzN8NwF zC^tGjE@3TBmqJ5V%u=qB7ymkr6tZw@vXjWPC(!^~3~rC#aO3jmGjGsaNl zjA^rlJMsa@@ANVzsh22Oy}*A5U&$*gp1hBF(ETLi;DEImbjrtS@QWO7+Q+$w_)TcO zeS17~T?AN67S`QXQQiS)Ze_I_Mq101I6ZJ4bblY1&Cf4-F>??Oagvb<0F+2L2A{lD zP680|W6vRasLY`aw$6Jn4iL!>9DIix z7XL>0W(4w7Zlv39OR5_=pd#?q{H|djI`(HM-0j$S>fcoc(qv3XJ0fK%#~$Tp#kCBP zv-ORypCHeQwK=2tiRwyw#o>7{fCvLVK;;}A9jg&Fsuwajy~3B89?`k34)LLkI<=&W zc%bRM?VUYApSy8hk>@_UaAZ%3qzn8X$ahj@Is{AI6Z?f5cpAJ_SN?bc}#V`5IQJC%PfJ{;zo{R-#$f!sn>_~Ao^ zw`~htY~uA8DgiH#D0GYUtLv_p!_e*?%+`;0$UxLl&rc6U za<@+G{kvehec&XW& zVhZ`1v?JIQ+PREwJ;kb>%D#u0XIB2=q~*PN#aYmK&ou3sOw3|?tJ;Fj(t z4Q6Anp_HIL1_ah~gxVk?Ue5RjhbbQ#ZHWiGi2Ar)I1HdrPG2v#_;wrI8u$5?nD!6? z;>r04)I{$?mexEjN^VWAJ?gj2Ip@vcDWB6;0fY>TdY!t&8FZ#YqU5~iB4|poeEC~C zGH|9j`|F>C0n&oLI8x)lC6))2UO(CGJ=|xUVA78mxkBzFYa3W<0tPk9-5mJ0>wy)f zBYwYUqD(96N4iYB{L0v1{q`7C{=Xp^l5&5}l)_iOUt=FlcH!QB@4)P07v}6Bv;UOV zL|qX4L`_DKE&QIwsO1^j-^dd8SCuc!(Cll%&=rhBEV94eT8bxfcx3lf1{05h&cWXe z6m=k0ICaEzVB38C_jlJG|@sp~Lf~ zg1R84;&4hf!^#yvIwVxCmKR^J7?6~a?~C;l2aDEk=VS$XsuVWh5{Q8eh{Pd}Pk%9r z*BCM-qA;UUG@y~i`c3%@NdeLI;57oAV}q%27eDeRc5j^3XBq+S0*W z?Ox*~wdX6#?)<=mq#RDW{RDO)MBPsVYmfnQm)BO0w^7(mZ>FsDNSdj;(0DF7 zwJyJZ+j3*2Cu9j;-`CM=Uk4AC0n}=B;zXPZBCE8VhO6dK1OxWT+8nkLcDbkDq{m_5 zenaB9_;P3PtqTk+r?d<9(W)4|z%h*He3ze|5E#R>-1!ED(S72Nn~e)8ylk+>={K)( zJlCCJ5XS{KrzFw86>?KenAnSum3EWPz!pPzHDeZ+av;&j--Y#*p@YPV?h}O5$J9i* zfE%6O33TBll&-Cv`R;a@Bx%Pf=HVh2y7Y3dxkfUr`euB5TtnA~%6ckaN@q%8|B$$& z#|mBmLI@H)o~uSf#fg@I8PCAIXv}Cdusv5qdto6nXu8JhDDZ+8vD1v!fxo1<38S^u z6TWT?8QKYfua3n-#GqkNJR+jy@-R#G>{q9k5omLvi6E*Z6zaaU^5$vZ{HRS+aX8Od zen=EK0{!qrv}nc#4+KK4m7Od19!!uW-1M;*)l9PJeA+msGHUcX2nKtdWp7-Bj5$bZ znG@FVzhbq*%v~QIwTY2N%u+^;FvQ6+#4(}fOJgRsI0rA-t^A^HxD%_cb0(~Q{hpcF z@6YkY6@6O!`SO7VTv6SJ*dNc7dj76XI8nQeabkJs*DCpwT}*w$6niLE*#(3&A1S&1 z)@5`8iB8f_)2Axn(_E9Ddxk)vJa_F;1oq8$gkP?~Z4Miuf2o6a(jS~3_{a-b4UtR6 z=65{#vXyl&lcpQbm-f9jj$p7rKcitsqvAT%ByTapWv98H1jb^|U!1(Rb!8d5ys%-( zsLd;9caR1B$GvJ;kN(t2GpV}EJ#Qp7`MjNck3dyj-M}NRsDz~E15ZjOo6cjCCuy!1 zi{GEKO{UFHM8$1wIL^~AK)p^Bs_qKlQK`t)XfEj&ZjjmiZ~U9D^PfN41vFjq)NFJZ zrTvOkWNF~wLJ55MEvc(pS(!(F?L%_d`-fk3-=E(-$m)-R!)gx_a~Tml$6|k7e+*R3 zWB+2Zm78?d!$Z|u4@BH)u=|c$T1q9cc(r%DP+ei*G~ULJL71A#1#9(A&IwkXr~V92 z(%bUTU6yN(7g#Wu%Vw(&$gys8+sueJ4K80(WcQfwuAJeNQjLF!ENBne$@_8Q0ld70 zUGDWF6!!HYh&kSo*Y`IATK%RgjDB^IPFS_?wVm9S>)CSAy|g^!iXeQDLuTV0fX1yHmD=oQ~tQ(dTRJ-;WBANCln~ zEvZJj3ixU1MX2+z^SwgYAt%#R3jEzGdwJI6~xKR8*4v*a}7a?|rGkzg$SIdhYxI&ug z^=E)0h85~m>;INtSQ02~`iyaeF}-JMCrt2h798~0&>kI^@U526S;9e?Iy@>$Vo7GH zczWx?rLe9I$MWC+UaFwzXJnuq8RBoN(5NON<6@<9MY=CCut0`F5qDrPTrm@qx7vzt zvxm&dB0Do>YJ5}Y{}px{jg>7n=EJ|~+EFwB07$g|_5yrkoL@Am@i%_91u0MCJ>A8t z(kE{XHL=nSLT4&I;KB zr3=NAo_OzTLIc*H1j*y&;F;s6LDy(eXSIOw<3C&M_ zy;0QcMrpEpB7x_s0pDNJKfK>AFnP?$&g!75+Vc%E>Ap5Y_)-^caaU;pS7f+smG#cz z_eDc@Yu(f(HBFJ(*&S4W8F|o*L196r4Q}vPnR|@O=7!{q_uX6o*j(b=H>lf#hoKa9gg3_s=hcaI(ppUGwVYw_6$ uvTFkQzn+c6zgHlQ$w=Z`1uRB+rpB&ZbwBJ)n1%190Vv3*O4mu6LjM=Wl|kJA literal 0 HcmV?d00001 diff --git a/assets/img/wcpos-pro-icon.png b/assets/img/wcpos-pro-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..79b4cd05d63e4636327bde86e71d4474c5f95d9f GIT binary patch literal 41774 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%0DWntVTg#{N|_TFax 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 literal 0 HcmV?d00001 diff --git a/includes/Init.php b/includes/Init.php index 2595c1b..94761a1 100644 --- a/includes/Init.php +++ b/includes/Init.php @@ -6,22 +6,18 @@ * @author Paul Kilmurray * * @see http://wcpos.com - * @package WooCommercePOS */ namespace WCPOS\WooCommercePOS; -use WCPOS\WooCommercePOS\Services\Settings as SettingsService; +use const DOING_AJAX; use WCPOS\WooCommercePOS\Services\Auth as AuthService; +use WCPOS\WooCommercePOS\Services\Settings as SettingsService; use WP_HTTP_Response; use WP_REST_Request; -use WP_REST_Server; -use const DOING_AJAX; +use WP_REST_Server; -/** - * - */ class Init { /** * Constructor. @@ -51,63 +47,6 @@ public function init(): void { $this->init_integrations(); } - /** - * Common initializations - */ - private function init_common() { - // init the Services - SettingsService::instance(); - AuthService::instance(); - - // init other functionality needed by both frontend and admin - new i18n(); - new Gateways(); - new Products(); - new Orders(); - } - - /** - * Frontend specific initializations - */ - private function init_frontend() { - if ( ! is_admin() ) { - new Templates(); - new Form_Handler(); - } - } - - /** - * Admin specific initializations - */ - private function init_admin() { - if ( is_admin() ) { - if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) { - new AJAX(); - } else { - new Admin(); - } - } - } - - /** - * Integrations - */ - private function init_integrations() { - // WooCommerce Bookings - http://www.woothemes.com/products/woocommerce-bookings/ - // if ( class_exists( 'WC-Bookings' ) ) { - // new Integrations\Bookings(); - // } - - // Yoast SEO - https://wordpress.org/plugins/wordpress-seo/ - if ( class_exists( 'WPSEO_Options' ) ) { - new Integrations\WPSEO(); - } - - // wePOS alters the WooCommerce REST API, breaking the expected schema - // It's very bad form on their part, but we need to work around it - new Integrations\WePOS(); - } - /** * Loads the POS API and duck punches the WC REST API. */ @@ -184,4 +123,61 @@ public function send_headers(): void { header( 'Access-Control-Expose-Headers: Link' ); } } + + /** + * Common initializations. + */ + private function init_common(): void { + // init the Services + SettingsService::instance(); + AuthService::instance(); + + // init other functionality needed by both frontend and admin + new i18n(); + new Gateways(); + new Products(); + new Orders(); + } + + /** + * Frontend specific initializations. + */ + private function init_frontend(): void { + if ( ! is_admin() ) { + new Templates(); + new Form_Handler(); + } + } + + /** + * Admin specific initializations. + */ + private function init_admin(): void { + if ( is_admin() ) { + if ( \defined( 'DOING_AJAX' ) && DOING_AJAX ) { + new AJAX(); + } else { + new Admin(); + } + } + } + + /** + * Integrations. + */ + private function init_integrations(): void { + // WooCommerce Bookings - http://www.woothemes.com/products/woocommerce-bookings/ + // if ( class_exists( 'WC-Bookings' ) ) { + // new Integrations\Bookings(); + // } + + // Yoast SEO - https://wordpress.org/plugins/wordpress-seo/ + if ( class_exists( 'WPSEO_Options' ) ) { + new Integrations\WPSEO(); + } + + // wePOS alters the WooCommerce REST API, breaking the expected schema + // It's very bad form on their part, but we need to work around it + new Integrations\WePOS(); + } } diff --git a/templates/auth.php b/templates/auth.php index 2079af0..c6aedb1 100644 --- a/templates/auth.php +++ b/templates/auth.php @@ -24,11 +24,11 @@ <?php _e('WooCommerce POS Login'); ?> - - - - - + ?ver=' media='all' /> + ?ver=' media='all' /> + ?ver=' media='all' /> + ?ver=' media='all' /> + ?ver=' media='all' /> " . "\n"; - - // The actual app bundle - if ( $development ) { - // Development Mode - echo "" . "\n"; - } else { - // Production Mode - echo "" . "\n"; - } + + echo "" . "\n"; } private function pos_logout_url() { From 22571d923ead94efa32c3158f652a51d8d4c52e7 Mon Sep 17 00:00:00 2001 From: Paul Kilmurray Date: Thu, 31 Jul 2025 19:19:19 +0200 Subject: [PATCH 14/22] add cashier api endpoint --- includes/API.php | 4 +- includes/API/Cashier.php | 297 ++++++++++++++++++++++++++++++++++ includes/API/Stores.php | 178 -------------------- includes/Services/Auth.php | 48 ++---- includes/Services/Cashier.php | 216 +++++++++++++++++++++++++ includes/Templates/Auth.php | 6 +- 6 files changed, 535 insertions(+), 214 deletions(-) create mode 100644 includes/API/Cashier.php delete mode 100644 includes/API/Stores.php create mode 100644 includes/Services/Cashier.php diff --git a/includes/API.php b/includes/API.php index 9bf0f61..b88b86b 100644 --- a/includes/API.php +++ b/includes/API.php @@ -70,7 +70,7 @@ public function register_routes(): void { * @param array $controllers Associative array of controller identifiers to their corresponding class names. * - 'auth' => Fully qualified name of the class handling authentication. * - 'settings' => Fully qualified name of the class handling settings. - * - 'stores' => Fully qualified name of the class handling stores management. + * - 'cashier' => Fully qualified name of the class handling cashier management. * - 'products' => Fully qualified name of the class handling products. * - 'product_variations' => Fully qualified name of the class handling product variations. * - 'orders' => Fully qualified name of the class handling orders. @@ -88,7 +88,7 @@ public function register_routes(): void { // woocommerce pos rest api controllers. 'auth' => API\Auth::class, 'settings' => API\Settings::class, - 'stores' => API\Stores::class, + 'cashier' => API\Cashier::class, // extend WC REST API controllers. 'products' => API\Products_Controller::class, diff --git a/includes/API/Cashier.php b/includes/API/Cashier.php new file mode 100644 index 0000000..9d35154 --- /dev/null +++ b/includes/API/Cashier.php @@ -0,0 +1,297 @@ +namespace, + '/' . $this->rest_base . '/(?P[\d]+)', + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_cashier' ), + 'permission_callback' => array( $this, 'check_cashier_permissions' ), + 'args' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the cashier (WordPress user ID).', 'woocommerce-pos' ), + 'type' => 'integer', + 'required' => true, + ), + ), + ) + ); + + // Get cashier stores: /wcpos/v1/cashier/{id}/stores + register_rest_route( + $this->namespace, + '/' . $this->rest_base . '/(?P[\d]+)/stores', + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_cashier_stores' ), + 'permission_callback' => array( $this, 'check_cashier_permissions' ), + 'args' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the cashier (WordPress user ID).', 'woocommerce-pos' ), + 'type' => 'integer', + 'required' => true, + ), + ), + ) + ); + + // Get specific store for cashier: /wcpos/v1/cashier/{id}/stores/{store_id} + register_rest_route( + $this->namespace, + '/' . $this->rest_base . '/(?P[\d]+)/stores/(?P[\d]+)', + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_cashier_store' ), + 'permission_callback' => array( $this, 'check_cashier_permissions' ), + 'args' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the cashier (WordPress user ID).', 'woocommerce-pos' ), + 'type' => 'integer', + 'required' => true, + ), + 'store_id' => array( + 'description' => __( 'Unique identifier for the store.', 'woocommerce-pos' ), + 'type' => 'integer', + 'required' => true, + ), + ), + ) + ); + } + + /** + * Check permissions for cashier endpoints. + * + * Ensures the user is authenticated and can only access their own data. + * + * @param WP_REST_Request $request The REST request object. + * + * @return bool|WP_Error True if authorized, WP_Error otherwise. + */ + public function check_cashier_permissions( WP_REST_Request $request ) { + // Check if user is authenticated + if ( ! is_user_logged_in() ) { + return new WP_Error( + 'woocommerce_pos_rest_unauthorized', + __( 'Authentication required.', 'woocommerce-pos' ), + array( 'status' => 401 ) + ); + } + + $current_user_id = get_current_user_id(); + $requested_id = (int) $request->get_param( 'id' ); + + // Check if the requested user exists + $user = get_user_by( 'id', $requested_id ); + if ( ! $user ) { + return new WP_Error( + 'woocommerce_pos_cashier_not_found', + __( 'Cashier not found.', 'woocommerce-pos' ), + array( 'status' => 404 ) + ); + } + + $cashier_service = CashierService::instance(); + + // Check if user has POS cashier permissions + if ( ! $cashier_service->has_cashier_permissions( $user ) ) { + return new WP_Error( + 'woocommerce_pos_rest_forbidden', + __( 'User does not have POS cashier permissions.', 'woocommerce-pos' ), + array( 'status' => 403 ) + ); + } + + // Validate access permissions + if ( ! $cashier_service->validate_cashier_access( $current_user_id, $requested_id ) ) { + return new WP_Error( + 'woocommerce_pos_rest_forbidden', + __( 'You can only access your own cashier data.', 'woocommerce-pos' ), + array( 'status' => 403 ) + ); + } + + return true; + } + + /** + * Get cashier data. + * + * @param WP_REST_Request $request The REST request object. + * + * @return WP_Error|WP_REST_Response Response object on success, or WP_Error object on failure. + */ + public function get_cashier( WP_REST_Request $request ) { + $user_id = (int) $request->get_param( 'id' ); + $user = get_user_by( 'id', $user_id ); + + if ( ! $user ) { + return new WP_Error( + 'woocommerce_pos_cashier_not_found', + __( 'Cashier not found.', 'woocommerce-pos' ), + array( 'status' => 404 ) + ); + } + + $cashier_service = CashierService::instance(); + $data = $cashier_service->get_cashier_data( $user, true ); + + /** + * Filter cashier data for REST API response. + * + * @param array $data Cashier data. + * @param WP_User $user User object. + * @param WP_REST_Request $request Request object. + */ + $data = apply_filters( 'woocommerce_pos_rest_prepare_cashier', $data, $user, $request ); + + return rest_ensure_response( $data ); + } + + /** + * Get stores accessible by the cashier. + * + * @param WP_REST_Request $request The REST request object. + * + * @return WP_Error|WP_REST_Response Response object on success, or WP_Error object on failure. + */ + public function get_cashier_stores( WP_REST_Request $request ) { + $user_id = (int) $request->get_param( 'id' ); + $user = get_user_by( 'id', $user_id ); + + if ( ! $user ) { + return new WP_Error( + 'woocommerce_pos_cashier_not_found', + __( 'Cashier not found.', 'woocommerce-pos' ), + array( 'status' => 404 ) + ); + } + + try { + $cashier_service = CashierService::instance(); + $stores = $cashier_service->get_accessible_stores( $user ); + $response = array(); + + foreach ( $stores as $store ) { + $data = $this->prepare_store_for_response( $store, $request ); + $response[] = $this->prepare_response_for_collection( $data ); + } + + $response = rest_ensure_response( $response ); + $response->header( 'X-WP-Total', \count( $stores ) ); + $response->header( 'X-WP-TotalPages', 1 ); + + return $response; + } catch ( Exception $e ) { + return new WP_Error( + 'woocommerce_pos_stores_retrieval_failed', + __( 'Failed to retrieve store data.', 'woocommerce-pos' ), + array( 'status' => 500 ) + ); + } + } + + /** + * Get a specific store for the cashier. + * + * @param WP_REST_Request $request The REST request object. + * + * @return WP_Error|WP_REST_Response Response object on success, or WP_Error object on failure. + */ + public function get_cashier_store( WP_REST_Request $request ) { + $user_id = (int) $request->get_param( 'id' ); + $store_id = (int) $request->get_param( 'store_id' ); + + $user = get_user_by( 'id', $user_id ); + if ( ! $user ) { + return new WP_Error( + 'woocommerce_pos_cashier_not_found', + __( 'Cashier not found.', 'woocommerce-pos' ), + array( 'status' => 404 ) + ); + } + + $cashier_service = CashierService::instance(); + $store = $cashier_service->get_accessible_store( $user, $store_id ); + + if ( ! $store ) { + return new WP_Error( + 'woocommerce_pos_store_not_found', + __( 'Store not found or not accessible by this cashier.', 'woocommerce-pos' ), + array( 'status' => 404 ) + ); + } + + $data = $this->prepare_store_for_response( $store, $request ); + + return rest_ensure_response( $data ); + } + + + + /** + * Prepare store data for response. + * + * @param Store $store Store object. + * @param WP_REST_Request $request Request object. + * + * @return array Prepared store data. + */ + protected function prepare_store_for_response( Store $store, WP_REST_Request $request ): array { + $data = $store->get_data(); + + /* + * Filter store data for REST API response. + * + * @param array $data Store data. + * @param Store $store Store object. + * @param WP_REST_Request $request Request object. + */ + return apply_filters( 'woocommerce_pos_rest_prepare_store', $data, $store, $request ); + } +} diff --git a/includes/API/Stores.php b/includes/API/Stores.php deleted file mode 100644 index 2f45e67..0000000 --- a/includes/API/Stores.php +++ /dev/null @@ -1,178 +0,0 @@ -namespace, - '/' . $this->rest_base, - array( - 'methods' => 'GET', - 'callback' => array( $this, 'get_items' ), - 'permission_callback' => array( $this, 'check_permissions' ), - ) - ); - - register_rest_route( - $this->namespace, - '/' . $this->rest_base . '/(?P[\d]+)', - array( - 'methods' => 'GET', - 'callback' => array( $this, 'get_item' ), - 'permission_callback' => array( $this, 'check_permissions' ), - ) - ); - } - - /** - * Retrieve store data. - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. - */ - public function get_items( $request ) { - try { - $stores = wcpos_get_stores(); - - $response = array(); - foreach ( $stores as $store ) { - $data = $this->prepare_item_for_response( $store, $request ); - $response[] = $this->prepare_response_for_collection( $data ); - } - - $response = rest_ensure_response( $response ); - $response->header( 'X-WP-Total', count( $stores ) ); - $response->header( 'X-WP-TotalPages', 1 ); - - return $response; - - } catch ( \Exception $e ) { - return new \WP_Error( - 'woocommerce_pos_store_retrieval_failed', - esc_html__( 'Failed to retrieve store data', 'woocommerce-pos' ), - array( 'status' => 500 ) - ); - } - } - - /** - * Retrieve a single store. - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. - */ - public function get_item( $request ) { - $store = wcpos_get_store( $request['id'] ); - - if ( ! $store ) { - return new \WP_Error( - 'woocommerce_pos_store_not_found', - esc_html__( 'Store not found', 'woocommerce-pos' ), - array( 'status' => 404 ) - ); - } - - $data = $this->prepare_item_for_response( $store, $request ); - - return rest_ensure_response( $data ); - } - - /** - * Prepare a single product output for response. - * - * @param Store $store Store object. - * @param WP_REST_Request $request Request object. - * @return WP_REST_Response - */ - public function prepare_item_for_response( $store, $request ) { - $data = $store->get_data(); - $response = rest_ensure_response( $data ); - $response->add_links( $this->prepare_links( $store, $request ) ); - - /** - * Filter the data for a response. - * - * The dynamic portion of the hook name, $this->post_type, refers to post_type of the post being - * prepared for the response. - * - * @param WP_REST_Response $response The response object. - * @param Store $store Store object. - * @param WP_REST_Request $request Request object. - */ - return apply_filters( 'woocommerce_pos_rest_prepare_store', $response, $store, $request ); - } - - /** - * Check if the user is logged in. - * - * @return bool|WP_Error True if the user is logged in, WP_Error otherwise. - */ - public function check_permissions() { - if ( ! is_user_logged_in() ) { - return new \WP_Error( - 'woocommerce_pos_rest_forbidden', - esc_html__( 'You do not have permissions to view this data.', 'woocommerce-pos' ), - array( 'status' => rest_authorization_required_code() ) - ); - } - - return true; - } - - /** - * Prepare links for the request. - * - * @param WC_Product $product Product object. - * @param WP_REST_Request $request Request object. - * @return array Links for the given product. - */ - protected function prepare_links( $store, $request ) { - $links = array( - 'self' => array( - 'href' => rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $store->get_id() ) ), - ), - 'collection' => array( - 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ), - ), - ); - - return $links; - } -} diff --git a/includes/Services/Auth.php b/includes/Services/Auth.php index bc9f0bf..a7e5205 100644 --- a/includes/Services/Auth.php +++ b/includes/Services/Auth.php @@ -5,7 +5,6 @@ use const DAY_IN_SECONDS; use Exception; use const HOUR_IN_SECONDS; -use Ramsey\Uuid\Uuid; use WCPOS\Vendor\Firebase\JWT\JWT; use WCPOS\Vendor\Firebase\JWT\Key; use WP_Error; @@ -179,7 +178,7 @@ public function generate_access_token( WP_User $user ) { ), ); - /** + /* * Let the user modify the access token data before the sign. * * @param {array} $token @@ -285,11 +284,14 @@ public function generate_token_pair( WP_User $user ) { return $refresh_token; } + $issued_at = time(); + $expire = apply_filters( 'woocommerce_pos_jwt_access_token_expire', $issued_at + ( HOUR_IN_SECONDS / 2 ), $issued_at ); + return array( 'access_token' => $access_token, 'refresh_token' => $refresh_token, 'token_type' => 'Bearer', - 'expires_in' => apply_filters( 'woocommerce_pos_jwt_access_token_expire', HOUR_IN_SECONDS / 2, time() ) - time(), + 'expires_at' => (int) $expire, ); } @@ -320,7 +322,7 @@ public function get_user_data( WP_User $user ): array { } return array( - 'uuid' => $this->get_user_uuid( $user ), + 'uuid' => Cashier::instance()->get_cashier_uuid( $user ), 'id' => $user->ID, 'username' => $user->user_login, 'email' => $user->user_email, @@ -333,7 +335,7 @@ public function get_user_data( WP_User $user ): array { 'access_token' => $tokens['access_token'], 'refresh_token' => $tokens['refresh_token'], 'token_type' => $tokens['token_type'], - 'expires_in' => $tokens['expires_in'], + 'expires_at' => $tokens['expires_at'], ); } @@ -355,8 +357,11 @@ public function get_redirect_data( WP_User $user ): array { 'access_token' => $tokens['access_token'], 'refresh_token' => $tokens['refresh_token'], 'token_type' => $tokens['token_type'], - 'expires_in' => $tokens['expires_in'], - 'user_id' => $user->ID, // Minimal user identification + 'expires_at' => $tokens['expires_at'], + // Get basic user data for display, other data will be fetched from the server. + 'uuid' => Cashier::instance()->get_cashier_uuid( $user ), + 'id' => $user->ID, + 'display_name' => $user->display_name, ); } @@ -397,10 +402,13 @@ public function refresh_access_token( string $refresh_token ) { return $new_access_token; } + $issued_at = time(); + $expire = apply_filters( 'woocommerce_pos_jwt_access_token_expire', $issued_at + ( HOUR_IN_SECONDS / 2 ), $issued_at ); + return array( 'access_token' => $new_access_token, 'token_type' => 'Bearer', - 'expires_in' => apply_filters( 'woocommerce_pos_jwt_access_token_expire', HOUR_IN_SECONDS / 2, time() ) - time(), + 'expires_at' => (int) $expire, ); } @@ -482,28 +490,4 @@ private function is_refresh_token_valid( int $user_id, string $jti ): bool { return isset( $refresh_tokens[ $jti ] ) && $refresh_tokens[ $jti ]['expires'] > time(); } - - /** - * Note: usermeta is shared across all sites in a network, this can cause issues in the POS. - * We need to make sure that the user uuid is unique per site. - * - * @param WP_User $user - * - * @return string - */ - private function get_user_uuid( WP_User $user ): string { - $meta_key = '_woocommerce_pos_uuid'; - - if ( \function_exists( 'is_multisite' ) && is_multisite() ) { - $meta_key = $meta_key . '_' . get_current_blog_id(); - } - - $uuid = get_user_meta( $user->ID, $meta_key, true ); - if ( ! $uuid ) { - $uuid = Uuid::uuid4()->toString(); - update_user_meta( $user->ID, $meta_key, $uuid ); - } - - return $uuid; - } } diff --git a/includes/Services/Cashier.php b/includes/Services/Cashier.php new file mode 100644 index 0000000..6ec9c9c --- /dev/null +++ b/includes/Services/Cashier.php @@ -0,0 +1,216 @@ +ID, $meta_key, true ); + if ( ! $uuid ) { + $uuid = wp_generate_uuid4(); + update_user_meta( $user->ID, $meta_key, $uuid ); + } + + return $uuid; + } + + /** + * Get cashier data for API responses. + * + * @param WP_User $user User object. + * @param bool $include_stores Whether to include stores data. + * + * @return array Cashier data. + */ + public function get_cashier_data( WP_User $user, bool $include_stores = true ): array { + $uuid = $this->get_cashier_uuid( $user ); + $last_access = get_user_meta( $user->ID, '_woocommerce_pos_last_access', true ); + + $data = array( + 'uuid' => $uuid, + 'id' => $user->ID, + 'username' => $user->user_login, + 'first_name' => $user->first_name, + 'last_name' => $user->last_name, + 'email' => $user->user_email, + 'display_name' => $user->display_name, + 'nice_name' => $user->user_nicename, + 'last_access' => $last_access ? $last_access : '', + 'avatar_url' => get_avatar_url( $user->ID ), + ); + + if ( $include_stores ) { + $stores = $this->get_accessible_stores( $user ); + $stores_data = array(); + foreach ( $stores as $store ) { + $stores_data[] = $store->get_data(); + } + $data['stores'] = $stores_data; + } + + /* + * Filter cashier data. + * + * @param array $data Cashier data. + * @param WP_User $user User object. + * @param bool $include_stores Whether stores were included. + */ + return apply_filters( 'woocommerce_pos_cashier_data', $data, $user, $include_stores ); + } + + /** + * Get stores accessible by the cashier. + * + * @TODO - This currently returns all stores. In the future, this should be + * customized based on user meta, roles, or other authorization logic to + * return only the stores the cashier is authorized to access. + * + * @param WP_User $user User object. + * + * @return array Array of Store objects. + */ + public function get_accessible_stores( WP_User $user ): array { + $stores = wcpos_get_stores(); + + /* + * Filter stores accessible by cashier. + * + * @param array $stores Array of Store objects. + * @param WP_User $user User object. + */ + return apply_filters( 'woocommerce_pos_cashier_accessible_stores', $stores, $user ); + } + + /** + * Check if a cashier has access to a specific store. + * + * @param WP_User $user User object. + * @param int $store_id Store ID. + * + * @return bool True if cashier has access, false otherwise. + */ + public function has_store_access( WP_User $user, int $store_id ): bool { + $accessible_stores = $this->get_accessible_stores( $user ); + + foreach ( $accessible_stores as $store ) { + if ( $store->get_id() === $store_id ) { + return true; + } + } + + return false; + } + + /** + * Get a specific store for a cashier if they have access. + * + * @param WP_User $user User object. + * @param int $store_id Store ID. + * + * @return null|Store Store object if accessible, null otherwise. + */ + public function get_accessible_store( WP_User $user, int $store_id ): ?Store { + $accessible_stores = $this->get_accessible_stores( $user ); + + foreach ( $accessible_stores as $store ) { + if ( $store->get_id() === $store_id ) { + return $store; + } + } + + return null; + } + + /** + * Update cashier's last access time. + * + * @param WP_User $user User object. + * @param string $timestamp Optional timestamp, defaults to current time. + * + * @return bool True on success, false on failure. + */ + public function update_last_access( WP_User $user, string $timestamp = '' ): bool { + if ( empty( $timestamp ) ) { + $timestamp = current_time( 'mysql' ); + } + + return update_user_meta( $user->ID, '_woocommerce_pos_last_access', $timestamp ); + } + + /** + * Check if user has cashier permissions. + * + * @param WP_User $user User object. + * + * @return bool True if user has cashier permissions. + */ + public function has_cashier_permissions( WP_User $user ): bool { + return user_can( $user, 'publish_shop_orders' ); + } + + /** + * Validate cashier access for API endpoints. + * + * @param int $current_user_id Current user ID. + * @param int $requested_id Requested cashier ID. + * + * @return bool True if access is allowed. + */ + public function validate_cashier_access( int $current_user_id, int $requested_id ): bool { + // Users can access their own data + if ( $current_user_id === $requested_id ) { + return true; + } + + // Administrators can access any cashier data + return current_user_can( 'manage_woocommerce' ); + } +} diff --git a/includes/Templates/Auth.php b/includes/Templates/Auth.php index 7ed6b56..ea13210 100644 --- a/includes/Templates/Auth.php +++ b/includes/Templates/Auth.php @@ -155,8 +155,10 @@ private function handle_form_submission(): void { 'access_token' => rawurlencode( $redirect_data['access_token'] ), 'refresh_token' => rawurlencode( $redirect_data['refresh_token'] ), 'token_type' => rawurlencode( $redirect_data['token_type'] ), - 'expires_in' => \intval( $redirect_data['expires_in'] ), - 'user_id' => \intval( $redirect_data['user_id'] ), + 'expires_at' => \intval( $redirect_data['expires_at'] ), + 'id' => \intval( $redirect_data['id'] ), + 'uuid' => rawurlencode( $redirect_data['uuid'] ), + 'display_name' => rawurlencode( $redirect_data['display_name'] ), ); // Include state parameter if it was provided From ac8382c571fffe3f6c47315c0f638e1f18b4de1c Mon Sep 17 00:00:00 2001 From: Paul Kilmurray Date: Thu, 7 Aug 2025 12:20:39 +0200 Subject: [PATCH 15/22] merge v1.7 into v1.8 --- includes/Init.php | 1 + includes/Orders.php | 742 ----------------------------------- includes/wcpos-functions.php | 27 +- readme.txt | 5 +- 4 files changed, 22 insertions(+), 753 deletions(-) diff --git a/includes/Init.php b/includes/Init.php index 900a217..0e91a75 100644 --- a/includes/Init.php +++ b/includes/Init.php @@ -156,6 +156,7 @@ private function init_common(): void { new Gateways(); new Products(); new Orders(); + new Emails(); } /** diff --git a/includes/Orders.php b/includes/Orders.php index 9ca7064..93f22ba 100644 --- a/includes/Orders.php +++ b/includes/Orders.php @@ -35,9 +35,6 @@ public function __construct() { add_filter( 'woocommerce_order_get_tax_location', array( $this, 'get_tax_location' ), 10, 2 ); add_action( 'woocommerce_order_item_after_calculate_taxes', array( $this, 'order_item_after_calculate_taxes' ) ); add_action( 'woocommerce_order_item_shipping_after_calculate_taxes', array( $this, 'order_item_after_calculate_taxes' ) ); - - // POS email management - higher priority to override other plugins - $this->setup_email_management(); } /** @@ -126,132 +123,6 @@ public function hidden_order_itemmeta( array $meta_keys ): array { return array_merge( $meta_keys, array( '_woocommerce_pos_uuid', '_woocommerce_pos_tax_status', '_woocommerce_pos_data' ) ); } - /** - * Manage admin email sending for POS orders. - * Only affects orders created via WooCommerce POS. - * - * @param bool $enabled Whether the email is enabled. - * @param null|WC_Order $order The order object. - * @param mixed|WC_Email $email_class The email class. - * - * @return bool Whether the email should be sent. - */ - public function manage_admin_emails( $enabled, $order, $email_class ) { - // Better email ID detection - $email_id = 'unknown'; - if ( $email_class instanceof WC_Email && isset( $email_class->id ) ) { - $email_id = $email_class->id; - } elseif ( \is_object( $email_class ) && isset( $email_class->id ) ) { - $email_id = $email_class->id; - } elseif ( \is_string( $email_class ) ) { - $email_id = $email_class; - } - - // Get current filter name for additional context - $current_filter = current_filter(); - - // Only control emails for POS orders - if ( ! $this->is_pos_order( $order ) ) { - return $enabled; - } - - $admin_emails_enabled = (bool) woocommerce_pos_get_settings( 'checkout', 'admin_emails' ); - $order_id = $order instanceof WC_Order ? $order->get_id() : 'unknown'; - - - - // Return the setting value, this will override any other plugin settings - return $admin_emails_enabled; - } - - /** - * Manage customer email sending for POS orders. - * Only affects orders created via WooCommerce POS. - * - * @param bool $enabled Whether the email is enabled. - * @param null|WC_Order $order The order object. - * @param mixed|WC_Email $email_class The email class. - * - * @return bool Whether the email should be sent. - */ - public function manage_customer_emails( $enabled, $order, $email_class ) { - // Only control emails for POS orders - if ( ! $this->is_pos_order( $order ) ) { - return $enabled; - } - - $customer_emails_enabled = (bool) woocommerce_pos_get_settings( 'checkout', 'customer_emails' ); - $email_id = $email_class instanceof WC_Email ? $email_class->id : 'unknown'; - $order_id = $order instanceof WC_Order ? $order->get_id() : 'unknown'; - - - - // Return the setting value, this will override any other plugin settings - return $customer_emails_enabled; - } - - /** - * Filter admin email recipients for POS orders as a safety net. - * If admin emails are disabled, return empty string to prevent sending. - * - * @param string $recipient The recipient email address. - * @param null|WC_Order $order The order object. - * @param mixed|WC_Email $email_class The email class. - * @param array $args Additional arguments. - * - * @return string The recipient email or empty string to prevent sending. - */ - public function filter_admin_email_recipients( $recipient, $order, $email_class, $args = array() ) { - // Only control emails for POS orders - if ( ! $this->is_pos_order( $order ) ) { - return $recipient; - } - - $admin_emails_enabled = (bool) woocommerce_pos_get_settings( 'checkout', 'admin_emails' ); - $email_id = $email_class instanceof WC_Email ? $email_class->id : 'unknown'; - $order_id = $order instanceof WC_Order ? $order->get_id() : 'unknown'; - - - - // If admin emails are disabled, return empty string to prevent sending - if ( ! $admin_emails_enabled ) { - return ''; - } - - return $recipient; - } - - /** - * Filter customer email recipients for POS orders as a safety net. - * If customer emails are disabled, return empty string to prevent sending. - * - * @param string $recipient The recipient email address. - * @param null|WC_Order $order The order object. - * @param mixed|WC_Email $email_class The email class. - * @param array $args Additional arguments. - * - * @return string The recipient email or empty string to prevent sending. - */ - public function filter_customer_email_recipients( $recipient, $order, $email_class, $args = array() ) { - // Only control emails for POS orders - if ( ! $this->is_pos_order( $order ) ) { - return $recipient; - } - - $customer_emails_enabled = (bool) woocommerce_pos_get_settings( 'checkout', 'customer_emails' ); - $email_id = $email_class instanceof WC_Email ? $email_class->id : 'unknown'; - $order_id = $order instanceof WC_Order ? $order->get_id() : 'unknown'; - - - - // If customer emails are disabled, return empty string to prevent sending - if ( ! $customer_emails_enabled ) { - return ''; - } - - return $recipient; - } - /** * Filter the product object for an order item. * @@ -352,619 +223,6 @@ public function order_item_after_calculate_taxes( $item ): void { } } - /** - * Ultimate failsafe to prevent disabled POS emails from being sent. - * This hooks into wp_mail as the final layer of protection. - * - * @param array $atts The wp_mail arguments. - * - * @return array|false The wp_mail arguments or false to prevent sending. - */ - public function prevent_disabled_pos_emails( $atts ) { - // Check if this email is related to a WooCommerce order - if ( ! isset( $atts['subject'] ) || ! \is_string( $atts['subject'] ) ) { - return $atts; - } - - // Look for WooCommerce order patterns in the subject line - $subject = $atts['subject']; - $is_wc_email = false; - $order_id = null; - - // Common WooCommerce email subject patterns - more comprehensive - $patterns = array( - '/Your (.+) order \(#(\d+)\)/', // Customer emails - '/\[(.+)\] New customer order \(#(\d+)\)/', // New order admin email - '/\[(.+)\] Cancelled order \(#(\d+)\)/', // Cancelled order admin email - '/\[(.+)\] Failed order \(#(\d+)\)/', // Failed order admin email - '/Order #(\d+) details/', // Invoice emails - '/Note added to your order #(\d+)/', // Customer note - '/\[(.+)\] Order #(\d+)/', // Generic admin pattern - '/Order (\d+) \-/', // Alternative order pattern - ); - - foreach ( $patterns as $pattern ) { - if ( preg_match( $pattern, $subject, $matches ) ) { - $is_wc_email = true; - // Extract order ID from the match - try different capture groups - if ( isset( $matches[2] ) && is_numeric( $matches[2] ) ) { - $order_id = (int) $matches[2]; - } elseif ( isset( $matches[1] ) && is_numeric( $matches[1] ) ) { - $order_id = (int) $matches[1]; - } - - break; - } - } - - // If this doesn't appear to be a WooCommerce email, let it through - if ( ! $is_wc_email || ! $order_id ) { - return $atts; - } - - // Get the order and check if it's a POS order - $order = wc_get_order( $order_id ); - if ( ! $this->is_pos_order( $order ) ) { - return $atts; - } - - // More robust admin email detection - $is_admin_email = $this->is_likely_admin_email( $atts, $subject ); - - - - - // Check settings and prevent sending if disabled - if ( $is_admin_email ) { - $admin_emails_enabled = (bool) woocommerce_pos_get_settings( 'checkout', 'admin_emails' ); - if ( ! $admin_emails_enabled ) { - Logger::log( 'WCPOS: Prevented admin email for POS order #' . $order_id ); - - return false; // Prevent the email from being sent - } - } else { - $customer_emails_enabled = (bool) woocommerce_pos_get_settings( 'checkout', 'customer_emails' ); - if ( ! $customer_emails_enabled ) { - Logger::log( 'WCPOS: Prevented customer email for POS order #' . $order_id ); - - return false; // Prevent the email from being sent - } - } - - return $atts; - } - - - - - - - - /** - * Handle new order creation - potential trigger for admin emails. - * - * @param int $order_id Order ID. - * @param WC_Order $order Order object. - */ - public function handle_new_order( $order_id, $order = null ): void { - if ( ! $order instanceof WC_Order ) { - $order = wc_get_order( $order_id ); - } - - if ( ! $this->is_pos_order( $order ) ) { - return; - } - - - - // Check if admin emails are enabled and send new order email - $admin_emails_enabled = (bool) woocommerce_pos_get_settings( 'checkout', 'admin_emails' ); - if ( $admin_emails_enabled ) { - $this->force_send_admin_email( 'new_order', $order ); - } - } - - /** - * Handle completed order status - potential trigger for admin emails. - * - * @param int $order_id Order ID. - * @param WC_Order $order Order object. - */ - public function handle_completed_order( $order_id, $order = null ): void { - if ( ! $order instanceof WC_Order ) { - $order = wc_get_order( $order_id ); - } - - if ( ! $this->is_pos_order( $order ) ) { - return; - } - - - - // Check if admin emails are enabled and send new order email (completed orders should also notify admin) - $admin_emails_enabled = (bool) woocommerce_pos_get_settings( 'checkout', 'admin_emails' ); - if ( $admin_emails_enabled ) { - $this->force_send_admin_email( 'new_order', $order ); - } - } - - /** - * Handle thank you page - another potential trigger point. - * - * @param int $order_id Order ID. - */ - public function handle_thankyou_page( $order_id ): void { - $order = wc_get_order( $order_id ); - - if ( ! $this->is_pos_order( $order ) ) { - return; - } - - - - - // but it helps us understand the order flow - } - - - - /** - * Handle order status changes for POS orders. - * This bypasses WooCommerce email settings and manually triggers emails based on POS settings. - * - * @param int $order_id Order ID. - * @param WC_Order $order Order object. - */ - public function handle_order_status_change( $order_id, $order = null ): void { - // Get order if not provided - if ( ! $order instanceof WC_Order ) { - $order = wc_get_order( $order_id ); - } - - // Only handle POS orders - if ( ! $this->is_pos_order( $order ) ) { - return; - } - - $current_hook = current_filter(); - - // Get POS email settings - $admin_emails_enabled = (bool) woocommerce_pos_get_settings( 'checkout', 'admin_emails' ); - $customer_emails_enabled = (bool) woocommerce_pos_get_settings( 'checkout', 'customer_emails' ); - - // Map order status change hooks to email types - $admin_email_triggers = array( - // Regular WooCommerce status changes - 'woocommerce_order_status_pending_to_processing' => 'new_order', - 'woocommerce_order_status_pending_to_completed' => 'new_order', - 'woocommerce_order_status_pending_to_on-hold' => 'new_order', - 'woocommerce_order_status_failed_to_processing' => 'new_order', - 'woocommerce_order_status_failed_to_completed' => 'new_order', - 'woocommerce_order_status_cancelled_to_processing' => 'new_order', - 'woocommerce_order_status_on-hold_to_processing' => 'new_order', - 'woocommerce_order_status_processing_to_cancelled' => 'cancelled_order', - 'woocommerce_order_status_pending_to_failed' => 'failed_order', - 'woocommerce_order_status_on-hold_to_cancelled' => 'cancelled_order', - 'woocommerce_order_status_on-hold_to_failed' => 'failed_order', - - // POS-specific status changes - 'woocommerce_order_status_pos-open_to_processing' => 'new_order', - 'woocommerce_order_status_pos-open_to_completed' => 'new_order', - 'woocommerce_order_status_pos-open_to_on-hold' => 'new_order', - 'woocommerce_order_status_pos-partial_to_processing' => 'new_order', - 'woocommerce_order_status_pos-partial_to_completed' => 'new_order', - 'woocommerce_order_status_pos-partial_to_on-hold' => 'new_order', - 'woocommerce_order_status_pos-open_to_cancelled' => 'cancelled_order', - 'woocommerce_order_status_pos-open_to_failed' => 'failed_order', - 'woocommerce_order_status_pos-partial_to_cancelled' => 'cancelled_order', - 'woocommerce_order_status_pos-partial_to_failed' => 'failed_order', - ); - - $customer_email_triggers = array( - // Regular WooCommerce status changes - 'woocommerce_order_status_pending_to_on-hold' => 'customer_on_hold_order', - 'woocommerce_order_status_pending_to_processing' => 'customer_processing_order', - 'woocommerce_order_status_pending_to_completed' => 'customer_completed_order', - 'woocommerce_order_status_failed_to_processing' => 'customer_processing_order', - 'woocommerce_order_status_failed_to_completed' => 'customer_completed_order', - 'woocommerce_order_status_on-hold_to_processing' => 'customer_processing_order', - - // POS-specific status changes - 'woocommerce_order_status_pos-open_to_on-hold' => 'customer_on_hold_order', - 'woocommerce_order_status_pos-open_to_processing' => 'customer_processing_order', - 'woocommerce_order_status_pos-open_to_completed' => 'customer_completed_order', - 'woocommerce_order_status_pos-partial_to_processing' => 'customer_processing_order', - 'woocommerce_order_status_pos-partial_to_completed' => 'customer_completed_order', - 'woocommerce_order_status_pos-partial_to_on-hold' => 'customer_on_hold_order', - ); - - // Handle admin emails - if ( isset( $admin_email_triggers[ $current_hook ] ) ) { - $email_type = $admin_email_triggers[ $current_hook ]; - - // Get WooCommerce email to check if it's enabled - $mailer = WC()->mailer(); - $emails = $mailer->get_emails(); - $wc_email_enabled = false; - - foreach ( $emails as $email_instance ) { - if ( $email_instance->id === $email_type ) { - $wc_email_enabled = $email_instance->is_enabled(); - - break; - } - } - - if ( $admin_emails_enabled && ! $wc_email_enabled ) { - // POS enabled, WC disabled -> Force send (override WC) - $this->force_send_admin_email( $email_type, $order ); - } elseif ( ! $admin_emails_enabled ) { - // POS disabled -> Block it (regardless of WC setting) - $this->block_default_admin_email( $email_type, $order ); - } - // If POS enabled AND WC enabled -> Let WC handle it normally (no action needed) - } - - // Handle customer emails - if ( isset( $customer_email_triggers[ $current_hook ] ) ) { - $email_type = $customer_email_triggers[ $current_hook ]; - - // Get WooCommerce email to check if it's enabled - $mailer = WC()->mailer(); - $emails = $mailer->get_emails(); - $wc_email_enabled = false; - - foreach ( $emails as $email_instance ) { - if ( $email_instance->id === $email_type ) { - $wc_email_enabled = $email_instance->is_enabled(); - - break; - } - } - - if ( $customer_emails_enabled && ! $wc_email_enabled ) { - // POS enabled, WC disabled -> Force send (override WC) - $this->force_send_customer_email( $email_type, $order ); - } elseif ( ! $customer_emails_enabled ) { - // POS disabled -> Block it (regardless of WC setting) - $this->block_default_customer_email( $email_type, $order ); - } - // If POS enabled AND WC enabled -> Let WC handle it normally (no action needed) - } - } - - /** - * Force send an admin email for POS orders, bypassing WooCommerce settings. - * - * @param string $email_type Email type (new_order, cancelled_order, etc.). - * @param WC_Order $order Order object. - */ - private function force_send_admin_email( $email_type, $order ): void { - $emails = WC()->mailer()->get_emails(); - $email = null; - - // Find the email by its ID (not class name) - foreach ( $emails as $email_instance ) { - if ( $email_instance->id === $email_type ) { - $email = $email_instance; - - break; - } - } - - if ( ! $email ) { - Logger::log( \sprintf( 'WCPOS: Admin email not found: %s', $email_type ) ); - - return; - } - $original_enabled = $email->is_enabled(); - - // Logger::log( \sprintf( - // 'WCPOS Force Admin Email: Order #%s, Email Type: %s, WC Enabled: %s, Forcing Send', - // $order->get_id(), - // $email_type, - // $original_enabled ? 'YES' : 'NO' - // ) ); - - // Temporarily enable the email if it's disabled - if ( ! $original_enabled ) { - $email->enabled = 'yes'; - } - - // Send the email - try { - $email->trigger( $order->get_id(), $order ); - // Logger::log( \sprintf( 'WCPOS: Successfully sent admin email %s for order #%s', $email_type, $order->get_id() ) ); - } catch ( Exception $e ) { - Logger::log( \sprintf( 'WCPOS: Failed to send admin email %s for order #%s: %s', $email_type, $order->get_id(), $e->getMessage() ) ); - } - - // Restore original enabled state - $email->enabled = $original_enabled ? 'yes' : 'no'; - } - - /** - * Force send a customer email for POS orders, bypassing WooCommerce settings. - * - * @param string $email_type Email type (customer_processing_order, etc.). - * @param WC_Order $order Order object. - */ - private function force_send_customer_email( $email_type, $order ): void { - $emails = WC()->mailer()->get_emails(); - $email = null; - - // Find the email by its ID (not class name) - foreach ( $emails as $email_instance ) { - if ( $email_instance->id === $email_type ) { - $email = $email_instance; - - break; - } - } - - if ( ! $email ) { - Logger::log( \sprintf( 'WCPOS: Customer email not found: %s', $email_type ) ); - - return; - } - $original_enabled = $email->is_enabled(); - - // Logger::log( \sprintf( - // 'WCPOS Force Customer Email: Order #%s, Email Type: %s, WC Enabled: %s, Forcing Send', - // $order->get_id(), - // $email_type, - // $original_enabled ? 'YES' : 'NO' - // ) ); - - // Temporarily enable the email if it's disabled - if ( ! $original_enabled ) { - $email->enabled = 'yes'; - } - - // Send the email - try { - $email->trigger( $order->get_id(), $order ); - // Logger::log( \sprintf( 'WCPOS: Successfully sent customer email %s for order #%s', $email_type, $order->get_id() ) ); - } catch ( Exception $e ) { - Logger::log( \sprintf( 'WCPOS: Failed to send customer email %s for order #%s: %s', $email_type, $order->get_id(), $e->getMessage() ) ); - } - - // Restore original enabled state - $email->enabled = $original_enabled ? 'yes' : 'no'; - } - - /** - * Block default admin email for POS orders when POS setting is disabled. - * - * @param string $email_type Email type (new_order, cancelled_order, etc.). - * @param WC_Order $order Order object. - */ - private function block_default_admin_email( $email_type, $order ): void { - $emails = WC()->mailer()->get_emails(); - $email = null; - - // Find the email by its ID (not class name) - foreach ( $emails as $email_instance ) { - if ( $email_instance->id === $email_type ) { - $email = $email_instance; - - break; - } - } - - if ( ! $email ) { - return; - } - $original_enabled = $email->is_enabled(); - - Logger::log( \sprintf( - 'WCPOS Block Admin Email: Order #%s, Email Type: %s, WC Enabled: %s, POS Setting: DISABLED - Blocking', - $order->get_id(), - $email_type, - $original_enabled ? 'YES' : 'NO' - ) ); - - // Temporarily disable the email to prevent default sending - $email->enabled = 'no'; - - // Re-enable after a short delay to restore original state - add_action( 'shutdown', function() use ( $email, $original_enabled ): void { - $email->enabled = $original_enabled ? 'yes' : 'no'; - } ); - } - - /** - * Block default customer email for POS orders when POS setting is disabled. - * - * @param string $email_type Email type (customer_processing_order, etc.). - * @param WC_Order $order Order object. - */ - private function block_default_customer_email( $email_type, $order ): void { - $emails = WC()->mailer()->get_emails(); - $email = null; - - // Find the email by its ID (not class name) - foreach ( $emails as $email_instance ) { - if ( $email_instance->id === $email_type ) { - $email = $email_instance; - - break; - } - } - - if ( ! $email ) { - return; - } - $original_enabled = $email->is_enabled(); - - Logger::log( \sprintf( - 'WCPOS Block Customer Email: Order #%s, Email Type: %s, WC Enabled: %s, POS Setting: DISABLED - Blocking', - $order->get_id(), - $email_type, - $original_enabled ? 'YES' : 'NO' - ) ); - - // Temporarily disable the email to prevent default sending - $email->enabled = 'no'; - - // Re-enable after a short delay to restore original state - add_action( 'shutdown', function() use ( $email, $original_enabled ): void { - $email->enabled = $original_enabled ? 'yes' : 'no'; - } ); - } - - /** - * Determine if an email is likely an admin email based on various factors. - * - * @param array $email_args Email arguments from wp_mail. - * @param string $subject Email subject line. - * - * @return bool True if this looks like an admin email. - */ - private function is_likely_admin_email( $email_args, $subject ) { - $to = $email_args['to']; - - // Check if it's going to the main admin email - $admin_email = get_option( 'admin_email' ); - if ( $to === $admin_email ) { - return true; - } - - // Check if it's going to any WooCommerce admin email addresses - $wc_admin_emails = array( - get_option( 'woocommerce_stock_email_recipient' ), - get_option( 'admin_email' ), - ); - - if ( \in_array( $to, $wc_admin_emails, true ) ) { - return true; - } - - // Check subject patterns that indicate admin emails - $admin_subject_patterns = array( - '/^\[.*\]\s+(New|Cancelled|Failed)\s+.*(order|customer)/i', - '/^\[.*\]\s+Order\s+#\d+/i', - ); - - foreach ( $admin_subject_patterns as $pattern ) { - if ( preg_match( $pattern, $subject ) ) { - return true; - } - } - - // Check if subject starts with [site_name] pattern (common for admin emails) - $site_name = get_bloginfo( 'name' ); - if ( $site_name && 0 === strpos( $subject, '[' . $site_name . ']' ) ) { - return true; - } - - return false; - } - - /** - * Check if an order was created via WooCommerce POS. - * - * @param null|WC_Order $order The order object. - * - * @return bool True if the order was created via POS, false otherwise. - */ - private function is_pos_order( $order ) { - // Handle various input types and edge cases - if ( ! $order instanceof WC_Order ) { - // Sometimes the order is passed as an ID - if ( is_numeric( $order ) ) { - $order = wc_get_order( $order ); - } - - // If we still don't have a valid order, return false - if ( ! $order instanceof WC_Order ) { - return false; - } - } - - // Check if the order was created via WooCommerce POS - return 'woocommerce-pos' === $order->get_created_via(); - } - - /** - * Setup email management hooks for POS orders. - * Uses high priority (999) to ensure these settings override other plugins. - */ - private function setup_email_management(): void { - // Admin emails - these go to store administrators - $admin_emails = array( - 'new_order', - 'cancelled_order', - 'failed_order', - ); - - // Customer emails - these go to customers - $customer_emails = array( - 'customer_on_hold_order', - 'customer_processing_order', - 'customer_completed_order', - 'customer_refunded_order', - 'customer_invoice', - 'customer_note', - 'reset_password', // This is a customer email, not admin - 'new_account', // This is a customer email, not admin - ); - - // Hook into email enabled filters with high priority - foreach ( $admin_emails as $email_id ) { - add_filter( "woocommerce_email_enabled_{$email_id}", array( $this, 'manage_admin_emails' ), 999, 3 ); - } - foreach ( $customer_emails as $email_id ) { - add_filter( "woocommerce_email_enabled_{$email_id}", array( $this, 'manage_customer_emails' ), 999, 3 ); - } - - // Additional safety net - hook into the recipient filters as well to ensure no emails go out when disabled - foreach ( $admin_emails as $email_id ) { - add_filter( "woocommerce_email_recipient_{$email_id}", array( $this, 'filter_admin_email_recipients' ), 999, 4 ); - } - foreach ( $customer_emails as $email_id ) { - add_filter( "woocommerce_email_recipient_{$email_id}", array( $this, 'filter_customer_email_recipients' ), 999, 4 ); - } - - // CRITICAL: Hook directly into order status changes to bypass WooCommerce email settings - // These hooks fire regardless of whether WooCommerce emails are enabled/disabled - - // Regular WooCommerce status changes (for completeness) - add_action( 'woocommerce_order_status_pending_to_processing', array( $this, 'handle_order_status_change' ), 5, 2 ); - add_action( 'woocommerce_order_status_pending_to_completed', array( $this, 'handle_order_status_change' ), 5, 2 ); - add_action( 'woocommerce_order_status_pending_to_on-hold', array( $this, 'handle_order_status_change' ), 5, 2 ); - add_action( 'woocommerce_order_status_failed_to_processing', array( $this, 'handle_order_status_change' ), 5, 2 ); - add_action( 'woocommerce_order_status_failed_to_completed', array( $this, 'handle_order_status_change' ), 5, 2 ); - add_action( 'woocommerce_order_status_cancelled_to_processing', array( $this, 'handle_order_status_change' ), 5, 2 ); - add_action( 'woocommerce_order_status_on-hold_to_processing', array( $this, 'handle_order_status_change' ), 5, 2 ); - add_action( 'woocommerce_order_status_processing_to_cancelled', array( $this, 'handle_order_status_change' ), 5, 2 ); - add_action( 'woocommerce_order_status_pending_to_failed', array( $this, 'handle_order_status_change' ), 5, 2 ); - add_action( 'woocommerce_order_status_on-hold_to_cancelled', array( $this, 'handle_order_status_change' ), 5, 2 ); - add_action( 'woocommerce_order_status_on-hold_to_failed', array( $this, 'handle_order_status_change' ), 5, 2 ); - - // POS-specific status changes - add_action( 'woocommerce_order_status_pos-open_to_processing', array( $this, 'handle_order_status_change' ), 5, 2 ); - add_action( 'woocommerce_order_status_pos-open_to_completed', array( $this, 'handle_order_status_change' ), 5, 2 ); - add_action( 'woocommerce_order_status_pos-open_to_on-hold', array( $this, 'handle_order_status_change' ), 5, 2 ); - add_action( 'woocommerce_order_status_pos-partial_to_processing', array( $this, 'handle_order_status_change' ), 5, 2 ); - add_action( 'woocommerce_order_status_pos-partial_to_completed', array( $this, 'handle_order_status_change' ), 5, 2 ); - add_action( 'woocommerce_order_status_pos-partial_to_on-hold', array( $this, 'handle_order_status_change' ), 5, 2 ); - add_action( 'woocommerce_order_status_pos-open_to_cancelled', array( $this, 'handle_order_status_change' ), 5, 2 ); - add_action( 'woocommerce_order_status_pos-open_to_failed', array( $this, 'handle_order_status_change' ), 5, 2 ); - add_action( 'woocommerce_order_status_pos-partial_to_cancelled', array( $this, 'handle_order_status_change' ), 5, 2 ); - add_action( 'woocommerce_order_status_pos-partial_to_failed', array( $this, 'handle_order_status_change' ), 5, 2 ); - - // Ultimate failsafe - use wp_mail filter to prevent sending at the last moment - add_filter( 'wp_mail', array( $this, 'prevent_disabled_pos_emails' ), 999, 1 ); - - - - // Additional hooks for admin emails - these might catch cases the status change hooks miss - add_action( 'woocommerce_new_order', array( $this, 'handle_new_order' ), 5, 2 ); - add_action( 'woocommerce_order_status_completed', array( $this, 'handle_completed_order' ), 5, 2 ); - add_action( 'woocommerce_thankyou', array( $this, 'handle_thankyou_page' ), 5, 1 ); - } - /** * Register the POS order statuses. */ diff --git a/includes/wcpos-functions.php b/includes/wcpos-functions.php index 51829de..2057a64 100644 --- a/includes/wcpos-functions.php +++ b/includes/wcpos-functions.php @@ -17,8 +17,8 @@ */ use WCPOS\WooCommercePOS\Admin\Permalink; -use WCPOS\WooCommercePOS\Services\Settings; use const WCPOS\WooCommercePOS\PLUGIN_PATH; +use WCPOS\WooCommercePOS\Services\Settings; use const WCPOS\WooCommercePOS\SHORT_NAME; use const WCPOS\WooCommercePOS\VERSION; @@ -207,7 +207,7 @@ function woocommerce_pos_faq_url( $page ): string { } } -/** +/* * Helper function checks whether order is a POS order * * @param $order WC_Order|int @@ -215,15 +215,22 @@ function woocommerce_pos_faq_url( $page ): string { */ if ( ! \function_exists( 'woocommerce_pos_is_pos_order' ) ) { function woocommerce_pos_is_pos_order( $order ): bool { - $order = is_int( $order ) ? wc_get_order( $order ) : $order; - - if ( $order instanceof WC_Order ) { - $legacy = $order->get_meta( '_pos', true ); - $created_via = $order->get_created_via(); - - return 'woocommerce-pos' === $created_via || '1' === $legacy; + // Handle various input types and edge cases + if ( ! $order instanceof WC_Order ) { + // Sometimes the order is passed as an ID + if ( is_numeric( $order ) ) { + $order = wc_get_order( $order ); + } + + // If we still don't have a valid order, return false + if ( ! $order instanceof WC_Order ) { + return false; + } } - return false; + $legacy = $order->get_meta( '_pos', true ); + $created_via = $order->get_created_via(); + + return 'woocommerce-pos' === $created_via || '1' === $legacy; } } diff --git a/readme.txt b/readme.txt index d8ce56d..6031a59 100644 --- a/readme.txt +++ b/readme.txt @@ -88,7 +88,10 @@ There is more information on our website at [https://wcpos.com](https://wcpos.co == Changelog == -= 1.8.0 - 2025/07/XX = += 1.8.0 - 2025/08/XX = + += 1.7.13 - 2025/08/06 = +* Fix: New Order emails to send after order calculations = 1.7.12 - 2025/07/25 = * Security Fix: POS receipts should not be publically accessible, NOTE: you may need to re-sync past orders to view the receipt From 96db01ed5c67f43a53b6632471a873d55fc93213 Mon Sep 17 00:00:00 2001 From: Paul Kilmurray Date: Thu, 7 Aug 2025 12:57:41 +0200 Subject: [PATCH 16/22] Merge Emails class from v1.7 --- includes/Emails.php | 156 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 includes/Emails.php diff --git a/includes/Emails.php b/includes/Emails.php new file mode 100644 index 0000000..88db447 --- /dev/null +++ b/includes/Emails.php @@ -0,0 +1,156 @@ + + * + * @see http://wcpos.com + */ + +namespace WCPOS\WooCommercePOS; + +use WC_Email; +use WC_Order; + +/** + * Emails Class + * - manages email sending for POS orders. + */ +class Emails { + /** + * Constructor. + */ + public function __construct() { + // Get filterable email arrays - allow users to customize which emails are affected + $admin_emails = apply_filters( 'woocommerce_pos_admin_emails', array( + 'cancelled_order', + 'failed_order', + ) ); + + $customer_emails = apply_filters( 'woocommerce_pos_customer_emails', array( + 'customer_failed_order', + 'customer_on_hold_order', + 'customer_processing_order', + 'customer_completed_order', + 'customer_refunded_order', + ) ); + + // Hook into email enabled filters - this is the main control mechanism + foreach ( $admin_emails as $email_id ) { + add_filter( "woocommerce_email_enabled_{$email_id}", array( $this, 'manage_admin_emails' ), 999, 3 ); + } + foreach ( $customer_emails as $email_id ) { + add_filter( "woocommerce_email_enabled_{$email_id}", array( $this, 'manage_customer_emails' ), 999, 3 ); + } + + // Manually trigger new_order email for POS status changes + // WooCommerce doesn't automatically trigger new_order for pos-open/pos-partial transitions + add_action( 'woocommerce_order_status_pos-open_to_completed', array( $this, 'trigger_new_order_email' ), 10, 2 ); + add_action( 'woocommerce_order_status_pos-open_to_processing', array( $this, 'trigger_new_order_email' ), 10, 2 ); + add_action( 'woocommerce_order_status_pos-open_to_on-hold', array( $this, 'trigger_new_order_email' ), 10, 2 ); + add_action( 'woocommerce_order_status_pos-partial_to_completed', array( $this, 'trigger_new_order_email' ), 10, 2 ); + add_action( 'woocommerce_order_status_pos-partial_to_processing', array( $this, 'trigger_new_order_email' ), 10, 2 ); + add_action( 'woocommerce_order_status_pos-partial_to_on-hold', array( $this, 'trigger_new_order_email' ), 10, 2 ); + } + + /** + * Manage admin email sending for POS orders. + * Only affects orders created via WooCommerce POS. + * + * @param bool $enabled Whether the email is enabled. + * @param null|WC_Order $order The order object. + * @param mixed|WC_Email $email_class The email class. + * + * @return bool Whether the email should be sent. + */ + public function manage_admin_emails( $enabled, $order, $email_class ) { + // Only control emails for POS orders + if ( ! woocommerce_pos_is_pos_order( $order ) ) { + return $enabled; + } + + // Get email ID for filtering + $email_id = $email_class instanceof WC_Email ? $email_class->id : 'unknown'; + + // Get POS admin email setting + $admin_emails_enabled = (bool) woocommerce_pos_get_settings( 'checkout', 'admin_emails' ); + + + + // Allow final filtering of the email enabled status + return apply_filters( 'woocommerce_pos_admin_email_enabled', $admin_emails_enabled, $email_id, $order, $email_class ); + } + + /** + * Manage customer email sending for POS orders. + * Only affects orders created via WooCommerce POS. + * + * @param bool $enabled Whether the email is enabled. + * @param null|WC_Order $order The order object. + * @param mixed|WC_Email $email_class The email class. + * + * @return bool Whether the email should be sent. + */ + public function manage_customer_emails( $enabled, $order, $email_class ) { + // Only control emails for POS orders + if ( ! woocommerce_pos_is_pos_order( $order ) ) { + return $enabled; + } + + // Get email ID for filtering + $email_id = $email_class instanceof WC_Email ? $email_class->id : 'unknown'; + + // Get POS customer email setting + $customer_emails_enabled = (bool) woocommerce_pos_get_settings( 'checkout', 'customer_emails' ); + + + + // Allow final filtering of the email enabled status + return apply_filters( 'woocommerce_pos_customer_email_enabled', $customer_emails_enabled, $email_id, $order, $email_class ); + } + + /** + * Manually trigger new_order admin email for POS orders. + * This is needed because WooCommerce doesn't automatically trigger new_order + * for pos-open/pos-partial status transitions. + * + * @param int $order_id Order ID. + * @param WC_Order $order Order object. + */ + public function trigger_new_order_email( $order_id, $order = null ): void { + if ( ! $order ) { + $order = wc_get_order( $order_id ); + } + + if ( ! woocommerce_pos_is_pos_order( $order ) ) { + return; + } + + // Check if admin emails are enabled + $admin_emails_enabled = (bool) woocommerce_pos_get_settings( 'checkout', 'admin_emails' ); + if ( ! $admin_emails_enabled ) { + return; + } + + // Get the new_order email by ID, not class name + $mailer = WC()->mailer(); + $emails = $mailer->get_emails(); + + foreach ( $emails as $email ) { + if ( 'new_order' === $email->id ) { + // Temporarily enable the email to ensure it sends + $original_enabled = $email->enabled; + $email->enabled = 'yes'; + + // Trigger the email + $email->trigger( $order_id, $order ); + + // Restore original state + $email->enabled = $original_enabled; + + break; + } + } + } +} From 7c59068241558ac07095740c531abf13884ac03e Mon Sep 17 00:00:00 2001 From: Paul Kilmurray Date: Fri, 8 Aug 2025 18:11:05 +0200 Subject: [PATCH 17/22] add refresh endpoint for auth token --- includes/API/Auth.php | 77 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/includes/API/Auth.php b/includes/API/Auth.php index 1791f79..aa48e80 100644 --- a/includes/API/Auth.php +++ b/includes/API/Auth.php @@ -10,6 +10,7 @@ namespace WCPOS\WooCommercePOS\API; +use WCPOS\WooCommercePOS\Services\Auth as AuthService; use const WCPOS\WooCommercePOS\SHORT_NAME; use WP_REST_Controller; use WP_REST_Request; @@ -48,6 +49,24 @@ public function register_routes(): void { 'permission_callback' => '__return_true', // Public endpoint - no authentication required ) ); + + // Refresh access token using refresh token + register_rest_route( + $this->namespace, + '/' . $this->rest_base . '/refresh', + array( + 'methods' => WP_REST_Server::CREATABLE, + 'callback' => array( $this, 'refresh_token' ), + 'permission_callback' => '__return_true', // Public endpoint - validates refresh token internally + 'args' => array( + 'refresh_token' => array( + 'description' => __( 'The refresh token to use for generating a new access token.', 'woocommerce-pos' ), + 'type' => 'string', + 'required' => true, + ), + ), + ) + ); } @@ -106,4 +125,62 @@ public function test_authorization( WP_REST_Request $request ): WP_REST_Response return rest_ensure_response( $response_data ); } + + /** + * Refresh access token using a valid refresh token. + * + * This endpoint allows clients to obtain a new access token using a valid refresh token. + * Compatible with the axios-auth-refresh library and follows OAuth 2.0 refresh token flow. + * + * @param WP_REST_Request $request The REST request object. + * + * @return WP_REST_Response + */ + public function refresh_token( WP_REST_Request $request ): WP_REST_Response { + $refresh_token = $request->get_param( 'refresh_token' ); + + if ( empty( $refresh_token ) ) { + return rest_ensure_response( array( + 'error' => 'invalid_request', + 'error_description' => 'Missing refresh_token parameter', + ), 400 ); + } + + $auth_service = AuthService::instance(); + $result = $auth_service->refresh_access_token( $refresh_token ); + + if ( is_wp_error( $result ) ) { + $error_code = $result->get_error_code(); + $error_msg = $result->get_error_message(); + $status = $result->get_error_data()['status'] ?? 400; + + // Map error codes to OAuth 2.0 standard error responses + $oauth_error = 'invalid_grant'; // Default OAuth error for refresh token issues + + if ( false !== strpos( $error_code, 'invalid_token' ) || false !== strpos( $error_code, 'revoked' ) ) { + $oauth_error = 'invalid_grant'; + } elseif ( false !== strpos( $error_code, 'user_not_found' ) ) { + $oauth_error = 'invalid_grant'; + } + + return rest_ensure_response( array( + 'error' => $oauth_error, + 'error_description' => $error_msg, + ), $status ); + } + + // Calculate expires_in for axios-auth-refresh compatibility + $current_time = time(); + $expires_in = max( 0, $result['expires_at'] - $current_time ); + + // Return response in format compatible with axios-auth-refresh + $response_data = array( + 'access_token' => $result['access_token'], + 'token_type' => $result['token_type'], + 'expires_in' => $expires_in, + 'expires_at' => $result['expires_at'], + ); + + return rest_ensure_response( $response_data ); + } } From 100a6688dfdff54c7f7a933744ceed0a24f938b2 Mon Sep 17 00:00:00 2001 From: Paul Kilmurray Date: Fri, 8 Aug 2025 18:48:42 +0200 Subject: [PATCH 18/22] add demo/dem login for demo sites --- templates/auth.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/templates/auth.php b/templates/auth.php index c6aedb1..42c06cb 100644 --- a/templates/auth.php +++ b/templates/auth.php @@ -71,5 +71,26 @@
+ + \ No newline at end of file From 2fe7c48a0bb336c57e57993b205a246fda02f056 Mon Sep 17 00:00:00 2001 From: Paul Kilmurray Date: Wed, 13 Aug 2025 13:49:48 +0200 Subject: [PATCH 19/22] Exclude a list of product barcode that provide their own fields --- includes/Admin/Products/Single_Product.php | 24 +++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/includes/Admin/Products/Single_Product.php b/includes/Admin/Products/Single_Product.php index 2e3e990..2cde53d 100644 --- a/includes/Admin/Products/Single_Product.php +++ b/includes/Admin/Products/Single_Product.php @@ -46,7 +46,7 @@ public function __construct() { 'online_only' => __( 'Online Only', 'woocommerce-pos' ), ); - if ( $this->barcode_field && ! \in_array( $this->barcode_field, array( '_sku', '_global_unique_id' ), true ) ) { + if ( $this->barcode_field && ! \in_array( $this->barcode_field, $this->get_excluded_barcode_fields(), true ) ) { add_action( 'woocommerce_product_options_sku', array( $this, 'woocommerce_product_options_sku' ) ); add_action( 'woocommerce_process_product_meta', array( $this, 'woocommerce_process_product_meta' ) ); add_action( 'woocommerce_product_after_variable_attributes', array( $this, 'after_variable_attributes_barcode_field' ), 10, 3 ); @@ -280,4 +280,26 @@ public function save_product_variation_pos_only_products( $variation_id ): void $settings_instance->update_visibility_settings( $args ); } } + + /** + * Get the list of barcode fields that should be excluded from custom barcode field functionality. + * + * These fields are built-in WooCommerce or plugin fields that don't need custom barcode input. + * + * @return array Array of excluded barcode field keys. + */ + private function get_excluded_barcode_fields(): array { + $excluded_fields = array( + '_sku', // default WooCommerce SKU field + '_global_unique_id', // default WooCommerce GTIN, UPC, EAN, or ISBN + '_alg_ean', // https://wpfactory.com/item/ean-barcodes-woocommerce/ + ); + + /* + * Filter the list of barcode fields that should be excluded from custom barcode field functionality. + * + * @param array $excluded_fields Array of field keys to exclude from custom barcode input. + */ + return apply_filters( 'woocommerce_pos_excluded_custom_barcode_fields', $excluded_fields ); + } } From 84a628e1c42adf6d624c136789f915066098e6ab Mon Sep 17 00:00:00 2001 From: Paul Kilmurray Date: Tue, 19 Aug 2025 18:16:25 +0200 Subject: [PATCH 20/22] Update indexeddb.worker.js --- assets/js/indexeddb.worker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/indexeddb.worker.js b/assets/js/indexeddb.worker.js index c5bb931..21aa3de 100644 --- a/assets/js/indexeddb.worker.js +++ b/assets/js/indexeddb.worker.js @@ -1 +1 @@ -(()=>{function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}function t(t){var n=function(t,n){if("object"!=e(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var o=r.call(t,n||"default");if("object"!=e(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(t)}(t,"string");return"symbol"==e(n)?n:n+""}function n(e,n){for(var r=0;r!1,deepFreezeWhenDevMode:e=>e,tunnelErrorMessage:e=>"RxDB Error-Code "+e+".\n Error messages are not included in RxDB core to reduce build size.\n "};function c(e,t,n){return"RxError ("+t+"):\n"+e+"\n"+function(e){var t="";return 0===Object.keys(e).length?t:(t+="Given parameters: {\n",t+=Object.keys(e).map((t=>{var n="[object Object]";try{n="errors"===t?e[t].map((e=>JSON.stringify(e,Object.getOwnPropertyNames(e)))):JSON.stringify(e[t],(function(e,t){return void 0===t?null:t}),2)}catch(e){}return t+":"+n})).join("\n"),t+="}")}(n)}var u=function(e){function t(t,n,r={}){var o,i=c(n,t,r);return(o=e.call(this,i)||this).code=t,o.message=i,o.url=l(t),o.parameters=r,o.rxdb=!0,o}var o,i;return i=e,(o=t).prototype=Object.create(i.prototype),o.prototype.constructor=o,r(o,i),t.prototype.toString=function(){return this.message},function(e,t,r){return t&&n(e.prototype,t),r&&n(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}(t,[{key:"name",get:function(){return"RxError ("+this.code+")"}},{key:"typeError",get:function(){return!1}}])}(s(Error));function l(e){return"https://rxdb.info/errors.html?console=errors#"+e}function f(e){return"\n You can find out more about this error here: "+l(e)+" "}function d(e,t){return new u(e,a.tunnelErrorMessage(e)+f(e),t)}var h=/\./g,p="abcdefghijklmnopqrstuvwxyz",m=e=>{var t=typeof e;return null!==e&&("object"===t||"function"===t)},v=new Set(["__proto__","prototype","constructor"]),y=new Set("0123456789");function b(e){var t=[],n="",r="start",o=!1;for(var i of e)switch(i){case"\\":if("index"===r)throw new Error("Invalid character in an index");if("indexEnd"===r)throw new Error("Invalid character after an index");o&&(n+=i),r="property",o=!o;break;case".":if("index"===r)throw new Error("Invalid character in an index");if("indexEnd"===r){r="property";break}if(o){o=!1,n+=i;break}if(v.has(n))return[];t.push(n),n="",r="property";break;case"[":if("index"===r)throw new Error("Invalid character in an index");if("indexEnd"===r){r="index";break}if(o){o=!1,n+=i;break}if("property"===r){if(v.has(n))return[];t.push(n),n=""}r="index";break;case"]":if("index"===r){t.push(Number.parseInt(n,10)),n="",r="indexEnd";break}if("indexEnd"===r)throw new Error("Invalid character after an index");default:if("index"===r&&!y.has(i))throw new Error("Invalid character in an index");if("indexEnd"===r)throw new Error("Invalid character after an index");"start"===r&&(r="property"),o&&(o=!1,n+="\\"),n+=i}switch(o&&(n+="\\"),r){case"property":if(v.has(n))return[];t.push(n);break;case"index":throw new Error("Index was not closed");case"start":t.push("")}return t}function g(e,t){if("number"!=typeof t&&Array.isArray(e)){var n=Number.parseInt(t,10);return Number.isInteger(n)&&e[n]===e[t]}return!1}function w(e,t){var n=function(e,t,n){if(Array.isArray(t)&&(t=t.join(".")),!t.includes(".")&&!t.includes("["))return e[t];if(!m(e)||"string"!=typeof t)return void 0===n?e:n;var r=b(t);if(0===r.length)return n;for(var o=0;ot[e]:e=>{for(var r=e,o=0;o"desc"===Object.values(e)[0])),i=new Set;Object.keys(n).forEach((t=>{var r=w(e,t);r&&"boolean"===r.type&&Object.prototype.hasOwnProperty.call(n[t],"$eq")&&i.add(t)}));var s,a=t.sort.map((e=>Object.keys(e)[0])).filter((e=>!i.has(e))).join(","),c=-1;if(r.forEach((e=>{var r=!0,u=!0,l=e.map((e=>{var t=n[e],o=t?Object.keys(t):[],i={};return t&&o.length?o.forEach((e=>{if(D.has(e)){var n=function(e,t){switch(e){case"$eq":return{startKey:t,endKey:t,inclusiveEnd:!0,inclusiveStart:!0};case"$lte":return{endKey:t,inclusiveEnd:!0};case"$gte":return{startKey:t,inclusiveStart:!0};case"$lt":return{endKey:t,inclusiveEnd:!1};case"$gt":return{startKey:t,inclusiveStart:!1};default:throw new Error("SNH")}}(e,t[e]);i=Object.assign(i,n)}})):i={startKey:u?A:N,endKey:r?N:A,inclusiveStart:!0,inclusiveEnd:!0},void 0===i.startKey&&(i.startKey=A),void 0===i.endKey&&(i.endKey=N),void 0===i.inclusiveStart&&(i.inclusiveStart=!0),void 0===i.inclusiveEnd&&(i.inclusiveEnd=!0),u&&!i.inclusiveStart&&(u=!1),r&&!i.inclusiveEnd&&(r=!1),i})),f=l.map((e=>e.startKey)),d=l.map((e=>e.endKey)),h={index:e,startKeys:f,endKeys:d,inclusiveEnd:r,inclusiveStart:u,sortSatisfiedByIndex:!o&&a===e.filter((e=>!i.has(e))).join(","),selectorSatisfiedByIndex:C(e,t.selector,f,d)},p=function(e,t,n){var r=0,o=e=>{e>0&&(r+=e)},i=10,s=P(n.startKeys,(e=>e!==A&&e!==N));o(s*i);var a=P(n.startKeys,(e=>e!==N&&e!==A));o(a*i);var c=P(n.startKeys,((e,t)=>e===n.endKeys[t]));return o(c*i*1.5),o(n.sortSatisfiedByIndex?5:0),r}(0,0,h);(p>=c||t.index)&&(c=p,s=h)})),!s)throw d("SNH",{query:t});return s}var D=new Set(["$eq","$gt","$gte","$lt","$lte"]),M=new Set(["$eq","$gt","$gte"]),T=new Set(["$eq","$lt","$lte"]);function C(e,t,n,r){var o=Object.entries(t).find((([t,n])=>!e.includes(t)||Object.entries(n).find((([e,t])=>!D.has(e)))));if(o)return!1;if(t.$and||t.$or)return!1;var i=[],s=new Set;for(var[a,c]of Object.entries(t)){if(!e.includes(a))return!1;var u=Object.keys(c).filter((e=>M.has(e)));if(u.length>1)return!1;var l=u[0];if(l&&s.add(a),"$eq"!==l){if(i.length>0)return!1;i.push(l)}}var f=[],d=new Set;for(var[h,p]of Object.entries(t)){if(!e.includes(h))return!1;var m=Object.keys(p).filter((e=>T.has(e)));if(m.length>1)return!1;var v=m[0];if(v&&d.add(h),"$eq"!==v){if(f.length>0)return!1;f.push(v)}}var y=0;for(var b of e){for(var g of[s,d]){if(!g.has(b)&&g.size>0)return!1;g.delete(b)}if(n[y]!==r[y]&&s.size>0&&d.size>0)return!1;y++}return!0}function B(e,t){if(!t.sort)throw d("SNH",{query:t});return{query:t,queryPlan:$(e,t)}}class R extends Error{}const L=Number.MAX_SAFE_INTEGER,K=Number.MIN_SAFE_INTEGER,q=Symbol("missing"),F=Object.freeze(new Error("mingo: cycle detected while processing object/array")),U=/^\[object ([a-zA-Z0-9]+)\]$/,z=e=>{const t=Se(e);let n=0,r=t.length;for(;r;)n=(n<<5)-n^t.charCodeAt(--r);return n>>>0},W=new Set(["null","undefined","boolean","number","string","date","regexp"]),J={null:0,undefined:0,number:1,string:2,object:3,array:4,boolean:5,date:6,regexp:7,function:8},V=(e,t)=>{e===q&&(e=void 0),t===q&&(t=void 0);const[n,r]=[e,t].map((e=>J[G(e).toLowerCase()]));return n!==r?n-r:1===n||2===n||6===n?et?1:0:we(e,t)?0:et?1:0};function H(e,t){if(!e)throw new R(t)}const G=e=>U.exec(Object.prototype.toString.call(e))[1],Y=e=>"boolean"==typeof e,Q=e=>"string"==typeof e,X=e=>!isNaN(e)&&"number"==typeof e,Z=Array.isArray,ee=e=>{if(!e)return!1;const t=Object.getPrototypeOf(e);return(t===Object.prototype||null===t)&&"[object Object]"===Object.prototype.toString.call(e)},te=e=>e===Object(e),ne=e=>e instanceof Date,re=e=>e instanceof RegExp,oe=e=>"function"==typeof e,ie=e=>null==e,se=(e,t)=>e.includes(t),ae=(e,t)=>!se(e,t),ce=e=>ie(e)||Q(e)&&!e||e instanceof Array&&0===e.length||ee(e)&&0===Object.keys(e).length,ue=e=>e===q,le=e=>e instanceof Array?e:[e],fe=(e,t)=>!!e&&Object.prototype.hasOwnProperty.call(e,t),de=e=>"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView(e),he=[ne,re,de],pe=(e,t)=>{if(ie(e))return e;if(t.has(e))throw F;const n=e.constructor;if(he.some((t=>t(e))))return new n(e);try{if(t.add(e),Z(e))return e.map((e=>pe(e,t)));if(ee(e)){const n={};for(const r in e)n[r]=pe(e[r],t);return n}}finally{t.delete(e)}return e},me=e=>pe(e,new Set);function ve(e,t,n){if(n=n||{flatten:!1},ue(e)||ie(e))return t;if(ue(t)||ie(t))return e;if(o=t,!(ee(r=e)&&ee(o)||Z(r)&&Z(o))){if(n.skipValidation)return t||e;throw Error("mismatched types. must both be array or object")}var r,o;if(n.skipValidation=!0,Z(e)){const r=e,o=t;if(n.flatten){let e=0,i=0;for(;e{const i=Oe(r,t);n.has(i)?n.get(i).some((t=>we(e[t],r)))||n.get(i).push(o):n.set(i,[o])})),n}function be(e,t=z){if(e.some((e=>0==e.length)))return[];if(1===e.length)return Array.from(e);const n=function(e,t,n=V){if(ce(e))return e;const r=new Array,o=new Array;for(let n=0;nn(e[0],t[0]))),_e(o,r.map((e=>e[1])))}(e.map(((e,t)=>[t,e.length])),(e=>e[1])),r=e[n[0][0]],o=ye(r,t),i=new Map,s=new Array;return o.forEach(((t,o)=>{const a=t.map((e=>r[e])),c=a.map((e=>0)),u=a.map((e=>[n[0][0],0]));let l=!1;for(let t=1;tf[e]));l=a.map(((n,s)=>e.some(((e,a)=>{const l=c[s];return we(n,e)&&(c[s]++,rt===e.length-1?[a[n],u[n]]:q)).filter((e=>e!==q)))})),s.sort(((e,t)=>{const[n,[r,o]]=e,[i,[s,a]]=t,c=V(r,s);return 0!==c?c:V(o,a)})).map((e=>e[0]))}function ge(e,t=0){const n=new Array;return function e(t,r){for(let o=0,i=t.length;o0||r<0)?e(t[o],Math.max(-1,r-1)):n.push(t[o])}(e,t),n}function we(e,t){if(e===t||Object.is(e,t))return!0;const n=!!e&&e.constructor||e;if(null===e||null===t||void 0===e||void 0===t||n!==t.constructor||n===Function)return!1;if(n===Array||n===Object){const n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;if(new Set([...n,...r]).size!=n.length)return!1;for(const r of n)if(!we(e[r],t[r]))return!1;return!0}const r=Object.getPrototypeOf(e);return(de(e)||r!==Object.prototype&&r!==Array.prototype&&Object.prototype.hasOwnProperty.call(r,"toString"))&&e.toString()===t.toString()}const xe=(e,t)=>{if(null===e)return"null";if(void 0===e)return"undefined";const n=e.constructor;switch(n){case RegExp:case Number:case Boolean:case Function:case Symbol:return e.toString();case String:return JSON.stringify(e);case Date:return e.toISOString()}if(de(e))return n.name+"["+e.toString()+"]";if(t.has(e))throw F;try{if(t.add(e),Z(e))return"["+e.map((e=>xe(e,t))).join(",")+"]";if(n===Object)return"{"+Object.keys(e).sort().map((n=>n+":"+xe(e[n],t))).join(",")+"}";const r=Object.getPrototypeOf(e);if(r!==Object.prototype&&r!==Array.prototype&&Object.prototype.hasOwnProperty.call(r,"toString"))return n.name+"("+JSON.stringify(e.toString())+")";const[o,i]=(e=>{let[t,n]=[Object.getPrototypeOf(e),Object.getOwnPropertyNames(e)],r=t;for(;!n.length&&t!==Object.prototype&&t!==Array.prototype;)r=t,n=Object.getOwnPropertyNames(t),t=Object.getPrototypeOf(t);const o={};return n.forEach((t=>o[t]=e[t])),[o,r]})(e);return n.name+xe(o,t)}finally{t.delete(e)}},Se=e=>xe(e,new Set);function Oe(e,t){return t=t||z,ie(e)?null:t(e).toString()}function Ie(e,t,n=z){if(e.length<1)return new Map;const r=new Map,o=new Map;for(let i=0;iwe(e,a))):null;ie(e)?(o.set(a,[s]),r.has(c)?r.get(c).push(a):r.set(c,[a])):o.get(e).push(s)}}return o}const Ee=5e4;function _e(e,...t){return e instanceof Array?t.reduce(((e,t)=>{let n=Math.ceil(t.length/Ee),r=0;for(;n-- >0;)Array.prototype.push.apply(e,t.slice(r,r+Ee)),r+=Ee;return e}),e):t.filter(te).reduce(((e,t)=>(Object.assign(e,t),e)),e)}function je(e,t){return te(e)?e[t]:void 0}function ke(e,t,n){let r=0;const o=W.has(G(e).toLowerCase())?e:function e(t,n){let o=t;for(let t=0;t0)break;r+=1;const i=n.slice(t);o=o.reduce(((t,n)=>{const r=e(n,i);return void 0!==r&&t.push(r),t}),[]);break}if(o=je(o,i),void 0===o)break}return o}(e,t.split("."));return o instanceof Array&&n?.unwrapArray?function(e,t){if(t<1)return e;for(;t--&&1===e.length;)e=e[0];return e}(o,r):o}function Pe(e,t,n){const r=t.split("."),o=r[0],i=r.slice(1).join("."),s=null!==/^\d+$/.exec(o),a=r.length>1;let c,u;if(e instanceof Array)if(s)c=je(e,Number(o)),a&&(c=Pe(c,i,n)),c=[c];else{c=[];for(const r of e)u=Pe(r,t,n),n?.preserveMissing?(void 0===u&&(u=q),c.push(u)):void 0!==u&&c.push(u)}else{if(u=je(e,o),a&&(u=Pe(u,i,n)),void 0===u)return;c=n?.preserveKeys?{...e}:{},c[o]=u}return c}function Ne(e){if(e instanceof Array)for(let t=e.length-1;t>=0;t--)e[t]===q?e.splice(t,1):Ne(e[t]);else if(ee(e))for(const t in e)fe(e,t)&&Ne(e[t])}const Ae=/^\d+$/;function $e(e,t,n,r){const o=t.split("."),i=o[0],s=o.slice(1).join(".");if(1===o.length)(ee(e)||Z(e)&&Ae.test(i))&&n(e,i);else{r?.buildGraph&&ie(e[i])&&(e[i]={});const t=e[i];if(!t)return;const a=!!(o.length>1&&Ae.test(o[1]));t instanceof Array&&r?.descendArray&&!a?t.forEach((e=>$e(e,s,n,r))):$e(t,s,n,r)}}function De(e,t,n){$e(e,t,((e,t)=>{e[t]=oe(n)?n(e[t]):n}),{buildGraph:!0})}function Me(e,t,n){$e(e,t,((e,t)=>{if(e instanceof Array){if(/^\d+$/.test(t))e.splice(parseInt(t),1);else if(n&&n.descendArray)for(const n of e)ee(n)&&delete n[t]}else ee(e)&&delete e[t]}),n)}const Te=/^\$[a-zA-Z0-9_]+$/;function Ce(e){return Te.test(e)}function Be(e){if(W.has(G(e).toLowerCase()))return re(e)?{$regex:e}:{$eq:e};if(te(e)){const t=e;if(!Object.keys(t).some(Ce))return{$eq:e};if(fe(e,"$regex")){const t={...e};return t.$regex=new RegExp(e.$regex,e.$options),delete t.$options,t}}return e}var Re=(e=>(e.CLONE_ALL="CLONE_ALL",e.CLONE_INPUT="CLONE_INPUT",e.CLONE_OUTPUT="CLONE_OUTPUT",e.CLONE_OFF="CLONE_OFF",e))(Re||{});class Le{constructor(e,t,n,r=Date.now()){this._opts=e,this._root=t,this._local=n,this.timestamp=r,this.update(t,n)}static init(e,t,n){return e instanceof Le?new Le(e._opts,ie(e.root)?t:e.root,Object.assign({},e.local,n)):new Le(e,t,n)}update(e,t){return this._root=e,this._local=t?Object.assign({},t,{variables:Object.assign({},this._local?.variables,t?.variables)}):t,this}getOptions(){return Object.freeze({...this._opts,context:Fe.from(this._opts.context)})}get root(){return this._root}get local(){return this._local}get idKey(){return this._opts.idKey}get collation(){return this._opts?.collation}get processingMode(){return this._opts?.processingMode||"CLONE_OFF"}get useStrictMode(){return this._opts?.useStrictMode}get scriptEnabled(){return this._opts?.scriptEnabled}get useGlobalContext(){return this._opts?.useGlobalContext}get hashFunction(){return this._opts?.hashFunction}get collectionResolver(){return this._opts?.collectionResolver}get jsonSchemaValidator(){return this._opts?.jsonSchemaValidator}get variables(){return this._opts?.variables}get context(){return this._opts?.context}}function Ke(e){return e instanceof Le?e.getOptions():Object.freeze({idKey:"_id",scriptEnabled:!0,useStrictMode:!0,useGlobalContext:!0,processingMode:"CLONE_OFF",...e,context:e?.context?Fe.from(e?.context):Fe.init({})})}var qe=(e=>(e.ACCUMULATOR="accumulator",e.EXPRESSION="expression",e.PIPELINE="pipeline",e.PROJECTION="projection",e.QUERY="query",e.WINDOW="window",e))(qe||{});class Fe{constructor(e){this.operators={accumulator:{},expression:{},pipeline:{},projection:{},query:{},window:{}};for(const[t,n]of Object.entries(e))this.addOperators(t,n)}static init(e={}){return new Fe(e)}static from(e){return new Fe(e.operators)}addOperators(e,t){for(const[n,r]of Object.entries(t))this.getOperator(e,n)||(this.operators[e][n]=r);return this}addAccumulatorOps(e){return this.addOperators("accumulator",e)}addExpressionOps(e){return this.addOperators("expression",e)}addQueryOps(e){return this.addOperators("query",e)}addPipelineOps(e){return this.addOperators("pipeline",e)}addProjectionOps(e){return this.addOperators("projection",e)}addWindowOps(e){return this.addOperators("window",e)}getOperator(e,t){return e in this.operators&&this.operators[e][t]||null}}const Ue=Fe.init();function ze(e,t){for(const[n,r]of Object.entries(t)){H(oe(r)&&Ce(n),`'${n}' is not a valid operator`);const t=We(e,n,null);H(!t||r===t,`${n} already exists for '${e}' operators. Cannot change operator function once registered.`)}switch(e){case"accumulator":Ue.addAccumulatorOps(t);break;case"expression":Ue.addExpressionOps(t);break;case"pipeline":Ue.addPipelineOps(t);break;case"projection":Ue.addProjectionOps(t);break;case"query":Ue.addQueryOps(t);break;case"window":Ue.addWindowOps(t)}}function We(e,t,n){const{context:r,useGlobalContext:o}=n||{},i=r?r.getOperator(e,t):null;return!i&&o?Ue.getOperator(e,t):i}const Je={$$ROOT:(e,t,n)=>n.root,$$CURRENT:(e,t,n)=>e,$$REMOVE(e,t,n){},$$NOW:(e,t,n)=>new Date(n.timestamp)},Ve={$$KEEP:(e,t,n)=>e,$$PRUNE(e,t,n){},$$DESCEND(e,t,n){if(!fe(t,"$cond"))return e;let r;for(const[o,i]of Object.entries(e))if(te(i)){if(i instanceof Array){const e=[];for(let r of i)ee(r)&&(r=Ge(r,t,n.update(r))),ie(r)||e.push(r);r=e}else r=Ge(i,t,n.update(i));ie(r)?delete e[o]:e[o]=r}return e}};function He(e,t,n,r){const o=Le.init(r,e);if(Ce(n=n||"")){const i=We("expression",n,r);if(i)return i(e,t,o);const s=We("accumulator",n,r);if(s)return e instanceof Array||(e=He(e,t,null,o),t=null),H(e instanceof Array,`'${n}' target must be an array.`),s(e,t,o.update(null,o.local));throw new R(`operator '${n}' is not registered`)}if(Q(t)&&t.length>0&&"$"===t[0]){if(fe(Ve,t))return t;let n=o.root;const r=t.split(".");if(fe(Je,r[0]))n=Je[r[0]](e,null,o),t=t.slice(r[0].length+1);else if("$$"===r[0].slice(0,2)){n=Object.assign({},o.variables,{this:e},o.local?.variables);const i=r[0].slice(2);H(fe(n,i),`Use of undefined variable: ${i}`),t=t.slice(2)}else t=t.slice(1);return""===t?n:ke(n,t)}if(Z(t))return t.map((t=>He(e,t,null,o)));if(ee(t)){const n={};for(const[i,s]of Object.entries(t))if(n[i]=He(e,s,i,o),["expression","accumulator"].some((e=>!!We(e,i,r))))return H(1===Object.keys(t).length,"Invalid aggregation expression '"+JSON.stringify(t)+"'"),n[i];return n}return t}function Ge(e,t,n){const r=He(e,t,null,n);return fe(Ve,r)?Ve[r](e,t,n):r}function Ye(e){return e instanceof Ze?e:new Ze(e)}function Qe(e,t){const n=e.slice(t+1);e.splice(t),Array.prototype.push.apply(e,n)}const Xe=new Error;class Ze{constructor(e){let t;if(this.iteratees=[],this.yieldedValues=[],this.isDone=!1,e instanceof Function&&(e={next:e}),(n=e)&&"object"==typeof n&&n?.next instanceof Function){const n=e;t=()=>{const e=n.next();if(e.done)throw Xe;return e.value}}else if(e instanceof Array){const n=e,r=n.length;let o=0;t=()=>{if(o0?this.push(2,e):this}drop(e){return e>0?this.push(3,e):this}transform(e){const t=this;let n;return Ye((()=>(n||(n=Ye(e(t.value()))),n.next())))}value(){return this.isDone||(this.isDone=this.getNext(!0).done),this.yieldedValues}each(e){for(;;){const t=this.next();if(t.done)break;if(!1===e(t.value))return!1}return!0}reduce(e,t){let n=this.next();for(void 0!==t||n.done||(t=n.value,n=this.next());!n.done;)t=e(t,n.value),n=this.next();return t}size(){return this.reduce(((e,t)=>++e),0)}[Symbol.iterator](){return this}}class et{constructor(e,t){this.pipeline=e,this.options=Ke(t)}stream(e){let t=Ye(e);const n=this.options.processingMode;n!=Re.CLONE_ALL&&n!=Re.CLONE_INPUT||t.map(me);const r=new Array;if(!ce(this.pipeline))for(const e of this.pipeline){const n=Object.keys(e),o=n[0],i=We(qe.PIPELINE,o,this.options);H(1===n.length&&!!i,`invalid pipeline operator ${o}`),r.push(o),t=i(t,e[o],this.options)}return(n==Re.CLONE_OUTPUT||n==Re.CLONE_ALL&&be([["$group","$unwind"],r]).length)&&t.map(me),t}run(e){return this.stream(e).value()}}class tt{constructor(e,t,n,r){this.source=e,this.predicate=t,this.projection=n,this.options=r,this.operators=[],this.result=null,this.buffer=[]}fetch(){return this.result||(ee(this.projection)&&this.operators.push({$project:this.projection}),this.result=Ye(this.source).filter(this.predicate),this.operators.length>0&&(this.result=new et(this.operators,this.options).stream(this.result))),this.result}fetchAll(){const e=Ye([...this.buffer]);return this.buffer=[],function(...e){let t=0;return Ye((()=>{for(;t0)return this.buffer.pop();const e=this.fetch().next();return e.done?void 0:e.value}hasNext(){if(this.buffer.length>0)return!0;const e=this.fetch().next();return!e.done&&(this.buffer.push(e.value),!0)}map(e){return this.all().map(e)}forEach(e){this.all().forEach(e)}[Symbol.iterator](){return this.fetchAll()}}class nt{constructor(e,t){this.condition=e,this.options=Ke(t),this.compiled=[],this.compile()}compile(){H(ee(this.condition),`query criteria must be an object: ${JSON.stringify(this.condition)}`);const e={};for(const[t,n]of Object.entries(this.condition)){if("$where"===t)Object.assign(e,{field:t,expr:n});else if(se(["$and","$or","$nor","$expr","$jsonSchema"],t))this.processOperator(t,t,n);else{H(!Ce(t),`unknown top level operator: ${t}`);for(const[e,r]of Object.entries(Be(n)))this.processOperator(t,e,r)}e.field&&this.processOperator(e.field,e.field,e.expr)}}processOperator(e,t,n){const r=We(qe.QUERY,t,this.options);if(!r)throw new R(`unknown query operator ${t}`);const o=r(e,n,this.options);this.compiled.push(o)}test(e){for(let t=0,n=this.compiled.length;tthis.test(e)),t||{},this.options)}remove(e){return e.reduce(((e,t)=>(this.test(t)||e.push(t),e)),[])}}const rt=(e,t,n)=>{if(ce(t)||!ee(t))return e;let r=V;const o=n.collation;return ee(o)&&Q(o.locale)&&(r=function(e){const t={sensitivity:ot[e.strength||3],caseFirst:"off"===e.caseFirst?"false":e.caseFirst||"false",numeric:e.numericOrdering||!1,ignorePunctuation:"shifted"===e.alternate};!0===(e.caseLevel||!1)&&("base"===t.sensitivity&&(t.sensitivity="case"),"accent"===t.sensitivity&&(t.sensitivity="variant"));const n=new Intl.Collator(e.locale,t);return(e,t)=>{if(!Q(e)||!Q(t))return V(e,t);const r=n.compare(e,t);return r<0?-1:r>0?1:0}}(o)),e.transform((e=>{const o=Object.keys(t);for(const i of o.reverse()){const o=Ie(e,(e=>ke(e,i)),n.hashFunction),s=Array.from(o.keys()).sort(r);-1===t[i]&&s.reverse(),e=[],s.reduce(((e,t)=>_e(e,o.get(t))),e)}return e}))},ot={1:"base",2:"accent",3:"variant"};function it(e){const t=(t,n,r)=>{const o={unwrapArray:!0},i=Math.max(1,t.split(".").length-1);return s=>{const a=ke(s,t,o);return e(a,n,{...r,depth:i})}};return t.op="query",t}function st(e){return(t,n,r)=>{const o=He(t,n,null,r);return e(...o)}}function at(e,t,n){if(we(e,t))return!0;if(ie(e)&&ie(t))return!0;if(e instanceof Array){const r=we.bind(null,t);return e.some(r)||ge(e,n?.depth).some(r)}return!1}function ct(e,t,n){return!at(e,t,n)}function ut(e,t,n){return ie(e)?t.some((e=>null===e)):be([le(e),t],n?.hashFunction).length>0}function lt(e,t,n){return!ut(e,t,n)}function ft(e,t,n){return St(e,t,((e,t)=>V(e,t)<0))}function dt(e,t,n){return St(e,t,((e,t)=>V(e,t)<=0))}function ht(e,t,n){return St(e,t,((e,t)=>V(e,t)>0))}function pt(e,t,n){return St(e,t,((e,t)=>V(e,t)>=0))}function mt(e){return Ce(e)&&-1===["$and","$or","$nor"].indexOf(e)}function vt(e,t,n){if(Z(e)&&!ce(e)){let r=e=>e,o=t;Object.keys(t).every(mt)&&(o={temp:t},r=e=>({temp:e}));const i=new nt(o,n);for(let t=0,n=e.length;tnull===e,bt=e=>X(e)&&e>=-2147483648&&e<=2147483647&&-1===e.toString().indexOf("."),gt=e=>X(e)&&e>=K&&e<=L&&-1===e.toString().indexOf("."),wt={array:Z,bool:Y,boolean:Y,date:ne,decimal:X,double:X,int:bt,long:gt,number:X,null:yt,object:ee,regex:re,regexp:re,string:Q,undefined:ie,function:e=>{throw new R("unsupported type key `function`.")},1:X,2:Q,3:ee,4:Z,6:ie,8:Y,9:ne,10:yt,11:re,16:bt,18:gt,19:X};function xt(e,t,n){const r=wt[t];return!!r&&r(e)}function St(e,t,n){return le(e).some((e=>G(e)===G(t)&&n(e,t)))}st(lt);const Ot=(e,t)=>(n,r,o)=>{H(Z(r),`${e}: expression must be an array.`);const i=He(n,r,null,o);return i.some(ie)?null:(H(i.every(X),`${e}: expression must evalue to array of numbers.`),t(i))};Ot("$bitAnd",(e=>e.reduce(((e,t)=>e&t),-1))),Ot("$bitOr",(e=>e.reduce(((e,t)=>e|t),0))),Ot("$bitXor",(e=>e.reduce(((e,t)=>e^t),0))),st(at),st(ht),st(pt),st(ft),st(dt),st(ct);const It=(e,t)=>{const n={};return e.split("").forEach(((e,r)=>n[e]=t*(r+1))),n};It("ABCDEFGHIKLM",1),It("NOPQRSTUVWXY",-1);const Et={undefined:null,null:null,NaN:NaN,Infinity:new Error,"-Infinity":new Error};function _t(e,t=Et){const n=Object.assign({},Et,t),r=new Set(Object.keys(n));return(t,o,i)=>{const s=He(t,o,null,i);if(r.has(`${s}`)){const t=n[`${s}`];if(t instanceof Error)throw new R(`cannot apply $${e.name} to -inf, value must in (-inf,inf)`);return t}return e(s)}}_t(Math.acos,{Infinity:1/0,0:new Error}),_t(Math.acosh,{Infinity:1/0,0:new Error}),_t(Math.asin),_t(Math.asinh,{Infinity:1/0,"-Infinity":-1/0}),_t(Math.atan),_t(Math.atanh,{1:1/0,"-1":-1/0}),_t(Math.cos),_t(Math.cosh,{"-Infinity":1/0,Infinity:1/0});const jt=Math.PI/180,kt=(_t((e=>e*jt),{Infinity:1/0,"-Infinity":1/0}),180/Math.PI);_t((e=>e*kt),{Infinity:1/0,"-Infinity":-1/0}),_t(Math.sin),_t(Math.sinh,{"-Infinity":-1/0,Infinity:1/0}),_t(Math.tan);const Pt=(e,t,n)=>{if(ce(t))return e;let r=Object.keys(t),o=!1;At(t,n);const i=n.idKey;if(se(r,i)){const e=t[i];0!==e&&!1!==e||(r=r.filter(ae.bind(null,[i])),o=0==r.length)}else r.push(i);const s=Le.init(n);return e.map((e=>Nt(e,t,s.update(e),r,o)))};function Nt(e,t,n,r,o){let i={},s=!1,a=!1;const c=[];o&&c.push(n.idKey);for(const o of r){let r;const u=t[o];if(o!==n.idKey&&se([0,!1],u)&&(a=!0),o===n.idKey&&ce(u))r=e[o];else if(Q(u))r=He(e,u,o,n);else if(se([1,!0],u));else if(u instanceof Array)r=u.map((t=>{const r=He(e,t,null,n);return ie(r)?null:r}));else{if(!ee(u)){c.push(o);continue}{const t=u,i=Object.keys(u),a=1==i.length?i[0]:"",c=We(qe.PROJECTION,a,n);if(c)"$slice"===a?le(t[a]).every(X)?(r=c(e,t[a],o,n),s=!0):r=He(e,t,o,n):r=c(e,t[a],o,n);else if(Ce(a))r=He(e,t[a],a,n);else if(fe(e,o)){At(t,n);let s=e[o];s instanceof Array?r=s.map((e=>Nt(e,t,n,i,!1))):(s=ee(s)?s:e,r=Nt(s,t,n,i,!1))}else r=He(e,u,null,n)}}const l=Pe(e,o,{preserveMissing:!0});void 0!==l&&ve(i,l,{flatten:!0}),ae([0,1,!1,!0],u)&&(void 0===r?Me(i,o,{descendArray:!0}):De(i,o,r))}if(Ne(i),(s||a||o)&&(i=_e({},e,i),c.length>0))for(const e of c)Me(i,e,{descendArray:!0});return i}function At(e,t){const n=[!1,!1];for(const[r,o]of Object.entries(e)){if(r===t?.idKey)return;0===o||!1===o?n[0]=!0:1!==o&&!0!==o||(n[1]=!0),H(!(n[0]&&n[1]),"Projection cannot have a mix of inclusion and exclusion.")}}const $t=(e,t,n)=>{H(Z(t),"Invalid expression: $and expects value to be an Array.");const r=t.map((e=>new nt(e,n)));return e=>r.every((t=>t.test(e)))},Dt=(e,t,n)=>{H(Z(t),"Invalid expression. $or expects value to be an Array");const r=t.map((e=>new nt(e,n)));return e=>r.some((t=>t.test(e)))},Mt=(e,t,n)=>{H(Z(t),"Invalid expression. $nor expects value to be an array.");const r=Dt(0,t,n);return e=>!r(e)},Tt=(e,t,n)=>{const r={};r[e]=Be(t);const o=new nt(r,n);return e=>!o.test(e)},Ct=it(at),Bt=it(ht),Rt=it(pt),Lt=it(ut),Kt=it(ft),qt=it(dt),Ft=it(ct),Ut=it(lt),zt=it((function(e,t,n){return le(e).some((e=>2===t.length&&e%t[0]===t[1]))})),Wt=it((function(e,t,n){const r=le(e),o=e=>Q(e)&&((e,t=!0)=>!!e||t&&""===e)(t.exec(e),n?.useStrictMode);return r.some(o)||ge(r,1).some(o)}));it((function(e,t,n){if(!(Z(e)&&Z(t)&&e.length&&t.length))return!1;let r=!0;for(const o of t){if(!r)break;r=ee(o)&&se(Object.keys(o),"$elemMatch")?vt(e,o.$elemMatch,n):o instanceof RegExp?e.some((e=>"string"==typeof e&&o.test(e))):e.some((e=>we(o,e)))}return r}));const Jt=it(vt),Vt=it((function(e,t,n){return Array.isArray(e)&&e.length===t})),Ht=it((function(e,t,n){return(!1===t||0===t)&&void 0===e||(!0===t||1===t)&&void 0!==e})),Gt=it((function(e,t,n){return Array.isArray(t)?t.findIndex((t=>xt(e,t)))>=0:xt(e,t)}));var Yt=!1;function Qt(e,t){var n=x(e.primaryKey);t=_(t);var r,o=j(t);if("number"!=typeof o.skip&&(o.skip=0),o.selector?(o.selector=o.selector,Object.entries(o.selector).forEach((([e,t])=>{"object"==typeof t&&null!==t||(o.selector[e]={$eq:t})}))):o.selector={},o.index){var i=(r=o.index,Array.isArray(r)?r.slice(0):[r]);i.includes(n)||i.push(n),o.index=i}if(o.sort){var s=o.sort.find((e=>{return t=e,Object.keys(t)[0]===n;var t}));s||(o.sort=o.sort.slice(0),o.sort.push({[n]:"asc"}))}else if(o.index)o.sort=o.index.map((e=>({[e]:"asc"})));else{if(e.indexes){var a=new Set;Object.entries(o.selector).forEach((([e,t])=>{("object"!=typeof t||null===t||Object.keys(t).find((e=>D.has(e))))&&a.add(e)}));var c,u=-1;e.indexes.forEach((e=>{var t,n=(t=e,Array.isArray(t)?e:[e]),r=n.findIndex((e=>!a.has(e)));r>0&&r>u&&(u=r,c=n)})),c&&(o.sort=c.map((e=>({[e]:"asc"}))))}o.sort||(o.sort=[{[n]:"asc"}])}return o}function Xt(e,t){if(!t.sort)throw d("SNH",{query:t});var n,r=(n=t.selector,Yt||(ze(qe.PIPELINE,{$sort:rt,$project:Pt}),ze(qe.QUERY,{$and:$t,$eq:Ct,$elemMatch:Jt,$exists:Ht,$gt:Bt,$gte:Rt,$in:Lt,$lt:Kt,$lte:qt,$ne:Ft,$nin:Ut,$mod:zt,$nor:Mt,$not:Tt,$or:Dt,$regex:Wt,$size:Vt,$type:Gt}),Yt=!0),new nt(n));return e=>r.test(e)}function Zt(e,t,n,r,o,i,s){for(var a,c=!!e.schema.attachments,u=[],l=[],f=[],h={id:function(e=10){for(var t="",n=0;n0,w=r.length,x=function(){var e,o=r[S],h=o.document,p=o.previous,w=h[t],x=h._deleted,O=p&&p._deleted,E=void 0;if(g&&(E=n.get(w)),E){var _=E._rev;if(!p||p&&_!==p._rev){var j={isError:!0,status:409,documentId:w,writeRow:o,documentInDb:E};return f.push(j),1}var k=c?en(o):o;c&&(x?p&&Object.keys(p._attachments).forEach((e=>{y.push({documentId:w,attachmentId:e,digest:I(p)._attachments[e].digest})})):(Object.entries(h._attachments).find((([t,n])=>((p?p._attachments[t]:void 0)||n.data||(e={documentId:w,documentInDb:E,isError:!0,status:510,writeRow:o,attachmentId:t}),!0))),e||Object.entries(h._attachments).forEach((([e,t])=>{var n=p?p._attachments[e]:void 0;if(n){var r=k.document._attachments[e].digest;t.data&&n.digest!==r&&b.push({documentId:w,attachmentId:e,attachmentData:t,digest:t.digest})}else v.push({documentId:w,attachmentId:e,attachmentData:t,digest:t.digest})})))),e?f.push(e):(c?(l.push(en(k)),s&&s(h)):(l.push(k),s&&s(h)),a=k);var P=null,N=null,A=null;if(O&&!x)A="INSERT",P=c?tn(h):h;else if(!p||O||x){if(!x)throw d("SNH",{args:{writeRow:o}});A="DELETE",P=I(h),N=p}else A="UPDATE",P=c?tn(h):h,N=p;var $={documentId:w,documentData:P,previousDocumentData:N,operation:A};m.push($)}else{var D=!!x;if(c&&Object.entries(h._attachments).forEach((([t,n])=>{n.data?v.push({documentId:w,attachmentId:t,attachmentData:n,digest:n.digest}):(e={documentId:w,isError:!0,status:510,writeRow:o,attachmentId:t},f.push(e))})),e||(c?(u.push(en(o)),i&&i(h)):(u.push(o),i&&i(h)),a=o),!D){var M={documentId:w,operation:"INSERT",documentData:c?tn(h):h,previousDocumentData:c&&p?tn(p):p};m.push(M)}}},S=0;S{var r,o,i;t._attachments[e]=(i=(r=n).data)?{length:(o=i,atob(o).length),digest:r.digest,type:r.type}:r})),t}async function nn(e,t,n){if(e.getChangedDocumentsSince)return e.getChangedDocumentsSince(t,n);var r=x(e.schema.primaryKey),o=B(e.schema,function(e,t,n){var r=x(e.schema.primaryKey),o=n?n.lwt:1,i=n?n.id:"";return Qt(e.schema,{selector:{$or:[{"_meta.lwt":{$gt:o}},{"_meta.lwt":{$eq:o},[r]:{$gt:n?i:""}}],"_meta.lwt":{$gte:o}},sort:[{"_meta.lwt":"asc"},{[r]:"asc"}],skip:0,limit:t})}(e,t,n)),i=(await e.query(o)).documents,s=k(i);return{documents:i,checkpoint:s?{id:s[r],lwt:s._meta.lwt}:n||{id:"",lwt:0}}}new WeakMap;var rn="15.37.0";function on(e,t){var n=e.get(t);if(void 0===n)throw new Error("missing value from map "+t);return n}function sn(e,t,n,r){var o=e.get(t);return void 0===o?(o=n(),e.set(t,o)):r&&r(o),o}function an(e=0){return new Promise((t=>setTimeout(t,e)))}Promise.resolve(!0);var cn=Promise.resolve(!1),un=(Promise.resolve(null),Promise.resolve());function ln(e=1e4){return"function"==typeof requestIdleCallback?new Promise((t=>{requestIdleCallback((()=>t()),{timeout:e})})):an(0)}function fn(e,t){var n=t.map((t=>{var n=w(e,t);if(!n)throw new Error("not in schema: "+t);var r,o=n.type;"number"!==o&&"integer"!==o||(r=dn(n));var i,s=E(t),a=n.maxLength?n.maxLength:0;return i="string"===o?e=>{var t=s(e);return t||(t=""),t.padEnd(a," ")}:"boolean"===o?e=>s(e)?"1":"0":e=>{var t=s(e);return hn(r,t)},{fieldName:t,schemaPart:n,parsedLengths:r,getValue:s,getIndexStringPart:i}}));return n}function dn(e){var t=Math.floor(e.minimum),n=Math.ceil(e.maximum),r=e.multipleOf,o=(n-t).toString().length,i=r.toString().split("."),s=0;return i.length>1&&(s=i[1].length),{minimum:t,maximum:n,nonDecimals:o,decimals:s,roundedMinimum:t}}function hn(e,t){void 0===t&&(t=0),te.maximum&&(t=e.maximum);var n=(Math.floor(t)-e.roundedMinimum).toString().padStart(e.nonDecimals,"0");if(e.decimals>0){var r=t.toString().split(".");n+=(r.length>1?r[1]:"0").padEnd(e.decimals,"0")}return n}function pn(e,t,n){var r="";return t.forEach(((t,o)=>{var i=w(e,t),s=n[o],a=i.type;switch(a){case"string":var c=I(i.maxLength,"maxLength not set");r+="string"==typeof s?s.padEnd(c," "):"".padEnd(c," ");break;case"boolean":r+=null===s||s===A?"0":s===N||s?"1":"0";break;case"number":case"integer":var u=dn(i);if(null===s||s===A)r+="0".repeat(u.nonDecimals+u.decimals);else if(s===N)r+=hn(u,u.maximum);else{var l=hn(u,s);r+=l}break;default:throw new Error("unknown index type "+a)}})),r}function mn(e,t,n){var r="";return t.forEach(((t,o)=>{var i=w(e,t),s=n[o],a=i.type;switch(a){case"string":var c=I(i.maxLength,"maxLength not set");r+="string"==typeof s&&s!==N?s.padEnd(c," "):"".padEnd(c,s===A?" ":N);break;case"boolean":r+=null===s||s?"1":"0";break;case"number":case"integer":var u=dn(i);r+=null===s||s===N?"9".repeat(u.nonDecimals+u.decimals):s===A?"0".repeat(u.nonDecimals+u.decimals):hn(u,s);break;default:throw new Error("unknown index type "+a)}})),r}function vn(e){return e.join("||")}function yn(e,t){var n=vn(t);return on(e.indexIdByName,n)}var bn={locale:null,unique:!1};function gn(e,t,n,r){for(var o={i:n,d:r,i0:void 0,i1:void 0,i2:void 0,i3:void 0,i4:void 0,i5:void 0,i6:void 0,i7:void 0},i=0;iArray.isArray(e)?e.slice(0):[e])):[];n.push(wn);var r=new Map;return n.forEach(((n,o)=>{var i="i"+o,s=vn(n);if(r.has(s))throw new Error("duplicate index "+s);r.set(s,i),t[i]=function(e,t){var n=fn(e,t),r=n.length,o=n.map((e=>e.getIndexStringPart));return function(e){for(var t="",n=0;nun));return n=I(n).then((()=>t())),_n.set(e,n),n}function kn(e,t){t.onversionchange=n=>{e.closed||(t.close(),e.creationPromise=e.refreshIDBDatabase())}}async function Pn(e,t,n,r){var o=await sn(e.indexedDBStates,n.databaseName,(()=>async function(e,t,n){var r=In++,o=await function(e,t){return"function"==typeof t?t(e):t}(e,n.indexedDB),i=async()=>(await an(0),jn(e.databaseName,(()=>new Promise(((t,n)=>{var i=o.open(e.databaseName);i.onerror=function(t){console.error(r+": OPEN IDB DATABASE "+e.databaseName+" ERROR"),n(t)},i.onsuccess=function(e){var n=i.result;t(n),kn(s,n)},$n(s,i)}))))),s={indexedDB:o,debugId:r,closed:!1,storage:t,settings:n,refreshIDBDatabase:i,creationPromise:i(),name:e.databaseName,refCount:0,storesToOpen:[]};return s}(n,e,t)));return o.storesToOpen=o.storesToOpen.concat(r),o.refCount=o.refCount+1,o.creationPromise.then((()=>Nn(I(o)))).then((()=>I(o)))}async function Nn(e){if(0!==e.storesToOpen.length)return e.creationPromise=e.creationPromise.then((async t=>{var n=new Set(Array.from(t.objectStoreNames));if(0===e.storesToOpen.filter((e=>!n.has(An(e.collectionName,e.schema).documentStore))).length)return t;var r=t.version+1;return t.close(),jn(e.name,(()=>new Promise((async(t,n)=>{var o=e.indexedDB.open(e.name,r);o.onerror=function(t){console.error(e.debugId+": ERROR openStoresOnExistingDatabase() openRequest: error "),n(t)},o.onsuccess=function(n){var r=o.result;kn(e,r),t(r)},o.onblocked=e=>{},$n(e,o)}))))})),e.creationPromise}function An(e,t){var n=t.version;return{documentStore:e+"-"+n+"-documents",writeAheadStore:e+"-"+n+"-wal",attachmentsStore:e+"-"+n+"-attachments"}}function $n(e,t){t.onupgradeneeded=function(n){var r=t.result;e.storesToOpen.forEach((e=>{var t=r.objectStoreNames,n=An(e.collectionName,e.schema);if(!t.contains(n.documentStore)){var o=r.createObjectStore(n.documentStore,{keyPath:"i",autoIncrement:!1});r.createObjectStore(n.writeAheadStore,{keyPath:"i",autoIncrement:!1}),function(e,t){t.indexIds.forEach((t=>{e.createIndex(t,t,bn)}))}(o,e),e.schema.attachments&&r.createObjectStore(n.attachmentsStore,{keyPath:"docIdWithAttachmentId",autoIncrement:!1})}})),e.storesToOpen=[]}}function Dn(e){if(e.closed)throw new Error("RxStorageInstanceIndexedDB is closed "+e.databaseName+"-"+e.collectionName)}async function Mn(e,t){var n=e.primaryPath,r=e.internals.indexIds.length,o=e.internals.getIndexableStringByIndexNumber,i=t.objectStore(e.internals.storeNames.writeAheadStore),s=await new Promise(((e,t)=>{var n=i.get("documents");n.onerror=t,n.onsuccess=t=>{var r=n.result;e(r?JSON.parse(r.docsData):void 0)}}));if(s&&s.length>0){for(var a,c=t.objectStore(e.internals.storeNames.documentStore),u=0;u{a.onerror=t,a.onsuccess=()=>e(!0)})),i.delete("documents")}return t}async function Tn(e){var t,n=[e.internals.storeNames.documentStore,e.internals.storeNames.writeAheadStore];e.schema.attachments&&n.push(e.internals.storeNames.attachmentsStore);for(var r=100;r>0;){var o=await e.internals.state.creationPromise;r-=1;try{t=o.transaction(n,"readwrite",Sn)}catch(t){if("InvalidStateError"!==t.name&&"NotFoundError"!==t.name||!(r>0))throw t;"NotFoundError"===t.name?await Nn(e.internals.state):e.internals.state.creationPromise=e.internals.state.refreshIDBDatabase()}}return await Mn(e,I(t)),I(t)}var Cn=function(){function e(e){this.allTasksRuns=[],this.instance=e,this.txPromise=Tn(this.instance).then((t=>Mn(e,t)))}return e.prototype.addTask=function(e){var t=this.txPromise.then((t=>e(t))),n=t.catch((()=>null));this.allTasksRuns.push(n);var r=this.allTasksRuns.length;return n.then((()=>Promise.all(this.allTasksRuns))).then((()=>{this.allTasksRuns.length===r&&(this.instance.openReadonlyTransaction=void 0)})),t.catch((t=>{if("TransactionInactiveError"===t.name)return this.instance.openReadonlyTransaction=void 0,Bn(this.instance,e);throw t}))},e}();function Bn(e,t){return e.openReadonlyTransaction||(e.openReadonlyTransaction=new Cn(e)),e.openReadonlyTransaction.addTask(t)}var Rn=function(e,t){return Rn=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},Rn(e,t)};function Ln(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}Rn(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}function Kn(e,t,n,r){return new(n||(n=Promise))((function(o,i){function s(e){try{c(r.next(e))}catch(e){i(e)}}function a(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((r=r.apply(e,t||[])).next())}))}function qn(e,t){var n,r,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},s=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return s.next=a(0),s.throw=a(1),s.return=a(2),"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(a){return function(c){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;s&&(s=0,a[0]&&(i=0)),i;)try{if(n=1,r&&(o=2&a[0]?r.return:a[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,a[1])).done)return o;switch(r=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return i.label++,{value:a[1],done:!1};case 5:i.label++,r=a[1],a=[0];continue;case 7:a=i.ops.pop(),i.trys.pop();continue;default:if(!((o=(o=i.trys).length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function Un(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)s.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return s}function zn(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o1||a(e,t)}))},t&&(r[e]=t(r[e])))}function a(e,t){try{(n=o[e](t)).value instanceof Wn?Promise.resolve(n.value.v).then(c,u):l(i[0][2],n)}catch(e){l(i[0][3],e)}var n}function c(e){a("next",e)}function u(e){a("throw",e)}function l(e,t){e(t),i.shift(),i.length&&a(i[0][0],i[0][1])}}function Vn(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=Fn(e),t={},r("next"),r("throw"),r("return"),t[Symbol.asyncIterator]=function(){return this},t);function r(n){t[n]=e[n]&&function(t){return new Promise((function(r,o){!function(e,t,n,r){Promise.resolve(r).then((function(t){e({value:t,done:n})}),t)}(r,o,(t=e[n](t)).done,t.value)}))}}}function Hn(e){return"function"==typeof e}function Gn(e){var t=e((function(e){Error.call(e),e.stack=(new Error).stack}));return t.prototype=Object.create(Error.prototype),t.prototype.constructor=t,t}Object.create,Object.create,"function"==typeof SuppressedError&&SuppressedError;var Yn=Gn((function(e){return function(t){e(this),this.message=t?t.length+" errors occurred during unsubscription:\n"+t.map((function(e,t){return t+1+") "+e.toString()})).join("\n "):"",this.name="UnsubscriptionError",this.errors=t}}));function Qn(e,t){if(e){var n=e.indexOf(t);0<=n&&e.splice(n,1)}}var Xn=function(){function e(e){this.initialTeardown=e,this.closed=!1,this._parentage=null,this._finalizers=null}var t;return e.prototype.unsubscribe=function(){var e,t,n,r,o;if(!this.closed){this.closed=!0;var i=this._parentage;if(i)if(this._parentage=null,Array.isArray(i))try{for(var s=Fn(i),a=s.next();!a.done;a=s.next())a.value.remove(this)}catch(t){e={error:t}}finally{try{a&&!a.done&&(t=s.return)&&t.call(s)}finally{if(e)throw e.error}}else i.remove(this);var c=this.initialTeardown;if(Hn(c))try{c()}catch(e){o=e instanceof Yn?e.errors:[e]}var u=this._finalizers;if(u){this._finalizers=null;try{for(var l=Fn(u),f=l.next();!f.done;f=l.next()){var d=f.value;try{tr(d)}catch(e){o=null!=o?o:[],e instanceof Yn?o=zn(zn([],Un(o)),Un(e.errors)):o.push(e)}}}catch(e){n={error:e}}finally{try{f&&!f.done&&(r=l.return)&&r.call(l)}finally{if(n)throw n.error}}}if(o)throw new Yn(o)}},e.prototype.add=function(t){var n;if(t&&t!==this)if(this.closed)tr(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=null!==(n=this._finalizers)&&void 0!==n?n:[]).push(t)}},e.prototype._hasParent=function(e){var t=this._parentage;return t===e||Array.isArray(t)&&t.includes(e)},e.prototype._addParent=function(e){var t=this._parentage;this._parentage=Array.isArray(t)?(t.push(e),t):t?[t,e]:e},e.prototype._removeParent=function(e){var t=this._parentage;t===e?this._parentage=null:Array.isArray(t)&&Qn(t,e)},e.prototype.remove=function(t){var n=this._finalizers;n&&Qn(n,t),t instanceof e&&t._removeParent(this)},e.EMPTY=((t=new e).closed=!0,t),e}(),Zn=Xn.EMPTY;function er(e){return e instanceof Xn||e&&"closed"in e&&Hn(e.remove)&&Hn(e.add)&&Hn(e.unsubscribe)}function tr(e){Hn(e)?e():e.unsubscribe()}var nr={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1},rr={setTimeout:function(e,t){for(var n=[],r=2;r0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(t){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,t)},t.prototype._subscribe=function(e){return this._throwIfClosed(),this._checkFinalizedStatuses(e),this._innerSubscribe(e)},t.prototype._innerSubscribe=function(e){var t=this,n=this,r=n.hasError,o=n.isStopped,i=n.observers;return r||o?Zn:(this.currentObservers=null,i.push(e),new Xn((function(){t.currentObservers=null,Qn(i,e)})))},t.prototype._checkFinalizedStatuses=function(e){var t=this,n=t.hasError,r=t.thrownError,o=t.isStopped;n?e.error(r):o&&e.complete()},t.prototype.asObservable=function(){var e=new xr;return e.source=this,e},t.create=function(e,t){return new Er(e,t)},t}(xr),Er=function(e){function t(t,n){var r=e.call(this)||this;return r.destination=t,r.source=n,r}return Ln(t,e),t.prototype.next=function(e){var t,n;null===(n=null===(t=this.destination)||void 0===t?void 0:t.next)||void 0===n||n.call(t,e)},t.prototype.error=function(e){var t,n;null===(n=null===(t=this.destination)||void 0===t?void 0:t.error)||void 0===n||n.call(t,e)},t.prototype.complete=function(){var e,t;null===(t=null===(e=this.destination)||void 0===e?void 0:e.complete)||void 0===t||t.call(e)},t.prototype._subscribe=function(e){var t,n;return null!==(n=null===(t=this.source)||void 0===t?void 0:t.subscribe(e))&&void 0!==n?n:Zn},t}(Ir);function _r(e){return function(t){if(function(e){return Hn(null==e?void 0:e.lift)}(t))return t.lift((function(t){try{return e(t,this)}catch(e){this.error(e)}}));throw new TypeError("Unable to lift unknown Observable type")}}var jr=Array.isArray;function kr(e,t,n,r,o){return new Pr(e,t,n,r,o)}var Pr=function(e){function t(t,n,r,o,i,s){var a=e.call(this,t)||this;return a.onFinalize=i,a.shouldUnsubscribe=s,a._next=n?function(e){try{n(e)}catch(e){t.error(e)}}:e.prototype._next,a._error=o?function(e){try{o(e)}catch(e){t.error(e)}finally{this.unsubscribe()}}:e.prototype._error,a._complete=r?function(){try{r()}catch(e){t.error(e)}finally{this.unsubscribe()}}:e.prototype._complete,a}return Ln(t,e),t.prototype.unsubscribe=function(){var t;if(!this.shouldUnsubscribe||this.shouldUnsubscribe()){var n=this.closed;e.prototype.unsubscribe.call(this),!n&&(null===(t=this.onFinalize)||void 0===t||t.call(this))}},t}(lr),Nr=function(e){return e&&"number"==typeof e.length&&"function"!=typeof e};function Ar(e){return Hn(null==e?void 0:e.then)}function $r(e){return Hn(e[br])}function Dr(e){return Symbol.asyncIterator&&Hn(null==e?void 0:e[Symbol.asyncIterator])}function Mr(e){return new TypeError("You provided "+(null!==e&&"object"==typeof e?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}var Tr="function"==typeof Symbol&&Symbol.iterator?Symbol.iterator:"@@iterator";function Cr(e){return Hn(null==e?void 0:e[Tr])}function Br(e){return Jn(this,arguments,(function(){var t,n,r;return qn(this,(function(o){switch(o.label){case 0:t=e.getReader(),o.label=1;case 1:o.trys.push([1,,9,10]),o.label=2;case 2:return[4,Wn(t.read())];case 3:return n=o.sent(),r=n.value,n.done?[4,Wn(void 0)]:[3,5];case 4:return[2,o.sent()];case 5:return[4,Wn(r)];case 6:return[4,o.sent()];case 7:return o.sent(),[3,2];case 8:return[3,10];case 9:return t.releaseLock(),[7];case 10:return[2]}}))}))}function Rr(e){return Hn(null==e?void 0:e.getReader)}function Lr(e){if(e instanceof xr)return e;if(null!=e){if($r(e))return o=e,new xr((function(e){var t=o[br]();if(Hn(t.subscribe))return t.subscribe(e);throw new TypeError("Provided object does not correctly implement Symbol.observable")}));if(Nr(e))return r=e,new xr((function(e){for(var t=0;t{this._to=!1,function(e){const t=ro()-e.ttl,n=e.map[Symbol.iterator]();for(;;){const r=n.next().value;if(!r)return;const o=r[0];if(!(r[1]0&&void 0!==arguments[0]?arguments[0]:{},t=JSON.parse(JSON.stringify(e));return void 0===t.webWorkerSupport&&(t.webWorkerSupport=!0),t.idb||(t.idb={}),t.idb.ttl||(t.idb.ttl=45e3),t.idb.fallbackInterval||(t.idb.fallbackInterval=150),e.idb&&"function"==typeof e.idb.onclose&&(t.idb.onclose=e.idb.onclose),t.localstorage||(t.localstorage={}),t.localstorage.removeTimeout||(t.localstorage.removeTimeout=6e4),e.methods&&(t.methods=e.methods),t.node||(t.node={}),t.node.ttl||(t.node.ttl=12e4),t.node.maxParallelWrites||(t.node.maxParallelWrites=2048),void 0===t.node.useFastPath&&(t.node.useFastPath=!0),t}var io="messages",so={durability:"relaxed"};function ao(){if("undefined"!=typeof indexedDB)return indexedDB;if("undefined"!=typeof window){if(void 0!==window.mozIndexedDB)return window.mozIndexedDB;if(void 0!==window.webkitIndexedDB)return window.webkitIndexedDB;if(void 0!==window.msIndexedDB)return window.msIndexedDB}return!1}function co(e){e.commit&&e.commit()}function uo(e,t){var n=e.transaction(io,"readonly",so),r=n.objectStore(io),o=[],i=IDBKeyRange.bound(t+1,1/0);if(r.getAll){var s=r.getAll(i);return new Promise((function(e,t){s.onerror=function(e){return t(e)},s.onsuccess=function(t){e(t.target.result)}}))}return new Promise((function(e,s){var a=function(){try{return i=IDBKeyRange.bound(t+1,1/0),r.openCursor(i)}catch(e){return r.openCursor()}}();a.onerror=function(e){return s(e)},a.onsuccess=function(r){var i=r.target.result;i?i.value.ide.lastCursorId&&(e.lastCursorId=t.id),t})).filter((function(t){return function(e,t){return!(e.uuid===t.uuid||t.eMIs.has(e.id)||e.data.time0||e._addEL.internal.length>0}function Po(e,t,n){e._addEL[t].push(n),function(e){if(!e._iL&&ko(e)){var t=function(t){e._addEL[t.type].forEach((function(e){t.time>=e.time&&e.fn(t.data)}))},n=e.method.microSeconds();e._prepP?e._prepP.then((function(){e._iL=!0,e.method.onMessage(e._state,t,n)})):(e._iL=!0,e.method.onMessage(e._state,t,n))}}(e)}function No(e,t,n){e._addEL[t]=e._addEL[t].filter((function(e){return e!==n})),function(e){if(e._iL&&!ko(e)){e._iL=!1;var t=e.method.microSeconds();e.method.onMessage(e._state,null,t)}}(e)}_o._pubkey=!0,_o.prototype={postMessage:function(e){if(this.closed)throw new Error("BroadcastChannel.postMessage(): Cannot post message after channel has closed "+JSON.stringify(e));return jo(this,"message",e)},postInternal:function(e){return jo(this,"internal",e)},set onmessage(e){var t={time:this.method.microSeconds(),fn:e};No(this,"message",this._onML),e&&"function"==typeof e?(this._onML=t,Po(this,"message",t)):this._onML=null},addEventListener:function(e,t){Po(this,e,{time:this.method.microSeconds(),fn:t})},removeEventListener:function(e,t){No(this,e,this._addEL[e].find((function(e){return e.fn===t})))},close:function(){var e=this;if(!this.closed){Io.delete(this),this.closed=!0;var t=this._prepP?this._prepP:Yr;return this._onML=null,this._addEL.message=[],t.then((function(){return Promise.all(Array.from(e._uMP))})).then((function(){return Promise.all(e._befC.map((function(e){return e()})))})).then((function(){return e.method.close(e._state)}))}},get type(){return this.method.type},get isClosed(){return this.closed}};var Ao=new Map;function $o(e,t){var n=Ao.get(e);if(n)return n.refs.delete(t),0===n.refs.size?(Ao.delete(e),n.bc.close()):void 0}function Do(e,t,n,r){if(t.multiInstance){var o=r||function(e,t,n,r){var o=Ao.get(t);return o||(o={bc:new _o(["RxDB:",e,n].join("|")),refs:new Set},Ao.set(t,o)),o.refs.add(r),o.bc}(e,t.databaseInstanceToken,n.databaseName,n),i=new Ir,s=n=>{n.storageName===e&&n.databaseName===t.databaseName&&n.collectionName===t.collectionName&&n.version===t.schema.version&&i.next(n.eventBulk)};o.addEventListener("message",s);var a=n.changeStream(),c=!1,u=a.subscribe((n=>{c||o.postMessage({storageName:e,databaseName:t.databaseName,collectionName:t.collectionName,version:t.schema.version,eventBulk:n})}));n.changeStream=function(){return i.asObservable().pipe(function(){for(var e=[],t=0;t{var r=t.queryPlan,o=t.query,i=o.skip?o.skip:0,s=i+(o.limit?o.limit:1/0),a=e.internals.storeNames.documentStore,c=e.settings.batchSize?e.settings.batchSize:50,u=!1;r.selectorSatisfiedByIndex||(u=Xt(e.schema,o));var l,f=r.index,h=!r.sortSatisfiedByIndex,p=f,m=r.startKeys,v=pn(e.schema,p,m),y=r.endKeys,b=mn(e.schema,p,y),g=[],w=n.objectStore(a),x=yn(e.internals,p);l=w.index(x),u||t.query.limit||(c=1e5);var S=!1;if(await async function(e,t,n,r,o,i,s,a){var c=e.settings.IDBKeyRange?e.settings.IDBKeyRange:IDBKeyRange,u=e.internals.getIndexableStringByIndexId[s];if("function"==typeof n.getAll&&1!==r)for(var l,f=!0,d=!1,h=async function(){l&&(o=u(l.d));var e=c.bound(o,i,!f||!t.inclusiveStart,!t.inclusiveEnd);f=!1;var s=n.getAll(e,r);await new Promise(((e,t)=>{s.onerror=t,s.onsuccess=t=>{var n=t.target.result;l=k(n),0!==n.length&&!1===a(n)&&(d=!0),n.length{m.onsuccess=function(t){var n=t.target.result;if(n){var r=n.value;a([r])?n.continue():e()}else e()}}))}}(e,r,l,c,v,b,x,(e=>{for(var t=0;t{var t=Object.keys(e)[0],r=Object.values(e)[0];n.push({key:t,direction:r,getValueFn:E(t)})})),(e,t)=>{for(var r=0;r30&&!await function(e,t){var n=(e.settings.IDBKeyRange?e.settings.IDBKeyRange:IDBKeyRange).lowerBound(A,!0),r=t.getKey(n);return new Promise((e=>{r.onsuccess=()=>{e(!!r.result)}}))}(e,u)?new Map:await function(e,t,n){var r=n.length,o=new Map;if(0===r)return Promise.resolve(o);for(var i=new Array(r),s=0;s{u.onerror=n,u.onsuccess=()=>{for(var n=0;n0){var g=c.objectStore(o.storeNames.writeAheadStore).put({i:"documents",docsData:JSON.stringify(h)});await new Promise(((e,t)=>{g.onerror=t,g.onsuccess=e})),e.handleWalIdlePromise||an(100).then((()=>ln())).then((async()=>{e.handleWalIdlePromise=void 0,e.closed||await Bn(e,(()=>cn))}))}var w=void 0;if(e.schema.attachments){var x=c.objectStore(e.internals.storeNames.attachmentsStore);l.attachmentsAdd.forEach((e=>{w=x.put({docIdWithAttachmentId:En(e.documentId,e.attachmentId),length:e.attachmentData.length,type:e.attachmentData.type,data:e.attachmentData.data})})),l.attachmentsUpdate.forEach((e=>{w=x.put({docIdWithAttachmentId:En(e.documentId,e.attachmentId),length:e.attachmentData.length,type:e.attachmentData.type,data:e.attachmentData.data})})),l.attachmentsRemove.forEach((e=>{w=x.delete(En(e.documentId,e.attachmentId))}))}if(w&&await new Promise(((e,t)=>{I(w).onerror=t,I(w).onsuccess=e})),c.commit&&c.commit(),l.eventBulk.events.length>0){var S=I(l.newestRow).document;l.eventBulk.checkpoint={id:S[r],lwt:S._meta.lwt},l.eventBulk.endTime=O(),e.changes$.next(l.eventBulk)}return{error:f}}var Co=O(),Bo=function(){function e(e,t,n,r,o,i,s){this.changes$=new Ir,this.instanceId=Co++,this.storage=e,this.databaseName=t,this.collectionName=n,this.schema=r,this.internals=o,this.options=i,this.settings=s,this.primaryPath=x(this.schema.primaryKey)}var t=e.prototype;return t.updateMinKnownDocs=function(e){this.internals.minKnownDocsAmountfunction(e,t,n){var r=t.length;if(0===r)return Promise.resolve([]);for(var o=new Array,i=0;i{c.onerror=t,c.onsuccess=()=>{for(var t=0;t{var r,o,i=t.queryPlan,s=e.internals.storeNames.documentStore,a=i.index,c=a,u=i.startKeys,l=pn(e.schema,c,u),f=i.endKeys,d=mn(e.schema,c,f),h=n.objectStore(s);o=1===a.length&&a[0]===e.primaryPath?yn(e.internals,["_deleted",e.primaryPath]):yn(e.internals,c),r=h.index(o);var p=(e.settings.IDBKeyRange?e.settings.IDBKeyRange:IDBKeyRange).bound(l,d,!i.inclusiveStart,!i.inclusiveEnd),m=r.count(p);return{count:await new Promise(((e,t)=>{m.onsuccess=function(){e(m.result)},m.onerror=t})),mode:"fast"}}))}(this,e);return this.updateMinKnownDocs(t.count),t}var n=await Mo(this,e);return this.updateMinKnownDocs(n.documents.length),{count:n.documents.length,mode:"slow"}},t.changeStream=function(){return this.changes$.asObservable()},t.cleanup=async function(e){var t=this.internals.state;await t.creationPromise;var n=this.settings.IDBKeyRange;return Dn(this),Bn(this,(async t=>{var r=t.objectStore(this.internals.storeNames.documentStore),o=this.settings.batchSize,i=O()-e,s=yn(this.internals,wn),a=r.index(s),c=pn(this.schema,wn,[!0,1]),u=mn(this.schema,wn,[!0,i]),l=n.bound(c,u,!0,!0),f=await new Promise(((e,t)=>{var n=a.getAll(l,o);n.onerror=t,n.onsuccess=function(t){e(t.target.result)}}));return await Promise.all(f.map((e=>new Promise(((t,n)=>{var o=e.i,i=r.delete(o);i.onerror=n,i.onsuccess=()=>t()}))))),f.length{var t=[e.objectStore(this.internals.storeNames.documentStore),e.objectStore(this.internals.storeNames.writeAheadStore)];return this.schema.attachments&&t.push(e.objectStore(this.internals.storeNames.attachmentsStore)),await Promise.all(t.map((e=>new Promise(((t,n)=>{var r=e.clear();r.onerror=n,r.onsuccess=t}))))),this.close()}))},t.getAttachmentData=async function(e,t){var n=this.internals.state;return await n.creationPromise,Dn(this),Bn(this,(n=>{var r=n.objectStore(this.internals.storeNames.attachmentsStore),o=En(e,t);return new Promise(((n,i)=>{var s=r.get(o);s.onsuccess=()=>{var r=s.result;r?n(r.data):i("attachment missing documentId: "+e+" attachmentId: "+t)}}))}))},t.close=async function(){return this.closed||(this.closed=(async()=>(await this.internals.state.creationPromise,await Bn(this,(async e=>{})),this.changes$.complete(),async function(e){if(!e.closed&&(e.refCount=e.refCount-1,0===e.refCount))return e.closed=!0,e.storage.indexedDBStates.delete(e.name),e.creationPromise.then((e=>e.close()))}(this.internals.state)))()),this.closed},t.conflictResultionTasks=function(){return(new Ir).asObservable()},t.resolveConflictResultionTask=function(e){return un},e}(),Ro=function(){function e(e){this.name=On,this.rxdbVersion=rn,this.indexedDBStates=new Map,this.settings=e}return e.prototype.createStorageInstance=function(e){return function(e){if(e.schema.keyCompression)throw d("UT5",{args:{params:e}});if((t=e.schema).encrypted&&t.encrypted.length>0||t.attachments&&t.attachments.encrypted)throw d("UT6",{args:{params:e}});var t;if(e.schema.attachments&&e.schema.attachments.compression)throw d("UT7",{args:{params:e}})}(e),async function(e,t,n){var r=xn(t.schema),o=Array.from(r.indexIdByName.values()),i=await Pn(e,n,t,[{collectionName:t.collectionName,schema:t.schema,indexIds:o}]);await i.creationPromise;var s={state:i,storeNames:An(t.collectionName,t.schema),getIndexableStringByIndexId:r.monadByIndexId,getIndexableStringByIndexNumber:Object.values(r.monadByIndexId),indexIdByName:r.indexIdByName,indexNames:Object.keys(r),indexIds:o,minKnownDocsAmount:0},a=new Bo(e,t.databaseName,t.collectionName,t.schema,s,t.options,n);return await Do(On,t,a),a}(this,e,Object.assign({},this.settings,e.options))},e}();function Lo(e,t){return _r((function(n,r){var o=0;n.subscribe(kr(r,(function(n){return e.call(t,n,o++)&&r.next(n)})))}))}function Ko(e,t){if(e===t)return!0;if(e&&t&&"object"==typeof e&&"object"==typeof t){if(e.constructor!==t.constructor)return!1;var n,r;if(Array.isArray(e)){if((n=e.length)!==t.length)return!1;for(r=n;0!=r--;)if(!Ko(e[r],t[r]))return!1;return!0}if(e.constructor===RegExp)return e.source===t.source&&e.flags===t.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===t.toString();var o=Object.keys(e);if((n=o.length)!==Object.keys(t).length)return!1;for(r=n;0!=r--;)if(!Object.prototype.hasOwnProperty.call(t,o[r]))return!1;for(r=n;0!=r--;){var i=o[r];if(!Ko(e[i],t[i]))return!1}return!0}return e!=e&&t!=t}function qo(e,t){return{connectionId:e.connectionId,answerTo:e.requestId,method:e.method,error:(n=t,{name:n.name,message:n.message,rxdb:n.rxdb,parameters:n.parameters,extensions:n.extensions,code:n.code,url:n.url,stack:n.stack?n.stack.replace(/\n/g," \n "):void 0})};var n}function Fo(e,t){return{connectionId:e.connectionId,answerTo:e.requestId,method:e.method,return:t}}!function(e){var t;console.log("exposeWorkerRxStorage()");var n=new Ir;if("undefined"!=typeof self&&"object"==typeof self.onconnect){var r=new Map;self.onconnect=e=>{var t=e.ports[0];t.onmessage=e=>{var o=e.data;r.set(o.connectionId,t),n.next(o)}},t={storage:e.storage,messages$:n,send(e){on(r,e.connectionId).postMessage(e)}}}else addEventListener("message",(e=>{var t=e.data;n.next(t)})),t={storage:e.storage,messages$:n,send(e){postMessage(e)}};!function(e){var t=new Map;function n(t){if(e.storage)return e.storage.createStorageInstance(t);if(e.database){var n=Array.from(e.database.storageInstances),r=t.collectionName,o=n.find((e=>e.collectionName===r));if(!o)throw console.dir(n),new Error("storageInstance does not exist "+JSON.stringify({collectionName:r}));var i=t.schema;if(!Ko(i,o.schema))throw new Error("Wrong schema "+JSON.stringify({schema:i,existingSchema:o.schema}));return Promise.resolve(o)}throw new Error("no base given")}e.messages$.pipe(Lo((e=>"custom"===e.method))).subscribe((async t=>{if(e.customRequestHandler)try{var n=await e.customRequestHandler(t.params);e.send(Fo(t,n))}catch(n){e.send(qo(t,n))}else e.send(qo(t,new Error("Remote storage: cannot resolve custom request because settings.customRequestHandler is not set")))})),e.messages$.pipe(Lo((e=>"create"===e.method))).subscribe((async r=>{var o=r.connectionId;if(!Array.isArray(r.params)){var i=r.params,s=i.collectionName,a=[i.databaseName,i.collectionName,i.schema.version].join("|"),c=t.get(a);if(c){if(!Ko(i.schema,c.params.schema))return void e.send(qo(r,new Error("Remote storage: schema not equal to existing storage")))}else try{c={storageInstancePromise:n(i),connectionIds:new Set,params:i},t.set(a,c),await c.storageInstancePromise}catch(t){return void e.send(qo(r,t))}c.connectionIds.add(r.connectionId);var u=[],l=await c.storageInstancePromise;u.push(l.changeStream().subscribe((t=>{var n={connectionId:o,answerTo:"changestream",method:"changeStream",return:t};e.send(n)}))),u.push(l.conflictResultionTasks().subscribe((t=>{var n={connectionId:o,answerTo:"conflictResultionTasks",method:"conflictResultionTasks",return:t};e.send(n)})));var f=!1;if(e.database){var d=e.database,h=d.collections[s];h?h.onDestroy.push((()=>p())):d.onDestroy.push((()=>p()))}u.push(e.messages$.pipe(Lo((e=>e.connectionId===o))).subscribe((async t=>{var n,r=t;if("create"!==r.method&&"custom"!==r.method&&Array.isArray(r.params))try{if("close"===r.method&&e.database)return void e.send(Fo(r,null));if("close"===r.method&&I(c).connectionIds.size>1)return e.send(Fo(r,null)),I(c).connectionIds.delete(o),void u.forEach((e=>e.unsubscribe()));n="getChangedDocumentsSince"!==r.method||l.getChangedDocumentsSince?await l[r.method](r.params[0],r.params[1],r.params[2],r.params[3]):await nn(l,r.params[0],r.params[1]),"close"!==r.method&&"remove"!==r.method||p(),e.send(Fo(r,n))}catch(t){e.send(qo(r,t))}}))),e.send(Fo(r,"ok"))}function p(){f||(f=!0,u.forEach((e=>e.unsubscribe())),I(c).connectionIds.delete(o),t.delete(a))}}))}(t)}({storage:function(e={}){var t=e.IDBKeyRange?e.IDBKeyRange:IDBKeyRange,n=e.indexedDB?e.indexedDB:indexedDB,r=Object.assign({batchSize:300,transactionDurability:"relaxed"},e,{IDBKeyRange:t,indexedDB:n});return new Ro(r)}({})})})(); \ No newline at end of file +(()=>{function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}function t(t){var n=function(t,n){if("object"!=e(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var o=r.call(t,n||"default");if("object"!=e(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(t)}(t,"string");return"symbol"==e(n)?n:n+""}function n(e,n){for(var r=0;r!1,deepFreezeWhenDevMode:e=>e,tunnelErrorMessage:e=>"\n RxDB Error-Code: "+e+".\n Hint: Error messages are not included in RxDB core to reduce build size.\n To show the full error messages and to ensure that you do not make any mistakes when using RxDB,\n use the dev-mode plugin when you are in development mode: https://rxdb.info/dev-mode.html?console=error\n "};function c(e,t,n){return"\n"+e+"\n"+function(e){var t="";return 0===Object.keys(e).length?t:(t+="-".repeat(20)+"\n",t+="Parameters:\n",t+=Object.keys(e).map((t=>{var n="[object Object]";try{n="errors"===t?e[t].map((e=>JSON.stringify(e,Object.getOwnPropertyNames(e)))):JSON.stringify(e[t],(function(e,t){return void 0===t?null:t}),2)}catch(e){}return t+": "+n})).join("\n"),t+="\n")}(n)}var u=function(e){function t(t,n,r={}){var o,i=c(n,0,r);return(o=e.call(this,i)||this).code=t,o.message=i,o.url=l(t),o.parameters=r,o.rxdb=!0,o}var o,i;return i=e,(o=t).prototype=Object.create(i.prototype),o.prototype.constructor=o,r(o,i),t.prototype.toString=function(){return this.message},function(e,t,r){return t&&n(e.prototype,t),r&&n(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}(t,[{key:"name",get:function(){return"RxError ("+this.code+")"}},{key:"typeError",get:function(){return!1}}])}(s(Error));function l(e){return"https://rxdb.info/errors.html?console=errors#"+e}function f(e){return"\nFind out more about this error here: "+l(e)+" \n"}function d(e,t){return new u(e,a.tunnelErrorMessage(e)+f(e),t)}var h=/\./g,p="abcdefghijklmnopqrstuvwxyz",m=e=>{var t=typeof e;return null!==e&&("object"===t||"function"===t)},v=new Set(["__proto__","prototype","constructor"]),y=new Set("0123456789");function b(e){var t=[],n="",r="start",o=!1;for(var i of e)switch(i){case"\\":if("index"===r)throw new Error("Invalid character in an index");if("indexEnd"===r)throw new Error("Invalid character after an index");o&&(n+=i),r="property",o=!o;break;case".":if("index"===r)throw new Error("Invalid character in an index");if("indexEnd"===r){r="property";break}if(o){o=!1,n+=i;break}if(v.has(n))return[];t.push(n),n="",r="property";break;case"[":if("index"===r)throw new Error("Invalid character in an index");if("indexEnd"===r){r="index";break}if(o){o=!1,n+=i;break}if("property"===r){if(v.has(n))return[];t.push(n),n=""}r="index";break;case"]":if("index"===r){t.push(Number.parseInt(n,10)),n="",r="indexEnd";break}if("indexEnd"===r)throw new Error("Invalid character after an index");default:if("index"===r&&!y.has(i))throw new Error("Invalid character in an index");if("indexEnd"===r)throw new Error("Invalid character after an index");"start"===r&&(r="property"),o&&(o=!1,n+="\\"),n+=i}switch(o&&(n+="\\"),r){case"property":if(v.has(n))return[];t.push(n);break;case"index":throw new Error("Index was not closed");case"start":t.push("")}return t}function g(e,t){if("number"!=typeof t&&Array.isArray(e)){var n=Number.parseInt(t,10);return Number.isInteger(n)&&e[n]===e[t]}return!1}function w(e,t){var n=function(e,t,n){if(Array.isArray(t)&&(t=t.join(".")),!t.includes(".")&&!t.includes("["))return e[t];if(!m(e)||"string"!=typeof t)return void 0===n?e:n;var r=b(t);if(0===r.length)return n;for(var o=0;ot[e]:e=>{for(var r=e,o=0;o"desc"===Object.values(e)[0])),i=new Set;Object.keys(n).forEach((t=>{var r=w(e,t);r&&"boolean"===r.type&&Object.prototype.hasOwnProperty.call(n[t],"$eq")&&i.add(t)}));var s,a=t.sort.map((e=>Object.keys(e)[0])).filter((e=>!i.has(e))).join(","),c=-1;if(r.forEach((e=>{var r=!0,u=!0,l=e.map((e=>{var t=n[e],o=t?Object.keys(t):[],i={};return t&&o.length?o.forEach((e=>{if(D.has(e)){var n=function(e,t){switch(e){case"$eq":return{startKey:t,endKey:t,inclusiveEnd:!0,inclusiveStart:!0};case"$lte":return{endKey:t,inclusiveEnd:!0};case"$gte":return{startKey:t,inclusiveStart:!0};case"$lt":return{endKey:t,inclusiveEnd:!1};case"$gt":return{startKey:t,inclusiveStart:!1};default:throw new Error("SNH")}}(e,t[e]);i=Object.assign(i,n)}})):i={startKey:u?$:_,endKey:r?_:$,inclusiveStart:!0,inclusiveEnd:!0},void 0===i.startKey&&(i.startKey=$),void 0===i.endKey&&(i.endKey=_),void 0===i.inclusiveStart&&(i.inclusiveStart=!0),void 0===i.inclusiveEnd&&(i.inclusiveEnd=!0),u&&!i.inclusiveStart&&(u=!1),r&&!i.inclusiveEnd&&(r=!1),i})),f=l.map((e=>e.startKey)),d=l.map((e=>e.endKey)),h={index:e,startKeys:f,endKeys:d,inclusiveEnd:r,inclusiveStart:u,sortSatisfiedByIndex:!o&&a===e.filter((e=>!i.has(e))).join(","),selectorSatisfiedByIndex:T(e,t.selector,f,d)},p=function(e,t,n){var r=0,o=e=>{e>0&&(r+=e)},i=10,s=P(n.startKeys,(e=>e!==$&&e!==_));o(s*i);var a=P(n.startKeys,(e=>e!==_&&e!==$));o(a*i);var c=P(n.startKeys,((e,t)=>e===n.endKeys[t]));return o(c*i*1.5),o(n.sortSatisfiedByIndex?5:0),r}(0,0,h);(p>=c||t.index)&&(c=p,s=h)})),!s)throw d("SNH",{query:t});return s}var D=new Set(["$eq","$gt","$gte","$lt","$lte"]),A=new Set(["$eq","$gt","$gte"]),M=new Set(["$eq","$lt","$lte"]);function T(e,t,n,r){var o=Object.entries(t).find((([t,n])=>!e.includes(t)||Object.entries(n).find((([e,t])=>!D.has(e)))));if(o)return!1;if(t.$and||t.$or)return!1;var i=[],s=new Set;for(var[a,c]of Object.entries(t)){if(!e.includes(a))return!1;var u=Object.keys(c).filter((e=>A.has(e)));if(u.length>1)return!1;var l=u[0];if(l&&s.add(a),"$eq"!==l){if(i.length>0)return!1;i.push(l)}}var f=[],d=new Set;for(var[h,p]of Object.entries(t)){if(!e.includes(h))return!1;var m=Object.keys(p).filter((e=>M.has(e)));if(m.length>1)return!1;var v=m[0];if(v&&d.add(h),"$eq"!==v){if(f.length>0)return!1;f.push(v)}}var y=0;for(var b of e){for(var g of[s,d]){if(!g.has(b)&&g.size>0)return!1;g.delete(b)}if(n[y]!==r[y]&&s.size>0&&d.size>0)return!1;y++}return!0}class C extends Error{}const B=Symbol("missing"),R=Object.freeze(new Error("mingo: cycle detected while processing object/array")),K=e=>{const t=he(e);let n=0,r=t.length;for(;r;)n=(n<<5)-n^t.charCodeAt(--r);return n>>>0},L=e=>"object"!=typeof e&&"function"!=typeof e||null===e,q=e=>L(e)||ee(e)||te(e),z={undefined:1,null:2,number:3,string:4,symbol:5,object:6,array:7,arraybuffer:8,boolean:9,date:10,regexp:11,function:12},F=(e,t)=>{e===B&&(e=void 0),t===B&&(t=void 0);const[n,r]=[e,t].map((e=>z[H(e)]||0));return n!==r?n-r:de(e,t)?0:et?1:0};class U extends Map{#e=K;#t=new Map;#n=e=>{const t=this.#e(e);return[(this.#t.get(t)||[]).find((t=>de(t,e))),t]};constructor(){super()}static init(e){const t=new U;return e&&(t.#e=e),t}clear(){super.clear(),this.#t.clear()}delete(e){if(L(e))return super.delete(e);const[t,n]=this.#n(e);return!!super.delete(t)&&(this.#t.set(n,this.#t.get(n).filter((e=>!de(e,t)))),!0)}get(e){if(L(e))return super.get(e);const[t,n]=this.#n(e);return super.get(t)}has(e){if(L(e))return super.has(e);const[t,n]=this.#n(e);return super.has(t)}set(e,t){if(L(e))return super.set(e,t);const[n,r]=this.#n(e);if(super.has(n))super.set(n,t);else{super.set(e,t);const n=this.#t.get(r)||[];n.push(e),this.#t.set(r,n)}return this}get size(){return super.size}}function W(e,t){if(!e)throw new C(t)}const V=Object.keys(z).reduce(((e,t)=>(e["[object "+t[0].toUpperCase()+t.substring(1)+"]"]=t,e)),{});function H(e){const t=Object.prototype.toString.call(e);return"[object Object]"===t?e?.constructor?.name?.toLowerCase()||"object":V[t]||t.substring(8,t.length-1).toLowerCase()}const J=e=>"boolean"==typeof e,G=e=>"string"==typeof e,Y=e=>!isNaN(e)&&"number"==typeof e,Q=Array.isArray;function X(e){if(!e)return!1;const t=Object.getPrototypeOf(e);return(t===Object.prototype||null===t)&&"object"===H(e)}const Z=e=>!L(e),ee=e=>e instanceof Date,te=e=>e instanceof RegExp,ne=e=>"function"==typeof e,re=e=>null==e,oe=e=>re(e)||G(e)&&!e||Q(e)&&0===e.length||X(e)&&0===Object.keys(e).length,ie=e=>Q(e)?e:[e],se=(e,t)=>!!e&&Object.prototype.hasOwnProperty.call(e,t),ae=(e,t)=>{if(re(e)||J(e)||Y(e)||G(e))return e;if(ee(e))return new Date(e);if(te(e))return new RegExp(e);if((e=>"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView(e))(e))return new(0,e.constructor)(e);if(t instanceof Set||(t=new Set),t.has(e))throw R;t.add(e);try{if(Q(e)){const n=new Array(e.length);for(let r=0;re===B;function ue(e,t){if(ce(e)||re(e))return t;if(ce(t)||re(t))return e;if(L(e)||L(t))return t;Q(e)&&Q(t)&&W(e.length===t.length,"arrays must be of equal length to merge.");for(const n of Object.keys(t))e[n]=ue(e[n],t[n]);return e}function le(e,t=1){const n=new Array;return function e(t,r){for(let o=0,i=t.length;o0||r<0)?e(t[o],Math.max(-1,r-1)):n.push(t[o])}(e,t),n}function fe(e){for(;e;){if(Object.getOwnPropertyNames(e).includes("toString"))return e.toString!==Object.prototype.toString;e=Object.getPrototypeOf(e)}return!1}function de(e,t){if(e===t||Object.is(e,t))return!0;if(null===e||null===t)return!1;if(typeof e!=typeof t)return!1;if("object"!=typeof e)return!1;if(e.constructor!==t.constructor)return!1;if(e instanceof Date)return+e==+t;if(e instanceof RegExp)return e.toString()===t.toString();const n=e.constructor;if(n===Array||n===Object){const n=Object.keys(e).sort(),r=Object.keys(t).sort();if(n.length!==r.length)return!1;for(let o=0,i=n[o];o{if(null===e)return"null";if(void 0===e)return"undefined";if(G(e)||Y(e)||J(e))return JSON.stringify(e);if(ee(e))return e.toISOString();if(te(e)||(e=>"symbol"==typeof e)(e)||ne(e))return e.toString();if(t instanceof Set||(t=new Set),t.has(e))throw R;try{if(t.add(e),Q(e))return"["+e.map((e=>he(e,t))).join(",")+"]";if(X(e))return"{"+Object.keys(e).sort().map((n=>`${n}:${he(e[n],t)}`)).join()+"}";const n=fe(e)?e.toString():he(function(e){const t={};for(;e;){for(const n of Object.getOwnPropertyNames(e))n in t||(t[n]=e[n]);e=Object.getPrototypeOf(e)}return t}(e),t);return H(e)+"("+n+")"}finally{t.delete(e)}};function pe(e,t){return re(e)?null:(t=t||K)(e)}function me(e,t,n=K){if(e.length<1)return new Map;const r=new Map,o=new Map;for(let i=0;ide(e,a))):null;re(e)?(o.set(a,[s]),r.has(c)?r.get(c).push(a):r.set(c,[a])):o.get(e).push(s)}}return o}function ve(e,t){return Z(e)?e[t]:void 0}function ye(e,t,n){let r=0;const o=q(e)?e:function e(t,n){let o=t;for(let t=0;t0)break;r+=1;const i=n.slice(t);o=o.reduce(((t,n)=>{const r=e(n,i);return void 0!==r&&t.push(r),t}),[]);break}if(o=ve(o,i),void 0===o)break}return o}(e,t.split("."));return Q(o)&&n?.unwrapArray?function(e,t){if(t<1)return e;for(;t--&&1===e.length;)e=e[0];return e}(o,r):o}function be(e,t,n){const r=t.indexOf("."),o=-1==r?t:t.substring(0,r),i=t.substring(r+1),s=-1!=r;if(Q(e)){const r=/^\d+$/.test(o),a=r&&n?.preserveIndex?[...e]:[];if(r){const t=parseInt(o);let r=ve(e,t);s&&(r=be(r,i,n)),n?.preserveIndex?a[t]=r:a.push(r)}else for(const r of e){const e=be(r,t,n);n?.preserveMissing?a.push(null==e?B:e):(null!=e||n?.preserveIndex)&&a.push(e)}return a}const a=n?.preserveKeys?{...e}:{};let c=ve(e,o);if(s&&(c=be(c,i,n)),void 0!==c)return a[o]=c,a}function ge(e){if(Q(e))for(let t=e.length-1;t>=0;t--)e[t]===B?e.splice(t,1):ge(e[t]);else if(X(e))for(const t in e)se(e,t)&&ge(e[t])}const we=/^\d+$/;function xe(e,t,n,r){const o=t.split("."),i=o[0],s=o.slice(1).join(".");if(1===o.length)(X(e)||Q(e)&&we.test(i))&&n(e,i);else{r?.buildGraph&&re(e[i])&&(e[i]={});const t=e[i];if(!t)return;const a=!!(o.length>1&&we.test(o[1]));Q(t)&&r?.descendArray&&!a?t.forEach((e=>xe(e,s,n,r))):xe(t,s,n,r)}}function Se(e,t,n){xe(e,t,((e,t)=>{e[t]=ne(n)?n(e[t]):n}),{buildGraph:!0})}function Oe(e,t,n){xe(e,t,((e,t)=>{if(Q(e)){if(/^\d+$/.test(t))e.splice(parseInt(t),1);else if(n&&n.descendArray)for(const n of e)X(n)&&delete n[t]}else X(e)&&delete e[t]}),n)}const Ie=/^\$[a-zA-Z0-9_]+$/;function Ee(e){return Ie.test(e)}function ke(e){if(q(e))return te(e)?{$regex:e}:{$eq:e};if(Z(e)){if(!Object.keys(e).some(Ee))return{$eq:e};if(se(e,"$regex")){const t={...e};return t.$regex=new RegExp(e.$regex,e.$options),delete t.$options,t}}return e}var je=(e=>(e[e.CLONE_OFF=0]="CLONE_OFF",e[e.CLONE_INPUT=1]="CLONE_INPUT",e[e.CLONE_OUTPUT=2]="CLONE_OUTPUT",e[e.CLONE_ALL=3]="CLONE_ALL",e))(je||{});class Pe{#r;#o;#i;constructor(e,t,n){this.#r=e,this.update(t,n)}static init(e,t,n){return e instanceof Pe?new Pe(e.#r,e.root??t,{...e.#i,...n,variables:Object.assign({},e.#i?.variables,n?.variables)}):new Pe(e,t,n)}update(e,t){this.#o=e;const n=Object.assign({},this.#i?.variables,t?.variables);return Object.keys(n).length?this.#i={...t,variables:n}:this.#i=t??{},this}getOptions(){return Object.freeze({...this.#r,context:_e.from(this.#r.context)})}get root(){return this.#o}get local(){return this.#i}get idKey(){return this.#r.idKey}get collation(){return this.#r?.collation}get processingMode(){return this.#r?.processingMode||0}get useStrictMode(){return this.#r?.useStrictMode}get scriptEnabled(){return this.#r?.scriptEnabled}get useGlobalContext(){return this.#r?.useGlobalContext}get hashFunction(){return this.#r?.hashFunction}get collectionResolver(){return this.#r?.collectionResolver}get jsonSchemaValidator(){return this.#r?.jsonSchemaValidator}get variables(){return this.#r?.variables}get context(){return this.#r?.context}}class _e{#s=new Map;constructor(){}static init(){return new _e}static from(e){const t=_e.init();return re(e)||e.#s.forEach(((e,n)=>t.addOperators(n,e))),t}addOperators(e,t){this.#s.has(e)||this.#s.set(e,{});for(const[n,r]of Object.entries(t))this.getOperator(e,n)||(this.#s.get(e)[n]=r);return this}getOperator(e,t){return(this.#s.get(e)??{})[t]??null}addAccumulatorOps(e){return this.addOperators("accumulator",e)}addExpressionOps(e){return this.addOperators("expression",e)}addQueryOps(e){return this.addOperators("query",e)}addPipelineOps(e){return this.addOperators("pipeline",e)}addProjectionOps(e){return this.addOperators("projection",e)}addWindowOps(e){return this.addOperators("window",e)}}const $e=_e.init();function Ne(e,t){for(const[n,r]of Object.entries(t)){W(ne(r)&&Ee(n),`'${n}' is not a valid operator`);const t=De(e,n,null);W(!t||r===t,`${n} already exists for '${e}' operators. Cannot change operator function once registered.`)}switch(e){case"accumulator":$e.addAccumulatorOps(t);break;case"expression":$e.addExpressionOps(t);break;case"pipeline":$e.addPipelineOps(t);break;case"projection":$e.addProjectionOps(t);break;case"query":$e.addQueryOps(t);break;case"window":$e.addWindowOps(t)}}function De(e,t,n){const{context:r,useGlobalContext:o}=n||{},i=r?r.getOperator(e,t):null;return!i&&o?$e.getOperator(e,t):i}function Ae(e,t,n,r){const o=Pe.init(r,e);return n&&Ee(n)?Ce(e,t,n,o):Te(e,t,o)}const Me=["$$ROOT","$$CURRENT","$$REMOVE","$$NOW"];function Te(e,t,n){if(G(t)&&t.length>0&&"$"===t[0]){if(Be.includes(t))return t;let r=n.root;const o=t.split(".");if(Me.includes(o[0])){switch(o[0]){case"$$ROOT":break;case"$$CURRENT":r=e;break;case"$$REMOVE":r=void 0;break;case"$$NOW":r=new Date}t=t.slice(o[0].length+1)}else if("$$"===o[0].slice(0,2)){r=Object.assign({},n.variables,{this:e},n?.local?.variables);const i=o[0].slice(2);W(se(r,i),`Use of undefined variable: ${i}`),t=t.slice(2)}else t=t.slice(1);return""===t?r:ye(r,t)}if(Q(t))return t.map((t=>Te(e,t,n)));if(X(t)){const r={},o=Object.entries(t);for(const[t,i]of o){if(Ee(t))return W(1==o.length,"expression must have single operator."),Ce(e,i,t,n);r[t]=Te(e,i,n)}return r}return t}function Ce(e,t,n,r){const o=De("expression",n,r);if(o)return o(e,t,r);const i=De("accumulator",n,r);return W(!!i,`accumulator '${n}' is not registered.`),Q(e)||(e=Te(e,t,r),t=null),W(Q(e),`arguments must resolve to array for ${n}.`),i(e,t,r)}const Be=["$$KEEP","$$PRUNE","$$DESCEND"];function Re(e){return e instanceof qe?e:new qe(e)}function Ke(e,t){const n=e.slice(t+1);e.splice(t),Array.prototype.push.apply(e,n)}const Le=new Error;class qe{constructor(e){let t;if(this.#a=[],this.#c=[],this.isDone=!1,e instanceof Function&&(e={next:e}),(n=e)&&"object"==typeof n&&n?.next instanceof Function){const n=e;t=()=>{const e=n.next();if(e.done)throw Le;return e.value}}else if(Q(e)){const n=e,r=n.length;let o=0;t=()=>{if(o0?this.push(2,e):this}drop(e){return e>0?this.push(3,e):this}transform(e){const t=this;let n;return Re((()=>(n||(n=Re(e(t.value()))),n.next())))}value(){return this.isDone||(this.isDone=this.#u(!0).done),this.#c}each(e){for(;;){const t=this.next();if(t.done)break;if(!1===e(t.value))return!1}return!0}reduce(e,t){let n=this.next();for(void 0!==t||n.done||(t=n.value,n=this.next());!n.done;)t=e(t,n.value),n=this.next();return t}size(){return this.reduce(((e,t)=>++e),0)}[Symbol.iterator](){return this}}const ze=(e,t,n)=>oe(t)?e:(Ue(t,n),e.map(Fe(t,Pe.init(n))));function Fe(e,t,n=!0){const r=t.idKey,o=Object.keys(e),i=new Array,s=new Array,a={};for(const r of o){const o=e[r];if(Y(o)||J(o))o?s.push(r):i.push(r);else if(Q(o))a[r]=e=>o.map((n=>Ae(e,n,null,t.update(e))??null));else if(X(o)){const e=Object.keys(o),i=1==e.length?e[0]:"",s=De("projection",i,t);s?"$slice"!==i||ie(o[i]).every(Y)?a[r]=e=>s(e,o[i],r,t.update(e)):a[r]=e=>Ae(e,o,r,t.update(e)):Ee(i)?a[r]=e=>Ae(e,o[i],i,t):(Ue(o,t),a[r]=e=>{if(!se(e,r))return Ae(e,o,null,t);n&&t.update(e);const i=ye(e,r),s=Fe(o,t,!1);return Q(i)?i.map(s):X(i)?s(i):s(e)})}else a[r]=G(o)&&"$"===o[0]?e=>Ae(e,o,r,t):e=>o}const c=Object.keys(a),u=i.includes(r);if(n&&u&&1===i.length&&!s.length&&!c.length)return e=>{const t={...e};return delete t[r],t};const l=n&&!u&&!s.includes(r),f={preserveMissing:!0};return e=>{const t={};if(i.length&&!s.length){ue(t,e);for(const e of i)Oe(t,e,{descendArray:!0})}for(const n of s)ue(t,be(e,n,f)??{});s.length&&ge(t);for(const n of c){const r=a[n](e);void 0===r?Oe(t,n,{descendArray:!0}):Se(t,n,r)}return l&&se(e,r)&&(t[r]=ye(e,r)),t}}function Ue(e,t){let n=!1,r=!1;for(const[o,i]of Object.entries(e))W(!o.startsWith("$"),"Field names may not start with '$'."),W(!o.endsWith(".$"),"Positional projection operator '$' is not supported."),o!==t?.idKey&&(0===i||!1===i?n=!0:1!==i&&!0!==i||(r=!0),W(!(n&&r),"Projection cannot have a mix of inclusion and exclusion."))}const We=(e,t,n)=>{if(oe(t)||!X(t))return e;let r=F;const o=n.collation;return X(o)&&G(o.locale)&&(r=function(e){const t={sensitivity:Ve[e.strength||3],caseFirst:"off"===e.caseFirst?"false":e.caseFirst||"false",numeric:e.numericOrdering||!1,ignorePunctuation:"shifted"===e.alternate};!0===(e.caseLevel||!1)&&("base"===t.sensitivity&&(t.sensitivity="case"),"accent"===t.sensitivity&&(t.sensitivity="variant"));const n=new Intl.Collator(e.locale,t);return(e,t)=>{if(!G(e)||!G(t))return F(e,t);const r=n.compare(e,t);return r<0?-1:r>0?1:0}}(o)),e.transform((e=>{const o=Object.keys(t);for(const i of o.reverse()){const o=me(e,(e=>ye(e,i)),n.hashFunction),s=Array.from(o.keys()).sort(r);-1===t[i]&&s.reverse();let a=0;for(const t of s)for(const n of o.get(t))e[a++]=n;W(a==e.length,"bug: counter must match collection size.")}return e}))},Ve={1:"base",2:"accent",3:"variant"},He={$sort:We,$skip:(e,t,n)=>e.drop(t),$limit:(e,t,n)=>e.take(t)};class Je{#l;#f;#d;#r;#s={};#h=null;#p=[];constructor(e,t,n,r){this.#l=e,this.#f=t,this.#d=n,this.#r=r}fetch(){if(this.#h)return this.#h;this.#h=Re(this.#l).filter(this.#f);const e=this.#r.processingMode;e&je.CLONE_INPUT&&this.#h.map(ae);for(const e of["$sort","$skip","$limit"])se(this.#s,e)&&(this.#h=He[e](this.#h,this.#s[e],this.#r));return Object.keys(this.#d).length&&(this.#h=ze(this.#h,this.#d,this.#r)),e&je.CLONE_OUTPUT&&this.#h.map(ae),this.#h}fetchAll(){const e=Re([...this.#p]);return this.#p=[],function(...e){let t=0;return Re((()=>{for(;t0)return this.#p.pop();const e=this.fetch().next();return e.done?void 0:e.value}hasNext(){if(this.#p.length>0)return!0;const e=this.fetch().next();return!e.done&&(this.#p.push(e.value),!0)}map(e){return this.all().map(e)}forEach(e){this.all().forEach(e)}[Symbol.iterator](){return this.fetchAll()}}const Ge=new Set(Array.from(["$and","$or","$nor","$expr","$jsonSchema"]));class Ye{#m;#r;#v;constructor(e,t){this.#v=ae(e),this.#r=function(e){return e instanceof Pe?e.getOptions():Object.freeze({idKey:"_id",scriptEnabled:!0,useStrictMode:!0,useGlobalContext:!0,processingMode:0,...e,context:e?.context?_e.from(e?.context):_e.init()})}(t),this.#m=[],this.compile()}compile(){W(X(this.#v),`query criteria must be an object: ${JSON.stringify(this.#v)}`);const e={};for(const[t,n]of Object.entries(this.#v)){if("$where"===t)W(this.#r.scriptEnabled,"$where operator requires 'scriptEnabled' option to be true."),Object.assign(e,{field:t,expr:n});else if(Ge.has(t))this.processOperator(t,t,n);else{W(!Ee(t),`unknown top level operator: ${t}`);for(const[e,r]of Object.entries(ke(n)))this.processOperator(t,e,r)}e.field&&this.processOperator(e.field,e.field,e.expr)}}processOperator(e,t,n){const r=De("query",t,this.#r);W(!!r,`unknown query operator ${t}`),this.#m.push(r(e,n,this.#r))}test(e){return this.#m.every((t=>t(e)))}find(e,t){return new Je(e,(e=>this.test(e)),t||{},this.#r)}remove(e){return e.reduce(((e,t)=>(this.test(t)||e.push(t),e)),[])}}function Qe(e){return(t,n,r)=>{const o={unwrapArray:!0},i=Math.max(1,t.split(".").length-1);return s=>{const a=ye(s,t,o);return e(a,n,{...r,depth:i})}}}function Xe(e){return(t,n,r)=>{const o=Ae(t,n,null,r);return e(...o)}}function Ze(e,t,n){return!!de(e,t)||!(!re(e)||!re(t))||!!Q(e)&&(e.some((e=>de(e,t)))||le(e,n?.depth).some((e=>de(e,t))))}function et(e,t,n){return!Ze(e,t,n)}function tt(e,t,n){return re(e)?t.some((e=>null===e)):function(e,t=K){const n=[U.init(t),U.init(t)];if(0===e.length)return[];if(e.some((e=>0===e.length)))return[];if(1===e.length)return[...e];e[e.length-1].forEach((e=>n[0].set(e,!0)));for(let t=e.length-2;t>-1;t--){if(e[t].forEach((e=>{n[0].has(e)&&n[1].set(e,!0)})),0===n[1].size)return[];n.reverse(),n[1].clear()}return Array.from(n[0].keys())}([ie(e),t],n?.hashFunction).length>0}function nt(e,t,n){return!tt(e,t,n)}function rt(e,t,n){return dt(e,t,((e,t)=>F(e,t)<0))}function ot(e,t,n){return dt(e,t,((e,t)=>F(e,t)<=0))}function it(e,t,n){return dt(e,t,((e,t)=>F(e,t)>0))}function st(e,t,n){return dt(e,t,((e,t)=>F(e,t)>=0))}function at(e){return Ee(e)&&-1===["$and","$or","$nor"].indexOf(e)}function ct(e,t,n){if(Q(e)&&!oe(e)){let r=e=>e,o=t;Object.keys(t).every(at)&&(o={temp:t},r=e=>({temp:e}));const i=new Ye(o,n);for(let t=0,n=e.length;tnull===e,lt={array:Q,boolean:J,bool:J,date:ee,number:Y,int:Y,long:Y,double:Y,decimal:Y,null:ut,object:X,regexp:te,regex:te,string:G,undefined:re,function:e=>{throw new C("unsupported type key `function`.")},1:Y,2:G,3:X,4:Q,6:re,8:J,9:ee,10:ut,11:te,16:Y,18:Y,19:Y};function ft(e,t,n){const r=lt[t];return!!r&&r(e)}function dt(e,t,n){return ie(e).some((e=>H(e)===H(t)&&n(e,t)))}Xe(nt);const ht=(e,t)=>(n,r,o)=>{W(Q(r),`${e}: expression must be an array.`);const i=Ae(n,r,null,o);return i.some(re)?null:(W(i.every(Y),`${e}: expression must evalue to array of numbers.`),t(i))},pt=(ht("$bitAnd",(e=>e.reduce(((e,t)=>e&t),-1))),ht("$bitOr",(e=>e.reduce(((e,t)=>e|t),0))),ht("$bitXor",(e=>e.reduce(((e,t)=>e^t),0))),Xe(Ze),Xe(it),Xe(st),Xe(rt),Xe(ot),Xe(et),(e,t)=>{const n={};return e.split("").forEach(((e,r)=>n[e]=t*(r+1))),n});pt("ABCDEFGHIKLM",1),pt("NOPQRSTUVWXY",-1);const mt={undefined:null,null:null,NaN:NaN,Infinity:new Error,"-Infinity":new Error};function vt(e,t=mt){const n=Object.assign({},mt,t),r=new Set(Object.keys(n));return(t,o,i)=>{const s=Ae(t,o,null,i);if(r.has(`${s}`)){const t=n[`${s}`];if(t instanceof Error)throw new C(`cannot apply $${e.name} to -inf, value must in (-inf,inf)`);return t}return e(s)}}vt(Math.acos,{Infinity:1/0,0:new Error}),vt(Math.acosh,{Infinity:1/0,0:new Error}),vt(Math.asin),vt(Math.asinh,{Infinity:1/0,"-Infinity":-1/0}),vt(Math.atan),vt(Math.atanh,{1:1/0,"-1":-1/0}),vt(Math.cos),vt(Math.cosh,{"-Infinity":1/0,Infinity:1/0});const yt=Math.PI/180,bt=(vt((e=>e*yt),{Infinity:1/0,"-Infinity":1/0}),180/Math.PI);vt((e=>e*bt),{Infinity:1/0,"-Infinity":-1/0}),vt(Math.sin),vt(Math.sinh,{"-Infinity":-1/0,Infinity:1/0}),vt(Math.tan),Number.MAX_SAFE_INTEGER,Number.MIN_SAFE_INTEGER;const gt=(e,t,n)=>{W(Q(t),"Invalid expression: $and expects value to be an Array.");const r=t.map((e=>new Ye(e,n)));return e=>r.every((t=>t.test(e)))},wt=(e,t,n)=>{W(Q(t),"Invalid expression. $or expects value to be an Array");const r=t.map((e=>new Ye(e,n)));return e=>r.some((t=>t.test(e)))},xt=(e,t,n)=>{W(Q(t),"Invalid expression. $nor expects value to be an array.");const r=wt(0,t,n);return e=>!r(e)},St=(e,t,n)=>{const r={};r[e]=ke(t);const o=new Ye(r,n);return e=>!o.test(e)},Ot=Qe(Ze),It=Qe(it),Et=Qe(st),kt=Qe(tt),jt=Qe(rt),Pt=Qe(ot),_t=Qe(et),$t=Qe(nt),Nt=Qe((function(e,t,n){return ie(e).some((e=>2===t.length&&e%t[0]===t[1]))})),Dt=Qe((function(e,t,n){const r=ie(e),o=e=>G(e)&&((e,t=!0)=>!!e||t&&""===e)(t.exec(e),n?.useStrictMode);return r.some(o)||le(r,1).some(o)}));Qe((function(e,t,n){if(!(Q(e)&&Q(t)&&e.length&&t.length))return!1;let r=!0;for(const o of t){if(!r)break;r=X(o)&&Object.keys(o).includes("$elemMatch")?ct(e,o.$elemMatch,n):te(o)?e.some((e=>"string"==typeof e&&o.test(e))):e.some((e=>de(o,e)))}return r}));const At=Qe(ct),Mt=Qe((function(e,t,n){return Array.isArray(e)&&e.length===t})),Tt=(e,t,n)=>{const r=e.includes("."),o=!!t;return!r||e.match(/\.\d+$/)?t=>void 0!==ye(t,e)===o:t=>{const n=ye(be(t,e,{preserveIndex:!0}),e.substring(0,e.lastIndexOf(".")));return Q(n)?n.some((e=>void 0!==e))===o:void 0!==n===o}},Ct=Qe((function(e,t,n){return Q(t)?t.findIndex((t=>ft(e,t)))>=0:ft(e,t)}));var Bt=!1;function Rt(e,t){var n=x(e.primaryKey);t=I(t);var r,o=E(t);if("number"!=typeof o.skip&&(o.skip=0),o.selector?(o.selector=o.selector,Object.entries(o.selector).forEach((([e,t])=>{"object"==typeof t&&null!==t||(o.selector[e]={$eq:t})}))):o.selector={},o.index){var i=(r=o.index,Array.isArray(r)?r.slice(0):[r]);i.includes(n)||i.push(n),o.index=i}if(o.sort){var s=o.sort.find((e=>{return t=e,Object.keys(t)[0]===n;var t}));s||(o.sort=o.sort.slice(0),o.sort.push({[n]:"asc"}))}else if(o.index)o.sort=o.index.map((e=>({[e]:"asc"})));else{if(e.indexes){var a=new Set;Object.entries(o.selector).forEach((([e,t])=>{("object"!=typeof t||null===t||Object.keys(t).find((e=>D.has(e))))&&a.add(e)}));var c,u=-1;e.indexes.forEach((e=>{var t=j(e)?e:[e],n=t.findIndex((e=>!a.has(e)));n>0&&n>u&&(u=n,c=t)})),c&&(o.sort=c.map((e=>({[e]:"asc"}))))}if(!o.sort)if(e.indexes&&e.indexes.length>0){var l=e.indexes[0],f=j(l)?l:[l];o.sort=f.map((e=>({[e]:"asc"})))}else o.sort=[{[n]:"asc"}]}return o}function Kt(e,t){if(!t.sort)throw d("SNH",{query:t});var n,r=(n=t.selector,Bt||(Ne("pipeline",{$sort:We,$project:ze}),Ne("query",{$and:gt,$eq:Ot,$elemMatch:At,$exists:Tt,$gt:It,$gte:Et,$in:kt,$lt:jt,$lte:Pt,$ne:_t,$nin:$t,$mod:Nt,$nor:xt,$not:St,$or:wt,$regex:Dt,$size:Mt,$type:Ct}),Bt=!0),new Ye(n));return e=>r.test(e)}function Lt(e,t,n,r,o,i,s){for(var a,c=!!e.schema.attachments,u=[],l=[],f=[],h={id:function(e=10){for(var t="",n=0;n0,w=r.length,x=function(){var e,o=r[O],h=o.document,p=o.previous,w=h[t],x=h._deleted,I=p&&p._deleted,E=void 0;if(g&&(E=n.get(w)),E){var k=E._rev;if(!p||p&&k!==p._rev){var j={isError:!0,status:409,documentId:w,writeRow:o,documentInDb:E};return f.push(j),1}var P=c?qt(o):o;c&&(x?p&&Object.keys(p._attachments).forEach((e=>{y.push({documentId:w,attachmentId:e,digest:S(p)._attachments[e].digest})})):(Object.entries(h._attachments).find((([t,n])=>((p?p._attachments[t]:void 0)||n.data||(e={documentId:w,documentInDb:E,isError:!0,status:510,writeRow:o,attachmentId:t}),!0))),e||Object.entries(h._attachments).forEach((([e,t])=>{var n=p?p._attachments[e]:void 0;if(n){var r=P.document._attachments[e].digest;t.data&&n.digest!==r&&b.push({documentId:w,attachmentId:e,attachmentData:t,digest:t.digest})}else v.push({documentId:w,attachmentId:e,attachmentData:t,digest:t.digest})})))),e?f.push(e):(c?(l.push(qt(P)),s&&s(h)):(l.push(P),s&&s(h)),a=P);var _=null,$=null,N=null;if(I&&!x)N="INSERT",_=c?zt(h):h;else if(!p||I||x){if(!x)throw d("SNH",{args:{writeRow:o}});N="DELETE",_=S(h),$=p}else N="UPDATE",_=c?zt(h):h,$=p;var D={documentId:w,documentData:_,previousDocumentData:$,operation:N};m.push(D)}else{var A=!!x;if(c&&Object.entries(h._attachments).forEach((([t,n])=>{n.data?v.push({documentId:w,attachmentId:t,attachmentData:n,digest:n.digest}):(e={documentId:w,isError:!0,status:510,writeRow:o,attachmentId:t},f.push(e))})),e||(c?(u.push(qt(o)),i&&i(h)):(u.push(o),i&&i(h)),a=o),!A){var M={documentId:w,operation:"INSERT",documentData:c?zt(h):h,previousDocumentData:c&&p?zt(p):p};m.push(M)}}},O=0;O{var r,o,i;t._attachments[e]=(i=(r=n).data)?{length:(o=i,atob(o).length),digest:r.digest,type:r.type}:r})),t}async function Ft(e,t,n){if(e.getChangedDocumentsSince)return e.getChangedDocumentsSince(t,n);var r=x(e.schema.primaryKey),o=function(e,t){if(!t.sort)throw d("SNH",{query:t});return{query:t,queryPlan:N(e,t)}}(e.schema,function(e,t,n){var r=x(e.schema.primaryKey),o=n?n.lwt:1,i=n?n.id:"";return Rt(e.schema,{selector:{$or:[{"_meta.lwt":{$gt:o}},{"_meta.lwt":{$eq:o},[r]:{$gt:n?i:""}}],"_meta.lwt":{$gte:o}},sort:[{"_meta.lwt":"asc"},{[r]:"asc"}],skip:0,limit:t})}(e,t,n)),i=(await e.query(o)).documents,s=k(i);return{documents:i,checkpoint:s?{id:s[r],lwt:s._meta.lwt}:n||{id:"",lwt:0}}}new WeakMap,new WeakMap;var Ut="16.17.1",Wt="16.17.1";function Vt(e,t){var n=e.get(t);if(void 0===n)throw new Error("missing value from map "+t);return n}function Ht(e,t,n,r){var o=e.get(t);return void 0===o?(o=n(),e.set(t,o)):r&&r(o),o}function Jt(e=0){return new Promise((t=>setTimeout(t,e)))}Promise.resolve(!0);var Gt=Promise.resolve(!1),Yt=(Promise.resolve(null),Promise.resolve());function Qt(e=1e4){return"function"==typeof requestIdleCallback?new Promise((t=>{requestIdleCallback((()=>t()),{timeout:e})})):Jt(0)}function Xt(e,t){var n=t.map((t=>{var n=w(e,t);if(!n)throw new Error("not in schema: "+t);var r,o=n.type;"number"!==o&&"integer"!==o||(r=Zt(n));var i,s=O(t),a=n.maxLength?n.maxLength:0;return i="string"===o?e=>{var t=s(e);return t||(t=""),t.padEnd(a," ")}:"boolean"===o?e=>s(e)?"1":"0":e=>{var t=s(e);return en(r,t)},{fieldName:t,schemaPart:n,parsedLengths:r,getValue:s,getIndexStringPart:i}}));return n}function Zt(e){var t=Math.floor(e.minimum),n=Math.ceil(e.maximum),r=e.multipleOf,o=(n-t).toString().length,i=r.toString().split("."),s=0;return i.length>1&&(s=i[1].length),{minimum:t,maximum:n,nonDecimals:o,decimals:s,roundedMinimum:t}}function en(e,t){void 0===t&&(t=0),te.maximum&&(t=e.maximum);var n=(Math.floor(t)-e.roundedMinimum).toString().padStart(e.nonDecimals,"0");if(e.decimals>0){var r=t.toString().split(".");n+=(r.length>1?r[1]:"0").padEnd(e.decimals,"0")}return n}function tn(e,t,n){var r="";return t.forEach(((t,o)=>{var i=w(e,t),s=n[o],a=i.type;switch(a){case"string":var c=S(i.maxLength,"maxLength not set");r+="string"==typeof s?s.padEnd(c," "):"".padEnd(c," ");break;case"boolean":r+=null===s||s===$?"0":s===_||s?"1":"0";break;case"number":case"integer":var u=Zt(i);if(null===s||s===$)r+="0".repeat(u.nonDecimals+u.decimals);else if(s===_)r+=en(u,u.maximum);else{var l=en(u,s);r+=l}break;default:throw new Error("unknown index type "+a)}})),r}function nn(e,t,n){var r="";return t.forEach(((t,o)=>{var i=w(e,t),s=n[o],a=i.type;switch(a){case"string":var c=S(i.maxLength,"maxLength not set");r+="string"==typeof s&&s!==_?s.padEnd(c," "):"".padEnd(c,s===$?" ":_);break;case"boolean":r+=null===s||s?"1":"0";break;case"number":case"integer":var u=Zt(i);r+=null===s||s===_?"9".repeat(u.nonDecimals+u.decimals):s===$?"0".repeat(u.nonDecimals+u.decimals):en(u,s);break;default:throw new Error("unknown index type "+a)}})),r}function rn(e){return e.join("||")}var on=["_deleted","_meta.lwt"];function sn(e,t){var n=rn(t);return Vt(e.indexIdByName,n)}rn(on);var an={locale:null,unique:!1};function cn(e,t,n,r){for(var o={i:n,d:r,i0:void 0,i1:void 0,i2:void 0,i3:void 0,i4:void 0,i5:void 0,i6:void 0,i7:void 0},i=0;iArray.isArray(e)?e.slice(0):[e])):[];n.push(on);var r=new Map;return n.forEach(((n,o)=>{var i="i"+o,s=rn(n);if(r.has(s))throw new Error("duplicate index "+s+" "+JSON.stringify(e,null,4));r.set(s,i),t[i]=function(e,t){var n=Xt(e,t),r=n.length,o=n.map((e=>e.getIndexStringPart));return function(e){for(var t="",n=0;nYt));return n=S(n).then((()=>t())),pn.set(e,n),n}function vn(e,t){t.onversionchange=n=>{e.closed||(t.close(),e.creationPromise=e.refreshIDBDatabase())}}async function yn(e,t,n,r){var o=await Ht(e.indexedDBStates,n.databaseName,(()=>async function(e,t,n){var r=dn++,o=await function(e,t){return"function"==typeof t?t(e):t}(e,n.indexedDB),i=async()=>(await Jt(0),mn(e.databaseName,(()=>new Promise(((t,n)=>{var i=o.open(e.databaseName);i.onerror=function(t){console.error(r+": OPEN IDB DATABASE "+e.databaseName+" ERROR"),n(t)},i.onsuccess=function(e){var n=i.result;t(n),vn(s,n)},wn(s,i)}))))),s={indexedDB:o,debugId:r,closed:!1,storage:t,settings:n,refreshIDBDatabase:i,creationPromise:i(),name:e.databaseName,refCount:0,storesToOpen:[]};return s}(n,e,t)));return o.storesToOpen=o.storesToOpen.concat(r),o.refCount=o.refCount+1,o.creationPromise.then((()=>bn(S(o)))).then((()=>S(o)))}async function bn(e){if(0!==e.storesToOpen.length)return e.creationPromise=e.creationPromise.then((async t=>{var n=new Set(Array.from(t.objectStoreNames));if(0===e.storesToOpen.filter((e=>!n.has(gn(e.collectionName,e.schema).documentStore))).length)return t;var r=t.version+1;return t.close(),mn(e.name,(()=>new Promise(((t,n)=>{var o=e.indexedDB.open(e.name,r);o.onerror=function(t){console.error(e.debugId+": ERROR openStoresOnExistingDatabase() openRequest: error "),n(t)},o.onsuccess=function(n){var r=o.result;vn(e,r),t(r)},o.onblocked=e=>{},wn(e,o)}))))})),e.creationPromise}function gn(e,t){var n=t.version;return{documentStore:e+"-"+n+"-documents",writeAheadStore:e+"-"+n+"-wal",attachmentsStore:e+"-"+n+"-attachments"}}function wn(e,t){t.onupgradeneeded=function(n){var r=t.result;e.storesToOpen.forEach((e=>{var t=r.objectStoreNames,n=gn(e.collectionName,e.schema);if(!t.contains(n.documentStore)){var o=r.createObjectStore(n.documentStore,{keyPath:"i",autoIncrement:!1});r.createObjectStore(n.writeAheadStore,{keyPath:"i",autoIncrement:!1}),function(e,t){t.indexIds.forEach((t=>{e.createIndex(t,t,an)}))}(o,e),e.schema.attachments&&r.createObjectStore(n.attachmentsStore,{keyPath:"docIdWithAttachmentId",autoIncrement:!1})}})),e.storesToOpen=[]}}function xn(e){if(e.closed)throw new Error("RxStorageInstanceIndexedDB is closed "+e.databaseName+"-"+e.collectionName)}async function Sn(e,t){var n=e.primaryPath,r=e.internals.indexIds.length,o=e.internals.getIndexableStringByIndexNumber,i=t.objectStore(e.internals.storeNames.writeAheadStore),s=await new Promise(((e,t)=>{var n=i.get("documents");n.onerror=t,n.onsuccess=t=>{var r=n.result;e(r?JSON.parse(r.docsData):void 0)}}));if(s&&s.length>0){for(var a,c=t.objectStore(e.internals.storeNames.documentStore),u=0;u{a.onerror=t,a.onsuccess=()=>e(!0)})),i.delete("documents")}return t}async function On(e){var t,n=[e.internals.storeNames.documentStore,e.internals.storeNames.writeAheadStore];e.schema.attachments&&n.push(e.internals.storeNames.attachmentsStore);for(var r=100;r>0;){var o=await e.internals.state.creationPromise;r-=1;try{t=o.transaction(n,"readwrite",ln);break}catch(t){if("InvalidStateError"!==t.name&&"NotFoundError"!==t.name||!(r>0))throw t;"NotFoundError"===t.name?await bn(e.internals.state):e.internals.state.creationPromise=e.internals.state.refreshIDBDatabase()}}return await Sn(e,S(t)),S(t)}var In=function(){function e(e){this.allTasksRuns=[],this.instance=e,this.txPromise=On(this.instance).then((t=>Sn(e,t)))}return e.prototype.addTask=function(e){var t=this.txPromise.then((t=>e(t))),n=t.catch((()=>null));this.allTasksRuns.push(n);var r=this.allTasksRuns.length;return n.then((()=>Promise.all(this.allTasksRuns))).then((()=>{this.allTasksRuns.length===r&&(this.instance.openReadonlyTransaction=void 0)})),t.catch((t=>{if("TransactionInactiveError"===t.name)return this.instance.openReadonlyTransaction=void 0,En(this.instance,e);throw t}))},e}();function En(e,t){return e.openReadonlyTransaction||(e.openReadonlyTransaction=new In(e)),e.openReadonlyTransaction.addTask(t)}var kn=0;function jn(){var e=Date.now();(e+=.01)<=kn&&(e=kn+.01);var t=parseFloat(e.toFixed(2));return kn=t,t}var Pn=function(e,t){return Pn=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},Pn(e,t)};function _n(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}Pn(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}function $n(e,t,n,r){return new(n||(n=Promise))((function(o,i){function s(e){try{c(r.next(e))}catch(e){i(e)}}function a(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((r=r.apply(e,t||[])).next())}))}function Nn(e,t){var n,r,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},s=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return s.next=a(0),s.throw=a(1),s.return=a(2),"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(a){return function(c){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;s&&(s=0,a[0]&&(i=0)),i;)try{if(n=1,r&&(o=2&a[0]?r.return:a[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,a[1])).done)return o;switch(r=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return i.label++,{value:a[1],done:!1};case 5:i.label++,r=a[1],a=[0];continue;case 7:a=i.ops.pop(),i.trys.pop();continue;default:if(!((o=(o=i.trys).length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function An(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)s.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return s}function Mn(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o1||a(e,t)}))},t&&(r[e]=t(r[e])))}function a(e,t){try{(n=o[e](t)).value instanceof Tn?Promise.resolve(n.value.v).then(c,u):l(i[0][2],n)}catch(e){l(i[0][3],e)}var n}function c(e){a("next",e)}function u(e){a("throw",e)}function l(e,t){e(t),i.shift(),i.length&&a(i[0][0],i[0][1])}}function Bn(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=Dn(e),t={},r("next"),r("throw"),r("return"),t[Symbol.asyncIterator]=function(){return this},t);function r(n){t[n]=e[n]&&function(t){return new Promise((function(r,o){!function(e,t,n,r){Promise.resolve(r).then((function(t){e({value:t,done:n})}),t)}(r,o,(t=e[n](t)).done,t.value)}))}}}function Rn(e){return"function"==typeof e}function Kn(e){var t=e((function(e){Error.call(e),e.stack=(new Error).stack}));return t.prototype=Object.create(Error.prototype),t.prototype.constructor=t,t}Object.create,Object.create,"function"==typeof SuppressedError&&SuppressedError;var Ln=Kn((function(e){return function(t){e(this),this.message=t?t.length+" errors occurred during unsubscription:\n"+t.map((function(e,t){return t+1+") "+e.toString()})).join("\n "):"",this.name="UnsubscriptionError",this.errors=t}}));function qn(e,t){if(e){var n=e.indexOf(t);0<=n&&e.splice(n,1)}}var zn=function(){function e(e){this.initialTeardown=e,this.closed=!1,this._parentage=null,this._finalizers=null}var t;return e.prototype.unsubscribe=function(){var e,t,n,r,o;if(!this.closed){this.closed=!0;var i=this._parentage;if(i)if(this._parentage=null,Array.isArray(i))try{for(var s=Dn(i),a=s.next();!a.done;a=s.next())a.value.remove(this)}catch(t){e={error:t}}finally{try{a&&!a.done&&(t=s.return)&&t.call(s)}finally{if(e)throw e.error}}else i.remove(this);var c=this.initialTeardown;if(Rn(c))try{c()}catch(e){o=e instanceof Ln?e.errors:[e]}var u=this._finalizers;if(u){this._finalizers=null;try{for(var l=Dn(u),f=l.next();!f.done;f=l.next()){var d=f.value;try{Wn(d)}catch(e){o=null!=o?o:[],e instanceof Ln?o=Mn(Mn([],An(o)),An(e.errors)):o.push(e)}}}catch(e){n={error:e}}finally{try{f&&!f.done&&(r=l.return)&&r.call(l)}finally{if(n)throw n.error}}}if(o)throw new Ln(o)}},e.prototype.add=function(t){var n;if(t&&t!==this)if(this.closed)Wn(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=null!==(n=this._finalizers)&&void 0!==n?n:[]).push(t)}},e.prototype._hasParent=function(e){var t=this._parentage;return t===e||Array.isArray(t)&&t.includes(e)},e.prototype._addParent=function(e){var t=this._parentage;this._parentage=Array.isArray(t)?(t.push(e),t):t?[t,e]:e},e.prototype._removeParent=function(e){var t=this._parentage;t===e?this._parentage=null:Array.isArray(t)&&qn(t,e)},e.prototype.remove=function(t){var n=this._finalizers;n&&qn(n,t),t instanceof e&&t._removeParent(this)},e.EMPTY=((t=new e).closed=!0,t),e}(),Fn=zn.EMPTY;function Un(e){return e instanceof zn||e&&"closed"in e&&Rn(e.remove)&&Rn(e.add)&&Rn(e.unsubscribe)}function Wn(e){Rn(e)?e():e.unsubscribe()}var Vn={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1},Hn={setTimeout:function(e,t){for(var n=[],r=2;r0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(t){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,t)},t.prototype._subscribe=function(e){return this._throwIfClosed(),this._checkFinalizedStatuses(e),this._innerSubscribe(e)},t.prototype._innerSubscribe=function(e){var t=this,n=this,r=n.hasError,o=n.isStopped,i=n.observers;return r||o?Fn:(this.currentObservers=null,i.push(e),new zn((function(){t.currentObservers=null,qn(i,e)})))},t.prototype._checkFinalizedStatuses=function(e){var t=this,n=t.hasError,r=t.thrownError,o=t.isStopped;n?e.error(r):o&&e.complete()},t.prototype.asObservable=function(){var e=new fr;return e.source=this,e},t.create=function(e,t){return new mr(e,t)},t}(fr),mr=function(e){function t(t,n){var r=e.call(this)||this;return r.destination=t,r.source=n,r}return _n(t,e),t.prototype.next=function(e){var t,n;null===(n=null===(t=this.destination)||void 0===t?void 0:t.next)||void 0===n||n.call(t,e)},t.prototype.error=function(e){var t,n;null===(n=null===(t=this.destination)||void 0===t?void 0:t.error)||void 0===n||n.call(t,e)},t.prototype.complete=function(){var e,t;null===(t=null===(e=this.destination)||void 0===e?void 0:e.complete)||void 0===t||t.call(e)},t.prototype._subscribe=function(e){var t,n;return null!==(n=null===(t=this.source)||void 0===t?void 0:t.subscribe(e))&&void 0!==n?n:Fn},t}(pr);function vr(e){return function(t){if(function(e){return Rn(null==e?void 0:e.lift)}(t))return t.lift((function(t){try{return e(t,this)}catch(e){this.error(e)}}));throw new TypeError("Unable to lift unknown Observable type")}}var yr=Array.isArray;function br(e,t,n,r,o){return new gr(e,t,n,r,o)}var gr=function(e){function t(t,n,r,o,i,s){var a=e.call(this,t)||this;return a.onFinalize=i,a.shouldUnsubscribe=s,a._next=n?function(e){try{n(e)}catch(e){t.error(e)}}:e.prototype._next,a._error=o?function(e){try{o(e)}catch(e){t.error(e)}finally{this.unsubscribe()}}:e.prototype._error,a._complete=r?function(){try{r()}catch(e){t.error(e)}finally{this.unsubscribe()}}:e.prototype._complete,a}return _n(t,e),t.prototype.unsubscribe=function(){var t;if(!this.shouldUnsubscribe||this.shouldUnsubscribe()){var n=this.closed;e.prototype.unsubscribe.call(this),!n&&(null===(t=this.onFinalize)||void 0===t||t.call(this))}},t}(er),wr=function(e){return e&&"number"==typeof e.length&&"function"!=typeof e};function xr(e){return Rn(null==e?void 0:e.then)}function Sr(e){return Rn(e[cr])}function Or(e){return Symbol.asyncIterator&&Rn(null==e?void 0:e[Symbol.asyncIterator])}function Ir(e){return new TypeError("You provided "+(null!==e&&"object"==typeof e?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}var Er="function"==typeof Symbol&&Symbol.iterator?Symbol.iterator:"@@iterator";function kr(e){return Rn(null==e?void 0:e[Er])}function jr(e){return Cn(this,arguments,(function(){var t,n,r;return Nn(this,(function(o){switch(o.label){case 0:t=e.getReader(),o.label=1;case 1:o.trys.push([1,,9,10]),o.label=2;case 2:return[4,Tn(t.read())];case 3:return n=o.sent(),r=n.value,n.done?[4,Tn(void 0)]:[3,5];case 4:return[2,o.sent()];case 5:return[4,Tn(r)];case 6:return[4,o.sent()];case 7:return o.sent(),[3,2];case 8:return[3,10];case 9:return t.releaseLock(),[7];case 10:return[2]}}))}))}function Pr(e){return Rn(null==e?void 0:e.getReader)}function _r(e){if(e instanceof fr)return e;if(null!=e){if(Sr(e))return o=e,new fr((function(e){var t=o[cr]();if(Rn(t.subscribe))return t.subscribe(e);throw new TypeError("Provided object does not correctly implement Symbol.observable")}));if(wr(e))return r=e,new fr((function(e){for(var t=0;t{this._to=!1,function(e){const t=Hr()-e.ttl,n=e.map[Symbol.iterator]();for(;;){const r=n.next().value;if(!r)return;const o=r[0];if(!(r[1]0&&void 0!==arguments[0]?arguments[0]:{},t=JSON.parse(JSON.stringify(e));return void 0===t.webWorkerSupport&&(t.webWorkerSupport=!0),t.idb||(t.idb={}),t.idb.ttl||(t.idb.ttl=45e3),t.idb.fallbackInterval||(t.idb.fallbackInterval=150),e.idb&&"function"==typeof e.idb.onclose&&(t.idb.onclose=e.idb.onclose),t.localstorage||(t.localstorage={}),t.localstorage.removeTimeout||(t.localstorage.removeTimeout=6e4),e.methods&&(t.methods=e.methods),t.node||(t.node={}),t.node.ttl||(t.node.ttl=12e4),t.node.maxParallelWrites||(t.node.maxParallelWrites=2048),void 0===t.node.useFastPath&&(t.node.useFastPath=!0),t}var Gr="messages",Yr={durability:"relaxed"};function Qr(){if("undefined"!=typeof indexedDB)return indexedDB;if("undefined"!=typeof window){if(void 0!==window.mozIndexedDB)return window.mozIndexedDB;if(void 0!==window.webkitIndexedDB)return window.webkitIndexedDB;if(void 0!==window.msIndexedDB)return window.msIndexedDB}return!1}function Xr(e){e.commit&&e.commit()}function Zr(e,t){var n=e.transaction(Gr,"readonly",Yr),r=n.objectStore(Gr),o=[],i=IDBKeyRange.bound(t+1,1/0);if(r.getAll){var s=r.getAll(i);return new Promise((function(e,t){s.onerror=function(e){return t(e)},s.onsuccess=function(t){e(t.target.result)}}))}return new Promise((function(e,s){var a=function(){try{return i=IDBKeyRange.bound(t+1,1/0),r.openCursor(i)}catch(e){return r.openCursor()}}();a.onerror=function(e){return s(e)},a.onsuccess=function(r){var i=r.target.result;i?i.value.ide.lastCursorId&&(e.lastCursorId=t.id),t})).filter((function(t){return function(e,t){return!(e.uuid===t.uuid||t.eMIs.has(e.id)||e.data.time0||e._addEL.internal.length>0}function go(e,t,n){e._addEL[t].push(n),function(e){if(!e._iL&&bo(e)){var t=function(t){e._addEL[t.type].forEach((function(e){t.time>=e.time&&e.fn(t.data)}))},n=e.method.microSeconds();e._prepP?e._prepP.then((function(){e._iL=!0,e.method.onMessage(e._state,t,n)})):(e._iL=!0,e.method.onMessage(e._state,t,n))}}(e)}function wo(e,t,n){e._addEL[t]=e._addEL[t].filter((function(e){return e!==n})),function(e){if(e._iL&&!bo(e)){e._iL=!1;var t=e.method.microSeconds();e.method.onMessage(e._state,null,t)}}(e)}vo._pubkey=!0,vo.prototype={postMessage:function(e){if(this.closed)throw new Error("BroadcastChannel.postMessage(): Cannot post message after channel has closed "+JSON.stringify(e));return yo(this,"message",e)},postInternal:function(e){return yo(this,"internal",e)},set onmessage(e){var t={time:this.method.microSeconds(),fn:e};wo(this,"message",this._onML),e&&"function"==typeof e?(this._onML=t,go(this,"message",t)):this._onML=null},addEventListener:function(e,t){go(this,e,{time:this.method.microSeconds(),fn:t})},removeEventListener:function(e,t){wo(this,e,this._addEL[e].find((function(e){return e.fn===t})))},close:function(){var e=this;if(!this.closed){po.delete(this),this.closed=!0;var t=this._prepP?this._prepP:Lr;return this._onML=null,this._addEL.message=[],t.then((function(){return Promise.all(Array.from(e._uMP))})).then((function(){return Promise.all(e._befC.map((function(e){return e()})))})).then((function(){return e.method.close(e._state)}))}},get type(){return this.method.type},get isClosed(){return this.closed}};var xo=new Map;function So(e,t){var n=xo.get(e);if(n)return n.refs.delete(t),0===n.refs.size?(xo.delete(e),n.bc.close()):void 0}function Oo(e,t,n,r){if(t.multiInstance){var o=r||function(e,t,n,r){var o=xo.get(t);return o||(o={bc:new vo(["RxDB:",e,n].join("|")),refs:new Set},xo.set(t,o)),o.refs.add(r),o.bc}(e,t.databaseInstanceToken,n.databaseName,n),i=new pr,s=n=>{n.storageName===e&&n.databaseName===t.databaseName&&n.collectionName===t.collectionName&&n.version===t.schema.version&&i.next(n.eventBulk)};o.addEventListener("message",s);var a=n.changeStream(),c=!1,u=a.subscribe((n=>{c||o.postMessage({storageName:e,databaseName:t.databaseName,collectionName:t.collectionName,version:t.schema.version,eventBulk:n})}));n.changeStream=function(){return i.asObservable().pipe(function(){for(var e=[],t=0;t{var r=t.queryPlan,o=t.query,i=o.skip?o.skip:0,s=i+(o.limit?o.limit:1/0),a=e.internals.storeNames.documentStore,c=e.settings.batchSize?e.settings.batchSize:50,u=!1;r.selectorSatisfiedByIndex||(u=Kt(e.schema,o));var l=r.index,f=!r.sortSatisfiedByIndex,h=l,p=r.startKeys,m=tn(e.schema,h,p),v=r.endKeys,y=nn(e.schema,h,v),b=[],g=n.objectStore(a),w=sn(e.internals,h),x=g.index(w);u||t.query.limit||(c=1e5);var S=!1;if(await async function(e,t,n,r,o,i,s,a){var c=e.settings.IDBKeyRange?e.settings.IDBKeyRange:IDBKeyRange,u=e.internals.getIndexableStringByIndexId[s];if("function"==typeof n.getAll&&1!==r)for(var l,f=!0,d=!1,h=async function(){l&&(o=u(l.d));var e=c.bound(o,i,!f||!t.inclusiveStart,!t.inclusiveEnd);f=!1;var s=n.getAll(e,r);await new Promise(((e,t)=>{s.onerror=t,s.onsuccess=t=>{var n=t.target.result;l=k(n),0!==n.length&&!1===a(n)&&(d=!0),n.length{m.onsuccess=function(t){var n=t.target.result;if(n){var r=n.value;a([r])?n.continue():e()}else e()}}))}}(e,r,x,c,m,y,w,(e=>{for(var t=0;t{var t=Object.keys(e)[0],r=Object.values(e)[0];n.push({key:t,direction:r,getValueFn:O(t)})})),(e,t)=>{for(var r=0;r30&&!await function(e,t){var n=(e.settings.IDBKeyRange?e.settings.IDBKeyRange:IDBKeyRange).lowerBound($,!0),r=t.getKey(n);return new Promise((e=>{r.onsuccess=()=>{e(!!r.result)}}))}(e,u)?new Map:await function(e,t,n){var r=n.length,o=new Map;if(0===r)return Promise.resolve(o);for(var i=new Array(r),s=0;s{u.onerror=n,u.onsuccess=()=>{for(var n=0;n0){var w=c.objectStore(o.storeNames.writeAheadStore).put({i:"documents",docsData:JSON.stringify(h)});await new Promise(((e,t)=>{w.onerror=t,w.onsuccess=e})),e.handleWalIdlePromise||Jt(100).then((()=>Qt())).then((async()=>{e.handleWalIdlePromise=void 0,e.closed||await En(e,(()=>Gt))}))}if(e.schema.attachments){var x=c.objectStore(e.internals.storeNames.attachmentsStore);l.attachmentsAdd.forEach((e=>{v=x.put({docIdWithAttachmentId:hn(e.documentId,e.attachmentId),length:e.attachmentData.length,type:e.attachmentData.type,data:e.attachmentData.data})})),l.attachmentsUpdate.forEach((e=>{v=x.put({docIdWithAttachmentId:hn(e.documentId,e.attachmentId),length:e.attachmentData.length,type:e.attachmentData.type,data:e.attachmentData.data})})),l.attachmentsRemove.forEach((e=>{v=x.delete(hn(e.documentId,e.attachmentId))}))}if(v&&await new Promise(((e,t)=>{S(v).onerror=t,S(v).onsuccess=e})),c.commit&&c.commit(),l.eventBulk.events.length>0){var O=S(l.newestRow).document;l.eventBulk.checkpoint={id:O[r],lwt:O._meta.lwt},e.changes$.next(l.eventBulk)}return{error:f}}var ko=jn(),jo=function(){function e(e,t,n,r,o,i,s){this.changes$=new pr,this.instanceId=ko++,this.storage=e,this.databaseName=t,this.collectionName=n,this.schema=r,this.internals=o,this.options=i,this.settings=s,this.primaryPath=x(this.schema.primaryKey)}var t=e.prototype;return t.updateMinKnownDocs=function(e){this.internals.minKnownDocsAmountfunction(e,t,n){var r=t.length;if(0===r)return Promise.resolve([]);for(var o=new Array(r),i=0;i{c.onerror=t,c.onsuccess=()=>{for(var t=0;t{var r,o=t.queryPlan,i=e.internals.storeNames.documentStore,s=o.index,a=s,c=o.startKeys,u=tn(e.schema,a,c),l=o.endKeys,f=nn(e.schema,a,l),d=n.objectStore(i);r=1===s.length&&s[0]===e.primaryPath?sn(e.internals,["_deleted",e.primaryPath]):sn(e.internals,a);var h=d.index(r),p=(e.settings.IDBKeyRange?e.settings.IDBKeyRange:IDBKeyRange).bound(u,f,!o.inclusiveStart,!o.inclusiveEnd),m=h.count(p);return{count:await new Promise(((e,t)=>{m.onsuccess=function(){e(m.result)},m.onerror=t})),mode:"fast"}}))}(this,e);return this.updateMinKnownDocs(t.count),t}var n=await Io(this,e);return this.updateMinKnownDocs(n.documents.length),{count:n.documents.length,mode:"slow"}},t.changeStream=function(){return this.changes$.asObservable()},t.cleanup=async function(e){await Jt(0),await Jt(0);var t=this.internals.state;await t.creationPromise;var n=this.settings.IDBKeyRange;xn(this);var r=(await On(this)).objectStore(this.internals.storeNames.documentStore),o=this.settings.batchSize,i=jn()-e,s=sn(this.internals,on),a=r.index(s),c=tn(this.schema,on,[!0,1]),u=nn(this.schema,on,[!0,i]),l=n.bound(c,u,!0,!0),f=await new Promise(((e,t)=>{var n=a.getAll(l,o);n.onerror=t,n.onsuccess=function(t){e(t.target.result)}}));return await Promise.all(f.map((e=>new Promise(((t,n)=>{var o=e.i,i=r.delete(o);i.onerror=n,i.onsuccess=()=>t()}))))),f.length{var t=[e.objectStore(this.internals.storeNames.documentStore),e.objectStore(this.internals.storeNames.writeAheadStore)];return this.schema.attachments&&t.push(e.objectStore(this.internals.storeNames.attachmentsStore)),await Promise.all(t.map((e=>new Promise(((t,n)=>{var r=e.clear();r.onerror=n,r.onsuccess=t}))))),this.close()}))},t.getAttachmentData=async function(e,t){var n=this.internals.state;return await n.creationPromise,xn(this),En(this,(n=>{var r=n.objectStore(this.internals.storeNames.attachmentsStore),o=hn(e,t);return new Promise(((n,i)=>{var s=r.get(o);s.onsuccess=()=>{var r=s.result;r?n(r.data):i("attachment missing documentId: "+e+" attachmentId: "+t)}}))}))},t.close=async function(){return this.closed||(this.closed=(async()=>(await this.internals.state.creationPromise,await En(this,(async e=>{})),this.changes$.complete(),async function(e){if(!e.closed&&(e.refCount=e.refCount-1,0===e.refCount))return e.closed=!0,e.storage.indexedDBStates.delete(e.name),e.creationPromise.then((e=>e.close()))}(this.internals.state)))()),this.closed},e}(),Po=function(){function e(e){this.name=fn,this.rxdbVersion=Wt,this.indexedDBStates=new Map,this.settings=e}return e.prototype.createStorageInstance=function(e){return function(e){if(e.schema.keyCompression)throw d("UT5",{args:{params:e}});if((t=e.schema).encrypted&&t.encrypted.length>0||t.attachments&&t.attachments.encrypted)throw d("UT6",{args:{params:e}});var t;if(e.schema.attachments&&e.schema.attachments.compression)throw d("UT7",{args:{params:e}})}(e),async function(e,t,n){var r=un(t.schema),o=Array.from(r.indexIdByName.values()),i=await yn(e,n,t,[{collectionName:t.collectionName,schema:t.schema,indexIds:o}]);await i.creationPromise;var s={state:i,storeNames:gn(t.collectionName,t.schema),getIndexableStringByIndexId:r.monadByIndexId,getIndexableStringByIndexNumber:Object.values(r.monadByIndexId),indexIdByName:r.indexIdByName,indexNames:Object.keys(r),indexIds:o,minKnownDocsAmount:0},a=new jo(e,t.databaseName,t.collectionName,t.schema,s,t.options,n);return await Oo(fn,t,a),a}(this,e,Object.assign({},this.settings,e.options))},e}();function _o(e,t){return vr((function(n,r){var o=0;n.subscribe(br(r,(function(n){return e.call(t,n,o++)&&r.next(n)})))}))}function $o(e,t){if(e===t)return!0;if(e&&t&&"object"==typeof e&&"object"==typeof t){if(e.constructor!==t.constructor)return!1;var n,r;if(Array.isArray(e)){if((n=e.length)!==t.length)return!1;for(r=n;0!=r--;)if(!$o(e[r],t[r]))return!1;return!0}if(e.constructor===RegExp)return e.source===t.source&&e.flags===t.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===t.toString();var o=Object.keys(e);if((n=o.length)!==Object.keys(t).length)return!1;for(r=n;0!=r--;)if(!Object.prototype.hasOwnProperty.call(t,o[r]))return!1;for(r=n;0!=r--;){var i=o[r];if(!$o(e[i],t[i]))return!1}return!0}return e!=e&&t!=t}function No(e,t){return{connectionId:e.connectionId,answerTo:e.requestId,method:e.method,error:(n=t,{name:n.name,message:n.message,rxdb:n.rxdb,parameters:n.parameters,extensions:n.extensions,code:n.code,url:n.url,stack:n.stack?n.stack.replace(/\n/g," \n "):void 0})};var n}function Do(e,t){return{connectionId:e.connectionId,answerTo:e.requestId,method:e.method,return:t}}!function(e){var t,n=new pr;if("undefined"!=typeof self&&"object"==typeof self.onconnect){var r=new Map;self.onconnect=e=>{var t=e.ports[0];t.onmessage=e=>{var o=e.data;r.set(o.connectionId,t),n.next(o)}},t={storage:e.storage,messages$:n,send(e){Vt(r,e.connectionId).postMessage(e)}}}else addEventListener("message",(e=>{var t=e.data;n.next(t)})),t={storage:e.storage,messages$:n,send(e){postMessage(e)}};!function(e){var t=new Map;function n(t){if(e.storage)return e.storage.createStorageInstance(t);if(e.database){var n=Array.from(e.database.storageInstances),r=t.collectionName,o=n.find((e=>e.collectionName===r));if(!o)throw console.dir(n),new Error("storageInstance does not exist "+JSON.stringify({collectionName:r}));var i=t.schema;if(!$o(i,o.schema))throw new Error("Wrong schema "+JSON.stringify({schema:i,existingSchema:o.schema}));return Promise.resolve(o)}throw new Error("no base given")}e.messages$.pipe(_o((e=>"custom"===e.method))).subscribe((async t=>{if(e.customRequestHandler)try{var n=await e.customRequestHandler(t.params);e.send(Do(t,n))}catch(n){e.send(No(t,n))}else e.send(No(t,new Error("Remote storage: cannot resolve custom request because settings.customRequestHandler is not set")))}));var r=e.fakeVersion?e.fakeVersion:Ut;e.messages$.pipe(_o((e=>"create"===e.method))).subscribe((async o=>{if(o.version===r){var i=o.connectionId;if(!Array.isArray(o.params)){var s=o.params,a=s.collectionName,c=[s.databaseName,s.collectionName,s.schema.version].join("|"),u=t.get(c);if(u){if(!$o(s.schema,u.params.schema))return void e.send(No(o,new Error("Remote storage: schema not equal to existing storage")))}else try{u={storageInstancePromise:n(s),connectionIds:new Set,params:s},t.set(c,u),await u.storageInstancePromise}catch(t){return void e.send(No(o,t))}u.connectionIds.add(o.connectionId);var l=[],f=await u.storageInstancePromise;l.push(f.changeStream().subscribe((t=>{var n={connectionId:i,answerTo:"changestream",method:"changeStream",return:t};e.send(n)})));var h=!1;if(e.database){var p=e.database,m=p.collections[a];m?m.onClose.push((()=>v())):p.onClose.push((()=>v()))}l.push(e.messages$.pipe(_o((e=>e.connectionId===i))).subscribe((async t=>{var n,r=t;if("create"!==r.method&&"custom"!==r.method&&Array.isArray(r.params))try{if("close"===r.method&&e.database)return void e.send(Do(r,null));if("close"===r.method&&S(u).connectionIds.size>1)return e.send(Do(r,null)),S(u).connectionIds.delete(i),void l.forEach((e=>e.unsubscribe()));n="getChangedDocumentsSince"!==r.method||f.getChangedDocumentsSince?await f[r.method](r.params[0],r.params[1],r.params[2],r.params[3]):await Ft(f,r.params[0],r.params[1]),"close"!==r.method&&"remove"!==r.method||v(),e.send(Do(r,n))}catch(t){e.send(No(r,t))}}))),e.send(Do(o,"ok"))}}else e.send(No(o,d("RM1",{args:{mainVersion:o.version,remoteVersion:r}})));function v(){h||(h=!0,l.forEach((e=>e.unsubscribe())),S(u).connectionIds.delete(i),t.delete(c))}}))}(t)}({storage:function(e={}){var t=e.IDBKeyRange?e.IDBKeyRange:IDBKeyRange,n=e.indexedDB?e.indexedDB:indexedDB,r=Object.assign({batchSize:300,transactionDurability:"relaxed"},e,{IDBKeyRange:t,indexedDB:n});return new Po(r)}({})})})(); \ No newline at end of file From d5bfd1d0fd108047d4528865ed451a55a9bec0a5 Mon Sep 17 00:00:00 2001 From: Paul Kilmurray Date: Tue, 19 Aug 2025 18:31:23 +0200 Subject: [PATCH 21/22] Update indexeddb.worker.js --- assets/js/indexeddb.worker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/indexeddb.worker.js b/assets/js/indexeddb.worker.js index 21aa3de..cd777ad 100644 --- a/assets/js/indexeddb.worker.js +++ b/assets/js/indexeddb.worker.js @@ -1 +1 @@ -(()=>{function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}function t(t){var n=function(t,n){if("object"!=e(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var o=r.call(t,n||"default");if("object"!=e(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(t)}(t,"string");return"symbol"==e(n)?n:n+""}function n(e,n){for(var r=0;r!1,deepFreezeWhenDevMode:e=>e,tunnelErrorMessage:e=>"\n RxDB Error-Code: "+e+".\n Hint: Error messages are not included in RxDB core to reduce build size.\n To show the full error messages and to ensure that you do not make any mistakes when using RxDB,\n use the dev-mode plugin when you are in development mode: https://rxdb.info/dev-mode.html?console=error\n "};function c(e,t,n){return"\n"+e+"\n"+function(e){var t="";return 0===Object.keys(e).length?t:(t+="-".repeat(20)+"\n",t+="Parameters:\n",t+=Object.keys(e).map((t=>{var n="[object Object]";try{n="errors"===t?e[t].map((e=>JSON.stringify(e,Object.getOwnPropertyNames(e)))):JSON.stringify(e[t],(function(e,t){return void 0===t?null:t}),2)}catch(e){}return t+": "+n})).join("\n"),t+="\n")}(n)}var u=function(e){function t(t,n,r={}){var o,i=c(n,0,r);return(o=e.call(this,i)||this).code=t,o.message=i,o.url=l(t),o.parameters=r,o.rxdb=!0,o}var o,i;return i=e,(o=t).prototype=Object.create(i.prototype),o.prototype.constructor=o,r(o,i),t.prototype.toString=function(){return this.message},function(e,t,r){return t&&n(e.prototype,t),r&&n(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}(t,[{key:"name",get:function(){return"RxError ("+this.code+")"}},{key:"typeError",get:function(){return!1}}])}(s(Error));function l(e){return"https://rxdb.info/errors.html?console=errors#"+e}function f(e){return"\nFind out more about this error here: "+l(e)+" \n"}function d(e,t){return new u(e,a.tunnelErrorMessage(e)+f(e),t)}var h=/\./g,p="abcdefghijklmnopqrstuvwxyz",m=e=>{var t=typeof e;return null!==e&&("object"===t||"function"===t)},v=new Set(["__proto__","prototype","constructor"]),y=new Set("0123456789");function b(e){var t=[],n="",r="start",o=!1;for(var i of e)switch(i){case"\\":if("index"===r)throw new Error("Invalid character in an index");if("indexEnd"===r)throw new Error("Invalid character after an index");o&&(n+=i),r="property",o=!o;break;case".":if("index"===r)throw new Error("Invalid character in an index");if("indexEnd"===r){r="property";break}if(o){o=!1,n+=i;break}if(v.has(n))return[];t.push(n),n="",r="property";break;case"[":if("index"===r)throw new Error("Invalid character in an index");if("indexEnd"===r){r="index";break}if(o){o=!1,n+=i;break}if("property"===r){if(v.has(n))return[];t.push(n),n=""}r="index";break;case"]":if("index"===r){t.push(Number.parseInt(n,10)),n="",r="indexEnd";break}if("indexEnd"===r)throw new Error("Invalid character after an index");default:if("index"===r&&!y.has(i))throw new Error("Invalid character in an index");if("indexEnd"===r)throw new Error("Invalid character after an index");"start"===r&&(r="property"),o&&(o=!1,n+="\\"),n+=i}switch(o&&(n+="\\"),r){case"property":if(v.has(n))return[];t.push(n);break;case"index":throw new Error("Index was not closed");case"start":t.push("")}return t}function g(e,t){if("number"!=typeof t&&Array.isArray(e)){var n=Number.parseInt(t,10);return Number.isInteger(n)&&e[n]===e[t]}return!1}function w(e,t){var n=function(e,t,n){if(Array.isArray(t)&&(t=t.join(".")),!t.includes(".")&&!t.includes("["))return e[t];if(!m(e)||"string"!=typeof t)return void 0===n?e:n;var r=b(t);if(0===r.length)return n;for(var o=0;ot[e]:e=>{for(var r=e,o=0;o"desc"===Object.values(e)[0])),i=new Set;Object.keys(n).forEach((t=>{var r=w(e,t);r&&"boolean"===r.type&&Object.prototype.hasOwnProperty.call(n[t],"$eq")&&i.add(t)}));var s,a=t.sort.map((e=>Object.keys(e)[0])).filter((e=>!i.has(e))).join(","),c=-1;if(r.forEach((e=>{var r=!0,u=!0,l=e.map((e=>{var t=n[e],o=t?Object.keys(t):[],i={};return t&&o.length?o.forEach((e=>{if(D.has(e)){var n=function(e,t){switch(e){case"$eq":return{startKey:t,endKey:t,inclusiveEnd:!0,inclusiveStart:!0};case"$lte":return{endKey:t,inclusiveEnd:!0};case"$gte":return{startKey:t,inclusiveStart:!0};case"$lt":return{endKey:t,inclusiveEnd:!1};case"$gt":return{startKey:t,inclusiveStart:!1};default:throw new Error("SNH")}}(e,t[e]);i=Object.assign(i,n)}})):i={startKey:u?$:_,endKey:r?_:$,inclusiveStart:!0,inclusiveEnd:!0},void 0===i.startKey&&(i.startKey=$),void 0===i.endKey&&(i.endKey=_),void 0===i.inclusiveStart&&(i.inclusiveStart=!0),void 0===i.inclusiveEnd&&(i.inclusiveEnd=!0),u&&!i.inclusiveStart&&(u=!1),r&&!i.inclusiveEnd&&(r=!1),i})),f=l.map((e=>e.startKey)),d=l.map((e=>e.endKey)),h={index:e,startKeys:f,endKeys:d,inclusiveEnd:r,inclusiveStart:u,sortSatisfiedByIndex:!o&&a===e.filter((e=>!i.has(e))).join(","),selectorSatisfiedByIndex:T(e,t.selector,f,d)},p=function(e,t,n){var r=0,o=e=>{e>0&&(r+=e)},i=10,s=P(n.startKeys,(e=>e!==$&&e!==_));o(s*i);var a=P(n.startKeys,(e=>e!==_&&e!==$));o(a*i);var c=P(n.startKeys,((e,t)=>e===n.endKeys[t]));return o(c*i*1.5),o(n.sortSatisfiedByIndex?5:0),r}(0,0,h);(p>=c||t.index)&&(c=p,s=h)})),!s)throw d("SNH",{query:t});return s}var D=new Set(["$eq","$gt","$gte","$lt","$lte"]),A=new Set(["$eq","$gt","$gte"]),M=new Set(["$eq","$lt","$lte"]);function T(e,t,n,r){var o=Object.entries(t).find((([t,n])=>!e.includes(t)||Object.entries(n).find((([e,t])=>!D.has(e)))));if(o)return!1;if(t.$and||t.$or)return!1;var i=[],s=new Set;for(var[a,c]of Object.entries(t)){if(!e.includes(a))return!1;var u=Object.keys(c).filter((e=>A.has(e)));if(u.length>1)return!1;var l=u[0];if(l&&s.add(a),"$eq"!==l){if(i.length>0)return!1;i.push(l)}}var f=[],d=new Set;for(var[h,p]of Object.entries(t)){if(!e.includes(h))return!1;var m=Object.keys(p).filter((e=>M.has(e)));if(m.length>1)return!1;var v=m[0];if(v&&d.add(h),"$eq"!==v){if(f.length>0)return!1;f.push(v)}}var y=0;for(var b of e){for(var g of[s,d]){if(!g.has(b)&&g.size>0)return!1;g.delete(b)}if(n[y]!==r[y]&&s.size>0&&d.size>0)return!1;y++}return!0}class C extends Error{}const B=Symbol("missing"),R=Object.freeze(new Error("mingo: cycle detected while processing object/array")),K=e=>{const t=he(e);let n=0,r=t.length;for(;r;)n=(n<<5)-n^t.charCodeAt(--r);return n>>>0},L=e=>"object"!=typeof e&&"function"!=typeof e||null===e,q=e=>L(e)||ee(e)||te(e),z={undefined:1,null:2,number:3,string:4,symbol:5,object:6,array:7,arraybuffer:8,boolean:9,date:10,regexp:11,function:12},F=(e,t)=>{e===B&&(e=void 0),t===B&&(t=void 0);const[n,r]=[e,t].map((e=>z[H(e)]||0));return n!==r?n-r:de(e,t)?0:et?1:0};class U extends Map{#e=K;#t=new Map;#n=e=>{const t=this.#e(e);return[(this.#t.get(t)||[]).find((t=>de(t,e))),t]};constructor(){super()}static init(e){const t=new U;return e&&(t.#e=e),t}clear(){super.clear(),this.#t.clear()}delete(e){if(L(e))return super.delete(e);const[t,n]=this.#n(e);return!!super.delete(t)&&(this.#t.set(n,this.#t.get(n).filter((e=>!de(e,t)))),!0)}get(e){if(L(e))return super.get(e);const[t,n]=this.#n(e);return super.get(t)}has(e){if(L(e))return super.has(e);const[t,n]=this.#n(e);return super.has(t)}set(e,t){if(L(e))return super.set(e,t);const[n,r]=this.#n(e);if(super.has(n))super.set(n,t);else{super.set(e,t);const n=this.#t.get(r)||[];n.push(e),this.#t.set(r,n)}return this}get size(){return super.size}}function W(e,t){if(!e)throw new C(t)}const V=Object.keys(z).reduce(((e,t)=>(e["[object "+t[0].toUpperCase()+t.substring(1)+"]"]=t,e)),{});function H(e){const t=Object.prototype.toString.call(e);return"[object Object]"===t?e?.constructor?.name?.toLowerCase()||"object":V[t]||t.substring(8,t.length-1).toLowerCase()}const J=e=>"boolean"==typeof e,G=e=>"string"==typeof e,Y=e=>!isNaN(e)&&"number"==typeof e,Q=Array.isArray;function X(e){if(!e)return!1;const t=Object.getPrototypeOf(e);return(t===Object.prototype||null===t)&&"object"===H(e)}const Z=e=>!L(e),ee=e=>e instanceof Date,te=e=>e instanceof RegExp,ne=e=>"function"==typeof e,re=e=>null==e,oe=e=>re(e)||G(e)&&!e||Q(e)&&0===e.length||X(e)&&0===Object.keys(e).length,ie=e=>Q(e)?e:[e],se=(e,t)=>!!e&&Object.prototype.hasOwnProperty.call(e,t),ae=(e,t)=>{if(re(e)||J(e)||Y(e)||G(e))return e;if(ee(e))return new Date(e);if(te(e))return new RegExp(e);if((e=>"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView(e))(e))return new(0,e.constructor)(e);if(t instanceof Set||(t=new Set),t.has(e))throw R;t.add(e);try{if(Q(e)){const n=new Array(e.length);for(let r=0;re===B;function ue(e,t){if(ce(e)||re(e))return t;if(ce(t)||re(t))return e;if(L(e)||L(t))return t;Q(e)&&Q(t)&&W(e.length===t.length,"arrays must be of equal length to merge.");for(const n of Object.keys(t))e[n]=ue(e[n],t[n]);return e}function le(e,t=1){const n=new Array;return function e(t,r){for(let o=0,i=t.length;o0||r<0)?e(t[o],Math.max(-1,r-1)):n.push(t[o])}(e,t),n}function fe(e){for(;e;){if(Object.getOwnPropertyNames(e).includes("toString"))return e.toString!==Object.prototype.toString;e=Object.getPrototypeOf(e)}return!1}function de(e,t){if(e===t||Object.is(e,t))return!0;if(null===e||null===t)return!1;if(typeof e!=typeof t)return!1;if("object"!=typeof e)return!1;if(e.constructor!==t.constructor)return!1;if(e instanceof Date)return+e==+t;if(e instanceof RegExp)return e.toString()===t.toString();const n=e.constructor;if(n===Array||n===Object){const n=Object.keys(e).sort(),r=Object.keys(t).sort();if(n.length!==r.length)return!1;for(let o=0,i=n[o];o{if(null===e)return"null";if(void 0===e)return"undefined";if(G(e)||Y(e)||J(e))return JSON.stringify(e);if(ee(e))return e.toISOString();if(te(e)||(e=>"symbol"==typeof e)(e)||ne(e))return e.toString();if(t instanceof Set||(t=new Set),t.has(e))throw R;try{if(t.add(e),Q(e))return"["+e.map((e=>he(e,t))).join(",")+"]";if(X(e))return"{"+Object.keys(e).sort().map((n=>`${n}:${he(e[n],t)}`)).join()+"}";const n=fe(e)?e.toString():he(function(e){const t={};for(;e;){for(const n of Object.getOwnPropertyNames(e))n in t||(t[n]=e[n]);e=Object.getPrototypeOf(e)}return t}(e),t);return H(e)+"("+n+")"}finally{t.delete(e)}};function pe(e,t){return re(e)?null:(t=t||K)(e)}function me(e,t,n=K){if(e.length<1)return new Map;const r=new Map,o=new Map;for(let i=0;ide(e,a))):null;re(e)?(o.set(a,[s]),r.has(c)?r.get(c).push(a):r.set(c,[a])):o.get(e).push(s)}}return o}function ve(e,t){return Z(e)?e[t]:void 0}function ye(e,t,n){let r=0;const o=q(e)?e:function e(t,n){let o=t;for(let t=0;t0)break;r+=1;const i=n.slice(t);o=o.reduce(((t,n)=>{const r=e(n,i);return void 0!==r&&t.push(r),t}),[]);break}if(o=ve(o,i),void 0===o)break}return o}(e,t.split("."));return Q(o)&&n?.unwrapArray?function(e,t){if(t<1)return e;for(;t--&&1===e.length;)e=e[0];return e}(o,r):o}function be(e,t,n){const r=t.indexOf("."),o=-1==r?t:t.substring(0,r),i=t.substring(r+1),s=-1!=r;if(Q(e)){const r=/^\d+$/.test(o),a=r&&n?.preserveIndex?[...e]:[];if(r){const t=parseInt(o);let r=ve(e,t);s&&(r=be(r,i,n)),n?.preserveIndex?a[t]=r:a.push(r)}else for(const r of e){const e=be(r,t,n);n?.preserveMissing?a.push(null==e?B:e):(null!=e||n?.preserveIndex)&&a.push(e)}return a}const a=n?.preserveKeys?{...e}:{};let c=ve(e,o);if(s&&(c=be(c,i,n)),void 0!==c)return a[o]=c,a}function ge(e){if(Q(e))for(let t=e.length-1;t>=0;t--)e[t]===B?e.splice(t,1):ge(e[t]);else if(X(e))for(const t in e)se(e,t)&&ge(e[t])}const we=/^\d+$/;function xe(e,t,n,r){const o=t.split("."),i=o[0],s=o.slice(1).join(".");if(1===o.length)(X(e)||Q(e)&&we.test(i))&&n(e,i);else{r?.buildGraph&&re(e[i])&&(e[i]={});const t=e[i];if(!t)return;const a=!!(o.length>1&&we.test(o[1]));Q(t)&&r?.descendArray&&!a?t.forEach((e=>xe(e,s,n,r))):xe(t,s,n,r)}}function Se(e,t,n){xe(e,t,((e,t)=>{e[t]=ne(n)?n(e[t]):n}),{buildGraph:!0})}function Oe(e,t,n){xe(e,t,((e,t)=>{if(Q(e)){if(/^\d+$/.test(t))e.splice(parseInt(t),1);else if(n&&n.descendArray)for(const n of e)X(n)&&delete n[t]}else X(e)&&delete e[t]}),n)}const Ie=/^\$[a-zA-Z0-9_]+$/;function Ee(e){return Ie.test(e)}function ke(e){if(q(e))return te(e)?{$regex:e}:{$eq:e};if(Z(e)){if(!Object.keys(e).some(Ee))return{$eq:e};if(se(e,"$regex")){const t={...e};return t.$regex=new RegExp(e.$regex,e.$options),delete t.$options,t}}return e}var je=(e=>(e[e.CLONE_OFF=0]="CLONE_OFF",e[e.CLONE_INPUT=1]="CLONE_INPUT",e[e.CLONE_OUTPUT=2]="CLONE_OUTPUT",e[e.CLONE_ALL=3]="CLONE_ALL",e))(je||{});class Pe{#r;#o;#i;constructor(e,t,n){this.#r=e,this.update(t,n)}static init(e,t,n){return e instanceof Pe?new Pe(e.#r,e.root??t,{...e.#i,...n,variables:Object.assign({},e.#i?.variables,n?.variables)}):new Pe(e,t,n)}update(e,t){this.#o=e;const n=Object.assign({},this.#i?.variables,t?.variables);return Object.keys(n).length?this.#i={...t,variables:n}:this.#i=t??{},this}getOptions(){return Object.freeze({...this.#r,context:_e.from(this.#r.context)})}get root(){return this.#o}get local(){return this.#i}get idKey(){return this.#r.idKey}get collation(){return this.#r?.collation}get processingMode(){return this.#r?.processingMode||0}get useStrictMode(){return this.#r?.useStrictMode}get scriptEnabled(){return this.#r?.scriptEnabled}get useGlobalContext(){return this.#r?.useGlobalContext}get hashFunction(){return this.#r?.hashFunction}get collectionResolver(){return this.#r?.collectionResolver}get jsonSchemaValidator(){return this.#r?.jsonSchemaValidator}get variables(){return this.#r?.variables}get context(){return this.#r?.context}}class _e{#s=new Map;constructor(){}static init(){return new _e}static from(e){const t=_e.init();return re(e)||e.#s.forEach(((e,n)=>t.addOperators(n,e))),t}addOperators(e,t){this.#s.has(e)||this.#s.set(e,{});for(const[n,r]of Object.entries(t))this.getOperator(e,n)||(this.#s.get(e)[n]=r);return this}getOperator(e,t){return(this.#s.get(e)??{})[t]??null}addAccumulatorOps(e){return this.addOperators("accumulator",e)}addExpressionOps(e){return this.addOperators("expression",e)}addQueryOps(e){return this.addOperators("query",e)}addPipelineOps(e){return this.addOperators("pipeline",e)}addProjectionOps(e){return this.addOperators("projection",e)}addWindowOps(e){return this.addOperators("window",e)}}const $e=_e.init();function Ne(e,t){for(const[n,r]of Object.entries(t)){W(ne(r)&&Ee(n),`'${n}' is not a valid operator`);const t=De(e,n,null);W(!t||r===t,`${n} already exists for '${e}' operators. Cannot change operator function once registered.`)}switch(e){case"accumulator":$e.addAccumulatorOps(t);break;case"expression":$e.addExpressionOps(t);break;case"pipeline":$e.addPipelineOps(t);break;case"projection":$e.addProjectionOps(t);break;case"query":$e.addQueryOps(t);break;case"window":$e.addWindowOps(t)}}function De(e,t,n){const{context:r,useGlobalContext:o}=n||{},i=r?r.getOperator(e,t):null;return!i&&o?$e.getOperator(e,t):i}function Ae(e,t,n,r){const o=Pe.init(r,e);return n&&Ee(n)?Ce(e,t,n,o):Te(e,t,o)}const Me=["$$ROOT","$$CURRENT","$$REMOVE","$$NOW"];function Te(e,t,n){if(G(t)&&t.length>0&&"$"===t[0]){if(Be.includes(t))return t;let r=n.root;const o=t.split(".");if(Me.includes(o[0])){switch(o[0]){case"$$ROOT":break;case"$$CURRENT":r=e;break;case"$$REMOVE":r=void 0;break;case"$$NOW":r=new Date}t=t.slice(o[0].length+1)}else if("$$"===o[0].slice(0,2)){r=Object.assign({},n.variables,{this:e},n?.local?.variables);const i=o[0].slice(2);W(se(r,i),`Use of undefined variable: ${i}`),t=t.slice(2)}else t=t.slice(1);return""===t?r:ye(r,t)}if(Q(t))return t.map((t=>Te(e,t,n)));if(X(t)){const r={},o=Object.entries(t);for(const[t,i]of o){if(Ee(t))return W(1==o.length,"expression must have single operator."),Ce(e,i,t,n);r[t]=Te(e,i,n)}return r}return t}function Ce(e,t,n,r){const o=De("expression",n,r);if(o)return o(e,t,r);const i=De("accumulator",n,r);return W(!!i,`accumulator '${n}' is not registered.`),Q(e)||(e=Te(e,t,r),t=null),W(Q(e),`arguments must resolve to array for ${n}.`),i(e,t,r)}const Be=["$$KEEP","$$PRUNE","$$DESCEND"];function Re(e){return e instanceof qe?e:new qe(e)}function Ke(e,t){const n=e.slice(t+1);e.splice(t),Array.prototype.push.apply(e,n)}const Le=new Error;class qe{constructor(e){let t;if(this.#a=[],this.#c=[],this.isDone=!1,e instanceof Function&&(e={next:e}),(n=e)&&"object"==typeof n&&n?.next instanceof Function){const n=e;t=()=>{const e=n.next();if(e.done)throw Le;return e.value}}else if(Q(e)){const n=e,r=n.length;let o=0;t=()=>{if(o0?this.push(2,e):this}drop(e){return e>0?this.push(3,e):this}transform(e){const t=this;let n;return Re((()=>(n||(n=Re(e(t.value()))),n.next())))}value(){return this.isDone||(this.isDone=this.#u(!0).done),this.#c}each(e){for(;;){const t=this.next();if(t.done)break;if(!1===e(t.value))return!1}return!0}reduce(e,t){let n=this.next();for(void 0!==t||n.done||(t=n.value,n=this.next());!n.done;)t=e(t,n.value),n=this.next();return t}size(){return this.reduce(((e,t)=>++e),0)}[Symbol.iterator](){return this}}const ze=(e,t,n)=>oe(t)?e:(Ue(t,n),e.map(Fe(t,Pe.init(n))));function Fe(e,t,n=!0){const r=t.idKey,o=Object.keys(e),i=new Array,s=new Array,a={};for(const r of o){const o=e[r];if(Y(o)||J(o))o?s.push(r):i.push(r);else if(Q(o))a[r]=e=>o.map((n=>Ae(e,n,null,t.update(e))??null));else if(X(o)){const e=Object.keys(o),i=1==e.length?e[0]:"",s=De("projection",i,t);s?"$slice"!==i||ie(o[i]).every(Y)?a[r]=e=>s(e,o[i],r,t.update(e)):a[r]=e=>Ae(e,o,r,t.update(e)):Ee(i)?a[r]=e=>Ae(e,o[i],i,t):(Ue(o,t),a[r]=e=>{if(!se(e,r))return Ae(e,o,null,t);n&&t.update(e);const i=ye(e,r),s=Fe(o,t,!1);return Q(i)?i.map(s):X(i)?s(i):s(e)})}else a[r]=G(o)&&"$"===o[0]?e=>Ae(e,o,r,t):e=>o}const c=Object.keys(a),u=i.includes(r);if(n&&u&&1===i.length&&!s.length&&!c.length)return e=>{const t={...e};return delete t[r],t};const l=n&&!u&&!s.includes(r),f={preserveMissing:!0};return e=>{const t={};if(i.length&&!s.length){ue(t,e);for(const e of i)Oe(t,e,{descendArray:!0})}for(const n of s)ue(t,be(e,n,f)??{});s.length&&ge(t);for(const n of c){const r=a[n](e);void 0===r?Oe(t,n,{descendArray:!0}):Se(t,n,r)}return l&&se(e,r)&&(t[r]=ye(e,r)),t}}function Ue(e,t){let n=!1,r=!1;for(const[o,i]of Object.entries(e))W(!o.startsWith("$"),"Field names may not start with '$'."),W(!o.endsWith(".$"),"Positional projection operator '$' is not supported."),o!==t?.idKey&&(0===i||!1===i?n=!0:1!==i&&!0!==i||(r=!0),W(!(n&&r),"Projection cannot have a mix of inclusion and exclusion."))}const We=(e,t,n)=>{if(oe(t)||!X(t))return e;let r=F;const o=n.collation;return X(o)&&G(o.locale)&&(r=function(e){const t={sensitivity:Ve[e.strength||3],caseFirst:"off"===e.caseFirst?"false":e.caseFirst||"false",numeric:e.numericOrdering||!1,ignorePunctuation:"shifted"===e.alternate};!0===(e.caseLevel||!1)&&("base"===t.sensitivity&&(t.sensitivity="case"),"accent"===t.sensitivity&&(t.sensitivity="variant"));const n=new Intl.Collator(e.locale,t);return(e,t)=>{if(!G(e)||!G(t))return F(e,t);const r=n.compare(e,t);return r<0?-1:r>0?1:0}}(o)),e.transform((e=>{const o=Object.keys(t);for(const i of o.reverse()){const o=me(e,(e=>ye(e,i)),n.hashFunction),s=Array.from(o.keys()).sort(r);-1===t[i]&&s.reverse();let a=0;for(const t of s)for(const n of o.get(t))e[a++]=n;W(a==e.length,"bug: counter must match collection size.")}return e}))},Ve={1:"base",2:"accent",3:"variant"},He={$sort:We,$skip:(e,t,n)=>e.drop(t),$limit:(e,t,n)=>e.take(t)};class Je{#l;#f;#d;#r;#s={};#h=null;#p=[];constructor(e,t,n,r){this.#l=e,this.#f=t,this.#d=n,this.#r=r}fetch(){if(this.#h)return this.#h;this.#h=Re(this.#l).filter(this.#f);const e=this.#r.processingMode;e&je.CLONE_INPUT&&this.#h.map(ae);for(const e of["$sort","$skip","$limit"])se(this.#s,e)&&(this.#h=He[e](this.#h,this.#s[e],this.#r));return Object.keys(this.#d).length&&(this.#h=ze(this.#h,this.#d,this.#r)),e&je.CLONE_OUTPUT&&this.#h.map(ae),this.#h}fetchAll(){const e=Re([...this.#p]);return this.#p=[],function(...e){let t=0;return Re((()=>{for(;t0)return this.#p.pop();const e=this.fetch().next();return e.done?void 0:e.value}hasNext(){if(this.#p.length>0)return!0;const e=this.fetch().next();return!e.done&&(this.#p.push(e.value),!0)}map(e){return this.all().map(e)}forEach(e){this.all().forEach(e)}[Symbol.iterator](){return this.fetchAll()}}const Ge=new Set(Array.from(["$and","$or","$nor","$expr","$jsonSchema"]));class Ye{#m;#r;#v;constructor(e,t){this.#v=ae(e),this.#r=function(e){return e instanceof Pe?e.getOptions():Object.freeze({idKey:"_id",scriptEnabled:!0,useStrictMode:!0,useGlobalContext:!0,processingMode:0,...e,context:e?.context?_e.from(e?.context):_e.init()})}(t),this.#m=[],this.compile()}compile(){W(X(this.#v),`query criteria must be an object: ${JSON.stringify(this.#v)}`);const e={};for(const[t,n]of Object.entries(this.#v)){if("$where"===t)W(this.#r.scriptEnabled,"$where operator requires 'scriptEnabled' option to be true."),Object.assign(e,{field:t,expr:n});else if(Ge.has(t))this.processOperator(t,t,n);else{W(!Ee(t),`unknown top level operator: ${t}`);for(const[e,r]of Object.entries(ke(n)))this.processOperator(t,e,r)}e.field&&this.processOperator(e.field,e.field,e.expr)}}processOperator(e,t,n){const r=De("query",t,this.#r);W(!!r,`unknown query operator ${t}`),this.#m.push(r(e,n,this.#r))}test(e){return this.#m.every((t=>t(e)))}find(e,t){return new Je(e,(e=>this.test(e)),t||{},this.#r)}remove(e){return e.reduce(((e,t)=>(this.test(t)||e.push(t),e)),[])}}function Qe(e){return(t,n,r)=>{const o={unwrapArray:!0},i=Math.max(1,t.split(".").length-1);return s=>{const a=ye(s,t,o);return e(a,n,{...r,depth:i})}}}function Xe(e){return(t,n,r)=>{const o=Ae(t,n,null,r);return e(...o)}}function Ze(e,t,n){return!!de(e,t)||!(!re(e)||!re(t))||!!Q(e)&&(e.some((e=>de(e,t)))||le(e,n?.depth).some((e=>de(e,t))))}function et(e,t,n){return!Ze(e,t,n)}function tt(e,t,n){return re(e)?t.some((e=>null===e)):function(e,t=K){const n=[U.init(t),U.init(t)];if(0===e.length)return[];if(e.some((e=>0===e.length)))return[];if(1===e.length)return[...e];e[e.length-1].forEach((e=>n[0].set(e,!0)));for(let t=e.length-2;t>-1;t--){if(e[t].forEach((e=>{n[0].has(e)&&n[1].set(e,!0)})),0===n[1].size)return[];n.reverse(),n[1].clear()}return Array.from(n[0].keys())}([ie(e),t],n?.hashFunction).length>0}function nt(e,t,n){return!tt(e,t,n)}function rt(e,t,n){return dt(e,t,((e,t)=>F(e,t)<0))}function ot(e,t,n){return dt(e,t,((e,t)=>F(e,t)<=0))}function it(e,t,n){return dt(e,t,((e,t)=>F(e,t)>0))}function st(e,t,n){return dt(e,t,((e,t)=>F(e,t)>=0))}function at(e){return Ee(e)&&-1===["$and","$or","$nor"].indexOf(e)}function ct(e,t,n){if(Q(e)&&!oe(e)){let r=e=>e,o=t;Object.keys(t).every(at)&&(o={temp:t},r=e=>({temp:e}));const i=new Ye(o,n);for(let t=0,n=e.length;tnull===e,lt={array:Q,boolean:J,bool:J,date:ee,number:Y,int:Y,long:Y,double:Y,decimal:Y,null:ut,object:X,regexp:te,regex:te,string:G,undefined:re,function:e=>{throw new C("unsupported type key `function`.")},1:Y,2:G,3:X,4:Q,6:re,8:J,9:ee,10:ut,11:te,16:Y,18:Y,19:Y};function ft(e,t,n){const r=lt[t];return!!r&&r(e)}function dt(e,t,n){return ie(e).some((e=>H(e)===H(t)&&n(e,t)))}Xe(nt);const ht=(e,t)=>(n,r,o)=>{W(Q(r),`${e}: expression must be an array.`);const i=Ae(n,r,null,o);return i.some(re)?null:(W(i.every(Y),`${e}: expression must evalue to array of numbers.`),t(i))},pt=(ht("$bitAnd",(e=>e.reduce(((e,t)=>e&t),-1))),ht("$bitOr",(e=>e.reduce(((e,t)=>e|t),0))),ht("$bitXor",(e=>e.reduce(((e,t)=>e^t),0))),Xe(Ze),Xe(it),Xe(st),Xe(rt),Xe(ot),Xe(et),(e,t)=>{const n={};return e.split("").forEach(((e,r)=>n[e]=t*(r+1))),n});pt("ABCDEFGHIKLM",1),pt("NOPQRSTUVWXY",-1);const mt={undefined:null,null:null,NaN:NaN,Infinity:new Error,"-Infinity":new Error};function vt(e,t=mt){const n=Object.assign({},mt,t),r=new Set(Object.keys(n));return(t,o,i)=>{const s=Ae(t,o,null,i);if(r.has(`${s}`)){const t=n[`${s}`];if(t instanceof Error)throw new C(`cannot apply $${e.name} to -inf, value must in (-inf,inf)`);return t}return e(s)}}vt(Math.acos,{Infinity:1/0,0:new Error}),vt(Math.acosh,{Infinity:1/0,0:new Error}),vt(Math.asin),vt(Math.asinh,{Infinity:1/0,"-Infinity":-1/0}),vt(Math.atan),vt(Math.atanh,{1:1/0,"-1":-1/0}),vt(Math.cos),vt(Math.cosh,{"-Infinity":1/0,Infinity:1/0});const yt=Math.PI/180,bt=(vt((e=>e*yt),{Infinity:1/0,"-Infinity":1/0}),180/Math.PI);vt((e=>e*bt),{Infinity:1/0,"-Infinity":-1/0}),vt(Math.sin),vt(Math.sinh,{"-Infinity":-1/0,Infinity:1/0}),vt(Math.tan),Number.MAX_SAFE_INTEGER,Number.MIN_SAFE_INTEGER;const gt=(e,t,n)=>{W(Q(t),"Invalid expression: $and expects value to be an Array.");const r=t.map((e=>new Ye(e,n)));return e=>r.every((t=>t.test(e)))},wt=(e,t,n)=>{W(Q(t),"Invalid expression. $or expects value to be an Array");const r=t.map((e=>new Ye(e,n)));return e=>r.some((t=>t.test(e)))},xt=(e,t,n)=>{W(Q(t),"Invalid expression. $nor expects value to be an array.");const r=wt(0,t,n);return e=>!r(e)},St=(e,t,n)=>{const r={};r[e]=ke(t);const o=new Ye(r,n);return e=>!o.test(e)},Ot=Qe(Ze),It=Qe(it),Et=Qe(st),kt=Qe(tt),jt=Qe(rt),Pt=Qe(ot),_t=Qe(et),$t=Qe(nt),Nt=Qe((function(e,t,n){return ie(e).some((e=>2===t.length&&e%t[0]===t[1]))})),Dt=Qe((function(e,t,n){const r=ie(e),o=e=>G(e)&&((e,t=!0)=>!!e||t&&""===e)(t.exec(e),n?.useStrictMode);return r.some(o)||le(r,1).some(o)}));Qe((function(e,t,n){if(!(Q(e)&&Q(t)&&e.length&&t.length))return!1;let r=!0;for(const o of t){if(!r)break;r=X(o)&&Object.keys(o).includes("$elemMatch")?ct(e,o.$elemMatch,n):te(o)?e.some((e=>"string"==typeof e&&o.test(e))):e.some((e=>de(o,e)))}return r}));const At=Qe(ct),Mt=Qe((function(e,t,n){return Array.isArray(e)&&e.length===t})),Tt=(e,t,n)=>{const r=e.includes("."),o=!!t;return!r||e.match(/\.\d+$/)?t=>void 0!==ye(t,e)===o:t=>{const n=ye(be(t,e,{preserveIndex:!0}),e.substring(0,e.lastIndexOf(".")));return Q(n)?n.some((e=>void 0!==e))===o:void 0!==n===o}},Ct=Qe((function(e,t,n){return Q(t)?t.findIndex((t=>ft(e,t)))>=0:ft(e,t)}));var Bt=!1;function Rt(e,t){var n=x(e.primaryKey);t=I(t);var r,o=E(t);if("number"!=typeof o.skip&&(o.skip=0),o.selector?(o.selector=o.selector,Object.entries(o.selector).forEach((([e,t])=>{"object"==typeof t&&null!==t||(o.selector[e]={$eq:t})}))):o.selector={},o.index){var i=(r=o.index,Array.isArray(r)?r.slice(0):[r]);i.includes(n)||i.push(n),o.index=i}if(o.sort){var s=o.sort.find((e=>{return t=e,Object.keys(t)[0]===n;var t}));s||(o.sort=o.sort.slice(0),o.sort.push({[n]:"asc"}))}else if(o.index)o.sort=o.index.map((e=>({[e]:"asc"})));else{if(e.indexes){var a=new Set;Object.entries(o.selector).forEach((([e,t])=>{("object"!=typeof t||null===t||Object.keys(t).find((e=>D.has(e))))&&a.add(e)}));var c,u=-1;e.indexes.forEach((e=>{var t=j(e)?e:[e],n=t.findIndex((e=>!a.has(e)));n>0&&n>u&&(u=n,c=t)})),c&&(o.sort=c.map((e=>({[e]:"asc"}))))}if(!o.sort)if(e.indexes&&e.indexes.length>0){var l=e.indexes[0],f=j(l)?l:[l];o.sort=f.map((e=>({[e]:"asc"})))}else o.sort=[{[n]:"asc"}]}return o}function Kt(e,t){if(!t.sort)throw d("SNH",{query:t});var n,r=(n=t.selector,Bt||(Ne("pipeline",{$sort:We,$project:ze}),Ne("query",{$and:gt,$eq:Ot,$elemMatch:At,$exists:Tt,$gt:It,$gte:Et,$in:kt,$lt:jt,$lte:Pt,$ne:_t,$nin:$t,$mod:Nt,$nor:xt,$not:St,$or:wt,$regex:Dt,$size:Mt,$type:Ct}),Bt=!0),new Ye(n));return e=>r.test(e)}function Lt(e,t,n,r,o,i,s){for(var a,c=!!e.schema.attachments,u=[],l=[],f=[],h={id:function(e=10){for(var t="",n=0;n0,w=r.length,x=function(){var e,o=r[O],h=o.document,p=o.previous,w=h[t],x=h._deleted,I=p&&p._deleted,E=void 0;if(g&&(E=n.get(w)),E){var k=E._rev;if(!p||p&&k!==p._rev){var j={isError:!0,status:409,documentId:w,writeRow:o,documentInDb:E};return f.push(j),1}var P=c?qt(o):o;c&&(x?p&&Object.keys(p._attachments).forEach((e=>{y.push({documentId:w,attachmentId:e,digest:S(p)._attachments[e].digest})})):(Object.entries(h._attachments).find((([t,n])=>((p?p._attachments[t]:void 0)||n.data||(e={documentId:w,documentInDb:E,isError:!0,status:510,writeRow:o,attachmentId:t}),!0))),e||Object.entries(h._attachments).forEach((([e,t])=>{var n=p?p._attachments[e]:void 0;if(n){var r=P.document._attachments[e].digest;t.data&&n.digest!==r&&b.push({documentId:w,attachmentId:e,attachmentData:t,digest:t.digest})}else v.push({documentId:w,attachmentId:e,attachmentData:t,digest:t.digest})})))),e?f.push(e):(c?(l.push(qt(P)),s&&s(h)):(l.push(P),s&&s(h)),a=P);var _=null,$=null,N=null;if(I&&!x)N="INSERT",_=c?zt(h):h;else if(!p||I||x){if(!x)throw d("SNH",{args:{writeRow:o}});N="DELETE",_=S(h),$=p}else N="UPDATE",_=c?zt(h):h,$=p;var D={documentId:w,documentData:_,previousDocumentData:$,operation:N};m.push(D)}else{var A=!!x;if(c&&Object.entries(h._attachments).forEach((([t,n])=>{n.data?v.push({documentId:w,attachmentId:t,attachmentData:n,digest:n.digest}):(e={documentId:w,isError:!0,status:510,writeRow:o,attachmentId:t},f.push(e))})),e||(c?(u.push(qt(o)),i&&i(h)):(u.push(o),i&&i(h)),a=o),!A){var M={documentId:w,operation:"INSERT",documentData:c?zt(h):h,previousDocumentData:c&&p?zt(p):p};m.push(M)}}},O=0;O{var r,o,i;t._attachments[e]=(i=(r=n).data)?{length:(o=i,atob(o).length),digest:r.digest,type:r.type}:r})),t}async function Ft(e,t,n){if(e.getChangedDocumentsSince)return e.getChangedDocumentsSince(t,n);var r=x(e.schema.primaryKey),o=function(e,t){if(!t.sort)throw d("SNH",{query:t});return{query:t,queryPlan:N(e,t)}}(e.schema,function(e,t,n){var r=x(e.schema.primaryKey),o=n?n.lwt:1,i=n?n.id:"";return Rt(e.schema,{selector:{$or:[{"_meta.lwt":{$gt:o}},{"_meta.lwt":{$eq:o},[r]:{$gt:n?i:""}}],"_meta.lwt":{$gte:o}},sort:[{"_meta.lwt":"asc"},{[r]:"asc"}],skip:0,limit:t})}(e,t,n)),i=(await e.query(o)).documents,s=k(i);return{documents:i,checkpoint:s?{id:s[r],lwt:s._meta.lwt}:n||{id:"",lwt:0}}}new WeakMap,new WeakMap;var Ut="16.17.1",Wt="16.17.1";function Vt(e,t){var n=e.get(t);if(void 0===n)throw new Error("missing value from map "+t);return n}function Ht(e,t,n,r){var o=e.get(t);return void 0===o?(o=n(),e.set(t,o)):r&&r(o),o}function Jt(e=0){return new Promise((t=>setTimeout(t,e)))}Promise.resolve(!0);var Gt=Promise.resolve(!1),Yt=(Promise.resolve(null),Promise.resolve());function Qt(e=1e4){return"function"==typeof requestIdleCallback?new Promise((t=>{requestIdleCallback((()=>t()),{timeout:e})})):Jt(0)}function Xt(e,t){var n=t.map((t=>{var n=w(e,t);if(!n)throw new Error("not in schema: "+t);var r,o=n.type;"number"!==o&&"integer"!==o||(r=Zt(n));var i,s=O(t),a=n.maxLength?n.maxLength:0;return i="string"===o?e=>{var t=s(e);return t||(t=""),t.padEnd(a," ")}:"boolean"===o?e=>s(e)?"1":"0":e=>{var t=s(e);return en(r,t)},{fieldName:t,schemaPart:n,parsedLengths:r,getValue:s,getIndexStringPart:i}}));return n}function Zt(e){var t=Math.floor(e.minimum),n=Math.ceil(e.maximum),r=e.multipleOf,o=(n-t).toString().length,i=r.toString().split("."),s=0;return i.length>1&&(s=i[1].length),{minimum:t,maximum:n,nonDecimals:o,decimals:s,roundedMinimum:t}}function en(e,t){void 0===t&&(t=0),te.maximum&&(t=e.maximum);var n=(Math.floor(t)-e.roundedMinimum).toString().padStart(e.nonDecimals,"0");if(e.decimals>0){var r=t.toString().split(".");n+=(r.length>1?r[1]:"0").padEnd(e.decimals,"0")}return n}function tn(e,t,n){var r="";return t.forEach(((t,o)=>{var i=w(e,t),s=n[o],a=i.type;switch(a){case"string":var c=S(i.maxLength,"maxLength not set");r+="string"==typeof s?s.padEnd(c," "):"".padEnd(c," ");break;case"boolean":r+=null===s||s===$?"0":s===_||s?"1":"0";break;case"number":case"integer":var u=Zt(i);if(null===s||s===$)r+="0".repeat(u.nonDecimals+u.decimals);else if(s===_)r+=en(u,u.maximum);else{var l=en(u,s);r+=l}break;default:throw new Error("unknown index type "+a)}})),r}function nn(e,t,n){var r="";return t.forEach(((t,o)=>{var i=w(e,t),s=n[o],a=i.type;switch(a){case"string":var c=S(i.maxLength,"maxLength not set");r+="string"==typeof s&&s!==_?s.padEnd(c," "):"".padEnd(c,s===$?" ":_);break;case"boolean":r+=null===s||s?"1":"0";break;case"number":case"integer":var u=Zt(i);r+=null===s||s===_?"9".repeat(u.nonDecimals+u.decimals):s===$?"0".repeat(u.nonDecimals+u.decimals):en(u,s);break;default:throw new Error("unknown index type "+a)}})),r}function rn(e){return e.join("||")}var on=["_deleted","_meta.lwt"];function sn(e,t){var n=rn(t);return Vt(e.indexIdByName,n)}rn(on);var an={locale:null,unique:!1};function cn(e,t,n,r){for(var o={i:n,d:r,i0:void 0,i1:void 0,i2:void 0,i3:void 0,i4:void 0,i5:void 0,i6:void 0,i7:void 0},i=0;iArray.isArray(e)?e.slice(0):[e])):[];n.push(on);var r=new Map;return n.forEach(((n,o)=>{var i="i"+o,s=rn(n);if(r.has(s))throw new Error("duplicate index "+s+" "+JSON.stringify(e,null,4));r.set(s,i),t[i]=function(e,t){var n=Xt(e,t),r=n.length,o=n.map((e=>e.getIndexStringPart));return function(e){for(var t="",n=0;nYt));return n=S(n).then((()=>t())),pn.set(e,n),n}function vn(e,t){t.onversionchange=n=>{e.closed||(t.close(),e.creationPromise=e.refreshIDBDatabase())}}async function yn(e,t,n,r){var o=await Ht(e.indexedDBStates,n.databaseName,(()=>async function(e,t,n){var r=dn++,o=await function(e,t){return"function"==typeof t?t(e):t}(e,n.indexedDB),i=async()=>(await Jt(0),mn(e.databaseName,(()=>new Promise(((t,n)=>{var i=o.open(e.databaseName);i.onerror=function(t){console.error(r+": OPEN IDB DATABASE "+e.databaseName+" ERROR"),n(t)},i.onsuccess=function(e){var n=i.result;t(n),vn(s,n)},wn(s,i)}))))),s={indexedDB:o,debugId:r,closed:!1,storage:t,settings:n,refreshIDBDatabase:i,creationPromise:i(),name:e.databaseName,refCount:0,storesToOpen:[]};return s}(n,e,t)));return o.storesToOpen=o.storesToOpen.concat(r),o.refCount=o.refCount+1,o.creationPromise.then((()=>bn(S(o)))).then((()=>S(o)))}async function bn(e){if(0!==e.storesToOpen.length)return e.creationPromise=e.creationPromise.then((async t=>{var n=new Set(Array.from(t.objectStoreNames));if(0===e.storesToOpen.filter((e=>!n.has(gn(e.collectionName,e.schema).documentStore))).length)return t;var r=t.version+1;return t.close(),mn(e.name,(()=>new Promise(((t,n)=>{var o=e.indexedDB.open(e.name,r);o.onerror=function(t){console.error(e.debugId+": ERROR openStoresOnExistingDatabase() openRequest: error "),n(t)},o.onsuccess=function(n){var r=o.result;vn(e,r),t(r)},o.onblocked=e=>{},wn(e,o)}))))})),e.creationPromise}function gn(e,t){var n=t.version;return{documentStore:e+"-"+n+"-documents",writeAheadStore:e+"-"+n+"-wal",attachmentsStore:e+"-"+n+"-attachments"}}function wn(e,t){t.onupgradeneeded=function(n){var r=t.result;e.storesToOpen.forEach((e=>{var t=r.objectStoreNames,n=gn(e.collectionName,e.schema);if(!t.contains(n.documentStore)){var o=r.createObjectStore(n.documentStore,{keyPath:"i",autoIncrement:!1});r.createObjectStore(n.writeAheadStore,{keyPath:"i",autoIncrement:!1}),function(e,t){t.indexIds.forEach((t=>{e.createIndex(t,t,an)}))}(o,e),e.schema.attachments&&r.createObjectStore(n.attachmentsStore,{keyPath:"docIdWithAttachmentId",autoIncrement:!1})}})),e.storesToOpen=[]}}function xn(e){if(e.closed)throw new Error("RxStorageInstanceIndexedDB is closed "+e.databaseName+"-"+e.collectionName)}async function Sn(e,t){var n=e.primaryPath,r=e.internals.indexIds.length,o=e.internals.getIndexableStringByIndexNumber,i=t.objectStore(e.internals.storeNames.writeAheadStore),s=await new Promise(((e,t)=>{var n=i.get("documents");n.onerror=t,n.onsuccess=t=>{var r=n.result;e(r?JSON.parse(r.docsData):void 0)}}));if(s&&s.length>0){for(var a,c=t.objectStore(e.internals.storeNames.documentStore),u=0;u{a.onerror=t,a.onsuccess=()=>e(!0)})),i.delete("documents")}return t}async function On(e){var t,n=[e.internals.storeNames.documentStore,e.internals.storeNames.writeAheadStore];e.schema.attachments&&n.push(e.internals.storeNames.attachmentsStore);for(var r=100;r>0;){var o=await e.internals.state.creationPromise;r-=1;try{t=o.transaction(n,"readwrite",ln);break}catch(t){if("InvalidStateError"!==t.name&&"NotFoundError"!==t.name||!(r>0))throw t;"NotFoundError"===t.name?await bn(e.internals.state):e.internals.state.creationPromise=e.internals.state.refreshIDBDatabase()}}return await Sn(e,S(t)),S(t)}var In=function(){function e(e){this.allTasksRuns=[],this.instance=e,this.txPromise=On(this.instance).then((t=>Sn(e,t)))}return e.prototype.addTask=function(e){var t=this.txPromise.then((t=>e(t))),n=t.catch((()=>null));this.allTasksRuns.push(n);var r=this.allTasksRuns.length;return n.then((()=>Promise.all(this.allTasksRuns))).then((()=>{this.allTasksRuns.length===r&&(this.instance.openReadonlyTransaction=void 0)})),t.catch((t=>{if("TransactionInactiveError"===t.name)return this.instance.openReadonlyTransaction=void 0,En(this.instance,e);throw t}))},e}();function En(e,t){return e.openReadonlyTransaction||(e.openReadonlyTransaction=new In(e)),e.openReadonlyTransaction.addTask(t)}var kn=0;function jn(){var e=Date.now();(e+=.01)<=kn&&(e=kn+.01);var t=parseFloat(e.toFixed(2));return kn=t,t}var Pn=function(e,t){return Pn=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},Pn(e,t)};function _n(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}Pn(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}function $n(e,t,n,r){return new(n||(n=Promise))((function(o,i){function s(e){try{c(r.next(e))}catch(e){i(e)}}function a(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((r=r.apply(e,t||[])).next())}))}function Nn(e,t){var n,r,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},s=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return s.next=a(0),s.throw=a(1),s.return=a(2),"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(a){return function(c){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;s&&(s=0,a[0]&&(i=0)),i;)try{if(n=1,r&&(o=2&a[0]?r.return:a[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,a[1])).done)return o;switch(r=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return i.label++,{value:a[1],done:!1};case 5:i.label++,r=a[1],a=[0];continue;case 7:a=i.ops.pop(),i.trys.pop();continue;default:if(!((o=(o=i.trys).length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function An(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)s.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return s}function Mn(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o1||a(e,t)}))},t&&(r[e]=t(r[e])))}function a(e,t){try{(n=o[e](t)).value instanceof Tn?Promise.resolve(n.value.v).then(c,u):l(i[0][2],n)}catch(e){l(i[0][3],e)}var n}function c(e){a("next",e)}function u(e){a("throw",e)}function l(e,t){e(t),i.shift(),i.length&&a(i[0][0],i[0][1])}}function Bn(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=Dn(e),t={},r("next"),r("throw"),r("return"),t[Symbol.asyncIterator]=function(){return this},t);function r(n){t[n]=e[n]&&function(t){return new Promise((function(r,o){!function(e,t,n,r){Promise.resolve(r).then((function(t){e({value:t,done:n})}),t)}(r,o,(t=e[n](t)).done,t.value)}))}}}function Rn(e){return"function"==typeof e}function Kn(e){var t=e((function(e){Error.call(e),e.stack=(new Error).stack}));return t.prototype=Object.create(Error.prototype),t.prototype.constructor=t,t}Object.create,Object.create,"function"==typeof SuppressedError&&SuppressedError;var Ln=Kn((function(e){return function(t){e(this),this.message=t?t.length+" errors occurred during unsubscription:\n"+t.map((function(e,t){return t+1+") "+e.toString()})).join("\n "):"",this.name="UnsubscriptionError",this.errors=t}}));function qn(e,t){if(e){var n=e.indexOf(t);0<=n&&e.splice(n,1)}}var zn=function(){function e(e){this.initialTeardown=e,this.closed=!1,this._parentage=null,this._finalizers=null}var t;return e.prototype.unsubscribe=function(){var e,t,n,r,o;if(!this.closed){this.closed=!0;var i=this._parentage;if(i)if(this._parentage=null,Array.isArray(i))try{for(var s=Dn(i),a=s.next();!a.done;a=s.next())a.value.remove(this)}catch(t){e={error:t}}finally{try{a&&!a.done&&(t=s.return)&&t.call(s)}finally{if(e)throw e.error}}else i.remove(this);var c=this.initialTeardown;if(Rn(c))try{c()}catch(e){o=e instanceof Ln?e.errors:[e]}var u=this._finalizers;if(u){this._finalizers=null;try{for(var l=Dn(u),f=l.next();!f.done;f=l.next()){var d=f.value;try{Wn(d)}catch(e){o=null!=o?o:[],e instanceof Ln?o=Mn(Mn([],An(o)),An(e.errors)):o.push(e)}}}catch(e){n={error:e}}finally{try{f&&!f.done&&(r=l.return)&&r.call(l)}finally{if(n)throw n.error}}}if(o)throw new Ln(o)}},e.prototype.add=function(t){var n;if(t&&t!==this)if(this.closed)Wn(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=null!==(n=this._finalizers)&&void 0!==n?n:[]).push(t)}},e.prototype._hasParent=function(e){var t=this._parentage;return t===e||Array.isArray(t)&&t.includes(e)},e.prototype._addParent=function(e){var t=this._parentage;this._parentage=Array.isArray(t)?(t.push(e),t):t?[t,e]:e},e.prototype._removeParent=function(e){var t=this._parentage;t===e?this._parentage=null:Array.isArray(t)&&qn(t,e)},e.prototype.remove=function(t){var n=this._finalizers;n&&qn(n,t),t instanceof e&&t._removeParent(this)},e.EMPTY=((t=new e).closed=!0,t),e}(),Fn=zn.EMPTY;function Un(e){return e instanceof zn||e&&"closed"in e&&Rn(e.remove)&&Rn(e.add)&&Rn(e.unsubscribe)}function Wn(e){Rn(e)?e():e.unsubscribe()}var Vn={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1},Hn={setTimeout:function(e,t){for(var n=[],r=2;r0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(t){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,t)},t.prototype._subscribe=function(e){return this._throwIfClosed(),this._checkFinalizedStatuses(e),this._innerSubscribe(e)},t.prototype._innerSubscribe=function(e){var t=this,n=this,r=n.hasError,o=n.isStopped,i=n.observers;return r||o?Fn:(this.currentObservers=null,i.push(e),new zn((function(){t.currentObservers=null,qn(i,e)})))},t.prototype._checkFinalizedStatuses=function(e){var t=this,n=t.hasError,r=t.thrownError,o=t.isStopped;n?e.error(r):o&&e.complete()},t.prototype.asObservable=function(){var e=new fr;return e.source=this,e},t.create=function(e,t){return new mr(e,t)},t}(fr),mr=function(e){function t(t,n){var r=e.call(this)||this;return r.destination=t,r.source=n,r}return _n(t,e),t.prototype.next=function(e){var t,n;null===(n=null===(t=this.destination)||void 0===t?void 0:t.next)||void 0===n||n.call(t,e)},t.prototype.error=function(e){var t,n;null===(n=null===(t=this.destination)||void 0===t?void 0:t.error)||void 0===n||n.call(t,e)},t.prototype.complete=function(){var e,t;null===(t=null===(e=this.destination)||void 0===e?void 0:e.complete)||void 0===t||t.call(e)},t.prototype._subscribe=function(e){var t,n;return null!==(n=null===(t=this.source)||void 0===t?void 0:t.subscribe(e))&&void 0!==n?n:Fn},t}(pr);function vr(e){return function(t){if(function(e){return Rn(null==e?void 0:e.lift)}(t))return t.lift((function(t){try{return e(t,this)}catch(e){this.error(e)}}));throw new TypeError("Unable to lift unknown Observable type")}}var yr=Array.isArray;function br(e,t,n,r,o){return new gr(e,t,n,r,o)}var gr=function(e){function t(t,n,r,o,i,s){var a=e.call(this,t)||this;return a.onFinalize=i,a.shouldUnsubscribe=s,a._next=n?function(e){try{n(e)}catch(e){t.error(e)}}:e.prototype._next,a._error=o?function(e){try{o(e)}catch(e){t.error(e)}finally{this.unsubscribe()}}:e.prototype._error,a._complete=r?function(){try{r()}catch(e){t.error(e)}finally{this.unsubscribe()}}:e.prototype._complete,a}return _n(t,e),t.prototype.unsubscribe=function(){var t;if(!this.shouldUnsubscribe||this.shouldUnsubscribe()){var n=this.closed;e.prototype.unsubscribe.call(this),!n&&(null===(t=this.onFinalize)||void 0===t||t.call(this))}},t}(er),wr=function(e){return e&&"number"==typeof e.length&&"function"!=typeof e};function xr(e){return Rn(null==e?void 0:e.then)}function Sr(e){return Rn(e[cr])}function Or(e){return Symbol.asyncIterator&&Rn(null==e?void 0:e[Symbol.asyncIterator])}function Ir(e){return new TypeError("You provided "+(null!==e&&"object"==typeof e?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}var Er="function"==typeof Symbol&&Symbol.iterator?Symbol.iterator:"@@iterator";function kr(e){return Rn(null==e?void 0:e[Er])}function jr(e){return Cn(this,arguments,(function(){var t,n,r;return Nn(this,(function(o){switch(o.label){case 0:t=e.getReader(),o.label=1;case 1:o.trys.push([1,,9,10]),o.label=2;case 2:return[4,Tn(t.read())];case 3:return n=o.sent(),r=n.value,n.done?[4,Tn(void 0)]:[3,5];case 4:return[2,o.sent()];case 5:return[4,Tn(r)];case 6:return[4,o.sent()];case 7:return o.sent(),[3,2];case 8:return[3,10];case 9:return t.releaseLock(),[7];case 10:return[2]}}))}))}function Pr(e){return Rn(null==e?void 0:e.getReader)}function _r(e){if(e instanceof fr)return e;if(null!=e){if(Sr(e))return o=e,new fr((function(e){var t=o[cr]();if(Rn(t.subscribe))return t.subscribe(e);throw new TypeError("Provided object does not correctly implement Symbol.observable")}));if(wr(e))return r=e,new fr((function(e){for(var t=0;t{this._to=!1,function(e){const t=Hr()-e.ttl,n=e.map[Symbol.iterator]();for(;;){const r=n.next().value;if(!r)return;const o=r[0];if(!(r[1]0&&void 0!==arguments[0]?arguments[0]:{},t=JSON.parse(JSON.stringify(e));return void 0===t.webWorkerSupport&&(t.webWorkerSupport=!0),t.idb||(t.idb={}),t.idb.ttl||(t.idb.ttl=45e3),t.idb.fallbackInterval||(t.idb.fallbackInterval=150),e.idb&&"function"==typeof e.idb.onclose&&(t.idb.onclose=e.idb.onclose),t.localstorage||(t.localstorage={}),t.localstorage.removeTimeout||(t.localstorage.removeTimeout=6e4),e.methods&&(t.methods=e.methods),t.node||(t.node={}),t.node.ttl||(t.node.ttl=12e4),t.node.maxParallelWrites||(t.node.maxParallelWrites=2048),void 0===t.node.useFastPath&&(t.node.useFastPath=!0),t}var Gr="messages",Yr={durability:"relaxed"};function Qr(){if("undefined"!=typeof indexedDB)return indexedDB;if("undefined"!=typeof window){if(void 0!==window.mozIndexedDB)return window.mozIndexedDB;if(void 0!==window.webkitIndexedDB)return window.webkitIndexedDB;if(void 0!==window.msIndexedDB)return window.msIndexedDB}return!1}function Xr(e){e.commit&&e.commit()}function Zr(e,t){var n=e.transaction(Gr,"readonly",Yr),r=n.objectStore(Gr),o=[],i=IDBKeyRange.bound(t+1,1/0);if(r.getAll){var s=r.getAll(i);return new Promise((function(e,t){s.onerror=function(e){return t(e)},s.onsuccess=function(t){e(t.target.result)}}))}return new Promise((function(e,s){var a=function(){try{return i=IDBKeyRange.bound(t+1,1/0),r.openCursor(i)}catch(e){return r.openCursor()}}();a.onerror=function(e){return s(e)},a.onsuccess=function(r){var i=r.target.result;i?i.value.ide.lastCursorId&&(e.lastCursorId=t.id),t})).filter((function(t){return function(e,t){return!(e.uuid===t.uuid||t.eMIs.has(e.id)||e.data.time0||e._addEL.internal.length>0}function go(e,t,n){e._addEL[t].push(n),function(e){if(!e._iL&&bo(e)){var t=function(t){e._addEL[t.type].forEach((function(e){t.time>=e.time&&e.fn(t.data)}))},n=e.method.microSeconds();e._prepP?e._prepP.then((function(){e._iL=!0,e.method.onMessage(e._state,t,n)})):(e._iL=!0,e.method.onMessage(e._state,t,n))}}(e)}function wo(e,t,n){e._addEL[t]=e._addEL[t].filter((function(e){return e!==n})),function(e){if(e._iL&&!bo(e)){e._iL=!1;var t=e.method.microSeconds();e.method.onMessage(e._state,null,t)}}(e)}vo._pubkey=!0,vo.prototype={postMessage:function(e){if(this.closed)throw new Error("BroadcastChannel.postMessage(): Cannot post message after channel has closed "+JSON.stringify(e));return yo(this,"message",e)},postInternal:function(e){return yo(this,"internal",e)},set onmessage(e){var t={time:this.method.microSeconds(),fn:e};wo(this,"message",this._onML),e&&"function"==typeof e?(this._onML=t,go(this,"message",t)):this._onML=null},addEventListener:function(e,t){go(this,e,{time:this.method.microSeconds(),fn:t})},removeEventListener:function(e,t){wo(this,e,this._addEL[e].find((function(e){return e.fn===t})))},close:function(){var e=this;if(!this.closed){po.delete(this),this.closed=!0;var t=this._prepP?this._prepP:Lr;return this._onML=null,this._addEL.message=[],t.then((function(){return Promise.all(Array.from(e._uMP))})).then((function(){return Promise.all(e._befC.map((function(e){return e()})))})).then((function(){return e.method.close(e._state)}))}},get type(){return this.method.type},get isClosed(){return this.closed}};var xo=new Map;function So(e,t){var n=xo.get(e);if(n)return n.refs.delete(t),0===n.refs.size?(xo.delete(e),n.bc.close()):void 0}function Oo(e,t,n,r){if(t.multiInstance){var o=r||function(e,t,n,r){var o=xo.get(t);return o||(o={bc:new vo(["RxDB:",e,n].join("|")),refs:new Set},xo.set(t,o)),o.refs.add(r),o.bc}(e,t.databaseInstanceToken,n.databaseName,n),i=new pr,s=n=>{n.storageName===e&&n.databaseName===t.databaseName&&n.collectionName===t.collectionName&&n.version===t.schema.version&&i.next(n.eventBulk)};o.addEventListener("message",s);var a=n.changeStream(),c=!1,u=a.subscribe((n=>{c||o.postMessage({storageName:e,databaseName:t.databaseName,collectionName:t.collectionName,version:t.schema.version,eventBulk:n})}));n.changeStream=function(){return i.asObservable().pipe(function(){for(var e=[],t=0;t{var r=t.queryPlan,o=t.query,i=o.skip?o.skip:0,s=i+(o.limit?o.limit:1/0),a=e.internals.storeNames.documentStore,c=e.settings.batchSize?e.settings.batchSize:50,u=!1;r.selectorSatisfiedByIndex||(u=Kt(e.schema,o));var l=r.index,f=!r.sortSatisfiedByIndex,h=l,p=r.startKeys,m=tn(e.schema,h,p),v=r.endKeys,y=nn(e.schema,h,v),b=[],g=n.objectStore(a),w=sn(e.internals,h),x=g.index(w);u||t.query.limit||(c=1e5);var S=!1;if(await async function(e,t,n,r,o,i,s,a){var c=e.settings.IDBKeyRange?e.settings.IDBKeyRange:IDBKeyRange,u=e.internals.getIndexableStringByIndexId[s];if("function"==typeof n.getAll&&1!==r)for(var l,f=!0,d=!1,h=async function(){l&&(o=u(l.d));var e=c.bound(o,i,!f||!t.inclusiveStart,!t.inclusiveEnd);f=!1;var s=n.getAll(e,r);await new Promise(((e,t)=>{s.onerror=t,s.onsuccess=t=>{var n=t.target.result;l=k(n),0!==n.length&&!1===a(n)&&(d=!0),n.length{m.onsuccess=function(t){var n=t.target.result;if(n){var r=n.value;a([r])?n.continue():e()}else e()}}))}}(e,r,x,c,m,y,w,(e=>{for(var t=0;t{var t=Object.keys(e)[0],r=Object.values(e)[0];n.push({key:t,direction:r,getValueFn:O(t)})})),(e,t)=>{for(var r=0;r30&&!await function(e,t){var n=(e.settings.IDBKeyRange?e.settings.IDBKeyRange:IDBKeyRange).lowerBound($,!0),r=t.getKey(n);return new Promise((e=>{r.onsuccess=()=>{e(!!r.result)}}))}(e,u)?new Map:await function(e,t,n){var r=n.length,o=new Map;if(0===r)return Promise.resolve(o);for(var i=new Array(r),s=0;s{u.onerror=n,u.onsuccess=()=>{for(var n=0;n0){var w=c.objectStore(o.storeNames.writeAheadStore).put({i:"documents",docsData:JSON.stringify(h)});await new Promise(((e,t)=>{w.onerror=t,w.onsuccess=e})),e.handleWalIdlePromise||Jt(100).then((()=>Qt())).then((async()=>{e.handleWalIdlePromise=void 0,e.closed||await En(e,(()=>Gt))}))}if(e.schema.attachments){var x=c.objectStore(e.internals.storeNames.attachmentsStore);l.attachmentsAdd.forEach((e=>{v=x.put({docIdWithAttachmentId:hn(e.documentId,e.attachmentId),length:e.attachmentData.length,type:e.attachmentData.type,data:e.attachmentData.data})})),l.attachmentsUpdate.forEach((e=>{v=x.put({docIdWithAttachmentId:hn(e.documentId,e.attachmentId),length:e.attachmentData.length,type:e.attachmentData.type,data:e.attachmentData.data})})),l.attachmentsRemove.forEach((e=>{v=x.delete(hn(e.documentId,e.attachmentId))}))}if(v&&await new Promise(((e,t)=>{S(v).onerror=t,S(v).onsuccess=e})),c.commit&&c.commit(),l.eventBulk.events.length>0){var O=S(l.newestRow).document;l.eventBulk.checkpoint={id:O[r],lwt:O._meta.lwt},e.changes$.next(l.eventBulk)}return{error:f}}var ko=jn(),jo=function(){function e(e,t,n,r,o,i,s){this.changes$=new pr,this.instanceId=ko++,this.storage=e,this.databaseName=t,this.collectionName=n,this.schema=r,this.internals=o,this.options=i,this.settings=s,this.primaryPath=x(this.schema.primaryKey)}var t=e.prototype;return t.updateMinKnownDocs=function(e){this.internals.minKnownDocsAmountfunction(e,t,n){var r=t.length;if(0===r)return Promise.resolve([]);for(var o=new Array(r),i=0;i{c.onerror=t,c.onsuccess=()=>{for(var t=0;t{var r,o=t.queryPlan,i=e.internals.storeNames.documentStore,s=o.index,a=s,c=o.startKeys,u=tn(e.schema,a,c),l=o.endKeys,f=nn(e.schema,a,l),d=n.objectStore(i);r=1===s.length&&s[0]===e.primaryPath?sn(e.internals,["_deleted",e.primaryPath]):sn(e.internals,a);var h=d.index(r),p=(e.settings.IDBKeyRange?e.settings.IDBKeyRange:IDBKeyRange).bound(u,f,!o.inclusiveStart,!o.inclusiveEnd),m=h.count(p);return{count:await new Promise(((e,t)=>{m.onsuccess=function(){e(m.result)},m.onerror=t})),mode:"fast"}}))}(this,e);return this.updateMinKnownDocs(t.count),t}var n=await Io(this,e);return this.updateMinKnownDocs(n.documents.length),{count:n.documents.length,mode:"slow"}},t.changeStream=function(){return this.changes$.asObservable()},t.cleanup=async function(e){await Jt(0),await Jt(0);var t=this.internals.state;await t.creationPromise;var n=this.settings.IDBKeyRange;xn(this);var r=(await On(this)).objectStore(this.internals.storeNames.documentStore),o=this.settings.batchSize,i=jn()-e,s=sn(this.internals,on),a=r.index(s),c=tn(this.schema,on,[!0,1]),u=nn(this.schema,on,[!0,i]),l=n.bound(c,u,!0,!0),f=await new Promise(((e,t)=>{var n=a.getAll(l,o);n.onerror=t,n.onsuccess=function(t){e(t.target.result)}}));return await Promise.all(f.map((e=>new Promise(((t,n)=>{var o=e.i,i=r.delete(o);i.onerror=n,i.onsuccess=()=>t()}))))),f.length{var t=[e.objectStore(this.internals.storeNames.documentStore),e.objectStore(this.internals.storeNames.writeAheadStore)];return this.schema.attachments&&t.push(e.objectStore(this.internals.storeNames.attachmentsStore)),await Promise.all(t.map((e=>new Promise(((t,n)=>{var r=e.clear();r.onerror=n,r.onsuccess=t}))))),this.close()}))},t.getAttachmentData=async function(e,t){var n=this.internals.state;return await n.creationPromise,xn(this),En(this,(n=>{var r=n.objectStore(this.internals.storeNames.attachmentsStore),o=hn(e,t);return new Promise(((n,i)=>{var s=r.get(o);s.onsuccess=()=>{var r=s.result;r?n(r.data):i("attachment missing documentId: "+e+" attachmentId: "+t)}}))}))},t.close=async function(){return this.closed||(this.closed=(async()=>(await this.internals.state.creationPromise,await En(this,(async e=>{})),this.changes$.complete(),async function(e){if(!e.closed&&(e.refCount=e.refCount-1,0===e.refCount))return e.closed=!0,e.storage.indexedDBStates.delete(e.name),e.creationPromise.then((e=>e.close()))}(this.internals.state)))()),this.closed},e}(),Po=function(){function e(e){this.name=fn,this.rxdbVersion=Wt,this.indexedDBStates=new Map,this.settings=e}return e.prototype.createStorageInstance=function(e){return function(e){if(e.schema.keyCompression)throw d("UT5",{args:{params:e}});if((t=e.schema).encrypted&&t.encrypted.length>0||t.attachments&&t.attachments.encrypted)throw d("UT6",{args:{params:e}});var t;if(e.schema.attachments&&e.schema.attachments.compression)throw d("UT7",{args:{params:e}})}(e),async function(e,t,n){var r=un(t.schema),o=Array.from(r.indexIdByName.values()),i=await yn(e,n,t,[{collectionName:t.collectionName,schema:t.schema,indexIds:o}]);await i.creationPromise;var s={state:i,storeNames:gn(t.collectionName,t.schema),getIndexableStringByIndexId:r.monadByIndexId,getIndexableStringByIndexNumber:Object.values(r.monadByIndexId),indexIdByName:r.indexIdByName,indexNames:Object.keys(r),indexIds:o,minKnownDocsAmount:0},a=new jo(e,t.databaseName,t.collectionName,t.schema,s,t.options,n);return await Oo(fn,t,a),a}(this,e,Object.assign({},this.settings,e.options))},e}();function _o(e,t){return vr((function(n,r){var o=0;n.subscribe(br(r,(function(n){return e.call(t,n,o++)&&r.next(n)})))}))}function $o(e,t){if(e===t)return!0;if(e&&t&&"object"==typeof e&&"object"==typeof t){if(e.constructor!==t.constructor)return!1;var n,r;if(Array.isArray(e)){if((n=e.length)!==t.length)return!1;for(r=n;0!=r--;)if(!$o(e[r],t[r]))return!1;return!0}if(e.constructor===RegExp)return e.source===t.source&&e.flags===t.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===t.toString();var o=Object.keys(e);if((n=o.length)!==Object.keys(t).length)return!1;for(r=n;0!=r--;)if(!Object.prototype.hasOwnProperty.call(t,o[r]))return!1;for(r=n;0!=r--;){var i=o[r];if(!$o(e[i],t[i]))return!1}return!0}return e!=e&&t!=t}function No(e,t){return{connectionId:e.connectionId,answerTo:e.requestId,method:e.method,error:(n=t,{name:n.name,message:n.message,rxdb:n.rxdb,parameters:n.parameters,extensions:n.extensions,code:n.code,url:n.url,stack:n.stack?n.stack.replace(/\n/g," \n "):void 0})};var n}function Do(e,t){return{connectionId:e.connectionId,answerTo:e.requestId,method:e.method,return:t}}!function(e){var t,n=new pr;if("undefined"!=typeof self&&"object"==typeof self.onconnect){var r=new Map;self.onconnect=e=>{var t=e.ports[0];t.onmessage=e=>{var o=e.data;r.set(o.connectionId,t),n.next(o)}},t={storage:e.storage,messages$:n,send(e){Vt(r,e.connectionId).postMessage(e)}}}else addEventListener("message",(e=>{var t=e.data;n.next(t)})),t={storage:e.storage,messages$:n,send(e){postMessage(e)}};!function(e){var t=new Map;function n(t){if(e.storage)return e.storage.createStorageInstance(t);if(e.database){var n=Array.from(e.database.storageInstances),r=t.collectionName,o=n.find((e=>e.collectionName===r));if(!o)throw console.dir(n),new Error("storageInstance does not exist "+JSON.stringify({collectionName:r}));var i=t.schema;if(!$o(i,o.schema))throw new Error("Wrong schema "+JSON.stringify({schema:i,existingSchema:o.schema}));return Promise.resolve(o)}throw new Error("no base given")}e.messages$.pipe(_o((e=>"custom"===e.method))).subscribe((async t=>{if(e.customRequestHandler)try{var n=await e.customRequestHandler(t.params);e.send(Do(t,n))}catch(n){e.send(No(t,n))}else e.send(No(t,new Error("Remote storage: cannot resolve custom request because settings.customRequestHandler is not set")))}));var r=e.fakeVersion?e.fakeVersion:Ut;e.messages$.pipe(_o((e=>"create"===e.method))).subscribe((async o=>{if(o.version===r){var i=o.connectionId;if(!Array.isArray(o.params)){var s=o.params,a=s.collectionName,c=[s.databaseName,s.collectionName,s.schema.version].join("|"),u=t.get(c);if(u){if(!$o(s.schema,u.params.schema))return void e.send(No(o,new Error("Remote storage: schema not equal to existing storage")))}else try{u={storageInstancePromise:n(s),connectionIds:new Set,params:s},t.set(c,u),await u.storageInstancePromise}catch(t){return void e.send(No(o,t))}u.connectionIds.add(o.connectionId);var l=[],f=await u.storageInstancePromise;l.push(f.changeStream().subscribe((t=>{var n={connectionId:i,answerTo:"changestream",method:"changeStream",return:t};e.send(n)})));var h=!1;if(e.database){var p=e.database,m=p.collections[a];m?m.onClose.push((()=>v())):p.onClose.push((()=>v()))}l.push(e.messages$.pipe(_o((e=>e.connectionId===i))).subscribe((async t=>{var n,r=t;if("create"!==r.method&&"custom"!==r.method&&Array.isArray(r.params))try{if("close"===r.method&&e.database)return void e.send(Do(r,null));if("close"===r.method&&S(u).connectionIds.size>1)return e.send(Do(r,null)),S(u).connectionIds.delete(i),void l.forEach((e=>e.unsubscribe()));n="getChangedDocumentsSince"!==r.method||f.getChangedDocumentsSince?await f[r.method](r.params[0],r.params[1],r.params[2],r.params[3]):await Ft(f,r.params[0],r.params[1]),"close"!==r.method&&"remove"!==r.method||v(),e.send(Do(r,n))}catch(t){e.send(No(r,t))}}))),e.send(Do(o,"ok"))}}else e.send(No(o,d("RM1",{args:{mainVersion:o.version,remoteVersion:r}})));function v(){h||(h=!0,l.forEach((e=>e.unsubscribe())),S(u).connectionIds.delete(i),t.delete(c))}}))}(t)}({storage:function(e={}){var t=e.IDBKeyRange?e.IDBKeyRange:IDBKeyRange,n=e.indexedDB?e.indexedDB:indexedDB,r=Object.assign({batchSize:300,transactionDurability:"relaxed"},e,{IDBKeyRange:t,indexedDB:n});return new Po(r)}({})})})(); \ No newline at end of file +(()=>{function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}function t(t){var n=function(t,n){if("object"!=e(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var o=r.call(t,n||"default");if("object"!=e(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(t)}(t,"string");return"symbol"==e(n)?n:n+""}function n(e,n){for(var r=0;r!1,deepFreezeWhenDevMode:e=>e,tunnelErrorMessage:e=>"\n RxDB Error-Code: "+e+".\n Hint: Error messages are not included in RxDB core to reduce build size.\n To show the full error messages and to ensure that you do not make any mistakes when using RxDB,\n use the dev-mode plugin when you are in development mode: https://rxdb.info/dev-mode.html?console=error\n "};function c(e,t,n){return"\n"+e+"\n"+function(e){var t="";return 0===Object.keys(e).length?t:(t+="-".repeat(20)+"\n",t+="Parameters:\n",t+=Object.keys(e).map((t=>{var n="[object Object]";try{n="errors"===t?e[t].map((e=>JSON.stringify(e,Object.getOwnPropertyNames(e)))):JSON.stringify(e[t],(function(e,t){return void 0===t?null:t}),2)}catch(e){}return t+": "+n})).join("\n"),t+="\n")}(n)}var u=function(e){function t(t,n,r={}){var o,i=c(n,0,r);return(o=e.call(this,i)||this).code=t,o.message=i,o.url=l(t),o.parameters=r,o.rxdb=!0,o}var o,i;return i=e,(o=t).prototype=Object.create(i.prototype),o.prototype.constructor=o,r(o,i),t.prototype.toString=function(){return this.message},function(e,t,r){return t&&n(e.prototype,t),r&&n(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}(t,[{key:"name",get:function(){return"RxError ("+this.code+")"}},{key:"typeError",get:function(){return!1}}])}(s(Error));function l(e){return"https://rxdb.info/errors.html?console=errors#"+e}function f(e){return"\nFind out more about this error here: "+l(e)+" \n"}function d(e,t){return new u(e,a.tunnelErrorMessage(e)+f(e),t)}var h=/\./g,p="abcdefghijklmnopqrstuvwxyz",m=e=>{var t=typeof e;return null!==e&&("object"===t||"function"===t)},v=new Set(["__proto__","prototype","constructor"]),y=new Set("0123456789");function b(e){var t=[],n="",r="start",o=!1;for(var i of e)switch(i){case"\\":if("index"===r)throw new Error("Invalid character in an index");if("indexEnd"===r)throw new Error("Invalid character after an index");o&&(n+=i),r="property",o=!o;break;case".":if("index"===r)throw new Error("Invalid character in an index");if("indexEnd"===r){r="property";break}if(o){o=!1,n+=i;break}if(v.has(n))return[];t.push(n),n="",r="property";break;case"[":if("index"===r)throw new Error("Invalid character in an index");if("indexEnd"===r){r="index";break}if(o){o=!1,n+=i;break}if("property"===r){if(v.has(n))return[];t.push(n),n=""}r="index";break;case"]":if("index"===r){t.push(Number.parseInt(n,10)),n="",r="indexEnd";break}if("indexEnd"===r)throw new Error("Invalid character after an index");default:if("index"===r&&!y.has(i))throw new Error("Invalid character in an index");if("indexEnd"===r)throw new Error("Invalid character after an index");"start"===r&&(r="property"),o&&(o=!1,n+="\\"),n+=i}switch(o&&(n+="\\"),r){case"property":if(v.has(n))return[];t.push(n);break;case"index":throw new Error("Index was not closed");case"start":t.push("")}return t}function g(e,t){if("number"!=typeof t&&Array.isArray(e)){var n=Number.parseInt(t,10);return Number.isInteger(n)&&e[n]===e[t]}return!1}function w(e,t){var n=function(e,t,n){if(Array.isArray(t)&&(t=t.join(".")),!t.includes(".")&&!t.includes("["))return e[t];if(!m(e)||"string"!=typeof t)return void 0===n?e:n;var r=b(t);if(0===r.length)return n;for(var o=0;ot[e]:e=>{for(var r=e,o=0;o"desc"===Object.values(e)[0])),i=new Set;Object.keys(n).forEach((t=>{var r=w(e,t);r&&"boolean"===r.type&&Object.prototype.hasOwnProperty.call(n[t],"$eq")&&i.add(t)}));var s,a=t.sort.map((e=>Object.keys(e)[0])).filter((e=>!i.has(e))).join(","),c=-1;if(r.forEach((e=>{var r=!0,u=!0,l=e.map((e=>{var t=n[e],o=t?Object.keys(t):[],i={};return t&&o.length?o.forEach((e=>{if(D.has(e)){var n=function(e,t){switch(e){case"$eq":return{startKey:t,endKey:t,inclusiveEnd:!0,inclusiveStart:!0};case"$lte":return{endKey:t,inclusiveEnd:!0};case"$gte":return{startKey:t,inclusiveStart:!0};case"$lt":return{endKey:t,inclusiveEnd:!1};case"$gt":return{startKey:t,inclusiveStart:!1};default:throw new Error("SNH")}}(e,t[e]);i=Object.assign(i,n)}})):i={startKey:u?$:_,endKey:r?_:$,inclusiveStart:!0,inclusiveEnd:!0},void 0===i.startKey&&(i.startKey=$),void 0===i.endKey&&(i.endKey=_),void 0===i.inclusiveStart&&(i.inclusiveStart=!0),void 0===i.inclusiveEnd&&(i.inclusiveEnd=!0),u&&!i.inclusiveStart&&(u=!1),r&&!i.inclusiveEnd&&(r=!1),i})),f=l.map((e=>e.startKey)),d=l.map((e=>e.endKey)),h={index:e,startKeys:f,endKeys:d,inclusiveEnd:r,inclusiveStart:u,sortSatisfiedByIndex:!o&&a===e.filter((e=>!i.has(e))).join(","),selectorSatisfiedByIndex:T(e,t.selector,f,d)},p=function(e,t,n){var r=0,o=e=>{e>0&&(r+=e)},i=10,s=P(n.startKeys,(e=>e!==$&&e!==_));o(s*i);var a=P(n.startKeys,(e=>e!==_&&e!==$));o(a*i);var c=P(n.startKeys,((e,t)=>e===n.endKeys[t]));return o(c*i*1.5),o(n.sortSatisfiedByIndex?5:0),r}(0,0,h);(p>=c||t.index)&&(c=p,s=h)})),!s)throw d("SNH",{query:t});return s}var D=new Set(["$eq","$gt","$gte","$lt","$lte"]),A=new Set(["$eq","$gt","$gte"]),M=new Set(["$eq","$lt","$lte"]);function T(e,t,n,r){var o=Object.entries(t).find((([t,n])=>!e.includes(t)||Object.entries(n).find((([e,t])=>!D.has(e)))));if(o)return!1;if(t.$and||t.$or)return!1;var i=[],s=new Set;for(var[a,c]of Object.entries(t)){if(!e.includes(a))return!1;var u=Object.keys(c).filter((e=>A.has(e)));if(u.length>1)return!1;var l=u[0];if(l&&s.add(a),"$eq"!==l){if(i.length>0)return!1;i.push(l)}}var f=[],d=new Set;for(var[h,p]of Object.entries(t)){if(!e.includes(h))return!1;var m=Object.keys(p).filter((e=>M.has(e)));if(m.length>1)return!1;var v=m[0];if(v&&d.add(h),"$eq"!==v){if(f.length>0)return!1;f.push(v)}}var y=0;for(var b of e){for(var g of[s,d]){if(!g.has(b)&&g.size>0)return!1;g.delete(b)}if(n[y]!==r[y]&&s.size>0&&d.size>0)return!1;y++}return!0}class C extends Error{}const B=Symbol("missing"),R=Object.freeze(new Error("mingo: cycle detected while processing object/array")),K=e=>{const t=he(e);let n=0,r=t.length;for(;r;)n=(n<<5)-n^t.charCodeAt(--r);return n>>>0},L=e=>"object"!=typeof e&&"function"!=typeof e||null===e,q=e=>L(e)||ee(e)||te(e),z={undefined:1,null:2,number:3,string:4,symbol:5,object:6,array:7,arraybuffer:8,boolean:9,date:10,regexp:11,function:12},F=(e,t)=>{e===B&&(e=void 0),t===B&&(t=void 0);const[n,r]=[e,t].map((e=>z[H(e)]||0));return n!==r?n-r:de(e,t)?0:et?1:0};class U extends Map{#e=K;#t=new Map;#n=e=>{const t=this.#e(e);return[(this.#t.get(t)||[]).find((t=>de(t,e))),t]};constructor(){super()}static init(e){const t=new U;return e&&(t.#e=e),t}clear(){super.clear(),this.#t.clear()}delete(e){if(L(e))return super.delete(e);const[t,n]=this.#n(e);return!!super.delete(t)&&(this.#t.set(n,this.#t.get(n).filter((e=>!de(e,t)))),!0)}get(e){if(L(e))return super.get(e);const[t,n]=this.#n(e);return super.get(t)}has(e){if(L(e))return super.has(e);const[t,n]=this.#n(e);return super.has(t)}set(e,t){if(L(e))return super.set(e,t);const[n,r]=this.#n(e);if(super.has(n))super.set(n,t);else{super.set(e,t);const n=this.#t.get(r)||[];n.push(e),this.#t.set(r,n)}return this}get size(){return super.size}}function W(e,t){if(!e)throw new C(t)}const V=Object.keys(z).reduce(((e,t)=>(e["[object "+t[0].toUpperCase()+t.substring(1)+"]"]=t,e)),{});function H(e){const t=Object.prototype.toString.call(e);return"[object Object]"===t?e?.constructor?.name?.toLowerCase()||"object":V[t]||t.substring(8,t.length-1).toLowerCase()}const J=e=>"boolean"==typeof e,G=e=>"string"==typeof e,Y=e=>!isNaN(e)&&"number"==typeof e,Q=Array.isArray;function X(e){if(!e)return!1;const t=Object.getPrototypeOf(e);return(t===Object.prototype||null===t)&&"object"===H(e)}const Z=e=>!L(e),ee=e=>e instanceof Date,te=e=>e instanceof RegExp,ne=e=>"function"==typeof e,re=e=>null==e,oe=e=>re(e)||G(e)&&!e||Q(e)&&0===e.length||X(e)&&0===Object.keys(e).length,ie=e=>Q(e)?e:[e],se=(e,t)=>!!e&&Object.prototype.hasOwnProperty.call(e,t),ae=(e,t)=>{if(re(e)||J(e)||Y(e)||G(e))return e;if(ee(e))return new Date(e);if(te(e))return new RegExp(e);if((e=>"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView(e))(e))return new(0,e.constructor)(e);if(t instanceof Set||(t=new Set),t.has(e))throw R;t.add(e);try{if(Q(e)){const n=new Array(e.length);for(let r=0;re===B;function ue(e,t){if(ce(e)||re(e))return t;if(ce(t)||re(t))return e;if(L(e)||L(t))return t;Q(e)&&Q(t)&&W(e.length===t.length,"arrays must be of equal length to merge.");for(const n of Object.keys(t))e[n]=ue(e[n],t[n]);return e}function le(e,t=1){const n=new Array;return function e(t,r){for(let o=0,i=t.length;o0||r<0)?e(t[o],Math.max(-1,r-1)):n.push(t[o])}(e,t),n}function fe(e){for(;e;){if(Object.getOwnPropertyNames(e).includes("toString"))return e.toString!==Object.prototype.toString;e=Object.getPrototypeOf(e)}return!1}function de(e,t){if(e===t||Object.is(e,t))return!0;if(null===e||null===t)return!1;if(typeof e!=typeof t)return!1;if("object"!=typeof e)return!1;if(e.constructor!==t.constructor)return!1;if(e instanceof Date)return+e==+t;if(e instanceof RegExp)return e.toString()===t.toString();const n=e.constructor;if(n===Array||n===Object){const n=Object.keys(e).sort(),r=Object.keys(t).sort();if(n.length!==r.length)return!1;for(let o=0,i=n[o];o{if(null===e)return"null";if(void 0===e)return"undefined";if(G(e)||Y(e)||J(e))return JSON.stringify(e);if(ee(e))return e.toISOString();if(te(e)||(e=>"symbol"==typeof e)(e)||ne(e))return e.toString();if(t instanceof Set||(t=new Set),t.has(e))throw R;try{if(t.add(e),Q(e))return"["+e.map((e=>he(e,t))).join(",")+"]";if(X(e))return"{"+Object.keys(e).sort().map((n=>`${n}:${he(e[n],t)}`)).join()+"}";const n=fe(e)?e.toString():he(function(e){const t={};for(;e;){for(const n of Object.getOwnPropertyNames(e))n in t||(t[n]=e[n]);e=Object.getPrototypeOf(e)}return t}(e),t);return H(e)+"("+n+")"}finally{t.delete(e)}};function pe(e,t){return re(e)?null:(t=t||K)(e)}function me(e,t,n=K){if(e.length<1)return new Map;const r=new Map,o=new Map;for(let i=0;ide(e,a))):null;re(e)?(o.set(a,[s]),r.has(c)?r.get(c).push(a):r.set(c,[a])):o.get(e).push(s)}}return o}function ve(e,t){return Z(e)?e[t]:void 0}function ye(e,t,n){let r=0;const o=q(e)?e:function e(t,n){let o=t;for(let t=0;t0)break;r+=1;const i=n.slice(t);o=o.reduce(((t,n)=>{const r=e(n,i);return void 0!==r&&t.push(r),t}),[]);break}if(o=ve(o,i),void 0===o)break}return o}(e,t.split("."));return Q(o)&&n?.unwrapArray?function(e,t){if(t<1)return e;for(;t--&&1===e.length;)e=e[0];return e}(o,r):o}function be(e,t,n){const r=t.indexOf("."),o=-1==r?t:t.substring(0,r),i=t.substring(r+1),s=-1!=r;if(Q(e)){const r=/^\d+$/.test(o),a=r&&n?.preserveIndex?[...e]:[];if(r){const t=parseInt(o);let r=ve(e,t);s&&(r=be(r,i,n)),n?.preserveIndex?a[t]=r:a.push(r)}else for(const r of e){const e=be(r,t,n);n?.preserveMissing?a.push(null==e?B:e):(null!=e||n?.preserveIndex)&&a.push(e)}return a}const a=n?.preserveKeys?{...e}:{};let c=ve(e,o);if(s&&(c=be(c,i,n)),void 0!==c)return a[o]=c,a}function ge(e){if(Q(e))for(let t=e.length-1;t>=0;t--)e[t]===B?e.splice(t,1):ge(e[t]);else if(X(e))for(const t in e)se(e,t)&&ge(e[t])}const we=/^\d+$/;function xe(e,t,n,r){const o=t.split("."),i=o[0],s=o.slice(1).join(".");if(1===o.length)(X(e)||Q(e)&&we.test(i))&&n(e,i);else{r?.buildGraph&&re(e[i])&&(e[i]={});const t=e[i];if(!t)return;const a=!!(o.length>1&&we.test(o[1]));Q(t)&&r?.descendArray&&!a?t.forEach((e=>xe(e,s,n,r))):xe(t,s,n,r)}}function Se(e,t,n){xe(e,t,((e,t)=>{e[t]=ne(n)?n(e[t]):n}),{buildGraph:!0})}function Oe(e,t,n){xe(e,t,((e,t)=>{if(Q(e)){if(/^\d+$/.test(t))e.splice(parseInt(t),1);else if(n&&n.descendArray)for(const n of e)X(n)&&delete n[t]}else X(e)&&delete e[t]}),n)}const Ie=/^\$[a-zA-Z0-9_]+$/;function Ee(e){return Ie.test(e)}function ke(e){if(q(e))return te(e)?{$regex:e}:{$eq:e};if(Z(e)){if(!Object.keys(e).some(Ee))return{$eq:e};if(se(e,"$regex")){const t={...e};return t.$regex=new RegExp(e.$regex,e.$options),delete t.$options,t}}return e}var je=(e=>(e[e.CLONE_OFF=0]="CLONE_OFF",e[e.CLONE_INPUT=1]="CLONE_INPUT",e[e.CLONE_OUTPUT=2]="CLONE_OUTPUT",e[e.CLONE_ALL=3]="CLONE_ALL",e))(je||{});class Pe{#r;#o;#i;constructor(e,t,n){this.#r=e,this.update(t,n)}static init(e,t,n){return e instanceof Pe?new Pe(e.#r,e.root??t,{...e.#i,...n,variables:Object.assign({},e.#i?.variables,n?.variables)}):new Pe(e,t,n)}update(e,t){this.#o=e;const n=Object.assign({},this.#i?.variables,t?.variables);return Object.keys(n).length?this.#i={...t,variables:n}:this.#i=t??{},this}getOptions(){return Object.freeze({...this.#r,context:_e.from(this.#r.context)})}get root(){return this.#o}get local(){return this.#i}get idKey(){return this.#r.idKey}get collation(){return this.#r?.collation}get processingMode(){return this.#r?.processingMode||0}get useStrictMode(){return this.#r?.useStrictMode}get scriptEnabled(){return this.#r?.scriptEnabled}get useGlobalContext(){return this.#r?.useGlobalContext}get hashFunction(){return this.#r?.hashFunction}get collectionResolver(){return this.#r?.collectionResolver}get jsonSchemaValidator(){return this.#r?.jsonSchemaValidator}get variables(){return this.#r?.variables}get context(){return this.#r?.context}}class _e{#s=new Map;constructor(){}static init(){return new _e}static from(e){const t=_e.init();return re(e)||e.#s.forEach(((e,n)=>t.addOperators(n,e))),t}addOperators(e,t){this.#s.has(e)||this.#s.set(e,{});for(const[n,r]of Object.entries(t))this.getOperator(e,n)||(this.#s.get(e)[n]=r);return this}getOperator(e,t){return(this.#s.get(e)??{})[t]??null}addAccumulatorOps(e){return this.addOperators("accumulator",e)}addExpressionOps(e){return this.addOperators("expression",e)}addQueryOps(e){return this.addOperators("query",e)}addPipelineOps(e){return this.addOperators("pipeline",e)}addProjectionOps(e){return this.addOperators("projection",e)}addWindowOps(e){return this.addOperators("window",e)}}const $e=_e.init();function Ne(e,t){for(const[n,r]of Object.entries(t)){W(ne(r)&&Ee(n),`'${n}' is not a valid operator`);const t=De(e,n,null);W(!t||r===t,`${n} already exists for '${e}' operators. Cannot change operator function once registered.`)}switch(e){case"accumulator":$e.addAccumulatorOps(t);break;case"expression":$e.addExpressionOps(t);break;case"pipeline":$e.addPipelineOps(t);break;case"projection":$e.addProjectionOps(t);break;case"query":$e.addQueryOps(t);break;case"window":$e.addWindowOps(t)}}function De(e,t,n){const{context:r,useGlobalContext:o}=n||{},i=r?r.getOperator(e,t):null;return!i&&o?$e.getOperator(e,t):i}function Ae(e,t,n,r){const o=Pe.init(r,e);return n&&Ee(n)?Ce(e,t,n,o):Te(e,t,o)}const Me=["$$ROOT","$$CURRENT","$$REMOVE","$$NOW"];function Te(e,t,n){if(G(t)&&t.length>0&&"$"===t[0]){if(Be.includes(t))return t;let r=n.root;const o=t.split(".");if(Me.includes(o[0])){switch(o[0]){case"$$ROOT":break;case"$$CURRENT":r=e;break;case"$$REMOVE":r=void 0;break;case"$$NOW":r=new Date}t=t.slice(o[0].length+1)}else if("$$"===o[0].slice(0,2)){r=Object.assign({},n.variables,{this:e},n?.local?.variables);const i=o[0].slice(2);W(se(r,i),`Use of undefined variable: ${i}`),t=t.slice(2)}else t=t.slice(1);return""===t?r:ye(r,t)}if(Q(t))return t.map((t=>Te(e,t,n)));if(X(t)){const r={},o=Object.entries(t);for(const[t,i]of o){if(Ee(t))return W(1==o.length,"expression must have single operator."),Ce(e,i,t,n);r[t]=Te(e,i,n)}return r}return t}function Ce(e,t,n,r){const o=De("expression",n,r);if(o)return o(e,t,r);const i=De("accumulator",n,r);return W(!!i,`accumulator '${n}' is not registered.`),Q(e)||(e=Te(e,t,r),t=null),W(Q(e),`arguments must resolve to array for ${n}.`),i(e,t,r)}const Be=["$$KEEP","$$PRUNE","$$DESCEND"];function Re(e){return e instanceof qe?e:new qe(e)}function Ke(e,t){const n=e.slice(t+1);e.splice(t),Array.prototype.push.apply(e,n)}const Le=new Error;class qe{constructor(e){let t;if(this.#a=[],this.#c=[],this.isDone=!1,e instanceof Function&&(e={next:e}),(n=e)&&"object"==typeof n&&n?.next instanceof Function){const n=e;t=()=>{const e=n.next();if(e.done)throw Le;return e.value}}else if(Q(e)){const n=e,r=n.length;let o=0;t=()=>{if(o0?this.push(2,e):this}drop(e){return e>0?this.push(3,e):this}transform(e){const t=this;let n;return Re((()=>(n||(n=Re(e(t.value()))),n.next())))}value(){return this.isDone||(this.isDone=this.#u(!0).done),this.#c}each(e){for(;;){const t=this.next();if(t.done)break;if(!1===e(t.value))return!1}return!0}reduce(e,t){let n=this.next();for(void 0!==t||n.done||(t=n.value,n=this.next());!n.done;)t=e(t,n.value),n=this.next();return t}size(){return this.reduce(((e,t)=>++e),0)}[Symbol.iterator](){return this}}const ze=(e,t,n)=>oe(t)?e:(Ue(t,n),e.map(Fe(t,Pe.init(n))));function Fe(e,t,n=!0){const r=t.idKey,o=Object.keys(e),i=new Array,s=new Array,a={};for(const r of o){const o=e[r];if(Y(o)||J(o))o?s.push(r):i.push(r);else if(Q(o))a[r]=e=>o.map((n=>Ae(e,n,null,t.update(e))??null));else if(X(o)){const e=Object.keys(o),i=1==e.length?e[0]:"",s=De("projection",i,t);s?"$slice"!==i||ie(o[i]).every(Y)?a[r]=e=>s(e,o[i],r,t.update(e)):a[r]=e=>Ae(e,o,r,t.update(e)):Ee(i)?a[r]=e=>Ae(e,o[i],i,t):(Ue(o,t),a[r]=e=>{if(!se(e,r))return Ae(e,o,null,t);n&&t.update(e);const i=ye(e,r),s=Fe(o,t,!1);return Q(i)?i.map(s):X(i)?s(i):s(e)})}else a[r]=G(o)&&"$"===o[0]?e=>Ae(e,o,r,t):e=>o}const c=Object.keys(a),u=i.includes(r);if(n&&u&&1===i.length&&!s.length&&!c.length)return e=>{const t={...e};return delete t[r],t};const l=n&&!u&&!s.includes(r),f={preserveMissing:!0};return e=>{const t={};if(i.length&&!s.length){ue(t,e);for(const e of i)Oe(t,e,{descendArray:!0})}for(const n of s)ue(t,be(e,n,f)??{});s.length&&ge(t);for(const n of c){const r=a[n](e);void 0===r?Oe(t,n,{descendArray:!0}):Se(t,n,r)}return l&&se(e,r)&&(t[r]=ye(e,r)),t}}function Ue(e,t){let n=!1,r=!1;for(const[o,i]of Object.entries(e))W(!o.startsWith("$"),"Field names may not start with '$'."),W(!o.endsWith(".$"),"Positional projection operator '$' is not supported."),o!==t?.idKey&&(0===i||!1===i?n=!0:1!==i&&!0!==i||(r=!0),W(!(n&&r),"Projection cannot have a mix of inclusion and exclusion."))}const We=(e,t,n)=>{if(oe(t)||!X(t))return e;let r=F;const o=n.collation;return X(o)&&G(o.locale)&&(r=function(e){const t={sensitivity:Ve[e.strength||3],caseFirst:"off"===e.caseFirst?"false":e.caseFirst||"false",numeric:e.numericOrdering||!1,ignorePunctuation:"shifted"===e.alternate};!0===(e.caseLevel||!1)&&("base"===t.sensitivity&&(t.sensitivity="case"),"accent"===t.sensitivity&&(t.sensitivity="variant"));const n=new Intl.Collator(e.locale,t);return(e,t)=>{if(!G(e)||!G(t))return F(e,t);const r=n.compare(e,t);return r<0?-1:r>0?1:0}}(o)),e.transform((e=>{const o=Object.keys(t);for(const i of o.reverse()){const o=me(e,(e=>ye(e,i)),n.hashFunction),s=Array.from(o.keys()).sort(r);-1===t[i]&&s.reverse();let a=0;for(const t of s)for(const n of o.get(t))e[a++]=n;W(a==e.length,"bug: counter must match collection size.")}return e}))},Ve={1:"base",2:"accent",3:"variant"},He={$sort:We,$skip:(e,t,n)=>e.drop(t),$limit:(e,t,n)=>e.take(t)};class Je{#l;#f;#d;#r;#s={};#h=null;#p=[];constructor(e,t,n,r){this.#l=e,this.#f=t,this.#d=n,this.#r=r}fetch(){if(this.#h)return this.#h;this.#h=Re(this.#l).filter(this.#f);const e=this.#r.processingMode;e&je.CLONE_INPUT&&this.#h.map(ae);for(const e of["$sort","$skip","$limit"])se(this.#s,e)&&(this.#h=He[e](this.#h,this.#s[e],this.#r));return Object.keys(this.#d).length&&(this.#h=ze(this.#h,this.#d,this.#r)),e&je.CLONE_OUTPUT&&this.#h.map(ae),this.#h}fetchAll(){const e=Re([...this.#p]);return this.#p=[],function(...e){let t=0;return Re((()=>{for(;t0)return this.#p.pop();const e=this.fetch().next();return e.done?void 0:e.value}hasNext(){if(this.#p.length>0)return!0;const e=this.fetch().next();return!e.done&&(this.#p.push(e.value),!0)}map(e){return this.all().map(e)}forEach(e){this.all().forEach(e)}[Symbol.iterator](){return this.fetchAll()}}const Ge=new Set(Array.from(["$and","$or","$nor","$expr","$jsonSchema"]));class Ye{#m;#r;#v;constructor(e,t){this.#v=ae(e),this.#r=function(e){return e instanceof Pe?e.getOptions():Object.freeze({idKey:"_id",scriptEnabled:!0,useStrictMode:!0,useGlobalContext:!0,processingMode:0,...e,context:e?.context?_e.from(e?.context):_e.init()})}(t),this.#m=[],this.compile()}compile(){W(X(this.#v),`query criteria must be an object: ${JSON.stringify(this.#v)}`);const e={};for(const[t,n]of Object.entries(this.#v)){if("$where"===t)W(this.#r.scriptEnabled,"$where operator requires 'scriptEnabled' option to be true."),Object.assign(e,{field:t,expr:n});else if(Ge.has(t))this.processOperator(t,t,n);else{W(!Ee(t),`unknown top level operator: ${t}`);for(const[e,r]of Object.entries(ke(n)))this.processOperator(t,e,r)}e.field&&this.processOperator(e.field,e.field,e.expr)}}processOperator(e,t,n){const r=De("query",t,this.#r);W(!!r,`unknown query operator ${t}`),this.#m.push(r(e,n,this.#r))}test(e){return this.#m.every((t=>t(e)))}find(e,t){return new Je(e,(e=>this.test(e)),t||{},this.#r)}remove(e){return e.reduce(((e,t)=>(this.test(t)||e.push(t),e)),[])}}function Qe(e){return(t,n,r)=>{const o={unwrapArray:!0},i=Math.max(1,t.split(".").length-1);return s=>{const a=ye(s,t,o);return e(a,n,{...r,depth:i})}}}function Xe(e){return(t,n,r)=>{const o=Ae(t,n,null,r);return e(...o)}}function Ze(e,t,n){return!!de(e,t)||!(!re(e)||!re(t))||!!Q(e)&&(e.some((e=>de(e,t)))||le(e,n?.depth).some((e=>de(e,t))))}function et(e,t,n){return!Ze(e,t,n)}function tt(e,t,n){return re(e)?t.some((e=>null===e)):function(e,t=K){const n=[U.init(t),U.init(t)];if(0===e.length)return[];if(e.some((e=>0===e.length)))return[];if(1===e.length)return[...e];e[e.length-1].forEach((e=>n[0].set(e,!0)));for(let t=e.length-2;t>-1;t--){if(e[t].forEach((e=>{n[0].has(e)&&n[1].set(e,!0)})),0===n[1].size)return[];n.reverse(),n[1].clear()}return Array.from(n[0].keys())}([ie(e),t],n?.hashFunction).length>0}function nt(e,t,n){return!tt(e,t,n)}function rt(e,t,n){return dt(e,t,((e,t)=>F(e,t)<0))}function ot(e,t,n){return dt(e,t,((e,t)=>F(e,t)<=0))}function it(e,t,n){return dt(e,t,((e,t)=>F(e,t)>0))}function st(e,t,n){return dt(e,t,((e,t)=>F(e,t)>=0))}function at(e){return Ee(e)&&-1===["$and","$or","$nor"].indexOf(e)}function ct(e,t,n){if(Q(e)&&!oe(e)){let r=e=>e,o=t;Object.keys(t).every(at)&&(o={temp:t},r=e=>({temp:e}));const i=new Ye(o,n);for(let t=0,n=e.length;tnull===e,lt={array:Q,boolean:J,bool:J,date:ee,number:Y,int:Y,long:Y,double:Y,decimal:Y,null:ut,object:X,regexp:te,regex:te,string:G,undefined:re,function:e=>{throw new C("unsupported type key `function`.")},1:Y,2:G,3:X,4:Q,6:re,8:J,9:ee,10:ut,11:te,16:Y,18:Y,19:Y};function ft(e,t,n){const r=lt[t];return!!r&&r(e)}function dt(e,t,n){return ie(e).some((e=>H(e)===H(t)&&n(e,t)))}Xe(nt);const ht=(e,t)=>(n,r,o)=>{W(Q(r),`${e}: expression must be an array.`);const i=Ae(n,r,null,o);return i.some(re)?null:(W(i.every(Y),`${e}: expression must evalue to array of numbers.`),t(i))},pt=(ht("$bitAnd",(e=>e.reduce(((e,t)=>e&t),-1))),ht("$bitOr",(e=>e.reduce(((e,t)=>e|t),0))),ht("$bitXor",(e=>e.reduce(((e,t)=>e^t),0))),Xe(Ze),Xe(it),Xe(st),Xe(rt),Xe(ot),Xe(et),(e,t)=>{const n={};return e.split("").forEach(((e,r)=>n[e]=t*(r+1))),n});pt("ABCDEFGHIKLM",1),pt("NOPQRSTUVWXY",-1);const mt={undefined:null,null:null,NaN:NaN,Infinity:new Error,"-Infinity":new Error};function vt(e,t=mt){const n=Object.assign({},mt,t),r=new Set(Object.keys(n));return(t,o,i)=>{const s=Ae(t,o,null,i);if(r.has(`${s}`)){const t=n[`${s}`];if(t instanceof Error)throw new C(`cannot apply $${e.name} to -inf, value must in (-inf,inf)`);return t}return e(s)}}vt(Math.acos,{Infinity:1/0,0:new Error}),vt(Math.acosh,{Infinity:1/0,0:new Error}),vt(Math.asin),vt(Math.asinh,{Infinity:1/0,"-Infinity":-1/0}),vt(Math.atan),vt(Math.atanh,{1:1/0,"-1":-1/0}),vt(Math.cos),vt(Math.cosh,{"-Infinity":1/0,Infinity:1/0});const yt=Math.PI/180,bt=(vt((e=>e*yt),{Infinity:1/0,"-Infinity":1/0}),180/Math.PI);vt((e=>e*bt),{Infinity:1/0,"-Infinity":-1/0}),vt(Math.sin),vt(Math.sinh,{"-Infinity":-1/0,Infinity:1/0}),vt(Math.tan),Number.MAX_SAFE_INTEGER,Number.MIN_SAFE_INTEGER;const gt=(e,t,n)=>{W(Q(t),"Invalid expression: $and expects value to be an Array.");const r=t.map((e=>new Ye(e,n)));return e=>r.every((t=>t.test(e)))},wt=(e,t,n)=>{W(Q(t),"Invalid expression. $or expects value to be an Array");const r=t.map((e=>new Ye(e,n)));return e=>r.some((t=>t.test(e)))},xt=(e,t,n)=>{W(Q(t),"Invalid expression. $nor expects value to be an array.");const r=wt(0,t,n);return e=>!r(e)},St=(e,t,n)=>{const r={};r[e]=ke(t);const o=new Ye(r,n);return e=>!o.test(e)},Ot=Qe(Ze),It=Qe(it),Et=Qe(st),kt=Qe(tt),jt=Qe(rt),Pt=Qe(ot),_t=Qe(et),$t=Qe(nt),Nt=Qe((function(e,t,n){return ie(e).some((e=>2===t.length&&e%t[0]===t[1]))})),Dt=Qe((function(e,t,n){const r=ie(e),o=e=>G(e)&&((e,t=!0)=>!!e||t&&""===e)(t.exec(e),n?.useStrictMode);return r.some(o)||le(r,1).some(o)}));Qe((function(e,t,n){if(!(Q(e)&&Q(t)&&e.length&&t.length))return!1;let r=!0;for(const o of t){if(!r)break;r=X(o)&&Object.keys(o).includes("$elemMatch")?ct(e,o.$elemMatch,n):te(o)?e.some((e=>"string"==typeof e&&o.test(e))):e.some((e=>de(o,e)))}return r}));const At=Qe(ct),Mt=Qe((function(e,t,n){return Array.isArray(e)&&e.length===t})),Tt=(e,t,n)=>{const r=e.includes("."),o=!!t;return!r||e.match(/\.\d+$/)?t=>void 0!==ye(t,e)===o:t=>{const n=ye(be(t,e,{preserveIndex:!0}),e.substring(0,e.lastIndexOf(".")));return Q(n)?n.some((e=>void 0!==e))===o:void 0!==n===o}},Ct=Qe((function(e,t,n){return Q(t)?t.findIndex((t=>ft(e,t)))>=0:ft(e,t)}));var Bt=!1;function Rt(e,t){var n=x(e.primaryKey);t=I(t);var r,o=E(t);if("number"!=typeof o.skip&&(o.skip=0),o.selector?(o.selector=o.selector,Object.entries(o.selector).forEach((([e,t])=>{"object"==typeof t&&null!==t||(o.selector[e]={$eq:t})}))):o.selector={},o.index){var i=(r=o.index,Array.isArray(r)?r.slice(0):[r]);i.includes(n)||i.push(n),o.index=i}if(o.sort){var s=o.sort.find((e=>{return t=e,Object.keys(t)[0]===n;var t}));s||(o.sort=o.sort.slice(0),o.sort.push({[n]:"asc"}))}else if(o.index)o.sort=o.index.map((e=>({[e]:"asc"})));else{if(e.indexes){var a=new Set;Object.entries(o.selector).forEach((([e,t])=>{("object"!=typeof t||null===t||Object.keys(t).find((e=>D.has(e))))&&a.add(e)}));var c,u=-1;e.indexes.forEach((e=>{var t=j(e)?e:[e],n=t.findIndex((e=>!a.has(e)));n>0&&n>u&&(u=n,c=t)})),c&&(o.sort=c.map((e=>({[e]:"asc"}))))}if(!o.sort)if(e.indexes&&e.indexes.length>0){var l=e.indexes[0],f=j(l)?l:[l];o.sort=f.map((e=>({[e]:"asc"})))}else o.sort=[{[n]:"asc"}]}return o}function Kt(e,t){if(!t.sort)throw d("SNH",{query:t});var n,r=(n=t.selector,Bt||(Ne("pipeline",{$sort:We,$project:ze}),Ne("query",{$and:gt,$eq:Ot,$elemMatch:At,$exists:Tt,$gt:It,$gte:Et,$in:kt,$lt:jt,$lte:Pt,$ne:_t,$nin:$t,$mod:Nt,$nor:xt,$not:St,$or:wt,$regex:Dt,$size:Mt,$type:Ct}),Bt=!0),new Ye(n));return e=>r.test(e)}function Lt(e,t,n,r,o,i,s){for(var a,c=!!e.schema.attachments,u=[],l=[],f=[],h={id:function(e=10){for(var t="",n=0;n0,w=r.length,x=function(){var e,o=r[O],h=o.document,p=o.previous,w=h[t],x=h._deleted,I=p&&p._deleted,E=void 0;if(g&&(E=n.get(w)),E){var k=E._rev;if(!p||p&&k!==p._rev){var j={isError:!0,status:409,documentId:w,writeRow:o,documentInDb:E};return f.push(j),1}var P=c?qt(o):o;c&&(x?p&&Object.keys(p._attachments).forEach((e=>{y.push({documentId:w,attachmentId:e,digest:S(p)._attachments[e].digest})})):(Object.entries(h._attachments).find((([t,n])=>((p?p._attachments[t]:void 0)||n.data||(e={documentId:w,documentInDb:E,isError:!0,status:510,writeRow:o,attachmentId:t}),!0))),e||Object.entries(h._attachments).forEach((([e,t])=>{var n=p?p._attachments[e]:void 0;if(n){var r=P.document._attachments[e].digest;t.data&&n.digest!==r&&b.push({documentId:w,attachmentId:e,attachmentData:t,digest:t.digest})}else v.push({documentId:w,attachmentId:e,attachmentData:t,digest:t.digest})})))),e?f.push(e):(c?(l.push(qt(P)),s&&s(h)):(l.push(P),s&&s(h)),a=P);var _=null,$=null,N=null;if(I&&!x)N="INSERT",_=c?zt(h):h;else if(!p||I||x){if(!x)throw d("SNH",{args:{writeRow:o}});N="DELETE",_=S(h),$=p}else N="UPDATE",_=c?zt(h):h,$=p;var D={documentId:w,documentData:_,previousDocumentData:$,operation:N};m.push(D)}else{var A=!!x;if(c&&Object.entries(h._attachments).forEach((([t,n])=>{n.data?v.push({documentId:w,attachmentId:t,attachmentData:n,digest:n.digest}):(e={documentId:w,isError:!0,status:510,writeRow:o,attachmentId:t},f.push(e))})),e||(c?(u.push(qt(o)),i&&i(h)):(u.push(o),i&&i(h)),a=o),!A){var M={documentId:w,operation:"INSERT",documentData:c?zt(h):h,previousDocumentData:c&&p?zt(p):p};m.push(M)}}},O=0;O{var r,o,i;t._attachments[e]=(i=(r=n).data)?{length:(o=i,atob(o).length),digest:r.digest,type:r.type}:r})),t}async function Ft(e,t,n){if(e.getChangedDocumentsSince)return e.getChangedDocumentsSince(t,n);var r=x(e.schema.primaryKey),o=function(e,t){if(!t.sort)throw d("SNH",{query:t});return{query:t,queryPlan:N(e,t)}}(e.schema,function(e,t,n){var r=x(e.schema.primaryKey),o=n?n.lwt:1,i=n?n.id:"";return Rt(e.schema,{selector:{$or:[{"_meta.lwt":{$gt:o}},{"_meta.lwt":{$eq:o},[r]:{$gt:n?i:""}}],"_meta.lwt":{$gte:o}},sort:[{"_meta.lwt":"asc"},{[r]:"asc"}],skip:0,limit:t})}(e,t,n)),i=(await e.query(o)).documents,s=k(i);return{documents:i,checkpoint:s?{id:s[r],lwt:s._meta.lwt}:n||{id:"",lwt:0}}}new WeakMap,new WeakMap;var Ut="16.17.2",Wt="16.17.2";function Vt(e,t){var n=e.get(t);if(void 0===n)throw new Error("missing value from map "+t);return n}function Ht(e,t,n,r){var o=e.get(t);return void 0===o?(o=n(),e.set(t,o)):r&&r(o),o}function Jt(e=0){return new Promise((t=>setTimeout(t,e)))}Promise.resolve(!0);var Gt=Promise.resolve(!1),Yt=(Promise.resolve(null),Promise.resolve());function Qt(e=1e4){return"function"==typeof requestIdleCallback?new Promise((t=>{requestIdleCallback((()=>t()),{timeout:e})})):Jt(0)}function Xt(e,t){var n=t.map((t=>{var n=w(e,t);if(!n)throw new Error("not in schema: "+t);var r,o=n.type;"number"!==o&&"integer"!==o||(r=Zt(n));var i,s=O(t),a=n.maxLength?n.maxLength:0;return i="string"===o?e=>{var t=s(e);return t||(t=""),t.padEnd(a," ")}:"boolean"===o?e=>s(e)?"1":"0":e=>{var t=s(e);return en(r,t)},{fieldName:t,schemaPart:n,parsedLengths:r,getValue:s,getIndexStringPart:i}}));return n}function Zt(e){var t=Math.floor(e.minimum),n=Math.ceil(e.maximum),r=e.multipleOf,o=(n-t).toString().length,i=r.toString().split("."),s=0;return i.length>1&&(s=i[1].length),{minimum:t,maximum:n,nonDecimals:o,decimals:s,roundedMinimum:t}}function en(e,t){void 0===t&&(t=0),te.maximum&&(t=e.maximum);var n=(Math.floor(t)-e.roundedMinimum).toString().padStart(e.nonDecimals,"0");if(e.decimals>0){var r=t.toString().split(".");n+=(r.length>1?r[1]:"0").padEnd(e.decimals,"0")}return n}function tn(e,t,n){var r="";return t.forEach(((t,o)=>{var i=w(e,t),s=n[o],a=i.type;switch(a){case"string":var c=S(i.maxLength,"maxLength not set");r+="string"==typeof s?s.padEnd(c," "):"".padEnd(c," ");break;case"boolean":r+=null===s||s===$?"0":s===_||s?"1":"0";break;case"number":case"integer":var u=Zt(i);if(null===s||s===$)r+="0".repeat(u.nonDecimals+u.decimals);else if(s===_)r+=en(u,u.maximum);else{var l=en(u,s);r+=l}break;default:throw new Error("unknown index type "+a)}})),r}function nn(e,t,n){var r="";return t.forEach(((t,o)=>{var i=w(e,t),s=n[o],a=i.type;switch(a){case"string":var c=S(i.maxLength,"maxLength not set");r+="string"==typeof s&&s!==_?s.padEnd(c," "):"".padEnd(c,s===$?" ":_);break;case"boolean":r+=null===s||s?"1":"0";break;case"number":case"integer":var u=Zt(i);r+=null===s||s===_?"9".repeat(u.nonDecimals+u.decimals):s===$?"0".repeat(u.nonDecimals+u.decimals):en(u,s);break;default:throw new Error("unknown index type "+a)}})),r}function rn(e){return e.join("||")}var on=["_deleted","_meta.lwt"];function sn(e,t){var n=rn(t);return Vt(e.indexIdByName,n)}rn(on);var an={locale:null,unique:!1};function cn(e,t,n,r){for(var o={i:n,d:r,i0:void 0,i1:void 0,i2:void 0,i3:void 0,i4:void 0,i5:void 0,i6:void 0,i7:void 0},i=0;iArray.isArray(e)?e.slice(0):[e])):[];n.push(on);var r=new Map;return n.forEach(((n,o)=>{var i="i"+o,s=rn(n);if(r.has(s))throw new Error("duplicate index "+s+" "+JSON.stringify(e,null,4));r.set(s,i),t[i]=function(e,t){var n=Xt(e,t),r=n.length,o=n.map((e=>e.getIndexStringPart));return function(e){for(var t="",n=0;nYt));return n=S(n).then((()=>t())),pn.set(e,n),n}function vn(e,t){t.onversionchange=n=>{e.closed||(t.close(),e.creationPromise=e.refreshIDBDatabase())}}async function yn(e,t,n,r){var o=await Ht(e.indexedDBStates,n.databaseName,(()=>async function(e,t,n){var r=dn++,o=await function(e,t){return"function"==typeof t?t(e):t}(e,n.indexedDB),i=async()=>(await Jt(0),mn(e.databaseName,(()=>new Promise(((t,n)=>{var i=o.open(e.databaseName);i.onerror=function(t){console.error(r+": OPEN IDB DATABASE "+e.databaseName+" ERROR"),n(t)},i.onsuccess=function(e){var n=i.result;t(n),vn(s,n)},wn(s,i)}))))),s={indexedDB:o,debugId:r,closed:!1,storage:t,settings:n,refreshIDBDatabase:i,creationPromise:i(),name:e.databaseName,refCount:0,storesToOpen:[]};return s}(n,e,t)));return o.storesToOpen=o.storesToOpen.concat(r),o.refCount=o.refCount+1,o.creationPromise.then((()=>bn(S(o)))).then((()=>S(o)))}async function bn(e){if(0!==e.storesToOpen.length)return e.creationPromise=e.creationPromise.then((async t=>{var n=new Set(Array.from(t.objectStoreNames));if(0===e.storesToOpen.filter((e=>!n.has(gn(e.collectionName,e.schema).documentStore))).length)return t;var r=t.version+1;return t.close(),mn(e.name,(()=>new Promise(((t,n)=>{var o=e.indexedDB.open(e.name,r);o.onerror=function(t){console.error(e.debugId+": ERROR openStoresOnExistingDatabase() openRequest: error "),n(t)},o.onsuccess=function(n){var r=o.result;vn(e,r),t(r)},o.onblocked=e=>{},wn(e,o)}))))})),e.creationPromise}function gn(e,t){var n=t.version;return{documentStore:e+"-"+n+"-documents",writeAheadStore:e+"-"+n+"-wal",attachmentsStore:e+"-"+n+"-attachments"}}function wn(e,t){t.onupgradeneeded=function(n){var r=t.result;e.storesToOpen.forEach((e=>{var t=r.objectStoreNames,n=gn(e.collectionName,e.schema);if(!t.contains(n.documentStore)){var o=r.createObjectStore(n.documentStore,{keyPath:"i",autoIncrement:!1});r.createObjectStore(n.writeAheadStore,{keyPath:"i",autoIncrement:!1}),function(e,t){t.indexIds.forEach((t=>{e.createIndex(t,t,an)}))}(o,e),e.schema.attachments&&r.createObjectStore(n.attachmentsStore,{keyPath:"docIdWithAttachmentId",autoIncrement:!1})}})),e.storesToOpen=[]}}function xn(e){if(e.closed)throw new Error("RxStorageInstanceIndexedDB is closed "+e.databaseName+"-"+e.collectionName)}async function Sn(e,t){var n=e.primaryPath,r=e.internals.indexIds.length,o=e.internals.getIndexableStringByIndexNumber,i=t.objectStore(e.internals.storeNames.writeAheadStore),s=await new Promise(((e,t)=>{var n=i.get("documents");n.onerror=t,n.onsuccess=t=>{var r=n.result;e(r?JSON.parse(r.docsData):void 0)}}));if(s&&s.length>0){for(var a,c=t.objectStore(e.internals.storeNames.documentStore),u=0;u{a.onerror=t,a.onsuccess=()=>e(!0)})),i.delete("documents")}return t}async function On(e){var t,n=[e.internals.storeNames.documentStore,e.internals.storeNames.writeAheadStore];e.schema.attachments&&n.push(e.internals.storeNames.attachmentsStore);for(var r=100;r>0;){var o=await e.internals.state.creationPromise;r-=1;try{t=o.transaction(n,"readwrite",ln);break}catch(t){if("InvalidStateError"!==t.name&&"NotFoundError"!==t.name||!(r>0))throw t;"NotFoundError"===t.name?await bn(e.internals.state):e.internals.state.creationPromise=e.internals.state.refreshIDBDatabase()}}return await Sn(e,S(t)),S(t)}var In=function(){function e(e){this.allTasksRuns=[],this.instance=e,this.txPromise=On(this.instance).then((t=>Sn(e,t)))}return e.prototype.addTask=function(e){var t=this.txPromise.then((t=>e(t))),n=t.catch((()=>null));this.allTasksRuns.push(n);var r=this.allTasksRuns.length;return n.then((()=>Promise.all(this.allTasksRuns))).then((()=>{this.allTasksRuns.length===r&&(this.instance.openReadonlyTransaction=void 0)})),t.catch((t=>{if("TransactionInactiveError"===t.name)return this.instance.openReadonlyTransaction=void 0,En(this.instance,e);throw t}))},e}();function En(e,t){return e.openReadonlyTransaction||(e.openReadonlyTransaction=new In(e)),e.openReadonlyTransaction.addTask(t)}var kn=0;function jn(){var e=Date.now();(e+=.01)<=kn&&(e=kn+.01);var t=parseFloat(e.toFixed(2));return kn=t,t}var Pn=function(e,t){return Pn=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},Pn(e,t)};function _n(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}Pn(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}function $n(e,t,n,r){return new(n||(n=Promise))((function(o,i){function s(e){try{c(r.next(e))}catch(e){i(e)}}function a(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((r=r.apply(e,t||[])).next())}))}function Nn(e,t){var n,r,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},s=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return s.next=a(0),s.throw=a(1),s.return=a(2),"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(a){return function(c){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;s&&(s=0,a[0]&&(i=0)),i;)try{if(n=1,r&&(o=2&a[0]?r.return:a[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,a[1])).done)return o;switch(r=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return i.label++,{value:a[1],done:!1};case 5:i.label++,r=a[1],a=[0];continue;case 7:a=i.ops.pop(),i.trys.pop();continue;default:if(!((o=(o=i.trys).length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function An(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)s.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return s}function Mn(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o1||a(e,t)}))},t&&(r[e]=t(r[e])))}function a(e,t){try{(n=o[e](t)).value instanceof Tn?Promise.resolve(n.value.v).then(c,u):l(i[0][2],n)}catch(e){l(i[0][3],e)}var n}function c(e){a("next",e)}function u(e){a("throw",e)}function l(e,t){e(t),i.shift(),i.length&&a(i[0][0],i[0][1])}}function Bn(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=Dn(e),t={},r("next"),r("throw"),r("return"),t[Symbol.asyncIterator]=function(){return this},t);function r(n){t[n]=e[n]&&function(t){return new Promise((function(r,o){!function(e,t,n,r){Promise.resolve(r).then((function(t){e({value:t,done:n})}),t)}(r,o,(t=e[n](t)).done,t.value)}))}}}function Rn(e){return"function"==typeof e}function Kn(e){var t=e((function(e){Error.call(e),e.stack=(new Error).stack}));return t.prototype=Object.create(Error.prototype),t.prototype.constructor=t,t}Object.create,Object.create,"function"==typeof SuppressedError&&SuppressedError;var Ln=Kn((function(e){return function(t){e(this),this.message=t?t.length+" errors occurred during unsubscription:\n"+t.map((function(e,t){return t+1+") "+e.toString()})).join("\n "):"",this.name="UnsubscriptionError",this.errors=t}}));function qn(e,t){if(e){var n=e.indexOf(t);0<=n&&e.splice(n,1)}}var zn=function(){function e(e){this.initialTeardown=e,this.closed=!1,this._parentage=null,this._finalizers=null}var t;return e.prototype.unsubscribe=function(){var e,t,n,r,o;if(!this.closed){this.closed=!0;var i=this._parentage;if(i)if(this._parentage=null,Array.isArray(i))try{for(var s=Dn(i),a=s.next();!a.done;a=s.next())a.value.remove(this)}catch(t){e={error:t}}finally{try{a&&!a.done&&(t=s.return)&&t.call(s)}finally{if(e)throw e.error}}else i.remove(this);var c=this.initialTeardown;if(Rn(c))try{c()}catch(e){o=e instanceof Ln?e.errors:[e]}var u=this._finalizers;if(u){this._finalizers=null;try{for(var l=Dn(u),f=l.next();!f.done;f=l.next()){var d=f.value;try{Wn(d)}catch(e){o=null!=o?o:[],e instanceof Ln?o=Mn(Mn([],An(o)),An(e.errors)):o.push(e)}}}catch(e){n={error:e}}finally{try{f&&!f.done&&(r=l.return)&&r.call(l)}finally{if(n)throw n.error}}}if(o)throw new Ln(o)}},e.prototype.add=function(t){var n;if(t&&t!==this)if(this.closed)Wn(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=null!==(n=this._finalizers)&&void 0!==n?n:[]).push(t)}},e.prototype._hasParent=function(e){var t=this._parentage;return t===e||Array.isArray(t)&&t.includes(e)},e.prototype._addParent=function(e){var t=this._parentage;this._parentage=Array.isArray(t)?(t.push(e),t):t?[t,e]:e},e.prototype._removeParent=function(e){var t=this._parentage;t===e?this._parentage=null:Array.isArray(t)&&qn(t,e)},e.prototype.remove=function(t){var n=this._finalizers;n&&qn(n,t),t instanceof e&&t._removeParent(this)},e.EMPTY=((t=new e).closed=!0,t),e}(),Fn=zn.EMPTY;function Un(e){return e instanceof zn||e&&"closed"in e&&Rn(e.remove)&&Rn(e.add)&&Rn(e.unsubscribe)}function Wn(e){Rn(e)?e():e.unsubscribe()}var Vn={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1},Hn={setTimeout:function(e,t){for(var n=[],r=2;r0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(t){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,t)},t.prototype._subscribe=function(e){return this._throwIfClosed(),this._checkFinalizedStatuses(e),this._innerSubscribe(e)},t.prototype._innerSubscribe=function(e){var t=this,n=this,r=n.hasError,o=n.isStopped,i=n.observers;return r||o?Fn:(this.currentObservers=null,i.push(e),new zn((function(){t.currentObservers=null,qn(i,e)})))},t.prototype._checkFinalizedStatuses=function(e){var t=this,n=t.hasError,r=t.thrownError,o=t.isStopped;n?e.error(r):o&&e.complete()},t.prototype.asObservable=function(){var e=new fr;return e.source=this,e},t.create=function(e,t){return new mr(e,t)},t}(fr),mr=function(e){function t(t,n){var r=e.call(this)||this;return r.destination=t,r.source=n,r}return _n(t,e),t.prototype.next=function(e){var t,n;null===(n=null===(t=this.destination)||void 0===t?void 0:t.next)||void 0===n||n.call(t,e)},t.prototype.error=function(e){var t,n;null===(n=null===(t=this.destination)||void 0===t?void 0:t.error)||void 0===n||n.call(t,e)},t.prototype.complete=function(){var e,t;null===(t=null===(e=this.destination)||void 0===e?void 0:e.complete)||void 0===t||t.call(e)},t.prototype._subscribe=function(e){var t,n;return null!==(n=null===(t=this.source)||void 0===t?void 0:t.subscribe(e))&&void 0!==n?n:Fn},t}(pr);function vr(e){return function(t){if(function(e){return Rn(null==e?void 0:e.lift)}(t))return t.lift((function(t){try{return e(t,this)}catch(e){this.error(e)}}));throw new TypeError("Unable to lift unknown Observable type")}}var yr=Array.isArray;function br(e,t,n,r,o){return new gr(e,t,n,r,o)}var gr=function(e){function t(t,n,r,o,i,s){var a=e.call(this,t)||this;return a.onFinalize=i,a.shouldUnsubscribe=s,a._next=n?function(e){try{n(e)}catch(e){t.error(e)}}:e.prototype._next,a._error=o?function(e){try{o(e)}catch(e){t.error(e)}finally{this.unsubscribe()}}:e.prototype._error,a._complete=r?function(){try{r()}catch(e){t.error(e)}finally{this.unsubscribe()}}:e.prototype._complete,a}return _n(t,e),t.prototype.unsubscribe=function(){var t;if(!this.shouldUnsubscribe||this.shouldUnsubscribe()){var n=this.closed;e.prototype.unsubscribe.call(this),!n&&(null===(t=this.onFinalize)||void 0===t||t.call(this))}},t}(er),wr=function(e){return e&&"number"==typeof e.length&&"function"!=typeof e};function xr(e){return Rn(null==e?void 0:e.then)}function Sr(e){return Rn(e[cr])}function Or(e){return Symbol.asyncIterator&&Rn(null==e?void 0:e[Symbol.asyncIterator])}function Ir(e){return new TypeError("You provided "+(null!==e&&"object"==typeof e?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}var Er="function"==typeof Symbol&&Symbol.iterator?Symbol.iterator:"@@iterator";function kr(e){return Rn(null==e?void 0:e[Er])}function jr(e){return Cn(this,arguments,(function(){var t,n,r;return Nn(this,(function(o){switch(o.label){case 0:t=e.getReader(),o.label=1;case 1:o.trys.push([1,,9,10]),o.label=2;case 2:return[4,Tn(t.read())];case 3:return n=o.sent(),r=n.value,n.done?[4,Tn(void 0)]:[3,5];case 4:return[2,o.sent()];case 5:return[4,Tn(r)];case 6:return[4,o.sent()];case 7:return o.sent(),[3,2];case 8:return[3,10];case 9:return t.releaseLock(),[7];case 10:return[2]}}))}))}function Pr(e){return Rn(null==e?void 0:e.getReader)}function _r(e){if(e instanceof fr)return e;if(null!=e){if(Sr(e))return o=e,new fr((function(e){var t=o[cr]();if(Rn(t.subscribe))return t.subscribe(e);throw new TypeError("Provided object does not correctly implement Symbol.observable")}));if(wr(e))return r=e,new fr((function(e){for(var t=0;t{this._to=!1,function(e){const t=Hr()-e.ttl,n=e.map[Symbol.iterator]();for(;;){const r=n.next().value;if(!r)return;const o=r[0];if(!(r[1]0&&void 0!==arguments[0]?arguments[0]:{},t=JSON.parse(JSON.stringify(e));return void 0===t.webWorkerSupport&&(t.webWorkerSupport=!0),t.idb||(t.idb={}),t.idb.ttl||(t.idb.ttl=45e3),t.idb.fallbackInterval||(t.idb.fallbackInterval=150),e.idb&&"function"==typeof e.idb.onclose&&(t.idb.onclose=e.idb.onclose),t.localstorage||(t.localstorage={}),t.localstorage.removeTimeout||(t.localstorage.removeTimeout=6e4),e.methods&&(t.methods=e.methods),t.node||(t.node={}),t.node.ttl||(t.node.ttl=12e4),t.node.maxParallelWrites||(t.node.maxParallelWrites=2048),void 0===t.node.useFastPath&&(t.node.useFastPath=!0),t}var Gr="messages",Yr={durability:"relaxed"};function Qr(){if("undefined"!=typeof indexedDB)return indexedDB;if("undefined"!=typeof window){if(void 0!==window.mozIndexedDB)return window.mozIndexedDB;if(void 0!==window.webkitIndexedDB)return window.webkitIndexedDB;if(void 0!==window.msIndexedDB)return window.msIndexedDB}return!1}function Xr(e){e.commit&&e.commit()}function Zr(e,t){var n=e.transaction(Gr,"readonly",Yr),r=n.objectStore(Gr),o=[],i=IDBKeyRange.bound(t+1,1/0);if(r.getAll){var s=r.getAll(i);return new Promise((function(e,t){s.onerror=function(e){return t(e)},s.onsuccess=function(t){e(t.target.result)}}))}return new Promise((function(e,s){var a=function(){try{return i=IDBKeyRange.bound(t+1,1/0),r.openCursor(i)}catch(e){return r.openCursor()}}();a.onerror=function(e){return s(e)},a.onsuccess=function(r){var i=r.target.result;i?i.value.ide.lastCursorId&&(e.lastCursorId=t.id),t})).filter((function(t){return function(e,t){return!(e.uuid===t.uuid||t.eMIs.has(e.id)||e.data.time0||e._addEL.internal.length>0}function go(e,t,n){e._addEL[t].push(n),function(e){if(!e._iL&&bo(e)){var t=function(t){e._addEL[t.type].forEach((function(e){t.time>=e.time&&e.fn(t.data)}))},n=e.method.microSeconds();e._prepP?e._prepP.then((function(){e._iL=!0,e.method.onMessage(e._state,t,n)})):(e._iL=!0,e.method.onMessage(e._state,t,n))}}(e)}function wo(e,t,n){e._addEL[t]=e._addEL[t].filter((function(e){return e!==n})),function(e){if(e._iL&&!bo(e)){e._iL=!1;var t=e.method.microSeconds();e.method.onMessage(e._state,null,t)}}(e)}vo._pubkey=!0,vo.prototype={postMessage:function(e){if(this.closed)throw new Error("BroadcastChannel.postMessage(): Cannot post message after channel has closed "+JSON.stringify(e));return yo(this,"message",e)},postInternal:function(e){return yo(this,"internal",e)},set onmessage(e){var t={time:this.method.microSeconds(),fn:e};wo(this,"message",this._onML),e&&"function"==typeof e?(this._onML=t,go(this,"message",t)):this._onML=null},addEventListener:function(e,t){go(this,e,{time:this.method.microSeconds(),fn:t})},removeEventListener:function(e,t){wo(this,e,this._addEL[e].find((function(e){return e.fn===t})))},close:function(){var e=this;if(!this.closed){po.delete(this),this.closed=!0;var t=this._prepP?this._prepP:Lr;return this._onML=null,this._addEL.message=[],t.then((function(){return Promise.all(Array.from(e._uMP))})).then((function(){return Promise.all(e._befC.map((function(e){return e()})))})).then((function(){return e.method.close(e._state)}))}},get type(){return this.method.type},get isClosed(){return this.closed}};var xo=new Map;function So(e,t){var n=xo.get(e);if(n)return n.refs.delete(t),0===n.refs.size?(xo.delete(e),n.bc.close()):void 0}function Oo(e,t,n,r){if(t.multiInstance){var o=r||function(e,t,n,r){var o=xo.get(t);return o||(o={bc:new vo(["RxDB:",e,n].join("|")),refs:new Set},xo.set(t,o)),o.refs.add(r),o.bc}(e,t.databaseInstanceToken,n.databaseName,n),i=new pr,s=n=>{n.storageName===e&&n.databaseName===t.databaseName&&n.collectionName===t.collectionName&&n.version===t.schema.version&&i.next(n.eventBulk)};o.addEventListener("message",s);var a=n.changeStream(),c=!1,u=a.subscribe((n=>{c||o.postMessage({storageName:e,databaseName:t.databaseName,collectionName:t.collectionName,version:t.schema.version,eventBulk:n})}));n.changeStream=function(){return i.asObservable().pipe(function(){for(var e=[],t=0;t{var r=t.queryPlan,o=t.query,i=o.skip?o.skip:0,s=i+(o.limit?o.limit:1/0),a=e.internals.storeNames.documentStore,c=e.settings.batchSize?e.settings.batchSize:50,u=!1;r.selectorSatisfiedByIndex||(u=Kt(e.schema,o));var l=r.index,f=!r.sortSatisfiedByIndex,h=l,p=r.startKeys,m=tn(e.schema,h,p),v=r.endKeys,y=nn(e.schema,h,v),b=[],g=n.objectStore(a),w=sn(e.internals,h),x=g.index(w);u||t.query.limit||(c=1e5);var S=!1;if(await async function(e,t,n,r,o,i,s,a){var c=e.settings.IDBKeyRange?e.settings.IDBKeyRange:IDBKeyRange,u=e.internals.getIndexableStringByIndexId[s];if("function"==typeof n.getAll&&1!==r)for(var l,f=!0,d=!1,h=async function(){l&&(o=u(l.d));var e=c.bound(o,i,!f||!t.inclusiveStart,!t.inclusiveEnd);f=!1;var s=n.getAll(e,r);await new Promise(((e,t)=>{s.onerror=t,s.onsuccess=t=>{var n=t.target.result;l=k(n),0!==n.length&&!1===a(n)&&(d=!0),n.length{m.onsuccess=function(t){var n=t.target.result;if(n){var r=n.value;a([r])?n.continue():e()}else e()}}))}}(e,r,x,c,m,y,w,(e=>{for(var t=0;t{var t=Object.keys(e)[0],r=Object.values(e)[0];n.push({key:t,direction:r,getValueFn:O(t)})})),(e,t)=>{for(var r=0;r30&&!await function(e,t){var n=(e.settings.IDBKeyRange?e.settings.IDBKeyRange:IDBKeyRange).lowerBound($,!0),r=t.getKey(n);return new Promise((e=>{r.onsuccess=()=>{e(!!r.result)}}))}(e,u)?new Map:await function(e,t,n){var r=n.length,o=new Map;if(0===r)return Promise.resolve(o);for(var i=new Array(r),s=0;s{u.onerror=n,u.onsuccess=()=>{for(var n=0;n0){var w=c.objectStore(o.storeNames.writeAheadStore).put({i:"documents",docsData:JSON.stringify(h)});await new Promise(((e,t)=>{w.onerror=t,w.onsuccess=e})),e.handleWalIdlePromise||Jt(100).then((()=>Qt())).then((async()=>{e.handleWalIdlePromise=void 0,e.closed||await En(e,(()=>Gt))}))}if(e.schema.attachments){var x=c.objectStore(e.internals.storeNames.attachmentsStore);l.attachmentsAdd.forEach((e=>{v=x.put({docIdWithAttachmentId:hn(e.documentId,e.attachmentId),length:e.attachmentData.length,type:e.attachmentData.type,data:e.attachmentData.data})})),l.attachmentsUpdate.forEach((e=>{v=x.put({docIdWithAttachmentId:hn(e.documentId,e.attachmentId),length:e.attachmentData.length,type:e.attachmentData.type,data:e.attachmentData.data})})),l.attachmentsRemove.forEach((e=>{v=x.delete(hn(e.documentId,e.attachmentId))}))}if(v&&await new Promise(((e,t)=>{S(v).onerror=t,S(v).onsuccess=e})),c.commit&&c.commit(),l.eventBulk.events.length>0){var O=S(l.newestRow).document;l.eventBulk.checkpoint={id:O[r],lwt:O._meta.lwt},e.changes$.next(l.eventBulk)}return{error:f}}var ko=jn(),jo=function(){function e(e,t,n,r,o,i,s){this.changes$=new pr,this.instanceId=ko++,this.storage=e,this.databaseName=t,this.collectionName=n,this.schema=r,this.internals=o,this.options=i,this.settings=s,this.primaryPath=x(this.schema.primaryKey)}var t=e.prototype;return t.updateMinKnownDocs=function(e){this.internals.minKnownDocsAmountfunction(e,t,n){var r=t.length;if(0===r)return Promise.resolve([]);for(var o=new Array(r),i=0;i{c.onerror=t,c.onsuccess=()=>{for(var t=0;t{var r,o=t.queryPlan,i=e.internals.storeNames.documentStore,s=o.index,a=s,c=o.startKeys,u=tn(e.schema,a,c),l=o.endKeys,f=nn(e.schema,a,l),d=n.objectStore(i);r=1===s.length&&s[0]===e.primaryPath?sn(e.internals,["_deleted",e.primaryPath]):sn(e.internals,a);var h=d.index(r),p=(e.settings.IDBKeyRange?e.settings.IDBKeyRange:IDBKeyRange).bound(u,f,!o.inclusiveStart,!o.inclusiveEnd),m=h.count(p);return{count:await new Promise(((e,t)=>{m.onsuccess=function(){e(m.result)},m.onerror=t})),mode:"fast"}}))}(this,e);return this.updateMinKnownDocs(t.count),t}var n=await Io(this,e);return this.updateMinKnownDocs(n.documents.length),{count:n.documents.length,mode:"slow"}},t.changeStream=function(){return this.changes$.asObservable()},t.cleanup=async function(e){await Jt(0),await Jt(0);var t=this.internals.state;await t.creationPromise;var n=this.settings.IDBKeyRange;xn(this);var r=(await On(this)).objectStore(this.internals.storeNames.documentStore),o=this.settings.batchSize,i=jn()-e,s=sn(this.internals,on),a=r.index(s),c=tn(this.schema,on,[!0,1]),u=nn(this.schema,on,[!0,i]),l=n.bound(c,u,!0,!0),f=await new Promise(((e,t)=>{var n=a.getAll(l,o);n.onerror=t,n.onsuccess=function(t){e(t.target.result)}}));return await Promise.all(f.map((e=>new Promise(((t,n)=>{var o=e.i,i=r.delete(o);i.onerror=n,i.onsuccess=()=>t()}))))),f.length{var t=[e.objectStore(this.internals.storeNames.documentStore),e.objectStore(this.internals.storeNames.writeAheadStore)];return this.schema.attachments&&t.push(e.objectStore(this.internals.storeNames.attachmentsStore)),await Promise.all(t.map((e=>new Promise(((t,n)=>{var r=e.clear();r.onerror=n,r.onsuccess=t}))))),this.close()}))},t.getAttachmentData=async function(e,t){var n=this.internals.state;return await n.creationPromise,xn(this),En(this,(n=>{var r=n.objectStore(this.internals.storeNames.attachmentsStore),o=hn(e,t);return new Promise(((n,i)=>{var s=r.get(o);s.onsuccess=()=>{var r=s.result;r?n(r.data):i("attachment missing documentId: "+e+" attachmentId: "+t)}}))}))},t.close=async function(){return this.closed||(this.closed=(async()=>(await this.internals.state.creationPromise,await En(this,(async e=>{})),this.changes$.complete(),async function(e){if(!e.closed&&(e.refCount=e.refCount-1,0===e.refCount))return e.closed=!0,e.storage.indexedDBStates.delete(e.name),e.creationPromise.then((e=>e.close()))}(this.internals.state)))()),this.closed},e}(),Po=function(){function e(e){this.name=fn,this.rxdbVersion=Wt,this.indexedDBStates=new Map,this.settings=e}return e.prototype.createStorageInstance=function(e){return function(e){if(e.schema.keyCompression)throw d("UT5",{args:{params:e}});if((t=e.schema).encrypted&&t.encrypted.length>0||t.attachments&&t.attachments.encrypted)throw d("UT6",{args:{params:e}});var t;if(e.schema.attachments&&e.schema.attachments.compression)throw d("UT7",{args:{params:e}})}(e),async function(e,t,n){var r=un(t.schema),o=Array.from(r.indexIdByName.values()),i=await yn(e,n,t,[{collectionName:t.collectionName,schema:t.schema,indexIds:o}]);await i.creationPromise;var s={state:i,storeNames:gn(t.collectionName,t.schema),getIndexableStringByIndexId:r.monadByIndexId,getIndexableStringByIndexNumber:Object.values(r.monadByIndexId),indexIdByName:r.indexIdByName,indexNames:Object.keys(r),indexIds:o,minKnownDocsAmount:0},a=new jo(e,t.databaseName,t.collectionName,t.schema,s,t.options,n);return await Oo(fn,t,a),a}(this,e,Object.assign({},this.settings,e.options))},e}();function _o(e,t){return vr((function(n,r){var o=0;n.subscribe(br(r,(function(n){return e.call(t,n,o++)&&r.next(n)})))}))}function $o(e,t){if(e===t)return!0;if(e&&t&&"object"==typeof e&&"object"==typeof t){if(e.constructor!==t.constructor)return!1;var n,r;if(Array.isArray(e)){if((n=e.length)!==t.length)return!1;for(r=n;0!=r--;)if(!$o(e[r],t[r]))return!1;return!0}if(e.constructor===RegExp)return e.source===t.source&&e.flags===t.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===t.toString();var o=Object.keys(e);if((n=o.length)!==Object.keys(t).length)return!1;for(r=n;0!=r--;)if(!Object.prototype.hasOwnProperty.call(t,o[r]))return!1;for(r=n;0!=r--;){var i=o[r];if(!$o(e[i],t[i]))return!1}return!0}return e!=e&&t!=t}function No(e,t){return{connectionId:e.connectionId,answerTo:e.requestId,method:e.method,error:(n=t,{name:n.name,message:n.message,rxdb:n.rxdb,parameters:n.parameters,extensions:n.extensions,code:n.code,url:n.url,stack:n.stack?n.stack.replace(/\n/g," \n "):void 0})};var n}function Do(e,t){return{connectionId:e.connectionId,answerTo:e.requestId,method:e.method,return:t}}!function(e){var t,n=new pr;if("undefined"!=typeof self&&"object"==typeof self.onconnect){var r=new Map;self.onconnect=e=>{var t=e.ports[0];t.onmessage=e=>{var o=e.data;r.set(o.connectionId,t),n.next(o)}},t={storage:e.storage,messages$:n,send(e){Vt(r,e.connectionId).postMessage(e)}}}else addEventListener("message",(e=>{var t=e.data;n.next(t)})),t={storage:e.storage,messages$:n,send(e){postMessage(e)}};!function(e){var t=new Map;function n(t){if(e.storage)return e.storage.createStorageInstance(t);if(e.database){var n=Array.from(e.database.storageInstances),r=t.collectionName,o=n.find((e=>e.collectionName===r));if(!o)throw console.dir(n),new Error("storageInstance does not exist "+JSON.stringify({collectionName:r}));var i=t.schema;if(!$o(i,o.schema))throw new Error("Wrong schema "+JSON.stringify({schema:i,existingSchema:o.schema}));return Promise.resolve(o)}throw new Error("no base given")}e.messages$.pipe(_o((e=>"custom"===e.method))).subscribe((async t=>{if(e.customRequestHandler)try{var n=await e.customRequestHandler(t.params);e.send(Do(t,n))}catch(n){e.send(No(t,n))}else e.send(No(t,new Error("Remote storage: cannot resolve custom request because settings.customRequestHandler is not set")))}));var r=e.fakeVersion?e.fakeVersion:Ut;e.messages$.pipe(_o((e=>"create"===e.method))).subscribe((async o=>{if(o.version===r){var i=o.connectionId;if(!Array.isArray(o.params)){var s=o.params,a=s.collectionName,c=[s.databaseName,s.collectionName,s.schema.version].join("|"),u=t.get(c);if(u){if(!$o(s.schema,u.params.schema))return void e.send(No(o,new Error("Remote storage: schema not equal to existing storage")))}else try{u={storageInstancePromise:n(s),connectionIds:new Set,params:s},t.set(c,u),await u.storageInstancePromise}catch(t){return void e.send(No(o,t))}u.connectionIds.add(o.connectionId);var l=[],f=await u.storageInstancePromise;l.push(f.changeStream().subscribe((t=>{var n={connectionId:i,answerTo:"changestream",method:"changeStream",return:t};e.send(n)})));var h=!1;if(e.database){var p=e.database,m=p.collections[a];m?m.onClose.push((()=>v())):p.onClose.push((()=>v()))}l.push(e.messages$.pipe(_o((e=>e.connectionId===i))).subscribe((async t=>{var n,r=t;if("create"!==r.method&&"custom"!==r.method&&Array.isArray(r.params))try{if("close"===r.method&&e.database)return void e.send(Do(r,null));if("close"===r.method&&S(u).connectionIds.size>1)return e.send(Do(r,null)),S(u).connectionIds.delete(i),void l.forEach((e=>e.unsubscribe()));n="getChangedDocumentsSince"!==r.method||f.getChangedDocumentsSince?await f[r.method](r.params[0],r.params[1],r.params[2],r.params[3]):await Ft(f,r.params[0],r.params[1]),"close"!==r.method&&"remove"!==r.method||v(),e.send(Do(r,n))}catch(t){e.send(No(r,t))}}))),e.send(Do(o,"ok"))}}else e.send(No(o,d("RM1",{args:{mainVersion:o.version,remoteVersion:r}})));function v(){h||(h=!0,l.forEach((e=>e.unsubscribe())),S(u).connectionIds.delete(i),t.delete(c))}}))}(t)}({storage:function(e={}){var t=e.IDBKeyRange?e.IDBKeyRange:IDBKeyRange,n=e.indexedDB?e.indexedDB:indexedDB,r=Object.assign({batchSize:300,transactionDurability:"relaxed"},e,{IDBKeyRange:t,indexedDB:n});return new Po(r)}({})})})(); \ No newline at end of file From 484e14e9ac845699662ebe0c96a1532fb582a9ab Mon Sep 17 00:00:00 2001 From: Paul Kilmurray Date: Thu, 21 Aug 2025 13:07:32 +0200 Subject: [PATCH 22/22] Add API endpoint for Product Brands --- includes/API.php | 1 + includes/API/Product_Brands_Controller.php | 200 +++++++++++++++++++++ 2 files changed, 201 insertions(+) create mode 100644 includes/API/Product_Brands_Controller.php diff --git a/includes/API.php b/includes/API.php index b88b86b..09e1d15 100644 --- a/includes/API.php +++ b/includes/API.php @@ -97,6 +97,7 @@ public function register_routes(): void { 'customers' => API\Customers_Controller::class, 'product_tags' => API\Product_Tags_Controller::class, 'product_categories' => API\Product_Categories_Controller::class, + 'product_brands' => API\Product_Brands_Controller::class, 'taxes' => API\Taxes_Controller::class, 'shipping_methods' => API\Shipping_Methods_Controller::class, 'tax_classes' => API\Tax_Classes_Controller::class, diff --git a/includes/API/Product_Brands_Controller.php b/includes/API/Product_Brands_Controller.php new file mode 100644 index 0000000..5d9cd98 --- /dev/null +++ b/includes/API/Product_Brands_Controller.php @@ -0,0 +1,200 @@ +wcpos_request = $request; + + add_filter( 'woocommerce_rest_prepare_product_brand', array( $this, 'wcpos_product_brands_response' ), 10, 3 ); + add_filter( 'woocommerce_rest_product_brand_query', array( $this, 'wcpos_product_brand_query' ), 10, 2 ); + + /* + * Check if the request is for all brands and if the 'posts_per_page' is set to -1. + * Optimised query for getting all brand IDs. + */ + if ( -1 == $request->get_param( 'posts_per_page' ) && null !== $request->get_param( 'fields' ) ) { + return $this->wcpos_get_all_posts( $request ); + } + + return $dispatch_result; + } + + /** + * Filter the brand response. + * + * @param WP_REST_Response $response The response object. + * @param object $item The original term object. + * @param WP_REST_Request $request Request object. + * + * @return WP_REST_Response $response The response object. + */ + public function wcpos_product_brands_response( WP_REST_Response $response, object $item, WP_REST_Request $request ): WP_REST_Response { + $data = $response->get_data(); + + // Make sure the term has a uuid + $data['uuid'] = $this->get_term_uuid( $item ); + + // Reset the new response data + $response->set_data( $data ); + + return $response; + } + + /** + * Filter the brand query. + * + * @param array $args Query arguments. + * @param WP_REST_Request $request Request object. + */ + public function wcpos_product_brand_query( array $args, WP_REST_Request $request ): array { + // Check for wcpos_include/wcpos_exclude parameter. + if ( isset( $request['wcpos_include'] ) || isset( $request['wcpos_exclude'] ) ) { + // Add a custom WHERE clause to the query. + add_filter( 'terms_clauses', array( $this, 'wcpos_terms_clauses_include_exclude' ), 10, 3 ); + } + + return $args; + } + + /** + * Filters the terms query SQL clauses. + * + * @param string[] $clauses { + * Associative array of the clauses for the query. + * + * @var string The SELECT clause of the query. + * @var string The JOIN clause of the query. + * @var string The WHERE clause of the query. + * @var string The DISTINCT clause of the query. + * @var string The ORDER BY clause of the query. + * @var string The ORDER clause of the query. + * @var string The LIMIT clause of the query. + * } + * + * @param string[] $taxonomies An array of taxonomy names. + * @param array $args An array of term query arguments. + * + * @return string[] $clauses + */ + public function wcpos_terms_clauses_include_exclude( array $clauses, array $taxonomies, array $args ) { + global $wpdb; + + // Handle 'wcpos_include' + if ( ! empty( $this->wcpos_request['wcpos_include'] ) ) { + $include_ids = array_map( 'intval', $this->wcpos_request['wcpos_include'] ); + $ids_format = implode( ',', array_fill( 0, \count( $include_ids ), '%d' ) ); + $clauses['where'] .= $wpdb->prepare( " AND t.term_id IN ($ids_format) ", $include_ids ); + } + + // Handle 'wcpos_exclude' + if ( ! empty( $this->wcpos_request['wcpos_exclude'] ) ) { + $exclude_ids = array_map( 'intval', $this->wcpos_request['wcpos_exclude'] ); + $ids_format = implode( ',', array_fill( 0, \count( $exclude_ids ), '%d' ) ); + $clauses['where'] .= $wpdb->prepare( " AND t.term_id NOT IN ($ids_format) ", $exclude_ids ); + } + + return $clauses; + } + + /** + * Returns array of all product brand ids. + * + * @param WP_REST_Request $request Full details about the request. + * + * @return WP_Error|WP_REST_Response + */ + public function wcpos_get_all_posts( $request ) { + // Start timing execution. + $start_time = microtime( true ); + $modified_after = $request->get_param( 'modified_after' ); + + $args = array( + 'taxonomy' => 'product_brand', + 'hide_empty' => false, + 'fields' => 'ids', + ); + + try { + /** + * @TODO - terms don't have a modified date, it would be good to add a term_meta for last_update + * - ideally WooCommerce would provide a modified_after filter for terms + * - for now we'll just return empty for modified terms + */ + $results = $modified_after ? array() : get_terms( $args ); + + // Format the response. + $formatted_results = array_map( + function ( $id ) { + return array( 'id' => (int) $id ); + }, + $results + ); + + // Get the total number of brands for the given criteria. + $total = \count( $formatted_results ); + + // Collect execution time and server load. + $execution_time = microtime( true ) - $start_time; + $execution_time_ms = number_format( $execution_time * 1000, 2 ); + $server_load = $this->get_server_load(); + + $response = rest_ensure_response( $formatted_results ); + $response->header( 'X-WP-Total', (int) $total ); + $response->header( 'X-Execution-Time', $execution_time_ms . ' ms' ); + $response->header( 'X-Server-Load', json_encode( $server_load ) ); + + return $response; + } catch ( Exception $e ) { + Logger::log( 'Error fetching product brand IDs: ' . $e->getMessage() ); + + return new \WP_Error( + 'woocommerce_pos_rest_cannot_fetch', + 'Error fetching product brand IDs.', + array( 'status' => 500 ) + ); + } + } +}