diff --git a/source/image.png.MEM b/source/image.png.MEM index b93a5f4..9c598e0 100644 --- a/source/image.png.MEM +++ b/source/image.png.MEM @@ -1,1057 +1,1054 @@ '_PUTIMAGE (x, x)-(y, y), __imageMEM&("example.png") -FUNCTION __imageMEM& (caseImage$) - DIM v& - DIM A$ - DIM btemp$ - DIM i& - DIM B$ - DIM C% - DIM F$ - DIM C$ - DIM j - DIM t% - DIM B& - DIM X$ - DIM m AS _MEM - SELECT CASE caseImage$ - CASE "tick.png" - v& = _NEWIMAGE(64, 64, 32) - m = _MEMIMAGE(v&) +Function __imageMEM& (caseImage$) + Dim A$, btemp$, i&, B$, C%, F$, C$, j, t%, B&, X$ + Dim v& + Dim m As _MEM + Select Case caseImage$ + Case "tick.png" + v& = _NewImage(64, 64, 32) + m = _MemImage(v&) A$ = "" - A$ = A$ + "haI]KM0NDEVeNGE8U9mN_?9CbTYVY5Da:^f#=h^Z0:B#29D24852TNVJb<9a" - A$ = A$ + "M]\R8XX2::5Q8T#29CBVn4DAgeUeN151MEDY5PDn?W_km>i>Q`jonGbcci9C" - A$ = A$ + "9IVkkYON?Ogin6_ae>GFb_KRJ^6fb_ORJ_V0?eZ^FD22TP?EYGK4ONAGg=]O" - A$ = A$ + "]chjOkjVI\7[`IT`7\XIRBlMEP_Y>l:h8fjj3WOOK8BU^K<9Y>d9EUmFNDE>" - A$ = A$ + "K[UlMen^0a=lh_FU[f?]:g]OFE^JkL`SoIU>KoKP7o^:MennEidhOFQKC5WW" - A$ = A$ + ";mgPR1eWFN3GODR\\l`CNhUc9^3n0n:bLanNmMFk5M1nILkkmY^>61a<3^UHNUn8fL9nZhSZd7U7L]nN3^;>" - A$ = A$ + "PL]g#4BNG=LcgUQk#Q[fF=Pc]0HKHU^0lj\mo5lhO1a\BGML60WW7Nm;B;WG" - A$ = A$ + "Ycf`Gk<:MSo=]mSP^hKQGo_YdYYGCVCCE9gYfkMF^eaC:X;b^kb2>W?N9nQj" - A$ = A$ + "1aVGQ?X^Hf`e5:bOM6X`ln9bhPKo7POo5Pd[2GVZBQkFD" - A$ = A$ + "8lMe4M6mFM8L]E^oL]]N#G\2O#ARiE?cEkCV>Zeg\#1`N:PO8RKQmFN4B?B;2DIgH9ik\]^bgE7O[:GML>0c" - A$ = A$ + "GFYkf63aZLG4l=NN>=>1ALHL2Y>JmZ:hkC4W67??G69o_bMefhbP?7#W<2hG" - A$ = A$ + "MB5>=IA^SF[#R;]iW[]jSA\iE58j;844^`e8G7ZmQ]>8j?X:ORhODgXSAK>?KEhO67ImQ:g]VdWUKS5V_cf?<1" - A$ = A$ + "g^k0\c]?:1c`e<1cdHE2:fKQB\A9R]I`;Qie92ng=EM2XkP?c9Xd7V^8lML:" - A$ = A$ + "i>mPI:L>^H[66CR53S:fRna5?Tn9^ZR5R<^4" - A$ = A$ + "[]<:loRbhoKd5S1onRbPLYbLHj5ccQnoPDge57_^FC`QLd5cQX3\G[_a2hPa" - A$ = A$ + "?P]>P1o8^o_3fUJNE1UgAZ9n[7bU3i`kW:OF7S0aeSi5^]k1cSCQGMS1b8R6" - A$ = A$ + "DgI4=Xnc:b\fOFd0jn1AVeL:#>YX1dnMPLBhmoN#>]h1eMFa3ZoXoVR^PX7Ph3hkmBP^hGUiXeg??k]DQhnJ8mAVEShlO:\Oe38X_Vf]`NJ^SL?D3K8g3Dcbiofe\O7RmhVBlNRmDE0lLDO80fi1flFQJDO6" - A$ = A$ + "4SO9VS6]1he11gDfjA1Kk80^oEam[mc4eGckFHGe]JnkZZi`MK;CDJ?oB" - A$ = A$ + "bRkC^XDch9GD2Yeb2R9SWLNAcEclR>]FNPHbbdS4OV?CQY`m5:Q;gM\:nlge" - A$ = A$ + "J_117Z^R5gGcKCl0jnWR7b`?9bZ^c3n3GfSNHbhRaQHPAUidh8P?ag8eN;_\" - A$ = A$ + "H[Z5c5l3BKo[bO2n_:j0VW73h3PfN6\?YMG?_lMgFmP=o;1i2#L>VCNBOM[6" - A$ = A$ + "`Hfa4=T^;2hnW5e_jo^`NJl55\_=l`ilR;WOLjoC9TVQk?j8Fe=5F25Nm1SB" - A$ = A$ + "R5>k0CJjTUOc1QBdel729aF:8bDjhQR=]GNilbiPKh^5eOco5hcg=lMmmB\J" - A$ = A$ + "HTYcG0e1H>1`^LBYfJmI0l9Ei^:9T4>b:lg3nYe18nAoOfHW;=fCV9NgVnTW3jAKD?nk`g=Jc5=TfaP[[;2nhOYPNJL[I]W:^cdNn2c:^jnSAWaZ" - A$ = A$ + "VMHaDTRPSZbi#T8[nN24UXKn128JeGYTHeg:WH=D#PAfhofPnTlPMVJl#8_n:0on?3]k#_84\ch_Cb" - A$ = A$ + "WC\iJ>]#cZ]Qnilff:cUCmc9bHGQb#H`]7<3h;\W^0>Qm<5`9n=]DoRoiGZO" - A$ = A$ + "A\mik?:hSI;9\UUh?:afali4oCm81TD3gF0aKJf1UH[549gG]h<5dC3?:lmf" - A$ = A$ + "5Xo?5j;0fjAWZ>0nmU0i4`eY693eDV9>`R3=fQe#l3#M0ROD8mh#SmT?bZl7" - A$ = A$ + "[_WWiJ37RUFPBWMlQH_OoSYe5#`IDMm4nUdKFU?X4a1;fGDHN>c[5EG;e_TgMInR2ngW" - A$ = A$ + "lN:e_4fjBl?aGJaLRcD11aoY_WPcJc?BDilFE9Cd0=[7d1OU4K66Qf?PZ^;]" - A$ = A$ + ">8?k]>2T;h;UJEGmR\X>^\NcbmPOA#ORDjPe]P?WlJ\nKRmM;cgd]gX?4maN;e_XkZ#RN8a" - A$ = A$ + "Gia38aMDLhidijh;LPV<8fV^?5^f^8jPoNNVKj>TlV[:`Dgo:9" - A$ = A$ + "j04oXo?KK_LXWF5FZ=ME^=mT0fo9UHOWG1f1k^Ie7?g3EOC#NJQ9Da]49j[7" - A$ = A$ + "CA:9niAEG1L#\ShVHC1LSHQ=>Sh3QNA7nIW1SP?7U[#G`XO\g4AG#l=0m#Zk" - A$ = A$ + "K5n7aFGJ#9QjPmDNFR7\aE9fVn?AZeF0\>I\0Z3Th\ea0iLPOkn4K^NAI\[R" - A$ = A$ + "393KEig\PIV^amYM69n^[f?4kI1nmBNWJ0onFG4<3fWPehaI#8ehXZ]?VH;#" - A$ = A$ + "l>D?G#?=]96\7iZU42RM6K>3^AQa>k1WdmJ=eN^IoJDmSDUGm[hAOhX9O#MA" - A$ = A$ + "dM3i6jNaLRJ[54D6?M1Qa_ceTY`1dXAREmO9H[_0a?PY7DD7hXe;3f`C:aRN" - A$ = A$ + "eRjISaaKW;`_I]oJ8hW]]GZMe20K^5RO_galHoYSSegPl__HfkXDi9]aK?26" - A$ = A$ + "k>S=?^WU2kDn_dfi[2>_JH75_`>X;lX?PhfHO_ej;:IH[6OAM0ogj92:fGIA" - A$ = A$ + "Abm];;7XW9e0f?98\m10oG8O8V;`ZQg7l1DVnKDL8Y]o7`OD786VIRo7o4n=" - A$ = A$ + ";kU5Y:g]^S=g;Olo3" - A$ = A$ + "anEHgI=k2:H_lTni1m0RO6MPTgLU1VaKFDX2kZ19P?#GB#O07Nk3Pa5#m`OD" - A$ = A$ + "b#J<8j0EUF5^K[?`n?RWNkHlk72a^V_Fh1[MeL=lWB0k" - A$ = A$ + "QQ]?oEPmYaVnO:fajBH]IoiHTGcVQ?DJ?=m7bli;>TXNkkgWh>H1nVCOK8BE>=]:XF" - A$ = A$ + "g9HKkYk[M`CO" - A$ = A$ + "]F[b_DgO9LbJG[QSh3EJlR7BK=0VoN#6S>n7a?a70`oYQNfj8WmFJR8nalN2" - A$ = A$ + "MZ;CU>=e5Hk_`dIkQIfnXLgEUgN:[K>AReh`ll\cemoUHW1_HN96>G#^f#>g" - A$ = A$ + "#1ikRX7HV[1ThNWBm3cY7G??N0lgoB2FdQ[A>Lmo>P=LBO0:n7`NV_0dcT[L" - A$ = A$ + "jL3RB2ZS:iM[?RInO^>OcnOfNPifO=a8fFc99gMC9TWI=Q8oXECjU554k4lCR50oP" - A$ = A$ + ">;:PEAN7Tk\EQ#]XJUkfd" - A$ = A$ + ">Q[_GDQMS;#d`eVHF7L]15Mg5>i\Mdh?1g5c9[^FH8ifOSi1mnH7\UWg;O0\" - A$ = A$ + "?6K6n5XoiWUk^:=IY3[>I5^=]=8^oGIh\RN^>XO7MWCDoJf;o]GD>AFn]6Jd" - A$ = A$ + "eM?1Aj9WffcDGno=ehV>>7`N`CeM918c]nlDi^mm0mRLB5^i>i]o:4W" - A$ = A$ + "7f[[kfNO0oSPL:aZVgHR70j_o#=\lTO^7:F6KoTHWY7F:>UHS[oCZ_c`i#R_" - A$ = A$ + "kJ8mQY0Vk>[NGOX:MZATBGVf>^W0ToHJ>V`[_;:a^QgGX5M:4^oj2ALOUa1k" - A$ = A$ + "7P1o2kOIn:XoW`?Yk_d`5?TjiUWMS7WNNXaUh9^6iRc`a5LXjF\BG]^4Hf^_" - A$ = A$ + "E>5OJg8S^NE1URVkRdC?E?]EicE[>mdmJNe73;\" - A$ = A$ + "SfN6\;MPE78RM2W3^Jk_0HoD8O;dGKTIk8ia]IhK4KYaoT`1fH\Inf?FPTi4" - A$ = A$ + "PN3I\oL]F^obkIM1:H`jU:cN[O0PoATb:6PR_EXG0cJn;:MKbT2WVnAI\bk;" - A$ = A$ + "1e?3Jh\#?UFbjUFQ`HD?[PS_RI78jkSmPCe?_ghTY^5CMK_anEZOHVkV]MGP" - A$ = A$ + "e:3FZ]6C1\kK8OGMlUZLf1bo_Wi^9lYRl1>T^_B`Q[K^BkLia`KK?NP9_keB" - A$ = A$ + "`?C?18_GifOQncO`jC3nOOC#>7kH0Jn9?;<7GobLKJ?:Lfn_`6oTHoQ0lg_V" - A$ = A$ + "MWf;_R\#>IBL3g:9^7a?eL9Dh:6J\c^FMldmYPbo>\cU^gKT_UKl0U4P8Ke5" - A$ = A$ + "[:W]GBn^JoS`i?HhKaC?hFd?1QW9cJSCc`E7M>0TGec0jaS1fnS87d?H^?_hdJ8mWFdQEgAF" - A$ = A$ + "?KQYTJIcQHk9O?`l7\andfS2CO:P47;M1:?kRPbnOIRmgR>8_JK77R_>[HFmW;l#e^fdOZ7=e<:IfQ6cbD58JoAOB4k\mo3k" - A$ = A$ + "mZ<0A3EE<2]ZO^iiddG?5lSfo;0nCo2PmO6\mW7nnV2neMB1md#9Ida36MjU" - A$ = A$ + "OgL#>H`h<:m<]=U6kcn8JmGek\aPUNTJRC^5MYRmZTSmV2GZib28YS\Bbni#" - A$ = A$ + "M]SamdG[E3S8bR^c;" - A$ = A$ + "gIKX_o5agGbDaOg=D4KlcXWaN_Ilgc_WU`iF\J2lM=n7PJd]3iCk2Tg0jmX8" - A$ = A$ + "i>daU_ee7DjM^L>X>8CTKEJ\3n:1UVkV3CQ;eiZbUa>DiZ]O0[ci9>4_>l`Y" - A$ = A$ + "^VOD#_=]U\fAIBBJSc92TcQ8g`m#\mQmb;TZ?Dji39nU`g3Ro\]EG4:6Bm\1" - A$ = A$ + "Kl71hkbNQO;j_4bSU7lkh:`ogUKg=F8_WLnAQh?AJlClaXaOjk[We>kV0N_C:h#eG4?S?\7l" - A$ = A$ + "CEWQ6oTnDGQ?2]eHl:LJ\M`fQmY<1I?gDk3lRbMIjhb]fRJAfK>k\fcb2;iN" - A$ = A$ + "FD#Yj\X0Uo>U5TLge5?#Un8aFCY1Onm0nHWWN7" - A$ = A$ + "Xh^QHfa?ZGo:ifJYMYF[?k\fKAQWUUE6H^ffHD:]KlAQJLoM#OMIVmXaJ^Sa" - A$ = A$ + "4=0DW[OeoSLkL3oaTKkQR1iE6iFUHgOf2h<97KCfG5SM1aOh#n?Y3GFdbLXm" - A$ = A$ + "^PJLOUGmfKS\;f;Pcf1GS75Nmcj9nOBlOJQm[fDfKK59Ua6^W0BoYW7QkA?i" - A$ = A$ + "oXa_H;ZCB^[Fg^aDfIeUQnO?;^cEhJl0#mQOUMm1B?bf`nodmjLgnbiRh?Y]]H><" - A$ = A$ + "hWY>SXnGQ?b6^Z#Ti#ol19Y>738G:S2c]<2X3nDmKTgcG4_HdMGAi_fK8d#JV2k97aNg?=ROl" - A$ = A$ + "\#Tdk8aBSC_WJ:M0h70h" - A$ = A$ + "nKDHgTCjJ^CY_FLWaj`M6om2k]Q]Ta[\2Aa1al#o=QaPM6nFH?g9kN\Ij]0]" - A$ = A$ + "mbjZDoTJYYDDj`d;3OOWQeNkX>S1#o]R<[fNNf=\Bhm>QWjS8OYhnT\eb8B\" - A$ = A$ + "Xo_UknZ#9hk7F2?ml30a?QcAFmJ5?^KaMEL8ifCmI;aRf6UJ[U_6noYhQO:j" - A$ = A$ + "0hk0cgNFb>:YSgHj[U:OWVOA`QKNkImj[AA2ELC5amIORXbHc5`1iI4WcT96PQ7fXgiS4#:_EQQ:Y[Zi3O^?S4;]l=P" - A$ = A$ + "Nh2B]eRGkU34LO2SBhUc>96SiJI2AVe>2Pm1i_WeNm8gjHD3gm_9" - A$ = A$ + "fAQ9f7k]:Ag=bA#?U5Y:K]N70no2i>mZf297ST1eN2nMGobUj0VAbJ;k2RMm" - A$ = A$ + "J69be]]F>S4;jNeYiQ>Y]E8Wo?dW18jN\W0liajLG2beOd\gOE?8FW3[aCbg1H7kaIbm8A_" - A$ = A$ + ";5JlC=CmTcOAfU3dK5fC]hgImaXd]a:ac>6kHOl\hPem5KFkkWc[GV:a3GKD" - A$ = A$ + "`ldEWW3CoPWc]3A8kBkRPoa79^kjVC:?O9Qcm5:P33NWj^8#M3b5O:k]d`bi" - A$ = A$ + "][FTXQd\5hkjkTH5iLVLf=6W^^2]=7j]K#mS2mg<2Pm?FDWEGDj]\`4`njmP" - A$ = A$ + "mFm6kH]nYRMBNOJ\W9m^kUHNi1[bFc2Qn;j1Z_L1FiHYkYDkI4eOcK;[]]d<" - A$ = A$ + "bMX:3??[j_?0oO9]?j4NR18l5gb?;fRfW=mgJ5YVJkgM04O0kCRO:O1:o0lm" - A$ = A$ + "#NXimJ;<4N7XBa27Dkc0hmT`gk5AN7Wll?QmeYKDamSHGcG2mIGKVK^#^9Fe" - A$ = A$ + "]7N`K0liQjLL=L9X6?b_Fk" - A$ = A$ + "ImZ[##d=mPAQce`>Go_5fIh>TIoel\=OoW5dOINFeRkacbI7[9_8DcChA[<2E^KKI#_UO[GL8#Wg3kiChQEobLgL9IP" - A$ = A$ + "LJRfblM\jP5H[I5Pmf9lgN99NU7Xea8kA`N[OTX1KN12>#aQWJWU`1?C=h\V" - A$ = A$ + "Pg>NDOaM\Qi41O=9iJFcF0LO7NN1VLWiDlY>MHW=Wa2kO9nWZcU5XTQKE1HgkC95O^\bkA\mh" - A$ = A$ + "iEiC4di6O8TCC>5bW33WiiLXjR1VEZL9CW?0FG4j[ARE3mc_g=VGJmFAXi^_" - A$ = A$ + "U6dEL^RHY7#M0f_0_GOnnUcC^XPbHWUUAf_M]cAhQZkAc^c=LGLOYBha]lk8" - A$ = A$ + "ZPFg=BZciIFNVc:1=fWTkdomW?Abf4;O" - A$ = A$ + "NQQH?X:_Ib<=HM^oWRMl\8;aFm9Z`UaBQi:n:`_oB8nU>I>O\gBl\;lAlgGe" - A$ = A$ + "g9JkAOo4Fk]h_WNI]^>oUgIea:bRVZ0oUS3j];=UM8?6eI9Ye_BZ53J5fM=L" - A$ = A$ + "cZ[E5R\g[R0HR5Hd3A[KQ4>L^B\?9gbW7YN3" - A$ = A$ + "T7nW4dCS?CV_`Bb0]m8gQI^jiiIF6d78c3FJ`B?l6h3a:_:Poc#g3PgWW68>" - A$ = A$ + "0T?5ba^blLEOJ9M#`?0Ve6iL2W9T9W0U[SFG\Z\KlQQlMo=b\dCQ7KaFd=6Q7Q3[NX\OmeMSAnWo" - A$ = A$ + "SAQmGPfNne_8?n[HL0GK?RObjia24bcM;BaMXK5cki]>0kA6nl_lAm#2" - A$ = A$ + "VW?KKc7`n:2>OWK:_3FA\B7DGEB]fbWA>CAfJM:WWTF73jGN48Nh;Th`#3b" - A$ = A$ + "6DS#nF:<4TO[T6^4>\ilTIGeXo;SO1C^2VWcVOL?L4Cc]JB8fY]i>fE3kTHnndlMR>DS?IJKj9b4a>bO49^GollQgFGlTkRS>WM" - A$ = A$ + "ROEUnUi1:=Hn7XR<1MGC#OKO;Y?hYi<6BY33o`Nfk?3GYdW9An7[#oWU[R8g[9:]dRbIi^S" - A$ = A$ + "]XbM7O9MlnDi#1?_>S2mhoS2k]Y]`mEGINhlTXOO4UO?TnZA\;YobW1ciPTM" - A$ = A$ + "]K\?Nl<2UK?E;#h#JO5hclDhl`CS>P:FP\oTFO_l\IHSB6\15:LDM\l]DI`H" - A$ = A$ + "=I57L]nRjRYN:<0NP?5j[[dEcAAh:6_GC" - A$ = A$ + "LeA_:acWWK27SS=UcQ=V[ob#oUoZ`nJnPCUgDVc]Af0nWk>g9in02?7PX>#D" - A$ = A$ + "o[NVX8\_Bl1kO;VghQ3NL?j1W6_0d_aYTIg" - A$ = A$ + "X=5>K]6a^KBZ27JR=;kK_;XnngXTjLH?Zla[9l6IFZ954cZLHhNQljE3Ho0`_o6UTka6?" - A$ = A$ + "k2OLFcd>>m\5hI#7j[^i>i_gb_iP0k>K\c<;=N^=TI^n[S2oClkIT`olML=Q" - A$ = A$ + "oIkhJRm30n7\BQ2=g\6#7l5R]H`c<]\e3dj0T[W" - A$ = A$ + ";SkE0^>o95>Jkh`elk1f[M2i[dZ`I;?QBG]Lob6^UKNFfdOSbLeZ:U3KljEj" - A$ = A$ + "`hmV_;S;6jK]1X>n;1fI7ZLgnGXdIko;U^8hf3?a\haM2?gS93PceXm4`<5K" - A$ = A$ + ">kGK]i72]M7?WJTHNSNOF]#lSWooO7[Obl`cmgcB^66MPh]\>oY22gO]MF#`cDk9Ej^MlnOlc0LM<5" - A$ = A$ + ">Ko3QWoa0^oJl\72_n?Rk13TcQH6jWKLjlKDmd`N?hTcVVfa#^SPllOR`^K\" - A$ = A$ + "SOh0Bh5NX`inV" - A$ = A$ + "UV\h^ZN^R7#kNQh]_3iAWLN:VRNPemYSWkS=ICN_mQk70gA2bo=N6[7Unn2d" - A$ = A$ + "ck;WN_oCQGJVhLkkoYYROf" - A$ = A$ + "j0geo6hWA7Ph7c9Re48WkH#7PmaSW1MdG8S]_lDheIeg4Xo" - A$ = A$ + "e;I0M73_7M0ilhi6S4GB]Wea_Rka?kG5Qmm685?IDm`AjQUL_5MN\^6Pk?5Z" - A$ = A$ + "[oGci]ZN^X=WKc?HD8OY4omeM?1PH?J];d?fakdIVU9QWJn14nV;:`XgdlS9^<1_8oHhI>f;<[i4RkC]KQmd`F5\oJFH" - A$ = A$ + "V_#9ISgGAY\Vk<\`:iF2VM_=\?3jC7fo?1oXPn0XTA8_f0j>;hKO6ZkK>]WFDoZoFAmYNHQmddFc^cJ:Vo^[hjCO;;RKdPm>U" - A$ = A$ + "eTOHhn1#n2IKcm\CHWDajC5k\_?Hogiok]>XV[QPOjM]Bi;#MOIPgC6hmZCV" - A$ = A$ + "=?IbWe4[6K6eT]e6Oh\]" + A$ = A$ + "gJSihX]]0a9NlGW]Sf>Ff>Kk4IkXeCR7oCj\gfgP7o^jLdf>bfNco9]>KI1I" + A$ = A$ + "h`deZM0C9Ta`E5ZBc;9i^W" + A$ = A$ + "0N^lHlRo^>JhFejXeU2L^>P]Qei0heNKoClhOV`\>7]OLPcCQWo^>WdkYeO0jR_5?oOEWmFNe<]gBIIIg`M=5W6UZ1jRDk\8oBkSW[7" + A$ = A$ + "TN#EO;b=BG\K;I:>JOkih\m?1bA9lbScAQ" + A$ = A$ + "LA]fIb5PYT\EWK9jXi9A2Q11<9PCafHa_V" + A$ = A$ + "P8loBhFRC8f[g]T]]JgCQ4PmhPO8QK5MGL`JfGSbcfJc5TSmFk877]o]IkXm" + A$ = A$ + "C2M>Kml4Fcb13OG83k=OAVH[i;ZaFCoZ2mjK7fif6UQIL=c`AhiI2mnVX>1j>lIB2YC?" + A$ = A$ + "3n>>JFfJfQJK=D\:W6TRh0O9OQHfgRm_Jc=?nmIb4iBcdF;_#6f4l34[34`?QkoM`^VnFR_I\_:RjJ#^LT3_G^lI]?2R[9oba`=^Nial5h" + A$ = A$ + "`[ac3I4U3Hlh:7`d9DfWQOBIo6oNUmYoX#>Rbn=LH871_ng1iHZ6`h9D=PYS" + A$ = A$ + "3maYQ<:kca:dOC#G`d38n0O_W5jRO9CK=mnIH]aBDeCe9V\mUjGTkI>NAh?9" + A$ = A$ + "[Eh^hH1B4W;lg2k1oNUiMRk[\0bdB]91L^HTOk3AN=HcAl84:>Mlhf4`[Yc3" + A$ = A$ + "\NFP[CZ\_j9Ln?DdKmm;_WJgZR^Z[mdgCe[:nlWXNPRa8M?MMLjJb6#G7Lh3#fN1\?VMgTdLLfJE`VoU#>=Rc" + A$ = A$ + "YLbSi[?4bOI6fk1=N6PkOBI_eogDdE=_Pl]_b78]GHQbRddO1HG>R6;=md0OJd]U2l?jm]8>M0QONM0QOboGdS6mici_S_KbV[L#3W7GGW1nhOYl^ZImY\]B^]4" + A$ = A$ + "N^lB9b:o3QUdBVJPQW_Fo2]dYaT#:o>mQT`ZkNm>\j_D9Vb_9_RXQLmA#RIE" + A$ = A$ + "gP_QGgMiGT]?c#CL3c?1I_EIG[R^[]Ae3HlSEIYaC1M0USll#78h;#a3SVYe" + A$ = A$ + "F693K]LD4;\aAahoVAOB^`^#=N4cCmbYMPZS4ieG4lk" + A$ = A$ + "oRR^[ImYmVUM" + A$ = A$ + "S9fl\R9nR_]P2NYgTo2hV`Lh==C?3_YIa`IXMlHN4kKDVKT4l^GPkT8lg2?G" + A$ = A$ + "XM83[==2b5lUJ6bHE:=GOTYl65k2o:AORLjPU=91onXic" + A$ = A$ + "gUS5CI1Kn#JMdfIXNFM5_CaK<\KL45mDo1E\WJOfTflbbdoUcIc3mAehO`5=" + A$ = A$ + "=Oi`m\Hfe8NJ>L6L7;`m4]gdT89\g_Dg2km;3nQh_i5j_I?WXgC4_KA^WXeJ" + A$ = A$ + "LSY?Nc2m8\>bSY7RiUOD_SIC;8XdfiS;CAoefP:;6oDL]M>POGa2^d1fHjPo" + A$ = A$ + "F6mEk]Zn=FR?a_S5cd14n9oOafn\#?]J=_j4cfI;?1`n?RllDOLC0k`^gGm7" + A$ = A$ + "5E3DcBDIadWXIX61F7;FPd1Z]" + A$ = A$ + "gdiQLBhg^MEmEUbTfb2l?9;UiaD`k2WlmJ=aN^5o" + A$ = A$ + "LLmS#HO\nELY?\E[KT^8\>A^Q>WSGQ^nLm=YW:g0U]cUU\Rne[Gm#VnBH[?=" + A$ = A$ + "c?#X7DB7H[Yc1KhADKfDm:kJEA:MccbSY\S:HhG\]GSejU3K^IVOohSiYnC_" + A$ = A$ + "0EO3iOOQDgDQI5kZ^UP5\k2fl8O6>\ciobKWoE`i_6f9ILH7j2Gj34g6ak]L" + A$ = A$ + "dCkbM?9;Eh>Y3TmF?V_Albc>49_MAYQNVZ7Ho8#4k30oGT?Tb5#5VIBf7oHN<5[55Bf>KJnX6gQYNi5kgcZc=PacRnbL:Mc;kj" + A$ = A$ + "CHagN`A=[Yh[H\;Hc7W?noQHoB\kRVMQ4ZGNFol#?#hG#7Xn=F\?9m6i7PR>" + A$ = A$ + "ZF=l1j0HodZ]=NO0:^0e3o1e3Z_1UkZ\9;iIce5neeEanX3caZeI[m0k?igc" + A$ = A$ + "eKWPOoP4feoe:fmZGZT6nSACm`8fWoB`nUaVnO:fYjBD]I:o49D=JZoDGcfB" + A$ = A$ + "j0ZW6X3Xl19\cke;Y_f35PVN[i^#mP?0a1S`Rm7KncccN>;=lQJjZfOOb?g2" + A$ = A$ + "l?dgnNL;bMW[kY1^ZbfN;;1ej>THK?OO]WGa06o5iMGg;:mUFLjaGb]54EOk" + A$ = A$ + "o_`>QKQJbSCHce3QmH>MP[nJ7ZGgoGRM1lBiU4hLQhJShLS4R_;VN#H^68An>5j1UC?b^ND_U]SijWbmFA" + A$ = A$ + "FhjoMP=Ln7XNV?=jIbAJkLU:S5eAEo^E5Hf>[=" + A$ = A$ + "jKIchjk5dJ]iIYLhE7C:kNin6FWi=f\Mlh?JW" + A$ = A$ + ";`[DjhQl?mN[93dkSEH;?ehl1XnH\d`?SnWO69KY`9[IhjWd_SaCZ\Gm_Y\=VOJQDl=5#HENWnbj9Wgf;DGno=eh^LL>#mP7_c2l>CWV" + A$ = A$ + "b0l5_=d;bA0O3W<;K]Ll<\gd10WGUXZc:R8k>G]W2fOan0Bgj3Rl0U7U6;6=" + A$ = A$ + "1loSd<1R`oiQOmYQHGj>:A5Va;;`glk3l?2aYTXJNWG5hUAaNZNQCnI_o84\" + A$ = A$ + "mSQMQNHihDB<^n?Yn^0W3al^;Se7VFJISdN28nSiiHR^n" + A$ = A$ + ">SJ[=ln::<8E3FoM" + A$ = A$ + "0;^VhR[Q32n5VS>7==GKY5`Wl?#im4lmAnAdWO3W0mDJ>UGLA:2_nYhGDU5ZK9DgNlHoBe?2cM;f^;OXBmCSUJR3fmE2^E1W3]ClokJ^K6OZ4OP3Jl" + A$ = A$ + "[T_g:W^VM^``U^Q7eW9_eUc`_#?14_GYgKNN:KPZB0o__1TC:>6PWOB`cXaN" + A$ = A$ + "cdI;K3kGhW5SOF\oP0omZO[9lB;:5RCVHFi=aRk9lc=G27^8LG" + A$ = A$ + "o2_iIi9=O8QO:>Pak;`OFk^8gcHPRS<3[VnL04_ZPSES70fnmU5" + A$ = A$ + "d?D^_aaYePV>VbmFOkYlimFQWB]EA0II_Qk6nkO0Sc1d7fhZ5aZ5Sn#kCo1T]cEo89fH^Q6iB_>_WL" + A$ = A$ + "Eg6S_0Gc5`KoUgkll#fkEL`IJYQ73O>7fe^8h\oWSIo=K4iEKmP8nj4IbUS#" + A$ = A$ + "`7S`ogY\kJFA:]=cXRKQgRg^`?dcDL<3GRZI9dWBfkZ74SMJ^K`ie8PWY?GaNFmbCl9OhhCZPY" + A$ = A$ + "6#hc?KO8k?iCBHG\oOP_GYN[L`b2Ga#VVN6fKi[W0n9koYQod?3\oC`fO:lm" + A$ = A$ + "=1lKl8PWY2BZmk;\4;n>lRhPQRchdclfDN\?emI`c\OWEiWVmEATIIfHlD_:" + A$ = A$ + "YI]fPddGAN7;f73S7JlnXI]MQMRSAT_;YQ;9`\]J83PkM1kn_3" + A$ = A$ + "V]kKa\W=;iUFHZa\RK9XP:h6mSVmB8O<;V4hWloYM0Ak4;UmFJXJjg`=R?_?" + A$ = A$ + "W_f1S_DFO]PgW[h#jj`5Wjjo1\KPeUbV:BM\[JJ1CL>4b:A?h`f7h;m#LmQb?" + A$ = A$ + "O8c_4O?4nCeBU1[M`jW:\aO4`7a1`Hhg\YcBlHi2of^4lOhdk\VlTn4PkEPo" + A$ = A$ + "Hha?c7S7o9^mRl8^n;aOMF=QnWKc9TSYe9]_gF>9bYniP3aW>S1[CF:f:do9" + A$ = A$ + "3>ECNXRl:>lKJNCem]8obdBeBHl;K_]3ROCnmP_:GiPY[Q;PJ`WDnN[_SDO]" + A$ = A$ + "7?W9_dYahL#PWYa`>j35aT^l;1ne2^lddGE1RnPc1kFn_Ck9jbQOPM:goY9^" + A$ = A$ + "c5]c^;RGk8bgCEi;]i7`5niZc`SOFOZ;b=5FZ9:]fK^=HkXnD^8K?gLk3ll?2bWN:ll72jVCTYeVi`?Oo1hJhkDfK=57kcVG4^`?hNc5nagCf" + A$ = A$ + "kZDgDKYf4`WOG`7kDlk0Uf=T`>n9mjGUUU6KCc#EUJ:_In1URi5kCjFFEXj\" + A$ = A$ + "fl3SJLo=X_>W`Nd4=g1fY0ZceKmomdgi:o3C^ek?LRGIRKEVMoIbe[ahHK\n" + A$ = A$ + "Z4\;4n32iodZamES[gN:oWICWVV]3GSk7?o9L5o?6n?6hkYUDg" + A$ = A$ + "`RR=YENWNWhC=36gS^boaSOEV[?f\Ldd6aNH?>oII#HGoHO<=cd1H?eOUF[=" + A$ = A$ + "^j<7\RTTI^X0di\QK2L\AW;Tc>aLm4fEe?\=mXoCEfIe[8YWMfa;Pm0ZOJnB" + A$ = A$ + "k?hbQMBhZabQO5XnW2cU6LFfJlAae`QV`>[>7jom4d>Gaeh^#mQOALm1F?bF" + A$ = A$ + "Xno68^" + A$ = A$ + "D65c]<2d1OFF3e#UIJ]QK5fSM`VWQGG9^>7;G?aedNZJEBO^lU6^aK?D?=L]" + A$ = A$ + "1hOMLHGPSaah8NlmCChW>;4an>cdmdAoDhk]6lMaj_E8_:g^K`>V7``WQld?" + A$ = A$ + "9^6nAahGc#=AkJmh:6dhNCNS;<]9[OJn8POamIBbeQM[Ua0e4WJ[VJ2o_O5S" + A$ = A$ + "WAHgIL^a]WJ>M0l30^o6]FKa>O=g9dG;]cH`eBo6n>5MGmjBjUGTb8A5gS]#_5T]?c>:d3=V[=>MfJiU`g7VKdeNkh>S1XoF`U]e<\f`R" + A$ = A$ + "a[Ai0hZ?BlUBkCb2h:c\YoJjK_4M`g?`XOZIj=QO6WSRje::JgRPCM\ojDEK" + A$ = A$ + "f#=J\dhGSoO>NhWP>0O7DnF:FcEmFQnJibgYoWU_gjfH:_fbd6M9C?4o;kjH" + A$ = A$ + "fm0Jl>_Ti>5OFM8\kZO=3Ijj" + A$ = A$ + "YIZeP[9Ac8QI\`eo#V>TbmFKnBNV7;dTFK^NAl^g:_0" + A$ = A$ + "DgAib`WkCSMeo=#?LJ8SK_L#Xm9#j5fNJ4M]LA`af80k38KK;oJ8^eYHNoFe" + A$ = A$ + "=hG0=L7oVHW4QHOZgZHLFSGbk2lIKYYK5ho;XcJUXJ;\L^ITHGgFJlhP3TG9i=EDbaZOVn#hW`[#<0KVCNNXSM3iiEB_nmk_" + A$ = A$ + "\>;CQR1dg:Yk`ooIL]KBQco3oI0R_7k;2ONZ>gIA^nmWj>:knXjLD=NFn>PM" + A$ = A$ + "Z7WafS4o^Dha?gXg:ZWJE_c:2GWcV;U>kHRSmYcR3EgGEO6NodN" + A$ = A$ + "]RbFe`[>Dk=gi5P]?5\;]AAo=H?Zeoa:gIiiWH" + A$ = A$ + "S?DdDOm^`>??KSag#C^hBA0k\lnlHWeO9[gb5jGfFZC1j_X;DOQlm5babgCY" + A$ = A$ + "QS[\gjf#:KHN9UnPU6D63Ij^1noBNODQi4ii;^aOBUI3?CR_eRR?nf^3_In0" + A$ = A$ + "lk#U;>Pl5hl3XGShQFj[n#n;MGUZBa06NJPgSP_gc#l>>fiORj[chXZjU`^n" + A$ = A$ + "_4mI_jTGKNBRY\K98oF9liAM>Qm9mKRMniZLM6e6j1mB[Sb25mP^Dhk3NM8n" + A$ = A$ + "3JaU_?bk=:Re>Ljk^RiUPYk9\\fCYNWi#e87_nP4gBRm1hgUhYEKadnE]gbc" + A$ = A$ + ">Y]TO047c47;2jP9j78meVU79\Ska[TNZi4XlMG^J`Oj[Xd\Y_3hnN;\3IaHORn1TNPf?IJM^B=P7YW7hoX\M7g_1N_WE4n9QZ;>RJ[=mA:7X^I9OG" + A$ = A$ + ";8XhgI1NAWY6JFCQma9T?D#78MC?\kd>fXLR`GCMjmYOM0g70Lgl]PGY?F9f" + A$ = A$ + "WT\]DlDRZbK8Ho:J:1bbecGWS>_0S]cL>nD_LHGGARd3T>PjG#j[=C?Bk9V]_9]iRB:egNeCCaNZlQ" + A$ = A$ + "CMW[lfUlR58EBagJXnnhG7[>W[Ii5>[4lHO<^CoGOn4IcDiX>YHFZGTV3U>_" + A$ = A$ + "\A4Cac8#2knFj=`VYQZcmoD\CW5IeFZ:6]>J^#dSkIFk\l8DJFOI`OiP#_QhPa]3" + A$ = A$ + "Idk2[_^_BSi6P>o:K[#?2N=ij=UK?nj" + A$ = A$ + "V^oB:mnle_ZWV?QFef5WQSZB8fM3o0<[=ai4=CX#>1>I\LS4g1TN8Z" + A$ = A$ + "e>??2lIV1VQUC4ZaaQma_o0aL;;nLI:nUm3>S]fl3PlMoEf\dCP7K`a9M" + A$ = A$ + "nl61il64LXLMQlWn3QBmG#fNIE=KGn[DLP4;?X7IfeSh3bcMSXWX?0c1QlNS" + A$ = A$ + "G7#m8S?ocAj0\?mjDKNEY8afRMM>l9m#d2kVDdiEPT9_]UkNXMV_7T#?V46f" + A$ = A$ + "kLlHW`]HnEYM48HcYllYJIV0k;b_L\_ZHcaIcc?7W]onlL6?NNCA]ND[M4:O" + A$ = A$ + "KjK_R7<\:WFH2fNRgHiUT7?_ALe^Uc_kXPN5bL1N9VcCQMECn_2n52i:4nKalSkRSHN^" + A$ = A$ + "ESU`>_=GX6W>`G\Fce;5mhDHf>Jo0oJHW5cgSn3[L?el49\V7;I2k4oA\hNC" + A$ = A$ + "c`=Y[O>S];>nLfalEUjAbkZ#oT][BB6j^JAOKO;[?h;cI#NN>57i" + A$ = A$ + "c^GCdI^AMCaIk[;KW]oUlakCT35jlj<:jao70Wa[Cb[\hImEC" + A$ = A$ + "HGM_5c>3TT8^f=e7?M6QB_[bU[H#3_oPa>gaD_ULj1kPk" + A$ = A$ + "7k]LD`oS5]fKZ2E>[ESFKjS85[[:0emEY_bffD8K_0n5d1glfncGE#OflHBHom7mZ3JmCcMOO[kegdkL5ZIn" + A$ = A$ + "1VYIJIWed9N_I8L>lY[9jQ^;TG_LPmMQOo=jHgS=" + A$ = A$ + "^f5nHmecV[Q=K1M6dAOee]CI_IagP_`^;6k2cBCWKS7=N?I>LSg`D\HjjbdACI[KhV_6" + A$ = A$ + "MfJn^baAcc1m]F=ZSoR`>K;KW]m5H7XoCM>Hhf5?aRhaEH79PcDJ^6372cD\" + A$ = A$ + "fDOeUWSolfMjLZaRiia^0Wi4nYcoooUXOBN_Cog9BHj1B7XJMcgmhOai4#Bk" + A$ = A$ + "LiY2M#=Z7dhkSlRW#hNAPG?`aMhhe3P?lF75lnAn[W02MVJ?R>W]AgoSO6`5" + A$ = A$ + "foJKO8nk?6hn[YcN8NnOPf36TCBH6mcahDW7gSO?h\cVVQcCL7QllORR>[Ym" + A$ = A$ + "TOi2e#akC4k^>KVdlDP35Qko5ahORj02oD\Pje\#g2Kc?PgAolgO#BNS2W\Z" + A$ = A$ + ">:OjPgRg4aK7VhAWMN:VPNP?^PCG`OO\AcS8Jo0d>B8n_YcH=kn6SZQ9ljLc" + A$ = A$ + "]cI[5a;]#L>UOW>O:SPiYn1`AGObO[bOX4FcLCFhl8;fWORHGlmod4a_HM05" + A$ = A$ + ";#hGI?5>Y`jH^NBjPXn;?P?9lRi6#bkXQkQ<>>KYHLnkg23oTbNZkSDdIE?I:K]hYVPYkVeK" + A$ = A$ + "CXc>ca5_;6k^>geo6hG#7#hWb9Be4HWkHX3XnhYcP>i;Td6GHLBgIiG?doVD" + A$ = A$ + "g_a3#gS>#>5M^aHaULkIUSg;agSORi2L2l2jJoKLlTae37[7FfmFdYXjJ0gO" + A$ = A$ + ":Z[oGBk]:OjT=GBMgGX4OYmV`NH6hf=XH\;ncaS3cj?TZNZgYR^ZNmbgA5?Db" + A$ = A$ + "?O1YBgGAa]\K;`0a^`5gKShcPnU3koWPOB8O01MP[k91^UUCP" + A$ = A$ + "dn18n25KcM]CHL]:nN;#lI#kO7ooa[3Zh:HhWOG[Ln2LgG6dmT1M_jTLec`c" + A$ = A$ + "H[jVm>YoD^14A;c4`i?1>aPM" + A$ = A$ + "E?aoi8:jSN\aO2LcL4E4G`mDWIZ>VlMEiRUnZ5UC<[M>BXMP6^QK?DQHL2gn" + A$ = A$ + "E5VOFdmKQhkcT;7fW8n9LmO3;k?AY1" btemp$ = "" - FOR i& = 1 TO LEN(A$) STEP 4: B$ = MID$(A$, i&, 4) - IF INSTR(1, B$, "%") THEN - FOR C% = 1 TO LEN(B$): F$ = MID$(B$, C%, 1) - IF F$ <> "%" THEN C$ = C$ + F$ - NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$) - IF MID$(B$, j, 1) = "#" THEN - MID$(B$, j) = "@": END IF: NEXT - FOR t% = LEN(B$) TO 1 STEP -1 - B& = B& * 64 + ASC(MID$(B$, t%)) - 48 - NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1 - X$ = X$ + CHR$(B& AND 255): B& = B& \ 256 - NEXT: btemp$ = btemp$ + X$: NEXT - btemp$ = _INFLATE$(btemp$) - _MEMPUT m, m.OFFSET, btemp$: _MEMFREE m - __imageMEM& = _COPYIMAGE(v&): _FREEIMAGE v& - CASE "cross.png" - v& = _NEWIMAGE(64, 64, 32) - m = _MEMIMAGE(v&) + For i& = 1 To Len(A$) Step 4: B$ = Mid$(A$, i&, 4) + If InStr(1, B$, "%") Then + For C% = 1 To Len(B$): F$ = Mid$(B$, C%, 1) + If F$ <> "%" Then C$ = C$ + F$ + Next: B$ = C$: End If: For j = 1 To Len(B$) + If Mid$(B$, j, 1) = "#" Then + Mid$(B$, j) = "@": End If: Next + For t% = Len(B$) To 1 Step -1 + B& = B& * 64 + Asc(Mid$(B$, t%)) - 48 + Next: X$ = "": For t% = 1 To Len(B$) - 1 + X$ = X$ + Chr$(B& And 255): B& = B& \ 256 + Next: btemp$ = btemp$ + X$: Next + btemp$ = _Inflate$(btemp$) + _MemPut m, m.OFFSET, btemp$: _MemFree m + __imageMEM& = _CopyImage(v&): _FreeImage v& + Case "cross.png" + v& = _NewImage(64, 64, 32) + m = _MemImage(v&) A$ = "" - A$ = A$ + "haIUkU0NDENeodZ0cbMfG^KcmNWmIb242;QM8A#PRP:P\H[bR;01\^F1o:f2" - A$ = A$ + "B[5dZ2ZX8R2^6PFIAY8H1T:65[PU28k;IMVQB>idJ7cYTZk4:NkMd>W" - A$ = A$ + "k#Z^CmZTbkD^SOOMfo4:GKP9F^fLo]KBK?OPbd#o8_Sf#cN3j3LKO[=_3Lg>" - A$ = A$ + "4jj?`;4j4mb;OMCc;I3oE_>Cl9N\WlOkfNbZlH;E:?FKjlPL1#Jb]eDALK;i" - A$ = A$ + "nMK=aWiV\nGe7K\I9`EIa^kj1mb=\bM2?7[1:M3j9WmkX=o9\9]nWjfdiKl`" - A$ = A$ + "c6N?biNT4?55]chkIO2Nb>fQ>dj_DFn5MhWmo^ihGic;WKC2knnE7D3nlbm1" - A$ = A$ + "fQVLO`MX9`dfV^P?`fdUgL:CWgI\N3N7lgK?LA7=PGoE><1fh?ZG79NG0ck5" - A$ = A$ + "`J=N\eDSN\dd?1biMKYYc1b54\T\I1cY^<8G2nnck14hk?[PUD9092WUD7D`" - A$ = A$ + "J3[QgIli:#FcM:To?V3MakQ`kSgAL#AA1ojjf1_eogRo" - A$ = A$ + "\e1oo5kPm6aM>ofEXWKbKfXoKoOj8LN7;OgLaW]O79nD_fCMB0camH_YO2`i" - A$ = A$ + "512Pk;:H1]IB__hk]2FYeRBBI9Q\dHFB2EBBao6ej4Dg1OV" - A$ = A$ + "]:Y?JjblVC47To]0IM?UPkO<7n9o16ciY:C7j;PjPNELiM2`NKhoV[3BKkEb" - A$ = A$ + "ceNH7]in;MU62=R?g^_PEFT?V6GRG79?5hWg_>]f6JQFKm" - A$ = A$ + "G3T[CY=N[g<1niXPon`_K2D^n?S^0m=^\;S9[f]aT[f5kI6^WQD>Cn3oOH2e" - A$ = A$ + "1mH\K^cfWBIg:cOLagR2nKOMP4nahUf5koF9\;6WGdNHm`Fgm1njO9Pk61Lg" - A$ = A$ + "\XON6h>Y2VA\2B\FXdEGcDJ[kLdJ[klDJSf4lm=0O=>Y^XaXd5]>a_Z]^j19" - A$ = A$ + "5Uh_C\c1bUTdI=0OF9J9KMQ\NX5#^2WYTWUcHb38hHgcDf2AnSLcFLgUShg3OdIkeFZ3kaj?9Sk" - A$ = A$ + "V`Woec2g]0h6THGQBGT;#I8BL:RJ>6Y^ZoG]OX7PdjQV1YeS=7:CWjEX8ZJ]Dj[IkPNio2BD:ma>;lIf\T?ASI[7`H\[;" - A$ = A$ + "[7^T;39?U;Kao3\N?A^lgoF88OTEdIej0gQiPQna`NYKh5QJgWf]]V^RH^LSBf09oL4gX_M\[1BcDjSNFhModT4E" - A$ = A$ + "\NWF?lSjR\lKWVMm5#io33idokhaJgF47CnoI:f^n2Tjkfl9IboiY\eSGSU:" - A$ = A$ + "dKkV=lJ2h`mjcSRIG3PbjAV1Ua:OOW4A?6liVRFKl;2jQ[VF?dFL1Z7^6PoV" - A$ = A$ + "MAT\FGFJhmici`Mce4FS1D7#n4;[Sbi2^E4[66LigRR>0oNlO3aNKegNTdfM" - A$ = A$ + "oMk4QmjXnoXKKYZ4lg_44WSaMZleKXEIkmU1Lg4Y^JnAJRc\J:KoW9JeoVbc" - A$ = A$ + "A`5jR9WWUdI9o6[6:NDV#QXoSa#k96_maJ45VA>AcF6hLL#Ug;BC7NMQ9Mn3" - A$ = A$ + "gQCCEmJDjSlmdJRG?PoV_9n2GSEOCGVEGbH^\DoKhRihMCHT_Q1kCIAJjaHf" - A$ = A$ + "\H=1Dj=FK\09n18neGh1_ETCG>bH?PLl^#n7a?bKcWE0kFCQeR_FJom4:fL0" - A$ = A$ + "keMI:RXEBJld[b^]_I4VLmQQ3\>_>5fc00oQGPFGMW0Nf" - A$ = A$ + "GTBKSGC:g#B5O1lM3e1=cZ?ILJS=naNlLTlM5Qk^G81:N6i\=`=diHdDoGX3cin91YMLdkSEOT]2a3aQgUVUZETY>0" - A$ = A$ + "T[0jPX\VRmWMcMTP1jg6\hMb#]aY^3=Q6[T>055lgca]i>;FSoY;CG>gaWIc" - A$ = A$ + "S[JoeN\Vj`0f_:jcW6k=ZPmV9=49VC3E\:JKOC9F3\4>K3h1]AeWYJ1a=m]o" - A$ = A$ + "H6ASR[2fS6DlfWoEWE4^1o?eRRgAlYJ#Qo>f" - A$ = A$ + "0`[[<]^WhBdS2oTV_1Vam\V5jk;jTQOGmRf#E;RBGmE9[3JA9F049MPnT=cX" - A$ = A$ + ";IUX6gm:ZH=B7C]\>QHg]Ln>o1>C_lJ=Ei#^^" - A$ = A$ + ";SLFC7_;Kg5[W5]66RCmFfhn7mdA_W\3<^V^?S5`n<=Qn^L3KajM?jgDW#a[" - A$ = A$ + "B[2^2GLUM25gm:BWA9LaEe95AmoFXa^Gag?D2=e][aghGSFoCIEj#amDOA2o" - A$ = A$ + "Cj9?GV[NadjZoD`k6TGe`H7oJLXG6#4ib3Li4UI1ml1_knWibeS2c4N3Cn6jKKW:hW7RfF5?2X3>9PM`" - A$ = A$ + "?8ieD[301d9Y^0Ya6nDk<7[P`U\>cHL0j7dC8G8Jkkad:CCgQNGcifgVEode" - A$ = A$ + "Oo0gVC:H6jm0hL;ESCPO:" - A$ = A$ + "_\AkSj5\A7Lk1IjLJ;FChWje926nhM1lkoJ9onVD7cgZ4G^jJb9AU[VfeWg;[3ZD7\bf" - A$ = A$ + "M4k\Sm5ka1Mh[PmHQOlOYnPCJMIdGV2>E`N6mI:SMAim\kLIP;f3gkP3LeF4V`JdSj0fi_h>al<;ECPQoifmb7Oj2" - A$ = A$ + "fBF7bU?;on[3l`^2`;kk99oj1i\O?PM7f;H>#ofQ5OiO0N?led??Ta" - A$ = A$ + "7Q??Ak=GO?2KG6l>mmH3dgkAI=eh:8Y[X7nW`6dWgTQl" - A$ = A$ + "i?i7;6?4L:;U8_a_L;^8?iXXeg`11KMcban:mORO?h3dhQYY>j`=3n0fVlOA" - A$ = A$ + "3gRG#Wm>XMIg7K\I3ilRVY]_a[;b]COMWUBOU_7C`=f5k3i1]ceIh\Eoc94jHQY6m6=jK:P>#^7MUH2A" - A$ = A$ + "\3njZkgXPa^1cQjmA4l`FoHI=Eel0lG_>9ig[20_HnAaiGQL>E\k0_c`mi" - A$ = A$ + "82NY[O>0WkS;coXEii9Phi:djJhTLfZHhTn;gQSQl?JC78S#mGRDEAK9fOR" - A$ = A$ + ";WmW;iMo^V3>[gB?>[24gH\>J3lfX8n3Qe8O\GU`L?g>3[a8?;`m9^T=G]?0`EDG3ejbdI^Gcm" - A$ = A$ + "k=]j^oOU3NkaV]0>?5SBcF#QW7UVhG5kSc9eoIM8W4fQ" - A$ = A$ + "omjldUmHAPYVnaJ8i1A\2omGCJfERnAYk;CObZI]4oEAoPL7i7IaoSE6A>cK" - A$ = A$ + "Ej3lhUAPl>hOX?aDh1L#gIIgE=GQ4bc5Yn;3eQ>6Ym3DRRe" - A$ = A$ + "c0lkMjK#_ckjM=c6h#mPU8ag2o]Gn20mM5`" - A$ = A$ + "ckBbl__^jNC5k9AVjjmoAF5aNFfmdf25^G" - A$ = A$ + "eg\CmeE7UaZF15o6lkXXWeXT]#6o8gF#7TgX2oBa" - A$ = A$ + "0jZokHmnM5b7nDM7lm?06kRcDB]_?YnXaX]LTB9ckeYAK_H?J#O98gLTS:nl" - A$ = A$ + "#^Ti=PMHTWiXQX=4k?AZ;IeRiI5[gTZ]NB4m38BM98O#elFSoZN2NPLcKB[d" - A$ = A$ + "6g3]:;1jgnlhQj6]kIf_Al;CYY^h#oO[`2o>jQi2o]fhjf<8lVk2dZnmY`9G" - A$ = A$ + "VV^1e6]c5" - A$ = A$ + ":R87Sei^;fD?NB7d[5>_RMjn>F;jkmXTki2I638nIONFRXO9_e6g8PocV9naHohW7RmG?Uo?94>C" - A$ = A$ + "6Lf4Bfn_#^?>YNfDjA35VA]1R0U\6[g5" - A$ = A$ + "1n0YB?[>9k;liO>JRH7E`Jbm1_7G0cmUe<]0N2WI9DQFYKCSLBRfNd?C=fEg" - A$ = A$ + "_ZT?#IjiVhb6#Lg60GVFTWW_XTMNN:#jM1Um>QBGO_1`^G7Hg[jSYHfFAH" - A$ = A$ + "_F8WkO>\;fGihTkG6`?fW4e#f=5W#US6ZoF]Jl;KoQlCao9`fg4Xo_h=POMa" - A$ = A$ + "RAJiXcT][oEBC3KJjEbkk^GeV1fK[?>ahPM8:8?^CG2b37WA^D>PTBigeEOc`ciRbnnG6oiYgIS4nY\Od7F=" - A$ = A$ + "naHO4o]g\;4cmP?O8n3ii7haOE2QYoG=5h>O97^mEN^^S" - A$ = A$ + "hBalBdj[n_AjM7mfn`V1YYA8XNca1lMe<`_fj_2>7;5l;c]^=lC[;FM>ML\YADdRMV6oh<\DVIEVc^#A" - A$ = A$ + "gSLjaW?b_cmdO9CGN7aWY93ONIk0f;MKmD2?O1`o?d]]E[l2W^_0n?2^" - A$ = A$ + "WXf3o#]XO2`oU`HCEk\CdnCKoH?6TckZgh>AE_gCIN7h<=9ZHQTSmZI^S" - A$ = A$ + "`fM7`bmW8^OSZY=DgbH3]gl2>dEJ5cYPc04c_;VW_mVOfm8?c<0o^WlF8L=b" - A$ = A$ + "MAjQ_ZO5DS]Z;WaDoGPO`iUd=I`?:5]aZO9V`[QglM=ER#3" - A$ = A$ + "n55iIZXkE?_^\gIVHok0fmh:FY8_>hiOiJm?<`nc4K:#?]QJG;C`=60a?>oMdoCIF^I<[Bec]1jOGLf5bli1>]R" - A$ = A$ + "ljbJGQBliA>VRkg<^bn=_^lno5WEQhlkeV\:X?VGUSOoiVc]9=kF5lWal4Uc" - A$ = A$ + "oPh_7C]<=l_b_G3e]]MJ>7aG0XoCXZ_nFUhG4oL#loI49RRehnkDj[j" - A$ = A$ + "mXe4[BbX]0jI8nQh5nfNkL4o1[2g" - A$ = A$ + "mcCXToAY>SbnBAK?>_^fc^gnma5ETG79co\g>3lI5BALbW3ZgD]lN=K7M0dC" - A$ = A$ + "=h7#I>nBMAO`L`N]DVQ_jg75OOH\OgfZcXNY^=UjXlVJj6RgUa>HgSd6ONTGWYA<:c\3mQ]HYT5hTfo>k2" - A$ = A$ + "5Dc3R3Z>m>=CX:O#Baj2DJJ\::SAGTC^Od5f_5J?JkmA6ki>_EYWMHkVB`Il" - A$ = A$ + "W6?kHI5kgRh>\d5i0^L]cn#OKUkTaFdW1NOK8;nHh^d^<]nj?>[S3OkH?=1V" - A$ = A$ + "`be7B^64nlh_W_D_in_?S2N[Z0X6kgSehbZ?JEfm8PMo<0On?_8L7a8WFTGW" - A$ = A$ + "[and6Y^SiKbG9;e6[[_>O8Wk[1nWe8MV?JlJY[;dXL_1P>#G37Vfn964KhMI" - A$ = A$ + "SZT]:FC#Qk1ROLVBliNh^:H?ao4bmM9EnQ]:]cnj>7N^:\Vk7kggPF_=>WEO" - A$ = A$ + "7Pm_BUIFU>60dijCd4]QX_1IP?cSgkj59`M7QeQA>^TgnF=h\?kcY;bH33bQ" - A$ = A$ + "D5bQ<=7[6bd^K\2Xom]e;\?>5nl\SL^6`mKkN2_RNn9]03f6fOe:]oM3m=F5" - A$ = A$ + "dgHLil1RclkjINfXR7QfdIn=lQn2Jd70c58>CI8^?_I]:m2Ul]>MC7kA5\U<" - A$ = A$ + "2g=hkSk_=JMTf?dde4LATnVa6dCko8iaHXaMc#ddUcb70liBL9B39f_;f3d7" - A$ = A$ + "7Sl=\X`31a?e8;W`EQka>5KeU0i#>^h\YUZMdBVfM\om]UAok:k6gkmlaJai" - A$ = A$ + "giO:_[h^LlFd7HUVj[bWb#=_6]6D70nZBOFGGFJQR0ZGhhTSbM`]#IO#[eHP" - A$ = A$ + "Y^JMhlTc[dEY?hLG]QPMi`MALW9FUhMX:__R_oQXXfEo=GdL]C=WUZaNof55" - A$ = A$ + "SUX?3SNaM6XJ_I:k=:ASdV[KA25\C_^OhEH`OY;GOhW\>[" - A$ = A$ + "UCo[m=dga^OXg>d_15D?`OWKQ`9MeMWf#\E3i_>9lnF3l>nSDV>c:X4fIgai" - A$ = A$ + "eMcWMAUM2WW6:Ze1N;jm]BI_ll8=Fi;2eYo1hm^F#>39AeOZ3[7JUnb6l6XRR4\VHWhI;>clNe;M6Ud5mTDF?`48:lIMX[K" - A$ = A$ + "SU0`OW`M9jXPMAAJ9fC1fkfa70d1#_k<6Zo;I2\oN6n^F]Ef9^LC8naM#F#Y" - A$ = A$ + "[D[WkJe4Dlka_;K7OhT6?l4YM^gRYhFK0aIEfUAIhV?kR\VS48BjP?F_a^oF" - A$ = A$ + "FhcI[^YMlO7>`MAkNciCdUWaYSRWUEfAohV4ne;`PoI]83NNTb<6" - A$ = A$ + "XG7>\7k9N?`fWBNN^]VA=?memC#N_gfY`W4fNOVU5lLi8Of`dhLDK`X;GW^G" - A$ = A$ + "#n^m[J_AIL>2HdU\N6Se]8^lnQll>QeIWnG_IS:j0\f0e`F]1kLKRTTkOhb1" - A$ = A$ + "o:8]F`SHF;6[kNZ4YWGGkQmZcLNRbj0;dYSnohVMfeGT#nLae943Nki^YY=5I>Po2Do9iEbJ7b]X`5UeFdWgEhM" - A$ = A$ + "78_a^6;l?hj=PkL1goXH\KoGY9SimbV]FhcKRZo?U1L6e8fMe_GAWbili6VK" - A$ = A$ + "C6W14en1[A;N6PL>Pe#HYg_VIcml5]#>hiIRm>OLA\kNJ?[AO?jb<6Zh_TAP" - A$ = A$ + "=n3ifBbS2il^R5[SJV=O^7b[_Q8i7Pi1`JShL`I_mE[7?o?8VAAI6eBH" - A$ = A$ + "_jKHf5Ioo[dS?:X>0?7=LgiKC`?Vo_#T9jaFZ3" - A$ = A$ + "9ci>SiH;ig7[I:RZf=YS_IP\P]gNgOBCH\8>?K4oV^S]ea^OgK^ch^Cl=Ahc" - A$ = A$ + "UjHU0ikTgQNfjPV`igME6#7hbB\5j=hn3Sn1hlfam>h6`?Z3`gIUco3::WgX" - A$ = A$ + "<>g3ULSoo:mbPliEfC>b]9`dF]>?9HO2h>E0>?E8H]^ikfoA:Pngl1V3okGUNLofRWe1EkiGIGo]M7=T?g3" - A$ = A$ + "IooSmCQm`Yd7W2ONUI:e]OgbdQehlm0UI8RMUl`di^9]hi_Cll_F`1_El\#QeO`MY7^TeJfSkm4TdDTW3n\R8b3>" - A$ = A$ + "CMPdi\4WW[Q4e9H\a?e=kI^3Pg5Knge6<7l9NM2amK3jP^3mRg6FT_[:RO_b" - A$ = A$ + "WD>74:W3EX_Bl\XRW9a21\SLK`kJR_0W\g#NngEl7oameJA>U17hZ\#jmk:" - A$ = A$ + "0joi3Ydf#LYMIM3jPFHe1Ln9BN1>C9f_P]XoNgn>BA>jkGAc;JhI^7WUDN?kZdScBck#fYcL:l#i;NGC\UHk^5?O" - A$ = A$ + "N=MidWA=ELL4i95i\Dj[nc]c\cnRl>5??ZbnmX]G9?kNCUgYC;#\0dWARh2VBl=LfR??Q^L\^k_?kSV" - A$ = A$ + "J2[cR`Dn0SMIF;F?N>[#\Qc:ae4f^1Q9]>3:O?>o0lWQngac3S8fc\_F4kJSlCD6ZjO#ilk^=7mh1" - A$ = A$ + "]YNWILM[<=H=HamH5njMD1oIX3TgWG`kHEjL09G;Fm>=A" - A$ = A$ + "M0b[aGoN3[L\OM>dVZH1djSN06L?=JD^;2]=gBUkVRRN#NG_Y^4X7>?Hk0mA" - A$ = A$ + "RHhi4c]STW6`fAMK9eQ1\N2hk[6h^D7le40N?;TCo2Rk4GjN5eZ<^E>33:mb" - A$ = A$ + "fRdm[9BcDj[mT0fGRMf]dM;5m`>d1akZa>F[;K\SgiYKhn?:c5=CM#IJacJV" - A$ = A$ + "kNnff8;LC2<>o_SVV8b6QNC[3WSNjkVBJmPbMc#BG8M?f`nAT_OOhi33_cDG" - A$ = A$ + "QgThIMAiYQCmj>]oE3BCXWGRKC>Cbh?" - A$ = A$ + "?f_NWDSeU0maEUWEC;Bkg8kkhGbKRXn^1f#[Za\DmlXGTRXFX^F=WRAoYG>S]m>JJ?[" - A$ = A$ + ">8AGVSCJIoMGn:E\O3VlFVFeak:ikbnn=[L?QK_k0\jcW?F_0m34goZ\>0WM" - A$ = A$ + "UaNnG\K;_oV?WfoQkTbB5_<5A=k6d5ESWEJ:llS1j29oEakg7^ga[:M7V4oN" - A$ = A$ + "e2>W[[:SGUIm8QImH]lJSBY[jmBCLjEQnj>5nkQM1hfNO:eRR=7a>NNXDZaM" - A$ = A$ + "c`NFfoOQJOP\5UJSBb9jH?7l^kD?0alHNY>7J`_PFg5oX4h^Y]dgiKS:hJ4\" - A$ = A$ + "kJk5BKk`g7Yac\Lll31j2Ln==:>cALf=J5U;:M7:RM5YcGZhm3lBBj;lW7ml" - A$ = A$ + "Rm[Y;B45g5gKYChkJok" - A$ = A$ + "`e_edb=R=Db6o:e3E[?j#7^^87adb1PNVnl>B9lGkTVP[YSXdQ>db]P_cXT=VbBnUoo0j4j:%%%0" + A$ = "haISKM0NDEVeVMEPYgWifVkm>mIB1B21B02U412\8P2:5gEYH18P;fF1oGL5" + A$ = A$ + "TE5\2ZX8R2f80k:55YX0b2655#IYg9mYTbTX0BCPociK^gTk<4loWWWccPBJYMmfWFAEe1DlTOh>VNoZZ3M" + A$ = A$ + "[Xbj#jSL_MdgX:C]oAGVjdo[[CMG_oBEal`_WjPCM=JmOKOWE?mNWf5kl?:8" + A$ = A$ + "6l4McS#T9hQZnGfSS6oDgfRo3^\5_BgFKZ9gFJnLPLN#JfUUVZeUehkcUU6o" + A$ = A$ + "LGDemjNiR>5An::dEW?P7nR;c1LM\h_TeXUJZ_Wj<7ejDkKlKFSgA2GKhn8]" + A$ = A$ + "k>Qh>_`M4_?kNPCfnfe^[o7UTo#knMog=7obOOYMK9`^god1DQG_d_o]Z:m7" + A$ = A$ + "H[Zl?Q=[9`m_I=IgP0_oG4=gDSPD;_iV>PXUjGQP" + A$ = A$ + "SHc#TZjQ9ViQBSY`MAUNAOY9OP^0e1X=8=hnacP>0ATa_V\?`]noGlWZ>hoC" + A$ = A$ + "\3fK4gYmGG\Fna^N3n6`GI?D67;CGlaVZ?k=nIN\ed91<7c]]VoI0Wo:PYO3" + A$ = A$ + "T[;HT8GC`#CoVPQV_2ljEieSBc`?SoOTOgeC8`oWaV_8lgOF1C=E_PahU;H[" + A$ = A$ + "Q]`k8b<4MENn1;h7X3eWMeRN0m52=Q]Z2m32MGk]Sbj0[S]D#7loOlW:fALk" + A$ = A$ + "3a^BKnDFSFdNk[_KgFPPWYCNI[Mb^]7OC0^[1mWMIZi[0hmZBH5aheLZ[Y[S" + A$ = A$ + "2WfV^>[VK^PoNDPoFhcddO7O0R?b]8Kk_YHoQGWj<0k>j[WaOjoHfCF7b[" + A$ = A$ + "7jHC0l_g:PkJ1Lo[RVAKFRkGlnF6[8g" + A$ = A$ + "A\n>JKLUN[\?cl^5IlgfjP4h7SGJC\Saj0f9aii];>gLA^G`Go[1Lg0PK7]j`=3__NheHDJ27UFCh8TGE7Y>#J2" + A$ = A$ + "4h_9jI1i29dIe3OG=2j_Te5BjQ[2bUi=6oGh=4OoR>Zm_a7H?NcJ`Kg#jgmj" + A$ = A$ + "DCoh;\m8nome1GoFn3oQ[O;4lg6HgmhfP^<7lj=kZC7aWKQ`CeSeV>\K;o\4" + A$ = A$ + "^K6_nG;5LOE0gP4mbdJZmldj[=6]^Z?6UVZn?\J;Oedj>elY=Llo76c7Z4:K" + A$ = A$ + "7HR>\M`kWbb1W4UUS=MJSWjeXeEi:YeFmF0mbo5T`dJSn;`gi5ChCd#Zj1<6" + A$ = A$ + "3emhma5LZ?nYLJ=foPcc9BGhnfP>Z7NaMDY>0S5BT?4[9TX^0Pmo8VWXk1CP" + A$ = A$ + "OUnl8fkd`fZY01?D8?Y:K0;JOOL#7nN?gFbN^l\InLdLMn5YdVm\XHcliY]V" + A$ = A$ + "kK`A7lMMa5J5n]kJeI#c^mNAKi8CRf#5OX3MQ?6lmf4SjHo:X7^B[jQFR;#m" + A$ = A$ + "`_1hoR>e5_6WV[o35Bk`IkLD[#?Z3XN\5fNYL1g:REmm]<5njeSa^XmnB0^KVBCe7RAgIF6]eO" + A$ = A$ + "JdFl]^<\7H>>ICkYYLDdOaRn27RADdE``egFRQ1<23X`>hAKbL_W^Mj`]RmdQmAPHg_Dl^HV7a7fgVG;0f]d4F;" + A$ = A$ + "ngJeO7_f4K>Pm8GRFGh:X8S>ohPjkfCBI__Cf2K_6U9VLWTAj21" + A$ = A$ + "YP7C?M1?^Nf2okjH;LVgP8fe7E;gPO:mbRh0N#3\3MJ65bK^>LhOENL8^[N1" + A$ = A$ + "n3_8SV8W0^fo:]j6`LTPN8^\_0N_QjP;bY=N<63=\Lg^?BVf7d7KDLD[D[Wk" + A$ = A$ + "6jA0j=8DQEAd1XHX`b^5c3Mc]??\WFilM?FYjlUo?bjR?jDPnf>]TMWPMYlj" + A$ = A$ + "8fAOm;AY>LCDZ[nkLHiX?2W`oZCFjcT]W0cSF2c?^4VWY>ZLOK]X8DhkYFX`" + A$ = A$ + "gG=K?:E3:hkU5aQlFJT5nkL>j#amPWZNnn?M36;H>f=UnW6PanA_G>]e^98N" + A$ = A$ + "86L_0n2H]RTe1PLI#74VcHdWc5oA2h_W[a\Wa2e67oFE5L49d1X8So^NG[_S" + A$ = A$ + "TJl?IYJBkfoL[^MFcOf]UV>9>WBO]AMX_lUbHmK;bRoicK]" + A$ = A$ + "G?PEj^?Nc8^I6`SH0a\cRW[F^NlZ4Lbgg_D]W^_m>RRc\fU:Dldmo3lc94nn" + A$ = A$ + "nEZAacPnOSiadk[hGeVC^MVQCCE=?6=eM:hN3b;6_UHQFd1" + A$ = A$ + "JJnR\JKj#L>?EaLSL5jm=^UYamMEVJIO0;3Cbf3nmNQnKLgiCha=E3;0\maQ" + A$ = A$ + "llHOL9SMeaPlkeF=]aCn\dNol\\d[7bQ^N=JCl5MOP=oA=hL`o?0fOA0k;2\" + A$ = A$ + "M[4\U[WP3Io=DWg:fEno5VLo#VcLP`\9PM`?8N;a2X>04#WddiYYX9Hf3XWk4eh8ii9ihYDGK<`^_HI\C" + A$ = A$ + "gm9H6a^cA<33\oYGC?e]]83>jo6dcd_=YENV4B>7#`N[UaIZH_UI\QIhTWe2" + A$ = A$ + "c7S2f?WcQ]>ML3MMj`kMIMP`hNE3f6b;JU9`F2`J\ZWSAC3U32Z3#NW0on_9QOORNKTR" + A$ = A$ + "iaJL#^n8=k#G5;Sai6kVUnDRM>9k>RM^AlR6H_cgcPHGfR=7iN0kNcJGV56i" + A$ = A$ + "G[=`HFEBcU9SCI\WdLVBHWPITK1HF;<^TKXUYC8cOdZ#GfU=\_V<6k[Y9[BN" + A$ = A$ + "?eX>Pj^;eXH_G\31gko0mNIV57" + A$ = A$ + "e:dRj0^I=_>`nD;#Uo1^AKN4R=AA[aSPmbWROoePn`^:n5=i_WKe\gY;Gga6dQh?hSGZ6aa^5OP4jT6Ye7NNNl\5AIlC?]5gA\NWoP7_C^]6O" + A$ = A$ + "KRF8nmBmfeROoU1onZXPNi\5hELf:fW^1Z1oj63d[eHVgg9BGdNMc3hahP^<" + A$ = A$ + "7_2heMkfFMo3_^>YoY>i#HdFo10K" + A$ = A$ + "=47#RmUWo4O?h3d`QIX?j0=1n0F7k;XRONc^SNjcf]1l==E8WGhT]m=Pc`LE" + A$ = A$ + "J]An5J]El1\1FKW\e_7`6K_VT9<7?6_cNW__1oRo4?_=2f[2cKPlM8H:n50N" + A$ = A$ + ";>3_ejNFaP7;4m#G[1_S3d1BcX;7C#`>h[[LNS\6aJ<56bA" + A$ = A$ + "4fo1`CbUhdgHmdjJhSYLN4_d5oQjmG]2i\E>>SE>C0o#O" + A$ = A$ + "R4l;57#R7`I8JRfD=cW=`6iAlW>D_gI`S60\mK2iQZ]\m`L<7WRjKk_el;a>" + A$ = A$ + "FS3cccOWoCMD5]83lI_5K^LFM?QI`>T4O=9h0PlJl;b[;NULF[On2Rk;m#5o" + A$ = A$ + "IVm=ieXU`E1PGdgIX^O4A?f?#7V?Pfcnk6[f6nAB?J3L3" + A$ = A$ + "l9QfM2fiSFR4fAk^2oAd6RmlFG=\V?cm`:l=\FkaFd9Lk[UPoPH=b7ieeIZ[" + A$ = A$ + "KQUc#]?=dk3dO8JcEj30m:ZYnJLJl\;H;jD5AnDPkKL>Ninl" + A$ = A$ + "XE5k:hLL>XoYQKZG?YMWiOO6#\SmdQmT`=`M[aMWfUIAfZk9Wnh70a:li9m9" + A$ = A$ + ";aeE[cUY=NELVSmjXO#j3nC6U]mG8Ug?fQm^o^jaN49ec0lkIR[A[Skhm=aioPibY[a_3n" + A$ = A$ + "\`=5KfPn^LhjM1Yn_9c9YH^\;bAR5R>7Q>" + A$ = A$ + "_g6SaV;L?57_7DPo4a0JZkkillmi84jDM1lmg?6kR" + A$ = A$ + "L:YdgWBKhXfS:Nm`N9cXGKeP0kA3bX?joTBClZ" + A$ = A$ + "8iI9eKBLMKInLPS28O#E2FRmj^3\odcH<;a:o3^DcnkiNMkVn6]k9?_A\;A[" + A$ = A$ + ":B?Y?Kbl2bg?iYZL4`<#E3m0" + A$ = A$ + "C\7]Z;QH8=eG=SeCm02dQ_G8G=6kZ\O7`OYn;B[[fSaiHW5JKn?R1_m" + A$ = A$ + "HVTIe`Ni9mV;M=MNGKCK`N_9C\dOO6D6S\06E=0jP6aJ`9=GF2M0FO=NU2VS" + A$ = A$ + "<;Oi]_#1:hKMkfIMCFdBC7G:?OKPMHF;T_3WkRg?d?ORiDBLMgR:\O2[mkMOba" + A$ = A$ + "0T_kcaY;lG;HYQe2h7SmEFg3nma>74k_JJOOJ#TC6TKR4fn_DJ>^4c\9?S6:" + A$ = A$ + "\3I=jlGd:\`bDFVD6[meQ_7d?h6d1HM1T;OXnHCPNX18nkbbiNCMF;UfMcMO" + A$ = A$ + ":f#\c:QMR]7`^l\DTnZ#>>0lcG`7XYFiZ;Qm5nn?;S^X7Ed" + A$ = A$ + "Blm2g7W7cmU2WF#O2WInd1GR;S3N<4K?jWY4k:WG=Q?#YJi7m2eK^Xg`:GP_" + A$ = A$ + "=CJHV4XGD#7dVFVGo^n6bLjhLfNkcB]bb_S>1" + A$ = A$ + "i30oP6[2b33LBQe1JMG#Y^CXF[_G?HgS0fm:G>=kVc3We2king3kTi:aI;`N" + A$ = A$ + ";1lSc9Ag_MBc;Fa#Qj_EY4oBfO8oD\O6\m=3joOm6`_VXAYP=XL##M0IVJIAN" + A$ = A$ + "_6]DKBMmG2_fd6[hMILnUia>`QK5a^LmWK4kX]#JVJ0oh>P_[T4n" + A$ = A$ + "EG7dGO4<741oBmFg2nId4=R3k7K2jbKN>J5o87FbLFUk8fO6K7kQhcI^4lSmlU8nGV_>5lf8cM1RM\OnoFYJL=aE[_CgkWHa" + A$ = A$ + "KgoF?2dA:1^7>6Tck:gh>AE^gCYn>#>=eEnLH3^]>KK#ca6oM=33HN5B?W:h" + A$ = A$ + "^P;GDe=M1ca?>TSm:9_S`fL7`BcW#f_A" + A$ = A$ + "EW3NkD^5Zl?1eH[<" + A$ = A$ + "iNkalOa^0]ZX`N3Kjo2m7PhGIo1HoA=aHXZGQ=d:40kG0ZIRmBK^fWeIXmU>>CSo" + A$ = A$ + "BN7]TjKX0fjDi>D9ncIZ0oH53fOfXS3Ra3[LWE\TMX1mg0kLE`HSK0R;?Kbe" + A$ = A$ + "78gOWSAO=[4hl`?ROToMdoCV;gThZD9_=`lk4^;TjW7jYUdGG:k:NU`L<_>_`nB?]K;1g]bh?9n4UboPh?gaGZ:QGk_[Rn" + A$ = A$ + "ff23_mHc6doTnKEDO3_nW5Ro?SXYjN3Xn8VGF9naJ`WUACh]j`ejC7co8SOi" + A$ = A$ + "n=aJLoKJ]En1ln?F8LGF:gSC;eMDLoPfNPGCeLmJg^h]Fo71focZH_MX_=L=R" + A$ = A$ + "NN:=e^;NVJW4Po`Xo_RNTAK1>XONX_>:f_:O7nolLXeMbW5Zg0m9BRkK3M0e3iHLNgFZc8c=o8gRnMaf`TJI>^D`>" + A$ = A$ + "PkTVSSaiVccFaCTbjPNL:Fa?;;JmE\#6EeE5Hg[]Unianj<>XQHR[o?TIc5=K7RmThI7;UHOll" + A$ = A$ + "I0eH[Mo>M^]^cLKUiPeJhW2^O[?Una`MYM9P[`ScIo`30WYaoXFTFTO5i[W`" + A$ = A$ + "MoeJ=E`N=8jYb\PJ\k6[aUbLd:\ke2fmc0mc_AXOn9CjW7k[ci8NB3dgn\AOh2]M[d5]9B=1iN?#l" + A$ = A$ + "SL:9TnQk\X]6o:8g7jk;K;8anhIa1?G5FBOinlfWEKUgAEg>Ho[#VcZFS10M" + A$ = A$ + "^f6KVAOhgRboWkfcM0kN4fM4F76kaUJ0KB_S^_G7>YRFjL=ZG3f]k\eK]hGf2S_M2c=F9TbKQoL\JIUQhnWi\;KdLEE4T3ih4^YCDk0maDHgaiggLBc_;_KL?gmbESlgiK" + A$ = A$ + "L_?IG>NbkS\`#_SMh>AfIRU4mMX8__\_o1YYgN1VbK6fX1N2\ec]CcJ>" + A$ = A$ + "lCaZU\c05k=CN_A=f0SY8cE<[]iae3]Hmn:IAJ31kN2ek>7i:ec`OJ?`>GF:" + A$ = A$ + "4O2Onj_\RLM0GUXM7i]Y=VOO#[S\WOIn3#m0bQPUnnJVIl\38FXRG`QVXE2n" + A$ = A$ + "[GPLfRD55fS9hkZYf_TVo[cdDGOAch>Hl?U5Y5[iiLfcC]_1^3bNl`cCLZLY" + A$ = A$ + "9Ug3nlEnA\NF[?d7d:`G8e#F[11QCV7S^6nNHGiP=DY?0FC0[1ghaiHZZ;0oW;3bOMBhn]JhNl#d6?cRY5gFG#nj^iLGD" + A$ = A$ + "A7#nd#AY>`CNOX5JKUU1UQ:N9X>m?2gge0bIXdEeWIgb17>MPgTRKX?RAakI" + A$ = A$ + "f4lWmC\#=YEb[ZgSobcCdBSK3?Ka9Wg3]m#\XV`WTfbn7U^LNJkJbN4j0lg1" + A$ = A$ + "LGRfcJkdDVSn4Pm^=l10M0[njnJFok[[Q^SUIQKd;b8ROL7TIEbBDkn>F" + A$ = A$ + "V>JQMicYeS?#:37Nd<>fCQdl[d?Q[b>=4mgL^;BQ79#BX3F^F3MiM<;TfVLa" + A$ = A$ + "HoofGFm7nNX\_okPaejcDGWN:7f;L:Fh6jSJDl??KmnVbLeknQ;ePo^Mh#^]" + A$ = A$ + "eh70fnVThcE:?\D=?]AnI8_gkj#lC3I[kCaKHZL7107>eaJ8bLich7c`cXFU=Volj=8[3`J3d5_[QONWQfY" + A$ = A$ + "o<6a:<;l0[F?^c5LoSTHg2FRA3IlZV\TccKT^PW#?bA=RMWmle8LEfVlfTdI" + A$ = A$ + "0AYO`:DSW187mJ5j]5J8HQO=[8G\74" + A$ = A$ + "fk<`W9Q;EbiRDb_7ke3\oQSC[_lgb4mbm;KkAkA;h7bYWi0oHS\1gM6LJSm9" + A$ = A$ + "`Wm\g\cC3\3fCaI_jY:Tn1mh]O9l3`l0H]AT7L^1\<]hio1a<:bLDW0k9ONG" + A$ = A$ + "J[OFN6OD#M0N>Jh7fkZCHh?W>Bln`W>\c\G#_h3]4S8f54[Md`NR?XD?g9aS" + A$ = A$ + "M2onX`^GO7aMWhMd`g;ma:2bg" + A$ = A$ + "9]3mDe1=SlgM5F#7hdLdih9`n2Qn18OkhN7L1h7e1hm\lio15icKDBWk1#Bm" + A$ = A$ + "WUWU1kWGN?iH_=nW`bdPiibL2_ZV#g?b]fB[]3a1E?MXNfYC`5A[W_>YMi" + A$ = A$ + "0j0HGWjSG^XU8cbU_ST5cOiS<5j__D8>8acSPbml;_[oFN6=T>g3YnchlDh<" + A$ = A$ + "Lbca9g?_T__f8DV>e2XM_l08fU" + A$ = A$ + "c3cTnjDSWo>biO=[3L[hIQ2[oPkB?DA[dTKGk:0\3SW5n^ZUd7LbjP4WcBT?" + A$ = A$ + "Gm=6Ad#3OV;^cLk#OGLIN7[aDP7k=eAf_=X3j2<;N;HAjIEQlNI>SDN>WT?7" + A$ = A$ + "4bW3EH^Bl\XRW9aL0\SmfP?[9NmOblQll_?i7c`iSJ:j" + A$ = A$ + "aQdWD]o2]fZfX=f]e3\_CbiAEb_7]mbiQaco>N>HUgSQL_H^7c2dRW]76_k[" + A$ = A$ + ";<63_HPGFl\V:i7TdliTcU14;0cIdHM\^h[kkUQND[b\hhn" + A$ = A$ + "83MJ:cC;N>[#\QLUh4h;#L<[B_lkAn3`O7jOc2fJGSoSnnKcN^?PRN_V]Fn\;5" + A$ = A$ + "h?OkTn^25jJhc961o9Y3TfWGPKOYJ\?`?TX3XeGcW0mf5>ali9aAQbcQ?^Kc" + A$ = A$ + ";0BDH_RkPgFMce;GeSdGJWX[hcaFP2f93fOJ63Jcd^;J[>`cMD`nGV5_P?=g" + A$ = A$ + "0g9MP1^AKh[li\7G4<;Fm#lAEoCifBCK0b_G3n\D1ccBN>YBV?74kBWmNeef" + A$ = A$ + "0[VbG_=j_Y`TgGH:mN1HG6o:m1D^CC\fC6gmKXfJoFT9NWk9;XgYW3d1UWP[" + A$ = A$ + ":iICKE?8Y3`mKN5H^[c3l^47g_VXY6g7X?FU;jjON1fH?PXHTk`U[:;d[obk" + A$ = A$ + "]7?EfMAQZ:`]gZ7Z0O\akR^^IifF3O0`f1jS6S" + A$ = A$ + "RWCD6Me^FHfd88?j]n\YdZN#:^#BGThiH3W7Ajik3?OHhc3DlL5U`O_A:]E^M7FggO1[aI\[?ZMj\7A;ein" + A$ = A$ + "m`NKRO#Tm1Df;:f7:>C2N6d]fgGe<;kgU3`Uec3cC]GhnYn4leD7^o6ULiWT" + A$ = A$ + "^#icgW\?R29YMRVlnQTOnJ8W7R4?_5Z[]IJeEML:mWj=MHK7mAE`W?A_=Y=V" + A$ = A$ + "TRg_A\O]F`^4nKeoGacm[Bo0iiCUW9aeXV_F?io:FYm_:AF^MgGX_ji2cjOD" + A$ = A$ + "PCihh>U0m1^OMYmJPkg8eWa?iMnUZXlI34f1Y2`jK8^Mj]4bl6\I\#YWe0Yc7QDn^DOnVUO>QK[W1HUW?O\" + A$ = A$ + "N1j7#foZT>0i^b#GO1KFchOieQ]OLHdV;oEYeEm>1MAEhIU6TcSjR4n[TW_?" + A$ = A$ + "L_SP^1cK#N_B1ii2nK9hEV[W4HF;F;_V`dJZJ?mBAOM7Rok#>1LK[kUHF" + A$ = A$ + "fVSH7??Dbeh^IH?5k?nL#eR?#ZRL]a4b9JOGkk>k#^PHJh_B73fgGD][2WV>" + A$ = A$ + "LgdVka\\B7H5RfL^ULH\NhkUb`IF4NnQ0M1bOC34>7A^K`GE3n8TWQRX0GAh" + A$ = A$ + "i;Ull12LlPj;lg76O>1S3ieZE6cDF?h4IXgF?=AoaneTn\9hFY=GMj?XJ?dc" + A$ = A$ + "EE#^Uda>iJ3M0_G;XMG3`P\LSH3UDa_Lm#UjSfe^[AjA\EIo`:]^:f9]QCo^DF>lD]blOjQ5nUjWfo" + A$ = A$ + "cB[?kIh0c]Y>kN[CCf3GW<^EWeSYZ3R_L7D5H5]7Ufe^[2goGS8YRYDToho;" + A$ = A$ + "j4j:`3" btemp$ = "" - FOR i& = 1 TO LEN(A$) STEP 4: B$ = MID$(A$, i&, 4) - IF INSTR(1, B$, "%") THEN - FOR C% = 1 TO LEN(B$): F$ = MID$(B$, C%, 1) - IF F$ <> "%" THEN C$ = C$ + F$ - NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$) - IF MID$(B$, j, 1) = "#" THEN - MID$(B$, j) = "@": END IF: NEXT - FOR t% = LEN(B$) TO 1 STEP -1 - B& = B& * 64 + ASC(MID$(B$, t%)) - 48 - NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1 - X$ = X$ + CHR$(B& AND 255): B& = B& \ 256 - NEXT: btemp$ = btemp$ + X$: NEXT - btemp$ = _INFLATE$(btemp$) - _MEMPUT m, m.OFFSET, btemp$: _MEMFREE m - __imageMEM& = _COPYIMAGE(v&): _FREEIMAGE v& - CASE "face_sad_x.png" - v& = _NEWIMAGE(57, 112, 32) - m = _MEMIMAGE(v&) + For i& = 1 To Len(A$) Step 4: B$ = Mid$(A$, i&, 4) + If InStr(1, B$, "%") Then + For C% = 1 To Len(B$): F$ = Mid$(B$, C%, 1) + If F$ <> "%" Then C$ = C$ + F$ + Next: B$ = C$: End If: For j = 1 To Len(B$) + If Mid$(B$, j, 1) = "#" Then + Mid$(B$, j) = "@": End If: Next + For t% = Len(B$) To 1 Step -1 + B& = B& * 64 + Asc(Mid$(B$, t%)) - 48 + Next: X$ = "": For t% = 1 To Len(B$) - 1 + X$ = X$ + Chr$(B& And 255): B& = B& \ 256 + Next: btemp$ = btemp$ + X$: Next + btemp$ = _Inflate$(btemp$) + _MemPut m, m.OFFSET, btemp$: _MemFree m + __imageMEM& = _CopyImage(v&): _FreeImage v& + Case "face_sad_x.png" + v& = _NewImage(57, 112, 32) + m = _MemImage(v&) A$ = "" - A$ = A$ + "haIiLU7KDE46gob#862aH86SaX81E2bE#Sa3l6A0S81A4_86SaXh5N4?9R8F" - A$ = A$ + "Ji\P2D:UbAZ#i#]]LH51\PE\D:GEXPM?jNlj^K_fMkNfmji>__imfIgg[52c" - A$ = A$ + "ljh^nBnem]MCVikgkKNcgJ`#1gnPh]?N;SdR#2" - A$ = A$ + "WL_4jVQ4?LgG4h4aHD\Mo" - A$ = A$ + "^okOlki]AbE4g=]RAN]lF6Y1f;kiVPXR]NR;P_2ha`LG>Y1QJ" - A$ = A$ + "mdk7h4il

TdF1X33fbO^KN;Od2WEn>c#DciB1MH[o" - A$ = A$ + "h[?EN;SdRPfZ_2PCTf3a_7ff5><_U?JQ]]n<`NOcH=KbkSbeNoXGTgb8]`g5" - A$ = A$ + "fG9Tj=bkSjceYJ>_KI0lF6Y1VFiX7BlNlYJMYbj#geEd2h]g1`:>2^Q]G0c3AMOh8iLbn^hn;9R7KeQ6kkoOne=k" - A$ = A$ + "hWOcYeO`?;5o8g^X6f;TeY>[h]W1=]_Ql_U14\UJg9d7TfLU^G8\con06GfM" - A$ = A$ + "RGkX>>>ml74[hB" - A$ = A$ + "aAIO9JBb?LGa]][mma8k=29R5A<=o0AL1oVXPkSG\^<_VeBNRA9Z<6BmJgL]" - A$ = A$ + "g?Lfddn1]MldJ?]99lKALKiHj17KoP;l=Q^AmlY9oOF<\TQ=#JJoTc_PK<]e" - A$ = A$ + "QhO4gOa\IYX7Lh\VSQ\g#ET?;9_W5[o>RGQ;K>Rn4?o7chWQ2^e1V8JHcYg?" - A$ = A$ + "YdYMlkioNdf79Wc<]WKJCAlJYl:D_Ql_i[VUL\eM?5[j7T=OUnAI^]4Bg;_FA" - A$ = A$ + "9KD[JLDISB;4dbaf=d1Zg7E0coa>IEoPF7H\P^?7ic#LW1MObe9KMSCN<\VO" - A$ = A$ + "6Gj`_VHQldTZn5cgf>`Gmj<]oFf86\_VZZXH1kjL97gJ6=f=N8_=eMCEFTYE" - A$ = A$ + ">VQ`JnQPe=lhSDU>DBUXd7Xe8cKiS50cSdhXll[Mgh^G=_U?FPXMk" - A$ = A$ + "X1PHZ]mgiAGa7cKiSFHnk^[KZh]V>_UAJQm]:5k9b4C6?\gVh]la2h^N" - A$ = A$ + "`g6Y_>EhMa#i0W9528oQ1:=e[Ceg5fO9lFnH12HnXU3lRTS`mN?mfF6_U?FP" - A$ = A$ + "NjbD]Tj>hFim5_hgQgb7;#4_f[78VJko]O`_>[?>6#0IO0c<2>2cafOigJm4" - A$ = A$ + "6:HXXmc8TY]OIk82Uob?6_UAjih]>`_Ji_Df_]So?HOlB]>W]WmcA4B" - A$ = A$ + "T8^=a<^T7[j\RiVek_:4jkmM8M^bLG6YVSN\FG_aa>ZY0Z?Geo;0iH9A[hh0" - A$ = A$ + "O61LG6Y5nKngf:`Aenca_Q3E6_U?F0?=\Yl0JYnlS3gn5?<_U?F0L\:7_3HK;LG6Y5N>1Ho#[h18BG]X;aOHo" - A$ = A$ + "=JkGn\i8A8Eae14K`VGeh_1N;Sd2lI5g[aWS`>b^cAL4#n38Zof>3#aI]f5TG:J^^ehQld4[SEOC[J\G_[ml1cfMmKLAN" - A$ = A$ + ">iFcgIE_g<=EhXeUHUC6hgi4D5S`HMI[kRMi8G7e\TiUNl0;7gJQW3mNfMFXNaa0V>BiTj>hNP_" - A$ = A$ + "\8>m]]UYMgRbi7SFaK]DLj2eT67DV[7A^" - A$ = A$ + "\VG]eMnZCB?iXc:OK8WikUJTSSOn:o<2jl8;o3EhYTMa8HkTY\?jn4U^8mTO" - A$ = A$ + "b0UKYb?KE^DZgHdU_78oWXD7N8NW8NHOG\m3m=mKWo0Nm8IClI5f_`?4#alAZcdBmn]lNfMUC4;mn^`N;6XU6e`" - A$ = A$ + "a81JfDQi0n7XT91ieJ6G:[C_1f\>MN3=[g3:L=V=C[LDImi`3>F[4Di7MlhG" - A$ = A$ + "?=\Uli]R173bg3=GkC#;eb\LMUWX]ZoBYjAZZmaS[1K>[hMW9_UAFP#2hJ" - A$ = A$ + "8P6eEFD^gfLNm_[7C?PURU]UTnU\^=GIn7\_2bY[iL8TZ>cZf_?XJQLc;NXI" - A$ = A$ + "mSI=_jkiVR7E;O>SSOYcDn:h]\R0FA4;UbE5:Hgk]CgMke^Kg^7M?MnnN_IfIWi]`\MV]" + A$ = A$ + "nNKLBnhK:[INOoln>ckkkmmmmkgC`3^6ADGV" + A$ = A$ + "0k_f<3NT6bdg>VUho;l5OD3A^meR]2IBW4h2i:=joV:AD[>Gj]MA\Z\[7dCC" + A$ = A$ + "O`c2l;MZ4IBWBTSRl4JQo6ngkjkN\KPGh2=hNU?hEReOYTeK8=8QOmgl\W>;" + A$ = A$ + ";oW8HYlcoDC;;7AjC1QjNVKSEUMm07;nJ7OJai:9T2g0GHn:4X]E" + A$ = A$ + "06:h:>Y6A5fgVDXcDZobjJNRKREUMm0KEYT[0g]=_;jdHEIG?X[JOT[C\UH[" + A$ = A$ + "Ga5V_2TgQi:>Y6Akn0K1c9UccPeQU2cchi7Ni7TZ>TH[Xk=lLg5[:kj53g_5" + A$ = A$ + "#?AeFAG:F7fmgolg3[:kj5ALgJmH>YdN8ik`N>j>HAI^#PkEm0hm" + A$ = A$ + "nZJ=KBkSbgVNkWTEUMmR#7McE[D_Yln4Ql]o>WeiNB\Z\[7HKnCJ\Y6>TVeU" + A$ = A$ + ":Y3mgBUO2[:kj5m^mInbH>YbN1Vc2>Fde>NFD^;44cgQg:AaQJDN?IN83g7N" + A$ = A$ + "4WC>dafBea3h^5hMoQnkON5NnaGln7=hWcZ^Y;#\ESm29MZgjO5`Nb8niKY\" + A$ = A$ + "cmTRhHG[3g7:]iR^G8VgoJ[FWk5>VR97m_WZo6cgAf6AaQJ`TSh;AK8o`=ROfnflk0fK4BWDTO:m" + A$ = A$ + "3TR;l_UA`oNZZX<_V[Z_m;1NnbS]bMN#1McAXUcL6gXC" + A$ = A$ + "AbJY2:dZUb>Wo_I`=9dmJW6hGKESabg;hN5ggEHdnX_VASCRci<<=fAX8N<=" + A$ = A$ + "dAJ\BSfOZ1IN\LoFDn\;l2WKSYd?P=OinAN^=`fAJie:R\A]PYH8KDd#4Wk6" + A$ = A$ + "nNCf>1I#5e4fn_3f\=Un1F7Hb8n?\ba#BWQkNae9kJIgeT=C^1`jLV`YTdd_4nfcFohWgDk_i>aa4ZS6[\hk]fQgMC5=H73fA3EJKnCN\V=o0hJ" + A$ = A$ + "Yg:L>fiZ3AZAlOkZ6cOLE2>Zlj6_cUL3C0FSGaZ?0hkWN_YYUS4kDRceJKNG" + A$ = A$ + "lYGDSbkQe8cZbMQ02?bQSBc_>HkK0RG3^R?d#R1md6VHJ]" + A$ = A$ + "mgo>Wgk`Zb]NQm_ib?[Da3gYJ>:YCmDo;1W30Ga9eX[EQRm49RUmFbUcUN;C" + A$ = A$ + "TUTgA2l^aYoXHeVbmJ#VCEdfUAg[1;PnfaGPm?5N_Yi`aDa22[;P[h3=h_E\" + A$ = A$ + "_=bMMZh_5SF2LVD00oQQEJJGWJXS^5`?bL5OXQ`fg94_GZlA5nnP7He`J3h:" + A$ = A$ + "n#33?P]MYDgQ_EJOaOi[bZbMQPh1kZEHoB:GKoBfA4ZkY_5FEfe?7??`nN>j#UL\keF2`ab#jA]LTl" + A$ = A$ + "^Z`JNB^>fg00[77C:enE1og^ZV_ScM0^FnM?5RR3eTUSh;W;i6=EOhn_27Gf" + A$ = A$ + "M2nY9OnDEd?eg7;^RCZa9LNejNZocn8G`aC`" + A$ = A$ + "jLF3ocA0YCWRL`W:h8iME_eSRKE^R?d`aOO7XcEV[h3E>6`5j\bXaanJ^L3O" + A$ = A$ + "^Z\0TRU4Jaa1i<2h:n#33ei_\:<7ej?WQ\\mJIEi^##PfF>:9JYMnaajmHkP" + A$ = A$ + "5Ui25THIP^oEaan8Ga7J`KS_aaa?iaMJUccm60MEk3O=IiUfck`m:^g;SeTi" + A$ = A$ + "25>FhEM>bib8Uc]bgVioHZ6`akl7mgbBhnH>60]HMD:N78fFh:n#31f;fn1]" + A$ = A$ + "h18n0>::aOhX=jiWNoYQ8TVhj07K`fG`UMV\Z\[G#>[hl6O>2[U_cAL0Po0B" + A$ = A$ + "SB^RCd#HK=CYN685S>]GBLF[3Pc;5Z[K=Ed0MHfaZ_]5LYWQ" + A$ = A$ + "_=nV?^oFGf<3\_EEVg6OmYJ[R9EDRE>9#nV;glA#Q^\keKNi8GO=?kYWKl0;" + A$ = A$ + "5gJA]>`^ZhM;6lC2YS7AC]K#B_B\_HlgGfmRV1J\TDkI#OK8E7J8iLH`3]^:" + A$ = A$ + ":FL<\=DMBAUMBm5ng8ia^YcA7;njW#jd9UB#1=mk0oa2o#Sll5m?Vba" + A$ = A$ + "\l`a\kM]H4_e0Rem19e10Jf#aa>\YcanJN>#]IBkil#V?`E=" + A$ = A$ + "Xc1JTaAo>?aLDQNdNAB?2f]0^Xm<#Hk[Wl\XTGUBGTn9JGk5bW6CWOB" + A$ = A$ + "#J=?dZSJ93gOkSdW;97AdelZM_^Wm>:6LC2NK0=_MN[A>NnaAnI4do_mE_U<" + A$ = A$ + "?Af5SC\CVenXomFc<;VlC2#^U:=f:O9G_alXhKRDa2M\NgnW?Z" + A$ = A$ + "Mn3TeSXjme\jBSV_G#^>0ahl0kJ1_[ooLAc`K3_fD9WEhX2o00alAfcdBkn]" + A$ = A$ + "2N8D]?LDCN:F8dAgDEHJAY6>6?LWfZX4`o0EO7hlJEeUljdaWS0Ga9JPJmN#" + A$ = A$ + "V[9MKKnG2gW3?TH]R\V0]ca6X]EF6[:k526j_KZ6\RSBndSn^45CJL5WD3bN" + A$ = A$ + "Zd\n>ij:G9Bn:AZQSiK]VRf;iohEbjLVhHBRcg3Z[m9RCDmYP[h4=dCCO4ZN" + A$ = A$ + "TZIOlTJ`VgjO]YbZbNQPX2TJ80Uj:;Tk]M>[AgeSE>^oMFkOmENfYB#cWcThGjPe=?FEf;4T]6kAO?V" + A$ = A$ + "4o9`ELR62\?djEcmKCiei5aZS5NeSSUUOm2bIgU]6LXXfK4cGYA^gKm[VdHC" + A$ = A$ + ":G_iehOMQ#M\AH_fL5WX1GeLgCAd?GIB>D_I4?CJD;jn#NA_c2W_hoP:WWjJ" btemp$ = "" - FOR i& = 1 TO LEN(A$) STEP 4: B$ = MID$(A$, i&, 4) - IF INSTR(1, B$, "%") THEN - FOR C% = 1 TO LEN(B$): F$ = MID$(B$, C%, 1) - IF F$ <> "%" THEN C$ = C$ + F$ - NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$) - IF MID$(B$, j, 1) = "#" THEN - MID$(B$, j) = "@": END IF: NEXT - FOR t% = LEN(B$) TO 1 STEP -1 - B& = B& * 64 + ASC(MID$(B$, t%)) - 48 - NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1 - X$ = X$ + CHR$(B& AND 255): B& = B& \ 256 - NEXT: btemp$ = btemp$ + X$: NEXT - btemp$ = _INFLATE$(btemp$) - _MEMPUT m, m.OFFSET, btemp$: _MEMFREE m - __imageMEM& = _COPYIMAGE(v&): _FREEIMAGE v& - CASE "icon.png" - v& = _NEWIMAGE(32, 32, 32) - m = _MEMIMAGE(v&) + For i& = 1 To Len(A$) Step 4: B$ = Mid$(A$, i&, 4) + If InStr(1, B$, "%") Then + For C% = 1 To Len(B$): F$ = Mid$(B$, C%, 1) + If F$ <> "%" Then C$ = C$ + F$ + Next: B$ = C$: End If: For j = 1 To Len(B$) + If Mid$(B$, j, 1) = "#" Then + Mid$(B$, j) = "@": End If: Next + For t% = Len(B$) To 1 Step -1 + B& = B& * 64 + Asc(Mid$(B$, t%)) - 48 + Next: X$ = "": For t% = 1 To Len(B$) - 1 + X$ = X$ + Chr$(B& And 255): B& = B& \ 256 + Next: btemp$ = btemp$ + X$: Next + btemp$ = _Inflate$(btemp$) + _MemPut m, m.OFFSET, btemp$: _MemFree m + __imageMEM& = _CopyImage(v&): _FreeImage v& + Case "icon.png" + v& = _NewImage(32, 32, 32) + m = _MemImage(v&) A$ = "" - A$ = A$ + "haIeFf5BC5667_;S8J1BB1Qd=maeR#F4BHGdTnJ:U#UA1FT2A5IgTcnfXlRX" - A$ = A$ + "KBF^U3Vd7<]BX9edZ5^Ma\878S1U:E\iLP7gBg\JfnhYcoUMhhIWcnZ]3d;l" - A$ = A$ + "3>kmmiio?H?k\cQ8J9doYHIDSe0TK_>llf]eHgKM#UJFQO0^6kEXm>i\ON]G" - A$ = A$ + "clQ3eT_m>glc^_21mPNcE_^l=DYWiYEfo2ch\b=?lS<#FIZGV#CDLK_nhJZjN[DTIL^1b" - A$ = A$ + "2IR\CUkgmEcEZBgZmT_l:4T=L8UoFko8M:E_G`dnXKKYAAM0F?RF3LT]n__m;B" - A$ = A$ + "lGlgekKUll]" - A$ = A$ + "ahnl3o#KbZOhh4?^<:Hh09nL\haXKmZjUEoH_V=YRR4mGLcTcn\M8[n1]K]9" - A$ = A$ + "^k;WN^9Y^ML7Ie?`TC]LW5=F4Igo^jX8JHgF8Q;ib?Hoj;QL7hC5E?E#\_WWXWmGDYK=9N" - A$ = A$ + ">e9=^I9[1>Tb_;Of;kP6F_[DihO1T=L8UO`gW?hBkdnUJI_J;>]_[GV2b2IR" - A$ = A$ + "\CUKn`iFjVEcf7?Mn_d3cc>WmUWc1L`?" + A$ = A$ + "hLNOONno3fc>klB4]c\C_2M3N]VfWVeh9E_;4D3Z5m86^ko;?ZVSZO" + A$ = A$ + "c>bTG^PN#_i[GWN7\hcmlbkK^IL>i>9lS<#FI[GOQ6[`FOk9EGi3F=?chl3T" + A$ = A$ + "5b4IW>gOh7V:GYfejF\lb5T=L8ToFjkHM8D_Gbh1XkJ^1kcf9_I[ZgZBD7Pa3_e07iZo7Jk" + A$ = A$ + "b9L?o7OQl#efiFBY^kKi2\ePNT:ohc`CH7cCIgOh8oVmJ;Sf3EIBcIi`OWO\" + A$ = A$ + "5bm?7Qmn7oYFUEo`aYNJ9D``1BLO\haXklVjTEoH]VX^R8G1nZTiG5c" + A$ = A$ + "oY7;NDV_OSB=fc^i=gjNBad4QLc>7DI\ZLfo]johJi[7`Ij^7Xoj=\]1#_i" + A$ = A$ + "[G^lB7J>aQd]QAbTKD3ZE\lV<1oCPEfVe;NkmfN1Nij5[Qm#=BQkTikCjLC<" + A$ = A$ + "_oYkiV9naeH=Yf;Gn\7[U2TK_R9o30mRZ13" btemp$ = "" - FOR i& = 1 TO LEN(A$) STEP 4: B$ = MID$(A$, i&, 4) - IF INSTR(1, B$, "%") THEN - FOR C% = 1 TO LEN(B$): F$ = MID$(B$, C%, 1) - IF F$ <> "%" THEN C$ = C$ + F$ - NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$) - IF MID$(B$, j, 1) = "#" THEN - MID$(B$, j) = "@": END IF: NEXT - FOR t% = LEN(B$) TO 1 STEP -1 - B& = B& * 64 + ASC(MID$(B$, t%)) - 48 - NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1 - X$ = X$ + CHR$(B& AND 255): B& = B& \ 256 - NEXT: btemp$ = btemp$ + X$: NEXT - btemp$ = _INFLATE$(btemp$) - _MEMPUT m, m.OFFSET, btemp$: _MEMFREE m - __imageMEM& = _COPYIMAGE(v&): _FREEIMAGE v& - CASE "icon-x-16.png" - v& = _NEWIMAGE(16, 16, 32) - m = _MEMIMAGE(v&) + For i& = 1 To Len(A$) Step 4: B$ = Mid$(A$, i&, 4) + If InStr(1, B$, "%") Then + For C% = 1 To Len(B$): F$ = Mid$(B$, C%, 1) + If F$ <> "%" Then C$ = C$ + F$ + Next: B$ = C$: End If: For j = 1 To Len(B$) + If Mid$(B$, j, 1) = "#" Then + Mid$(B$, j) = "@": End If: Next + For t% = Len(B$) To 1 Step -1 + B& = B& * 64 + Asc(Mid$(B$, t%)) - 48 + Next: X$ = "": For t% = 1 To Len(B$) - 1 + X$ = X$ + Chr$(B& And 255): B& = B& \ 256 + Next: btemp$ = btemp$ + X$: Next + btemp$ = _Inflate$(btemp$) + _MemPut m, m.OFFSET, btemp$: _MemFree m + __imageMEM& = _CopyImage(v&): _FreeImage v& + Case "icon-x-16.png" + v& = _NewImage(16, 16, 32) + m = _MemImage(v&) A$ = "" - A$ = A$ + "hainooo?3oO4W`?koWD7gjoJbif1c_Rd_do3bbS2f>WH3g6Ig0Hm[;okhoY7dIn_" - A$ = A$ + "GjOH`h5=Sk3FoPT[mb_fo;?U;2TmF`YnERY]nojc5Qk=k`>koSfeS3GM9kcY" - A$ = A$ + "0kF0a>:7?1:jGF6Fb]9g`?PjmF?hn_Tc7Oo_:7iP1Yg1jdO3dH00AE>Y%%%0" + A$ = "haIiBnkB25557oAdRCA]e#25]d#lf2J:JXU`9Q:XXU:`1[Q#154D7Dd5Ad91" + A$ = A$ + "g47l?0o5hX8n3DNXbC#5i9Z;>jP[negiX8jP;?`1aQ?LnNiNoL_7^L0P0>PY" + A$ = A$ + "QDocTUV8Z58Gm296MY#:X5DM7#e[?>=lHA6^o[9coO:17VGT9lJE6OIX?7R6X7NiQRmE6[KXbDmJ1bMOJFMG`L0AE>Yl3" btemp$ = "" - FOR i& = 1 TO LEN(A$) STEP 4: B$ = MID$(A$, i&, 4) - IF INSTR(1, B$, "%") THEN - FOR C% = 1 TO LEN(B$): F$ = MID$(B$, C%, 1) - IF F$ <> "%" THEN C$ = C$ + F$ - NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$) - IF MID$(B$, j, 1) = "#" THEN - MID$(B$, j) = "@": END IF: NEXT - FOR t% = LEN(B$) TO 1 STEP -1 - B& = B& * 64 + ASC(MID$(B$, t%)) - 48 - NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1 - X$ = X$ + CHR$(B& AND 255): B& = B& \ 256 - NEXT: btemp$ = btemp$ + X$: NEXT - btemp$ = _INFLATE$(btemp$) - _MEMPUT m, m.OFFSET, btemp$: _MEMFREE m - __imageMEM& = _COPYIMAGE(v&): _FREEIMAGE v& - CASE "tick_warning.png" - v& = _NEWIMAGE(64, 64, 32) - m = _MEMIMAGE(v&) + For i& = 1 To Len(A$) Step 4: B$ = Mid$(A$, i&, 4) + If InStr(1, B$, "%") Then + For C% = 1 To Len(B$): F$ = Mid$(B$, C%, 1) + If F$ <> "%" Then C$ = C$ + F$ + Next: B$ = C$: End If: For j = 1 To Len(B$) + If Mid$(B$, j, 1) = "#" Then + Mid$(B$, j) = "@": End If: Next + For t% = Len(B$) To 1 Step -1 + B& = B& * 64 + Asc(Mid$(B$, t%)) - 48 + Next: X$ = "": For t% = 1 To Len(B$) - 1 + X$ = X$ + Chr$(B& And 255): B& = B& \ 256 + Next: btemp$ = btemp$ + X$: Next + btemp$ = _Inflate$(btemp$) + _MemPut m, m.OFFSET, btemp$: _MemFree m + __imageMEM& = _CopyImage(v&): _FreeImage v& + Case "tick_warning.png" + v& = _NewImage(64, 64, 32) + m = _MemImage(v&) A$ = "" - A$ = A$ + "haI]KM0NDEVeFG5B_0Q4B8TNVdVI^COV44a^R[PX1bdcDB?T24P42U#A2#XG" - A$ = A$ + "2PR##JRT`:^PXD2mdKcTh^o[[]e2Z0Z8Z0B029oWcgmNWLW1LeooWMiiil`<" - A$ = A$ + "9cTIN?egcilm=i9oGNX9cANP5<`OR[lP;LPoT?Egh3QR_PhgVJlQ6a>fg3oD" - A$ = A$ + ";Li3IL[H13=Tm^YQ3gCHYKe;5;NG18Jae5X\R>BhB;hWf" - A$ = A$ + "=VLVM\RDbdfO9i<\e^B;fo:EFknZZ\fce1i6PlC:=Ko[EJ]KK9KenQEUIWK#" - A$ = A$ + "AFMT[blKK\b:nmRVolNkPT?SM6#LE^E_6eF:aMI;X:g7g:ZHX13OfhgUAD3]" - A$ = A$ + "`nm4UY<5Wacm5S?`0?hH7kiNHFIb^X;`o6S_h=m`S_h=CTWL1;O8\hFAI[g=" - A$ = A$ + "i`gSa\n]jFbKNm^oH[XJ_U>_gM49GjYhY:_6OFiifNa9WAGe0h]30G8No10W" - A$ = A$ + "o\B;mLM#^68oZB;MO;61OleX5leHo:Z\HoKDJafOCE6MmFbc\cbTWM;C#LnW" - A$ = A$ + ";QT0MQ`:[f?a;IkN8[RZLGn\F_KS[Z:6:nM35j__KjQCFMM315F\h:6Ie1lc" - A$ = A$ + "bf##QmgcnLfgO:JZK82Via7Zblff#EUof6ZRBG_K2FcVm#hJgR72[^nln1I06i^`kYGUV1MRIkO?lnnL5F\E_RiJSinkL8<_G4g2Ve96ZP5FWK" - A$ = A$ + "2Fn>LG#EP0H?N`77a]\imjS8UB>]#UIeFN9KefACfJgO3PkK0Hn>PLG4[b=g" - A$ = A$ + "3R_nUVNg3#4Sf7#bo6A:[T>lN" - A$ = A$ + "O:BWfk5\R:g\?X_PD#BJIk`Mn0niZ3RfJS^5EZOh#iJWMeNS2nJR9S6MS5kl" - A$ = A$ + ":n8^cKJ_Wk4\cHc5\aei9o5mV3K\5M\HDUCkFC>CKWTPK[O0HWkY?2VQ_c4<" - A$ = A$ + "cP9a6#a6]X_;R8b5Ah_i0bBWlgoF:BgfUUKfFKR]damjC#" - A$ = A$ + "NE[gGdGPg2fYWaFF]N`Z3#lPBBchh3mni7l75k4KnRZb7NEFk8TEDS:C>c>G" - A$ = A$ + "G:FjnCEJ]WNMH[I\c>`<=fjGTn>_[HMMdW8MMd_8M]?`_]d1:m;FOWm1_GDj" - A$ = A$ + "oOS^h^B1mPDCfo:iF\m6BbZQWC`d?dXhGbNm;RI\O_#M#B;[6gSYXSh>[O0G" - A$ = A$ + "M0;nALo71k:Gi6l=Ub?BXH^lDbXkCcT?3`NggeILKS5cmCSgf^;U^fjUBK[G" - A$ = A$ + "CTfF_^#]]lCRdfbgCY]U;3bUXdej5QOgU0ik0iZRQGS8M`[EGKg4d9mAnkH`" - A$ = A$ + "fMMEG#d3X>8m^_]:0Z?moT\e?0R31L3afHLZ;hn^`gkkBY]]K3hk6DJKn" - A$ = A$ + "bDZKjOBYYac:DkiNK1J>cjh[nTcAPjSW?O=7=7nj>J6lelni:d#mU9DkIG[#" - A$ = A$ + "]=\OQJKZNajJ^K#?l]PNhG4[_SN11d5MiZN0Sa#MoMQhRK:=MkOZ4cMDQX\[" - A$ = A$ + "GPhiDS_HNakW>0c9bZ34T=Mn>4kaFdmRMQUO#o7CQW<18>OU#LnW1nkg6cUS" - A$ = A$ + "iXUbhWC`=]]^?JKM;o2UVVo<4_2eMlRC#k1N6NYmJRRGk6R?b9_\X2GoL7=_" - A$ = A$ + "9?gPSGKYS>O^_Rj7gGD6U1=n7Y^Y6" - A$ = A$ + "H\6:;T4<^Q44Xm`oI:mWOSDjJYM#?oMR=dE_R0\9g2d1GBRifg1O1B>bk2jPni4?0n1fkEZQ^^\HCMnV2bj42CHZKeo`;IoN53VCT3n" - A$ = A$ + "7OAKjQMHgI[a3hOL0G^7In7ND9WE7C5h^mIXM7hP#`>[o>Mnlf#LOEQJK\9Q" - A$ = A$ + "Z[_hhelj26^^d3?AQmi\BDC]2?A9" - A$ = A$ + "<;UhEhiE\gA=5MN7nDbbg8b^\0CBg6RCXnCJ4le>:Un>^PA>^DmW5g8V3Cc\l<<" - A$ = A$ + "=UB`IhFN3?R9SJL3U`B[FgA9FhaabiWQ_VH;ZJgAQlhBG5]nXTbm:\LcbGQV" - A$ = A$ + "WVOQIYRPBb#]b5JXaU;BO7O9PmN5KPh7``ePF70B_B;FCJ67MXX4]UckFdFK0l3?f#" - A$ = A$ + "I5lido<>_V2OGgCLnkg=RnX\EiAhi_5#?<7_RZlIiMRajTd1YSj0KoMnF?cc:K9;b7NE\0a?jocjg7?HkC1ibG8`[" - A$ = A$ + ";;K[7lkoA8N_ok1kPMGXfV_P0]WLa9=igP:RGFOPX_NXSk58niSJBCe;4k8^" - A$ = A$ + "I]Y8FhRcXBmO0l#jJ8\2nLD^GM1Sn1d1X^Ph?0j1NE\D?39kEhKdI\N#7\Wh" - A$ = A$ + "iWni:4l;o49#NA96\e7GMPHSf_;8g#Ta>>TX\>VXhQL19^Z=kaS^l:6jCDab" - A$ = A$ + "62_IGW7XO_P=^F?ERnmieZ9XnfWPikTK6hG`VWg0FG7RgQji#=l]6[n]B5ac" - A$ = A$ + "X?#dO7a>[=W5gX?=[MN#LBcebE>gLoIhSAnj\eY#aQnXRmk6Z;R8oGec8;Im" - A$ = A$ + "N=jLV]_aUG53?A;k:>:3=EYHm]o5BdKkVR=Rn1fM4;02jKL9A6KK99Vo17UP" - A$ = A$ + "YE>PoiC`?GKO:5LJQZb`N34oNWSi7#Tffk7[_1edOSHBK7:RL:V61[MO#Kn:" - A$ = A$ + "8ac4oG7fik?>o]`>:>Sm6McQn0RKS6hXPBR;Mk^Sj0Zbg6TG\b0iWI]99fH3" - A$ = A$ + ";1h>O9a>k3#Uid" - A$ = A$ + "A>#_gGDQ;nmTjLJKmfPOOk9VfNO\HNIeSHdSoAlU;fI]i>kSoo=\cRC^LBHi" - A$ = A$ + "VBN>PKD#m063S2Z3Tn:KbW4:ZjQ9djk9A\af?:lMnV4oN>n0da5MM5A6K^ZT" - A$ = A$ + "\^k8`l0\hO<;\:OTPfN[f?5a_g1g>7nmg6hcmE2EORRClUWaXA>?`f1l49n0JL:]HkX#N_KNO" - A$ = A$ + "]mJKjSBd`1NjXVXY0aJLHNNfLMoW6k>`=b5SIV;h\f`I^Q2>S7L67\LjAl7C" - A$ = A$ + "Yej1VC?ZbG]gRF`blCD67A1`9Z;Wm1\Al1Pl3g4bCfFBV?PXX;_<_E^lj6^R" - A$ = A$ + "YfdC0amO:c\J6<^7jU3]mDJKHGAUfjR3[aSLK8LEQJkahD^^ocRM4cBWonLG" - A$ = A$ + "JY7e7Ycl`1[LJW9La5GoXQnclO1o4oP=k1_ZV_g2VN=SRbD[c" - A$ = A$ + "7`oU1\g7GO0jI;daG;DoYe6CQcIhD;Z>`g_[2DJffU9fNX?n1kY[mk0hoOUX" - A$ = A$ + "V3WJ4YUM#SNlC`G^nmog2kH>YDfbPcH;QEF]g:VJSbPLb74R;_48g0\?G3j]i35WN7cBAV7:T79" - A$ = A$ + "_3iID?OAN`KN[80IV?OZB=fe5Xk7RA7#7Gg7Un>_P#3W`RR\J?3`" - A$ = A$ + "fo=bYWU4;O7C2WN2WF6\SR[eYiFknna" - A$ = A$ + "Sa9\SfN6\[JYKa7fI>X:CkK4hRMI0kgVikf0dH0RQee54of#JbclM2QOVKc7" - A$ = A$ + "TKim" - A$ = A$ + "aL4P_oeQln=4W^GSJdC:Mo2ORYjCHFVQG87LJnl>SM1LZMM?lFn=d?La>JgU" - A$ = A$ + "^XGc_T;mhAZ<[^V3dc=>_UNaM5`JG8cCE7I^ROY#3e?AnY_[PiWefl1k?R`=" - A$ = A$ + "6k]7[;0j0a[LNN:^`g?JYV\M0X?hK`=6PY7f[CIXmC[`Rm32lmnI^h7Sm5[[" - A$ = A$ + "m[3an_M2jZ>n8EohnRcV0]m8nYk;aI\cbCQU[2FSV?Wi?Oo`>F?7a>VW3gOT" - A$ = A$ + "lImFQX<[>c3jmjSh>_57L`eea0D#?8ReelIhKZFQaYYDo`La\hW47Pch0`Ob" - A$ = A$ + "K^4g5FbK=:9VKOi#N`[:UkLhegEO0_V[1b72OFM2nGg0cmid<]denE5Jh\[;" - A$ = A$ + ":e[:bXCoIm1ckAnLPn?LbWonaAQUW28\LfH5FONB?gO?5^ZGOH9WK" - A$ = A$ + ";_X:[Mo1TI>HVNVb>Z5Yg1GT?T_fSWNLCZdP2kYW\gAodICVG0KO1\fO9E^H" - A$ = A$ + "?4_hJ7QD[]U9Po;>h^88fok0noG7nkM9`go20n_>TG]?VLO\hokXdMjI7iDF" - A$ = A$ + "DXA=UWfKdggQN6RS9hR;G56N:?b6:c]7ImUi6^WI8nkHh<7hRM\_Ka#OgRdfboBX^j;9ndFEDlNnd7" - A$ = A$ + "fXND;4NHTHBVn2HaOh[MGN;[\m4\TLJNR0fn:G`OOH=00oo\LCfo9`fo[`WW" - A$ = A$ + "[hoB2eMjlB#KYSTWaG`;L6<\jiHH\Y\Ho9g:PSbo[nUldkP4[k0kP??V_;Y:gi`UFdYTUL6fO?`^o;^b13a>>KEP7bg#Y" - A$ = A$ + "n<[:fDgDRAn4V38XW;Eo`N_Hc7CR91lSlR`onbFbnmA#Ik;8AIe`C8c\mo5>" - A$ = A$ + "SLVlWTlkDTlk]m[0nAOoKQon1gI33neGOfLa_3mKl^RE\1OA\[XXC9#EV" - A$ = A$ + "M]>8>lkajL>R3YSgYWY^fF^2UjcGClJgY4\_kA>^93L`Y]mSj5fR7dL`Yk?4" - A$ = A$ + "m;a?;LWPR:o=7Q\L>ch0D4X" - A$ = A$ + "il7=adfC:AVFZTI>`>WY1ana8eGIm;AlWbJf]g:WMM3GF1W>5iV\m?`m4Mo`" - A$ = A$ + "?PM`?Ml?CoWP]7k5Aad>DX:\feJEBcCI0bN^" - A$ = A$ + "]d=^?`K1O^G#VefFRRR?IR9^T=c5bgmY" - A$ = A$ + "dHW<_bn79M7JBQ=A[1A?cQ9#`>>?eHhdk5QKa26F[hR>FRlWcR3PofG" - A$ = A$ + "X?BFd>2B6NV#\fmO7dGgQM?J3V[Wdcm]4ZYao1O=_kDRAk\3>XGhiF\g=TOlj" - A$ = A$ + ">RoMPo>_Z83=^jH=nZQc;[G`khe?=b\7IcoaROU5LR`UIffK:cD?G3i?cIGo" - A$ = A$ + "mSeDTKVF7X`BKcGBY79Fa;OM3CAN=nT#>R>#^M^V[7gM8>OI:]=oY2d0eOVl" - A$ = A$ + "bRR5k1m25h;^o0Ga^3>UL`_dU^H?RI9KO4BcY3c#=^_eUMFM7To3Hoo>iFjl" - A$ = A$ + "mPjSo2gj3diMkljDjKIo9YMkl#l7eSlI]>gBI>ej_4;=Y3hIoa0" - A$ = A$ + "N_9j79UN748O:#7#l3PlSa1WAlaMd?19g7POll15nK?GgU=Sm5RRhVbC_k_FQIK]:S^V[clJeg1m>" - A$ = A$ + "Sedbg9#gI[9fDg^XA?Q23:j9Wm`74kEi^[mMbRM^L:AK_bG_8?4=c37YRZgbb[U" - A$ = A$ + "9Go?;DmiNc4d]7UhN56acKTHg7ihWmmdg9K?U\LAIiSAZc^aejI:;HKn8KjW" - A$ = A$ + "B0DKY3`nOC\gAWnldefEYde#=bbZa73loo#\_B>m8e?S>hK5JlTI7J^;?Xh;" - A$ = A$ + "PmIj86Pa?8\lFZglbLm3S:So:OAYgdV5KXc_6NogDR1Wg;78hn4jSN" - A$ = A$ + "^LfjWcgU14Z]eNQlMW;nYDgS4ih==2jeR]WCdWXTih5>CEnYO0::m=^6hciK1O]K=h^9]idI0RQSa0D4k" - A$ = A$ + "N[gVBMCM;#gk=I\>7FS7cgQHWMFC\mLC_;5JlCZicYo;B_T0fC4hD[Xl36\b" - A$ = A$ + "Qilf1AIYmbQlFOoPWE9k_;2L6d;U\C6Ni]ZQWXU3;BHj=G3`alRh^jYkgZ[n5i0gX=" - A$ = A$ + "_mn1OnnPJ#mBYYa?F#J_Ofa=i5=JNP?o_5faJm^RMnL`>OVMg;O=[f?EcXN:" - A$ = A$ + "8?k9Pj;gTC>F6>U]L=`gOGaZOma:M1k<0Z\Jm51koG8Q9NUklRQ_ooT8S]\U" - A$ = A$ + "4]^]XR>SblN#O0JlCk;#k7Pj0N;IAN9Xd:lWbdk:VOj=_I8_fU0?9707O06lSc;^" - A$ = A$ + "KnVNoTC\hU>bUW6" - A$ = A$ + "kDJJnf2eddU4Zi<[=>e_V`#WbD3:b91me`9Go_7fIWM8kn[5>kejiH1nUbVf" - A$ = A$ + "I42im>SBcf_UCmCPeHde>`]XYoFRjfK:A>5cS0WEVhiDG`Ba?POacfS#cMfnbg`1U:BO;K7\eGV" - A$ = A$ + "n<3PH_UK1akoP#eWMO9Zn]TQW?6F\SijMPMVm6o_3k\nmH=?EK[H?T_TJ714" - A$ = A$ + "gW3`YnKDh4o2jlNTii[kLk>ZY\YHaIJVDA#mRBfSODIMJUBC_[FQGk]iPo1`" - A$ = A$ + "mX9aHgHm\?BDjWC_TYGM0h^F`cB1InkLZ5`E788[:L?n<:dc4bOin;`hQT#Y" - A$ = A$ + "[aJXdej72ljn6`foa2dd`>5XMoS9l7=WA4`cXIhdijY[cil>cYWWjm5kLVI\" - A$ = A$ + "TE=O?SO][aWT;ZAUPOoYPN#jeYlNjkPIoe]n99Yi8Z3cH91je;lTNa>cLA5E" - A$ = A$ + "G`DYgj<1>=oQAnRCfo8oc?]GTmW0LHh?m=" - A$ = A$ + "j7E6e[0bkKG\NL6cLgMVmn5I0m3Ph3C]]L1INXTR6bK:kEf_?>Y3hX78a4hI" - A$ = A$ + "g0?_2JFU7B:^2_iUmZ2RWf]4J2CJaQ4nh;Nh1lTVl?PaU]_\k#no_H7?;b:;" - A$ = A$ + "k8QY:[>;2`nG2il_=k\lY[i#OndPL]OD2j>hhaiISnnAlX6ldaNDGoJmT:_m" - A$ = A$ + "4R8S=G64cO1#_MKW>714^;MSWUT_DZYFGZPPmlVRj0fL2>d1" - A$ = A$ + "hiGYdEiaXdDQgHQGLb>fU>]" - A$ = A$ + "?`6lCD>7V_8S]]G#7L=JlO_WW6hooDaVK\0LnbaFBe1PcJRKIWf?43fE=k=h;RMiIgV6XGjo6Y" - A$ = A$ + "GJGVS=VcSQKiiiUfnOd#eDN#8o2dfCYc\3oE<>8Y2gT7ZZHIn8fbIO2XNm70" - A$ = A$ + "LgjeecD4`Q7i`N7XFaW:eBk_Rh2?Lll;[67W3OD?`Kfej1Z7RUciEPNe7F;FWQefSc=FlcW1mNIHh`9QIgA2bX^#TTNCU1j" - A$ = A$ + "P?CR;W_>2_0X?1Ida2O^Hc]_#Q5NJ:A_BenWdV[b;N0oC^clTMGeTM1`Z?H?" - A$ = A$ + "KjLVU:[`>SHfI[6Giei1[=7a>FS;U:[dGiUln9TLF]G4]?om7kdal=OA:eWI" - A$ = A$ + "m9lB[:>\W2LnAX]?n7]LgXN^E?hI]QQ3Gl[l_j1678>cm5WH3=^H#7l=>cSW" - A$ = A$ + "ci\TLnj\OAiV]M8YIO^GPOA_GX`gIoAM0O6o1lN9#j9SV[TLZGYhB?H8BFh[j7FC>i]<3gAM1bAQ" - A$ = A$ + "[Pn8\?F0cLQao7gm=bU1S_SMN[aKnKI5NY0hc;Zbm54>[Hl^V0ehZ7lioAlL" - A$ = A$ + "J=hIDSMfITi8L70ko2Uf6Oo4ejlLCI?g6DSOe3MbCn0Tk14N>0AM0NV0AAf<" - A$ = A$ + "G[K8?f`;NAn8`lQT:b#;K5e1RHm36lL7g_3m#jMOCITkTAG=Y`J7cCIAe;EL" - A$ = A$ + "Y7;41cK[3CAEK`GQ;L6NQkd7aF\cM=N[XbJmAiBgR?SI]kfKloaM1`jO;Mec" - A$ = A$ + "gCln68^lm5Tl5nFQ8]hjYB>W>;6_S=Z\Jo[1LSk8Y?B=NGj[UBCKgAXVVoIQ" - A$ = A$ + "J?oABBm1ObHd[90^c=UmliQfNFlcZ36OAEo`1Dcn8b8gCe39P:bemP;O5n:8" - A$ = A$ + "mgE2Uaff3XKaNJkmnLg5FjJi:bYYdDFdYUSgS=YcnPQ" - A$ = A$ + "83iWFnN36kAAbLfg8DENM3WLfcVcN3FNUe<2UciP1;IF78B4cZbYi9X:k>;7" - A$ = A$ + "g=2H_oJfkB5cLch`[7k[QdKa]PLMo0UVco^leNP7OHYIJ4La>gc]aH7kIOH2" - A$ = A$ + "nOP1N#F90Ckk?QB8EDe3QB#UHM81Eh;kFDcYD_Cbbk#AUNSE2n1O>`W`A?]L" - A$ = A$ + "e3o;^C>a7TSlWHe1B1oPhbLQ3S" - A$ = A$ + "_e3T8Uac_8P7O?dc?Un^8`X7XWMXAWd3hl`k3j31mG_>`97RI]M9PSfG1bW1" - A$ = A$ + "2Tk6?SefoHEF\oE06_88G1TO1W?:RI5VkYOVlKdLJ6L7=\ajTjk0g^?APVC]" - A$ = A$ + ">nZgUDfK_1We3L^W>>^7Kb6l^me?X?`MTPco6?SeTk=6F" - A$ = A$ + "3Smg;WInX^>3;4gG1hfL6XW63a[NSa=hiAN2gWcUja6:klSn]`?" - A$ = A$ + "GM09N0b5X8g]>d8bO;NBd1C[#O#O11YOHXgn6FZ8M]d9UnfnNjiU2mHA\;TI" - A$ = A$ + "mL?j2W^OOW^cL\gQb4eM`7CT^c" - A$ = A$ + "_LAjJn3Ql2o8^CElLSAR;9n4MfomL7oh>;#GV;hPg=`>IWCMOkI`aMBXk0^fLLW`\ehhNg2hN6dnShokT>0h7#SOjM]Ro]I_G6TkT1X7B" - A$ = A$ + "8kDm4_W>a?UY?\AKL11VPne4E2jfU4Qj?A62eNf=#Y]YC8DKSO0d7:H7KiWP" - A$ = A$ + "ooG11cOQ2HSak>FcG2Nl73_^6`jH2dLd2B#mnB9jGJUl6YfI7LXJ:<8ln6Pa" - A$ = A$ + "h8^3lY:bYkK1gkIbm3k^RO4Go_P\%%L2" + A$ = "haI]KM0NDEVeNME9m24B8Q#jIBKjm44a^R[PX1BVJV9CjQDP0T#0BX818d;Q" + A$ = A$ + "PR##JRT`:^PX84ZYGW9aMoGGELE1UR:RBAj`oilM_OcLW0FnoOf=??WWV\4cY;S9V" + A$ = A$ + "Ig;9Y<]nGC<3[MY:MKWB]Un^XJ;mO5#^:8oT:cfn6EFjcJRF\]?eIfcJDVEg" + A$ = A$ + "iZ:o>7UlRoP8i?kg=05CM;n5CEK`SQ_nBLEnLZfeA_T:7DP`g=N]SW786oCgkQ6eX>aS#5^_6D`?SaDljNTaDL]4iYWcROD:^EFfZMA1LM<" + A$ = A$ + "bE_1GB\fEkjC\TJlDf\OoQVHY7QWjlJiiETKG5WH6mF7Pg^1LQhm70LncZB_" + A$ = A$ + "o[0bU1iGDUNOgPE`73o=D`GS];X>MKO[Zd]ngEWA__SRPOFFOD" + A$ = A$ + "DXoOjcY_oTdd`S:HJ7L#ZbKS3BMnKL#:;Me^8H5ejV`E^Ng4FCI^?bi^A_T=" + A$ = A$ + "W]i_bRKDPZ\k\#EIfoNCdBoO^jiJSino\;\_G4g2VnQ6TPifP;2Fl" + A$ = A$ + "VME#eP0H?F`77a]lIoV3=YB>Z#EIeIN9Jaj1BdBOO;Pk[2HnFPL74[:W^l\J:" + A$ = A$ + "9ICn32DIEej5j;83T4FdVMU?PO^jP8]dR;ATlW<8^fi1J_A1O=AUA;Tg7RMN" + A$ = A$ + "5_OGi=i?`E2fI]i2FkZLWolNk1?ZRnXXDWCGFBXGP?oKX<=[WGQI[M:9m^WVZYd" + A$ = A$ + "HL:ZNeNSn2lVcFL?jbZg=Z>0a3:9b0mPURd]nFBcZiG#`Dfk`iGb>l9\Y^;?#M#2;Z>GSZXmk:e" + A$ = A$ + "?P[>PRO4goA`^ZU^6_CZlm7_S8MMNMA" + A$ = A$ + "JkhbRefaE4Z]mOB\ffoNAJKolPL>Ajjh\`okLPlMPLA9`[A\>heZ[c[1jTKC" + A$ = A$ + "nL3DG#d3X>8]n^YLCf^TLCFkGVU>W^`2>LDX>8RY^F?#lC4fH14oX`=G" + A$ = A$ + "h_7fSLFKcCdO?YYLXXEWEg50eWnOBdb73aQ0^QHK<>M0hn>`emM4Y]cK2hkZ" + A$ = A$ + "Rdffi5UJ[o;AJJih2eNRgEPVS]:nYNhI:8e3V?O=787nj>#6lelQi:d#SU9D" + A$ = A$ + "kaGY#]=_;QJK]A9jJ[?#?L6#?L99jknjP0jRN7XN0Sa#MoMPhR[9;=KWDZi^" + A$ = A$ + "[DLf=:#b<[cK<_h3B7Pi4Yj01IcT_3aNdP_b0a^`bgS_S\`3774W_D8>o;0o" + A$ = A$ + "mKRibaLdX=0_>8hVaFOK6KMkGBTVfn24_2eM`RSCk^O>NYl6RSEkJR=l9\X8" + A$ = A$ + "2Eo\61_9<[0SEKY3;H#RIRC9``V`L3>lDFJhAZI]lRdlji7WQM>:AJ?H^Ree" + A$ = A$ + "bF1oUoU4MMmSRege_0jgKi#?H?^h^b=JkfP>hjbBcjg8cD_KCB^7F2oY\MOR" + A$ = A$ + "I>;bM^j0Z?0E7#S=#O0df?#k^lYQH_gi0nkO5h_O=d^SiQLHck14Rmn6X_=H" + A$ = A$ + "Wo72Cmh_ElJf_V`e_1nQZO:S8XGYTQ5`[<^Q4b[<:O#9\GNdNm0UDOB_AIh6" + A$ = A$ + "dhKhjVToAKX\PRchJRCPfmmG4Y_Ye:BGkM1ji_CRQN_^H3g__0Z30Kb=0M`i" + A$ = A$ + "TJ^[J5Ug1U5oTFZ_AGiFHd18n[TA7#k=P;fi3e>Xak:Gbfl>A`W7bc]<2fC7" + A$ = A$ + "Re=gg]]k_cJc1k=Pm>^Q8=]oE2BmXK>nDKHA>hO<5]^7a^MWFS7`oXQNiN\:fg`C<[^W4dkfGPfMX742fYnk" + A$ = A$ + ":dWCU8VDU^SB8YGR7QVGaN6a4eiIXC<;_3;kbl?1M[96Qj?\A`Gk0Rdgmi1l" + A$ = A$ + "OMYXNH0j0Y6]NCI6]N6aVj\:aigH<^W?;fSI^PO" + A$ = A$ + "bJfYkZ[h]mCInMZG=T[3kUA9DOk1PM<>7bKOd=c?U6NZHeDJ8AnBYjg`6Mbn" + A$ = A$ + "Ba=Ri#dVSblnXQW`JW^Ml[SP?Wi_aieDhkkJlE\;G8jSbFVKQVoj1m`CkV_8m]F=T;hT`ef]0lK?F`^>0R50OQo1O;7kiU_Pii5_:G4A7Ph" + A$ = A$ + "7moYnma2fnT`Ni;4j[;;[[6lkoA8N7kScI\3fMQJKkd2dNhiW`4N;AQmZjm7" + A$ = A$ + "me3Nd_4a?OhSOBNPH7a=eVRHQ;>S8io9d7B_#O8<2nLD^OM1[n1d1X^Ph?0j" + A$ = A$ + "1NE^#g3:kUhMTI\J#7\mHiWf9:4l;oLY#NAY6\J?F0e1BPLEa6kN_Rcj" + A$ = A$ + "S47;T;8nUE[K?nR[L#?EU;jAi=S6L3mk5\fEj^:d_?_><1egnLD?7ZQ_QXe_1AQmLjm7mgA\C]iDLSndDk\3Lbd[e0kiVkO3O]" + A$ = A$ + ">5:fe7E^;G#MAHioj^7N9[fSATcVlZL8aWnFSATQF[BRn^n:Yj]N=96Ao" + A$ = A$ + "0JOgP>`P=dghLR=fi2R?omoe`>:>SmF0\cZ?Phf8QND#9" + A$ = A$ + "n5^9GAMPXbg8TG\:oiWIm98aHc;0jMnL0Fij3L?Y6PlQ6\1i8jYOnIO#eaUO" + A$ = A$ + "en6C6;bMD7Pc`;YZ=iVd:gVoZbYkLPI_?;f;?GoNBM>]MLC`__[hCI7?AD_J" + A$ = A$ + "Z3M4SialV;fYfLWmaoo6fYhTK?9dNC9?7`=:XN0SQA1e1bN]eiEL5EcP5Ji3" + A$ = A$ + "T:aHG70^V1O0`_WS?0CLA_G#\afZ>1;K;<U`D?DaaoZCM4H?0" + A$ = A$ + "aB<5\OVoKQM2W3dJbL4\" + A$ = A$ + "65A`7cZ3Xh?nU]>ghEelm8QJWR7aGH31;fD;c6\M#OR4O0fh0[4O0YjkiRRd" + A$ = A$ + "gaZR>gM42RO<_WRB>#<0GC70bkM]7X]GK[OJl6fmc6ah4gk`7PQKQ^o6Qj?ZfX:LV" + A$ = A$ + "3AdlJ0lmk]0EV1nD#K?<7_SIjjjF0noga[IO97F:I7`86cH]gKco=a>VC:Ye" + A$ = A$ + "?EG9cQTOkRDUI_EXbRejEHafKY`B?j5TkQ3QO1ekMHio6TNIL47D[KAmJ_Q7" + A$ = A$ + "2:K5n:8W6U3mnd6h;o;>i3#VIZkOFTQfF?O;K84Hh\RM" + A$ = A$ + "^>LNf[:BG[_GTJZ;Q0C9i1?LMVl6k97]mTjk\eUooK=^O=>7#>fRKYehYb9e" + A$ = A$ + "RL8WlNPhbc1bE1kcUQIKn49YemdEViN3jabK_^7EYk2\oX`j30clc_28?#1=" + A$ = A$ + "4\jQUQC9W`eO#\S2Uc1JOHSLE`Lgc_f1[^`F5[>C[_=T" + A$ = A$ + "CnR8oa4>V0nNP[_K0HXO9IfT:IVgS_:WaFl0k70e18nUEaRQjicc=NcN9n9g" + A$ = A$ + "LC9;cH_WVIN8FM0CLm]5Y_WC;d`QBGIFMU1HkoFT_I>mkPi9^^HM]m_4X]QW" + A$ = A$ + "<4SIkO`?_9_SjEcTdC?YWFF\Sb0[Cc]fm3Z?6W`>JkIa^j5^N_XL>X>CK[5j" + A$ = A$ + "5kl0f_9ke6If>B<\^NQhgVCAAV_G#lcLSNQm6Sm6B]o9\JXGfEoVNQco3c1o" + A$ = A$ + "a`kkjBCSf?0QW:#jn2#?S[EIVM_L0oG0ckAmmaL4P_oEPln=7S^g#d86OJn4" + A$ = A$ + "jhBf[#BOZNPmPcd?_cHWFgRFgfYnFnEd?La>JgU=_g`W4;mPQ[:[NW9h[b=6PM6f[8b#G75hCO?#oNo`?<`g" + A$ = A$ + "b=0^1?6OCe;<6=Uj3V;VROBL0ba1Po4[]4G5FbkfLP0GRM" + A$ = A$ + "MI#n4hkZ7`ojZH^?WhdBGGGDXQS_Z8BMIQ7IJ??Hk;a3bg34k6hI^cc" + A$ = A$ + "1nnW6`oEPlZH>2F>k9hok4YkXc8l9>_PSHR?[WX__Mm<47C`5gNEHkCiaFCI" + A$ = A$ + "^lH[^^W2L^[4ZMcNTH][gkTVD[?ARFjmPH?H8W3L" + A$ = A$ + "a>>g]4H^KP7do]#M=FB\Y\\8hmRY=hQohYCj3S4Cb>G05oQ^b]jYlbfNPBcY" + A$ = A$ + "]a1HkD30oPm_KPOm>oI5V\mCP]oGP__1Roc9DgAc;>POFN6O9?#>HXjIb>50" + A$ = A$ + "l#anC_107Uogl9aYmA3GJa792B_:_FmnYN^KdC4Wb]:d7bg::eS]\XCNMa7nCIf_0NQTm1WmRV?V4" + A$ = A$ + "C2h7k;2olU_PMiUPbfI0RcZiWB^IKoKTSLflWTlk#nO8oNWo2POdg7h0d[B3:bbJfb;jPlT" + A$ = A$ + "<[jl>F\gL\^3WjJKo2RB]Y" + A$ = A$ + "jREkFTRcM?\A?1X7L6Ko`OYeCj5Q4C2GKXO9nMQk4DLi_m#UWca6=Pa?5`g]" + A$ = A$ + "hROhcnV`n5`ImH`?MNA7ho\2dMH;QJIZ1`Poi#`?a7S5oaFnbM;VYl1n:?_>" + A$ = A$ + "`nWQmjg?D[V\_g[2iEog:=gC]bckPl5oe8ijiV3BKW`Lg]OE1JJj0aWbfC:lDBV`i0UW97H7Wo0" + A$ = A$ + "b7AW?4`OB[HKNZJ6=<4i5LdTDHbjo4gCd32o0faLoG3i>Wc>k8fOn6>DfS`H" + A$ = A$ + "5fa?Cl?klWP]7W5AiTgK`:]dk:1fE\2_BJ1[gkAFjN2FE^mT;T_kTnl1oO" + A$ = A$ + "MM3noMPnoW1d=GA^ATO0Wj?hk4Zo8C;:mc?8kh7hNc1n[ceA2iiD?Y369Pc3" + A$ = A$ + "1nAo2k>#aM3Aga?_=704_H4fWdo0dGg" + A$ = A$ + "R^7=7ij9cLO3QJJiObGck?aXd>S03hUCV`]:Rm07o[iQM>fHa>IgF\f54oQ]" + A$ = A$ + "b]i9llQ9=_fNAlJ`iNkQlOjjjJ`n8_TRd]e7TOl:fSo]SoN^XH3]\lX=njQb" + A$ = A$ + ";[GbcHe?I2gSdlODl[ZP35ZLcFOKHolG6kOVc^n_;FC1h#TX3DVNWE8]dm7]" + A$ = A$ + "T5_Z1[<_FNJ87AgH_M3c0fIe]`nO0kogY8mNn0XnhUhFOP9_K?GATnfgE2" + A$ = A$ + "Jg4?4oAX?k?3`;47IUhWaN>60M0a?0bc" + A$ = A$ + "Hk;DJY[:EUCc??Pmma>?SCeh]W[GCkWBXVS<;NCL3a=RaFD0nmRCJ`D\CiHd" + A$ = A$ + "17a\keV]OJ4ohi3:dgMF^:OZk<8UIfklP_KBo]dlZTMYZ[CH7cMl5bB_WJPm" + A$ = A$ + "UmSLa?`A2FOlbRdgiQSb`VB82SjlRROJOVTm80jPW\R]h^TLJPmESeLM^_FmMc\cH=]oM2dMljR>i=9N4S]`0" + A$ = A$ + "RL2I?47HWQ_5^cMBa>gN:AK_Zg\8g4?]m5^b0fjSPNP\G=XnXn^nkaJLgZS=o9?T`bKbNRh7a]3>H1^G0l7k\FR_" + A$ = A$ + "lComSGRafW7lN?5\_1FNhMF785f?;K\Vmj]dnJIceoc2Cm4_MLjf^:L_23m5" + A$ = A$ + "=B\k3KC9]GDJoHTj\0WF9=W=jUlYL41#]U^1koe`I7MjkCGWGDT^" + A$ = A$ + "V[CNF]l4PooWPcEbI6YkbZ3>S#S7>kPcMa14KQik1^g1L>Cka0\n1QTg2mTG" + A$ = A$ + "V[N`Rbh_aGLJ]F;`ohg0_o[1L=jdNi01gW0ZG8kYQcebm4Z]3HWB]LRHWH3?" + A$ = A$ + "FhSad#aHNoOniTFiFmGeTPH]dkk;acJ5WJ;RdbK6CHC^8kk>bn\FdI>AO2H_D8W" + A$ = A$ + "ZlCKgR4Y_UE0O?W1le^QSMCbNnOH?3#\mHL?`WW`]^XDK]?1jnP9Pei`JlHn" + A$ = A$ + ">4kD^VXcLc\;56lCZicIn;b\T0fS7jYFIik9#EIfMY#ng_WK\?bY9N654[]]" + A$ = A$ + "niUjfC<^In^18:m^:7bKmm>>[B^^8=]lI2Bi3c>" + A$ = A$ + "V9<_A`3lioe`>F[OPHWTgW5kHoUH_U:FabmAmDKD4TWm##mU[a97;K?U]OI`" + A$ = A$ + "gO[A[OeA;K>Ka?AIea;3fo_2bKa>3X3nRQ[oOB\afGOlFfH4AVAINj`7P1o<" + A$ = A$ + "n2Pg2VW72:]BO5IjmU`?]fZ5b[M>0cgPQC1jiOZC0kM0H_M0k]nE2BY" + A$ = A$ + "a:B#cbhQmeSnlHQFf_DX6j>`I911VK7kUW1k`nD^9\3ic9DcaFI<" + A$ = A$ + "Yn623NRC:P`7?V:cf^QCcCPeH" + A$ = A$ + "de5dKA[omhe]ST2ORV7:bEVTIf#PB=gNiP?0^c0kk=SiaTcHa?8>]>GL\I_c" + A$ = A$ + "8CJ6;onl1Lf?HC4o0n5?3g2>gIh=O3kAVHm]_9`FONVc<0Rmf_14_o32Cmhk" + A$ = A$ + "Z:IYeK7`[mVL`?T7`6DG\?\NfW:>]CXG" + A$ = A$ + "jDZa?LG;hIYP`o>WJ1Le12bZBGS=S2M?^lG\_2<^GYRdeBMRdeaW0mem]P]o" + A$ = A$ + "c4XYi]8#k^6IX?N>3e_WCc#HbecDWciMVc`Wj34kLhS5MODnIN8ia=ie=H9cJYNOOW[8>j1D7Pm;Pn12e^0_SGofS>13OhcaGC" + A$ = A$ + "S6iWbnNaX6gjS;fW9o0lkYCSDWSk\lfWWW3gYoNW?ALV:ICi8aY>3[K1i9VjLa2bL_949TgDn[];_LB7`A?#R9`c^1NN5d\Kb<=Hn^ooRMl\8[Z\m7Rj\jY80kO" + A$ = A$ + "=TcoVD^lIZi`LndPL]OJLjfcH#n\AOo`NL3^KO?Z0WaRbKk11k7^<8VodPNk" + A$ = A$ + "V>M>28m^0a16]neba_:Uo<8NWki`V`KjLfG#9VCWI1cB" + A$ = A$ + "o9\lUC>GT\mjbfKIKoXPD?F]AVbjR6]mQl0M`UI`omONJPOOB9VKY0TOiX;Y6o#^V8lL1hW\G>fI4iVKTNVV2gb2L;8H" + A$ = A$ + "nEZ4>K=^#BY10k>VUIPL;kdnQHa^jI\6_A\[8k>e0cBog9cB?0N\aLN\mFf4" + A$ = A$ + "_DfeS7\Vb30k_0]mRdIf^o:67T#Q[c=eE^8_TTnaO:XNm73m^1al>[3PNhaN" + A$ = A$ + "H_5D[hTbB_[GCBQk;FnUEWmcQ?Z7h=SjQIU1QciEP`=GaehJXFfRKXP?654g" + A$ = A$ + "QTb^9HW;ohLiGU[=GfRV?DSO9NXZRUkSRYmNQZ>;8G_UnkGUI2Wa3Pgd^H>_" + A$ = A$ + "BYffW5KZkC;FWQJkANSUlRI`\G6fNhTb^k81Id##BC[eb0M`GPj0^W_>BO1`" + A$ = A$ + "L2bIR5nB9VkJ^2;lXR4oJehK2eF]7lPn?ibi9MGeTM1#e7dcV>7^DY2USH:g" + A$ = A$ + "ZaD>PMFK>RM\6GBEEUg::i3S;a\jZ86On7^GIIaPcDPl7Qf" + A$ = A$ + "nHOlbMAd;\L7We6fNhRMYo=g`h09I^cHTHXUi3jP_einhiL>;9W_>KWEQI[k" + A$ = A$ + "EFfWhUhGd74=ZBBYk98Ycmem1[9W8\7KDGPmX`E#O4jSA\B>3" + A$ = A$ + "J`_aMOSmbPagA?kE0LV^4?D2mc;^ZM60bES`S" + A$ = A$ + "`]0\O9AJKi3SG[clVB?g6R6cb7d4V`^9g7#hi04e1hI245iCKU^Pma6Jacc;" + A$ = A$ + "1Vg[0nlIl3LL^SaN;Id3Y1LXB^WmA\5m\FQW:[ZN_D1lo?BPW>lgh^0XngbFN5^Sg_1B:OW1XH" + A$ = A$ + "^_C#b:^AA9VC?5SgS=`n`o60gh>B#^bA\kdL]Rddi]4ZY]OFXfVfO2Y^WW>:" + A$ = A$ + "mJlS;_YdcW7JkYhWZ36CAel8nEg>9b`fN=?ZOEV[[1FnBlF#J__DA6kLkP^5" + A$ = A$ + "WYU" + A$ = A$ + "cM>DeUg`#8Wm\I^S0EDEM3EeG3IfRK0ijn1AJJjmi[Mg?iPCa4kiDS1kL?g6SJD7oA8ho?M_7R:nIJ" + A$ = A$ + "WoID2ZbZOHD2X4;?J05nZ^4a<;ec4Bom49:]FZ2l3nBXO2kcdbE?`Z3`c?5F" + A$ = A$ + "7jZ#NQO4hkjdZ]He6Nn=DVE_;DMVMUYZLKOlZ:XeWDEa=ohZb_Y4UWG[?VZl" + A$ = A$ + "1\VEGY[Pi_4`k?`RKkl4cQ7Gj>B`NKQI9KkNA6KJN#" + A$ = A$ + "Olmc`O:cmR0[NPQk#Fn^He38Ohg6V31mG_2dC>4cJmL#?JW2T_048g=N6[]m" + A$ = A$ + "IZCgfY0bZhWjFUQak" + A$ = A$ + "34k>>KVhlDmJonoQ;n7X>0a_OKj]O4iCOB^4B^EiIHi\2oB8m]6Fl6?`h4X_" + A$ = A$ + "Sg3VUl\4NdaIk9W[47j1fh26M1kma6>?Rmm30i]`nDamTPabTk;#X66moCVK" + A$ = A$ + "WeFcQGJJL>VO7i`2am5PNK>6jm#63W]H<>kmKAKoT8==oY2CmHe4_Vj7=iN<1Z_7h8ONWRgiR" + A$ = A$ + "M7WkjOKlCe18naLRH=1VcMljMWLNlacP^^ijG2VZ9lhe]WW#\^VF\HM]m9#N" + A$ = A$ + "QO4gY:N^a8aU4O2Rn`ika?^L1>0N1ML_1Bh9S]7>bLkhN#o5PgP;1lUMBPWh" + A$ = A$ + "GGPVm=^`6oJS9hG\P0Hj]1lg7S5?A\?Ra>C2WYLa>gcT;mnOjG3o`nmT0c;3H14lgML=`?6h22?" + A$ = A$ + "?741i52nKML5b[ACkG5`k5QHKP[TFj6aIgak" + A$ = A$ + "CWHWhD6l8<>7oSCo:R8>MKEZ#m7:3QJ?nJ0>g>4\;g?6V35\S]oC`_o5#`lG" + A$ = A$ + "X0fHlN7[]c1?ncPGGcHM<1J>#1aUj>C:bGIYl66\3dPeDH0hmK06SShfoWY8" + A$ = A$ + "W^O;hNOVlP`n0a?R[oG0bR[BI1" btemp$ = "" - FOR i& = 1 TO LEN(A$) STEP 4: B$ = MID$(A$, i&, 4) - IF INSTR(1, B$, "%") THEN - FOR C% = 1 TO LEN(B$): F$ = MID$(B$, C%, 1) - IF F$ <> "%" THEN C$ = C$ + F$ - NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$) - IF MID$(B$, j, 1) = "#" THEN - MID$(B$, j) = "@": END IF: NEXT - FOR t% = LEN(B$) TO 1 STEP -1 - B& = B& * 64 + ASC(MID$(B$, t%)) - 48 - NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1 - X$ = X$ + CHR$(B& AND 255): B& = B& \ 256 - NEXT: btemp$ = btemp$ + X$: NEXT - btemp$ = _INFLATE$(btemp$) - _MEMPUT m, m.OFFSET, btemp$: _MEMFREE m - __imageMEM& = _COPYIMAGE(v&): _FREEIMAGE v& - CASE "srt_logo_bottom.png" - v& = _NEWIMAGE(401, 30, 32) - m = _MEMIMAGE(v&) + For i& = 1 To Len(A$) Step 4: B$ = Mid$(A$, i&, 4) + If InStr(1, B$, "%") Then + For C% = 1 To Len(B$): F$ = Mid$(B$, C%, 1) + If F$ <> "%" Then C$ = C$ + F$ + Next: B$ = C$: End If: For j = 1 To Len(B$) + If Mid$(B$, j, 1) = "#" Then + Mid$(B$, j) = "@": End If: Next + For t% = Len(B$) To 1 Step -1 + B& = B& * 64 + Asc(Mid$(B$, t%)) - 48 + Next: X$ = "": For t% = 1 To Len(B$) - 1 + X$ = X$ + Chr$(B& And 255): B& = B& \ 256 + Next: btemp$ = btemp$ + X$: Next + btemp$ = _Inflate$(btemp$) + _MemPut m, m.OFFSET, btemp$: _MemFree m + __imageMEM& = _CopyImage(v&): _FreeImage v& + Case "srt_logo_bottom.png" + v& = _NewImage(401, 30, 32) + m = _MemImage(v&) A$ = "" - A$ = A$ + "haIkM]eLDLL5Nn;\_4KW7eO1mG#98Q`6#B[4G48T09L\S3Q4P5`>HK\58KR5" - A$ = A$ + "Dib324fQ;2`bQl0#`9\06B5P4GD#iPafUB]E\Q08119Q;ZH45`9mYe>:]>KO" - A$ = A$ + "KfM^\[XGGOU]g]kNjC?Wnk[kcYWA00NP3>hP3>hP3>hP3>h`hP3>D916_icb`EH0N:7O>3?GBOo`17L`Q:9`h" - A$ = A$ + "=k[h#U4HlVSE6`MG^PkHc" - A$ = A$ + "HVGOlo14#=TOG7ZQQj\9KA=TfaFKc4De6EYY>YbO?SFWn" - A$ = A$ + "" - A$ = A$ + "4Enif`544NcP`o>ZgoOm]dmRTCRM:>OdjmPh9O=PjhI33=TZeDFaedGZLE1e" - A$ = A$ + "f:F=T;ZY>ZFoR<=T``7CeHV:=[T#39:]CE8CBci7WJ8]`hoGgJG3l__neQRi" - A$ = A$ + "c=_i=ieo5VCm`i?gi:Zf`ocU_dUhJ8oQ3OhBZMfd[mZlme4cJ8di_ilV>OAe" - A$ = A$ + "N5bc8bM[Sc[?BiT5KVN8]C1mOQO[;_2GGVhjKYmcdJ^ff^74ZM=ZGQlYYcK7" - A$ = A$ + "jhIcA6S=a5;^W9Z6_Yh:BiODe_2;KCem_LTfGFLGBYYlD>m`b7C7gZZH95D=" - A$ = A$ + "T`lnBHIWI5l[Ci9IN]=c9ZTP:=4LMo;Xid`E_jEiL_3O[K17jP706Hok3>`0" - A$ = A$ + "kG9`O7;g]HU7oLU[L5HN?oLPobI?;ooo[nb_4fc_k3df6R]e17H0^F4nIgm_" - A$ = A$ + ";HY;YEfg?mb]om]?hS6L#h1?h1lbUm4oIH_kI?BJ_m3_d;^bY5S]H#3AFN4D" - A$ = A$ + "5gJ:?6eOUj?BoMA>9Z__H<4dYQ8K^S8?3M>ZhliYaQK[?XTfdD2Dg?l7HEkPHfe>;HK_kk`[kOk2G#JIV;CSJ9;NA`m^ghlb]aeWQ" - A$ = A$ + "g7TEf48O8di\jFO[7RBVg[;^iQ" - A$ = A$ + "U62]oF]GQlHjbUJaZQD\fV>=4AOi7n`7bGo^O^]ANHM0goBk]]DhdWnD`i>gO5nA[\[Yd#" - A$ = A$ + "nhSOLXai?_Y_W7=]5FfGM3KPGGRPNF\T]VeAm<7?YBA3Y?be" - A$ = A$ + "B6gB#bA]:=T`bfDeg_XTnRXfG:beUfO4e#2COohB31i_kX]fPocM^3WGn`on?RoMhjmGJ[;f8`b>WIG7G30QO\\X" - A$ = A$ + "J8HIGN7];]=`[E;=g4lQ7jPljn7?fa:#oY5c7BeN5>g8MBci7GJ88#njm]gm0nO^3C" - A$ = A$ + "?i6gh6llCX5\bT;G>N>8#nMEJ8nWGgSMdS23?l``e^feHhKhi`oFiK[A6IHN" - A$ = A$ + "mVHR9Pe^VO>o<2G1YQD`c:Q1OEI]]ZcQTYl_ZkJ7TcdTZcdXZcdBPf3B0dAD" - A$ = A$ + "YUE" - A$ = A$ + "e#RBkD7VaMV\FFK`WnYomYZ3ZGPi`O\A756UQoi#31_C?KEY^`<<=4Ek39Xnm1IO8Z0F7" - A$ = A$ + "M[AV^6;NoZDl7mVL]KjjOjhJ]E3AT_U^g#jhVZhL4D=TBefO>Z1P]cInT?AZ62?om=WV_o2Lo8h7D7J[Mg=ok`lZPeGWV#I\6RW4o9" - A$ = A$ + "Ca]#FnZmT<7cDMgafkUO^P=LFZ:ge#Xk[#7G3=W^Rl3VNnnXPN>H4_^VbY^]#:OD" - A$ = A$ + "8YQXJ\=J8b>co6Wo;YM:5=TRaf\A3QV[MAO0okajd#2CObeQW_nI3[nW^:n" - A$ = A$ + "ii2?G`o4FkLZCNB]J8nkkIncm5POk_iG3?na?VGN8D=6J[]IS6R\" - A$ = A$ + "c6^ooFkm<=mWRe7cT6R<^ihB39:]CaLZ;mM^_SoaWmILNI_Y_fFI?WjbN>2Tml>e7YLfl>4\LC3aONoPBj;dnZ^cfV9=" - A$ = A$ + "4jjnEmL4:kldA_G4dW?TBef\A3acCnkn9AnACJ8QU?V=J8EYXo67J8AUMB?K" - A$ = A$ + "_dka3VdLnaU62R9O6AF;LkA61:V?SNgk2_i[_9nnB^`i??ok`HSIB3Q[S<_i" - A$ = A$ + "2K8C6HTlGk;Oi;1_HGM:mIM]5M=bdhIE\?SQ5[]I[6R\l\8NoeT6BHiSIS" - A$ = A$ + "6R^[ED[Q4Ef9E3QNNVinB9=_OH2MJ88`gIR8gmfkmmhaHbF\SNkUoL9f0gFN9EcK[De#DM>S]E3aVg]DZhGXGk`F3aT]I[6RYW" - A$ = A$ + "1KKd#23OROOdD>hC8=4OTFAmkc2oMAT:_O=UGDfOk?:[e#b" - A$ = A$ + "?VVAchJ6;kSjd#2JNDUMn]4ScA#G_KYJKfZQ#77XaigF=TBe7;8J8b>KCaU6" - A$ = A$ + "BHKWBOo^kEhnJWa4C[FMo=XB4FmgP:7L`17LHBdZk_5^R`mg2G7L`1720HlV" - A$ = A$ + "k\Y_OhP3>h#U4HlV?73ONI0oMBS_PQ_OBOo`17L`Q:9`h=Al<<\3" - A$ = A$ + "6n:66QQKoD4#KnGa`cRS59mm37L`17L`17L`17L`17L`17Zd`oS8%%L2" + A$ = "haIkM]fMEEL6fo2m;E]O\o5jO1KiB#1bE^78#2F]F:]0QPFDY60UJPE_l1PP" + A$ = A$ + "F^40SUn1PR]LCX[2djb5\\8EGd5[Z#1BPBB`5[:Q5`KWW9WML>_I^N>kmiBb" + A$ = A$ + "L>[WUbnHE47OFSKkCKfC\Ei" + A$ = A$ + "GB1?3kg]QWAPfIi7hHi^^[l[2TNT?NIQ[om\T?NmWS[T[o<#31aEf:gjLVECD3e=CZnJ" + A$ = A$ + "33c^Y67]o9XQjZUVk\WU\LJ\nj:hb10fR5KmFIX62633O9GnKHL^>" + A$ = A$ + "OLEPaRjh3dikF8J8V6_a7SYCcKS\dheHWL]?O\7e7`37Z=`iNDQ^k9?M5;GE" + A$ = A$ + "XfFQZQHK>8X\eU7CJ85[?V^f<FM#iG5_fJoiB=4X95Jm#5ob=mFbjT5M" + A$ = A$ + "T\B3aG>4Cnin`542_I8l_HlEblKi[51L2LkDMlXg[19GmdWjCJZQPiGJ:]Zc" + A$ = A$ + "Y_HiZ2ef:D=4hSI:?VVoR>=Td`7cDKV9=[bQ6BFJWV#kEBloI]6BC2noE]bE" + A$ = A$ + "#oW[M=AB3oc=^a=TioiVF=dI?cI2:_l?GhlWGZQl7>`12:Ol?[mENIijJ:aJ" + A$ = A$ + "8la_PkEU_0LILN6E^KKLNh[Jjd]g]Pi??aec?MkIgkVNoNkU^om__WMYD39;]ca4c3f_?QA31kSeZGeZTLb?h1?#>omTHK3NHK0[" + A$ = A$ + "OIA=_0jTWl4dI>cOUnQ;]]Ae#nPSL4Z^I>SlGcSUb2YmUkX3INanIYKOX`j:" + A$ = A$ + "JK9;VnZ_j^bd1m>;kGEYF3Q__#^h?hY?Q7S?6cdlV<=VD=VPQ^>4nmR?>5o^" + A$ = A$ + ":7AXW5;McI5]3QN>e2A3A]=8Q3Qc]4Bdi[3Q?GU?^L`cG>d#0oM;=g^[4MPOok;" + A$ = A$ + "_6V_o2VgLM2TfY=eY8e00Bf;;^62BkRKIAJ;3L_JZajYgKokCVgohQ?lHdOZ" + A$ = A$ + "`e#D7oZbE5bLNBhgiSoLa1IK]4Q6?4MW9C>OMNSK3e?DSma7SkcLgmE3Q7kO" + A$ = A$ + "E>4O;3Oe#B;KcT6BbjJC3adj#2e_?TeQH28?fVSFbjEah?:b?VkV]jW=^FOe#D" + A$ = A$ + "iKi[=Tg^IJO>2E3YH]=GJ8L^IL_hkSU>k[Hd#2MM8V^?8]EbJ8QHWV67U77a" + A$ = A$ + "49=TARAnT7I?WFd2YFL1QN#ccONReFL#9O>d0#iLZ?l3eZQ8SO_8n9Hm5Hm8" + A$ = A$ + "h3dQf#WM:_6R[2b_==Q:lhQ`mWL]_5jRG=^NXkQ[]c3T;=4le7nYK^kfd6lA3Q_oR^PYmO\#d#:6KcU620Oo\hkSU;=Tdd7cV62O_gBN7" + A$ = A$ + "=XVn\D39;]CCHLgNHiB31lb_d;n2da>jAYod7L4J9RHF0>MGaCOTWYmJYUfJ" + A$ = A$ + "[dGoeo?9Wn:nY;W>na`f4ZG399n;S\gIkBV>L>MgbVkBN^PMLFZZde#h[[`6" + A$ = A$ + "G3?V^Zl3^NnnhPO>HD__^RY^_#;ODajCjX=aV>\?J8j>co>7o[YL:6=T2afl" + A$ = A$ + "A3Q7[MEOPTnHKJ8YY?V==4M]Oli>UUJ8IYM:S7B^nfa4Gab5?Oi#31[=hUnA" + A$ = A$ + "_XTC6O`j2ZIbCJdHTK3?K=CUFn?IIbcc5>G`oHAiLRSOL[J89[kIVCoiXOk_" + A$ = A$ + "iGC?jA?BVN4?6TNKj8EhJ8LOj#Nn#hSkhSclm<]cOgFEAYQT[n>JKXVkSYeV" + A$ = A$ + "E8J8Qnn2Pcc62GeXfVUf#O]=Od#dMf`Cn_Fkc\DO:DOV[DcaG^d#0O>FgaohCn49__3emfg6]S^kf2f^4GF433li;nR" + A$ = A$ + "o=E_#3hdWjD>e#B#]2MT=\n>7=^:hlH1==PZ#=4MlF`oEM^]jN>eemL4XkiM" + A$ = A$ + "2OECW?_31[dd#B6g3>5NMQGG]MffLYQ`Wg_YWS#MWW>NOAX?O85[]iS62P^g" + A$ = A$ + "mCZlS^d#B;Od" + A$ = A$ + "?3LWk#_n[^FijB>gI?[lJH_aLYQ8eA4aQYSfKWj?gmn2GhldcgF[JO6cCd#6" + A$ = A$ + "NhAN>eOSemjUJ=4C8ao5nIjRo\9PaEVNnf2M_Hd=7j:E=4OP]cQY;=4NKW]b" + A$ = A$ + "R?7InnIEX?SQ5Z]i[6R^h\XfojB39]lalA3afm:[e#b:kT[Q`??cBOYRQc^B" + A$ = A$ + "3fd#0`kemLZ" + A$ = A$ + "[Mo`ZTd1bB=TTii3nLOR5B2T_kgEfkYVJX>ieemlMH3Ho[B:CKj2#79Y>j:6" + A$ = A$ + "lU9=T40o9Mi7O3m\m0oJ>_X^ofOHS3Z\[QT[=5eIC][hglY>JC39dhXZklKY" + A$ = A$ + "^?7Q>OgReflE3Qg>`gWOOe#:FO\#d#dMfV:EJ8Y]MZmmk^hjlee>^I?]4lVa" + A$ = A$ + "o6Dm=`[o6D5A4A4A4S01_Il_5^O3Ro]`=R8R8R0PPgLKEALlI=fAeDOG4A4A" + A$ = A$ + "4UK8h=OJ1ndZ8Nn\2oC1n>ECmMA4A4AD^QPg4h95H;2li2d_0gJ24P=o[4hY" + A$ = A$ + "#KAeDOG4A4A4A4A4A4A4A4A4A4A4E2ho38bWDV2" btemp$ = "" - FOR i& = 1 TO LEN(A$) STEP 4: B$ = MID$(A$, i&, 4) - IF INSTR(1, B$, "%") THEN - FOR C% = 1 TO LEN(B$): F$ = MID$(B$, C%, 1) - IF F$ <> "%" THEN C$ = C$ + F$ - NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$) - IF MID$(B$, j, 1) = "#" THEN - MID$(B$, j) = "@": END IF: NEXT - FOR t% = LEN(B$) TO 1 STEP -1 - B& = B& * 64 + ASC(MID$(B$, t%)) - 48 - NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1 - X$ = X$ + CHR$(B& AND 255): B& = B& \ 256 - NEXT: btemp$ = btemp$ + X$: NEXT - btemp$ = _INFLATE$(btemp$) - _MEMPUT m, m.OFFSET, btemp$: _MEMFREE m - __imageMEM& = _COPYIMAGE(v&): _FREEIMAGE v& - CASE "is_obs_open.png" - v& = _NEWIMAGE(410, 62, 32) - m = _MEMIMAGE(v&) + For i& = 1 To Len(A$) Step 4: B$ = Mid$(A$, i&, 4) + If InStr(1, B$, "%") Then + For C% = 1 To Len(B$): F$ = Mid$(B$, C%, 1) + If F$ <> "%" Then C$ = C$ + F$ + Next: B$ = C$: End If: For j = 1 To Len(B$) + If Mid$(B$, j, 1) = "#" Then + Mid$(B$, j) = "@": End If: Next + For t% = Len(B$) To 1 Step -1 + B& = B& * 64 + Asc(Mid$(B$, t%)) - 48 + Next: X$ = "": For t% = 1 To Len(B$) - 1 + X$ = X$ + Chr$(B& And 255): B& = B& \ 256 + Next: btemp$ = btemp$ + X$: Next + btemp$ = _Inflate$(btemp$) + _MemPut m, m.OFFSET, btemp$: _MemFree m + __imageMEM& = _CopyImage(v&): _FreeImage v& + Case "is_obs_open.png" + v& = _NewImage(410, 62, 32) + m = _MemImage(v&) A$ = "" - A$ = A$ + "haIkM]eR\MD5N?mdCOK^dmOQQG7k7dR=FG6c7EUm#OMF?WGl<_jXMfifK56?W:l<;b7H;>nhWOCgoM?Q" - A$ = A$ + "mH2nila^XMiTC=Li;o2KGFO#mChi__fcOom__ESef#kiSQmAK:kkWHo\ga7o" - A$ = A$ + "L[g`nYkTOe_nc]cklG^6`hoaOjW1o>g_:Z>#[?LHDAmiE7MlaOg1=IL]8OL?" - A$ = A$ + "ka#>8I2bgQ7NoWiS3kcomoPi9knVon[jm5ngoigNoGiGL7CVL?mb^>cG`=>g" - A$ = A$ + "j2o`Ob==K\bV?2og;NaWHS\Yc9[COZ:k7MdCeKAWcg0iK3^\QomU^dgI;BV^" - A$ = A$ + "NRW1j]IfRoiKnZLk1noa?oTi[O=W>C:WJHlOk?nbQn87g?_?0gP_OnGoiGCk" - A$ = A$ + "iSa7[]baOomn]_f3<[=^nhbGn5?`m[:UKZbnam\1?WDVCiSV?gU^dE#O]FEm" - A$ = A$ + "UKL\:\9Xm#g9eWknF_n;QaiA7mdK_a6gL]Ta5iS6?c^knY`ldUnH8oJdNQ]?" - A$ = A$ + "l`_LgUmc`nDlCZjMlkciCjVSN^cm88n`IVoHEO`jd>l7oc_=`5X6Kb=onhSo" - A$ = A$ + "NkknZ]cZGL2EIolWo[f_YciKj7\NJ9?C`>hUY[7hIXmR\g[oKOlbh98#afbH" - A$ = A$ + "aMUbIY`I_QM`53N6O5hH`j1:`_XdF`CUYh7kni[ik3fg7lBmkOSmbH[EYZmZ" - A$ = A$ + "8UUaomgh7MY;mTHm8ef?Y4NV>IE\n9ojULL9EY?ml_Gh[?\ZnKIm1[=Cbchf" - A$ = A$ + "S:FkD]VWFe7Wl?PkC2^fS>jIf9kDLMQfWjYgaJ>U[YOh`?8FcaBeGHAnhTW]" - A$ = A$ + "aLhXcOLca>giNhaIeLnMZhkOPI" - A$ = A$ + "cZ]OR6?c5_hg2[MZKIm5hnBUg7bC_N7g?k0Fc6V?kRaR_7l]_^Ho<5V_7FW<]>C8WHn]KLSHIeRW9" - A$ = A$ + "V\[acTbLn5iS6?cT9ON4W4a\J4?3FgnbJlQe^`e9TNQK;0lbPHOWnmR^c]Sl" - A$ = A$ + "bgB:W`n9??19?4ho7=jS^>fCN^mQhN>bW?j?\V46_QZ?Q<68SS`?71WWA^LR" - A$ = A$ + "Y\W7\77NN3acL[]n0KCf\8WQT?GPbc?BSWAiL[f1O?NkT[13oK<>Yf0M?T=o" - A$ = A$ + "?o2OSmbV?gVJo:jWcfE7]gNOVBW?Ai[[hiS=MOOUac0i0SMFkVM6X\nO=ii=" - A$ = A$ + "1MPl\VdRgYM6EU9;Y:CRaG]dMbnEK<^jm;NaWX" - A$ = A$ + "3b[6mcMoodJXKY<>CEOfC>f4f]Me\Ka\knhDU8kdRV_JIA\o>d_K\akKV=I`PgejPoTYCV=gfef1" - A$ = A$ + "c6SRcIc;[>k8?WU2oQQ47F^aY[OXm`6SWIh`?DG`GTSODL6XXoQMGNNCX=bc" - A$ = A$ + "J:Umd5F[CWbV3TR?Dg3NXMQcELQJ7CV6D7o#Fkla`m[KSI3Yi" - A$ = A$ + "Mhi9W?FVN7aIifB8C^hK[_8nRW8>o_2cG`jPmf]WIWZRo9iId0j;Go\5l3Xe" - A$ = A$ + "^9mC`?oXSNfaP3Q=>7Y9kY`c\0f_]lnbET?mU0?ch[LUob?kYOjojeNRWh=N" - A$ = A$ + "9`i0nF^RH3FC^?28OK]e]2Ni1Qa8RmRim]MjZ]UnOdN1`c_FkWaYKML" - A$ = A$ + "C8_ImUne`fM`1OYmgLcKMCfHPSXLm5f_Rc7ai7O0IS?ATG=:6GH?1[EH_EcK" - A$ = A$ + "OO\OHoN`Ue817>i2n17Nh3jW[U2?3ggPb5YTW1mI`_Y7gV``\hGE>6E>O\Po" - A$ = A$ + "``Z6[HLhRo_W6?SON:go?LnZCVlif<8CEN6PLM#Zl<>NYnIAb7AZb4h8Q]Z^" - A$ = A$ + "j^T]_QlgGKo2Ak2bDefHQO8e^:SQkVkMY;m]7WZN7ajUaJYJ2Y9jcP?LYSAi" - A$ = A$ + "H]\h1YbchFcf#IN>:llLa90G3mldhIP\GENcF0kgdc`>Fm<8V7eDN6gcYeMO" - A$ = A$ + "godK2LSIaa3l[" - A$ = A$ + "hkX]g:GO2>XNbeZ7eOdiGQHaIQl8U:?3Pg?JWKOPLn;6[XO#mc5FCAKQnPh:" - A$ = A$ + ":mOlh?AoYamNVnbJX#[=8?dJl<8g3i\o>KkHh\J>#;o1JOP\c]7Dni`JVV" - A$ = A$ + "9_Qc0Rko0nbLO7Vm2[C9GL1aI8ik;6o;MfCJkQV_7?o_S=FYLA2^6ol3YOUk" - A$ = A$ + "oONmMWoLMdb53E;jUm\V6C#TbY2h3AnBR^>:H?B3ULb5b;XhgSmR[572WoUKH2iN0>G8YO7]nJXC" - A$ = A$ + "UniLPakNX]QmZRmI\6fkE^ng5W#ZkToNTCETcL]lYBSY\Yi#4nZJehN[j8CJ[_8" - A$ = A$ + "5MWTORKOkekbKRl6:[Y4\Vgbl;:[MbaIZnQ5T?ond_gmkfml`gIMTSJ4CIJM" - A$ = A$ + "iV^N?F\fVZ?AoZac\iV_O4cL3oN]H[?DDc`9ac`Wo5T54?Y=\98_HXo:\F#V" - A$ = A$ + "^8LN_[e4N6ii7W^mkI7Gk<\ALTU=?CfDNSf]K_C?do`Wln^_Gif0_RS" - A$ = A$ + "Oi]iL=QkYX:G_V<7bcAIehbNJkW1g9XZ>O6_o1_V3VkS#W_`ZXV=8^I]h[YT" - A$ = A$ + "CF]ko2h#hfNl_M[aKbgclMbU;Xf8" - A$ = A$ + "o\hI3n>ENl#nk1WT67iP1_k]i?;igIJn:^[=c=6Mj4GlG<6gPV3b`ZAc[a\k" - A$ = A$ + "4MnL_FgL72hGk:bI^8NWCO<98?dID5K=DM[Y;TgoKK\gIgj`" - A$ = A$ + "6C[_:W_JhmNPFoPe6W=OM35Z9iYeG`m<:BLUNIcicG9FOTKNH#n`hUJKM^;#" - A$ = A$ + "9bcDimHB[fL;CVdZkRDdMU`ch]_bHA9`cDJkJZOH2n6ITLFR^[PN?>?Ccl5Q" - A$ = A$ + "OOIe=?Z3j8l]cWKMI^cRH[jZ]N2ineTil5eTO:gI;9g=6C8OaIiS7f:8_" - A$ = A$ + "MfMg?iFH^UDndFcj6KL;i^WnJaCAnSbU;Ril[Z[ADk\FTc5A>H`mAHjLPle0" - A$ = A$ + "8nnUYk8mWFnKBWWYhc\>bDZj^cNNVVi7ZW?hKAmMh`bPWYYnRPW9FmEiI>M\O;KN6gcNH:e10dmhiPk]RV_DhCQceOjI`NU9h9Uc7INNYjQmZORoM0cc_9lUbHaGai1WKO69lNL" - A$ = A$ + "X`mXQ5;T_?lLnd^aCai6glPOLU" - A$ = A$ + "gI[CTejK#WPn2ih6jMaMB[EongHKInJWFG5?lHI>aQO:fO8i;6ilIf#JG0GG" - A$ = A$ + "#>XJh4e4kfCc_#aeK:Go1NfQk]fZJg3GfIhh_OD0hiQco?D_BM:`AG1G1oCQ" - A$ = A$ + "hAE:CimGBEgMFccD8?m9j7:c379O8?DdlC7f0bIQkFL9jmHaJUWWIZjcXhe9OoIheHB`o5eA3E?idMgRg>O<:1GH`_?:?SfmnGh" - A$ = A$ + "?k?oPXe>klk=SWWF[ol[KGN7maM\G;hWQo=eOZjBQ" - A$ = A$ + "]`kSGcJlQbUTLm6bJcbOg:3e8VFLP3>h;>AK<5Z3U2Wo167aNW?4^S2];`?m" - A$ = A$ + ">i[m8PBNO0DH=DU9CB>]DeMWelTG67WbV=anYE_Pbf];T^I\ch" - A$ = A$ + ":673=OT^7\5ReF2`g7aFV77^V_OcHlDblSD5Hk79:?c\kASPKTOOHPnY#]#5" - A$ = A$ + "ikY6gZ4M3m>[]FW1n\kacAKEWlhbZQV1bekFfcJji^jG7E7?OK2i>#;oLTm`" - A$ = A$ + "O7JheS[Klk[EDgl^DkOP#^Dm[?BVCA]aChm#_bi?nL5R]6[?VNWUZ_^C[Nc>" - A$ = A$ + "=iIV6O[nnQCkcZK7ECiYZgS5[=c_6lVi;Nfcc4I=YJjW4hI6LVoD^k2ieQfk2ESWejm20ECaYbC0K2hH2lJnHmeUWQjSY" - A$ = A$ + "a65g9a:dOLn]bTC=k2;GHcZm0]_Wg_KWKWo^c4_;WVVOYZV[b^;0emNO3^=\" - A$ = A$ + "_iZ^KIliIhk>Jd7g__bTNW54FOEP7UZQXFYh3PhMbgO#X_6>l3?JJ]2UWOTY" - A$ = A$ + ";F;EO8o8`OeO_iRd7NmF8o<[^jV[WePJ>BV;;?GVW[1eA^JMG7^3U" - A$ = A$ + "`7:l>cYJN6fm^<FhL>VaG`7SJ_CYT?[PNL5Jm6" - A$ = A$ + "nJXFnnCRT=WMCSWQN7[YUc5Jo2X^0Veoa^C^>k5o^G>kNE9Z9NbOROocElmC" - A$ = A$ + "FVb2e[BMeMEmgmQj`cTBk8kEMm33jVE:Cn`c;4cO7Do=8N#EjmbNO0dDOabn" - A$ = A$ + "k>A9l<9GGcJW];\SHoGJSCoH5i`fk[lPC8MJ\g70hg1>fImG8F:ON2b7FC\O" - A$ = A$ + "dmLXZj_VZC]\5k_;0Dm7A#N7eZ=2maZh>k=m>ill7bcA9R?ShI[]fT=cbGki" - A$ = A$ + "noFTbO7I73himiRRi7Zg`IL`8Gfad9DK2jE^>1aHkXmL0`Jb4jbfUJV?0h4Tf1NMUPkF;leYO7SG8LG4bk7PnRi_XfoW4>Ka#=:f" - A$ = A$ + "G8?]`J0Ub2lW`nXhjjHneE9C\h>]Z[^SKOmL`S_[QdlKDCW8F\#Gi]GLmD=J" - A$ = A$ + "7]NbJk7:mO;:O?8Y?WESXEYgWng?b2SCnkifJk;RLf0^VHm9GO3IU5?MfLJ>" - A$ = A$ + ":cn`mC`J]e6WDl7Q_bZdjSS=>Yn3k?DJkG0k7dYh\;gB;^0O\PjD;kDl_cIU" - A$ = A$ + "5k]ZhbIc[Yh>1I\735>g7IJ`U;YNAkldFYRWCQWERSA^\YI3SI7T??NOCfU2e" - A$ = A$ + "P]DG6igcO65\a:fAig_deLD3IJUVXk4fGZohfaFQOF7Ql9e39e^Vh7F3ogLj" - A$ = A$ + "o4dkTL87W[dDOAQ\gEfW\nS[gRj38nnD^PRik;7WASoDR=BKn[dfGelkVHoT" - A$ = A$ + "aDXWEbL#iNZUbLDMI9mO:fW6iCDUadE=]MWRcES=6RnmBaGX9nR" - A$ = A$ + ";ZoE:mG3VGWdhX4mGMR=\XaJifWJacH`P136`7C?mIGgF[E]nZJE[JgGmZGmMME22222222222222222222222222222" + A$ = A$ + "222222222222222222222222222222222222222222222222222222222222" + A$ = A$ + "222222222222222222222222222222Rg1SBolNN?oDR[]`J1LFP;NaWNcmgo" + A$ = A$ + "aF8XV>eKSjoFeO>FhIVT?#GL`1?i:QoM;SnHKlkGGeg=U[fhd3GlR?eI" + A$ = A$ + "J[>Tj9enkhenk\cM=E^bV:_^?\3:CK?OQecF7L`C\d0[Wifngmk_meo__aE1" + A$ = A$ + "fhOnGONHg5nZ\b0_j8PA=UWGId17lSGL8m[9iCX]g0S3Iak7lco" + A$ = A$ + "ooPi9KnJoY[4]5n?_nK]c;lK^Y]gn>V?lEGCI;4jW[NMo\OieGeGEc7Qmki?" + A$ = A$ + "o3]Lha`LbnDW^SmmgoAVOBWcgg?Qnbbja6ni;LQOdZYflJ:N68gZd5o[Gk5e" + A$ = A$ + "j3loa_Gl_UjoEbZam[[3`=4[Wom[oBN]?jOZbJko;\e;oB" + A$ = A$ + "gCEI2ea5_hc\Kh[JUKZcj9dfPWc>V;iSW=g5^`UAM=CGeEXO<5d9Xl#fIUWK" + A$ = A$ + "nV_bcRninkoXWIiUo#mJ<>9OlhIfLc_0VWNTg7Z_6]Wj]mn5ojK0L1^nV2c_?hPOb>Q7Mj0jSO2gan" + A$ = A$ + "i>ggNQQ>WOXO`jY]l<9m#LD??hUFHQg;FOEeJEjJ_:fab6oSGmW" + A$ = A$ + "OQ;l`Hm8mf>Y5NVIemYfFG8od?i>FcYM=m[]fW0[ih8eFHBn46?W1cQc>o9" + A$ = A$ + "<7k\Wmnf8lXmJnM^a>fKo#Wc?d?Nl8mjFDn0Ao<6G#`mh\GU:N;4S:mn7Dj\NKW" + A$ = A$ + "hacLnco3`JW`j3cFGPk[DNO9`W2n" + A$ = A$ + "n[IlQm>a?mA^SHP3o0H=KHnL`7;N>HKO=anIJIIMVHLRigQn=lUe;NV" + A$ = A$ + "LSM?NVBVc?9OlhIfNk_2lC2OF3RW1[K_lN#kO`JGdb4A^Xe50aaPIOWamR^n" + A$ = A$ + "=Rhb7?C7mh4j?ki9HiQ0ooXAOVU`Nb[]?T#kHKODOH=9:N3GK2[?#57AL>2>" + A$ = A$ + "?SJa4cI??H?>jh6RfLeEoh`>W][OBRGGcc7KlnnJSW1S3dgEU[j<" + A$ = A$ + "#Eeodn1SK4oC_f[?" + A$ = A$ + "bm`iJ<;R[Vlk3oOI=djh7dGiI]lmdSFH^i^" + A$ = A$ + "^`H?f?[6?7JWdlLUc=fmRKV7?c#eONfbFo[C:?3d1gkmnK_9A?=Ya[fjCM\O" + A$ = A$ + "[_c^S6mY1gNl<1mRD7;Pj0kMDkOBfW9>3>]MMlL7" + A$ = A$ + "fj;3m2hCPmd2QcGK4lWVhHb^N9XSdaJ2macM^_5l3;L4=f3]JmVU6kQe4>\Jmc#m8kQ=7?cJ[m9W3l5eh7=W1:" + A$ = A$ + "ZOXg]Wg4:Sm\V:I?MYej4e]]HSgiHBeojU\;l\ebc3?8U;M^RCDiDSY3kW5H" + A$ = A$ + "7Z:Gd7NLMK:MX<_3]WMnHKbMhWE[;aH:hO3cI7\]8jOfnFSe17eK?fjMiocb" + A$ = A$ + "ch1DGQjIEH78[McJWPOonkohK0>4Eo\FL?TaN9lP_5mYfbS[AM^7LK>BXAHL1kPmfkBaiJU`cX]=THAJiI" + A$ = A$ + "#MV\K`nNZd9:DioZcnXciSU\7RiL#GnG2nogbSW9>?EKoW>Oe]gnfQN<^6\^" + A$ = A$ + "lOYU1Ubc4hU`LOghADjH2LT#GeGIGajgDlkk]MQYLYaDgjHSMXD^>mQ7VkMQ" + A$ = A$ + ";l3Sl#U8gQ_N[_F9W#6Rl7=J_PO2`e8]W7?36" + A$ = A$ + "kM5g\9#o=n<\cU?3ViA3UW9d>Wnf^]Oee3>6=^lUOcGl1O`oL:G`NZcHS1C^" + A$ = A$ + "?=RYG`7AX_QcZ0S]Jkm=EO`GA=od#g4fkkJFNVFA#n2IHXLahIRe5I]5TmZ3" + A$ = A$ + "khDlD4oQ]^GI\OCKlHUc_`^>S:oh9nElN8UCRcLYbM?N69W#6Rl4fRfm;GR]RaGUf6X8N64_" + A$ = A$ + "TB\?Qo^Mfi[6cGH_mbQa>j?M`c;O3" + A$ = A$ + "0nmgomo7Zl7eFn^RmPYGoihHMMcX_UklZ#\igFc3Sb0O98OW:VW9ic4nVBbQ" + A$ = A$ + "P>CUk6JIM#?V>[69GXkL?KH\[e7Bli`JVZ6_Yc0BKo0nbJ?SBOQeYDc_Pik9_m#[gSGlkDmE9FTP[9>o`JG5no7VOge?G7_Ha8iRNK]eHO2Vif1" + A$ = A$ + "Mgm_BGWC#b6beN]" + A$ = A$ + "ajRKIXfnnRa\MSKEb[:G" + A$ = A$ + "Oii>WmNacXTQB:Y?Zg;6\GdkkARMVU75ma#OK=4c" + A$ = A$ + "#;WLSh2JnN\GL?o#hl_2MC<^G4W;Te^CFO=TYFkL=#OF7OKkj66?^_cM>mYG" + A$ = A$ + "0f0acca[]#L?[]7`dj;CW_F\O^iVgf8kgSHZRHVk5?EY?50hHQ]ZG>^G??SjHc=giP]cB86e`Wbhlb]LiN>O]3ENRjeSWIUEn" + A$ = A$ + "X`WibamJYFOX9WQ;RWA?o;=FPoTYQ>1a53eGSe2ZT5YckMVQ`cH?ohbeO?n6" + A$ = A$ + "=mYMWEWQ=lSLDcc0O:#^7LX=RLn2CQLf#hVml_FBdf_Q_e^P`]eR=7FW?TcCG[=3#5;XP]oUF2]=hkLiaCa_7LB" + A$ = A$ + "NLT;^hk7jcZfbnX21O;IR[AeMR^N\GkK\31R" + A$ = A$ + "[M5aH7N>_ifCK3N6cl_hH1fXHmYNi7Qe" + A$ = A$ + "oSTGA3SWYlH2ZeOM9?]WKaAAN=WnL:\70DoX?TSW9Y3L_g7NW?C:7`c^O6_c" + A$ = A$ + "WIS=^i6a=cV_I0aL6cLf9`ORZo5?3XIWMgI1oY\^2[oE9o#DUYf7T_QflK8^" + A$ = A$ + "fCEhK2LAX_KS5gA0?S<_8\>" + A$ = A$ + "\H^N6Oo0X]EC_g3lZ7\fhdlYhIhH]c7WO1gaXkIGb6k\T6[W`^O=KiGbMfbbMSn4RGLB68n2" + A$ = A$ + "Sl=#G^iVOnEaL;khcK=[;_l7YfmdgcO:ROD]HAL8oZkJ4m>[5kLA436LO46?" + A$ = A$ + "7XN>0RW_=IW8olROCil<=Kcn38UN0[g;Vgfe^o<76;R5lhIdaP3e1T5e\A><^DcSmZSHbQW1fBYnKdo:>?h" + A$ = A$ + "JkcXPgS3=^7=:OQjmQGcV>dOJ>gh31kK4;fjWiCX^A<[GJY?8R_=Ta;Pi81O" + A$ = A$ + "I[SeQW\Skl>K1mI=^kT<1e5Ra=TkVkTfY3WWbdfhe>>_:^_=\a47fYHoQR]H" + A$ = A$ + "VcWII[N1LMYaQT3W8WHSibXgj=][o0]MjN[=Ugm`EM6>ak750J?LnoYlE2kY" + A$ = A$ + "]>7M7L5j?=l7eiHZ^mBYb^CJNV6aY_#k#KLhTa7R3UO]" + A$ = A$ + "fcc\Di9jo]]OV>hIlbi`>iIlRcNKW?c4`cd8WE;GoEol^ThgUkNbOLWGc#6T" + A$ = A$ + "lQRi_#f;iWLVcbh9JTG8Unn00n>4oe5OoIdiHBbn5iAST?ibMgBG^X?:3GHb" + A$ = A$ + "^?;?SgmngH?7?oP\i>kQgKV8?]Gm5Gg^m>jSkHJXn0g8\kkjm1#3ocYmJ1k<" + A$ = A$ + "lcBmi:;=jRX=N?ca79FBfeKHc=[hM[]BUMWdl<8WJ7RMhi?ogO9KidiKVHC9_W" + A$ = A$ + "O;E^GZ_fNJ;nfJN6TOffeEQ_3aU9`Y\b#dONi;X]L7UkW1j0kmd4n3AM>eD;" + A$ = A$ + ";W5BT3<9gk:?P?UL?HKh[]5PW7nF>d?L?OoVYhY\a7Y;Xf?BFNVZkASQKDOO" + A$ = A$ + "HPlYA^#UiiLmKeR\ANWef[c0_jNl\Oh^ZLX9V_;TF7e\Anf2RMP" + A$ = A$ + "Gli4mAl>dXc7g#o?V[XQiMUFo0YHY6GOT=VRNmWdkQNWcO<4oW27CS_cBmGf" + A$ = A$ + "iU_I7WlLVoB\kBaeAfkRTSWmjm2PTCaUbC0M2hHBlJA" + A$ = A$ + "OmmUWAZSan6=g9a>TOJn]f6WNj5E\`Zbm0_W;Jg]n=ZOgIRgUCSS_DGcEEg5" + A$ = A$ + "PnN__1g6fgLGg]1\;M8lgIOo1QjJ]e" + A$ = A$ + "nDS6W[#ei7EbRPOWb\aDgao`nP2acZUbHV;J]5:J=DB^S2OomEfeei_ML`c<" + A$ = A$ + "4k#DW5E^D>U4g?M1bmLgO6X_aJ`7R]h9=?C>O0iTYMU_IH\kEObkg:\^j1Xo" + A$ = A$ + "2fbSOo:DBnZMDTGcYgWCHmN#FYOg`dikE^5Ri?RWNeOoIJi_o;9olPK[j" + A$ = A$ + "mnNg=dEX>2aQo^Sgg[hmV;CM4UKYhcamCSlLb4;D2KXdk1n75MQKnM7nMhk" + A$ = A$ + "`L\diLDaGXkSN_CY\]EB>6cOAd^aLXfnnCB6K1mV7?Sl>Fc;V;bn5#N1DEoi" + A$ = A$ + "^C^1mUn^GFM_Zbo6h?X;iNK_?06Z]HKoMWX5NVRc[I_cf5jA\o;_nI\_RHH7]E" + A$ = A$ + "^dfR<=gk30lMPS]ZnBnBecC#l`6RnC^W3MUoeBNZUTY3=_VUl?BPm>ZeKTZS" + A$ = A$ + "Y`MfKlMbi9gC7SBhO6ncVIV]ahFWkiaoFTZO7IW3h" + A$ = A$ + "IRDVTLE;CP?fImJ70\VeSb9[W\gfQFkgVS_;9bcZL4];in" + A$ = A$ + "honAfXOZO?gfKKA4c6`eT[>ebKkbEml;Xk;8?eB]eabOoIJcgKGnUCjJ<^P\4SA8G4dhLO\" + A$ = A$ + "nPCS;YLal8:QF[3EK7cMGec[;[\g]6]M7S7Y?9ko[Q?YBO>]_[dhX=ITn>JX" + A$ = A$ + "7GFiRgiY98GkdX]:\?Z7KNj`Lj1KkY[KA_d87\]bb\mcJn`7PlDZcJf" + A$ = A$ + "GVjC;gbJ3HNN9F#i\m]mc\nOJA7i=oeZkkJnm#dOFO:BKE<7c91?SILXiL4D" + A$ = A$ + "9OjIijKM8f^fbE4oB;mY\eAY?g#TA58Gb:CjX\3AOdJIj#?Hi0]kYf>Vc:;K" + A$ = A$ + "Yn;Ao<8KR^6C3EfUCNdV\X=iHGUkHL^J^n#fW;gHHBTWU "%" THEN C$ = C$ + F$ - NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$) - IF MID$(B$, j, 1) = "#" THEN - MID$(B$, j) = "@": END IF: NEXT - FOR t% = LEN(B$) TO 1 STEP -1 - B& = B& * 64 + ASC(MID$(B$, t%)) - 48 - NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1 - X$ = X$ + CHR$(B& AND 255): B& = B& \ 256 - NEXT: btemp$ = btemp$ + X$: NEXT - btemp$ = _INFLATE$(btemp$) - _MEMPUT m, m.OFFSET, btemp$: _MEMFREE m - __imageMEM& = _COPYIMAGE(v&): _FREEIMAGE v& - END SELECT -END FUNCTION + For i& = 1 To Len(A$) Step 4: B$ = Mid$(A$, i&, 4) + If InStr(1, B$, "%") Then + For C% = 1 To Len(B$): F$ = Mid$(B$, C%, 1) + If F$ <> "%" Then C$ = C$ + F$ + Next: B$ = C$: End If: For j = 1 To Len(B$) + If Mid$(B$, j, 1) = "#" Then + Mid$(B$, j) = "@": End If: Next + For t% = Len(B$) To 1 Step -1 + B& = B& * 64 + Asc(Mid$(B$, t%)) - 48 + Next: X$ = "": For t% = 1 To Len(B$) - 1 + X$ = X$ + Chr$(B& And 255): B& = B& \ 256 + Next: btemp$ = btemp$ + X$: Next + btemp$ = _Inflate$(btemp$) + _MemPut m, m.OFFSET, btemp$: _MemFree m + __imageMEM& = _CopyImage(v&): _FreeImage v& + End Select +End Function SUB LoadImageMEM (This AS __UI_ControlTYPE, FileMEM$) - DIM PrevDest AS LONG, ErrorMessage$ - STATIC NotFoundImage AS LONG + Dim PrevDest As Long, ErrorMessage$ + Static NotFoundImage As Long - IF This.HelperCanvas <> 0 THEN _FREEIMAGE This.HelperCanvas + If This.HelperCanvas <> 0 Then _FreeImage This.HelperCanvas - IF FileMEM$ <> "" THEN + If FileMEM$ <> "" Then This.HelperCanvas = __imageMEM&(FileMEM$) - IF This.HelperCanvas >= -1 THEN + If This.HelperCanvas >= -1 Then 'Maybe it's an .ICO file This.HelperCanvas = IconPreview(FileMEM$) IF This.HelperCanvas >= -1 THEN ErrorMessage$ = "Unable to load file:" @@ -1091,3 +1088,4 @@ SUB LoadImageMEM (This AS __UI_ControlTYPE, FileMEM$) END IF This.Redraw = True END SUB + diff --git a/source/loopy_srt_monitor.bas b/source/loopy_srt_monitor.bas index 903436a..2b1fd70 100644 --- a/source/loopy_srt_monitor.bas +++ b/source/loopy_srt_monitor.bas @@ -1,6 +1,6 @@ ': This program uses -': InForm - GUI library for QB64 - v1.3 -': Fellippe Heitor, 2016-2021 - fellippe@qb64.org - @fellippeheitor +': InForm - GUI library for QB64 - v1.5 +': Fellippe Heitor, 2016-2023 - fellippe@qb64.org - @fellippeheitor ': https://github.com/FellippeHeitor/InForm '----------------------------------------------------------- @@ -180,7 +180,7 @@ Common Shared CMD_EXE_FAST As String Common Shared tFileFound As Double Common Shared SettingsMissing As _Byte Common Shared tmpFileRestore As _Byte -Common Shared t1 As Single +Common Shared t1 As Double Common Shared LBR_Delay As Integer Common Shared LBR_Delay_Minus As Integer Common Shared LBR_Delay_Plus As Integer @@ -196,6 +196,7 @@ Common Shared Server_1 As String Common Shared Server_2 As String Common Shared Server_Ping_Display_1 As String Common Shared Server_Ping_Display_2 As String +Common Shared EOL As String ' HTTP OpenClient Common Shared HTTP_Header As String @@ -277,8 +278,8 @@ Common Shared sls_stats.xml As String Common Shared sls_stats_2.xml As String ' SLS 2nd IP Common Shared SLS_streams_seek As Integer Common Shared SLS_streams_found As Integer -Common Shared SLS_Uptime1 As Integer -Common Shared SLS_Uptime2 As Integer +Common Shared SLS_Uptime1 As Long +Common Shared SLS_Uptime2 As Long Common Shared SLS_Active As _Byte Common Shared SLS_2_Active As _Byte ' SLS 2nd IP Common Shared Stream_Title_1 As String ' SLS 2nd IP @@ -300,6 +301,53 @@ Common Shared KeepAlive_SLS_Default As Integer Common Shared SLS_Server_KeepAlive1 As Integer Common Shared SLS_Server_KeepAlive2 As Integer +' Restreamer (v1.1.1) +Common Shared RESTREAMER_1_Enabled As String ' RESTREAMER1Enabled=true +Common Shared RESTREAMER_2_Enabled As String ' RESTREAMER2Enabled=true +Common Shared RESTREAMER_Server_IP As String ' ServerIP=127.0.0.1 +Common Shared RESTREAMER_Server_Port As String ' ServerPort=8080 +Common Shared RESTREAMER_Port_Client As String +Common Shared RESTREAMER_EOL As String +Common Shared RESTREAMER_Header As String +Common Shared RESTREAMER_Stats As String ' ServerStats=srt,rtmp +Common Shared RESTREAMER_Data As String +Common Shared RESTREAMER_Username As String +Common Shared RESTREAMER_Password As String +Common Shared RESTREAMER_ID_1 As String +Common Shared RESTREAMER_ID_2 As String +Common Shared RESTREAMER_Timer_GET As Single +Common Shared RESTREAMER_GET_a As String +Common Shared RESTREAMER_GET_a2 As String +Common Shared RESTREAMER_GET_i As Single +Common Shared RESTREAMER_GET_i2 As Single +Common Shared RESTREAMER_GET_i3 As Single +Common Shared RESTREAMER_GET_l As Single +Common Shared RESTREAMER_GET_d As String +Common Shared RESTREAMER_Bitrate1 As Single +Common Shared RESTREAMER_Bitrate2 As Single +Common Shared restreamer_client As Single +Common Shared restreamer_stats.xml As String +Common Shared RESTREAMER_streams_seek As Integer +Common Shared RESTREAMER_streams_found As Integer +Common Shared RESTREAMER_Uptime1 As Long +Common Shared RESTREAMER_Uptime2 As Long +Common Shared RESTREAMER_Active As _Byte +Common Shared restreamer_token.xml As String + +Common Shared restreamer_connect_timer As Integer +Common Shared RESTREAMER_Server_KeepAlive As Integer +Common Shared KeepAlive_RESTREAMER_Default As Integer +Common Shared RESTREAMER_Ping1 As Double +Common Shared RESTREAMER_Ping2 As Double +Common Shared RESTREAMER_PingOut As Double +Common Shared RESTREAMER_BitrateLow1 As Single ' BitrateLow1=800 +Common Shared RESTREAMER_BitrateLow2 As Single ' BitrateLow2=800 +Common Shared RESTREAMER_BitrateFail1 As Single ' BitratFail1=400 +Common Shared RESTREAMER_BitrateFail2 As Single ' BitrateFail2=400 +Common Shared __RESTREAMER_1_Enabled As _Byte +Common Shared __RESTREAMER_2_Enabled As _Byte +Common Shared OpenClient_Interval_RESTREAMER As Integer + ' NGINX RTMP Server Dim Shared i_XML Dim Shared XML As String @@ -415,6 +463,7 @@ Common Shared shell_cmd_2 As String Common Shared ConnectionsLog_Check As String Common Shared PingLogTimer As Double Common Shared segment_LBR As _Byte +Common Shared Scene_Disabled As String Common Shared config_dir As String Common Shared nodejs_dir As String @@ -586,8 +635,8 @@ $If WIN Then Dim Shared y& ' Windows only $End If -$If VERSION < 3.5.0 Then - $ERROR Requires at least QB64 v3.5.0 +$If VERSION < 3.8.0 Then + $ERROR Requires QB64 v3.8.0 or newer $End If ' Set variables on load: --------------------------------------------------------------- @@ -617,14 +666,15 @@ Else End If ' Default program settings -'Const FALSE = 0 ' Located in file "InForm\InForm.bi", line 328 -'Const TRUE = Not FALSE ' Located in file "InForm\InForm.bi", line 328 +'Const False = 0, True = Not False ' Located in file "InForm\InForm.bi", line 328 q = _Exit c10 = Chr$(10) c34 = Chr$(34) DIR_documents = _CWD$ +EOL = Chr$(13) + Chr$(10) SLS_EOL = Chr$(13) + Chr$(10) RTMP_EOL = Chr$(13) + Chr$(10) +RESTREAMER_EOL = Chr$(13) + Chr$(10) BG = _RGB(32, 32, 32) Exe_OK = 1 websocketVersion = 5 @@ -646,16 +696,17 @@ OpenClient_Interval_2 = 5 KeepAlive_BELABOX_Default = 30 KeepAlive_SLS_Default = 5 KeepAlive_RTMP_Server_Default = 30 +KeepAlive_RESTREAMER_Default = 5 Stream_Fail_Delay = 8 ' --------------------------------------------------------------- ' Error handling when enabled takes place here App_Fail: -If Err Then Cls: _PrintString (30, 32), "ERR, _ERRORLINE:" + Str$(Err) + "," + Str$(_ErrorLine): _AutoDisplay: _Delay 5: If App_Refresh = 1 Then App_Refresh = 0: Refresh_Request = 1: Resume Next Else Resume Next +If Err Then Cls: _UPrintString (30, 32), "ERR, _ERRORLINE:" + Str$(Err) + "," + Str$(_ErrorLine): _AutoDisplay: _Delay 5: If App_Refresh = -1 Then App_Refresh = 0: Refresh_Request = -1: Resume Next Else Resume Next ' Added after InForm entry - END ': External modules: --------------------------------------------------------------- -'$INCLUDE:'InForm\InForm.bi' +'$INCLUDE:'InForm\InForm.loopy_srt.bi' '$INCLUDE:'InForm\xp.uitheme' '$INCLUDE:'loopy_srt_monitor.frm' @@ -667,17 +718,17 @@ Sub __UI_BeforeInit $VersionInfo:ProductName=Loopy SRT Monitor $VersionInfo:Comments=Monitor SRT Streams $VersionInfo:FileDescription=Loopy SRT Monitor - $VersionInfo:FILEVERSION#=1,1,0,0 - $VersionInfo:ProductVersion=1,1,0,0 + $VersionInfo:FILEVERSION#=1,1,1,0 + $VersionInfo:ProductVersion=1,1,1,0 $VersionInfo:LegalCopyright=loopy750 $VersionInfo:OriginalFilename=loopy_srt_monitor.exe $Checking:On '$EXEICON moved but still parsed on launch _Title "Loopy SRT Monitor - loopy750" - Ver = "1.1.0" + Ver = "1.1.1" VerBeta = "" - VerDate = "01/23" + VerDate = "07/23" VerPortable = "false" End Sub @@ -794,7 +845,7 @@ Sub __UI_OnLoad If _FileExists(filePrevious_ms) Then Kill filePrevious_ms _AllowFullScreen Off Randomize Timer - ErrorTestRunOnce = TRUE + ErrorTestRunOnce = True ' Set font for error screen On Error GoTo App_Fail @@ -817,10 +868,10 @@ Sub __UI_OnLoad End If End If - If Not _FileExists(config_main) Then RefreshDisplayRequest = TRUE: Error_msg = "- Unable to read config file in the " + c34 + "Documents\Loopy SRT Monitor" + c34 + " folder" + Chr$(10) + "- File " + c34 + config_main + c34 + " cannot be accessed, check if it exists. (Error: #1)": _Delay 3 + If Not _FileExists(config_main) Then RefreshDisplayRequest = True: Error_msg = "- Unable to read config file in the " + c34 + "Documents\Loopy SRT Monitor" + c34 + " folder" + Chr$(10) + "- File " + c34 + config_main + c34 + " cannot be accessed, check if it exists. (Error: #1)": _Delay 3 If _FileExists(config_main) Then Open config_main For Input As #4 ' Basic INI management, nothing fancy needed - If EOF(4) Then RefreshDisplayRequest = TRUE: Error_msg = "- Unable to read config file in the " + c34 + "Documents\Loopy SRT Monitor" + c34 + " folder" + Chr$(10) + "- File " + c34 + config_main + c34 + " cannot be accessed, check if it exists. (Error: #10)": _Delay 3 + If EOF(4) Then RefreshDisplayRequest = True: Error_msg = "- Unable to read config file in the " + c34 + "Documents\Loopy SRT Monitor" + c34 + " folder" + Chr$(10) + "- File " + c34 + config_main + c34 + " cannot be accessed, check if it exists. (Error: #10)": _Delay 3 Do If Not EOF(4) Then Line Input #4, file4 If Left$(file4, 1) <> "#" And Left$(file4, 1) <> ";" And Left$(file4, 1) <> "" Then @@ -902,6 +953,20 @@ Sub __UI_OnLoad If file4_var$ = "slsbitratelow2" Then SLS_BitrateLow2 = Val(file4_val$) If file4_var$ = "slsbitratefail1" Then SLS_BitrateFail1 = Val(file4_val$) If file4_var$ = "slsbitratefail2" Then SLS_BitrateFail2 = Val(file4_val$) + If file4_var$ = "restreamer1enabled" Then RESTREAMER_1_Enabled = file4_val$ ' Restreamer server settings + If file4_var$ = "restreamer2enabled" Then RESTREAMER_2_Enabled = file4_val$ + If file4_var$ = "restreamerusername" Then RESTREAMER_Username = file4_val$ + If file4_var$ = "restreamerpassword" Then RESTREAMER_Password = file4_val$ + If file4_var$ = "restreamerserverip" Then RESTREAMER_Server_IP = file4_val$ + If file4_var$ = "restreamerserverport" Then RESTREAMER_Server_Port = file4_val$ + If file4_var$ = "restreamerstats" Then RESTREAMER_Stats = file4_val$ + If file4_var$ = "restreamerserverkeepalive" Then RESTREAMER_Server_KeepAlive = Val(file4_val$) + If file4_var$ = "restreamerid1" Then RESTREAMER_ID_1 = file4_val$ + If file4_var$ = "restreamerid2" Then RESTREAMER_ID_2 = file4_val$ + If file4_var$ = "restreamerbitratelow1" Then RESTREAMER_BitrateLow1 = Val(file4_val$) + If file4_var$ = "restreamerbitratelow2" Then RESTREAMER_BitrateLow2 = Val(file4_val$) + If file4_var$ = "restreamerbitratefail1" Then RESTREAMER_BitrateFail1 = Val(file4_val$) + If file4_var$ = "restreamerbitratefail2" Then RESTREAMER_BitrateFail2 = Val(file4_val$) If file4_var$ = "mediasourcetime" Then MediaSourceTime = file4_val$ ' UNDOCUMENTED settings If file4_var$ = "cooldowntotal" Then CooldownTotal = file4_val$ If file4_var$ = "forcedebugonstartup" Then ForceDebugOnStartup = file4_val$ @@ -912,6 +977,7 @@ Sub __UI_OnLoad If file4_var$ = "pinglog" Then PingLog = file4_val$ If file4_var$ = "faststart" Then FastStart = file4_val$ If file4_var$ = "httpautoopen" Then HTTP_Auto_Open = file4_val$ ' For coding only + If file4_var$ = "scenedisabled" Then Scene_Disabled = file4_val$ If file4_var$ = "dummyserver" Then Dummy_Server = file4_val$ ' For coding only End If End If @@ -919,7 +985,7 @@ Sub __UI_OnLoad Close #4 '--------------------------------------------------------------- - 'v1.1.0 + 'v1.1.1 '------ 'SLSServerIP2=127.0.0.1 'SLSServerPort2=8181 @@ -946,6 +1012,7 @@ Sub __UI_OnLoad 'PingLog=false 'FastStart=false 'HTTPAutoOpen=true + 'SceneDisabled=false 'DummyServer= '--------------------------------------------------------------- 'Depreciated `config` @@ -962,26 +1029,31 @@ Sub __UI_OnLoad ' Set config variables ------------------------------------------------------------------------------------------------------------------------------ ' Set "WebSocketConnection" and "HTTPCommunication" - If OBS_Connection = "" Then HTTP_Enabled = FALSE Else HTTP_Enabled = TRUE ' Assume older version if WebSocketConnection does not exist and use obs-websocket-js by default for backwards compatibility - If OBS_Connection = "http" Or OBS_Connection = "obs-websocket-http" Then HTTP_Enabled = TRUE - If OBS_Connection = "js" Or OBS_Connection = "obs-websocket-js" Then HTTP_Enabled = FALSE + If OBS_Connection = "" Then HTTP_Enabled = False Else HTTP_Enabled = True ' Assume older version if WebSocketConnection does not exist and use obs-websocket-js by default for backwards compatibility + If OBS_Connection = "http" Or OBS_Connection = "obs-websocket-http" Then HTTP_Enabled = True + If OBS_Connection = "js" Or OBS_Connection = "obs-websocket-js" Then HTTP_Enabled = False If HTTP_Communication = "" And HTTP_Enabled Then HTTP_Communication = "native" ' New HTTP default is "native" If Not HTTP_Enabled Then HTTP_Communication = "curl" ' curl must be used for obs-websocket-js If HTTP_Communication <> "native" Then HTTP_Communication = "curl" - If HTTP_Communication = "native" Then HTTP_Communication_Native = TRUE Else HTTP_Communication_Native = FALSE - If HTTP_Enabled Then SetCaption ServerPingLB, "HTTP ping" Else HTTP_Enabled = FALSE ' HTTP + If HTTP_Communication = "native" Then HTTP_Communication_Native = True Else HTTP_Communication_Native = False + If HTTP_Enabled Then SetCaption ServerPingLB, "HTTP ping" Else HTTP_Enabled = False ' HTTP ' Automatically open obs-websocket-http if it's located in the same folder If HTTP_Enabled And HTTP_Auto_Open <> "false" Then If _FileExists(config_dir + "\obs-websocket-http-v1-Windows.exe") Then HTTP_File = config_dir + "\obs-websocket-http-v1-Windows.exe": HTTP_Filename = "obs-websocket-http-v1-Windows.exe" If _FileExists(config_dir + "\obs-websocket-http-v2-Windows.exe") Then HTTP_File = config_dir + "\obs-websocket-http-v2-Windows.exe": HTTP_Filename = "obs-websocket-http-v2-Windows.exe" + If _FileExists(config_dir + "\obs-websocket-http-v3-Windows.exe") Then HTTP_File = config_dir + "\obs-websocket-http-v3-Windows.exe": HTTP_Filename = "obs-websocket-http-v3-Windows.exe" + If _FileExists(config_dir + "\obs-websocket-http-v4-Windows.exe") Then HTTP_File = config_dir + "\obs-websocket-http-v4-Windows.exe": HTTP_Filename = "obs-websocket-http-v4-Windows.exe" + If _FileExists(config_dir + "\obs-websocket-http-v5-Windows.exe") Then HTTP_File = config_dir + "\obs-websocket-http-v5-Windows.exe": HTTP_Filename = "obs-websocket-http-v5-Windows.exe" If _FileExists(config_dir + "\obs-websocket-http-Windows.exe") Then HTTP_File = config_dir + "\obs-websocket-http-Windows.exe": HTTP_Filename = "obs-websocket-http-Windows.exe" If _FileExists(config_dir + "\obs-websocket-http.exe") Then HTTP_File = config_dir + "\obs-websocket-http.exe": HTTP_Filename = "obs-websocket-http.exe" ' Automatically open obs-websocket-http If OS = "WINDOWS" And _FileExists(HTTP_File) Then + If _DirExists(config_dir) And VerPortable = "false" Then ChDir config_dir ' obs-websocket-http cannot read program's "config.ini" unless started from its directory Shell "%ComSpec% /C START " + c34 + c34 + " /MIN " + "taskkill /IM " + c34 + HTTP_Filename + c34 + " /F" - If FastStart <> "true" Then _Delay 1 - Shell _DontWait "%ComSpec% /C START " + c34 + c34 + " /MIN " + c34 + HTTP_File + c34 + " --ws_url ws://" + OBS_URL + " --ws_password " + OBS_PW + If FastStart <> "true" Then _Delay 1 Else _Delay .5 + Shell _DontWait "%ComSpec% /C START " + c34 + c34 + " /MIN " + c34 + HTTP_File + 'If HTTP_Auth_Key = "" Then Shell _DontWait "%ComSpec% /C START " + c34 + c34 + " /MIN " + c34 + HTTP_File + c34 + " --ws_url ws://" + OBS_URL + " --ws_password " + OBS_PW Else Shell _DontWait "%ComSpec% /C START " + c34 + c34 + " /MIN " + c34 + HTTP_File + c34 + " --ws_url ws://" + OBS_URL + " --ws_password " + OBS_PW + " --http_auth_key " + HTTP_Auth_Key End If End If @@ -1016,44 +1088,44 @@ Sub __UI_OnLoad ' Check for missing variables Select Case "" - Case Scene_OK: SettingsMissing = TRUE - Case Scene_Fail: SettingsMissing = TRUE - Case Scene_Intro: SettingsMissing = TRUE - Case Scene_Bypass: SettingsMissing = TRUE - Case OBS_URL: SettingsMissing = TRUE - Case OBS_PW: SettingsMissing = TRUE - Case FileStatusOutput: SettingsMissing = TRUE - Case ConnectionsLog_Check: SettingsMissing = TRUE - Case Scene_LBR_Enabled: SettingsMissing = TRUE - Case Scene_LBR_Delay_Total: SettingsMissing = TRUE - Case Scene2_LBR_Disabled: SettingsMissing = TRUE - Case RIST_Fail_Mode_1: SettingsMissing = TRUE ' RIST mode - Case RIST_Fail_Mode_2: SettingsMissing = TRUE ' RIST mode - Source 2 - Case LoopySRTMonitorTheme: SettingsMissing = TRUE - Case Allow_Resize: SettingsMissing = TRUE - Case CheckUpdateOnStartup: SettingsMissing = TRUE - Case MultiCameraSwitch: SettingsMissing = TRUE - Case titleScene1: SettingsMissing = TRUE - Case titleScene2: SettingsMissing = TRUE - Case titleScene12: SettingsMissing = TRUE - Case returnPreviousScene: SettingsMissing = TRUE - Case returnPreviousSceneRemember: SettingsMissing = TRUE - Case SLS_1_Enabled: SettingsMissing = TRUE ' SRT Live Server - Case SLS_2_Enabled: SettingsMissing = TRUE - Case SLS_Server_IP: SettingsMissing = TRUE - Case SLS_Server_Port: SettingsMissing = TRUE - Case SLS_Stats: SettingsMissing = TRUE - Case SLS_Publisher1: SettingsMissing = TRUE - Case SLS_Publisher2: SettingsMissing = TRUE - Case Str$(SLS_BitrateLow1): SettingsMissing = TRUE - Case Str$(SLS_BitrateLow2): SettingsMissing = TRUE - Case Str$(SLS_BitrateFail1): SettingsMissing = TRUE - Case Str$(SLS_BitrateFail2): SettingsMissing = TRUE + Case Scene_OK: SettingsMissing = True + Case Scene_Fail: SettingsMissing = True + Case Scene_Intro: SettingsMissing = True + Case Scene_Bypass: SettingsMissing = True + Case OBS_URL: SettingsMissing = True + Case OBS_PW: SettingsMissing = True + Case FileStatusOutput: SettingsMissing = True + Case ConnectionsLog_Check: SettingsMissing = True + Case Scene_LBR_Enabled: SettingsMissing = True + Case Scene_LBR_Delay_Total: SettingsMissing = True + Case Scene2_LBR_Disabled: SettingsMissing = True + Case RIST_Fail_Mode_1: SettingsMissing = True ' RIST mode + Case RIST_Fail_Mode_2: SettingsMissing = True ' RIST mode - Source 2 + Case LoopySRTMonitorTheme: SettingsMissing = True + Case Allow_Resize: SettingsMissing = True + Case CheckUpdateOnStartup: SettingsMissing = True + Case MultiCameraSwitch: SettingsMissing = True + Case titleScene1: SettingsMissing = True + Case titleScene2: SettingsMissing = True + Case titleScene12: SettingsMissing = True + Case returnPreviousScene: SettingsMissing = True + Case returnPreviousSceneRemember: SettingsMissing = True + Case SLS_1_Enabled: SettingsMissing = True ' SRT Live Server + Case SLS_2_Enabled: SettingsMissing = True + Case SLS_Server_IP: SettingsMissing = True + Case SLS_Server_Port: SettingsMissing = True + Case SLS_Stats: SettingsMissing = True + Case SLS_Publisher1: SettingsMissing = True + Case SLS_Publisher2: SettingsMissing = True + Case Str$(SLS_BitrateLow1): SettingsMissing = True + Case Str$(SLS_BitrateLow2): SettingsMissing = True + Case Str$(SLS_BitrateFail1): SettingsMissing = True + Case Str$(SLS_BitrateFail2): SettingsMissing = True End Select If SettingsMissing Then verCheck$ = "Settings missing in 'config.ini' file, check 'readme.txt'..." - iniFeatures = TRUE + iniFeatures = True End If If Scene_Bypass = "" Then Scene_Bypass = "none" @@ -1066,10 +1138,10 @@ Sub __UI_OnLoad If Scene_Bypass_8 = "" Then Scene_Bypass_8 = "none" If Scene_Bypass_9 = "" Then Scene_Bypass_9 = "none" - If RIST_Fail_Mode_1 = "true" Then __RIST_Fail_Mode_1 = TRUE Else __RIST_Fail_Mode_1 = FALSE - If RIST_Fail_Mode_2 = "true" Then __RIST_Fail_Mode_2 = TRUE Else __RIST_Fail_Mode_2 = FALSE + If RIST_Fail_Mode_1 = "true" Then __RIST_Fail_Mode_1 = True Else __RIST_Fail_Mode_1 = False + If RIST_Fail_Mode_2 = "true" Then __RIST_Fail_Mode_2 = True Else __RIST_Fail_Mode_2 = False - If Leading_Zero = "true" Then leadingZero = TRUE + If Leading_Zero = "true" Then leadingZero = True If SLS_Kbps_Precision = "true" Then SLS_Kbps_Precision = "nerd" If SLS_Server_KeepAlive1 <> 0 Then @@ -1086,6 +1158,11 @@ Sub __UI_OnLoad If RTMP_Server_KeepAlive > 60 Then RTMP_Server_KeepAlive = 60 End If + If RESTREAMER_Server_KeepAlive <> 0 Then + If SLS_Server_KeepAlive1 < 1 Then SLS_Server_KeepAlive1 = 1 + If SLS_Server_KeepAlive1 > 60 Then SLS_Server_KeepAlive1 = 60 + End If + ' SRT Live Server SLS_Header = "" SLS_Header = SLS_Header + "GET /" + SLS_Stats + " HTTP/1.1" + SLS_EOL @@ -1107,10 +1184,12 @@ Sub __UI_OnLoad ' SLS 2nd IP If MultiCameraSwitch = "true" And SLS_2_Enabled = "true" Then - If SLS_Server_IP <> SLS_Server_IP_2 Then SLS_2_Active = TRUE - If SLS_Server_Port <> SLS_Server_Port_2 Then SLS_2_Active = TRUE + If SLS_Server_IP <> SLS_Server_IP_2 Then SLS_2_Active = True + If SLS_Server_Port <> SLS_Server_Port_2 Then SLS_2_Active = True End If + If MultiCameraSwitch = "true" And SLS_2_Enabled = "true" And SLS_1_Enabled = "false" Then SLS_2_Active = True ' Fix when using SLS #2 only (v1.1.1) + If SLS_2_Active And SLS_1_Enabled = "true" Then Stream_Title_1 = "Server" Else Stream_Title_1 = "Stream" ' SLS 2nd IP If SLS_2_Active And SLS_2_Enabled = "true" Then Stream_Title_2 = "Server" Else Stream_Title_2 = "Stream" ' SLS 2nd IP @@ -1148,10 +1227,10 @@ Sub __UI_OnLoad RTMP_Port_Client = "TCP/IP:" + RTMP_Server_Port + ":" If MultiCameraSwitch = "true" Then - __MultiCameraSwitch = TRUE + __MultiCameraSwitch = True Else MultiCameraSwitch = "false" - __MultiCameraSwitch = FALSE + __MultiCameraSwitch = False End If ' Set true and false @@ -1165,19 +1244,30 @@ Sub __UI_OnLoad If RTMP_2_Enabled = "true" Then SLS_2_Enabled = "false" ' SRT Live Server - If SLS_1_Enabled = "true" And SLS_2_Enabled = "true" Then RTMP_Active = FALSE: RTMP_1_Enabled = "false": RTMP_2_Enabled = "false" + If SLS_1_Enabled = "true" And SLS_2_Enabled = "true" Then RTMP_Active = False: RTMP_1_Enabled = "false": RTMP_2_Enabled = "false": RESTREAMER_1_Enabled = "false": RESTREAMER_2_Enabled = "false" ' NGINX RTMP Server - If RTMP_1_Enabled = "true" And RTMP_2_Enabled = "true" Then SLS_Active = FALSE: SLS_1_Enabled = "false": SLS_2_Enabled = "false" + If RTMP_1_Enabled = "true" And RTMP_2_Enabled = "true" Then SLS_Active = False: SLS_1_Enabled = "false": SLS_2_Enabled = "false" If Not __MultiCameraSwitch Then SLS_2_Enabled = "false": RTMP_2_Enabled = "false" - If SLS_1_Enabled = "true" Or SLS_2_Enabled = "true" Then SLS_Active = TRUE - If RTMP_1_Enabled = "true" Or RTMP_2_Enabled = "true" Then RTMP_Active = TRUE: RTMP_Kbps_Precision = SLS_Kbps_Precision - - ' Set SLS and RTMP variables - If SLS_1_Enabled = "true" Then __SLS_1_Enabled = TRUE Else __SLS_1_Enabled = FALSE - If RTMP_1_Enabled = "true" Then __RTMP_1_Enabled = TRUE Else __RTMP_1_Enabled = FALSE - If RTMP_2_Enabled = "true" Then __RTMP_2_Enabled = TRUE Else __RTMP_2_Enabled = FALSE - If SLS_2_Enabled = "true" Then __SLS_2_Enabled = TRUE Else __SLS_2_Enabled = FALSE + If SLS_1_Enabled = "true" Or SLS_2_Enabled = "true" Then SLS_Active = True + If RTMP_1_Enabled = "true" Or RTMP_2_Enabled = "true" Then RTMP_Active = True: RTMP_Kbps_Precision = SLS_Kbps_Precision + + ' RESTREAMER Server + If RESTREAMER_1_Enabled = "true" And SLS_1_Enabled = "true" Then RESTREAMER_1_Enabled = "false" + If RESTREAMER_2_Enabled = "true" And SLS_2_Enabled = "true" Then RESTREAMER_2_Enabled = "false" + If RESTREAMER_1_Enabled = "true" And RTMP_1_Enabled = "true" Then RESTREAMER_1_Enabled = "false" + If RESTREAMER_2_Enabled = "true" And RTMP_1_Enabled = "true" Then RESTREAMER_2_Enabled = "false" + If RESTREAMER_1_Enabled = "true" Or RESTREAMER_2_Enabled = "true" Then RESTREAMER_Active = True + + RESTREAMER_Port_Client = "TCP/IP:" + RESTREAMER_Server_Port + ":" + + ' Set SLS, RTMP and RESTREAMER variables + If SLS_1_Enabled = "true" Then __SLS_1_Enabled = True Else __SLS_1_Enabled = False + If RTMP_1_Enabled = "true" Then __RTMP_1_Enabled = True Else __RTMP_1_Enabled = False + If RTMP_2_Enabled = "true" Then __RTMP_2_Enabled = True Else __RTMP_2_Enabled = False + If SLS_2_Enabled = "true" Then __SLS_2_Enabled = True Else __SLS_2_Enabled = False + If RESTREAMER_1_Enabled = "true" Then __RESTREAMER_1_Enabled = True Else __RESTREAMER_1_Enabled = False + If RESTREAMER_2_Enabled = "true" Then __RESTREAMER_2_Enabled = True Else __RESTREAMER_2_Enabled = False ' SRT Live Server --------------------------------------------- If SLS_Active Then @@ -1185,43 +1275,47 @@ Sub __UI_OnLoad SetCaption Bitrate_Stream_1LB, "-" SetCaption Bitrate_Stream_2LB, "-" ElseIf RTMP_Active Then - SetCaption IPPingLB, "NGINX Ping" + SetCaption IPPingLB, "NGINX ping" + SetCaption Bitrate_Stream_1LB, "-" + SetCaption Bitrate_Stream_2LB, "-" + ElseIf RESTREAMER_Active Then + SetCaption IPPingLB, "RESTREAMER ping" SetCaption Bitrate_Stream_1LB, "-" SetCaption Bitrate_Stream_2LB, "-" End If If Not __MultiCameraSwitch Then - If SLS_Active Or RTMP_Active Then + If SLS_Active Or RTMP_Active Or RESTREAMER_Active Then SetCaption MultiCameraSwitchLB, "Bitrate" End If End If - ' Adjust SRT data position becuase of no bitrate information + ' Adjust SRT data position because of no bitrate information If __MultiCameraSwitch Then - If __SLS_1_Enabled Or __RTMP_1_Enabled Then - If Not __SLS_2_Enabled And Not __RTMP_2_Enabled Then + If __SLS_1_Enabled Or __RTMP_1_Enabled Or __RESTREAMER_1_Enabled Then + If Not __SLS_2_Enabled And Not __RTMP_2_Enabled And Not __RESTREAMER_2_Enabled Then Control(StreamUptimeLB).Top = 254 Control(Uptime_Stream_1LB).Top = 254 Control(failLB).Top = 278 Control(Timer_Fail_Stream1LB).Top = 278 - Control(BitrateLB2).Hidden = TRUE - Control(Bitrate_Stream_2LB).Hidden = TRUE + Control(BitrateLB2).Hidden = True + Control(Bitrate_Stream_2LB).Hidden = True End If End If - If __SLS_2_Enabled Or __RTMP_2_Enabled Then - If Not __SLS_1_Enabled And Not __RTMP_1_Enabled Then + If __SLS_2_Enabled Or __RTMP_2_Enabled Or __RESTREAMER_2_Enabled Then + If Not __SLS_1_Enabled And Not __RTMP_1_Enabled And Not __RESTREAMER_1_Enabled Then Control(StreamUptimeLB2).Top = 254 Control(Uptime_Stream_2LB).Top = 254 Control(failLB2).Top = 278 Control(Timer_Fail_Stream2LB).Top = 278 - Control(BitrateLB).Hidden = TRUE - Control(Bitrate_Stream_1LB).Hidden = TRUE + Control(BitrateLB).Hidden = True + Control(Bitrate_Stream_1LB).Hidden = True End If End If - If __SLS_1_Enabled And __SLS_2_Enabled Or __RTMP_1_Enabled And __RTMP_2_Enabled Or __SLS_1_Enabled And __RTMP_2_Enabled Or __SLS_2_Enabled And __RTMP_1_Enabled Then + If __SLS_1_Enabled And __SLS_2_Enabled Or __RTMP_1_Enabled And __RTMP_2_Enabled Or __RESTREAMER_1_Enabled And __RESTREAMER_2_Enabled Or SLS_Active And RTMP_Active Or SLS_Active And RESTREAMER_Active Or RTMP_Active And RESTREAMER_Active Then Control(StreamUptimeLB).Top = 254 Control(Uptime_Stream_1LB).Top = 254 Control(failLB).Top = 278 @@ -1232,19 +1326,19 @@ Sub __UI_OnLoad Control(Timer_Fail_Stream2LB).Top = 278 End If - If Not SLS_Active And Not RTMP_Active Then - Control(BitrateLB).Hidden = TRUE - Control(Bitrate_Stream_1LB).Hidden = TRUE - Control(BitrateLB2).Hidden = TRUE - Control(Bitrate_Stream_2LB).Hidden = TRUE + If Not SLS_Active And Not RTMP_Active And Not RESTREAMER_Active Then + Control(BitrateLB).Hidden = True + Control(Bitrate_Stream_1LB).Hidden = True + Control(BitrateLB2).Hidden = True + Control(Bitrate_Stream_2LB).Hidden = True End If Else - Control(BitrateLB).Hidden = TRUE - Control(Bitrate_Stream_1LB).Hidden = TRUE - Control(BitrateLB2).Hidden = TRUE - Control(Bitrate_Stream_2LB).Hidden = TRUE + Control(BitrateLB).Hidden = True + Control(Bitrate_Stream_1LB).Hidden = True + Control(BitrateLB2).Hidden = True + Control(Bitrate_Stream_2LB).Hidden = True End If ' SRT Live Server --------------------------------------------- @@ -1253,7 +1347,7 @@ Sub __UI_OnLoad _Resize Off , _Smooth If Allow_Resize <> "true" Then Allow_Resize = "false" - Control(OptionsMenuRestoreWindowSize).Hidden = TRUE + Control(OptionsMenuRestoreWindowSize).Hidden = True Else ' Resize will be enabled regardless $Resize:Smooth @@ -1261,7 +1355,7 @@ Sub __UI_OnLoad ' Set variables for low bitrate detection CooldownStartup = 10 - If ConnectionsLog_Check = "true" Then ConnectionsLog = TRUE Else ConnectionsLog = FALSE + If ConnectionsLog_Check = "true" Then ConnectionsLog = True Else ConnectionsLog = False If PingLog <> "true" Then PingLog = "false": If Not ConnectionsLog Then PingLog = "false" CooldownLogTotal = 8 MediaSourceTimeLB = 800 @@ -1377,15 +1471,15 @@ Sub __UI_OnLoad End If End If - If returnPreviousScene = "true" Then __returnPreviousScene = TRUE Else __returnPreviousScene = FALSE - If FileStatusOutput = "true" Then __FileStatusOutput = TRUE Else __FileStatusOutput = FALSE - If returnPreviousSceneRemember = "true" Then __returnPreviousSceneRemember = TRUE Else __returnPreviousSceneRemember = FALSE - If Not __MultiCameraSwitch Then __returnPreviousScene = FALSE: __returnPreviousSceneRemember = FALSE ' multi-camera-switch options disabled if not required + If returnPreviousScene = "true" Then __returnPreviousScene = True Else __returnPreviousScene = False + If FileStatusOutput = "true" Then __FileStatusOutput = True Else __FileStatusOutput = False + If returnPreviousSceneRemember = "true" Then __returnPreviousSceneRemember = True Else __returnPreviousSceneRemember = False + If Not __MultiCameraSwitch Then __returnPreviousScene = False: __returnPreviousSceneRemember = False ' multi-camera-switch options disabled if not required ' LBR enabled if required - If Scene_LBR_Enabled = "true" Then SceneLBActive = TRUE + If Scene_LBR_Enabled = "true" Then SceneLBActive = True ' Disable Scene #2 LBR if Scene2LBRDisabled is true - If Scene2_LBR_Disabled = "true" Then Scene2LBInactive = TRUE + If Scene2_LBR_Disabled = "true" Then Scene2LBInactive = True If Not SceneLBActive Then If Stream_Fail_Delay < 3 Then @@ -1408,14 +1502,14 @@ Sub __UI_OnLoad _PutImage (25, 46)-(82, 158), BSOD& _FreeImage BSOD& Color _RGB(254, 254, 254), _RGB(1, 100, 200) - _PrintString (20, 12 * 18), "Program encountered an error and needs to restart." + _UPrintString (20, 12 * 18), "Program encountered an error and needs to restart." If InStr(Error_msg, Chr$(10)) >= 1 Then - _PrintString (20, 14 * 18), Left$(Error_msg, InStr(Error_msg, Chr$(10)) - 1) - _PrintString (20, 15 * 18), Mid$(Error_msg, InStr(Error_msg, Chr$(10)) + 1) + _UPrintString (20, 14 * 18), Left$(Error_msg, InStr(Error_msg, Chr$(10)) - 1) + _UPrintString (20, 15 * 18), Mid$(Error_msg, InStr(Error_msg, Chr$(10)) + 1) Else - _PrintString (20, 14 * 18), Error_msg + _UPrintString (20, 14 * 18), Error_msg End If - _PrintString (20, 20 * 18), "Program will exit shortly or press any key to exit now..." + _UPrintString (20, 20 * 18), "Program will exit shortly or press any key to exit now..." _Display _Delay 1 If InKey$ <> "" Then System @@ -2080,7 +2174,7 @@ Sub __UI_OnLoad If _FileExists(fileCheckVersion) Then Open fileCheckVersion For Input As #224 Do Until EOF(224) - If LOF(224) = 0 Then NoKill = TRUE: Exit Do ' Overkill with EOF checking, but just being safe + If LOF(224) = 0 Then NoKill = True: Exit Do ' Overkill with EOF checking, but just being safe If EOF(224) Then Exit Do Line Input #224, file224$ Loop @@ -2088,11 +2182,11 @@ Sub __UI_OnLoad Close #224 If _FileExists(fileCheckVersion) Then Kill fileCheckVersion updateResult$ = file224$ - If file224$ <> Ver Then verCheck$ = "New version is available (v" + _Trim$(Left$(updateResult$, 10)) + ")": _NotifyPopup "Loopy SRT Monitor", "New version is available (v" + _Trim$(Left$(updateResult$, 10)) + ")", "info" + If file224$ <> Ver And file224$ <> "" And file224$ <> "404: Not Found" Then verCheck$ = "New version is available (v" + _Trim$(Left$(updateResult$, 10)) + ")": _NotifyPopup "Loopy SRT Monitor", "New version is available (v" + _Trim$(Left$(updateResult$, 10)) + ")", "info" If file224$ = "" Or file224$ = "404: Not Found" Then verCheck$ = "Unable to check for new version..." - If file224$ = Ver Then verCheck$ = "This is the latest version (v" + _Trim$(Left$(Ver, 10)) + ")..." + If file224$ = Ver Then verCheck$ = "This is the latest version (v" + _Trim$(Left$(Ver, 10)) + ")" End If - iniFeatures = FALSE + iniFeatures = False ' Test #4 If ErrorTestRunOnce Then @@ -2152,9 +2246,9 @@ Sub __UI_OnLoad If _FileExists(filePrevious_ms) Then Kill filePrevious_ms On Error GoTo 0 ' Check for 4.x else error - websocketOK = FALSE + websocketOK = False Else - websocketOK = TRUE + websocketOK = True End If If websocketOK Then Line Input #90, file90 @@ -2162,9 +2256,9 @@ Sub __UI_OnLoad Close #90 If _FileExists(filePrevious_ms) Then Kill filePrevious_ms ' Check for 4.x else error - websocketOK = FALSE + websocketOK = False Else - websocketOK = TRUE + websocketOK = True If EOF(90) Or LOF(90) = 0 Then Close #90 Else @@ -2193,22 +2287,22 @@ Sub __UI_OnLoad On Error GoTo App_Fail If _FileExists(filePrevious_ms) Then Kill filePrevious_ms On Error GoTo 0 - websocketOK = FALSE + websocketOK = False Error_msg = "- OBS " + c34 + "WebSocket Server" + c34 + " connection failed. Correctly configure " + c34 + "WebsocketAddress, WebsocketPassword" + c34 + " in " + c34 + "config.ini" + c34 + " and retry." + Chr$(10) + "- If configuration is correct, check OBS Studio is open, " + c34 + "WebSocket Server" + c34 + " is enabled in OBS Studio, and " + c34 + "Node.js" + c34 + " is installed.": Error_msg_3 = "- Check " + c34 + "WebSocketConnection" + c34 + " in " + c34 + "config.ini" + c34 + " is set to the required connection method." ErrorDisplay (6) Else - websocketOK = TRUE + websocketOK = True End If Line Input #90, file90 If file90 <> "OK" Then Close #90 If _FileExists(filePrevious_ms) Then Kill filePrevious_ms - websocketOK = FALSE + websocketOK = False Error_msg = "- OBS " + c34 + "WebSocket Server" + c34 + " connection failed. Correctly configure " + c34 + "WebsocketAddress, WebsocketPassword" + c34 + " in " + c34 + "config.ini" + c34 + " and retry." + Chr$(10) + "- If configuration is correct, check OBS Studio is open, " + c34 + "WebSocket Server" + c34 + " is enabled in OBS Studio, and " + c34 + "Node.js" + c34 + " is installed.": Error_msg_3 = "- Check " + c34 + "WebSocketConnection" + c34 + " in " + c34 + "config.ini" + c34 + " is set to the required connection method." ErrorDisplay (6) Else - websocketOK = TRUE + websocketOK = True If EOF(90) Or LOF(90) = 0 Then Close #90 Else @@ -2257,7 +2351,7 @@ Sub __UI_OnLoad Get #128, , JSON Close #128 If GetKey("mediaCursor", JSON) = "" Then - Error_msg = "- Unable to read " + c34 + "MediaSource1" + c34 + ". Correctly configure " + c34 + "MediaSource1" + c34 + " in " + c34 + "config.ini and retry." + Chr$(10) + "- If configuration is correct, check " + c34 + "Restart Playback" + c34 + " is disabled and WebSocket version is 4.9.0 or newer." + Error_msg = "- Unable to read " + c34 + "MediaSource1" + c34 + ". Correctly configure " + c34 + "MediaSource1" + c34 + " in " + c34 + "config.ini and retry." + Chr$(10) + "- If configuration is correct, check " + c34 + "Restart Playback" + c34 + " is disabled." ErrorDisplay (7) End If Else @@ -2291,7 +2385,7 @@ Sub __UI_OnLoad Get #128, , JSON Close #128 If GetKey("mediaCursor", JSON) = "" Then - Error_msg = "- Unable to read " + c34 + "MediaSource1" + c34 + ". Correctly configure " + c34 + "MediaSource1" + c34 + " in " + c34 + "config.ini and retry." + Chr$(10) + "- If configuration is correct, check " + c34 + "Restart Playback" + c34 + " is disabled and WebSocket version is 4.9.0 or newer." + Error_msg = "- Unable to read " + c34 + "MediaSource1" + c34 + ". Correctly configure " + c34 + "MediaSource1" + c34 + " in " + c34 + "config.ini and retry." + Chr$(10) + "- If configuration is correct, check " + c34 + "Restart Playback" + c34 + " is disabled." ErrorDisplay (8) End If Shell _Hide CMD_EXE_HTTP + "-d " + c34 + "{\" + c34 + "inputName\" + c34 + ": \" + c34 + MediaSource2 + "\" + c34 + "}" + c34 + " " + c34 + "http://" + HTTP_Bind_Address + ":" + HTTP_Bind_Port + "/call/GetMediaInputStatus" + c34 + " > " + c34 + filePrevious_ms + c34 @@ -2300,7 +2394,7 @@ Sub __UI_OnLoad Get #128, , JSON Close #128 If GetKey("mediaCursor", JSON) = "" Then - Error_msg = "- Unable to read " + c34 + "MediaSource2" + c34 + ". Correctly configure " + c34 + "MediaSource2" + c34 + " in " + c34 + "config.ini and retry." + Chr$(10) + "- If configuration is correct, check " + c34 + "Restart Playback" + c34 + " is disabled and WebSocket version is 4.9.0 or newer." + Error_msg = "- Unable to read " + c34 + "MediaSource2" + c34 + ". Correctly configure " + c34 + "MediaSource2" + c34 + " in " + c34 + "config.ini and retry." + Chr$(10) + "- If configuration is correct, check " + c34 + "Restart Playback" + c34 + " is disabled." ErrorDisplay (8) End If Else @@ -2474,7 +2568,7 @@ Sub __UI_OnLoad End If ' --------------------------------------------------------------- - If Scene_OK = "" Or Scene_Fail = "" Or Scene_Intro = "" Or OBS_URL = "" Then RefreshDisplayRequest = TRUE: Error_msg = "- Variable/s for scenes empty, check if " + c34 + config_main + c34 + " exists. (Error: #3)": _Delay 3 + If Scene_OK = "" Or Scene_Fail = "" Or Scene_Intro = "" Or OBS_URL = "" Then RefreshDisplayRequest = True: Error_msg = "- Variable/s for scenes empty, check if " + c34 + config_main + c34 + " exists. (Error: #3)": _Delay 3 If _FileExists(filePrevious_ms) And HTTP_Communication_Native Then Kill filePrevious_ms @@ -2483,12 +2577,22 @@ Sub __UI_OnLoad If Not __MultiCameraSwitch Then Scene_Current = Scene_OK - If HTTP_Communication_Native Then http_client_connect "Set", Scene_OK Else Shell _Hide _DontWait shell_cmd_1 + Scene_OK + shell_cmd_2 + If Scene_Disabled <> "true" Then + If HTTP_Communication_Native Then http_client_connect "Set", Scene_OK Else Shell _Hide _DontWait shell_cmd_1 + Scene_OK + shell_cmd_2 + End If End If If __MultiCameraSwitch Then Scene_Current = titleScene12 - If HTTP_Communication_Native Then http_client_connect "Set", titleScene12 Else Shell _Hide _DontWait shell_cmd_1 + titleScene12 + shell_cmd_2 + If Scene_Disabled <> "true" Then + If HTTP_Communication_Native Then http_client_connect "Set", titleScene12 Else Shell _Hide _DontWait shell_cmd_1 + titleScene12 + shell_cmd_2 + End If + End If + + ' Disable changing of scenes if enabled + If Scene_Disabled = "true" Then + ' CMD_EXE = "": CMD_EXE_FAST = "": CMD_EXE_HTTP = "": CMD_EXE_HTTP_FAST = "": CMD_EXE_HTTP_FAST_GET_SCENE = "": CMD_EXE_HTTP_FAST_GET_MEDIA1 = "": CMD_EXE_HTTP_GET_SCENE = "": CMD_EXE_HTTP_GET_MEDIA2 = "": shell_cmd_1 = "": shell_cmd_2 = "" + Scene_OK = "-": Scene_LBR = "-": Scene_Fail = "-": Scene_Intro = "-": titleScene1 = "": titleScene2 = "": titleScene12 = "" End If _Delay 0.03 @@ -2497,29 +2601,29 @@ Sub __UI_OnLoad ' Enable Debug window on startup if enabled If VerBeta <> "" Or ForceDebugOnStartup = "true" Then If ForceDebugOnStartup <> "false" Then - Debug = TRUE - Control(DebugFrame).Hidden = FALSE - Control(versionFrame).Hidden = TRUE - Control(PictureBoxLogoBottom).Hidden = TRUE + Debug = True + Control(DebugFrame).Hidden = False + Control(versionFrame).Hidden = True + Control(PictureBoxLogoBottom).Hidden = True SetRadioButtonValue OptionsMenuDebug End If End If ' Update display: --------------------------------------------------------------- If Not __MultiCameraSwitch Then - Control(Stream1).Hidden = TRUE - Control(Stream2).Hidden = TRUE - Control(StreamUptimeLB).Hidden = TRUE - Control(failLB).Hidden = TRUE - Control(Uptime_Stream_1LB).Hidden = TRUE - Control(Timer_Fail_Stream1LB).Hidden = TRUE - Control(StreamUptimeLB2).Hidden = TRUE - Control(failLB2).Hidden = TRUE - Control(Uptime_Stream_2LB).Hidden = TRUE - Control(Timer_Fail_Stream2LB).Hidden = TRUE + Control(Stream1).Hidden = True + Control(Stream2).Hidden = True + Control(StreamUptimeLB).Hidden = True + Control(failLB).Hidden = True + Control(Uptime_Stream_1LB).Hidden = True + Control(Timer_Fail_Stream1LB).Hidden = True + Control(StreamUptimeLB2).Hidden = True + Control(failLB2).Hidden = True + Control(Uptime_Stream_2LB).Hidden = True + Control(Timer_Fail_Stream2LB).Hidden = True ' Low bitrate scene for multiple cameras only - Control(LowBitrateSceneLB).Hidden = TRUE - Control(Low_Bitrate_StatusLB).Hidden = TRUE + Control(LowBitrateSceneLB).Hidden = True + Control(Low_Bitrate_StatusLB).Hidden = True SetCaption FailCount2LB, "" SetCaption Timer_Fail_Count_2LB, "" SetCaption FailCount1LB, "DC / Low bitrate" @@ -2534,44 +2638,44 @@ Sub __UI_OnLoad SetCaption Low_Bitrate_StatusLB, "-" ' This is set in TIMER End If - Control(DebugFrame).Hidden = TRUE + Control(DebugFrame).Hidden = True ' Debug Temp If Debug_Temp <> "true" Then - Control(DebugFrameTemp).Hidden = TRUE - Control(DebugTemp1LB).Hidden = TRUE - Control(DebugTemp2LB).Hidden = TRUE - Control(DebugTemp3LB).Hidden = TRUE - Control(DebugTemp4LB).Hidden = TRUE - Control(DebugTemp1LB2).Hidden = TRUE - Control(DebugTemp2LB2).Hidden = TRUE - Control(DebugTemp3LB2).Hidden = TRUE - Control(DebugTemp4LB2).Hidden = TRUE + Control(DebugFrameTemp).Hidden = True + Control(DebugTemp1LB).Hidden = True + Control(DebugTemp2LB).Hidden = True + Control(DebugTemp3LB).Hidden = True + Control(DebugTemp4LB).Hidden = True + Control(DebugTemp1LB2).Hidden = True + Control(DebugTemp2LB2).Hidden = True + Control(DebugTemp3LB2).Hidden = True + Control(DebugTemp4LB2).Hidden = True Else - Control(Settings).Hidden = TRUE + Control(Settings).Hidden = True End If - Control(versionFrame).Hidden = FALSE + Control(versionFrame).Hidden = False LoadImageMEM Control(PictureBoxLogoBottom), "srt_logo_bottom.png" - Control(TimerLB).Hidden = TRUE - Control(TimerSnapshotLB).Hidden = TRUE - Control(td_displayLB2).Hidden = TRUE - Control(mouseXLB2).Hidden = TRUE - Control(mouseYLB2).Hidden = TRUE - Control(__ERRORLINELB2).Hidden = TRUE - Control(Debug_TimerLB).Hidden = TRUE - Control(Debug_Timer_SnapshotLB).Hidden = TRUE - Control(td_displayLB).Hidden = TRUE - Control(mouseXLB).Hidden = TRUE - Control(mouseYLB).Hidden = TRUE - Control(__ERRORLINELB).Hidden = TRUE - Control(LowBRTimerLB).Hidden = TRUE - Control(br_countdownLB).Hidden = TRUE - Control(MSRateLB).Hidden = TRUE - Control(MSRateLB2).Hidden = TRUE - Control(ms_playLB).Hidden = TRUE - Control(ms_playLB2).Hidden = TRUE - Control(LBRDelayLB).Hidden = TRUE - Control(br_delayLB).Hidden = TRUE - Control(PictureBoxLogoBottom).Hidden = FALSE + Control(TimerLB).Hidden = True + Control(TimerSnapshotLB).Hidden = True + Control(td_displayLB2).Hidden = True + Control(mouseXLB2).Hidden = True + Control(mouseYLB2).Hidden = True + Control(__ERRORLINELB2).Hidden = True + Control(Debug_TimerLB).Hidden = True + Control(Debug_Timer_SnapshotLB).Hidden = True + Control(td_displayLB).Hidden = True + Control(mouseXLB).Hidden = True + Control(mouseYLB).Hidden = True + Control(__ERRORLINELB).Hidden = True + Control(LowBRTimerLB).Hidden = True + Control(br_countdownLB).Hidden = True + Control(MSRateLB).Hidden = True + Control(MSRateLB2).Hidden = True + Control(ms_playLB).Hidden = True + Control(ms_playLB2).Hidden = True + Control(LBRDelayLB).Hidden = True + Control(br_delayLB).Hidden = True + Control(PictureBoxLogoBottom).Hidden = False If VerBeta = "" Then SetCaption (versionFrame), "v" + Ver Else SetCaption (versionFrame), "v" + VerBeta + "beta" ' --------------------------------------------------------------- @@ -2586,27 +2690,27 @@ Sub __UI_BeforeUpdateDisplay If Not _WindowHasFocus Then SetFrameRate 15 Else SetFrameRate 30 If RefreshDisplayRequest Then - RefreshDisplayRequest = FALSE + RefreshDisplayRequest = False Timer(t1) Stop Cls , _RGB(1, 100, 200) BSOD& = __imageMEM&("face_sad_x.png") _PutImage (25, 46)-(82, 158), BSOD& _FreeImage BSOD& Color _RGB(254, 254, 254), _RGB(1, 100, 200) - _PrintString (20, 12 * 18), "Program encountered an error and needs to restart." + _UPrintString (20, 12 * 18), "Program encountered an error and needs to restart." If InStr(Error_msg, Chr$(10)) >= 1 Then - _PrintString (20, 14 * 18), Left$(Error_msg, InStr(Error_msg, Chr$(10)) - 1) - _PrintString (20, 15 * 18), Mid$(Error_msg, InStr(Error_msg, Chr$(10)) + 1) + _UPrintString (20, 14 * 18), Left$(Error_msg, InStr(Error_msg, Chr$(10)) - 1) + _UPrintString (20, 15 * 18), Mid$(Error_msg, InStr(Error_msg, Chr$(10)) + 1) Else - _PrintString (20, 14 * 18), Error_msg + _UPrintString (20, 14 * 18), Error_msg End If If InStr(Error_msg_2$, Chr$(10)) >= 1 Then - _PrintString (20, 16 * 18), Left$(Error_msg_2$, InStr(Error_msg_2$, Chr$(10)) - 1) - _PrintString (20, 17 * 18), Mid$(Error_msg_2$, InStr(Error_msg_2$, Chr$(10)) + 1) + _UPrintString (20, 16 * 18), Left$(Error_msg_2$, InStr(Error_msg_2$, Chr$(10)) - 1) + _UPrintString (20, 17 * 18), Mid$(Error_msg_2$, InStr(Error_msg_2$, Chr$(10)) + 1) Else - _PrintString (20, 16 * 18), Error_msg_2$ + _UPrintString (20, 16 * 18), Error_msg_2$ End If - _PrintString (20, 20 * 18), "Program will resume shortly" + _UPrintString (20, 20 * 18), "Program will resume shortly" _Display: _Delay 8 Error_msg = "" Error_msg_2$ = "" @@ -2639,15 +2743,18 @@ Sub __UI_BeforeUpdateDisplay End If End If - If _Exit Then - If _FileExists(filePrevious) Then Kill filePrevious - If _FileExists(filePrevious_ms) Then Kill filePrevious_ms - If _FileExists(outputBitrateFile) Then Kill outputBitrateFile - If _FileExists(outputStatusFile) Then Kill outputStatusFile - If _FileExists(http_media2_File) Then Kill http_media2_File - If ConnectionsLog Then statusConnectionsLogToFile "[INFO] Program exit" - System - End If + q = _Exit + Select Case q + Case 1 + If _FileExists(filePrevious) Then Kill filePrevious + If _FileExists(filePrevious_ms) Then Kill filePrevious_ms + If _FileExists(outputBitrateFile) Then Kill outputBitrateFile + If _FileExists(outputStatusFile) Then Kill outputStatusFile + If _FileExists(http_media2_File) Then Kill http_media2_File + If ConnectionsLog Then statusConnectionsLogToFile "[INFO] Program exit" + If OS = "WINDOWS" And _FileExists(HTTP_File) Then Shell "%ComSpec% /C START " + c34 + c34 + " /MIN " + "taskkill /IM " + c34 + HTTP_Filename + c34 + " /F" + System + End Select ProgressCounter = ProgressCounter + 1 ' | / - \ | / - \ Select Case ProgressCounter @@ -2675,9 +2782,9 @@ Sub __UI_BeforeUpdateDisplay If Tooltip_Mouse Then mouseX = _MouseX mouseY = _MouseY - If mouseX >= 170 And mouseX <= 250 And mouseY >= 75 And mouseY <= 90 Then Tooltip_Mouse_Active = TRUE Else Tooltip_Mouse_Active = FALSE + If mouseX >= 170 And mouseX <= 250 And mouseY >= 75 And mouseY <= 90 Then Tooltip_Mouse_Active = True Else Tooltip_Mouse_Active = False If __MultiCameraSwitch Then - If mouseX >= 300 And mouseX <= 380 And mouseY >= 75 And mouseY <= 90 And Tooltip_Mouse_Active = FALSE Then Tooltip_Mouse_Active = TRUE + If mouseX >= 300 And mouseX <= 380 And mouseY >= 75 And mouseY <= 90 And Tooltip_Mouse_Active = False Then Tooltip_Mouse_Active = True End If If Tooltip_Mouse_Active Then _MouseShow "LINK" Else _MouseShow "DEFAULT" End If @@ -2765,6 +2872,7 @@ Sub __UI_Click (id As Long) If _FileExists(outputStatusFile) Then Kill outputStatusFile If _FileExists(http_media2_File) Then Kill http_media2_File If ConnectionsLog Then statusConnectionsLogToFile "[INFO] Program exit" + If OS = "WINDOWS" And _FileExists(HTTP_File) Then Shell "%ComSpec% /C START " + c34 + c34 + " /MIN " + "taskkill /IM " + c34 + HTTP_Filename + c34 + " /F" System Case StreamFailTimerLB @@ -2835,13 +2943,13 @@ Sub __UI_Click (id As Long) Case OptionsMenuAlwaysOnTop If Not AlwaysOnTop Then - AlwaysOnTop = TRUE + AlwaysOnTop = True $If WIN Then If OS = "WINDOWS" Then y& = SetWindowPos&(Myhwnd, -1, 0, 0, 0, 0, &H2 + &H1 + &H40) ' Windows only $End If SetRadioButtonValue OptionsMenuAlwaysOnTop Else - AlwaysOnTop = FALSE + AlwaysOnTop = False $If WIN Then If OS = "WINDOWS" Then y& = SetWindowPos&(Myhwnd, -2, 0, 0, 0, 0, &H2 + &H1 + &H40) ' Windows only $End If @@ -2850,15 +2958,15 @@ Sub __UI_Click (id As Long) Case OptionsMenuDebug If Not Debug Then - Debug = TRUE - Control(DebugFrame).Hidden = FALSE - Control(versionFrame).Hidden = TRUE - Control(PictureBoxLogoBottom).Hidden = TRUE + Debug = True + Control(DebugFrame).Hidden = False + Control(versionFrame).Hidden = True + Control(PictureBoxLogoBottom).Hidden = True SetRadioButtonValue OptionsMenuDebug Else - Debug = FALSE - Control(versionFrame).Hidden = TRUE - Control(PictureBoxLogoBottom).Hidden = TRUE + Debug = False + Control(versionFrame).Hidden = True + Control(PictureBoxLogoBottom).Hidden = True SetRadioButtonValue OptionsMenuDebug End If @@ -2889,7 +2997,7 @@ Sub __UI_Click (id As Long) If _FileExists(fileCheckVersion) Then Open fileCheckVersion For Input As #224 Do Until EOF(224) - If LOF(224) = 0 Then NoKill = TRUE: Exit Do ' Overkill with EOF checking, but just being safe + If LOF(224) = 0 Then NoKill = True: Exit Do ' Overkill with EOF checking, but just being safe If EOF(224) Then Exit Do Line Input #224, file224$ Loop @@ -2897,18 +3005,18 @@ Sub __UI_Click (id As Long) Close #224 If _FileExists(fileCheckVersion) Then Kill fileCheckVersion updateResult$ = file224$ - If file224$ <> Ver Then verCheck$ = "New version is available (v" + _Trim$(Left$(updateResult$, 10)) + ")": _NotifyPopup "Loopy SRT Monitor", "New version is available (v" + _Trim$(Left$(updateResult$, 10)) + ")", "info" + If file224$ <> Ver And file224$ <> "" And file224$ <> "404: Not Found" Then verCheck$ = "New version is available (v" + _Trim$(Left$(updateResult$, 10)) + ")": _NotifyPopup "Loopy SRT Monitor", "New version is available (v" + _Trim$(Left$(updateResult$, 10)) + ")", "info" If file224$ = "" Or file224$ = "404: Not Found" Then verCheck$ = "Unable to check for new version..." - If file224$ = Ver Then verCheck$ = "This is the latest version (v" + _Trim$(Left$(Ver, 10)) + ")..." + If file224$ = Ver Then verCheck$ = "This is the latest version (v" + _Trim$(Left$(Ver, 10)) + ")" If verCheck <> "" Then updateDisplayCounter = 0 Case OptionsMenuFullscreen If Not FullScreen Then - FullScreen = TRUE + FullScreen = True _FullScreen _SquarePixels , _Smooth SetRadioButtonValue OptionsMenuFullscreen Else - FullScreen = FALSE + FullScreen = False _FullScreen _Off SetRadioButtonValue OptionsMenuFullscreen End If @@ -2918,15 +3026,15 @@ Sub __UI_Click (id As Long) Case HelpMenuAbout If VerBeta = "" Then If VerPortable = "false" Then - Answer = MessageBox("Loopy SRT Stats Monitor v" + Ver + " (" + VerDate + ") \nby loopy750\n\nOBS WebSocket version: " + checkWebSocketVersion$ + "\n\nHomepage: https://www.github.com/loopy750", "About", MsgBox_OkOnly + MsgBox_Information) + _MessageBox "About", "Loopy SRT Stats Monitor v" + Ver + " (" + VerDate + ")" + EOL + "by loopy750" + EOL + EOL + "OBS WebSocket version: " + checkWebSocketVersion$ + EOL + EOL + "Homepage: https://www.github.com/loopy750", "info" Else - Answer = MessageBox("Loopy SRT Stats Monitor v" + Ver + " (" + VerDate + ") \nPortable version\nby loopy750\n\nOBS WebSocket version: " + checkWebSocketVersion$ + "\n\nHomepage: https://www.github.com/loopy750", "About", MsgBox_OkOnly + MsgBox_Information) + _MessageBox "About", "Loopy SRT Stats Monitor v" + Ver + " (" + VerDate + ")" + EOL + "Portable version" + EOL + "by loopy750" + EOL + EOL + "OBS WebSocket version: " + checkWebSocketVersion$ + EOL + EOL + "Homepage: https://www.github.com/loopy750", "info" End If Else If VerPortable = "false" Then - Answer = MessageBox("Loopy SRT Stats Monitor v" + VerBeta + "beta (" + VerDate + ") \nby loopy750\n\nOBS WebSocket version: " + checkWebSocketVersion$ + "\n\nHomepage: https://www.github.com/loopy750", "About", MsgBox_OkOnly + MsgBox_Information) + _MessageBox "About", "Loopy SRT Stats Monitor v" + VerBeta + "beta (" + VerDate + ")" + EOL + "by loopy750" + EOL + EOL + "OBS WebSocket version: " + checkWebSocketVersion$ + EOL + EOL + "Homepage: https://www.github.com/loopy750", "info" Else - Answer = MessageBox("Loopy SRT Stats Monitor v" + VerBeta + "beta (" + VerDate + ") \nPortable version\nby loopy750\n\nOBS WebSocket version: " + checkWebSocketVersion$ + "\n\nHomepage: https://www.github.com/loopy750", "About", MsgBox_OkOnly + MsgBox_Information) + _MessageBox "About", "Loopy SRT Stats Monitor v" + VerBeta + "beta (" + VerDate + ")" + EOL + "Portable version\nby loopy750" + EOL + EOL + "OBS WebSocket version: " + checkWebSocketVersion$ + EOL + EOL + "Homepage: https://www.github.com/loopy750", "info" End If End If @@ -3925,19 +4033,20 @@ Sub ErrorDisplay (ErrorTestVal) _PutImage (24, 46)-(81, 158), BSOD& _FreeImage BSOD& Color _RGB(254, 254, 254), _RGB(1, 100, 200) - _PrintString (16, 12 * 18), "> Test #" + _Trim$(Str$(ErrorTestVal)) + " of 10 failed" + _UPrintString (16, 12 * 18), "> Test #" + _Trim$(Str$(ErrorTestVal)) + " of 10 failed" If InStr(Error_msg, Chr$(10)) >= 1 Then - _PrintString (16, 14 * 18), Left$(Error_msg, InStr(Error_msg, Chr$(10)) - 1) - _PrintString (16, 15 * 18), Mid$(Error_msg, InStr(Error_msg, Chr$(10)) + 1) - _PrintString (16, 16 * 18), Mid$(Error_msg_3, 1) + _UPrintString (16, 14 * 18), Left$(Error_msg, InStr(Error_msg, Chr$(10)) - 1) + _UPrintString (16, 15 * 18), Mid$(Error_msg, InStr(Error_msg, Chr$(10)) + 1) + _UPrintString (16, 16 * 18), Mid$(Error_msg_3, 1) Sound 440, 1.5 Else - _PrintString (16, 14 * 18), Error_msg + _UPrintString (16, 14 * 18), Error_msg End If - _PrintString (16, 20 * 18), "Program will exit shortly or press any key to exit now..." - _PrintString (645, 21 * 18), "Loopy SRT Monitor v" + Ver + "" + _UPrintString (16, 20 * 18), "Program will exit shortly or press any key to exit now..." + _UPrintString (645, 21 * 18), "Loopy SRT Monitor v" + Ver + "" _Display _Delay 0.5 + If HTTP_Enabled And HTTP_Auto_Open <> "false" Then If OS = "WINDOWS" And _FileExists(HTTP_File) Then Shell "%ComSpec% /C START " + c34 + c34 + " /MIN " + "taskkill /IM " + c34 + HTTP_Filename + c34 + " /F" Error_msg_3 = "" For Error_Exit = 1 To 120 _Delay 0.5 @@ -3968,6 +4077,25 @@ Function GetKey$ (keyname As String, JSON As String) GetKey = jkey End Function +Function GetKeyRestreamer$ (keyname As String, JSON As String) + ' Credit to SpriggsySpriggs + Dim jkey As String + If InStr(JSON, Chr$(34) + keyname + Chr$(34)) Then + jkey = Mid$(JSON, InStr(JSON, Chr$(34) + keyname + Chr$(34)) + Len(keyname)) + jkey = Mid$(jkey, InStr(jkey, ":") + 1) + If Mid$(jkey, 1, 1) = Chr$(34) Then + jkey = Mid$(jkey, 2) + End If + jkey = Mid$(jkey, 1, InStr(jkey, Chr$(34)) - 1) + If Right$(jkey, 1) = "," Then + jkey = Mid$(jkey, 1, Len(jkey) - 1) + End If + Else + GetKeyRestreamer$ = "" + End If + GetKeyRestreamer$ = jkey +End Function + Sub GetAllKey (keyname As String, JSON As String, ParseKey() As String) ' Credit to SpriggsySpriggs Dim jkey As String @@ -3991,6 +4119,29 @@ Sub GetAllKey (keyname As String, JSON As String, ParseKey() As String) Loop Until InStr(JSON, Chr$(34) + keyname + Chr$(34)) = 0 End Sub +Sub GetAllKeyRestreamer (keyname As String, JSON As String, ParseKey() As String) + ' Credit to SpriggsySpriggs + Dim jkey As String + Dim x_JSON + Do + If InStr(JSON, Chr$(34) + keyname + Chr$(34)) Then + x_JSON = x_JSON + 1 + ReDim _Preserve ParseKey(x_JSON) As String + JSON = Mid$(JSON, InStr(JSON, Chr$(34) + keyname + Chr$(34)) + Len(keyname)) + jkey = JSON + jkey = Mid$(jkey, InStr(jkey, ":") + 1) + If Mid$(jkey, 1, 1) = Chr$(34) Then + jkey = Mid$(jkey, 2) + End If + jkey = Mid$(jkey, 1, InStr(jkey, Chr$(34)) - 1) + If Right$(jkey, 1) = "," Then + jkey = Mid$(jkey, 1, Len(jkey) - 1) + End If + ParseKey(x_JSON) = jkey + End If + Loop Until InStr(JSON, Chr$(34) + keyname + Chr$(34)) = 0 +End Sub + Sub GetAllKeyXML (keyname_XML As String, XML As String, ParseKeyXML() As String) ' Credit to SpriggsySpriggs Dim jkey_XML As String @@ -4017,7 +4168,7 @@ End Sub Sub http_client_connect (HTTP_Mode$, HTTP_Scene$) On Error GoTo App_Fail - App_Refresh = TRUE + App_Refresh = True HTTP_Timer_GET = 0: HTTP_GET_a = "": HTTP_GET_a2 = "": HTTP_GET_i = 0: HTTP_GET_i2 = 0: HTTP_GET_i3 = 0: HTTP_GET_l = 0: HTTP_GET_d = "": HTTP_GET_d_2 = "" GetCurrentProgramScene.tmp = "": GetMediaInputStatus.tmp = "": GetVersion.tmp = "" @@ -4029,7 +4180,7 @@ Sub http_client_connect (HTTP_Mode$, HTTP_Scene$) If http_connect_timer = 1 Then HTTP_Port_Client = "TCP/IP:" + HTTP_Bind_Port + ":" http_client = _OpenClient(HTTP_Port_Client + HTTP_Bind_Address) - If http_client = 0 Then RefreshDisplayRequest = TRUE: Error_msg$ = "- Unable to connect, check if " + c34 + HTTP_Bind_Address + ":" + HTTP_Bind_Port + c34 + " is correct." + Chr$(10) + "- Program is unable to connect to " + c34 + "obs-websocket-http" + c34 + ". (Error: #15)": _Delay 3: Exit Sub + If http_client = 0 Then RefreshDisplayRequest = True: Error_msg$ = "- Unable to connect, check if " + c34 + HTTP_Bind_Address + ":" + HTTP_Bind_Port + c34 + " is correct." + Chr$(10) + "- Program is unable to connect to " + c34 + "obs-websocket-http" + c34 + ". (Error: #15)": _Delay 3: Exit Sub End If Select Case LCase$(HTTP_Mode$) @@ -4040,7 +4191,7 @@ Sub http_client_connect (HTTP_Mode$, HTTP_Scene$) HTTP_Header = "" HTTP_Header = HTTP_Header + "POST /emit/SetCurrentProgramScene HTTP/1.1" + SLS_EOL HTTP_Header = HTTP_Header + "Host: " + HTTP_Bind_Address + ":" + HTTP_Bind_Port + SLS_EOL - HTTP_Header = HTTP_Header + "User-Agent: curl/7.87.0" + SLS_EOL + HTTP_Header = HTTP_Header + "User-Agent: curl/8.0.1" + SLS_EOL HTTP_Header = HTTP_Header + "Accept: */*" + SLS_EOL HTTP_Header = HTTP_Header + "Authorization: " + HTTP_Auth_Key + SLS_EOL HTTP_Header = HTTP_Header + "Content-type: application/json" + SLS_EOL @@ -4061,7 +4212,7 @@ Sub http_client_connect (HTTP_Mode$, HTTP_Scene$) HTTP_Header = "" HTTP_Header = HTTP_Header + "POST /call/GetCurrentProgramScene HTTP/1.1" + SLS_EOL HTTP_Header = HTTP_Header + "Host: " + HTTP_Bind_Address + ":" + HTTP_Bind_Port + SLS_EOL - HTTP_Header = HTTP_Header + "User-Agent: curl/7.87.0" + SLS_EOL + HTTP_Header = HTTP_Header + "User-Agent: curl/8.0.1" + SLS_EOL HTTP_Header = HTTP_Header + "Accept: */*" + SLS_EOL HTTP_Header = HTTP_Header + "Authorization: " + HTTP_Auth_Key + SLS_EOL HTTP_Header = HTTP_Header + "Content-type: application/json" + SLS_EOL + SLS_EOL @@ -4106,7 +4257,7 @@ Sub http_client_connect (HTTP_Mode$, HTTP_Scene$) HTTP_Header = "" HTTP_Header = HTTP_Header + "POST /call/GetMediaInputStatus HTTP/1.1" + SLS_EOL HTTP_Header = HTTP_Header + "Host: " + HTTP_Bind_Address + ":" + HTTP_Bind_Port + SLS_EOL - HTTP_Header = HTTP_Header + "User-Agent: curl/7.87.0" + SLS_EOL + HTTP_Header = HTTP_Header + "User-Agent: curl/8.0.1" + SLS_EOL HTTP_Header = HTTP_Header + "Accept: */*" + SLS_EOL HTTP_Header = HTTP_Header + "Authorization: " + HTTP_Auth_Key + SLS_EOL HTTP_Header = HTTP_Header + "Content-type: application/json" + SLS_EOL @@ -4151,7 +4302,7 @@ Sub http_client_connect (HTTP_Mode$, HTTP_Scene$) HTTP_Header = "" HTTP_Header = HTTP_Header + "POST /call/GetVersion HTTP/1.1" + SLS_EOL HTTP_Header = HTTP_Header + "Host: " + HTTP_Bind_Address + ":" + HTTP_Bind_Port + SLS_EOL - HTTP_Header = HTTP_Header + "User-Agent: curl/7.87.0" + SLS_EOL + HTTP_Header = HTTP_Header + "User-Agent: curl/8.0.1" + SLS_EOL HTTP_Header = HTTP_Header + "Accept: */*" + SLS_EOL HTTP_Header = HTTP_Header + "Authorization: " + HTTP_Auth_Key + SLS_EOL HTTP_Header = HTTP_Header + "Content-type: application/json" + SLS_EOL + SLS_EOL @@ -4194,11 +4345,13 @@ End Sub Sub sls_client_connect ' Reset SLS data - SLS_GET_a = "": SLS_GET_a2 = "": SLS_GET_i = 0: SLS_GET_i2 = 0: SLS_GET_i3 = 0: SLS_GET_l = 0: SLS_GET_d = "": sls_stats.xml = "": SLS_Bitrate1 = 0: SLS_Bitrate2 = 0 + SLS_GET_a = "": SLS_GET_a2 = "": SLS_GET_i = 0: SLS_GET_i2 = 0: SLS_GET_i3 = 0: SLS_GET_l = 0: SLS_GET_d = "": sls_stats.xml = "" + If __SLS_1_Enabled Then SLS_Bitrate1 = 0 + If __SLS_2_Enabled Then SLS_Bitrate2 = 0 SLS_streams_found = 0: SLS_Uptime1 = 0: SLS_Uptime2 = 0: SLS_streams_seek = 0 On Error GoTo App_Fail - App_Refresh = TRUE + App_Refresh = True ' Open client every x seconds to prevent program freezing every second with high pings (v1.1.0) If SLS_Server_KeepAlive1 <> 0 Then @@ -4215,7 +4368,7 @@ Sub sls_client_connect sls_client = _OpenClient(SLS_Port_Client + SLS_Server_IP) - If sls_client = 0 Then RefreshDisplayRequest = TRUE: Error_msg$ = "- Unable to connect, check if " + c34 + SLS_Server_IP + ":" + SLS_Server_Port + c34 + " is correct." + Chr$(10) + "- Program is unable to read the SLS /" + Left$(SLS_Stats, 20) + " URL from its http server. (Error: #4)": _Delay 3: Exit Sub + If sls_client = 0 Then RefreshDisplayRequest = True: Error_msg$ = "- Unable to connect, check if " + c34 + SLS_Server_IP + ":" + SLS_Server_Port + c34 + " is correct." + Chr$(10) + "- Program is unable to read the SLS /" + Left$(SLS_Stats, 20) + " URL from its http server. (Error: #4)": _Delay 3: Exit Sub SLS_Ping2 = Timer(.001) SLS_PingOut = (SLS_Ping2 - SLS_Ping1) @@ -4260,11 +4413,13 @@ End Sub Sub sls_client_connect_2 ' SLS 2nd IP ' Reset SLS data - SLS_GET_a = "": SLS_GET_a2 = "": SLS_GET_i = 0: SLS_GET_i2 = 0: SLS_GET_i3 = 0: SLS_GET_l = 0: SLS_GET_d_2 = "": sls_stats_2.xml = "": SLS_Bitrate1 = 0: SLS_Bitrate2 = 0 + SLS_GET_a = "": SLS_GET_a2 = "": SLS_GET_i = 0: SLS_GET_i2 = 0: SLS_GET_i3 = 0: SLS_GET_l = 0: SLS_GET_d_2 = "": sls_stats_2.xml = "" + If __SLS_1_Enabled Then SLS_Bitrate1 = 0 + If __SLS_2_Enabled Then SLS_Bitrate2 = 0 SLS_streams_found = 0: SLS_Uptime1 = 0: SLS_Uptime2 = 0: SLS_streams_seek = 0 On Error GoTo App_Fail - App_Refresh = TRUE + App_Refresh = True ' Open client every x seconds to prevent program freezing every second with high pings (v1.1.0) If SLS_Server_KeepAlive2 <> 0 Then @@ -4281,7 +4436,7 @@ Sub sls_client_connect_2 ' SLS 2nd IP sls_client_2 = _OpenClient(SLS_Port_Client_2 + SLS_Server_IP_2) - If sls_client_2 = 0 Then RefreshDisplayRequest = TRUE: Error_msg$ = "- Unable to connect, check if " + c34 + SLS_Server_IP_2 + ":" + SLS_Server_Port_2 + c34 + " is correct." + Chr$(10) + "- Program is unable to read the SLS /" + Left$(SLS_Stats_2, 20) + " URL from its http server. (Error: #13)": _Delay 3: Exit Sub + If sls_client_2 = 0 Then RefreshDisplayRequest = True: Error_msg$ = "- Unable to connect, check if " + c34 + SLS_Server_IP_2 + ":" + SLS_Server_Port_2 + c34 + " is correct." + Chr$(10) + "- Program is unable to read the SLS /" + Left$(SLS_Stats_2, 20) + " URL from its http server. (Error: #13)": _Delay 3: Exit Sub SLS_Ping2_2 = Timer(.001) SLS_PingOut_2 = (SLS_Ping2_2 - SLS_Ping1_2) @@ -4323,6 +4478,184 @@ Sub sls_client_connect_2 ' SLS 2nd IP End Sub +Sub restreamer_client_connect + + ' Reset RESTREAMER data + RESTREAMER_GET_a = "": RESTREAMER_GET_a2 = "": RESTREAMER_GET_i = 0: RESTREAMER_GET_i2 = 0: RESTREAMER_GET_i3 = 0: RESTREAMER_GET_l = 0: RESTREAMER_GET_d = "": restreamer_stats.xml = "": RESTREAMER_Bitrate1 = 0: RESTREAMER_Bitrate2 = 0 + RESTREAMER_streams_found = 0: RESTREAMER_streams_seek = 0 + restreamer_token.xml = "" + + On Error GoTo App_Fail + App_Refresh = True + + ' Open client every x seconds to prevent program freezing every second with high pings (v1.1.1) + If RESTREAMER_Server_KeepAlive <> 0 Then + OpenClient_Interval_RESTREAMER = RESTREAMER_Server_KeepAlive + Else + OpenClient_Interval_RESTREAMER = KeepAlive_RESTREAMER_Default + End If + + restreamer_connect_timer = restreamer_connect_timer + 1 + If restreamer_connect_timer >= OpenClient_Interval_RESTREAMER Then restreamer_connect_timer = 1: Close restreamer_client + If restreamer_connect_timer = 1 Then + + RESTREAMER_Ping1 = Timer(.001) + + restreamer_client = _OpenClient(RESTREAMER_Port_Client + RESTREAMER_Server_IP) + + If restreamer_client = 0 Then RefreshDisplayRequest = True: Error_msg$ = "- Unable to connect, check if " + c34 + RESTREAMER_Server_IP + ":" + RESTREAMER_Server_Port + c34 + " is correct." + Chr$(10) + "- Program is unable to read the RESTREAMER stats URL from its http server. (Error: #16)": _Delay 3: Exit Sub + + RESTREAMER_Ping2 = Timer(.001) + RESTREAMER_PingOut = (RESTREAMER_Ping2 - RESTREAMER_Ping1) + + End If + + ' Reset timer and delay if connection was not established, else Put will cause a program error + If restreamer_client = 0 Then restreamer_connect_timer = 99: _Delay 3 + + + + ' Get RESTREAMER token ---------------------------------------------------------------------------------------------------------- BEGIN + + restreamer_client = _OpenClient(RESTREAMER_Port_Client + RESTREAMER_Server_IP) + + RESTREAMER_Data = "{" + c34 + "username" + c34 + ":" + c34 + RESTREAMER_Username + c34 + "," + c34 + "password" + c34 + ":" + c34 + RESTREAMER_Password + c34 + "}" + + RESTREAMER_Header = "" + RESTREAMER_Header = RESTREAMER_Header + "POST /api/login HTTP/1.1" + RESTREAMER_EOL + RESTREAMER_Header = RESTREAMER_Header + "Host: " + RESTREAMER_Server_IP + ":" + RESTREAMER_Server_Port + RESTREAMER_EOL + RESTREAMER_Header = RESTREAMER_Header + "User-Agent: curl/8.0.1" + RESTREAMER_EOL + RESTREAMER_Header = RESTREAMER_Header + "Accept: */*" + RESTREAMER_EOL + RESTREAMER_Header = RESTREAMER_Header + "Content-type: application/json" + RESTREAMER_EOL + RESTREAMER_Header = RESTREAMER_Header + "Content-Length: " + _Trim$(Str$(Len(RESTREAMER_Data))) + RESTREAMER_EOL + RESTREAMER_EOL + RESTREAMER_Header = RESTREAMER_Header + RESTREAMER_Data + + ' Reset timer and delay if connection was not established, else Put will cause a program error + If restreamer_client = 0 Then restreamer_connect_timer = 99: _Delay 1 + + Put #restreamer_client, , RESTREAMER_Header + 'Close restreamer_client + + ' Reset RESTREAMER data + RESTREAMER_GET_a = "": RESTREAMER_GET_a2 = "": RESTREAMER_GET_i = 0: RESTREAMER_GET_i2 = 0: RESTREAMER_GET_i3 = 0: RESTREAMER_GET_l = 0: RESTREAMER_GET_d = "": restreamer_stats.xml = "": RESTREAMER_Bitrate1 = 0: RESTREAMER_Bitrate2 = 0 + RESTREAMER_streams_found = 0: RESTREAMER_streams_seek = 0 + restreamer_token.xml = "" + + ' Connect to RESTREAMER Live Server and grab json data + RESTREAMER_Timer_GET = Timer + Do + _Delay 0.01 + Get #restreamer_client, , RESTREAMER_GET_a2 + RESTREAMER_GET_a = RESTREAMER_GET_a + RESTREAMER_GET_a2 + RESTREAMER_GET_i = InStr(RESTREAMER_GET_a, "Content-Length:") + If RESTREAMER_GET_i Then + RESTREAMER_GET_i2 = InStr(RESTREAMER_GET_i, RESTREAMER_GET_a, RESTREAMER_EOL) + If RESTREAMER_GET_i2 Then + RESTREAMER_GET_l = Val(Mid$(RESTREAMER_GET_a, RESTREAMER_GET_i + 15, RESTREAMER_GET_i2 - RESTREAMER_GET_i - 14)) + RESTREAMER_GET_i3 = InStr(RESTREAMER_GET_i2, RESTREAMER_GET_a, RESTREAMER_EOL + RESTREAMER_EOL) + If RESTREAMER_GET_i3 Then + RESTREAMER_GET_i3 = RESTREAMER_GET_i3 + 4 'move i3 to start of data + If (Len(RESTREAMER_GET_a) - RESTREAMER_GET_i3 + 1) = RESTREAMER_GET_l Then + 'Close restreamer_client ' CLOSE CLIENT + RESTREAMER_GET_d = Mid$(RESTREAMER_GET_a, RESTREAMER_GET_i3, RESTREAMER_GET_l) + Exit Do + End If ' available data = l + End If ' i3 + End If ' i2 + End If ' i + Loop Until Timer > RESTREAMER_Timer_GET + 2 ' 2 second timeout + 'Close restreamer_client + + ' Store json data in restreamer_token.xml + restreamer_token.xml = RESTREAMER_GET_d + + restreamer_token.xml = GetKeyRestreamer("access_token", restreamer_token.xml) + + ' Get RESTREAMER token ---------------------------------------------------------------------------------------------------------- END + + + + + RESTREAMER_Header = "" + RESTREAMER_Header = RESTREAMER_Header + "GET /api/v3/session/active?collectors=" + RESTREAMER_Stats + " HTTP/1.1" + RESTREAMER_EOL + RESTREAMER_Header = RESTREAMER_Header + "Host: " + RESTREAMER_Server_IP + ":" + RESTREAMER_Server_Port + RESTREAMER_EOL + RESTREAMER_Header = RESTREAMER_Header + "User-Agent: curl/8.0.1" + RESTREAMER_EOL + RESTREAMER_Header = RESTREAMER_Header + "Accept: application/json" + RESTREAMER_EOL + RESTREAMER_Header = RESTREAMER_Header + "Authorization: Bearer " + restreamer_token.xml + RESTREAMER_EOL + RESTREAMER_Header = RESTREAMER_Header + RESTREAMER_EOL + + RESTREAMER_Port_Client = "TCP/IP:" + RESTREAMER_Server_Port + ":" + + + + ' Reset RESTREAMER data + RESTREAMER_GET_a = "": RESTREAMER_GET_a2 = "": RESTREAMER_GET_i = 0: RESTREAMER_GET_i2 = 0: RESTREAMER_GET_i3 = 0: RESTREAMER_GET_l = 0: RESTREAMER_GET_d = "": restreamer_stats.xml = "": RESTREAMER_Bitrate1 = 0: RESTREAMER_Bitrate2 = 0 + RESTREAMER_streams_found = 0: RESTREAMER_streams_seek = 0 + + On Error GoTo App_Fail + App_Refresh = True + + + + ' For code 401 + ' Open client every x seconds to prevent program freezing every second with high pings (v1.1.1) + If RESTREAMER_Server_KeepAlive <> 0 Then + OpenClient_Interval_RESTREAMER = RESTREAMER_Server_KeepAlive + Else + OpenClient_Interval_RESTREAMER = KeepAlive_RESTREAMER_Default + End If + + If restreamer_connect_timer >= OpenClient_Interval_RESTREAMER Then restreamer_connect_timer = 1: Close restreamer_client + If restreamer_connect_timer = 1 Then + + RESTREAMER_Ping1 = Timer(.001) + + restreamer_client = _OpenClient(RESTREAMER_Port_Client + RESTREAMER_Server_IP) + + If restreamer_client = 0 Then RefreshDisplayRequest = True: Error_msg$ = "- Unable to connect, check if " + c34 + RESTREAMER_Server_IP + ":" + RESTREAMER_Server_Port + c34 + " is correct." + Chr$(10) + "- Program is unable to read the RESTREAMER stats URL from its http server. (Error: #16)": _Delay 3: Exit Sub + + RESTREAMER_Ping2 = Timer(.001) + RESTREAMER_PingOut = (RESTREAMER_Ping2 - RESTREAMER_Ping1) + + End If + + ' Reset timer and delay if connection was not established, else Put will cause a program error + If restreamer_client = 0 Then restreamer_connect_timer = 99: _Delay 3 + + + + Put #restreamer_client, , RESTREAMER_Header + + ' Connect to RESTREAMER Live Server and grab json data + RESTREAMER_Timer_GET = Timer + Do + _Delay 0.01 + Get #restreamer_client, , RESTREAMER_GET_a2 + RESTREAMER_GET_a = RESTREAMER_GET_a + RESTREAMER_GET_a2 + RESTREAMER_GET_i = InStr(RESTREAMER_GET_a, "Content-Length:") + If RESTREAMER_GET_i Then + RESTREAMER_GET_i2 = InStr(RESTREAMER_GET_i, RESTREAMER_GET_a, RESTREAMER_EOL) + If RESTREAMER_GET_i2 Then + RESTREAMER_GET_l = Val(Mid$(RESTREAMER_GET_a, RESTREAMER_GET_i + 15, RESTREAMER_GET_i2 - RESTREAMER_GET_i - 14)) + RESTREAMER_GET_i3 = InStr(RESTREAMER_GET_i2, RESTREAMER_GET_a, RESTREAMER_EOL + RESTREAMER_EOL) + If RESTREAMER_GET_i3 Then + RESTREAMER_GET_i3 = RESTREAMER_GET_i3 + 4 'move i3 to start of data + If (Len(RESTREAMER_GET_a) - RESTREAMER_GET_i3 + 1) = RESTREAMER_GET_l Then + 'Close restreamer_client ' CLOSE CLIENT + RESTREAMER_GET_d = Mid$(RESTREAMER_GET_a, RESTREAMER_GET_i3, RESTREAMER_GET_l) + Exit Do + End If ' available data = l + End If ' i3 + End If ' i2 + End If ' i + Loop Until Timer > RESTREAMER_Timer_GET + 2 ' 2 second timeout + 'Close restreamer_client + + ' Store json data in restreamer_stats.xml + restreamer_stats.xml = RESTREAMER_GET_d + +End Sub + Sub rtmp_client_connect ' Reset RTMP data @@ -4330,7 +4663,7 @@ Sub rtmp_client_connect RTMP_streams_found = 0: RTMP_Uptime1 = 0: RTMP_Uptime2 = 0: RTMP_streams_seek = 0 On Error GoTo App_Fail - App_Refresh = TRUE + App_Refresh = True ' Open client every x seconds (v1.1.0) If RTMP_Server_KeepAlive <> 0 Then @@ -4345,7 +4678,7 @@ Sub rtmp_client_connect RTMP_Ping1 = Timer(.001) rtmp_client = _OpenClient(RTMP_Port_Client + RTMP_Server_IP) - If rtmp_client = 0 Then RefreshDisplayRequest = TRUE: Error_msg$ = "- Unable to connect, check if " + c34 + RTMP_Server_IP + ":" + RTMP_Server_Port + c34 + " is correct." + Chr$(10) + "- Program is unable to read the NGINX /" + Left$(RTMP_Stats, 20) + " URL from its http server. (Error: #14)": _Delay 3: Exit Sub + If rtmp_client = 0 Then RefreshDisplayRequest = True: Error_msg$ = "- Unable to connect, check if " + c34 + RTMP_Server_IP + ":" + RTMP_Server_Port + c34 + " is correct." + Chr$(10) + "- Program is unable to read the NGINX /" + Left$(RTMP_Stats, 20) + " URL from its http server. (Error: #14)": _Delay 3: Exit Sub RTMP_Ping2 = Timer(.001) RTMP_PingOut = (RTMP_Ping2 - RTMP_Ping1) @@ -4401,7 +4734,7 @@ Sub Multi0 (serverType$) If HTTP_Enabled Then If HTTP_Communication_Native Then http_client_connect "GetMedia", MediaSource1 Else Shell _Hide CMD_EXE_HTTP_FAST_GET_MEDIA1 Else Shell _Hide CMD_EXE_FAST + c34 + obs_get_media1 + c34 On Error GoTo App_Fail - App_Refresh = TRUE + App_Refresh = True @@ -4447,13 +4780,13 @@ Sub Multi0 (serverType$) Open filePrevious_ms For Input As #92 If EOF(92) Then - RefreshDisplayRequest = TRUE + RefreshDisplayRequest = True Error_msg = "- Unable to read " + c34 + "SceneOK" + c34 + ", check " + c34 + "config.ini" + c34 + " & OBS to confirm it's correct." + Chr$(10) + "- If OBS is open, check communication is available via Node.js & obs-websocket-js.": Error_msg_2$ = "- If Node.js is installed, check " + c34 + "Restart playback" + c34 + " is disabled in OBS " + c34 + "Media Source" + c34 + "." + Chr$(10) + "- If " + c34 + "Restart playback" + c34 + " is disabled, check OBS WebSocket options are correctly set. (Error: #9)" _Delay 3 GoTo LOF92 End If - If LOF(92) = 0 Then NoKill = TRUE: GoTo LOF92 ' Overkill with EOF checking, but just being safe + If LOF(92) = 0 Then NoKill = True: GoTo LOF92 ' Overkill with EOF checking, but just being safe If EOF(92) Then GoTo LOF92 Line Input #92, file92 @@ -4499,14 +4832,13 @@ Sub Multi0 (serverType$) End If - If NoKill Then NoKill = FALSE Else If _FileExists(filePrevious_ms) Then Kill filePrevious_ms + If NoKill Then NoKill = False Else If _FileExists(filePrevious_ms) Then Kill filePrevious_ms Case "SLS" If __SLS_1_Enabled Then sls_client_connect If SLS_2_Active Then sls_client_connect_2 ' SLS 2nd IP - On Error GoTo 0 - App_Refresh = FALSE + App_Refresh = False If Dummy_Server <> "" Then DummyServer Dummy_Server @@ -4539,7 +4871,7 @@ Sub Multi0 (serverType$) ' ---------- BELABOX detection ---------- - BELABOX_1_Found = FALSE: BELABOX_2_Found = FALSE + BELABOX_1_Found = False: BELABOX_2_Found = False ' Discover if one or two streams are running Do @@ -4563,9 +4895,9 @@ Sub Multi0 (serverType$) If InStr(sls_stats.xml, SLS_Publisher1) Then SLS_Bitrate1 = Val(Mid$(sls_stats.xml, (InStr(sls_stats.xml, c34 + "bitrate" + c34 + ":") + Len(c34 + "bitrate" + c34 + ":")), 6)) If _Trim$(Mid$(sls_stats.xml, InStr(InStr(sls_stats.xml, SLS_Publisher1), sls_stats.xml, c34 + "connected" + c34 + ":") + 12, 5)) = "true" Then - BELABOX_1_Found = TRUE: BELABOX_1_Uptime = BELABOX_1_Uptime + 1: SLS_Uptime1 = BELABOX_1_Uptime: BELABOX_1_Offline = FALSE ' Uptime not reported in JSON data + BELABOX_1_Found = True: BELABOX_1_Uptime = BELABOX_1_Uptime + 1: SLS_Uptime1 = BELABOX_1_Uptime: BELABOX_1_Offline = False ' Uptime not reported in JSON data ElseIf Left$(_Trim$(Mid$(sls_stats.xml, InStr(InStr(sls_stats.xml, SLS_Publisher1), sls_stats.xml, c34 + "connected" + c34 + ":") + 12, 5)), 4) = "fals" Then - BELABOX_1_Found = TRUE: BELABOX_1_Offline = TRUE: BELABOX_1_Uptime = 0 + BELABOX_1_Found = True: BELABOX_1_Offline = True: BELABOX_1_Uptime = 0 End If End If @@ -4575,9 +4907,9 @@ Sub Multi0 (serverType$) SLS_Bitrate1 = Val(Mid$(sls_stats.xml, InStr(InStr(sls_stats.xml, SLS_Publisher1), sls_stats.xml, "bitrate") + 9, 6)) If _Trim$(Mid$(sls_stats.xml, InStr(InStr(sls_stats.xml, SLS_Publisher1), sls_stats.xml, c34 + "connected" + c34 + ":") + 12, 5)) = "true" Then - BELABOX_1_Found = TRUE: BELABOX_1_Uptime = BELABOX_1_Uptime + 1: SLS_Uptime1 = BELABOX_1_Uptime: BELABOX_1_Offline = FALSE ' Uptime not reported in JSON data + BELABOX_1_Found = True: BELABOX_1_Uptime = BELABOX_1_Uptime + 1: SLS_Uptime1 = BELABOX_1_Uptime: BELABOX_1_Offline = False ' Uptime not reported in JSON data ElseIf Left$(_Trim$(Mid$(sls_stats.xml, InStr(InStr(sls_stats.xml, SLS_Publisher1), sls_stats.xml, c34 + "connected" + c34 + ":") + 12, 5)), 4) = "fals" Then - BELABOX_1_Found = TRUE: BELABOX_1_Offline = TRUE: BELABOX_1_Uptime = 0 + BELABOX_1_Found = True: BELABOX_1_Offline = True: BELABOX_1_Uptime = 0 End If End If @@ -4594,11 +4926,43 @@ Sub Multi0 (serverType$) ' Check BitrateFail1 - if bitrate is below fail value, appear to be 0 If SLS_Bitrate1 < SLS_BitrateFail1 Then MediaSource1TimeMS = 0 + + Case "RESTREAMER" + + If __RESTREAMER_1_Enabled Then restreamer_client_connect + + On Error GoTo 0 + App_Refresh = False + + + If Dummy_Server <> "" Then DummyServer Dummy_Server + + + If GetKeyRestreamer("message", restreamer_stats.xml) = "Missing or invalid JWT token" Then RefreshDisplayRequest = True: Error_msg$ = "- Unable to connect, check if " + c34 + RESTREAMER_Server_IP + ":" + RESTREAMER_Server_Port + c34 + " is correct. Confirm correct username and password." + Chr$(10) + "- Restreamer response is " + c34 + "Missing or invalid JWT token" + c34 + ". (Error: #17)": _Delay 3: Exit Sub + + If InStr(restreamer_stats.xml, RESTREAMER_ID_1) Then + RESTREAMER_Bitrate1 = Int(Val(GetKeyRestreamer("bandwidth_rx_kbit", Mid$(restreamer_stats.xml, InStr(restreamer_stats.xml, RESTREAMER_ID_1))))) + If RESTREAMER_Bitrate1 > 0 Then RESTREAMER_Uptime1 = RESTREAMER_Uptime1 + 1 Else RESTREAMER_Uptime1 = 0 + SLS_Uptime1 = RESTREAMER_Uptime1 + Else + RESTREAMER_Bitrate1 = 0 + RESTREAMER_Uptime1 = 0 + End If + + SLS_Bitrate1 = RESTREAMER_Bitrate1 + + ' Uptime + MediaSource1Time = SLS_Uptime1 + MediaSource1TimeMS = SLS_Uptime1 * 1000 + + ' Check BitrateFail1 - if bitrate is below fail value, appear to be 0 + If RESTREAMER_Bitrate1 < RESTREAMER_BitrateFail1 Then MediaSource1TimeMS = 0 + Case "NGINX" rtmp_client_connect On Error GoTo App_Fail - App_Refresh = TRUE + App_Refresh = True ' Older code: 'If InStr(rtmp_stats.xml$, "") Then RTMP_Uptime1 = Val(Mid$(rtmp_stats.xml$, InStr(rtmp_stats.xml$, "") + 8, 16)) @@ -4696,7 +5060,7 @@ Sub Multi0 (serverType$) MediaSource1Time = MediaSource1TimeMS / 1000 On Error GoTo 0 - App_Refresh = FALSE + App_Refresh = False MediaSource1TimeMSOffset = MediaSource1TimeMS - MediaSource1TimeLog If MediaSource1TimeMSOffset < 0 Then MediaSource1TimeMSOffset = 0 @@ -4722,6 +5086,15 @@ Sub Multi0 (serverType$) If LBR_Delay >= LBR_Delay_Total Then LBR_Delay = LBR_Delay_Total: CooldownLog = CooldownLogTotal: If CooldownLog > CooldownLogTotal Then CooldownLog = CooldownLogTotal LBR_Delay = LBR_Delay + 1: If LBR_Delay > LBR_Delay_Total Then LBR_Delay = LBR_Delay_Total End If + Case "RESTREAMER" + ' Added LBR_Delay >= LBR_Delay_Total for LBR_Delay and ConnectionsLog=true + If RESTREAMER_Bitrate1 < RESTREAMER_BitrateLow1 And Timer_Fail_Stream1 = 0 And CooldownLog = 0 And LBR_Delay >= LBR_Delay_Total Then Multi0_CMD_LBR + + If RESTREAMER_Bitrate1 < RESTREAMER_BitrateLow1 And Timer_Fail_Stream1 = 0 Then + ' LBR_Delay + If LBR_Delay >= LBR_Delay_Total Then LBR_Delay = LBR_Delay_Total: CooldownLog = CooldownLogTotal: If CooldownLog > CooldownLogTotal Then CooldownLog = CooldownLogTotal + LBR_Delay = LBR_Delay + 1: If LBR_Delay > LBR_Delay_Total Then LBR_Delay = LBR_Delay_Total + End If Case "NGINX" ' Added LBR_Delay >= LBR_Delay_Total for LBR_Delay and ConnectionsLog=true If RTMP_Bitrate1 < RTMP_BitrateLow1 And Timer_Fail_Stream1 = 0 And CooldownLog = 0 And LBR_Delay >= LBR_Delay_Total Then Multi0_CMD_LBR @@ -4745,6 +5118,12 @@ Sub Multi0 (serverType$) Case Is > SLS_BitrateLow1, 0 LBR_Delay = LBR_Delay - 1: If LBR_Delay <= 0 Then LBR_Delay = 0 End Select + Case "RESTREAMER" + ' Bitrate can be used here. Case 960 - 1040 is invalid. + Select Case SLS_Bitrate1 + Case Is > RESTREAMER_BitrateLow1, 0 + LBR_Delay = LBR_Delay - 1: If LBR_Delay <= 0 Then LBR_Delay = 0 + End Select Case "NGINX" ' Bitrate can be used here. Case 960 - 1040 is invalid. Select Case RTMP_Bitrate1 @@ -4764,8 +5143,8 @@ Sub Multi0 (serverType$) End If End If - If tmpFileRestore = TRUE Then - tmpFileRestore = FALSE + If tmpFileRestore = True Then + tmpFileRestore = False Else If __FileStatusOutput Then statusOutputToFile "[FULL BANDWIDTH]:[STREAM] (" + _Trim$(Str$(CooldownDuration)) + " sec)" If ConnectionsLog Then statusConnectionsLogToFile "[INFO] Bandwidth restored for stream, " + _Trim$(Str$(ConnectionsLog1Count)) + " times (" + _Trim$(Str$(CooldownDuration)) + " sec)" @@ -4824,7 +5203,7 @@ Sub Multi1 (serverType As String, serverSelection As _Byte) End If On Error GoTo App_Fail - App_Refresh = TRUE + App_Refresh = True @@ -4899,13 +5278,13 @@ Sub Multi1 (serverType As String, serverSelection As _Byte) Open filePrevious_ms For Input As #92 If EOF(92) Then - RefreshDisplayRequest = TRUE + RefreshDisplayRequest = True Error_msg = "- Unable to read " + c34 + "MediaSource1" + c34 + ", check " + c34 + "config.ini" + c34 + " & OBS to confirm it's correct." + Chr$(10) + "- If OBS is open, check communication is available via Node.js & obs-websocket-js.": Error_msg_2$ = "- If Node.js is installed, check " + c34 + "Restart playback" + c34 + " is disabled in OBS " + c34 + "Media Source" + c34 + "." + Chr$(10) + "- If " + c34 + "Restart playback" + c34 + " is disabled, check OBS WebSocket options are correctly set. (Error: #7)" _Delay 3 GoTo LOF922 End If - If LOF(92) = 0 Then NoKill = TRUE: GoTo LOF922 ' Overkill with EOF checking, but just being safe + If LOF(92) = 0 Then NoKill = True: GoTo LOF922 ' Overkill with EOF checking, but just being safe Line Input #92, file92 End If @@ -4946,7 +5325,7 @@ Sub Multi1 (serverType As String, serverSelection As _Byte) If Not HTTP_Enabled Then - If EOF(92) Then RefreshDisplayRequest = TRUE: Error_msg = "- Unable to read " + c34 + "MediaSource2" + c34 + ", check " + c34 + "config.ini" + c34 + " & OBS to confirm it's correct." + Chr$(10) + "- If OBS is open, check communication is available via Node.js & obs-websocket-js.": Error_msg_2$ = "- If Node.js is installed, check " + c34 + "Restart playback" + c34 + " is disabled in OBS " + c34 + "Media Source" + c34 + "." + Chr$(10) + "- If " + c34 + "Restart playback" + c34 + " is disabled, check OBS WebSocket options are correctly set. (Error: #8)": _Delay 3: GoTo LOF922 + If EOF(92) Then RefreshDisplayRequest = True: Error_msg = "- Unable to read " + c34 + "MediaSource2" + c34 + ", check " + c34 + "config.ini" + c34 + " & OBS to confirm it's correct." + Chr$(10) + "- If OBS is open, check communication is available via Node.js & obs-websocket-js.": Error_msg_2$ = "- If Node.js is installed, check " + c34 + "Restart playback" + c34 + " is disabled in OBS " + c34 + "Media Source" + c34 + "." + Chr$(10) + "- If " + c34 + "Restart playback" + c34 + " is disabled, check OBS WebSocket options are correctly set. (Error: #8)": _Delay 3: GoTo LOF922 Line Input #92, file92 End If @@ -4984,15 +5363,15 @@ Sub Multi1 (serverType As String, serverSelection As _Byte) End If - If NoKill = TRUE Then NoKill = FALSE Else If _FileExists(filePrevious_ms) Then Kill filePrevious_ms + If NoKill = True Then NoKill = False Else If _FileExists(filePrevious_ms) Then Kill filePrevious_ms On Error GoTo 0 - App_Refresh = FALSE + App_Refresh = False Case "SLS" If __SLS_1_Enabled Then sls_client_connect If SLS_2_Active Then sls_client_connect_2 ' SLS 2nd IP On Error GoTo 0 - App_Refresh = FALSE + App_Refresh = False If Dummy_Server <> "" Then DummyServer Dummy_Server @@ -5001,7 +5380,6 @@ Sub Multi1 (serverType As String, serverSelection As _Byte) ' Discover if one or two streams are running If Not SLS_2_Active Then - Do SLS_streams_seek = InStr(SLS_streams_seek + 1, sls_stats.xml, "uptime") If SLS_streams_seek Then @@ -5088,7 +5466,7 @@ Sub Multi1 (serverType As String, serverSelection As _Byte) ' ---------- BELABOX detection ---------- - BELABOX_1_Found = FALSE: BELABOX_2_Found = FALSE + BELABOX_1_Found = False: BELABOX_2_Found = False @@ -5118,9 +5496,9 @@ Sub Multi1 (serverType As String, serverSelection As _Byte) If InStr(sls_stats.xml, SLS_Publisher1) Then SLS_Bitrate1 = Val(Mid$(sls_stats.xml, (InStr(sls_stats.xml, c34 + "bitrate" + c34 + ":") + Len(c34 + "bitrate" + c34 + ":")), 6)) If _Trim$(Mid$(sls_stats.xml, InStr(InStr(sls_stats.xml, SLS_Publisher1), sls_stats.xml, c34 + "connected" + c34 + ":") + 12, 5)) = "true" Then - BELABOX_1_Found = TRUE: BELABOX_1_Uptime = BELABOX_1_Uptime + 1: SLS_Uptime1 = BELABOX_1_Uptime: BELABOX_1_Offline = FALSE ' Uptime not reported in JSON data + BELABOX_1_Found = True: BELABOX_1_Uptime = BELABOX_1_Uptime + 1: SLS_Uptime1 = BELABOX_1_Uptime: BELABOX_1_Offline = False ' Uptime not reported in JSON data ElseIf Left$(_Trim$(Mid$(sls_stats.xml, InStr(InStr(sls_stats.xml, SLS_Publisher1), sls_stats.xml, c34 + "connected" + c34 + ":") + 12, 5)), 4) = "fals" Then - BELABOX_1_Found = TRUE: BELABOX_1_Offline = TRUE: BELABOX_1_Uptime = 0 + BELABOX_1_Found = True: BELABOX_1_Offline = True: BELABOX_1_Uptime = 0 End If End If @@ -5129,9 +5507,9 @@ Sub Multi1 (serverType As String, serverSelection As _Byte) If InStr(sls_stats.xml, SLS_Publisher2) Then SLS_Bitrate2 = Val(Mid$(sls_stats.xml, (InStr(sls_stats.xml, c34 + "bitrate" + c34 + ":") + Len(c34 + "bitrate" + c34 + ":")), 6)) If _Trim$(Mid$(sls_stats.xml, InStr(InStr(sls_stats.xml, SLS_Publisher2), sls_stats.xml, c34 + "connected" + c34 + ":") + 12, 5)) = "true" Then - BELABOX_2_Found = TRUE: BELABOX_2_Uptime = BELABOX_2_Uptime + 1: SLS_Uptime2 = BELABOX_2_Uptime ' Uptime not reported in JSON data + BELABOX_2_Found = True: BELABOX_2_Uptime = BELABOX_2_Uptime + 1: SLS_Uptime2 = BELABOX_2_Uptime ' Uptime not reported in JSON data ElseIf Left$(_Trim$(Mid$(sls_stats.xml, InStr(InStr(sls_stats.xml, SLS_Publisher2), sls_stats.xml, c34 + "connected" + c34 + ":") + 12, 5)), 4) = "fals" Then - BELABOX_2_Found = TRUE: BELABOX_2_Offline = TRUE: BELABOX_2_Uptime = 0 + BELABOX_2_Found = True: BELABOX_2_Offline = True: BELABOX_2_Uptime = 0 End If End If @@ -5141,9 +5519,9 @@ Sub Multi1 (serverType As String, serverSelection As _Byte) SLS_Bitrate1 = Val(Mid$(sls_stats.xml, InStr(InStr(sls_stats.xml, SLS_Publisher1), sls_stats.xml, "bitrate") + 9, 6)) If _Trim$(Mid$(sls_stats.xml, InStr(InStr(sls_stats.xml, SLS_Publisher1), sls_stats.xml, c34 + "connected" + c34 + ":") + 12, 5)) = "true" Then - BELABOX_1_Found = TRUE: BELABOX_1_Uptime = BELABOX_1_Uptime + 1: SLS_Uptime1 = BELABOX_1_Uptime: BELABOX_1_Offline = FALSE ' Uptime not reported in JSON data + BELABOX_1_Found = True: BELABOX_1_Uptime = BELABOX_1_Uptime + 1: SLS_Uptime1 = BELABOX_1_Uptime: BELABOX_1_Offline = False ' Uptime not reported in JSON data ElseIf Left$(_Trim$(Mid$(sls_stats.xml, InStr(InStr(sls_stats.xml, SLS_Publisher1), sls_stats.xml, c34 + "connected" + c34 + ":") + 12, 5)), 4) = "fals" Then - BELABOX_1_Found = TRUE: BELABOX_1_Offline = TRUE: BELABOX_1_Uptime = 0 + BELABOX_1_Found = True: BELABOX_1_Offline = True: BELABOX_1_Uptime = 0 End If End If @@ -5152,9 +5530,9 @@ Sub Multi1 (serverType As String, serverSelection As _Byte) SLS_Bitrate2 = Val(Mid$(sls_stats.xml, InStr(InStr(sls_stats.xml, SLS_Publisher2), sls_stats.xml, "bitrate") + 9, 6)) If _Trim$(Mid$(sls_stats.xml, InStr(InStr(sls_stats.xml, SLS_Publisher2), sls_stats.xml, c34 + "connected" + c34 + ":") + 12, 5)) = "true" Then - BELABOX_2_Found = TRUE: BELABOX_2_Uptime = BELABOX_2_Uptime + 1: SLS_Uptime2 = BELABOX_2_Uptime ' Uptime not reported in JSON data + BELABOX_2_Found = True: BELABOX_2_Uptime = BELABOX_2_Uptime + 1: SLS_Uptime2 = BELABOX_2_Uptime ' Uptime not reported in JSON data ElseIf Left$(_Trim$(Mid$(sls_stats.xml, InStr(InStr(sls_stats.xml, SLS_Publisher2), sls_stats.xml, c34 + "connected" + c34 + ":") + 12, 5)), 4) = "fals" Then - BELABOX_2_Found = TRUE: BELABOX_2_Offline = TRUE: BELABOX_2_Uptime = 0 + BELABOX_2_Found = True: BELABOX_2_Offline = True: BELABOX_2_Uptime = 0 End If End If @@ -5201,9 +5579,9 @@ Sub Multi1 (serverType As String, serverSelection As _Byte) If InStr(sls_stats.xml, SLS_Publisher1) Then SLS_Bitrate1 = Val(Mid$(sls_stats.xml, (InStr(sls_stats.xml, c34 + "bitrate" + c34 + ":") + Len(c34 + "bitrate" + c34 + ":")), 6)) If _Trim$(Mid$(sls_stats.xml, InStr(InStr(sls_stats.xml, SLS_Publisher1), sls_stats.xml, c34 + "connected" + c34 + ":") + 12, 5)) = "true" Then - BELABOX_1_Found = TRUE: BELABOX_1_Uptime = BELABOX_1_Uptime + 1: SLS_Uptime1 = BELABOX_1_Uptime: BELABOX_1_Offline = FALSE ' Uptime not reported in JSON data + BELABOX_1_Found = True: BELABOX_1_Uptime = BELABOX_1_Uptime + 1: SLS_Uptime1 = BELABOX_1_Uptime: BELABOX_1_Offline = False ' Uptime not reported in JSON data ElseIf Left$(_Trim$(Mid$(sls_stats.xml, InStr(InStr(sls_stats.xml, SLS_Publisher1), sls_stats.xml, c34 + "connected" + c34 + ":") + 12, 5)), 4) = "fals" Then - BELABOX_1_Found = TRUE: BELABOX_1_Offline = TRUE: BELABOX_1_Uptime = 0 + BELABOX_1_Found = True: BELABOX_1_Offline = True: BELABOX_1_Uptime = 0 End If End If @@ -5212,9 +5590,9 @@ Sub Multi1 (serverType As String, serverSelection As _Byte) If InStr(sls_stats_2.xml, SLS_Publisher2) Then SLS_Bitrate2 = Val(Mid$(sls_stats_2.xml, (InStr(sls_stats_2.xml, c34 + "bitrate" + c34 + ":") + Len(c34 + "bitrate" + c34 + ":")), 6)) If _Trim$(Mid$(sls_stats_2.xml, InStr(InStr(sls_stats_2.xml, SLS_Publisher2), sls_stats_2.xml, c34 + "connected" + c34 + ":") + 12, 5)) = "true" Then - BELABOX_2_Found = TRUE: BELABOX_2_Uptime = BELABOX_2_Uptime + 1: SLS_Uptime2 = BELABOX_2_Uptime: BELABOX_2_Offline = FALSE ' Uptime not reported in JSON data + BELABOX_2_Found = True: BELABOX_2_Uptime = BELABOX_2_Uptime + 1: SLS_Uptime2 = BELABOX_2_Uptime: BELABOX_2_Offline = False ' Uptime not reported in JSON data ElseIf Left$(_Trim$(Mid$(sls_stats_2.xml, InStr(InStr(sls_stats_2.xml, SLS_Publisher2), sls_stats_2.xml, c34 + "connected" + c34 + ":") + 12, 5)), 4) = "fals" Then - BELABOX_2_Found = TRUE: BELABOX_2_Offline = TRUE: BELABOX_2_Uptime = 0 + BELABOX_2_Found = True: BELABOX_2_Offline = True: BELABOX_2_Uptime = 0 End If End If @@ -5224,9 +5602,9 @@ Sub Multi1 (serverType As String, serverSelection As _Byte) SLS_Bitrate1 = Val(Mid$(sls_stats.xml, InStr(InStr(sls_stats.xml, SLS_Publisher1), sls_stats.xml, "bitrate") + 9, 6)) If _Trim$(Mid$(sls_stats.xml, InStr(InStr(sls_stats.xml, SLS_Publisher1), sls_stats.xml, c34 + "connected" + c34 + ":") + 12, 5)) = "true" Then - BELABOX_1_Found = TRUE: BELABOX_1_Uptime = BELABOX_1_Uptime + 1: SLS_Uptime1 = BELABOX_1_Uptime: BELABOX_1_Offline = FALSE ' Uptime not reported in JSON data + BELABOX_1_Found = True: BELABOX_1_Uptime = BELABOX_1_Uptime + 1: SLS_Uptime1 = BELABOX_1_Uptime: BELABOX_1_Offline = False ' Uptime not reported in JSON data ElseIf Left$(_Trim$(Mid$(sls_stats.xml, InStr(InStr(sls_stats.xml, SLS_Publisher1), sls_stats.xml, c34 + "connected" + c34 + ":") + 12, 5)), 4) = "false" Then - BELABOX_1_Found = TRUE: BELABOX_1_Offline = TRUE: BELABOX_1_Uptime = 0 + BELABOX_1_Found = True: BELABOX_1_Offline = True: BELABOX_1_Uptime = 0 End If End If @@ -5235,9 +5613,9 @@ Sub Multi1 (serverType As String, serverSelection As _Byte) SLS_Bitrate2 = Val(Mid$(sls_stats_2.xml, InStr(InStr(sls_stats_2.xml, SLS_Publisher2), sls_stats_2.xml, "bitrate") + 9, 6)) If _Trim$(Mid$(sls_stats_2.xml, InStr(InStr(sls_stats_2.xml, SLS_Publisher2), sls_stats_2.xml, c34 + "connected" + c34 + ":") + 12, 5)) = "true" Then - BELABOX_2_Found = TRUE: BELABOX_2_Uptime = BELABOX_2_Uptime + 1: SLS_Uptime2 = BELABOX_2_Uptime ' Uptime not reported in JSON data + BELABOX_2_Found = True: BELABOX_2_Uptime = BELABOX_2_Uptime + 1: SLS_Uptime2 = BELABOX_2_Uptime ' Uptime not reported in JSON data ElseIf Left$(_Trim$(Mid$(sls_stats_2.xml, InStr(InStr(sls_stats_2.xml, SLS_Publisher2), sls_stats_2.xml, c34 + "connected" + c34 + ":") + 12, 5)), 4) = "fals" Then - BELABOX_2_Found = TRUE: BELABOX_2_Offline = TRUE: BELABOX_2_Uptime = 0 + BELABOX_2_Found = True: BELABOX_2_Offline = True: BELABOX_2_Uptime = 0 End If End If @@ -5270,11 +5648,65 @@ Sub Multi1 (serverType As String, serverSelection As _Byte) If SLS_Bitrate2 < SLS_BitrateFail2 Then MediaSource2TimeMS = 0 MediaSource2Time = MediaSource2TimeMS / 1000 End If + + Case "RESTREAMER" + + If __RESTREAMER_1_Enabled Or __RESTREAMER_2_Enabled Then restreamer_client_connect + + On Error GoTo 0 + App_Refresh = False + + If Dummy_Server <> "" Then DummyServer Dummy_Server + + If GetKeyRestreamer("message", restreamer_stats.xml) = "Missing or invalid JWT token" Then RefreshDisplayRequest = True: Error_msg$ = "- Unable to connect, check if " + c34 + RESTREAMER_Server_IP + ":" + RESTREAMER_Server_Port + c34 + " is correct. Confirm correct username and password." + Chr$(10) + "- Restreamer response is " + c34 + "Missing or invalid JWT token" + c34 + ". (Error: #18)": _Delay 3: Exit Sub + + If __RESTREAMER_1_Enabled Then + If InStr(restreamer_stats.xml, RESTREAMER_ID_1) Then + RESTREAMER_Bitrate1 = Int(Val(GetKeyRestreamer("bandwidth_rx_kbit", Mid$(restreamer_stats.xml, InStr(restreamer_stats.xml, RESTREAMER_ID_1))))) + If RESTREAMER_Bitrate1 > 0 Then RESTREAMER_Uptime1 = RESTREAMER_Uptime1 + 1 Else RESTREAMER_Uptime1 = 0 + SLS_Uptime1 = RESTREAMER_Uptime1 + Else + RESTREAMER_Bitrate1 = 0 + RESTREAMER_Uptime1 = 0 + End If + SLS_Bitrate1 = RESTREAMER_Bitrate1 + End If + + If __RESTREAMER_2_Enabled Then + If InStr(restreamer_stats.xml, RESTREAMER_ID_2) Then + RESTREAMER_Bitrate2 = Int(Val(GetKeyRestreamer("bandwidth_rx_kbit", Mid$(restreamer_stats.xml, InStr(restreamer_stats.xml, RESTREAMER_ID_2))))) + If RESTREAMER_Bitrate2 > 0 Then RESTREAMER_Uptime2 = RESTREAMER_Uptime2 + 1 Else RESTREAMER_Uptime2 = 0 + SLS_Uptime2 = RESTREAMER_Uptime2 + Else + RESTREAMER_Bitrate2 = 0 + RESTREAMER_Uptime2 = 0 + End If + SLS_Bitrate2 = RESTREAMER_Bitrate2 + End If + + + ' Uptime + If serverSelection%% = 0 Or serverSelection%% = 1 Then + MediaSource1Time = SLS_Uptime1 + MediaSource1TimeMS = SLS_Uptime1 * 1000 + ' Check BitrateFail1 - if bitrate is below fail value, appear to be 0 + If RESTREAMER_Bitrate1 < RESTREAMER_BitrateFail1 Then MediaSource1TimeMS = 0 + MediaSource1Time = MediaSource1TimeMS / 1000 + End If + + If serverSelection%% = 0 Or serverSelection%% = 2 Then + MediaSource2Time = SLS_Uptime2 + MediaSource2TimeMS = SLS_Uptime2 * 1000 + ' Check BitrateFail2 - if bitrate is below fail value, appear to be 0 + If RESTREAMER_Bitrate2 < RESTREAMER_BitrateFail2 Then MediaSource2TimeMS = 0 + MediaSource2Time = MediaSource2TimeMS / 1000 + End If + Case "NGINX" rtmp_client_connect On Error GoTo App_Fail - App_Refresh = TRUE + App_Refresh = True ' name: ' time: ' bytes_in: ' (1) = live ' (1) time #1 ' (1) total @@ -5437,7 +5869,7 @@ Sub Multi1 (serverType As String, serverSelection As _Byte) End Select On Error GoTo 0 - App_Refresh = FALSE + App_Refresh = False If serverSelection%% = 0 Or serverSelection%% = 1 Then MediaSource1TimeMSOffset = MediaSource1TimeMS - MediaSource1TimeLog @@ -5500,6 +5932,30 @@ Sub Multi1 (serverType As String, serverSelection As _Byte) LBR_Delay_Plus = 1 End If End If + Case "RESTREAMER" + ' Added LBR_Delay >= LBR_Delay_Total for LBR_Delay and ConnectionsLog=true + If serverSelection%% = 0 Or serverSelection%% = 1 Then + If RESTREAMER_Bitrate1 < RESTREAMER_BitrateLow1 And Timer_Fail_Stream1 = 0 And CooldownLog = 0 And LBR_Delay >= LBR_Delay_Total Then Multi1_CMD_LBR_1 + + If RESTREAMER_Bitrate1 < RESTREAMER_BitrateLow1 And Timer_Fail_Stream1 = 0 Then + ' LBR_Delay + If LBR_Delay >= LBR_Delay_Total Then LBR_Delay = LBR_Delay_Total: CooldownLog = CooldownLogTotal: If CooldownLog > CooldownLogTotal Then CooldownLog = CooldownLogTotal + LBR_Delay_Plus = 1 + End If + Multi1_CMD_LBR_2 + End If + + ' Added LBR_Delay >= LBR_Delay_Total for LBR_Delay and ConnectionsLog=true + If serverSelection%% = 0 Or serverSelection%% = 2 Then + If RESTREAMER_Bitrate2 < RESTREAMER_BitrateLow2 And Timer_Fail_Stream2 = 0 And CooldownLog = 0 And LBR_Delay >= LBR_Delay_Total And Not Scene2LBInactive Then Multi1_CMD_LBR_3 + + ' Disable Scene #2 LBR if Scene2LBRDisabled is true + If RESTREAMER_Bitrate2 < RESTREAMER_BitrateLow2 And Timer_Fail_Stream2 = 0 And Not Scene2LBInactive Then + ' LBR_Delay + If LBR_Delay >= LBR_Delay_Total Then LBR_Delay = LBR_Delay_Total: CooldownLog = CooldownLogTotal: If CooldownLog > CooldownLogTotal Then CooldownLog = CooldownLogTotal + LBR_Delay_Plus = 1 + End If + End If Case "NGINX" ' Added LBR_Delay >= LBR_Delay_Total for LBR_Delay and ConnectionsLog=true If serverSelection%% = 0 Or serverSelection%% = 1 Then @@ -5555,15 +6011,15 @@ Sub Multi1_CMD_LBR_1 If Right$(Scene_Current, 4) <> " LBR" And Right$(previousScene, 4) <> " LBR" Then ' Only set variable if not a Low Bitrate scene ' titleScene1 cannot be changed so previousScene is used to change to LBR scene ' this section changes to LBR scene but does not change back - If streamsUp = "1" Then SRR = TRUE: titleScene1 = previousScene: Scene_Current = titleScene1 ' For LBR title temp - If streamsUp = "12" Then SRR = TRUE: titleScene12 = previousScene: Scene_Current = titleScene12 ' For LBR title temp + If streamsUp = "1" Then SRR = True: titleScene1 = previousScene: Scene_Current = titleScene1 ' For LBR title temp + If streamsUp = "12" Then SRR = True: titleScene12 = previousScene: Scene_Current = titleScene12 ' For LBR title temp End If End If ' Fix for LBR scene when ReturnPreviousScene=true and ReturnPreviousSceneRemember=false If SRR Then If HTTP_Communication_Native Then http_client_connect "Set", previousScene + " LBR" Else Shell _Hide _DontWait shell_cmd_1 + previousScene + " LBR" + shell_cmd_2 - SRR = FALSE + SRR = False Else ' These two lines were the only code prior to LBR fix If Scene_Current = titleScene1 Then @@ -5598,13 +6054,13 @@ Sub Multi1_CMD_LBR_2 If streamsUp = "1" Then If previousScene <> titleScene1 Or Scene_Current <> titleScene1 Then - SRR = TRUE + SRR = True End If End If If streamsUp = "12" Then If previousScene <> titleScene12 Or Scene_Current <> titleScene12 Then - SRR = TRUE + SRR = True End If End If @@ -5617,7 +6073,7 @@ Sub Multi1_CMD_LBR_2 End If ' titleScene change should not be permanent when ReturnPreviousSceneRemember=false, so use titleScene Temp to revert titleScene1 = titleScene1Temp: titleScene2 = titleScene2Temp: titleScene12 = titleScene12Temp - SRR = FALSE + SRR = False Else ' Change scene for multi camera ' These two lines were the only code prior to LBR fix @@ -5632,8 +6088,8 @@ Sub Multi1_CMD_LBR_2 End If On Error GoTo 0 - If tmpFileRestore = TRUE Then - tmpFileRestore = FALSE + If tmpFileRestore = True Then + tmpFileRestore = False Else If __FileStatusOutput Then statusOutputToFile "[FULL BANDWIDTH]:[CAMERA #1] (" + _Trim$(Str$(CooldownDuration)) + " sec)" If ConnectionsLog Then statusConnectionsLogToFile "[INFO] Bandwidth restored for stream #1, " + _Trim$(Str$(ConnectionsLog1Count)) + " times (" + _Trim$(Str$(CooldownDuration)) + " sec)" @@ -5671,8 +6127,8 @@ Sub Multi1_CMD_LBR_3 If Right$(Scene_Current, 4) <> " LBR" And Right$(previousScene, 4) <> " LBR" Then ' Only set variable if not a Low Bitrate scene ' titleScene2 cannot be changed so previousScene is used to change to LBR scene ' this section changes to LBR scene but does not change back - If streamsUp = "2" Then SRR = TRUE: titleScene2 = previousScene: Scene_Current = titleScene2 ' For LBR title temp - If streamsUp = "12" Then SRR = TRUE: titleScene12 = previousScene: Scene_Current = titleScene12 ' For LBR title temp + If streamsUp = "2" Then SRR = True: titleScene2 = previousScene: Scene_Current = titleScene2 ' For LBR title temp + If streamsUp = "12" Then SRR = True: titleScene12 = previousScene: Scene_Current = titleScene12 ' For LBR title temp End If End If @@ -5680,7 +6136,7 @@ Sub Multi1_CMD_LBR_3 ' Fix for LBR scene when ReturnPreviousScene=true and ReturnPreviousSceneRemember=false If SRR Then If HTTP_Communication_Native Then http_client_connect "Set", previousScene + " LBR" Else Shell _Hide _DontWait shell_cmd_1 + previousScene + " LBR" + shell_cmd_2 - SRR = FALSE + SRR = False Else ' These two lines were the only code prior to LBR fix If Scene_Current = titleScene2 Then @@ -5721,6 +6177,14 @@ Sub Multi1_CMD_LBR_4 Case Is > SLS_BitrateLow2, 0 If Server_2 = "SLS" Then LBR_Delay_Minus = 1 End Select + Select Case RESTREAMER_Bitrate1 ' Bitrate can be used here. Case 960 - 1040 is invalid. + Case Is > RESTREAMER_BitrateLow1, 0 + If Server_1 = "RESTREAMER" Then LBR_Delay_Minus = 1 + End Select + Select Case RESTREAMER_Bitrate2 ' Bitrate can be used here. Case 960 - 1040 is invalid. + Case Is > RESTREAMER_BitrateLow2, 0 + If Server_2 = "RESTREAMER" Then LBR_Delay_Minus = 1 + End Select Select Case RTMP_Bitrate1 ' Bitrate can be used here. Case 960 - 1040 is invalid. Case Is > RTMP_BitrateLow1, 0 If Server_1 = "NGINX" Then LBR_Delay_Minus = 1 @@ -5811,13 +6275,13 @@ Sub Multi1_CMD_LBR_4 If streamsUp = "2" Then If previousScene <> titleScene2 Or Scene_Current <> titleScene2 Then - SRR = TRUE + SRR = True End If End If If streamsUp = "12" Then If previousScene <> titleScene12 Or Scene_Current <> titleScene12 Then - SRR = TRUE + SRR = True End If End If @@ -5830,7 +6294,7 @@ Sub Multi1_CMD_LBR_4 End If ' titleScene change should not be permanent when ReturnPreviousSceneRemember=false, so use titleScene Temp to revert titleScene1 = titleScene1Temp: titleScene2 = titleScene2Temp: titleScene12 = titleScene12Temp - SRR = FALSE + SRR = False Else ' Change scene for multi camera ' These two lines were the only code prior to LBR fix @@ -5845,8 +6309,8 @@ Sub Multi1_CMD_LBR_4 End If On Error GoTo 0 - If tmpFileRestore = TRUE Then - tmpFileRestore = FALSE + If tmpFileRestore = True Then + tmpFileRestore = False Else If __FileStatusOutput Then statusOutputToFile "[FULL BANDWIDTH]:[CAMERA #2] (" + _Trim$(Str$(CooldownDuration)) + " sec)" If ConnectionsLog Then statusConnectionsLogToFile "[INFO] Bandwidth restored for stream #2, " + _Trim$(Str$(ConnectionsLog1Count)) + " times (" + _Trim$(Str$(CooldownDuration)) + " sec)" @@ -5938,36 +6402,41 @@ Sub Timer01 ' Get Media Source times (1 stream) ------------------------------------------------------------------------------------------------------------------------------ If Not __MultiCameraSwitch Then - If Not __SLS_1_Enabled And Not __RTMP_1_Enabled Then Multi0 "SRT": Server_1 = "SRT" - If __SLS_1_Enabled And Not __RTMP_1_Enabled Then Multi0 "SLS": Server_1 = "SLS" - If __RTMP_1_Enabled And Not __SLS_1_Enabled Then Multi0 "NGINX": Server_1 = "NGINX" + If Not __SLS_1_Enabled And Not __RTMP_1_Enabled And Not __RESTREAMER_1_Enabled Then Multi0 "SRT": Server_1 = "SRT" + If __SLS_1_Enabled And Not __RTMP_1_Enabled And Not __RESTREAMER_1_Enabled Then Multi0 "SLS": Server_1 = "SLS" + If __RTMP_1_Enabled And Not __SLS_1_Enabled And Not __RESTREAMER_1_Enabled Then Multi0 "NGINX": Server_1 = "NGINX" + If __RESTREAMER_1_Enabled And Not __SLS_1_Enabled And Not __RTMP_1_Enabled Then Multi0 "RESTREAMER": Server_1 = "RESTREAMER" End If + ' Get Media Source times (2 streams) ------------------------------------------------------------------------------------------------------------------------------ If __MultiCameraSwitch Then - ' Get Media Source times (2 streams) ------------------------------------------------------------------------------------------------------------------------------ - - If Not SLS_Active And Not RTMP_Active Then - Multi1 "SRT", 0: Server_1 = "SRT": Server_2 = "SRT" - End If - - If SLS_Active And Not RTMP_Active Then - If __SLS_1_Enabled And __SLS_2_Enabled Then Multi1 "SLS", 0: Server_1 = "SLS": Server_2 = "SLS" - If __SLS_1_Enabled And Not __SLS_2_Enabled Then Multi1 "SLS", 1: Multi1 "SRT", 2: Server_1 = "SLS": Server_2 = "SRT" - If Not __SLS_1_Enabled And __SLS_2_Enabled Then Multi1 "SRT", 1: Multi1 "SLS", 2: Server_1 = "SRT": Server_2 = "SLS" - End If - - If Not SLS_Active And RTMP_Active Then - If __RTMP_1_Enabled And __RTMP_2_Enabled Then Multi1 "NGINX", 0: Server_1 = "NGINX": Server_2 = "NGINX" - If __RTMP_1_Enabled And Not __RTMP_2_Enabled Then Multi1 "NGINX", 1: Multi1 "SRT", 2: Server_1 = "NGINX": Server_2 = "SRT" - If Not __RTMP_1_Enabled And __RTMP_2_Enabled Then Multi1 "SRT", 1: Multi1 "NGINX", 2: Server_1 = "SRT": Server_2 = "NGINX" - End If - - If SLS_Active And RTMP_Active Then - If __SLS_1_Enabled And Not __SLS_2_Enabled Then Multi1 "SLS", 1: Multi1 "NGINX", 2: Server_1 = "SLS": Server_2 = "NGINX" - If Not __SLS_1_Enabled And __SLS_2_Enabled Then Multi1 "NGINX", 1: Multi1 "SLS", 2: Server_1 = "NGINX": Server_2 = "SLS" - End If + ' OBS SRT only + If Not SLS_Active And Not RTMP_Active And Not RESTREAMER_Active Then Multi1 "SRT", 0: Server_1 = "SRT": Server_2 = "SRT": GoTo Servers_Found + + ' Both true for same server (no OBS SRT) + If __SLS_1_Enabled And __SLS_2_Enabled Then Multi1 "SLS", 0: Server_1 = "SLS": Server_2 = "SLS": GoTo Servers_Found + If __RTMP_1_Enabled And __RTMP_2_Enabled Then Multi1 "NGINX", 0: Server_1 = "NGINX": Server_2 = "NGINX": GoTo Servers_Found + If __RESTREAMER_1_Enabled And __RESTREAMER_2_Enabled Then Multi1 "RESTREAMER", 0: Server_1 = "RESTREAMER": Server_2 = "RESTREAMER": GoTo Servers_Found + + ' Mixed servers (no OBS SRT) + If __SLS_1_Enabled And __RTMP_2_Enabled Then Multi1 "SLS", 1: Multi1 "RTMP", 2: Server_1 = "SLS": Server_2 = "RTMP": GoTo Servers_Found + If __RTMP_1_Enabled And __SLS_2_Enabled Then Multi1 "RTMP", 1: Multi1 "SLS", 2: Server_1 = "RTMP": Server_2 = "SLS": GoTo Servers_Found + If __SLS_1_Enabled And __RESTREAMER_2_Enabled Then Multi1 "SLS", 1: Multi1 "RESTREAMER", 2: Server_1 = "SLS": Server_2 = "RESTREAMER": GoTo Servers_Found + If __RESTREAMER_1_Enabled And __SLS_2_Enabled Then Multi1 "RESTREAMER", 1: Multi1 "SLS", 2: Server_1 = "RESTREAMER": Server_2 = "SLS": GoTo Servers_Found + If __RTMP_1_Enabled And __RESTREAMER_2_Enabled Then Multi1 "RTMP", 1: Multi1 "RESTREAMER", 2: Server_1 = "RTMP": Server_2 = "RESTREAMER": GoTo Servers_Found + If __RESTREAMER_1_Enabled And __RTMP_2_Enabled Then Multi1 "RESTREAMER", 1: Multi1 "RTMP", 2: Server_1 = "RESTREAMER": Server_2 = "RTMP": GoTo Servers_Found + + ' Mixed servers (with OBS SRT) + If __SLS_1_Enabled And Not __SLS_2_Enabled And Not RTMP_Active And Not RESTREAMER_Active Then Multi1 "SLS", 1: Multi1 "SRT", 2: Server_1 = "SLS": Server_2 = "SRT": GoTo Servers_Found + If __SLS_2_Enabled And Not __SLS_1_Enabled And Not RTMP_Active And Not RESTREAMER_Active Then Multi1 "SRT", 1: Multi1 "SLS", 2: Server_1 = "SRT": Server_2 = "SLS": GoTo Servers_Found + If __RTMP_1_Enabled And Not __RTMP_2_Enabled And Not SLS_Active And Not RESTREAMER_Active Then Multi1 "RTMP", 1: Multi1 "SRT", 2: Server_1 = "RTMP": Server_2 = "SRT": GoTo Servers_Found + If __RTMP_2_Enabled And Not __RTMP_1_Enabled And Not SLS_Active And Not RESTREAMER_Active Then Multi1 "SRT", 1: Multi1 "RTMP", 2: Server_1 = "SRT": Server_2 = "RTMP": GoTo Servers_Found + If __RESTREAMER_1_Enabled And Not __RESTREAMER_2_Enabled And Not RTMP_Active And Not SLS_Active Then Multi1 "RESTREAMER", 1: Multi1 "SRT", 2: Server_1 = "RESTREAMER": Server_2 = "SRT": GoTo Servers_Found + If __RESTREAMER_2_Enabled And Not __RESTREAMER_1_Enabled And Not RTMP_Active And Not SLS_Active Then Multi1 "SRT", 1: Multi1 "RESTREAMER", 2: Server_1 = "SRT": Server_2 = "RESTREAMER": GoTo Servers_Found + + Servers_Found: Multi1_CMD_LBR_4 ' Can't be called more than once End If @@ -6008,7 +6477,8 @@ Sub Timer01 If GetKey("obsWebSocketVersion", JSON) = "" Then Shell "%ComSpec% /C START " + c34 + c34 + " /MIN " + "taskkill /IM " + c34 + HTTP_Filename + c34 + " /F" _Delay 1 - Shell _DontWait "%ComSpec% /C START " + c34 + c34 + " /MIN " + c34 + HTTP_File + c34 + " --ws_url ws://" + OBS_URL + " --ws_password " + OBS_PW + Shell _DontWait "%ComSpec% /C START " + c34 + c34 + " /MIN " + c34 + HTTP_File + 'If HTTP_Auth_Key = "" Then Shell _DontWait "%ComSpec% /C START " + c34 + c34 + " /MIN " + c34 + HTTP_File + c34 + " --ws_url ws://" + OBS_URL + " --ws_password " + OBS_PW Else Shell _DontWait "%ComSpec% /C START " + c34 + c34 + " /MIN " + c34 + HTTP_File + c34 + " --ws_url ws://" + OBS_URL + " --ws_password " + OBS_PW + " --http_auth_key " + HTTP_Auth_Key End If Else Shell _Hide CMD_EXE_HTTP + c34 + "http://" + HTTP_Bind_Address + ":" + HTTP_Bind_Port + "/call/GetVersion" + c34 + " -o " + c34 + filePrevious_ms + c34 @@ -6019,7 +6489,8 @@ Sub Timer01 If GetKey("obsWebSocketVersion", JSON) = "" Then Shell "%ComSpec% /C START " + c34 + c34 + " /MIN " + "taskkill /IM " + c34 + HTTP_Filename + c34 + " /F" _Delay 1 - Shell _DontWait "%ComSpec% /C START " + c34 + c34 + " /MIN " + c34 + HTTP_File + c34 + " --ws_url ws://" + OBS_URL + " --ws_password " + OBS_PW + Shell _DontWait "%ComSpec% /C START " + c34 + c34 + " /MIN " + c34 + HTTP_File + 'If HTTP_Auth_Key = "" Then Shell _DontWait "%ComSpec% /C START " + c34 + c34 + " /MIN " + c34 + HTTP_File + c34 + " --ws_url ws://" + OBS_URL + " --ws_password " + OBS_PW Else Shell _DontWait "%ComSpec% /C START " + c34 + c34 + " /MIN " + c34 + HTTP_File + c34 + " --ws_url ws://" + OBS_URL + " --ws_password " + OBS_PW + " --http_auth_key " + HTTP_Auth_Key End If End If @@ -6031,9 +6502,9 @@ Sub Timer01 End If ' Display stuff on screen ------------------------------------------------------------------------------------------------------------------------------ - If Timer_Failed Then Timer_Failed = FALSE: ToolTip(Timer_Fail_CountLB) = "Last Failed: " + Time$: Tooltip_Mouse = TRUE - If Timer_Failed1 Then Timer_Failed1 = FALSE: ToolTip(Timer_Fail_CountLB) = "Last Failed: " + Time$: Tooltip_Mouse = TRUE - If Timer_Failed2 Then Timer_Failed2 = FALSE: ToolTip(Timer_Fail_Count_2LB) = "Last Failed: " + Time$: Tooltip_Mouse = TRUE + If Timer_Failed Then Timer_Failed = False: ToolTip(Timer_Fail_CountLB) = "Last Failed: " + Time$: Tooltip_Mouse = True + If Timer_Failed1 Then Timer_Failed1 = False: ToolTip(Timer_Fail_CountLB) = "Last Failed: " + Time$: Tooltip_Mouse = True + If Timer_Failed2 Then Timer_Failed2 = False: ToolTip(Timer_Fail_Count_2LB) = "Last Failed: " + Time$: Tooltip_Mouse = True If MediaSource1Time <> 0 Or MediaSource2Time <> 0 And RIST_MediaSource1Time_Count <= 4 And RIST_MediaSource2Time_Count <= 4 Then Timer_Fail = 0 ' SRT ' RIST mode @@ -6046,7 +6517,7 @@ Sub Timer01 Else If Timer_Fail >= 1 Then Control(Timer_FailLB).ForeColor = RED_WARNING - Stream_Down_Icon = TRUE + Stream_Down_Icon = True _Title "Stream Down! - Loopy SRT Monitor" iconStatus& = __imageMEM&("icon-x-16.png") If iconStatus& < -1 Then @@ -6060,7 +6531,7 @@ Sub Timer01 ' OK icon If Timer_Fail = 0 And Stream_Down_Icon Then - Stream_Down_Icon = FALSE + Stream_Down_Icon = False If Err = 0 Then _Title "Loopy SRT Monitor" $ExeIcon:'.\icon.ico' @@ -6076,8 +6547,8 @@ Sub Timer01 SetCaption (Timer_Fail_CountLB), LTrim$(Str$(Timer_Fail_Count)) + " / " + LTrim$(Str$(ConnectionsLog1Count)) + " times" End If - Control(Stream1LightLB).Hidden = TRUE - Control(Stream2LightLB).Hidden = TRUE + Control(Stream1LightLB).Hidden = True + Control(Stream2LightLB).Hidden = True If MediaSource1Time <= 1 Then Control(StreamLightLB).ForeColor = _RGB32(252, 20, 10) SetCaption (StreamLightLB), "____________________________________" @@ -6161,9 +6632,12 @@ Sub Timer01 ' SRT Live Server - If SLS_Active And Not __MultiCameraSwitch Then - If SLS_Bitrate1 > SLS_BitrateLow1 Then Control(MultiCameraSwitchStatusLB).ForeColor = GREEN_OK Else Control(MultiCameraSwitchStatusLB).ForeColor = RED_WARNING - If SLS_Bitrate1 < SLS_BitrateFail1 Or SLS_Bitrate1 = 0 Then Control(MultiCameraSwitchStatusLB).ForeColor = RED_FAIL + If SLS_Active And Not __MultiCameraSwitch Or RESTREAMER_Active And Not __MultiCameraSwitch Then + If __SLS_1_Enabled Then If SLS_Bitrate1 > SLS_BitrateLow1 Then Control(MultiCameraSwitchStatusLB).ForeColor = GREEN_OK Else Control(MultiCameraSwitchStatusLB).ForeColor = RED_WARNING + If __SLS_1_Enabled Then If SLS_Active Then If SLS_Bitrate1 < SLS_BitrateFail1 Or SLS_Bitrate1 = 0 Then Control(MultiCameraSwitchStatusLB).ForeColor = RED_FAIL + + If __RESTREAMER_1_Enabled Then If RESTREAMER_Bitrate1 > RESTREAMER_BitrateLow1 Then Control(MultiCameraSwitchStatusLB).ForeColor = GREEN_OK Else Control(MultiCameraSwitchStatusLB).ForeColor = RED_WARNING + If __RESTREAMER_1_Enabled Then If RESTREAMER_Active Then If RESTREAMER_Bitrate1 < RESTREAMER_BitrateFail1 Or RESTREAMER_Bitrate1 = 0 Then Control(MultiCameraSwitchStatusLB).ForeColor = RED_FAIL Select Case SLS_Bitrate1 Case 0 To 99 If SLS_Kbps_Precision <> "nerd" Then bitrateOutput1Display = _Trim$(Str$(Int(SLS_Bitrate1 / 100))) + " Kbps" Else bitrateOutput1Display = _Trim$(Str$(Int(SLS_Bitrate1))) + " Kbps" @@ -6174,10 +6648,15 @@ Sub Timer01 End Select End If - If SLS_Active And __MultiCameraSwitch Then - If Not __RTMP_1_Enabled Then If SLS_Bitrate1 > SLS_BitrateLow1 Then Control(Bitrate_Stream_1LB).ForeColor = GREEN_OK Else Control(Bitrate_Stream_1LB).ForeColor = RED_WARNING - If Not __RTMP_2_Enabled Then If SLS_Bitrate2 > SLS_BitrateLow2 Then Control(Bitrate_Stream_2LB).ForeColor = GREEN_OK Else Control(Bitrate_Stream_2LB).ForeColor = RED_WARNING - If Not __RTMP_1_Enabled Then If SLS_Bitrate1 < SLS_BitrateFail1 Or SLS_Bitrate1 = 0 Then Control(Bitrate_Stream_1LB).ForeColor = RED_FAIL: If SLS_Bitrate2 < SLS_BitrateFail2 Or SLS_Bitrate2 = 0 Then Control(Bitrate_Stream_2LB).ForeColor = RED_FAIL + If SLS_Active And __MultiCameraSwitch Or RESTREAMER_Active And __MultiCameraSwitch Then + If Not __RTMP_1_Enabled And __SLS_1_Enabled Then If SLS_Bitrate1 > SLS_BitrateLow1 Then Control(Bitrate_Stream_1LB).ForeColor = GREEN_OK Else Control(Bitrate_Stream_1LB).ForeColor = RED_WARNING + If Not __RTMP_2_Enabled And __SLS_2_Enabled Then If SLS_Bitrate2 > SLS_BitrateLow2 Then Control(Bitrate_Stream_2LB).ForeColor = GREEN_OK Else Control(Bitrate_Stream_2LB).ForeColor = RED_WARNING + If Not __RTMP_1_Enabled And __SLS_1_Enabled Then If SLS_Bitrate1 < SLS_BitrateFail1 Or SLS_Bitrate1 = 0 Then Control(Bitrate_Stream_1LB).ForeColor = RED_FAIL: If SLS_Bitrate2 < SLS_BitrateFail2 Or SLS_Bitrate2 = 0 Then Control(Bitrate_Stream_2LB).ForeColor = RED_FAIL + + If Not __RTMP_1_Enabled And __RESTREAMER_1_Enabled Then If RESTREAMER_Bitrate1 > RESTREAMER_BitrateLow1 Then Control(Bitrate_Stream_1LB).ForeColor = GREEN_OK Else Control(Bitrate_Stream_1LB).ForeColor = RED_WARNING + If Not __RTMP_2_Enabled And __RESTREAMER_2_Enabled Then If RESTREAMER_Bitrate2 > RESTREAMER_BitrateLow2 Then Control(Bitrate_Stream_2LB).ForeColor = GREEN_OK Else Control(Bitrate_Stream_2LB).ForeColor = RED_WARNING + If Not __RTMP_1_Enabled And __RESTREAMER_1_Enabled Then If RESTREAMER_Bitrate1 < RESTREAMER_BitrateFail1 Or RESTREAMER_Bitrate1 = 0 Then Control(Bitrate_Stream_1LB).ForeColor = RED_FAIL: If SLS_Bitrate2 < SLS_BitrateFail2 Or SLS_Bitrate2 = 0 Then Control(Bitrate_Stream_2LB).ForeColor = RED_FAIL + If Not __RTMP_1_Enabled Then Select Case SLS_Bitrate1 Case 0 To 99 @@ -6217,11 +6696,11 @@ Sub Timer01 If srt_warmup And SceneLBActive_Temp_Disable >= 1 Then SceneLBActive_Temp_Disable = SceneLBActive_Temp_Disable + 1 SceneLBActive_Temp_Disable_Display = " (" + _Trim$(Str$(31 - SceneLBActive_Temp_Disable)) + "s)" - If SceneLBActive_Temp_Disable > 31 Then SceneLBActive_Temp_Disable = 0: SceneLBActive_Temp_Disable_Display = "": SceneLBActive = TRUE ' Number of seconds to disable LBR + If SceneLBActive_Temp_Disable > 31 Then SceneLBActive_Temp_Disable = 0: SceneLBActive_Temp_Disable_Display = "": SceneLBActive = True ' Number of seconds to disable LBR End If If CooldownLog = 0 And srt_warmup And td_update > 1.1 And SceneLBActive And SceneLBActive_Temp_Disable = 0 And srt_warmup_LB = 0 Then SceneLBActive_Temp_Disable = 1 - SceneLBActive = FALSE + SceneLBActive = False SetCaption StatusLB, "Update interval too high, LBR temporarily disabled...": updateDisplay = 1 ' Display error if update interval too high End If If CooldownLog = 0 And srt_warmup And td_update > 1.1 And Not SceneLBActive And SceneLBActive_Temp_Disable >= 1 Then @@ -6231,17 +6710,19 @@ Sub Timer01 SetCaption (Stream_Fail_DelayLB), calc_srt$(Stream_Fail_Delay, 1) + calc_srt_sec$ If Timer_Fail And MediaSource1Time = 0 And MediaSource2Time = 0 Then Control(Scene_CurrentLB).ForeColor = RED_FAIL Else Control(Scene_CurrentLB).ForeColor = GREEN_SCENE_OK - If Not SLS_Active And Not RTMP_Active And Not __MultiCameraSwitch Then SetCaption (MultiCameraSwitchStatusLB), "Disabled" + If Not SLS_Active And Not RTMP_Active And Not RESTREAMER_Active And Not __MultiCameraSwitch Then SetCaption (MultiCameraSwitchStatusLB), "Disabled" 'If RTMP_Width1 And RTMP_Height1 Then Server_Display1 = " / " + LTrim$(Str$(RTMP_Width1)) + "x" + LTrim$(Str$(RTMP_Height1)) 'If RTMP_Width2 And RTMP_Height2 Then Server_Display2 = " / " + LTrim$(Str$(RTMP_Width2)) + "x" + LTrim$(Str$(RTMP_Height2)) If __SLS_1_Enabled Then Server_Display1 = " // [SLS]" If __SLS_2_Enabled Then Server_Display2 = " // [SLS]" + If __RESTREAMER_1_Enabled Then Server_Display1 = " // [RESTREAMER]" + If __RESTREAMER_2_Enabled Then Server_Display2 = " // [RESTREAMER]" If __RTMP_1_Enabled Then Server_Display1 = " // [NGINX]" If __RTMP_2_Enabled Then Server_Display2 = " // [NGINX]" - If Not __SLS_1_Enabled And Not __RTMP_1_Enabled Then Server_Display1 = " // [SRT]" - If Not __SLS_2_Enabled And Not __RTMP_2_Enabled Then Server_Display2 = " // [SRT]" + If Not __SLS_1_Enabled And Not __RTMP_1_Enabled And Not __RESTREAMER_1_Enabled Then Server_Display1 = " // [SRT]" + If Not __SLS_2_Enabled And Not __RTMP_2_Enabled And Not __RESTREAMER_2_Enabled Then Server_Display2 = " // [SRT]" If BELABOX_1_Found Or BELABOX_1_Offline Then Server_Display1 = " // [BELABOX]" If BELABOX_2_Found Or BELABOX_2_Offline Then Server_Display2 = " // [BELABOX]" @@ -6262,6 +6743,7 @@ Sub Timer01 If Server_Ping_Display_1 = "SRT" Or Server_Ping_Display_1 = "Network" Then TIMEms tIPPingOut, 0, 0 If Server_Ping_Display_1 = "NGINX" Then TIMEms RTMP_PingOut, 0, 0 If Server_Ping_Display_1 = "SLS" Or Server_Ping_Display_1 = "BELABOX" Then TIMEms SLS_PingOut, 0, 0 + If Server_Ping_Display_1 = "RESTREAMER" Then TIMEms RESTREAMER_PingOut, 0, 0 ' Display ping SetCaption (tIPPingOutLB), LTrim$(Str$(Val(tout) * 1000)) + " ms" Else @@ -6275,9 +6757,11 @@ Sub Timer01 If Server_Ping_Display_1 = "SRT" Or Server_Ping_Display_1 = "Network" Then TIMEms tIPPingOut, 0, 0 If Server_Ping_Display_1 = "NGINX" Then TIMEms RTMP_PingOut, 0, 0 If Server_Ping_Display_1 = "SLS" Or Server_Ping_Display_1 = "BELABOX" Then TIMEms SLS_PingOut, 0, 0 + If Server_Ping_Display_1 = "RESTREAMER" Then TIMEms RESTREAMER_PingOut, 0, 0 If Server_Ping_Display_2 = "SRT" Or Server_Ping_Display_2 = "Network" Then TIMEms tIPPingOut, 0, 1 If Server_Ping_Display_2 = "NGINX" Then TIMEms RTMP_PingOut, 0, 1 If Server_Ping_Display_2 = "SLS" Or Server_Ping_Display_2 = "BELABOX" Then TIMEms SLS_PingOut_2, 0, 1 + If Server_Ping_Display_2 = "RESTREAMER" Then TIMEms RESTREAMER_PingOut, 0, 1 ' Display ping(s) If Server_Ping_Display_1 = Server_Ping_Display_2 And Not SLS_2_Active Then SetCaption (tIPPingOutLB), LTrim$(Str$(Val(tout) * 1000)) + " ms" @@ -6318,7 +6802,7 @@ Sub Timer01 If MediaSource2Time <= 2 Then Control(Uptime_Stream_2LB).ForeColor = RED_FAIL Else If MediaSource2Time >= 3 And MediaSource2Time < 10 Then Control(Uptime_Stream_2LB).ForeColor = RED_WARNING Else Control(Uptime_Stream_2LB).ForeColor = GREEN_OK If BELABOX_2_Found And MediaSource2Time >= 1 And MediaSource2Time <= 10 Then SetCaption (Uptime_Stream_2LB), calc_srt$(MediaSource2Time, 1) + calc_srt_sec$ + "*" Else SetCaption (Uptime_Stream_2LB), calc_srt$(MediaSource2Time, 1) + calc_srt_sec$ ' SRT ' SLS 2nd IP - Control(StreamLightLB).Hidden = TRUE + Control(StreamLightLB).Hidden = True If MediaSource1Time <= 1 Then Control(Stream1LightLB).ForeColor = _RGB32(252, 20, 10) SetCaption (Stream1LightLB), "____________________________________" @@ -6336,13 +6820,13 @@ Sub Timer01 If Timer_Fail_Stream1 = 2 And CooldownStartup = 0 Then Timer_Fail_Count1 = Timer_Fail_Count1 + 1 - Timer_Failed1 = TRUE + Timer_Failed1 = True If Timer_Fail_Count1 > 999 Then Timer_Fail_Count1 = 999 End If If Timer_Fail_Stream2 = 2 And CooldownStartup = 0 Then Timer_Fail_Count2 = Timer_Fail_Count2 + 1 - Timer_Failed2 = TRUE + Timer_Failed2 = True If Timer_Fail_Count2 > 999 Then Timer_Fail_Count2 = 999 End If Else @@ -6363,7 +6847,7 @@ Sub Timer01 SetCaption (Stream_Fail_TimerLB), calc_srt$(Timer_Fail_Stream1, 1) + calc_srt_sec$ End If - If Scene_OK = "" Or Scene_Fail = "" Or Scene_Intro = "" Then RefreshDisplayRequest = TRUE: Error_msg = "- Variable/s for scenes empty, check if " + c34 + config_main + c34 + " exists. (Error: #5)": _Delay 3 + If Scene_OK = "" Or Scene_Fail = "" Or Scene_Intro = "" Then RefreshDisplayRequest = True: Error_msg = "- Variable/s for scenes empty, check if " + c34 + config_main + c34 + " exists. (Error: #5)": _Delay 3 If Timer_Fail >= 1 And Exe_OK And streamsUp <> "0" Then LoadImageMEM Control(PictureBox1), "tick_warning.png" @@ -6381,29 +6865,29 @@ Sub Timer01 ' Update Display: --------------------------------------------------------------- ' Debug If Not Debug Then - Control(DebugFrame).Hidden = TRUE - Control(versionFrame).Hidden = FALSE - Control(TimerLB).Hidden = TRUE - Control(TimerSnapshotLB).Hidden = TRUE - Control(td_displayLB2).Hidden = TRUE - Control(mouseXLB2).Hidden = TRUE - Control(mouseYLB2).Hidden = TRUE - Control(__ERRORLINELB2).Hidden = TRUE - Control(Debug_TimerLB).Hidden = TRUE - Control(Debug_Timer_SnapshotLB).Hidden = TRUE - Control(td_displayLB).Hidden = TRUE - Control(mouseXLB).Hidden = TRUE - Control(mouseYLB).Hidden = TRUE - Control(__ERRORLINELB).Hidden = TRUE - Control(LowBRTimerLB).Hidden = TRUE - Control(br_countdownLB).Hidden = TRUE - Control(MSRateLB).Hidden = TRUE - Control(MSRateLB2).Hidden = TRUE - Control(ms_playLB).Hidden = TRUE - Control(ms_playLB2).Hidden = TRUE - Control(LBRDelayLB).Hidden = TRUE - Control(br_delayLB).Hidden = TRUE - Control(PictureBoxLogoBottom).Hidden = FALSE + Control(DebugFrame).Hidden = True + Control(versionFrame).Hidden = False + Control(TimerLB).Hidden = True + Control(TimerSnapshotLB).Hidden = True + Control(td_displayLB2).Hidden = True + Control(mouseXLB2).Hidden = True + Control(mouseYLB2).Hidden = True + Control(__ERRORLINELB2).Hidden = True + Control(Debug_TimerLB).Hidden = True + Control(Debug_Timer_SnapshotLB).Hidden = True + Control(td_displayLB).Hidden = True + Control(mouseXLB).Hidden = True + Control(mouseYLB).Hidden = True + Control(__ERRORLINELB).Hidden = True + Control(LowBRTimerLB).Hidden = True + Control(br_countdownLB).Hidden = True + Control(MSRateLB).Hidden = True + Control(MSRateLB2).Hidden = True + Control(ms_playLB).Hidden = True + Control(ms_playLB2).Hidden = True + Control(LBRDelayLB).Hidden = True + Control(br_delayLB).Hidden = True + Control(PictureBoxLogoBottom).Hidden = False SetCaption Debug_TimerLB, "-" SetCaption Debug_Timer_SnapshotLB, "-" SetCaption td_displayLB, "-" @@ -6422,55 +6906,55 @@ Sub Timer01 ' Debug Temp If Debug_Temp = "true" Then - Control(DebugFrameTemp).Hidden = TRUE - Control(DebugTemp1LB).Hidden = TRUE - Control(DebugTemp2LB).Hidden = TRUE - Control(DebugTemp3LB).Hidden = TRUE - Control(DebugTemp4LB).Hidden = TRUE - Control(DebugTemp1LB2).Hidden = TRUE - Control(DebugTemp2LB2).Hidden = TRUE - Control(DebugTemp3LB2).Hidden = TRUE - Control(DebugTemp4LB2).Hidden = TRUE - Control(Settings).Hidden = FALSE + Control(DebugFrameTemp).Hidden = True + Control(DebugTemp1LB).Hidden = True + Control(DebugTemp2LB).Hidden = True + Control(DebugTemp3LB).Hidden = True + Control(DebugTemp4LB).Hidden = True + Control(DebugTemp1LB2).Hidden = True + Control(DebugTemp2LB2).Hidden = True + Control(DebugTemp3LB2).Hidden = True + Control(DebugTemp4LB2).Hidden = True + Control(Settings).Hidden = False End If ElseIf Debug Then - Control(DebugFrame).Hidden = FALSE - Control(versionFrame).Hidden = TRUE - Control(TimerLB).Hidden = FALSE - Control(TimerSnapshotLB).Hidden = FALSE - Control(td_displayLB2).Hidden = FALSE - Control(mouseXLB2).Hidden = FALSE - Control(mouseYLB2).Hidden = FALSE - Control(__ERRORLINELB2).Hidden = FALSE - Control(Debug_TimerLB).Hidden = FALSE - Control(Debug_Timer_SnapshotLB).Hidden = FALSE - Control(td_displayLB).Hidden = FALSE - Control(mouseXLB).Hidden = FALSE - Control(mouseYLB).Hidden = FALSE - Control(__ERRORLINELB).Hidden = FALSE - Control(LowBRTimerLB).Hidden = FALSE - Control(ms_playLB).Hidden = FALSE - Control(ms_playLB2).Hidden = FALSE - Control(br_countdownLB).Hidden = FALSE - Control(MSRateLB).Hidden = FALSE - Control(MSRateLB2).Hidden = FALSE - Control(LBRDelayLB).Hidden = FALSE - Control(br_delayLB).Hidden = FALSE - Control(PictureBoxLogoBottom).Hidden = TRUE + Control(DebugFrame).Hidden = False + Control(versionFrame).Hidden = True + Control(TimerLB).Hidden = False + Control(TimerSnapshotLB).Hidden = False + Control(td_displayLB2).Hidden = False + Control(mouseXLB2).Hidden = False + Control(mouseYLB2).Hidden = False + Control(__ERRORLINELB2).Hidden = False + Control(Debug_TimerLB).Hidden = False + Control(Debug_Timer_SnapshotLB).Hidden = False + Control(td_displayLB).Hidden = False + Control(mouseXLB).Hidden = False + Control(mouseYLB).Hidden = False + Control(__ERRORLINELB).Hidden = False + Control(LowBRTimerLB).Hidden = False + Control(ms_playLB).Hidden = False + Control(ms_playLB2).Hidden = False + Control(br_countdownLB).Hidden = False + Control(MSRateLB).Hidden = False + Control(MSRateLB2).Hidden = False + Control(LBRDelayLB).Hidden = False + Control(br_delayLB).Hidden = False + Control(PictureBoxLogoBottom).Hidden = True ' Debug Temp If Debug_Temp = "true" Then - Control(DebugFrameTemp).Hidden = FALSE - Control(DebugTemp1LB).Hidden = FALSE - Control(DebugTemp2LB).Hidden = FALSE - Control(DebugTemp3LB).Hidden = FALSE - Control(DebugTemp4LB).Hidden = FALSE - Control(DebugTemp1LB2).Hidden = FALSE - Control(DebugTemp2LB2).Hidden = FALSE - Control(DebugTemp3LB2).Hidden = FALSE - Control(DebugTemp4LB2).Hidden = FALSE - Control(Settings).Hidden = TRUE + Control(DebugFrameTemp).Hidden = False + Control(DebugTemp1LB).Hidden = False + Control(DebugTemp2LB).Hidden = False + Control(DebugTemp3LB).Hidden = False + Control(DebugTemp4LB).Hidden = False + Control(DebugTemp1LB2).Hidden = False + Control(DebugTemp2LB2).Hidden = False + Control(DebugTemp3LB2).Hidden = False + Control(DebugTemp4LB2).Hidden = False + Control(Settings).Hidden = True End If SetCaption TimerLB, "TIMER" ' TIMER @@ -6504,7 +6988,7 @@ Sub Timer01 ' Output Kbps to file If __FileStatusOutput Then On Error GoTo App_Fail - App_Refresh = TRUE + App_Refresh = True Open outputKbpsFile1 For Output As #200 Select Case SLS_Bitrate1 Case 0 To 99 @@ -6522,18 +7006,18 @@ Sub Timer01 End Select Close 204 On Error GoTo 0 - App_Refresh = FALSE + App_Refresh = False End If returnPreviousSceneTime = 1 Else GoTo Exit_returnPreviousSceneCheck End If - returnFirstCheck = TRUE + returnFirstCheck = True If HTTP_Enabled Then If HTTP_Communication_Native Then http_client_connect "Get", "" Else Shell _Hide CMD_EXE_HTTP_FAST_GET_SCENE Else Shell _Hide CMD_EXE_FAST + c34 + obs_get_scene + c34 On Error GoTo App_Fail - App_Refresh = TRUE + App_Refresh = True If Not HTTP_Enabled Then ' HTTP @@ -6547,7 +7031,7 @@ Sub Timer01 Open filePrevious For Input As #96 ' LOCK #96 Do Until EOF(96) - If LOF(96) = 0 Then NoKill = TRUE: Exit Do ' Overkill with EOF checking, but just being safe + If LOF(96) = 0 Then NoKill = True: Exit Do ' Overkill with EOF checking, but just being safe If EOF(96) Then Exit Do Line Input #96, file96 Scene_Bypass_Check = file96 @@ -6592,7 +7076,7 @@ Sub Timer01 If HTTP_Enabled Then If HTTP_Communication_Native Then http_client_connect "Get", "" Else Shell _Hide CMD_EXE_HTTP_FAST_GET_SCENE Else Shell _Hide CMD_EXE_FAST + c34 + obs_get_scene + c34 On Error GoTo App_Fail - App_Refresh = TRUE + App_Refresh = True If Not HTTP_Enabled Then ' HTTP @@ -6604,7 +7088,7 @@ Sub Timer01 Open filePrevious For Input As #96 ' LOCK #96 Do Until EOF(96) - If LOF(96) = 0 Then NoKill = TRUE: Exit Do ' Overkill with EOF checking, but just being safe + If LOF(96) = 0 Then NoKill = True: Exit Do ' Overkill with EOF checking, but just being safe If EOF(96) Then Exit Do Line Input #96, file96 Scene_Bypass_Check = file96 @@ -6643,17 +7127,17 @@ Sub Timer01 End If Close #96 - If NoKill Then NoKill = FALSE Else If _FileExists(filePrevious) Then Kill filePrevious + If NoKill Then NoKill = False Else If _FileExists(filePrevious) Then Kill filePrevious On Error GoTo 0 - App_Refresh = FALSE + App_Refresh = False ' Check if any of the 9 bypass scenes equal the current scene If Scene_Bypass_Check <> "none" Then ' In case user has scene name labelled "none", which will break the program If Scene_Bypass = Scene_Bypass_Check Or Scene_Bypass_2 = Scene_Bypass_Check Or Scene_Bypass_3 = Scene_Bypass_Check Or Scene_Bypass_4 = Scene_Bypass_Check Or Scene_Bypass_5 = Scene_Bypass_Check Or Scene_Bypass_6 = Scene_Bypass_Check Or Scene_Bypass_7 = Scene_Bypass_Check Or Scene_Bypass_8 = Scene_Bypass_Check Or Scene_Bypass_9 = Scene_Bypass_Check Then SetCaption (Scene_CurrentLB), "[ PAUSE ]" If Not Scene_Bypass_Log Then - Scene_Bypass_Log = TRUE + Scene_Bypass_Log = True If __FileStatusOutput Then statusOutputToFile "[STREAM PAUSED]" If ConnectionsLog Then statusConnectionsLogToFile "[INFO] Stream manually paused" End If @@ -6676,7 +7160,7 @@ Sub Timer01 statusBitrateToFile bitrateOutput End If - Scene_Bypass_Log = FALSE + Scene_Bypass_Log = False ' Execute Stream OK If Not __MultiCameraSwitch Then @@ -6684,8 +7168,8 @@ Sub Timer01 Timer_Fail = 0 If CooldownLog = 0 Then Scene_Current = Scene_OK If Exe_Fail Then - Exe_Fail = FALSE - Exe_OK = TRUE + Exe_Fail = False + Exe_OK = True LoadImageMEM Control(PictureBox1), "tick.png" If HTTP_Communication_Native Then http_client_connect "Set", Scene_OK Else Shell _Hide _DontWait shell_cmd_1 + Scene_OK + shell_cmd_2 _Delay 0.033 @@ -6697,11 +7181,11 @@ Sub Timer01 Else If Timer_Fail >= Stream_Fail_Delay Or RIST_MediaSource1Time_Count >= 5 Then ' RIST mode ' Scene_Fail triggered at 5 seconds, the same as SRT timeout If Exe_OK Then - Exe_OK = FALSE - Exe_Fail = TRUE + Exe_OK = False + Exe_Fail = True LoadImageMEM Control(PictureBox1), "cross.png" If Not Exe_Fail_First Then - Exe_Fail_First = TRUE + Exe_Fail_First = True Scene_Current = Scene_Intro If HTTP_Communication_Native Then http_client_connect "Set", Scene_Intro Else Shell _Hide _DontWait shell_cmd_1 + Scene_Intro + shell_cmd_2 _Delay 0.033 @@ -6712,7 +7196,7 @@ Sub Timer01 If __FileStatusOutput Then statusOutputToFile "[STREAM DOWN]" If ConnectionsLog Then statusConnectionsLogToFile "[WARN] No bandwidth for stream, " + _Trim$(Str$(ConnectionsLog1Count)) + " times" Timer_Fail_Count = Timer_Fail_Count + 1 - Timer_Failed = TRUE + Timer_Failed = True If Timer_Fail_Count > 999 Then Timer_Fail_Count = 999 End If End If @@ -6825,7 +7309,7 @@ Sub Timer01 streamsUp = "0" LoadImageMEM Control(PictureBox1), "cross.png" If Not Exe_Fail_First Then - Exe_Fail_First = TRUE + Exe_Fail_First = True Scene_Current = Scene_Intro If HTTP_Communication_Native Then http_client_connect "Set", Scene_Intro Else Shell _Hide _DontWait shell_cmd_1 + Scene_Intro + shell_cmd_2 _Delay 0.033 @@ -6836,14 +7320,14 @@ Sub Timer01 If __FileStatusOutput Then statusOutputToFile "[STREAM DOWN]:[ALL CAMERAS DOWN]" If ConnectionsLog Then statusConnectionsLogToFile "[WARN] No bandwidth for stream #1, no bandwidth for stream #2" Timer_Fail_Count = Timer_Fail_Count + 1 - Timer_Failed = TRUE + Timer_Failed = True If Timer_Fail_Count > 999 Then Timer_Fail_Count = 999 End If End If End If End If - If srt_warmup And returnFirstCheck And __MultiCameraSwitch And previousSceneDisplay = "" Then RefreshDisplayRequest = TRUE: Error_msg = "- Variable/s for scenes empty, check if OBS is open." + Chr$(10) + "- If OBS is open, check communication is available via Node.js or obs-websocket-http.": Error_msg_2$ = "- If Node.js is selected, check OBS WebSocket options are correctly set. (Error: #6)": _Delay 3 + If srt_warmup And returnFirstCheck And __MultiCameraSwitch And previousSceneDisplay = "" Then RefreshDisplayRequest = True: Error_msg = "- Variable/s for scenes empty, check if OBS is open." + Chr$(10) + "- If OBS is open, check communication is available via Node.js or obs-websocket-http.": Error_msg_2$ = "- If Node.js is selected, check OBS WebSocket options are correctly set. (Error: #6)": _Delay 3 If RTMP_Active Then ' Temp2 variables @@ -6856,22 +7340,22 @@ Sub Timer01 If Not Exe_Fail_First Then Timer_Fail_First = Timer_Fail_First + 1 - If (Stream_Fail_Delay + 3) - Timer_Fail_First <= 0 Then Exe_Fail_First = TRUE + If (Stream_Fail_Delay + 3) - Timer_Fail_First <= 0 Then Exe_Fail_First = True End If If Not Exe_Fail_First_Stream1 Then Timer_Fail_First_Stream1 = Timer_Fail_First_Stream1 + 1 - If (Stream_Fail_Delay + 3) - Timer_Fail_First_Stream1 <= 0 Then Exe_Fail_First_Stream1 = TRUE + If (Stream_Fail_Delay + 3) - Timer_Fail_First_Stream1 <= 0 Then Exe_Fail_First_Stream1 = True End If If Not Exe_Fail_First_Stream2 Then Timer_Fail_First_Stream2 = Timer_Fail_First_Stream2 + 1 - If (Stream_Fail_Delay + 3) - Timer_Fail_First_Stream2 <= 0 Then Exe_Fail_First_Stream2 = TRUE + If (Stream_Fail_Delay + 3) - Timer_Fail_First_Stream2 <= 0 Then Exe_Fail_First_Stream2 = True End If If Refresh_Request Then - Refresh_Request = FALSE - RefreshDisplayRequest = TRUE + Refresh_Request = False + RefreshDisplayRequest = True End If CooldownStartup = CooldownStartup - 1 @@ -6880,7 +7364,7 @@ Sub Timer01 If srt_warmup_LB >= 1 Then srt_warmup_LB = srt_warmup_LB - 1 If Not srt_warmup Then - srt_warmup = TRUE + srt_warmup = True If Allow_Resize = "true" Then _Resize On , _Smooth _Delay 0.25 @@ -6891,7 +7375,7 @@ Sub Timer01 On Error GoTo 0 End If - If ErrorTestRunOnce = TRUE Then ErrorTestRunOnce = FALSE + If ErrorTestRunOnce = True Then ErrorTestRunOnce = False If PingLog = "true" Then If Int(Timer / 60) <> PingLogTimer Then @@ -6903,5 +7387,5 @@ Sub Timer01 td_display = Timer(.001) - timer1 End Sub -'$INCLUDE:'InForm\InForm.ui' +'$INCLUDE:'InForm\InForm.loopy_srt.ui' diff --git a/source/loopy_srt_monitor.frm b/source/loopy_srt_monitor.frm index ab70062..818803c 100644 --- a/source/loopy_srt_monitor.frm +++ b/source/loopy_srt_monitor.frm @@ -1,6 +1,6 @@ ': This form was generated by -': InForm - GUI library for QB64 - v1.3 -': Fellippe Heitor, 2016-2021 - fellippe@qb64.org - @fellippeheitor +': InForm - GUI library for QB64 - v1.5 +': Fellippe Heitor, 2016-2023 - fellippe@qb64.org - @fellippeheitor ': https://github.com/FellippeHeitor/InForm '----------------------------------------------------------- SUB __UI_LoadForm diff --git a/source/loopy_srt_monitor_light.frm b/source/loopy_srt_monitor_light.frm index 4536385..8cd3b5f 100644 --- a/source/loopy_srt_monitor_light.frm +++ b/source/loopy_srt_monitor_light.frm @@ -1,6 +1,6 @@ ': This form was generated by -': InForm - GUI library for QB64 - v1.3 -': Fellippe Heitor, 2016-2021 - fellippe@qb64.org - @fellippeheitor +': InForm - GUI library for QB64 - v1.5 +': Fellippe Heitor, 2016-2023 - fellippe@qb64.org - @fellippeheitor ': https://github.com/FellippeHeitor/InForm '----------------------------------------------------------- SUB __UI_LoadForm_Light diff --git a/source/readme_InForm.txt b/source/readme_InForm.txt index e0cc9cb..f7ab4d1 100644 --- a/source/readme_InForm.txt +++ b/source/readme_InForm.txt @@ -1,25 +1,33 @@ Download QB64 from: https://qb64phoenix.com/ -Download InForm v1.3 or newer from: https://github.com/FellippeHeitor/InForm -Download BIN2INCLUDE from: https://github.com/tailscreatesstuff32/BIN2INCLUDE +Download InForm from: https://github.com/a740g/InForm-PE +InForm includes BIN2INCLUDE which can be used to edit image.png.MEM -Copy the InForm folder and files to the QB64 folder. +Copy the InForm folder and files to the QB64 folder Changes to InForm: InForm.ui --------- +InForm.ui copy as InForm.loopy_srt.ui + FIND: b$ = "Initializing..." +REPLACE W/: b$ = "Connecting to OBS WebSocket..." ADD BEFORE: IF INSTR(COMMAND$, "-light") = 0 THEN COLOR _RGB32(254,254,255) FIND: 'This.Canvas holds the children controls' images ADD BEFORE: _SETALPHA 16, _RGB(0, 0, 0) TO _RGB(255, 255, 255), ControlImage +FIND: __UI_ExitTriggered = _EXIT +REPLACE W/: '__UI_ExitTriggered = _EXIT + FIND: IF FPS >= 30 THEN REPLACE W/: IF FPS >= 15 THEN InForm.bi --------- +InForm.bi copy as InForm.loopy_srt.bi + FIND: __UI_LoadForm REPLACE W/: IF INSTR(COMMAND$, "-light") THEN __UI_LoadForm_Light ELSE __UI_LoadForm