XM-c;mKT^tAs@()e*P)>
zn}L-18B|O2il2J=iW^N~Pn-7ZdB^N3eeAwk;a9W&^*gwZg}Pre4L5`)(uMW~v_KKE
z+44Vi8Y~(3BUGrx|EpBshY3IcAZPE7QH&b{T&JX!VoL@V6a3Ftz&pA@X4v5sjsogM
zah3mqhbr-_kGf>)eHa45qe7oS5I8|2245~AHKR%#lX81BkVanS)A=9PMhc=ouU&{E
zciMrG3r4(sf{px<0GdSlsB^gvLtc;XZ@cdp1XShQBXFfNjr&Fo6Gp?SsVC$<{q`9!
z;zbsysph0UDrcsr!X*{Hqz9_aNn=U{Z41zTclt~x>BN~0>Hpb=##I1Po&RD1
z=0w^ur~&XlY!xA2)nOBEsx2akwU|s2(1{aQ{WtX4n={2)|joIgjf9iMsbgWO0!gKQ?)|-AbiXs1v3k
ziv#~Q_e@UFW#~YjI^&zsHh1oGL^p0%bDit2cHUU^PGQrzo>&v$+uub$;ewbM80vZx
z-zDI+rdn3&jnn#^M=KT5#WLA~au!<@7LM~gq^4HhuJK7
zSjX573uXI$nGDv7C%1sA69T(B1i+qm1_~DyI>Jr@BFr^E
zWzSUk&SyOQ-v>aGp&j2%QG#d?
z%-5HqW>V_W-Cz>vnRol4qOxe*0f9FrPVoL4&~NEooNx*G(Pj%^`r-BLVq=6jdc;Ja8TT*3Ln0}_NJJV$iXRxE_1mU5scnE{GHS}
z%|G9gJ|Zye=7sNkb0rLwBDvYYv@L@(oW`kXRY$Rifp2j}+{gl`e7NF3C-*nG-9kd8
z6Uc;e@;s+n8p$VwZ~VAu+l{>-gyIoJ_mWsyVR~`-Avc{6O0OtsH!JJrj}8S{BV&rx#)TJvkp2>xA>Pt6bz!0^i;9
z?W>gu5U%k+VaD8?5PC7t;C0g&z$V6hY!8#d%3`e#H^inoQj0bup4$PMYy9j934u4<
zcZC-efvYl*zPnM{VRMGNx1Q}C`5}Jm?)b({GbjQ>OL)8x*}`x2BxuHVXDfFw=+WYK
za`0HxX_F7%R$rxeGpJZ_xnQzVJI_PrB#Q|m_UOv$Zp!+%%Z$M`zu}bYH!>r5s)7kH
zNL!1{{=Vz#pcp@2uT^339%V>Y^_#UNx`36T8cGHWb9O{)iQ}dAv4thaCf!alG5?u9
zN{{)%_s{79T5`P9PP`e_2)~zmyN*1sE8lyHRDBnGO8@lwcFJfnwlczf2v)&?Cyl$F
zkDYjUVQO(I(dUNOsU+cn3-e0#qyDH&4%%|4UDI`1ZXAp!Z;&Sj@3s27dhg>z_gWTb
zSeS7g@9ptcct|dH>9M0JO_0=)fY$!{>0M8Sas{QhjwL_hj-v~w(G8tjP=jU1PkfRC
zBHnG&t2%{hs0k)b*Ln;f>@2ETg_H$@6P%mopW9acR)0SiL>eGvssqNphX4nChc8jq
zweOjUg;>bKxsHNneP-swKd1E45ArQXKNbd-_vS56hvut-0$qEe&nS^sJnS}rC
zIR;-c!2(HxAlnF*#z8nT5g;$`>A6x%hf4b+frIyM+))-`j9H6jS=yN>ke7brXo*jf
zJES0G7G)Gr!peU$MJG$(aHe&mxcYuELxJr47n+e^p&9xAJ`aTNGp)Qv{Uu!!(Lzf|
zAMLrCMx+~5lj7O*NlMpyxijfx?a-_X!rd9%G6Qoq6a@^8SO<&S~F#>
z-2W1cyVJI?zCS#wXOKshMzrBan?BDYyA9Tf@u^o?=ll7*+B(Ej&qvFb+)l6eJzO
z56em^Kn_MaxlRN2i4d~RtoaWtFEU^IsX}i)QZve$SzITX|EC9z1^i%EWuKO$Exs!Y
zntTD>^|znbp+&PIgKb#Qz`UM#X?xooJiaO#2Yr{rTFrVh&*OwMUJMI*(L&MQaK;H-
zaM+f4;z@BLP)3}`?|jXqgt6u<=fGv(8f&d0dljou*Q7bO+h~d-(7MV-K>&%`d?j@s
z#cW?%di#U`+C)$AHO0%{N-uUz_Yo9xS-f#?mb}`$bwl(
zX=&q_?i{4ODrhhb*AhFp?myAlM=w|Ru9}F`k~@u0?t`;WD~W=wj6}jz*Q-2+&Nmyz
zU6mg|LZVj7T6kMh(rgKnWu$;*4q8W>@jlv(D<(VmV0_2k$J}WS6hcnKA_2HO$VZ^CecL!g#k)Hr
zaXVwA1RYeRG1@45)!&eckM_Uuq6y~|#J|x@H47d$ws2r`8_L+_G{)^5TFR9PL`>Cz
z^0f-w-yMTesSDaEUqucK^c^<{;_V53q`KHPGaXPh0yD+umRG95}S56zNWJ~*X)
z1)#PD1jiJuYIgct;Qg=b1lv-&*RZ;of|vvZtMUHpBEsPDzcwOn$mVz4o%->AU++l2
z3HaTOF1lF{9WQcO503mE9|tc3cIaL|GzBY7k&2>1G9ORstN#dIlP(HA&te+|cqp6o
z!-g6|pRD)qu!Nrvn(<^|b+0HTwsZoXj{{!ER65@-)2gBH0WY)XZx{RPZ?Exx_}2s?
zC{{#%+V2-;^hZ0-BflqK_w-Xfp`d5yMSgr`e|ro!hTdU|y-X7a+(#R~9L0COZK?!3
zC&Q-S8_0nMOC>-buBlJ#Wa1)$&;EizIO`Q%k=5hNlehiTwNX632@-W`{jbW!pw6Ap
z-SIyUuQ||{XR%k9PA}Nd)9_B{SUmOXz45o#WNQD*@M>e|)iL$kmG?f7REz^9yVLw-MQDG3b?-amO312k_LtIB)F#_?WW)=b``i
zeCP9(%0L-1ZXOBRy!@a_o)dRN^x*4`V@i56SI9{U=T6I~$Ozggncb%l*?Kdh9`!C%
zX5oGzWm@(m_DTKt6T=gk5`MFY!Nm@d#YI0anY&0ll?KLF*!s!*_IfaRT)+P>Q|P)r
zCriX@Z&Js4T-5h<7AB+;5xhPa#Wu&@j+4k8
z!ZHh>{b&(L3_K_Bxk?N1!Qr2Jw#f$Ioh1ePKj_j&Fwsiq{VXf^H}ta~;YJ=v(O;8Y
z_$3#T_%eCUpFMM93drob#0ev$H;R+{z~n=m_!L3m`!_C>hIZ;juT=2EZHf9H5qU9y
z6jxpTdo_q0MkFkA5%P*F8y=tHdkQ!^5jec9xOw#EIiz*v(mX^9mB^baRc~kz`cl&<
z5xIAuhZspENvnIMP5`8eL$F1Dd{2D(5jZ}V>Re1g6oELLO-T%@bCYurJK@vZ@>uBJZ_+>>^=@ur|!e8c|zVfSYBDrwdgffs(7-
z-T?IU%=gJaaM(RCLMBg@DSCt+l{RWZK!icOcOizfMJGG9&Oo?Adf3qAz#Ebzq+59o
z`b^UDi-)LUOuWnY8)snoHCjxZ_D@rO=P94BfJqwyv>#jY{(?V%8!omJ0M^eNsZzd7
zkeN>{O@bwCzJD^9*3
z(x{>cK!aEoX1e`>R>s|UTfZqQWAh6Et35g;PQn=n4{I(B8K?P#8K!1Fj}7{0!C!kv
z5$qAqV$!OvJDIlT4xZ};dYDQ@6GT~4W#-SEy2%au4E4zIQ*;*WK)|yF-nN-seE~sXrC*8JDQi=&>C+$8&>ck
zRBE*>dOEn_%x0w-7;@ujPtp8jGASTGgE!#L514U8SjrFEN}sFsA$NBn4fG``urEse
z0})2Hns>=FCfDt2M=Us+6pv%Um!zVa9pLS|dbXx=4fP4t^NHxsYsO+L;NUeh!P}8T
zNy+)Pt0k0_wTRXU2DATv_x^^OU84N6I{dA5I$_V)B!o_Qy!;X#$T
zA7rA|jAZL*=QXf*qMC(?tKK{o&(3meR*LH&AaNHf(&Z>w7
zEv#oE1^SKQ
zjm-fCMOi&UJmRmgJ#&NpDa+ZiX+knsw|8;|(`1;}D#V=d@5TdM-=ZrC+2B*dft%;L
zZ0}>EdPDlRY&_w55`-UvejC>x?b3-);Aue{cMJL_12Q@(8bFsVk
zI@s5sm-!h7oViizv4(c_}GnZz+og88w3`NSF-umN6Tf`(i&Ft;Z-|Y+syZjb(tx;me
zO>0QeR6@{GC30&WEUNYYyNKeY_hbE?4w}&AM}cCijLGWJMhVa4yHN&%p_63~+^X
z^_wVf*m4^E5=SI$A_+cI5bCI&e)BOaRSRH=h(EaEn?U_GUTe?I2|yoMU*T70xhxF
zEwi-hesxoyV4tZ^Q@%Fw`MgzEnKxsLt3vMeNuU$>6fr#=G&Lzl|1iy*ij#}xhhPfs
z8o`h8KbsZusAE^NFAlO{{HT3{RawZ4FS3J^K?0Mt;{{0jQS
z+qLa_mo=~%4x8{`=+T)p#7aSdCtlwLuf9+gQ-8H`QrqqYNhRhk(O
z)JVF?*}^>pxi|0%Hd>4+@T>kr(~JcYAXV>_h@rfH48GVHZ0nkCoghopOWHCrQiQzB
z%}`7I5wRO0inj5r3L20bKNx(A>RE{5$ofjL>$`PGCpSthRj_!CyqJxIEPG>@z$o$K
z1;oEa6#66KtDd4Q(5yYtlfH~1@m>6PQ2I-_KIfFXd-NqOkCzS;!6BIv?BC)?<)XlG
z)N{he8j%2;@|Q#jWgn$RK^IM`0?~c)Hz1j-UkML8e~YoLG&eB@-?_aV?QiU4FQbH&
z$oPuB;sl`J)|XtPtd(2jOJx0QxWBdXTrTx|QNuzcMzTZn8_qr)yn-tv-5$&M7FwdU
zO8L&M%I{Zf&OxRcN(}rDZAfJ}9bq#Ofyam{>7jMfGp!$PWUqvYm_eFop~_+_1rd+I
zGw$SpJV)5B)=p8^)!jMB9#YKtR=*`QNdIP;<}oc9MSh1cEF;y}IRePSl7oT2Km3r$
zQ#1ZNJNyRRU|pRr6^pPGgPiO#h@C2?*s*|Zc!nr>aU)uA0rmh=Bi-gXz+JbvAJ@>O-Fwjoe0H)V|19QMet
zWQ#JLqjXJ#H^JLCw<9EM97PN&tBg+_s-s8M(QDwF8E8BF5qEIaA9mGW^)z3IF49TY
zLiP^%)%-{Q=F
z3N@+7SWnA%q^;n`=&Cf;-*(OFoQL4=djS4Xa&$~mqU1kxn06qYoZ+Vi9a}9Tr}{fXE1aK~
zHq(#sW55y#tgF6-%%7y3;&-s~vmKeU7HHmp=)%ds$WFxHq=Jr@{oym4fpR!lRgNw+
z$f!#uLB)8ULJq;3n~@nC-(5bttReu;x;K^m7`wiv*=x)o>&{E$qkW0
ztTs=2{s9#8(6Re8u|N9=rwc?Ve=+@A9rqX-UN4Of
z|JIGkKayxmwEW5BRL>EKqTFzKFf05TT!$lNDDyz`9PHAvNK=;6kZ0b)JQ$`c>jHbQ
znrKQ$U-%Qkb!#$_XOufS3Wwr;rL3Z(Rm9NEYseA#q9c!>3kLn=)wr+CA!;dw6yHV!6#zvK
z{fFiIanifpI4D&>)5k_JT!mYgPv@EHt~uIbpk6(|JZal0gg1hz7Sj1%ziK?ef1FyX
zX|9MNQEWi|S;mn5*b~g)`tlNpGUntVQ)(Jm_(6D(ddK_Al6LK2i8f{Mi5N|C(36{n
zSV9Yf$Iyr$-(E`tNKx6Gg7$sHW%bpNti>Wd!ji5>A+pnn^hZ>WlqEK;lYr)rb)bt&
zfUtMYGQJMA8mvcz;?!je3(MQ0Sz%8n&yj)P1iBVPRx!CNT4mi%4HPa2ML(POd^k20
zF{O>5e@MLR}ejCTE2V
z`K#Llj&zAvIsVW5K%8UJIvZg7y+n5ql476HXZ~E78GD0`$PA3nYY|GtMGSGhO}175
zFt^l!#!a1UTtI~1GW8DP+1{Jcs_elzThyR(@^Jz7{P60f{#9`M_9tXY(&H;+YG5S;
zI;v-^DL?>CpOx*irB12lk;9O+5{#xl(sAkX4V_+!`W87+7_s|0lgXv8EqGgw7w3xS
z3l8p&{I#M)$W#BHogqe%o|ui{<|6D^tqiIo%J*~#6(Lu@I7QDp5l)mphD$s1(a
zOEj8z_iTKrQY>NFH{cJwQaW1k564bQ;772Qnp&3qmE=(33r#JTd3fM_etB6}7{+>0
zJDR%Vl|99KG(p0rr$Wjb!SG2e7-X5*Nl;*E9+nEi{A|bMGb0x6WD%A?P}s}+NWw#S
z((C614?s|vmWme2Rm#+_!kCZp1S@TYre~m;Y6*~zqqru9o
z{OLk_&HH~NZ$JcJGS(D}fCTpphLGcA6fHAHBw;6>r60-Ycig%D-IbCp)9qnpS5a&&
z81oso8(*5;gwPy39N>u+XR+0O+Ol_l<+U2Ub1>)-O-aj<8^BScjgTpr9Q?&tDAbB+
z)tE_bv5-RguT1h3YwGzstvuPX?8X_BtoE3a8#vn%p!;e4zL$S8^u=-gLu34*-oaLl
zkzQ-mb*#`IkAM8SRj9UVoBE~maAi+EZlItdq@4tN@xr{xEBc}mZ&(TYC+w@=A%2PH
zs78cx!*@ec8UJD*q;kII(Qvb&9u!x40I8CeeSYGkVL(DvsTS8IGIL$mg3nv`k~R;5
z40nZi^jzF^IotgaS9bKPYv2_eK3HIT7gETKl
z%2dj+B>RUbt6pMZ6@%3UTb3CCNfo`GK9U82#Z7H*r%;5b$^lgZ>i2T8gVWYjROx_!_;htoJg@UL2a|9DY@{egU7kk9JSMB@<%p0F
z;2qlv2@^_^`tM+tFhvqnP_{c9&pkSZI2YYuB&XLr7NMm^IN}hs#Wa#;6FAx3nR1;Y
z@Q(PYR_9tOi-W3PF`98b)To|+w(5rUu!C4Z4=&j-lMWFplx;+;vUw?iFUeUFRKEVJ
zO{n~gJ;wW$3tm$vw*^xcRypV0TOd-VobwboZiDUhG=Ox%oNxnNpHeIC;lr2>jM2n4
zE^=|kdRfNR>8SE-RjHlyiC4YyLWbh*$h{Ck`-A#r5H%}HxyA-BB0MVj#)3ZpZ$V^F
z;ifHVcuXrOnuLv37@Z%6jstCxorDnVH{-&)1-Tzg+T+*Y0Z}iGT!}~u7ucK%MM}RKN{yK}WvgYKV8U7v84mWEO1DQRis@NG*xJze$d(idRtA=hP
zya0L}n!O<4hKFxd($S8ys$kwWvS)P#2joHH)WDx!<3Y-t5y>bgm`L3QV@XLd%l@;a70k*;WC_XT4@IOo^d6hTZw
zgMsWC)=XA!
zJSHh68>3WGZ5|6xGtvSh7m2LzCWJ&s4wc7dLV@`g(__JJL^%@`JOA2yhRZ_Qpv6K3
z+*1;sM(==ccLSQTQg)-A3`OCo|5PQ31!xda@fl`A4_+)7P}u~>v>6#B65@ex8r;ZQ
z6~7vcxIqX$yLlxXEfIq;S)@WCne5FJi?ZoK-e!}=g+dXMQ8zg92~;6OKF0Mw0n0p@
zypV|lzuJpU?-a4YDyURDm&A+d7c8{PGc-qNNJ6|@lb>aU^TyEptT@>}qNi_<*9u5KOR8#+h|ewV1%Gc|61$0kwJ3hbYxC#g$D
zz*u-v90zpf56Rq!I@w-_NYMyh_lceBAX`IzpJK~qA-Xob`dqotkza5wmthGT_n><;QfOtSkTw7Bn-8tE(!k0bIW
zJ54K&SIi_?!&Ka{XvMucobV8MhX(?0H46#pggY7G%y-E*=Cnv!1u}si1hBm_aLDT?
z#Y8^vDNWyEw<=3sDyb5LsFW1OgUkl@&4m;o@%9C0r=qEO`L<>-#()1~f)}#c5G=w#q6>y#Y+(TY8#oqMP(A`;pyb^X0H%8_j#jIv(FqVmZl`~U|M278
zb&@=PNnKU_EaZo5bEtqiv$f=a&9T-`FP9YfU!pHCDsb5PqnY;QMcUt}S9Q@u!?3i|
zwF#s9u+2cfoVq)%r}XfpXOSc1XBggnbTQ0s2r>y$k~?Zni0o()g5*aEels2a;$&j1
zkYW|Yv%p=~M!?KPJl3wTacp4&lIr@8m}!A>45|Xm!Or8?w90WQ7Rb!v9)C&
z6A@?1z28(s!Mz_D%&rq@eqs}*9qTRlp-XN{*wR!9(7j20bl`-+1_SI}&5tA6hWl2n
z+zP}rWPX7X=p5!e$ES0Te;J(GaOA$|OTbvnU+pAWvA(&BzBT9^z0zXq^AtB==hkBU
zeV^j@#Tu~Z@jZmY%nD%ouoI^H!J0%bj`8BVbVUA=*`Zcm?#!Rwf*u3C$lq-j`doa`
z_{s2kA5ir7EafC1C~}8MpTImaw)e#>zkNkwTk>dSOUxLH(?vY|5dP!E7pA)}R$zT;
zVg#BqKgq_b7OiL`dD!L4_x*PbkZ2C=R|I=Gs@^LqSsqV^ka7R_8o)jU{oh#grbd`P
zaz?Sy=eW-&e;SyR{M(EyxbQ37bVGMB20N)1w5ooXO(+3
z2BbRJ3SUz?>S-F+p-$8Y@g6+Ql4^cgWM*FU7sUV3iru*m*$raF!QwxT{V+kBP+%S{
zb#B+}Lc8pE&m!P1zS3{wllou!s$m^-M3{aPLlf&>T)MjKUsl+RnA^UuL%qF76d*f61($*9J
z=9hY?_xKPiQ7}R}C4Vn2zDNd0Vh*uMk^6(w%6!qs6RY9U(0q2rD4Q@Y|Df=yI)#1p
zQ8^)}jDnY4T){IbJpW{~$eT$zO!l$r`|bnnFUoqVuzn?&v2tKDLF|lT-CO(V1k}fc4UY-kt;mvxKLew
zVcMdqd?1Qn4+C}u2%zj{OPAs@VoCP;tI55a>Ud5
z_85AJxb&AV8@>c&?}9$^v0^Inlcbn~K?l>xPQ$QXEzuPIou|T^{Y|}{%zI-uFJh4-
zicgvB0fhIKU)K^JoDbP?B_omBvPJSEG97r>eo16yeZbCr&_Tkf8`7ao-(KDSRz#Tj
z^==IpkN5AL=ea=1lu|&EaBgC!oL?>z^Ur^E+(+_*z~$4Q=%9)
z29@ssvWeTV93q9R{BcA^z0xERV+y=vTp>QgK19al@ih&ID^7f_D(rv3
zX#p(3S9~<77un?l)@n@9i5@}w=ErC-@c9ump$Jx7>&sdO0ln3Xvzcz~cDFsy6Zyw7
zYI~I_34NAqisk4tdn;{b!NrwTz1D5?51wU|@x2G?2vO*huD|gEXLoNHz=s*^gG7b`
zE7Y5G)5m2Sr-WjUD|>?a>b4ZumjdE&-F>Y^#G;6|oJy}3UL0kfg9+(7iJq48CK7i6+B5
zZza_MJ0(+&gE)h>^_Yn_Kas}(>IEiMlK>O@^ZteF%G;oo^A~%$2a_@*cO%-yQuNE5
z_fI2Br*6Bd)uP*i`qlj=`mFtwD(^orPX15tK&mg=up;lY%vjY&YvPv4v0+ko>h{h%(XW
zPdvdo{=q^nr166E9+!cmvCid32d6PIf-LA=J8vf(*!>p05&c+b2^5=}3)l2ftVi(e
z-RuPIrrfBHiih4?II@~@dp@&;!Z7qT^9I#si~Ye)abMM@U5~A+Ja`&oX^0D*vUsGX
z+W^vi2}Zg-F>HKxi6@GtRQU^;jNO3dFut^+78lkPIH`#nk6`0p^eL9w2sQA-YzVj*
zB4XD%kbb+b=U=bSDNryncjGDex_Z?FN(%e37eI{iFmI8R|E~gdn3f+QZ~Lav%W_8(
ztbs+p;O?did$jMc>Lr#qRj{f{1qijfBy}-7sARxb)`13oUtv)R^y+t^V&O7KgC_Co
z(!R#BcC9usDe(KtyR>(*+Sk08W4wMMu0!n1$32nM))U+Eh|<1sYUfyG>`OieMjxde
zkOQiWQ3QZzrjOl3MX-
z7X&Ps&p~i_m%2F}JOF5B0=UA(-SpLlbLz%xT}zrUZMpz~qTX@fa%D8BqO*(OFFw6f^idgv2bUuE#@4IDr9f~hbHs-`&OnPH>
zK(_azu-S{~&1FL?L1S9AUj7juiCTc8Ukn0ntXJD@d-8U1Gaccs#dSRfCMoCYm@iOb#jkGJNjP)j~qoE(~x()Rjls<_96HeaJ=|GLFu(@G4vRVr+rl0lQ1*;kv
z4yTU4vJ02%i%GF%79`otx*E0KisK}Hm4N0D4Mzo9|?`>>i>zI(`2S!lI5#uq_5LDh!2CI_Vz9lZ=^gmP-3;yohcEsndoS*(tvly{M1MqePY$Azs1Y%3L
zL#5agEv)mIsa){ai5+{R6=g>$tr7y(FTj62Si3Z{vF+Fg@3o`&eoP``t3XvrSDK!axUUyYN3^
z%3gAh0#6-*>=I9AhX3-NIP*>8{tJAN^5y?dj>+N5C8^CPZtCbWZ0NZEN#<|ip|)|^
zngrmthT*CVOU)R&FZqoU6^`DB%b#@131Do+*q)bzyHMlY2P@_FSEU9=QD*UA5tC&vhbREmB@t-BVB6
zTCjJ5?eczUHEZ6}k)y3Oy`o|I1_6ZC`x7lIznm^PIp)!vZ9qjON+g6FQZrU`044A7
z#ZD0#v}or@LM?Z~5%~zaGgmhRf5>ZHg1s!suRBxEFZ+mWi5i)>*c>@|Qfy2~6bNck
zXzp!z6;$Ld0aB5vzxIfE{TWg`5YFV_Cs`bu2p4HEL?o(^E%ieFjH*Reg6g?K57a5Bql=+64_oOa1&lui1
ze;;=`zg9mXe6MsSe<)yzO&|F;G~p(AhtJr*1xWoLrJY=G?!KWfsD7VW>_pZIXzZ@U
z8Qpi50cH=XZxV^jW|{DW-kw-HD*BId9kWkE1gT1?E;IvzuWJD6HrHKTDJwBCr~hIV4S9jF
z`OEWnlAt;(1EX9I`U+(@8hP~Bb^#tv@KywjsDgT^lq2CqO$sFSY*tFD@$GqzFlmK9
zm5@LM_MY+GfD3d>xtdDG`~{#$(<52X0oH-NUcU_5SCPe%xu5SJZ_
zD1yN^SexFD8u^#qD0WewfLin#1-&v05<1k;f?1J)Damsk-rRtStzZ)3I33%OYWpkH
z2&d#Si@xs_+jLu5(te4ra}$1M5&j&`0^g}O4L9^X@y1T+>JUXv1p~qrR1&xcliYGN
zVgy`R&O@or3#qPFpe9(JHX)0`7?6g41HZA!%SFXyoWf`{a4U0pMtblsKK!T705Qt|bxC6>1vjTh-dD@>A{nPq}ZI>^6)3SKz|G4pvh~AU=PKi8M4m
zxrJXk_;6&jEOP!y@2;kf5ew*-V!CCZYTNUDgI4dOk*3+%e2!Xmc|&
z|E|UtH(y$9c9sGCv{ndPeBcSabq#|jDwN27%JR+a=ja_
z3*%`}TqPX!7!3kEC1>;U9V3hRlhpo67~Jz&O?zeki9~k?Qk8%;s4I|^K^IPJz
zZe((J$i?rA>gq7CXfn?L5Fglxr+w^@GD4<0Y7lV@tYPR+T$1(5#i0GdVn(C%0W)=+
zgw_zDXdF6y-fnt2i%&!&Xd2*0Rt!Jl5`p>$Ux{ZDFp8Ik4vaF%W#{0!{9gS+eWuur
zV8PGPM_fULyC4rknb>F3mE5)i^Sy2&{>nh0g)kI;0R7sXuM?}KChlPf>SQeI*D5G=
z`PyGA<3(|D9u6vm%ixvVYrP1WnNZpQ*BycOYsLqG4o3?gM|^6O-Cp)xrj=qSDkthD
zu~?hQNpyz-(ZEc(qSrWl`D16>3w#q}XIXILmZ4eNYE!Yu)ybe_^8l!am+hnq)bOk|
z>%gDo(#C-xiLBdV
zXrUIC6J5iVRPh)dV5Kx;#cLqld=I@lRI&m-sT^WS){*j5%+P_Za{HWw!OROwZ
zpE+Ib3lv~Zj}2H1b;7A|&s=Fga6OVG%o%vSaeAUUd@M%eoz5es%*lAF-T3TYoQzB-
zI*UCCucTKQqbKX-)UFOOQ^UN|y-
z?zdi8>6mcbg1G8x+D1_jORh?xC;rKXd>Y*^(Euwf
z9gK&(H(RF#DwEusP%pwT2>RIN(OGYd;H^De=`w!QV@|Mr2Ze0*KH&=^4RlLC%57*8b*jJF{f
z>IuY~1-h_XpYp-jH9U_hkrBeuet7(wF%41Q1`?V2usHxwHbv!flAe@r`%`oOZbCIq
z@Me*!OLX}vN{EZqz|0&{wz67Y_A}e=XF&w
zBsXLkju&*C-aUs*m1(n=l<4X}NF%LeI6oLukd(KHa0pv@&RHLv$sWnzH6KW!(3IdngYGGL7GMCX)HHu#gFEa8|XBs0kUI`M?j5oNKzm#g5(F2bI?
z3)?5$dJlHoMgA2|ALgis97467hktdxDf-|LK+>_|=fOBZz1>Gd0!4W*mbE&*wNbpO
z;k^f+i@h-`OyaY9*v{aUwh>0-bM12y0aNTyDs%$op{vG2W(>oW2|X}HoH}Ni`SkUl
zF>3Z8B#HG5;G5-0e-*K=bWt1<@`10J>$cC~9-f7Mg3?>n&1-rQeJ(a)6xnE+cz76?
zw#Gt3nulg~ON#y;`K~pMJ8PUam9EEr{vN!H8#Y@Q5woau;t!?&eg?}3?`eb&FEOs`
zL{{OTiSai+f4O39)iow^vUi
z8EYrjU1z$0AH*vX@OD=#GWDzV$>qSN)T+`9-6)N$-zHSX(Y~!P{SwbOPrI@4?HCR<
z_5bQc%P3P{myIUkGL0ps&|nF1v!#WNLmgPawnRl(5ipZjG&UJ(h!40DcaAe6@C1KJ
z+se7a46Z>VK>Y$BpuH`a*dQU{qBuP!pRm;0N@N$0Yn$)Mj?V}%5DHCfjy!^7v9L%7R{P2DZ%Momus}*(3$)<3$V0DeO5Sha0gA5NT3Ux9o;XQnHQk)|dQ19BPyP$}Q^$);K6x2K`f*
z*W!)qUvE2_$pU_f%5az>#j7Znv(UaRiL#~y6-t&a^cw{=3t5mqPI)fSjTqoA`9gT8
zogvHB8Q-0tsle+)0yXH_o-}i$sgw!-;?m@rx?|8quyyb>-hAh
zdQSeit)Yakro>4ZhCf*TEFD3JvQY==^Z%IJspf)ZC(U02V=x72l8%qQcnYnby1FQS
z?HI7XcVFM)NCm5~GyIv(xW@dg`FtjP=Qn3?#3|<7gQ7}=
zHio4bs7Pf31PJHHfTBZ%vOxTQYovuSMK~PKV1@k2R6O1kLOmvn5|NdK`~9TbRxskj
z!B{>gRvhGlG#1WBfM?nZb5|~~43O`rO4L^nh&u(!NdgcjjL~O;RD%et)6UQ|&jSuu
z_S7dB||q7)f%*2Z}Z--ce=->!y5};>L0gH2eW`gU!U{zoCU5e
zZ8dna7BYuzaab8up#QRuV;KZz(H&Swm;IdU!0D~Y6f{eum&AsEz~Jxw+I~Gd;?)e?
ze)u(Zt*3x(kH9CqB!QUgf4#62UDK}D`*^={*7uTo#<_9GcX2Whq3(CE(KugZ_%e=O5u5M$U{P=m(6S^Fk})EJk5-F
z*y!10@_kgwVX%}0pc$3)`G*D%XS(OG#2SPrXbNsQV5bW3@(Nnx!sijz`2;UgB?eNn
z^?5n)(dqtsx1ZF-wXI!G)8&Z)=eN(&4gR5?<6vVPWbGG5V8k@i@1XT6tR(GZRyiV{
zY<>*ssuAJd`-t%r$(2KGAEX@#P(%gO*MqC*l`c9#u7Z3L#P{*Cor-2Od#!jDzRsJY
zqb;}Y&;GsuA)+lemz|dju^&^{?=ZPO0Y|O9gWW-${ORtXKYr`=I^iA}j9k$6nxT*k
zCu&~T7n-V)*JqF;A@2@6{l0k(aUd-2BV&2P_Ng#0GMtiW?61fmttWq+E)8E{M>9B4U0SqYMKjfoUNE?7C6`s
z`(rI#T?LI{Qs__>l=F(;)7%AzCAg|aOqA{}g3xq^WZRXKa~B~)C9G88rvHcGOl$AN
zPf6>V&!U+dS=0!uYs!g&$0d7L7M%v$n|!-`Aek;K=u`D*g$bRc6%+_%vGL=l;1yek>7b>eAGQ#-ux0LCFWxdcDa=!mls7JFLGQnP?duY
zVSj1R{7dWl1S)!OrmNNz>98-BX>&C_0n8|-u=vN?Q?gwm^X#Wd5etu@UWZ^}T%Ec2
z02*o+*JX=I7)*%OoY5>za8o1GeYN54bowK%umIXfBHTp?^?IN=nmnIr+#d+jPdN>w
zIdR-YHvNQP#Xv_u$;&KTOEN1O4N@GFlW#M1FMtLK#tg0uNR`Z-2bQlm8~_s{jQ!*P
zY22RJ!P(tP$(SNj;4#x4>eHDn%
z!BB2b9AMlXem?zLR0&jU1H%N|N_;<2<9`icT7X?6&z}e)oFSkXD9cxpn1_5Z2S*bh
zDNYxb5{!(kGx9+Rj~GKQ9L5>Dj~i!7sJu2v95_xop2O)ddvwg|n8+|ZfZquS
z`-5zl@%KE%U`$Pb{5q^V}J@N+nv1O
zO~V-HpIk*5&i3)kSVk*I*pb^8q>29mXYR_T$H>gc$k5W%T-FYD5#>HPyWDR}SA9cH
z!~wE&od^>Qk{C`TL!yw3E^VB!g$O`H;{O6UYQWo&S$>2@lh=$N4veGJVBqhSf*U#d
ziF-6@_b#&3{O@iQwZRND0UCLvEh{<0Qs{e}s`2shDpJk{jF4Yl_ae=-W-LSWAxP>r
zftC{I;O{D+D<~yI@8$P{r}3ggZ{Zb>i~Uv;iL-VIO*QNqbdq~HxQI3WzMW^U-8Jn$
ze+m9}Kl0qW;q~`(F27MW*((P8Hh8^#J^yD9~C1p(>stE#F*DoN?#!MG3P
zHlbZyChjGSL${Q=P-n9j!fsW|qN9C51mrQncqn~#;gbEpB=DzOAm63h$*F3I;$aCv
zmO3GNJf~g1hApPNd3bUKdau={a%vfMpI>M1ATc2bbbI{|7AJ7iMts#-Na;t7JL@F<
z%KXckLxqT_z4er{b~2+-(XXfeWMm#()rgBfM5%@h4eX)W#-Hn;U=#pHjrtz3biu?@
zZkkP;Q$b-KS#DO|31J((?aGkWLh`rWH*O!>mW
zty>p?d7{G_t2A1_R4Cf876PNb7d|WwP{LHQDqbZu_C6Lt#vki>PkYuX#5r)#AvZ6*
z=_#c9-U?j1QRqJL$E$c@
z-*|!KA5QR;SJmo%xU7qO1asI@l>sNS2}a_=wEYhcay_?X1u2&-#NF8
z59h^bDQMstMsLP1;Zn<9Ce2-4u6X3&4~Zua(-o3ts3Ck|zyNX}UE6)$p3l^U%}>Eo
zt1kDu#X|32UOigZ$CVNW`fYFbQW{I$ak#Axn>=6kt8P;a)r@I_55;t>i@7AVKl%#_F8>-IVk0v^#3>@%-!gA`S|>x9qFvuuAvmc|ix}97sNb>yldt&B7}A;ldi&3_
z=OE8CdtbkkJI_0YjSd&9%PwAb9LB8<*Z1cXZ+F7=HkazcBYDz?;4Uy@%`7c!!>%3U
z2vZhp13EP1U*VDzXo-?2*lXy4j3&m?qN2RQ*MI$pB3WCKAF+RPZgwt3iDP55GN63Nfq^kSE<6jl=F>jk
zjufsw_|6!^0yfDfJ}qK19o6{V?6wb&7-c5?Nh%D+v;cX~$Rb;bNauNQ=kh&m^E|8x
zNhJfT8sRsc)67EEe_dE^g{tV6eULabmEh_plu?!t>f=xLq~LyNjgdPfaM_b9dm85`5zAIE=x0gdsH8tMZ}bA7UNF6FK+jj0ze=V@kwVC2l}ZI%
zNokVwp|{%z1ghcX=|eLwLTG^~RuVS?Y~6&hT(C%vLQ`aRK^SYT-j{aqvT6Bw9Qrl3
zrW6A;;bHe(5I_t7&L}=6+nJZxU-CJ;+pQ?VXiG`uZFWJusPP-`Qa@&c4I{sGOi>zq
zQegS?INtIY=9p#Rmt3|AM;-beg>3~icMwb83#AAGROn*g@C7}hxkj34zqr`^&0+VG
z5$U!)dFa8N*3R|#c7DepHO8KpcBv^LA`^;1#(zS@i7$j=f$u`oHc_j$8@f|jSFz41
z;yjuIkd#sCAba4M<0PXcoJc~@Wo%iG@l5gZFAz(Hg4zb);-ZE;ena(&)XbF0g-`L8
zP6aZGi@{f!jUqxX`yxy*JFcQ4+n|je-a1Pp`|av<(t%?HxP!#wdyM)@@$d;){d8$?
zR{pUGBgQeom%Rh;vOaE+3yeu}2?pGNTR$?WJ%h4GOdEv~2I1i&BEu@%!V;W;ru)pUjN~9Br?k$$Jdd;zT(L4bc+F_nV7+(_-Z9|~jNL$d<>lUO&uqQ~K=y
zNig=FSoMhhc4iIkCH1+(xXT4}f?2%)BT%1>nS(xjvg5Mp!Q;_0@ImOllA*{P9q#(K
z)g)tp;_~^VXc?RR^~-pdmt-QlrH^&hmTuPKemJI*QvvZ9(>Q`smJwcwP4qo(Fm~dQRM|I%RFz2g7*W`EwCy;U8yNo#t|bBUJfCu-RM822~l)v2>?A~^W7>(DwbqAw4}KM
zmP)S$pv;Rzxbai@e=
zC=P9FLn#q2ibXgab!Gq2peyR*8+Q&dzlf;E-du`o22n{sYQM|?$A*!C${Wij7_oWQ
zeg}33K68dO39?GI$!_m2bMvyl$A*9SP%h)b=s!O}##Ef02FxC6nl%qV!O;(dM@Os(
zfvsDUw@9a3%iz&v))6y`O?VCt|LVix;%LrH%r#T~sxC&Yw4g7R(ZK+!&}TqS6~w?W
za4SOVl#*wMRreT>SZ49vW+=7uF#-uxM=7aLHvC1MCT+kUDQ8Pag`KV2Ud3N>cdqLazj0HB0-Ecu!SEd1yv(j#AD5x$684x4D2}AM6bJBC4^-><;Hs=
zPK7#Ebr|{1vyX(sx>Rkh4tFCsTm
zf$V{Gpu70Kx=+AvZqpyu$|A~T0BmAo#gsCx=6e$>CV
zQ0`NA#8=N~`2xO2`q)8pss85y^Y9YN$nOHDq{JqNM8$6}67Pz5FveH|+sF~FYY8BJE$i#7GY8GE{#Wq{E5kuk@6Ip4^jU-N(3K$%e^Q!RN*I
zm-G1sRH#D!IrnYhLfNpok>^rrq3NDEJOT7I41-Ify?Ln1VH-H=UQW-^rOqPn7n{4Wwtj$^hm70`Qk;pYuL==
zC=gafA{%;)hIH&(Av%QcFb=4T@je5%s(<7;BD>b0(OiZXFft`(uRGHs0i!$!`bDls
zV_qPs5~JDg@vIpn+7Xzn0!YK;Bq5=!cyXFSF|qj|7$u&dWj?`pSkm1Qs7z9nI9%EK
zjVy1zQ(@-bm=V(@5RWeyfSSUjdxHq9hVM=0@j3d1XX^FEbumoH=V4nVxh^d6#{UfK
zxyi&wAUczF*w5Y#VeIM^GECCLt==yNR?PILNc;K|W4W&%X(NAv+Xz)iksKdy=Rq5m
zXdw;K+e00)uTNJQMAAn|=0>cbM9Pjq;u`%K{w8HL_R-%Y3E-N&;Cm%to-@x!siL`)
ztVS`-y23Pt!Ha901OrxuyD|{h@FLEPUO0#v
zgO+iGStE>wA*=opxesJGfnld0vBV0Fp6{pdo!IsrlL2BU*#Z^K&FNB|==fMhbBb>M
zBOpblE%pCjnYJwVPo~oI1;?yl?j&zJRifl_i%IZvZuxK4vLu^Z)8%uDunTOe#t@;I
z$R)$QMJX)zYU%4nP17IV{=5Ht(04BuKCQ3C%Ik^OQmU+Vn?kUBS#C3ry3gt*{lM16
z-=$#rB2`)v*aC%Mo@Ql0^Jbuc&xHuYUeZ!}>3mQO5Wvz&KN?<}umUj?zH<;EaEuiF
z-S&@u^jjuw?)T?Cpq^0B=Xnru|EW&&7%v3Iv;}s*oAL8wgwX%}rjl{f>#ExS{eyhqxs8ddlek8s7VULvJl4`;A%$V4m0P*v22%
zdj?+*-#U=Rg(BbLg+4a~_{OpS4Gy^7{}vG(@&DNUUAu8P)4OojAHH;jh>OGnNvs$+
z?iT2?^0W0QnihYn_eo*v{jTw{zVA!`ReaKr1QhT-~Z0QFV7E2<=ZSTELYvMzX
z*Smm}Cnf)lD6#YUaJJ5b2uSO_rG!u{-!1!o*38$X3TV7;Tvn!bsM`
zOrIuROLBz`)*UliQ6CXGL`=sdagQj(H&-@hbs)WO8oKsE9>4hFXAkPG6WhQG%lSGXF
z`%$ky`R75etQ+>-Z&XRPs&D|xHfm;th;eA?NT3wewS2f{W1N5GtN+&>ddB@HvLNRW
z%#USa^%)#nfh_lV$kNtTdTgsNcBgMs@*H+KpUiBjec(dEj6}XzKGx`|nPlYiwvQ}L
z_QD5jt*Qhj&0WR8m@X3gJ#2?Uq1*8rMQT;tti5d~=
ztq^PKGr$!dXn9~_^;G*Q88hHfdj|e}RyN&Jg}%`*Kl}6``3U@GG#-=>AxUs_uKJI=
z7nzpn?nM%L3-azDo(oO!VL+&kiIzS5(Q=hCEOqeEEtc;Qw)CnXn-i&tmzq
z0_hOnL|6lyy*N8?IlwWK%qp`aTexF$iGvWTprGwsD3RIA6K?n#Sc8FI8I4>xEnuLLp?e
z+ddMg0&C7e|6XJ}q~Djp(N_*P`;|&q0Of+N+~efrBZ6jm+GiKE(Ghh_q+x<(5nrIH
zbFbu`GE~GCdD!
zpeF0XU~=vS_IkEbT1nEKeB~W?)-L*y6m-RW70nfT8EDmZC$@4Y1ghxgv`aAHnLNev
zlvt|brB!sa^wsJu>Xc75!*%kypm-q&^(7dAKxLOWS(HP}DxT@vJNJ6voSsX4Me|U#
zRC%m*?P+S)w3;iW^gkY*VljHJg)uj?m2E>63#oQ-k`zJN8OtDsTqt4pgrY{w;sYpc
zH70m)l0yPjB9#~*&64L+3UtwH^xBWwOggC#7r~c3`PiOj_nExJrP*>@MvrAJbuId|
z)>e)j9kq?}#VToPPQr0mA08L)()yyq%;
z)}W$VcJgvQh8c2(?=l%J;OO*Vg}xrP3%G_f=TRRIQ^
zO|{MFM`xPvX>bw&B$`eYuPlDmocd`JQ|AHp0-K^fmxG6q
zQ$>FTciP33j#*i*9!j33@rP!xAd`UN(MonZli*;=0RUyc9WxfF0#O1Y
z3>hZC#CsNiviolu&61rjSDz6Xip?t!$e3mc4(17})lM@l>A4>&T8IvHKg3=@9}f$T
z6A3Itw=Dg`QX2^j8H^|gnzPGR6{J$eUk@)r;x>`TC!#Z=tc(t2#%qwxCv^P_6G^u<
z&c)qrERm?Y9^Lntm-QTjgUTuT2}Z#Z!pU#H6Zyx(AWCs>cW^ew8*Q!#7BT!kDQ90f)5+nOmh44es7?^zw1}J>9*q=?2
zWyCe=sgi%gh$iPy!}+qh8Q5+}TMJR4r6%OVE0QROytTcGo`2hxy>2t=Bw?NN0E{^U
z%5W_2XS~!C)Yt*v?hGz=wd+aCo{d>^nw1N+1CiI=BsseR8(;I?-lT*w5prh*{3(
zIMCf(Ck}Gc#5XJ9Y9>p4163){prMPjg@saQZhKZUK$gZ+2((@40bpB{l3h=F3x*>0
zfEpTade_TOofI^gNr3Y6kL^4L+A(<{x-eL~zOx+T7N1!RoSk^=PbRZ(E|-jCT7TVD
zSw(#@S-B<+r5U{3lkcyh)Rj*pa1L{=AYse^{J}=DJ~aH|6jR%rio&caQk5nJE+swb
z2;#2K_7K|R@Z-?bSfnM(=9K`&7rIIA;&dz;M>%G)E~~w$Tw@?NZe_`^!fy)q{GbSc
zEHX}aGi&%qD+EY%1tHUD^43f3UKxf1nTE4>B`~Fp2FUPRcCABHbf4c>C1I}OWAo~shZWy6tbt1`AWii
zDFD<;*{s;S+5_;2w@)gy3)q|^ft3l;SbIfA=czpv)M5i-fsPQ?LKKLBCFEkfXbXhu
zabwEe?LD>lchO|D=xSya0-i5O+JhBdkT;6uX)t6J7@Shh{{}I9Rmf`_8seVnIz+vc
zxc&X4T#LKPmGwS^D?PFBMZ>H#QZUIAqoedvZc|ZD7g2(N+Li0Z|H2m^TF%xAy_-?)
ze5+G|MJ_gwz(=%mIL4Pbqul9UQBWc~g`2osXtz
zwpX(7G}zt4IEZHYYEbL&OL2~o7D+<EF7ZYJO_mMHiPE&F+;LDb(5(
zGK5cu6Gu`Jz;W2cm%{Fjv1*>OKHa{g)3s>hLKOx9^%N_VET;5XG&6ZRl_QhZvD*?+
z-+r|_=MC70a*P9{*FrAx`0^N<7tg?Ve0qK!Y^Wv;m9YH|O+BQ?7feY&W_}qa03dV_
zjZsZAgL$8N+B_@7U*6D%YNfC&CY&uXi1d@nik_+rmL^^XT-mqt)ac+(kYA1u)j@@in!B2T
zXRGp55@vRU`qN`G)x<*)8fiHA0K4xu=R`3Z#3TkNuqO6`XOX*p>bA%AbRc==2&!Iw~h;-`A)S|!(3i8Gy5
zaGOy-^zb0tP89rrzj6dcthmMypg7
z%Fn-e)ii~?jXgb!MHh+^PHBVh50xkO)Zrbdv@=}PwhGQ;>{8q-3;ro!@Tr$;Pq5cZ
nr)X~#oyOQ5%#wY4{qRJZO!26O5dS_V8bnG=UbIHoFz9~(&Q= 11.2"
+architectures = "all"
+multi_instance = false
+
+ldap = false
+
+sso = false
+
+disk = "50M"
+ram.build = "50M"
+ram.runtime = "50M"
+
+[install]
+ [install.domain]
+ type = "domain"
+
+ [install.init_main_permission]
+ type = "group"
+ default = "visitors"
+
+[resources]
+
+ [resources.sources]
+
+ [resources.sources.main]
+ in_subdir = true
+ extract = false
+ amd64.url = "https://github.com/rustdesk/rustdesk-server/releases/download/1.1.8-2/rustdesk-server-linux-amd64.zip"
+ amd64.sha256 = "3cf2790c3e9ef70c0eb9ffae02cbe3a2efad71621efda376450e7be3209f2b1c"
+ arm64.url = "https://github.com/rustdesk/rustdesk-server/releases/download/1.1.8-2/rustdesk-server-linux-arm64v8.zip"
+ arm64.sha256 = "cdab02fb8731f05ab34340b91ba8cc8333ea8e4445bda1d53ee2d4a6dbb98c7c"
+ armhf.url = "https://github.com/rustdesk/rustdesk-server/releases/download/1.1.8-2/rustdesk-server-linux-armv7.zip"
+ armhf.sha256 = "2e6df5751ca0188190c08f6b67125820e7f015545787fae34c1a661c963f0c4b"
+ autoupdate.strategy = "latest_github_tag"
+
+ [resources.system_user]
+
+ [resources.install_dir]
+
+ [resources.permissions]
+ main.url = "/"
+
+ [resources.ports]
+ main.default = 21115
+ main.exposed = "TCP"
+ hbbs.main = 21116
+ hbbs.exposed = "Both"
+ hbbr.main = 21117
+ hbbr.exposed = "TCP"
diff --git a/scripts/_common.sh b/scripts/_common.sh
new file mode 100644
index 0000000..944a65e
--- /dev/null
+++ b/scripts/_common.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+#=================================================
+# COMMON VARIABLES
+#=================================================
+
+#=================================================
+# PERSONAL HELPERS
+#=================================================
+
+#=================================================
+# EXPERIMENTAL HELPERS
+#=================================================
+
+#=================================================
+# FUTURE OFFICIAL HELPERS
+#=================================================
diff --git a/scripts/backup b/scripts/backup
new file mode 100755
index 0000000..203cfd1
--- /dev/null
+++ b/scripts/backup
@@ -0,0 +1,41 @@
+#!/bin/bash
+
+#=================================================
+# GENERIC START
+#=================================================
+# IMPORT GENERIC HELPERS
+#=================================================
+
+# Keep this path for calling _common.sh inside the execution's context of backup and restore scripts
+source ../settings/scripts/_common.sh
+source /usr/share/yunohost/helpers
+
+#=================================================
+# DECLARE DATA AND CONF FILES TO BACKUP
+#=================================================
+ynh_print_info --message="Declaring files to be backed up..."
+
+#=================================================
+# BACKUP THE APP MAIN DIR
+#=================================================
+
+ynh_backup --src_path="$install_dir"
+
+#=================================================
+# BACKUP THE NGINX CONFIGURATION
+#=================================================
+
+ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf"
+
+#=================================================
+# BACKUP SYSTEMD
+#=================================================
+
+ynh_backup --src_path="/etc/systemd/system/rustdesk-server.service"
+ynh_backup --src_path="/etc/systemd/system/rustdesk-hbbs.service"
+
+#=================================================
+# END OF SCRIPT
+#=================================================
+
+ynh_print_info --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)."
diff --git a/scripts/change_url b/scripts/change_url
new file mode 100644
index 0000000..31da587
--- /dev/null
+++ b/scripts/change_url
@@ -0,0 +1,43 @@
+#!/bin/bash
+
+#=================================================
+# GENERIC STARTING
+#=================================================
+# IMPORT GENERIC HELPERS
+#=================================================
+
+source _common.sh
+source /usr/share/yunohost/helpers
+
+#=================================================
+# STANDARD MODIFICATIONS
+#=================================================
+# STOP SYSTEMD SERVICE
+#=================================================
+ynh_script_progression --message="Stopping a systemd service..." --weight=1
+
+ynh_systemd_action --service_name=rustdesk-server --action="stop" --log_path="/var/log/$app/$app.log"
+ynh_systemd_action --service_name=rustdesk-hbbs --action="stop" --log_path="/var/log/$app/$app.log"
+
+#=================================================
+# MODIFY URL IN NGINX CONF
+#=================================================
+ynh_script_progression --message="Updating NGINX web server configuration..." --weight=1
+
+ynh_change_url_nginx_config
+
+#=================================================
+# GENERIC FINALISATION
+#=================================================
+# START SYSTEMD SERVICE
+#=================================================
+ynh_script_progression --message="Starting a systemd service..." --weight=1
+
+ynh_systemd_action --service_name=rustdesk-server --action="start" --log_path="/var/log/$app/$app.log"
+ynh_systemd_action --service_name=rustdesk-hbbs --action="start" --log_path="/var/log/$app/$app.log"
+
+#=================================================
+# END OF SCRIPT
+#=================================================
+
+ynh_script_progression --message="Change of URL completed for $app" --last
diff --git a/scripts/config b/scripts/config
new file mode 100644
index 0000000..711fd16
--- /dev/null
+++ b/scripts/config
@@ -0,0 +1,102 @@
+#!/bin/bash
+# In simple cases, you don't need a config script.
+
+# With a simple config_panel.toml, you can write in the app settings, in the
+# upstream config file or replace complete files (logo ...) and restart services.
+
+# The config scripts allows you to go further, to handle specific cases
+# (validation of several interdependent fields, specific getter/setter for a value,
+# display dynamic informations or choices, pre-loading of config type .cube... ).
+
+#=================================================
+# GENERIC STARTING
+#=================================================
+# IMPORT GENERIC HELPERS
+#=================================================
+
+source /usr/share/yunohost/helpers
+
+ynh_abort_if_errors
+
+#=================================================
+# RETRIEVE ARGUMENTS
+#=================================================
+
+install_dir=$(ynh_app_setting_get --app=$app --key=install_dir)
+
+#=================================================
+# SPECIFIC GETTERS FOR TOML SHORT KEY
+#=================================================
+
+get__amount() {
+ # Here we can imagine to have an API call to stripe to know the amount of donation during a month
+ local amount = 200
+
+ # It's possible to change some properties of the question by overriding it:
+ if [ $amount -gt 100 ]
+ then
+ cat << EOF
+style: success
+value: $amount
+ask:
+ en: A lot of donation this month: **$amount €**
+EOF
+ else
+ cat << EOF
+style: danger
+value: $amount
+ask:
+ en: Not so much donation this month: $amount €
+EOF
+ fi
+}
+
+get__prices() {
+ local prices = "$(grep "DONATION\['" "$install_dir/settings.py" | sed -r "s@^DONATION\['([^']*)'\]\['([^']*)'\] = '([^']*)'@\1/\2/\3@g" | sed -z 's/\n/,/g;s/,$/\n/')"
+ if [ "$prices" == "," ];
+ then
+ # Return YNH_NULL if you prefer to not return a value at all.
+ echo YNH_NULL
+ else
+ echo $prices
+ fi
+}
+
+
+#=================================================
+# SPECIFIC VALIDATORS FOR TOML SHORT KEYS
+#=================================================
+validate__publishable_key() {
+
+ # We can imagine here we test if the key is really a publishable key
+ (is_secret_key $publishable_key) &&
+ echo 'This key seems to be a secret key'
+}
+
+#=================================================
+# SPECIFIC SETTERS FOR TOML SHORT KEYS
+#=================================================
+set__prices() {
+
+ #---------------------------------------------
+ # IMPORTANT: setters are triggered only if a change is detected
+ #---------------------------------------------
+ for price in $(echo $prices | sed "s/,/ /"); do
+ frequency=$(echo $price | cut -d/ -f1)
+ currency=$(echo $price | cut -d/ -f2)
+ price_id=$(echo $price | cut -d/ -f3)
+ sed "d/DONATION\['$frequency'\]\['$currency'\]" "$install_dir/settings.py"
+
+ echo "DONATION['$frequency']['$currency'] = '$price_id'" >> "$install_dir/settings.py"
+ done
+
+ #---------------------------------------------
+ # IMPORTANT: to be able to upgrade properly, you have to save the value in settings too
+ #---------------------------------------------
+ ynh_app_setting_set $app prices $prices
+}
+
+#=================================================
+# GENERIC FINALIZATION
+#=================================================
+ynh_app_config_run $1
diff --git a/scripts/install b/scripts/install
new file mode 100755
index 0000000..f761a70
--- /dev/null
+++ b/scripts/install
@@ -0,0 +1,67 @@
+#!/bin/bash
+
+#=================================================
+# GENERIC START
+#=================================================
+# IMPORT GENERIC HELPERS
+#=================================================
+
+source _common.sh
+source /usr/share/yunohost/helpers
+
+#=================================================
+# APP "BUILD" (DEPLOYING SOURCES, VENV, COMPILING ETC)
+#=================================================
+# DOWNLOAD, CHECK AND UNPACK SOURCE
+#=================================================
+ynh_script_progression --message="Setting up source files..." --weight=1
+
+# Download, check integrity, uncompress and patch the source from manifest.toml
+ynh_setup_source --dest_dir="$install_dir"
+
+chown -R $app:www-data "$install_dir"
+#chmod +x "$install_dir/hbbr"
+#chmod +x "$install_dir/hbbs"
+
+#=================================================
+# SYSTEM CONFIGURATION
+#=================================================
+ynh_script_progression --message="Adding system configurations related to $app..." --weight=1
+
+# Create a dedicated NGINX config using the conf/nginx.conf template
+ynh_add_nginx_config
+
+# Create a dedicated systemd config
+ynh_add_systemd_config --service=rustdesk-server --template=rustdesk-server.service
+ynh_add_systemd_config --service=rustdesk-hbbs --template=rustdesk-hbbs.service
+
+yunohost service add rustdesk-server --description="A short description of the app" --log="/var/log/$app/$app.log"
+yunohost service add rustdesk-hbbs --description="A short description of the app" --log="/var/log/$app/$app.log"
+
+#=================================================
+# APP INITIAL CONFIGURATION
+#=================================================
+# ADD A CONFIGURATION
+#=================================================
+#ynh_script_progression --message="Adding a configuration file..." --weight=1
+
+#ynh_add_config --template="some_config_file" --destination="$install_dir/some_config_file"
+
+#chmod 400 "$install_dir/some_config_file"
+#chown $app:$app "$install_dir/some_config_file"
+
+#=================================================
+# GENERIC FINALIZATION
+#=================================================
+# START SYSTEMD SERVICE
+#=================================================
+ynh_script_progression --message="Starting a systemd service..." --weight=1
+
+# Start a systemd service
+ynh_systemd_action --service_name=rustdesk-server --action="start" --log_path="/var/log/$app/$app.log"
+ynh_systemd_action --service_name=rustdesk-hbbs --action="start" --log_path="/var/log/$app/$app.log"
+
+#=================================================
+# END OF SCRIPT
+#=================================================
+ynh_script_progression --message="Installation of $app completed" --last
diff --git a/scripts/remove b/scripts/remove
new file mode 100755
index 0000000..3090921
--- /dev/null
+++ b/scripts/remove
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+#=================================================
+# GENERIC START
+#=================================================
+# IMPORT GENERIC HELPERS
+#=================================================
+
+source _common.sh
+source /usr/share/yunohost/helpers
+
+#=================================================
+# REMOVE SYSTEM CONFIGURATIONS
+#=================================================
+# REMOVE SYSTEMD SERVICE
+#=================================================
+ynh_script_progression --message="Removing system configurations related to $app..." --weight=1
+
+# Remove the service from the list of services known by YunoHost (added from `yunohost service add`)
+if ynh_exec_warn_less yunohost service status $rustdesk-server >/dev/null
+then
+ ynh_script_progression --message="Removing $rustdesk-server service integration..." --weight=1
+ yunohost service remove $rustdesk-server
+fi
+if ynh_exec_warn_less yunohost service status $rustdesk-hbbs >/dev/null
+then
+ ynh_script_progression --message="Removing $rustdesk-hbbs service integration..." --weight=1
+ yunohost service remove $rustdesk-hbbs
+fi
+
+ynh_remove_systemd_config --service=rustdesk-server
+ynh_remove_systemd_config --service=rustdesk-hbbs
+
+ynh_remove_nginx_config
+
+#=================================================
+# END OF SCRIPT
+#=================================================
+
+ynh_script_progression --message="Removal of $app completed" --last
diff --git a/scripts/restore b/scripts/restore
new file mode 100755
index 0000000..55ee0f9
--- /dev/null
+++ b/scripts/restore
@@ -0,0 +1,52 @@
+#!/bin/bash
+
+#=================================================
+# GENERIC START
+#=================================================
+# IMPORT GENERIC HELPERS
+#=================================================
+
+# Keep this path for calling _common.sh inside the execution's context of backup and restore scripts
+source ../settings/scripts/_common.sh
+source /usr/share/yunohost/helpers
+
+#=================================================
+# RESTORE THE APP MAIN DIR
+#=================================================
+ynh_script_progression --message="Restoring the app main directory..." --weight=1
+
+ynh_restore_file --origin_path="$install_dir"
+
+chown -R $app:www-data "$install_dir"
+
+#=================================================
+# RESTORE SYSTEM CONFIGURATIONS
+#=================================================
+# RESTORE THE PHP-FPM CONFIGURATION
+#=================================================
+ynh_script_progression --message="Restoring system configurations related to $app..." --weight=1
+
+ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf"
+
+ynh_restore_file --origin_path="/etc/systemd/system/$app.service"
+systemctl enable $app.service --quiet
+
+yunohost service add $app --description="A short description of the app" --log="/var/log/$app/$app.log"
+
+#=================================================
+# GENERIC FINALIZATION
+#=================================================
+# RELOAD NGINX AND PHP-FPM OR THE APP SERVICE
+#=================================================
+ynh_script_progression --message="Reloading NGINX web server and $app's service..." --weight=1
+
+# Typically you only have either $app or php-fpm but not both at the same time...
+ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log"
+
+ynh_systemd_action --service_name=nginx --action=reload
+
+#=================================================
+# END OF SCRIPT
+#=================================================
+
+ynh_script_progression --message="Restoration completed for $app" --last
diff --git a/scripts/upgrade b/scripts/upgrade
new file mode 100755
index 0000000..6dcf901
--- /dev/null
+++ b/scripts/upgrade
@@ -0,0 +1,71 @@
+#!/bin/bash
+
+#=================================================
+# GENERIC START
+#=================================================
+# IMPORT GENERIC HELPERS
+#=================================================
+
+source _common.sh
+source /usr/share/yunohost/helpers
+
+upgrade_type=$(ynh_check_app_version_changed)
+
+#=================================================
+# STOP SYSTEMD SERVICE
+#=================================================
+ynh_script_progression --message="Stopping a systemd service..." --weight=1
+
+ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/$app.log"
+
+#=================================================
+# "REBUILD" THE APP (DEPLOY NEW SOURCES, RERUN NPM BUILD...)
+#=================================================
+# DOWNLOAD, CHECK AND UNPACK SOURCE
+#=================================================
+
+if [ "$upgrade_type" == "UPGRADE_APP" ]
+then
+ ynh_script_progression --message="Upgrading source files..." --weight=1
+
+ # Download, check integrity, uncompress and patch the source from manifest.toml
+ ynh_setup_source --dest_dir="$install_dir"
+fi
+
+chown -R $app:www-data "$install_dir"
+
+#=================================================
+# REAPPLY SYSTEM CONFIGURATIONS
+#=================================================
+ynh_script_progression --message="Upgrading system configurations related to $app..." --weight=1
+
+ynh_add_nginx_config
+
+ynh_add_systemd_config
+
+yunohost service add $app --description="A short description of the app" --log="/var/log/$app/$app.log"
+
+#=================================================
+# RECONFIGURE THE APP (UPDATE CONF, APPLY MIGRATIONS...)
+#=================================================
+# UPDATE A CONFIG FILE
+#=================================================
+ynh_script_progression --message="Updating a configuration file..." --weight=1
+
+ynh_add_config --template="some_config_file" --destination="$install_dir/some_config_file"
+
+chmod 400 "$install_dir/some_config_file"
+chown $app:$app "$install_dir/some_config_file"
+
+#=================================================
+# START SYSTEMD SERVICE
+#=================================================
+ynh_script_progression --message="Starting a systemd service..." --weight=1
+
+ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log"
+
+#=================================================
+# END OF SCRIPT
+#=================================================
+
+ynh_script_progression --message="Upgrade of $app completed" --last
diff --git a/sources/extra_files/app/.gitignore b/sources/extra_files/app/.gitignore
new file mode 100644
index 0000000..783a4ae
--- /dev/null
+++ b/sources/extra_files/app/.gitignore
@@ -0,0 +1,2 @@
+*~
+*.sw[op]
diff --git a/sources/patches/.gitignore b/sources/patches/.gitignore
new file mode 100644
index 0000000..783a4ae
--- /dev/null
+++ b/sources/patches/.gitignore
@@ -0,0 +1,2 @@
+*~
+*.sw[op]
diff --git a/tests.toml.example b/tests.toml.example
new file mode 100644
index 0000000..953b195
--- /dev/null
+++ b/tests.toml.example
@@ -0,0 +1,9 @@
+#:schema https://raw.githubusercontent.com/YunoHost/apps/master/schemas/tests.v1.schema.json
+
+test_format = 1.0
+
+[default]
+
+ # ------------
+ # Tests to run
+ # ------------