PHP Malware Analysis

ikstart.php

md5: d41e66e0ab35f2e8db47b2fc7ed82383

Jump to:

Screenshot


Attributes

Emails

Encoding

Environment

Execution

Files

Input

Title
  • Akeeba Kickstart (Original)
  • Akeeba Kickstart Core 4.1.1 (HTML)

URLs
  • ftp://$sftphandle/$dir (Original)
  • ftp://$sftphandle/$dir/$entry (Original)
  • FTP.button (HTML, Original)
  • ftp.dir (HTML, Original)
  • ftp.host (HTML, Original)
  • ftp.pass (HTML, Original)
  • ftp.passive (HTML, Original)
  • ftp.port (HTML, Original)
  • ftp.ssl (HTML, Original)
  • ftp.tempdir (HTML, Original)
  • ftp.user (HTML, Original)
  • http://1.2.3.4/~username (HTML, Original, Traces)
  • http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf (Original)
  • http://gr.php.net/parse_ini_file (Original)
  • http://gr2.php.net/fnmatch (Original)
  • http://internet-inspired.com/ (HTML, Original)
  • http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_is_array/ (HTML, Original)
  • http://neosmart.net/dl.php?id=7 (Original)
  • http://nocdn.akeebabackup.com/updates/kickstart.xml (Original)
  • http://nocdn.akeebabackup.com/updates/kickstartpro.xml (HTML, Original)
  • http://pear.php.net/pepr/pepr-proposal-show.php?id=198 (Original)
  • http://query.yahooapis.com/v1/public/yql (HTML, Original)
  • http://techpatterns.com/downloads/php_language_detection.php (Original)
  • http://wordpress.org/latest.zip (HTML, Original)
  • http://www.akeebabackup.com (HTML, Original)
  • http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 (Original)
  • http://www.gnu.org/gpl-3.htmlhttp://www.gnu.org/copyleft/gpl.html (HTML, Original)
  • http://www.gnu.org/licenses/ (Original)
  • http://www.joomla.org/download.html (Original)
  • http://www.opensource.org/licenses/bsd-license.php (Original)
  • http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd (Original)
  • https://www.akeebabackup.com/documentation/quick-start-guide/using-kickstart.html (HTML, Original)
  • https://www.akeebabackup.com/documentation/troubleshooter/kscantextract.html (HTML, Original)
  • https://www.akeebabackup.com/documentation/troubleshooter/ksnoarchives.html (HTML, Original)
  • https://www.akeebabackup.com/documentation/troubleshooter/post-restoration.html (HTML, Original)


Deobfuscated PHP code

Failed to deobfuscate code

Execution traces

data/traces/d41e66e0ab35f2e8db47b2fc7ed82383_trace-1676258140.6349.xt
Version: 3.1.0beta2
File format: 4
TRACE START [2023-02-13 01:16:06.532713]
1	0	1	0.000156	393528
1	3	0	0.007266	1975880	{main}	1		/var/www/html/uploads/ikstart.php	0	0
2	4	0	0.007301	1975880	define	0		/var/www/html/uploads/ikstart.php	31	2	'KICKSTART'	1
2	4	1	0.007319	1975984
2	4	R			TRUE
2	5	0	0.007333	1975912	define	0		/var/www/html/uploads/ikstart.php	32	2	'VERSION'	'4.1.1'
2	5	1	0.007348	1976016
2	5	R			TRUE
2	6	0	0.007361	1975944	define	0		/var/www/html/uploads/ikstart.php	33	2	'KICKSTARTPRO'	'0'
2	6	1	0.007375	1976048
2	6	R			TRUE
2	7	0	0.007390	1975976	strpos	0		/var/www/html/uploads/ikstart.php	38	2	'localhost'	'local.web'
2	7	1	0.007405	1976048
2	7	R			FALSE
2	8	0	0.007418	1975976	substr	0		/var/www/html/uploads/ikstart.php	43	3	'Linux'	0	3
2	8	1	0.007433	1976104
2	8	R			'Lin'
2	9	0	0.007446	1975976	define	0		/var/www/html/uploads/ikstart.php	43	2	'KSWINDOWS'	FALSE
2	9	1	0.007459	1976080
2	9	R			TRUE
2	10	0	0.007473	1976008	dirname	0		/var/www/html/uploads/ikstart.php	47	1	'/var/www/html/uploads/ikstart.php'
2	10	1	0.007485	1976104
2	10	R			'/var/www/html/uploads'
2	11	0	0.007500	1976072	define	0		/var/www/html/uploads/ikstart.php	47	2	'KSROOTDIR'	'/var/www/html/uploads'
2	11	1	0.007513	1976176
2	11	R			TRUE
2	12	0	0.007529	1976104	error_reporting	0		/var/www/html/uploads/ikstart.php	57	1	'E_NONE'
2	12	1	0.007543	1976144
2	12	R			0
1		A						/var/www/html/uploads/ikstart.php	97	$cacertpem = '/var/www/html/uploads/cacert.pem'
2	13	0	0.007571	1976168	is_file	0		/var/www/html/uploads/ikstart.php	98	1	'/var/www/html/uploads/cacert.pem'
2	13	1	0.007595	1976208
2	13	R			FALSE
2	14	0	0.007609	1976104	opendir	0		/var/www/html/uploads/ikstart.php	106	1	'/var/www/html/uploads'
2	14	1	0.007631	1976496
2	14	R			resource(4) of type (stream)
1		A						/var/www/html/uploads/ikstart.php	106	$dh = resource(4) of type (stream)
2	15	0	0.007658	1976464	readdir	0		/var/www/html/uploads/ikstart.php	108	1	resource(4) of type (stream)
2	15	1	0.007679	1976536
2	15	R			'..'
1		A						/var/www/html/uploads/ikstart.php	108	$filename = '..'
2	16	0	0.007703	1976496	is_file	0		/var/www/html/uploads/ikstart.php	109	1	'..'
2	16	1	0.007717	1976544
2	16	R			FALSE
2	17	0	0.007730	1976504	readdir	0		/var/www/html/uploads/ikstart.php	108	1	resource(4) of type (stream)
2	17	1	0.007744	1976576
2	17	R			'.'
1		A						/var/www/html/uploads/ikstart.php	108	$filename = '.'
2	18	0	0.007767	1976504	is_file	0		/var/www/html/uploads/ikstart.php	109	1	'.'
2	18	1	0.007780	1976544
2	18	R			FALSE
2	19	0	0.007793	1976504	readdir	0		/var/www/html/uploads/ikstart.php	108	1	resource(4) of type (stream)
2	19	1	0.007806	1976584
2	19	R			'prepend.php'
1		A						/var/www/html/uploads/ikstart.php	108	$filename = 'prepend.php'
2	20	0	0.007830	1976512	is_file	0		/var/www/html/uploads/ikstart.php	109	1	'prepend.php'
2	20	1	0.007845	1976560
2	20	R			TRUE
2	21	0	0.007858	1976520	substr	0		/var/www/html/uploads/ikstart.php	110	3	'prepend.php'	0	10
2	21	1	0.007872	1976656
2	21	R			'prepend.ph'
2	22	0	0.007885	1976520	readdir	0		/var/www/html/uploads/ikstart.php	108	1	resource(4) of type (stream)
2	22	1	0.007898	1976592
2	22	R			'data'
1		A						/var/www/html/uploads/ikstart.php	108	$filename = 'data'
2	23	0	0.007921	1976512	is_file	0		/var/www/html/uploads/ikstart.php	109	1	'data'
2	23	1	0.007935	1976544
2	23	R			FALSE
2	24	0	0.007948	1976504	readdir	0		/var/www/html/uploads/ikstart.php	108	1	resource(4) of type (stream)
2	24	1	0.007961	1976584
2	24	R			'.htaccess'
1		A						/var/www/html/uploads/ikstart.php	108	$filename = '.htaccess'
2	25	0	0.007984	1976512	is_file	0		/var/www/html/uploads/ikstart.php	109	1	'.htaccess'
2	25	1	0.007999	1976560
2	25	R			TRUE
2	26	0	0.008011	1976520	substr	0		/var/www/html/uploads/ikstart.php	110	3	'.htaccess'	0	10
2	26	1	0.008024	1976616
2	26	R			'.htaccess'
2	27	0	0.008038	1976520	readdir	0		/var/www/html/uploads/ikstart.php	108	1	resource(4) of type (stream)
2	27	1	0.008058	1976600
2	27	R			'ikstart.php'
1		A						/var/www/html/uploads/ikstart.php	108	$filename = 'ikstart.php'
2	28	0	0.008082	1976520	is_file	0		/var/www/html/uploads/ikstart.php	109	1	'ikstart.php'
2	28	1	0.008096	1976560
2	28	R			TRUE
2	29	0	0.008109	1976520	substr	0		/var/www/html/uploads/ikstart.php	110	3	'ikstart.php'	0	10
2	29	1	0.008122	1976656
2	29	R			'ikstart.ph'
2	30	0	0.008136	1976520	readdir	0		/var/www/html/uploads/ikstart.php	108	1	resource(4) of type (stream)
2	30	1	0.008150	1976560
2	30	R			FALSE
1		A						/var/www/html/uploads/ikstart.php	108	$filename = FALSE
2	31	0	0.008173	1976480	define	0		/var/www/html/uploads/ikstart.php	128	2	'_AKEEBA_RESTORATION'	1
2	31	1	0.008187	1976584
2	31	R			TRUE
2	32	0	0.008200	1976512	define	0		/var/www/html/uploads/ikstart.php	129	2	'DS'	'/'
2	32	1	0.008213	1976616
2	32	R			TRUE
2	33	0	0.008225	1976544	define	0		/var/www/html/uploads/ikstart.php	132	2	'AK_STATE_NOFILE'	0
2	33	1	0.008245	1976648
2	33	R			TRUE
2	34	0	0.008258	1976576	define	0		/var/www/html/uploads/ikstart.php	133	2	'AK_STATE_HEADER'	1
2	34	1	0.008272	1976680
2	34	R			TRUE
2	35	0	0.008284	1976608	define	0		/var/www/html/uploads/ikstart.php	134	2	'AK_STATE_DATA'	2
2	35	1	0.008299	1976712
2	35	R			TRUE
2	36	0	0.008311	1976640	define	0		/var/www/html/uploads/ikstart.php	135	2	'AK_STATE_DATAREAD'	3
2	36	1	0.008325	1976744
2	36	R			TRUE
2	37	0	0.008337	1976672	define	0		/var/www/html/uploads/ikstart.php	136	2	'AK_STATE_POSTPROC'	4
2	37	1	0.008350	1976776
2	37	R			TRUE
2	38	0	0.008362	1976704	define	0		/var/www/html/uploads/ikstart.php	137	2	'AK_STATE_DONE'	5
2	38	1	0.008376	1976808
2	38	R			TRUE
2	39	0	0.008389	1976736	function_exists	0		/var/www/html/uploads/ikstart.php	142	1	'php_uname'
2	39	1	0.008402	1976776
2	39	R			TRUE
2	40	0	0.008415	1976736	php_uname	0		/var/www/html/uploads/ikstart.php	144	0
2	40	1	0.008429	1976848
2	40	R			'Linux osboxes 5.15.0-60-generic #66-Ubuntu SMP Fri Jan 20 14:29:49 UTC 2023 x86_64'
2	41	0	0.008447	1976848	stristr	0		/var/www/html/uploads/ikstart.php	144	2	'Linux osboxes 5.15.0-60-generic #66-Ubuntu SMP Fri Jan 20 14:29:49 UTC 2023 x86_64'	'windows'
2	41	1	0.008465	1976920
2	41	R			FALSE
2	42	0	0.008477	1976736	define	0		/var/www/html/uploads/ikstart.php	144	2	'_AKEEBA_IS_WINDOWS'	FALSE
2	42	1	0.008491	1976840
2	42	R			TRUE
2	43	0	0.008504	1976768	define	0		/var/www/html/uploads/ikstart.php	159	2	'KSLANGDIR'	'/var/www/html/uploads'
2	43	1	0.008518	1976872
2	43	R			TRUE
2	44	0	0.008530	1976800	function_exists	0		/var/www/html/uploads/ikstart.php	163	1	'setlocale'
2	44	1	0.008544	1976840
2	44	R			TRUE
2	45	0	0.008557	1976800	setlocale	0		/var/www/html/uploads/ikstart.php	165	2	6	'en_US.UTF8'
2	45	1	0.008629	1976872
2	45	R			'en_US.UTF8'
2	46	0	0.008646	1976800	function_exists	0		/var/www/html/uploads/ikstart.php	170	1	'fnmatch'
2	46	1	0.008660	1976840
2	46	R			TRUE
2	47	0	0.008673	1976800	function_exists	0		/var/www/html/uploads/ikstart.php	182	1	'akstringlen'
2	47	1	0.008686	1976840
2	47	R			FALSE
2	48	0	0.008698	1976800	function_exists	0		/var/www/html/uploads/ikstart.php	184	1	'mb_strlen'
2	48	1	0.008711	1976840
2	48	R			FALSE
2	49	0	0.008725	1976800	define	0		/var/www/html/uploads/ikstart.php	322	2	'SERVICES_JSON_SLICE'	1
2	49	1	0.008739	1976904
2	49	R			TRUE
2	50	0	0.008752	1976832	define	0		/var/www/html/uploads/ikstart.php	327	2	'SERVICES_JSON_IN_STR'	2
2	50	1	0.008765	1976936
2	50	R			TRUE
2	51	0	0.008777	1976864	define	0		/var/www/html/uploads/ikstart.php	332	2	'SERVICES_JSON_IN_ARR'	3
2	51	1	0.008791	1976968
2	51	R			TRUE
2	52	0	0.008803	1976896	define	0		/var/www/html/uploads/ikstart.php	337	2	'SERVICES_JSON_IN_OBJ'	4
2	52	1	0.008816	1977000
2	52	R			TRUE
2	53	0	0.008828	1976928	define	0		/var/www/html/uploads/ikstart.php	342	2	'SERVICES_JSON_IN_CMT'	5
2	53	1	0.008847	1977032
2	53	R			TRUE
2	54	0	0.008859	1976960	define	0		/var/www/html/uploads/ikstart.php	347	2	'SERVICES_JSON_LOOSE_TYPE'	16
2	54	1	0.008873	1977064
2	54	R			TRUE
2	55	0	0.008885	1976992	define	0		/var/www/html/uploads/ikstart.php	352	2	'SERVICES_JSON_SUPPRESS_ERRORS'	32
2	55	1	0.008900	1977096
2	55	R			TRUE
2	56	0	0.008912	1977024	class_exists	0		/var/www/html/uploads/ikstart.php	376	1	'Akeeba_Services_JSON'
2	56	1	0.008927	1977064
2	56	R			FALSE
2	57	0	0.008940	1977024	function_exists	0		/var/www/html/uploads/ikstart.php	1049	1	'json_encode'
2	57	1	0.008954	1977064
2	57	R			TRUE
2	58	0	0.008966	1977024	function_exists	0		/var/www/html/uploads/ikstart.php	1059	1	'json_decode'
2	58	1	0.008979	1977064
2	58	R			TRUE
2	59	0	0.008994	1977024	callExtraFeature	1		/var/www/html/uploads/ikstart.php	10475	2	???	???
2		A						/var/www/html/uploads/ikstart.php	7998	$extraFeatureObjects = []
3	60	0	0.009021	1977048	get_declared_classes	0		/var/www/html/uploads/ikstart.php	7999	0
3	60	1	0.009055	1985296
3	60	R			[0 => 'stdClass', 1 => 'Exception', 2 => 'ErrorException', 3 => 'Error', 4 => 'ParseError', 5 => 'TypeError', 6 => 'ArgumentCountError', 7 => 'ArithmeticError', 8 => 'DivisionByZeroError', 9 => 'Closure', 10 => 'Generator', 11 => 'ClosedGeneratorException', 12 => 'DateTime', 13 => 'DateTimeImmutable', 14 => 'DateTimeZone', 15 => 'DateInterval', 16 => 'DatePeriod', 17 => 'LibXMLError', 18 => 'HashContext', 19 => 'ReflectionException', 20 => 'Reflection', 21 => 'ReflectionFunctionAbstract', 22 => 'ReflectionFunction', 23 => 'ReflectionGenerator', 24 => 'ReflectionParameter', 25 => 'ReflectionType', 26 => 'ReflectionNamedType', 27 => 'ReflectionMethod', 28 => 'ReflectionClass', 29 => 'ReflectionObject', 30 => 'ReflectionProperty', 31 => 'ReflectionClassConstant', 32 => 'ReflectionExtension', 33 => 'ReflectionZendExtension', 34 => 'LogicException', 35 => 'BadFunctionCallException', 36 => 'BadMethodCallException', 37 => 'DomainException', 38 => 'InvalidArgumentException', 39 => 'LengthException', 40 => 'OutOfRangeException', 41 => 'RuntimeException', 42 => 'OutOfBoundsException', 43 => 'OverflowException', 44 => 'RangeException', 45 => 'UnderflowException', 46 => 'UnexpectedValueException', 47 => 'RecursiveIteratorIterator', 48 => 'IteratorIterator', 49 => 'FilterIterator', 50 => 'RecursiveFilterIterator', 51 => 'CallbackFilterIterator', 52 => 'RecursiveCallbackFilterIterator', 53 => 'ParentIterator', 54 => 'LimitIterator', 55 => 'CachingIterator', 56 => 'RecursiveCachingIterator', 57 => 'NoRewindIterator', 58 => 'AppendIterator', 59 => 'InfiniteIterator', 60 => 'RegexIterator', 61 => 'RecursiveRegexIterator', 62 => 'EmptyIterator', 63 => 'RecursiveTreeIterator', 64 => 'ArrayObject', 65 => 'ArrayIterator', 66 => 'RecursiveArrayIterator', 67 => 'SplFileInfo', 68 => 'DirectoryIterator', 69 => 'FilesystemIterator', 70 => 'RecursiveDirectoryIterator', 71 => 'GlobIterator', 72 => 'SplFileObject', 73 => 'SplTempFileObject', 74 => 'SplDoublyLinkedList', 75 => 'SplQueue', 76 => 'SplStack', 77 => 'SplHeap', 78 => 'SplMinHeap', 79 => 'SplMaxHeap', 80 => 'SplPriorityQueue', 81 => 'SplFixedArray', 82 => 'SplObjectStorage', 83 => 'MultipleIterator', 84 => 'SessionHandler', 85 => 'SodiumException', 86 => '__PHP_Incomplete_Class', 87 => 'php_user_filter', 88 => 'Directory', 89 => 'AssertionError', 90 => 'CURLFile', 91 => 'PDOException', 92 => 'PDO', 93 => 'PDOStatement', 94 => 'PDORow', 95 => 'finfo', 96 => 'PharException', 97 => 'Phar', 98 => 'PharData', 99 => 'PharFileInfo', 100 => 'AKAbstractObject', 101 => 'AKAbstractPart', 102 => 'AKAbstractUnarchiver', 103 => 'AKAbstractPostproc', 104 => 'AKAbstractPartObserver', 105 => 'AKPostprocDirect', 106 => 'AKPostprocFTP', 107 => 'AKPostprocSFTP', 108 => 'AKPostprocHybrid', 109 => 'AKUnarchiverJPA', 110 => 'AKUnarchiverZIP', 111 => 'AKUnarchiverJPS', 112 => 'AKCoreTimer', 113 => 'AKUtilsLister', 114 => 'AKText', 115 => 'AKFactory', 116 => 'AKEncryptionAES', 117 => 'AKKickstartUtils', 118 => 'ExtractionObserver', 119 => 'AKFeatureURLImport', 120 => 'Akeeba_Services_JSON', 121 => 'Akeeba_Services_JSON_Error']
2		A						/var/www/html/uploads/ikstart.php	7999	$allClasses = [0 => 'stdClass', 1 => 'Exception', 2 => 'ErrorException', 3 => 'Error', 4 => 'ParseError', 5 => 'TypeError', 6 => 'ArgumentCountError', 7 => 'ArithmeticError', 8 => 'DivisionByZeroError', 9 => 'Closure', 10 => 'Generator', 11 => 'ClosedGeneratorException', 12 => 'DateTime', 13 => 'DateTimeImmutable', 14 => 'DateTimeZone', 15 => 'DateInterval', 16 => 'DatePeriod', 17 => 'LibXMLError', 18 => 'HashContext', 19 => 'ReflectionException', 20 => 'Reflection', 21 => 'ReflectionFunctionAbstract', 22 => 'ReflectionFunction', 23 => 'ReflectionGenerator', 24 => 'ReflectionParameter', 25 => 'ReflectionType', 26 => 'ReflectionNamedType', 27 => 'ReflectionMethod', 28 => 'ReflectionClass', 29 => 'ReflectionObject', 30 => 'ReflectionProperty', 31 => 'ReflectionClassConstant', 32 => 'ReflectionExtension', 33 => 'ReflectionZendExtension', 34 => 'LogicException', 35 => 'BadFunctionCallException', 36 => 'BadMethodCallException', 37 => 'DomainException', 38 => 'InvalidArgumentException', 39 => 'LengthException', 40 => 'OutOfRangeException', 41 => 'RuntimeException', 42 => 'OutOfBoundsException', 43 => 'OverflowException', 44 => 'RangeException', 45 => 'UnderflowException', 46 => 'UnexpectedValueException', 47 => 'RecursiveIteratorIterator', 48 => 'IteratorIterator', 49 => 'FilterIterator', 50 => 'RecursiveFilterIterator', 51 => 'CallbackFilterIterator', 52 => 'RecursiveCallbackFilterIterator', 53 => 'ParentIterator', 54 => 'LimitIterator', 55 => 'CachingIterator', 56 => 'RecursiveCachingIterator', 57 => 'NoRewindIterator', 58 => 'AppendIterator', 59 => 'InfiniteIterator', 60 => 'RegexIterator', 61 => 'RecursiveRegexIterator', 62 => 'EmptyIterator', 63 => 'RecursiveTreeIterator', 64 => 'ArrayObject', 65 => 'ArrayIterator', 66 => 'RecursiveArrayIterator', 67 => 'SplFileInfo', 68 => 'DirectoryIterator', 69 => 'FilesystemIterator', 70 => 'RecursiveDirectoryIterator', 71 => 'GlobIterator', 72 => 'SplFileObject', 73 => 'SplTempFileObject', 74 => 'SplDoublyLinkedList', 75 => 'SplQueue', 76 => 'SplStack', 77 => 'SplHeap', 78 => 'SplMinHeap', 79 => 'SplMaxHeap', 80 => 'SplPriorityQueue', 81 => 'SplFixedArray', 82 => 'SplObjectStorage', 83 => 'MultipleIterator', 84 => 'SessionHandler', 85 => 'SodiumException', 86 => '__PHP_Incomplete_Class', 87 => 'php_user_filter', 88 => 'Directory', 89 => 'AssertionError', 90 => 'CURLFile', 91 => 'PDOException', 92 => 'PDO', 93 => 'PDOStatement', 94 => 'PDORow', 95 => 'finfo', 96 => 'PharException', 97 => 'Phar', 98 => 'PharData', 99 => 'PharFileInfo', 100 => 'AKAbstractObject', 101 => 'AKAbstractPart', 102 => 'AKAbstractUnarchiver', 103 => 'AKAbstractPostproc', 104 => 'AKAbstractPartObserver', 105 => 'AKPostprocDirect', 106 => 'AKPostprocFTP', 107 => 'AKPostprocSFTP', 108 => 'AKPostprocHybrid', 109 => 'AKUnarchiverJPA', 110 => 'AKUnarchiverZIP', 111 => 'AKUnarchiverJPS', 112 => 'AKCoreTimer', 113 => 'AKUtilsLister', 114 => 'AKText', 115 => 'AKFactory', 116 => 'AKEncryptionAES', 117 => 'AKKickstartUtils', 118 => 'ExtractionObserver', 119 => 'AKFeatureURLImport', 120 => 'Akeeba_Services_JSON', 121 => 'Akeeba_Services_JSON_Error']
3	61	0	0.009305	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'stdClass'	0	9
3	61	1	0.009320	1985392
3	61	R			'stdClass'
3	62	0	0.009335	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'Exception'	0	9
3	62	1	0.009350	1985392
3	62	R			'Exception'
3	63	0	0.009364	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'ErrorException'	0	9
3	63	1	0.009378	1985432
3	63	R			'ErrorExce'
3	64	0	0.009392	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'Error'	0	9
3	64	1	0.009405	1985392
3	64	R			'Error'
3	65	0	0.009418	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'ParseError'	0	9
3	65	1	0.009432	1985432
3	65	R			'ParseErro'
3	66	0	0.009446	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'TypeError'	0	9
3	66	1	0.009464	1985392
3	66	R			'TypeError'
3	67	0	0.009478	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'ArgumentCountError'	0	9
3	67	1	0.009492	1985432
3	67	R			'ArgumentC'
3	68	0	0.009506	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'ArithmeticError'	0	9
3	68	1	0.009520	1985432
3	68	R			'Arithmeti'
3	69	0	0.009533	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'DivisionByZeroError'	0	9
3	69	1	0.009548	1985432
3	69	R			'DivisionB'
3	70	0	0.009561	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'Closure'	0	9
3	70	1	0.009574	1985392
3	70	R			'Closure'
3	71	0	0.009587	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'Generator'	0	9
3	71	1	0.009600	1985392
3	71	R			'Generator'
3	72	0	0.009614	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'ClosedGeneratorException'	0	9
3	72	1	0.009629	1985432
3	72	R			'ClosedGen'
3	73	0	0.009642	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'DateTime'	0	9
3	73	1	0.009656	1985392
3	73	R			'DateTime'
3	74	0	0.009669	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'DateTimeImmutable'	0	9
3	74	1	0.009683	1985432
3	74	R			'DateTimeI'
3	75	0	0.009696	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'DateTimeZone'	0	9
3	75	1	0.009710	1985432
3	75	R			'DateTimeZ'
3	76	0	0.009769	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'DateInterval'	0	9
3	76	1	0.009783	1985432
3	76	R			'DateInter'
3	77	0	0.009796	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'DatePeriod'	0	9
3	77	1	0.009810	1985432
3	77	R			'DatePerio'
3	78	0	0.009823	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'LibXMLError'	0	9
3	78	1	0.009836	1985432
3	78	R			'LibXMLErr'
3	79	0	0.009849	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'HashContext'	0	9
3	79	1	0.009863	1985432
3	79	R			'HashConte'
3	80	0	0.009876	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'ReflectionException'	0	9
3	80	1	0.009891	1985432
3	80	R			'Reflectio'
3	81	0	0.009904	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'Reflection'	0	9
3	81	1	0.009917	1985432
3	81	R			'Reflectio'
3	82	0	0.009930	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'ReflectionFunctionAbstract'	0	9
3	82	1	0.009945	1985432
3	82	R			'Reflectio'
3	83	0	0.009958	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'ReflectionFunction'	0	9
3	83	1	0.009971	1985432
3	83	R			'Reflectio'
3	84	0	0.009984	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'ReflectionGenerator'	0	9
3	84	1	0.009998	1985432
3	84	R			'Reflectio'
3	85	0	0.010011	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'ReflectionParameter'	0	9
3	85	1	0.010025	1985432
3	85	R			'Reflectio'
3	86	0	0.010038	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'ReflectionType'	0	9
3	86	1	0.010052	1985432
3	86	R			'Reflectio'
3	87	0	0.010065	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'ReflectionNamedType'	0	9
3	87	1	0.010079	1985432
3	87	R			'Reflectio'
3	88	0	0.010091	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'ReflectionMethod'	0	9
3	88	1	0.010105	1985432
3	88	R			'Reflectio'
3	89	0	0.010119	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'ReflectionClass'	0	9
3	89	1	0.010132	1985432
3	89	R			'Reflectio'
3	90	0	0.010145	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'ReflectionObject'	0	9
3	90	1	0.010159	1985432
3	90	R			'Reflectio'
3	91	0	0.010172	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'ReflectionProperty'	0	9
3	91	1	0.010185	1985432
3	91	R			'Reflectio'
3	92	0	0.010198	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'ReflectionClassConstant'	0	9
3	92	1	0.010212	1985432
3	92	R			'Reflectio'
3	93	0	0.010231	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'ReflectionExtension'	0	9
3	93	1	0.010245	1985432
3	93	R			'Reflectio'
3	94	0	0.010258	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'ReflectionZendExtension'	0	9
3	94	1	0.010273	1985432
3	94	R			'Reflectio'
3	95	0	0.010285	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'LogicException'	0	9
3	95	1	0.010299	1985432
3	95	R			'LogicExce'
3	96	0	0.010312	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'BadFunctionCallException'	0	9
3	96	1	0.010327	1985432
3	96	R			'BadFuncti'
3	97	0	0.010341	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'BadMethodCallException'	0	9
3	97	1	0.010355	1985432
3	97	R			'BadMethod'
3	98	0	0.010368	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'DomainException'	0	9
3	98	1	0.010381	1985432
3	98	R			'DomainExc'
3	99	0	0.010395	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'InvalidArgumentException'	0	9
3	99	1	0.010409	1985432
3	99	R			'InvalidAr'
3	100	0	0.010422	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'LengthException'	0	9
3	100	1	0.010436	1985432
3	100	R			'LengthExc'
3	101	0	0.010450	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'OutOfRangeException'	0	9
3	101	1	0.010464	1985432
3	101	R			'OutOfRang'
3	102	0	0.010477	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'RuntimeException'	0	9
3	102	1	0.010491	1985432
3	102	R			'RuntimeEx'
3	103	0	0.010505	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'OutOfBoundsException'	0	9
3	103	1	0.010519	1985432
3	103	R			'OutOfBoun'
3	104	0	0.010532	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'OverflowException'	0	9
3	104	1	0.010546	1985432
3	104	R			'OverflowE'
3	105	0	0.010559	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'RangeException'	0	9
3	105	1	0.010573	1985432
3	105	R			'RangeExce'
3	106	0	0.010587	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'UnderflowException'	0	9
3	106	1	0.010600	1985432
3	106	R			'Underflow'
3	107	0	0.010614	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'UnexpectedValueException'	0	9
3	107	1	0.010628	1985432
3	107	R			'Unexpecte'
3	108	0	0.010642	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'RecursiveIteratorIterator'	0	9
3	108	1	0.010656	1985432
3	108	R			'Recursive'
3	109	0	0.010670	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'IteratorIterator'	0	9
3	109	1	0.010684	1985432
3	109	R			'IteratorI'
3	110	0	0.010697	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'FilterIterator'	0	9
3	110	1	0.010710	1985432
3	110	R			'FilterIte'
3	111	0	0.010724	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'RecursiveFilterIterator'	0	9
3	111	1	0.010738	1985432
3	111	R			'Recursive'
3	112	0	0.010751	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'CallbackFilterIterator'	0	9
3	112	1	0.010765	1985432
3	112	R			'CallbackF'
3	113	0	0.010779	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'RecursiveCallbackFilterIterator'	0	9
3	113	1	0.010793	1985432
3	113	R			'Recursive'
3	114	0	0.010807	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'ParentIterator'	0	9
3	114	1	0.010820	1985432
3	114	R			'ParentIte'
3	115	0	0.010834	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'LimitIterator'	0	9
3	115	1	0.010847	1985432
3	115	R			'LimitIter'
3	116	0	0.010860	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'CachingIterator'	0	9
3	116	1	0.010874	1985432
3	116	R			'CachingIt'
3	117	0	0.010888	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'RecursiveCachingIterator'	0	9
3	117	1	0.010902	1985432
3	117	R			'Recursive'
3	118	0	0.010915	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'NoRewindIterator'	0	9
3	118	1	0.010929	1985432
3	118	R			'NoRewindI'
3	119	0	0.010946	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'AppendIterator'	0	9
3	119	1	0.010960	1985432
3	119	R			'AppendIte'
3	120	0	0.010973	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'InfiniteIterator'	0	9
3	120	1	0.010987	1985432
3	120	R			'InfiniteI'
3	121	0	0.011000	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'RegexIterator'	0	9
3	121	1	0.011013	1985432
3	121	R			'RegexIter'
3	122	0	0.011027	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'RecursiveRegexIterator'	0	9
3	122	1	0.011040	1985432
3	122	R			'Recursive'
3	123	0	0.011053	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'EmptyIterator'	0	9
3	123	1	0.011066	1985432
3	123	R			'EmptyIter'
3	124	0	0.011080	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'RecursiveTreeIterator'	0	9
3	124	1	0.011094	1985432
3	124	R			'Recursive'
3	125	0	0.011107	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'ArrayObject'	0	9
3	125	1	0.011121	1985432
3	125	R			'ArrayObje'
3	126	0	0.011134	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'ArrayIterator'	0	9
3	126	1	0.011274	1985432
3	126	R			'ArrayIter'
3	127	0	0.011290	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'RecursiveArrayIterator'	0	9
3	127	1	0.011305	1985432
3	127	R			'Recursive'
3	128	0	0.011318	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'SplFileInfo'	0	9
3	128	1	0.011331	1985432
3	128	R			'SplFileIn'
3	129	0	0.011344	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'DirectoryIterator'	0	9
3	129	1	0.011358	1985432
3	129	R			'Directory'
3	130	0	0.011372	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'FilesystemIterator'	0	9
3	130	1	0.011385	1985432
3	130	R			'Filesyste'
3	131	0	0.011398	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'RecursiveDirectoryIterator'	0	9
3	131	1	0.011413	1985432
3	131	R			'Recursive'
3	132	0	0.011426	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'GlobIterator'	0	9
3	132	1	0.011439	1985432
3	132	R			'GlobItera'
3	133	0	0.011452	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'SplFileObject'	0	9
3	133	1	0.011466	1985432
3	133	R			'SplFileOb'
3	134	0	0.011479	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'SplTempFileObject'	0	9
3	134	1	0.011494	1985432
3	134	R			'SplTempFi'
3	135	0	0.011507	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'SplDoublyLinkedList'	0	9
3	135	1	0.011521	1985432
3	135	R			'SplDoubly'
3	136	0	0.011534	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'SplQueue'	0	9
3	136	1	0.011547	1985392
3	136	R			'SplQueue'
3	137	0	0.011561	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'SplStack'	0	9
3	137	1	0.011574	1985392
3	137	R			'SplStack'
3	138	0	0.011587	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'SplHeap'	0	9
3	138	1	0.011601	1985392
3	138	R			'SplHeap'
3	139	0	0.011614	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'SplMinHeap'	0	9
3	139	1	0.011627	1985432
3	139	R			'SplMinHea'
3	140	0	0.011640	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'SplMaxHeap'	0	9
3	140	1	0.011654	1985432
3	140	R			'SplMaxHea'
3	141	0	0.011667	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'SplPriorityQueue'	0	9
3	141	1	0.011682	1985432
3	141	R			'SplPriori'
3	142	0	0.011695	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'SplFixedArray'	0	9
3	142	1	0.011709	1985432
3	142	R			'SplFixedA'
3	143	0	0.011722	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'SplObjectStorage'	0	9
3	143	1	0.011736	1985432
3	143	R			'SplObject'
3	144	0	0.011750	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'MultipleIterator'	0	9
3	144	1	0.011764	1985432
3	144	R			'MultipleI'
3	145	0	0.011778	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'SessionHandler'	0	9
3	145	1	0.011796	1985432
3	145	R			'SessionHa'
3	146	0	0.011811	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'SodiumException'	0	9
3	146	1	0.011824	1985432
3	146	R			'SodiumExc'
3	147	0	0.011838	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'__PHP_Incomplete_Class'	0	9
3	147	1	0.011852	1985432
3	147	R			'__PHP_Inc'
3	148	0	0.011865	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'php_user_filter'	0	9
3	148	1	0.011879	1985432
3	148	R			'php_user_'
3	149	0	0.011892	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'Directory'	0	9
3	149	1	0.011906	1985392
3	149	R			'Directory'
3	150	0	0.011919	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'AssertionError'	0	9
3	150	1	0.011932	1985432
3	150	R			'Assertion'
3	151	0	0.011946	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'CURLFile'	0	9
3	151	1	0.011959	1985392
3	151	R			'CURLFile'
3	152	0	0.011972	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'PDOException'	0	9
3	152	1	0.011987	1985432
3	152	R			'PDOExcept'
3	153	0	0.012001	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'PDO'	0	9
3	153	1	0.012014	1985392
3	153	R			'PDO'
3	154	0	0.012028	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'PDOStatement'	0	9
3	154	1	0.012042	1985432
3	154	R			'PDOStatem'
3	155	0	0.012055	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'PDORow'	0	9
3	155	1	0.012068	1985392
3	155	R			'PDORow'
3	156	0	0.012081	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'finfo'	0	9
3	156	1	0.012094	1985392
3	156	R			'finfo'
3	157	0	0.012107	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'PharException'	0	9
3	157	1	0.012121	1985432
3	157	R			'PharExcep'
3	158	0	0.012135	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'Phar'	0	9
3	158	1	0.012148	1985392
3	158	R			'Phar'
3	159	0	0.012161	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'PharData'	0	9
3	159	1	0.012174	1985392
3	159	R			'PharData'
3	160	0	0.012187	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'PharFileInfo'	0	9
3	160	1	0.012201	1985432
3	160	R			'PharFileI'
3	161	0	0.012215	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'AKAbstractObject'	0	9
3	161	1	0.012229	1985432
3	161	R			'AKAbstrac'
3	162	0	0.012250	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'AKAbstractPart'	0	9
3	162	1	0.012264	1985432
3	162	R			'AKAbstrac'
3	163	0	0.012277	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'AKAbstractUnarchiver'	0	9
3	163	1	0.012291	1985432
3	163	R			'AKAbstrac'
3	164	0	0.012305	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'AKAbstractPostproc'	0	9
3	164	1	0.012318	1985432
3	164	R			'AKAbstrac'
3	165	0	0.012332	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'AKAbstractPartObserver'	0	9
3	165	1	0.012346	1985432
3	165	R			'AKAbstrac'
3	166	0	0.012359	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'AKPostprocDirect'	0	9
3	166	1	0.012373	1985432
3	166	R			'AKPostpro'
3	167	0	0.012386	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'AKPostprocFTP'	0	9
3	167	1	0.012400	1985432
3	167	R			'AKPostpro'
3	168	0	0.012413	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'AKPostprocSFTP'	0	9
3	168	1	0.012427	1985432
3	168	R			'AKPostpro'
3	169	0	0.012440	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'AKPostprocHybrid'	0	9
3	169	1	0.012454	1985432
3	169	R			'AKPostpro'
3	170	0	0.012467	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'AKUnarchiverJPA'	0	9
3	170	1	0.012481	1985432
3	170	R			'AKUnarchi'
3	171	0	0.012494	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'AKUnarchiverZIP'	0	9
3	171	1	0.012508	1985432
3	171	R			'AKUnarchi'
3	172	0	0.012525	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'AKUnarchiverJPS'	0	9
3	172	1	0.012539	1985432
3	172	R			'AKUnarchi'
3	173	0	0.012552	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'AKCoreTimer'	0	9
3	173	1	0.012565	1985432
3	173	R			'AKCoreTim'
3	174	0	0.012578	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'AKUtilsLister'	0	9
3	174	1	0.012592	1985432
3	174	R			'AKUtilsLi'
3	175	0	0.012605	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'AKText'	0	9
3	175	1	0.012618	1985392
3	175	R			'AKText'
3	176	0	0.012631	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'AKFactory'	0	9
3	176	1	0.012644	1985392
3	176	R			'AKFactory'
3	177	0	0.012657	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'AKEncryptionAES'	0	9
3	177	1	0.012671	1985432
3	177	R			'AKEncrypt'
3	178	0	0.012684	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'AKKickstartUtils'	0	9
3	178	1	0.012697	1985432
3	178	R			'AKKicksta'
3	179	0	0.012710	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'ExtractionObserver'	0	9
3	179	1	0.012724	1985432
3	179	R			'Extractio'
3	180	0	0.012737	1985296	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'AKFeatureURLImport'	0	9
3	180	1	0.012751	1985432
3	180	R			'AKFeature'
2		A						/var/www/html/uploads/ikstart.php	8002	$extraFeatureObjects[] = class AKFeatureURLImport { private $params = [] }
3	182	0	0.012786	1986104	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'Akeeba_Services_JSON'	0	9
3	182	1	0.012800	1986240
3	182	R			'Akeeba_Se'
3	183	0	0.012814	1986104	substr	0		/var/www/html/uploads/ikstart.php	8001	3	'Akeeba_Services_JSON_Error'	0	9
3	183	1	0.012828	1986240
3	183	R			'Akeeba_Se'
2	59	1	0.012843	1977856
1		A						/var/www/html/uploads/ikstart.php	10478	$retArray = ['status' => TRUE, 'message' => NULL]
2	184	0	0.012867	1977856	getQueryParam	1		/var/www/html/uploads/ikstart.php	10482	2	'task'	'display'
2		A						/var/www/html/uploads/ikstart.php	208	$value = 'display'
3	185	0	0.012892	1977856	array_key_exists	0		/var/www/html/uploads/ikstart.php	210	2	'task'	[]
3	185	1	0.012906	1977920
3	185	R			FALSE
3	186	0	0.012919	1977856	get_magic_quotes_gpc	0		/var/www/html/uploads/ikstart.php	215	0
3	186	1	0.012932	1977856
3	186	R			FALSE
2	184	1	0.012945	1977856
2	184	R			'display'
1		A						/var/www/html/uploads/ikstart.php	10482	$task = 'display'
2	187	0	0.012969	1977856	getQueryParam	1		/var/www/html/uploads/ikstart.php	10483	2	'json'	???
2		A						/var/www/html/uploads/ikstart.php	208	$value = NULL
3	188	0	0.012992	1977856	array_key_exists	0		/var/www/html/uploads/ikstart.php	210	2	'json'	[]
3	188	1	0.013006	1977920
3	188	R			FALSE
3	189	0	0.013018	1977856	get_magic_quotes_gpc	0		/var/www/html/uploads/ikstart.php	215	0
3	189	1	0.013030	1977856
3	189	R			FALSE
2	187	1	0.013043	1977856
2	187	R			NULL
1		A						/var/www/html/uploads/ikstart.php	10483	$json = NULL
1		A						/var/www/html/uploads/ikstart.php	10484	$ajax = TRUE
1		A						/var/www/html/uploads/ikstart.php	10691	$ajax = FALSE
2	190	0	0.013093	1977856	echoPage	1		/var/www/html/uploads/ikstart.php	10692	0
2		A						/var/www/html/uploads/ikstart.php	10171	$edition = 'Core'
3	191	0	0.013118	1977856	AKKickstartUtils::getBestArchivePath	1		/var/www/html/uploads/ikstart.php	10172	0
4	192	0	0.013134	1977856	AKKickstartUtils::getPath	1		/var/www/html/uploads/ikstart.php	7784	0
4		A						/var/www/html/uploads/ikstart.php	7814	$path = '/var/www/html/uploads'
5	193	0	0.013159	1977856	str_replace	0		/var/www/html/uploads/ikstart.php	7815	3	'\\'	'/'	'/var/www/html/uploads'
5	193	1	0.013175	1977952
5	193	R			'/var/www/html/uploads'
5	194	0	0.013190	1977856	rtrim	0		/var/www/html/uploads/ikstart.php	7815	2	'/var/www/html/uploads'	'/'
5	194	1	0.013203	1977928
5	194	R			'/var/www/html/uploads'
4		A						/var/www/html/uploads/ikstart.php	7815	$path = '/var/www/html/uploads'
4		A						/var/www/html/uploads/ikstart.php	7818	$path .= '/'
4	192	1	0.013244	1977904
4	192	R			'/var/www/html/uploads/'
3		A						/var/www/html/uploads/ikstart.php	7784	$basePath = '/var/www/html/uploads/'
4	195	0	0.013268	1977904	rtrim	0		/var/www/html/uploads/ikstart.php	7785	2	'/var/www/html/uploads/'	'/\\'
4	195	1	0.013282	1978024
4	195	R			'/var/www/html/uploads'
3		A						/var/www/html/uploads/ikstart.php	7785	$basePathSlash = '/var/www/html/uploads/'
3		A						/var/www/html/uploads/ikstart.php	7791	$paths = [0 => '/var/www/html/uploads/', 1 => '/var/www/html/uploads/administrator/components/com_akeeba/backup', 2 => '/var/www/html/uploads/backups', 3 => '/var/www/html/uploads/wp-content/plugins/akeebabackupwp/app/backups']
4	196	0	0.013326	1978576	AKKickstartUtils::findArchives	1		/var/www/html/uploads/ikstart.php	7796	1	'/var/www/html/uploads/'
4		A						/var/www/html/uploads/ikstart.php	7833	$ret = []
5	197	0	0.013352	1978576	opendir	0		/var/www/html/uploads/ikstart.php	7845	1	'/var/www/html/uploads/'
5	197	1	0.013379	1978856
5	197	R			resource(5) of type (stream)
4		A						/var/www/html/uploads/ikstart.php	7845	$dh = resource(5) of type (stream)
5	198	0	0.013407	1978824	readdir	0		/var/www/html/uploads/ikstart.php	7852	1	resource(5) of type (stream)
5	198	1	0.013427	1978896
5	198	R			'..'
4		A						/var/www/html/uploads/ikstart.php	7852	$file = '..'
5	199	0	0.013452	1978856	strrpos	0		/var/www/html/uploads/ikstart.php	7854	2	'..'	'.'
5	199	1	0.013465	1978928
5	199	R			1
4		A						/var/www/html/uploads/ikstart.php	7854	$dotpos = 1
5	200	0	0.013488	1978856	substr	0		/var/www/html/uploads/ikstart.php	7866	2	'..'	2
5	200	1	0.013502	1978920
5	200	R			''
5	201	0	0.013514	1978856	strtolower	0		/var/www/html/uploads/ikstart.php	7866	1	''
5	201	1	0.013527	1978888
5	201	R			''
4		A						/var/www/html/uploads/ikstart.php	7866	$extension = ''
5	202	0	0.013549	1978856	readdir	0		/var/www/html/uploads/ikstart.php	7852	1	resource(5) of type (stream)
5	202	1	0.013563	1978928
5	202	R			'.'
4		A						/var/www/html/uploads/ikstart.php	7852	$file = '.'
5	203	0	0.013585	1978856	strrpos	0		/var/www/html/uploads/ikstart.php	7854	2	'.'	'.'
5	203	1	0.013598	1978928
5	203	R			0
4		A						/var/www/html/uploads/ikstart.php	7854	$dotpos = 0
5	204	0	0.013620	1978856	substr	0		/var/www/html/uploads/ikstart.php	7866	2	'.'	1
5	204	1	0.013633	1978920
5	204	R			''
5	205	0	0.013645	1978856	strtolower	0		/var/www/html/uploads/ikstart.php	7866	1	''
5	205	1	0.013657	1978888
5	205	R			''
4		A						/var/www/html/uploads/ikstart.php	7866	$extension = ''
5	206	0	0.013679	1978856	readdir	0		/var/www/html/uploads/ikstart.php	7852	1	resource(5) of type (stream)
5	206	1	0.013692	1978936
5	206	R			'prepend.php'
4		A						/var/www/html/uploads/ikstart.php	7852	$file = 'prepend.php'
5	207	0	0.013716	1978864	strrpos	0		/var/www/html/uploads/ikstart.php	7854	2	'prepend.php'	'.'
5	207	1	0.013729	1978936
5	207	R			7
4		A						/var/www/html/uploads/ikstart.php	7854	$dotpos = 7
5	208	0	0.013751	1978864	substr	0		/var/www/html/uploads/ikstart.php	7866	2	'prepend.php'	8
5	208	1	0.013764	1978960
5	208	R			'php'
5	209	0	0.013776	1978896	strtolower	0		/var/www/html/uploads/ikstart.php	7866	1	'php'
5	209	1	0.013789	1978928
5	209	R			'php'
4		A						/var/www/html/uploads/ikstart.php	7866	$extension = 'php'
5	210	0	0.013812	1978896	readdir	0		/var/www/html/uploads/ikstart.php	7852	1	resource(5) of type (stream)
5	210	1	0.013826	1978968
5	210	R			'data'
4		A						/var/www/html/uploads/ikstart.php	7852	$file = 'data'
5	211	0	0.013849	1978888	strrpos	0		/var/www/html/uploads/ikstart.php	7854	2	'data'	'.'
5	211	1	0.013861	1978960
5	211	R			FALSE
4		A						/var/www/html/uploads/ikstart.php	7854	$dotpos = FALSE
5	212	0	0.013884	1978888	readdir	0		/var/www/html/uploads/ikstart.php	7852	1	resource(5) of type (stream)
5	212	1	0.013897	1978968
5	212	R			'.htaccess'
4		A						/var/www/html/uploads/ikstart.php	7852	$file = '.htaccess'
5	213	0	0.013920	1978896	strrpos	0		/var/www/html/uploads/ikstart.php	7854	2	'.htaccess'	'.'
5	213	1	0.013933	1978968
5	213	R			0
4		A						/var/www/html/uploads/ikstart.php	7854	$dotpos = 0
5	214	0	0.013959	1978896	substr	0		/var/www/html/uploads/ikstart.php	7866	2	'.htaccess'	1
5	214	1	0.013972	1979000
5	214	R			'htaccess'
5	215	0	0.013985	1978936	strtolower	0		/var/www/html/uploads/ikstart.php	7866	1	'htaccess'
5	215	1	0.013997	1978968
5	215	R			'htaccess'
4		A						/var/www/html/uploads/ikstart.php	7866	$extension = 'htaccess'
5	216	0	0.014021	1978904	readdir	0		/var/www/html/uploads/ikstart.php	7852	1	resource(5) of type (stream)
5	216	1	0.014034	1978984
5	216	R			'ikstart.php'
4		A						/var/www/html/uploads/ikstart.php	7852	$file = 'ikstart.php'
5	217	0	0.014058	1978904	strrpos	0		/var/www/html/uploads/ikstart.php	7854	2	'ikstart.php'	'.'
5	217	1	0.014070	1978976
5	217	R			7
4		A						/var/www/html/uploads/ikstart.php	7854	$dotpos = 7
5	218	0	0.014092	1978904	substr	0		/var/www/html/uploads/ikstart.php	7866	2	'ikstart.php'	8
5	218	1	0.014105	1979000
5	218	R			'php'
5	219	0	0.014117	1978936	strtolower	0		/var/www/html/uploads/ikstart.php	7866	1	'php'
5	219	1	0.014129	1978968
5	219	R			'php'
4		A						/var/www/html/uploads/ikstart.php	7866	$extension = 'php'
5	220	0	0.014152	1978896	readdir	0		/var/www/html/uploads/ikstart.php	7852	1	resource(5) of type (stream)
5	220	1	0.014167	1978936
5	220	R			FALSE
4		A						/var/www/html/uploads/ikstart.php	7852	$file = FALSE
5	221	0	0.014190	1978856	closedir	0		/var/www/html/uploads/ikstart.php	7874	1	resource(5) of type (stream)
5	221	1	0.014207	1978672
5	221	R			NULL
5	222	0	0.014220	1978632	dir	0		/var/www/html/uploads/ikstart.php	7882	1	'/var/www/html/uploads/'
5	222	1	0.014239	1979448
5	222	R			class Directory { public $path = '/var/www/html/uploads/'; public $handle = resource(6) of type (stream) }
4		A						/var/www/html/uploads/ikstart.php	7882	$d = class Directory { public $path = '/var/www/html/uploads/'; public $handle = resource(6) of type (stream) }
5	223	0	0.014282	1979408	Directory->read	0		/var/www/html/uploads/ikstart.php	7884	0
5	223	1	0.014299	1979440
5	223	R			'..'
4		A						/var/www/html/uploads/ikstart.php	7884	$file = '..'
5	224	0	0.014321	1979440	strrpos	0		/var/www/html/uploads/ikstart.php	7886	2	'..'	'.'
5	224	1	0.014334	1979512
5	224	R			1
4		A						/var/www/html/uploads/ikstart.php	7886	$dotpos = 1
5	225	0	0.014357	1979440	substr	0		/var/www/html/uploads/ikstart.php	7898	2	'..'	2
5	225	1	0.014369	1979504
5	225	R			''
5	226	0	0.014381	1979440	strtolower	0		/var/www/html/uploads/ikstart.php	7898	1	''
5	226	1	0.014393	1979472
5	226	R			''
4		A						/var/www/html/uploads/ikstart.php	7898	$extension = ''
5	227	0	0.014416	1979408	Directory->read	0		/var/www/html/uploads/ikstart.php	7884	0
5	227	1	0.014428	1979440
5	227	R			'.'
4		A						/var/www/html/uploads/ikstart.php	7884	$file = '.'
5	228	0	0.014451	1979408	strrpos	0		/var/www/html/uploads/ikstart.php	7886	2	'.'	'.'
5	228	1	0.014464	1979480
5	228	R			0
4		A						/var/www/html/uploads/ikstart.php	7886	$dotpos = 0
5	229	0	0.014485	1979408	substr	0		/var/www/html/uploads/ikstart.php	7898	2	'.'	1
5	229	1	0.014498	1979472
5	229	R			''
5	230	0	0.014510	1979408	strtolower	0		/var/www/html/uploads/ikstart.php	7898	1	''
5	230	1	0.014522	1979440
5	230	R			''
4		A						/var/www/html/uploads/ikstart.php	7898	$extension = ''
5	231	0	0.014544	1979408	Directory->read	0		/var/www/html/uploads/ikstart.php	7884	0
5	231	1	0.014556	1979448
5	231	R			'prepend.php'
4		A						/var/www/html/uploads/ikstart.php	7884	$file = 'prepend.php'
5	232	0	0.014580	1979416	strrpos	0		/var/www/html/uploads/ikstart.php	7886	2	'prepend.php'	'.'
5	232	1	0.014593	1979488
5	232	R			7
4		A						/var/www/html/uploads/ikstart.php	7886	$dotpos = 7
5	233	0	0.014615	1979416	substr	0		/var/www/html/uploads/ikstart.php	7898	2	'prepend.php'	8
5	233	1	0.014628	1979512
5	233	R			'php'
5	234	0	0.014641	1979448	strtolower	0		/var/www/html/uploads/ikstart.php	7898	1	'php'
5	234	1	0.014653	1979480
5	234	R			'php'
4		A						/var/www/html/uploads/ikstart.php	7898	$extension = 'php'
5	235	0	0.014680	1979448	Directory->read	0		/var/www/html/uploads/ikstart.php	7884	0
5	235	1	0.014693	1979480
5	235	R			'data'
4		A						/var/www/html/uploads/ikstart.php	7884	$file = 'data'
5	236	0	0.014715	1979440	strrpos	0		/var/www/html/uploads/ikstart.php	7886	2	'data'	'.'
5	236	1	0.014728	1979512
5	236	R			FALSE
4		A						/var/www/html/uploads/ikstart.php	7886	$dotpos = FALSE
5	237	0	0.014750	1979440	Directory->read	0		/var/www/html/uploads/ikstart.php	7884	0
5	237	1	0.014763	1979480
5	237	R			'.htaccess'
4		A						/var/www/html/uploads/ikstart.php	7884	$file = '.htaccess'
5	238	0	0.014786	1979448	strrpos	0		/var/www/html/uploads/ikstart.php	7886	2	'.htaccess'	'.'
5	238	1	0.014799	1979520
5	238	R			0
4		A						/var/www/html/uploads/ikstart.php	7886	$dotpos = 0
5	239	0	0.014821	1979448	substr	0		/var/www/html/uploads/ikstart.php	7898	2	'.htaccess'	1
5	239	1	0.014833	1979552
5	239	R			'htaccess'
5	240	0	0.014846	1979488	strtolower	0		/var/www/html/uploads/ikstart.php	7898	1	'htaccess'
5	240	1	0.014859	1979520
5	240	R			'htaccess'
4		A						/var/www/html/uploads/ikstart.php	7898	$extension = 'htaccess'
5	241	0	0.014881	1979456	Directory->read	0		/var/www/html/uploads/ikstart.php	7884	0
5	241	1	0.014894	1979496
5	241	R			'ikstart.php'
4		A						/var/www/html/uploads/ikstart.php	7884	$file = 'ikstart.php'
5	242	0	0.014918	1979456	strrpos	0		/var/www/html/uploads/ikstart.php	7886	2	'ikstart.php'	'.'
5	242	1	0.014930	1979528
5	242	R			7
4		A						/var/www/html/uploads/ikstart.php	7886	$dotpos = 7
5	243	0	0.014952	1979456	substr	0		/var/www/html/uploads/ikstart.php	7898	2	'ikstart.php'	8
5	243	1	0.014965	1979552
5	243	R			'php'
5	244	0	0.014977	1979488	strtolower	0		/var/www/html/uploads/ikstart.php	7898	1	'php'
5	244	1	0.014989	1979520
5	244	R			'php'
4		A						/var/www/html/uploads/ikstart.php	7898	$extension = 'php'
5	245	0	0.015011	1979448	Directory->read	0		/var/www/html/uploads/ikstart.php	7884	0
5	245	1	0.015024	1979448
5	245	R			FALSE
4		A						/var/www/html/uploads/ikstart.php	7884	$file = FALSE
4	196	1	0.015047	1978824
4	196	R			[]
3		A						/var/www/html/uploads/ikstart.php	7796	$archives = []
4	246	0	0.015071	1978824	AKKickstartUtils::findArchives	1		/var/www/html/uploads/ikstart.php	7796	1	'/var/www/html/uploads/administrator/components/com_akeeba/backup'
4		A						/var/www/html/uploads/ikstart.php	7833	$ret = []
5	247	0	0.015097	1978824	opendir	0		/var/www/html/uploads/ikstart.php	7845	1	'/var/www/html/uploads/administrator/components/com_akeeba/backup'
5	247	1	0.015227	1978856
5	247	R			FALSE
4		A						/var/www/html/uploads/ikstart.php	7845	$dh = FALSE
4	246	1	0.015256	1978824
4	246	R			[]
3		A						/var/www/html/uploads/ikstart.php	7796	$archives = []
4	248	0	0.015279	1978824	AKKickstartUtils::findArchives	1		/var/www/html/uploads/ikstart.php	7796	1	'/var/www/html/uploads/backups'
4		A						/var/www/html/uploads/ikstart.php	7833	$ret = []
5	249	0	0.015304	1978824	opendir	0		/var/www/html/uploads/ikstart.php	7845	1	'/var/www/html/uploads/backups'
5	249	1	0.015328	1978856
5	249	R			FALSE
4		A						/var/www/html/uploads/ikstart.php	7845	$dh = FALSE
4	248	1	0.015352	1978824
4	248	R			[]
3		A						/var/www/html/uploads/ikstart.php	7796	$archives = []
4	250	0	0.015375	1978824	AKKickstartUtils::findArchives	1		/var/www/html/uploads/ikstart.php	7796	1	'/var/www/html/uploads/wp-content/plugins/akeebabackupwp/app/backups'
4		A						/var/www/html/uploads/ikstart.php	7833	$ret = []
5	251	0	0.015400	1978824	opendir	0		/var/www/html/uploads/ikstart.php	7845	1	'/var/www/html/uploads/wp-content/plugins/akeebabackupwp/app/backups'
5	251	1	0.015423	1978856
5	251	R			FALSE
4		A						/var/www/html/uploads/ikstart.php	7845	$dh = FALSE
4	250	1	0.015446	1978824
4	250	R			[]
3		A						/var/www/html/uploads/ikstart.php	7796	$archives = []
3	191	1	0.015469	1978152
3	191	R			'/var/www/html/uploads/'
2		A						/var/www/html/uploads/ikstart.php	10172	$bestArchivePath = '/var/www/html/uploads/'
3	252	0	0.015495	1978152	AKKickstartUtils::getArchivesAsOptions	1		/var/www/html/uploads/ikstart.php	10173	1	'/var/www/html/uploads/'
3		A						/var/www/html/uploads/ikstart.php	7918	$ret = ''
4	253	0	0.015525	1978152	AKKickstartUtils::findArchives	1		/var/www/html/uploads/ikstart.php	7920	1	'/var/www/html/uploads/'
4		A						/var/www/html/uploads/ikstart.php	7833	$ret = []
5	254	0	0.015549	1978152	opendir	0		/var/www/html/uploads/ikstart.php	7845	1	'/var/www/html/uploads/'
5	254	1	0.015569	1978184
5	254	R			resource(7) of type (stream)
4		A						/var/www/html/uploads/ikstart.php	7845	$dh = resource(7) of type (stream)
5	255	0	0.015595	1978152	readdir	0		/var/www/html/uploads/ikstart.php	7852	1	resource(7) of type (stream)
5	255	1	0.015612	1978224
5	255	R			'..'
4		A						/var/www/html/uploads/ikstart.php	7852	$file = '..'
5	256	0	0.015635	1978184	strrpos	0		/var/www/html/uploads/ikstart.php	7854	2	'..'	'.'
5	256	1	0.015648	1978256
5	256	R			1
4		A						/var/www/html/uploads/ikstart.php	7854	$dotpos = 1
5	257	0	0.015671	1978184	substr	0		/var/www/html/uploads/ikstart.php	7866	2	'..'	2
5	257	1	0.015684	1978248
5	257	R			''
5	258	0	0.015696	1978184	strtolower	0		/var/www/html/uploads/ikstart.php	7866	1	''
5	258	1	0.015708	1978216
5	258	R			''
4		A						/var/www/html/uploads/ikstart.php	7866	$extension = ''
5	259	0	0.015730	1978184	readdir	0		/var/www/html/uploads/ikstart.php	7852	1	resource(7) of type (stream)
5	259	1	0.015743	1978256
5	259	R			'.'
4		A						/var/www/html/uploads/ikstart.php	7852	$file = '.'
5	260	0	0.015766	1978184	strrpos	0		/var/www/html/uploads/ikstart.php	7854	2	'.'	'.'
5	260	1	0.015778	1978256
5	260	R			0
4		A						/var/www/html/uploads/ikstart.php	7854	$dotpos = 0
5	261	0	0.015800	1978184	substr	0		/var/www/html/uploads/ikstart.php	7866	2	'.'	1
5	261	1	0.015813	1978248
5	261	R			''
5	262	0	0.015825	1978184	strtolower	0		/var/www/html/uploads/ikstart.php	7866	1	''
5	262	1	0.015837	1978216
5	262	R			''
4		A						/var/www/html/uploads/ikstart.php	7866	$extension = ''
5	263	0	0.015859	1978184	readdir	0		/var/www/html/uploads/ikstart.php	7852	1	resource(7) of type (stream)
5	263	1	0.015872	1978264
5	263	R			'prepend.php'
4		A						/var/www/html/uploads/ikstart.php	7852	$file = 'prepend.php'
5	264	0	0.015896	1978192	strrpos	0		/var/www/html/uploads/ikstart.php	7854	2	'prepend.php'	'.'
5	264	1	0.015909	1978264
5	264	R			7
4		A						/var/www/html/uploads/ikstart.php	7854	$dotpos = 7
5	265	0	0.015931	1978192	substr	0		/var/www/html/uploads/ikstart.php	7866	2	'prepend.php'	8
5	265	1	0.015944	1978288
5	265	R			'php'
5	266	0	0.015957	1978224	strtolower	0		/var/www/html/uploads/ikstart.php	7866	1	'php'
5	266	1	0.015969	1978256
5	266	R			'php'
4		A						/var/www/html/uploads/ikstart.php	7866	$extension = 'php'
5	267	0	0.015991	1978224	readdir	0		/var/www/html/uploads/ikstart.php	7852	1	resource(7) of type (stream)
5	267	1	0.016005	1978296
5	267	R			'data'
4		A						/var/www/html/uploads/ikstart.php	7852	$file = 'data'
5	268	0	0.016027	1978216	strrpos	0		/var/www/html/uploads/ikstart.php	7854	2	'data'	'.'
5	268	1	0.016040	1978288
5	268	R			FALSE
4		A						/var/www/html/uploads/ikstart.php	7854	$dotpos = FALSE
5	269	0	0.016062	1978216	readdir	0		/var/www/html/uploads/ikstart.php	7852	1	resource(7) of type (stream)
5	269	1	0.016075	1978296
5	269	R			'.htaccess'
4		A						/var/www/html/uploads/ikstart.php	7852	$file = '.htaccess'
5	270	0	0.016098	1978224	strrpos	0		/var/www/html/uploads/ikstart.php	7854	2	'.htaccess'	'.'
5	270	1	0.016111	1978296
5	270	R			0
4		A						/var/www/html/uploads/ikstart.php	7854	$dotpos = 0
5	271	0	0.016133	1978224	substr	0		/var/www/html/uploads/ikstart.php	7866	2	'.htaccess'	1
5	271	1	0.016146	1978328
5	271	R			'htaccess'
5	272	0	0.016159	1978264	strtolower	0		/var/www/html/uploads/ikstart.php	7866	1	'htaccess'
5	272	1	0.016171	1978296
5	272	R			'htaccess'
4		A						/var/www/html/uploads/ikstart.php	7866	$extension = 'htaccess'
5	273	0	0.016195	1978232	readdir	0		/var/www/html/uploads/ikstart.php	7852	1	resource(7) of type (stream)
5	273	1	0.016212	1978312
5	273	R			'ikstart.php'
4		A						/var/www/html/uploads/ikstart.php	7852	$file = 'ikstart.php'
5	274	0	0.016242	1978232	strrpos	0		/var/www/html/uploads/ikstart.php	7854	2	'ikstart.php'	'.'
5	274	1	0.016255	1978304
5	274	R			7
4		A						/var/www/html/uploads/ikstart.php	7854	$dotpos = 7
5	275	0	0.016276	1978232	substr	0		/var/www/html/uploads/ikstart.php	7866	2	'ikstart.php'	8
5	275	1	0.016289	1978328
5	275	R			'php'
5	276	0	0.016302	1978264	strtolower	0		/var/www/html/uploads/ikstart.php	7866	1	'php'
5	276	1	0.016314	1978296
5	276	R			'php'
4		A						/var/www/html/uploads/ikstart.php	7866	$extension = 'php'
5	277	0	0.016337	1978224	readdir	0		/var/www/html/uploads/ikstart.php	7852	1	resource(7) of type (stream)
5	277	1	0.016351	1978264
5	277	R			FALSE
4		A						/var/www/html/uploads/ikstart.php	7852	$file = FALSE
5	278	0	0.016374	1978184	closedir	0		/var/www/html/uploads/ikstart.php	7874	1	resource(7) of type (stream)
5	278	1	0.016389	1978000
5	278	R			NULL
5	279	0	0.016402	1977960	dir	0		/var/www/html/uploads/ikstart.php	7882	1	'/var/www/html/uploads/'
5	279	1	0.016419	1978776
5	279	R			class Directory { public $path = '/var/www/html/uploads/'; public $handle = resource(8) of type (stream) }
4		A						/var/www/html/uploads/ikstart.php	7882	$d = class Directory { public $path = '/var/www/html/uploads/'; public $handle = resource(8) of type (stream) }
5	280	0	0.016456	1978736	Directory->read	0		/var/www/html/uploads/ikstart.php	7884	0
5	280	1	0.016472	1978768
5	280	R			'..'
4		A						/var/www/html/uploads/ikstart.php	7884	$file = '..'
5	281	0	0.016495	1978768	strrpos	0		/var/www/html/uploads/ikstart.php	7886	2	'..'	'.'
5	281	1	0.016507	1978840
5	281	R			1
4		A						/var/www/html/uploads/ikstart.php	7886	$dotpos = 1
5	282	0	0.016529	1978768	substr	0		/var/www/html/uploads/ikstart.php	7898	2	'..'	2
5	282	1	0.016542	1978832
5	282	R			''
5	283	0	0.016554	1978768	strtolower	0		/var/www/html/uploads/ikstart.php	7898	1	''
5	283	1	0.016566	1978800
5	283	R			''
4		A						/var/www/html/uploads/ikstart.php	7898	$extension = ''
5	284	0	0.016588	1978736	Directory->read	0		/var/www/html/uploads/ikstart.php	7884	0
5	284	1	0.016601	1978768
5	284	R			'.'
4		A						/var/www/html/uploads/ikstart.php	7884	$file = '.'
5	285	0	0.016623	1978736	strrpos	0		/var/www/html/uploads/ikstart.php	7886	2	'.'	'.'
5	285	1	0.016635	1978808
5	285	R			0
4		A						/var/www/html/uploads/ikstart.php	7886	$dotpos = 0
5	286	0	0.016657	1978736	substr	0		/var/www/html/uploads/ikstart.php	7898	2	'.'	1
5	286	1	0.016669	1978800
5	286	R			''
5	287	0	0.016681	1978736	strtolower	0		/var/www/html/uploads/ikstart.php	7898	1	''
5	287	1	0.016693	1978768
5	287	R			''
4		A						/var/www/html/uploads/ikstart.php	7898	$extension = ''
5	288	0	0.016714	1978736	Directory->read	0		/var/www/html/uploads/ikstart.php	7884	0
5	288	1	0.016726	1978776
5	288	R			'prepend.php'
4		A						/var/www/html/uploads/ikstart.php	7884	$file = 'prepend.php'
5	289	0	0.016750	1978744	strrpos	0		/var/www/html/uploads/ikstart.php	7886	2	'prepend.php'	'.'
5	289	1	0.016763	1978816
5	289	R			7
4		A						/var/www/html/uploads/ikstart.php	7886	$dotpos = 7
5	290	0	0.016784	1978744	substr	0		/var/www/html/uploads/ikstart.php	7898	2	'prepend.php'	8
5	290	1	0.016797	1978840
5	290	R			'php'
5	291	0	0.016809	1978776	strtolower	0		/var/www/html/uploads/ikstart.php	7898	1	'php'
5	291	1	0.016821	1978808
5	291	R			'php'
4		A						/var/www/html/uploads/ikstart.php	7898	$extension = 'php'
5	292	0	0.016844	1978776	Directory->read	0		/var/www/html/uploads/ikstart.php	7884	0
5	292	1	0.016857	1978808
5	292	R			'data'
4		A						/var/www/html/uploads/ikstart.php	7884	$file = 'data'
5	293	0	0.016879	1978768	strrpos	0		/var/www/html/uploads/ikstart.php	7886	2	'data'	'.'
5	293	1	0.016891	1978840
5	293	R			FALSE
4		A						/var/www/html/uploads/ikstart.php	7886	$dotpos = FALSE
5	294	0	0.016914	1978768	Directory->read	0		/var/www/html/uploads/ikstart.php	7884	0
5	294	1	0.016930	1978808
5	294	R			'.htaccess'
4		A						/var/www/html/uploads/ikstart.php	7884	$file = '.htaccess'
5	295	0	0.016953	1978776	strrpos	0		/var/www/html/uploads/ikstart.php	7886	2	'.htaccess'	'.'
5	295	1	0.016966	1978848
5	295	R			0
4		A						/var/www/html/uploads/ikstart.php	7886	$dotpos = 0
5	296	0	0.016988	1978776	substr	0		/var/www/html/uploads/ikstart.php	7898	2	'.htaccess'	1
5	296	1	0.017000	1978880
5	296	R			'htaccess'
5	297	0	0.017014	1978816	strtolower	0		/var/www/html/uploads/ikstart.php	7898	1	'htaccess'
5	297	1	0.017025	1978848
5	297	R			'htaccess'
4		A						/var/www/html/uploads/ikstart.php	7898	$extension = 'htaccess'
5	298	0	0.017048	1978784	Directory->read	0		/var/www/html/uploads/ikstart.php	7884	0
5	298	1	0.017060	1978824
5	298	R			'ikstart.php'
4		A						/var/www/html/uploads/ikstart.php	7884	$file = 'ikstart.php'
5	299	0	0.017084	1978784	strrpos	0		/var/www/html/uploads/ikstart.php	7886	2	'ikstart.php'	'.'
5	299	1	0.017097	1978856
5	299	R			7
4		A						/var/www/html/uploads/ikstart.php	7886	$dotpos = 7
5	300	0	0.017118	1978784	substr	0		/var/www/html/uploads/ikstart.php	7898	2	'ikstart.php'	8
5	300	1	0.017131	1978880
5	300	R			'php'
5	301	0	0.017144	1978816	strtolower	0		/var/www/html/uploads/ikstart.php	7898	1	'php'
5	301	1	0.017155	1978848
5	301	R			'php'
4		A						/var/www/html/uploads/ikstart.php	7898	$extension = 'php'
5	302	0	0.017178	1978776	Directory->read	0		/var/www/html/uploads/ikstart.php	7884	0
5	302	1	0.017191	1978776
5	302	R			FALSE
4		A						/var/www/html/uploads/ikstart.php	7884	$file = FALSE
4	253	1	0.017214	1978152
4	253	R			[]
3		A						/var/www/html/uploads/ikstart.php	7920	$archives = []
3	252	1	0.017237	1978152
3	252	R			''
2		A						/var/www/html/uploads/ikstart.php	10173	$filelist = ''
3	303	0	0.017263	1978152	echoCSS	1		/var/www/html/uploads/ikstart.php	10181	0
4	304	0	0.017628	1998744	callExtraFeature	1		/var/www/html/uploads/ikstart.php	9028	2	'onExtraHeadCSS'	???
4		A						/var/www/html/uploads/ikstart.php	8015	$result = NULL
5	305	0	0.017658	1998744	method_exists	0		/var/www/html/uploads/ikstart.php	8017	2	class AKFeatureURLImport { private $params = [] }	'onExtraHeadCSS'
5	305	1	0.017677	1998808
5	305	R			TRUE
5	306	0	0.017692	1998744	AKFeatureURLImport->onExtraHeadCSS	1		/var/www/html/uploads/ikstart.php	8020	1	[]
5	306	1	0.017707	1998744
5	306	R			NULL
4		A						/var/www/html/uploads/ikstart.php	8020	$result = NULL
4	304	1	0.017731	1998744
3	303	1	0.017738	1998744
3	307	0	0.017745	1998744	file_exists	0		/var/www/html/uploads/ikstart.php	10183	1	'jquery.min.js'
3	307	1	0.017766	1998784
3	307	R			FALSE
3	308	0	0.017780	1998744	file_exists	0		/var/www/html/uploads/ikstart.php	10188	1	'json2.min.js'
3	308	1	0.017796	1998784
3	308	R			FALSE
3	309	0	0.017810	1998744	file_exists	0		/var/www/html/uploads/ikstart.php	10193	1	'jquery-ui.min.js'
3	309	1	0.017826	1998784
3	309	R			FALSE
3	310	0	0.017839	1998744	echoHeadJavascript	1		/var/www/html/uploads/ikstart.php	10198	0
4	311	0	0.017855	1998744	TranslateWinPath	1		/var/www/html/uploads/ikstart.php	9046	1	'/var/www/html/uploads'
4		A						/var/www/html/uploads/ikstart.php	8038	$is_unc = FALSE
5	312	0	0.017879	1998744	str_replace	0		/var/www/html/uploads/ikstart.php	8052	3	'///'	'/'	'/var/www/html/uploads'
5	312	1	0.017895	1998840
5	312	R			'/var/www/html/uploads'
4		A						/var/www/html/uploads/ikstart.php	8052	$p_path = '/var/www/html/uploads'
5	313	0	0.017920	1998744	str_replace	0		/var/www/html/uploads/ikstart.php	8053	3	'//'	'/'	'/var/www/html/uploads'
5	313	1	0.017934	1998840
5	313	R			'/var/www/html/uploads'
4		A						/var/www/html/uploads/ikstart.php	8053	$p_path = '/var/www/html/uploads'
4	311	1	0.017958	1998744
4	311	R			'/var/www/html/uploads'
4	314	0	0.017973	1998744	echoTranslationStrings	1		/var/www/html/uploads/ikstart.php	9112	0
5	315	0	0.017986	1998744	callExtraFeature	1		/var/www/html/uploads/ikstart.php	10164	2	'onLoadTranslations'	???
5		A						/var/www/html/uploads/ikstart.php	8015	$result = NULL
6	316	0	0.018018	1998744	method_exists	0		/var/www/html/uploads/ikstart.php	8017	2	class AKFeatureURLImport { private $params = [] }	'onLoadTranslations'
6	316	1	0.018037	1998808
6	316	R			TRUE
6	317	0	0.018051	1998744	AKFeatureURLImport->onLoadTranslations	1		/var/www/html/uploads/ikstart.php	8020	1	[]
7	318	0	0.018067	1998744	AKText::getInstance	1		/var/www/html/uploads/ikstart.php	11314	0
8	319	0	0.018081	1998928	AKText->__construct	1		/var/www/html/uploads/ikstart.php	6386	0
8		A						/var/www/html/uploads/ikstart.php	6365	$this->strings = ['AUTOMODEON' => 'Auto-mode enabled', 'ERR_NOT_A_JPA_FILE' => 'The file is not a JPA archive', 'ERR_CORRUPT_ARCHIVE' => 'The archive file is corrupt, truncated or archive parts are missing', 'ERR_INVALID_LOGIN' => 'Invalid login', 'COULDNT_CREATE_DIR' => 'Could not create %s folder', 'COULDNT_WRITE_FILE' => 'Could not open %s for writing.', 'WRONG_FTP_HOST' => 'Wrong FTP host or port', 'WRONG_FTP_USER' => 'Wrong FTP username or password', 'WRONG_FTP_PATH1' => 'Wrong FTP initial directory - the directory doesn\'t exist', 'FTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'FTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'SFTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'FTP_COULDNT_UPLOAD' => 'Could not upload %s', 'THINGS_HEADER' => 'Things you should know about Akeeba Kickstart', 'THINGS_01' => 'Kickstart is not an installer. It is an archive extraction tool. The actual installer was put inside the archive file at backup time.', 'THINGS_02' => 'Kickstart is not the only way to extract the backup archive. You can use Akeeba eXtract Wizard and upload the extracted files using FTP instead.', 'THINGS_03' => 'Kickstart is bound by your server\'s configuration. As such, it may not work at all.', 'THINGS_04' => 'You should download and upload your archive files using FTP in Binary transfer mode. Any other method could lead to a corrupt backup archive and restoration failure.', 'THINGS_05' => 'Post-restoration site load errors are usually caused by .htaccess or php.ini directives. You should understand that blank pages, 404 and 500 errors can usually be worked around by editing the aforementioned files. It is not our job to mess with your configuration files, because this could be dangerous for your site.', 'THINGS_06' => 'Kickstart overwrites files without a warning. If you are not sure that you are OK with that do not continue.', 'THINGS_07' => 'Trying to restore to the temporary URL of a cPanel host (e.g. http://1.2.3.4/~username) will lead to restoration failure and your site will appear to be not working. This is normal and it\'s just how your server and CMS software work.', 'THINGS_08' => 'You are supposed to read the documentation before using this software. Most issues can be avoided, or easily worked around, by understanding how this software works.', 'THINGS_09' => 'This text does not imply that there is a problem detected. It is standard text displayed every time you launch Kickstart.', 'CLOSE_LIGHTBOX' => 'Click here or press ESC to close this message', 'SELECT_ARCHIVE' => 'Select a backup archive', 'ARCHIVE_FILE' => 'Archive file:', 'SELECT_EXTRACTION' => 'Select an extraction method', 'WRITE_TO_FILES' => 'Write to files:', 'WRITE_HYBRID' => 'Hybrid (use FTP only if needed)', 'WRITE_DIRECTLY' => 'Directly', 'WRITE_FTP' => 'Use FTP for all files', 'WRITE_SFTP' => 'Use SFTP for all files', 'FTP_HOST' => '(S)FTP host name:', 'FTP_PORT' => '(S)FTP port:', 'FTP_FTPS' => 'Use FTP over SSL (FTPS)', 'FTP_PASSIVE' => 'Use FTP Passive Mode', 'FTP_USER' => '(S)FTP user name:', 'FTP_PASS' => '(S)FTP password:', 'FTP_DIR' => '(S)FTP directory:', 'FTP_TEMPDIR' => 'Temporary directory:', 'FTP_CONNECTION_OK' => 'FTP Connection Established', 'SFTP_CONNECTION_OK' => 'SFTP Connection Established', 'FTP_CONNECTION_FAILURE' => 'The FTP Connection Failed', 'SFTP_CONNECTION_FAILURE' => 'The SFTP Connection Failed', 'FTP_TEMPDIR_WRITABLE' => 'The temporary directory is writable.', 'FTP_TEMPDIR_UNWRITABLE' => 'The temporary directory is not writable. Please check the permissions.', 'FTPBROWSER_ERROR_HOSTNAME' => 'Invalid FTP host or port', 'FTPBROWSER_ERROR_USERPASS' => 'Invalid FTP username or password', 'FTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'FTPBROWSER_ERROR_UNSUPPORTED' => 'Sorry, your FTP server doesn\'t support our FTP directory browser.', 'FTPBROWSER_LBL_GOPARENT' => '&lt;up one level&gt;', 'FTPBROWSER_LBL_INSTRUCTIONS' => 'Click on a directory to navigate into it. Click on OK to select that directory, Cancel to abort the procedure.', 'FTPBROWSER_LBL_ERROR' => 'An error occurred', 'SFTP_NO_SSH2' => 'Your web server does not have the SSH2 PHP module, therefore can not connect to SFTP servers.', 'SFTP_NO_FTP_SUPPORT' => 'Your SSH server does not allow SFTP connections', 'SFTP_WRONG_USER' => 'Wrong SFTP username or password', 'SFTP_WRONG_STARTING_DIR' => 'You must supply a valid absolute path', 'SFTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'SFTP_COULDNT_UPLOAD' => 'Could not upload %s', 'SFTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'UI-ROOT' => '&lt;root&gt;', 'CONFIG_UI_FTPBROWSER_TITLE' => 'FTP Directory Browser', 'FTP_BROWSE' => 'Browse', 'BTN_CHECK' => 'Check', 'BTN_RESET' => 'Reset', 'BTN_TESTFTPCON' => 'Test FTP connection', 'BTN_TESTSFTPCON' => 'Test SFTP connection', 'BTN_GOTOSTART' => 'Start over', 'FINE_TUNE' => 'Fine tune', 'MIN_EXEC_TIME' => 'Minimum execution time:', 'MAX_EXEC_TIME' => 'Maximum execution time:', 'SECONDS_PER_STEP' => 'seconds per step', 'EXTRACT_FILES' => 'Extract files', 'BTN_START' => 'Start', 'EXTRACTING' => 'Extracting', 'DO_NOT_CLOSE_EXTRACT' => 'Do not close this window while the extraction is in progress', 'RESTACLEANUP' => 'Restoration and Clean Up', 'BTN_RUNINSTALLER' => 'Run the Installer', 'BTN_CLEANUP' => 'Clean Up', 'BTN_SITEFE' => 'Visit your site\'s front-end', 'BTN_SITEBE' => 'Visit your site\'s back-end', 'WARNINGS' => 'Extraction Warnings', 'ERROR_OCCURED' => 'An error occured', 'STEALTH_MODE' => 'Stealth mode', 'STEALTH_URL' => 'HTML file to show to web visitors', 'ERR_NOT_A_JPS_FILE' => 'The file is not a JPA archive', 'ERR_INVALID_JPS_PASSWORD' => 'The password you gave is wrong or the archive is corrupt', 'JPS_PASSWORD' => 'Archive Password (for JPS files)', 'INVALID_FILE_HEADER' => 'Invalid header in archive file, part %s, offset %s', 'NEEDSOMEHELPKS' => 'Want some help to use this tool? Read this first:', 'QUICKSTART' => 'Quick Start Guide', 'CANTGETITTOWORK' => 'Can\'t get it to work? Click me!', 'NOARCHIVESCLICKHERE' => 'No archives detected. Click here for troubleshooting instructions.', 'POSTRESTORATIONTROUBLESHOOTING' => 'Something not working after the restoration? Click here for troubleshooting instructions.', 'UPDATE_HEADER' => 'An updated version of Akeeba Kickstart (<span id="update-version">unknown</span>) is available!', 'UPDATE_NOTICE' => 'You are advised to always use the latest version of Akeeba Kickstart available. Older versions may be subject to bugs and will not be supported.', 'UPDATE_DLNOW' => 'Download now', 'UPDATE_MOREINFO' => 'More information', 'IGNORE_MOST_ERRORS' => 'Ignore most errors', 'WRONG_FTP_PATH2' => 'Wrong FTP initial directory - the directory doesn\'t correspond to your site\'s web root', 'ARCHIVE_DIRECTORY' => 'Archive directory:', 'RELOAD_ARCHIVES' => 'Reload', 'CONFIG_UI_SFTPBROWSER_TITLE' => 'SFTP Directory Browser', 'ERR_COULD_NOT_OPEN_ARCHIVE_PART' => 'Could not open archive part file %s for reading. Check that the file exists, is readable by the web server and is not in a directory made out of reach by chroot, open_basedir restrictions or any other restriction put in place by your host.']
9	320	0	0.018317	1998928	AKText->loadTranslation	1		/var/www/html/uploads/ikstart.php	6367	1	'en-GB'
9		A						/var/www/html/uploads/ikstart.php	6555	$dirname = '/var/www/html/uploads'
10	321	0	0.018344	1998928	basename	0		/var/www/html/uploads/ikstart.php	6561	2	'/var/www/html/uploads/ikstart.php'	'.php'
10	321	1	0.018389	1999024
10	321	R			'ikstart'
9		A						/var/www/html/uploads/ikstart.php	6561	$basename = 'ikstart.ini'
9		A						/var/www/html/uploads/ikstart.php	6564	$translationFilename = '/var/www/html/uploads/en-GB.ikstart.ini'
10	322	0	0.018429	1999032	file_exists	0		/var/www/html/uploads/ikstart.php	6565	1	'/var/www/html/uploads/en-GB.ikstart.ini'
10	322	1	0.018453	1999072
10	322	R			FALSE
9		A						/var/www/html/uploads/ikstart.php	6566	$basename = 'kickstart.ini'
9		A						/var/www/html/uploads/ikstart.php	6567	$translationFilename = '/var/www/html/uploads/en-GB.kickstart.ini'
10	323	0	0.018491	1999008	file_exists	0		/var/www/html/uploads/ikstart.php	6569	1	'/var/www/html/uploads/en-GB.kickstart.ini'
10	323	1	0.018510	1999048
10	323	R			FALSE
9	320	1	0.018524	1998928
9	324	0	0.018531	1998928	AKText->getBrowserLanguage	1		/var/www/html/uploads/ikstart.php	6369	0
9		A						/var/www/html/uploads/ikstart.php	6457	$user_languages = []
9		A						/var/www/html/uploads/ikstart.php	6486	$user_languages[0] = [0 => '', 1 => '']
9		A						/var/www/html/uploads/ikstart.php	6489	$this->language = NULL
10	325	0	0.018582	1999304	basename	0		/var/www/html/uploads/ikstart.php	6490	2	'/var/www/html/uploads/ikstart.php'	'.php'
10	325	1	0.018598	1999400
10	325	R			'ikstart'
9		A						/var/www/html/uploads/ikstart.php	6490	$basename = 'ikstart.ini'
10	326	0	0.018623	1999344	class_exists	0		/var/www/html/uploads/ikstart.php	6493	1	'AKUtilsLister'
10	326	1	0.018636	1999384
10	326	R			TRUE
10	327	0	0.018650	1999456	AKAbstractObject->__construct	1		/var/www/html/uploads/ikstart.php	6495	0
10	327	1	0.018664	1999456
9		A						/var/www/html/uploads/ikstart.php	6495	$fs = class AKUtilsLister { private ${AKAbstractObject}_errors = []; protected $_errors_queue_size = 0; private ${AKAbstractObject}_warnings = []; protected $_warnings_queue_size = 0 }
10	328	0	0.018692	1999872	AKUtilsLister->getFiles	1		/var/www/html/uploads/ikstart.php	6496	2	'/var/www/html/uploads'	'*.ikstart.ini'
10		A						/var/www/html/uploads/ikstart.php	6153	$arr = []
10		A						/var/www/html/uploads/ikstart.php	6154	$false = FALSE
11	329	0	0.018728	1999872	is_dir	0		/var/www/html/uploads/ikstart.php	6156	1	'/var/www/html/uploads'
11	329	1	0.018745	1999920
11	329	R			TRUE
11	330	0	0.018758	1999880	opendir	0		/var/www/html/uploads/ikstart.php	6158	1	'/var/www/html/uploads'
11	330	1	0.018779	1999912
11	330	R			resource(9) of type (stream)
10		A						/var/www/html/uploads/ikstart.php	6158	$handle = resource(9) of type (stream)
11	331	0	0.018807	1999880	readdir	0		/var/www/html/uploads/ikstart.php	6165	1	resource(9) of type (stream)
11	331	1	0.018824	1999952
11	331	R			'..'
10		A						/var/www/html/uploads/ikstart.php	6165	$file = '..'
11	332	0	0.018848	1999912	fnmatch	0		/var/www/html/uploads/ikstart.php	6167	2	'*.ikstart.ini'	'..'
11	332	1	0.018866	1999984
11	332	R			FALSE
11	333	0	0.018879	1999912	readdir	0		/var/www/html/uploads/ikstart.php	6165	1	resource(9) of type (stream)
11	333	1	0.018893	1999984
11	333	R			'.'
10		A						/var/www/html/uploads/ikstart.php	6165	$file = '.'
11	334	0	0.018915	1999912	fnmatch	0		/var/www/html/uploads/ikstart.php	6167	2	'*.ikstart.ini'	'.'
11	334	1	0.018929	1999984
11	334	R			FALSE
11	335	0	0.018942	1999912	readdir	0		/var/www/html/uploads/ikstart.php	6165	1	resource(9) of type (stream)
11	335	1	0.018955	1999992
11	335	R			'prepend.php'
10		A						/var/www/html/uploads/ikstart.php	6165	$file = 'prepend.php'
11	336	0	0.018979	1999920	fnmatch	0		/var/www/html/uploads/ikstart.php	6167	2	'*.ikstart.ini'	'prepend.php'
11	336	1	0.018994	1999992
11	336	R			FALSE
11	337	0	0.019007	1999920	readdir	0		/var/www/html/uploads/ikstart.php	6165	1	resource(9) of type (stream)
11	337	1	0.019019	1999992
11	337	R			'data'
10		A						/var/www/html/uploads/ikstart.php	6165	$file = 'data'
11	338	0	0.019042	1999912	fnmatch	0		/var/www/html/uploads/ikstart.php	6167	2	'*.ikstart.ini'	'data'
11	338	1	0.019056	1999984
11	338	R			FALSE
11	339	0	0.019069	1999912	readdir	0		/var/www/html/uploads/ikstart.php	6165	1	resource(9) of type (stream)
11	339	1	0.019081	1999992
11	339	R			'.htaccess'
10		A						/var/www/html/uploads/ikstart.php	6165	$file = '.htaccess'
11	340	0	0.019105	1999920	fnmatch	0		/var/www/html/uploads/ikstart.php	6167	2	'*.ikstart.ini'	'.htaccess'
11	340	1	0.019119	1999992
11	340	R			FALSE
11	341	0	0.019132	1999920	readdir	0		/var/www/html/uploads/ikstart.php	6165	1	resource(9) of type (stream)
11	341	1	0.019145	2000000
11	341	R			'ikstart.php'
10		A						/var/www/html/uploads/ikstart.php	6165	$file = 'ikstart.php'
11	342	0	0.019189	1999920	fnmatch	0		/var/www/html/uploads/ikstart.php	6167	2	'*.ikstart.ini'	'ikstart.php'
11	342	1	0.019204	1999992
11	342	R			FALSE
11	343	0	0.019217	1999920	readdir	0		/var/www/html/uploads/ikstart.php	6165	1	resource(9) of type (stream)
11	343	1	0.019231	1999960
11	343	R			FALSE
10		A						/var/www/html/uploads/ikstart.php	6165	$file = FALSE
11	344	0	0.019254	1999880	closedir	0		/var/www/html/uploads/ikstart.php	6179	1	resource(9) of type (stream)
11	344	1	0.019269	1999696
11	344	R			NULL
10	328	1	0.019283	1999656
10	328	R			[]
9		A						/var/www/html/uploads/ikstart.php	6496	$iniFiles = []
9		A						/var/www/html/uploads/ikstart.php	6498	$basename = 'kickstart.ini'
10	345	0	0.019318	1999592	AKUtilsLister->getFiles	1		/var/www/html/uploads/ikstart.php	6499	2	'/var/www/html/uploads'	'*.kickstart.ini'
10		A						/var/www/html/uploads/ikstart.php	6153	$arr = []
10		A						/var/www/html/uploads/ikstart.php	6154	$false = FALSE
11	346	0	0.019353	1999592	is_dir	0		/var/www/html/uploads/ikstart.php	6156	1	'/var/www/html/uploads'
11	346	1	0.019366	1999632
11	346	R			TRUE
11	347	0	0.019379	1999592	opendir	0		/var/www/html/uploads/ikstart.php	6158	1	'/var/www/html/uploads'
11	347	1	0.019397	1999872
11	347	R			resource(10) of type (stream)
10		A						/var/www/html/uploads/ikstart.php	6158	$handle = resource(10) of type (stream)
11	348	0	0.019424	1999840	readdir	0		/var/www/html/uploads/ikstart.php	6165	1	resource(10) of type (stream)
11	348	1	0.019441	1999912
11	348	R			'..'
10		A						/var/www/html/uploads/ikstart.php	6165	$file = '..'
11	349	0	0.019464	1999872	fnmatch	0		/var/www/html/uploads/ikstart.php	6167	2	'*.kickstart.ini'	'..'
11	349	1	0.019478	1999944
11	349	R			FALSE
11	350	0	0.019491	1999872	readdir	0		/var/www/html/uploads/ikstart.php	6165	1	resource(10) of type (stream)
11	350	1	0.019505	1999944
11	350	R			'.'
10		A						/var/www/html/uploads/ikstart.php	6165	$file = '.'
11	351	0	0.019527	1999872	fnmatch	0		/var/www/html/uploads/ikstart.php	6167	2	'*.kickstart.ini'	'.'
11	351	1	0.019541	1999944
11	351	R			FALSE
11	352	0	0.019553	1999872	readdir	0		/var/www/html/uploads/ikstart.php	6165	1	resource(10) of type (stream)
11	352	1	0.019567	1999952
11	352	R			'prepend.php'
10		A						/var/www/html/uploads/ikstart.php	6165	$file = 'prepend.php'
11	353	0	0.019591	1999880	fnmatch	0		/var/www/html/uploads/ikstart.php	6167	2	'*.kickstart.ini'	'prepend.php'
11	353	1	0.019605	1999952
11	353	R			FALSE
11	354	0	0.019618	1999880	readdir	0		/var/www/html/uploads/ikstart.php	6165	1	resource(10) of type (stream)
11	354	1	0.019631	1999952
11	354	R			'data'
10		A						/var/www/html/uploads/ikstart.php	6165	$file = 'data'
11	355	0	0.019654	1999872	fnmatch	0		/var/www/html/uploads/ikstart.php	6167	2	'*.kickstart.ini'	'data'
11	355	1	0.019667	1999944
11	355	R			FALSE
11	356	0	0.019680	1999872	readdir	0		/var/www/html/uploads/ikstart.php	6165	1	resource(10) of type (stream)
11	356	1	0.019694	1999952
11	356	R			'.htaccess'
10		A						/var/www/html/uploads/ikstart.php	6165	$file = '.htaccess'
11	357	0	0.019717	1999880	fnmatch	0		/var/www/html/uploads/ikstart.php	6167	2	'*.kickstart.ini'	'.htaccess'
11	357	1	0.019731	1999952
11	357	R			FALSE
11	358	0	0.019743	1999880	readdir	0		/var/www/html/uploads/ikstart.php	6165	1	resource(10) of type (stream)
11	358	1	0.019756	1999960
11	358	R			'ikstart.php'
10		A						/var/www/html/uploads/ikstart.php	6165	$file = 'ikstart.php'
11	359	0	0.019779	1999880	fnmatch	0		/var/www/html/uploads/ikstart.php	6167	2	'*.kickstart.ini'	'ikstart.php'
11	359	1	0.019793	1999952
11	359	R			FALSE
11	360	0	0.019806	1999880	readdir	0		/var/www/html/uploads/ikstart.php	6165	1	resource(10) of type (stream)
11	360	1	0.019820	1999920
11	360	R			FALSE
10		A						/var/www/html/uploads/ikstart.php	6165	$file = FALSE
11	361	0	0.019843	1999840	closedir	0		/var/www/html/uploads/ikstart.php	6179	1	resource(10) of type (stream)
11	361	1	0.019858	1999656
11	361	R			NULL
10	345	1	0.019871	1999616
10	345	R			[]
9		A						/var/www/html/uploads/ikstart.php	6499	$iniFiles = []
10	362	0	0.019899	1999600	AKUtilsLister->getFiles	1		/var/www/html/uploads/ikstart.php	6513	2	'/var/www/html/uploads'	'-??.kickstart.ini'
10		A						/var/www/html/uploads/ikstart.php	6153	$arr = []
10		A						/var/www/html/uploads/ikstart.php	6154	$false = FALSE
11	363	0	0.019935	1999600	is_dir	0		/var/www/html/uploads/ikstart.php	6156	1	'/var/www/html/uploads'
11	363	1	0.019948	1999640
11	363	R			TRUE
11	364	0	0.019961	1999600	opendir	0		/var/www/html/uploads/ikstart.php	6158	1	'/var/www/html/uploads'
11	364	1	0.019978	1999880
11	364	R			resource(11) of type (stream)
10		A						/var/www/html/uploads/ikstart.php	6158	$handle = resource(11) of type (stream)
11	365	0	0.020004	1999848	readdir	0		/var/www/html/uploads/ikstart.php	6165	1	resource(11) of type (stream)
11	365	1	0.020021	1999920
11	365	R			'..'
10		A						/var/www/html/uploads/ikstart.php	6165	$file = '..'
11	366	0	0.020044	1999880	fnmatch	0		/var/www/html/uploads/ikstart.php	6167	2	'-??.kickstart.ini'	'..'
11	366	1	0.020058	1999952
11	366	R			FALSE
11	367	0	0.020071	1999880	readdir	0		/var/www/html/uploads/ikstart.php	6165	1	resource(11) of type (stream)
11	367	1	0.020084	1999952
11	367	R			'.'
10		A						/var/www/html/uploads/ikstart.php	6165	$file = '.'
11	368	0	0.020106	1999880	fnmatch	0		/var/www/html/uploads/ikstart.php	6167	2	'-??.kickstart.ini'	'.'
11	368	1	0.020119	1999952
11	368	R			FALSE
11	369	0	0.020132	1999880	readdir	0		/var/www/html/uploads/ikstart.php	6165	1	resource(11) of type (stream)
11	369	1	0.020145	1999960
11	369	R			'prepend.php'
10		A						/var/www/html/uploads/ikstart.php	6165	$file = 'prepend.php'
11	370	0	0.020169	1999888	fnmatch	0		/var/www/html/uploads/ikstart.php	6167	2	'-??.kickstart.ini'	'prepend.php'
11	370	1	0.020183	1999960
11	370	R			FALSE
11	371	0	0.020196	1999888	readdir	0		/var/www/html/uploads/ikstart.php	6165	1	resource(11) of type (stream)
11	371	1	0.020209	1999960
11	371	R			'data'
10		A						/var/www/html/uploads/ikstart.php	6165	$file = 'data'
11	372	0	0.020236	1999880	fnmatch	0		/var/www/html/uploads/ikstart.php	6167	2	'-??.kickstart.ini'	'data'
11	372	1	0.020251	1999952
11	372	R			FALSE
11	373	0	0.020264	1999880	readdir	0		/var/www/html/uploads/ikstart.php	6165	1	resource(11) of type (stream)
11	373	1	0.020277	1999960
11	373	R			'.htaccess'
10		A						/var/www/html/uploads/ikstart.php	6165	$file = '.htaccess'
11	374	0	0.020300	1999888	fnmatch	0		/var/www/html/uploads/ikstart.php	6167	2	'-??.kickstart.ini'	'.htaccess'
11	374	1	0.020314	1999960
11	374	R			FALSE
11	375	0	0.020327	1999888	readdir	0		/var/www/html/uploads/ikstart.php	6165	1	resource(11) of type (stream)
11	375	1	0.020340	1999968
11	375	R			'ikstart.php'
10		A						/var/www/html/uploads/ikstart.php	6165	$file = 'ikstart.php'
11	376	0	0.020364	1999888	fnmatch	0		/var/www/html/uploads/ikstart.php	6167	2	'-??.kickstart.ini'	'ikstart.php'
11	376	1	0.020378	1999960
11	376	R			FALSE
11	377	0	0.020390	1999888	readdir	0		/var/www/html/uploads/ikstart.php	6165	1	resource(11) of type (stream)
11	377	1	0.020404	1999928
11	377	R			FALSE
10		A						/var/www/html/uploads/ikstart.php	6165	$file = FALSE
11	378	0	0.020426	1999848	closedir	0		/var/www/html/uploads/ikstart.php	6179	1	resource(11) of type (stream)
11	378	1	0.020441	1999664
11	378	R			NULL
10	362	1	0.020454	1999624
10	362	R			[]
9		A						/var/www/html/uploads/ikstart.php	6513	$iniFiles = []
9		A						/var/www/html/uploads/ikstart.php	6519	$this->language = NULL
10	379	0	0.020490	1999592	file_exists	0		/var/www/html/uploads/ikstart.php	6529	1	'.kickstart.ini'
10	379	1	0.020508	1999632
10	379	R			FALSE
9	324	1	0.020523	1998688
8	319	1	0.020530	1998688
7		A						/var/www/html/uploads/ikstart.php	6386	$instance = class AKText { private $default_translation = ['AUTOMODEON' => 'Auto-mode enabled', 'ERR_NOT_A_JPA_FILE' => 'The file is not a JPA archive', 'ERR_CORRUPT_ARCHIVE' => 'The archive file is corrupt, truncated or archive parts are missing', 'ERR_INVALID_LOGIN' => 'Invalid login', 'COULDNT_CREATE_DIR' => 'Could not create %s folder', 'COULDNT_WRITE_FILE' => 'Could not open %s for writing.', 'WRONG_FTP_HOST' => 'Wrong FTP host or port', 'WRONG_FTP_USER' => 'Wrong FTP username or password', 'WRONG_FTP_PATH1' => 'Wrong FTP initial directory - the directory doesn\'t exist', 'FTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'FTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'SFTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'FTP_COULDNT_UPLOAD' => 'Could not upload %s', 'THINGS_HEADER' => 'Things you should know about Akeeba Kickstart', 'THINGS_01' => 'Kickstart is not an installer. It is an archive extraction tool. The actual installer was put inside the archive file at backup time.', 'THINGS_02' => 'Kickstart is not the only way to extract the backup archive. You can use Akeeba eXtract Wizard and upload the extracted files using FTP instead.', 'THINGS_03' => 'Kickstart is bound by your server\'s configuration. As such, it may not work at all.', 'THINGS_04' => 'You should download and upload your archive files using FTP in Binary transfer mode. Any other method could lead to a corrupt backup archive and restoration failure.', 'THINGS_05' => 'Post-restoration site load errors are usually caused by .htaccess or php.ini directives. You should understand that blank pages, 404 and 500 errors can usually be worked around by editing the aforementioned files. It is not our job to mess with your configuration files, because this could be dangerous for your site.', 'THINGS_06' => 'Kickstart overwrites files without a warning. If you are not sure that you are OK with that do not continue.', 'THINGS_07' => 'Trying to restore to the temporary URL of a cPanel host (e.g. http://1.2.3.4/~username) will lead to restoration failure and your site will appear to be not working. This is normal and it\'s just how your server and CMS software work.', 'THINGS_08' => 'You are supposed to read the documentation before using this software. Most issues can be avoided, or easily worked around, by understanding how this software works.', 'THINGS_09' => 'This text does not imply that there is a problem detected. It is standard text displayed every time you launch Kickstart.', 'CLOSE_LIGHTBOX' => 'Click here or press ESC to close this message', 'SELECT_ARCHIVE' => 'Select a backup archive', 'ARCHIVE_FILE' => 'Archive file:', 'SELECT_EXTRACTION' => 'Select an extraction method', 'WRITE_TO_FILES' => 'Write to files:', 'WRITE_HYBRID' => 'Hybrid (use FTP only if needed)', 'WRITE_DIRECTLY' => 'Directly', 'WRITE_FTP' => 'Use FTP for all files', 'WRITE_SFTP' => 'Use SFTP for all files', 'FTP_HOST' => '(S)FTP host name:', 'FTP_PORT' => '(S)FTP port:', 'FTP_FTPS' => 'Use FTP over SSL (FTPS)', 'FTP_PASSIVE' => 'Use FTP Passive Mode', 'FTP_USER' => '(S)FTP user name:', 'FTP_PASS' => '(S)FTP password:', 'FTP_DIR' => '(S)FTP directory:', 'FTP_TEMPDIR' => 'Temporary directory:', 'FTP_CONNECTION_OK' => 'FTP Connection Established', 'SFTP_CONNECTION_OK' => 'SFTP Connection Established', 'FTP_CONNECTION_FAILURE' => 'The FTP Connection Failed', 'SFTP_CONNECTION_FAILURE' => 'The SFTP Connection Failed', 'FTP_TEMPDIR_WRITABLE' => 'The temporary directory is writable.', 'FTP_TEMPDIR_UNWRITABLE' => 'The temporary directory is not writable. Please check the permissions.', 'FTPBROWSER_ERROR_HOSTNAME' => 'Invalid FTP host or port', 'FTPBROWSER_ERROR_USERPASS' => 'Invalid FTP username or password', 'FTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'FTPBROWSER_ERROR_UNSUPPORTED' => 'Sorry, your FTP server doesn\'t support our FTP directory browser.', 'FTPBROWSER_LBL_GOPARENT' => '&lt;up one level&gt;', 'FTPBROWSER_LBL_INSTRUCTIONS' => 'Click on a directory to navigate into it. Click on OK to select that directory, Cancel to abort the procedure.', 'FTPBROWSER_LBL_ERROR' => 'An error occurred', 'SFTP_NO_SSH2' => 'Your web server does not have the SSH2 PHP module, therefore can not connect to SFTP servers.', 'SFTP_NO_FTP_SUPPORT' => 'Your SSH server does not allow SFTP connections', 'SFTP_WRONG_USER' => 'Wrong SFTP username or password', 'SFTP_WRONG_STARTING_DIR' => 'You must supply a valid absolute path', 'SFTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'SFTP_COULDNT_UPLOAD' => 'Could not upload %s', 'SFTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'UI-ROOT' => '&lt;root&gt;', 'CONFIG_UI_FTPBROWSER_TITLE' => 'FTP Directory Browser', 'FTP_BROWSE' => 'Browse', 'BTN_CHECK' => 'Check', 'BTN_RESET' => 'Reset', 'BTN_TESTFTPCON' => 'Test FTP connection', 'BTN_TESTSFTPCON' => 'Test SFTP connection', 'BTN_GOTOSTART' => 'Start over', 'FINE_TUNE' => 'Fine tune', 'MIN_EXEC_TIME' => 'Minimum execution time:', 'MAX_EXEC_TIME' => 'Maximum execution time:', 'SECONDS_PER_STEP' => 'seconds per step', 'EXTRACT_FILES' => 'Extract files', 'BTN_START' => 'Start', 'EXTRACTING' => 'Extracting', 'DO_NOT_CLOSE_EXTRACT' => 'Do not close this window while the extraction is in progress', 'RESTACLEANUP' => 'Restoration and Clean Up', 'BTN_RUNINSTALLER' => 'Run the Installer', 'BTN_CLEANUP' => 'Clean Up', 'BTN_SITEFE' => 'Visit your site\'s front-end', 'BTN_SITEBE' => 'Visit your site\'s back-end', 'WARNINGS' => 'Extraction Warnings', 'ERROR_OCCURED' => 'An error occured', 'STEALTH_MODE' => 'Stealth mode', 'STEALTH_URL' => 'HTML file to show to web visitors', 'ERR_NOT_A_JPS_FILE' => 'The file is not a JPA archive', 'ERR_INVALID_JPS_PASSWORD' => 'The password you gave is wrong or the archive is corrupt', 'JPS_PASSWORD' => 'Archive Password (for JPS files)', 'INVALID_FILE_HEADER' => 'Invalid header in archive file, part %s, offset %s', 'NEEDSOMEHELPKS' => 'Want some help to use this tool? Read this first:', 'QUICKSTART' => 'Quick Start Guide', 'CANTGETITTOWORK' => 'Can\'t get it to work? Click me!', 'NOARCHIVESCLICKHERE' => 'No archives detected. Click here for troubleshooting instructions.', 'POSTRESTORATIONTROUBLESHOOTING' => 'Something not working after the restoration? Click here for troubleshooting instructions.', 'UPDATE_HEADER' => 'An updated version of Akeeba Kickstart (<span id="update-version">unknown</span>) is available!', 'UPDATE_NOTICE' => 'You are advised to always use the latest version of Akeeba Kickstart available. Older versions may be subject to bugs and will not be supported.', 'UPDATE_DLNOW' => 'Download now', 'UPDATE_MOREINFO' => 'More information', 'IGNORE_MOST_ERRORS' => 'Ignore most errors', 'WRONG_FTP_PATH2' => 'Wrong FTP initial directory - the directory doesn\'t correspond to your site\'s web root', 'ARCHIVE_DIRECTORY' => 'Archive directory:', 'RELOAD_ARCHIVES' => 'Reload', 'CONFIG_UI_SFTPBROWSER_TITLE' => 'SFTP Directory Browser', 'ERR_COULD_NOT_OPEN_ARCHIVE_PART' => 'Could not open archive part file %s for reading. Check that the file exists, is readable by the web server and is not in a directory made out of reach by chroot, open_basedir restrictions or any other restriction put in place by your host.']; private $strings = ['AUTOMODEON' => 'Auto-mode enabled', 'ERR_NOT_A_JPA_FILE' => 'The file is not a JPA archive', 'ERR_CORRUPT_ARCHIVE' => 'The archive file is corrupt, truncated or archive parts are missing', 'ERR_INVALID_LOGIN' => 'Invalid login', 'COULDNT_CREATE_DIR' => 'Could not create %s folder', 'COULDNT_WRITE_FILE' => 'Could not open %s for writing.', 'WRONG_FTP_HOST' => 'Wrong FTP host or port', 'WRONG_FTP_USER' => 'Wrong FTP username or password', 'WRONG_FTP_PATH1' => 'Wrong FTP initial directory - the directory doesn\'t exist', 'FTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'FTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'SFTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'FTP_COULDNT_UPLOAD' => 'Could not upload %s', 'THINGS_HEADER' => 'Things you should know about Akeeba Kickstart', 'THINGS_01' => 'Kickstart is not an installer. It is an archive extraction tool. The actual installer was put inside the archive file at backup time.', 'THINGS_02' => 'Kickstart is not the only way to extract the backup archive. You can use Akeeba eXtract Wizard and upload the extracted files using FTP instead.', 'THINGS_03' => 'Kickstart is bound by your server\'s configuration. As such, it may not work at all.', 'THINGS_04' => 'You should download and upload your archive files using FTP in Binary transfer mode. Any other method could lead to a corrupt backup archive and restoration failure.', 'THINGS_05' => 'Post-restoration site load errors are usually caused by .htaccess or php.ini directives. You should understand that blank pages, 404 and 500 errors can usually be worked around by editing the aforementioned files. It is not our job to mess with your configuration files, because this could be dangerous for your site.', 'THINGS_06' => 'Kickstart overwrites files without a warning. If you are not sure that you are OK with that do not continue.', 'THINGS_07' => 'Trying to restore to the temporary URL of a cPanel host (e.g. http://1.2.3.4/~username) will lead to restoration failure and your site will appear to be not working. This is normal and it\'s just how your server and CMS software work.', 'THINGS_08' => 'You are supposed to read the documentation before using this software. Most issues can be avoided, or easily worked around, by understanding how this software works.', 'THINGS_09' => 'This text does not imply that there is a problem detected. It is standard text displayed every time you launch Kickstart.', 'CLOSE_LIGHTBOX' => 'Click here or press ESC to close this message', 'SELECT_ARCHIVE' => 'Select a backup archive', 'ARCHIVE_FILE' => 'Archive file:', 'SELECT_EXTRACTION' => 'Select an extraction method', 'WRITE_TO_FILES' => 'Write to files:', 'WRITE_HYBRID' => 'Hybrid (use FTP only if needed)', 'WRITE_DIRECTLY' => 'Directly', 'WRITE_FTP' => 'Use FTP for all files', 'WRITE_SFTP' => 'Use SFTP for all files', 'FTP_HOST' => '(S)FTP host name:', 'FTP_PORT' => '(S)FTP port:', 'FTP_FTPS' => 'Use FTP over SSL (FTPS)', 'FTP_PASSIVE' => 'Use FTP Passive Mode', 'FTP_USER' => '(S)FTP user name:', 'FTP_PASS' => '(S)FTP password:', 'FTP_DIR' => '(S)FTP directory:', 'FTP_TEMPDIR' => 'Temporary directory:', 'FTP_CONNECTION_OK' => 'FTP Connection Established', 'SFTP_CONNECTION_OK' => 'SFTP Connection Established', 'FTP_CONNECTION_FAILURE' => 'The FTP Connection Failed', 'SFTP_CONNECTION_FAILURE' => 'The SFTP Connection Failed', 'FTP_TEMPDIR_WRITABLE' => 'The temporary directory is writable.', 'FTP_TEMPDIR_UNWRITABLE' => 'The temporary directory is not writable. Please check the permissions.', 'FTPBROWSER_ERROR_HOSTNAME' => 'Invalid FTP host or port', 'FTPBROWSER_ERROR_USERPASS' => 'Invalid FTP username or password', 'FTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'FTPBROWSER_ERROR_UNSUPPORTED' => 'Sorry, your FTP server doesn\'t support our FTP directory browser.', 'FTPBROWSER_LBL_GOPARENT' => '&lt;up one level&gt;', 'FTPBROWSER_LBL_INSTRUCTIONS' => 'Click on a directory to navigate into it. Click on OK to select that directory, Cancel to abort the procedure.', 'FTPBROWSER_LBL_ERROR' => 'An error occurred', 'SFTP_NO_SSH2' => 'Your web server does not have the SSH2 PHP module, therefore can not connect to SFTP servers.', 'SFTP_NO_FTP_SUPPORT' => 'Your SSH server does not allow SFTP connections', 'SFTP_WRONG_USER' => 'Wrong SFTP username or password', 'SFTP_WRONG_STARTING_DIR' => 'You must supply a valid absolute path', 'SFTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'SFTP_COULDNT_UPLOAD' => 'Could not upload %s', 'SFTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'UI-ROOT' => '&lt;root&gt;', 'CONFIG_UI_FTPBROWSER_TITLE' => 'FTP Directory Browser', 'FTP_BROWSE' => 'Browse', 'BTN_CHECK' => 'Check', 'BTN_RESET' => 'Reset', 'BTN_TESTFTPCON' => 'Test FTP connection', 'BTN_TESTSFTPCON' => 'Test SFTP connection', 'BTN_GOTOSTART' => 'Start over', 'FINE_TUNE' => 'Fine tune', 'MIN_EXEC_TIME' => 'Minimum execution time:', 'MAX_EXEC_TIME' => 'Maximum execution time:', 'SECONDS_PER_STEP' => 'seconds per step', 'EXTRACT_FILES' => 'Extract files', 'BTN_START' => 'Start', 'EXTRACTING' => 'Extracting', 'DO_NOT_CLOSE_EXTRACT' => 'Do not close this window while the extraction is in progress', 'RESTACLEANUP' => 'Restoration and Clean Up', 'BTN_RUNINSTALLER' => 'Run the Installer', 'BTN_CLEANUP' => 'Clean Up', 'BTN_SITEFE' => 'Visit your site\'s front-end', 'BTN_SITEBE' => 'Visit your site\'s back-end', 'WARNINGS' => 'Extraction Warnings', 'ERROR_OCCURED' => 'An error occured', 'STEALTH_MODE' => 'Stealth mode', 'STEALTH_URL' => 'HTML file to show to web visitors', 'ERR_NOT_A_JPS_FILE' => 'The file is not a JPA archive', 'ERR_INVALID_JPS_PASSWORD' => 'The password you gave is wrong or the archive is corrupt', 'JPS_PASSWORD' => 'Archive Password (for JPS files)', 'INVALID_FILE_HEADER' => 'Invalid header in archive file, part %s, offset %s', 'NEEDSOMEHELPKS' => 'Want some help to use this tool? Read this first:', 'QUICKSTART' => 'Quick Start Guide', 'CANTGETITTOWORK' => 'Can\'t get it to work? Click me!', 'NOARCHIVESCLICKHERE' => 'No archives detected. Click here for troubleshooting instructions.', 'POSTRESTORATIONTROUBLESHOOTING' => 'Something not working after the restoration? Click here for troubleshooting instructions.', 'UPDATE_HEADER' => 'An updated version of Akeeba Kickstart (<span id="update-version">unknown</span>) is available!', 'UPDATE_NOTICE' => 'You are advised to always use the latest version of Akeeba Kickstart available. Older versions may be subject to bugs and will not be supported.', 'UPDATE_DLNOW' => 'Download now', 'UPDATE_MOREINFO' => 'More information', 'IGNORE_MOST_ERRORS' => 'Ignore most errors', 'WRONG_FTP_PATH2' => 'Wrong FTP initial directory - the directory doesn\'t correspond to your site\'s web root', 'ARCHIVE_DIRECTORY' => 'Archive directory:', 'RELOAD_ARCHIVES' => 'Reload', 'CONFIG_UI_SFTPBROWSER_TITLE' => 'SFTP Directory Browser', 'ERR_COULD_NOT_OPEN_ARCHIVE_PART' => 'Could not open archive part file %s for reading. Check that the file exists, is readable by the web server and is not in a directory made out of reach by chroot, open_basedir restrictions or any other restriction put in place by your host.']; private $language = NULL; private ${AKAbstractObject}_errors = []; protected $_errors_queue_size = 0; private ${AKAbstractObject}_warnings = []; protected $_warnings_queue_size = 0 }
7	318	1	0.020840	1999064
7	318	R			class AKText { private $default_translation = ['AUTOMODEON' => 'Auto-mode enabled', 'ERR_NOT_A_JPA_FILE' => 'The file is not a JPA archive', 'ERR_CORRUPT_ARCHIVE' => 'The archive file is corrupt, truncated or archive parts are missing', 'ERR_INVALID_LOGIN' => 'Invalid login', 'COULDNT_CREATE_DIR' => 'Could not create %s folder', 'COULDNT_WRITE_FILE' => 'Could not open %s for writing.', 'WRONG_FTP_HOST' => 'Wrong FTP host or port', 'WRONG_FTP_USER' => 'Wrong FTP username or password', 'WRONG_FTP_PATH1' => 'Wrong FTP initial directory - the directory doesn\'t exist', 'FTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'FTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'SFTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'FTP_COULDNT_UPLOAD' => 'Could not upload %s', 'THINGS_HEADER' => 'Things you should know about Akeeba Kickstart', 'THINGS_01' => 'Kickstart is not an installer. It is an archive extraction tool. The actual installer was put inside the archive file at backup time.', 'THINGS_02' => 'Kickstart is not the only way to extract the backup archive. You can use Akeeba eXtract Wizard and upload the extracted files using FTP instead.', 'THINGS_03' => 'Kickstart is bound by your server\'s configuration. As such, it may not work at all.', 'THINGS_04' => 'You should download and upload your archive files using FTP in Binary transfer mode. Any other method could lead to a corrupt backup archive and restoration failure.', 'THINGS_05' => 'Post-restoration site load errors are usually caused by .htaccess or php.ini directives. You should understand that blank pages, 404 and 500 errors can usually be worked around by editing the aforementioned files. It is not our job to mess with your configuration files, because this could be dangerous for your site.', 'THINGS_06' => 'Kickstart overwrites files without a warning. If you are not sure that you are OK with that do not continue.', 'THINGS_07' => 'Trying to restore to the temporary URL of a cPanel host (e.g. http://1.2.3.4/~username) will lead to restoration failure and your site will appear to be not working. This is normal and it\'s just how your server and CMS software work.', 'THINGS_08' => 'You are supposed to read the documentation before using this software. Most issues can be avoided, or easily worked around, by understanding how this software works.', 'THINGS_09' => 'This text does not imply that there is a problem detected. It is standard text displayed every time you launch Kickstart.', 'CLOSE_LIGHTBOX' => 'Click here or press ESC to close this message', 'SELECT_ARCHIVE' => 'Select a backup archive', 'ARCHIVE_FILE' => 'Archive file:', 'SELECT_EXTRACTION' => 'Select an extraction method', 'WRITE_TO_FILES' => 'Write to files:', 'WRITE_HYBRID' => 'Hybrid (use FTP only if needed)', 'WRITE_DIRECTLY' => 'Directly', 'WRITE_FTP' => 'Use FTP for all files', 'WRITE_SFTP' => 'Use SFTP for all files', 'FTP_HOST' => '(S)FTP host name:', 'FTP_PORT' => '(S)FTP port:', 'FTP_FTPS' => 'Use FTP over SSL (FTPS)', 'FTP_PASSIVE' => 'Use FTP Passive Mode', 'FTP_USER' => '(S)FTP user name:', 'FTP_PASS' => '(S)FTP password:', 'FTP_DIR' => '(S)FTP directory:', 'FTP_TEMPDIR' => 'Temporary directory:', 'FTP_CONNECTION_OK' => 'FTP Connection Established', 'SFTP_CONNECTION_OK' => 'SFTP Connection Established', 'FTP_CONNECTION_FAILURE' => 'The FTP Connection Failed', 'SFTP_CONNECTION_FAILURE' => 'The SFTP Connection Failed', 'FTP_TEMPDIR_WRITABLE' => 'The temporary directory is writable.', 'FTP_TEMPDIR_UNWRITABLE' => 'The temporary directory is not writable. Please check the permissions.', 'FTPBROWSER_ERROR_HOSTNAME' => 'Invalid FTP host or port', 'FTPBROWSER_ERROR_USERPASS' => 'Invalid FTP username or password', 'FTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'FTPBROWSER_ERROR_UNSUPPORTED' => 'Sorry, your FTP server doesn\'t support our FTP directory browser.', 'FTPBROWSER_LBL_GOPARENT' => '&lt;up one level&gt;', 'FTPBROWSER_LBL_INSTRUCTIONS' => 'Click on a directory to navigate into it. Click on OK to select that directory, Cancel to abort the procedure.', 'FTPBROWSER_LBL_ERROR' => 'An error occurred', 'SFTP_NO_SSH2' => 'Your web server does not have the SSH2 PHP module, therefore can not connect to SFTP servers.', 'SFTP_NO_FTP_SUPPORT' => 'Your SSH server does not allow SFTP connections', 'SFTP_WRONG_USER' => 'Wrong SFTP username or password', 'SFTP_WRONG_STARTING_DIR' => 'You must supply a valid absolute path', 'SFTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'SFTP_COULDNT_UPLOAD' => 'Could not upload %s', 'SFTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'UI-ROOT' => '&lt;root&gt;', 'CONFIG_UI_FTPBROWSER_TITLE' => 'FTP Directory Browser', 'FTP_BROWSE' => 'Browse', 'BTN_CHECK' => 'Check', 'BTN_RESET' => 'Reset', 'BTN_TESTFTPCON' => 'Test FTP connection', 'BTN_TESTSFTPCON' => 'Test SFTP connection', 'BTN_GOTOSTART' => 'Start over', 'FINE_TUNE' => 'Fine tune', 'MIN_EXEC_TIME' => 'Minimum execution time:', 'MAX_EXEC_TIME' => 'Maximum execution time:', 'SECONDS_PER_STEP' => 'seconds per step', 'EXTRACT_FILES' => 'Extract files', 'BTN_START' => 'Start', 'EXTRACTING' => 'Extracting', 'DO_NOT_CLOSE_EXTRACT' => 'Do not close this window while the extraction is in progress', 'RESTACLEANUP' => 'Restoration and Clean Up', 'BTN_RUNINSTALLER' => 'Run the Installer', 'BTN_CLEANUP' => 'Clean Up', 'BTN_SITEFE' => 'Visit your site\'s front-end', 'BTN_SITEBE' => 'Visit your site\'s back-end', 'WARNINGS' => 'Extraction Warnings', 'ERROR_OCCURED' => 'An error occured', 'STEALTH_MODE' => 'Stealth mode', 'STEALTH_URL' => 'HTML file to show to web visitors', 'ERR_NOT_A_JPS_FILE' => 'The file is not a JPA archive', 'ERR_INVALID_JPS_PASSWORD' => 'The password you gave is wrong or the archive is corrupt', 'JPS_PASSWORD' => 'Archive Password (for JPS files)', 'INVALID_FILE_HEADER' => 'Invalid header in archive file, part %s, offset %s', 'NEEDSOMEHELPKS' => 'Want some help to use this tool? Read this first:', 'QUICKSTART' => 'Quick Start Guide', 'CANTGETITTOWORK' => 'Can\'t get it to work? Click me!', 'NOARCHIVESCLICKHERE' => 'No archives detected. Click here for troubleshooting instructions.', 'POSTRESTORATIONTROUBLESHOOTING' => 'Something not working after the restoration? Click here for troubleshooting instructions.', 'UPDATE_HEADER' => 'An updated version of Akeeba Kickstart (<span id="update-version">unknown</span>) is available!', 'UPDATE_NOTICE' => 'You are advised to always use the latest version of Akeeba Kickstart available. Older versions may be subject to bugs and will not be supported.', 'UPDATE_DLNOW' => 'Download now', 'UPDATE_MOREINFO' => 'More information', 'IGNORE_MOST_ERRORS' => 'Ignore most errors', 'WRONG_FTP_PATH2' => 'Wrong FTP initial directory - the directory doesn\'t correspond to your site\'s web root', 'ARCHIVE_DIRECTORY' => 'Archive directory:', 'RELOAD_ARCHIVES' => 'Reload', 'CONFIG_UI_SFTPBROWSER_TITLE' => 'SFTP Directory Browser', 'ERR_COULD_NOT_OPEN_ARCHIVE_PART' => 'Could not open archive part file %s for reading. Check that the file exists, is readable by the web server and is not in a directory made out of reach by chroot, open_basedir restrictions or any other restriction put in place by your host.']; private $strings = ['AUTOMODEON' => 'Auto-mode enabled', 'ERR_NOT_A_JPA_FILE' => 'The file is not a JPA archive', 'ERR_CORRUPT_ARCHIVE' => 'The archive file is corrupt, truncated or archive parts are missing', 'ERR_INVALID_LOGIN' => 'Invalid login', 'COULDNT_CREATE_DIR' => 'Could not create %s folder', 'COULDNT_WRITE_FILE' => 'Could not open %s for writing.', 'WRONG_FTP_HOST' => 'Wrong FTP host or port', 'WRONG_FTP_USER' => 'Wrong FTP username or password', 'WRONG_FTP_PATH1' => 'Wrong FTP initial directory - the directory doesn\'t exist', 'FTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'FTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'SFTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'FTP_COULDNT_UPLOAD' => 'Could not upload %s', 'THINGS_HEADER' => 'Things you should know about Akeeba Kickstart', 'THINGS_01' => 'Kickstart is not an installer. It is an archive extraction tool. The actual installer was put inside the archive file at backup time.', 'THINGS_02' => 'Kickstart is not the only way to extract the backup archive. You can use Akeeba eXtract Wizard and upload the extracted files using FTP instead.', 'THINGS_03' => 'Kickstart is bound by your server\'s configuration. As such, it may not work at all.', 'THINGS_04' => 'You should download and upload your archive files using FTP in Binary transfer mode. Any other method could lead to a corrupt backup archive and restoration failure.', 'THINGS_05' => 'Post-restoration site load errors are usually caused by .htaccess or php.ini directives. You should understand that blank pages, 404 and 500 errors can usually be worked around by editing the aforementioned files. It is not our job to mess with your configuration files, because this could be dangerous for your site.', 'THINGS_06' => 'Kickstart overwrites files without a warning. If you are not sure that you are OK with that do not continue.', 'THINGS_07' => 'Trying to restore to the temporary URL of a cPanel host (e.g. http://1.2.3.4/~username) will lead to restoration failure and your site will appear to be not working. This is normal and it\'s just how your server and CMS software work.', 'THINGS_08' => 'You are supposed to read the documentation before using this software. Most issues can be avoided, or easily worked around, by understanding how this software works.', 'THINGS_09' => 'This text does not imply that there is a problem detected. It is standard text displayed every time you launch Kickstart.', 'CLOSE_LIGHTBOX' => 'Click here or press ESC to close this message', 'SELECT_ARCHIVE' => 'Select a backup archive', 'ARCHIVE_FILE' => 'Archive file:', 'SELECT_EXTRACTION' => 'Select an extraction method', 'WRITE_TO_FILES' => 'Write to files:', 'WRITE_HYBRID' => 'Hybrid (use FTP only if needed)', 'WRITE_DIRECTLY' => 'Directly', 'WRITE_FTP' => 'Use FTP for all files', 'WRITE_SFTP' => 'Use SFTP for all files', 'FTP_HOST' => '(S)FTP host name:', 'FTP_PORT' => '(S)FTP port:', 'FTP_FTPS' => 'Use FTP over SSL (FTPS)', 'FTP_PASSIVE' => 'Use FTP Passive Mode', 'FTP_USER' => '(S)FTP user name:', 'FTP_PASS' => '(S)FTP password:', 'FTP_DIR' => '(S)FTP directory:', 'FTP_TEMPDIR' => 'Temporary directory:', 'FTP_CONNECTION_OK' => 'FTP Connection Established', 'SFTP_CONNECTION_OK' => 'SFTP Connection Established', 'FTP_CONNECTION_FAILURE' => 'The FTP Connection Failed', 'SFTP_CONNECTION_FAILURE' => 'The SFTP Connection Failed', 'FTP_TEMPDIR_WRITABLE' => 'The temporary directory is writable.', 'FTP_TEMPDIR_UNWRITABLE' => 'The temporary directory is not writable. Please check the permissions.', 'FTPBROWSER_ERROR_HOSTNAME' => 'Invalid FTP host or port', 'FTPBROWSER_ERROR_USERPASS' => 'Invalid FTP username or password', 'FTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'FTPBROWSER_ERROR_UNSUPPORTED' => 'Sorry, your FTP server doesn\'t support our FTP directory browser.', 'FTPBROWSER_LBL_GOPARENT' => '&lt;up one level&gt;', 'FTPBROWSER_LBL_INSTRUCTIONS' => 'Click on a directory to navigate into it. Click on OK to select that directory, Cancel to abort the procedure.', 'FTPBROWSER_LBL_ERROR' => 'An error occurred', 'SFTP_NO_SSH2' => 'Your web server does not have the SSH2 PHP module, therefore can not connect to SFTP servers.', 'SFTP_NO_FTP_SUPPORT' => 'Your SSH server does not allow SFTP connections', 'SFTP_WRONG_USER' => 'Wrong SFTP username or password', 'SFTP_WRONG_STARTING_DIR' => 'You must supply a valid absolute path', 'SFTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'SFTP_COULDNT_UPLOAD' => 'Could not upload %s', 'SFTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'UI-ROOT' => '&lt;root&gt;', 'CONFIG_UI_FTPBROWSER_TITLE' => 'FTP Directory Browser', 'FTP_BROWSE' => 'Browse', 'BTN_CHECK' => 'Check', 'BTN_RESET' => 'Reset', 'BTN_TESTFTPCON' => 'Test FTP connection', 'BTN_TESTSFTPCON' => 'Test SFTP connection', 'BTN_GOTOSTART' => 'Start over', 'FINE_TUNE' => 'Fine tune', 'MIN_EXEC_TIME' => 'Minimum execution time:', 'MAX_EXEC_TIME' => 'Maximum execution time:', 'SECONDS_PER_STEP' => 'seconds per step', 'EXTRACT_FILES' => 'Extract files', 'BTN_START' => 'Start', 'EXTRACTING' => 'Extracting', 'DO_NOT_CLOSE_EXTRACT' => 'Do not close this window while the extraction is in progress', 'RESTACLEANUP' => 'Restoration and Clean Up', 'BTN_RUNINSTALLER' => 'Run the Installer', 'BTN_CLEANUP' => 'Clean Up', 'BTN_SITEFE' => 'Visit your site\'s front-end', 'BTN_SITEBE' => 'Visit your site\'s back-end', 'WARNINGS' => 'Extraction Warnings', 'ERROR_OCCURED' => 'An error occured', 'STEALTH_MODE' => 'Stealth mode', 'STEALTH_URL' => 'HTML file to show to web visitors', 'ERR_NOT_A_JPS_FILE' => 'The file is not a JPA archive', 'ERR_INVALID_JPS_PASSWORD' => 'The password you gave is wrong or the archive is corrupt', 'JPS_PASSWORD' => 'Archive Password (for JPS files)', 'INVALID_FILE_HEADER' => 'Invalid header in archive file, part %s, offset %s', 'NEEDSOMEHELPKS' => 'Want some help to use this tool? Read this first:', 'QUICKSTART' => 'Quick Start Guide', 'CANTGETITTOWORK' => 'Can\'t get it to work? Click me!', 'NOARCHIVESCLICKHERE' => 'No archives detected. Click here for troubleshooting instructions.', 'POSTRESTORATIONTROUBLESHOOTING' => 'Something not working after the restoration? Click here for troubleshooting instructions.', 'UPDATE_HEADER' => 'An updated version of Akeeba Kickstart (<span id="update-version">unknown</span>) is available!', 'UPDATE_NOTICE' => 'You are advised to always use the latest version of Akeeba Kickstart available. Older versions may be subject to bugs and will not be supported.', 'UPDATE_DLNOW' => 'Download now', 'UPDATE_MOREINFO' => 'More information', 'IGNORE_MOST_ERRORS' => 'Ignore most errors', 'WRONG_FTP_PATH2' => 'Wrong FTP initial directory - the directory doesn\'t correspond to your site\'s web root', 'ARCHIVE_DIRECTORY' => 'Archive directory:', 'RELOAD_ARCHIVES' => 'Reload', 'CONFIG_UI_SFTPBROWSER_TITLE' => 'SFTP Directory Browser', 'ERR_COULD_NOT_OPEN_ARCHIVE_PART' => 'Could not open archive part file %s for reading. Check that the file exists, is readable by the web server and is not in a directory made out of reach by chroot, open_basedir restrictions or any other restriction put in place by your host.']; private $language = NULL; private ${AKAbstractObject}_errors = []; protected $_errors_queue_size = 0; private ${AKAbstractObject}_warnings = []; protected $_warnings_queue_size = 0 }
6		A						/var/www/html/uploads/ikstart.php	11314	$translation = class AKText { private $default_translation = ['AUTOMODEON' => 'Auto-mode enabled', 'ERR_NOT_A_JPA_FILE' => 'The file is not a JPA archive', 'ERR_CORRUPT_ARCHIVE' => 'The archive file is corrupt, truncated or archive parts are missing', 'ERR_INVALID_LOGIN' => 'Invalid login', 'COULDNT_CREATE_DIR' => 'Could not create %s folder', 'COULDNT_WRITE_FILE' => 'Could not open %s for writing.', 'WRONG_FTP_HOST' => 'Wrong FTP host or port', 'WRONG_FTP_USER' => 'Wrong FTP username or password', 'WRONG_FTP_PATH1' => 'Wrong FTP initial directory - the directory doesn\'t exist', 'FTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'FTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'SFTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'FTP_COULDNT_UPLOAD' => 'Could not upload %s', 'THINGS_HEADER' => 'Things you should know about Akeeba Kickstart', 'THINGS_01' => 'Kickstart is not an installer. It is an archive extraction tool. The actual installer was put inside the archive file at backup time.', 'THINGS_02' => 'Kickstart is not the only way to extract the backup archive. You can use Akeeba eXtract Wizard and upload the extracted files using FTP instead.', 'THINGS_03' => 'Kickstart is bound by your server\'s configuration. As such, it may not work at all.', 'THINGS_04' => 'You should download and upload your archive files using FTP in Binary transfer mode. Any other method could lead to a corrupt backup archive and restoration failure.', 'THINGS_05' => 'Post-restoration site load errors are usually caused by .htaccess or php.ini directives. You should understand that blank pages, 404 and 500 errors can usually be worked around by editing the aforementioned files. It is not our job to mess with your configuration files, because this could be dangerous for your site.', 'THINGS_06' => 'Kickstart overwrites files without a warning. If you are not sure that you are OK with that do not continue.', 'THINGS_07' => 'Trying to restore to the temporary URL of a cPanel host (e.g. http://1.2.3.4/~username) will lead to restoration failure and your site will appear to be not working. This is normal and it\'s just how your server and CMS software work.', 'THINGS_08' => 'You are supposed to read the documentation before using this software. Most issues can be avoided, or easily worked around, by understanding how this software works.', 'THINGS_09' => 'This text does not imply that there is a problem detected. It is standard text displayed every time you launch Kickstart.', 'CLOSE_LIGHTBOX' => 'Click here or press ESC to close this message', 'SELECT_ARCHIVE' => 'Select a backup archive', 'ARCHIVE_FILE' => 'Archive file:', 'SELECT_EXTRACTION' => 'Select an extraction method', 'WRITE_TO_FILES' => 'Write to files:', 'WRITE_HYBRID' => 'Hybrid (use FTP only if needed)', 'WRITE_DIRECTLY' => 'Directly', 'WRITE_FTP' => 'Use FTP for all files', 'WRITE_SFTP' => 'Use SFTP for all files', 'FTP_HOST' => '(S)FTP host name:', 'FTP_PORT' => '(S)FTP port:', 'FTP_FTPS' => 'Use FTP over SSL (FTPS)', 'FTP_PASSIVE' => 'Use FTP Passive Mode', 'FTP_USER' => '(S)FTP user name:', 'FTP_PASS' => '(S)FTP password:', 'FTP_DIR' => '(S)FTP directory:', 'FTP_TEMPDIR' => 'Temporary directory:', 'FTP_CONNECTION_OK' => 'FTP Connection Established', 'SFTP_CONNECTION_OK' => 'SFTP Connection Established', 'FTP_CONNECTION_FAILURE' => 'The FTP Connection Failed', 'SFTP_CONNECTION_FAILURE' => 'The SFTP Connection Failed', 'FTP_TEMPDIR_WRITABLE' => 'The temporary directory is writable.', 'FTP_TEMPDIR_UNWRITABLE' => 'The temporary directory is not writable. Please check the permissions.', 'FTPBROWSER_ERROR_HOSTNAME' => 'Invalid FTP host or port', 'FTPBROWSER_ERROR_USERPASS' => 'Invalid FTP username or password', 'FTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'FTPBROWSER_ERROR_UNSUPPORTED' => 'Sorry, your FTP server doesn\'t support our FTP directory browser.', 'FTPBROWSER_LBL_GOPARENT' => '&lt;up one level&gt;', 'FTPBROWSER_LBL_INSTRUCTIONS' => 'Click on a directory to navigate into it. Click on OK to select that directory, Cancel to abort the procedure.', 'FTPBROWSER_LBL_ERROR' => 'An error occurred', 'SFTP_NO_SSH2' => 'Your web server does not have the SSH2 PHP module, therefore can not connect to SFTP servers.', 'SFTP_NO_FTP_SUPPORT' => 'Your SSH server does not allow SFTP connections', 'SFTP_WRONG_USER' => 'Wrong SFTP username or password', 'SFTP_WRONG_STARTING_DIR' => 'You must supply a valid absolute path', 'SFTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'SFTP_COULDNT_UPLOAD' => 'Could not upload %s', 'SFTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'UI-ROOT' => '&lt;root&gt;', 'CONFIG_UI_FTPBROWSER_TITLE' => 'FTP Directory Browser', 'FTP_BROWSE' => 'Browse', 'BTN_CHECK' => 'Check', 'BTN_RESET' => 'Reset', 'BTN_TESTFTPCON' => 'Test FTP connection', 'BTN_TESTSFTPCON' => 'Test SFTP connection', 'BTN_GOTOSTART' => 'Start over', 'FINE_TUNE' => 'Fine tune', 'MIN_EXEC_TIME' => 'Minimum execution time:', 'MAX_EXEC_TIME' => 'Maximum execution time:', 'SECONDS_PER_STEP' => 'seconds per step', 'EXTRACT_FILES' => 'Extract files', 'BTN_START' => 'Start', 'EXTRACTING' => 'Extracting', 'DO_NOT_CLOSE_EXTRACT' => 'Do not close this window while the extraction is in progress', 'RESTACLEANUP' => 'Restoration and Clean Up', 'BTN_RUNINSTALLER' => 'Run the Installer', 'BTN_CLEANUP' => 'Clean Up', 'BTN_SITEFE' => 'Visit your site\'s front-end', 'BTN_SITEBE' => 'Visit your site\'s back-end', 'WARNINGS' => 'Extraction Warnings', 'ERROR_OCCURED' => 'An error occured', 'STEALTH_MODE' => 'Stealth mode', 'STEALTH_URL' => 'HTML file to show to web visitors', 'ERR_NOT_A_JPS_FILE' => 'The file is not a JPA archive', 'ERR_INVALID_JPS_PASSWORD' => 'The password you gave is wrong or the archive is corrupt', 'JPS_PASSWORD' => 'Archive Password (for JPS files)', 'INVALID_FILE_HEADER' => 'Invalid header in archive file, part %s, offset %s', 'NEEDSOMEHELPKS' => 'Want some help to use this tool? Read this first:', 'QUICKSTART' => 'Quick Start Guide', 'CANTGETITTOWORK' => 'Can\'t get it to work? Click me!', 'NOARCHIVESCLICKHERE' => 'No archives detected. Click here for troubleshooting instructions.', 'POSTRESTORATIONTROUBLESHOOTING' => 'Something not working after the restoration? Click here for troubleshooting instructions.', 'UPDATE_HEADER' => 'An updated version of Akeeba Kickstart (<span id="update-version">unknown</span>) is available!', 'UPDATE_NOTICE' => 'You are advised to always use the latest version of Akeeba Kickstart available. Older versions may be subject to bugs and will not be supported.', 'UPDATE_DLNOW' => 'Download now', 'UPDATE_MOREINFO' => 'More information', 'IGNORE_MOST_ERRORS' => 'Ignore most errors', 'WRONG_FTP_PATH2' => 'Wrong FTP initial directory - the directory doesn\'t correspond to your site\'s web root', 'ARCHIVE_DIRECTORY' => 'Archive directory:', 'RELOAD_ARCHIVES' => 'Reload', 'CONFIG_UI_SFTPBROWSER_TITLE' => 'SFTP Directory Browser', 'ERR_COULD_NOT_OPEN_ARCHIVE_PART' => 'Could not open archive part file %s for reading. Check that the file exists, is readable by the web server and is not in a directory made out of reach by chroot, open_basedir restrictions or any other restriction put in place by your host.']; private $strings = ['AUTOMODEON' => 'Auto-mode enabled', 'ERR_NOT_A_JPA_FILE' => 'The file is not a JPA archive', 'ERR_CORRUPT_ARCHIVE' => 'The archive file is corrupt, truncated or archive parts are missing', 'ERR_INVALID_LOGIN' => 'Invalid login', 'COULDNT_CREATE_DIR' => 'Could not create %s folder', 'COULDNT_WRITE_FILE' => 'Could not open %s for writing.', 'WRONG_FTP_HOST' => 'Wrong FTP host or port', 'WRONG_FTP_USER' => 'Wrong FTP username or password', 'WRONG_FTP_PATH1' => 'Wrong FTP initial directory - the directory doesn\'t exist', 'FTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'FTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'SFTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'FTP_COULDNT_UPLOAD' => 'Could not upload %s', 'THINGS_HEADER' => 'Things you should know about Akeeba Kickstart', 'THINGS_01' => 'Kickstart is not an installer. It is an archive extraction tool. The actual installer was put inside the archive file at backup time.', 'THINGS_02' => 'Kickstart is not the only way to extract the backup archive. You can use Akeeba eXtract Wizard and upload the extracted files using FTP instead.', 'THINGS_03' => 'Kickstart is bound by your server\'s configuration. As such, it may not work at all.', 'THINGS_04' => 'You should download and upload your archive files using FTP in Binary transfer mode. Any other method could lead to a corrupt backup archive and restoration failure.', 'THINGS_05' => 'Post-restoration site load errors are usually caused by .htaccess or php.ini directives. You should understand that blank pages, 404 and 500 errors can usually be worked around by editing the aforementioned files. It is not our job to mess with your configuration files, because this could be dangerous for your site.', 'THINGS_06' => 'Kickstart overwrites files without a warning. If you are not sure that you are OK with that do not continue.', 'THINGS_07' => 'Trying to restore to the temporary URL of a cPanel host (e.g. http://1.2.3.4/~username) will lead to restoration failure and your site will appear to be not working. This is normal and it\'s just how your server and CMS software work.', 'THINGS_08' => 'You are supposed to read the documentation before using this software. Most issues can be avoided, or easily worked around, by understanding how this software works.', 'THINGS_09' => 'This text does not imply that there is a problem detected. It is standard text displayed every time you launch Kickstart.', 'CLOSE_LIGHTBOX' => 'Click here or press ESC to close this message', 'SELECT_ARCHIVE' => 'Select a backup archive', 'ARCHIVE_FILE' => 'Archive file:', 'SELECT_EXTRACTION' => 'Select an extraction method', 'WRITE_TO_FILES' => 'Write to files:', 'WRITE_HYBRID' => 'Hybrid (use FTP only if needed)', 'WRITE_DIRECTLY' => 'Directly', 'WRITE_FTP' => 'Use FTP for all files', 'WRITE_SFTP' => 'Use SFTP for all files', 'FTP_HOST' => '(S)FTP host name:', 'FTP_PORT' => '(S)FTP port:', 'FTP_FTPS' => 'Use FTP over SSL (FTPS)', 'FTP_PASSIVE' => 'Use FTP Passive Mode', 'FTP_USER' => '(S)FTP user name:', 'FTP_PASS' => '(S)FTP password:', 'FTP_DIR' => '(S)FTP directory:', 'FTP_TEMPDIR' => 'Temporary directory:', 'FTP_CONNECTION_OK' => 'FTP Connection Established', 'SFTP_CONNECTION_OK' => 'SFTP Connection Established', 'FTP_CONNECTION_FAILURE' => 'The FTP Connection Failed', 'SFTP_CONNECTION_FAILURE' => 'The SFTP Connection Failed', 'FTP_TEMPDIR_WRITABLE' => 'The temporary directory is writable.', 'FTP_TEMPDIR_UNWRITABLE' => 'The temporary directory is not writable. Please check the permissions.', 'FTPBROWSER_ERROR_HOSTNAME' => 'Invalid FTP host or port', 'FTPBROWSER_ERROR_USERPASS' => 'Invalid FTP username or password', 'FTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'FTPBROWSER_ERROR_UNSUPPORTED' => 'Sorry, your FTP server doesn\'t support our FTP directory browser.', 'FTPBROWSER_LBL_GOPARENT' => '&lt;up one level&gt;', 'FTPBROWSER_LBL_INSTRUCTIONS' => 'Click on a directory to navigate into it. Click on OK to select that directory, Cancel to abort the procedure.', 'FTPBROWSER_LBL_ERROR' => 'An error occurred', 'SFTP_NO_SSH2' => 'Your web server does not have the SSH2 PHP module, therefore can not connect to SFTP servers.', 'SFTP_NO_FTP_SUPPORT' => 'Your SSH server does not allow SFTP connections', 'SFTP_WRONG_USER' => 'Wrong SFTP username or password', 'SFTP_WRONG_STARTING_DIR' => 'You must supply a valid absolute path', 'SFTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'SFTP_COULDNT_UPLOAD' => 'Could not upload %s', 'SFTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'UI-ROOT' => '&lt;root&gt;', 'CONFIG_UI_FTPBROWSER_TITLE' => 'FTP Directory Browser', 'FTP_BROWSE' => 'Browse', 'BTN_CHECK' => 'Check', 'BTN_RESET' => 'Reset', 'BTN_TESTFTPCON' => 'Test FTP connection', 'BTN_TESTSFTPCON' => 'Test SFTP connection', 'BTN_GOTOSTART' => 'Start over', 'FINE_TUNE' => 'Fine tune', 'MIN_EXEC_TIME' => 'Minimum execution time:', 'MAX_EXEC_TIME' => 'Maximum execution time:', 'SECONDS_PER_STEP' => 'seconds per step', 'EXTRACT_FILES' => 'Extract files', 'BTN_START' => 'Start', 'EXTRACTING' => 'Extracting', 'DO_NOT_CLOSE_EXTRACT' => 'Do not close this window while the extraction is in progress', 'RESTACLEANUP' => 'Restoration and Clean Up', 'BTN_RUNINSTALLER' => 'Run the Installer', 'BTN_CLEANUP' => 'Clean Up', 'BTN_SITEFE' => 'Visit your site\'s front-end', 'BTN_SITEBE' => 'Visit your site\'s back-end', 'WARNINGS' => 'Extraction Warnings', 'ERROR_OCCURED' => 'An error occured', 'STEALTH_MODE' => 'Stealth mode', 'STEALTH_URL' => 'HTML file to show to web visitors', 'ERR_NOT_A_JPS_FILE' => 'The file is not a JPA archive', 'ERR_INVALID_JPS_PASSWORD' => 'The password you gave is wrong or the archive is corrupt', 'JPS_PASSWORD' => 'Archive Password (for JPS files)', 'INVALID_FILE_HEADER' => 'Invalid header in archive file, part %s, offset %s', 'NEEDSOMEHELPKS' => 'Want some help to use this tool? Read this first:', 'QUICKSTART' => 'Quick Start Guide', 'CANTGETITTOWORK' => 'Can\'t get it to work? Click me!', 'NOARCHIVESCLICKHERE' => 'No archives detected. Click here for troubleshooting instructions.', 'POSTRESTORATIONTROUBLESHOOTING' => 'Something not working after the restoration? Click here for troubleshooting instructions.', 'UPDATE_HEADER' => 'An updated version of Akeeba Kickstart (<span id="update-version">unknown</span>) is available!', 'UPDATE_NOTICE' => 'You are advised to always use the latest version of Akeeba Kickstart available. Older versions may be subject to bugs and will not be supported.', 'UPDATE_DLNOW' => 'Download now', 'UPDATE_MOREINFO' => 'More information', 'IGNORE_MOST_ERRORS' => 'Ignore most errors', 'WRONG_FTP_PATH2' => 'Wrong FTP initial directory - the directory doesn\'t correspond to your site\'s web root', 'ARCHIVE_DIRECTORY' => 'Archive directory:', 'RELOAD_ARCHIVES' => 'Reload', 'CONFIG_UI_SFTPBROWSER_TITLE' => 'SFTP Directory Browser', 'ERR_COULD_NOT_OPEN_ARCHIVE_PART' => 'Could not open archive part file %s for reading. Check that the file exists, is readable by the web server and is not in a directory made out of reach by chroot, open_basedir restrictions or any other restriction put in place by your host.']; private $language = NULL; private ${AKAbstractObject}_errors = []; protected $_errors_queue_size = 0; private ${AKAbstractObject}_warnings = []; protected $_warnings_queue_size = 0 }
7	380	0	0.021426	1999064	AKText->addDefaultLanguageStrings	1		/var/www/html/uploads/ikstart.php	11316	1	['AKURL_IMPORT' => 'Import from URL', 'AKURL_TITLE_STEP1' => 'Specify the URL', 'AKURL_FILENAME' => 'URL to import', 'AKURL_JOOMLA' => 'Latest Joomla! release', 'AKURL_WORDPRESS' => 'Latest WordPress release', 'AKURL_CANCEL' => 'Cancel import', 'AKURL_TITLE_STEP2' => 'Importing...', 'AKURL_DO_NOT_CLOSE' => 'Please do not close this window while your backup archives are being imported', 'AKURL_TITLE_STEP3' => 'Import is complete', 'AKURL_BTN_RELOAD' => 'Reload Kickstart']
8	381	0	0.021460	1999064	array_merge	0		/var/www/html/uploads/ikstart.php	6585	2	['AKURL_IMPORT' => 'Import from URL', 'AKURL_TITLE_STEP1' => 'Specify the URL', 'AKURL_FILENAME' => 'URL to import', 'AKURL_JOOMLA' => 'Latest Joomla! release', 'AKURL_WORDPRESS' => 'Latest WordPress release', 'AKURL_CANCEL' => 'Cancel import', 'AKURL_TITLE_STEP2' => 'Importing...', 'AKURL_DO_NOT_CLOSE' => 'Please do not close this window while your backup archives are being imported', 'AKURL_TITLE_STEP3' => 'Import is complete', 'AKURL_BTN_RELOAD' => 'Reload Kickstart']	['AUTOMODEON' => 'Auto-mode enabled', 'ERR_NOT_A_JPA_FILE' => 'The file is not a JPA archive', 'ERR_CORRUPT_ARCHIVE' => 'The archive file is corrupt, truncated or archive parts are missing', 'ERR_INVALID_LOGIN' => 'Invalid login', 'COULDNT_CREATE_DIR' => 'Could not create %s folder', 'COULDNT_WRITE_FILE' => 'Could not open %s for writing.', 'WRONG_FTP_HOST' => 'Wrong FTP host or port', 'WRONG_FTP_USER' => 'Wrong FTP username or password', 'WRONG_FTP_PATH1' => 'Wrong FTP initial directory - the directory doesn\'t exist', 'FTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'FTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'SFTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'FTP_COULDNT_UPLOAD' => 'Could not upload %s', 'THINGS_HEADER' => 'Things you should know about Akeeba Kickstart', 'THINGS_01' => 'Kickstart is not an installer. It is an archive extraction tool. The actual installer was put inside the archive file at backup time.', 'THINGS_02' => 'Kickstart is not the only way to extract the backup archive. You can use Akeeba eXtract Wizard and upload the extracted files using FTP instead.', 'THINGS_03' => 'Kickstart is bound by your server\'s configuration. As such, it may not work at all.', 'THINGS_04' => 'You should download and upload your archive files using FTP in Binary transfer mode. Any other method could lead to a corrupt backup archive and restoration failure.', 'THINGS_05' => 'Post-restoration site load errors are usually caused by .htaccess or php.ini directives. You should understand that blank pages, 404 and 500 errors can usually be worked around by editing the aforementioned files. It is not our job to mess with your configuration files, because this could be dangerous for your site.', 'THINGS_06' => 'Kickstart overwrites files without a warning. If you are not sure that you are OK with that do not continue.', 'THINGS_07' => 'Trying to restore to the temporary URL of a cPanel host (e.g. http://1.2.3.4/~username) will lead to restoration failure and your site will appear to be not working. This is normal and it\'s just how your server and CMS software work.', 'THINGS_08' => 'You are supposed to read the documentation before using this software. Most issues can be avoided, or easily worked around, by understanding how this software works.', 'THINGS_09' => 'This text does not imply that there is a problem detected. It is standard text displayed every time you launch Kickstart.', 'CLOSE_LIGHTBOX' => 'Click here or press ESC to close this message', 'SELECT_ARCHIVE' => 'Select a backup archive', 'ARCHIVE_FILE' => 'Archive file:', 'SELECT_EXTRACTION' => 'Select an extraction method', 'WRITE_TO_FILES' => 'Write to files:', 'WRITE_HYBRID' => 'Hybrid (use FTP only if needed)', 'WRITE_DIRECTLY' => 'Directly', 'WRITE_FTP' => 'Use FTP for all files', 'WRITE_SFTP' => 'Use SFTP for all files', 'FTP_HOST' => '(S)FTP host name:', 'FTP_PORT' => '(S)FTP port:', 'FTP_FTPS' => 'Use FTP over SSL (FTPS)', 'FTP_PASSIVE' => 'Use FTP Passive Mode', 'FTP_USER' => '(S)FTP user name:', 'FTP_PASS' => '(S)FTP password:', 'FTP_DIR' => '(S)FTP directory:', 'FTP_TEMPDIR' => 'Temporary directory:', 'FTP_CONNECTION_OK' => 'FTP Connection Established', 'SFTP_CONNECTION_OK' => 'SFTP Connection Established', 'FTP_CONNECTION_FAILURE' => 'The FTP Connection Failed', 'SFTP_CONNECTION_FAILURE' => 'The SFTP Connection Failed', 'FTP_TEMPDIR_WRITABLE' => 'The temporary directory is writable.', 'FTP_TEMPDIR_UNWRITABLE' => 'The temporary directory is not writable. Please check the permissions.', 'FTPBROWSER_ERROR_HOSTNAME' => 'Invalid FTP host or port', 'FTPBROWSER_ERROR_USERPASS' => 'Invalid FTP username or password', 'FTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'FTPBROWSER_ERROR_UNSUPPORTED' => 'Sorry, your FTP server doesn\'t support our FTP directory browser.', 'FTPBROWSER_LBL_GOPARENT' => '&lt;up one level&gt;', 'FTPBROWSER_LBL_INSTRUCTIONS' => 'Click on a directory to navigate into it. Click on OK to select that directory, Cancel to abort the procedure.', 'FTPBROWSER_LBL_ERROR' => 'An error occurred', 'SFTP_NO_SSH2' => 'Your web server does not have the SSH2 PHP module, therefore can not connect to SFTP servers.', 'SFTP_NO_FTP_SUPPORT' => 'Your SSH server does not allow SFTP connections', 'SFTP_WRONG_USER' => 'Wrong SFTP username or password', 'SFTP_WRONG_STARTING_DIR' => 'You must supply a valid absolute path', 'SFTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'SFTP_COULDNT_UPLOAD' => 'Could not upload %s', 'SFTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'UI-ROOT' => '&lt;root&gt;', 'CONFIG_UI_FTPBROWSER_TITLE' => 'FTP Directory Browser', 'FTP_BROWSE' => 'Browse', 'BTN_CHECK' => 'Check', 'BTN_RESET' => 'Reset', 'BTN_TESTFTPCON' => 'Test FTP connection', 'BTN_TESTSFTPCON' => 'Test SFTP connection', 'BTN_GOTOSTART' => 'Start over', 'FINE_TUNE' => 'Fine tune', 'MIN_EXEC_TIME' => 'Minimum execution time:', 'MAX_EXEC_TIME' => 'Maximum execution time:', 'SECONDS_PER_STEP' => 'seconds per step', 'EXTRACT_FILES' => 'Extract files', 'BTN_START' => 'Start', 'EXTRACTING' => 'Extracting', 'DO_NOT_CLOSE_EXTRACT' => 'Do not close this window while the extraction is in progress', 'RESTACLEANUP' => 'Restoration and Clean Up', 'BTN_RUNINSTALLER' => 'Run the Installer', 'BTN_CLEANUP' => 'Clean Up', 'BTN_SITEFE' => 'Visit your site\'s front-end', 'BTN_SITEBE' => 'Visit your site\'s back-end', 'WARNINGS' => 'Extraction Warnings', 'ERROR_OCCURED' => 'An error occured', 'STEALTH_MODE' => 'Stealth mode', 'STEALTH_URL' => 'HTML file to show to web visitors', 'ERR_NOT_A_JPS_FILE' => 'The file is not a JPA archive', 'ERR_INVALID_JPS_PASSWORD' => 'The password you gave is wrong or the archive is corrupt', 'JPS_PASSWORD' => 'Archive Password (for JPS files)', 'INVALID_FILE_HEADER' => 'Invalid header in archive file, part %s, offset %s', 'NEEDSOMEHELPKS' => 'Want some help to use this tool? Read this first:', 'QUICKSTART' => 'Quick Start Guide', 'CANTGETITTOWORK' => 'Can\'t get it to work? Click me!', 'NOARCHIVESCLICKHERE' => 'No archives detected. Click here for troubleshooting instructions.', 'POSTRESTORATIONTROUBLESHOOTING' => 'Something not working after the restoration? Click here for troubleshooting instructions.', 'UPDATE_HEADER' => 'An updated version of Akeeba Kickstart (<span id="update-version">unknown</span>) is available!', 'UPDATE_NOTICE' => 'You are advised to always use the latest version of Akeeba Kickstart available. Older versions may be subject to bugs and will not be supported.', 'UPDATE_DLNOW' => 'Download now', 'UPDATE_MOREINFO' => 'More information', 'IGNORE_MOST_ERRORS' => 'Ignore most errors', 'WRONG_FTP_PATH2' => 'Wrong FTP initial directory - the directory doesn\'t correspond to your site\'s web root', 'ARCHIVE_DIRECTORY' => 'Archive directory:', 'RELOAD_ARCHIVES' => 'Reload', 'CONFIG_UI_SFTPBROWSER_TITLE' => 'SFTP Directory Browser', 'ERR_COULD_NOT_OPEN_ARCHIVE_PART' => 'Could not open archive part file %s for reading. Check that the file exists, is readable by the web server and is not in a directory made out of reach by chroot, open_basedir restrictions or any other restriction put in place by your host.']
8	381	1	0.021687	2007376
8	381	R			['AKURL_IMPORT' => 'Import from URL', 'AKURL_TITLE_STEP1' => 'Specify the URL', 'AKURL_FILENAME' => 'URL to import', 'AKURL_JOOMLA' => 'Latest Joomla! release', 'AKURL_WORDPRESS' => 'Latest WordPress release', 'AKURL_CANCEL' => 'Cancel import', 'AKURL_TITLE_STEP2' => 'Importing...', 'AKURL_DO_NOT_CLOSE' => 'Please do not close this window while your backup archives are being imported', 'AKURL_TITLE_STEP3' => 'Import is complete', 'AKURL_BTN_RELOAD' => 'Reload Kickstart', 'AUTOMODEON' => 'Auto-mode enabled', 'ERR_NOT_A_JPA_FILE' => 'The file is not a JPA archive', 'ERR_CORRUPT_ARCHIVE' => 'The archive file is corrupt, truncated or archive parts are missing', 'ERR_INVALID_LOGIN' => 'Invalid login', 'COULDNT_CREATE_DIR' => 'Could not create %s folder', 'COULDNT_WRITE_FILE' => 'Could not open %s for writing.', 'WRONG_FTP_HOST' => 'Wrong FTP host or port', 'WRONG_FTP_USER' => 'Wrong FTP username or password', 'WRONG_FTP_PATH1' => 'Wrong FTP initial directory - the directory doesn\'t exist', 'FTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'FTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'SFTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'FTP_COULDNT_UPLOAD' => 'Could not upload %s', 'THINGS_HEADER' => 'Things you should know about Akeeba Kickstart', 'THINGS_01' => 'Kickstart is not an installer. It is an archive extraction tool. The actual installer was put inside the archive file at backup time.', 'THINGS_02' => 'Kickstart is not the only way to extract the backup archive. You can use Akeeba eXtract Wizard and upload the extracted files using FTP instead.', 'THINGS_03' => 'Kickstart is bound by your server\'s configuration. As such, it may not work at all.', 'THINGS_04' => 'You should download and upload your archive files using FTP in Binary transfer mode. Any other method could lead to a corrupt backup archive and restoration failure.', 'THINGS_05' => 'Post-restoration site load errors are usually caused by .htaccess or php.ini directives. You should understand that blank pages, 404 and 500 errors can usually be worked around by editing the aforementioned files. It is not our job to mess with your configuration files, because this could be dangerous for your site.', 'THINGS_06' => 'Kickstart overwrites files without a warning. If you are not sure that you are OK with that do not continue.', 'THINGS_07' => 'Trying to restore to the temporary URL of a cPanel host (e.g. http://1.2.3.4/~username) will lead to restoration failure and your site will appear to be not working. This is normal and it\'s just how your server and CMS software work.', 'THINGS_08' => 'You are supposed to read the documentation before using this software. Most issues can be avoided, or easily worked around, by understanding how this software works.', 'THINGS_09' => 'This text does not imply that there is a problem detected. It is standard text displayed every time you launch Kickstart.', 'CLOSE_LIGHTBOX' => 'Click here or press ESC to close this message', 'SELECT_ARCHIVE' => 'Select a backup archive', 'ARCHIVE_FILE' => 'Archive file:', 'SELECT_EXTRACTION' => 'Select an extraction method', 'WRITE_TO_FILES' => 'Write to files:', 'WRITE_HYBRID' => 'Hybrid (use FTP only if needed)', 'WRITE_DIRECTLY' => 'Directly', 'WRITE_FTP' => 'Use FTP for all files', 'WRITE_SFTP' => 'Use SFTP for all files', 'FTP_HOST' => '(S)FTP host name:', 'FTP_PORT' => '(S)FTP port:', 'FTP_FTPS' => 'Use FTP over SSL (FTPS)', 'FTP_PASSIVE' => 'Use FTP Passive Mode', 'FTP_USER' => '(S)FTP user name:', 'FTP_PASS' => '(S)FTP password:', 'FTP_DIR' => '(S)FTP directory:', 'FTP_TEMPDIR' => 'Temporary directory:', 'FTP_CONNECTION_OK' => 'FTP Connection Established', 'SFTP_CONNECTION_OK' => 'SFTP Connection Established', 'FTP_CONNECTION_FAILURE' => 'The FTP Connection Failed', 'SFTP_CONNECTION_FAILURE' => 'The SFTP Connection Failed', 'FTP_TEMPDIR_WRITABLE' => 'The temporary directory is writable.', 'FTP_TEMPDIR_UNWRITABLE' => 'The temporary directory is not writable. Please check the permissions.', 'FTPBROWSER_ERROR_HOSTNAME' => 'Invalid FTP host or port', 'FTPBROWSER_ERROR_USERPASS' => 'Invalid FTP username or password', 'FTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'FTPBROWSER_ERROR_UNSUPPORTED' => 'Sorry, your FTP server doesn\'t support our FTP directory browser.', 'FTPBROWSER_LBL_GOPARENT' => '&lt;up one level&gt;', 'FTPBROWSER_LBL_INSTRUCTIONS' => 'Click on a directory to navigate into it. Click on OK to select that directory, Cancel to abort the procedure.', 'FTPBROWSER_LBL_ERROR' => 'An error occurred', 'SFTP_NO_SSH2' => 'Your web server does not have the SSH2 PHP module, therefore can not connect to SFTP servers.', 'SFTP_NO_FTP_SUPPORT' => 'Your SSH server does not allow SFTP connections', 'SFTP_WRONG_USER' => 'Wrong SFTP username or password', 'SFTP_WRONG_STARTING_DIR' => 'You must supply a valid absolute path', 'SFTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'SFTP_COULDNT_UPLOAD' => 'Could not upload %s', 'SFTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'UI-ROOT' => '&lt;root&gt;', 'CONFIG_UI_FTPBROWSER_TITLE' => 'FTP Directory Browser', 'FTP_BROWSE' => 'Browse', 'BTN_CHECK' => 'Check', 'BTN_RESET' => 'Reset', 'BTN_TESTFTPCON' => 'Test FTP connection', 'BTN_TESTSFTPCON' => 'Test SFTP connection', 'BTN_GOTOSTART' => 'Start over', 'FINE_TUNE' => 'Fine tune', 'MIN_EXEC_TIME' => 'Minimum execution time:', 'MAX_EXEC_TIME' => 'Maximum execution time:', 'SECONDS_PER_STEP' => 'seconds per step', 'EXTRACT_FILES' => 'Extract files', 'BTN_START' => 'Start', 'EXTRACTING' => 'Extracting', 'DO_NOT_CLOSE_EXTRACT' => 'Do not close this window while the extraction is in progress', 'RESTACLEANUP' => 'Restoration and Clean Up', 'BTN_RUNINSTALLER' => 'Run the Installer', 'BTN_CLEANUP' => 'Clean Up', 'BTN_SITEFE' => 'Visit your site\'s front-end', 'BTN_SITEBE' => 'Visit your site\'s back-end', 'WARNINGS' => 'Extraction Warnings', 'ERROR_OCCURED' => 'An error occured', 'STEALTH_MODE' => 'Stealth mode', 'STEALTH_URL' => 'HTML file to show to web visitors', 'ERR_NOT_A_JPS_FILE' => 'The file is not a JPA archive', 'ERR_INVALID_JPS_PASSWORD' => 'The password you gave is wrong or the archive is corrupt', 'JPS_PASSWORD' => 'Archive Password (for JPS files)', 'INVALID_FILE_HEADER' => 'Invalid header in archive file, part %s, offset %s', 'NEEDSOMEHELPKS' => 'Want some help to use this tool? Read this first:', 'QUICKSTART' => 'Quick Start Guide', 'CANTGETITTOWORK' => 'Can\'t get it to work? Click me!', 'NOARCHIVESCLICKHERE' => 'No archives detected. Click here for troubleshooting instructions.', 'POSTRESTORATIONTROUBLESHOOTING' => 'Something not working after the restoration? Click here for troubleshooting instructions.', 'UPDATE_HEADER' => 'An updated version of Akeeba Kickstart (<span id="update-version">unknown</span>) is available!', 'UPDATE_NOTICE' => 'You are advised to always use the latest version of Akeeba Kickstart available. Older versions may be subject to bugs and will not be supported.', 'UPDATE_DLNOW' => 'Download now', 'UPDATE_MOREINFO' => 'More information', 'IGNORE_MOST_ERRORS' => 'Ignore most errors', 'WRONG_FTP_PATH2' => 'Wrong FTP initial directory - the directory doesn\'t correspond to your site\'s web root', 'ARCHIVE_DIRECTORY' => 'Archive directory:', 'RELOAD_ARCHIVES' => 'Reload', 'CONFIG_UI_SFTPBROWSER_TITLE' => 'SFTP Directory Browser', 'ERR_COULD_NOT_OPEN_ARCHIVE_PART' => 'Could not open archive part file %s for reading. Check that the file exists, is readable by the web server and is not in a directory made out of reach by chroot, open_basedir restrictions or any other restriction put in place by your host.']
7		A						/var/www/html/uploads/ikstart.php	6585	$this->strings = ['AKURL_IMPORT' => 'Import from URL', 'AKURL_TITLE_STEP1' => 'Specify the URL', 'AKURL_FILENAME' => 'URL to import', 'AKURL_JOOMLA' => 'Latest Joomla! release', 'AKURL_WORDPRESS' => 'Latest WordPress release', 'AKURL_CANCEL' => 'Cancel import', 'AKURL_TITLE_STEP2' => 'Importing...', 'AKURL_DO_NOT_CLOSE' => 'Please do not close this window while your backup archives are being imported', 'AKURL_TITLE_STEP3' => 'Import is complete', 'AKURL_BTN_RELOAD' => 'Reload Kickstart', 'AUTOMODEON' => 'Auto-mode enabled', 'ERR_NOT_A_JPA_FILE' => 'The file is not a JPA archive', 'ERR_CORRUPT_ARCHIVE' => 'The archive file is corrupt, truncated or archive parts are missing', 'ERR_INVALID_LOGIN' => 'Invalid login', 'COULDNT_CREATE_DIR' => 'Could not create %s folder', 'COULDNT_WRITE_FILE' => 'Could not open %s for writing.', 'WRONG_FTP_HOST' => 'Wrong FTP host or port', 'WRONG_FTP_USER' => 'Wrong FTP username or password', 'WRONG_FTP_PATH1' => 'Wrong FTP initial directory - the directory doesn\'t exist', 'FTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'FTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'SFTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'FTP_COULDNT_UPLOAD' => 'Could not upload %s', 'THINGS_HEADER' => 'Things you should know about Akeeba Kickstart', 'THINGS_01' => 'Kickstart is not an installer. It is an archive extraction tool. The actual installer was put inside the archive file at backup time.', 'THINGS_02' => 'Kickstart is not the only way to extract the backup archive. You can use Akeeba eXtract Wizard and upload the extracted files using FTP instead.', 'THINGS_03' => 'Kickstart is bound by your server\'s configuration. As such, it may not work at all.', 'THINGS_04' => 'You should download and upload your archive files using FTP in Binary transfer mode. Any other method could lead to a corrupt backup archive and restoration failure.', 'THINGS_05' => 'Post-restoration site load errors are usually caused by .htaccess or php.ini directives. You should understand that blank pages, 404 and 500 errors can usually be worked around by editing the aforementioned files. It is not our job to mess with your configuration files, because this could be dangerous for your site.', 'THINGS_06' => 'Kickstart overwrites files without a warning. If you are not sure that you are OK with that do not continue.', 'THINGS_07' => 'Trying to restore to the temporary URL of a cPanel host (e.g. http://1.2.3.4/~username) will lead to restoration failure and your site will appear to be not working. This is normal and it\'s just how your server and CMS software work.', 'THINGS_08' => 'You are supposed to read the documentation before using this software. Most issues can be avoided, or easily worked around, by understanding how this software works.', 'THINGS_09' => 'This text does not imply that there is a problem detected. It is standard text displayed every time you launch Kickstart.', 'CLOSE_LIGHTBOX' => 'Click here or press ESC to close this message', 'SELECT_ARCHIVE' => 'Select a backup archive', 'ARCHIVE_FILE' => 'Archive file:', 'SELECT_EXTRACTION' => 'Select an extraction method', 'WRITE_TO_FILES' => 'Write to files:', 'WRITE_HYBRID' => 'Hybrid (use FTP only if needed)', 'WRITE_DIRECTLY' => 'Directly', 'WRITE_FTP' => 'Use FTP for all files', 'WRITE_SFTP' => 'Use SFTP for all files', 'FTP_HOST' => '(S)FTP host name:', 'FTP_PORT' => '(S)FTP port:', 'FTP_FTPS' => 'Use FTP over SSL (FTPS)', 'FTP_PASSIVE' => 'Use FTP Passive Mode', 'FTP_USER' => '(S)FTP user name:', 'FTP_PASS' => '(S)FTP password:', 'FTP_DIR' => '(S)FTP directory:', 'FTP_TEMPDIR' => 'Temporary directory:', 'FTP_CONNECTION_OK' => 'FTP Connection Established', 'SFTP_CONNECTION_OK' => 'SFTP Connection Established', 'FTP_CONNECTION_FAILURE' => 'The FTP Connection Failed', 'SFTP_CONNECTION_FAILURE' => 'The SFTP Connection Failed', 'FTP_TEMPDIR_WRITABLE' => 'The temporary directory is writable.', 'FTP_TEMPDIR_UNWRITABLE' => 'The temporary directory is not writable. Please check the permissions.', 'FTPBROWSER_ERROR_HOSTNAME' => 'Invalid FTP host or port', 'FTPBROWSER_ERROR_USERPASS' => 'Invalid FTP username or password', 'FTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'FTPBROWSER_ERROR_UNSUPPORTED' => 'Sorry, your FTP server doesn\'t support our FTP directory browser.', 'FTPBROWSER_LBL_GOPARENT' => '&lt;up one level&gt;', 'FTPBROWSER_LBL_INSTRUCTIONS' => 'Click on a directory to navigate into it. Click on OK to select that directory, Cancel to abort the procedure.', 'FTPBROWSER_LBL_ERROR' => 'An error occurred', 'SFTP_NO_SSH2' => 'Your web server does not have the SSH2 PHP module, therefore can not connect to SFTP servers.', 'SFTP_NO_FTP_SUPPORT' => 'Your SSH server does not allow SFTP connections', 'SFTP_WRONG_USER' => 'Wrong SFTP username or password', 'SFTP_WRONG_STARTING_DIR' => 'You must supply a valid absolute path', 'SFTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'SFTP_COULDNT_UPLOAD' => 'Could not upload %s', 'SFTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'UI-ROOT' => '&lt;root&gt;', 'CONFIG_UI_FTPBROWSER_TITLE' => 'FTP Directory Browser', 'FTP_BROWSE' => 'Browse', 'BTN_CHECK' => 'Check', 'BTN_RESET' => 'Reset', 'BTN_TESTFTPCON' => 'Test FTP connection', 'BTN_TESTSFTPCON' => 'Test SFTP connection', 'BTN_GOTOSTART' => 'Start over', 'FINE_TUNE' => 'Fine tune', 'MIN_EXEC_TIME' => 'Minimum execution time:', 'MAX_EXEC_TIME' => 'Maximum execution time:', 'SECONDS_PER_STEP' => 'seconds per step', 'EXTRACT_FILES' => 'Extract files', 'BTN_START' => 'Start', 'EXTRACTING' => 'Extracting', 'DO_NOT_CLOSE_EXTRACT' => 'Do not close this window while the extraction is in progress', 'RESTACLEANUP' => 'Restoration and Clean Up', 'BTN_RUNINSTALLER' => 'Run the Installer', 'BTN_CLEANUP' => 'Clean Up', 'BTN_SITEFE' => 'Visit your site\'s front-end', 'BTN_SITEBE' => 'Visit your site\'s back-end', 'WARNINGS' => 'Extraction Warnings', 'ERROR_OCCURED' => 'An error occured', 'STEALTH_MODE' => 'Stealth mode', 'STEALTH_URL' => 'HTML file to show to web visitors', 'ERR_NOT_A_JPS_FILE' => 'The file is not a JPA archive', 'ERR_INVALID_JPS_PASSWORD' => 'The password you gave is wrong or the archive is corrupt', 'JPS_PASSWORD' => 'Archive Password (for JPS files)', 'INVALID_FILE_HEADER' => 'Invalid header in archive file, part %s, offset %s', 'NEEDSOMEHELPKS' => 'Want some help to use this tool? Read this first:', 'QUICKSTART' => 'Quick Start Guide', 'CANTGETITTOWORK' => 'Can\'t get it to work? Click me!', 'NOARCHIVESCLICKHERE' => 'No archives detected. Click here for troubleshooting instructions.', 'POSTRESTORATIONTROUBLESHOOTING' => 'Something not working after the restoration? Click here for troubleshooting instructions.', 'UPDATE_HEADER' => 'An updated version of Akeeba Kickstart (<span id="update-version">unknown</span>) is available!', 'UPDATE_NOTICE' => 'You are advised to always use the latest version of Akeeba Kickstart available. Older versions may be subject to bugs and will not be supported.', 'UPDATE_DLNOW' => 'Download now', 'UPDATE_MOREINFO' => 'More information', 'IGNORE_MOST_ERRORS' => 'Ignore most errors', 'WRONG_FTP_PATH2' => 'Wrong FTP initial directory - the directory doesn\'t correspond to your site\'s web root', 'ARCHIVE_DIRECTORY' => 'Archive directory:', 'RELOAD_ARCHIVES' => 'Reload', 'CONFIG_UI_SFTPBROWSER_TITLE' => 'SFTP Directory Browser', 'ERR_COULD_NOT_OPEN_ARCHIVE_PART' => 'Could not open archive part file %s for reading. Check that the file exists, is readable by the web server and is not in a directory made out of reach by chroot, open_basedir restrictions or any other restriction put in place by your host.']
7	380	1	0.022138	2007312
6	317	1	0.022146	2007312
6	317	R			NULL
5		A						/var/www/html/uploads/ikstart.php	8020	$result = NULL
5	315	1	0.022171	2007312
5	382	0	0.022179	2007312	AKText::getInstance	1		/var/www/html/uploads/ikstart.php	10165	0
5	382	1	0.022193	2007312
5	382	R			class AKText { private $default_translation = ['AUTOMODEON' => 'Auto-mode enabled', 'ERR_NOT_A_JPA_FILE' => 'The file is not a JPA archive', 'ERR_CORRUPT_ARCHIVE' => 'The archive file is corrupt, truncated or archive parts are missing', 'ERR_INVALID_LOGIN' => 'Invalid login', 'COULDNT_CREATE_DIR' => 'Could not create %s folder', 'COULDNT_WRITE_FILE' => 'Could not open %s for writing.', 'WRONG_FTP_HOST' => 'Wrong FTP host or port', 'WRONG_FTP_USER' => 'Wrong FTP username or password', 'WRONG_FTP_PATH1' => 'Wrong FTP initial directory - the directory doesn\'t exist', 'FTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'FTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'SFTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'FTP_COULDNT_UPLOAD' => 'Could not upload %s', 'THINGS_HEADER' => 'Things you should know about Akeeba Kickstart', 'THINGS_01' => 'Kickstart is not an installer. It is an archive extraction tool. The actual installer was put inside the archive file at backup time.', 'THINGS_02' => 'Kickstart is not the only way to extract the backup archive. You can use Akeeba eXtract Wizard and upload the extracted files using FTP instead.', 'THINGS_03' => 'Kickstart is bound by your server\'s configuration. As such, it may not work at all.', 'THINGS_04' => 'You should download and upload your archive files using FTP in Binary transfer mode. Any other method could lead to a corrupt backup archive and restoration failure.', 'THINGS_05' => 'Post-restoration site load errors are usually caused by .htaccess or php.ini directives. You should understand that blank pages, 404 and 500 errors can usually be worked around by editing the aforementioned files. It is not our job to mess with your configuration files, because this could be dangerous for your site.', 'THINGS_06' => 'Kickstart overwrites files without a warning. If you are not sure that you are OK with that do not continue.', 'THINGS_07' => 'Trying to restore to the temporary URL of a cPanel host (e.g. http://1.2.3.4/~username) will lead to restoration failure and your site will appear to be not working. This is normal and it\'s just how your server and CMS software work.', 'THINGS_08' => 'You are supposed to read the documentation before using this software. Most issues can be avoided, or easily worked around, by understanding how this software works.', 'THINGS_09' => 'This text does not imply that there is a problem detected. It is standard text displayed every time you launch Kickstart.', 'CLOSE_LIGHTBOX' => 'Click here or press ESC to close this message', 'SELECT_ARCHIVE' => 'Select a backup archive', 'ARCHIVE_FILE' => 'Archive file:', 'SELECT_EXTRACTION' => 'Select an extraction method', 'WRITE_TO_FILES' => 'Write to files:', 'WRITE_HYBRID' => 'Hybrid (use FTP only if needed)', 'WRITE_DIRECTLY' => 'Directly', 'WRITE_FTP' => 'Use FTP for all files', 'WRITE_SFTP' => 'Use SFTP for all files', 'FTP_HOST' => '(S)FTP host name:', 'FTP_PORT' => '(S)FTP port:', 'FTP_FTPS' => 'Use FTP over SSL (FTPS)', 'FTP_PASSIVE' => 'Use FTP Passive Mode', 'FTP_USER' => '(S)FTP user name:', 'FTP_PASS' => '(S)FTP password:', 'FTP_DIR' => '(S)FTP directory:', 'FTP_TEMPDIR' => 'Temporary directory:', 'FTP_CONNECTION_OK' => 'FTP Connection Established', 'SFTP_CONNECTION_OK' => 'SFTP Connection Established', 'FTP_CONNECTION_FAILURE' => 'The FTP Connection Failed', 'SFTP_CONNECTION_FAILURE' => 'The SFTP Connection Failed', 'FTP_TEMPDIR_WRITABLE' => 'The temporary directory is writable.', 'FTP_TEMPDIR_UNWRITABLE' => 'The temporary directory is not writable. Please check the permissions.', 'FTPBROWSER_ERROR_HOSTNAME' => 'Invalid FTP host or port', 'FTPBROWSER_ERROR_USERPASS' => 'Invalid FTP username or password', 'FTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'FTPBROWSER_ERROR_UNSUPPORTED' => 'Sorry, your FTP server doesn\'t support our FTP directory browser.', 'FTPBROWSER_LBL_GOPARENT' => '&lt;up one level&gt;', 'FTPBROWSER_LBL_INSTRUCTIONS' => 'Click on a directory to navigate into it. Click on OK to select that directory, Cancel to abort the procedure.', 'FTPBROWSER_LBL_ERROR' => 'An error occurred', 'SFTP_NO_SSH2' => 'Your web server does not have the SSH2 PHP module, therefore can not connect to SFTP servers.', 'SFTP_NO_FTP_SUPPORT' => 'Your SSH server does not allow SFTP connections', 'SFTP_WRONG_USER' => 'Wrong SFTP username or password', 'SFTP_WRONG_STARTING_DIR' => 'You must supply a valid absolute path', 'SFTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'SFTP_COULDNT_UPLOAD' => 'Could not upload %s', 'SFTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'UI-ROOT' => '&lt;root&gt;', 'CONFIG_UI_FTPBROWSER_TITLE' => 'FTP Directory Browser', 'FTP_BROWSE' => 'Browse', 'BTN_CHECK' => 'Check', 'BTN_RESET' => 'Reset', 'BTN_TESTFTPCON' => 'Test FTP connection', 'BTN_TESTSFTPCON' => 'Test SFTP connection', 'BTN_GOTOSTART' => 'Start over', 'FINE_TUNE' => 'Fine tune', 'MIN_EXEC_TIME' => 'Minimum execution time:', 'MAX_EXEC_TIME' => 'Maximum execution time:', 'SECONDS_PER_STEP' => 'seconds per step', 'EXTRACT_FILES' => 'Extract files', 'BTN_START' => 'Start', 'EXTRACTING' => 'Extracting', 'DO_NOT_CLOSE_EXTRACT' => 'Do not close this window while the extraction is in progress', 'RESTACLEANUP' => 'Restoration and Clean Up', 'BTN_RUNINSTALLER' => 'Run the Installer', 'BTN_CLEANUP' => 'Clean Up', 'BTN_SITEFE' => 'Visit your site\'s front-end', 'BTN_SITEBE' => 'Visit your site\'s back-end', 'WARNINGS' => 'Extraction Warnings', 'ERROR_OCCURED' => 'An error occured', 'STEALTH_MODE' => 'Stealth mode', 'STEALTH_URL' => 'HTML file to show to web visitors', 'ERR_NOT_A_JPS_FILE' => 'The file is not a JPA archive', 'ERR_INVALID_JPS_PASSWORD' => 'The password you gave is wrong or the archive is corrupt', 'JPS_PASSWORD' => 'Archive Password (for JPS files)', 'INVALID_FILE_HEADER' => 'Invalid header in archive file, part %s, offset %s', 'NEEDSOMEHELPKS' => 'Want some help to use this tool? Read this first:', 'QUICKSTART' => 'Quick Start Guide', 'CANTGETITTOWORK' => 'Can\'t get it to work? Click me!', 'NOARCHIVESCLICKHERE' => 'No archives detected. Click here for troubleshooting instructions.', 'POSTRESTORATIONTROUBLESHOOTING' => 'Something not working after the restoration? Click here for troubleshooting instructions.', 'UPDATE_HEADER' => 'An updated version of Akeeba Kickstart (<span id="update-version">unknown</span>) is available!', 'UPDATE_NOTICE' => 'You are advised to always use the latest version of Akeeba Kickstart available. Older versions may be subject to bugs and will not be supported.', 'UPDATE_DLNOW' => 'Download now', 'UPDATE_MOREINFO' => 'More information', 'IGNORE_MOST_ERRORS' => 'Ignore most errors', 'WRONG_FTP_PATH2' => 'Wrong FTP initial directory - the directory doesn\'t correspond to your site\'s web root', 'ARCHIVE_DIRECTORY' => 'Archive directory:', 'RELOAD_ARCHIVES' => 'Reload', 'CONFIG_UI_SFTPBROWSER_TITLE' => 'SFTP Directory Browser', 'ERR_COULD_NOT_OPEN_ARCHIVE_PART' => 'Could not open archive part file %s for reading. Check that the file exists, is readable by the web server and is not in a directory made out of reach by chroot, open_basedir restrictions or any other restriction put in place by your host.']; private $strings = ['AKURL_IMPORT' => 'Import from URL', 'AKURL_TITLE_STEP1' => 'Specify the URL', 'AKURL_FILENAME' => 'URL to import', 'AKURL_JOOMLA' => 'Latest Joomla! release', 'AKURL_WORDPRESS' => 'Latest WordPress release', 'AKURL_CANCEL' => 'Cancel import', 'AKURL_TITLE_STEP2' => 'Importing...', 'AKURL_DO_NOT_CLOSE' => 'Please do not close this window while your backup archives are being imported', 'AKURL_TITLE_STEP3' => 'Import is complete', 'AKURL_BTN_RELOAD' => 'Reload Kickstart', 'AUTOMODEON' => 'Auto-mode enabled', 'ERR_NOT_A_JPA_FILE' => 'The file is not a JPA archive', 'ERR_CORRUPT_ARCHIVE' => 'The archive file is corrupt, truncated or archive parts are missing', 'ERR_INVALID_LOGIN' => 'Invalid login', 'COULDNT_CREATE_DIR' => 'Could not create %s folder', 'COULDNT_WRITE_FILE' => 'Could not open %s for writing.', 'WRONG_FTP_HOST' => 'Wrong FTP host or port', 'WRONG_FTP_USER' => 'Wrong FTP username or password', 'WRONG_FTP_PATH1' => 'Wrong FTP initial directory - the directory doesn\'t exist', 'FTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'FTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'SFTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'FTP_COULDNT_UPLOAD' => 'Could not upload %s', 'THINGS_HEADER' => 'Things you should know about Akeeba Kickstart', 'THINGS_01' => 'Kickstart is not an installer. It is an archive extraction tool. The actual installer was put inside the archive file at backup time.', 'THINGS_02' => 'Kickstart is not the only way to extract the backup archive. You can use Akeeba eXtract Wizard and upload the extracted files using FTP instead.', 'THINGS_03' => 'Kickstart is bound by your server\'s configuration. As such, it may not work at all.', 'THINGS_04' => 'You should download and upload your archive files using FTP in Binary transfer mode. Any other method could lead to a corrupt backup archive and restoration failure.', 'THINGS_05' => 'Post-restoration site load errors are usually caused by .htaccess or php.ini directives. You should understand that blank pages, 404 and 500 errors can usually be worked around by editing the aforementioned files. It is not our job to mess with your configuration files, because this could be dangerous for your site.', 'THINGS_06' => 'Kickstart overwrites files without a warning. If you are not sure that you are OK with that do not continue.', 'THINGS_07' => 'Trying to restore to the temporary URL of a cPanel host (e.g. http://1.2.3.4/~username) will lead to restoration failure and your site will appear to be not working. This is normal and it\'s just how your server and CMS software work.', 'THINGS_08' => 'You are supposed to read the documentation before using this software. Most issues can be avoided, or easily worked around, by understanding how this software works.', 'THINGS_09' => 'This text does not imply that there is a problem detected. It is standard text displayed every time you launch Kickstart.', 'CLOSE_LIGHTBOX' => 'Click here or press ESC to close this message', 'SELECT_ARCHIVE' => 'Select a backup archive', 'ARCHIVE_FILE' => 'Archive file:', 'SELECT_EXTRACTION' => 'Select an extraction method', 'WRITE_TO_FILES' => 'Write to files:', 'WRITE_HYBRID' => 'Hybrid (use FTP only if needed)', 'WRITE_DIRECTLY' => 'Directly', 'WRITE_FTP' => 'Use FTP for all files', 'WRITE_SFTP' => 'Use SFTP for all files', 'FTP_HOST' => '(S)FTP host name:', 'FTP_PORT' => '(S)FTP port:', 'FTP_FTPS' => 'Use FTP over SSL (FTPS)', 'FTP_PASSIVE' => 'Use FTP Passive Mode', 'FTP_USER' => '(S)FTP user name:', 'FTP_PASS' => '(S)FTP password:', 'FTP_DIR' => '(S)FTP directory:', 'FTP_TEMPDIR' => 'Temporary directory:', 'FTP_CONNECTION_OK' => 'FTP Connection Established', 'SFTP_CONNECTION_OK' => 'SFTP Connection Established', 'FTP_CONNECTION_FAILURE' => 'The FTP Connection Failed', 'SFTP_CONNECTION_FAILURE' => 'The SFTP Connection Failed', 'FTP_TEMPDIR_WRITABLE' => 'The temporary directory is writable.', 'FTP_TEMPDIR_UNWRITABLE' => 'The temporary directory is not writable. Please check the permissions.', 'FTPBROWSER_ERROR_HOSTNAME' => 'Invalid FTP host or port', 'FTPBROWSER_ERROR_USERPASS' => 'Invalid FTP username or password', 'FTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'FTPBROWSER_ERROR_UNSUPPORTED' => 'Sorry, your FTP server doesn\'t support our FTP directory browser.', 'FTPBROWSER_LBL_GOPARENT' => '&lt;up one level&gt;', 'FTPBROWSER_LBL_INSTRUCTIONS' => 'Click on a directory to navigate into it. Click on OK to select that directory, Cancel to abort the procedure.', 'FTPBROWSER_LBL_ERROR' => 'An error occurred', 'SFTP_NO_SSH2' => 'Your web server does not have the SSH2 PHP module, therefore can not connect to SFTP servers.', 'SFTP_NO_FTP_SUPPORT' => 'Your SSH server does not allow SFTP connections', 'SFTP_WRONG_USER' => 'Wrong SFTP username or password', 'SFTP_WRONG_STARTING_DIR' => 'You must supply a valid absolute path', 'SFTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'SFTP_COULDNT_UPLOAD' => 'Could not upload %s', 'SFTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'UI-ROOT' => '&lt;root&gt;', 'CONFIG_UI_FTPBROWSER_TITLE' => 'FTP Directory Browser', 'FTP_BROWSE' => 'Browse', 'BTN_CHECK' => 'Check', 'BTN_RESET' => 'Reset', 'BTN_TESTFTPCON' => 'Test FTP connection', 'BTN_TESTSFTPCON' => 'Test SFTP connection', 'BTN_GOTOSTART' => 'Start over', 'FINE_TUNE' => 'Fine tune', 'MIN_EXEC_TIME' => 'Minimum execution time:', 'MAX_EXEC_TIME' => 'Maximum execution time:', 'SECONDS_PER_STEP' => 'seconds per step', 'EXTRACT_FILES' => 'Extract files', 'BTN_START' => 'Start', 'EXTRACTING' => 'Extracting', 'DO_NOT_CLOSE_EXTRACT' => 'Do not close this window while the extraction is in progress', 'RESTACLEANUP' => 'Restoration and Clean Up', 'BTN_RUNINSTALLER' => 'Run the Installer', 'BTN_CLEANUP' => 'Clean Up', 'BTN_SITEFE' => 'Visit your site\'s front-end', 'BTN_SITEBE' => 'Visit your site\'s back-end', 'WARNINGS' => 'Extraction Warnings', 'ERROR_OCCURED' => 'An error occured', 'STEALTH_MODE' => 'Stealth mode', 'STEALTH_URL' => 'HTML file to show to web visitors', 'ERR_NOT_A_JPS_FILE' => 'The file is not a JPA archive', 'ERR_INVALID_JPS_PASSWORD' => 'The password you gave is wrong or the archive is corrupt', 'JPS_PASSWORD' => 'Archive Password (for JPS files)', 'INVALID_FILE_HEADER' => 'Invalid header in archive file, part %s, offset %s', 'NEEDSOMEHELPKS' => 'Want some help to use this tool? Read this first:', 'QUICKSTART' => 'Quick Start Guide', 'CANTGETITTOWORK' => 'Can\'t get it to work? Click me!', 'NOARCHIVESCLICKHERE' => 'No archives detected. Click here for troubleshooting instructions.', 'POSTRESTORATIONTROUBLESHOOTING' => 'Something not working after the restoration? Click here for troubleshooting instructions.', 'UPDATE_HEADER' => 'An updated version of Akeeba Kickstart (<span id="update-version">unknown</span>) is available!', 'UPDATE_NOTICE' => 'You are advised to always use the latest version of Akeeba Kickstart available. Older versions may be subject to bugs and will not be supported.', 'UPDATE_DLNOW' => 'Download now', 'UPDATE_MOREINFO' => 'More information', 'IGNORE_MOST_ERRORS' => 'Ignore most errors', 'WRONG_FTP_PATH2' => 'Wrong FTP initial directory - the directory doesn\'t correspond to your site\'s web root', 'ARCHIVE_DIRECTORY' => 'Archive directory:', 'RELOAD_ARCHIVES' => 'Reload', 'CONFIG_UI_SFTPBROWSER_TITLE' => 'SFTP Directory Browser', 'ERR_COULD_NOT_OPEN_ARCHIVE_PART' => 'Could not open archive part file %s for reading. Check that the file exists, is readable by the web server and is not in a directory made out of reach by chroot, open_basedir restrictions or any other restriction put in place by your host.']; private $language = NULL; private ${AKAbstractObject}_errors = []; protected $_errors_queue_size = 0; private ${AKAbstractObject}_warnings = []; protected $_warnings_queue_size = 0 }
4		A						/var/www/html/uploads/ikstart.php	10165	$translation = class AKText { private $default_translation = ['AUTOMODEON' => 'Auto-mode enabled', 'ERR_NOT_A_JPA_FILE' => 'The file is not a JPA archive', 'ERR_CORRUPT_ARCHIVE' => 'The archive file is corrupt, truncated or archive parts are missing', 'ERR_INVALID_LOGIN' => 'Invalid login', 'COULDNT_CREATE_DIR' => 'Could not create %s folder', 'COULDNT_WRITE_FILE' => 'Could not open %s for writing.', 'WRONG_FTP_HOST' => 'Wrong FTP host or port', 'WRONG_FTP_USER' => 'Wrong FTP username or password', 'WRONG_FTP_PATH1' => 'Wrong FTP initial directory - the directory doesn\'t exist', 'FTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'FTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'SFTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'FTP_COULDNT_UPLOAD' => 'Could not upload %s', 'THINGS_HEADER' => 'Things you should know about Akeeba Kickstart', 'THINGS_01' => 'Kickstart is not an installer. It is an archive extraction tool. The actual installer was put inside the archive file at backup time.', 'THINGS_02' => 'Kickstart is not the only way to extract the backup archive. You can use Akeeba eXtract Wizard and upload the extracted files using FTP instead.', 'THINGS_03' => 'Kickstart is bound by your server\'s configuration. As such, it may not work at all.', 'THINGS_04' => 'You should download and upload your archive files using FTP in Binary transfer mode. Any other method could lead to a corrupt backup archive and restoration failure.', 'THINGS_05' => 'Post-restoration site load errors are usually caused by .htaccess or php.ini directives. You should understand that blank pages, 404 and 500 errors can usually be worked around by editing the aforementioned files. It is not our job to mess with your configuration files, because this could be dangerous for your site.', 'THINGS_06' => 'Kickstart overwrites files without a warning. If you are not sure that you are OK with that do not continue.', 'THINGS_07' => 'Trying to restore to the temporary URL of a cPanel host (e.g. http://1.2.3.4/~username) will lead to restoration failure and your site will appear to be not working. This is normal and it\'s just how your server and CMS software work.', 'THINGS_08' => 'You are supposed to read the documentation before using this software. Most issues can be avoided, or easily worked around, by understanding how this software works.', 'THINGS_09' => 'This text does not imply that there is a problem detected. It is standard text displayed every time you launch Kickstart.', 'CLOSE_LIGHTBOX' => 'Click here or press ESC to close this message', 'SELECT_ARCHIVE' => 'Select a backup archive', 'ARCHIVE_FILE' => 'Archive file:', 'SELECT_EXTRACTION' => 'Select an extraction method', 'WRITE_TO_FILES' => 'Write to files:', 'WRITE_HYBRID' => 'Hybrid (use FTP only if needed)', 'WRITE_DIRECTLY' => 'Directly', 'WRITE_FTP' => 'Use FTP for all files', 'WRITE_SFTP' => 'Use SFTP for all files', 'FTP_HOST' => '(S)FTP host name:', 'FTP_PORT' => '(S)FTP port:', 'FTP_FTPS' => 'Use FTP over SSL (FTPS)', 'FTP_PASSIVE' => 'Use FTP Passive Mode', 'FTP_USER' => '(S)FTP user name:', 'FTP_PASS' => '(S)FTP password:', 'FTP_DIR' => '(S)FTP directory:', 'FTP_TEMPDIR' => 'Temporary directory:', 'FTP_CONNECTION_OK' => 'FTP Connection Established', 'SFTP_CONNECTION_OK' => 'SFTP Connection Established', 'FTP_CONNECTION_FAILURE' => 'The FTP Connection Failed', 'SFTP_CONNECTION_FAILURE' => 'The SFTP Connection Failed', 'FTP_TEMPDIR_WRITABLE' => 'The temporary directory is writable.', 'FTP_TEMPDIR_UNWRITABLE' => 'The temporary directory is not writable. Please check the permissions.', 'FTPBROWSER_ERROR_HOSTNAME' => 'Invalid FTP host or port', 'FTPBROWSER_ERROR_USERPASS' => 'Invalid FTP username or password', 'FTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'FTPBROWSER_ERROR_UNSUPPORTED' => 'Sorry, your FTP server doesn\'t support our FTP directory browser.', 'FTPBROWSER_LBL_GOPARENT' => '&lt;up one level&gt;', 'FTPBROWSER_LBL_INSTRUCTIONS' => 'Click on a directory to navigate into it. Click on OK to select that directory, Cancel to abort the procedure.', 'FTPBROWSER_LBL_ERROR' => 'An error occurred', 'SFTP_NO_SSH2' => 'Your web server does not have the SSH2 PHP module, therefore can not connect to SFTP servers.', 'SFTP_NO_FTP_SUPPORT' => 'Your SSH server does not allow SFTP connections', 'SFTP_WRONG_USER' => 'Wrong SFTP username or password', 'SFTP_WRONG_STARTING_DIR' => 'You must supply a valid absolute path', 'SFTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'SFTP_COULDNT_UPLOAD' => 'Could not upload %s', 'SFTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'UI-ROOT' => '&lt;root&gt;', 'CONFIG_UI_FTPBROWSER_TITLE' => 'FTP Directory Browser', 'FTP_BROWSE' => 'Browse', 'BTN_CHECK' => 'Check', 'BTN_RESET' => 'Reset', 'BTN_TESTFTPCON' => 'Test FTP connection', 'BTN_TESTSFTPCON' => 'Test SFTP connection', 'BTN_GOTOSTART' => 'Start over', 'FINE_TUNE' => 'Fine tune', 'MIN_EXEC_TIME' => 'Minimum execution time:', 'MAX_EXEC_TIME' => 'Maximum execution time:', 'SECONDS_PER_STEP' => 'seconds per step', 'EXTRACT_FILES' => 'Extract files', 'BTN_START' => 'Start', 'EXTRACTING' => 'Extracting', 'DO_NOT_CLOSE_EXTRACT' => 'Do not close this window while the extraction is in progress', 'RESTACLEANUP' => 'Restoration and Clean Up', 'BTN_RUNINSTALLER' => 'Run the Installer', 'BTN_CLEANUP' => 'Clean Up', 'BTN_SITEFE' => 'Visit your site\'s front-end', 'BTN_SITEBE' => 'Visit your site\'s back-end', 'WARNINGS' => 'Extraction Warnings', 'ERROR_OCCURED' => 'An error occured', 'STEALTH_MODE' => 'Stealth mode', 'STEALTH_URL' => 'HTML file to show to web visitors', 'ERR_NOT_A_JPS_FILE' => 'The file is not a JPA archive', 'ERR_INVALID_JPS_PASSWORD' => 'The password you gave is wrong or the archive is corrupt', 'JPS_PASSWORD' => 'Archive Password (for JPS files)', 'INVALID_FILE_HEADER' => 'Invalid header in archive file, part %s, offset %s', 'NEEDSOMEHELPKS' => 'Want some help to use this tool? Read this first:', 'QUICKSTART' => 'Quick Start Guide', 'CANTGETITTOWORK' => 'Can\'t get it to work? Click me!', 'NOARCHIVESCLICKHERE' => 'No archives detected. Click here for troubleshooting instructions.', 'POSTRESTORATIONTROUBLESHOOTING' => 'Something not working after the restoration? Click here for troubleshooting instructions.', 'UPDATE_HEADER' => 'An updated version of Akeeba Kickstart (<span id="update-version">unknown</span>) is available!', 'UPDATE_NOTICE' => 'You are advised to always use the latest version of Akeeba Kickstart available. Older versions may be subject to bugs and will not be supported.', 'UPDATE_DLNOW' => 'Download now', 'UPDATE_MOREINFO' => 'More information', 'IGNORE_MOST_ERRORS' => 'Ignore most errors', 'WRONG_FTP_PATH2' => 'Wrong FTP initial directory - the directory doesn\'t correspond to your site\'s web root', 'ARCHIVE_DIRECTORY' => 'Archive directory:', 'RELOAD_ARCHIVES' => 'Reload', 'CONFIG_UI_SFTPBROWSER_TITLE' => 'SFTP Directory Browser', 'ERR_COULD_NOT_OPEN_ARCHIVE_PART' => 'Could not open archive part file %s for reading. Check that the file exists, is readable by the web server and is not in a directory made out of reach by chroot, open_basedir restrictions or any other restriction put in place by your host.']; private $strings = ['AKURL_IMPORT' => 'Import from URL', 'AKURL_TITLE_STEP1' => 'Specify the URL', 'AKURL_FILENAME' => 'URL to import', 'AKURL_JOOMLA' => 'Latest Joomla! release', 'AKURL_WORDPRESS' => 'Latest WordPress release', 'AKURL_CANCEL' => 'Cancel import', 'AKURL_TITLE_STEP2' => 'Importing...', 'AKURL_DO_NOT_CLOSE' => 'Please do not close this window while your backup archives are being imported', 'AKURL_TITLE_STEP3' => 'Import is complete', 'AKURL_BTN_RELOAD' => 'Reload Kickstart', 'AUTOMODEON' => 'Auto-mode enabled', 'ERR_NOT_A_JPA_FILE' => 'The file is not a JPA archive', 'ERR_CORRUPT_ARCHIVE' => 'The archive file is corrupt, truncated or archive parts are missing', 'ERR_INVALID_LOGIN' => 'Invalid login', 'COULDNT_CREATE_DIR' => 'Could not create %s folder', 'COULDNT_WRITE_FILE' => 'Could not open %s for writing.', 'WRONG_FTP_HOST' => 'Wrong FTP host or port', 'WRONG_FTP_USER' => 'Wrong FTP username or password', 'WRONG_FTP_PATH1' => 'Wrong FTP initial directory - the directory doesn\'t exist', 'FTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'FTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'SFTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory', 'FTP_COULDNT_UPLOAD' => 'Could not upload %s', 'THINGS_HEADER' => 'Things you should know about Akeeba Kickstart', 'THINGS_01' => 'Kickstart is not an installer. It is an archive extraction tool. The actual installer was put inside the archive file at backup time.', 'THINGS_02' => 'Kickstart is not the only way to extract the backup archive. You can use Akeeba eXtract Wizard and upload the extracted files using FTP instead.', 'THINGS_03' => 'Kickstart is bound by your server\'s configuration. As such, it may not work at all.', 'THINGS_04' => 'You should download and upload your archive files using FTP in Binary transfer mode. Any other method could lead to a corrupt backup archive and restoration failure.', 'THINGS_05' => 'Post-restoration site load errors are usually caused by .htaccess or php.ini directives. You should understand that blank pages, 404 and 500 errors can usually be worked around by editing the aforementioned files. It is not our job to mess with your configuration files, because this could be dangerous for your site.', 'THINGS_06' => 'Kickstart overwrites files without a warning. If you are not sure that you are OK with that do not continue.', 'THINGS_07' => 'Trying to restore to the temporary URL of a cPanel host (e.g. http://1.2.3.4/~username) will lead to restoration failure and your site will appear to be not working. This is normal and it\'s just how your server and CMS software work.', 'THINGS_08' => 'You are supposed to read the documentation before using this software. Most issues can be avoided, or easily worked around, by understanding how this software works.', 'THINGS_09' => 'This text does not imply that there is a problem detected. It is standard text displayed every time you launch Kickstart.', 'CLOSE_LIGHTBOX' => 'Click here or press ESC to close this message', 'SELECT_ARCHIVE' => 'Select a backup archive', 'ARCHIVE_FILE' => 'Archive file:', 'SELECT_EXTRACTION' => 'Select an extraction method', 'WRITE_TO_FILES' => 'Write to files:', 'WRITE_HYBRID' => 'Hybrid (use FTP only if needed)', 'WRITE_DIRECTLY' => 'Directly', 'WRITE_FTP' => 'Use FTP for all files', 'WRITE_SFTP' => 'Use SFTP for all files', 'FTP_HOST' => '(S)FTP host name:', 'FTP_PORT' => '(S)FTP port:', 'FTP_FTPS' => 'Use FTP over SSL (FTPS)', 'FTP_PASSIVE' => 'Use FTP Passive Mode', 'FTP_USER' => '(S)FTP user name:', 'FTP_PASS' => '(S)FTP password:', 'FTP_DIR' => '(S)FTP directory:', 'FTP_TEMPDIR' => 'Temporary directory:', 'FTP_CONNECTION_OK' => 'FTP Connection Established', 'SFTP_CONNECTION_OK' => 'SFTP Connection Established', 'FTP_CONNECTION_FAILURE' => 'The FTP Connection Failed', 'SFTP_CONNECTION_FAILURE' => 'The SFTP Connection Failed', 'FTP_TEMPDIR_WRITABLE' => 'The temporary directory is writable.', 'FTP_TEMPDIR_UNWRITABLE' => 'The temporary directory is not writable. Please check the permissions.', 'FTPBROWSER_ERROR_HOSTNAME' => 'Invalid FTP host or port', 'FTPBROWSER_ERROR_USERPASS' => 'Invalid FTP username or password', 'FTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'FTPBROWSER_ERROR_UNSUPPORTED' => 'Sorry, your FTP server doesn\'t support our FTP directory browser.', 'FTPBROWSER_LBL_GOPARENT' => '&lt;up one level&gt;', 'FTPBROWSER_LBL_INSTRUCTIONS' => 'Click on a directory to navigate into it. Click on OK to select that directory, Cancel to abort the procedure.', 'FTPBROWSER_LBL_ERROR' => 'An error occurred', 'SFTP_NO_SSH2' => 'Your web server does not have the SSH2 PHP module, therefore can not connect to SFTP servers.', 'SFTP_NO_FTP_SUPPORT' => 'Your SSH server does not allow SFTP connections', 'SFTP_WRONG_USER' => 'Wrong SFTP username or password', 'SFTP_WRONG_STARTING_DIR' => 'You must supply a valid absolute path', 'SFTPBROWSER_ERROR_NOACCESS' => 'Directory doesn\'t exist or you don\'t have enough permissions to access it', 'SFTP_COULDNT_UPLOAD' => 'Could not upload %s', 'SFTP_CANT_CREATE_DIR' => 'Could not create directory %s', 'UI-ROOT' => '&lt;root&gt;', 'CONFIG_UI_FTPBROWSER_TITLE' => 'FTP Directory Browser', 'FTP_BROWSE' => 'Browse', 'BTN_CHECK' => 'Check', 'BTN_RESET' => 'Reset', 'BTN_TESTFTPCON' => 'Test FTP connection', 'BTN_TESTSFTPCON' => 'Test SFTP connection', 'BTN_GOTOSTART' => 'Start over', 'FINE_TUNE' => 'Fine tune', 'MIN_EXEC_TIME' => 'Minimum execution time:', 'MAX_EXEC_TIME' => 'Maximum execution time:', 'SECONDS_PER_STEP' => 'seconds per step', 'EXTRACT_FILES' => 'Extract files', 'BTN_START' => 'Start', 'EXTRACTING' => 'Extracting', 'DO_NOT_CLOSE_EXTRACT' => 'Do not close this window while the extraction is in progress', 'RESTACLEANUP' => 'Restoration and Clean Up', 'BTN_RUNINSTALLER' => 'Run the Installer', 'BTN_CLEANUP' => 'Clean Up', 'BTN_SITEFE' => 'Visit your site\'s front-end', 'BTN_SITEBE' => 'Visit your site\'s back-end', 'WARNINGS' => 'Extraction Warnings', 'ERROR_OCCURED' => 'An error occured', 'STEALTH_MODE' => 'Stealth mode', 'STEALTH_URL' => 'HTML file to show to web visitors', 'ERR_NOT_A_JPS_FILE' => 'The file is not a JPA archive', 'ERR_INVALID_JPS_PASSWORD' => 'The password you gave is wrong or the archive is corrupt', 'JPS_PASSWORD' => 'Archive Password (for JPS files)', 'INVALID_FILE_HEADER' => 'Invalid header in archive file, part %s, offset %s', 'NEEDSOMEHELPKS' => 'Want some help to use this tool? Read this first:', 'QUICKSTART' => 'Quick Start Guide', 'CANTGETITTOWORK' => 'Can\'t get it to work? Click me!', 'NOARCHIVESCLICKHERE' => 'No archives detected. Click here for troubleshooting instructions.', 'POSTRESTORATIONTROUBLESHOOTING' => 'Something not working after the restoration? Click here for troubleshooting instructions.', 'UPDATE_HEADER' => 'An updated version of Akeeba Kickstart (<span id="update-version">unknown</span>) is available!', 'UPDATE_NOTICE' => 'You are advised to always use the latest version of Akeeba Kickstart available. Older versions may be subject to bugs and will not be supported.', 'UPDATE_DLNOW' => 'Download now', 'UPDATE_MOREINFO' => 'More information', 'IGNORE_MOST_ERRORS' => 'Ignore most errors', 'WRONG_FTP_PATH2' => 'Wrong FTP initial directory - the directory doesn\'t correspond to your site\'s web root', 'ARCHIVE_DIRECTORY' => 'Archive directory:', 'RELOAD_ARCHIVES' => 'Reload', 'CONFIG_UI_SFTPBROWSER_TITLE' => 'SFTP Directory Browser', 'ERR_COULD_NOT_OPEN_ARCHIVE_PART' => 'Could not open archive part file %s for reading. Check that the file exists, is readable by the web server and is not in a directory made out of reach by chroot, open_basedir restrictions or any other restriction put in place by your host.']; private $language = NULL; private ${AKAbstractObject}_errors = []; protected $_errors_queue_size = 0; private ${AKAbstractObject}_warnings = []; protected $_warnings_queue_size = 0 }
5	383	0	0.022809	2007312	AKText->asJavascript	1		/var/www/html/uploads/ikstart.php	10166	0
5		A						/var/www/html/uploads/ikstart.php	6437	$out = ''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'AKURL_IMPORT'
6	384	0	0.022847	2007312	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'AKURL_IMPORT'	'\\\'"'
6	384	1	0.022863	2007424
6	384	R			'AKURL_IMPORT'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'AKURL_IMPORT'
6	385	0	0.022892	2007352	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Import from URL'	'\\\'"'
6	385	1	0.022906	2007464
6	385	R			'Import from URL'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Import from URL'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'AKURL_IMPORT\':\t\'Import from URL\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'AKURL_TITLE_STEP1'
6	386	0	0.022957	2007376	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'AKURL_TITLE_STEP1'	'\\\'"'
6	386	1	0.022972	2007496
6	386	R			'AKURL_TITLE_STEP1'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'AKURL_TITLE_STEP1'
6	387	0	0.022997	2007424	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Specify the URL'	'\\\'"'
6	387	1	0.023011	2007536
6	387	R			'Specify the URL'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Specify the URL'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'AKURL_TITLE_STEP1\':\t\'Specify the URL\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'AKURL_FILENAME'
6	388	0	0.023070	2007424	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'AKURL_FILENAME'	'\\\'"'
6	388	1	0.023084	2007536
6	388	R			'AKURL_FILENAME'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'AKURL_FILENAME'
6	389	0	0.023108	2007464	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'URL to import'	'\\\'"'
6	389	1	0.023122	2007576
6	389	R			'URL to import'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'URL to import'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'AKURL_FILENAME\':\t\'URL to import\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'AKURL_JOOMLA'
6	390	0	0.023195	2007472	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'AKURL_JOOMLA'	'\\\'"'
6	390	1	0.023209	2007584
6	390	R			'AKURL_JOOMLA'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'AKURL_JOOMLA'
6	391	0	0.023234	2007512	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Latest Joomla! release'	'\\\'"'
6	391	1	0.023247	2007632
6	391	R			'Latest Joomla! release'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Latest Joomla! release'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'AKURL_JOOMLA\':\t\'Latest Joomla! release\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'AKURL_WORDPRESS'
6	392	0	0.023304	2007504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'AKURL_WORDPRESS'	'\\\'"'
6	392	1	0.023318	2007616
6	392	R			'AKURL_WORDPRESS'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'AKURL_WORDPRESS'
6	393	0	0.023346	2007544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Latest WordPress release'	'\\\'"'
6	393	1	0.023360	2007672
6	393	R			'Latest WordPress release'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Latest WordPress release'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'AKURL_WORDPRESS\':\t\'Latest WordPress release\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'AKURL_CANCEL'
6	394	0	0.023416	2007536	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'AKURL_CANCEL'	'\\\'"'
6	394	1	0.023430	2007648
6	394	R			'AKURL_CANCEL'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'AKURL_CANCEL'
6	395	0	0.023453	2007576	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Cancel import'	'\\\'"'
6	395	1	0.023467	2007688
6	395	R			'Cancel import'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Cancel import'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'AKURL_CANCEL\':\t\'Cancel import\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'AKURL_TITLE_STEP2'
6	396	0	0.023523	2007568	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'AKURL_TITLE_STEP2'	'\\\'"'
6	396	1	0.023538	2007688
6	396	R			'AKURL_TITLE_STEP2'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'AKURL_TITLE_STEP2'
6	397	0	0.023562	2007616	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Importing...'	'\\\'"'
6	397	1	0.023575	2007728
6	397	R			'Importing...'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Importing...'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'AKURL_TITLE_STEP2\':\t\'Importing...\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'AKURL_DO_NOT_CLOSE'
6	398	0	0.023631	2007632	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'AKURL_DO_NOT_CLOSE'	'\\\'"'
6	398	1	0.023646	2007752
6	398	R			'AKURL_DO_NOT_CLOSE'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'AKURL_DO_NOT_CLOSE'
6	399	0	0.023671	2007680	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Please do not close this window while your backup archives are being imported'	'\\\'"'
6	399	1	0.023687	2007864
6	399	R			'Please do not close this window while your backup archives are being imported'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Please do not close this window while your backup archives are being imported'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'AKURL_DO_NOT_CLOSE\':\t\'Please do not close this window while your backup archives are being imported\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'AKURL_TITLE_STEP3'
6	400	0	0.023753	2007760	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'AKURL_TITLE_STEP3'	'\\\'"'
6	400	1	0.023768	2007880
6	400	R			'AKURL_TITLE_STEP3'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'AKURL_TITLE_STEP3'
6	401	0	0.023792	2007808	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Import is complete'	'\\\'"'
6	401	1	0.023806	2007928
6	401	R			'Import is complete'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Import is complete'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'AKURL_TITLE_STEP3\':\t\'Import is complete\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'AKURL_BTN_RELOAD'
6	402	0	0.023862	2007760	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'AKURL_BTN_RELOAD'	'\\\'"'
6	402	1	0.023877	2007880
6	402	R			'AKURL_BTN_RELOAD'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'AKURL_BTN_RELOAD'
6	403	0	0.023901	2007808	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Reload Kickstart'	'\\\'"'
6	403	1	0.023919	2007928
6	403	R			'Reload Kickstart'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Reload Kickstart'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'AKURL_BTN_RELOAD\':\t\'Reload Kickstart\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'AUTOMODEON'
6	404	0	0.023976	2007824	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'AUTOMODEON'	'\\\'"'
6	404	1	0.023990	2007936
6	404	R			'AUTOMODEON'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'AUTOMODEON'
6	405	0	0.024014	2007864	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Auto-mode enabled'	'\\\'"'
6	405	1	0.024028	2007984
6	405	R			'Auto-mode enabled'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Auto-mode enabled'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'AUTOMODEON\':\t\'Auto-mode enabled\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'ERR_NOT_A_JPA_FILE'
6	406	0	0.024115	2007952	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'ERR_NOT_A_JPA_FILE'	'\\\'"'
6	406	1	0.024131	2008072
6	406	R			'ERR_NOT_A_JPA_FILE'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'ERR_NOT_A_JPA_FILE'
6	407	0	0.024155	2008000	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'The file is not a JPA archive'	'\\\'"'
6	407	1	0.024170	2008128
6	407	R			'The file is not a JPA archive'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'The file is not a JPA archive'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'ERR_NOT_A_JPA_FILE\':\t\'The file is not a JPA archive\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'ERR_CORRUPT_ARCHIVE'
6	408	0	0.024229	2007952	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'ERR_CORRUPT_ARCHIVE'	'\\\'"'
6	408	1	0.024249	2008072
6	408	R			'ERR_CORRUPT_ARCHIVE'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'ERR_CORRUPT_ARCHIVE'
6	409	0	0.024274	2008000	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'The archive file is corrupt, truncated or archive parts are missing'	'\\\'"'
6	409	1	0.024290	2008168
6	409	R			'The archive file is corrupt, truncated or archive parts are missing'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'The archive file is corrupt, truncated or archive parts are missing'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'ERR_CORRUPT_ARCHIVE\':\t\'The archive file is corrupt, truncated or archive parts are missing\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'ERR_INVALID_LOGIN'
6	410	0	0.024356	2008080	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'ERR_INVALID_LOGIN'	'\\\'"'
6	410	1	0.024370	2008200
6	410	R			'ERR_INVALID_LOGIN'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'ERR_INVALID_LOGIN'
6	411	0	0.024395	2008128	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Invalid login'	'\\\'"'
6	411	1	0.024409	2008240
6	411	R			'Invalid login'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Invalid login'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'ERR_INVALID_LOGIN\':\t\'Invalid login\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'COULDNT_CREATE_DIR'
6	412	0	0.024465	2008080	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'COULDNT_CREATE_DIR'	'\\\'"'
6	412	1	0.024479	2008200
6	412	R			'COULDNT_CREATE_DIR'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'COULDNT_CREATE_DIR'
6	413	0	0.024503	2008128	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Could not create %s folder'	'\\\'"'
6	413	1	0.024517	2008256
6	413	R			'Could not create %s folder'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Could not create %s folder'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'COULDNT_CREATE_DIR\':\t\'Could not create %s folder\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'COULDNT_WRITE_FILE'
6	414	0	0.024582	2008080	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'COULDNT_WRITE_FILE'	'\\\'"'
6	414	1	0.024596	2008200
6	414	R			'COULDNT_WRITE_FILE'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'COULDNT_WRITE_FILE'
6	415	0	0.024621	2008128	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Could not open %s for writing.'	'\\\'"'
6	415	1	0.024635	2008256
6	415	R			'Could not open %s for writing.'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Could not open %s for writing.'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'COULDNT_WRITE_FILE\':\t\'Could not open %s for writing.\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'WRONG_FTP_HOST'
6	416	0	0.024696	2008208	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'WRONG_FTP_HOST'	'\\\'"'
6	416	1	0.024711	2008320
6	416	R			'WRONG_FTP_HOST'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'WRONG_FTP_HOST'
6	417	0	0.024736	2008248	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Wrong FTP host or port'	'\\\'"'
6	417	1	0.024750	2008368
6	417	R			'Wrong FTP host or port'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Wrong FTP host or port'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'WRONG_FTP_HOST\':\t\'Wrong FTP host or port\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'WRONG_FTP_USER'
6	418	0	0.024807	2008208	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'WRONG_FTP_USER'	'\\\'"'
6	418	1	0.024821	2008320
6	418	R			'WRONG_FTP_USER'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'WRONG_FTP_USER'
6	419	0	0.024846	2008248	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Wrong FTP username or password'	'\\\'"'
6	419	1	0.024860	2008376
6	419	R			'Wrong FTP username or password'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Wrong FTP username or password'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'WRONG_FTP_USER\':\t\'Wrong FTP username or password\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'WRONG_FTP_PATH1'
6	420	0	0.024919	2008336	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'WRONG_FTP_PATH1'	'\\\'"'
6	420	1	0.024933	2008448
6	420	R			'WRONG_FTP_PATH1'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'WRONG_FTP_PATH1'
6	421	0	0.024957	2008376	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Wrong FTP initial directory - the directory doesn\'t exist'	'\\\'"'
6	421	1	0.024973	2008544
6	421	R			'Wrong FTP initial directory - the directory doesn\\\'t exist'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Wrong FTP initial directory - the directory doesn\\\'t exist'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'WRONG_FTP_PATH1\':\t\'Wrong FTP initial directory - the directory doesn\\\'t exist\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FTP_CANT_CREATE_DIR'
6	422	0	0.025038	2008336	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FTP_CANT_CREATE_DIR'	'\\\'"'
6	422	1	0.025052	2008456
6	422	R			'FTP_CANT_CREATE_DIR'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FTP_CANT_CREATE_DIR'
6	423	0	0.025077	2008384	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Could not create directory %s'	'\\\'"'
6	423	1	0.025091	2008512
6	423	R			'Could not create directory %s'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Could not create directory %s'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FTP_CANT_CREATE_DIR\':\t\'Could not create directory %s\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FTP_TEMPDIR_NOT_WRITABLE'
6	424	0	0.025155	2008592	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FTP_TEMPDIR_NOT_WRITABLE'	'\\\'"'
6	424	1	0.025170	2008720
6	424	R			'FTP_TEMPDIR_NOT_WRITABLE'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FTP_TEMPDIR_NOT_WRITABLE'
6	425	0	0.025196	2008648	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Could not find or create a writable temporary directory'	'\\\'"'
6	425	1	0.025211	2008800
6	425	R			'Could not find or create a writable temporary directory'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Could not find or create a writable temporary directory'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FTP_TEMPDIR_NOT_WRITABLE\':\t\'Could not find or create a writable temporary directory\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'SFTP_TEMPDIR_NOT_WRITABLE'
6	426	0	0.025275	2008592	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'SFTP_TEMPDIR_NOT_WRITABLE'	'\\\'"'
6	426	1	0.025291	2008720
6	426	R			'SFTP_TEMPDIR_NOT_WRITABLE'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'SFTP_TEMPDIR_NOT_WRITABLE'
6	427	0	0.025316	2008648	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Could not find or create a writable temporary directory'	'\\\'"'
6	427	1	0.025331	2008800
6	427	R			'Could not find or create a writable temporary directory'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Could not find or create a writable temporary directory'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'SFTP_TEMPDIR_NOT_WRITABLE\':\t\'Could not find or create a writable temporary directory\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FTP_COULDNT_UPLOAD'
6	428	0	0.025395	2008592	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FTP_COULDNT_UPLOAD'	'\\\'"'
6	428	1	0.025409	2008712
6	428	R			'FTP_COULDNT_UPLOAD'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FTP_COULDNT_UPLOAD'
6	429	0	0.025434	2008640	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Could not upload %s'	'\\\'"'
6	429	1	0.025448	2008760
6	429	R			'Could not upload %s'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Could not upload %s'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FTP_COULDNT_UPLOAD\':\t\'Could not upload %s\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'THINGS_HEADER'
6	430	0	0.025505	2008592	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'THINGS_HEADER'	'\\\'"'
6	430	1	0.025519	2008704
6	430	R			'THINGS_HEADER'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'THINGS_HEADER'
6	431	0	0.025544	2008632	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Things you should know about Akeeba Kickstart'	'\\\'"'
6	431	1	0.025559	2008784
6	431	R			'Things you should know about Akeeba Kickstart'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Things you should know about Akeeba Kickstart'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'THINGS_HEADER\':\t\'Things you should know about Akeeba Kickstart\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'THINGS_01'
6	432	0	0.025620	2008848	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'THINGS_01'	'\\\'"'
6	432	1	0.025634	2008960
6	432	R			'THINGS_01'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'THINGS_01'
6	433	0	0.025658	2008888	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Kickstart is not an installer. It is an archive extraction tool. The actual installer was put inside the archive file at backup time.'	'\\\'"'
6	433	1	0.025680	2009120
6	433	R			'Kickstart is not an installer. It is an archive extraction tool. The actual installer was put inside the archive file at backup time.'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Kickstart is not an installer. It is an archive extraction tool. The actual installer was put inside the archive file at backup time.'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'THINGS_01\':\t\'Kickstart is not an installer. It is an archive extraction tool. The actual installer was put inside the archive file at backup time.\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'THINGS_02'
6	434	0	0.025753	2008848	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'THINGS_02'	'\\\'"'
6	434	1	0.025766	2008960
6	434	R			'THINGS_02'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'THINGS_02'
6	435	0	0.025791	2008888	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Kickstart is not the only way to extract the backup archive. You can use Akeeba eXtract Wizard and upload the extracted files using FTP instead.'	'\\\'"'
6	435	1	0.025810	2009152
6	435	R			'Kickstart is not the only way to extract the backup archive. You can use Akeeba eXtract Wizard and upload the extracted files using FTP instead.'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Kickstart is not the only way to extract the backup archive. You can use Akeeba eXtract Wizard and upload the extracted files using FTP instead.'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'THINGS_02\':\t\'Kickstart is not the only way to extract the backup archive. You can use Akeeba eXtract Wizard and upload the extracted files using FTP instead.\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'THINGS_03'
6	436	0	0.025884	2009104	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'THINGS_03'	'\\\'"'
6	436	1	0.025898	2009216
6	436	R			'THINGS_03'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'THINGS_03'
6	437	0	0.025921	2009144	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Kickstart is bound by your server\'s configuration. As such, it may not work at all.'	'\\\'"'
6	437	1	0.025937	2009328
6	437	R			'Kickstart is bound by your server\\\'s configuration. As such, it may not work at all.'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Kickstart is bound by your server\\\'s configuration. As such, it may not work at all.'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'THINGS_03\':\t\'Kickstart is bound by your server\\\'s configuration. As such, it may not work at all.\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'THINGS_04'
6	438	0	0.026003	2009104	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'THINGS_04'	'\\\'"'
6	438	1	0.026018	2009216
6	438	R			'THINGS_04'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'THINGS_04'
6	439	0	0.026041	2009144	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'You should download and upload your archive files using FTP in Binary transfer mode. Any other method could lead to a corrupt backup archive and restoration failure.'	'\\\'"'
6	439	1	0.026060	2009408
6	439	R			'You should download and upload your archive files using FTP in Binary transfer mode. Any other method could lead to a corrupt backup archive and restoration failure.'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'You should download and upload your archive files using FTP in Binary transfer mode. Any other method could lead to a corrupt backup archive and restoration failure.'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'THINGS_04\':\t\'You should download and upload your archive files using FTP in Binary transfer mode. Any other method could lead to a corrupt backup archive and restoration failure.\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'THINGS_05'
6	440	0	0.026135	2009360	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'THINGS_05'	'\\\'"'
6	440	1	0.026148	2009472
6	440	R			'THINGS_05'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'THINGS_05'
6	441	0	0.026172	2009400	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Post-restoration site load errors are usually caused by .htaccess or php.ini directives. You should understand that blank pages, 404 and 500 errors can usually be worked around by editing the aforementioned files. It is not our job to mess with your configuration files, because this could be dangerous for your site.'	'\\\'"'
6	441	1	0.026197	2009856
6	441	R			'Post-restoration site load errors are usually caused by .htaccess or php.ini directives. You should understand that blank pages, 404 and 500 errors can usually be worked around by editing the aforementioned files. It is not our job to mess with your configuration files, because this could be dangerous for your site.'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Post-restoration site load errors are usually caused by .htaccess or php.ini directives. You should understand that blank pages, 404 and 500 errors can usually be worked around by editing the aforementioned files. It is not our job to mess with your configuration files, because this could be dangerous for your site.'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'THINGS_05\':\t\'Post-restoration site load errors are usually caused by .htaccess or php.ini directives. You should understand that blank pages, 404 and 500 errors can usually be worked around by editing the aforementioned files. It is not our job to mess with your configuration files, because this could be dangerous for your site.\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'THINGS_06'
6	442	0	0.026280	2009872	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'THINGS_06'	'\\\'"'
6	442	1	0.026294	2009984
6	442	R			'THINGS_06'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'THINGS_06'
6	443	0	0.026318	2009912	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Kickstart overwrites files without a warning. If you are not sure that you are OK with that do not continue.'	'\\\'"'
6	443	1	0.026335	2010144
6	443	R			'Kickstart overwrites files without a warning. If you are not sure that you are OK with that do not continue.'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Kickstart overwrites files without a warning. If you are not sure that you are OK with that do not continue.'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'THINGS_06\':\t\'Kickstart overwrites files without a warning. If you are not sure that you are OK with that do not continue.\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'THINGS_07'
6	444	0	0.026404	2009872	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'THINGS_07'	'\\\'"'
6	444	1	0.026418	2009984
6	444	R			'THINGS_07'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'THINGS_07'
6	445	0	0.026442	2009912	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Trying to restore to the temporary URL of a cPanel host (e.g. http://1.2.3.4/~username) will lead to restoration failure and your site will appear to be not working. This is normal and it\'s just how your server and CMS software work.'	'\\\'"'
6	445	1	0.026463	2010304
6	445	R			'Trying to restore to the temporary URL of a cPanel host (e.g. http://1.2.3.4/~username) will lead to restoration failure and your site will appear to be not working. This is normal and it\\\'s just how your server and CMS software work.'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Trying to restore to the temporary URL of a cPanel host (e.g. http://1.2.3.4/~username) will lead to restoration failure and your site will appear to be not working. This is normal and it\\\'s just how your server and CMS software work.'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'THINGS_07\':\t\'Trying to restore to the temporary URL of a cPanel host (e.g. http://1.2.3.4/~username) will lead to restoration failure and your site will appear to be not working. This is normal and it\\\'s just how your server and CMS software work.\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'THINGS_08'
6	446	0	0.026545	2010384	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'THINGS_08'	'\\\'"'
6	446	1	0.026559	2010496
6	446	R			'THINGS_08'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'THINGS_08'
6	447	0	0.026583	2010424	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'You are supposed to read the documentation before using this software. Most issues can be avoided, or easily worked around, by understanding how this software works.'	'\\\'"'
6	447	1	0.026602	2010688
6	447	R			'You are supposed to read the documentation before using this software. Most issues can be avoided, or easily worked around, by understanding how this software works.'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'You are supposed to read the documentation before using this software. Most issues can be avoided, or easily worked around, by understanding how this software works.'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'THINGS_08\':\t\'You are supposed to read the documentation before using this software. Most issues can be avoided, or easily worked around, by understanding how this software works.\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'THINGS_09'
6	448	0	0.026679	2010384	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'THINGS_09'	'\\\'"'
6	448	1	0.026694	2010496
6	448	R			'THINGS_09'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'THINGS_09'
6	449	0	0.026717	2010424	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'This text does not imply that there is a problem detected. It is standard text displayed every time you launch Kickstart.'	'\\\'"'
6	449	1	0.026735	2010656
6	449	R			'This text does not imply that there is a problem detected. It is standard text displayed every time you launch Kickstart.'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'This text does not imply that there is a problem detected. It is standard text displayed every time you launch Kickstart.'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'THINGS_09\':\t\'This text does not imply that there is a problem detected. It is standard text displayed every time you launch Kickstart.\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'CLOSE_LIGHTBOX'
6	450	0	0.026807	2010384	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'CLOSE_LIGHTBOX'	'\\\'"'
6	450	1	0.026821	2010496
6	450	R			'CLOSE_LIGHTBOX'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'CLOSE_LIGHTBOX'
6	451	0	0.026846	2010424	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Click here or press ESC to close this message'	'\\\'"'
6	451	1	0.026860	2010576
6	451	R			'Click here or press ESC to close this message'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Click here or press ESC to close this message'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'CLOSE_LIGHTBOX\':\t\'Click here or press ESC to close this message\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'SELECT_ARCHIVE'
6	452	0	0.026923	2010384	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'SELECT_ARCHIVE'	'\\\'"'
6	452	1	0.026937	2010496
6	452	R			'SELECT_ARCHIVE'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'SELECT_ARCHIVE'
6	453	0	0.026961	2010424	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Select a backup archive'	'\\\'"'
6	453	1	0.026975	2010544
6	453	R			'Select a backup archive'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Select a backup archive'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'SELECT_ARCHIVE\':\t\'Select a backup archive\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'ARCHIVE_FILE'
6	454	0	0.027033	2010384	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'ARCHIVE_FILE'	'\\\'"'
6	454	1	0.027046	2010496
6	454	R			'ARCHIVE_FILE'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'ARCHIVE_FILE'
6	455	0	0.027070	2010424	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Archive file:'	'\\\'"'
6	455	1	0.027083	2010536
6	455	R			'Archive file:'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Archive file:'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'ARCHIVE_FILE\':\t\'Archive file:\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'SELECT_EXTRACTION'
6	456	0	0.027141	2011408	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'SELECT_EXTRACTION'	'\\\'"'
6	456	1	0.027155	2011528
6	456	R			'SELECT_EXTRACTION'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'SELECT_EXTRACTION'
6	457	0	0.027215	2011456	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Select an extraction method'	'\\\'"'
6	457	1	0.027234	2011584
6	457	R			'Select an extraction method'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Select an extraction method'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'SELECT_EXTRACTION\':\t\'Select an extraction method\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'WRITE_TO_FILES'
6	458	0	0.027294	2011408	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'WRITE_TO_FILES'	'\\\'"'
6	458	1	0.027308	2011520
6	458	R			'WRITE_TO_FILES'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'WRITE_TO_FILES'
6	459	0	0.027332	2011448	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Write to files:'	'\\\'"'
6	459	1	0.027346	2011560
6	459	R			'Write to files:'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Write to files:'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'WRITE_TO_FILES\':\t\'Write to files:\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'WRITE_HYBRID'
6	460	0	0.027403	2011408	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'WRITE_HYBRID'	'\\\'"'
6	460	1	0.027416	2011520
6	460	R			'WRITE_HYBRID'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'WRITE_HYBRID'
6	461	0	0.027441	2011448	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Hybrid (use FTP only if needed)'	'\\\'"'
6	461	1	0.027455	2011576
6	461	R			'Hybrid (use FTP only if needed)'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Hybrid (use FTP only if needed)'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'WRITE_HYBRID\':\t\'Hybrid (use FTP only if needed)\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'WRITE_DIRECTLY'
6	462	0	0.027515	2011408	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'WRITE_DIRECTLY'	'\\\'"'
6	462	1	0.027529	2011520
6	462	R			'WRITE_DIRECTLY'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'WRITE_DIRECTLY'
6	463	0	0.027554	2011448	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Directly'	'\\\'"'
6	463	1	0.027567	2011560
6	463	R			'Directly'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Directly'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'WRITE_DIRECTLY\':\t\'Directly\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'WRITE_FTP'
6	464	0	0.027622	2011408	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'WRITE_FTP'	'\\\'"'
6	464	1	0.027636	2011520
6	464	R			'WRITE_FTP'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'WRITE_FTP'
6	465	0	0.027659	2011448	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Use FTP for all files'	'\\\'"'
6	465	1	0.027673	2011568
6	465	R			'Use FTP for all files'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Use FTP for all files'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'WRITE_FTP\':\t\'Use FTP for all files\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'WRITE_SFTP'
6	466	0	0.027730	2011408	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'WRITE_SFTP'	'\\\'"'
6	466	1	0.027743	2011520
6	466	R			'WRITE_SFTP'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'WRITE_SFTP'
6	467	0	0.027767	2011448	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Use SFTP for all files'	'\\\'"'
6	467	1	0.027781	2011568
6	467	R			'Use SFTP for all files'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Use SFTP for all files'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'WRITE_SFTP\':\t\'Use SFTP for all files\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FTP_HOST'
6	468	0	0.027841	2011408	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FTP_HOST'	'\\\'"'
6	468	1	0.027854	2011520
6	468	R			'FTP_HOST'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FTP_HOST'
6	469	0	0.027878	2011448	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'(S)FTP host name:'	'\\\'"'
6	469	1	0.027892	2011568
6	469	R			'(S)FTP host name:'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = '(S)FTP host name:'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FTP_HOST\':\t\'(S)FTP host name:\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FTP_PORT'
6	470	0	0.027948	2011408	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FTP_PORT'	'\\\'"'
6	470	1	0.027961	2011520
6	470	R			'FTP_PORT'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FTP_PORT'
6	471	0	0.027984	2011448	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'(S)FTP port:'	'\\\'"'
6	471	1	0.027999	2011560
6	471	R			'(S)FTP port:'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = '(S)FTP port:'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FTP_PORT\':\t\'(S)FTP port:\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FTP_FTPS'
6	472	0	0.028053	2011408	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FTP_FTPS'	'\\\'"'
6	472	1	0.028067	2011520
6	472	R			'FTP_FTPS'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FTP_FTPS'
6	473	0	0.028090	2011448	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Use FTP over SSL (FTPS)'	'\\\'"'
6	473	1	0.028105	2011568
6	473	R			'Use FTP over SSL (FTPS)'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Use FTP over SSL (FTPS)'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FTP_FTPS\':\t\'Use FTP over SSL (FTPS)\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FTP_PASSIVE'
6	474	0	0.028162	2011408	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FTP_PASSIVE'	'\\\'"'
6	474	1	0.028176	2011520
6	474	R			'FTP_PASSIVE'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FTP_PASSIVE'
6	475	0	0.028200	2011448	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Use FTP Passive Mode'	'\\\'"'
6	475	1	0.028214	2011568
6	475	R			'Use FTP Passive Mode'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Use FTP Passive Mode'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FTP_PASSIVE\':\t\'Use FTP Passive Mode\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FTP_USER'
6	476	0	0.028277	2011408	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FTP_USER'	'\\\'"'
6	476	1	0.028291	2011520
6	476	R			'FTP_USER'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FTP_USER'
6	477	0	0.028314	2011448	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'(S)FTP user name:'	'\\\'"'
6	477	1	0.028328	2011568
6	477	R			'(S)FTP user name:'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = '(S)FTP user name:'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FTP_USER\':\t\'(S)FTP user name:\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FTP_PASS'
6	478	0	0.028384	2011408	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FTP_PASS'	'\\\'"'
6	478	1	0.028398	2011520
6	478	R			'FTP_PASS'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FTP_PASS'
6	479	0	0.028421	2011448	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'(S)FTP password:'	'\\\'"'
6	479	1	0.028435	2011568
6	479	R			'(S)FTP password:'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = '(S)FTP password:'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FTP_PASS\':\t\'(S)FTP password:\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FTP_DIR'
6	480	0	0.028495	2011408	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FTP_DIR'	'\\\'"'
6	480	1	0.028508	2011512
6	480	R			'FTP_DIR'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FTP_DIR'
6	481	0	0.028531	2011440	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'(S)FTP directory:'	'\\\'"'
6	481	1	0.028545	2011560
6	481	R			'(S)FTP directory:'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = '(S)FTP directory:'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FTP_DIR\':\t\'(S)FTP directory:\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FTP_TEMPDIR'
6	482	0	0.028601	2011408	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FTP_TEMPDIR'	'\\\'"'
6	482	1	0.028615	2011520
6	482	R			'FTP_TEMPDIR'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FTP_TEMPDIR'
6	483	0	0.028638	2011448	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Temporary directory:'	'\\\'"'
6	483	1	0.028652	2011568
6	483	R			'Temporary directory:'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Temporary directory:'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FTP_TEMPDIR\':\t\'Temporary directory:\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FTP_CONNECTION_OK'
6	484	0	0.028708	2011408	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FTP_CONNECTION_OK'	'\\\'"'
6	484	1	0.028722	2011528
6	484	R			'FTP_CONNECTION_OK'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FTP_CONNECTION_OK'
6	485	0	0.028746	2011456	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'FTP Connection Established'	'\\\'"'
6	485	1	0.028761	2011584
6	485	R			'FTP Connection Established'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'FTP Connection Established'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FTP_CONNECTION_OK\':\t\'FTP Connection Established\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'SFTP_CONNECTION_OK'
6	486	0	0.028820	2011408	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'SFTP_CONNECTION_OK'	'\\\'"'
6	486	1	0.028835	2011528
6	486	R			'SFTP_CONNECTION_OK'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'SFTP_CONNECTION_OK'
6	487	0	0.028859	2011456	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'SFTP Connection Established'	'\\\'"'
6	487	1	0.028874	2011584
6	487	R			'SFTP Connection Established'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'SFTP Connection Established'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'SFTP_CONNECTION_OK\':\t\'SFTP Connection Established\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FTP_CONNECTION_FAILURE'
6	488	0	0.028934	2011408	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FTP_CONNECTION_FAILURE'	'\\\'"'
6	488	1	0.028948	2011528
6	488	R			'FTP_CONNECTION_FAILURE'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FTP_CONNECTION_FAILURE'
6	489	0	0.028973	2011456	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'The FTP Connection Failed'	'\\\'"'
6	489	1	0.028988	2011584
6	489	R			'The FTP Connection Failed'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'The FTP Connection Failed'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FTP_CONNECTION_FAILURE\':\t\'The FTP Connection Failed\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'SFTP_CONNECTION_FAILURE'
6	490	0	0.029049	2011408	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'SFTP_CONNECTION_FAILURE'	'\\\'"'
6	490	1	0.029063	2011528
6	490	R			'SFTP_CONNECTION_FAILURE'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'SFTP_CONNECTION_FAILURE'
6	491	0	0.029089	2011456	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'The SFTP Connection Failed'	'\\\'"'
6	491	1	0.029103	2011584
6	491	R			'The SFTP Connection Failed'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'The SFTP Connection Failed'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'SFTP_CONNECTION_FAILURE\':\t\'The SFTP Connection Failed\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FTP_TEMPDIR_WRITABLE'
6	492	0	0.029162	2011408	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FTP_TEMPDIR_WRITABLE'	'\\\'"'
6	492	1	0.029177	2011528
6	492	R			'FTP_TEMPDIR_WRITABLE'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FTP_TEMPDIR_WRITABLE'
6	493	0	0.029202	2011456	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'The temporary directory is writable.'	'\\\'"'
6	493	1	0.029216	2011592
6	493	R			'The temporary directory is writable.'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'The temporary directory is writable.'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FTP_TEMPDIR_WRITABLE\':\t\'The temporary directory is writable.\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FTP_TEMPDIR_UNWRITABLE'
6	494	0	0.029278	2011408	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FTP_TEMPDIR_UNWRITABLE'	'\\\'"'
6	494	1	0.029292	2011528
6	494	R			'FTP_TEMPDIR_UNWRITABLE'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FTP_TEMPDIR_UNWRITABLE'
6	495	0	0.029317	2011456	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'The temporary directory is not writable. Please check the permissions.'	'\\\'"'
6	495	1	0.029333	2011624
6	495	R			'The temporary directory is not writable. Please check the permissions.'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'The temporary directory is not writable. Please check the permissions.'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FTP_TEMPDIR_UNWRITABLE\':\t\'The temporary directory is not writable. Please check the permissions.\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FTPBROWSER_ERROR_HOSTNAME'
6	496	0	0.029400	2011408	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FTPBROWSER_ERROR_HOSTNAME'	'\\\'"'
6	496	1	0.029416	2011536
6	496	R			'FTPBROWSER_ERROR_HOSTNAME'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FTPBROWSER_ERROR_HOSTNAME'
6	497	0	0.029441	2011464	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Invalid FTP host or port'	'\\\'"'
6	497	1	0.029455	2011592
6	497	R			'Invalid FTP host or port'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Invalid FTP host or port'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FTPBROWSER_ERROR_HOSTNAME\':\t\'Invalid FTP host or port\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FTPBROWSER_ERROR_USERPASS'
6	498	0	0.029516	2011408	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FTPBROWSER_ERROR_USERPASS'	'\\\'"'
6	498	1	0.029531	2011536
6	498	R			'FTPBROWSER_ERROR_USERPASS'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FTPBROWSER_ERROR_USERPASS'
6	499	0	0.029556	2011464	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Invalid FTP username or password'	'\\\'"'
6	499	1	0.029570	2011600
6	499	R			'Invalid FTP username or password'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Invalid FTP username or password'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FTPBROWSER_ERROR_USERPASS\':\t\'Invalid FTP username or password\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FTPBROWSER_ERROR_NOACCESS'
6	500	0	0.029636	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FTPBROWSER_ERROR_NOACCESS'	'\\\'"'
6	500	1	0.029651	2015632
6	500	R			'FTPBROWSER_ERROR_NOACCESS'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FTPBROWSER_ERROR_NOACCESS'
6	501	0	0.029676	2015560	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Directory doesn\'t exist or you don\'t have enough permissions to access it'	'\\\'"'
6	501	1	0.029692	2015744
6	501	R			'Directory doesn\\\'t exist or you don\\\'t have enough permissions to access it'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Directory doesn\\\'t exist or you don\\\'t have enough permissions to access it'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FTPBROWSER_ERROR_NOACCESS\':\t\'Directory doesn\\\'t exist or you don\\\'t have enough permissions to access it\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FTPBROWSER_ERROR_UNSUPPORTED'
6	502	0	0.029760	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FTPBROWSER_ERROR_UNSUPPORTED'	'\\\'"'
6	502	1	0.029775	2015632
6	502	R			'FTPBROWSER_ERROR_UNSUPPORTED'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FTPBROWSER_ERROR_UNSUPPORTED'
6	503	0	0.029800	2015560	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Sorry, your FTP server doesn\'t support our FTP directory browser.'	'\\\'"'
6	503	1	0.029816	2015728
6	503	R			'Sorry, your FTP server doesn\\\'t support our FTP directory browser.'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Sorry, your FTP server doesn\\\'t support our FTP directory browser.'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FTPBROWSER_ERROR_UNSUPPORTED\':\t\'Sorry, your FTP server doesn\\\'t support our FTP directory browser.\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FTPBROWSER_LBL_GOPARENT'
6	504	0	0.029883	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FTPBROWSER_LBL_GOPARENT'	'\\\'"'
6	504	1	0.029898	2015624
6	504	R			'FTPBROWSER_LBL_GOPARENT'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FTPBROWSER_LBL_GOPARENT'
6	505	0	0.029924	2015552	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'&lt;up one level&gt;'	'\\\'"'
6	505	1	0.029938	2015672
6	505	R			'&lt;up one level&gt;'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = '&lt;up one level&gt;'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FTPBROWSER_LBL_GOPARENT\':\t\'&lt;up one level&gt;\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FTPBROWSER_LBL_INSTRUCTIONS'
6	506	0	0.029997	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FTPBROWSER_LBL_INSTRUCTIONS'	'\\\'"'
6	506	1	0.030013	2015632
6	506	R			'FTPBROWSER_LBL_INSTRUCTIONS'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FTPBROWSER_LBL_INSTRUCTIONS'
6	507	0	0.030039	2015560	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Click on a directory to navigate into it. Click on OK to select that directory, Cancel to abort the procedure.'	'\\\'"'
6	507	1	0.030057	2015792
6	507	R			'Click on a directory to navigate into it. Click on OK to select that directory, Cancel to abort the procedure.'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Click on a directory to navigate into it. Click on OK to select that directory, Cancel to abort the procedure.'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FTPBROWSER_LBL_INSTRUCTIONS\':\t\'Click on a directory to navigate into it. Click on OK to select that directory, Cancel to abort the procedure.\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FTPBROWSER_LBL_ERROR'
6	508	0	0.030133	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FTPBROWSER_LBL_ERROR'	'\\\'"'
6	508	1	0.030148	2015624
6	508	R			'FTPBROWSER_LBL_ERROR'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FTPBROWSER_LBL_ERROR'
6	509	0	0.030173	2015552	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'An error occurred'	'\\\'"'
6	509	1	0.030187	2015672
6	509	R			'An error occurred'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'An error occurred'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FTPBROWSER_LBL_ERROR\':\t\'An error occurred\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'SFTP_NO_SSH2'
6	510	0	0.030245	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'SFTP_NO_SSH2'	'\\\'"'
6	510	1	0.030260	2015616
6	510	R			'SFTP_NO_SSH2'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'SFTP_NO_SSH2'
6	511	0	0.030285	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Your web server does not have the SSH2 PHP module, therefore can not connect to SFTP servers.'	'\\\'"'
6	511	1	0.030302	2015744
6	511	R			'Your web server does not have the SSH2 PHP module, therefore can not connect to SFTP servers.'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Your web server does not have the SSH2 PHP module, therefore can not connect to SFTP servers.'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'SFTP_NO_SSH2\':\t\'Your web server does not have the SSH2 PHP module, therefore can not connect to SFTP servers.\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'SFTP_NO_FTP_SUPPORT'
6	512	0	0.030372	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'SFTP_NO_FTP_SUPPORT'	'\\\'"'
6	512	1	0.030387	2015624
6	512	R			'SFTP_NO_FTP_SUPPORT'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'SFTP_NO_FTP_SUPPORT'
6	513	0	0.030412	2015552	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Your SSH server does not allow SFTP connections'	'\\\'"'
6	513	1	0.030427	2015704
6	513	R			'Your SSH server does not allow SFTP connections'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Your SSH server does not allow SFTP connections'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'SFTP_NO_FTP_SUPPORT\':\t\'Your SSH server does not allow SFTP connections\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'SFTP_WRONG_USER'
6	514	0	0.030655	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'SFTP_WRONG_USER'	'\\\'"'
6	514	1	0.030676	2015616
6	514	R			'SFTP_WRONG_USER'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'SFTP_WRONG_USER'
6	515	0	0.030702	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Wrong SFTP username or password'	'\\\'"'
6	515	1	0.030717	2015672
6	515	R			'Wrong SFTP username or password'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Wrong SFTP username or password'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'SFTP_WRONG_USER\':\t\'Wrong SFTP username or password\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'SFTP_WRONG_STARTING_DIR'
6	516	0	0.030780	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'SFTP_WRONG_STARTING_DIR'	'\\\'"'
6	516	1	0.030795	2015624
6	516	R			'SFTP_WRONG_STARTING_DIR'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'SFTP_WRONG_STARTING_DIR'
6	517	0	0.030821	2015552	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'You must supply a valid absolute path'	'\\\'"'
6	517	1	0.030835	2015688
6	517	R			'You must supply a valid absolute path'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'You must supply a valid absolute path'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'SFTP_WRONG_STARTING_DIR\':\t\'You must supply a valid absolute path\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'SFTPBROWSER_ERROR_NOACCESS'
6	518	0	0.030909	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'SFTPBROWSER_ERROR_NOACCESS'	'\\\'"'
6	518	1	0.030924	2015632
6	518	R			'SFTPBROWSER_ERROR_NOACCESS'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'SFTPBROWSER_ERROR_NOACCESS'
6	519	0	0.030950	2015560	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Directory doesn\'t exist or you don\'t have enough permissions to access it'	'\\\'"'
6	519	1	0.030967	2015744
6	519	R			'Directory doesn\\\'t exist or you don\\\'t have enough permissions to access it'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Directory doesn\\\'t exist or you don\\\'t have enough permissions to access it'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'SFTPBROWSER_ERROR_NOACCESS\':\t\'Directory doesn\\\'t exist or you don\\\'t have enough permissions to access it\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'SFTP_COULDNT_UPLOAD'
6	520	0	0.031035	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'SFTP_COULDNT_UPLOAD'	'\\\'"'
6	520	1	0.031049	2015624
6	520	R			'SFTP_COULDNT_UPLOAD'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'SFTP_COULDNT_UPLOAD'
6	521	0	0.031074	2015552	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Could not upload %s'	'\\\'"'
6	521	1	0.031088	2015672
6	521	R			'Could not upload %s'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Could not upload %s'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'SFTP_COULDNT_UPLOAD\':\t\'Could not upload %s\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'SFTP_CANT_CREATE_DIR'
6	522	0	0.031148	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'SFTP_CANT_CREATE_DIR'	'\\\'"'
6	522	1	0.031163	2015624
6	522	R			'SFTP_CANT_CREATE_DIR'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'SFTP_CANT_CREATE_DIR'
6	523	0	0.031206	2015552	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Could not create directory %s'	'\\\'"'
6	523	1	0.031223	2015680
6	523	R			'Could not create directory %s'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Could not create directory %s'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'SFTP_CANT_CREATE_DIR\':\t\'Could not create directory %s\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'UI-ROOT'
6	524	0	0.031283	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'UI-ROOT'	'\\\'"'
6	524	1	0.031297	2015608
6	524	R			'UI-ROOT'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'UI-ROOT'
6	525	0	0.031321	2015536	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'&lt;root&gt;'	'\\\'"'
6	525	1	0.031335	2015648
6	525	R			'&lt;root&gt;'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = '&lt;root&gt;'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'UI-ROOT\':\t\'&lt;root&gt;\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'CONFIG_UI_FTPBROWSER_TITLE'
6	526	0	0.031391	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'CONFIG_UI_FTPBROWSER_TITLE'	'\\\'"'
6	526	1	0.031407	2015632
6	526	R			'CONFIG_UI_FTPBROWSER_TITLE'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'CONFIG_UI_FTPBROWSER_TITLE'
6	527	0	0.031433	2015560	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'FTP Directory Browser'	'\\\'"'
6	527	1	0.031447	2015680
6	527	R			'FTP Directory Browser'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'FTP Directory Browser'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'CONFIG_UI_FTPBROWSER_TITLE\':\t\'FTP Directory Browser\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FTP_BROWSE'
6	528	0	0.031511	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FTP_BROWSE'	'\\\'"'
6	528	1	0.031525	2015616
6	528	R			'FTP_BROWSE'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FTP_BROWSE'
6	529	0	0.031550	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Browse'	'\\\'"'
6	529	1	0.031563	2015648
6	529	R			'Browse'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Browse'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FTP_BROWSE\':\t\'Browse\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'BTN_CHECK'
6	530	0	0.031617	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'BTN_CHECK'	'\\\'"'
6	530	1	0.031631	2015616
6	530	R			'BTN_CHECK'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'BTN_CHECK'
6	531	0	0.031655	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Check'	'\\\'"'
6	531	1	0.031668	2015648
6	531	R			'Check'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Check'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'BTN_CHECK\':\t\'Check\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'BTN_RESET'
6	532	0	0.031722	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'BTN_RESET'	'\\\'"'
6	532	1	0.031736	2015616
6	532	R			'BTN_RESET'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'BTN_RESET'
6	533	0	0.031759	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Reset'	'\\\'"'
6	533	1	0.031772	2015648
6	533	R			'Reset'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Reset'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'BTN_RESET\':\t\'Reset\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'BTN_TESTFTPCON'
6	534	0	0.031826	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'BTN_TESTFTPCON'	'\\\'"'
6	534	1	0.031840	2015616
6	534	R			'BTN_TESTFTPCON'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'BTN_TESTFTPCON'
6	535	0	0.031865	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Test FTP connection'	'\\\'"'
6	535	1	0.031879	2015664
6	535	R			'Test FTP connection'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Test FTP connection'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'BTN_TESTFTPCON\':\t\'Test FTP connection\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'BTN_TESTSFTPCON'
6	536	0	0.031936	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'BTN_TESTSFTPCON'	'\\\'"'
6	536	1	0.031950	2015616
6	536	R			'BTN_TESTSFTPCON'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'BTN_TESTSFTPCON'
6	537	0	0.031974	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Test SFTP connection'	'\\\'"'
6	537	1	0.031988	2015664
6	537	R			'Test SFTP connection'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Test SFTP connection'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'BTN_TESTSFTPCON\':\t\'Test SFTP connection\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'BTN_GOTOSTART'
6	538	0	0.032047	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'BTN_GOTOSTART'	'\\\'"'
6	538	1	0.032062	2015616
6	538	R			'BTN_GOTOSTART'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'BTN_GOTOSTART'
6	539	0	0.032092	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Start over'	'\\\'"'
6	539	1	0.032106	2015656
6	539	R			'Start over'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Start over'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'BTN_GOTOSTART\':\t\'Start over\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'FINE_TUNE'
6	540	0	0.032162	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'FINE_TUNE'	'\\\'"'
6	540	1	0.032175	2015616
6	540	R			'FINE_TUNE'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'FINE_TUNE'
6	541	0	0.032198	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Fine tune'	'\\\'"'
6	541	1	0.032212	2015656
6	541	R			'Fine tune'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Fine tune'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'FINE_TUNE\':\t\'Fine tune\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'MIN_EXEC_TIME'
6	542	0	0.032276	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'MIN_EXEC_TIME'	'\\\'"'
6	542	1	0.032291	2015616
6	542	R			'MIN_EXEC_TIME'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'MIN_EXEC_TIME'
6	543	0	0.032315	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Minimum execution time:'	'\\\'"'
6	543	1	0.032329	2015664
6	543	R			'Minimum execution time:'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Minimum execution time:'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'MIN_EXEC_TIME\':\t\'Minimum execution time:\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'MAX_EXEC_TIME'
6	544	0	0.032387	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'MAX_EXEC_TIME'	'\\\'"'
6	544	1	0.032401	2015616
6	544	R			'MAX_EXEC_TIME'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'MAX_EXEC_TIME'
6	545	0	0.032424	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Maximum execution time:'	'\\\'"'
6	545	1	0.032438	2015664
6	545	R			'Maximum execution time:'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Maximum execution time:'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'MAX_EXEC_TIME\':\t\'Maximum execution time:\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'SECONDS_PER_STEP'
6	546	0	0.032496	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'SECONDS_PER_STEP'	'\\\'"'
6	546	1	0.032510	2015624
6	546	R			'SECONDS_PER_STEP'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'SECONDS_PER_STEP'
6	547	0	0.032534	2015552	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'seconds per step'	'\\\'"'
6	547	1	0.032548	2015672
6	547	R			'seconds per step'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'seconds per step'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'SECONDS_PER_STEP\':\t\'seconds per step\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'EXTRACT_FILES'
6	548	0	0.032604	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'EXTRACT_FILES'	'\\\'"'
6	548	1	0.032618	2015616
6	548	R			'EXTRACT_FILES'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'EXTRACT_FILES'
6	549	0	0.032642	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Extract files'	'\\\'"'
6	549	1	0.032656	2015656
6	549	R			'Extract files'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Extract files'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'EXTRACT_FILES\':\t\'Extract files\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'BTN_START'
6	550	0	0.032715	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'BTN_START'	'\\\'"'
6	550	1	0.032729	2015616
6	550	R			'BTN_START'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'BTN_START'
6	551	0	0.032752	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Start'	'\\\'"'
6	551	1	0.032765	2015648
6	551	R			'Start'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Start'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'BTN_START\':\t\'Start\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'EXTRACTING'
6	552	0	0.032820	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'EXTRACTING'	'\\\'"'
6	552	1	0.032833	2015616
6	552	R			'EXTRACTING'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'EXTRACTING'
6	553	0	0.032857	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Extracting'	'\\\'"'
6	553	1	0.032870	2015656
6	553	R			'Extracting'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Extracting'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'EXTRACTING\':\t\'Extracting\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'DO_NOT_CLOSE_EXTRACT'
6	554	0	0.032927	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'DO_NOT_CLOSE_EXTRACT'	'\\\'"'
6	554	1	0.032942	2015624
6	554	R			'DO_NOT_CLOSE_EXTRACT'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'DO_NOT_CLOSE_EXTRACT'
6	555	0	0.032967	2015552	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Do not close this window while the extraction is in progress'	'\\\'"'
6	555	1	0.032982	2015720
6	555	R			'Do not close this window while the extraction is in progress'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Do not close this window while the extraction is in progress'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'DO_NOT_CLOSE_EXTRACT\':\t\'Do not close this window while the extraction is in progress\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'RESTACLEANUP'
6	556	0	0.033046	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'RESTACLEANUP'	'\\\'"'
6	556	1	0.033061	2015616
6	556	R			'RESTACLEANUP'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'RESTACLEANUP'
6	557	0	0.033085	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Restoration and Clean Up'	'\\\'"'
6	557	1	0.033099	2015672
6	557	R			'Restoration and Clean Up'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Restoration and Clean Up'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'RESTACLEANUP\':\t\'Restoration and Clean Up\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'BTN_RUNINSTALLER'
6	558	0	0.033156	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'BTN_RUNINSTALLER'	'\\\'"'
6	558	1	0.033171	2015624
6	558	R			'BTN_RUNINSTALLER'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'BTN_RUNINSTALLER'
6	559	0	0.033196	2015552	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Run the Installer'	'\\\'"'
6	559	1	0.033210	2015672
6	559	R			'Run the Installer'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Run the Installer'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'BTN_RUNINSTALLER\':\t\'Run the Installer\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'BTN_CLEANUP'
6	560	0	0.033266	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'BTN_CLEANUP'	'\\\'"'
6	560	1	0.033279	2015616
6	560	R			'BTN_CLEANUP'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'BTN_CLEANUP'
6	561	0	0.033307	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Clean Up'	'\\\'"'
6	561	1	0.033322	2015656
6	561	R			'Clean Up'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Clean Up'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'BTN_CLEANUP\':\t\'Clean Up\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'BTN_SITEFE'
6	562	0	0.033377	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'BTN_SITEFE'	'\\\'"'
6	562	1	0.033391	2015616
6	562	R			'BTN_SITEFE'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'BTN_SITEFE'
6	563	0	0.033414	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Visit your site\'s front-end'	'\\\'"'
6	563	1	0.033429	2015672
6	563	R			'Visit your site\\\'s front-end'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Visit your site\\\'s front-end'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'BTN_SITEFE\':\t\'Visit your site\\\'s front-end\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'BTN_SITEBE'
6	564	0	0.033486	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'BTN_SITEBE'	'\\\'"'
6	564	1	0.033501	2015616
6	564	R			'BTN_SITEBE'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'BTN_SITEBE'
6	565	0	0.033524	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Visit your site\'s back-end'	'\\\'"'
6	565	1	0.033538	2015672
6	565	R			'Visit your site\\\'s back-end'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Visit your site\\\'s back-end'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'BTN_SITEBE\':\t\'Visit your site\\\'s back-end\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'WARNINGS'
6	566	0	0.033597	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'WARNINGS'	'\\\'"'
6	566	1	0.033610	2015616
6	566	R			'WARNINGS'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'WARNINGS'
6	567	0	0.033632	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Extraction Warnings'	'\\\'"'
6	567	1	0.033646	2015664
6	567	R			'Extraction Warnings'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Extraction Warnings'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'WARNINGS\':\t\'Extraction Warnings\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'ERROR_OCCURED'
6	568	0	0.033702	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'ERROR_OCCURED'	'\\\'"'
6	568	1	0.033717	2015616
6	568	R			'ERROR_OCCURED'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'ERROR_OCCURED'
6	569	0	0.033741	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'An error occured'	'\\\'"'
6	569	1	0.033755	2015664
6	569	R			'An error occured'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'An error occured'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'ERROR_OCCURED\':\t\'An error occured\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'STEALTH_MODE'
6	570	0	0.033810	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'STEALTH_MODE'	'\\\'"'
6	570	1	0.033824	2015616
6	570	R			'STEALTH_MODE'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'STEALTH_MODE'
6	571	0	0.033848	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Stealth mode'	'\\\'"'
6	571	1	0.033861	2015656
6	571	R			'Stealth mode'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Stealth mode'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'STEALTH_MODE\':\t\'Stealth mode\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'STEALTH_URL'
6	572	0	0.033919	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'STEALTH_URL'	'\\\'"'
6	572	1	0.033932	2015616
6	572	R			'STEALTH_URL'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'STEALTH_URL'
6	573	0	0.033956	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'HTML file to show to web visitors'	'\\\'"'
6	573	1	0.033971	2015680
6	573	R			'HTML file to show to web visitors'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'HTML file to show to web visitors'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'STEALTH_URL\':\t\'HTML file to show to web visitors\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'ERR_NOT_A_JPS_FILE'
6	574	0	0.034649	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'ERR_NOT_A_JPS_FILE'	'\\\'"'
6	574	1	0.034667	2015624
6	574	R			'ERR_NOT_A_JPS_FILE'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'ERR_NOT_A_JPS_FILE'
6	575	0	0.034693	2015552	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'The file is not a JPA archive'	'\\\'"'
6	575	1	0.034707	2015680
6	575	R			'The file is not a JPA archive'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'The file is not a JPA archive'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'ERR_NOT_A_JPS_FILE\':\t\'The file is not a JPA archive\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'ERR_INVALID_JPS_PASSWORD'
6	576	0	0.034768	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'ERR_INVALID_JPS_PASSWORD'	'\\\'"'
6	576	1	0.034783	2015632
6	576	R			'ERR_INVALID_JPS_PASSWORD'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'ERR_INVALID_JPS_PASSWORD'
6	577	0	0.034808	2015560	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'The password you gave is wrong or the archive is corrupt'	'\\\'"'
6	577	1	0.034824	2015728
6	577	R			'The password you gave is wrong or the archive is corrupt'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'The password you gave is wrong or the archive is corrupt'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'ERR_INVALID_JPS_PASSWORD\':\t\'The password you gave is wrong or the archive is corrupt\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'JPS_PASSWORD'
6	578	0	0.034889	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'JPS_PASSWORD'	'\\\'"'
6	578	1	0.034902	2015616
6	578	R			'JPS_PASSWORD'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'JPS_PASSWORD'
6	579	0	0.034927	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Archive Password (for JPS files)'	'\\\'"'
6	579	1	0.034941	2015680
6	579	R			'Archive Password (for JPS files)'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Archive Password (for JPS files)'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'JPS_PASSWORD\':\t\'Archive Password (for JPS files)\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'INVALID_FILE_HEADER'
6	580	0	0.035002	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'INVALID_FILE_HEADER'	'\\\'"'
6	580	1	0.035016	2015624
6	580	R			'INVALID_FILE_HEADER'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'INVALID_FILE_HEADER'
6	581	0	0.035040	2015552	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Invalid header in archive file, part %s, offset %s'	'\\\'"'
6	581	1	0.035056	2015704
6	581	R			'Invalid header in archive file, part %s, offset %s'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Invalid header in archive file, part %s, offset %s'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'INVALID_FILE_HEADER\':\t\'Invalid header in archive file, part %s, offset %s\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'NEEDSOMEHELPKS'
6	582	0	0.035131	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'NEEDSOMEHELPKS'	'\\\'"'
6	582	1	0.035146	2015616
6	582	R			'NEEDSOMEHELPKS'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'NEEDSOMEHELPKS'
6	583	0	0.035217	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Want some help to use this tool? Read this first:'	'\\\'"'
6	583	1	0.035233	2015696
6	583	R			'Want some help to use this tool? Read this first:'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Want some help to use this tool? Read this first:'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'NEEDSOMEHELPKS\':\t\'Want some help to use this tool? Read this first:\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'QUICKSTART'
6	584	0	0.035298	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'QUICKSTART'	'\\\'"'
6	584	1	0.035311	2015616
6	584	R			'QUICKSTART'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'QUICKSTART'
6	585	0	0.035335	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Quick Start Guide'	'\\\'"'
6	585	1	0.035349	2015664
6	585	R			'Quick Start Guide'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Quick Start Guide'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'QUICKSTART\':\t\'Quick Start Guide\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'CANTGETITTOWORK'
6	586	0	0.035407	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'CANTGETITTOWORK'	'\\\'"'
6	586	1	0.035420	2015616
6	586	R			'CANTGETITTOWORK'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'CANTGETITTOWORK'
6	587	0	0.035444	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Can\'t get it to work? Click me!'	'\\\'"'
6	587	1	0.035459	2015680
6	587	R			'Can\\\'t get it to work? Click me!'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Can\\\'t get it to work? Click me!'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'CANTGETITTOWORK\':\t\'Can\\\'t get it to work? Click me!\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'NOARCHIVESCLICKHERE'
6	588	0	0.035519	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'NOARCHIVESCLICKHERE'	'\\\'"'
6	588	1	0.035533	2015624
6	588	R			'NOARCHIVESCLICKHERE'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'NOARCHIVESCLICKHERE'
6	589	0	0.035558	2015552	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'No archives detected. Click here for troubleshooting instructions.'	'\\\'"'
6	589	1	0.035573	2015720
6	589	R			'No archives detected. Click here for troubleshooting instructions.'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'No archives detected. Click here for troubleshooting instructions.'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'NOARCHIVESCLICKHERE\':\t\'No archives detected. Click here for troubleshooting instructions.\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'POSTRESTORATIONTROUBLESHOOTING'
6	590	0	0.035639	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'POSTRESTORATIONTROUBLESHOOTING'	'\\\'"'
6	590	1	0.035654	2015632
6	590	R			'POSTRESTORATIONTROUBLESHOOTING'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'POSTRESTORATIONTROUBLESHOOTING'
6	591	0	0.035680	2015560	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Something not working after the restoration? Click here for troubleshooting instructions.'	'\\\'"'
6	591	1	0.035696	2015760
6	591	R			'Something not working after the restoration? Click here for troubleshooting instructions.'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Something not working after the restoration? Click here for troubleshooting instructions.'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'POSTRESTORATIONTROUBLESHOOTING\':\t\'Something not working after the restoration? Click here for troubleshooting instructions.\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'UPDATE_HEADER'
6	592	0	0.035770	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'UPDATE_HEADER'	'\\\'"'
6	592	1	0.035783	2015616
6	592	R			'UPDATE_HEADER'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'UPDATE_HEADER'
6	593	0	0.035807	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'An updated version of Akeeba Kickstart (<span id="update-version">unknown</span>) is available!'	'\\\'"'
6	593	1	0.035825	2015744
6	593	R			'An updated version of Akeeba Kickstart (<span id=\\"update-version\\">unknown</span>) is available!'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'An updated version of Akeeba Kickstart (<span id=\\"update-version\\">unknown</span>) is available!'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'UPDATE_HEADER\':\t\'An updated version of Akeeba Kickstart (<span id=\\"update-version\\">unknown</span>) is available!\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'UPDATE_NOTICE'
6	594	0	0.035896	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'UPDATE_NOTICE'	'\\\'"'
6	594	1	0.035909	2015616
6	594	R			'UPDATE_NOTICE'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'UPDATE_NOTICE'
6	595	0	0.035933	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'You are advised to always use the latest version of Akeeba Kickstart available. Older versions may be subject to bugs and will not be supported.'	'\\\'"'
6	595	1	0.035951	2015808
6	595	R			'You are advised to always use the latest version of Akeeba Kickstart available. Older versions may be subject to bugs and will not be supported.'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'You are advised to always use the latest version of Akeeba Kickstart available. Older versions may be subject to bugs and will not be supported.'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'UPDATE_NOTICE\':\t\'You are advised to always use the latest version of Akeeba Kickstart available. Older versions may be subject to bugs and will not be supported.\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'UPDATE_DLNOW'
6	596	0	0.036024	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'UPDATE_DLNOW'	'\\\'"'
6	596	1	0.036038	2015616
6	596	R			'UPDATE_DLNOW'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'UPDATE_DLNOW'
6	597	0	0.036062	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Download now'	'\\\'"'
6	597	1	0.036076	2015656
6	597	R			'Download now'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Download now'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'UPDATE_DLNOW\':\t\'Download now\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'UPDATE_MOREINFO'
6	598	0	0.036132	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'UPDATE_MOREINFO'	'\\\'"'
6	598	1	0.036146	2015616
6	598	R			'UPDATE_MOREINFO'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'UPDATE_MOREINFO'
6	599	0	0.036171	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'More information'	'\\\'"'
6	599	1	0.036185	2015664
6	599	R			'More information'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'More information'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'UPDATE_MOREINFO\':\t\'More information\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'IGNORE_MOST_ERRORS'
6	600	0	0.036247	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'IGNORE_MOST_ERRORS'	'\\\'"'
6	600	1	0.036266	2015624
6	600	R			'IGNORE_MOST_ERRORS'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'IGNORE_MOST_ERRORS'
6	601	0	0.036290	2015552	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Ignore most errors'	'\\\'"'
6	601	1	0.036304	2015672
6	601	R			'Ignore most errors'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Ignore most errors'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'IGNORE_MOST_ERRORS\':\t\'Ignore most errors\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'WRONG_FTP_PATH2'
6	602	0	0.036361	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'WRONG_FTP_PATH2'	'\\\'"'
6	602	1	0.036376	2015616
6	602	R			'WRONG_FTP_PATH2'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'WRONG_FTP_PATH2'
6	603	0	0.036400	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Wrong FTP initial directory - the directory doesn\'t correspond to your site\'s web root'	'\\\'"'
6	603	1	0.036415	2015744
6	603	R			'Wrong FTP initial directory - the directory doesn\\\'t correspond to your site\\\'s web root'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Wrong FTP initial directory - the directory doesn\\\'t correspond to your site\\\'s web root'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'WRONG_FTP_PATH2\':\t\'Wrong FTP initial directory - the directory doesn\\\'t correspond to your site\\\'s web root\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'ARCHIVE_DIRECTORY'
6	604	0	0.036485	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'ARCHIVE_DIRECTORY'	'\\\'"'
6	604	1	0.036499	2015624
6	604	R			'ARCHIVE_DIRECTORY'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'ARCHIVE_DIRECTORY'
6	605	0	0.036523	2015552	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Archive directory:'	'\\\'"'
6	605	1	0.036537	2015672
6	605	R			'Archive directory:'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Archive directory:'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'ARCHIVE_DIRECTORY\':\t\'Archive directory:\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'RELOAD_ARCHIVES'
6	606	0	0.036594	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'RELOAD_ARCHIVES'	'\\\'"'
6	606	1	0.036607	2015616
6	606	R			'RELOAD_ARCHIVES'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'RELOAD_ARCHIVES'
6	607	0	0.036631	2015544	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Reload'	'\\\'"'
6	607	1	0.036644	2015648
6	607	R			'Reload'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Reload'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'RELOAD_ARCHIVES\':\t\'Reload\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'CONFIG_UI_SFTPBROWSER_TITLE'
6	608	0	0.036701	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'CONFIG_UI_SFTPBROWSER_TITLE'	'\\\'"'
6	608	1	0.036717	2015632
6	608	R			'CONFIG_UI_SFTPBROWSER_TITLE'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'CONFIG_UI_SFTPBROWSER_TITLE'
6	609	0	0.036743	2015560	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'SFTP Directory Browser'	'\\\'"'
6	609	1	0.036757	2015680
6	609	R			'SFTP Directory Browser'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'SFTP Directory Browser'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'CONFIG_UI_SFTPBROWSER_TITLE\':\t\'SFTP Directory Browser\''
5		A						/var/www/html/uploads/ikstart.php	6438	$key = 'ERR_COULD_NOT_OPEN_ARCHIVE_PART'
6	610	0	0.036817	2015504	addcslashes	0		/var/www/html/uploads/ikstart.php	6440	2	'ERR_COULD_NOT_OPEN_ARCHIVE_PART'	'\\\'"'
6	610	1	0.036834	2015632
6	610	R			'ERR_COULD_NOT_OPEN_ARCHIVE_PART'
5		A						/var/www/html/uploads/ikstart.php	6440	$key = 'ERR_COULD_NOT_OPEN_ARCHIVE_PART'
6	611	0	0.036861	2015560	addcslashes	0		/var/www/html/uploads/ikstart.php	6441	2	'Could not open archive part file %s for reading. Check that the file exists, is readable by the web server and is not in a directory made out of reach by chroot, open_basedir restrictions or any other restriction put in place by your host.'	'\\\'"'
6	611	1	0.036881	2015952
6	611	R			'Could not open archive part file %s for reading. Check that the file exists, is readable by the web server and is not in a directory made out of reach by chroot, open_basedir restrictions or any other restriction put in place by your host.'
5		A						/var/www/html/uploads/ikstart.php	6441	$value = 'Could not open archive part file %s for reading. Check that the file exists, is readable by the web server and is not in a directory made out of reach by chroot, open_basedir restrictions or any other restriction put in place by your host.'
5		A						/var/www/html/uploads/ikstart.php	6442	$out .= ',\n'
5		A						/var/www/html/uploads/ikstart.php	6443	$out .= '\'ERR_COULD_NOT_OPEN_ARCHIVE_PART\':\t\'Could not open archive part file %s for reading. Check that the file exists, is readable by the web server and is not in a directory made out of reach by chroot, open_basedir restrictions or any other restriction put in place by your host.\''
5	383	1	0.036951	2015504
5	383	R			'\'AKURL_IMPORT\':\t\'Import from URL\',\n\'AKURL_TITLE_STEP1\':\t\'Specify the URL\',\n\'AKURL_FILENAME\':\t\'URL to import\',\n\'AKURL_JOOMLA\':\t\'Latest Joomla! release\',\n\'AKURL_WORDPRESS\':\t\'Latest WordPress release\',\n\'AKURL_CANCEL\':\t\'Cancel import\',\n\'AKURL_TITLE_STEP2\':\t\'Importing...\',\n\'AKURL_DO_NOT_CLOSE\':\t\'Please do not close this window while your backup archives are being imported\',\n\'AKURL_TITLE_STEP3\':\t\'Import is complete\',\n\'AKURL_BTN_RELOAD\':\t\'Reload Kickstart\''
4	314	1	0.037276	2007312
4	612	0	0.037288	2007312	basename	0		/var/www/html/uploads/ikstart.php	9115	1	'/var/www/html/uploads/ikstart.php'
4	612	1	0.037305	2007384
4	612	R			'ikstart.php'
4	613	0	0.037778	2007312	AKKickstartUtils::getPath	1		/var/www/html/uploads/ikstart.php	9976	0
4		A						/var/www/html/uploads/ikstart.php	7814	$path = '/var/www/html/uploads'
5	614	0	0.037805	2007312	str_replace	0		/var/www/html/uploads/ikstart.php	7815	3	'\\'	'/'	'/var/www/html/uploads'
5	614	1	0.037822	2007408
5	614	R			'/var/www/html/uploads'
5	615	0	0.037837	2007312	rtrim	0		/var/www/html/uploads/ikstart.php	7815	2	'/var/www/html/uploads'	'/'
5	615	1	0.037850	2007384
5	615	R			'/var/www/html/uploads'
4		A						/var/www/html/uploads/ikstart.php	7815	$path = '/var/www/html/uploads'
4		A						/var/www/html/uploads/ikstart.php	7818	$path .= '/'
4	613	1	0.037885	2007360
4	613	R			'/var/www/html/uploads/'
4	616	0	0.037900	2007360	addcslashes	0		/var/www/html/uploads/ikstart.php	9976	2	'/var/www/html/uploads/'	'\\\'"'
4	616	1	0.037914	2007480
4	616	R			'/var/www/html/uploads/'
4	617	0	0.037932	2007312	callExtraFeature	1		/var/www/html/uploads/ikstart.php	10147	2	'onExtraHeadJavascript'	???
4		A						/var/www/html/uploads/ikstart.php	8015	$result = NULL
5	618	0	0.037959	2007312	method_exists	0		/var/www/html/uploads/ikstart.php	8017	2	class AKFeatureURLImport { private $params = [] }	'onExtraHeadJavascript'
5	618	1	0.037979	2007376
5	618	R			TRUE
5	619	0	0.037994	2007312	AKFeatureURLImport->onExtraHeadJavascript	1		/var/www/html/uploads/ikstart.php	8020	1	[]
5	619	1	0.038012	2007312
5	619	R			NULL
4		A						/var/www/html/uploads/ikstart.php	8020	$result = NULL
4	617	1	0.038035	2007312
3	310	1	0.038042	2007312
3	620	0	0.038400	2007312	callExtraFeature	1		/var/www/html/uploads/ikstart.php	10259	2	'onPage1'	???
3		A						/var/www/html/uploads/ikstart.php	8015	$result = NULL
4	621	0	0.038427	2007312	method_exists	0		/var/www/html/uploads/ikstart.php	8017	2	class AKFeatureURLImport { private $params = [] }	'onPage1'
4	621	1	0.038445	2007376
4	621	R			TRUE
4	622	0	0.038459	2007312	AKFeatureURLImport->onPage1	1		/var/www/html/uploads/ikstart.php	8020	1	[]
4	622	1	0.038474	2007312
4	622	R			NULL
3		A						/var/www/html/uploads/ikstart.php	8020	$result = NULL
3	620	1	0.038497	2007312
3	623	0	0.038505	2007312	callExtraFeature	1		/var/www/html/uploads/ikstart.php	10271	2	'onPage1Step1'	???
3		A						/var/www/html/uploads/ikstart.php	8015	$result = NULL
4	624	0	0.038529	2007312	method_exists	0		/var/www/html/uploads/ikstart.php	8017	2	class AKFeatureURLImport { private $params = [] }	'onPage1Step1'
4	624	1	0.038552	2007376
4	624	R			TRUE
4	625	0	0.038566	2007312	AKFeatureURLImport->onPage1Step1	1		/var/www/html/uploads/ikstart.php	8020	1	[]
4	625	1	0.038580	2007312
4	625	R			NULL
3		A						/var/www/html/uploads/ikstart.php	8020	$result = NULL
3	623	1	0.038603	2007312
3	626	0	0.038611	2007312	htmlentities	0		/var/www/html/uploads/ikstart.php	10276	1	'/var/www/html/uploads/'
3	626	1	0.038626	2007504
3	626	R			'/var/www/html/uploads/'
3	627	0	0.038644	2007312	AKKickstartUtils::getPath	1		/var/www/html/uploads/ikstart.php	10339	0
3		A						/var/www/html/uploads/ikstart.php	7814	$path = '/var/www/html/uploads'
4	628	0	0.038669	2007312	str_replace	0		/var/www/html/uploads/ikstart.php	7815	3	'\\'	'/'	'/var/www/html/uploads'
4	628	1	0.038684	2007408
4	628	R			'/var/www/html/uploads'
4	629	0	0.038698	2007312	rtrim	0		/var/www/html/uploads/ikstart.php	7815	2	'/var/www/html/uploads'	'/'
4	629	1	0.038712	2007384
4	629	R			'/var/www/html/uploads'
3		A						/var/www/html/uploads/ikstart.php	7815	$path = '/var/www/html/uploads'
3		A						/var/www/html/uploads/ikstart.php	7818	$path .= '/'
3	627	1	0.038745	2007360
3	627	R			'/var/www/html/uploads/'
3	630	0	0.038759	2007360	htmlentities	0		/var/www/html/uploads/ikstart.php	10339	1	'/var/www/html/uploads/'
3	630	1	0.038773	2007552
3	630	R			'/var/www/html/uploads/'
2	190	1	0.038955	2007264
1	3	1	0.038968	2007264
			0.039030	1741504
TRACE END   [2023-02-13 01:16:06.571617]


Generated HTML code

<html><head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>Akeeba Kickstart Core 4.1.1</title>
	<style type="text/css" media="all" rel="stylesheet">
		html {
    background: #e9e9e9;
    font-size: 62.5%;
}
body {
	font-size: 14px;
    font-size: 1.4rem;
    font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
	text-rendering: optimizelegibility;
	background: transparent;
	color:#555;
	width:90%;
	max-width:980px;
	margin: 0 auto;
}

#page-container {
	position:relative;
	margin:5% 0;
	background: #f9f9f9;
	border: 1px solid #777;
	border: 1px solid rgba(0,0,0,.2);
	-webkit-box-shadow: 0px 0px 10px rgba(0,0,0,.1);
    -moz-box-shadow: 0px 0px 10px rgba(0,0,0,.1);
    box-shadow: 0px 0px 10px rgba(0,0,0,.1);
}

#header {
	color: #555;
	text-shadow: 0 1px #fff;
	background: #f2f5f6;
	background: -moz-linear-gradient(top, #f2f5f6 0%, #e3eaed 37%, #c8d7dc 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f2f5f6), color-stop(37%,#e3eaed), color-stop(100%,#c8d7dc));
	background: -webkit-linear-gradient(top, #f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);
	background: -o-linear-gradient(top, #f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);
	background: -ms-linear-gradient(top, #f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);
	background: linear-gradient(top, #f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);
	-moz-background-clip: padding;
	-webkit-background-clip: padding-box;
	background-clip: padding-box;
	margin-bottom: 0.7em;
	border-bottom: 1px solid #ddd;
	border-bottom: 1px solid rgba(0,0,0,.2);
	padding:.25em;
    font-size: 32px;
    font-size: 3.2rem;
	line-height: 1.2;
	text-align: center;
}

#footer {
	font-size: 8pt;
	color: #233b53;
	text-align: center;
	border-top: 1px solid #ddd;
	border-top: 1px solid rgba(0,0,0,.05);
	padding: 1em 2em;
	background: #deefff;
	background: -moz-linear-gradient(top, #deefff 0%, #98bede 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#deefff), color-stop(100%,#98bede));
	background: -webkit-linear-gradient(top, #deefff 0%,#98bede 100%);
	background: -o-linear-gradient(top, #deefff 0%,#98bede 100%);
	background: -ms-linear-gradient(top, #deefff 0%,#98bede 100%);
	background: linear-gradient(top, #deefff 0%,#98bede 100%);
	clear: both;
}

#error, .error {
	display: none;
	border: solid #cc0000;
	border-width: 2px 0;
	background: rgb(255,255,136);
	background: -moz-linear-gradient(top, rgba(255,255,136,1) 0%, rgba(255,255,136,1) 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,136,1)), color-stop(100%,rgba(255,255,136,1)));
	background: -webkit-linear-gradient(top, rgba(255,255,136,1) 0%,rgba(255,255,136,1) 100%);
	background: -o-linear-gradient(top, rgba(255,255,136,1) 0%,rgba(255,255,136,1) 100%);
	background: -ms-linear-gradient(top, rgba(255,255,136,1) 0%,rgba(255,255,136,1) 100%);
	background: linear-gradient(top, rgba(255,255,136,1) 0%,rgba(255,255,136,1) 100%);
	color: #990000;
	padding:2em 2em 1em;
	margin-bottom: 1.15em;
	text-align:center;
	text-transform: uppercase;
}

#errorMessage, .errorMessage {
	text-transform: none;
}

#error h3, .error h3 {
	margin: 0;
	padding: 0;
	font-size: 12pt;
}

.clr {
	clear: both;
}

.circle {
	display: block;
	float: left;
	-moz-border-radius: 2em;
	-webkit-border-radius: 2em;
	border: 2px solid #e5e5e5;
	font-weight: bold;
	font-size: 18px;
    font-size: 1.8rem;
	line-height:1.5em;
	color: #fff;
	height: 1.5em;
	width: 1.5em;
    margin: 0.75em;
    text-align: center;
    background: rgb(35,83,138);
	background: -moz-linear-gradient(top, rgba(35,83,138,1) 0%, rgba(167,207,223,1) 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(35,83,138,1)), color-stop(100%,rgba(167,207,223,1)));
	background: -webkit-linear-gradient(top, rgba(35,83,138,1) 0%,rgba(167,207,223,1) 100%);
	background: -o-linear-gradient(top, rgba(35,83,138,1) 0%,rgba(167,207,223,1) 100%);
	background: -ms-linear-gradient(top, rgba(35,83,138,1) 0%,rgba(167,207,223,1) 100%);
	background: linear-gradient(top, rgba(35,83,138,1) 0%,rgba(167,207,223,1) 100%);
	-webkit-box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.8) inset, 0px -1px 2px rgba(255,255,255,.9) inset,  0px 0px 1px rgba(0,0,0,.7); 0 -1px 1px rgba(0,0,0,.4);
    -moz-box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.8) inset, 0px -1px 2px rgba(255,255,255,.9) inset,  0px 0px 1px rgba(0,0,0,.7); 0 -1px 1px rgba(0,0,0,.4);
    box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.8) inset, 0px -1px 2px rgba(255,255,255,.9) inset,  0px 0px 1px rgba(0,0,0,.7); 0 -1px 1px rgba(0,0,0,.4);
}

.area-container {
	margin: 1em 4em;
}

#page2a .area-container {
	margin: 1em 0;
}

#runInstaller,
#runCleanup,
#gotoSite,
#gotoAdministrator,
#gotoPostRestorationRroubleshooting {
    margin: 0 2em 1.3em;
}

h2 {
	font-size: 24px;
    font-size: 2.4rem;
	font-weight: normal;
    line-height: 1.3;
	border: solid #ddd;
	text-shadow: 0px 1px #fff;
	border-top: 1px solid rgba(0,0,0,.05);
	border-bottom: 1px solid rgba(0,0,0,.2);
	border-left:none;
	border-right:none;
	padding: 0.5em 0;
    background: #f2f5f6;
	background: -moz-linear-gradient(top, #f2f5f6 0%, #e3eaed 37%, #c8d7dc 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f2f5f6), color-stop(37%,#e3eaed), color-stop(100%,#c8d7dc));
	background: -webkit-linear-gradient(top, #f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);
	background: -o-linear-gradient(top, #f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);
	background: -ms-linear-gradient(top, #f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);
	background: linear-gradient(top, #f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);
}
#preextraction h2 {
	margin-top:0;
	border-top:0;
	text-align:center;
}

input,
select,
textarea {
    font-size : 100%;
    margin : 0;
    vertical-align : baseline;
    *vertical-align: middle;
}
button,
input {
    line-height : normal;
	font-weight:normal;
    *overflow: visible;
}
input,
select,
textarea {
	background:#fff;
	color:#777;
	font-size: 16px;
	font-size: 1.6rem;
	border:1px solid #d5d5d5;
    -webkit-border-radius: .25em;
    -moz-border-radius: .25em;
    border-radius: .25em;
	-webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
	width:50%;
	padding:0 0 0 .5em;
}
input[type="checkbox"] {
	width:auto;
}
.field {
	height:1.5em;
}
label {
	display:inline-block;
	width:30%;
	font-size: 85%;
    font-weight: normal;
	text-transform: uppercase;
    cursor : pointer;
	color: #777;
	margin:.5em 0;
}

input:focus, input:hover {
	background-color: #fffbb3;
}

.button {
	display: inline-block;
	margin: 1em .25em;
	text-transform: uppercase;
	padding: 1em 2em;
	background: #2cb12c;
	color:#fff;
	text-shadow: 0 1px 3px rgba(0, 0, 0, 0.2), 0 1px rgba(0, 0, 0, 0.4);
	-webkit-box-shadow: 0 1px 3px rgba(255, 255, 255, 0.5) inset, -1px 2px 2px rgba(0, 0, 0, 0.2);
    -moz-box-shadow: 0 1px 3px rgba(255, 255, 255, 0.5) inset, -1px 2px 2px rgba(0, 0, 0, 0.2);
    box-shadow: 0 1px 3px rgba(255, 255, 255, 0.5) inset, -1px 2px 2px rgba(0, 0, 0, 0.2);
	background: -moz-linear-gradient(top, #2cb12c 0%, #259625 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#2cb12c), color-stop(100%,#259625));
	background: -webkit-linear-gradient(top, #2cb12c 0%,#259625 100%);
	background: -o-linear-gradient(top, #2cb12c 0%,#259625 100%);
	background: -ms-linear-gradient(top, #2cb12c 0%,#259625 100%);
	background: linear-gradient(top, #2cb12c 0%,#259625 100%);
	border: solid #ddd;
	border: 1px solid rgba(0,0,0,.1);
	cursor: pointer;
	-webkit-border-radius: .25em;
	-moz-border-radius: .25em;
	border-radius: .25em;
	-webkit-transition: 0.3s linear all;
	-moz-transition: 0.3s linear all;
	-ms-transition: 0.3s linear all;
	-o-transition: 0.3s linear all;
  	transition: 0.3s linear all;
}
#checkFTPTempDir.button,
#resetFTPTempDir.button,
#testFTP.button,
#browseFTP,
#reloadArchives,
#notWorking.button {
	padding: .5em 1em;
	text-transform: none;
}

.button:hover {
	background: #259625;
	background: -moz-linear-gradient(top, #259625 0%, #2cb12c 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#259625), color-stop(100%,#2cb12c));
	background: -webkit-linear-gradient(top, #259625 0%,#2cb12c 100%);
	background: -o-linear-gradient(top, #259625 0%,#2cb12c 100%);
	background: -ms-linear-gradient(top, #259625 0%,#2cb12c 100%);
	background: linear-gradient(top, #259625 0%,#2cb12c 100%);
}
.button:active {
	background: #3c3;
	color: #444;
	text-shadow: 0 1px #fff;
	border: solid #ccc;
	border: 1px solid rgba(0,0,0,.3);
	-webkit-box-shadow: 0 1px 3px rgba(0,0,0, 0.5) inset;
    -moz-box-shadow: 0 1px 3px rgba(0,0,0, 0.5) inset;
    box-shadow: 0 1px 3px rgba(0,0,0, 0.5) inset;
}

#notWorking.button, .bluebutton {
	text-decoration: none;
	background: #7abcff;
	background: -moz-linear-gradient(top, #7abcff 0%, #60abf8 44%, #4096ee 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#7abcff), color-stop(44%,#60abf8), color-stop(100%,#4096ee));
	background: -webkit-linear-gradient(top, #7abcff 0%,#60abf8 44%,#4096ee 100%);
	background: -o-linear-gradient(top, #7abcff 0%,#60abf8 44%,#4096ee 100%);
	background: -ms-linear-gradient(top, #7abcff 0%,#60abf8 44%,#4096ee 100%);
	background: linear-gradient(top, #7abcff 0%,#60abf8 44%,#4096ee 100%);
}
#notWorking.button:hover, .bluebutton:hover {
	background: #4096ee;
	background: -moz-linear-gradient(top, #4096ee 0%, #60abf8 56%, #7abcff 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#4096ee), color-stop(56%,#60abf8), color-stop(100%,#7abcff));
	background: -webkit-linear-gradient(top, #4096ee 0%,#60abf8 56%,#7abcff 100%);
	background: -o-linear-gradient(top, #4096ee 0%,#60abf8 56%,#7abcff 100%);
	background: -ms-linear-gradient(top, #4096ee 0%,#60abf8 56%,#7abcff 100%);
	background: linear-gradient(top, #4096ee 0%,#60abf8 56%,#7abcff 100%);
}
#notWorking.button:active, .bluebutton:active {
	background: #7abcff;
}

.loprofile {
	padding: 0.5em 1em;
	font-size: 80%;
}

.black_overlay{
	display: none;
	position: absolute;
	top: 0%;
	left: 0%;
	width: 100%;
	height: 100%;
	background-color: black;
	z-index:1001;
	-moz-opacity: 0.8;
	opacity:.80;
	filter: alpha(opacity=80);
}

.white_content {
	display: none;
	position: absolute;
	padding: 0 0 1em;
	background: #fff;
	border: 1px solid #ddd;
	border: 1px solid rgba(0,0,0,.3);
	z-index:1002;
	overflow: hidden;
}
.white_content a{
	margin-left:4em;
}
ol {
	margin:0 2em;
	padding:0 2em 1em;
}
li {
	margin : 0 0 .5em;
}

#genericerror {
	background-color: #f0f000 !important;
	border: 4px solid #fcc !important;
}

#genericerrorInner {
	font-size: 110%;
	color: #33000;
}

#warn-not-close, .warn-not-close {
	padding: 0.2em 0.5em;
	text-align: center;
	background: #fcfc00;
	font-size: smaller;
	font-weight: bold;
}

#progressbar, .progressbar {
	display: block;
	width: 80%;
	height: 32px;
	border: 1px solid #ccc;
	margin: 1em 10% 0.2em;
	-moz-border-radius: .25em;
	-webkit-border-radius: .25em;
	border-radius: .25em;
}

#progressbar-inner, .progressbar-inner {
	display: block;
	width: 100%;
	height: 100%;
	background: #4096ee;
	background: -moz-linear-gradient(left, #4096ee 0%, #60abf8 56%, #7abcff 100%);
	background: -webkit-gradient(linear, left top, right top, color-stop(0%,#4096ee), color-stop(56%,#60abf8), color-stop(100%,#7abcff));
	background: -webkit-linear-gradient(left, #4096ee 0%,#60abf8 56%,#7abcff 100%);
	background: -o-linear-gradient(left, #4096ee 0%,#60abf8 56%,#7abcff 100%);
	background: -ms-linear-gradient(left, #4096ee 0%,#60abf8 56%,#7abcff 100%);
	background: linear-gradient(left, #4096ee 0%,#60abf8 56%,#7abcff 100%);
}

#currentFile {
	font-family: Consolas, "Courier New", Courier, monospace;
	font-size: 9pt;
	height: 10pt;
	overflow: hidden;
	text-overflow: ellipsis;
	background: #ccc;
	margin: 0 10% 1em;
	padding:.125em;
}

#extractionComplete {
}

#warningsContainer {
	border-bottom: 2px solid brown;
	border-left: 2px solid brown;
	border-right: 2px solid brown;
	padding: 5px 0;
	background: #ffffcc;
	-webkit-border-bottom-right-radius: 5px;
	-webkit-border-bottom-left-radius: 5px;
	-moz-border-radius-bottomleft: 5px;
	-moz-border-radius-bottomright: 5px;
}

#warningsHeader h2 {
	color: black;
	text-shadow: 2px 2px 5px #999999;
	border-top: 2px solid brown;
	border-left: 2px solid brown;
	border-right: 2px solid brown;
	border-bottom: thin solid brown;
	-webkit-border-top-right-radius: 5px;
	-webkit-border-top-left-radius: 5px;
	-moz-border-radius-topleft: 5px;
	-moz-border-radius-topright: 5px;
	background: yellow;
	font-size: large;
	padding: 2px 5px;
	margin: 0px;
}

#warnings {
	height: 200px;
	overflow-y: scroll;
}

#warnings div {
	background: #eeeeee;
	font-size: small;
	padding: 2px 4px;
	border-bottom: thin solid #333333;
}

#automode {
	display: inline-block;
	padding: 6pt 12pt;
	background-color: #cc0000;
	border: thick solid yellow;
	color: white;
	font-weight: bold;
	font-size: 125%;
	position: absolute;
	float: right;
	top: 1em;
	right: 1em;
}

.helpme,
#warn-not-close {
	background: rgb(255,255,136);
	background: -moz-linear-gradient(top, rgba(255,255,136,1) 0%, rgba(255,255,136,1) 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,136,1)), color-stop(100%,rgba(255,255,136,1)));
	background: -webkit-linear-gradient(top, rgba(255,255,136,1) 0%,rgba(255,255,136,1) 100%);
	background: -o-linear-gradient(top, rgba(255,255,136,1) 0%,rgba(255,255,136,1) 100%);
	background: -ms-linear-gradient(top, rgba(255,255,136,1) 0%,rgba(255,255,136,1) 100%);
	background: linear-gradient(top, rgba(255,255,136,1) 0%,rgba(255,255,136,1) 100%);
	padding: 0.75em 0.5em;
	border: solid #febf01;
	border-width: 1px 0;
	text-align: center;
}

#update-notification {
	margin: 1em;
	padding: 0.5em;
	background-color: #FF9;
	color: #F33;
	text-align: center;
	border-radius: 20px;
	border: medium solid red;
	box-shadow: 5px 5px 5px black;
}

.update-notify {
	font-size: 20pt;
	font-weight: bold;
}

.update-links {
	color: #333;
	font-size: 14pt;
}

#update-dlnow {
	text-decoration: none;
	color: #333;
	border: thin solid #333;
	padding: 0.5em;
	border-radius: 5px;
	background-color: #f0f0f0;
	text-shadow: 1px 1px 1px #999;
}

#update-dlnow:hover {
	background-color: #fff;
}

#update-whatsnew {
	font-size: 11pt;
	color: blue;
	text-decoration: underline;
}

.update-whyupdate {
	color: #333;
	font-size: 9pt;
}

/* FTP Browser */
.breadcrumb {background-color: #F5F5F5; border-radius: 4px; list-style: none outside none; margin: 0 0 18px; padding: 8px 15px;}
.breadcrumb > li {display: inline-block; text-shadow: 0 1px 0 #FFFFFF;}
#ak_crumbs span {padding: 1px 3px;}
#ak_crumbs a {cursor: pointer;}
#ftpBrowserFolderList a{cursor:pointer}

/* Bootstrap porting */
.table {margin-bottom: 18px;width: 100%;}
.table th, .table td {border-top: 1px solid #DDDDDD; line-height: 18px; padding: 8px; text-align: left; vertical-align: top;}
.table-striped tbody > tr:nth-child(2n+1) > td, .table-striped tbody > tr:nth-child(2n+1) > th { background-color: #F9F9F9;}

/* Layout helpers
----------------------------------*/
.ui-helper-hidden { display: none; }
.ui-helper-hidden-accessible { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; }
.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; }
.ui-helper-clearfix:after { clear: both; }
.ui-helper-clearfix { zoom: 1; }
.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }


/* Interaction Cues
----------------------------------*/
.ui-state-disabled { cursor: default !important; }

/* Icons
----------------------------------*/

/* states and images */
.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }

/* Misc visuals
----------------------------------*/

/* Overlays */
.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
.ui-resizable { position: relative;}
.ui-resizable-handle { position: absolute;font-size: 0.1px; display: block; }
.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}
.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
.ui-button, .ui-button:link, .ui-button:visited, .ui-button:hover, .ui-button:active { text-decoration: none; }
.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
.ui-button-icons-only { width: 3.4em; }
button.ui-button-icons-only { width: 3.7em; }

/*button text element */
.ui-button .ui-button-text { display: block; line-height: 1.4;  }
.ui-button-text-only .ui-button-text { padding: 0; }
.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
/* no icon support for input elements, provide padding by default */
input.ui-button { padding: .4em 1em; }

/*button icon element(s) */
.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }

/*button sets*/
.ui-buttonset { margin-right: 7px; }
.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }

/* workarounds */
button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
.ui-dialog { position: absolute; top: 0; left: 0; padding: .2em; width: 300px; overflow: hidden; }
.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; }
.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; display:none}
.ui-dialog .ui-dialog-titlebar-close span { display: none; margin: 1px; }
.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
.ui-draggable .ui-dialog-titlebar { cursor: move; }

/* Component containers
----------------------------------*/
.ui-widget-content { border: 1px solid #a6c9e2; background: #fcfdfd; color: #222222; }
.ui-widget-content a { color: #222222; }
.ui-widget-header { border: 1px solid #4297d7; background: #5c9ccc ; color: #ffffff; font-weight: bold; }
.ui-widget-header a { color: #ffffff; }

/* Interaction states
----------------------------------*/
.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited {text-decoration: none; }
.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover{
    background: #4096ee;
	background: -moz-linear-gradient(top, #4096ee 0%, #60abf8 56%, #7abcff 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#4096ee), color-stop(56%,#60abf8), color-stop(100%,#7abcff));
	background: -webkit-linear-gradient(top, #4096ee 0%,#60abf8 56%,#7abcff 100%);
	background: -o-linear-gradient(top, #4096ee 0%,#60abf8 56%,#7abcff 100%);
	background: -ms-linear-gradient(top, #4096ee 0%,#60abf8 56%,#7abcff 100%);
	background: linear-gradient(top, #4096ee 0%,#60abf8 56%,#7abcff 100%);
}
.ui-state-hover a, .ui-state-hover a:hover, .ui-state-hover a:link, .ui-state-hover a:visited { color: #1d5987; text-decoration: none; }
.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #e17009; text-decoration: none; }

/* Interaction Cues
----------------------------------*/
.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fad42e; background: #fbec88 ; color: #363636; }
.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec ; color: #cd0a0a; }
.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
.ui-state-disabled .ui-icon { filter:Alpha(Opacity=35); } /* For IE8 - See #6059 */

/* Icons
----------------------------------*/

/* states and images */
.ui-icon { display:none}

/* Misc visuals
----------------------------------*/

/* Corner radius */
.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; -khtml-border-top-left-radius: 5px; border-top-left-radius: 5px; }
.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; -khtml-border-top-right-radius: 5px; border-top-right-radius: 5px; }
.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; -khtml-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; }
.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; -khtml-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; }

/* Overlays */
.ui-widget-overlay { background: #000000 ; opacity: .8;filter:Alpha(Opacity=80); }
.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #000000 ; opacity: .8;filter:Alpha(Opacity=80); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }


.ui-button {
    font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
    font-size: 1.4rem;
	display: inline-block;
	padding: .5em 1em;
	margin: 1em .25em;
	color:#fff;
	text-shadow: 0 1px 3px rgba(0, 0, 0, 0.2), 0 1px rgba(0, 0, 0, 0.4);
	-webkit-box-shadow: 0 1px 3px rgba(255, 255, 255, 0.5) inset, -1px 2px 2px rgba(0, 0, 0, 0.2);
    -moz-box-shadow: 0 1px 3px rgba(255, 255, 255, 0.5) inset, -1px 2px 2px rgba(0, 0, 0, 0.2);
    box-shadow: 0 1px 3px rgba(255, 255, 255, 0.5) inset, -1px 2px 2px rgba(0, 0, 0, 0.2);
    text-decoration: none;
	background: #7abcff;
	background: -moz-linear-gradient(top, #7abcff 0%, #60abf8 44%, #4096ee 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#7abcff), color-stop(44%,#60abf8), color-stop(100%,#4096ee));
	background: -webkit-linear-gradient(top, #7abcff 0%,#60abf8 44%,#4096ee 100%);
	background: -o-linear-gradient(top, #7abcff 0%,#60abf8 44%,#4096ee 100%);
	background: -ms-linear-gradient(top, #7abcff 0%,#60abf8 44%,#4096ee 100%);
	background: linear-gradient(top, #7abcff 0%,#60abf8 44%,#4096ee 100%);
	border: solid #ddd;
	border: 1px solid rgba(0,0,0,.1);
	cursor: pointer;
	-webkit-border-radius: .25em;
	-moz-border-radius: .25em;
	border-radius: .25em;
	-webkit-transition: 0.3s linear all;
	-moz-transition: 0.3s linear all;
	-ms-transition: 0.3s linear all;
	-o-transition: 0.3s linear all;
  	transition: 0.3s linear all;
}
	</style>
			<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
				<script type="text/javascript" src="//yandex.st/json2/2011-10-19/json2.min.js"></script>
				<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js"></script>
		<script type="text/javascript" language="javascript">
	var akeeba_debug = false;
	var sftp_path = '/var/www/html/';
	var isJoomla = true;

	/**
	 * Returns the version of Internet Explorer or a -1
	 * (indicating the use of another browser).
	 *
	 * @return   integer  MSIE version or -1
	 */
	function getInternetExplorerVersion()
	{
		var rv = -1; // Return value assumes failure.
		if (navigator.appName == 'Microsoft Internet Explorer')
		{
			var ua = navigator.userAgent;
			var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
			if (re.exec(ua) != null)
			{
				rv = parseFloat( RegExp.$1 );
			}
		}
		return rv;
	}

	$(document).ready(function(){
		// Hide 2nd Page
		$('#page2').css('display','none');

		// Translate the GUI
		translateGUI();

		// Hook interaction handlers
		$(document).keyup( closeLightbox );
		$('#kickstart\\.procengine').change( onChangeProcengine );
		$('#kickstart\\.setup\\.sourcepath').change( onArchiveListReload );
		$('#reloadArchives').click ( onArchiveListReload );
		$('#checkFTPTempDir').click( oncheckFTPTempDirClick );
		$('#resetFTPTempDir').click( onresetFTPTempDir );
		$('#browseFTP').click( onbrowseFTP );
		$('#testFTP').click( onTestFTPClick );
		$('#gobutton').click( onStartExtraction );
		$('#runInstaller').click( onRunInstallerClick );
		$('#runCleanup').click( onRunCleanupClick );
		$('#gotoSite').click(function(event){window.open('index.php','finalstepsite'); window.close();});
		$('#gotoAdministrator').click(function(event){window.open('administrator/index.php','finalstepadmin'); window.close();});
		$('#gotoStart').click( onGotoStartClick );

		// Reset the progress bar
		setProgressBar(0);

		// Show warning
		var msieVersion = getInternetExplorerVersion();
		if((msieVersion != -1) && (msieVersion <= 8.99))
		{
			$('#ie7Warning').css('display','block');
		}
		if(!akeeba_debug) {
			$('#preextraction').css('display','block');
			$('#fade').css('display','block');
		}

		// Trigger change, so we avoid problems if the user refreshes the page
		$('#kickstart\\.procengine').change();
	});

	var translation = {
		'AKURL_IMPORT':	'Import from URL',
'AKURL_TITLE_STEP1':	'Specify the URL',
'AKURL_FILENAME':	'URL to import',
'AKURL_JOOMLA':	'Latest Joomla! release',
'AKURL_WORDPRESS':	'Latest WordPress release',
'AKURL_CANCEL':	'Cancel import',
'AKURL_TITLE_STEP2':	'Importing...',
'AKURL_DO_NOT_CLOSE':	'Please do not close this window while your backup archives are being imported',
'AKURL_TITLE_STEP3':	'Import is complete',
'AKURL_BTN_RELOAD':	'Reload Kickstart',
'AUTOMODEON':	'Auto-mode enabled',
'ERR_NOT_A_JPA_FILE':	'The file is not a JPA archive',
'ERR_CORRUPT_ARCHIVE':	'The archive file is corrupt, truncated or archive parts are missing',
'ERR_INVALID_LOGIN':	'Invalid login',
'COULDNT_CREATE_DIR':	'Could not create %s folder',
'COULDNT_WRITE_FILE':	'Could not open %s for writing.',
'WRONG_FTP_HOST':	'Wrong FTP host or port',
'WRONG_FTP_USER':	'Wrong FTP username or password',
'WRONG_FTP_PATH1':	'Wrong FTP initial directory - the directory doesn\'t exist',
'FTP_CANT_CREATE_DIR':	'Could not create directory %s',
'FTP_TEMPDIR_NOT_WRITABLE':	'Could not find or create a writable temporary directory',
'SFTP_TEMPDIR_NOT_WRITABLE':	'Could not find or create a writable temporary directory',
'FTP_COULDNT_UPLOAD':	'Could not upload %s',
'THINGS_HEADER':	'Things you should know about Akeeba Kickstart',
'THINGS_01':	'Kickstart is not an installer. It is an archive extraction tool. The actual installer was put inside the archive file at backup time.',
'THINGS_02':	'Kickstart is not the only way to extract the backup archive. You can use Akeeba eXtract Wizard and upload the extracted files using FTP instead.',
'THINGS_03':	'Kickstart is bound by your server\'s configuration. As such, it may not work at all.',
'THINGS_04':	'You should download and upload your archive files using FTP in Binary transfer mode. Any other method could lead to a corrupt backup archive and restoration failure.',
'THINGS_05':	'Post-restoration site load errors are usually caused by .htaccess or php.ini directives. You should understand that blank pages, 404 and 500 errors can usually be worked around by editing the aforementioned files. It is not our job to mess with your configuration files, because this could be dangerous for your site.',
'THINGS_06':	'Kickstart overwrites files without a warning. If you are not sure that you are OK with that do not continue.',
'THINGS_07':	'Trying to restore to the temporary URL of a cPanel host (e.g. http://1.2.3.4/~username) will lead to restoration failure and your site will appear to be not working. This is normal and it\'s just how your server and CMS software work.',
'THINGS_08':	'You are supposed to read the documentation before using this software. Most issues can be avoided, or easily worked around, by understanding how this software works.',
'THINGS_09':	'This text does not imply that there is a problem detected. It is standard text displayed every time you launch Kickstart.',
'CLOSE_LIGHTBOX':	'Click here or press ESC to close this message',
'SELECT_ARCHIVE':	'Select a backup archive',
'ARCHIVE_FILE':	'Archive file:',
'SELECT_EXTRACTION':	'Select an extraction method',
'WRITE_TO_FILES':	'Write to files:',
'WRITE_HYBRID':	'Hybrid (use FTP only if needed)',
'WRITE_DIRECTLY':	'Directly',
'WRITE_FTP':	'Use FTP for all files',
'WRITE_SFTP':	'Use SFTP for all files',
'FTP_HOST':	'(S)FTP host name:',
'FTP_PORT':	'(S)FTP port:',
'FTP_FTPS':	'Use FTP over SSL (FTPS)',
'FTP_PASSIVE':	'Use FTP Passive Mode',
'FTP_USER':	'(S)FTP user name:',
'FTP_PASS':	'(S)FTP password:',
'FTP_DIR':	'(S)FTP directory:',
'FTP_TEMPDIR':	'Temporary directory:',
'FTP_CONNECTION_OK':	'FTP Connection Established',
'SFTP_CONNECTION_OK':	'SFTP Connection Established',
'FTP_CONNECTION_FAILURE':	'The FTP Connection Failed',
'SFTP_CONNECTION_FAILURE':	'The SFTP Connection Failed',
'FTP_TEMPDIR_WRITABLE':	'The temporary directory is writable.',
'FTP_TEMPDIR_UNWRITABLE':	'The temporary directory is not writable. Please check the permissions.',
'FTPBROWSER_ERROR_HOSTNAME':	'Invalid FTP host or port',
'FTPBROWSER_ERROR_USERPASS':	'Invalid FTP username or password',
'FTPBROWSER_ERROR_NOACCESS':	'Directory doesn\'t exist or you don\'t have enough permissions to access it',
'FTPBROWSER_ERROR_UNSUPPORTED':	'Sorry, your FTP server doesn\'t support our FTP directory browser.',
'FTPBROWSER_LBL_GOPARENT':	'&lt;up one level&gt;',
'FTPBROWSER_LBL_INSTRUCTIONS':	'Click on a directory to navigate into it. Click on OK to select that directory, Cancel to abort the procedure.',
'FTPBROWSER_LBL_ERROR':	'An error occurred',
'SFTP_NO_SSH2':	'Your web server does not have the SSH2 PHP module, therefore can not connect to SFTP servers.',
'SFTP_NO_FTP_SUPPORT':	'Your SSH server does not allow SFTP connections',
'SFTP_WRONG_USER':	'Wrong SFTP username or password',
'SFTP_WRONG_STARTING_DIR':	'You must supply a valid absolute path',
'SFTPBROWSER_ERROR_NOACCESS':	'Directory doesn\'t exist or you don\'t have enough permissions to access it',
'SFTP_COULDNT_UPLOAD':	'Could not upload %s',
'SFTP_CANT_CREATE_DIR':	'Could not create directory %s',
'UI-ROOT':	'&lt;root&gt;',
'CONFIG_UI_FTPBROWSER_TITLE':	'FTP Directory Browser',
'FTP_BROWSE':	'Browse',
'BTN_CHECK':	'Check',
'BTN_RESET':	'Reset',
'BTN_TESTFTPCON':	'Test FTP connection',
'BTN_TESTSFTPCON':	'Test SFTP connection',
'BTN_GOTOSTART':	'Start over',
'FINE_TUNE':	'Fine tune',
'MIN_EXEC_TIME':	'Minimum execution time:',
'MAX_EXEC_TIME':	'Maximum execution time:',
'SECONDS_PER_STEP':	'seconds per step',
'EXTRACT_FILES':	'Extract files',
'BTN_START':	'Start',
'EXTRACTING':	'Extracting',
'DO_NOT_CLOSE_EXTRACT':	'Do not close this window while the extraction is in progress',
'RESTACLEANUP':	'Restoration and Clean Up',
'BTN_RUNINSTALLER':	'Run the Installer',
'BTN_CLEANUP':	'Clean Up',
'BTN_SITEFE':	'Visit your site\'s front-end',
'BTN_SITEBE':	'Visit your site\'s back-end',
'WARNINGS':	'Extraction Warnings',
'ERROR_OCCURED':	'An error occured',
'STEALTH_MODE':	'Stealth mode',
'STEALTH_URL':	'HTML file to show to web visitors',
'ERR_NOT_A_JPS_FILE':	'The file is not a JPA archive',
'ERR_INVALID_JPS_PASSWORD':	'The password you gave is wrong or the archive is corrupt',
'JPS_PASSWORD':	'Archive Password (for JPS files)',
'INVALID_FILE_HEADER':	'Invalid header in archive file, part %s, offset %s',
'NEEDSOMEHELPKS':	'Want some help to use this tool? Read this first:',
'QUICKSTART':	'Quick Start Guide',
'CANTGETITTOWORK':	'Can\'t get it to work? Click me!',
'NOARCHIVESCLICKHERE':	'No archives detected. Click here for troubleshooting instructions.',
'POSTRESTORATIONTROUBLESHOOTING':	'Something not working after the restoration? Click here for troubleshooting instructions.',
'UPDATE_HEADER':	'An updated version of Akeeba Kickstart (<span id=\"update-version\">unknown</span>) is available!',
'UPDATE_NOTICE':	'You are advised to always use the latest version of Akeeba Kickstart available. Older versions may be subject to bugs and will not be supported.',
'UPDATE_DLNOW':	'Download now',
'UPDATE_MOREINFO':	'More information',
'IGNORE_MOST_ERRORS':	'Ignore most errors',
'WRONG_FTP_PATH2':	'Wrong FTP initial directory - the directory doesn\'t correspond to your site\'s web root',
'ARCHIVE_DIRECTORY':	'Archive directory:',
'RELOAD_ARCHIVES':	'Reload',
'CONFIG_UI_SFTPBROWSER_TITLE':	'SFTP Directory Browser',
'ERR_COULD_NOT_OPEN_ARCHIVE_PART':	'Could not open archive part file %s for reading. Check that the file exists, is readable by the web server and is not in a directory made out of reach by chroot, open_basedir restrictions or any other restriction put in place by your host.'	}

	var akeeba_ajax_url = 'ikstart.php';
	var akeeba_error_callback = onGenericError;
	var akeeba_restoration_stat_inbytes = 0;
	var akeeba_restoration_stat_outbytes = 0;
	var akeeba_restoration_stat_files = 0;
	var akeeba_restoration_stat_total = 0;
	var akeeba_factory = null;

	var akeeba_ftpbrowser_host = null;
	var akeeba_ftpbrowser_port = 21;
	var akeeba_ftpbrowser_username = null;
	var akeeba_ftpbrowser_password = null;
	var akeeba_ftpbrowser_passive = 1;
	var akeeba_ftpbrowser_ssl = 0;
	var akeeba_ftpbrowser_directory = '';

	var akeeba_sftpbrowser_host = null;
	var akeeba_sftpbrowser_port = 21;
	var akeeba_sftpbrowser_username = null;
	var akeeba_sftpbrowser_password = null;
	var akeeba_sftpbrowser_pubkey = null;
	var akeeba_sftpbrowser_privkey = null;
	var akeeba_sftpbrowser_directory = '';

	function translateGUI()
	{
		$('*').each(function(i,e){
			transKey = $(e).text();
			if(array_key_exists(transKey, translation))
			{
				$(e).text( translation[transKey] );
			}
		});
	}

	function trans(key)
	{
		if(array_key_exists(key, translation)) {
			return translation[key];
		} else {
			return key;
		}
	}

	function array_key_exists ( key, search ) {
		if (!search || (search.constructor !== Array && search.constructor !== Object)){
			return false;
		}
		return key in search;
	}

	function empty (mixed_var) {
		var key;

		if (mixed_var === "" ||
			mixed_var === 0 ||
			mixed_var === "0" ||
			mixed_var === null ||
			mixed_var === false ||
			typeof mixed_var === 'undefined'
		){
			return true;
		}

		if (typeof mixed_var == 'object') {
			for (key in mixed_var) {
				return false;
			}
			return true;
		}

		return false;
	}

	function is_array (mixed_var) {
		var key = '';
		var getFuncName = function (fn) {
			var name = (/\W*function\s+([\w\$]+)\s*\(/).exec(fn);
			if (!name) {
				return '(Anonymous)';
			}
			return name[1];
		};

		if (!mixed_var) {
			return false;
		}

		// BEGIN REDUNDANT
		this.php_js = this.php_js || {};
		this.php_js.ini = this.php_js.ini || {};
		// END REDUNDANT

		if (typeof mixed_var === 'object') {

			if (this.php_js.ini['phpjs.objectsAsArrays'] &&  // Strict checking for being a JavaScript array (only check this way if call ini_set('phpjs.objectsAsArrays', 0) to disallow objects as arrays)
				(
				(this.php_js.ini['phpjs.objectsAsArrays'].local_value.toLowerCase &&
				this.php_js.ini['phpjs.objectsAsArrays'].local_value.toLowerCase() === 'off') ||
				parseInt(this.php_js.ini['phpjs.objectsAsArrays'].local_value, 10) === 0)
			) {
				return mixed_var.hasOwnProperty('length') && // Not non-enumerable because of being on parent class
				!mixed_var.propertyIsEnumerable('length') && // Since is own property, if not enumerable, it must be a built-in function
				getFuncName(mixed_var.constructor) !== 'String'; // exclude String()
			}

			if (mixed_var.hasOwnProperty) {
				for (key in mixed_var) {
					// Checks whether the object has the specified property
					// if not, we figure it's not an object in the sense of a php-associative-array.
					if (false === mixed_var.hasOwnProperty(key)) {
						return false;
					}
				}
			}

			// Read discussion at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_is_array/
			return true;
		}

		return false;
	}

	function resolvePath(filename)
	{
		filename = filename.replace('\/\/g', '\/');
		var parts = filename.split('/');
		var out = [];

		$.each(parts, function(i, part){
			if (part == '.') return;
			if (part == '..') {
				out.pop();
				return;
			}
			out.push(part);
		});

		return out.join('/');
	}

	/**
	 * Performs an AJAX request and returns the parsed JSON output.
	 * The global akeeba_ajax_url is used as the AJAX proxy URL.
	 * If there is no errorCallback, the global akeeba_error_callback is used.
	 * @param data An object with the query data, e.g. a serialized form
	 * @param successCallback A function accepting a single object parameter, called on success
	 * @param errorCallback A function accepting a single string parameter, called on failure
	 */
	function doAjax(data, successCallback, errorCallback)
	{
		var structure =
		{
			type: "POST",
			url: akeeba_ajax_url,
			cache: false,
			data: data,
			timeout: 600000,
			success: function(msg) {
				// Initialize
				var junk = null;
				var message = "";

				// Get rid of junk before the data
				var valid_pos = msg.indexOf('###');
				if( valid_pos == -1 ) {
					// Valid data not found in the response
					msg = 'Invalid AJAX data received:<br/>' + msg;
					if(errorCallback == null)
					{
						if(akeeba_error_callback != null)
						{
							akeeba_error_callback(msg);
						}
					}
					else
					{
						errorCallback(msg);
					}
					return;
				} else if( valid_pos != 0 ) {
					// Data is prefixed with junk
					junk = msg.substr(0, valid_pos);
					message = msg.substr(valid_pos);
				}
				else
				{
					message = msg;
				}
				message = message.substr(3); // Remove triple hash in the beginning

				// Get of rid of junk after the data
				var valid_pos = message.lastIndexOf('###');
				message = message.substr(0, valid_pos); // Remove triple hash in the end

				try {
					var data = eval('('+message+')');
				} catch(err) {
					var msg = err.message + "\n<br/>\n<pre>\n" + message + "\n</pre>";
					if(errorCallback == null)
					{
						if(akeeba_error_callback != null)
						{
							akeeba_error_callback(msg);
						}
					}
					else
					{
						errorCallback(msg);
					}
					return;
				}

				// Call the callback function
				successCallback(data);
			},
			error: function(Request, textStatus, errorThrown) {
				var message = '<strong>AJAX Loading Error</strong><br/>HTTP Status: '+Request.status+' ('+Request.statusText+')<br/>';
				message = message + 'Internal status: '+textStatus+'<br/>';
				message = message + 'XHR ReadyState: ' + Response.readyState + '<br/>';
				message = message + 'Raw server response:<br/>'+Request.responseText;
				if(errorCallback == null)
				{
					if(akeeba_error_callback != null)
					{
						akeeba_error_callback(message);
					}
				}
				else
				{
					errorCallback(message);
				}
			}
		};
		$.ajax( structure );
	}

	function onChangeProcengine(event)
	{
		if( $('#kickstart\\.procengine').val() == 'direct' )
		{
			$('#ftp-options').hide('fast');
		} else {
			$('#ftp-options').show('fast');
		}

		if($('#kickstart\\.procengine').val() == 'sftp' )
		{
			$('#ftp-ssl-passive').hide('fast');

			if($('#kickstart\\.ftp\\.dir').val() == ''){
				$('#kickstart\\.ftp\\.dir').val(sftp_path);
			}

			$('#testFTP').html(trans('BTN_TESTSFTPCON'))
		}
		else
		{
			$('#ftp-ssl-passive').show('fast');
			$('#testFTP').html(trans('BTN_TESTFTPCON'))
		}
	}

	function closeLightbox(event)
	{
		var closeMe = false;

		if( (event == null) || (event == undefined) ) {
			closeMe = true;
		} else if(event.keyCode == '27') {
			closeMe = true;
		}

		if(closeMe)
		{
			document.getElementById('preextraction').style.display='none';
			document.getElementById('genericerror').style.display='none';
			document.getElementById('fade').style.display='none';
			$(document).unbind('keyup', closeLightbox);
		}
	}

	function onGenericError(msg)
	{
		$('#genericerrorInner').html(msg);
		$('#genericerror').css('display','block');
		$('#fade').css('display','block');
		$(document).keyup(closeLightbox);
	}

	function setProgressBar(percent)
	{
		var newValue = 0;

		if(percent <= 1) {
			newValue = 100 * percent;
		} else {
			newValue = percent;
		}

		$('#progressbar-inner').css('width',percent+'%');
	}

	function oncheckFTPTempDirClick(event)
	{
		var data = {
			'task' : 'checkTempdir',
			'json': JSON.stringify({
				'kickstart.ftp.tempdir': $('#kickstart\\.ftp\\.tempdir').val()
			})
		};

		doAjax(data, function(ret){
			var key = ret.status ? 'FTP_TEMPDIR_WRITABLE' : 'FTP_TEMPDIR_UNWRITABLE';
			alert( trans(key) );
		});
	}

	function onTestFTPClick(event)
	{
		var type = 'ftp';

		if($('#kickstart\\.procengine').val() == 'sftp')
		{
			type = 'sftp';
		}

		var data = {
			'task' : 'checkFTP',
			'json': JSON.stringify({
				'type' : type,
				'kickstart.ftp.host':		$('#kickstart\\.ftp\\.host').val(),
				'kickstart.ftp.port':		$('#kickstart\\.ftp\\.port').val(),
				'kickstart.ftp.ssl':		$('#kickstart\\.ftp\\.ssl').is(':checked'),
				'kickstart.ftp.passive':	$('#kickstart\\.ftp\\.passive').is(':checked'),
				'kickstart.ftp.user':		$('#kickstart\\.ftp\\.user').val(),
				'kickstart.ftp.pass':		$('#kickstart\\.ftp\\.pass').val(),
				'kickstart.ftp.dir':		$('#kickstart\\.ftp\\.dir').val(),
				'kickstart.ftp.tempdir':	$('#kickstart\\.ftp\\.tempdir').val()
			})
		};
		doAjax(data, function(ret){
			if(type == 'ftp'){
				var key = ret.status ? 'FTP_CONNECTION_OK' : 'FTP_CONNECTION_FAILURE';
			}
			else{
				var key = ret.status ? 'SFTP_CONNECTION_OK' : 'SFTP_CONNECTION_FAILURE';
			}


			alert( trans(key) + "\n\n" + (ret.status ? '' : ret.message) );
		});
	}

	function onbrowseFTP ()
	{
		if($('#kickstart\\.procengine').val() != 'sftp')
		{
			akeeba_ftpbrowser_host      = $('#kickstart\\.ftp\\.host').val();
			akeeba_ftpbrowser_port      = $('#kickstart\\.ftp\\.port').val();
			akeeba_ftpbrowser_username  = $('#kickstart\\.ftp\\.user').val();
			akeeba_ftpbrowser_password  = $('#kickstart\\.ftp\\.pass').val();
			akeeba_ftpbrowser_passive   = $('#kickstart\\.ftp\\.passive').is(':checked');
			akeeba_ftpbrowser_ssl       = $('#kickstart\\.ftp\\.ssl').is(':checked');
			akeeba_ftpbrowser_directory = $('#kickstart\\.ftp\\.dir').val();

			var akeeba_onbrowseFTP_callback = function(path) {
				var charlist = ('/').replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '$1');
				var re = new RegExp('^[' + charlist + ']+', 'g');
				path = '/' + (path+'').replace(re, '');
				$('#kickstart\\.ftp\\.dir').val(path);
			};

			akeeba_ftpbrowser_hook( akeeba_onbrowseFTP_callback );
		}
		else
		{
			akeeba_sftpbrowser_host = $('#kickstart\\.ftp\\.host').val();
			akeeba_sftpbrowser_port = $('#kickstart\\.ftp\\.port').val();
			akeeba_sftpbrowser_username = $('#kickstart\\.ftp\\.user').val();
			akeeba_sftpbrowser_password = $('#kickstart\\.ftp\\.pass').val();
			akeeba_sftpbrowser_directory = $('#kickstart\\.ftp\\.dir').val();

			var akeeba_postprocsftp_callback = function(path) {
				var charlist = ('/').replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '$1');
				var re = new RegExp('^[' + charlist + ']+', 'g');
				path = '/' + (path+'').replace(re, '');
				$('#kickstart\\.ftp\\.dir').val(path);
			};

			akeeba_sftpbrowser_hook( akeeba_postprocsftp_callback );
		}
	}

	akeeba_ftpbrowser_hook = function( callback )
	{
		var ftp_dialog_element = $("#ftpdialog");
		var ftp_callback = function() {
			callback(akeeba_ftpbrowser_directory);
			ftp_dialog_element.dialog("close");
		};

		ftp_dialog_element.css('display','block');
		ftp_dialog_element.removeClass('ui-state-error');
		ftp_dialog_element.dialog({
			autoOpen	: false,
			title		: trans('CONFIG_UI_FTPBROWSER_TITLE'),
			draggable	: false,
			height		: 500,
			width		: 500,
			modal		: true,
			resizable	: false,
			buttons		: {
				"OK": ftp_callback,
				"Cancel": function() {
					ftp_dialog_element.dialog("close");
				}
			}
		});

		$('#ftpBrowserErrorContainer').css('display','none');
		$('#ftpBrowserFolderList').html('');
		$('#ak_crumbs').html('');

		ftp_dialog_element.dialog('open');

		if(empty(akeeba_ftpbrowser_directory)) akeeba_ftpbrowser_directory = '';

		var data = {
			'task'      : 'ftpbrowse',
			'json': JSON.stringify({
				'host'		: akeeba_ftpbrowser_host,
				'port'		: akeeba_ftpbrowser_port,
				'username'	: akeeba_ftpbrowser_username,
				'password'	: akeeba_ftpbrowser_password,
				'passive'	: (akeeba_ftpbrowser_passive ? 1 : 0),
				'ssl'		: (akeeba_ftpbrowser_ssl ? 1 : 0),
				'directory'	: akeeba_ftpbrowser_directory
			})
		};

		// Do AJAX call and Render results
		doAjax(
			data,
			function(data) {
				if(data.error != false) {
					// An error occured
					$('#ftpBrowserError').html(trans(data.error));
					$('#ftpBrowserErrorContainer').css('display','block');
					$('#ftpBrowserFolderList').css('display','none');
					$('#ak_crumbs').css('display','none');
				} else {
					// Create the interface
					$('#ftpBrowserErrorContainer').css('display','none');

					// Display the crumbs
					if(!empty(data.breadcrumbs)) {
						$('#ak_crumbs').css('display','block');
						$('#ak_crumbs').html('');
						var relativePath = '/';

						akeeba_ftpbrowser_addcrumb(trans('UI-ROOT'), '/', callback);

						$.each(data.breadcrumbs, function(i, crumb) {
							relativePath += '/'+crumb;

							akeeba_ftpbrowser_addcrumb(crumb, relativePath, callback);
						});
					} else {
						$('#ak_crumbs').hide();
					}

					// Display the list of directories
					if(!empty(data.list)) {
						$('#ftpBrowserFolderList').show();

						$.each(data.list, function(i, item) {
							akeeba_ftpbrowser_create_link(akeeba_ftpbrowser_directory+'/'+item, item, $('#ftpBrowserFolderList'), callback );
						});
					} else {
						$('#ftpBrowserFolderList').css('display','none');
					}
				}
			},
			function(message) {
				$('#ftpBrowserError').html(message);
				$('#ftpBrowserErrorContainer').css('display','block');
				$('#ftpBrowserFolderList').css('display','none');
				$('#ak_crumbs').css('display','none');
			}
		);
	};

	/**
	 * Creates a directory link for the FTP browser UI
	 */
	function akeeba_ftpbrowser_create_link(path, label, container, callback)
	{
		var row = $(document.createElement('tr'));
		var cell = $(document.createElement('td')).appendTo(row);

		var myElement = $(document.createElement('a'))
			.text(label)
			.click(function(){
				akeeba_ftpbrowser_directory = resolvePath(path);
				akeeba_ftpbrowser_hook(callback);
			})
			.appendTo(cell);
		row.appendTo($(container));
	}

	/**
	 * Adds a breadcrumb to the FTP browser
	 */
	function akeeba_ftpbrowser_addcrumb(crumb, relativePath, callback, last)
	{
		if(empty(last)) last = false;
		var li = $(document.createElement('li'));

		$(document.createElement('a'))
			.html(crumb)
			.click(function(e){
				akeeba_ftpbrowser_directory = relativePath;
				akeeba_ftpbrowser_hook(callback);
				e.preventDefault();
			})
			.appendTo(li);

		if(!last) {
			$(document.createElement('span'))
				.text('/')
				.addClass('divider')
				.appendTo(li);
		}

		li.appendTo('#ak_crumbs');
	}

	// FTP browser function
	akeeba_sftpbrowser_hook = function( callback )
	{
		var sftp_dialog_element = $("#ftpdialog");
		var sftp_callback = function() {
			callback(akeeba_sftpbrowser_directory);
			sftp_dialog_element.dialog("close");
		};

		sftp_dialog_element.css('display','block');
		sftp_dialog_element.removeClass('ui-state-error');
		sftp_dialog_element.dialog({
			autoOpen	: false,
			'title'		: trans('CONFIG_UI_SFTPBROWSER_TITLE'),
			draggable	: false,
			height		: 500,
			width		: 500,
			modal		: true,
			resizable	: false,
			buttons		: {
				"OK": sftp_callback,
				"Cancel": function() {
					sftp_dialog_element.dialog("close");
				}
			}
		});

		$('#ftpBrowserErrorContainer').css('display','none');
		$('#ftpBrowserFolderList').html('');
		$('#ak_crumbs').html('');

		sftp_dialog_element.dialog('open');

		if(empty(akeeba_sftpbrowser_directory)) akeeba_sftpbrowser_directory = '';

		var data = {
			'task'      : 'sftpbrowse',
			'json': JSON.stringify({
				'host'		: akeeba_sftpbrowser_host,
				'port'		: akeeba_sftpbrowser_port,
				'username'	: akeeba_sftpbrowser_username,
				'password'	: akeeba_sftpbrowser_password,
				'directory'	: akeeba_sftpbrowser_directory
			})
		};

		doAjax(
			data,
			function(data) {
				if(data.error != false) {
					// An error occured
					$('#ftpBrowserError').html(data.error);
					$('#ftpBrowserErrorContainer').css('display','block');
					$('#ftpBrowserFolderList').css('display','none');
					$('#ak_crumbs').css('display','none');
				} else {
					// Create the interface
					$('#ftpBrowserErrorContainer').css('display','none');

					// Display the crumbs
					if(!empty(data.breadcrumbs)) {
						$('#ak_crumbs').css('display','block');
						$('#ak_crumbs').html('');
						var relativePath = '/';

						akeeba_sftpbrowser_addcrumb(trans('UI-ROOT'), '/', callback);

						$.each(data.breadcrumbs, function(i, crumb) {
							relativePath += '/'+crumb;

							akeeba_sftpbrowser_addcrumb(crumb, relativePath, callback);
						});
					} else {
						$('#ftpBrowserCrumbs').css('display','none');
					}

					// Display the list of directories
					if(!empty(data.list)) {
						$('#ftpBrowserFolderList').css('display','block');

						$.each(data.list, function(i, item) {
							akeeba_sftpbrowser_create_link(akeeba_sftpbrowser_directory+'/'+item, item, $('#ftpBrowserFolderList'), callback );
						});
					} else {
						$('#ftpBrowserFolderList').css('display','none');
					}
				}
			},
			function(message) {
				$('#ftpBrowserError').html(message);
				$('#ftpBrowserErrorContainer').css('display','block');
				$('#ftpBrowserFolderList').css('display','none');
				$('#ftpBrowserCrumbs').css('display','none');
			}
		);
	};

	/**
	 * Creates a directory link for the SFTP browser UI
	 */
	function akeeba_sftpbrowser_create_link(path, label, container, callback)
	{
		var row = $(document.createElement('tr'));
		var cell = $(document.createElement('td')).appendTo(row);

		var myElement = $(document.createElement('a'))
			.text(label)
			.click(function(){
				akeeba_sftpbrowser_directory = resolvePath(path);
				akeeba_sftpbrowser_hook(callback);
			})
			.appendTo(cell);
		row.appendTo($(container));
	}

	/**
	 * Adds a breadcrumb to the SFTP browser
	 */
	function akeeba_sftpbrowser_addcrumb(crumb, relativePath, callback, last)
	{
		if(empty(last)) last = false;
		var li = $(document.createElement('li'));

		$(document.createElement('a'))
			.html(crumb)
			.click(function(e){
				akeeba_sftpbrowser_directory = relativePath;
				akeeba_sftpbrowser_hook(callback);
				e.preventDefault();
			})
			.appendTo(li);

		if(!last) {
			$(document.createElement('span'))
				.text('/')
				.addClass('divider')
				.appendTo(li);
		}

		li.appendTo('#ak_crumbs');
	}

	function onStartExtraction()
	{
		$('#page1').hide('fast');
		$('#page2').show('fast');

		$('#currentFile').text( '' );

		akeeba_error_callback = errorHandler;

		var data = {
			'task' : 'startExtracting',
			'json': JSON.stringify({
				'kickstart.setup.sourcepath':		$('#kickstart\\.setup\\.sourcepath').val(),
				'kickstart.setup.sourcefile':		$('#kickstart\\.setup\\.sourcefile').val(),
				'kickstart.jps.password':			$('#kickstart\\.jps\\.password').val(),
				'kickstart.tuning.min_exec_time':	$('#kickstart\\.tuning\\.min_exec_time').val(),
				'kickstart.tuning.max_exec_time':	$('#kickstart\\.tuning\\.max_exec_time').val(),
				'kickstart.stealth.enable': 		$('#kickstart\\.stealth\\.enable').is(':checked'),
				'kickstart.stealth.url': 			$('#kickstart\\.stealth\\.url').val(),
				'kickstart.tuning.run_time_bias':	75,
				'kickstart.setup.restoreperms':		0,
				'kickstart.setup.dryrun':			0,
				'kickstart.setup.ignoreerrors':		$('#kickstart\\.setup\\.ignoreerrors').is(':checked'),
				'kickstart.enabled':				1,
				'kickstart.security.password':		'',
				'kickstart.procengine':				$('#kickstart\\.procengine').val(),
				'kickstart.ftp.host':				$('#kickstart\\.ftp\\.host').val(),
				'kickstart.ftp.port':				$('#kickstart\\.ftp\\.port').val(),
				'kickstart.ftp.ssl':				$('#kickstart\\.ftp\\.ssl').is(':checked'),
				'kickstart.ftp.passive':			$('#kickstart\\.ftp\\.passive').is(':checked'),
				'kickstart.ftp.user':				$('#kickstart\\.ftp\\.user').val(),
				'kickstart.ftp.pass':				$('#kickstart\\.ftp\\.pass').val(),
				'kickstart.ftp.dir':				$('#kickstart\\.ftp\\.dir').val(),
				'kickstart.ftp.tempdir':			$('#kickstart\\.ftp\\.tempdir').val()
			})
		};
		doAjax(data, function(ret){
			processRestorationStep(ret);
		});
	}

	function processRestorationStep(data)
	{
		// Look for errors
		if(!data.status)
		{
			errorHandler(data.message);
			return;
		}

		// Propagate warnings to the GUI
		if( !empty(data.Warnings) )
		{
			$.each(data.Warnings, function(i, item){
				$('#warnings').append(
					$(document.createElement('div'))
						.html(item)
				);
				$('#warningsBox').show('fast');
			});
		}

		// Parse total size, if exists
		if(array_key_exists('totalsize', data))
		{
			if(is_array(data.filelist))
			{
				akeeba_restoration_stat_total = 0;
				$.each(data.filelist,function(i, item)
				{
					akeeba_restoration_stat_total += item[1];
				});
			}
			akeeba_restoration_stat_outbytes = 0;
			akeeba_restoration_stat_inbytes = 0;
			akeeba_restoration_stat_files = 0;
		}

		// Update GUI
		akeeba_restoration_stat_inbytes += data.bytesIn;
		akeeba_restoration_stat_outbytes += data.bytesOut;
		akeeba_restoration_stat_files += data.files;
		var percentage = 0;
		if( akeeba_restoration_stat_total > 0 )
		{
			percentage = 100 * akeeba_restoration_stat_inbytes / akeeba_restoration_stat_total;
			if(percentage < 0) {
				percentage = 0;
			} else if(percentage > 100) {
				percentage = 100;
			}
		}
		if(data.done) percentage = 100;
		setProgressBar(percentage);
		$('#currentFile').text( data.lastfile );

		if(!empty(data.factory)) akeeba_factory = data.factory;

		post = {
			'task'	: 'continueExtracting',
			'json'	: JSON.stringify({factory: akeeba_factory})
		};

		if(!data.done)
		{
			doAjax(post, function(ret){
				processRestorationStep(ret);
			});
		}
		else
		{
			$('#page2a').hide('fast');
			$('#extractionComplete').show('fast');

			$('#runInstaller').css('display','inline-block');
		}
	}

	function onGotoStartClick(event)
	{
		$('#page2').hide('fast');
		$('#error').hide('fast');
		$('#page1').show('fast');
	}

	function onRunInstallerClick(event)
	{
		var windowReference = window.open('installation/index.php','installer');
		if(!windowReference.opener) {
			windowReference.opener = this.window;
		}
		$('#runCleanup').css('display','inline-block');
		$('#runInstaller').hide('fast');
	}

	function onRunCleanupClick(event)
	{
		post = {
			'task'	: 'isJoomla',
			// Passing the factory preserves the renamed files array
			'json'	: JSON.stringify({factory: akeeba_factory})
		};

		doAjax(post, function(ret){
			isJoomla = ret;
			onRealRunCleanupClick();
		});
	}

	function onRealRunCleanupClick()
	{
		post = {
			'task'	: 'cleanUp',
			// Passing the factory preserves the renamed files array
			'json'	: JSON.stringify({factory: akeeba_factory})
		};

		doAjax(post, function(ret){
			$('#runCleanup').hide('fast');
			$('#gotoSite').css('display','inline-block');
			if (isJoomla)
			{
				$('#gotoAdministrator').css('display','inline-block');
			}
			else
			{
				$('#gotoAdministrator').css('display','none');
			}
			$('#gotoPostRestorationRroubleshooting').css('display','block');
		});

	}

	function errorHandler(msg)
	{
		$('#errorMessage').html(msg);
		$('#error').show('fast');
	}

	function onresetFTPTempDir(event)
	{
		$('#kickstart\\.ftp\\.tempdir').val('/var/www/html/');
	}

	function onArchiveListReload()
	{
		post = {
			'task'	: 'listArchives',
			'json'	: JSON.stringify({path: $('#kickstart\\.setup\\.sourcepath').val()})
		}

		doAjax(post, function(ret){
			$('#sourcefileContainer').html(ret);
		});
	}

	/**
	 * Akeeba Kickstart Update Check
	 */

	var akeeba_update = {version: '0'};
	var akeeba_version = '4.1.1';

	function version_compare (v1, v2, operator) {
		// BEGIN REDUNDANT
		this.php_js = this.php_js || {};
		this.php_js.ENV = this.php_js.ENV || {};
		// END REDUNDANT
		// Important: compare must be initialized at 0.
		var i = 0,
			x = 0,
			compare = 0,
		// vm maps textual PHP versions to negatives so they're less than 0.
		// PHP currently defines these as CASE-SENSITIVE. It is important to
		// leave these as negatives so that they can come before numerical versions
		// and as if no letters were there to begin with.
		// (1alpha is < 1 and < 1.1 but > 1dev1)
		// If a non-numerical value can't be mapped to this table, it receives
		// -7 as its value.
			vm = {
				'dev': -6,
				'alpha': -5,
				'a': -5,
				'beta': -4,
				'b': -4,
				'RC': -3,
				'rc': -3,
				'#': -2,
				'p': -1,
				'pl': -1
			},
		// This function will be called to prepare each version argument.
		// It replaces every _, -, and + with a dot.
		// It surrounds any nonsequence of numbers/dots with dots.
		// It replaces sequences of dots with a single dot.
		//    version_compare('4..0', '4.0') == 0
		// Important: A string of 0 length needs to be converted into a value
		// even less than an unexisting value in vm (-7), hence [-8].
		// It's also important to not strip spaces because of this.
		//   version_compare('', ' ') == 1
			prepVersion = function (v) {
				v = ('' + v).replace(/[_\-+]/g, '.');
				v = v.replace(/([^.\d]+)/g, '.$1.').replace(/\.{2,}/g, '.');
				return (!v.length ? [-8] : v.split('.'));
			},
		// This converts a version component to a number.
		// Empty component becomes 0.
		// Non-numerical component becomes a negative number.
		// Numerical component becomes itself as an integer.
			numVersion = function (v) {
				return !v ? 0 : (isNaN(v) ? vm[v] || -7 : parseInt(v, 10));
			};
		v1 = prepVersion(v1);
		v2 = prepVersion(v2);
		x = Math.max(v1.length, v2.length);
		for (i = 0; i < x; i++) {
			if (v1[i] == v2[i]) {
				continue;
			}
			v1[i] = numVersion(v1[i]);
			v2[i] = numVersion(v2[i]);
			if (v1[i] < v2[i]) {
				compare = -1;
				break;
			} else if (v1[i] > v2[i]) {
				compare = 1;
				break;
			}
		}
		if (!operator) {
			return compare;
		}

		// Important: operator is CASE-SENSITIVE.
		// "No operator" seems to be treated as less than
		// Any other values seem to make the function return null.
		switch (operator) {
			case '>':
			case 'gt':
				return (compare > 0);
			case '>=':
			case 'ge':
				return (compare >= 0);
			case '<=':
			case 'le':
				return (compare <= 0);
			case '==':
			case '=':
			case 'eq':
				return (compare === 0);
			case '<>':
			case '!=':
			case 'ne':
				return (compare !== 0);
			case '':
			case '<':
			case 'lt':
				return (compare < 0);
			default:
				return null;
		}
	}

	function checkUpdates()
	{
		var structure =
		{
			type: "GET",
			url: 'http://query.yahooapis.com/v1/public/yql',
			data: {
								q: 'SELECT * FROM xml WHERE url="http://nocdn.akeebabackup.com/updates/kickstartpro.xml"',
								format: 'json',
				callback: 'updatesCallback'
			},
			cache: true,
			crossDomain: true,
			jsonp: 'updatesCallback',
			timeout: 15000
		};
		$.ajax( structure );
	}

	function updatesCallback(msg)
	{
		$.each(msg.query.results.updates.update, function(i, el){
			var myUpdate = {
				'version'	: el.version,
				'infourl'	: el.infourl['content'],
				'dlurl'		: el.downloads.downloadurl.content
			}
			if(version_compare(myUpdate.version, akeeba_update.version, 'ge')) {
				akeeba_update = myUpdate;
			}
		});

		if(version_compare(akeeba_update.version, akeeba_version, 'gt')) {
			notifyAboutUpdates();
		}
	}

	function notifyAboutUpdates()
	{
		$('#update-version').text(akeeba_update.version);
		$('#update-dlnow').attr('href', akeeba_update.dlurl);
		$('#update-whatsnew').attr('href', akeeba_update.infourl);
		$('#update-notification').show('slow');
	}

	
var akeeba_url_filename = null;

$(document).ready(function(){
	$('#ak-url-showgui').click(function(e){
		$('#ak-url-gui').show('fast');
		$('#ak-url-progress').hide('fast');
		$('#ak-url-complete').hide('fast');
		$('#ak-url-error').hide('fast');
		$('#page1-content').hide('fast');
	});
	$('#ak-url-hidegui').click(function(e){
		$('#ak-url-gui').hide('fast');
		$('#ak-url-progress').hide('fast');
		$('#ak-url-complete').hide('fast');
		$('#ak-url-error').hide('fast');
		$('#page1-content').show('fast');
	});
	$('#ak-url-reload').click(function(e){
		window.location.reload();
	});
	$('#ak-url-gotoStart').click(function(e){
		$('#ak-url-gui').show('fast');
		$('#ak-url-progress').hide('fast');
		$('#ak-url-complete').hide('fast');
		$('#ak-url-error').hide('fast');
	});
});

function onAKURLImport()
{
	akeeba_url_filename = $('#url\\.filename').val();
	ak_urlimport_start();
}

function AKURLsetProgressBar(percent)
{
	var newValue = 0;

	if(percent <= 1) {
		newValue = 100 * percent;
	} else {
		newValue = percent;
	}

	$('#ak-url-progressbar-inner').css('width',percent+'%');
}

function ak_urlimport_start()
{
	akeeba_error_callback = AKURLerrorHandler;

	$('#ak-url-gui').hide('fast');
	$('#ak-url-progress').show('fast');
	$('#ak-url-complete').hide('fast');
	$('#ak-url-error').hide('fast');

	AKURLsetProgressBar(0);
	$('#ak-url-progresstext').html('');

	var data = {
		'task' : 'urlimport',
		'json' : JSON.stringify({
			'file'		: akeeba_url_filename,
			'frag'		: "-1",
			'totalSize'	: "-1"
		})
	};
	doAjax(data, function(ret){
		ak_urlimport_step(ret);
	});
}

function ak_urlimport_step(data)
{
	// Look for errors
	if(!data.status)
	{
		AKURLerrorHandler(data.error);
		return;
	}

	var totalSize = 0;
	var doneSize = 0;
	var percent = 0;
	var frag = -1;

	// get running stats
	if(array_key_exists('totalSize', data)) {
		totalSize = data.totalSize;
	}
	if(array_key_exists('doneSize', data)) {
		doneSize = data.doneSize;
	}
	if(array_key_exists('percent', data)) {
		percent = data.percent;
	}
	if(array_key_exists('frag', data)) {
		frag = data.frag;
	}

	// Update GUI
	AKURLsetProgressBar(percent);
	//$('#ak-url-progresstext').text( percent+'% ('+doneSize+' / '+totalSize+' bytes)' );
	$('#ak-url-progresstext').text( percent+'% ('+doneSize+' bytes)' );

	post = {
		'task'	: 'urlimport',
		'json'	: JSON.stringify({
			'file'		: akeeba_url_filename,
			'frag'		: frag,
			'totalSize'	: totalSize,
			'doneSize'  : doneSize
		})
	};

	if(percent < 100) {
		// More work to do
		doAjax(post, function(ret){
			ak_urlimport_step(ret);
		});
	} else {
		// Done!
		$('#ak-url-gui').hide('fast');
		$('#ak-url-progress').hide('fast');
		$('#ak-url-complete').show('fast');
		$('#ak-url-error').hide('fast');
	}
}

function onAKURLJoomla()
{
	akeeba_error_callback = AKURLerrorHandler;

	var data = {
		'task' : 'getjurl'
	};

	doAjax(data, function(ret)
	{
		ak_urlimport_gotjurl(ret);
	});
}

function onAKURLWordpress()
{
	$('#url\\.filename').val('http://wordpress.org/latest.zip');
}

function ak_urlimport_gotjurl(data)
{
	var url = '';

	if(array_key_exists('url', data)) {
		url = data.url;
	}

	$('#url\\.filename').val(url);
}

function AKURLerrorHandler(msg)
{
	$('#ak-url-gui').hide('fast');
	$('#ak-url-progress').hide('fast');
	$('#ak-url-complete').hide('fast');
	$('#ak-url-error').show('fast');

	$('#ak-url-errorMessage').html(msg);
}
</script>
	</head>
	<body>

	<div id="automode" style="display:none;">
		AUTOMODEON
	</div>

	<div id="fade" class="black_overlay" style="display: block;"></div>

	<div id="page-container">

	<div id="preextraction" class="white_content" style="display: block;">
		<div id="ie7Warning" style="display:none;">
			<h2>Deprecated Internet Explorer version</h2>
			<p>
				This script is not guaranteed to work properly on Internet Explorer 8
				or earlier versions, or on Internet Explorer 9 and higher running
				in compatibility mode.
			</p>
			<p>
				Please use Internet Explorer 9 or later in native mode (the
				"broken page" icon next to the address bar should not be
				enabled). Alternatively, you may use the latest versions of Firefox,
				Safari, Google Chrome or Opera.
			</p>
		</div>

		<h2>Things you should know about Akeeba Kickstart</h2>
		<ol>
			<li>Kickstart is not an installer. It is an archive extraction tool. The actual installer was put inside the archive file at backup time.</li>
			<li>Kickstart is not the only way to extract the backup archive. You can use Akeeba eXtract Wizard and upload the extracted files using FTP instead.</li>
			<li>Kickstart is bound by your server's configuration. As such, it may not work at all.</li>
			<li>You should download and upload your archive files using FTP in Binary transfer mode. Any other method could lead to a corrupt backup archive and restoration failure.</li>
			<li>Post-restoration site load errors are usually caused by .htaccess or php.ini directives. You should understand that blank pages, 404 and 500 errors can usually be worked around by editing the aforementioned files. It is not our job to mess with your configuration files, because this could be dangerous for your site.</li>
			<li>Kickstart overwrites files without a warning. If you are not sure that you are OK with that do not continue.</li>
			<li>Trying to restore to the temporary URL of a cPanel host (e.g. http://1.2.3.4/~username) will lead to restoration failure and your site will appear to be not working. This is normal and it's just how your server and CMS software work.</li>
			<li>You are supposed to read the documentation before using this software. Most issues can be avoided, or easily worked around, by understanding how this software works.</li>
			<li>This text does not imply that there is a problem detected. It is standard text displayed every time you launch Kickstart.</li>
		</ol>
		<a href="javascript:void(0)" onclick="closeLightbox();">Click here or press ESC to close this message</a>
	</div>

	<div id="genericerror" class="white_content">
		<pre id="genericerrorInner"></pre>
	</div>

	<div id="header">
		<div class="title">Akeeba Kickstart Core 4.1.1</div>
	</div>

	<div id="update-notification" style="display: none">
		<p class="update-notify">An updated version of Akeeba Kickstart (&lt;span id="update-version"&gt;unknown&lt;/span&gt;) is available!</p>
		<p class="update-whyupdate">You are advised to always use the latest version of Akeeba Kickstart available. Older versions may be subject to bugs and will not be supported.</p>
		<p class="update-links">
			<a href="#" id="update-dlnow">Download now</a>
			<a href="#" id="update-whatsnew" target="_blank">More information</a>
		</p>
	</div>

	<div id="page1">
		<div id="ak-url-gui" style="display: none">
	<div class="step1">
		<div class="circle">1</div>
		<h2>Specify the URL</h2>
		<div class="area-container">
			<label for="url.filename">URL to import</label>
			<span class="field"><input type="text" style="width: 45%" id="url.filename" value=""></span>
			<a id="ak-url-joomla" class="button bluebutton loprofile" onclick="onAKURLJoomla()">Latest Joomla! release</a>
			<a id="ak-url-wordpress" class="button bluebutton loprofile" onclick="onAKURLWordpress()">Latest WordPress release</a>

			<div class="clr"></div>
			<a id="ak-url-connect" class="button" onclick="onAKURLImport()">Import from URL</a>
			<a id="ak-url-hidegui" class="button bluebutton">Cancel import</a>
		</div>
	</div>
	<div class="clr"></div>
</div>

<div id="ak-url-progress" style="display: none">
	<div class="circle">2</div>
	<h2>Importing...</h2>
	<div class="area-container">
		<div id="ak-url-importing">
			<div class="warn-not-close">Please do not close this window while your backup archives are being imported</div>
			<div id="ak-url-progressbar" class="progressbar">
				<div id="ak-url-progressbar-inner" class="progressbar-inner">&nbsp;</div>
			</div>
			<div id="ak-url-progresstext"></div>
		</div>
	</div>
</div>

<div id="ak-url-complete" style="display: none">
	<div class="circle">3</div>
	<h2>Import is complete</h2>
	<div class="area-container">
		<div id="ak-url-reload" class="button">Reload Kickstart</div>
	</div>
</div>

<div id="ak-url-error" class="error" style="display: none;">
	<h3>An error occured</h3>
	<p id="ak-url-errorMessage" class="errorMessage"></p>
	<div id="ak-url-gotoStart" class="button">Start over</div>
</div>

		<div id="page1-content">

			<div class="helpme">
				<span>Want some help to use this tool? Read this first:</span> <a href="https://www.akeebabackup.com/documentation/quick-start-guide/using-kickstart.html" target="_blank">Quick Start Guide</a>
			</div>

			<div class="step1">
				<div class="circle">1</div>
				<h2>Select a backup archive</h2>
				<div class="area-container">
						<a id="ak-url-showgui" class="button bluebutton loprofile">Import from URL</a>
					<div class="clr"></div>

					<label for="kickstart.setup.sourcepath">Archive directory:</label>
			<span class="field">
				<input type="text" id="kickstart.setup.sourcepath" value="/var/www/html/">
				<span class="button" id="reloadArchives" style="margin-top:0;margin-bottom:0">Reload</span>
			</span>
					<br>

					<label for="kickstart.setup.sourcefile">Archive file:</label>
			<span class="field" id="sourcefileContainer">
									<a href="https://www.akeebabackup.com/documentation/troubleshooter/ksnoarchives.html" target="_blank">No archives detected. Click here for troubleshooting instructions.</a>
							</span>
					<br>
					<label for="kickstart.jps.password">Archive Password (for JPS files)</label>
					<span class="field"><input type="password" id="kickstart.jps.password" value=""></span>
				</div>
			</div>

			<div class="clr"></div>

			<div class="step2">
				<div class="circle">2</div>
				<h2>Select an extraction method</h2>
				<div class="area-container">
					<label for="kickstart.procengine">Write to files:</label>
			<span class="field">
				<select id="kickstart.procengine">
					<option value="hybrid">Hybrid (use FTP only if needed)</option>
					<option value="direct">Directly</option>
					<option value="ftp">Use FTP for all files</option>
					<option value="sftp">Use SFTP for all files</option>
				</select>
			</span><br>

					<label for="kickstart.setup.ignoreerrors">Ignore most errors</label>
					<span class="field"><input type="checkbox" id="kickstart.setup.ignoreerrors"></span>

					<div id="ftp-options" style="">
						<label for="kickstart.ftp.host">(S)FTP host name:</label>
						<span class="field"><input type="text" id="kickstart.ftp.host" value="localhost"></span><br>
						<label for="kickstart.ftp.port">(S)FTP port:</label>
						<span class="field"><input type="text" id="kickstart.ftp.port" value="21"></span><br>
						<div id="ftp-ssl-passive" style="">
							<label for="kickstart.ftp.ssl">Use FTP over SSL (FTPS)</label>
							<span class="field"><input type="checkbox" id="kickstart.ftp.ssl"></span><br>
							<label for="kickstart.ftp.passive">Use FTP Passive Mode</label>
							<span class="field"><input type="checkbox" id="kickstart.ftp.passive" checked="checked"></span><br>
						</div>
						<label for="kickstart.ftp.user">(S)FTP user name:</label>
						<span class="field"><input type="text" id="kickstart.ftp.user" value=""></span><br>
						<label for="kickstart.ftp.pass">(S)FTP password:</label>
						<span class="field"><input type="password" id="kickstart.ftp.pass" value=""></span><br>
						<label for="kickstart.ftp.dir">(S)FTP directory:</label>
				<span class="field">
                    <input type="text" id="kickstart.ftp.dir" value="">
                    <span class="button" id="browseFTP" style="margin-top:0;margin-bottom:0">Browse</span>
                </span><br>

						<label for="kickstart.ftp.tempdir">Temporary directory:</label>
				<span class="field">
					<input type="text" id="kickstart.ftp.tempdir" value="/var/www/html/">
					<span class="button" id="checkFTPTempDir">Check</span>
					<span class="button" id="resetFTPTempDir">Reset</span>
				</span><br>
						<label></label>
						<span class="button" id="testFTP">Test FTP connection</span>
						<a id="notWorking" class="button" href="https://www.akeebabackup.com/documentation/troubleshooter/kscantextract.html" target="_blank">Can't get it to work? Click me!</a>
						<br>
					</div>

				</div>
			</div>

			<div class="clr"></div>

			<div class="step3">
				<div class="circle">3</div>
				<h2>Fine tune</h2>
				<div class="area-container">
					<label for="kickstart.tuning.min_exec_time">Minimum execution time:</label>
					<span class="field"><input type="text" id="kickstart.tuning.min_exec_time" value="1"></span> <span>seconds per step</span><br>
					<label for="kickstart.tuning.max_exec_time">Maximum execution time:</label>
					<span class="field"><input type="text" id="kickstart.tuning.max_exec_time" value="5"></span> <span>seconds per step</span><br>

					<label for="kickstart.stealth.enable">Stealth mode</label>
					<span class="field"><input type="checkbox" id="kickstart.stealth.enable"></span><br>
					<label for="kickstart.stealth.url">HTML file to show to web visitors</label>
					<span class="field"><input type="text" id="kickstart.stealth.url" value=""></span><br>
				</div>
			</div>

			<div class="clr"></div>

			<div class="step4">
				<div class="circle">4</div>
				<h2>Extract files</h2>
				<div class="area-container">
					<span></span>
					<span id="gobutton" class="button">Start</span>
				</div>
			</div>

			<div class="clr"></div>

		</div>

		<div id="ftpdialog" style="display:none;">
			<p class="instructions alert alert-info">Click on a directory to navigate into it. Click on OK to select that directory, Cancel to abort the procedure.</p>
			<div class="error alert alert-error" id="ftpBrowserErrorContainer">
				<h3>An error occurred</h3>
				<p id="ftpBrowserError"></p>
			</div>
			<ul id="ak_crumbs" class="breadcrumb"></ul>
			<div class="row-fluid">
				<div class="span12">
					<table id="ftpBrowserFolderList" class="table table-striped">
					</table>
				</div>
			</div>
		</div>
	</div>

	<div id="page2" style="display: none;">
		<div id="page2a">
			<div class="circle">5</div>
			<h2>Extracting</h2>
			<div class="area-container">
				<div id="warn-not-close">Do not close this window while the extraction is in progress</div>
				<div id="progressbar">
					<div id="progressbar-inner" style="width: 0%;">&nbsp;</div>
				</div>
				<div id="currentFile"></div>
			</div>
		</div>

		<div id="extractionComplete" style="display: none">
			<div class="circle">6</div>
			<h2>Restoration and Clean Up</h2>
			<div id="runInstaller" class="button">Run the Installer</div>
			<div id="runCleanup" class="button" style="display:none">Clean Up</div>
			<div id="gotoSite" class="button" style="display:none">Visit your site's front-end</div>
			<div id="gotoAdministrator" class="button" style="display:none">Visit your site's back-end</div>
			<div id="gotoPostRestorationRroubleshooting" style="display:none">
				<a href="https://www.akeebabackup.com/documentation/troubleshooter/post-restoration.html" target="_blank">Something not working after the restoration? Click here for troubleshooting instructions.</a>
			</div>
		</div>

		<div id="warningsBox" style="display: none;">
			<div id="warningsHeader">
				<h2>Extraction Warnings</h2>
			</div>
			<div id="warningsContainer">
				<div id="warnings"></div>
			</div>
		</div>

		<div id="error" style="display: none;">
			<h3>An error occured</h3>
			<p id="errorMessage"></p>
			<div id="gotoStart" class="button">Start over</div>
			<div>
				<a href="https://www.akeebabackup.com/documentation/troubleshooter/kscantextract.html" target="_blank">Can't get it to work? Click me!</a>
			</div>
		</div>
	</div>

	<div id="footer">
		<div class="copyright">Copyright © 2008–2013 <a href="http://www.akeebabackup.com">Nicholas K.
				Dionysopoulos / Akeeba Backup</a>. All legal rights reserved.<br>

			This program is free software: you can redistribute it and/or modify it under the terms of
			the <a href="http://www.gnu.org/gpl-3.htmlhttp://www.gnu.org/copyleft/gpl.html">GNU General
				Public License</a> as published by the Free Software Foundation, either version 3 of the License,
			or (at your option) any later version.<br>
			Design credits: <a href="http://internet-inspired.com/">Internet Inspired</a>, slightly modified by AkeebaBackup.com
		</div>
	</div>

	</div>

	
	
</body></html>

Original PHP code

<?php

/**
 * Akeeba Kickstart
 * A JSON-powered archive extraction tool
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

/*
    Akeeba Kickstart - The server-side archive extraction wizard
    Copyright (C) 2008-2013  Nicholas K. Dionysopoulos / AkeebaBackup.com

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

define('KICKSTART',1);
define('VERSION', '4.1.1');
define('KICKSTARTPRO', '0');
// Uncomment the following line to enable Kickstart's debug mode
//define('KSDEBUG', 1);

// Used during development
if (!defined('KSDEBUG') && isset($_SERVER) && isset($_SERVER['HTTP_HOST']) && (strpos($_SERVER['HTTP_HOST'], 'local.web') !== false))
{
	define('KSDEBUG', 1);
}

define('KSWINDOWS', substr(PHP_OS, 0, 3) == 'WIN');

if(!defined('KSROOTDIR'))
{
	define('KSROOTDIR', dirname(__FILE__));
}

if(defined('KSDEBUG')) {
	ini_set('error_log', KSROOTDIR.'/kickstart_error_log' );
	if(file_exists(KSROOTDIR.'/kickstart_error_log')) {
		@unlink(KSROOTDIR.'/kickstart_error_log');
	}
	error_reporting(E_ALL | E_STRICT);
} else {
	@error_reporting(E_NONE);
}

// ==========================================================================================
// IIS missing REQUEST_URI workaround
// ==========================================================================================

/*
 * Based REQUEST_URI for IIS Servers 1.0 by NeoSmart Technologies
 * The proper method to solve IIS problems is to take a look at this:
 * http://neosmart.net/dl.php?id=7
 */

//This file should be located in the same directory as php.exe or php5isapi.dll

if (!isset($_SERVER['REQUEST_URI']))
{
	if (isset($_SERVER['HTTP_REQUEST_URI']))
	{
		$_SERVER['REQUEST_URI'] = $_SERVER['HTTP_REQUEST_URI'];
		//Good to go!
	}
	else
	{
		//Someone didn't follow the instructions!
		if(isset($_SERVER['SCRIPT_NAME']))
		$_SERVER['HTTP_REQUEST_URI'] = $_SERVER['SCRIPT_NAME'];
		else
		$_SERVER['HTTP_REQUEST_URI'] = $_SERVER['PHP_SELF'];
		if($_SERVER['QUERY_STRING']){
			$_SERVER['HTTP_REQUEST_URI'] .=  '?' . $_SERVER['QUERY_STRING'];
		}
		//WARNING: This is a workaround!
		//For guaranteed compatibility, HTTP_REQUEST_URI *MUST* be defined!
		//See product documentation for instructions!
		$_SERVER['REQUEST_URI'] = $_SERVER['HTTP_REQUEST_URI'];
	}
}

// Define the cacert.pem location, if it exists
$cacertpem = KSROOTDIR . '/cacert.pem';
if(is_file($cacertpem)) {
	if(is_readable($cacertpem)) {
		define('AKEEBA_CACERT_PEM', $cacertpem);
	}
}
unset($cacertpem);

// Loads other PHP files containing extra Kickstart features
$dh = @opendir(KSROOTDIR);
if($dh === false) return;
while($filename = readdir($dh)) {
	if(!is_file($filename)) continue;
	if(substr($filename, 0, 10) != 'kickstart.') continue;
	if(substr($filename, -4) != '.php') continue;
	if($filename == 'kickstart.php') continue;
	include_once $filename;
}



/**
 * Akeeba Restore
 * A JSON-powered JPA, JPS and ZIP archive extraction library
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / Akeeba Ltd.
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

define('_AKEEBA_RESTORATION', 1);
defined('DS') or define('DS', DIRECTORY_SEPARATOR);

// Unarchiver run states
define('AK_STATE_NOFILE', 0); // File header not read yet
define('AK_STATE_HEADER', 1); // File header read; ready to process data
define('AK_STATE_DATA', 2); // Processing file data
define('AK_STATE_DATAREAD', 3); // Finished processing file data; ready to post-process
define('AK_STATE_POSTPROC', 4); // Post-processing
define('AK_STATE_DONE', 5); // Done with post-processing

/* Windows system detection */
if (!defined('_AKEEBA_IS_WINDOWS'))
{
	if (function_exists('php_uname'))
	{
		define('_AKEEBA_IS_WINDOWS', stristr(php_uname(), 'windows'));
	}
	else
	{
		define('_AKEEBA_IS_WINDOWS', DIRECTORY_SEPARATOR == '\\');
	}
}

// Get the file's root
if (!defined('KSROOTDIR'))
{
	define('KSROOTDIR', dirname(__FILE__));
}
if (!defined('KSLANGDIR'))
{
	define('KSLANGDIR', KSROOTDIR);
}

// Make sure the locale is correct for basename() to work
if (function_exists('setlocale'))
{
	@setlocale(LC_ALL, 'en_US.UTF8');
}

// fnmatch not available on non-POSIX systems
// Thanks to soywiz@php.net for this usefull alternative function [http://gr2.php.net/fnmatch]
if (!function_exists('fnmatch'))
{
	function fnmatch($pattern, $string)
	{
		return @preg_match(
			'/^' . strtr(addcslashes($pattern, '/\\.+^$(){}=!<>|'),
				array('*' => '.*', '?' => '.?')) . '$/i', $string
		);
	}
}

// Unicode-safe binary data length function
if (!function_exists('akstringlen'))
{
	if (function_exists('mb_strlen'))
	{
		function akstringlen($string)
		{
			return mb_strlen($string, '8bit');
		}
	}
	else
	{
		function akstringlen($string)
		{
			return strlen($string);
		}
	}
}

/**
 * Gets a query parameter from GET or POST data
 *
 * @param $key
 * @param $default
 */
function getQueryParam($key, $default = null)
{
	$value = $default;

	if (array_key_exists($key, $_REQUEST))
	{
		$value = $_REQUEST[$key];
	}

	if (get_magic_quotes_gpc() && !is_null($value))
	{
		$value = stripslashes($value);
	}

	return $value;
}

// Debugging function
function debugMsg($msg)
{
	if (!defined('KSDEBUG'))
	{
		return;
	}

	$fp = fopen('debug.txt', 'at');

	fwrite($fp, $msg . "\n");
	fclose($fp);
}

/**
 * Akeeba Restore
 * A JSON-powered JPA, JPS and ZIP archive extraction library
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / Akeeba Ltd.
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

/**
 * Akeeba Backup's JSON compatibility layer
 *
 * On systems where json_encode and json_decode are not available, Akeeba
 * Backup will attempt to use PEAR's Services_JSON library to emulate them.
 * A copy of this library is included in this file and will be used if and
 * only if it isn't already loaded, e.g. due to PEAR's auto-loading, or a
 * 3PD extension loading it for its own purposes.
 */

/**
 * Converts to and from JSON format.
 *
 * JSON (JavaScript Object Notation) is a lightweight data-interchange
 * format. It is easy for humans to read and write. It is easy for machines
 * to parse and generate. It is based on a subset of the JavaScript
 * Programming Language, Standard ECMA-262 3rd Edition - December 1999.
 * This feature can also be found in  Python. JSON is a text format that is
 * completely language independent but uses conventions that are familiar
 * to programmers of the C-family of languages, including C, C++, C#, Java,
 * JavaScript, Perl, TCL, and many others. These properties make JSON an
 * ideal data-interchange language.
 *
 * This package provides a simple encoder and decoder for JSON notation. It
 * is intended for use with client-side Javascript applications that make
 * use of HTTPRequest to perform server communication functions - data can
 * be encoded into JSON notation for use in a client-side javascript, or
 * decoded from incoming Javascript requests. JSON format is native to
 * Javascript, and can be directly eval()'ed with no further parsing
 * overhead
 *
 * All strings should be in ASCII or UTF-8 format!
 *
 * LICENSE: Redistribution and use in source and binary forms, with or
 * without modification, are permitted provided that the following
 * conditions are met: Redistributions of source code must retain the
 * above copyright notice, this list of conditions and the following
 * disclaimer. Redistributions in binary form must reproduce the above
 * copyright notice, this list of conditions and the following disclaimer
 * in the documentation and/or other materials provided with the
 * distribution.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
 * NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 *
 * @category
 * @package     Services_JSON
 * @author      Michal Migurski <mike-json@teczno.com>
 * @author      Matt Knapp <mdknapp[at]gmail[dot]com>
 * @author      Brett Stimmerman <brettstimmerman[at]gmail[dot]com>
 * @copyright   2005 Michal Migurski
 * @version     CVS: $Id: restore.php 612 2011-05-19 08:26:26Z nikosdion $
 * @license     http://www.opensource.org/licenses/bsd-license.php
 * @link        http://pear.php.net/pepr/pepr-proposal-show.php?id=198
 */

if(!defined('JSON_FORCE_OBJECT'))
{
	define('JSON_FORCE_OBJECT', 1);
}

if(!defined('SERVICES_JSON_SLICE'))
{
	/**
	 * Marker constant for Services_JSON::decode(), used to flag stack state
	 */
	define('SERVICES_JSON_SLICE',   1);

	/**
	 * Marker constant for Services_JSON::decode(), used to flag stack state
	 */
	define('SERVICES_JSON_IN_STR',  2);

	/**
	 * Marker constant for Services_JSON::decode(), used to flag stack state
	 */
	define('SERVICES_JSON_IN_ARR',  3);

	/**
	 * Marker constant for Services_JSON::decode(), used to flag stack state
	 */
	define('SERVICES_JSON_IN_OBJ',  4);

	/**
	 * Marker constant for Services_JSON::decode(), used to flag stack state
	 */
	define('SERVICES_JSON_IN_CMT', 5);

	/**
	 * Behavior switch for Services_JSON::decode()
	 */
	define('SERVICES_JSON_LOOSE_TYPE', 16);

	/**
	 * Behavior switch for Services_JSON::decode()
	 */
	define('SERVICES_JSON_SUPPRESS_ERRORS', 32);
}

/**
 * Converts to and from JSON format.
 *
 * Brief example of use:
 *
 * <code>
 * // create a new instance of Services_JSON
 * $json = new Services_JSON();
 *
 * // convert a complexe value to JSON notation, and send it to the browser
 * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4)));
 * $output = $json->encode($value);
 *
 * print($output);
 * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]]
 *
 * // accept incoming POST data, assumed to be in JSON notation
 * $input = file_get_contents('php://input', 1000000);
 * $value = $json->decode($input);
 * </code>
 */
if(!class_exists('Akeeba_Services_JSON'))
{
	class Akeeba_Services_JSON
	{
	   /**
	    * constructs a new JSON instance
	    *
	    * @param    int     $use    object behavior flags; combine with boolean-OR
	    *
	    *                           possible values:
	    *                           - SERVICES_JSON_LOOSE_TYPE:  loose typing.
	    *                                   "{...}" syntax creates associative arrays
	    *                                   instead of objects in decode().
	    *                           - SERVICES_JSON_SUPPRESS_ERRORS:  error suppression.
	    *                                   Values which can't be encoded (e.g. resources)
	    *                                   appear as NULL instead of throwing errors.
	    *                                   By default, a deeply-nested resource will
	    *                                   bubble up with an error, so all return values
	    *                                   from encode() should be checked with isError()
	    */
	    function __construct($use = 0)
	    {
	        $this->use = $use;
	    }

	   /**
	    * convert a string from one UTF-16 char to one UTF-8 char
	    *
	    * Normally should be handled by mb_convert_encoding, but
	    * provides a slower PHP-only method for installations
	    * that lack the multibye string extension.
	    *
	    * @param    string  $utf16  UTF-16 character
	    * @return   string  UTF-8 character
	    * @access   private
	    */
	    function utf162utf8($utf16)
	    {
	        // oh please oh please oh please oh please oh please
	        if(function_exists('mb_convert_encoding')) {
	            return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');
	        }

	        $bytes = (ord($utf16{0}) << 8) | ord($utf16{1});

	        switch(true) {
	            case ((0x7F & $bytes) == $bytes):
	                // this case should never be reached, because we are in ASCII range
	                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
	                return chr(0x7F & $bytes);

	            case (0x07FF & $bytes) == $bytes:
	                // return a 2-byte UTF-8 character
	                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
	                return chr(0xC0 | (($bytes >> 6) & 0x1F))
	                     . chr(0x80 | ($bytes & 0x3F));

	            case (0xFFFF & $bytes) == $bytes:
	                // return a 3-byte UTF-8 character
	                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
	                return chr(0xE0 | (($bytes >> 12) & 0x0F))
	                     . chr(0x80 | (($bytes >> 6) & 0x3F))
	                     . chr(0x80 | ($bytes & 0x3F));
	        }

	        // ignoring UTF-32 for now, sorry
	        return '';
	    }

	   /**
	    * convert a string from one UTF-8 char to one UTF-16 char
	    *
	    * Normally should be handled by mb_convert_encoding, but
	    * provides a slower PHP-only method for installations
	    * that lack the multibye string extension.
	    *
	    * @param    string  $utf8   UTF-8 character
	    * @return   string  UTF-16 character
	    * @access   private
	    */
	    function utf82utf16($utf8)
	    {
	        // oh please oh please oh please oh please oh please
	        if(function_exists('mb_convert_encoding')) {
	            return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
	        }

	        switch(strlen($utf8)) {
	            case 1:
	                // this case should never be reached, because we are in ASCII range
	                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
	                return $utf8;

	            case 2:
	                // return a UTF-16 character from a 2-byte UTF-8 char
	                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
	                return chr(0x07 & (ord($utf8{0}) >> 2))
	                     . chr((0xC0 & (ord($utf8{0}) << 6))
	                         | (0x3F & ord($utf8{1})));

	            case 3:
	                // return a UTF-16 character from a 3-byte UTF-8 char
	                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
	                return chr((0xF0 & (ord($utf8{0}) << 4))
	                         | (0x0F & (ord($utf8{1}) >> 2)))
	                     . chr((0xC0 & (ord($utf8{1}) << 6))
	                         | (0x7F & ord($utf8{2})));
	        }

	        // ignoring UTF-32 for now, sorry
	        return '';
	    }

	   /**
	    * encodes an arbitrary variable into JSON format
	    *
	    * @param    mixed   $var    any number, boolean, string, array, or object to be encoded.
	    *                           see argument 1 to Services_JSON() above for array-parsing behavior.
	    *                           if var is a strng, note that encode() always expects it
	    *                           to be in ASCII or UTF-8 format!
	    *
	    * @return   mixed   JSON string representation of input var or an error if a problem occurs
	    * @access   public
	    */
	    function encode($var)
	    {
	        switch (gettype($var)) {
	            case 'boolean':
	                return $var ? 'true' : 'false';

	            case 'NULL':
	                return 'null';

	            case 'integer':
	                return (int) $var;

	            case 'double':
	            case 'float':
	                return (float) $var;

	            case 'string':
	                // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
	                $ascii = '';
	                $strlen_var = strlen($var);

	               /*
	                * Iterate over every character in the string,
	                * escaping with a slash or encoding to UTF-8 where necessary
	                */
	                for ($c = 0; $c < $strlen_var; ++$c) {

	                    $ord_var_c = ord($var{$c});

	                    switch (true) {
	                        case $ord_var_c == 0x08:
	                            $ascii .= '\b';
	                            break;
	                        case $ord_var_c == 0x09:
	                            $ascii .= '\t';
	                            break;
	                        case $ord_var_c == 0x0A:
	                            $ascii .= '\n';
	                            break;
	                        case $ord_var_c == 0x0C:
	                            $ascii .= '\f';
	                            break;
	                        case $ord_var_c == 0x0D:
	                            $ascii .= '\r';
	                            break;

	                        case $ord_var_c == 0x22:
	                        case $ord_var_c == 0x2F:
	                        case $ord_var_c == 0x5C:
	                            // double quote, slash, slosh
	                            $ascii .= '\\'.$var{$c};
	                            break;

	                        case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
	                            // characters U-00000000 - U-0000007F (same as ASCII)
	                            $ascii .= $var{$c};
	                            break;

	                        case (($ord_var_c & 0xE0) == 0xC0):
	                            // characters U-00000080 - U-000007FF, mask 110XXXXX
	                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
	                            $char = pack('C*', $ord_var_c, ord($var{$c + 1}));
	                            $c += 1;
	                            $utf16 = $this->utf82utf16($char);
	                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
	                            break;

	                        case (($ord_var_c & 0xF0) == 0xE0):
	                            // characters U-00000800 - U-0000FFFF, mask 1110XXXX
	                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
	                            $char = pack('C*', $ord_var_c,
	                                         ord($var{$c + 1}),
	                                         ord($var{$c + 2}));
	                            $c += 2;
	                            $utf16 = $this->utf82utf16($char);
	                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
	                            break;

	                        case (($ord_var_c & 0xF8) == 0xF0):
	                            // characters U-00010000 - U-001FFFFF, mask 11110XXX
	                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
	                            $char = pack('C*', $ord_var_c,
	                                         ord($var{$c + 1}),
	                                         ord($var{$c + 2}),
	                                         ord($var{$c + 3}));
	                            $c += 3;
	                            $utf16 = $this->utf82utf16($char);
	                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
	                            break;

	                        case (($ord_var_c & 0xFC) == 0xF8):
	                            // characters U-00200000 - U-03FFFFFF, mask 111110XX
	                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
	                            $char = pack('C*', $ord_var_c,
	                                         ord($var{$c + 1}),
	                                         ord($var{$c + 2}),
	                                         ord($var{$c + 3}),
	                                         ord($var{$c + 4}));
	                            $c += 4;
	                            $utf16 = $this->utf82utf16($char);
	                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
	                            break;

	                        case (($ord_var_c & 0xFE) == 0xFC):
	                            // characters U-04000000 - U-7FFFFFFF, mask 1111110X
	                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
	                            $char = pack('C*', $ord_var_c,
	                                         ord($var{$c + 1}),
	                                         ord($var{$c + 2}),
	                                         ord($var{$c + 3}),
	                                         ord($var{$c + 4}),
	                                         ord($var{$c + 5}));
	                            $c += 5;
	                            $utf16 = $this->utf82utf16($char);
	                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
	                            break;
	                    }
	                }

	                return '"'.$ascii.'"';

	            case 'array':
	               /*
	                * As per JSON spec if any array key is not an integer
	                * we must treat the the whole array as an object. We
	                * also try to catch a sparsely populated associative
	                * array with numeric keys here because some JS engines
	                * will create an array with empty indexes up to
	                * max_index which can cause memory issues and because
	                * the keys, which may be relevant, will be remapped
	                * otherwise.
	                *
	                * As per the ECMA and JSON specification an object may
	                * have any string as a property. Unfortunately due to
	                * a hole in the ECMA specification if the key is a
	                * ECMA reserved word or starts with a digit the
	                * parameter is only accessible using ECMAScript's
	                * bracket notation.
	                */

	                // treat as a JSON object
	                if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {
	                    $properties = array_map(array($this, 'name_value'),
	                                            array_keys($var),
	                                            array_values($var));

	                    foreach($properties as $property) {
	                        if(Akeeba_Services_JSON::isError($property)) {
	                            return $property;
	                        }
	                    }

	                    return '{' . join(',', $properties) . '}';
	                }

	                // treat it like a regular array
	                $elements = array_map(array($this, 'encode'), $var);

	                foreach($elements as $element) {
	                    if(Akeeba_Services_JSON::isError($element)) {
	                        return $element;
	                    }
	                }

	                return '[' . join(',', $elements) . ']';

	            case 'object':
	                $vars = get_object_vars($var);

	                $properties = array_map(array($this, 'name_value'),
	                                        array_keys($vars),
	                                        array_values($vars));

	                foreach($properties as $property) {
	                    if(Akeeba_Services_JSON::isError($property)) {
	                        return $property;
	                    }
	                }

	                return '{' . join(',', $properties) . '}';

	            default:
	                return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS)
	                    ? 'null'
	                    : new Akeeba_Services_JSON_Error(gettype($var)." can not be encoded as JSON string");
	        }
	    }

	   /**
	    * array-walking function for use in generating JSON-formatted name-value pairs
	    *
	    * @param    string  $name   name of key to use
	    * @param    mixed   $value  reference to an array element to be encoded
	    *
	    * @return   string  JSON-formatted name-value pair, like '"name":value'
	    * @access   private
	    */
	    function name_value($name, $value)
	    {
	        $encoded_value = $this->encode($value);

	        if(Akeeba_Services_JSON::isError($encoded_value)) {
	            return $encoded_value;
	        }

	        return $this->encode(strval($name)) . ':' . $encoded_value;
	    }

	   /**
	    * reduce a string by removing leading and trailing comments and whitespace
	    *
	    * @param    $str    string      string value to strip of comments and whitespace
	    *
	    * @return   string  string value stripped of comments and whitespace
	    * @access   private
	    */
	    function reduce_string($str)
	    {
	        $str = preg_replace(array(

	                // eliminate single line comments in '// ...' form
	                '#^\s*//(.+)$#m',

	                // eliminate multi-line comments in '/* ... */' form, at start of string
	                '#^\s*/\*(.+)\*/#Us',

	                // eliminate multi-line comments in '/* ... */' form, at end of string
	                '#/\*(.+)\*/\s*$#Us'

	            ), '', $str);

	        // eliminate extraneous space
	        return trim($str);
	    }

	   /**
	    * decodes a JSON string into appropriate variable
	    *
	    * @param    string  $str    JSON-formatted string
	    *
	    * @return   mixed   number, boolean, string, array, or object
	    *                   corresponding to given JSON input string.
	    *                   See argument 1 to Akeeba_Services_JSON() above for object-output behavior.
	    *                   Note that decode() always returns strings
	    *                   in ASCII or UTF-8 format!
	    * @access   public
	    */
	    function decode($str)
	    {
	        $str = $this->reduce_string($str);

	        switch (strtolower($str)) {
	            case 'true':
	                return true;

	            case 'false':
	                return false;

	            case 'null':
	                return null;

	            default:
	                $m = array();

	                if (is_numeric($str)) {
	                    // Lookie-loo, it's a number

	                    // This would work on its own, but I'm trying to be
	                    // good about returning integers where appropriate:
	                    // return (float)$str;

	                    // Return float or int, as appropriate
	                    return ((float)$str == (integer)$str)
	                        ? (integer)$str
	                        : (float)$str;

	                } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) {
	                    // STRINGS RETURNED IN UTF-8 FORMAT
	                    $delim = substr($str, 0, 1);
	                    $chrs = substr($str, 1, -1);
	                    $utf8 = '';
	                    $strlen_chrs = strlen($chrs);

	                    for ($c = 0; $c < $strlen_chrs; ++$c) {

	                        $substr_chrs_c_2 = substr($chrs, $c, 2);
	                        $ord_chrs_c = ord($chrs{$c});

	                        switch (true) {
	                            case $substr_chrs_c_2 == '\b':
	                                $utf8 .= chr(0x08);
	                                ++$c;
	                                break;
	                            case $substr_chrs_c_2 == '\t':
	                                $utf8 .= chr(0x09);
	                                ++$c;
	                                break;
	                            case $substr_chrs_c_2 == '\n':
	                                $utf8 .= chr(0x0A);
	                                ++$c;
	                                break;
	                            case $substr_chrs_c_2 == '\f':
	                                $utf8 .= chr(0x0C);
	                                ++$c;
	                                break;
	                            case $substr_chrs_c_2 == '\r':
	                                $utf8 .= chr(0x0D);
	                                ++$c;
	                                break;

	                            case $substr_chrs_c_2 == '\\"':
	                            case $substr_chrs_c_2 == '\\\'':
	                            case $substr_chrs_c_2 == '\\\\':
	                            case $substr_chrs_c_2 == '\\/':
	                                if (($delim == '"' && $substr_chrs_c_2 != '\\\'') ||
	                                   ($delim == "'" && $substr_chrs_c_2 != '\\"')) {
	                                    $utf8 .= $chrs{++$c};
	                                }
	                                break;

	                            case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)):
	                                // single, escaped unicode character
	                                $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2)))
	                                       . chr(hexdec(substr($chrs, ($c + 4), 2)));
	                                $utf8 .= $this->utf162utf8($utf16);
	                                $c += 5;
	                                break;

	                            case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F):
	                                $utf8 .= $chrs{$c};
	                                break;

	                            case ($ord_chrs_c & 0xE0) == 0xC0:
	                                // characters U-00000080 - U-000007FF, mask 110XXXXX
	                                //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
	                                $utf8 .= substr($chrs, $c, 2);
	                                ++$c;
	                                break;

	                            case ($ord_chrs_c & 0xF0) == 0xE0:
	                                // characters U-00000800 - U-0000FFFF, mask 1110XXXX
	                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
	                                $utf8 .= substr($chrs, $c, 3);
	                                $c += 2;
	                                break;

	                            case ($ord_chrs_c & 0xF8) == 0xF0:
	                                // characters U-00010000 - U-001FFFFF, mask 11110XXX
	                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
	                                $utf8 .= substr($chrs, $c, 4);
	                                $c += 3;
	                                break;

	                            case ($ord_chrs_c & 0xFC) == 0xF8:
	                                // characters U-00200000 - U-03FFFFFF, mask 111110XX
	                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
	                                $utf8 .= substr($chrs, $c, 5);
	                                $c += 4;
	                                break;

	                            case ($ord_chrs_c & 0xFE) == 0xFC:
	                                // characters U-04000000 - U-7FFFFFFF, mask 1111110X
	                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
	                                $utf8 .= substr($chrs, $c, 6);
	                                $c += 5;
	                                break;

	                        }

	                    }

	                    return $utf8;

	                } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) {
	                    // array, or object notation

	                    if ($str{0} == '[') {
	                        $stk = array(SERVICES_JSON_IN_ARR);
	                        $arr = array();
	                    } else {
	                        if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
	                            $stk = array(SERVICES_JSON_IN_OBJ);
	                            $obj = array();
	                        } else {
	                            $stk = array(SERVICES_JSON_IN_OBJ);
	                            $obj = new stdClass();
	                        }
	                    }

	                    array_push($stk, array('what'  => SERVICES_JSON_SLICE,
	                                           'where' => 0,
	                                           'delim' => false));

	                    $chrs = substr($str, 1, -1);
	                    $chrs = $this->reduce_string($chrs);

	                    if ($chrs == '') {
	                        if (reset($stk) == SERVICES_JSON_IN_ARR) {
	                            return $arr;

	                        } else {
	                            return $obj;

	                        }
	                    }

	                    //print("\nparsing {$chrs}\n");

	                    $strlen_chrs = strlen($chrs);

	                    for ($c = 0; $c <= $strlen_chrs; ++$c) {

	                        $top = end($stk);
	                        $substr_chrs_c_2 = substr($chrs, $c, 2);

	                        if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) {
	                            // found a comma that is not inside a string, array, etc.,
	                            // OR we've reached the end of the character list
	                            $slice = substr($chrs, $top['where'], ($c - $top['where']));
	                            array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false));
	                            //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");

	                            if (reset($stk) == SERVICES_JSON_IN_ARR) {
	                                // we are in an array, so just push an element onto the stack
	                                array_push($arr, $this->decode($slice));

	                            } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
	                                // we are in an object, so figure
	                                // out the property name and set an
	                                // element in an associative array,
	                                // for now
	                                $parts = array();

	                                if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
	                                    // "name":value pair
	                                    $key = $this->decode($parts[1]);
	                                    $val = $this->decode($parts[2]);

	                                    if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
	                                        $obj[$key] = $val;
	                                    } else {
	                                        $obj->$key = $val;
	                                    }
	                                } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
	                                    // name:value pair, where name is unquoted
	                                    $key = $parts[1];
	                                    $val = $this->decode($parts[2]);

	                                    if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
	                                        $obj[$key] = $val;
	                                    } else {
	                                        $obj->$key = $val;
	                                    }
	                                }

	                            }

	                        } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) {
	                            // found a quote, and we are not inside a string
	                            array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c}));
	                            //print("Found start of string at {$c}\n");

	                        } elseif (($chrs{$c} == $top['delim']) &&
	                                 ($top['what'] == SERVICES_JSON_IN_STR) &&
	                                 ((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1)) {
	                            // found a quote, we're in a string, and it's not escaped
	                            // we know that it's not escaped becase there is _not_ an
	                            // odd number of backslashes at the end of the string so far
	                            array_pop($stk);
	                            //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n");

	                        } elseif (($chrs{$c} == '[') &&
	                                 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
	                            // found a left-bracket, and we are in an array, object, or slice
	                            array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false));
	                            //print("Found start of array at {$c}\n");

	                        } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) {
	                            // found a right-bracket, and we're in an array
	                            array_pop($stk);
	                            //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");

	                        } elseif (($chrs{$c} == '{') &&
	                                 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
	                            // found a left-brace, and we are in an array, object, or slice
	                            array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false));
	                            //print("Found start of object at {$c}\n");

	                        } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) {
	                            // found a right-brace, and we're in an object
	                            array_pop($stk);
	                            //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");

	                        } elseif (($substr_chrs_c_2 == '/*') &&
	                                 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
	                            // found a comment start, and we are in an array, object, or slice
	                            array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false));
	                            $c++;
	                            //print("Found start of comment at {$c}\n");

	                        } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) {
	                            // found a comment end, and we're in one now
	                            array_pop($stk);
	                            $c++;

	                            for ($i = $top['where']; $i <= $c; ++$i)
	                                $chrs = substr_replace($chrs, ' ', $i, 1);

	                            //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");

	                        }

	                    }

	                    if (reset($stk) == SERVICES_JSON_IN_ARR) {
	                        return $arr;

	                    } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
	                        return $obj;

	                    }

	                }
	        }
	    }

	    function isError($data, $code = null)
	    {
	        if (class_exists('pear')) {
	            return PEAR::isError($data, $code);
	        } elseif (is_object($data) && (get_class($data) == 'services_json_error' ||
	                                 is_subclass_of($data, 'services_json_error'))) {
	            return true;
	        }

	        return false;
	    }
	}

    class Akeeba_Services_JSON_Error
    {
        function __construct($message = 'unknown error', $code = null,
                                     $mode = null, $options = null, $userinfo = null)
        {

        }
    }
}

if(!function_exists('json_encode'))
{
	function json_encode($value, $options = 0) {
		$flags = SERVICES_JSON_LOOSE_TYPE;
		if( $options & JSON_FORCE_OBJECT ) $flags = 0;
		$encoder = new Akeeba_Services_JSON($flags);
		return $encoder->encode($value);
	}
}

if(!function_exists('json_decode'))
{
	function json_decode($value, $assoc = false)
	{
		$flags = 0;
		if($assoc) $flags = SERVICES_JSON_LOOSE_TYPE;
		$decoder = new Akeeba_Services_JSON($flags);
		return $decoder->decode($value);
	}
}

/**
 * Akeeba Restore
 * A JSON-powered JPA, JPS and ZIP archive extraction library
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / Akeeba Ltd.
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

/**
 * The base class of Akeeba Engine objects. Allows for error and warnings logging
 * and propagation. Largely based on the Joomla! 1.5 JObject class.
 */
abstract class AKAbstractObject
{
	/** @var	array	An array of errors */
	private $_errors = array();

	/** @var	array	The queue size of the $_errors array. Set to 0 for infinite size. */
	protected $_errors_queue_size = 0;

	/** @var	array	An array of warnings */
	private $_warnings = array();

	/** @var	array	The queue size of the $_warnings array. Set to 0 for infinite size. */
	protected $_warnings_queue_size = 0;

	/**
	 * Public constructor, makes sure we are instanciated only by the factory class
	 */
	public function __construct()
	{
		/*
		// Assisted Singleton pattern
		if(function_exists('debug_backtrace'))
		{
			$caller=debug_backtrace();
			if(
				($caller[1]['class'] != 'AKFactory') &&
				($caller[2]['class'] != 'AKFactory') &&
				($caller[3]['class'] != 'AKFactory') &&
				($caller[4]['class'] != 'AKFactory')
			) {
				var_dump(debug_backtrace());
				trigger_error("You can't create direct descendants of ".__CLASS__, E_USER_ERROR);
			}
		}
		*/
	}

	/**
	 * Get the most recent error message
	 * @param	integer	$i Optional error index
	 * @return	string	Error message
	 */
	public function getError($i = null)
	{
		return $this->getItemFromArray($this->_errors, $i);
	}

	/**
	 * Return all errors, if any
	 * @return	array	Array of error messages
	 */
	public function getErrors()
	{
		return $this->_errors;
	}

	/**
	 * Add an error message
	 * @param	string $error Error message
	 */
	public function setError($error)
	{
		if($this->_errors_queue_size > 0)
		{
			if(count($this->_errors) >= $this->_errors_queue_size)
			{
				array_shift($this->_errors);
			}
		}
		array_push($this->_errors, $error);
	}

	/**
	 * Resets all error messages
	 */
	public function resetErrors()
	{
		$this->_errors = array();
	}

	/**
	 * Get the most recent warning message
	 * @param	integer	$i Optional warning index
	 * @return	string	Error message
	 */
	public function getWarning($i = null)
	{
		return $this->getItemFromArray($this->_warnings, $i);
	}

	/**
	 * Return all warnings, if any
	 * @return	array	Array of error messages
	 */
	public function getWarnings()
	{
		return $this->_warnings;
	}

	/**
	 * Add an error message
	 * @param	string $error Error message
	 */
	public function setWarning($warning)
	{
		if($this->_warnings_queue_size > 0)
		{
			if(count($this->_warnings) >= $this->_warnings_queue_size)
			{
				array_shift($this->_warnings);
			}
		}

		array_push($this->_warnings, $warning);
	}

	/**
	 * Resets all warning messages
	 */
	public function resetWarnings()
	{
		$this->_warnings = array();
	}

	/**
	 * Propagates errors and warnings to a foreign object. The foreign object SHOULD
	 * implement the setError() and/or setWarning() methods but DOESN'T HAVE TO be of
	 * AKAbstractObject type. For example, this can even be used to propagate to a
	 * JObject instance in Joomla!. Propagated items will be removed from ourself.
	 * @param object $object The object to propagate errors and warnings to.
	 */
	public function propagateToObject(&$object)
	{
		// Skip non-objects
		if(!is_object($object)) return;

		if( method_exists($object,'setError') )
		{
			if(!empty($this->_errors))
			{
				foreach($this->_errors as $error)
				{
					$object->setError($error);
				}
				$this->_errors = array();
			}
		}

		if( method_exists($object,'setWarning') )
		{
			if(!empty($this->_warnings))
			{
				foreach($this->_warnings as $warning)
				{
					$object->setWarning($warning);
				}
				$this->_warnings = array();
			}
		}
	}

	/**
	 * Propagates errors and warnings from a foreign object. Each propagated list is
	 * then cleared on the foreign object, as long as it implements resetErrors() and/or
	 * resetWarnings() methods.
	 * @param object $object The object to propagate errors and warnings from
	 */
	public function propagateFromObject(&$object)
	{
		if( method_exists($object,'getErrors') )
		{
			$errors = $object->getErrors();
			if(!empty($errors))
			{
				foreach($errors as $error)
				{
					$this->setError($error);
				}
			}
			if(method_exists($object,'resetErrors'))
			{
				$object->resetErrors();
			}
		}

		if( method_exists($object,'getWarnings') )
		{
			$warnings = $object->getWarnings();
			if(!empty($warnings))
			{
				foreach($warnings as $warning)
				{
					$this->setWarning($warning);
				}
			}
			if(method_exists($object,'resetWarnings'))
			{
				$object->resetWarnings();
			}
		}
	}

	/**
	 * Sets the size of the error queue (acts like a LIFO buffer)
	 * @param int $newSize The new queue size. Set to 0 for infinite length.
	 */
	protected function setErrorsQueueSize($newSize = 0)
	{
		$this->_errors_queue_size = (int)$newSize;
	}

	/**
	 * Sets the size of the warnings queue (acts like a LIFO buffer)
	 * @param int $newSize The new queue size. Set to 0 for infinite length.
	 */
	protected function setWarningsQueueSize($newSize = 0)
	{
		$this->_warnings_queue_size = (int)$newSize;
	}

	/**
	 * Returns the last item of a LIFO string message queue, or a specific item
	 * if so specified.
	 * @param array $array An array of strings, holding messages
	 * @param int $i Optional message index
	 * @return mixed The message string, or false if the key doesn't exist
	 */
	private function getItemFromArray($array, $i = null)
	{
		// Find the item
		if ( $i === null) {
			// Default, return the last item
			$item = end($array);
		}
		else
		if ( ! array_key_exists($i, $array) ) {
			// If $i has been specified but does not exist, return false
			return false;
		}
		else
		{
			$item	= $array[$i];
		}

		return $item;
	}

}

/**
 * Akeeba Restore
 * A JSON-powered JPA, JPS and ZIP archive extraction library
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / Akeeba Ltd.
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

/**
 * The superclass of all Akeeba Kickstart parts. The "parts" are intelligent stateful
 * classes which perform a single procedure and have preparation, running and
 * finalization phases. The transition between phases is handled automatically by
 * this superclass' tick() final public method, which should be the ONLY public API
 * exposed to the rest of the Akeeba Engine.
 */
abstract class AKAbstractPart extends AKAbstractObject
{
	/**
	 * Indicates whether this part has finished its initialisation cycle
	 * @var boolean
	 */
	protected $isPrepared = false;

	/**
	 * Indicates whether this part has more work to do (it's in running state)
	 * @var boolean
	 */
	protected $isRunning = false;

	/**
	 * Indicates whether this part has finished its finalization cycle
	 * @var boolean
	 */
	protected $isFinished = false;

	/**
	 * Indicates whether this part has finished its run cycle
	 * @var boolean
	 */
	protected $hasRan = false;

	/**
	 * The name of the engine part (a.k.a. Domain), used in return table
	 * generation.
	 * @var string
	 */
	protected $active_domain = "";

	/**
	 * The step this engine part is in. Used verbatim in return table and
	 * should be set by the code in the _run() method.
	 * @var string
	 */
	protected $active_step = "";

	/**
	 * A more detailed description of the step this engine part is in. Used
	 * verbatim in return table and should be set by the code in the _run()
	 * method.
	 * @var string
	 */
	protected $active_substep = "";

	/**
	 * Any configuration variables, in the form of an array.
	 * @var array
	 */
	protected $_parametersArray = array();

	/** @var string The database root key */
	protected $databaseRoot = array();

	/** @var int Last reported warnings's position in array */
	private $warnings_pointer = -1;

	/** @var array An array of observers */
	protected $observers = array();

	/**
	 * Runs the preparation for this part. Should set _isPrepared
	 * to true
	 */
	abstract protected function _prepare();

	/**
	 * Runs the finalisation process for this part. Should set
	 * _isFinished to true.
	 */
	abstract protected function _finalize();

	/**
	 * Runs the main functionality loop for this part. Upon calling,
	 * should set the _isRunning to true. When it finished, should set
	 * the _hasRan to true. If an error is encountered, setError should
	 * be used.
	 */
	abstract protected function _run();

	/**
	 * Sets the BREAKFLAG, which instructs this engine part that the current step must break immediately,
	 * in fear of timing out.
	 */
	protected function setBreakFlag()
	{
		AKFactory::set('volatile.breakflag', true);
	}

	/**
	 * Sets the engine part's internal state, in an easy to use manner
	 *
	 * @param	string	$state			One of init, prepared, running, postrun, finished, error
	 * @param	string	$errorMessage	The reported error message, should the state be set to error
	 */
	protected function setState($state = 'init', $errorMessage='Invalid setState argument')
	{
		switch($state)
		{
			case 'init':
				$this->isPrepared = false;
				$this->isRunning  = false;
				$this->isFinished = false;
				$this->hasRun     = false;
				break;

			case 'prepared':
				$this->isPrepared = true;
				$this->isRunning  = false;
				$this->isFinished = false;
				$this->hasRun     = false;
				break;

			case 'running':
				$this->isPrepared = true;
				$this->isRunning  = true;
				$this->isFinished = false;
				$this->hasRun     = false;
				break;

			case 'postrun':
				$this->isPrepared = true;
				$this->isRunning  = false;
				$this->isFinished = false;
				$this->hasRun     = true;
				break;

			case 'finished':
				$this->isPrepared = true;
				$this->isRunning  = false;
				$this->isFinished = true;
				$this->hasRun     = false;
				break;

			case 'error':
			default:
				$this->setError($errorMessage);
				break;
		}
	}

	/**
	 * The public interface to an engine part. This method takes care for
	 * calling the correct method in order to perform the initialisation -
	 * run - finalisation cycle of operation and return a proper reponse array.
	 * @return	array	A Reponse Array
	 */
	final public function tick()
	{
		// Call the right action method, depending on engine part state
		switch( $this->getState() )
		{
			case "init":
				$this->_prepare();
				break;
			case "prepared":
				$this->_run();
				break;
			case "running":
				$this->_run();
				break;
			case "postrun":
				$this->_finalize();
				break;
		}

		// Send a Return Table back to the caller
		$out = $this->_makeReturnTable();
		return $out;
	}

	/**
	 * Returns a copy of the class's status array
	 * @return array
	 */
	public function getStatusArray()
	{
		return $this->_makeReturnTable();
	}

	/**
	 * Sends any kind of setup information to the engine part. Using this,
	 * we avoid passing parameters to the constructor of the class. These
	 * parameters should be passed as an indexed array and should be taken
	 * into account during the preparation process only. This function will
	 * set the error flag if it's called after the engine part is prepared.
	 *
	 * @param array $parametersArray The parameters to be passed to the
	 * engine part.
	 */
	final public function setup( $parametersArray )
	{
		if( $this->isPrepared )
		{
			$this->setState('error', "Can't modify configuration after the preparation of " . $this->active_domain);
		}
		else
		{
			$this->_parametersArray = $parametersArray;
			if(array_key_exists('root', $parametersArray))
			{
				$this->databaseRoot = $parametersArray['root'];
			}
		}
	}

	/**
	 * Returns the state of this engine part.
	 *
	 * @return string The state of this engine part. It can be one of
	 * error, init, prepared, running, postrun, finished.
	 */
	final public function getState()
	{
		if( $this->getError() )
		{
			return "error";
		}

		if( !($this->isPrepared) )
		{
			return "init";
		}

		if( !($this->isFinished) && !($this->isRunning) && !( $this->hasRun ) && ($this->isPrepared) )
		{
			return "prepared";
		}

		if ( !($this->isFinished) && $this->isRunning && !( $this->hasRun ) )
		{
			return "running";
		}

		if ( !($this->isFinished) && !($this->isRunning) && $this->hasRun )
		{
			return "postrun";
		}

		if ( $this->isFinished )
		{
			return "finished";
		}
	}

	/**
	 * Constructs a Response Array based on the engine part's state.
	 * @return array The Response Array for the current state
	 */
	final protected function _makeReturnTable()
	{
		// Get a list of warnings
		$warnings = $this->getWarnings();
		// Report only new warnings if there is no warnings queue size
		if( $this->_warnings_queue_size == 0 )
		{
			if( ($this->warnings_pointer > 0) && ($this->warnings_pointer < (count($warnings)) ) )
			{
				$warnings = array_slice($warnings, $this->warnings_pointer + 1);
				$this->warnings_pointer += count($warnings);
			}
			else
			{
				$this->warnings_pointer = count($warnings);
			}
		}

		$out =  array(
			'HasRun'	=> (!($this->isFinished)),
			'Domain'	=> $this->active_domain,
			'Step'		=> $this->active_step,
			'Substep'	=> $this->active_substep,
			'Error'		=> $this->getError(),
			'Warnings'	=> $warnings
		);

		return $out;
	}

	final protected function setDomain($new_domain)
	{
		$this->active_domain = $new_domain;
	}

	final public function getDomain()
	{
		return $this->active_domain;
	}

	final protected function setStep($new_step)
	{
		$this->active_step = $new_step;
	}

	final public function getStep()
	{
		return $this->active_step;
	}

	final protected function setSubstep($new_substep)
	{
		$this->active_substep = $new_substep;
	}

	final public function getSubstep()
	{
		return $this->active_substep;
	}

	/**
	 * Attaches an observer object
	 * @param AKAbstractPartObserver $obs
	 */
	function attach(AKAbstractPartObserver $obs) {
        $this->observers["$obs"] = $obs;
    }

	/**
	 * Dettaches an observer object
	 * @param AKAbstractPartObserver $obs
	 */
    function detach(AKAbstractPartObserver $obs) {
        delete($this->observers["$obs"]);
    }

    /**
     * Notifies observers each time something interesting happened to the part
     * @param mixed $message The event object
     */
	protected function notify($message) {
        foreach ($this->observers as $obs) {
            $obs->update($this, $message);
        }
    }
}

/**
 * Akeeba Restore
 * A JSON-powered JPA, JPS and ZIP archive extraction library
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / Akeeba Ltd.
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

/**
 * The base class of unarchiver classes
 */
abstract class AKAbstractUnarchiver extends AKAbstractPart
{
	/** @var string Archive filename */
	protected $filename = null;

	/** @var array List of the names of all archive parts */
	public $archiveList = array();

	/** @var int The total size of all archive parts */
	public $totalSize = array();

	/** @var integer Current archive part number */
	protected $currentPartNumber = -1;

	/** @var integer The offset inside the current part */
	protected $currentPartOffset = 0;

	/** @var bool Should I restore permissions? */
	protected $flagRestorePermissions = false;

	/** @var AKAbstractPostproc Post processing class */
	protected $postProcEngine = null;

	/** @var string Absolute path to prepend to extracted files */
	protected $addPath = '';

	/** @var array Which files to rename */
	public $renameFiles = array();

	/** @var array Which directories to rename */
	public $renameDirs = array();

	/** @var array Which files to skip */
	public $skipFiles = array();

	/** @var integer Chunk size for processing */
	protected $chunkSize = 524288;

	/** @var resource File pointer to the current archive part file */
	protected $fp = null;

	/** @var int Run state when processing the current archive file */
	protected $runState = null;

	/** @var stdClass File header data, as read by the readFileHeader() method */
	protected $fileHeader = null;

	/** @var int How much of the uncompressed data we've read so far */
	protected $dataReadLength = 0;

	/** @var array Unwriteable files in these directories are always ignored and do not cause errors when not extracted */
	protected $ignoreDirectories = array();

	/**
	 * Public constructor
	 */
	public function __construct()
	{
		parent::__construct();
	}

	/**
	 * Wakeup function, called whenever the class is unserialized
	 */
	public function __wakeup()
	{
		if($this->currentPartNumber >= 0)
		{
			$this->fp = @fopen($this->archiveList[$this->currentPartNumber], 'rb');
			if( (is_resource($this->fp)) && ($this->currentPartOffset > 0) )
			{
				@fseek($this->fp, $this->currentPartOffset);
			}
		}
	}

	/**
	 * Sleep function, called whenever the class is serialized
	 */
	public function shutdown()
	{
		if(is_resource($this->fp))
		{
			$this->currentPartOffset = @ftell($this->fp);
			@fclose($this->fp);
		}
	}

	/**
	 * Implements the abstract _prepare() method
	 */
	final protected function _prepare()
	{
		parent::__construct();

		if( count($this->_parametersArray) > 0 )
		{
			foreach($this->_parametersArray as $key => $value)
			{
				switch($key)
				{
					// Archive's absolute filename
					case 'filename':
						$this->filename = $value;

						// Sanity check
						if (!empty($value))
						{
							$value = strtolower($value);

							if (strlen($value) > 6)
							{
								if (
									(substr($value, 0, 7) == 'http://')
									|| (substr($value, 0, 8) == 'https://')
									|| (substr($value, 0, 6) == 'ftp://')
									|| (substr($value, 0, 7) == 'ssh2://')
									|| (substr($value, 0, 6) == 'ssl://')
								)
								{
									$this->setState('error', 'Invalid archive location');
								}
							}
						}



						break;

					// Should I restore permissions?
					case 'restore_permissions':
						$this->flagRestorePermissions = $value;
						break;

					// Should I use FTP?
					case 'post_proc':
						$this->postProcEngine = AKFactory::getpostProc($value);
						break;

					// Path to add in the beginning
					case 'add_path':
						$this->addPath = $value;
						$this->addPath = str_replace('\\','/',$this->addPath);
						$this->addPath = rtrim($this->addPath,'/');
						if(!empty($this->addPath)) $this->addPath .= '/';
						break;

					// Which files to rename (hash array)
					case 'rename_files':
						$this->renameFiles = $value;
						break;

					// Which files to rename (hash array)
					case 'rename_dirs':
						$this->renameDirs = $value;
						break;

					// Which files to skip (indexed array)
					case 'skip_files':
						$this->skipFiles = $value;
						break;

					// Which directories to ignore when we can't write files in them (indexed array)
					case 'ignoredirectories':
						$this->ignoreDirectories = $value;
						break;
				}
			}
		}

		$this->scanArchives();

		$this->readArchiveHeader();
		$errMessage = $this->getError();
		if(!empty($errMessage))
		{
			$this->setState('error', $errMessage);
		}
		else
		{
			$this->runState = AK_STATE_NOFILE;
			$this->setState('prepared');
		}
	}

	protected function _run()
	{
		if($this->getState() == 'postrun') return;

		$this->setState('running');

		$timer = AKFactory::getTimer();

		$status = true;
		while( $status && ($timer->getTimeLeft() > 0) )
		{
			switch( $this->runState )
			{
				case AK_STATE_NOFILE:
					debugMsg(__CLASS__.'::_run() - Reading file header');
					$status = $this->readFileHeader();
					if($status)
					{
						debugMsg(__CLASS__.'::_run() - Preparing to extract '.$this->fileHeader->realFile);
						// Send start of file notification
						$message = new stdClass;
						$message->type = 'startfile';
						$message->content = new stdClass;
						if( array_key_exists('realfile', get_object_vars($this->fileHeader)) ) {
							$message->content->realfile = $this->fileHeader->realFile;
						} else {
							$message->content->realfile = $this->fileHeader->file;
						}
						$message->content->file = $this->fileHeader->file;
						if( array_key_exists('compressed', get_object_vars($this->fileHeader)) ) {
							$message->content->compressed = $this->fileHeader->compressed;
						} else {
							$message->content->compressed = 0;
						}
						$message->content->uncompressed = $this->fileHeader->uncompressed;
						$this->notify($message);
					} else {
						debugMsg(__CLASS__.'::_run() - Could not read file header');
					}
					break;

				case AK_STATE_HEADER:
				case AK_STATE_DATA:
					debugMsg(__CLASS__.'::_run() - Processing file data');
					$status = $this->processFileData();
					break;

				case AK_STATE_DATAREAD:
				case AK_STATE_POSTPROC:
					debugMsg(__CLASS__.'::_run() - Calling post-processing class');
					$this->postProcEngine->timestamp = $this->fileHeader->timestamp;
					$status = $this->postProcEngine->process();
					$this->propagateFromObject( $this->postProcEngine );
					$this->runState = AK_STATE_DONE;
					break;

				case AK_STATE_DONE:
				default:
					if($status)
					{
						debugMsg(__CLASS__.'::_run() - Finished extracting file');
						// Send end of file notification
						$message = new stdClass;
						$message->type = 'endfile';
						$message->content = new stdClass;
						if( array_key_exists('realfile', get_object_vars($this->fileHeader)) ) {
							$message->content->realfile = $this->fileHeader->realFile;
						} else {
							$message->content->realfile = $this->fileHeader->file;
						}
						$message->content->file = $this->fileHeader->file;
						if( array_key_exists('compressed', get_object_vars($this->fileHeader)) ) {
							$message->content->compressed = $this->fileHeader->compressed;
						} else {
							$message->content->compressed = 0;
						}
						$message->content->uncompressed = $this->fileHeader->uncompressed;
						$this->notify($message);
					}
					$this->runState = AK_STATE_NOFILE;
					continue;
			}
		}

		$error = $this->getError();
		if( !$status && ($this->runState == AK_STATE_NOFILE) && empty( $error ) )
		{
			debugMsg(__CLASS__.'::_run() - Just finished');
			// We just finished
			$this->setState('postrun');
		}
		elseif( !empty($error) )
		{
			debugMsg(__CLASS__.'::_run() - Halted with an error:');
			debugMsg($error);
			$this->setState( 'error', $error );
		}
	}

	protected function _finalize()
	{
		// Nothing to do
		$this->setState('finished');
	}

	/**
	 * Returns the base extension of the file, e.g. '.jpa'
	 * @return string
	 */
	private function getBaseExtension()
	{
		static $baseextension;

		if(empty($baseextension))
		{
			$basename = basename($this->filename);
			$lastdot = strrpos($basename,'.');
			$baseextension = substr($basename, $lastdot);
		}

		return $baseextension;
	}

	/**
	 * Scans for archive parts
	 */
	private function scanArchives()
	{
		if(defined('KSDEBUG')) {
			@unlink('debug.txt');
		}
		debugMsg('Preparing to scan archives');

		$privateArchiveList = array();

		// Get the components of the archive filename
		$dirname = dirname($this->filename);
		$base_extension = $this->getBaseExtension();
		$basename = basename($this->filename, $base_extension);
		$this->totalSize = 0;

		// Scan for multiple parts until we don't find any more of them
		$count = 0;
		$found = true;
		$this->archiveList = array();
		while($found)
		{
			++$count;
			$extension = substr($base_extension, 0, 2).sprintf('%02d', $count);
			$filename = $dirname.DIRECTORY_SEPARATOR.$basename.$extension;
			$found = file_exists($filename);
			if($found)
			{
				debugMsg('- Found archive '.$filename);
				// Add yet another part, with a numeric-appended filename
				$this->archiveList[] = $filename;

				$filesize = @filesize($filename);
				$this->totalSize += $filesize;

				$privateArchiveList[] = array($filename, $filesize);
			}
			else
			{
				debugMsg('- Found archive '.$this->filename);
				// Add the last part, with the regular extension
				$this->archiveList[] = $this->filename;

				$filename = $this->filename;
				$filesize = @filesize($filename);
				$this->totalSize += $filesize;

				$privateArchiveList[] = array($filename, $filesize);
			}
		}
		debugMsg('Total archive parts: '.$count);

		$this->currentPartNumber = -1;
		$this->currentPartOffset = 0;
		$this->runState = AK_STATE_NOFILE;

		// Send start of file notification
		$message = new stdClass;
		$message->type = 'totalsize';
		$message->content = new stdClass;
		$message->content->totalsize = $this->totalSize;
		$message->content->filelist = $privateArchiveList;
		$this->notify($message);
	}

	/**
	 * Opens the next part file for reading
	 */
	protected function nextFile()
	{
		debugMsg('Current part is '.$this->currentPartNumber.'; opening the next part');
		++$this->currentPartNumber;

		if( $this->currentPartNumber > (count($this->archiveList) - 1) )
		{
			$this->setState('postrun');
			return false;
		}
		else
		{
			if( is_resource($this->fp) ) @fclose($this->fp);
			debugMsg('Opening file '.$this->archiveList[$this->currentPartNumber]);
			$this->fp = @fopen( $this->archiveList[$this->currentPartNumber], 'rb' );
			if($this->fp === false) {
				debugMsg('Could not open file - crash imminent');
				$this->setError(AKText::sprintf('ERR_COULD_NOT_OPEN_ARCHIVE_PART', $this->archiveList[$this->currentPartNumber]));
			}
			fseek($this->fp, 0);
			$this->currentPartOffset = 0;
			return true;
		}
	}

	/**
	 * Returns true if we have reached the end of file
	 * @param $local bool True to return EOF of the local file, false (default) to return if we have reached the end of the archive set
	 * @return bool True if we have reached End Of File
	 */
	protected function isEOF($local = false)
	{
		$eof = @feof($this->fp);

		if(!$eof)
		{
			// Border case: right at the part's end (eeeek!!!). For the life of me, I don't understand why
			// feof() doesn't report true. It expects the fp to be positioned *beyond* the EOF to report
			// true. Incredible! :(
			$position = @ftell($this->fp);
			$filesize = @filesize( $this->archiveList[$this->currentPartNumber] );
			if($filesize <= 0) {
				// 2Gb or more files on a 32 bit version of PHP tend to get screwed up. Meh.
				$eof = false;
			} elseif( $position >= $filesize  ) {
				$eof = true;
			}
		}

		if($local)
		{
			return $eof;
		}
		else
		{
			return $eof && ($this->currentPartNumber >= (count($this->archiveList)-1) );
		}
	}

	/**
	 * Tries to make a directory user-writable so that we can write a file to it
	 * @param $path string A path to a file
	 */
	protected function setCorrectPermissions($path)
	{
		static $rootDir = null;

		if(is_null($rootDir)) {
			$rootDir = rtrim(AKFactory::get('kickstart.setup.destdir',''),'/\\');
		}

		$directory = rtrim(dirname($path),'/\\');
		if($directory != $rootDir) {
			// Is this an unwritable directory?
			if(!is_writeable($directory)) {
				$this->postProcEngine->chmod( $directory, 0755 );
			}
		}
		$this->postProcEngine->chmod( $path, 0644 );
	}

	/**
	 * Concrete classes are supposed to use this method in order to read the archive's header and
	 * prepare themselves to the point of being ready to extract the first file.
	 */
	protected abstract function readArchiveHeader();

	/**
	 * Concrete classes must use this method to read the file header
	 * @return bool True if reading the file was successful, false if an error occured or we reached end of archive
	 */
	protected abstract function readFileHeader();

	/**
	 * Concrete classes must use this method to process file data. It must set $runState to AK_STATE_DATAREAD when
	 * it's finished processing the file data.
	 * @return bool True if processing the file data was successful, false if an error occured
	 */
	protected abstract function processFileData();

	/**
	 * Reads data from the archive and notifies the observer with the 'reading' message
	 * @param $fp
	 * @param $length
	 */
	protected function fread($fp, $length = null)
	{
		if(is_numeric($length))
		{
			if($length > 0) {
				$data = fread($fp, $length);
			} else {
				$data = fread($fp, PHP_INT_MAX);
			}
		}
		else
		{
			$data = fread($fp, PHP_INT_MAX);
		}
		if($data === false) $data = '';

		// Send start of file notification
		$message = new stdClass;
		$message->type = 'reading';
		$message->content = new stdClass;
		$message->content->length = strlen($data);
		$this->notify($message);

		return $data;
	}

	/**
	 * Is this file or directory contained in a directory we've decided to ignore
	 * write errors for? This is useful to let the extraction work despite write
	 * errors in the log, logs and tmp directories which MIGHT be used by the system
	 * on some low quality hosts and Plesk-powered hosts.
	 *
	 * @param   string  $shortFilename  The relative path of the file/directory in the package
	 *
	 * @return  boolean  True if it belongs in an ignored directory
	 */
	public function isIgnoredDirectory($shortFilename)
	{
		// return false;

		if (substr($shortFilename, -1) == '/')
		{
			$check = rtrim($shortFilename, '/');
		}
		else
		{
			$check = dirname($shortFilename);
		}

		return in_array($check, $this->ignoreDirectories);
	}
}

/**
 * Akeeba Restore
 * A JSON-powered JPA, JPS and ZIP archive extraction library
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / Akeeba Ltd.
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

/**
 * File post processor engines base class
 */
abstract class AKAbstractPostproc extends AKAbstractObject
{
	/** @var string The current (real) file path we'll have to process */
	protected $filename = null;

	/** @var int The requested permissions */
	protected $perms = 0755;

	/** @var string The temporary file path we gave to the unarchiver engine */
	protected $tempFilename = null;

	/** @var int The UNIX timestamp of the file's desired modification date */
	public $timestamp = 0;

	/**
	 * Processes the current file, e.g. moves it from temp to final location by FTP
	 */
	abstract public function process();

	/**
	 * The unarchiver tells us the path to the filename it wants to extract and we give it
	 * a different path instead.
	 * @param string $filename The path to the real file
	 * @param int $perms The permissions we need the file to have
	 * @return string The path to the temporary file
	 */
	abstract public function processFilename($filename, $perms = 0755);

	/**
	 * Recursively creates a directory if it doesn't exist
	 * @param string $dirName The directory to create
	 * @param int $perms The permissions to give to that directory
	 */
	abstract public function createDirRecursive( $dirName, $perms );

	abstract public function chmod( $file, $perms );

	abstract public function unlink( $file );

	abstract public function rmdir( $directory );

	abstract public function rename( $from, $to );
}


/**
 * Akeeba Restore
 * A JSON-powered JPA, JPS and ZIP archive extraction library
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / Akeeba Ltd.
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

/**
 * Descendants of this class can be used in the unarchiver's observer methods (attach, detach and notify)
 * @author Nicholas
 *
 */
abstract class AKAbstractPartObserver
{
	abstract public function update($object, $message);
}


/**
 * Akeeba Restore
 * A JSON-powered JPA, JPS and ZIP archive extraction library
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / Akeeba Ltd.
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

/**
 * Direct file writer
 */
class AKPostprocDirect extends AKAbstractPostproc
{
	public function process()
	{
		$restorePerms = AKFactory::get('kickstart.setup.restoreperms', false);
		if($restorePerms)
		{
			@chmod($this->filename, $this->perms);
		}
		else
		{
			if(@is_file($this->filename))
			{
				@chmod($this->filename, 0644);
			}
			else
			{
				@chmod($this->filename, 0755);
			}
		}
		if($this->timestamp > 0)
		{
			@touch($this->filename, $this->timestamp);
		}
		return true;
	}

	public function processFilename($filename, $perms = 0755)
	{
		$this->perms = $perms;
		$this->filename = $filename;
		return $filename;
	}

	public function createDirRecursive( $dirName, $perms )
	{
		if( AKFactory::get('kickstart.setup.dryrun','0') ) return true;
		if (@mkdir($dirName, 0755, true)) {
			@chmod($dirName, 0755);
			return true;
		}

		$root = AKFactory::get('kickstart.setup.destdir');
		$root = rtrim(str_replace('\\','/',$root),'/');
		$dir = rtrim(str_replace('\\','/',$dirName),'/');
		if(strpos($dir, $root) === 0) {
			$dir = ltrim(substr($dir, strlen($root)), '/');
			$root .= '/';
		} else {
			$root = '';
		}

		if(empty($dir)) return true;

		$dirArray = explode('/', $dir);
		$path = '';
		foreach( $dirArray as $dir )
		{
			$path .= $dir . '/';
			$ret = is_dir($root.$path) ? true : @mkdir($root.$path);
			if( !$ret ) {
				// Is this a file instead of a directory?
				if(is_file($root.$path) )
				{
					@unlink($root.$path);
					$ret = @mkdir($root.$path);
				}
				if( !$ret ) {
					$this->setError( AKText::sprintf('COULDNT_CREATE_DIR',$path) );
					return false;
				}
			}
			// Try to set new directory permissions to 0755
			@chmod($root.$path, $perms);
		}
		return true;
	}

	public function chmod( $file, $perms )
	{
		if( AKFactory::get('kickstart.setup.dryrun','0') ) return true;

		return @chmod( $file, $perms );
	}

	public function unlink( $file )
	{
		return @unlink( $file );
	}

	public function rmdir( $directory )
	{
		return @rmdir( $directory );
	}

	public function rename( $from, $to )
	{
		return @rename($from, $to);
	}

}

/**
 * Akeeba Restore
 * A JSON-powered JPA, JPS and ZIP archive extraction library
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / Akeeba Ltd.
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

/**
 * FTP file writer
 */
class AKPostprocFTP extends AKAbstractPostproc
{
	/** @var bool Should I use FTP over implicit SSL? */
	public $useSSL = false;
	/** @var bool use Passive mode? */
	public $passive = true;
	/** @var string FTP host name */
	public $host = '';
	/** @var int FTP port */
	public $port = 21;
	/** @var string FTP user name */
	public $user = '';
	/** @var string FTP password */
	public $pass = '';
	/** @var string FTP initial directory */
	public $dir = '';
	/** @var resource The FTP handle */
	private $handle = null;
	/** @var string The temporary directory where the data will be stored */
	private $tempDir = '';

	public function __construct()
	{
		parent::__construct();

		$this->useSSL = AKFactory::get('kickstart.ftp.ssl', false);
		$this->passive = AKFactory::get('kickstart.ftp.passive', true);
		$this->host = AKFactory::get('kickstart.ftp.host', '');
		$this->port = AKFactory::get('kickstart.ftp.port', 21);
		if(trim($this->port) == '') $this->port = 21;
		$this->user = AKFactory::get('kickstart.ftp.user', '');
		$this->pass = AKFactory::get('kickstart.ftp.pass', '');
		$this->dir = AKFactory::get('kickstart.ftp.dir', '');
		$this->tempDir = AKFactory::get('kickstart.ftp.tempdir', '');

		$connected = $this->connect();

		if($connected)
		{
			if(!empty($this->tempDir))
			{
				$tempDir = rtrim($this->tempDir, '/\\').'/';
				$writable = $this->isDirWritable($tempDir);
			}
			else
			{
				$tempDir = '';
				$writable = false;
			}

			if(!$writable) {
				// Default temporary directory is the current root
				$tempDir = KSROOTDIR;
				if(empty($tempDir))
				{
					// Oh, we have no directory reported!
					$tempDir = '.';
				}
				$absoluteDirToHere = $tempDir;
				$tempDir = rtrim(str_replace('\\','/',$tempDir),'/');
				if(!empty($tempDir)) $tempDir .= '/';
				$this->tempDir = $tempDir;
				// Is this directory writable?
				$writable = $this->isDirWritable($tempDir);
			}

			if(!$writable)
			{
				// Nope. Let's try creating a temporary directory in the site's root.
				$tempDir = $absoluteDirToHere.'/kicktemp';
				$this->createDirRecursive($tempDir, 0777);
				// Try making it writable...
				$this->fixPermissions($tempDir);
				$writable = $this->isDirWritable($tempDir);
			}

			// Was the new directory writable?
			if(!$writable)
			{
				// Let's see if the user has specified one
				$userdir = AKFactory::get('kickstart.ftp.tempdir', '');
				if(!empty($userdir))
				{
					// Is it an absolute or a relative directory?
					$absolute = false;
					$absolute = $absolute || ( substr($userdir,0,1) == '/' );
					$absolute = $absolute || ( substr($userdir,1,1) == ':' );
					$absolute = $absolute || ( substr($userdir,2,1) == ':' );
					if(!$absolute)
					{
						// Make absolute
						$tempDir = $absoluteDirToHere.$userdir;
					}
					else
					{
						// it's already absolute
						$tempDir = $userdir;
					}
					// Does the directory exist?
					if( is_dir($tempDir) )
					{
						// Yeah. Is it writable?
						$writable = $this->isDirWritable($tempDir);
					}
				}
			}
			$this->tempDir = $tempDir;

			if(!$writable)
			{
				// No writable directory found!!!
				$this->setError(AKText::_('FTP_TEMPDIR_NOT_WRITABLE'));
			}
			else
			{
				AKFactory::set('kickstart.ftp.tempdir', $tempDir);
				$this->tempDir = $tempDir;
			}
		}
	}

	function __wakeup()
	{
		$this->connect();
	}

	public function connect()
	{
		// Connect to server, using SSL if so required
		if($this->useSSL) {
			$this->handle = @ftp_ssl_connect($this->host, $this->port);
		} else {
			$this->handle = @ftp_connect($this->host, $this->port);
		}
		if($this->handle === false)
		{
			$this->setError(AKText::_('WRONG_FTP_HOST'));
			return false;
		}

		// Login
		if(! @ftp_login($this->handle, $this->user, $this->pass))
		{
			$this->setError(AKText::_('WRONG_FTP_USER'));
			@ftp_close($this->handle);
			return false;
		}

		// Change to initial directory
		if(! @ftp_chdir($this->handle, $this->dir))
		{
			$this->setError(AKText::_('WRONG_FTP_PATH1'));
			@ftp_close($this->handle);
			return false;
		}

		// Enable passive mode if the user requested it
		if( $this->passive )
		{
			@ftp_pasv($this->handle, true);
		}
		else
		{
			@ftp_pasv($this->handle, false);
		}

		// Try to download ourselves
		$testFilename = defined('KSSELFNAME') ? KSSELFNAME : basename(__FILE__);
		$tempHandle = fopen('php://temp', 'r+');
		if (@ftp_fget($this->handle, $tempHandle, $testFilename, FTP_ASCII, 0) === false)
		{
			$this->setError(AKText::_('WRONG_FTP_PATH2'));
			@ftp_close($this->handle);
			fclose($tempHandle);

			return false;
		}
		fclose($tempHandle);

		return true;
	}

	public function process()
	{
		if( is_null($this->tempFilename) )
		{
			// If an empty filename is passed, it means that we shouldn't do any post processing, i.e.
			// the entity was a directory or symlink
			return true;
		}

		$remotePath = dirname($this->filename);
		$removePath = AKFactory::get('kickstart.setup.destdir','');
		if(!empty($removePath))
		{
			$removePath = ltrim($removePath, "/");
			$remotePath = ltrim($remotePath, "/");
			$left = substr($remotePath, 0, strlen($removePath));
			if($left == $removePath)
			{
				$remotePath = substr($remotePath, strlen($removePath));
			}
		}

		$absoluteFSPath = dirname($this->filename);
		$relativeFTPPath = trim($remotePath, '/');
		$absoluteFTPPath = '/'.trim( $this->dir, '/' ).'/'.trim($remotePath, '/');
		$onlyFilename = basename($this->filename);

		$remoteName = $absoluteFTPPath.'/'.$onlyFilename;

		$ret = @ftp_chdir($this->handle, $absoluteFTPPath);
		if($ret === false)
		{
			$ret = $this->createDirRecursive( $absoluteFSPath, 0755);
			if($ret === false) {
				$this->setError(AKText::sprintf('FTP_COULDNT_UPLOAD', $this->filename));
				return false;
			}
			$ret = @ftp_chdir($this->handle, $absoluteFTPPath);
			if($ret === false) {
				$this->setError(AKText::sprintf('FTP_COULDNT_UPLOAD', $this->filename));
				return false;
			}
		}

		$ret = @ftp_put($this->handle, $remoteName, $this->tempFilename, FTP_BINARY);
		if($ret === false)
		{
			// If we couldn't create the file, attempt to fix the permissions in the PHP level and retry!
			$this->fixPermissions($this->filename);
			$this->unlink($this->filename);

			$fp = @fopen($this->tempFilename, 'rb');
			if($fp !== false)
			{
				$ret = @ftp_fput($this->handle, $remoteName, $fp, FTP_BINARY);
				@fclose($fp);
			}
			else
			{
				$ret = false;
			}
		}
		@unlink($this->tempFilename);

		if($ret === false)
		{
			$this->setError(AKText::sprintf('FTP_COULDNT_UPLOAD', $this->filename));
			return false;
		}
		$restorePerms = AKFactory::get('kickstart.setup.restoreperms', false);
		if($restorePerms)
		{
			@ftp_chmod($this->_handle, $this->perms, $remoteName);
		}
		else
		{
			@ftp_chmod($this->_handle, 0644, $remoteName);
		}
		return true;
	}

	public function processFilename($filename, $perms = 0755)
	{
		// Catch some error conditions...
		if($this->getError())
		{
			return false;
		}

		// If a null filename is passed, it means that we shouldn't do any post processing, i.e.
		// the entity was a directory or symlink
		if(is_null($filename))
		{
			$this->filename = null;
			$this->tempFilename = null;
			return null;
		}

		// Strip absolute filesystem path to website's root
		$removePath = AKFactory::get('kickstart.setup.destdir','');
		if(!empty($removePath))
		{
			$left = substr($filename, 0, strlen($removePath));
			if($left == $removePath)
			{
				$filename = substr($filename, strlen($removePath));
			}
		}

		// Trim slash on the left
		$filename = ltrim($filename, '/');

		$this->filename = $filename;
		$this->tempFilename = tempnam($this->tempDir, 'kickstart-');
		$this->perms = $perms;

		if( empty($this->tempFilename) )
		{
			// Oops! Let's try something different
			$this->tempFilename = $this->tempDir.'/kickstart-'.time().'.dat';
		}

		return $this->tempFilename;
	}

	private function isDirWritable($dir)
	{
		$fp = @fopen($dir.'/kickstart.dat', 'wb');
		if($fp === false)
		{
			return false;
		}
		else
		{
			@fclose($fp);
			unlink($dir.'/kickstart.dat');
			return true;
		}
	}

	public function createDirRecursive( $dirName, $perms )
	{
		// Strip absolute filesystem path to website's root
		$removePath = AKFactory::get('kickstart.setup.destdir','');
		if(!empty($removePath))
		{
			// UNIXize the paths
			$removePath = str_replace('\\','/',$removePath);
			$dirName = str_replace('\\','/',$dirName);
			// Make sure they both end in a slash
			$removePath = rtrim($removePath,'/\\').'/';
			$dirName = rtrim($dirName,'/\\').'/';
			// Process the path removal
			$left = substr($dirName, 0, strlen($removePath));
			if($left == $removePath)
			{
				$dirName = substr($dirName, strlen($removePath));
			}
		}
		if(empty($dirName)) $dirName = ''; // 'cause the substr() above may return FALSE.

		$check = '/'.trim($this->dir,'/').'/'.trim($dirName, '/');
		if($this->is_dir($check)) return true;

		$alldirs = explode('/', $dirName);
		$previousDir = '/'.trim($this->dir);
		foreach($alldirs as $curdir)
		{
			$check = $previousDir.'/'.$curdir;
			if(!$this->is_dir($check))
			{
				// Proactively try to delete a file by the same name
				@ftp_delete($this->handle, $check);

				if(@ftp_mkdir($this->handle, $check) === false)
				{
					// If we couldn't create the directory, attempt to fix the permissions in the PHP level and retry!
					$this->fixPermissions($removePath.$check);
					if(@ftp_mkdir($this->handle, $check) === false)
					{
						// Can we fall back to pure PHP mode, sire?
						if(!@mkdir($check))
						{
							$this->setError(AKText::sprintf('FTP_CANT_CREATE_DIR', $check));
							return false;
						}
						else
						{
							// Since the directory was built by PHP, change its permissions
							@chmod($check, "0777");
							return true;
						}
					}
				}
				@ftp_chmod($this->handle, $perms, $check);
			}
			$previousDir = $check;
		}

		return true;
	}

	public function close()
	{
		@ftp_close($this->handle);
	}

	/*
	 * Tries to fix directory/file permissions in the PHP level, so that
	 * the FTP operation doesn't fail.
	 * @param $path string The full path to a directory or file
	 */
	private function fixPermissions( $path )
	{
		// Turn off error reporting
		if(!defined('KSDEBUG')) {
			$oldErrorReporting = @error_reporting(E_NONE);
		}

		// Get UNIX style paths
		$relPath = str_replace('\\','/',$path);
		$basePath = rtrim(str_replace('\\','/',KSROOTDIR),'/');
		$basePath = rtrim($basePath,'/');
		if(!empty($basePath)) $basePath .= '/';
		// Remove the leading relative root
		if( substr($relPath,0,strlen($basePath)) == $basePath )
			$relPath = substr($relPath,strlen($basePath));
		$dirArray = explode('/', $relPath);
		$pathBuilt = rtrim($basePath,'/');
		foreach( $dirArray as $dir )
		{
			if(empty($dir)) continue;
			$oldPath = $pathBuilt;
			$pathBuilt .= '/'.$dir;
			if(is_dir($oldPath.$dir))
			{
				@chmod($oldPath.$dir, 0777);
			}
			else
			{
				if(@chmod($oldPath.$dir, 0777) === false)
				{
					@unlink($oldPath.$dir);
				}
			}
		}

		// Restore error reporting
		if(!defined('KSDEBUG')) {
			@error_reporting($oldErrorReporting);
		}
	}

	public function chmod( $file, $perms )
	{
		return @ftp_chmod($this->handle, $perms, $file);
	}

	private function is_dir( $dir )
	{
		return @ftp_chdir( $this->handle, $dir );
	}

	public function unlink( $file )
	{
		$removePath = AKFactory::get('kickstart.setup.destdir','');
		if(!empty($removePath))
		{
			$left = substr($file, 0, strlen($removePath));
			if($left == $removePath)
			{
				$file = substr($file, strlen($removePath));
			}
		}

		$check = '/'.trim($this->dir,'/').'/'.trim($file, '/');

		return @ftp_delete( $this->handle, $check );
	}

	public function rmdir( $directory )
	{
		$removePath = AKFactory::get('kickstart.setup.destdir','');
		if(!empty($removePath))
		{
			$left = substr($directory, 0, strlen($removePath));
			if($left == $removePath)
			{
				$directory = substr($directory, strlen($removePath));
			}
		}

		$check = '/'.trim($this->dir,'/').'/'.trim($directory, '/');

		return @ftp_rmdir( $this->handle, $check );
	}

	public function rename( $from, $to )
	{
		$originalFrom = $from;
		$originalTo = $to;

		$removePath = AKFactory::get('kickstart.setup.destdir','');
		if(!empty($removePath))
		{
			$left = substr($from, 0, strlen($removePath));
			if($left == $removePath)
			{
				$from = substr($from, strlen($removePath));
			}
		}
		$from = '/'.trim($this->dir,'/').'/'.trim($from, '/');

		if(!empty($removePath))
		{
			$left = substr($to, 0, strlen($removePath));
			if($left == $removePath)
			{
				$to = substr($to, strlen($removePath));
			}
		}
		$to = '/'.trim($this->dir,'/').'/'.trim($to, '/');

		$result = @ftp_rename( $this->handle, $from, $to );
		if($result !== true)
		{
			return @rename($from, $to);
		}
		else
		{
			return true;
		}
	}

}


/**
 * Akeeba Restore
 * A JSON-powered JPA, JPS and ZIP archive extraction library
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / Akeeba Ltd.
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

/**
 * FTP file writer
 */
class AKPostprocSFTP extends AKAbstractPostproc
{
	/** @var bool Should I use FTP over implicit SSL? */
	public $useSSL = false;
	/** @var bool use Passive mode? */
	public $passive = true;
	/** @var string FTP host name */
	public $host = '';
	/** @var int FTP port */
	public $port = 21;
	/** @var string FTP user name */
	public $user = '';
	/** @var string FTP password */
	public $pass = '';
	/** @var string FTP initial directory */
	public $dir = '';

    /** @var resource SFTP resource handle */
	private $handle = null;

    /** @var resource SSH2 connection resource handle */
    private $_connection = null;

    /** @var string Current remote directory, including the remote directory string */
    private $_currentdir;

	/** @var string The temporary directory where the data will be stored */
	private $tempDir = '';

	public function __construct()
	{
		parent::__construct();

		$this->host     = AKFactory::get('kickstart.ftp.host', '');
		$this->port     = AKFactory::get('kickstart.ftp.port', 22);

		if(trim($this->port) == '') $this->port = 22;

		$this->user     = AKFactory::get('kickstart.ftp.user', '');
		$this->pass     = AKFactory::get('kickstart.ftp.pass', '');
		$this->dir      = AKFactory::get('kickstart.ftp.dir', '');
		$this->tempDir  = AKFactory::get('kickstart.ftp.tempdir', '');

		$connected = $this->connect();

		if($connected)
		{
			if(!empty($this->tempDir))
			{
				$tempDir = rtrim($this->tempDir, '/\\').'/';
				$writable = $this->isDirWritable($tempDir);
			}
			else
			{
				$tempDir = '';
				$writable = false;
			}

			if(!$writable) {
				// Default temporary directory is the current root
				$tempDir = KSROOTDIR;
				if(empty($tempDir))
				{
					// Oh, we have no directory reported!
					$tempDir = '.';
				}
				$absoluteDirToHere = $tempDir;
				$tempDir = rtrim(str_replace('\\','/',$tempDir),'/');
				if(!empty($tempDir)) $tempDir .= '/';
				$this->tempDir = $tempDir;
				// Is this directory writable?
				$writable = $this->isDirWritable($tempDir);
			}

			if(!$writable)
			{
				// Nope. Let's try creating a temporary directory in the site's root.
				$tempDir = $absoluteDirToHere.'/kicktemp';
				$this->createDirRecursive($tempDir, 0777);
				// Try making it writable...
				$this->fixPermissions($tempDir);
				$writable = $this->isDirWritable($tempDir);
			}

			// Was the new directory writable?
			if(!$writable)
			{
				// Let's see if the user has specified one
				$userdir = AKFactory::get('kickstart.ftp.tempdir', '');
				if(!empty($userdir))
				{
					// Is it an absolute or a relative directory?
					$absolute = false;
					$absolute = $absolute || ( substr($userdir,0,1) == '/' );
					$absolute = $absolute || ( substr($userdir,1,1) == ':' );
					$absolute = $absolute || ( substr($userdir,2,1) == ':' );
					if(!$absolute)
					{
						// Make absolute
						$tempDir = $absoluteDirToHere.$userdir;
					}
					else
					{
						// it's already absolute
						$tempDir = $userdir;
					}
					// Does the directory exist?
					if( is_dir($tempDir) )
					{
						// Yeah. Is it writable?
						$writable = $this->isDirWritable($tempDir);
					}
				}
			}
			$this->tempDir = $tempDir;

			if(!$writable)
			{
				// No writable directory found!!!
				$this->setError(AKText::_('SFTP_TEMPDIR_NOT_WRITABLE'));
			}
			else
			{
				AKFactory::set('kickstart.ftp.tempdir', $tempDir);
				$this->tempDir = $tempDir;
			}
		}
	}

	function __wakeup()
	{
		$this->connect();
	}

	public function connect()
	{
        $this->_connection = false;

        if(!function_exists('ssh2_connect'))
        {
            $this->setError(AKText::_('SFTP_NO_SSH2'));
            return false;
        }

        $this->_connection = @ssh2_connect($this->host, $this->port);

        if (!@ssh2_auth_password($this->_connection, $this->user, $this->pass))
        {
            $this->setError(AKText::_('SFTP_WRONG_USER'));

            $this->_connection = false;

            return false;
        }

        $this->handle = @ssh2_sftp($this->_connection);

        // I must have an absolute directory
        if(!$this->dir)
        {
            $this->setError(AKText::_('SFTP_WRONG_STARTING_DIR'));
            return false;
        }

        // Change to initial directory
        if(!$this->sftp_chdir('/'))
        {
            $this->setError(AKText::_('SFTP_WRONG_STARTING_DIR'));

            unset($this->_connection);
            unset($this->handle);

            return false;
        }

        // Try to download ourselves
        $testFilename = defined('KSSELFNAME') ? KSSELFNAME : basename(__FILE__);
        $basePath     = '/'.trim($this->dir, '/');

        if(@fopen("ssh2.sftp://{$this->handle}$basePath/$testFilename",'r+') === false)
        {
            $this->setError(AKText::_('SFTP_WRONG_STARTING_DIR'));

            unset($this->_connection);
            unset($this->handle);

            return false;
        }

        return true;
	}

	public function process()
	{
		if( is_null($this->tempFilename) )
		{
			// If an empty filename is passed, it means that we shouldn't do any post processing, i.e.
			// the entity was a directory or symlink
			return true;
		}

		$remotePath      = dirname($this->filename);
		$absoluteFSPath  = dirname($this->filename);
		$absoluteFTPPath = '/'.trim( $this->dir, '/' ).'/'.trim($remotePath, '/');
		$onlyFilename    = basename($this->filename);

		$remoteName = $absoluteFTPPath.'/'.$onlyFilename;

        $ret = $this->sftp_chdir($absoluteFTPPath);

		if($ret === false)
		{
			$ret = $this->createDirRecursive( $absoluteFSPath, 0755);

			if($ret === false)
            {
				$this->setError(AKText::sprintf('SFTP_COULDNT_UPLOAD', $this->filename));
				return false;
			}

			$ret = $this->sftp_chdir($absoluteFTPPath);

			if($ret === false)
            {
				$this->setError(AKText::sprintf('SFTP_COULDNT_UPLOAD', $this->filename));
				return false;
			}
		}

        // Create the file
        $ret = $this->write($this->tempFilename, $remoteName);

        // If I got a -1 it means that I wasn't able to open the file, so I have to stop here
        if($ret === -1)
        {
            $this->setError(AKText::sprintf('SFTP_COULDNT_UPLOAD', $this->filename));
            return false;
        }

		if($ret === false)
		{
			// If we couldn't create the file, attempt to fix the permissions in the PHP level and retry!
			$this->fixPermissions($this->filename);
			$this->unlink($this->filename);

            $ret = $this->write($this->tempFilename, $remoteName);
		}

		@unlink($this->tempFilename);

		if($ret === false)
		{
			$this->setError(AKText::sprintf('SFTP_COULDNT_UPLOAD', $this->filename));
			return false;
		}
		$restorePerms = AKFactory::get('kickstart.setup.restoreperms', false);

		if($restorePerms)
		{
            $this->chmod($remoteName, $this->perms);
		}
		else
		{
            $this->chmod($remoteName, 0644);
		}
		return true;
	}

	public function processFilename($filename, $perms = 0755)
	{
		// Catch some error conditions...
		if($this->getError())
		{
			return false;
		}

		// If a null filename is passed, it means that we shouldn't do any post processing, i.e.
		// the entity was a directory or symlink
		if(is_null($filename))
		{
			$this->filename = null;
			$this->tempFilename = null;
			return null;
		}

        // Strip absolute filesystem path to website's root
        $removePath = AKFactory::get('kickstart.setup.destdir','');
        if(!empty($removePath))
        {
            $left = substr($filename, 0, strlen($removePath));
            if($left == $removePath)
            {
                $filename = substr($filename, strlen($removePath));
            }
        }

        // Trim slash on the left
        $filename = ltrim($filename, '/');

		$this->filename = $filename;
		$this->tempFilename = tempnam($this->tempDir, 'kickstart-');
		$this->perms = $perms;

		if( empty($this->tempFilename) )
		{
			// Oops! Let's try something different
			$this->tempFilename = $this->tempDir.'/kickstart-'.time().'.dat';
		}

		return $this->tempFilename;
	}

	private function isDirWritable($dir)
	{
		if(@fopen("ssh2.sftp://{$this->handle}$dir/kickstart.dat",'wb') === false)
		{
			return false;
		}
		else
		{
            @ssh2_sftp_unlink($this->handle, $dir.'/kickstart.dat');
			return true;
		}
	}

	public function createDirRecursive( $dirName, $perms )
	{
        // Strip absolute filesystem path to website's root
        $removePath = AKFactory::get('kickstart.setup.destdir','');
        if(!empty($removePath))
        {
            // UNIXize the paths
            $removePath = str_replace('\\','/',$removePath);
            $dirName = str_replace('\\','/',$dirName);
            // Make sure they both end in a slash
            $removePath = rtrim($removePath,'/\\').'/';
            $dirName = rtrim($dirName,'/\\').'/';
            // Process the path removal
            $left = substr($dirName, 0, strlen($removePath));
            if($left == $removePath)
            {
                $dirName = substr($dirName, strlen($removePath));
            }
        }
        if(empty($dirName)) $dirName = ''; // 'cause the substr() above may return FALSE.

		$check = '/'.trim($this->dir,'/ ').'/'.trim($dirName, '/');

		if($this->is_dir($check))
        {
            return true;
        }

		$alldirs = explode('/', $dirName);
		$previousDir = '/'.trim($this->dir, '/ ');

		foreach($alldirs as $curdir)
		{
            if(!$curdir)
            {
                continue;
            }

			$check = $previousDir.'/'.$curdir;

			if(!$this->is_dir($check))
			{
				// Proactively try to delete a file by the same name
                @ssh2_sftp_unlink($this->handle, $check);

				if(@ssh2_sftp_mkdir($this->handle, $check) === false)
				{
					// If we couldn't create the directory, attempt to fix the permissions in the PHP level and retry!
					$this->fixPermissions($check);

					if(@ssh2_sftp_mkdir($this->handle, $check) === false)
					{
						// Can we fall back to pure PHP mode, sire?
						if(!@mkdir($check))
						{
							$this->setError(AKText::sprintf('FTP_CANT_CREATE_DIR', $check));
							return false;
						}
						else
						{
							// Since the directory was built by PHP, change its permissions
							@chmod($check, "0777");
							return true;
						}
					}
				}

				@ssh2_sftp_chmod($this->handle, $check, $perms);
			}

			$previousDir = $check;
		}

		return true;
	}

	public function close()
	{
		unset($this->_connection);
		unset($this->handle);
	}

	/*
	 * Tries to fix directory/file permissions in the PHP level, so that
	 * the FTP operation doesn't fail.
	 * @param $path string The full path to a directory or file
	 */
	private function fixPermissions( $path )
	{
		// Turn off error reporting
		if(!defined('KSDEBUG')) {
			$oldErrorReporting = @error_reporting(E_NONE);
		}

		// Get UNIX style paths
		$relPath  = str_replace('\\','/',$path);
		$basePath = rtrim(str_replace('\\','/',KSROOTDIR),'/');
		$basePath = rtrim($basePath,'/');

		if(!empty($basePath))
        {
            $basePath .= '/';
        }

		// Remove the leading relative root
		if( substr($relPath,0,strlen($basePath)) == $basePath )
        {
            $relPath = substr($relPath,strlen($basePath));
        }

		$dirArray  = explode('/', $relPath);
		$pathBuilt = rtrim($basePath,'/');

		foreach( $dirArray as $dir )
		{
			if(empty($dir))
            {
                continue;
            }

			$oldPath = $pathBuilt;
			$pathBuilt .= '/'.$dir;

			if(is_dir($oldPath.'/'.$dir))
			{
				@chmod($oldPath.'/'.$dir, 0777);
			}
			else
			{
				if(@chmod($oldPath.'/'.$dir, 0777) === false)
				{
					@unlink($oldPath.$dir);
				}
			}
		}

		// Restore error reporting
		if(!defined('KSDEBUG')) {
			@error_reporting($oldErrorReporting);
		}
	}

	public function chmod( $file, $perms )
	{
        return @ssh2_sftp_chmod($this->handle, $file, $perms);
	}

	private function is_dir( $dir )
	{
        return $this->sftp_chdir($dir);
	}

    private function write($local, $remote)
    {
        $fp      = @fopen("ssh2.sftp://{$this->handle}$remote",'w');
        $localfp = @fopen($local,'rb');

        if($fp === false)
        {
            return -1;
        }

        if($localfp === false)
        {
            @fclose($fp);
            return -1;
        }

        $res = true;

        while(!feof($localfp) && ($res !== false))
        {
            $buffer = @fread($localfp, 65567);
            $res    = @fwrite($fp, $buffer);
        }

        @fclose($fp);
        @fclose($localfp);

        return $res;
    }

	public function unlink( $file )
	{
		$check    = '/'.trim($this->dir,'/').'/'.trim($file, '/');

        return @ssh2_sftp_unlink($this->handle, $check);
	}

	public function rmdir( $directory )
	{
		$check    = '/'.trim($this->dir,'/').'/'.trim($directory, '/');

		return @ssh2_sftp_rmdir( $this->handle, $check);
	}

	public function rename( $from, $to )
	{
        $from     = '/'.trim($this->dir,'/').'/'.trim($from, '/');
        $to       = '/'.trim($this->dir,'/').'/'.trim($to, '/');

        $result =  @ssh2_sftp_rename($this->handle, $from, $to);

		if($result !== true)
		{
			return @rename($from, $to);
		}
		else
		{
			return true;
		}
	}

    /**
     * Changes to the requested directory in the remote server. You give only the
     * path relative to the initial directory and it does all the rest by itself,
     * including doing nothing if the remote directory is the one we want.
     *
     * @param   string  $dir    The (realtive) remote directory
     *
     * @return  bool True if successful, false otherwise.
     */
    private function sftp_chdir($dir)
    {
        // Strip absolute filesystem path to website's root
        $removePath = AKFactory::get('kickstart.setup.destdir','');
        if(!empty($removePath))
        {
            // UNIXize the paths
            $removePath = str_replace('\\','/',$removePath);
            $dir        = str_replace('\\','/',$dir);

            // Make sure they both end in a slash
            $removePath = rtrim($removePath,'/\\').'/';
            $dir        = rtrim($dir,'/\\').'/';

            // Process the path removal
            $left = substr($dir, 0, strlen($removePath));

            if($left == $removePath)
            {
                $dir = substr($dir, strlen($removePath));
            }
        }

        if(empty($dir))
        {
            // Because the substr() above may return FALSE.
            $dir = '';
        }

        // Calculate "real" (absolute) SFTP path
        $realdir = substr($this->dir, -1) == '/' ? substr($this->dir, 0, strlen($this->dir) - 1) : $this->dir;
        $realdir .= '/'.$dir;
        $realdir = substr($realdir, 0, 1) == '/' ? $realdir : '/'.$realdir;

        if($this->_currentdir == $realdir)
        {
            // Already there, do nothing
            return true;
        }

        $result = @ssh2_sftp_stat($this->handle, $realdir);

        if($result === false)
        {
            return false;
        }
        else
        {
            // Update the private "current remote directory" variable
            $this->_currentdir = $realdir;

            return true;
        }
    }

}


/**
 * Akeeba Restore
 * A JSON-powered JPA, JPS and ZIP archive extraction library
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / Akeeba Ltd.
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

/**
 * Hybrid direct / FTP mode file writer
 */
class AKPostprocHybrid extends AKAbstractPostproc
{

	/** @var bool Should I use the FTP layer? */
	public $useFTP = false;

	/** @var bool Should I use FTP over implicit SSL? */
	public $useSSL = false;

	/** @var bool use Passive mode? */
	public $passive = true;

	/** @var string FTP host name */
	public $host = '';

	/** @var int FTP port */
	public $port = 21;

	/** @var string FTP user name */
	public $user = '';

	/** @var string FTP password */
	public $pass = '';

	/** @var string FTP initial directory */
	public $dir = '';

	/** @var resource The FTP handle */
	private $handle = null;

	/** @var string The temporary directory where the data will be stored */
	private $tempDir = '';

	/** @var null The FTP connection handle */
	private $_handle = null;

	/**
	 * Public constructor. Tries to connect to the FTP server.
	 */
	public function __construct()
	{
		parent::__construct();

		$this->useFTP = true;
		$this->useSSL = AKFactory::get('kickstart.ftp.ssl', false);
		$this->passive = AKFactory::get('kickstart.ftp.passive', true);
		$this->host = AKFactory::get('kickstart.ftp.host', '');
		$this->port = AKFactory::get('kickstart.ftp.port', 21);
		$this->user = AKFactory::get('kickstart.ftp.user', '');
		$this->pass = AKFactory::get('kickstart.ftp.pass', '');
		$this->dir = AKFactory::get('kickstart.ftp.dir', '');
		$this->tempDir = AKFactory::get('kickstart.ftp.tempdir', '');

		if (trim($this->port) == '')
		{
			$this->port = 21;
		}

		// If FTP is not configured, skip it altogether
		if (empty($this->host) || empty($this->user) || empty($this->pass))
		{
			$this->useFTP = false;
		}

		// Try to connect to the FTP server
		$connected = $this->connect();

		// If the connection fails, skip FTP altogether
		if (!$connected)
		{
			$this->useFTP = false;
		}

		if ($connected)
		{
			if (!empty($this->tempDir))
			{
				$tempDir = rtrim($this->tempDir, '/\\') . '/';
				$writable = $this->isDirWritable($tempDir);
			}
			else
			{
				$tempDir = '';
				$writable = false;
			}

			if (!$writable)
			{
				// Default temporary directory is the current root
				$tempDir = KSROOTDIR;
				if (empty($tempDir))
				{
					// Oh, we have no directory reported!
					$tempDir = '.';
				}
				$absoluteDirToHere = $tempDir;
				$tempDir = rtrim(str_replace('\\', '/', $tempDir), '/');
				if (!empty($tempDir))
				{
					$tempDir .= '/';
				}
				$this->tempDir = $tempDir;
				// Is this directory writable?
				$writable = $this->isDirWritable($tempDir);
			}

			if (!$writable)
			{
				// Nope. Let's try creating a temporary directory in the site's root.
				$tempDir = $absoluteDirToHere . '/kicktemp';
				$this->createDirRecursive($tempDir, 0777);
				// Try making it writable...
				$this->fixPermissions($tempDir);
				$writable = $this->isDirWritable($tempDir);
			}

			// Was the new directory writable?
			if (!$writable)
			{
				// Let's see if the user has specified one
				$userdir = AKFactory::get('kickstart.ftp.tempdir', '');
				if (!empty($userdir))
				{
					// Is it an absolute or a relative directory?
					$absolute = false;
					$absolute = $absolute || (substr($userdir, 0, 1) == '/');
					$absolute = $absolute || (substr($userdir, 1, 1) == ':');
					$absolute = $absolute || (substr($userdir, 2, 1) == ':');
					if (!$absolute)
					{
						// Make absolute
						$tempDir = $absoluteDirToHere . $userdir;
					}
					else
					{
						// it's already absolute
						$tempDir = $userdir;
					}
					// Does the directory exist?
					if (is_dir($tempDir))
					{
						// Yeah. Is it writable?
						$writable = $this->isDirWritable($tempDir);
					}
				}
			}
			$this->tempDir = $tempDir;

			if (!$writable)
			{
				// No writable directory found!!!
				$this->setError(AKText::_('FTP_TEMPDIR_NOT_WRITABLE'));
			}
			else
			{
				AKFactory::set('kickstart.ftp.tempdir', $tempDir);
				$this->tempDir = $tempDir;
			}
		}
	}

	/**
	 * Called after unserialisation, tries to reconnect to FTP
	 */
	function __wakeup()
	{
		if ($this->useFTP)
		{
			$this->connect();
		}
	}

	function __destruct()
	{
		if (!$this->useFTP)
		{
			@ftp_close($this->handle);
		}
	}

	/**
	 * Tries to connect to the FTP server
	 *
	 * @return bool
	 */
	public function connect()
	{
		if (!$this->useFTP)
		{
			return false;
		}

		// Connect to server, using SSL if so required
		if ($this->useSSL)
		{
			$this->handle = @ftp_ssl_connect($this->host, $this->port);
		}
		else
		{
			$this->handle = @ftp_connect($this->host, $this->port);
		}
		if ($this->handle === false)
		{
			$this->setError(AKText::_('WRONG_FTP_HOST'));

			return false;
		}

		// Login
		if (!@ftp_login($this->handle, $this->user, $this->pass))
		{
			$this->setError(AKText::_('WRONG_FTP_USER'));
			@ftp_close($this->handle);

			return false;
		}

		// Change to initial directory
		if (!@ftp_chdir($this->handle, $this->dir))
		{
			$this->setError(AKText::_('WRONG_FTP_PATH1'));
			@ftp_close($this->handle);

			return false;
		}

		// Enable passive mode if the user requested it
		if ($this->passive)
		{
			@ftp_pasv($this->handle, true);
		}
		else
		{
			@ftp_pasv($this->handle, false);
		}

		// Try to download ourselves
		$testFilename = defined('KSSELFNAME') ? KSSELFNAME : basename(__FILE__);
		$tempHandle = fopen('php://temp', 'r+');

		if (@ftp_fget($this->handle, $tempHandle, $testFilename, FTP_ASCII, 0) === false)
		{
			$this->setError(AKText::_('WRONG_FTP_PATH2'));
			@ftp_close($this->handle);
			fclose($tempHandle);

			return false;
		}

		fclose($tempHandle);

		return true;
	}

	/**
	 * Post-process an extracted file, using FTP or direct file writes to move it
	 *
	 * @return bool
	 */
	public function process()
	{
		if (is_null($this->tempFilename))
		{
			// If an empty filename is passed, it means that we shouldn't do any post processing, i.e.
			// the entity was a directory or symlink
			return true;
		}

		$remotePath = dirname($this->filename);
		$removePath = AKFactory::get('kickstart.setup.destdir', '');
		$root = rtrim($removePath, '/\\');

		if (!empty($removePath))
		{
			$removePath = ltrim($removePath, "/");
			$remotePath = ltrim($remotePath, "/");
			$left = substr($remotePath, 0, strlen($removePath));

			if ($left == $removePath)
			{
				$remotePath = substr($remotePath, strlen($removePath));
			}
		}

		$absoluteFSPath = dirname($this->filename);
		$relativeFTPPath = trim($remotePath, '/');
		$absoluteFTPPath = '/' . trim($this->dir, '/') . '/' . trim($remotePath, '/');
		$onlyFilename = basename($this->filename);

		$remoteName = $absoluteFTPPath . '/' . $onlyFilename;

		// Does the directory exist?
		if (!is_dir($root . '/' . $absoluteFSPath))
		{
			$ret = $this->createDirRecursive($absoluteFSPath, 0755);

			if (($ret === false) && ($this->useFTP))
			{
				$ret = @ftp_chdir($this->handle, $absoluteFTPPath);
			}

			if ($ret === false)
			{
				$this->setError(AKText::sprintf('FTP_COULDNT_UPLOAD', $this->filename));

				return false;
			}
		}

		if ($this->useFTP)
		{
			$ret = @ftp_chdir($this->handle, $absoluteFTPPath);
		}

		// Try copying directly
		$ret = @copy($this->tempFilename, $root . '/' . $this->filename);

		if ($ret === false)
		{
			$this->fixPermissions($this->filename);
			$this->unlink($this->filename);

			$ret = @copy($this->tempFilename, $root . '/' . $this->filename);
		}

		if ($this->useFTP && ($ret === false))
		{
			$ret = @ftp_put($this->handle, $remoteName, $this->tempFilename, FTP_BINARY);

			if ($ret === false)
			{
				// If we couldn't create the file, attempt to fix the permissions in the PHP level and retry!
				$this->fixPermissions($this->filename);
				$this->unlink($this->filename);

				$fp = @fopen($this->tempFilename, 'rb');
				if ($fp !== false)
				{
					$ret = @ftp_fput($this->handle, $remoteName, $fp, FTP_BINARY);
					@fclose($fp);
				}
				else
				{
					$ret = false;
				}
			}
		}

		@unlink($this->tempFilename);

		if ($ret === false)
		{
			$this->setError(AKText::sprintf('FTP_COULDNT_UPLOAD', $this->filename));

			return false;
		}

		$restorePerms = AKFactory::get('kickstart.setup.restoreperms', false);
		$perms = $restorePerms ? $this->perms : 0644;

		$ret = @chmod($root . '/' . $this->filename, $perms);

		if ($this->useFTP && ($ret === false))
		{
			@ftp_chmod($this->_handle, $perms, $remoteName);
		}

		return true;
	}

	/**
	 * Create a temporary filename
	 *
	 * @param string $filename The original filename
	 * @param int    $perms    The file permissions
	 *
	 * @return string
	 */
	public function processFilename($filename, $perms = 0755)
	{
		// Catch some error conditions...
		if ($this->getError())
		{
			return false;
		}

		// If a null filename is passed, it means that we shouldn't do any post processing, i.e.
		// the entity was a directory or symlink
		if (is_null($filename))
		{
			$this->filename = null;
			$this->tempFilename = null;

			return null;
		}

		// Strip absolute filesystem path to website's root
		$removePath = AKFactory::get('kickstart.setup.destdir', '');

		if (!empty($removePath))
		{
			$left = substr($filename, 0, strlen($removePath));

			if ($left == $removePath)
			{
				$filename = substr($filename, strlen($removePath));
			}
		}

		// Trim slash on the left
		$filename = ltrim($filename, '/');

		$this->filename = $filename;
		$this->tempFilename = tempnam($this->tempDir, 'kickstart-');
		$this->perms = $perms;

		if (empty($this->tempFilename))
		{
			// Oops! Let's try something different
			$this->tempFilename = $this->tempDir . '/kickstart-' . time() . '.dat';
		}

		return $this->tempFilename;
	}

	/**
	 * Is the directory writeable?
	 *
	 * @param string $dir The directory ti check
	 *
	 * @return bool
	 */
	private function isDirWritable($dir)
	{
		$fp = @fopen($dir . '/kickstart.dat', 'wb');

		if ($fp === false)
		{
			return false;
		}

		@fclose($fp);
		unlink($dir . '/kickstart.dat');

		return true;
	}

	/**
	 * Create a directory, recursively
	 *
	 * @param string $dirName The directory to create
	 * @param int    $perms   The permissions to give to the directory
	 *
	 * @return bool
	 */
	public function createDirRecursive($dirName, $perms)
	{
		// Strip absolute filesystem path to website's root
		$removePath = AKFactory::get('kickstart.setup.destdir', '');

		if (!empty($removePath))
		{
			// UNIXize the paths
			$removePath = str_replace('\\', '/', $removePath);
			$dirName = str_replace('\\', '/', $dirName);
			// Make sure they both end in a slash
			$removePath = rtrim($removePath, '/\\') . '/';
			$dirName = rtrim($dirName, '/\\') . '/';
			// Process the path removal
			$left = substr($dirName, 0, strlen($removePath));

			if ($left == $removePath)
			{
				$dirName = substr($dirName, strlen($removePath));
			}
		}

		// 'cause the substr() above may return FALSE.
		if (empty($dirName))
		{
			$dirName = '';
		}

		$check = '/' . trim($this->dir, '/') . '/' . trim($dirName, '/');
		$checkFS = $removePath . trim($dirName, '/');

		if ($this->is_dir($check))
		{
			return true;
		}

		$alldirs = explode('/', $dirName);
		$previousDir = '/' . trim($this->dir);
		$previousDirFS = rtrim($removePath, '/\\');

		foreach ($alldirs as $curdir)
		{
			$check = $previousDir . '/' . $curdir;
			$checkFS = $previousDirFS . '/' . $curdir;

			if (!is_dir($checkFS) && !$this->is_dir($check))
			{
				// Proactively try to delete a file by the same name
				if (!@unlink($checkFS) && $this->useFTP)
				{
					@ftp_delete($this->handle, $check);
				}

				$createdDir = @mkdir($checkFS, 0755);

				if (!$createdDir && $this->useFTP)
				{
					$createdDir = @ftp_mkdir($this->handle, $check);
				}

				if ($createdDir === false)
				{
					// If we couldn't create the directory, attempt to fix the permissions in the PHP level and retry!
					$this->fixPermissions($checkFS);

					$createdDir = @mkdir($checkFS, 0755);
					if (!$createdDir && $this->useFTP)
					{
						$createdDir = @ftp_mkdir($this->handle, $check);
					}

					if ($createdDir === false)
					{
						$this->setError(AKText::sprintf('FTP_CANT_CREATE_DIR', $check));

						return false;
					}
				}

				if (!@chmod($checkFS, $perms) && $this->useFTP)
				{
					@ftp_chmod($this->handle, $perms, $check);
				}
			}

			$previousDir = $check;
			$previousDirFS = $checkFS;
		}

		return true;
	}

	/**
	 * Closes the FTP connection
	 */
	public function close()
	{
		if (!$this->useFTP)
		{
			@ftp_close($this->handle);
		}
	}

	/**
	 * Tries to fix directory/file permissions in the PHP level, so that
	 * the FTP operation doesn't fail.
	 *
	 * @param $path string The full path to a directory or file
	 */
	private function fixPermissions($path)
	{
		// Turn off error reporting
		if (!defined('KSDEBUG'))
		{
			$oldErrorReporting = @error_reporting(E_NONE);
		}

		// Get UNIX style paths
		$relPath = str_replace('\\', '/', $path);
		$basePath = rtrim(str_replace('\\', '/', KSROOTDIR), '/');
		$basePath = rtrim($basePath, '/');

		if (!empty($basePath))
		{
			$basePath .= '/';
		}

		// Remove the leading relative root
		if (substr($relPath, 0, strlen($basePath)) == $basePath)
		{
			$relPath = substr($relPath, strlen($basePath));
		}

		$dirArray = explode('/', $relPath);
		$pathBuilt = rtrim($basePath, '/');

		foreach ($dirArray as $dir)
		{
			if (empty($dir))
			{
				continue;
			}

			$oldPath = $pathBuilt;
			$pathBuilt .= '/' . $dir;

			if (is_dir($oldPath . $dir))
			{
				@chmod($oldPath . $dir, 0777);
			}
			else
			{
				if (@chmod($oldPath . $dir, 0777) === false)
				{
					@unlink($oldPath . $dir);
				}
			}
		}

		// Restore error reporting
		if (!defined('KSDEBUG'))
		{
			@error_reporting($oldErrorReporting);
		}
	}

	public function chmod($file, $perms)
	{
		if (AKFactory::get('kickstart.setup.dryrun', '0'))
		{
			return true;
		}

		$ret = @chmod($file, $perms);

		if (!$ret && $this->useFTP)
		{
			// Strip absolute filesystem path to website's root
			$removePath = AKFactory::get('kickstart.setup.destdir', '');

			if (!empty($removePath))
			{
				$left = substr($file, 0, strlen($removePath));

				if ($left == $removePath)
				{
					$file = substr($file, strlen($removePath));
				}
			}

			// Trim slash on the left
			$file = ltrim($file, '/');

			$ret = @ftp_chmod($this->handle, $perms, $file);
		}

		return $ret;
	}

	private function is_dir($dir)
	{
		if ($this->useFTP)
		{
			return @ftp_chdir($this->handle, $dir);
		}

		return false;
	}

	public function unlink($file)
	{
		$ret = @unlink($file);

		if (!$ret && $this->useFTP)
		{
			$removePath = AKFactory::get('kickstart.setup.destdir', '');
			if (!empty($removePath))
			{
				$left = substr($file, 0, strlen($removePath));
				if ($left == $removePath)
				{
					$file = substr($file, strlen($removePath));
				}
			}

			$check = '/' . trim($this->dir, '/') . '/' . trim($file, '/');

			$ret = @ftp_delete($this->handle, $check);
		}

		return $ret;
	}

	public function rmdir($directory)
	{
		$ret = @rmdir($directory);

		if (!$ret && $this->useFTP)
		{
			$removePath = AKFactory::get('kickstart.setup.destdir', '');
			if (!empty($removePath))
			{
				$left = substr($directory, 0, strlen($removePath));
				if ($left == $removePath)
				{
					$directory = substr($directory, strlen($removePath));
				}
			}

			$check = '/' . trim($this->dir, '/') . '/' . trim($directory, '/');

			$ret = @ftp_rmdir($this->handle, $check);
		}

		return $ret;
	}

	public function rename($from, $to)
	{
		$ret = @rename($from, $to);

		if (!$ret && $this->useFTP)
		{
			$originalFrom = $from;
			$originalTo = $to;

			$removePath = AKFactory::get('kickstart.setup.destdir', '');
			if (!empty($removePath))
			{
				$left = substr($from, 0, strlen($removePath));
				if ($left == $removePath)
				{
					$from = substr($from, strlen($removePath));
				}
			}
			$from = '/' . trim($this->dir, '/') . '/' . trim($from, '/');

			if (!empty($removePath))
			{
				$left = substr($to, 0, strlen($removePath));
				if ($left == $removePath)
				{
					$to = substr($to, strlen($removePath));
				}
			}
			$to = '/' . trim($this->dir, '/') . '/' . trim($to, '/');

			$ret = @ftp_rename($this->handle, $from, $to);
		}

		return $ret;
	}
}

/**
 * Akeeba Restore
 * A JSON-powered JPA, JPS and ZIP archive extraction library
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / Akeeba Ltd.
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

/**
 * JPA archive extraction class
 */
class AKUnarchiverJPA extends AKAbstractUnarchiver
{
	protected $archiveHeaderData = array();

	protected function readArchiveHeader()
	{
		debugMsg('Preparing to read archive header');
		// Initialize header data array
		$this->archiveHeaderData = new stdClass();

		// Open the first part
		debugMsg('Opening the first part');
		$this->nextFile();

		// Fail for unreadable files
		if( $this->fp === false ) {
			debugMsg('Could not open the first part');
			return false;
		}

		// Read the signature
		$sig = fread( $this->fp, 3 );

		if ($sig != 'JPA')
		{
			// Not a JPA file
			debugMsg('Invalid archive signature');
			$this->setError( AKText::_('ERR_NOT_A_JPA_FILE') );
			return false;
		}

		// Read and parse header length
		$header_length_array = unpack( 'v', fread( $this->fp, 2 ) );
		$header_length = $header_length_array[1];

		// Read and parse the known portion of header data (14 bytes)
		$bin_data = fread($this->fp, 14);
		$header_data = unpack('Cmajor/Cminor/Vcount/Vuncsize/Vcsize', $bin_data);

		// Load any remaining header data (forward compatibility)
		$rest_length = $header_length - 19;
		if( $rest_length > 0 )
			$junk = fread($this->fp, $rest_length);
		else
			$junk = '';

		// Temporary array with all the data we read
		$temp = array(
			'signature' => 			$sig,
			'length' => 			$header_length,
			'major' => 				$header_data['major'],
			'minor' => 				$header_data['minor'],
			'filecount' => 			$header_data['count'],
			'uncompressedsize' => 	$header_data['uncsize'],
			'compressedsize' => 	$header_data['csize'],
			'unknowndata' => 		$junk
		);
		// Array-to-object conversion
		foreach($temp as $key => $value)
		{
			$this->archiveHeaderData->{$key} = $value;
		}

		debugMsg('Header data:');
		debugMsg('Length              : '.$header_length);
		debugMsg('Major               : '.$header_data['major']);
		debugMsg('Minor               : '.$header_data['minor']);
		debugMsg('File count          : '.$header_data['count']);
		debugMsg('Uncompressed size   : '.$header_data['uncsize']);
		debugMsg('Compressed size	  : '.$header_data['csize']);

		$this->currentPartOffset = @ftell($this->fp);

		$this->dataReadLength = 0;

		return true;
	}

	/**
	 * Concrete classes must use this method to read the file header
	 * @return bool True if reading the file was successful, false if an error occured or we reached end of archive
	 */
	protected function readFileHeader()
	{
		// If the current part is over, proceed to the next part please
		if( $this->isEOF(true) ) {
			debugMsg('Archive part EOF; moving to next file');
			$this->nextFile();
		}

		debugMsg('Reading file signature');
		// Get and decode Entity Description Block
		$signature = fread($this->fp, 3);

		$this->fileHeader = new stdClass();
		$this->fileHeader->timestamp = 0;

		// Check signature
		if( $signature != 'JPF' )
		{
			if($this->isEOF(true))
			{
				// This file is finished; make sure it's the last one
				$this->nextFile();
				if(!$this->isEOF(false))
				{
					debugMsg('Invalid file signature before end of archive encountered');
					$this->setError(AKText::sprintf('INVALID_FILE_HEADER', $this->currentPartNumber, $this->currentPartOffset));
					return false;
				}
				// We're just finished
				return false;
			}
			else
			{
				$screwed = true;
				if(AKFactory::get('kickstart.setup.ignoreerrors', false)) {
					debugMsg('Invalid file block signature; launching heuristic file block signature scanner');
					$screwed = !$this->heuristicFileHeaderLocator();
					if(!$screwed) {
						$signature = 'JPF';
					} else {
						debugMsg('Heuristics failed. Brace yourself for the imminent crash.');
					}
				}
				if($screwed) {
					debugMsg('Invalid file block signature');
					// This is not a file block! The archive is corrupt.
					$this->setError(AKText::sprintf('INVALID_FILE_HEADER', $this->currentPartNumber, $this->currentPartOffset));
					return false;
				}
			}
		}
		// This a JPA Entity Block. Process the header.

		$isBannedFile = false;

		// Read length of EDB and of the Entity Path Data
		$length_array = unpack('vblocksize/vpathsize', fread($this->fp, 4));
		// Read the path data
		if($length_array['pathsize'] > 0) {
			$file = fread( $this->fp, $length_array['pathsize'] );
		} else {
			$file = '';
		}

		// Handle file renaming
		$isRenamed = false;
		if(is_array($this->renameFiles) && (count($this->renameFiles) > 0) )
		{
			if(array_key_exists($file, $this->renameFiles))
			{
				$file = $this->renameFiles[$file];
				$isRenamed = true;
			}
		}

		// Handle directory renaming
		$isDirRenamed = false;
		if(is_array($this->renameDirs) && (count($this->renameDirs) > 0)) {
			if(array_key_exists(dirname($file), $this->renameDirs)) {
				$file = rtrim($this->renameDirs[dirname($file)],'/').'/'.basename($file);
				$isRenamed = true;
				$isDirRenamed = true;
			}
		}

		// Read and parse the known data portion
		$bin_data = fread( $this->fp, 14 );
		$header_data = unpack('Ctype/Ccompression/Vcompsize/Vuncompsize/Vperms', $bin_data);
		// Read any unknown data
		$restBytes = $length_array['blocksize'] - (21 + $length_array['pathsize']);
		if( $restBytes > 0 )
		{
			// Start reading the extra fields
			while($restBytes >= 4)
			{
				$extra_header_data = fread($this->fp, 4);
				$extra_header = unpack('vsignature/vlength', $extra_header_data);
				$restBytes -= 4;
				$extra_header['length'] -= 4;
				switch($extra_header['signature'])
				{
					case 256:
						// File modified timestamp
						if($extra_header['length'] > 0)
						{
							$bindata = fread($this->fp, $extra_header['length']);
							$restBytes -= $extra_header['length'];
							$timestamps = unpack('Vmodified', substr($bindata,0,4));
							$filectime = $timestamps['modified'];
							$this->fileHeader->timestamp = $filectime;
						}
						break;

					default:
						// Unknown field
						if($extra_header['length']>0) {
							$junk = fread($this->fp, $extra_header['length']);
							$restBytes -= $extra_header['length'];
						}
						break;
				}
			}
			if($restBytes > 0) $junk = fread($this->fp, $restBytes);
		}

		$compressionType = $header_data['compression'];

		// Populate the return array
		$this->fileHeader->file = $file;
		$this->fileHeader->compressed = $header_data['compsize'];
		$this->fileHeader->uncompressed = $header_data['uncompsize'];
		switch($header_data['type'])
		{
			case 0:
				$this->fileHeader->type = 'dir';
				break;

			case 1:
				$this->fileHeader->type = 'file';
				break;

			case 2:
				$this->fileHeader->type = 'link';
				break;
		}
		switch( $compressionType )
		{
			case 0:
				$this->fileHeader->compression = 'none';
				break;
			case 1:
				$this->fileHeader->compression = 'gzip';
				break;
			case 2:
				$this->fileHeader->compression = 'bzip2';
				break;
		}
		$this->fileHeader->permissions = $header_data['perms'];

		// Find hard-coded banned files
		if( (basename($this->fileHeader->file) == ".") || (basename($this->fileHeader->file) == "..") )
		{
			$isBannedFile = true;
		}

		// Also try to find banned files passed in class configuration
		if((count($this->skipFiles) > 0) && (!$isRenamed) )
		{
			if(in_array($this->fileHeader->file, $this->skipFiles))
			{
				$isBannedFile = true;
			}
		}

		// If we have a banned file, let's skip it
		if($isBannedFile)
		{
			debugMsg('Skipping file '.$this->fileHeader->file);
			// Advance the file pointer, skipping exactly the size of the compressed data
			$seekleft = $this->fileHeader->compressed;
			while($seekleft > 0)
			{
				// Ensure that we can seek past archive part boundaries
				$curSize = @filesize($this->archiveList[$this->currentPartNumber]);
				$curPos = @ftell($this->fp);
				$canSeek = $curSize - $curPos;
				if($canSeek > $seekleft) $canSeek = $seekleft;
				@fseek( $this->fp, $canSeek, SEEK_CUR );
				$seekleft -= $canSeek;
				if($seekleft) $this->nextFile();
			}

			$this->currentPartOffset = @ftell($this->fp);
			$this->runState = AK_STATE_DONE;
			return true;
		}

		// Last chance to prepend a path to the filename
		if(!empty($this->addPath) && !$isDirRenamed)
		{
			$this->fileHeader->file = $this->addPath.$this->fileHeader->file;
		}

		// Get the translated path name
		$restorePerms = AKFactory::get('kickstart.setup.restoreperms', false);
		if($this->fileHeader->type == 'file')
		{
			// Regular file; ask the postproc engine to process its filename
			if($restorePerms)
			{
				$this->fileHeader->realFile = $this->postProcEngine->processFilename( $this->fileHeader->file, $this->fileHeader->permissions );
			}
			else
			{
				$this->fileHeader->realFile = $this->postProcEngine->processFilename( $this->fileHeader->file );
			}
		}
		elseif($this->fileHeader->type == 'dir')
		{
			$dir = $this->fileHeader->file;

			// Directory; just create it
			if($restorePerms)
			{
				$this->postProcEngine->createDirRecursive( $this->fileHeader->file, $this->fileHeader->permissions );
			}
			else
			{
				$this->postProcEngine->createDirRecursive( $this->fileHeader->file, 0755 );
			}
			$this->postProcEngine->processFilename(null);
		}
		else
		{
			// Symlink; do not post-process
			$this->postProcEngine->processFilename(null);
		}

		$this->createDirectory();

		// Header is read
		$this->runState = AK_STATE_HEADER;

		$this->dataReadLength = 0;

		return true;
	}

	/**
	 * Concrete classes must use this method to process file data. It must set $runState to AK_STATE_DATAREAD when
	 * it's finished processing the file data.
	 * @return bool True if processing the file data was successful, false if an error occured
	 */
	protected function processFileData()
	{
		switch( $this->fileHeader->type )
		{
			case 'dir':
				return $this->processTypeDir();
				break;

			case 'link':
				return $this->processTypeLink();
				break;

			case 'file':
				switch($this->fileHeader->compression)
				{
					case 'none':
						return $this->processTypeFileUncompressed();
						break;

					case 'gzip':
					case 'bzip2':
						return $this->processTypeFileCompressedSimple();
						break;

				}
				break;

			default:
				debugMsg('Unknown file type '.$this->fileHeader->type);
				break;
		}
	}

	private function processTypeFileUncompressed()
	{
		// Uncompressed files are being processed in small chunks, to avoid timeouts
		if( ($this->dataReadLength == 0) && !AKFactory::get('kickstart.setup.dryrun','0') )
		{
			// Before processing file data, ensure permissions are adequate
			$this->setCorrectPermissions( $this->fileHeader->file );
		}

		// Open the output file
		if( !AKFactory::get('kickstart.setup.dryrun','0') )
		{
			$ignore = AKFactory::get('kickstart.setup.ignoreerrors', false) || $this->isIgnoredDirectory($this->fileHeader->file);
			if ($this->dataReadLength == 0) {
				$outfp = @fopen( $this->fileHeader->realFile, 'wb' );
			} else {
				$outfp = @fopen( $this->fileHeader->realFile, 'ab' );
			}

			// Can we write to the file?
			if( ($outfp === false) && (!$ignore) ) {
				// An error occured
				debugMsg('Could not write to output file');
				$this->setError( AKText::sprintf('COULDNT_WRITE_FILE', $this->fileHeader->realFile) );
				return false;
			}
		}

		// Does the file have any data, at all?
		if( $this->fileHeader->compressed == 0 )
		{
			// No file data!
			if( !AKFactory::get('kickstart.setup.dryrun','0') && is_resource($outfp) ) @fclose($outfp);
			$this->runState = AK_STATE_DATAREAD;
			return true;
		}

		// Reference to the global timer
		$timer = AKFactory::getTimer();

		$toReadBytes = 0;
		$leftBytes = $this->fileHeader->compressed - $this->dataReadLength;

		// Loop while there's data to read and enough time to do it
		while( ($leftBytes > 0) && ($timer->getTimeLeft() > 0) )
		{
			$toReadBytes = ($leftBytes > $this->chunkSize) ? $this->chunkSize : $leftBytes;
			$data = $this->fread( $this->fp, $toReadBytes );
			$reallyReadBytes = akstringlen($data);
			$leftBytes -= $reallyReadBytes;
			$this->dataReadLength += $reallyReadBytes;
			if($reallyReadBytes < $toReadBytes)
			{
				// We read less than requested! Why? Did we hit local EOF?
				if( $this->isEOF(true) && !$this->isEOF(false) )
				{
					// Yeap. Let's go to the next file
					$this->nextFile();
				}
				else
				{
					// Nope. The archive is corrupt
					debugMsg('Not enough data in file. The archive is truncated or corrupt.');
					$this->setError( AKText::_('ERR_CORRUPT_ARCHIVE') );
					return false;
				}
			}
			if( !AKFactory::get('kickstart.setup.dryrun','0') )
				if(is_resource($outfp)) @fwrite( $outfp, $data );
		}

		// Close the file pointer
		if( !AKFactory::get('kickstart.setup.dryrun','0') )
			if(is_resource($outfp)) @fclose($outfp);

		// Was this a pre-timeout bail out?
		if( $leftBytes > 0 )
		{
			$this->runState = AK_STATE_DATA;
		}
		else
		{
			// Oh! We just finished!
			$this->runState = AK_STATE_DATAREAD;
			$this->dataReadLength = 0;
		}

		return true;
	}

	private function processTypeFileCompressedSimple()
	{
		if( !AKFactory::get('kickstart.setup.dryrun','0') )
		{
			// Before processing file data, ensure permissions are adequate
			$this->setCorrectPermissions( $this->fileHeader->file );

			// Open the output file
			$outfp = @fopen( $this->fileHeader->realFile, 'wb' );

			// Can we write to the file?
			$ignore = AKFactory::get('kickstart.setup.ignoreerrors', false) || $this->isIgnoredDirectory($this->fileHeader->file);
			if( ($outfp === false) && (!$ignore) ) {
				// An error occured
				debugMsg('Could not write to output file');
				$this->setError( AKText::sprintf('COULDNT_WRITE_FILE', $this->fileHeader->realFile) );
				return false;
			}
		}

		// Does the file have any data, at all?
		if( $this->fileHeader->compressed == 0 )
		{
			// No file data!
			if( !AKFactory::get('kickstart.setup.dryrun','0') )
				if(is_resource($outfp)) @fclose($outfp);
			$this->runState = AK_STATE_DATAREAD;
			return true;
		}

		// Simple compressed files are processed as a whole; we can't do chunk processing
		$zipData = $this->fread( $this->fp, $this->fileHeader->compressed );
		while( akstringlen($zipData) < $this->fileHeader->compressed )
		{
			// End of local file before reading all data, but have more archive parts?
			if($this->isEOF(true) && !$this->isEOF(false))
			{
				// Yeap. Read from the next file
				$this->nextFile();
				$bytes_left = $this->fileHeader->compressed - akstringlen($zipData);
				$zipData .= $this->fread( $this->fp, $bytes_left );
			}
			else
			{
				debugMsg('End of local file before reading all data with no more parts left. The archive is corrupt or truncated.');
				$this->setError( AKText::_('ERR_CORRUPT_ARCHIVE') );
				return false;
			}
		}

		if($this->fileHeader->compression == 'gzip')
		{
			$unzipData = gzinflate( $zipData );
		}
		elseif($this->fileHeader->compression == 'bzip2')
		{
			$unzipData = bzdecompress( $zipData );
		}
		unset($zipData);

		// Write to the file.
		if( !AKFactory::get('kickstart.setup.dryrun','0') && is_resource($outfp) )
		{
			@fwrite( $outfp, $unzipData, $this->fileHeader->uncompressed );
			@fclose( $outfp );
		}
		unset($unzipData);

		$this->runState = AK_STATE_DATAREAD;
		return true;
	}

	/**
	 * Process the file data of a link entry
	 * @return bool
	 */
	private function processTypeLink()
	{
		$readBytes = 0;
		$toReadBytes = 0;
		$leftBytes = $this->fileHeader->compressed;
		$data = '';

		while( $leftBytes > 0)
		{
			$toReadBytes = ($leftBytes > $this->chunkSize) ? $this->chunkSize : $leftBytes;
			$mydata = $this->fread( $this->fp, $toReadBytes );
			$reallyReadBytes = akstringlen($mydata);
			$data .= $mydata;
			$leftBytes -= $reallyReadBytes;
			if($reallyReadBytes < $toReadBytes)
			{
				// We read less than requested! Why? Did we hit local EOF?
				if( $this->isEOF(true) && !$this->isEOF(false) )
				{
					// Yeap. Let's go to the next file
					$this->nextFile();
				}
				else
				{
					debugMsg('End of local file before reading all data with no more parts left. The archive is corrupt or truncated.');
					// Nope. The archive is corrupt
					$this->setError( AKText::_('ERR_CORRUPT_ARCHIVE') );
					return false;
				}
			}
		}

		// Try to remove an existing file or directory by the same name
		if(file_exists($this->fileHeader->realFile)) { @unlink($this->fileHeader->realFile); @rmdir($this->fileHeader->realFile); }
		// Remove any trailing slash
		if(substr($this->fileHeader->realFile, -1) == '/') $this->fileHeader->realFile = substr($this->fileHeader->realFile, 0, -1);
		// Create the symlink - only possible within PHP context. There's no support built in the FTP protocol, so no postproc use is possible here :(
		if( !AKFactory::get('kickstart.setup.dryrun','0') )
			@symlink($data, $this->fileHeader->realFile);

		$this->runState = AK_STATE_DATAREAD;

		return true; // No matter if the link was created!
	}

	/**
	 * Process the file data of a directory entry
	 * @return bool
	 */
	private function processTypeDir()
	{
		// Directory entries in the JPA do not have file data, therefore we're done processing the entry
		$this->runState = AK_STATE_DATAREAD;
		return true;
	}

	/**
	 * Creates the directory this file points to
	 */
	protected function createDirectory()
	{
		if( AKFactory::get('kickstart.setup.dryrun','0') ) return true;

		// Do we need to create a directory?
		if(empty($this->fileHeader->realFile)) $this->fileHeader->realFile = $this->fileHeader->file;
		$lastSlash = strrpos($this->fileHeader->realFile, '/');
		$dirName = substr( $this->fileHeader->realFile, 0, $lastSlash);
		$perms = $this->flagRestorePermissions ? $this->fileHeader->permissions : 0755;
		$ignore = AKFactory::get('kickstart.setup.ignoreerrors', false) || $this->isIgnoredDirectory($dirName);
		if( ($this->postProcEngine->createDirRecursive($dirName, $perms) == false) && (!$ignore) ) {
			$this->setError( AKText::sprintf('COULDNT_CREATE_DIR', $dirName) );
			return false;
		}
		else
		{
			return true;
		}
	}

	protected function heuristicFileHeaderLocator()
	{
		$ret = false;
		$fullEOF = false;

		while(!$ret && !$fullEOF) {
			$this->currentPartOffset = @ftell($this->fp);
			if($this->isEOF(true)) {
				$this->nextFile();
			}

			if($this->isEOF(false)) {
				$fullEOF = true;
				continue;
			}

			// Read 512Kb
			$chunk = fread($this->fp, 524288);
			$size_read = mb_strlen($chunk,'8bit');
			//$pos = strpos($chunk, 'JPF');
			$pos = mb_strpos($chunk, 'JPF', 0, '8bit');
			if($pos !== false) {
				// We found it!
				$this->currentPartOffset += $pos + 3;
				@fseek($this->fp, $this->currentPartOffset, SEEK_SET);
				$ret = true;
			} else {
				// Not yet found :(
				$this->currentPartOffset = @ftell($this->fp);
			}
		}

		return $ret;
	}
}

/**
 * Akeeba Restore
 * A JSON-powered JPA, JPS and ZIP archive extraction library
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / Akeeba Ltd.
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

/**
 * ZIP archive extraction class
 *
 * Since the file data portion of ZIP and JPA are similarly structured (it's empty for dirs,
 * linked node name for symlinks, dumped binary data for no compressions and dumped gzipped
 * binary data for gzip compression) we just have to subclass AKUnarchiverJPA and change the
 * header reading bits. Reusable code ;)
 */
class AKUnarchiverZIP extends AKUnarchiverJPA
{
	var $expectDataDescriptor = false;

	protected function readArchiveHeader()
	{
		debugMsg('Preparing to read archive header');
		// Initialize header data array
		$this->archiveHeaderData = new stdClass();

		// Open the first part
		debugMsg('Opening the first part');
		$this->nextFile();

		// Fail for unreadable files
		if( $this->fp === false ) {
			debugMsg('The first part is not readable');
			return false;
		}

		// Read a possible multipart signature
		$sigBinary = fread( $this->fp, 4 );
		$headerData = unpack('Vsig', $sigBinary);

		// Roll back if it's not a multipart archive
		if( $headerData['sig'] == 0x04034b50 ) {
			debugMsg('The archive is not multipart');
			fseek($this->fp, -4, SEEK_CUR);
		} else {
			debugMsg('The archive is multipart');
		}

		$multiPartSigs = array(
			0x08074b50,		// Multi-part ZIP
			0x30304b50,		// Multi-part ZIP (alternate)
			0x04034b50		// Single file
		);
		if( !in_array($headerData['sig'], $multiPartSigs) )
		{
			debugMsg('Invalid header signature '.dechex($headerData['sig']));
			$this->setError(AKText::_('ERR_CORRUPT_ARCHIVE'));
			return false;
		}

		$this->currentPartOffset = @ftell($this->fp);
		debugMsg('Current part offset after reading header: '.$this->currentPartOffset);

		$this->dataReadLength = 0;

		return true;
	}

	/**
	 * Concrete classes must use this method to read the file header
	 * @return bool True if reading the file was successful, false if an error occured or we reached end of archive
	 */
	protected function readFileHeader()
	{
		// If the current part is over, proceed to the next part please
		if( $this->isEOF(true) ) {
			debugMsg('Opening next archive part');
			$this->nextFile();
		}

		if($this->expectDataDescriptor)
		{
			// The last file had bit 3 of the general purpose bit flag set. This means that we have a
			// 12 byte data descriptor we need to skip. To make things worse, there might also be a 4
			// byte optional data descriptor header (0x08074b50).
			$junk = @fread($this->fp, 4);
			$junk = unpack('Vsig', $junk);
			if($junk['sig'] == 0x08074b50) {
				// Yes, there was a signature
				$junk = @fread($this->fp, 12);
				debugMsg('Data descriptor (w/ header) skipped at '.(ftell($this->fp)-12));
			} else {
				// No, there was no signature, just read another 8 bytes
				$junk = @fread($this->fp, 8);
				debugMsg('Data descriptor (w/out header) skipped at '.(ftell($this->fp)-8));
			}

			// And check for EOF, too
			if( $this->isEOF(true) ) {
				debugMsg('EOF before reading header');

				$this->nextFile();
			}
		}

		// Get and decode Local File Header
		$headerBinary = fread($this->fp, 30);
		$headerData = unpack('Vsig/C2ver/vbitflag/vcompmethod/vlastmodtime/vlastmoddate/Vcrc/Vcompsize/Vuncomp/vfnamelen/veflen', $headerBinary);

		// Check signature
		if(!( $headerData['sig'] == 0x04034b50 ))
		{
			debugMsg('Not a file signature at '.(ftell($this->fp)-4));

			// The signature is not the one used for files. Is this a central directory record (i.e. we're done)?
			if($headerData['sig'] == 0x02014b50)
			{
				debugMsg('EOCD signature at '.(ftell($this->fp)-4));
				// End of ZIP file detected. We'll just skip to the end of file...
				while( $this->nextFile() ) {};
				@fseek($this->fp, 0, SEEK_END); // Go to EOF
				return false;
			}
			else
			{
				debugMsg( 'Invalid signature ' . dechex($headerData['sig']) . ' at '.ftell($this->fp) );
				$this->setError(AKText::_('ERR_CORRUPT_ARCHIVE'));
				return false;
			}
		}

		// If bit 3 of the bitflag is set, expectDataDescriptor is true
		$this->expectDataDescriptor = ($headerData['bitflag'] & 4) == 4;

		$this->fileHeader = new stdClass();
		$this->fileHeader->timestamp = 0;

		// Read the last modified data and time
		$lastmodtime = $headerData['lastmodtime'];
		$lastmoddate = $headerData['lastmoddate'];

		if($lastmoddate && $lastmodtime)
		{
			// ----- Extract time
			$v_hour = ($lastmodtime & 0xF800) >> 11;
			$v_minute = ($lastmodtime & 0x07E0) >> 5;
			$v_seconde = ($lastmodtime & 0x001F)*2;

			// ----- Extract date
			$v_year = (($lastmoddate & 0xFE00) >> 9) + 1980;
			$v_month = ($lastmoddate & 0x01E0) >> 5;
			$v_day = $lastmoddate & 0x001F;

			// ----- Get UNIX date format
			$this->fileHeader->timestamp = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);
		}

		$isBannedFile = false;

		$this->fileHeader->compressed	= $headerData['compsize'];
		$this->fileHeader->uncompressed	= $headerData['uncomp'];
		$nameFieldLength				= $headerData['fnamelen'];
		$extraFieldLength				= $headerData['eflen'];

		// Read filename field
		$this->fileHeader->file			= fread( $this->fp, $nameFieldLength );

		// Handle file renaming
		$isRenamed = false;
		if(is_array($this->renameFiles) && (count($this->renameFiles) > 0) )
		{
			if(array_key_exists($this->fileHeader->file, $this->renameFiles))
			{
				$this->fileHeader->file = $this->renameFiles[$this->fileHeader->file];
				$isRenamed = true;
			}
		}

		// Handle directory renaming
		$isDirRenamed = false;
		if(is_array($this->renameDirs) && (count($this->renameDirs) > 0)) {
			if(array_key_exists(dirname($this->fileHeader->file), $this->renameDirs)) {
				$file = rtrim($this->renameDirs[dirname($this->fileHeader->file)],'/').'/'.basename($this->fileHeader->file);
				$isRenamed = true;
				$isDirRenamed = true;
			}
		}

		// Read extra field if present
		if($extraFieldLength > 0) {
			$extrafield = fread( $this->fp, $extraFieldLength );
		}

		debugMsg( '*'.ftell($this->fp).' IS START OF '.$this->fileHeader->file. ' ('.$this->fileHeader->compressed.' bytes)' );


		// Decide filetype -- Check for directories
		$this->fileHeader->type = 'file';
		if( strrpos($this->fileHeader->file, '/') == strlen($this->fileHeader->file) - 1 ) $this->fileHeader->type = 'dir';
		// Decide filetype -- Check for symbolic links
		if( ($headerData['ver1'] == 10) && ($headerData['ver2'] == 3) )$this->fileHeader->type = 'link';

		switch( $headerData['compmethod'] )
		{
			case 0:
				$this->fileHeader->compression = 'none';
				break;
			case 8:
				$this->fileHeader->compression = 'gzip';
				break;
		}

		// Find hard-coded banned files
		if( (basename($this->fileHeader->file) == ".") || (basename($this->fileHeader->file) == "..") )
		{
			$isBannedFile = true;
		}

		// Also try to find banned files passed in class configuration
		if((count($this->skipFiles) > 0) && (!$isRenamed))
		{
			if(in_array($this->fileHeader->file, $this->skipFiles))
			{
				$isBannedFile = true;
			}
		}

		// If we have a banned file, let's skip it
		if($isBannedFile)
		{
			// Advance the file pointer, skipping exactly the size of the compressed data
			$seekleft = $this->fileHeader->compressed;
			while($seekleft > 0)
			{
				// Ensure that we can seek past archive part boundaries
				$curSize = @filesize($this->archiveList[$this->currentPartNumber]);
				$curPos = @ftell($this->fp);
				$canSeek = $curSize - $curPos;
				if($canSeek > $seekleft) $canSeek = $seekleft;
				@fseek( $this->fp, $canSeek, SEEK_CUR );
				$seekleft -= $canSeek;
				if($seekleft) $this->nextFile();
			}

			$this->currentPartOffset = @ftell($this->fp);
			$this->runState = AK_STATE_DONE;
			return true;
		}

		// Last chance to prepend a path to the filename
		if(!empty($this->addPath) && !$isDirRenamed)
		{
			$this->fileHeader->file = $this->addPath.$this->fileHeader->file;
		}

		// Get the translated path name
		if($this->fileHeader->type == 'file')
		{
			$this->fileHeader->realFile = $this->postProcEngine->processFilename( $this->fileHeader->file );
		}
		elseif($this->fileHeader->type == 'dir')
		{
			$this->fileHeader->timestamp = 0;

			$dir = $this->fileHeader->file;

			$this->postProcEngine->createDirRecursive( $this->fileHeader->file, 0755 );
			$this->postProcEngine->processFilename(null);
		}
		else
		{
			// Symlink; do not post-process
			$this->fileHeader->timestamp = 0;
			$this->postProcEngine->processFilename(null);
		}

		$this->createDirectory();

		// Header is read
		$this->runState = AK_STATE_HEADER;

		return true;
	}

}

/**
 * Akeeba Restore
 * A JSON-powered JPA, JPS and ZIP archive extraction library
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / Akeeba Ltd.
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

/**
 * JPS archive extraction class
 */
class AKUnarchiverJPS extends AKUnarchiverJPA
{
	protected $archiveHeaderData = array();

	protected $password = '';

	public function __construct()
	{
		parent::__construct();

		$this->password = AKFactory::get('kickstart.jps.password','');
	}

	protected function readArchiveHeader()
	{
		// Initialize header data array
		$this->archiveHeaderData = new stdClass();

		// Open the first part
		$this->nextFile();

		// Fail for unreadable files
		if( $this->fp === false ) return false;

		// Read the signature
		$sig = fread( $this->fp, 3 );

		if ($sig != 'JPS')
		{
			// Not a JPA file
			$this->setError( AKText::_('ERR_NOT_A_JPS_FILE') );
			return false;
		}

		// Read and parse the known portion of header data (5 bytes)
		$bin_data = fread($this->fp, 5);
		$header_data = unpack('Cmajor/Cminor/cspanned/vextra', $bin_data);

		// Load any remaining header data (forward compatibility)
		$rest_length = $header_data['extra'];
		if( $rest_length > 0 )
			$junk = fread($this->fp, $rest_length);
		else
			$junk = '';

		// Temporary array with all the data we read
		$temp = array(
			'signature' => 			$sig,
			'major' => 				$header_data['major'],
			'minor' => 				$header_data['minor'],
			'spanned' => 			$header_data['spanned']
		);
		// Array-to-object conversion
		foreach($temp as $key => $value)
		{
			$this->archiveHeaderData->{$key} = $value;
		}

		$this->currentPartOffset = @ftell($this->fp);

		$this->dataReadLength = 0;

		return true;
	}

	/**
	 * Concrete classes must use this method to read the file header
	 * @return bool True if reading the file was successful, false if an error occured or we reached end of archive
	 */
	protected function readFileHeader()
	{
		// If the current part is over, proceed to the next part please
		if( $this->isEOF(true) ) {
			$this->nextFile();
		}

		// Get and decode Entity Description Block
		$signature = fread($this->fp, 3);

		// Check for end-of-archive siganture
		if($signature == 'JPE')
		{
			$this->setState('postrun');
			return true;
		}

		$this->fileHeader = new stdClass();
		$this->fileHeader->timestamp = 0;

		// Check signature
		if( $signature != 'JPF' )
		{
			if($this->isEOF(true))
			{
				// This file is finished; make sure it's the last one
				$this->nextFile();
				if(!$this->isEOF(false))
				{
					$this->setError(AKText::sprintf('INVALID_FILE_HEADER', $this->currentPartNumber, $this->currentPartOffset));
					return false;
				}
				// We're just finished
				return false;
			}
			else
			{
				fseek($this->fp, -6, SEEK_CUR);
				$signature = fread($this->fp, 3);
				if($signature == 'JPE')
				{
					return false;
				}

				$this->setError(AKText::sprintf('INVALID_FILE_HEADER', $this->currentPartNumber, $this->currentPartOffset));
				return false;
			}
		}
		// This a JPA Entity Block. Process the header.

		$isBannedFile = false;

		// Read and decrypt the header
		$edbhData = fread($this->fp, 4);
		$edbh = unpack('vencsize/vdecsize', $edbhData);
		$bin_data = fread($this->fp, $edbh['encsize']);

		// Decrypt and truncate
		$bin_data = AKEncryptionAES::AESDecryptCBC($bin_data, $this->password, 128);
		$bin_data = substr($bin_data,0,$edbh['decsize']);

		// Read length of EDB and of the Entity Path Data
		$length_array = unpack('vpathsize', substr($bin_data,0,2) );
		// Read the path data
		$file = substr($bin_data,2,$length_array['pathsize']);

		// Handle file renaming
		$isRenamed = false;
		if(is_array($this->renameFiles) && (count($this->renameFiles) > 0) )
		{
			if(array_key_exists($file, $this->renameFiles))
			{
				$file = $this->renameFiles[$file];
				$isRenamed = true;
			}
		}

		// Handle directory renaming
		$isDirRenamed = false;
		if(is_array($this->renameDirs) && (count($this->renameDirs) > 0)) {
			if(array_key_exists(dirname($file), $this->renameDirs)) {
				$file = rtrim($this->renameDirs[dirname($file)],'/').'/'.basename($file);
				$isRenamed = true;
				$isDirRenamed = true;
			}
		}

		// Read and parse the known data portion
		$bin_data = substr($bin_data, 2 + $length_array['pathsize']);
		$header_data = unpack('Ctype/Ccompression/Vuncompsize/Vperms/Vfilectime', $bin_data);

		$this->fileHeader->timestamp = $header_data['filectime'];
		$compressionType = $header_data['compression'];

		// Populate the return array
		$this->fileHeader->file = $file;
		$this->fileHeader->uncompressed = $header_data['uncompsize'];
		switch($header_data['type'])
		{
			case 0:
				$this->fileHeader->type = 'dir';
				break;

			case 1:
				$this->fileHeader->type = 'file';
				break;

			case 2:
				$this->fileHeader->type = 'link';
				break;
		}
		switch( $compressionType )
		{
			case 0:
				$this->fileHeader->compression = 'none';
				break;
			case 1:
				$this->fileHeader->compression = 'gzip';
				break;
			case 2:
				$this->fileHeader->compression = 'bzip2';
				break;
		}
		$this->fileHeader->permissions = $header_data['perms'];

		// Find hard-coded banned files
		if( (basename($this->fileHeader->file) == ".") || (basename($this->fileHeader->file) == "..") )
		{
			$isBannedFile = true;
		}

		// Also try to find banned files passed in class configuration
		if((count($this->skipFiles) > 0) && (!$isRenamed) )
		{
			if(in_array($this->fileHeader->file, $this->skipFiles))
			{
				$isBannedFile = true;
			}
		}

		// If we have a banned file, let's skip it
		if($isBannedFile)
		{
			$done = false;
			while(!$done)
			{
				// Read the Data Chunk Block header
				$binMiniHead = fread($this->fp, 8);
				if( in_array( substr($binMiniHead,0,3), array('JPF','JPE') ) )
				{
					// Not a Data Chunk Block header, I am done skipping the file
					@fseek($this->fp,-8,SEEK_CUR); // Roll back the file pointer
					$done = true; // Mark as done
					continue; // Exit loop
				}
				else
				{
					// Skip forward by the amount of compressed data
					$miniHead = unpack('Vencsize/Vdecsize', $binMiniHead);
					@fseek($this->fp, $miniHead['encsize'], SEEK_CUR);
				}
			}

			$this->currentPartOffset = @ftell($this->fp);
			$this->runState = AK_STATE_DONE;
			return true;
		}

		// Last chance to prepend a path to the filename
		if(!empty($this->addPath) && !$isDirRenamed)
		{
			$this->fileHeader->file = $this->addPath.$this->fileHeader->file;
		}

		// Get the translated path name
		$restorePerms = AKFactory::get('kickstart.setup.restoreperms', false);
		if($this->fileHeader->type == 'file')
		{
			// Regular file; ask the postproc engine to process its filename
			if($restorePerms)
			{
				$this->fileHeader->realFile = $this->postProcEngine->processFilename( $this->fileHeader->file, $this->fileHeader->permissions );
			}
			else
			{
				$this->fileHeader->realFile = $this->postProcEngine->processFilename( $this->fileHeader->file );
			}
		}
		elseif($this->fileHeader->type == 'dir')
		{
			$dir = $this->fileHeader->file;
			$this->fileHeader->realFile = $dir;

			// Directory; just create it
			if($restorePerms)
			{
				$this->postProcEngine->createDirRecursive( $this->fileHeader->file, $this->fileHeader->permissions );
			}
			else
			{
				$this->postProcEngine->createDirRecursive( $this->fileHeader->file, 0755 );
			}
			$this->postProcEngine->processFilename(null);
		}
		else
		{
			// Symlink; do not post-process
			$this->postProcEngine->processFilename(null);
		}

		$this->createDirectory();

		// Header is read
		$this->runState = AK_STATE_HEADER;

		$this->dataReadLength = 0;

		return true;
	}

	/**
	 * Concrete classes must use this method to process file data. It must set $runState to AK_STATE_DATAREAD when
	 * it's finished processing the file data.
	 * @return bool True if processing the file data was successful, false if an error occured
	 */
	protected function processFileData()
	{
		switch( $this->fileHeader->type )
		{
			case 'dir':
				return $this->processTypeDir();
				break;

			case 'link':
				return $this->processTypeLink();
				break;

			case 'file':
				switch($this->fileHeader->compression)
				{
					case 'none':
						return $this->processTypeFileUncompressed();
						break;

					case 'gzip':
					case 'bzip2':
						return $this->processTypeFileCompressedSimple();
						break;

				}
				break;
		}
	}

	private function processTypeFileUncompressed()
	{
		// Uncompressed files are being processed in small chunks, to avoid timeouts
		if( ($this->dataReadLength == 0) && !AKFactory::get('kickstart.setup.dryrun','0') )
		{
			// Before processing file data, ensure permissions are adequate
			$this->setCorrectPermissions( $this->fileHeader->file );
		}

		// Open the output file
		if( !AKFactory::get('kickstart.setup.dryrun','0') )
		{
			$ignore = AKFactory::get('kickstart.setup.ignoreerrors', false) || $this->isIgnoredDirectory($this->fileHeader->file);
			if ($this->dataReadLength == 0) {
				$outfp = @fopen( $this->fileHeader->realFile, 'wb' );
			} else {
				$outfp = @fopen( $this->fileHeader->realFile, 'ab' );
			}

			// Can we write to the file?
			if( ($outfp === false) && (!$ignore) ) {
				// An error occured
				$this->setError( AKText::sprintf('COULDNT_WRITE_FILE', $this->fileHeader->realFile) );
				return false;
			}
		}

		// Does the file have any data, at all?
		if( $this->fileHeader->uncompressed == 0 )
		{
			// No file data!
			if( !AKFactory::get('kickstart.setup.dryrun','0') && is_resource($outfp) ) @fclose($outfp);
			$this->runState = AK_STATE_DATAREAD;
			return true;
		}
		else
		{
			$this->setError('An uncompressed file was detected; this is not supported by this archive extraction utility');
			return false;
		}

		return true;
	}

	private function processTypeFileCompressedSimple()
	{
		$timer = AKFactory::getTimer();

		// Files are being processed in small chunks, to avoid timeouts
		if( ($this->dataReadLength == 0) && !AKFactory::get('kickstart.setup.dryrun','0') )
		{
			// Before processing file data, ensure permissions are adequate
			$this->setCorrectPermissions( $this->fileHeader->file );
		}

		// Open the output file
		if( !AKFactory::get('kickstart.setup.dryrun','0') )
		{
			// Open the output file
			$outfp = @fopen( $this->fileHeader->realFile, 'wb' );

			// Can we write to the file?
			$ignore = AKFactory::get('kickstart.setup.ignoreerrors', false) || $this->isIgnoredDirectory($this->fileHeader->file);
			if( ($outfp === false) && (!$ignore) ) {
				// An error occured
				$this->setError( AKText::sprintf('COULDNT_WRITE_FILE', $this->fileHeader->realFile) );
				return false;
			}
		}

		// Does the file have any data, at all?
		if( $this->fileHeader->uncompressed == 0 )
		{
			// No file data!
			if( !AKFactory::get('kickstart.setup.dryrun','0') )
				if(is_resource($outfp)) @fclose($outfp);
			$this->runState = AK_STATE_DATAREAD;
			return true;
		}

		$leftBytes = $this->fileHeader->uncompressed - $this->dataReadLength;

		// Loop while there's data to write and enough time to do it
		while( ($leftBytes > 0) && ($timer->getTimeLeft() > 0) )
		{
			// Read the mini header
			$binMiniHeader = fread($this->fp, 8);
			$reallyReadBytes = akstringlen($binMiniHeader);
			if($reallyReadBytes < 8)
			{
				// We read less than requested! Why? Did we hit local EOF?
				if( $this->isEOF(true) && !$this->isEOF(false) )
				{
					// Yeap. Let's go to the next file
					$this->nextFile();
					// Retry reading the header
					$binMiniHeader = fread($this->fp, 8);
					$reallyReadBytes = akstringlen($binMiniHeader);
					// Still not enough data? If so, the archive is corrupt or missing parts.
					if($reallyReadBytes < 8) {
						$this->setError( AKText::_('ERR_CORRUPT_ARCHIVE') );
						return false;
					}
				}
				else
				{
					// Nope. The archive is corrupt
					$this->setError( AKText::_('ERR_CORRUPT_ARCHIVE') );
					return false;
				}
			}

			// Read the encrypted data
			$miniHeader = unpack('Vencsize/Vdecsize', $binMiniHeader);
			$toReadBytes = $miniHeader['encsize'];
			$data = $this->fread( $this->fp, $toReadBytes );
			$reallyReadBytes = akstringlen($data);
			if($reallyReadBytes < $toReadBytes)
			{
				// We read less than requested! Why? Did we hit local EOF?
				if( $this->isEOF(true) && !$this->isEOF(false) )
				{
					// Yeap. Let's go to the next file
					$this->nextFile();
					// Read the rest of the data
					$toReadBytes -= $reallyReadBytes;
					$restData = $this->fread( $this->fp, $toReadBytes );
					$reallyReadBytes = akstringlen($restData);
					if($reallyReadBytes < $toReadBytes) {
						$this->setError( AKText::_('ERR_CORRUPT_ARCHIVE') );
						return false;
					}
					if(akstringlen($data) == 0) {
						$data = $restData;
					} else {
						$data .= $restData;
					}
				}
				else
				{
					// Nope. The archive is corrupt
					$this->setError( AKText::_('ERR_CORRUPT_ARCHIVE') );
					return false;
				}
			}

			// Decrypt the data
			$data = AKEncryptionAES::AESDecryptCBC($data, $this->password, 128);

			// Is the length of the decrypted data less than expected?
			$data_length = akstringlen($data);
			if($data_length < $miniHeader['decsize']) {
				$this->setError(AKText::_('ERR_INVALID_JPS_PASSWORD'));
				return false;
			}

			// Trim the data
			$data = substr($data,0,$miniHeader['decsize']);

			// Decompress
			$data = gzinflate($data);
			$unc_len = akstringlen($data);

			// Write the decrypted data
			if( !AKFactory::get('kickstart.setup.dryrun','0') )
				if(is_resource($outfp)) @fwrite( $outfp, $data, akstringlen($data) );

			// Update the read length
			$this->dataReadLength += $unc_len;
			$leftBytes = $this->fileHeader->uncompressed - $this->dataReadLength;
		}

		// Close the file pointer
		if( !AKFactory::get('kickstart.setup.dryrun','0') )
			if(is_resource($outfp)) @fclose($outfp);

		// Was this a pre-timeout bail out?
		if( $leftBytes > 0 )
		{
			$this->runState = AK_STATE_DATA;
		}
		else
		{
			// Oh! We just finished!
			$this->runState = AK_STATE_DATAREAD;
			$this->dataReadLength = 0;
		}

		return true;
	}

	/**
	 * Process the file data of a link entry
	 * @return bool
	 */
	private function processTypeLink()
	{

		// Does the file have any data, at all?
		if( $this->fileHeader->uncompressed == 0 )
		{
			// No file data!
			$this->runState = AK_STATE_DATAREAD;
			return true;
		}

		// Read the mini header
		$binMiniHeader = fread($this->fp, 8);
		$reallyReadBytes = akstringlen($binMiniHeader);
		if($reallyReadBytes < 8)
		{
			// We read less than requested! Why? Did we hit local EOF?
			if( $this->isEOF(true) && !$this->isEOF(false) )
			{
				// Yeap. Let's go to the next file
				$this->nextFile();
				// Retry reading the header
				$binMiniHeader = fread($this->fp, 8);
				$reallyReadBytes = akstringlen($binMiniHeader);
				// Still not enough data? If so, the archive is corrupt or missing parts.
				if($reallyReadBytes < 8) {
					$this->setError( AKText::_('ERR_CORRUPT_ARCHIVE') );
					return false;
				}
			}
			else
			{
				// Nope. The archive is corrupt
				$this->setError( AKText::_('ERR_CORRUPT_ARCHIVE') );
				return false;
			}
		}

		// Read the encrypted data
		$miniHeader = unpack('Vencsize/Vdecsize', $binMiniHeader);
		$toReadBytes = $miniHeader['encsize'];
		$data = $this->fread( $this->fp, $toReadBytes );
		$reallyReadBytes = akstringlen($data);
		if($reallyReadBytes < $toReadBytes)
		{
			// We read less than requested! Why? Did we hit local EOF?
			if( $this->isEOF(true) && !$this->isEOF(false) )
			{
				// Yeap. Let's go to the next file
				$this->nextFile();
				// Read the rest of the data
				$toReadBytes -= $reallyReadBytes;
				$restData = $this->fread( $this->fp, $toReadBytes );
				$reallyReadBytes = akstringlen($data);
				if($reallyReadBytes < $toReadBytes) {
					$this->setError( AKText::_('ERR_CORRUPT_ARCHIVE') );
					return false;
				}
				$data .= $restData;
			}
			else
			{
				// Nope. The archive is corrupt
				$this->setError( AKText::_('ERR_CORRUPT_ARCHIVE') );
				return false;
			}
		}

		// Decrypt the data
		$data = AKEncryptionAES::AESDecryptCBC($data, $this->password, 128);

		// Is the length of the decrypted data less than expected?
		$data_length = akstringlen($data);
		if($data_length < $miniHeader['decsize']) {
			$this->setError(AKText::_('ERR_INVALID_JPS_PASSWORD'));
			return false;
		}

		// Trim the data
		$data = substr($data,0,$miniHeader['decsize']);

		// Try to remove an existing file or directory by the same name
		if(file_exists($this->fileHeader->file)) { @unlink($this->fileHeader->file); @rmdir($this->fileHeader->file); }
		// Remove any trailing slash
		if(substr($this->fileHeader->file, -1) == '/') $this->fileHeader->file = substr($this->fileHeader->file, 0, -1);
		// Create the symlink - only possible within PHP context. There's no support built in the FTP protocol, so no postproc use is possible here :(

		if( !AKFactory::get('kickstart.setup.dryrun','0') )
		{
			@symlink($data, $this->fileHeader->file);
		}

		$this->runState = AK_STATE_DATAREAD;

		return true; // No matter if the link was created!
	}

	/**
	 * Process the file data of a directory entry
	 * @return bool
	 */
	private function processTypeDir()
	{
		// Directory entries in the JPA do not have file data, therefore we're done processing the entry
		$this->runState = AK_STATE_DATAREAD;
		return true;
	}

	/**
	 * Creates the directory this file points to
	 */
	protected function createDirectory()
	{
		if( AKFactory::get('kickstart.setup.dryrun','0') ) return true;

		// Do we need to create a directory?
		$lastSlash = strrpos($this->fileHeader->realFile, '/');
		$dirName = substr( $this->fileHeader->realFile, 0, $lastSlash);
		$perms = $this->flagRestorePermissions ? $retArray['permissions'] : 0755;
		$ignore = AKFactory::get('kickstart.setup.ignoreerrors', false) || $this->isIgnoredDirectory($dirName);
		if( ($this->postProcEngine->createDirRecursive($dirName, $perms) == false) && (!$ignore) ) {
			$this->setError( AKText::sprintf('COULDNT_CREATE_DIR', $dirName) );
			return false;
		}
		else
		{
			return true;
		}
	}
}

/**
 * Akeeba Restore
 * A JSON-powered JPA, JPS and ZIP archive extraction library
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / Akeeba Ltd.
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

/**
 * Timer class
 */
class AKCoreTimer extends AKAbstractObject
{
	/** @var int Maximum execution time allowance per step */
	private $max_exec_time = null;

	/** @var int Timestamp of execution start */
	private $start_time = null;

	/**
	 * Public constructor, creates the timer object and calculates the execution time limits
	 * @return AECoreTimer
	 */
	public function __construct()
	{
		parent::__construct();

		// Initialize start time
		$this->start_time = $this->microtime_float();

		// Get configured max time per step and bias
		$config_max_exec_time	= AKFactory::get('kickstart.tuning.max_exec_time', 14);
		$bias					= AKFactory::get('kickstart.tuning.run_time_bias', 75)/100;

		// Get PHP's maximum execution time (our upper limit)
		if(@function_exists('ini_get'))
		{
			$php_max_exec_time = @ini_get("maximum_execution_time");
			if ( (!is_numeric($php_max_exec_time)) || ($php_max_exec_time == 0) ) {
				// If we have no time limit, set a hard limit of about 10 seconds
				// (safe for Apache and IIS timeouts, verbose enough for users)
				$php_max_exec_time = 14;
			}
		}
		else
		{
			// If ini_get is not available, use a rough default
			$php_max_exec_time = 14;
		}

		// Apply an arbitrary correction to counter CMS load time
		$php_max_exec_time--;

		// Apply bias
		$php_max_exec_time = $php_max_exec_time * $bias;
		$config_max_exec_time = $config_max_exec_time * $bias;

		// Use the most appropriate time limit value
		if( $config_max_exec_time > $php_max_exec_time )
		{
			$this->max_exec_time = $php_max_exec_time;
		}
		else
		{
			$this->max_exec_time = $config_max_exec_time;
		}
	}

	/**
	 * Wake-up function to reset internal timer when we get unserialized
	 */
	public function __wakeup()
	{
		// Re-initialize start time on wake-up
		$this->start_time = $this->microtime_float();
	}

	/**
	 * Gets the number of seconds left, before we hit the "must break" threshold
	 * @return float
	 */
	public function getTimeLeft()
	{
		return $this->max_exec_time - $this->getRunningTime();
	}

	/**
	 * Gets the time elapsed since object creation/unserialization, effectively how
	 * long Akeeba Engine has been processing data
	 * @return float
	 */
	public function getRunningTime()
	{
		return $this->microtime_float() - $this->start_time;
	}

	/**
	 * Returns the current timestampt in decimal seconds
	 */
	private function microtime_float()
	{
		list($usec, $sec) = explode(" ", microtime());
		return ((float)$usec + (float)$sec);
	}

	/**
	 * Enforce the minimum execution time
	 */
	public function enforce_min_exec_time()
	{
		// Try to get a sane value for PHP's maximum_execution_time INI parameter
		if(@function_exists('ini_get'))
		{
			$php_max_exec = @ini_get("maximum_execution_time");
		}
		else
		{
			$php_max_exec = 10;
		}
		if ( ($php_max_exec == "") || ($php_max_exec == 0) ) {
			$php_max_exec = 10;
		}
		// Decrease $php_max_exec time by 500 msec we need (approx.) to tear down
		// the application, as well as another 500msec added for rounding
		// error purposes. Also make sure this is never gonna be less than 0.
		$php_max_exec = max($php_max_exec * 1000 - 1000, 0);

		// Get the "minimum execution time per step" Akeeba Backup configuration variable
		$minexectime = AKFactory::get('kickstart.tuning.min_exec_time',0);
		if(!is_numeric($minexectime)) $minexectime = 0;

		// Make sure we are not over PHP's time limit!
		if($minexectime > $php_max_exec) $minexectime = $php_max_exec;

		// Get current running time
		$elapsed_time = $this->getRunningTime() * 1000;

			// Only run a sleep delay if we haven't reached the minexectime execution time
		if( ($minexectime > $elapsed_time) && ($elapsed_time > 0) )
		{
			$sleep_msec = $minexectime - $elapsed_time;
			if(function_exists('usleep'))
			{
				usleep(1000 * $sleep_msec);
			}
			elseif(function_exists('time_nanosleep'))
			{
				$sleep_sec = floor($sleep_msec / 1000);
				$sleep_nsec = 1000000 * ($sleep_msec - ($sleep_sec * 1000));
				time_nanosleep($sleep_sec, $sleep_nsec);
			}
			elseif(function_exists('time_sleep_until'))
			{
				$until_timestamp = time() + $sleep_msec / 1000;
				time_sleep_until($until_timestamp);
			}
			elseif(function_exists('sleep'))
			{
				$sleep_sec = ceil($sleep_msec/1000);
				sleep( $sleep_sec );
			}
		}
		elseif( $elapsed_time > 0 )
		{
			// No sleep required, even if user configured us to be able to do so.
		}
	}

	/**
	 * Reset the timer. It should only be used in CLI mode!
	 */
	public function resetTime()
	{
		$this->start_time = $this->microtime_float();
	}
}

/**
 * Akeeba Restore
 * A JSON-powered JPA, JPS and ZIP archive extraction library
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / Akeeba Ltd.
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

/**
 * A filesystem scanner which uses opendir()
 */
class AKUtilsLister extends AKAbstractObject
{
	public function &getFiles($folder, $pattern = '*')
	{
		// Initialize variables
		$arr = array();
		$false = false;

		if(!is_dir($folder)) return $false;

		$handle = @opendir($folder);
		// If directory is not accessible, just return FALSE
		if ($handle === FALSE) {
			$this->setWarning( 'Unreadable directory '.$folder);
			return $false;
		}

		while (($file = @readdir($handle)) !== false)
		{
			if( !fnmatch($pattern, $file) ) continue;

			if (($file != '.') && ($file != '..'))
			{
				$ds = ($folder == '') || ($folder == '/') || (@substr($folder, -1) == '/') || (@substr($folder, -1) == DIRECTORY_SEPARATOR) ? '' : DIRECTORY_SEPARATOR;
				$dir = $folder . $ds . $file;
				$isDir = is_dir($dir);
				if (!$isDir) {
					$arr[] = $dir;
				}
			}
		}
		@closedir($handle);

		return $arr;
	}

	public function &getFolders($folder, $pattern = '*')
	{
		// Initialize variables
		$arr = array();
		$false = false;

		if(!is_dir($folder)) return $false;

		$handle = @opendir($folder);
		// If directory is not accessible, just return FALSE
		if ($handle === FALSE) {
			$this->setWarning( 'Unreadable directory '.$folder);
			return $false;
		}

		while (($file = @readdir($handle)) !== false)
		{
			if( !fnmatch($pattern, $file) ) continue;

			if (($file != '.') && ($file != '..'))
			{
				$ds = ($folder == '') || ($folder == '/') || (@substr($folder, -1) == '/') || (@substr($folder, -1) == DIRECTORY_SEPARATOR) ? '' : DIRECTORY_SEPARATOR;
				$dir = $folder . $ds . $file;
				$isDir = is_dir($dir);
				if ($isDir) {
					$arr[] = $dir;
				}
			}
		}
		@closedir($handle);

		return $arr;
	}
}

/**
 * Akeeba Restore
 * A JSON-powered JPA, JPS and ZIP archive extraction library
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / Akeeba Ltd.
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

/**
 * A simple INI-based i18n engine
 */

class AKText extends AKAbstractObject
{
	/**
	 * The default (en_GB) translation used when no other translation is available
	 * @var array
	 */
	private $default_translation = array(
		'AUTOMODEON' => 'Auto-mode enabled',
		'ERR_NOT_A_JPA_FILE' => 'The file is not a JPA archive',
		'ERR_CORRUPT_ARCHIVE' => 'The archive file is corrupt, truncated or archive parts are missing',
		'ERR_INVALID_LOGIN' => 'Invalid login',
		'COULDNT_CREATE_DIR' => 'Could not create %s folder',
		'COULDNT_WRITE_FILE' => 'Could not open %s for writing.',
		'WRONG_FTP_HOST' => 'Wrong FTP host or port',
		'WRONG_FTP_USER' => 'Wrong FTP username or password',
		'WRONG_FTP_PATH1' => 'Wrong FTP initial directory - the directory doesn\'t exist',
		'FTP_CANT_CREATE_DIR' => 'Could not create directory %s',
		'FTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory',
		'SFTP_TEMPDIR_NOT_WRITABLE' => 'Could not find or create a writable temporary directory',
		'FTP_COULDNT_UPLOAD' => 'Could not upload %s',
		'THINGS_HEADER' => 'Things you should know about Akeeba Kickstart',
		'THINGS_01' => 'Kickstart is not an installer. It is an archive extraction tool. The actual installer was put inside the archive file at backup time.',
		'THINGS_02' => 'Kickstart is not the only way to extract the backup archive. You can use Akeeba eXtract Wizard and upload the extracted files using FTP instead.',
		'THINGS_03' => 'Kickstart is bound by your server\'s configuration. As such, it may not work at all.',
		'THINGS_04' => 'You should download and upload your archive files using FTP in Binary transfer mode. Any other method could lead to a corrupt backup archive and restoration failure.',
		'THINGS_05' => 'Post-restoration site load errors are usually caused by .htaccess or php.ini directives. You should understand that blank pages, 404 and 500 errors can usually be worked around by editing the aforementioned files. It is not our job to mess with your configuration files, because this could be dangerous for your site.',
		'THINGS_06' => 'Kickstart overwrites files without a warning. If you are not sure that you are OK with that do not continue.',
		'THINGS_07' => 'Trying to restore to the temporary URL of a cPanel host (e.g. http://1.2.3.4/~username) will lead to restoration failure and your site will appear to be not working. This is normal and it\'s just how your server and CMS software work.',
		'THINGS_08' => 'You are supposed to read the documentation before using this software. Most issues can be avoided, or easily worked around, by understanding how this software works.',
		'THINGS_09' => 'This text does not imply that there is a problem detected. It is standard text displayed every time you launch Kickstart.',
		'CLOSE_LIGHTBOX' => 'Click here or press ESC to close this message',
		'SELECT_ARCHIVE' => 'Select a backup archive',
		'ARCHIVE_FILE' => 'Archive file:',
		'SELECT_EXTRACTION' => 'Select an extraction method',
		'WRITE_TO_FILES' => 'Write to files:',
		'WRITE_HYBRID' => 'Hybrid (use FTP only if needed)',
		'WRITE_DIRECTLY' => 'Directly',
		'WRITE_FTP' => 'Use FTP for all files',
        'WRITE_SFTP' => 'Use SFTP for all files',
		'FTP_HOST' => '(S)FTP host name:',
		'FTP_PORT' => '(S)FTP port:',
		'FTP_FTPS' => 'Use FTP over SSL (FTPS)',
		'FTP_PASSIVE' => 'Use FTP Passive Mode',
		'FTP_USER' => '(S)FTP user name:',
		'FTP_PASS' => '(S)FTP password:',
		'FTP_DIR' => '(S)FTP directory:',
		'FTP_TEMPDIR' => 'Temporary directory:',
		'FTP_CONNECTION_OK' => 'FTP Connection Established',
		'SFTP_CONNECTION_OK' => 'SFTP Connection Established',
		'FTP_CONNECTION_FAILURE' => 'The FTP Connection Failed',
		'SFTP_CONNECTION_FAILURE' => 'The SFTP Connection Failed',
		'FTP_TEMPDIR_WRITABLE' => 'The temporary directory is writable.',
		'FTP_TEMPDIR_UNWRITABLE' => 'The temporary directory is not writable. Please check the permissions.',
        'FTPBROWSER_ERROR_HOSTNAME' => "Invalid FTP host or port",
        'FTPBROWSER_ERROR_USERPASS' => "Invalid FTP username or password",
        'FTPBROWSER_ERROR_NOACCESS' => "Directory doesn't exist or you don't have enough permissions to access it",
        'FTPBROWSER_ERROR_UNSUPPORTED' => "Sorry, your FTP server doesn't support our FTP directory browser.",
        'FTPBROWSER_LBL_GOPARENT' => "&lt;up one level&gt;",
        'FTPBROWSER_LBL_INSTRUCTIONS' => 'Click on a directory to navigate into it. Click on OK to select that directory, Cancel to abort the procedure.',
        'FTPBROWSER_LBL_ERROR' => 'An error occurred',
        'SFTP_NO_SSH2' => 'Your web server does not have the SSH2 PHP module, therefore can not connect to SFTP servers.',
        'SFTP_NO_FTP_SUPPORT' => 'Your SSH server does not allow SFTP connections',
        'SFTP_WRONG_USER' => 'Wrong SFTP username or password',
        'SFTP_WRONG_STARTING_DIR' => 'You must supply a valid absolute path',
        'SFTPBROWSER_ERROR_NOACCESS' => "Directory doesn't exist or you don't have enough permissions to access it",
        'SFTP_COULDNT_UPLOAD' => 'Could not upload %s',
        'SFTP_CANT_CREATE_DIR' => 'Could not create directory %s',
        'UI-ROOT' => '&lt;root&gt;',
        'CONFIG_UI_FTPBROWSER_TITLE' => 'FTP Directory Browser',
        'FTP_BROWSE' => 'Browse',
		'BTN_CHECK' => 'Check',
		'BTN_RESET' => 'Reset',
		'BTN_TESTFTPCON' => 'Test FTP connection',
		'BTN_TESTSFTPCON' => 'Test SFTP connection',
		'BTN_GOTOSTART' => 'Start over',
		'FINE_TUNE' => 'Fine tune',
		'MIN_EXEC_TIME' => 'Minimum execution time:',
		'MAX_EXEC_TIME' => 'Maximum execution time:',
		'SECONDS_PER_STEP' => 'seconds per step',
		'EXTRACT_FILES' => 'Extract files',
		'BTN_START' => 'Start',
		'EXTRACTING' => 'Extracting',
		'DO_NOT_CLOSE_EXTRACT' => 'Do not close this window while the extraction is in progress',
		'RESTACLEANUP' => 'Restoration and Clean Up',
		'BTN_RUNINSTALLER' => 'Run the Installer',
		'BTN_CLEANUP' => 'Clean Up',
		'BTN_SITEFE' => 'Visit your site\'s front-end',
		'BTN_SITEBE' => 'Visit your site\'s back-end',
		'WARNINGS' => 'Extraction Warnings',
		'ERROR_OCCURED' => 'An error occured',
		'STEALTH_MODE' => 'Stealth mode',
		'STEALTH_URL' => 'HTML file to show to web visitors',
		'ERR_NOT_A_JPS_FILE' => 'The file is not a JPA archive',
		'ERR_INVALID_JPS_PASSWORD' => 'The password you gave is wrong or the archive is corrupt',
		'JPS_PASSWORD' => 'Archive Password (for JPS files)',
		'INVALID_FILE_HEADER' => 'Invalid header in archive file, part %s, offset %s',
		'NEEDSOMEHELPKS' => 'Want some help to use this tool? Read this first:',
		'QUICKSTART' => 'Quick Start Guide',
		'CANTGETITTOWORK' => 'Can\'t get it to work? Click me!',
		'NOARCHIVESCLICKHERE' => 'No archives detected. Click here for troubleshooting instructions.',
		'POSTRESTORATIONTROUBLESHOOTING' => 'Something not working after the restoration? Click here for troubleshooting instructions.',
		'UPDATE_HEADER' => 'An updated version of Akeeba Kickstart (<span id="update-version">unknown</span>) is available!',
		'UPDATE_NOTICE' => 'You are advised to always use the latest version of Akeeba Kickstart available. Older versions may be subject to bugs and will not be supported.',
		'UPDATE_DLNOW' => 'Download now',
		'UPDATE_MOREINFO' => 'More information',
		'IGNORE_MOST_ERRORS' => 'Ignore most errors',
		'WRONG_FTP_PATH2' => 'Wrong FTP initial directory - the directory doesn\'t correspond to your site\'s web root',
		'ARCHIVE_DIRECTORY' => 'Archive directory:',
		'RELOAD_ARCHIVES'	=> 'Reload',
		'CONFIG_UI_SFTPBROWSER_TITLE'	=> 'SFTP Directory Browser',
		'ERR_COULD_NOT_OPEN_ARCHIVE_PART' => 'Could not open archive part file %s for reading. Check that the file exists, is readable by the web server and is not in a directory made out of reach by chroot, open_basedir restrictions or any other restriction put in place by your host.',
	);

	/**
	 * The array holding the translation keys
	 * @var array
	 */
	private $strings;

	/**
	 * The currently detected language (ISO code)
	 * @var string
	 */
	private $language;

	/*
	 * Initializes the translation engine
	 * @return AKText
	 */
	public function __construct()
	{
		// Start with the default translation
		$this->strings = $this->default_translation;
		// Try loading the translation file in English, if it exists
		$this->loadTranslation('en-GB');
		// Try loading the translation file in the browser's preferred language, if it exists
		$this->getBrowserLanguage();
		if(!is_null($this->language))
		{
			$this->loadTranslation();
		}
	}

	/**
	 * Singleton pattern for Language
	 * @return AKText The global AKText instance
	 */
	public static function &getInstance()
	{
		static $instance;

		if(!is_object($instance))
		{
			$instance = new AKText();
		}

		return $instance;
	}

	public static function _($string)
	{
		$text = self::getInstance();

		$key = strtoupper($string);
		$key = substr($key, 0, 1) == '_' ? substr($key, 1) : $key;

		if (isset ($text->strings[$key]))
		{
			$string = $text->strings[$key];
		}
		else
		{
			if (defined($string))
			{
				$string = constant($string);
			}
		}

		return $string;
	}

	public static function sprintf($key)
	{
		$text = self::getInstance();
		$args = func_get_args();
		if (count($args) > 0) {
			$args[0] = $text->_($args[0]);
			return @call_user_func_array('sprintf', $args);
		}
		return '';
	}

	public function dumpLanguage()
	{
		$out = '';
		foreach($this->strings as $key => $value)
		{
			$out .= "$key=$value\n";
		}
		return $out;
	}

	public function asJavascript()
	{
		$out = '';
		foreach($this->strings as $key => $value)
		{
			$key = addcslashes($key, '\\\'"');
			$value = addcslashes($value, '\\\'"');
			if(!empty($out)) $out .= ",\n";
			$out .= "'$key':\t'$value'";
		}
		return $out;
	}

	public function resetTranslation()
	{
		$this->strings = $this->default_translation;
	}

	public function getBrowserLanguage()
	{
		// Detection code from Full Operating system language detection, by Harald Hope
		// Retrieved from http://techpatterns.com/downloads/php_language_detection.php
		$user_languages = array();
		//check to see if language is set
		if ( isset( $_SERVER["HTTP_ACCEPT_LANGUAGE"] ) )
		{
			$languages = strtolower( $_SERVER["HTTP_ACCEPT_LANGUAGE"] );
			// $languages = ' fr-ch;q=0.3, da, en-us;q=0.8, en;q=0.5, fr;q=0.3';
			// need to remove spaces from strings to avoid error
			$languages = str_replace( ' ', '', $languages );
			$languages = explode( ",", $languages );

			foreach ( $languages as $language_list )
			{
				// pull out the language, place languages into array of full and primary
				// string structure:
				$temp_array = array();
				// slice out the part before ; on first step, the part before - on second, place into array
				$temp_array[0] = substr( $language_list, 0, strcspn( $language_list, ';' ) );//full language
				$temp_array[1] = substr( $language_list, 0, 2 );// cut out primary language
				if( (strlen($temp_array[0]) == 5) && ( (substr($temp_array[0],2,1) == '-') || (substr($temp_array[0],2,1) == '_') ) )
				{
					$langLocation = strtoupper(substr($temp_array[0],3,2));
					$temp_array[0] = $temp_array[1].'-'.$langLocation;
				}
				//place this array into main $user_languages language array
				$user_languages[] = $temp_array;
			}
		}
		else// if no languages found
		{
			$user_languages[0] = array( '','' ); //return blank array.
		}

		$this->language = null;
		$basename=basename(__FILE__, '.php') . '.ini';

		// Try to match main language part of the filename, irrespective of the location, e.g. de_DE will do if de_CH doesn't exist.
		if (class_exists('AKUtilsLister'))
		{
			$fs = new AKUtilsLister();
			$iniFiles = $fs->getFiles(KSROOTDIR, '*.'.$basename );
			if(empty($iniFiles) && ($basename != 'kickstart.ini')) {
				$basename = 'kickstart.ini';
				$iniFiles = $fs->getFiles(KSROOTDIR, '*.'.$basename );
			}
		}
		else
		{
			$iniFiles = null;
		}

		if (is_array($iniFiles)) {
			foreach($user_languages as $languageStruct)
			{
				if(is_null($this->language))
				{
					// Get files matching the main lang part
					$iniFiles = $fs->getFiles(KSROOTDIR, $languageStruct[1].'-??.'.$basename );
					if (count($iniFiles) > 0) {
						$filename = $iniFiles[0];
						$filename = substr($filename, strlen(KSROOTDIR)+1);
						$this->language = substr($filename, 0, 5);
					} else {
						$this->language = null;
					}
				}
			}
		}

		if(is_null($this->language)) {
			// Try to find a full language match
			foreach($user_languages as $languageStruct)
			{
				if (@file_exists($languageStruct[0].'.'.$basename) && is_null($this->language)) {
					$this->language = $languageStruct[0];
				} else {

				}
			}
		} else {
			// Do we have an exact match?
			foreach($user_languages as $languageStruct)
			{
				if(substr($this->language,0,strlen($languageStruct[1])) == $languageStruct[1]) {
					if(file_exists($languageStruct[0].'.'.$basename)) {
						$this->language = $languageStruct[0];
					}
				}
			}
		}

		// Now, scan for full language based on the partial match

	}

	private function loadTranslation( $lang = null )
	{
		if (defined('KSLANGDIR'))
		{
			$dirname = KSLANGDIR;
		}
		else
		{
			$dirname = KSROOTDIR;
		}
		$basename = basename(__FILE__, '.php') . '.ini';
		if( empty($lang) ) $lang = $this->language;

		$translationFilename = $dirname.DIRECTORY_SEPARATOR.$lang.'.'.$basename;
		if(!@file_exists($translationFilename) && ($basename != 'kickstart.ini')) {
			$basename = 'kickstart.ini';
			$translationFilename = $dirname.DIRECTORY_SEPARATOR.$lang.'.'.$basename;
		}
		if(!@file_exists($translationFilename)) return;
		$temp = self::parse_ini_file($translationFilename, false);

		if(!is_array($this->strings)) $this->strings = array();
		if(empty($temp)) {
			$this->strings = array_merge($this->default_translation, $this->strings);
		} else {
			$this->strings = array_merge($this->strings, $temp);
		}
	}

	public function addDefaultLanguageStrings($stringList = array())
	{
		if(!is_array($stringList)) return;
		if(empty($stringList)) return;

		$this->strings = array_merge($stringList, $this->strings);
	}

	/**
	 * A PHP based INI file parser.
	 *
	 * Thanks to asohn ~at~ aircanopy ~dot~ net for posting this handy function on
	 * the parse_ini_file page on http://gr.php.net/parse_ini_file
	 *
	 * @param string $file Filename to process
	 * @param bool $process_sections True to also process INI sections
	 * @return array An associative array of sections, keys and values
	 * @access private
	 */
	public static function parse_ini_file($file, $process_sections = false, $raw_data = false)
	{
		$process_sections = ($process_sections !== true) ? false : true;

		if(!$raw_data)
		{
			$ini = @file($file);
		}
		else
		{
			$ini = $file;
		}
		if (count($ini) == 0) {return array();}

		$sections = array();
		$values = array();
		$result = array();
		$globals = array();
		$i = 0;
		if(!empty($ini)) foreach ($ini as $line) {
			$line = trim($line);
			$line = str_replace("\t", " ", $line);

			// Comments
			if (!preg_match('/^[a-zA-Z0-9[]/', $line)) {continue;}

			// Sections
			if ($line{0} == '[') {
				$tmp = explode(']', $line);
				$sections[] = trim(substr($tmp[0], 1));
				$i++;
				continue;
			}

			// Key-value pair
			list($key, $value) = explode('=', $line, 2);
			$key = trim($key);
			$value = trim($value);
			if (strstr($value, ";")) {
				$tmp = explode(';', $value);
				if (count($tmp) == 2) {
					if ((($value{0} != '"') && ($value{0} != "'")) ||
					preg_match('/^".*"\s*;/', $value) || preg_match('/^".*;[^"]*$/', $value) ||
					preg_match("/^'.*'\s*;/", $value) || preg_match("/^'.*;[^']*$/", $value) ){
						$value = $tmp[0];
					}
				} else {
					if ($value{0} == '"') {
						$value = preg_replace('/^"(.*)".*/', '$1', $value);
					} elseif ($value{0} == "'") {
						$value = preg_replace("/^'(.*)'.*/", '$1', $value);
					} else {
						$value = $tmp[0];
					}
				}
			}
			$value = trim($value);
			$value = trim($value, "'\"");

			if ($i == 0) {
				if (substr($line, -1, 2) == '[]') {
					$globals[$key][] = $value;
				} else {
					$globals[$key] = $value;
				}
			} else {
				if (substr($line, -1, 2) == '[]') {
					$values[$i-1][$key][] = $value;
				} else {
					$values[$i-1][$key] = $value;
				}
			}
		}

		for($j = 0; $j < $i; $j++) {
			if ($process_sections === true) {
				$result[$sections[$j]] = $values[$j];
			} else {
				$result[] = $values[$j];
			}
		}

		return $result + $globals;
	}
}

/**
 * Akeeba Restore
 * A JSON-powered JPA, JPS and ZIP archive extraction library
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / Akeeba Ltd.
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

/**
 * The Akeeba Kickstart Factory class
 * This class is reponssible for instanciating all Akeeba Kicsktart classes
 */
class AKFactory {
	/** @var array A list of instanciated objects */
	private $objectlist = array();

	/** @var array Simple hash data storage */
	private $varlist = array();

	/** Private constructor makes sure we can't directly instanciate the class */
	private function __construct() {}

	/**
	 * Gets a single, internally used instance of the Factory
	 * @param string $serialized_data [optional] Serialized data to spawn the instance from
	 * @return AKFactory A reference to the unique Factory object instance
	 */
	protected static function &getInstance( $serialized_data = null ) {
		static $myInstance;
		if(!is_object($myInstance) || !is_null($serialized_data))
			if(!is_null($serialized_data))
			{
				$myInstance = unserialize($serialized_data);
			}
			else
			{
				$myInstance = new self();
			}
		return $myInstance;
	}

	/**
	 * Internal function which instanciates a class named $class_name.
	 * The autoloader
	 * @param object $class_name
	 * @return
	 */
	protected static function &getClassInstance($class_name) {
		$self = self::getInstance();
		if(!isset($self->objectlist[$class_name]))
		{
			$self->objectlist[$class_name] = new $class_name;
		}
		return $self->objectlist[$class_name];
	}

	// ========================================================================
	// Public factory interface
	// ========================================================================

	/**
	 * Gets a serialized snapshot of the Factory for safekeeping (hibernate)
	 * @return string The serialized snapshot of the Factory
	 */
	public static function serialize() {
		$engine = self::getUnarchiver();
		$engine->shutdown();
		$serialized = serialize(self::getInstance());

		if(function_exists('base64_encode') && function_exists('base64_decode'))
		{
			$serialized = base64_encode($serialized);
		}
		return $serialized;
	}

	/**
	 * Regenerates the full Factory state from a serialized snapshot (resume)
	 * @param string $serialized_data The serialized snapshot to resume from
	 */
	public static function unserialize($serialized_data) {
		if(function_exists('base64_encode') && function_exists('base64_decode'))
		{
			$serialized_data = base64_decode($serialized_data);
		}
		self::getInstance($serialized_data);
	}

	/**
	 * Reset the internal factory state, freeing all previously created objects
	 */
	public static function nuke()
	{
		$self = self::getInstance();
		foreach($self->objectlist as $key => $object)
		{
			$self->objectlist[$key] = null;
		}
		$self->objectlist = array();
	}

	// ========================================================================
	// Public hash data storage interface
	// ========================================================================

	public static function set($key, $value)
	{
		$self = self::getInstance();
		$self->varlist[$key] = $value;
	}

	public static function get($key, $default = null)
	{
		$self = self::getInstance();
		if( array_key_exists($key, $self->varlist) )
		{
			return $self->varlist[$key];
		}
		else
		{
			return $default;
		}
	}

	// ========================================================================
	// Akeeba Kickstart classes
	// ========================================================================

	/**
	 * Gets the post processing engine
	 * @param string $proc_engine
	 */
	public static function &getPostProc($proc_engine = null)
	{
		static $class_name;
		if( empty($class_name) )
		{
			if(empty($proc_engine))
			{
				$proc_engine = self::get('kickstart.procengine','direct');
			}
			$class_name = 'AKPostproc'.ucfirst($proc_engine);
		}
		return self::getClassInstance($class_name);
	}

	/**
	 * Gets the unarchiver engine
	 */
	public static function &getUnarchiver( $configOverride = null )
	{
		static $class_name;

		if(!empty($configOverride))
		{
			if($configOverride['reset']) {
				$class_name = null;
			}
		}

		if( empty($class_name) )
		{
			$filetype = self::get('kickstart.setup.filetype', null);

			if(empty($filetype))
			{
				$filename = self::get('kickstart.setup.sourcefile', null);
				$basename = basename($filename);
				$baseextension = strtoupper(substr($basename,-3));
				switch($baseextension)
				{
					case 'JPA':
						$filetype = 'JPA';
						break;

					case 'JPS':
						$filetype = 'JPS';
						break;

					case 'ZIP':
						$filetype = 'ZIP';
						break;

					default:
						die('Invalid archive type or extension in file '.$filename);
						break;
				}
			}

			$class_name = 'AKUnarchiver'.ucfirst($filetype);
		}

		$destdir = self::get('kickstart.setup.destdir', null);
		if(empty($destdir))
		{
			$destdir = KSROOTDIR;
		}

		$object = self::getClassInstance($class_name);
		if( $object->getState() == 'init')
		{
			$sourcePath = self::get('kickstart.setup.sourcepath', '');
			$sourceFile = self::get('kickstart.setup.sourcefile', '');

			if (!empty($sourcePath))
			{
				$sourceFile = rtrim($sourcePath, '/\\') . '/' . $sourceFile;
			}

			// Initialize the object
			$config = array(
				'filename'				=> $sourceFile,
				'restore_permissions'	=> self::get('kickstart.setup.restoreperms', 0),
				'post_proc'				=> self::get('kickstart.procengine', 'direct'),
				'add_path'				=> self::get('kickstart.setup.targetpath', $destdir),
				'rename_files'			=> array('.htaccess' => 'htaccess.bak', 'php.ini' => 'php.ini.bak', 'web.config' => 'web.config.bak', '.user.ini' => '.user.ini.bak'),
				'skip_files'			=> array(basename(__FILE__), 'kickstart.php', 'abiautomation.ini', 'htaccess.bak', 'php.ini.bak', 'cacert.pem'),
				'ignoredirectories'		=> array('tmp', 'log', 'logs'),
			);

			if(!defined('KICKSTART'))
			{
				// In restore.php mode we have to exclude some more files
				$config['skip_files'][] = 'administrator/components/com_akeeba/restore.php';
				$config['skip_files'][] = 'administrator/components/com_akeeba/restoration.php';
			}

			if(!empty($configOverride))
			{
				$config = array_merge($config, $configOverride);
			}

			$object->setup($config);
		}

		return $object;
	}

	/**
	 * Get the a reference to the Akeeba Engine's timer
	 * @return AKCoreTimer
	 */
	public static function &getTimer()
	{
		return self::getClassInstance('AKCoreTimer');
	}

}

/**
 * Akeeba Restore
 * A JSON-powered JPA, JPS and ZIP archive extraction library
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / Akeeba Ltd.
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

/**
 * AES implementation in PHP (c) Chris Veness 2005-2013.
 * Right to use and adapt is granted for under a simple creative commons attribution
 * licence. No warranty of any form is offered.
 *
 * Modified for Akeeba Backup by Nicholas K. Dionysopoulos
 */
class AKEncryptionAES
{
	// Sbox is pre-computed multiplicative inverse in GF(2^8) used in SubBytes and KeyExpansion [�5.1.1]
	protected static $Sbox =
			 array(0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76,
	               0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0,
	               0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15,
	               0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75,
	               0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84,
	               0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf,
	               0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8,
	               0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2,
	               0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73,
	               0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb,
	               0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79,
	               0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08,
	               0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a,
	               0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e,
	               0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf,
	               0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16);

	// Rcon is Round Constant used for the Key Expansion [1st col is 2^(r-1) in GF(2^8)] [�5.2]
	protected static $Rcon = array(
				   array(0x00, 0x00, 0x00, 0x00),
	               array(0x01, 0x00, 0x00, 0x00),
	               array(0x02, 0x00, 0x00, 0x00),
	               array(0x04, 0x00, 0x00, 0x00),
	               array(0x08, 0x00, 0x00, 0x00),
	               array(0x10, 0x00, 0x00, 0x00),
	               array(0x20, 0x00, 0x00, 0x00),
	               array(0x40, 0x00, 0x00, 0x00),
	               array(0x80, 0x00, 0x00, 0x00),
	               array(0x1b, 0x00, 0x00, 0x00),
	               array(0x36, 0x00, 0x00, 0x00) );

	protected static $passwords = array();

	/**
	 * AES Cipher function: encrypt 'input' with Rijndael algorithm
	 *
	 * @param input message as byte-array (16 bytes)
	 * @param w     key schedule as 2D byte-array (Nr+1 x Nb bytes) -
	 *              generated from the cipher key by KeyExpansion()
	 * @return      ciphertext as byte-array (16 bytes)
	 */
	protected static function Cipher($input, $w) {    // main Cipher function [�5.1]
	  $Nb = 4;                 // block size (in words): no of columns in state (fixed at 4 for AES)
	  $Nr = count($w)/$Nb - 1; // no of rounds: 10/12/14 for 128/192/256-bit keys

	  $state = array();  // initialise 4xNb byte-array 'state' with input [�3.4]
	  for ($i=0; $i<4*$Nb; $i++) $state[$i%4][floor($i/4)] = $input[$i];

	  $state = self::AddRoundKey($state, $w, 0, $Nb);

	  for ($round=1; $round<$Nr; $round++) {  // apply Nr rounds
	    $state = self::SubBytes($state, $Nb);
	    $state = self::ShiftRows($state, $Nb);
	    $state = self::MixColumns($state, $Nb);
	    $state = self::AddRoundKey($state, $w, $round, $Nb);
	  }

	  $state = self::SubBytes($state, $Nb);
	  $state = self::ShiftRows($state, $Nb);
	  $state = self::AddRoundKey($state, $w, $Nr, $Nb);

	  $output = array(4*$Nb);  // convert state to 1-d array before returning [�3.4]
	  for ($i=0; $i<4*$Nb; $i++) $output[$i] = $state[$i%4][floor($i/4)];
	  return $output;
	}

	protected static function AddRoundKey($state, $w, $rnd, $Nb) {  // xor Round Key into state S [�5.1.4]
	  for ($r=0; $r<4; $r++) {
	    for ($c=0; $c<$Nb; $c++) $state[$r][$c] ^= $w[$rnd*4+$c][$r];
	  }
	  return $state;
	}

	protected static function SubBytes($s, $Nb) {    // apply SBox to state S [�5.1.1]
	  for ($r=0; $r<4; $r++) {
	    for ($c=0; $c<$Nb; $c++) $s[$r][$c] = self::$Sbox[$s[$r][$c]];
	  }
	  return $s;
	}

	protected static function ShiftRows($s, $Nb) {    // shift row r of state S left by r bytes [�5.1.2]
	  $t = array(4);
	  for ($r=1; $r<4; $r++) {
	    for ($c=0; $c<4; $c++) $t[$c] = $s[$r][($c+$r)%$Nb];  // shift into temp copy
	    for ($c=0; $c<4; $c++) $s[$r][$c] = $t[$c];         // and copy back
	  }          // note that this will work for Nb=4,5,6, but not 7,8 (always 4 for AES):
	  return $s;  // see fp.gladman.plus.com/cryptography_technology/rijndael/aes.spec.311.pdf
	}

	protected static function MixColumns($s, $Nb) {   // combine bytes of each col of state S [�5.1.3]
	  for ($c=0; $c<4; $c++) {
	    $a = array(4);  // 'a' is a copy of the current column from 's'
	    $b = array(4);  // 'b' is a�{02} in GF(2^8)
	    for ($i=0; $i<4; $i++) {
	      $a[$i] = $s[$i][$c];
	      $b[$i] = $s[$i][$c]&0x80 ? $s[$i][$c]<<1 ^ 0x011b : $s[$i][$c]<<1;
	    }
	    // a[n] ^ b[n] is a�{03} in GF(2^8)
	    $s[0][$c] = $b[0] ^ $a[1] ^ $b[1] ^ $a[2] ^ $a[3]; // 2*a0 + 3*a1 + a2 + a3
	    $s[1][$c] = $a[0] ^ $b[1] ^ $a[2] ^ $b[2] ^ $a[3]; // a0 * 2*a1 + 3*a2 + a3
	    $s[2][$c] = $a[0] ^ $a[1] ^ $b[2] ^ $a[3] ^ $b[3]; // a0 + a1 + 2*a2 + 3*a3
	    $s[3][$c] = $a[0] ^ $b[0] ^ $a[1] ^ $a[2] ^ $b[3]; // 3*a0 + a1 + a2 + 2*a3
	  }
	  return $s;
	}

	/**
	 * Key expansion for Rijndael Cipher(): performs key expansion on cipher key
	 * to generate a key schedule
	 *
	 * @param key cipher key byte-array (16 bytes)
	 * @return    key schedule as 2D byte-array (Nr+1 x Nb bytes)
	 */
	protected static function KeyExpansion($key) {  // generate Key Schedule from Cipher Key [�5.2]
	  $Nb = 4;              // block size (in words): no of columns in state (fixed at 4 for AES)
	  $Nk = count($key)/4;  // key length (in words): 4/6/8 for 128/192/256-bit keys
	  $Nr = $Nk + 6;        // no of rounds: 10/12/14 for 128/192/256-bit keys

	  $w = array();
	  $temp = array();

	  for ($i=0; $i<$Nk; $i++) {
	    $r = array($key[4*$i], $key[4*$i+1], $key[4*$i+2], $key[4*$i+3]);
	    $w[$i] = $r;
	  }

	  for ($i=$Nk; $i<($Nb*($Nr+1)); $i++) {
	    $w[$i] = array();
	    for ($t=0; $t<4; $t++) $temp[$t] = $w[$i-1][$t];
	    if ($i % $Nk == 0) {
	      $temp = self::SubWord(self::RotWord($temp));
	      for ($t=0; $t<4; $t++) $temp[$t] ^= self::$Rcon[$i/$Nk][$t];
	    } else if ($Nk > 6 && $i%$Nk == 4) {
	      $temp = self::SubWord($temp);
	    }
	    for ($t=0; $t<4; $t++) $w[$i][$t] = $w[$i-$Nk][$t] ^ $temp[$t];
	  }
	  return $w;
	}

	protected static function SubWord($w) {    // apply SBox to 4-byte word w
	  for ($i=0; $i<4; $i++) $w[$i] = self::$Sbox[$w[$i]];
	  return $w;
	}

	protected static function RotWord($w) {    // rotate 4-byte word w left by one byte
	  $tmp = $w[0];
	  for ($i=0; $i<3; $i++) $w[$i] = $w[$i+1];
	  $w[3] = $tmp;
	  return $w;
	}

	/*
	 * Unsigned right shift function, since PHP has neither >>> operator nor unsigned ints
	 *
	 * @param a  number to be shifted (32-bit integer)
	 * @param b  number of bits to shift a to the right (0..31)
	 * @return   a right-shifted and zero-filled by b bits
	 */
	protected static function urs($a, $b) {
	  $a &= 0xffffffff; $b &= 0x1f;  // (bounds check)
	  if ($a&0x80000000 && $b>0) {   // if left-most bit set
	    $a = ($a>>1) & 0x7fffffff;   //   right-shift one bit & clear left-most bit
	    $a = $a >> ($b-1);           //   remaining right-shifts
	  } else {                       // otherwise
	    $a = ($a>>$b);               //   use normal right-shift
	  }
	  return $a;
	}

	/**
	 * Encrypt a text using AES encryption in Counter mode of operation
	 *  - see http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
	 *
	 * Unicode multi-byte character safe
	 *
	 * @param plaintext source text to be encrypted
	 * @param password  the password to use to generate a key
	 * @param nBits     number of bits to be used in the key (128, 192, or 256)
	 * @return          encrypted text
	 */
	public static function AESEncryptCtr($plaintext, $password, $nBits) {
	  $blockSize = 16;  // block size fixed at 16 bytes / 128 bits (Nb=4) for AES
	  if (!($nBits==128 || $nBits==192 || $nBits==256)) return '';  // standard allows 128/192/256 bit keys
	  // note PHP (5) gives us plaintext and password in UTF8 encoding!

	  // use AES itself to encrypt password to get cipher key (using plain password as source for
	  // key expansion) - gives us well encrypted key
	  $nBytes = $nBits/8;  // no bytes in key
	  $pwBytes = array();
	  for ($i=0; $i<$nBytes; $i++) $pwBytes[$i] = ord(substr($password,$i,1)) & 0xff;
	  $key = self::Cipher($pwBytes, self::KeyExpansion($pwBytes));
	  $key = array_merge($key, array_slice($key, 0, $nBytes-16));  // expand key to 16/24/32 bytes long

	  // initialise counter block (NIST SP800-38A �B.2): millisecond time-stamp for nonce in
	  // 1st 8 bytes, block counter in 2nd 8 bytes
	  $counterBlock = array();
	  $nonce = floor(microtime(true)*1000);   // timestamp: milliseconds since 1-Jan-1970
	  $nonceSec = floor($nonce/1000);
	  $nonceMs = $nonce%1000;
	  // encode nonce with seconds in 1st 4 bytes, and (repeated) ms part filling 2nd 4 bytes
	  for ($i=0; $i<4; $i++) $counterBlock[$i] = self::urs($nonceSec, $i*8) & 0xff;
	  for ($i=0; $i<4; $i++) $counterBlock[$i+4] = $nonceMs & 0xff;
	  // and convert it to a string to go on the front of the ciphertext
	  $ctrTxt = '';
	  for ($i=0; $i<8; $i++) $ctrTxt .= chr($counterBlock[$i]);

	  // generate key schedule - an expansion of the key into distinct Key Rounds for each round
	  $keySchedule = self::KeyExpansion($key);

	  $blockCount = ceil(strlen($plaintext)/$blockSize);
	  $ciphertxt = array();  // ciphertext as array of strings

	  for ($b=0; $b<$blockCount; $b++) {
	    // set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)
	    // done in two stages for 32-bit ops: using two words allows us to go past 2^32 blocks (68GB)
	    for ($c=0; $c<4; $c++) $counterBlock[15-$c] = self::urs($b, $c*8) & 0xff;
	    for ($c=0; $c<4; $c++) $counterBlock[15-$c-4] = self::urs($b/0x100000000, $c*8);

	    $cipherCntr = self::Cipher($counterBlock, $keySchedule);  // -- encrypt counter block --

	    // block size is reduced on final block
	    $blockLength = $b<$blockCount-1 ? $blockSize : (strlen($plaintext)-1)%$blockSize+1;
	    $cipherByte = array();

	    for ($i=0; $i<$blockLength; $i++) {  // -- xor plaintext with ciphered counter byte-by-byte --
	      $cipherByte[$i] = $cipherCntr[$i] ^ ord(substr($plaintext, $b*$blockSize+$i, 1));
	      $cipherByte[$i] = chr($cipherByte[$i]);
	    }
	    $ciphertxt[$b] = implode('', $cipherByte);  // escape troublesome characters in ciphertext
	  }

	  // implode is more efficient than repeated string concatenation
	  $ciphertext = $ctrTxt . implode('', $ciphertxt);
	  $ciphertext = base64_encode($ciphertext);
	  return $ciphertext;
	}

	/**
	 * Decrypt a text encrypted by AES in counter mode of operation
	 *
	 * @param ciphertext source text to be decrypted
	 * @param password   the password to use to generate a key
	 * @param nBits      number of bits to be used in the key (128, 192, or 256)
	 * @return           decrypted text
	 */
	public static function AESDecryptCtr($ciphertext, $password, $nBits) {
	  $blockSize = 16;  // block size fixed at 16 bytes / 128 bits (Nb=4) for AES
	  if (!($nBits==128 || $nBits==192 || $nBits==256)) return '';  // standard allows 128/192/256 bit keys
	  $ciphertext = base64_decode($ciphertext);

	  // use AES to encrypt password (mirroring encrypt routine)
	  $nBytes = $nBits/8;  // no bytes in key
	  $pwBytes = array();
	  for ($i=0; $i<$nBytes; $i++) $pwBytes[$i] = ord(substr($password,$i,1)) & 0xff;
	  $key = self::Cipher($pwBytes, self::KeyExpansion($pwBytes));
	  $key = array_merge($key, array_slice($key, 0, $nBytes-16));  // expand key to 16/24/32 bytes long

	  // recover nonce from 1st element of ciphertext
	  $counterBlock = array();
	  $ctrTxt = substr($ciphertext, 0, 8);
	  for ($i=0; $i<8; $i++) $counterBlock[$i] = ord(substr($ctrTxt,$i,1));

	  // generate key schedule
	  $keySchedule = self::KeyExpansion($key);

	  // separate ciphertext into blocks (skipping past initial 8 bytes)
	  $nBlocks = ceil((strlen($ciphertext)-8) / $blockSize);
	  $ct = array();
	  for ($b=0; $b<$nBlocks; $b++) $ct[$b] = substr($ciphertext, 8+$b*$blockSize, 16);
	  $ciphertext = $ct;  // ciphertext is now array of block-length strings

	  // plaintext will get generated block-by-block into array of block-length strings
	  $plaintxt = array();

	  for ($b=0; $b<$nBlocks; $b++) {
	    // set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)
	    for ($c=0; $c<4; $c++) $counterBlock[15-$c] = self::urs($b, $c*8) & 0xff;
	    for ($c=0; $c<4; $c++) $counterBlock[15-$c-4] = self::urs(($b+1)/0x100000000-1, $c*8) & 0xff;

	    $cipherCntr = self::Cipher($counterBlock, $keySchedule);  // encrypt counter block

	    $plaintxtByte = array();
	    for ($i=0; $i<strlen($ciphertext[$b]); $i++) {
	      // -- xor plaintext with ciphered counter byte-by-byte --
	      $plaintxtByte[$i] = $cipherCntr[$i] ^ ord(substr($ciphertext[$b],$i,1));
	      $plaintxtByte[$i] = chr($plaintxtByte[$i]);

	    }
	    $plaintxt[$b] = implode('', $plaintxtByte);
	  }

	  // join array of blocks into single plaintext string
	  $plaintext = implode('',$plaintxt);

	  return $plaintext;
	}

	/**
	 * AES decryption in CBC mode. This is the standard mode (the CTR methods
	 * actually use Rijndael-128 in CTR mode, which - technically - isn't AES).
	 *
	 * Supports AES-128, AES-192 and AES-256. It supposes that the last 4 bytes
	 * contained a little-endian unsigned long integer representing the unpadded
	 * data length.
	 *
	 * @since 3.0.1
	 * @author Nicholas K. Dionysopoulos
	 *
	 * @param string $ciphertext The data to encrypt
	 * @param string $password Encryption password
	 * @param int $nBits Encryption key size. Can be 128, 192 or 256
	 * @return string The plaintext
	 */
	public static function AESDecryptCBC($ciphertext, $password, $nBits = 128)
	{
		if (!($nBits==128 || $nBits==192 || $nBits==256)) return false;  // standard allows 128/192/256 bit keys
		if(!function_exists('mcrypt_module_open')) return false;

		// Try to fetch cached key/iv or create them if they do not exist
		$lookupKey = $password.'-'.$nBits;
		if(array_key_exists($lookupKey, self::$passwords))
		{
			$key	= self::$passwords[$lookupKey]['key'];
			$iv		= self::$passwords[$lookupKey]['iv'];
		}
		else
		{
			// use AES itself to encrypt password to get cipher key (using plain password as source for
			// key expansion) - gives us well encrypted key
			$nBytes = $nBits/8;  // no bytes in key
			$pwBytes = array();
			for ($i=0; $i<$nBytes; $i++) $pwBytes[$i] = ord(substr($password,$i,1)) & 0xff;
			$key = self::Cipher($pwBytes, self::KeyExpansion($pwBytes));
			$key = array_merge($key, array_slice($key, 0, $nBytes-16));  // expand key to 16/24/32 bytes long
			$newKey = '';
			foreach($key as $int) { $newKey .= chr($int); }
			$key = $newKey;

			// Create an Initialization Vector (IV) based on the password, using the same technique as for the key
			$nBytes = 16;  // AES uses a 128 -bit (16 byte) block size, hence the IV size is always 16 bytes
			$pwBytes = array();
			for ($i=0; $i<$nBytes; $i++) $pwBytes[$i] = ord(substr($password,$i,1)) & 0xff;
			$iv = self::Cipher($pwBytes, self::KeyExpansion($pwBytes));
			$newIV = '';
			foreach($iv as $int) { $newIV .= chr($int); }
			$iv = $newIV;

			self::$passwords[$lookupKey]['key'] = $key;
			self::$passwords[$lookupKey]['iv'] = $iv;
		}

		// Read the data size
		$data_size = unpack('V', substr($ciphertext,-4) );

		// Decrypt
		$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
		mcrypt_generic_init($td, $key, $iv);
		$plaintext = mdecrypt_generic($td, substr($ciphertext,0,-4));
		mcrypt_generic_deinit($td);

		// Trim padding, if necessary
		if(strlen($plaintext) > $data_size)
		{
			$plaintext = substr($plaintext, 0, $data_size);
		}

		return $plaintext;
	}
}

/**
 * Akeeba Restore
 * A JSON-powered JPA, JPS and ZIP archive extraction library
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / Akeeba Ltd.
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

/**
 * The Master Setup will read the configuration parameters from restoration.php or
 * the JSON-encoded "configuration" input variable and return the status.
 *
 * @return bool True if the master configuration was applied to the Factory object
 */
function masterSetup()
{
	// ------------------------------------------------------------
	// 1. Import basic setup parameters
	// ------------------------------------------------------------

	$ini_data = null;

	// In restore.php mode, require restoration.php or fail
	if (!defined('KICKSTART'))
	{
		// This is the standalone mode, used by Akeeba Backup Professional. It looks for a restoration.php
		// file to perform its magic. If the file is not there, we will abort.
		$setupFile = 'restoration.php';

		if (!file_exists($setupFile))
		{
			AKFactory::set('kickstart.enabled', false);

			return false;
		}

		// Load restoration.php. It creates a global variable named $restoration_setup
		require_once $setupFile;

		$ini_data = $restoration_setup;

		if (empty($ini_data))
		{
			// No parameters fetched. Darn, how am I supposed to work like that?!
			AKFactory::set('kickstart.enabled', false);

			return false;
		}

		AKFactory::set('kickstart.enabled', true);
	}
	else
	{
		// Maybe we have $restoration_setup defined in the head of kickstart.php
		global $restoration_setup;

		if (!empty($restoration_setup) && !is_array($restoration_setup))
		{
			$ini_data = AKText::parse_ini_file($restoration_setup, false, true);
		}
		elseif (is_array($restoration_setup))
		{
			$ini_data = $restoration_setup;
		}
	}

	// Import any data from $restoration_setup
	if (!empty($ini_data))
	{
		foreach ($ini_data as $key => $value)
		{
			AKFactory::set($key, $value);
		}
		AKFactory::set('kickstart.enabled', true);
	}

	// Reinitialize $ini_data
	$ini_data = null;

	// ------------------------------------------------------------
	// 2. Explode JSON parameters into $_REQUEST scope
	// ------------------------------------------------------------

	// Detect a JSON string in the request variable and store it.
	$json = getQueryParam('json', null);

	// Remove everything from the request, post and get arrays
	if (!empty($_REQUEST))
	{
		foreach ($_REQUEST as $key => $value)
		{
			unset($_REQUEST[$key]);
		}
	}

	if (!empty($_POST))
	{
		foreach ($_POST as $key => $value)
		{
			unset($_POST[$key]);
		}
	}

	if (!empty($_GET))
	{
		foreach ($_GET as $key => $value)
		{
			unset($_GET[$key]);
		}
	}

	// Decrypt a possibly encrypted JSON string
	$password = AKFactory::get('kickstart.security.password', null);

	if (!empty($json))
	{
		if (!empty($password))
		{
			$json = AKEncryptionAES::AESDecryptCtr($json, $password, 128);

			if (empty($json))
			{
				die('###{"status":false,"message":"Invalid login"}###');
			}
		}

		// Get the raw data
		$raw = json_decode($json, true);

		if (!empty($password) && (empty($raw)))
		{
			die('###{"status":false,"message":"Invalid login"}###');
		}

		// Pass all JSON data to the request array
		if (!empty($raw))
		{
			foreach ($raw as $key => $value)
			{
				$_REQUEST[$key] = $value;
			}
		}
	}
	elseif (!empty($password))
	{
		die('###{"status":false,"message":"Invalid login"}###');
	}

	// ------------------------------------------------------------
	// 3. Try the "factory" variable
	// ------------------------------------------------------------
	// A "factory" variable will override all other settings.
	$serialized = getQueryParam('factory', null);

	if (!is_null($serialized))
	{
		// Get the serialized factory
		AKFactory::unserialize($serialized);
		AKFactory::set('kickstart.enabled', true);

		return true;
	}

	// ------------------------------------------------------------
	// 4. Try the configuration variable for Kickstart
	// ------------------------------------------------------------
	if (defined('KICKSTART'))
	{
		$configuration = getQueryParam('configuration');

		if (!is_null($configuration))
		{
			// Let's decode the configuration from JSON to array
			$ini_data = json_decode($configuration, true);
		}
		else
		{
			// Neither exists. Enable Kickstart's interface anyway.
			$ini_data = array('kickstart.enabled' => true);
		}

		// Import any INI data we might have from other sources
		if (!empty($ini_data))
		{
			foreach ($ini_data as $key => $value)
			{
				AKFactory::set($key, $value);
			}

			AKFactory::set('kickstart.enabled', true);

			return true;
		}
	}
}

/**
 * Akeeba Restore
 * A JSON-powered JPA, JPS and ZIP archive extraction library
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / Akeeba Ltd.
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

// Mini-controller for restore.php
if(!defined('KICKSTART'))
{
	// The observer class, used to report number of files and bytes processed
	class RestorationObserver extends AKAbstractPartObserver
	{
		public $compressedTotal = 0;
		public $uncompressedTotal = 0;
		public $filesProcessed = 0;

		public function update($object, $message)
		{
			if(!is_object($message)) return;

			if( !array_key_exists('type', get_object_vars($message)) ) return;

			if( $message->type == 'startfile' )
			{
				$this->filesProcessed++;
				$this->compressedTotal += $message->content->compressed;
				$this->uncompressedTotal += $message->content->uncompressed;
			}
		}

		public function __toString()
		{
			return __CLASS__;
		}

	}

	// Import configuration
	masterSetup();

	$retArray = array(
		'status'	=> true,
		'message'	=> null
	);

	$enabled = AKFactory::get('kickstart.enabled', false);

	if($enabled)
	{
		$task = getQueryParam('task');

		switch($task)
		{
			case 'ping':
				// ping task - realy does nothing!
				$timer = AKFactory::getTimer();
				$timer->enforce_min_exec_time();
				break;

			case 'startRestore':
				AKFactory::nuke(); // Reset the factory

				// Let the control flow to the next step (the rest of the code is common!!)

			case 'stepRestore':
				$engine = AKFactory::getUnarchiver(); // Get the engine
				$observer = new RestorationObserver(); // Create a new observer
				$engine->attach($observer); // Attach the observer
				$engine->tick();
				$ret = $engine->getStatusArray();

				if( $ret['Error'] != '' )
				{
					$retArray['status'] = false;
					$retArray['done'] = true;
					$retArray['message'] = $ret['Error'];
				}
				elseif( !$ret['HasRun'] )
				{
					$retArray['files'] = $observer->filesProcessed;
					$retArray['bytesIn'] = $observer->compressedTotal;
					$retArray['bytesOut'] = $observer->uncompressedTotal;
					$retArray['status'] = true;
					$retArray['done'] = true;
				}
				else
				{
					$retArray['files'] = $observer->filesProcessed;
					$retArray['bytesIn'] = $observer->compressedTotal;
					$retArray['bytesOut'] = $observer->uncompressedTotal;
					$retArray['status'] = true;
					$retArray['done'] = false;
					$retArray['factory'] = AKFactory::serialize();
				}
				break;

			case 'finalizeRestore':
				$root = AKFactory::get('kickstart.setup.destdir');
				// Remove the installation directory
				recursive_remove_directory( $root.'/installation' );

				$postproc = AKFactory::getPostProc();

				// Rename htaccess.bak to .htaccess
				if(file_exists($root.'/htaccess.bak'))
				{
					if( file_exists($root.'/.htaccess')  )
					{
						$postproc->unlink($root.'/.htaccess');
					}
					$postproc->rename( $root.'/htaccess.bak', $root.'/.htaccess' );
				}

				// Rename htaccess.bak to .htaccess
				if(file_exists($root.'/web.config.bak'))
				{
					if( file_exists($root.'/web.config')  )
					{
						$postproc->unlink($root.'/web.config');
					}
					$postproc->rename( $root.'/web.config.bak', $root.'/web.config' );
				}

				// Remove restoration.php
				$basepath = KSROOTDIR;
				$basepath = rtrim( str_replace('\\','/',$basepath), '/' );
				if(!empty($basepath)) $basepath .= '/';
				$postproc->unlink( $basepath.'restoration.php' );

				// Import a custom finalisation file
				if (file_exists(dirname(__FILE__) . '/restore_finalisation.php'))
				{
					include_once dirname(__FILE__) . '/restore_finalisation.php';
				}

				// Run a custom finalisation script
				if (function_exists('finalizeRestore'))
				{
					finalizeRestore($root, $basepath);
				}
				break;

			default:
				// Invalid task!
				$enabled = false;
				break;
		}
	}

	// Maybe we weren't authorized or the task was invalid?
	if(!$enabled)
	{
		// Maybe the user failed to enter any information
		$retArray['status'] = false;
		$retArray['message'] = AKText::_('ERR_INVALID_LOGIN');
	}

	// JSON encode the message
	$json = json_encode($retArray);
	// Do I have to encrypt?
	$password = AKFactory::get('kickstart.security.password', null);
	if(!empty($password))
	{
		$json = AKEncryptionAES::AESEncryptCtr($json, $password, 128);
	}

	// Return the message
	echo "###$json###";

}

// ------------ lixlpixel recursive PHP functions -------------
// recursive_remove_directory( directory to delete, empty )
// expects path to directory and optional TRUE / FALSE to empty
// of course PHP has to have the rights to delete the directory
// you specify and all files and folders inside the directory
// ------------------------------------------------------------
function recursive_remove_directory($directory)
{
	// if the path has a slash at the end we remove it here
	if(substr($directory,-1) == '/')
	{
		$directory = substr($directory,0,-1);
	}
	// if the path is not valid or is not a directory ...
	if(!file_exists($directory) || !is_dir($directory))
	{
		// ... we return false and exit the function
		return FALSE;
	// ... if the path is not readable
	}elseif(!is_readable($directory))
	{
		// ... we return false and exit the function
		return FALSE;
	// ... else if the path is readable
	}else{
		// we open the directory
		$handle = opendir($directory);
		$postproc = AKFactory::getPostProc();
		// and scan through the items inside
		while (FALSE !== ($item = readdir($handle)))
		{
			// if the filepointer is not the current directory
			// or the parent directory
			if($item != '.' && $item != '..')
			{
				// we build the new path to delete
				$path = $directory.'/'.$item;
				// if the new path is a directory
				if(is_dir($path))
				{
					// we call this function with the new path
					recursive_remove_directory($path);
				// if the new path is a file
				}else{
					// we remove the file
					$postproc->unlink($path);
				}
			}
		}
		// close the directory
		closedir($handle);
		// try to delete the now empty directory
		if(!$postproc->rmdir($directory))
		{
			// return false if not possible
			return FALSE;
		}
		// return success
		return TRUE;
	}
}


/**
 * Akeeba Kickstart
 * A JSON-powered archive extraction tool
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */
class AKKickstartUtils
{
	/**
	 * Guess the best path containing backup archives. The default strategy is check in the current directory first,
	 * then attempt to find an Akeeba Backup for Joomla!, Akeeba Solo or Akeeba Backup for WordPress default backup
	 * output directory under the current root. The first one containing backup archives wins.
	 *
	 * @return string The path to get archives from
	 */
	public static function getBestArchivePath()
	{
		$basePath = self::getPath();
		$basePathSlash = (empty($basePath) ? '.' : rtrim($basePath, '/\\')) . '/';

		$paths = array(
			$basePath,
			$basePathSlash . 'administrator/components/com_akeeba/backup',
			$basePathSlash . 'backups',
			$basePathSlash . 'wp-content/plugins/akeebabackupwp/app/backups',
		);

		foreach ($paths as $path)
		{
			$archives = self::findArchives($path);

			if (!empty($archives))
			{
				return $path;
			}
		}

		return $basePath;
	}

	/**
	 * Gets the directory the file is in
	 *
	 * @return string
	 */
	public static function getPath()
	{
		$path = KSROOTDIR;
		$path = rtrim(str_replace('\\', '/', $path), '/');
		if (!empty($path))
		{
			$path .= '/';
		}

		return $path;
	}

	/**
	 * Scans the current directory for archive files (JPA, JPS and ZIP format)
	 *
	 * @param string $path The path to look for archives. null for automatic path
	 *
	 * @return array
	 */
	public static function findArchives($path)
	{
		$ret = array();

		if (empty($path))
		{
			$path = self::getPath();
		}

		if (empty($path))
		{
			$path = '.';
		}

		$dh = @opendir($path);

		if ($dh === false)
		{
			return $ret;
		}

		while (false !== $file = @readdir($dh))
		{
			$dotpos = strrpos($file, '.');

			if ($dotpos === false)
			{
				continue;
			}

			if ($dotpos == strlen($file))
			{
				continue;
			}

			$extension = strtolower(substr($file, $dotpos + 1));

			if (in_array($extension, array('jpa', 'zip', 'jps')))
			{
				$ret[] = $file;
			}
		}

		closedir($dh);

		if (!empty($ret))
		{
			return $ret;
		}

		// On some hosts using opendir doesn't work. Let's try Dir instead
		$d = dir($path);

		while (false != ($file = $d->read()))
		{
			$dotpos = strrpos($file, '.');

			if ($dotpos === false)
			{
				continue;
			}

			if ($dotpos == strlen($file))
			{
				continue;
			}

			$extension = strtolower(substr($file, $dotpos + 1));

			if (in_array($extension, array('jpa', 'zip', 'jps')))
			{
				$ret[] = $file;
			}
		}

		return $ret;
	}

	/**
	 * Scans the current directory for archive files and returns them as <OPTION> tags
	 *
	 * @param string $path The path to look for archives. null for automatic path
	 *
	 * @return string
	 */
	public static function getArchivesAsOptions($path = null)
	{
		$ret = '';

		$archives = self::findArchives($path);

		if (empty($archives))
		{
			return $ret;
		}

		foreach ($archives as $file)
		{
			//$file = htmlentities($file);
			$ret .= '<option value="' . $file . '">' . $file . '</option>' . "\n";
		}

		return $ret;
	}
}

/**
 * Akeeba Kickstart
 * A JSON-powered archive extraction tool
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

class ExtractionObserver extends AKAbstractPartObserver
{
	public $compressedTotal = 0;
	public $uncompressedTotal = 0;
	public $filesProcessed = 0;
	public $totalSize = null;
	public $fileList = null;
	public $lastFile = '';

	public function update($object, $message)
	{
		if(!is_object($message)) return;

		if( !array_key_exists('type', get_object_vars($message)) ) return;

		if( $message->type == 'startfile' )
		{
			$this->lastFile = $message->content->file;
			$this->filesProcessed++;
			$this->compressedTotal += $message->content->compressed;
			$this->uncompressedTotal += $message->content->uncompressed;
		}
		elseif( $message->type == 'totalsize' )
		{
			$this->totalSize = $message->content->totalsize;
			$this->fileList = $message->content->filelist;
		}
	}

	public function __toString()
	{
		return __CLASS__;
	}

}

/**
 * Akeeba Kickstart
 * A JSON-powered archive extraction tool
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

function callExtraFeature($method = null, array $params = array())
{
	static $extraFeatureObjects = null;

	if(!is_array($extraFeatureObjects)) {
		$extraFeatureObjects = array();
		$allClasses = get_declared_classes();
		foreach($allClasses as $class) {
			if(substr($class, 0, 9) == 'AKFeature') {
				$extraFeatureObjects[] = new $class;
			}
		}
	}

	if(is_null($method)) {
		return;
	}

	if(empty($extraFeatureObjects)) {
		return;
	}

	$result = null;
	foreach($extraFeatureObjects as $o) {
		if(!method_exists($o, $method)) {
			continue;
		}
		$result = call_user_func(array($o, $method), $params);
	}

	return $result;
}

/**
 * Akeeba Kickstart
 * A JSON-powered archive extraction tool
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

function TranslateWinPath($p_path)
{
	$is_unc = false;

	if (KSWINDOWS)
	{
		// Is this a UNC path?
		$is_unc = (substr($p_path, 0, 2) == '\\\\') || (substr($p_path, 0, 2) == '//');
		// Change potential windows directory separator
		if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0, 1) == '\\'))
		{
			$p_path = strtr($p_path, '\\', '/');
		}
	}

	// Remove multiple slashes
	$p_path = str_replace('///', '/', $p_path);
	$p_path = str_replace('//', '/', $p_path);

	// Fix UNC paths
	if ($is_unc)
	{
		$p_path = '//' . ltrim($p_path, '/');
	}

	return $p_path;
}


/**
 * FTP Functions
 */
function getListing($directory, $host, $port, $username, $password, $passive, $ssl)
{
	$directory = resolvePath($directory);
	$dir       = $directory;

	// Parse directory to parts
	$parsed_dir = trim($dir,'/');
	$parts = empty($parsed_dir) ? array() : explode('/', $parsed_dir);

	// Find the path to the parent directory
	if(!empty($parts)) {
		$copy_of_parts = $parts;
		array_pop($copy_of_parts);
		if(!empty($copy_of_parts)) {
			$parent_directory = '/' . implode('/', $copy_of_parts);
		} else {
			$parent_directory = '/';
		}
	} else {
		$parent_directory = '';
	}

	// Connect to the server
	if($ssl) {
		$con = @ftp_ssl_connect($host, $port);
	} else {
		$con = @ftp_connect($host, $port);
	}
	if($con === false) {
		return array(
			'error' => 'FTPBROWSER_ERROR_HOSTNAME'
		);
	}

	// Login
	$result = @ftp_login($con, $username, $password);
	if($result === false) {
		return array(
			'error' => 'FTPBROWSER_ERROR_USERPASS'
		);
	}

	// Set the passive mode -- don't care if it fails, though!
	@ftp_pasv($con, $passive);

	// Try to chdir to the specified directory
	if(!empty($dir)) {
		$result = @ftp_chdir($con, $dir);
		if($result === false) {
			return array(
				'error' => 'FTPBROWSER_ERROR_NOACCESS'
			);
		}
	}

	// Get a raw directory listing (hoping it's a UNIX server!)
	$list = @ftp_rawlist($con,'.');
	ftp_close($con);

	if($list === false) {
		return array(
			'error' => 'FTPBROWSER_ERROR_UNSUPPORTED'
		);
	}

	// Parse the raw listing into an array
	$folders = parse_rawlist($list);

	return array(
		'error'			=> '',
		'list'			=> $folders,
		'breadcrumbs'	=> $parts,
		'directory'		=> $directory,
		'parent'		=> $parent_directory
	);
}

function parse_rawlist($list)
{
	$folders = array();
	foreach($list as $v)
	{
		$info = array();
		$vinfo = preg_split("/[\s]+/", $v, 9);
		if ($vinfo[0] !== "total") {
			$perms = $vinfo[0];
			if(substr($perms,0,1) == 'd') {
				$folders[] = $vinfo[8];
			}
		}
	}

	asort($folders);
	return $folders;
}

function getSftpListing($directory, $host, $port, $username, $password)
{
	$directory = resolvePath($directory);
	$dir       = $directory;

	// Parse directory to parts
	$parsed_dir = trim($dir,'/');
	$parts = empty($parsed_dir) ? array() : explode('/', $parsed_dir);

	// Find the path to the parent directory
	if(!empty($parts)) {
		$copy_of_parts = $parts;
		array_pop($copy_of_parts);
		if(!empty($copy_of_parts)) {
			$parent_directory = '/' . implode('/', $copy_of_parts);
		} else {
			$parent_directory = '/';
		}
	} else {
		$parent_directory = '';
	}

	// Initialise
	$connection = null;
	$sftphandle = null;

	// Open a connection
	if(!function_exists('ssh2_connect'))
	{
		return array(
			'error' => AKText::_('SFTP_NO_SSH2')
		);
	}

	$connection = ssh2_connect($host, $port);

	if ($connection === false)
	{
		return array(
			'error' => AKText::_('SFTP_WRONG_USER')
		);
	}

	if(!ssh2_auth_password($connection, $username, $password))
	{
		return array(
			'error' => AKText::_('SFTP_WRONG_USER')
		);
	}

	$sftphandle = ssh2_sftp($connection);

	if($sftphandle === false)
	{
		return array(
			'error' => AKText::_('SFTP_NO_FTP_SUPPORT')
		);
	}

	// Get a raw directory listing (hoping it's a UNIX server!)
	$list = array();
	$dir  = ltrim($dir, '/');

	$handle = opendir("ssh2.sftp://$sftphandle/$dir");

	if (!is_resource($handle))
	{
		return array(
			'error' => AKText::_('SFTPBROWSER_ERROR_NOACCESS')
		);
	}

	while (($entry = readdir($handle)) !== false)
	{
		if (!is_dir("ssh2.sftp://$sftphandle/$dir/$entry"))
		{
			continue;
		}

		$list[] = $entry;
	}

	closedir($handle);

	if (!empty($list))
	{
		asort($list);
	}

	return array(
		'error'			=> '',
		'list'			=> $list,
		'breadcrumbs'	=> $parts,
		'directory'		=> $directory,
		'parent'		=> $parent_directory
	);
}

/**
 * Simple function to resolve relative paths.
 * Note that it is unable to resolve pathnames any higher than the present working directory.
 * I.E. It doesn't know about any directory names that you don't tell it about; hence: ../../foo becomes foo.
 *
 * @param $filename
 *
 * @return string
 */
function resolvePath($filename)
{
	$filename = str_replace('//', '/', $filename);
	$parts = explode('/', $filename);
	$out = array();
	foreach ($parts as $part){
		if ($part == '.') continue;
		if ($part == '..') {
			array_pop($out);
			continue;
		}
		$out[] = $part;
	}
	return implode('/', $out);
}

function createStealthURL()
{
	$filename = AKFactory::get('kickstart.stealth.url', '');
	// We need an HTML file!
	if(empty($filename)) return;
	// Make sure it ends in .html or .htm
	$filename = basename($filename);
	if( (strtolower(substr($filename,-5)) != '.html') && (strtolower(substr($filename,-4)) != '.htm') ) return;

	$filename_quoted = str_replace('.','\\.',$filename);
	$rewrite_base = trim(dirname(AKFactory::get('kickstart.stealth.url', '')),'/');

	// Get the IP
	$userIP = $_SERVER['REMOTE_ADDR'];
	$userIP = str_replace('.', '\.', $userIP);

	// Get the .htaccess contents
	$stealthHtaccess = <<<ENDHTACCESS
RewriteEngine On
RewriteBase /$rewrite_base
RewriteCond %{REMOTE_HOST}		!$userIP
RewriteCond %{REQUEST_URI}		!$filename_quoted
RewriteCond %{REQUEST_URI}		!(\.png|\.jpg|\.gif|\.jpeg|\.bmp|\.swf|\.css|\.js)$
RewriteRule (.*)				$filename	[R=307,L]

ENDHTACCESS;

	// Write the new .htaccess, removing the old one first
	$postproc = AKFactory::getpostProc();
	$postproc->unlink('.htaccess');
	$tempfile = $postproc->processFilename('.htaccess');
	@file_put_contents($tempfile, $stealthHtaccess);
	$postproc->process();
}

/**
 * Akeeba Kickstart
 * A JSON-powered archive extraction tool
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

function echoCSS() {
	echo <<<CSS
html {
    background: #e9e9e9;
    font-size: 62.5%;
}
body {
	font-size: 14px;
    font-size: 1.4rem;
    font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
	text-rendering: optimizelegibility;
	background: transparent;
	color:#555;
	width:90%;
	max-width:980px;
	margin: 0 auto;
}

#page-container {
	position:relative;
	margin:5% 0;
	background: #f9f9f9;
	border: 1px solid #777;
	border: 1px solid rgba(0,0,0,.2);
	-webkit-box-shadow: 0px 0px 10px rgba(0,0,0,.1);
    -moz-box-shadow: 0px 0px 10px rgba(0,0,0,.1);
    box-shadow: 0px 0px 10px rgba(0,0,0,.1);
}

#header {
	color: #555;
	text-shadow: 0 1px #fff;
	background: #f2f5f6;
	background: -moz-linear-gradient(top, #f2f5f6 0%, #e3eaed 37%, #c8d7dc 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f2f5f6), color-stop(37%,#e3eaed), color-stop(100%,#c8d7dc));
	background: -webkit-linear-gradient(top, #f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);
	background: -o-linear-gradient(top, #f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);
	background: -ms-linear-gradient(top, #f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);
	background: linear-gradient(top, #f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);
	-moz-background-clip: padding;
	-webkit-background-clip: padding-box;
	background-clip: padding-box;
	margin-bottom: 0.7em;
	border-bottom: 1px solid #ddd;
	border-bottom: 1px solid rgba(0,0,0,.2);
	padding:.25em;
    font-size: 32px;
    font-size: 3.2rem;
	line-height: 1.2;
	text-align: center;
}

#footer {
	font-size: 8pt;
	color: #233b53;
	text-align: center;
	border-top: 1px solid #ddd;
	border-top: 1px solid rgba(0,0,0,.05);
	padding: 1em 2em;
	background: #deefff;
	background: -moz-linear-gradient(top, #deefff 0%, #98bede 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#deefff), color-stop(100%,#98bede));
	background: -webkit-linear-gradient(top, #deefff 0%,#98bede 100%);
	background: -o-linear-gradient(top, #deefff 0%,#98bede 100%);
	background: -ms-linear-gradient(top, #deefff 0%,#98bede 100%);
	background: linear-gradient(top, #deefff 0%,#98bede 100%);
	clear: both;
}

#error, .error {
	display: none;
	border: solid #cc0000;
	border-width: 2px 0;
	background: rgb(255,255,136);
	background: -moz-linear-gradient(top, rgba(255,255,136,1) 0%, rgba(255,255,136,1) 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,136,1)), color-stop(100%,rgba(255,255,136,1)));
	background: -webkit-linear-gradient(top, rgba(255,255,136,1) 0%,rgba(255,255,136,1) 100%);
	background: -o-linear-gradient(top, rgba(255,255,136,1) 0%,rgba(255,255,136,1) 100%);
	background: -ms-linear-gradient(top, rgba(255,255,136,1) 0%,rgba(255,255,136,1) 100%);
	background: linear-gradient(top, rgba(255,255,136,1) 0%,rgba(255,255,136,1) 100%);
	color: #990000;
	padding:2em 2em 1em;
	margin-bottom: 1.15em;
	text-align:center;
	text-transform: uppercase;
}

#errorMessage, .errorMessage {
	text-transform: none;
}

#error h3, .error h3 {
	margin: 0;
	padding: 0;
	font-size: 12pt;
}

.clr {
	clear: both;
}

.circle {
	display: block;
	float: left;
	-moz-border-radius: 2em;
	-webkit-border-radius: 2em;
	border: 2px solid #e5e5e5;
	font-weight: bold;
	font-size: 18px;
    font-size: 1.8rem;
	line-height:1.5em;
	color: #fff;
	height: 1.5em;
	width: 1.5em;
    margin: 0.75em;
    text-align: center;
    background: rgb(35,83,138);
	background: -moz-linear-gradient(top, rgba(35,83,138,1) 0%, rgba(167,207,223,1) 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(35,83,138,1)), color-stop(100%,rgba(167,207,223,1)));
	background: -webkit-linear-gradient(top, rgba(35,83,138,1) 0%,rgba(167,207,223,1) 100%);
	background: -o-linear-gradient(top, rgba(35,83,138,1) 0%,rgba(167,207,223,1) 100%);
	background: -ms-linear-gradient(top, rgba(35,83,138,1) 0%,rgba(167,207,223,1) 100%);
	background: linear-gradient(top, rgba(35,83,138,1) 0%,rgba(167,207,223,1) 100%);
	-webkit-box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.8) inset, 0px -1px 2px rgba(255,255,255,.9) inset,  0px 0px 1px rgba(0,0,0,.7); 0 -1px 1px rgba(0,0,0,.4);
    -moz-box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.8) inset, 0px -1px 2px rgba(255,255,255,.9) inset,  0px 0px 1px rgba(0,0,0,.7); 0 -1px 1px rgba(0,0,0,.4);
    box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.8) inset, 0px -1px 2px rgba(255,255,255,.9) inset,  0px 0px 1px rgba(0,0,0,.7); 0 -1px 1px rgba(0,0,0,.4);
}

.area-container {
	margin: 1em 4em;
}

#page2a .area-container {
	margin: 1em 0;
}

#runInstaller,
#runCleanup,
#gotoSite,
#gotoAdministrator,
#gotoPostRestorationRroubleshooting {
    margin: 0 2em 1.3em;
}

h2 {
	font-size: 24px;
    font-size: 2.4rem;
	font-weight: normal;
    line-height: 1.3;
	border: solid #ddd;
	text-shadow: 0px 1px #fff;
	border-top: 1px solid rgba(0,0,0,.05);
	border-bottom: 1px solid rgba(0,0,0,.2);
	border-left:none;
	border-right:none;
	padding: 0.5em 0;
    background: #f2f5f6;
	background: -moz-linear-gradient(top, #f2f5f6 0%, #e3eaed 37%, #c8d7dc 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f2f5f6), color-stop(37%,#e3eaed), color-stop(100%,#c8d7dc));
	background: -webkit-linear-gradient(top, #f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);
	background: -o-linear-gradient(top, #f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);
	background: -ms-linear-gradient(top, #f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);
	background: linear-gradient(top, #f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%);
}
#preextraction h2 {
	margin-top:0;
	border-top:0;
	text-align:center;
}

input,
select,
textarea {
    font-size : 100%;
    margin : 0;
    vertical-align : baseline;
    *vertical-align: middle;
}
button,
input {
    line-height : normal;
	font-weight:normal;
    *overflow: visible;
}
input,
select,
textarea {
	background:#fff;
	color:#777;
	font-size: 16px;
	font-size: 1.6rem;
	border:1px solid #d5d5d5;
    -webkit-border-radius: .25em;
    -moz-border-radius: .25em;
    border-radius: .25em;
	-webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
	width:50%;
	padding:0 0 0 .5em;
}
input[type="checkbox"] {
	width:auto;
}
.field {
	height:1.5em;
}
label {
	display:inline-block;
	width:30%;
	font-size: 85%;
    font-weight: normal;
	text-transform: uppercase;
    cursor : pointer;
	color: #777;
	margin:.5em 0;
}

input:focus, input:hover {
	background-color: #fffbb3;
}

.button {
	display: inline-block;
	margin: 1em .25em;
	text-transform: uppercase;
	padding: 1em 2em;
	background: #2cb12c;
	color:#fff;
	text-shadow: 0 1px 3px rgba(0, 0, 0, 0.2), 0 1px rgba(0, 0, 0, 0.4);
	-webkit-box-shadow: 0 1px 3px rgba(255, 255, 255, 0.5) inset, -1px 2px 2px rgba(0, 0, 0, 0.2);
    -moz-box-shadow: 0 1px 3px rgba(255, 255, 255, 0.5) inset, -1px 2px 2px rgba(0, 0, 0, 0.2);
    box-shadow: 0 1px 3px rgba(255, 255, 255, 0.5) inset, -1px 2px 2px rgba(0, 0, 0, 0.2);
	background: -moz-linear-gradient(top, #2cb12c 0%, #259625 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#2cb12c), color-stop(100%,#259625));
	background: -webkit-linear-gradient(top, #2cb12c 0%,#259625 100%);
	background: -o-linear-gradient(top, #2cb12c 0%,#259625 100%);
	background: -ms-linear-gradient(top, #2cb12c 0%,#259625 100%);
	background: linear-gradient(top, #2cb12c 0%,#259625 100%);
	border: solid #ddd;
	border: 1px solid rgba(0,0,0,.1);
	cursor: pointer;
	-webkit-border-radius: .25em;
	-moz-border-radius: .25em;
	border-radius: .25em;
	-webkit-transition: 0.3s linear all;
	-moz-transition: 0.3s linear all;
	-ms-transition: 0.3s linear all;
	-o-transition: 0.3s linear all;
  	transition: 0.3s linear all;
}
#checkFTPTempDir.button,
#resetFTPTempDir.button,
#testFTP.button,
#browseFTP,
#reloadArchives,
#notWorking.button {
	padding: .5em 1em;
	text-transform: none;
}

.button:hover {
	background: #259625;
	background: -moz-linear-gradient(top, #259625 0%, #2cb12c 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#259625), color-stop(100%,#2cb12c));
	background: -webkit-linear-gradient(top, #259625 0%,#2cb12c 100%);
	background: -o-linear-gradient(top, #259625 0%,#2cb12c 100%);
	background: -ms-linear-gradient(top, #259625 0%,#2cb12c 100%);
	background: linear-gradient(top, #259625 0%,#2cb12c 100%);
}
.button:active {
	background: #3c3;
	color: #444;
	text-shadow: 0 1px #fff;
	border: solid #ccc;
	border: 1px solid rgba(0,0,0,.3);
	-webkit-box-shadow: 0 1px 3px rgba(0,0,0, 0.5) inset;
    -moz-box-shadow: 0 1px 3px rgba(0,0,0, 0.5) inset;
    box-shadow: 0 1px 3px rgba(0,0,0, 0.5) inset;
}

#notWorking.button, .bluebutton {
	text-decoration: none;
	background: #7abcff;
	background: -moz-linear-gradient(top, #7abcff 0%, #60abf8 44%, #4096ee 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#7abcff), color-stop(44%,#60abf8), color-stop(100%,#4096ee));
	background: -webkit-linear-gradient(top, #7abcff 0%,#60abf8 44%,#4096ee 100%);
	background: -o-linear-gradient(top, #7abcff 0%,#60abf8 44%,#4096ee 100%);
	background: -ms-linear-gradient(top, #7abcff 0%,#60abf8 44%,#4096ee 100%);
	background: linear-gradient(top, #7abcff 0%,#60abf8 44%,#4096ee 100%);
}
#notWorking.button:hover, .bluebutton:hover {
	background: #4096ee;
	background: -moz-linear-gradient(top, #4096ee 0%, #60abf8 56%, #7abcff 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#4096ee), color-stop(56%,#60abf8), color-stop(100%,#7abcff));
	background: -webkit-linear-gradient(top, #4096ee 0%,#60abf8 56%,#7abcff 100%);
	background: -o-linear-gradient(top, #4096ee 0%,#60abf8 56%,#7abcff 100%);
	background: -ms-linear-gradient(top, #4096ee 0%,#60abf8 56%,#7abcff 100%);
	background: linear-gradient(top, #4096ee 0%,#60abf8 56%,#7abcff 100%);
}
#notWorking.button:active, .bluebutton:active {
	background: #7abcff;
}

.loprofile {
	padding: 0.5em 1em;
	font-size: 80%;
}

.black_overlay{
	display: none;
	position: absolute;
	top: 0%;
	left: 0%;
	width: 100%;
	height: 100%;
	background-color: black;
	z-index:1001;
	-moz-opacity: 0.8;
	opacity:.80;
	filter: alpha(opacity=80);
}

.white_content {
	display: none;
	position: absolute;
	padding: 0 0 1em;
	background: #fff;
	border: 1px solid #ddd;
	border: 1px solid rgba(0,0,0,.3);
	z-index:1002;
	overflow: hidden;
}
.white_content a{
	margin-left:4em;
}
ol {
	margin:0 2em;
	padding:0 2em 1em;
}
li {
	margin : 0 0 .5em;
}

#genericerror {
	background-color: #f0f000 !important;
	border: 4px solid #fcc !important;
}

#genericerrorInner {
	font-size: 110%;
	color: #33000;
}

#warn-not-close, .warn-not-close {
	padding: 0.2em 0.5em;
	text-align: center;
	background: #fcfc00;
	font-size: smaller;
	font-weight: bold;
}

#progressbar, .progressbar {
	display: block;
	width: 80%;
	height: 32px;
	border: 1px solid #ccc;
	margin: 1em 10% 0.2em;
	-moz-border-radius: .25em;
	-webkit-border-radius: .25em;
	border-radius: .25em;
}

#progressbar-inner, .progressbar-inner {
	display: block;
	width: 100%;
	height: 100%;
	background: #4096ee;
	background: -moz-linear-gradient(left, #4096ee 0%, #60abf8 56%, #7abcff 100%);
	background: -webkit-gradient(linear, left top, right top, color-stop(0%,#4096ee), color-stop(56%,#60abf8), color-stop(100%,#7abcff));
	background: -webkit-linear-gradient(left, #4096ee 0%,#60abf8 56%,#7abcff 100%);
	background: -o-linear-gradient(left, #4096ee 0%,#60abf8 56%,#7abcff 100%);
	background: -ms-linear-gradient(left, #4096ee 0%,#60abf8 56%,#7abcff 100%);
	background: linear-gradient(left, #4096ee 0%,#60abf8 56%,#7abcff 100%);
}

#currentFile {
	font-family: Consolas, "Courier New", Courier, monospace;
	font-size: 9pt;
	height: 10pt;
	overflow: hidden;
	text-overflow: ellipsis;
	background: #ccc;
	margin: 0 10% 1em;
	padding:.125em;
}

#extractionComplete {
}

#warningsContainer {
	border-bottom: 2px solid brown;
	border-left: 2px solid brown;
	border-right: 2px solid brown;
	padding: 5px 0;
	background: #ffffcc;
	-webkit-border-bottom-right-radius: 5px;
	-webkit-border-bottom-left-radius: 5px;
	-moz-border-radius-bottomleft: 5px;
	-moz-border-radius-bottomright: 5px;
}

#warningsHeader h2 {
	color: black;
	text-shadow: 2px 2px 5px #999999;
	border-top: 2px solid brown;
	border-left: 2px solid brown;
	border-right: 2px solid brown;
	border-bottom: thin solid brown;
	-webkit-border-top-right-radius: 5px;
	-webkit-border-top-left-radius: 5px;
	-moz-border-radius-topleft: 5px;
	-moz-border-radius-topright: 5px;
	background: yellow;
	font-size: large;
	padding: 2px 5px;
	margin: 0px;
}

#warnings {
	height: 200px;
	overflow-y: scroll;
}

#warnings div {
	background: #eeeeee;
	font-size: small;
	padding: 2px 4px;
	border-bottom: thin solid #333333;
}

#automode {
	display: inline-block;
	padding: 6pt 12pt;
	background-color: #cc0000;
	border: thick solid yellow;
	color: white;
	font-weight: bold;
	font-size: 125%;
	position: absolute;
	float: right;
	top: 1em;
	right: 1em;
}

.helpme,
#warn-not-close {
	background: rgb(255,255,136);
	background: -moz-linear-gradient(top, rgba(255,255,136,1) 0%, rgba(255,255,136,1) 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,136,1)), color-stop(100%,rgba(255,255,136,1)));
	background: -webkit-linear-gradient(top, rgba(255,255,136,1) 0%,rgba(255,255,136,1) 100%);
	background: -o-linear-gradient(top, rgba(255,255,136,1) 0%,rgba(255,255,136,1) 100%);
	background: -ms-linear-gradient(top, rgba(255,255,136,1) 0%,rgba(255,255,136,1) 100%);
	background: linear-gradient(top, rgba(255,255,136,1) 0%,rgba(255,255,136,1) 100%);
	padding: 0.75em 0.5em;
	border: solid #febf01;
	border-width: 1px 0;
	text-align: center;
}

#update-notification {
	margin: 1em;
	padding: 0.5em;
	background-color: #FF9;
	color: #F33;
	text-align: center;
	border-radius: 20px;
	border: medium solid red;
	box-shadow: 5px 5px 5px black;
}

.update-notify {
	font-size: 20pt;
	font-weight: bold;
}

.update-links {
	color: #333;
	font-size: 14pt;
}

#update-dlnow {
	text-decoration: none;
	color: #333;
	border: thin solid #333;
	padding: 0.5em;
	border-radius: 5px;
	background-color: #f0f0f0;
	text-shadow: 1px 1px 1px #999;
}

#update-dlnow:hover {
	background-color: #fff;
}

#update-whatsnew {
	font-size: 11pt;
	color: blue;
	text-decoration: underline;
}

.update-whyupdate {
	color: #333;
	font-size: 9pt;
}

/* FTP Browser */
.breadcrumb {background-color: #F5F5F5; border-radius: 4px; list-style: none outside none; margin: 0 0 18px; padding: 8px 15px;}
.breadcrumb > li {display: inline-block; text-shadow: 0 1px 0 #FFFFFF;}
#ak_crumbs span {padding: 1px 3px;}
#ak_crumbs a {cursor: pointer;}
#ftpBrowserFolderList a{cursor:pointer}

/* Bootstrap porting */
.table {margin-bottom: 18px;width: 100%;}
.table th, .table td {border-top: 1px solid #DDDDDD; line-height: 18px; padding: 8px; text-align: left; vertical-align: top;}
.table-striped tbody > tr:nth-child(2n+1) > td, .table-striped tbody > tr:nth-child(2n+1) > th { background-color: #F9F9F9;}

/* Layout helpers
----------------------------------*/
.ui-helper-hidden { display: none; }
.ui-helper-hidden-accessible { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; }
.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; }
.ui-helper-clearfix:after { clear: both; }
.ui-helper-clearfix { zoom: 1; }
.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }


/* Interaction Cues
----------------------------------*/
.ui-state-disabled { cursor: default !important; }

/* Icons
----------------------------------*/

/* states and images */
.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }

/* Misc visuals
----------------------------------*/

/* Overlays */
.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
.ui-resizable { position: relative;}
.ui-resizable-handle { position: absolute;font-size: 0.1px; display: block; }
.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}
.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
.ui-button, .ui-button:link, .ui-button:visited, .ui-button:hover, .ui-button:active { text-decoration: none; }
.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
.ui-button-icons-only { width: 3.4em; }
button.ui-button-icons-only { width: 3.7em; }

/*button text element */
.ui-button .ui-button-text { display: block; line-height: 1.4;  }
.ui-button-text-only .ui-button-text { padding: 0; }
.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
/* no icon support for input elements, provide padding by default */
input.ui-button { padding: .4em 1em; }

/*button icon element(s) */
.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }

/*button sets*/
.ui-buttonset { margin-right: 7px; }
.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }

/* workarounds */
button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
.ui-dialog { position: absolute; top: 0; left: 0; padding: .2em; width: 300px; overflow: hidden; }
.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; }
.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; display:none}
.ui-dialog .ui-dialog-titlebar-close span { display: none; margin: 1px; }
.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
.ui-draggable .ui-dialog-titlebar { cursor: move; }

/* Component containers
----------------------------------*/
.ui-widget-content { border: 1px solid #a6c9e2; background: #fcfdfd; color: #222222; }
.ui-widget-content a { color: #222222; }
.ui-widget-header { border: 1px solid #4297d7; background: #5c9ccc ; color: #ffffff; font-weight: bold; }
.ui-widget-header a { color: #ffffff; }

/* Interaction states
----------------------------------*/
.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited {text-decoration: none; }
.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover{
    background: #4096ee;
	background: -moz-linear-gradient(top, #4096ee 0%, #60abf8 56%, #7abcff 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#4096ee), color-stop(56%,#60abf8), color-stop(100%,#7abcff));
	background: -webkit-linear-gradient(top, #4096ee 0%,#60abf8 56%,#7abcff 100%);
	background: -o-linear-gradient(top, #4096ee 0%,#60abf8 56%,#7abcff 100%);
	background: -ms-linear-gradient(top, #4096ee 0%,#60abf8 56%,#7abcff 100%);
	background: linear-gradient(top, #4096ee 0%,#60abf8 56%,#7abcff 100%);
}
.ui-state-hover a, .ui-state-hover a:hover, .ui-state-hover a:link, .ui-state-hover a:visited { color: #1d5987; text-decoration: none; }
.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #e17009; text-decoration: none; }

/* Interaction Cues
----------------------------------*/
.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fad42e; background: #fbec88 ; color: #363636; }
.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec ; color: #cd0a0a; }
.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
.ui-state-disabled .ui-icon { filter:Alpha(Opacity=35); } /* For IE8 - See #6059 */

/* Icons
----------------------------------*/

/* states and images */
.ui-icon { display:none}

/* Misc visuals
----------------------------------*/

/* Corner radius */
.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; -khtml-border-top-left-radius: 5px; border-top-left-radius: 5px; }
.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; -khtml-border-top-right-radius: 5px; border-top-right-radius: 5px; }
.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; -khtml-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; }
.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; -khtml-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; }

/* Overlays */
.ui-widget-overlay { background: #000000 ; opacity: .8;filter:Alpha(Opacity=80); }
.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #000000 ; opacity: .8;filter:Alpha(Opacity=80); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }


.ui-button {
    font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
    font-size: 1.4rem;
	display: inline-block;
	padding: .5em 1em;
	margin: 1em .25em;
	color:#fff;
	text-shadow: 0 1px 3px rgba(0, 0, 0, 0.2), 0 1px rgba(0, 0, 0, 0.4);
	-webkit-box-shadow: 0 1px 3px rgba(255, 255, 255, 0.5) inset, -1px 2px 2px rgba(0, 0, 0, 0.2);
    -moz-box-shadow: 0 1px 3px rgba(255, 255, 255, 0.5) inset, -1px 2px 2px rgba(0, 0, 0, 0.2);
    box-shadow: 0 1px 3px rgba(255, 255, 255, 0.5) inset, -1px 2px 2px rgba(0, 0, 0, 0.2);
    text-decoration: none;
	background: #7abcff;
	background: -moz-linear-gradient(top, #7abcff 0%, #60abf8 44%, #4096ee 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#7abcff), color-stop(44%,#60abf8), color-stop(100%,#4096ee));
	background: -webkit-linear-gradient(top, #7abcff 0%,#60abf8 44%,#4096ee 100%);
	background: -o-linear-gradient(top, #7abcff 0%,#60abf8 44%,#4096ee 100%);
	background: -ms-linear-gradient(top, #7abcff 0%,#60abf8 44%,#4096ee 100%);
	background: linear-gradient(top, #7abcff 0%,#60abf8 44%,#4096ee 100%);
	border: solid #ddd;
	border: 1px solid rgba(0,0,0,.1);
	cursor: pointer;
	-webkit-border-radius: .25em;
	-moz-border-radius: .25em;
	border-radius: .25em;
	-webkit-transition: 0.3s linear all;
	-moz-transition: 0.3s linear all;
	-ms-transition: 0.3s linear all;
	-o-transition: 0.3s linear all;
  	transition: 0.3s linear all;
}

CSS;

	callExtraFeature('onExtraHeadCSS');
}

/**
 * Akeeba Kickstart
 * A JSON-powered archive extraction tool
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

function echoHeadJavascript()
{
?>
<script type="text/javascript" language="javascript">
	var akeeba_debug = <?php echo defined('KSDEBUG') ? 'true' : 'false' ?>;
	var sftp_path = '<?php echo TranslateWinPath(defined('KSROOTDIR') ? KSROOTDIR : dirname(__FILE__)); ?>/';
	var isJoomla = true;

	/**
	 * Returns the version of Internet Explorer or a -1
	 * (indicating the use of another browser).
	 *
	 * @return   integer  MSIE version or -1
	 */
	function getInternetExplorerVersion()
	{
		var rv = -1; // Return value assumes failure.
		if (navigator.appName == 'Microsoft Internet Explorer')
		{
			var ua = navigator.userAgent;
			var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
			if (re.exec(ua) != null)
			{
				rv = parseFloat( RegExp.$1 );
			}
		}
		return rv;
	}

	$(document).ready(function(){
		// Hide 2nd Page
		$('#page2').css('display','none');

		// Translate the GUI
		translateGUI();

		// Hook interaction handlers
		$(document).keyup( closeLightbox );
		$('#kickstart\\.procengine').change( onChangeProcengine );
		$('#kickstart\\.setup\\.sourcepath').change( onArchiveListReload );
		$('#reloadArchives').click ( onArchiveListReload );
		$('#checkFTPTempDir').click( oncheckFTPTempDirClick );
		$('#resetFTPTempDir').click( onresetFTPTempDir );
		$('#browseFTP').click( onbrowseFTP );
		$('#testFTP').click( onTestFTPClick );
		$('#gobutton').click( onStartExtraction );
		$('#runInstaller').click( onRunInstallerClick );
		$('#runCleanup').click( onRunCleanupClick );
		$('#gotoSite').click(function(event){window.open('index.php','finalstepsite'); window.close();});
		$('#gotoAdministrator').click(function(event){window.open('administrator/index.php','finalstepadmin'); window.close();});
		$('#gotoStart').click( onGotoStartClick );

		// Reset the progress bar
		setProgressBar(0);

		// Show warning
		var msieVersion = getInternetExplorerVersion();
		if((msieVersion != -1) && (msieVersion <= 8.99))
		{
			$('#ie7Warning').css('display','block');
		}
		if(!akeeba_debug) {
			$('#preextraction').css('display','block');
			$('#fade').css('display','block');
		}

		// Trigger change, so we avoid problems if the user refreshes the page
		$('#kickstart\\.procengine').change();
	});

	var translation = {
		<?php echoTranslationStrings(); ?>
	}

	var akeeba_ajax_url = '<?php echo defined('KSSELFNAME') ? KSSELFNAME : basename(__FILE__); ?>';
	var akeeba_error_callback = onGenericError;
	var akeeba_restoration_stat_inbytes = 0;
	var akeeba_restoration_stat_outbytes = 0;
	var akeeba_restoration_stat_files = 0;
	var akeeba_restoration_stat_total = 0;
	var akeeba_factory = null;

	var akeeba_ftpbrowser_host = null;
	var akeeba_ftpbrowser_port = 21;
	var akeeba_ftpbrowser_username = null;
	var akeeba_ftpbrowser_password = null;
	var akeeba_ftpbrowser_passive = 1;
	var akeeba_ftpbrowser_ssl = 0;
	var akeeba_ftpbrowser_directory = '';

	var akeeba_sftpbrowser_host = null;
	var akeeba_sftpbrowser_port = 21;
	var akeeba_sftpbrowser_username = null;
	var akeeba_sftpbrowser_password = null;
	var akeeba_sftpbrowser_pubkey = null;
	var akeeba_sftpbrowser_privkey = null;
	var akeeba_sftpbrowser_directory = '';

	function translateGUI()
	{
		$('*').each(function(i,e){
			transKey = $(e).text();
			if(array_key_exists(transKey, translation))
			{
				$(e).text( translation[transKey] );
			}
		});
	}

	function trans(key)
	{
		if(array_key_exists(key, translation)) {
			return translation[key];
		} else {
			return key;
		}
	}

	function array_key_exists ( key, search ) {
		if (!search || (search.constructor !== Array && search.constructor !== Object)){
			return false;
		}
		return key in search;
	}

	function empty (mixed_var) {
		var key;

		if (mixed_var === "" ||
			mixed_var === 0 ||
			mixed_var === "0" ||
			mixed_var === null ||
			mixed_var === false ||
			typeof mixed_var === 'undefined'
		){
			return true;
		}

		if (typeof mixed_var == 'object') {
			for (key in mixed_var) {
				return false;
			}
			return true;
		}

		return false;
	}

	function is_array (mixed_var) {
		var key = '';
		var getFuncName = function (fn) {
			var name = (/\W*function\s+([\w\$]+)\s*\(/).exec(fn);
			if (!name) {
				return '(Anonymous)';
			}
			return name[1];
		};

		if (!mixed_var) {
			return false;
		}

		// BEGIN REDUNDANT
		this.php_js = this.php_js || {};
		this.php_js.ini = this.php_js.ini || {};
		// END REDUNDANT

		if (typeof mixed_var === 'object') {

			if (this.php_js.ini['phpjs.objectsAsArrays'] &&  // Strict checking for being a JavaScript array (only check this way if call ini_set('phpjs.objectsAsArrays', 0) to disallow objects as arrays)
				(
				(this.php_js.ini['phpjs.objectsAsArrays'].local_value.toLowerCase &&
				this.php_js.ini['phpjs.objectsAsArrays'].local_value.toLowerCase() === 'off') ||
				parseInt(this.php_js.ini['phpjs.objectsAsArrays'].local_value, 10) === 0)
			) {
				return mixed_var.hasOwnProperty('length') && // Not non-enumerable because of being on parent class
				!mixed_var.propertyIsEnumerable('length') && // Since is own property, if not enumerable, it must be a built-in function
				getFuncName(mixed_var.constructor) !== 'String'; // exclude String()
			}

			if (mixed_var.hasOwnProperty) {
				for (key in mixed_var) {
					// Checks whether the object has the specified property
					// if not, we figure it's not an object in the sense of a php-associative-array.
					if (false === mixed_var.hasOwnProperty(key)) {
						return false;
					}
				}
			}

			// Read discussion at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_is_array/
			return true;
		}

		return false;
	}

	function resolvePath(filename)
	{
		filename = filename.replace('\/\/g', '\/');
		var parts = filename.split('/');
		var out = [];

		$.each(parts, function(i, part){
			if (part == '.') return;
			if (part == '..') {
				out.pop();
				return;
			}
			out.push(part);
		});

		return out.join('/');
	}

	/**
	 * Performs an AJAX request and returns the parsed JSON output.
	 * The global akeeba_ajax_url is used as the AJAX proxy URL.
	 * If there is no errorCallback, the global akeeba_error_callback is used.
	 * @param data An object with the query data, e.g. a serialized form
	 * @param successCallback A function accepting a single object parameter, called on success
	 * @param errorCallback A function accepting a single string parameter, called on failure
	 */
	function doAjax(data, successCallback, errorCallback)
	{
		var structure =
		{
			type: "POST",
			url: akeeba_ajax_url,
			cache: false,
			data: data,
			timeout: 600000,
			success: function(msg) {
				// Initialize
				var junk = null;
				var message = "";

				// Get rid of junk before the data
				var valid_pos = msg.indexOf('###');
				if( valid_pos == -1 ) {
					// Valid data not found in the response
					msg = 'Invalid AJAX data received:<br/>' + msg;
					if(errorCallback == null)
					{
						if(akeeba_error_callback != null)
						{
							akeeba_error_callback(msg);
						}
					}
					else
					{
						errorCallback(msg);
					}
					return;
				} else if( valid_pos != 0 ) {
					// Data is prefixed with junk
					junk = msg.substr(0, valid_pos);
					message = msg.substr(valid_pos);
				}
				else
				{
					message = msg;
				}
				message = message.substr(3); // Remove triple hash in the beginning

				// Get of rid of junk after the data
				var valid_pos = message.lastIndexOf('###');
				message = message.substr(0, valid_pos); // Remove triple hash in the end

				try {
					var data = eval('('+message+')');
				} catch(err) {
					var msg = err.message + "\n<br/>\n<pre>\n" + message + "\n</pre>";
					if(errorCallback == null)
					{
						if(akeeba_error_callback != null)
						{
							akeeba_error_callback(msg);
						}
					}
					else
					{
						errorCallback(msg);
					}
					return;
				}

				// Call the callback function
				successCallback(data);
			},
			error: function(Request, textStatus, errorThrown) {
				var message = '<strong>AJAX Loading Error</strong><br/>HTTP Status: '+Request.status+' ('+Request.statusText+')<br/>';
				message = message + 'Internal status: '+textStatus+'<br/>';
				message = message + 'XHR ReadyState: ' + Response.readyState + '<br/>';
				message = message + 'Raw server response:<br/>'+Request.responseText;
				if(errorCallback == null)
				{
					if(akeeba_error_callback != null)
					{
						akeeba_error_callback(message);
					}
				}
				else
				{
					errorCallback(message);
				}
			}
		};
		$.ajax( structure );
	}

	function onChangeProcengine(event)
	{
		if( $('#kickstart\\.procengine').val() == 'direct' )
		{
			$('#ftp-options').hide('fast');
		} else {
			$('#ftp-options').show('fast');
		}

		if($('#kickstart\\.procengine').val() == 'sftp' )
		{
			$('#ftp-ssl-passive').hide('fast');

			if($('#kickstart\\.ftp\\.dir').val() == ''){
				$('#kickstart\\.ftp\\.dir').val(sftp_path);
			}

			$('#testFTP').html(trans('BTN_TESTSFTPCON'))
		}
		else
		{
			$('#ftp-ssl-passive').show('fast');
			$('#testFTP').html(trans('BTN_TESTFTPCON'))
		}
	}

	function closeLightbox(event)
	{
		var closeMe = false;

		if( (event == null) || (event == undefined) ) {
			closeMe = true;
		} else if(event.keyCode == '27') {
			closeMe = true;
		}

		if(closeMe)
		{
			document.getElementById('preextraction').style.display='none';
			document.getElementById('genericerror').style.display='none';
			document.getElementById('fade').style.display='none';
			$(document).unbind('keyup', closeLightbox);
		}
	}

	function onGenericError(msg)
	{
		$('#genericerrorInner').html(msg);
		$('#genericerror').css('display','block');
		$('#fade').css('display','block');
		$(document).keyup(closeLightbox);
	}

	function setProgressBar(percent)
	{
		var newValue = 0;

		if(percent <= 1) {
			newValue = 100 * percent;
		} else {
			newValue = percent;
		}

		$('#progressbar-inner').css('width',percent+'%');
	}

	function oncheckFTPTempDirClick(event)
	{
		var data = {
			'task' : 'checkTempdir',
			'json': JSON.stringify({
				'kickstart.ftp.tempdir': $('#kickstart\\.ftp\\.tempdir').val()
			})
		};

		doAjax(data, function(ret){
			var key = ret.status ? 'FTP_TEMPDIR_WRITABLE' : 'FTP_TEMPDIR_UNWRITABLE';
			alert( trans(key) );
		});
	}

	function onTestFTPClick(event)
	{
		var type = 'ftp';

		if($('#kickstart\\.procengine').val() == 'sftp')
		{
			type = 'sftp';
		}

		var data = {
			'task' : 'checkFTP',
			'json': JSON.stringify({
				'type' : type,
				'kickstart.ftp.host':		$('#kickstart\\.ftp\\.host').val(),
				'kickstart.ftp.port':		$('#kickstart\\.ftp\\.port').val(),
				'kickstart.ftp.ssl':		$('#kickstart\\.ftp\\.ssl').is(':checked'),
				'kickstart.ftp.passive':	$('#kickstart\\.ftp\\.passive').is(':checked'),
				'kickstart.ftp.user':		$('#kickstart\\.ftp\\.user').val(),
				'kickstart.ftp.pass':		$('#kickstart\\.ftp\\.pass').val(),
				'kickstart.ftp.dir':		$('#kickstart\\.ftp\\.dir').val(),
				'kickstart.ftp.tempdir':	$('#kickstart\\.ftp\\.tempdir').val()
			})
		};
		doAjax(data, function(ret){
			if(type == 'ftp'){
				var key = ret.status ? 'FTP_CONNECTION_OK' : 'FTP_CONNECTION_FAILURE';
			}
			else{
				var key = ret.status ? 'SFTP_CONNECTION_OK' : 'SFTP_CONNECTION_FAILURE';
			}


			alert( trans(key) + "\n\n" + (ret.status ? '' : ret.message) );
		});
	}

	function onbrowseFTP ()
	{
		if($('#kickstart\\.procengine').val() != 'sftp')
		{
			akeeba_ftpbrowser_host      = $('#kickstart\\.ftp\\.host').val();
			akeeba_ftpbrowser_port      = $('#kickstart\\.ftp\\.port').val();
			akeeba_ftpbrowser_username  = $('#kickstart\\.ftp\\.user').val();
			akeeba_ftpbrowser_password  = $('#kickstart\\.ftp\\.pass').val();
			akeeba_ftpbrowser_passive   = $('#kickstart\\.ftp\\.passive').is(':checked');
			akeeba_ftpbrowser_ssl       = $('#kickstart\\.ftp\\.ssl').is(':checked');
			akeeba_ftpbrowser_directory = $('#kickstart\\.ftp\\.dir').val();

			var akeeba_onbrowseFTP_callback = function(path) {
				var charlist = ('/').replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '$1');
				var re = new RegExp('^[' + charlist + ']+', 'g');
				path = '/' + (path+'').replace(re, '');
				$('#kickstart\\.ftp\\.dir').val(path);
			};

			akeeba_ftpbrowser_hook( akeeba_onbrowseFTP_callback );
		}
		else
		{
			akeeba_sftpbrowser_host = $('#kickstart\\.ftp\\.host').val();
			akeeba_sftpbrowser_port = $('#kickstart\\.ftp\\.port').val();
			akeeba_sftpbrowser_username = $('#kickstart\\.ftp\\.user').val();
			akeeba_sftpbrowser_password = $('#kickstart\\.ftp\\.pass').val();
			akeeba_sftpbrowser_directory = $('#kickstart\\.ftp\\.dir').val();

			var akeeba_postprocsftp_callback = function(path) {
				var charlist = ('/').replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '$1');
				var re = new RegExp('^[' + charlist + ']+', 'g');
				path = '/' + (path+'').replace(re, '');
				$('#kickstart\\.ftp\\.dir').val(path);
			};

			akeeba_sftpbrowser_hook( akeeba_postprocsftp_callback );
		}
	}

	akeeba_ftpbrowser_hook = function( callback )
	{
		var ftp_dialog_element = $("#ftpdialog");
		var ftp_callback = function() {
			callback(akeeba_ftpbrowser_directory);
			ftp_dialog_element.dialog("close");
		};

		ftp_dialog_element.css('display','block');
		ftp_dialog_element.removeClass('ui-state-error');
		ftp_dialog_element.dialog({
			autoOpen	: false,
			title		: trans('CONFIG_UI_FTPBROWSER_TITLE'),
			draggable	: false,
			height		: 500,
			width		: 500,
			modal		: true,
			resizable	: false,
			buttons		: {
				"OK": ftp_callback,
				"Cancel": function() {
					ftp_dialog_element.dialog("close");
				}
			}
		});

		$('#ftpBrowserErrorContainer').css('display','none');
		$('#ftpBrowserFolderList').html('');
		$('#ak_crumbs').html('');

		ftp_dialog_element.dialog('open');

		if(empty(akeeba_ftpbrowser_directory)) akeeba_ftpbrowser_directory = '';

		var data = {
			'task'      : 'ftpbrowse',
			'json': JSON.stringify({
				'host'		: akeeba_ftpbrowser_host,
				'port'		: akeeba_ftpbrowser_port,
				'username'	: akeeba_ftpbrowser_username,
				'password'	: akeeba_ftpbrowser_password,
				'passive'	: (akeeba_ftpbrowser_passive ? 1 : 0),
				'ssl'		: (akeeba_ftpbrowser_ssl ? 1 : 0),
				'directory'	: akeeba_ftpbrowser_directory
			})
		};

		// Do AJAX call and Render results
		doAjax(
			data,
			function(data) {
				if(data.error != false) {
					// An error occured
					$('#ftpBrowserError').html(trans(data.error));
					$('#ftpBrowserErrorContainer').css('display','block');
					$('#ftpBrowserFolderList').css('display','none');
					$('#ak_crumbs').css('display','none');
				} else {
					// Create the interface
					$('#ftpBrowserErrorContainer').css('display','none');

					// Display the crumbs
					if(!empty(data.breadcrumbs)) {
						$('#ak_crumbs').css('display','block');
						$('#ak_crumbs').html('');
						var relativePath = '/';

						akeeba_ftpbrowser_addcrumb(trans('UI-ROOT'), '/', callback);

						$.each(data.breadcrumbs, function(i, crumb) {
							relativePath += '/'+crumb;

							akeeba_ftpbrowser_addcrumb(crumb, relativePath, callback);
						});
					} else {
						$('#ak_crumbs').hide();
					}

					// Display the list of directories
					if(!empty(data.list)) {
						$('#ftpBrowserFolderList').show();

						$.each(data.list, function(i, item) {
							akeeba_ftpbrowser_create_link(akeeba_ftpbrowser_directory+'/'+item, item, $('#ftpBrowserFolderList'), callback );
						});
					} else {
						$('#ftpBrowserFolderList').css('display','none');
					}
				}
			},
			function(message) {
				$('#ftpBrowserError').html(message);
				$('#ftpBrowserErrorContainer').css('display','block');
				$('#ftpBrowserFolderList').css('display','none');
				$('#ak_crumbs').css('display','none');
			}
		);
	};

	/**
	 * Creates a directory link for the FTP browser UI
	 */
	function akeeba_ftpbrowser_create_link(path, label, container, callback)
	{
		var row = $(document.createElement('tr'));
		var cell = $(document.createElement('td')).appendTo(row);

		var myElement = $(document.createElement('a'))
			.text(label)
			.click(function(){
				akeeba_ftpbrowser_directory = resolvePath(path);
				akeeba_ftpbrowser_hook(callback);
			})
			.appendTo(cell);
		row.appendTo($(container));
	}

	/**
	 * Adds a breadcrumb to the FTP browser
	 */
	function akeeba_ftpbrowser_addcrumb(crumb, relativePath, callback, last)
	{
		if(empty(last)) last = false;
		var li = $(document.createElement('li'));

		$(document.createElement('a'))
			.html(crumb)
			.click(function(e){
				akeeba_ftpbrowser_directory = relativePath;
				akeeba_ftpbrowser_hook(callback);
				e.preventDefault();
			})
			.appendTo(li);

		if(!last) {
			$(document.createElement('span'))
				.text('/')
				.addClass('divider')
				.appendTo(li);
		}

		li.appendTo('#ak_crumbs');
	}

	// FTP browser function
	akeeba_sftpbrowser_hook = function( callback )
	{
		var sftp_dialog_element = $("#ftpdialog");
		var sftp_callback = function() {
			callback(akeeba_sftpbrowser_directory);
			sftp_dialog_element.dialog("close");
		};

		sftp_dialog_element.css('display','block');
		sftp_dialog_element.removeClass('ui-state-error');
		sftp_dialog_element.dialog({
			autoOpen	: false,
			'title'		: trans('CONFIG_UI_SFTPBROWSER_TITLE'),
			draggable	: false,
			height		: 500,
			width		: 500,
			modal		: true,
			resizable	: false,
			buttons		: {
				"OK": sftp_callback,
				"Cancel": function() {
					sftp_dialog_element.dialog("close");
				}
			}
		});

		$('#ftpBrowserErrorContainer').css('display','none');
		$('#ftpBrowserFolderList').html('');
		$('#ak_crumbs').html('');

		sftp_dialog_element.dialog('open');

		if(empty(akeeba_sftpbrowser_directory)) akeeba_sftpbrowser_directory = '';

		var data = {
			'task'      : 'sftpbrowse',
			'json': JSON.stringify({
				'host'		: akeeba_sftpbrowser_host,
				'port'		: akeeba_sftpbrowser_port,
				'username'	: akeeba_sftpbrowser_username,
				'password'	: akeeba_sftpbrowser_password,
				'directory'	: akeeba_sftpbrowser_directory
			})
		};

		doAjax(
			data,
			function(data) {
				if(data.error != false) {
					// An error occured
					$('#ftpBrowserError').html(data.error);
					$('#ftpBrowserErrorContainer').css('display','block');
					$('#ftpBrowserFolderList').css('display','none');
					$('#ak_crumbs').css('display','none');
				} else {
					// Create the interface
					$('#ftpBrowserErrorContainer').css('display','none');

					// Display the crumbs
					if(!empty(data.breadcrumbs)) {
						$('#ak_crumbs').css('display','block');
						$('#ak_crumbs').html('');
						var relativePath = '/';

						akeeba_sftpbrowser_addcrumb(trans('UI-ROOT'), '/', callback);

						$.each(data.breadcrumbs, function(i, crumb) {
							relativePath += '/'+crumb;

							akeeba_sftpbrowser_addcrumb(crumb, relativePath, callback);
						});
					} else {
						$('#ftpBrowserCrumbs').css('display','none');
					}

					// Display the list of directories
					if(!empty(data.list)) {
						$('#ftpBrowserFolderList').css('display','block');

						$.each(data.list, function(i, item) {
							akeeba_sftpbrowser_create_link(akeeba_sftpbrowser_directory+'/'+item, item, $('#ftpBrowserFolderList'), callback );
						});
					} else {
						$('#ftpBrowserFolderList').css('display','none');
					}
				}
			},
			function(message) {
				$('#ftpBrowserError').html(message);
				$('#ftpBrowserErrorContainer').css('display','block');
				$('#ftpBrowserFolderList').css('display','none');
				$('#ftpBrowserCrumbs').css('display','none');
			}
		);
	};

	/**
	 * Creates a directory link for the SFTP browser UI
	 */
	function akeeba_sftpbrowser_create_link(path, label, container, callback)
	{
		var row = $(document.createElement('tr'));
		var cell = $(document.createElement('td')).appendTo(row);

		var myElement = $(document.createElement('a'))
			.text(label)
			.click(function(){
				akeeba_sftpbrowser_directory = resolvePath(path);
				akeeba_sftpbrowser_hook(callback);
			})
			.appendTo(cell);
		row.appendTo($(container));
	}

	/**
	 * Adds a breadcrumb to the SFTP browser
	 */
	function akeeba_sftpbrowser_addcrumb(crumb, relativePath, callback, last)
	{
		if(empty(last)) last = false;
		var li = $(document.createElement('li'));

		$(document.createElement('a'))
			.html(crumb)
			.click(function(e){
				akeeba_sftpbrowser_directory = relativePath;
				akeeba_sftpbrowser_hook(callback);
				e.preventDefault();
			})
			.appendTo(li);

		if(!last) {
			$(document.createElement('span'))
				.text('/')
				.addClass('divider')
				.appendTo(li);
		}

		li.appendTo('#ak_crumbs');
	}

	function onStartExtraction()
	{
		$('#page1').hide('fast');
		$('#page2').show('fast');

		$('#currentFile').text( '' );

		akeeba_error_callback = errorHandler;

		var data = {
			'task' : 'startExtracting',
			'json': JSON.stringify({
				'kickstart.setup.sourcepath':		$('#kickstart\\.setup\\.sourcepath').val(),
				'kickstart.setup.sourcefile':		$('#kickstart\\.setup\\.sourcefile').val(),
				'kickstart.jps.password':			$('#kickstart\\.jps\\.password').val(),
				'kickstart.tuning.min_exec_time':	$('#kickstart\\.tuning\\.min_exec_time').val(),
				'kickstart.tuning.max_exec_time':	$('#kickstart\\.tuning\\.max_exec_time').val(),
				'kickstart.stealth.enable': 		$('#kickstart\\.stealth\\.enable').is(':checked'),
				'kickstart.stealth.url': 			$('#kickstart\\.stealth\\.url').val(),
				'kickstart.tuning.run_time_bias':	75,
				'kickstart.setup.restoreperms':		0,
				'kickstart.setup.dryrun':			0,
				'kickstart.setup.ignoreerrors':		$('#kickstart\\.setup\\.ignoreerrors').is(':checked'),
				'kickstart.enabled':				1,
				'kickstart.security.password':		'',
				'kickstart.procengine':				$('#kickstart\\.procengine').val(),
				'kickstart.ftp.host':				$('#kickstart\\.ftp\\.host').val(),
				'kickstart.ftp.port':				$('#kickstart\\.ftp\\.port').val(),
				'kickstart.ftp.ssl':				$('#kickstart\\.ftp\\.ssl').is(':checked'),
				'kickstart.ftp.passive':			$('#kickstart\\.ftp\\.passive').is(':checked'),
				'kickstart.ftp.user':				$('#kickstart\\.ftp\\.user').val(),
				'kickstart.ftp.pass':				$('#kickstart\\.ftp\\.pass').val(),
				'kickstart.ftp.dir':				$('#kickstart\\.ftp\\.dir').val(),
				'kickstart.ftp.tempdir':			$('#kickstart\\.ftp\\.tempdir').val()
			})
		};
		doAjax(data, function(ret){
			processRestorationStep(ret);
		});
	}

	function processRestorationStep(data)
	{
		// Look for errors
		if(!data.status)
		{
			errorHandler(data.message);
			return;
		}

		// Propagate warnings to the GUI
		if( !empty(data.Warnings) )
		{
			$.each(data.Warnings, function(i, item){
				$('#warnings').append(
					$(document.createElement('div'))
						.html(item)
				);
				$('#warningsBox').show('fast');
			});
		}

		// Parse total size, if exists
		if(array_key_exists('totalsize', data))
		{
			if(is_array(data.filelist))
			{
				akeeba_restoration_stat_total = 0;
				$.each(data.filelist,function(i, item)
				{
					akeeba_restoration_stat_total += item[1];
				});
			}
			akeeba_restoration_stat_outbytes = 0;
			akeeba_restoration_stat_inbytes = 0;
			akeeba_restoration_stat_files = 0;
		}

		// Update GUI
		akeeba_restoration_stat_inbytes += data.bytesIn;
		akeeba_restoration_stat_outbytes += data.bytesOut;
		akeeba_restoration_stat_files += data.files;
		var percentage = 0;
		if( akeeba_restoration_stat_total > 0 )
		{
			percentage = 100 * akeeba_restoration_stat_inbytes / akeeba_restoration_stat_total;
			if(percentage < 0) {
				percentage = 0;
			} else if(percentage > 100) {
				percentage = 100;
			}
		}
		if(data.done) percentage = 100;
		setProgressBar(percentage);
		$('#currentFile').text( data.lastfile );

		if(!empty(data.factory)) akeeba_factory = data.factory;

		post = {
			'task'	: 'continueExtracting',
			'json'	: JSON.stringify({factory: akeeba_factory})
		};

		if(!data.done)
		{
			doAjax(post, function(ret){
				processRestorationStep(ret);
			});
		}
		else
		{
			$('#page2a').hide('fast');
			$('#extractionComplete').show('fast');

			$('#runInstaller').css('display','inline-block');
		}
	}

	function onGotoStartClick(event)
	{
		$('#page2').hide('fast');
		$('#error').hide('fast');
		$('#page1').show('fast');
	}

	function onRunInstallerClick(event)
	{
		var windowReference = window.open('installation/index.php','installer');
		if(!windowReference.opener) {
			windowReference.opener = this.window;
		}
		$('#runCleanup').css('display','inline-block');
		$('#runInstaller').hide('fast');
	}

	function onRunCleanupClick(event)
	{
		post = {
			'task'	: 'isJoomla',
			// Passing the factory preserves the renamed files array
			'json'	: JSON.stringify({factory: akeeba_factory})
		};

		doAjax(post, function(ret){
			isJoomla = ret;
			onRealRunCleanupClick();
		});
	}

	function onRealRunCleanupClick()
	{
		post = {
			'task'	: 'cleanUp',
			// Passing the factory preserves the renamed files array
			'json'	: JSON.stringify({factory: akeeba_factory})
		};

		doAjax(post, function(ret){
			$('#runCleanup').hide('fast');
			$('#gotoSite').css('display','inline-block');
			if (isJoomla)
			{
				$('#gotoAdministrator').css('display','inline-block');
			}
			else
			{
				$('#gotoAdministrator').css('display','none');
			}
			$('#gotoPostRestorationRroubleshooting').css('display','block');
		});

	}

	function errorHandler(msg)
	{
		$('#errorMessage').html(msg);
		$('#error').show('fast');
	}

	function onresetFTPTempDir(event)
	{
		$('#kickstart\\.ftp\\.tempdir').val('<?php echo addcslashes(AKKickstartUtils::getPath(),'\\\'"') ?>');
	}

	function onArchiveListReload()
	{
		post = {
			'task'	: 'listArchives',
			'json'	: JSON.stringify({path: $('#kickstart\\.setup\\.sourcepath').val()})
		}

		doAjax(post, function(ret){
			$('#sourcefileContainer').html(ret);
		});
	}

	/**
	 * Akeeba Kickstart Update Check
	 */

	var akeeba_update = {version: '0'};
	var akeeba_version = '4.1.1';

	function version_compare (v1, v2, operator) {
		// BEGIN REDUNDANT
		this.php_js = this.php_js || {};
		this.php_js.ENV = this.php_js.ENV || {};
		// END REDUNDANT
		// Important: compare must be initialized at 0.
		var i = 0,
			x = 0,
			compare = 0,
		// vm maps textual PHP versions to negatives so they're less than 0.
		// PHP currently defines these as CASE-SENSITIVE. It is important to
		// leave these as negatives so that they can come before numerical versions
		// and as if no letters were there to begin with.
		// (1alpha is < 1 and < 1.1 but > 1dev1)
		// If a non-numerical value can't be mapped to this table, it receives
		// -7 as its value.
			vm = {
				'dev': -6,
				'alpha': -5,
				'a': -5,
				'beta': -4,
				'b': -4,
				'RC': -3,
				'rc': -3,
				'#': -2,
				'p': -1,
				'pl': -1
			},
		// This function will be called to prepare each version argument.
		// It replaces every _, -, and + with a dot.
		// It surrounds any nonsequence of numbers/dots with dots.
		// It replaces sequences of dots with a single dot.
		//    version_compare('4..0', '4.0') == 0
		// Important: A string of 0 length needs to be converted into a value
		// even less than an unexisting value in vm (-7), hence [-8].
		// It's also important to not strip spaces because of this.
		//   version_compare('', ' ') == 1
			prepVersion = function (v) {
				v = ('' + v).replace(/[_\-+]/g, '.');
				v = v.replace(/([^.\d]+)/g, '.$1.').replace(/\.{2,}/g, '.');
				return (!v.length ? [-8] : v.split('.'));
			},
		// This converts a version component to a number.
		// Empty component becomes 0.
		// Non-numerical component becomes a negative number.
		// Numerical component becomes itself as an integer.
			numVersion = function (v) {
				return !v ? 0 : (isNaN(v) ? vm[v] || -7 : parseInt(v, 10));
			};
		v1 = prepVersion(v1);
		v2 = prepVersion(v2);
		x = Math.max(v1.length, v2.length);
		for (i = 0; i < x; i++) {
			if (v1[i] == v2[i]) {
				continue;
			}
			v1[i] = numVersion(v1[i]);
			v2[i] = numVersion(v2[i]);
			if (v1[i] < v2[i]) {
				compare = -1;
				break;
			} else if (v1[i] > v2[i]) {
				compare = 1;
				break;
			}
		}
		if (!operator) {
			return compare;
		}

		// Important: operator is CASE-SENSITIVE.
		// "No operator" seems to be treated as less than
		// Any other values seem to make the function return null.
		switch (operator) {
			case '>':
			case 'gt':
				return (compare > 0);
			case '>=':
			case 'ge':
				return (compare >= 0);
			case '<=':
			case 'le':
				return (compare <= 0);
			case '==':
			case '=':
			case 'eq':
				return (compare === 0);
			case '<>':
			case '!=':
			case 'ne':
				return (compare !== 0);
			case '':
			case '<':
			case 'lt':
				return (compare < 0);
			default:
				return null;
		}
	}

	function checkUpdates()
	{
		var structure =
		{
			type: "GET",
			url: 'http://query.yahooapis.com/v1/public/yql',
			data: {
				<?php if(KICKSTARTPRO): ?>
				q: 'SELECT * FROM xml WHERE url="http://nocdn.akeebabackup.com/updates/kickstart.xml"',
				<?php else: ?>
				q: 'SELECT * FROM xml WHERE url="http://nocdn.akeebabackup.com/updates/kickstartpro.xml"',
				<?php endif; ?>
				format: 'json',
				callback: 'updatesCallback'
			},
			cache: true,
			crossDomain: true,
			jsonp: 'updatesCallback',
			timeout: 15000
		};
		$.ajax( structure );
	}

	function updatesCallback(msg)
	{
		$.each(msg.query.results.updates.update, function(i, el){
			var myUpdate = {
				'version'	: el.version,
				'infourl'	: el.infourl['content'],
				'dlurl'		: el.downloads.downloadurl.content
			}
			if(version_compare(myUpdate.version, akeeba_update.version, 'ge')) {
				akeeba_update = myUpdate;
			}
		});

		if(version_compare(akeeba_update.version, akeeba_version, 'gt')) {
			notifyAboutUpdates();
		}
	}

	function notifyAboutUpdates()
	{
		$('#update-version').text(akeeba_update.version);
		$('#update-dlnow').attr('href', akeeba_update.dlurl);
		$('#update-whatsnew').attr('href', akeeba_update.infourl);
		$('#update-notification').show('slow');
	}

	<?php callExtraFeature('onExtraHeadJavascript'); ?>
</script>
<?php
}

/**
 * Akeeba Kickstart
 * A JSON-powered archive extraction tool
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

function echoTranslationStrings()
{
	callExtraFeature('onLoadTranslations');
	$translation = AKText::getInstance();
	echo $translation->asJavascript();
}

function echoPage()
{
	$edition = KICKSTARTPRO ? 'Professional' : 'Core';
	$bestArchivePath = AKKickstartUtils::getBestArchivePath();
	$filelist = AKKickstartUtils::getArchivesAsOptions($bestArchivePath);
	?>
	<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
	<html>
	<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>Akeeba Kickstart <?php echo $edition?> <?php echo VERSION?></title>
	<style type="text/css" media="all" rel="stylesheet">
		<?php echoCSS();?>
	</style>
	<?php if(@file_exists('jquery.min.js')):?>
		<script type="text/javascript" src="jquery.min.js"></script>
	<?php else: ?>
		<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
	<?php endif; ?>
	<?php if(@file_exists('json2.min.js')):?>
		<script type="text/javascript" src="json2.min.js"></script>
	<?php else: ?>
		<script type="text/javascript" src="//yandex.st/json2/2011-10-19/json2.min.js"></script>
	<?php endif; ?>
	<?php if(@file_exists('jquery-ui.min.js')):?>
		<script type="text/javascript" src="jquery-ui.min.js"></script>
	<?php else: ?>
		<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js"></script>
	<?php endif; ?>
	<?php echoHeadJavascript(); ?>
	</head>
	<body>

	<div id="automode" style="display:none;">
		AUTOMODEON
	</div>

	<div id="fade" class="black_overlay"></div>

	<div id="page-container">

	<div id="preextraction" class="white_content">
		<div id="ie7Warning" style="display:none;">
			<h2>Deprecated Internet Explorer version</h2>
			<p>
				This script is not guaranteed to work properly on Internet Explorer 8
				or earlier versions, or on Internet Explorer 9 and higher running
				in compatibility mode.
			</p>
			<p>
				Please use Internet Explorer 9 or later in native mode (the
				&quot;broken page&quot; icon next to the address bar should not be
				enabled). Alternatively, you may use the latest versions of Firefox,
				Safari, Google Chrome or Opera.
			</p>
		</div>

		<h2>THINGS_HEADER</h2>
		<ol>
			<li>THINGS_01</li>
			<li>THINGS_02</li>
			<li>THINGS_03</li>
			<li>THINGS_04</li>
			<li>THINGS_05</li>
			<li>THINGS_06</li>
			<li>THINGS_07</li>
			<li>THINGS_08</li>
			<li>THINGS_09</li>
		</ol>
		<a href="javascript:void(0)" onclick="closeLightbox();">CLOSE_LIGHTBOX</a>
	</div>

	<div id="genericerror" class="white_content">
		<pre id="genericerrorInner"></pre>
	</div>

	<div id="header">
		<div class="title">Akeeba Kickstart <?php echo $edition?> 4.1.1</div>
	</div>

	<div id="update-notification" style="display: none">
		<p class="update-notify">UPDATE_HEADER</p>
		<p class="update-whyupdate">UPDATE_NOTICE</p>
		<p class="update-links">
			<a href="#" id="update-dlnow">UPDATE_DLNOW</a>
			<a href="#" id="update-whatsnew" target="_blank">UPDATE_MOREINFO</a>
		</p>
	</div>

	<div id="page1">
		<?php callExtraFeature('onPage1'); ?>

		<div id="page1-content">

			<div class="helpme">
				<span>NEEDSOMEHELPKS</span> <a href="https://www.akeebabackup.com/documentation/quick-start-guide/using-kickstart.html" target="_blank">QUICKSTART</a>
			</div>

			<div class="step1">
				<div class="circle">1</div>
				<h2>SELECT_ARCHIVE</h2>
				<div class="area-container">
					<?php callExtraFeature('onPage1Step1'); ?>
					<div class="clr"></div>

					<label for="kickstart.setup.sourcepath">ARCHIVE_DIRECTORY</label>
			<span class="field">
				<input type="text" id="kickstart.setup.sourcepath" value="<?php echo htmlentities($bestArchivePath); ?>" />
				<span class="button" id="reloadArchives" style="margin-top:0;margin-bottom:0">RELOAD_ARCHIVES</span>
			</span>
					<br/>

					<label for="kickstart.setup.sourcefile">ARCHIVE_FILE</label>
			<span class="field" id="sourcefileContainer">
				<?php if(!empty($filelist)):?>
					<select id="kickstart.setup.sourcefile">
						<?php echo $filelist; ?>
					</select>
				<?php else:?>
					<a href="https://www.akeebabackup.com/documentation/troubleshooter/ksnoarchives.html" target="_blank">NOARCHIVESCLICKHERE</a>
				<?php endif;?>
			</span>
					<br />
					<label for="kickstart.jps.password">JPS_PASSWORD</label>
					<span class="field"><input type="password" id="kickstart.jps.password" value="" /></span>
				</div>
			</div>

			<div class="clr"></div>

			<div class="step2">
				<div class="circle">2</div>
				<h2>SELECT_EXTRACTION</h2>
				<div class="area-container">
					<label for="kickstart.procengine">WRITE_TO_FILES</label>
			<span class="field">
				<select id="kickstart.procengine">
					<option value="hybrid">WRITE_HYBRID</option>
					<option value="direct">WRITE_DIRECTLY</option>
					<option value="ftp">WRITE_FTP</option>
					<option value="sftp">WRITE_SFTP</option>
				</select>
			</span><br/>

					<label for="kickstart.setup.ignoreerrors">IGNORE_MOST_ERRORS</label>
					<span class="field"><input type="checkbox" id="kickstart.setup.ignoreerrors" /></span>

					<div id="ftp-options">
						<label for="kickstart.ftp.host">FTP_HOST</label>
						<span class="field"><input type="text" id="kickstart.ftp.host" value="localhost" /></span><br />
						<label for="kickstart.ftp.port">FTP_PORT</label>
						<span class="field"><input type="text" id="kickstart.ftp.port" value="21" /></span><br />
						<div id="ftp-ssl-passive">
							<label for="kickstart.ftp.ssl">FTP_FTPS</label>
							<span class="field"><input type="checkbox" id="kickstart.ftp.ssl" /></span><br />
							<label for="kickstart.ftp.passive">FTP_PASSIVE</label>
							<span class="field"><input type="checkbox" id="kickstart.ftp.passive" checked="checked" /></span><br />
						</div>
						<label for="kickstart.ftp.user">FTP_USER</label>
						<span class="field"><input type="text" id="kickstart.ftp.user" value="" /></span><br />
						<label for="kickstart.ftp.pass">FTP_PASS</label>
						<span	class="field"><input type="password" id="kickstart.ftp.pass" value="" /></span><br />
						<label for="kickstart.ftp.dir">FTP_DIR</label>
				<span class="field">
                    <input type="text" id="kickstart.ftp.dir" value="" />
                    <span class="button" id="browseFTP" style="margin-top:0;margin-bottom:0">FTP_BROWSE</span>
                </span><br />

						<label for="kickstart.ftp.tempdir">FTP_TEMPDIR</label>
				<span class="field">
					<input type="text" id="kickstart.ftp.tempdir" value="<?php echo htmlentities(AKKickstartUtils::getPath()) ?>" />
					<span class="button" id="checkFTPTempDir">BTN_CHECK</span>
					<span class="button" id="resetFTPTempDir">BTN_RESET</span>
				</span><br />
						<label></label>
						<span class="button" id="testFTP">BTN_TESTFTPCON</span>
						<a id="notWorking" class="button" href="https://www.akeebabackup.com/documentation/troubleshooter/kscantextract.html" target="_blank">CANTGETITTOWORK</a>
						<br />
					</div>

				</div>
			</div>

			<div class="clr"></div>

			<div class="step3">
				<div class="circle">3</div>
				<h2>FINE_TUNE</h2>
				<div class="area-container">
					<label for="kickstart.tuning.min_exec_time">MIN_EXEC_TIME</label>
					<span class="field"><input type="text" id="kickstart.tuning.min_exec_time" value="1" /></span> <span>SECONDS_PER_STEP</span><br />
					<label for="kickstart.tuning.max_exec_time">MAX_EXEC_TIME</label>
					<span class="field"><input type="text" id="kickstart.tuning.max_exec_time" value="5" /></span> <span>SECONDS_PER_STEP</span><br />

					<label for="kickstart.stealth.enable">STEALTH_MODE</label>
					<span class="field"><input type="checkbox" id="kickstart.stealth.enable" /></span><br />
					<label for="kickstart.stealth.url">STEALTH_URL</label>
					<span class="field"><input type="text" id="kickstart.stealth.url" value="" /></span><br />
				</div>
			</div>

			<div class="clr"></div>

			<div class="step4">
				<div class="circle">4</div>
				<h2>EXTRACT_FILES</h2>
				<div class="area-container">
					<span></span>
					<span id="gobutton" class="button">BTN_START</span>
				</div>
			</div>

			<div class="clr"></div>

		</div>

		<div id="ftpdialog" style="display:none;">
			<p class="instructions alert alert-info">FTPBROWSER_LBL_INSTRUCTIONS</p>
			<div class="error alert alert-error" id="ftpBrowserErrorContainer">
				<h3>FTPBROWSER_LBL_ERROR</h3>
				<p id="ftpBrowserError"></p>
			</div>
			<ul id="ak_crumbs" class="breadcrumb"></ul>
			<div class="row-fluid">
				<div class="span12">
					<table id="ftpBrowserFolderList" class="table table-striped">
					</table>
				</div>
			</div>
		</div>
	</div>

	<div id="page2">
		<div id="page2a">
			<div class="circle">5</div>
			<h2>EXTRACTING</h2>
			<div class="area-container">
				<div id="warn-not-close">DO_NOT_CLOSE_EXTRACT</div>
				<div id="progressbar">
					<div id="progressbar-inner">&nbsp;</div>
				</div>
				<div id="currentFile"></div>
			</div>
		</div>

		<div id="extractionComplete" style="display: none">
			<div class="circle">6</div>
			<h2>RESTACLEANUP</h2>
			<div id="runInstaller" class="button">BTN_RUNINSTALLER</div>
			<div id="runCleanup" class="button" style="display:none">BTN_CLEANUP</div>
			<div id="gotoSite" class="button" style="display:none">BTN_SITEFE</div>
			<div id="gotoAdministrator" class="button" style="display:none">BTN_SITEBE</div>
			<div id="gotoPostRestorationRroubleshooting" style="display:none">
				<a href="https://www.akeebabackup.com/documentation/troubleshooter/post-restoration.html" target="_blank">POSTRESTORATIONTROUBLESHOOTING</a>
			</div>
		</div>

		<div id="warningsBox" style="display: none;">
			<div id="warningsHeader">
				<h2>WARNINGS</h2>
			</div>
			<div id="warningsContainer">
				<div id="warnings"></div>
			</div>
		</div>

		<div id="error" style="display: none;">
			<h3>ERROR_OCCURED</h3>
			<p id="errorMessage"></p>
			<div id="gotoStart" class="button">BTN_GOTOSTART</div>
			<div>
				<a href="https://www.akeebabackup.com/documentation/troubleshooter/kscantextract.html" target="_blank">CANTGETITTOWORK</a>
			</div>
		</div>
	</div>

	<div id="footer">
		<div class="copyright">Copyright &copy; 2008&ndash;2013 <a	href="http://www.akeebabackup.com">Nicholas K.
				Dionysopoulos / Akeeba Backup</a>. All legal rights reserved.<br />

			This program is free software: you can redistribute it and/or modify it under the terms of
			the <a href="http://www.gnu.org/gpl-3.htmlhttp://www.gnu.org/copyleft/gpl.html">GNU General
				Public License</a> as published by the Free Software Foundation, either version 3 of the License,
			or (at your option) any later version.<br />
			Design credits: <a href="http://internet-inspired.com/">Internet Inspired</a>, slightly modified by AkeebaBackup.com
		</div>
	</div>

	</div>

	</body>
	</html>
<?php
}

/**
 * Akeeba Kickstart
 * A JSON-powered archive extraction tool
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

// Register additional feature classes
callExtraFeature();

$retArray = array(
	'status'	=> true,
	'message'	=> null
);

$task = getQueryParam('task', 'display');
$json = getQueryParam('json');
$ajax = true;

switch($task)
{
	case 'checkTempdir':
		$retArray['status'] = false;
		if(!empty($json))
		{
			$data = json_decode($json, true);
			$dir = @$data['kickstart.ftp.tempdir'];
			if(!empty($dir))
			{
				$retArray['status'] = is_writable($dir);
			}
		}
		break;

	case 'checkFTP':
		$retArray['status'] = false;
		if(!empty($json))
		{
			$data = json_decode($json, true);
			foreach($data as $key => $value)
			{
				AKFactory::set($key, $value);
			}

            if($data['type'] == 'ftp')
            {
                $ftp = new AKPostprocFTP();
            }
            else
            {
                $ftp = new AKPostprocSFTP();
            }

			$retArray['message'] = $ftp->getError();
			$retArray['status'] = empty($retArray['message']);
		}
		break;

    case 'ftpbrowse':
        if(!empty($json))
        {
            $data = json_decode($json, true);

            $retArray = getListing($data['directory'], $data['host'], $data['port'], $data['username'], $data['password'], $data['passive'], $data['ssl']);
        }
        break;

    case 'sftpbrowse':
        if(!empty($json))
        {
            $data = json_decode($json, true);

            $retArray = getSftpListing($data['directory'], $data['host'], $data['port'], $data['username'], $data['password']);
        }
        break;

	case 'startExtracting':
	case 'continueExtracting':
		// Look for configuration values
		$retArray['status'] = false;
		if(!empty($json))
		{
			if($task == 'startExtracting') AKFactory::nuke();

			$oldJSON = $json;
			$json = json_decode($json, true);
			if(is_null($json)) {
				$json = stripslashes($oldJSON);
				$json = json_decode($json, true);
			}
			if(!empty($json)) foreach($json as $key => $value)
			{
				if( substr($key,0,9) == 'kickstart' ) {
					AKFactory::set($key, $value);
				}
			}

			// A "factory" variable will override all other settings.
			if( array_key_exists('factory', $json) )
			{
				// Get the serialized factory
				$serialized = $json['factory'];
				AKFactory::unserialize($serialized);
				AKFactory::set('kickstart.enabled', true);
			}

			// Make sure that the destination directory is always set (req'd by both FTP and Direct Writes modes)
			$removePath = AKFactory::get('kickstart.setup.destdir','');
			if(empty($removePath)) AKFactory::set('kickstart.setup.destdir', AKKickstartUtils::getPath());

			if($task=='startExtracting')
			{
				// If the Stealth Mode is enabled, create the .htaccess file
				if( AKFactory::get('kickstart.stealth.enable', false) )
				{
					createStealthURL();
				}
			}

			$engine = AKFactory::getUnarchiver(); // Get the engine
			$observer = new ExtractionObserver(); // Create a new observer
			$engine->attach($observer); // Attach the observer
			$engine->tick();
			$ret = $engine->getStatusArray();

			if( $ret['Error'] != '' )
			{
				$retArray['status'] = false;
				$retArray['done'] = true;
				$retArray['message'] = $ret['Error'];
			}
			elseif( !$ret['HasRun'] )
			{
				$retArray['files'] = $observer->filesProcessed;
				$retArray['bytesIn'] = $observer->compressedTotal;
				$retArray['bytesOut'] = $observer->uncompressedTotal;
				$retArray['status'] = true;
				$retArray['done'] = true;
			}
			else
			{
				$retArray['files'] = $observer->filesProcessed;
				$retArray['bytesIn'] = $observer->compressedTotal;
				$retArray['bytesOut'] = $observer->uncompressedTotal;
				$retArray['status'] = true;
				$retArray['done'] = false;
				$retArray['factory'] = AKFactory::serialize();
			}

			if(!is_null($observer->totalSize))
			{
				$retArray['totalsize'] = $observer->totalSize;
				$retArray['filelist'] = $observer->fileList;
			}

			$retArray['Warnings'] = $ret['Warnings'];
			$retArray['lastfile'] = $observer->lastFile;
		}
		break;

	case 'cleanUp':
		if(!empty($json))
		{
			$json = json_decode($json, true);
			if( array_key_exists('factory', $json) )
			{
				// Get the serialized factory
				$serialized = $json['factory'];
				AKFactory::unserialize($serialized);
				AKFactory::set('kickstart.enabled', true);
			}
		}

		$unarchiver = AKFactory::getUnarchiver(); // Get the engine
		$engine = AKFactory::getPostProc();

		// 1. Remove installation
		recursive_remove_directory('installation');

		// 2. Run the renames, backwards
		$renames = $unarchiver->renameFiles;
		if(!empty($renames)) foreach( $renames as $original => $renamed ) {
			$engine->rename( $renamed, $original );
		}

		// 3. Delete the archive
		foreach( $unarchiver->archiveList as $archive )
		{
			$engine->unlink( $archive );
		}

		// 4. Suicide
		$engine->unlink( basename(__FILE__) );

		// 5. Delete translations
		$dh = opendir(AKKickstartUtils::getPath());
		if($dh !== false)
		{
			$basename = basename(__FILE__, '.php');
			while( false !== $file = @readdir($dh) )
			{
				if( strstr($file, $basename.'.ini') )
				{
					$engine->unlink($file);
				}
			}
		}

		// 6. Delete cacert.pem
		$engine->unlink('cacert.pem');

		// 7. Delete jquery.min.js and json2.min.js
		$engine->unlink('jquery.min.js');
		$engine->unlink('json2.min.js');

		// 8. If OPcache is installed we need to reset it
		if (function_exists('opcache_reset'))
		{
			opcache_reset();
		}

		break;

	case 'display':
		$ajax = false;
		echoPage();
		break;

	case 'isJoomla':
		$ajax = true;
		if(!empty($json))
		{
			$json = json_decode($json, true);
			if( array_key_exists('factory', $json) )
			{
				// Get the serialized factory
				$serialized = $json['factory'];
				AKFactory::unserialize($serialized);
				AKFactory::set('kickstart.enabled', true);
			}
		}
		$path = AKFactory::get('kickstart.setup.destdir','');
		$path = rtrim($path, '/\\');
		$isJoomla = @is_dir($path . '/administrator');
		if ($isJoomla)
		{
			$isJoomla = @is_dir($path . '/libraries/joomla');
		}
		$retArray = $isJoomla;

		break;

	case 'listArchives':
		$ajax = true;

		$path = null;

		if(!empty($json))
		{
			$json = json_decode($json, true);

			if( array_key_exists('path', $json) )
			{
				$path = $json['path'];
			}
		}

		if (empty($path) || !@is_dir($path))
		{
			$filelist = null;
		}
		else
		{
			$filelist = AKKickstartUtils::getArchivesAsOptions($path);
		}

		if (empty($filelist))
		{
			$retArray = '<a href="https://www.akeebabackup.com/documentation/troubleshooter/ksnoarchives.html" target="_blank">' .
				AKText::_('NOARCHIVESCLICKHERE')
				. '</a>';
		}
		else
		{
			$retArray = '<select id="kickstart.setup.sourcefile">' . $filelist . '</select>';
		}

		break;

	default:
		$ajax = true;
		if(!empty($json)) {
			$params = json_decode($json, true);
		} else {
			$params = array();
		}
		$retArray = callExtraFeature($task, $params);
		break;
}

if($ajax)
{
	// JSON encode the message
	$json = json_encode($retArray);
	// Do I have to encrypt?
	$password = AKFactory::get('kickstart.security.password', null);
	if(!empty($password))
	{
		$json = AKEncryptionAES::AESEncryptCtr($json, $password, 128);
	}

	// Return the message
	echo "###$json###";
}

/**
 * Akeeba Kickstart
 * A JSON-powered archive extraction tool
 *
 * @copyright   2010-2014 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license     GNU GPL v2 or - at your option - any later version
 * @package     akeebabackup
 * @subpackage  kickstart
 */

/**
 * Akeeba Kickstart Import from URL add-on feature
 */
class AKFeatureURLImport
{
	private $params = array();

	private static $downloadPageURL = 'http://www.joomla.org/download.html';

	private function getParam($key, $default = null)
	{
		if(array_key_exists($key, $this->params)) {
			return $this->params[$key];
		} else {
			return $default;
		}
	}

	/**
	 * Echoes extra CSS to the head of the page
	 */
	public function onExtraHeadCSS()
	{

	}

	/**
	 * Echoes extra Javascript to the head of the page
	 */
	public function onExtraHeadJavascript()
	{
?>

var akeeba_url_filename = null;

$(document).ready(function(){
	$('#ak-url-showgui').click(function(e){
		$('#ak-url-gui').show('fast');
		$('#ak-url-progress').hide('fast');
		$('#ak-url-complete').hide('fast');
		$('#ak-url-error').hide('fast');
		$('#page1-content').hide('fast');
	});
	$('#ak-url-hidegui').click(function(e){
		$('#ak-url-gui').hide('fast');
		$('#ak-url-progress').hide('fast');
		$('#ak-url-complete').hide('fast');
		$('#ak-url-error').hide('fast');
		$('#page1-content').show('fast');
	});
	$('#ak-url-reload').click(function(e){
		window.location.reload();
	});
	$('#ak-url-gotoStart').click(function(e){
		$('#ak-url-gui').show('fast');
		$('#ak-url-progress').hide('fast');
		$('#ak-url-complete').hide('fast');
		$('#ak-url-error').hide('fast');
	});
});

function onAKURLImport()
{
	akeeba_url_filename = $('#url\\.filename').val();
	ak_urlimport_start();
}

function AKURLsetProgressBar(percent)
{
	var newValue = 0;

	if(percent <= 1) {
		newValue = 100 * percent;
	} else {
		newValue = percent;
	}

	$('#ak-url-progressbar-inner').css('width',percent+'%');
}

function ak_urlimport_start()
{
	akeeba_error_callback = AKURLerrorHandler;

	$('#ak-url-gui').hide('fast');
	$('#ak-url-progress').show('fast');
	$('#ak-url-complete').hide('fast');
	$('#ak-url-error').hide('fast');

	AKURLsetProgressBar(0);
	$('#ak-url-progresstext').html('');

	var data = {
		'task' : 'urlimport',
		'json' : JSON.stringify({
			'file'		: akeeba_url_filename,
			'frag'		: "-1",
			'totalSize'	: "-1"
		})
	};
	doAjax(data, function(ret){
		ak_urlimport_step(ret);
	});
}

function ak_urlimport_step(data)
{
	// Look for errors
	if(!data.status)
	{
		AKURLerrorHandler(data.error);
		return;
	}

	var totalSize = 0;
	var doneSize = 0;
	var percent = 0;
	var frag = -1;

	// get running stats
	if(array_key_exists('totalSize', data)) {
		totalSize = data.totalSize;
	}
	if(array_key_exists('doneSize', data)) {
		doneSize = data.doneSize;
	}
	if(array_key_exists('percent', data)) {
		percent = data.percent;
	}
	if(array_key_exists('frag', data)) {
		frag = data.frag;
	}

	// Update GUI
	AKURLsetProgressBar(percent);
	//$('#ak-url-progresstext').text( percent+'% ('+doneSize+' / '+totalSize+' bytes)' );
	$('#ak-url-progresstext').text( percent+'% ('+doneSize+' bytes)' );

	post = {
		'task'	: 'urlimport',
		'json'	: JSON.stringify({
			'file'		: akeeba_url_filename,
			'frag'		: frag,
			'totalSize'	: totalSize,
			'doneSize'  : doneSize
		})
	};

	if(percent < 100) {
		// More work to do
		doAjax(post, function(ret){
			ak_urlimport_step(ret);
		});
	} else {
		// Done!
		$('#ak-url-gui').hide('fast');
		$('#ak-url-progress').hide('fast');
		$('#ak-url-complete').show('fast');
		$('#ak-url-error').hide('fast');
	}
}

function onAKURLJoomla()
{
	akeeba_error_callback = AKURLerrorHandler;

	var data = {
		'task' : 'getjurl'
	};

	doAjax(data, function(ret)
	{
		ak_urlimport_gotjurl(ret);
	});
}

function onAKURLWordpress()
{
	$('#url\\.filename').val('http://wordpress.org/latest.zip');
}

function ak_urlimport_gotjurl(data)
{
	var url = '';

	if(array_key_exists('url', data)) {
		url = data.url;
	}

	$('#url\\.filename').val(url);
}

function AKURLerrorHandler(msg)
{
	$('#ak-url-gui').hide('fast');
	$('#ak-url-progress').hide('fast');
	$('#ak-url-complete').hide('fast');
	$('#ak-url-error').show('fast');

	$('#ak-url-errorMessage').html(msg);
}
<?php
	}

	/**
	 * Echoes extra HTML on page 1 of Kickstart
	 */
	public function onPage1()
	{

?>
<div id="ak-url-gui" style="display: none">
	<div class="step1">
		<div class="circle">1</div>
		<h2>AKURL_TITLE_STEP1</h2>
		<div class="area-container">
			<label for="url.filename">AKURL_FILENAME</label>
			<span class="field"><input type="text" style="width: 45%" id="url.filename" value="" /></span>
			<a id="ak-url-joomla" class="button bluebutton loprofile" onclick="onAKURLJoomla()">AKURL_JOOMLA</a>
			<a id="ak-url-wordpress" class="button bluebutton loprofile" onclick="onAKURLWordpress()">AKURL_WORDPRESS</a>

			<div class="clr"></div>
			<a id="ak-url-connect" class="button" onclick="onAKURLImport()">AKURL_IMPORT</a>
			<a id="ak-url-hidegui" class="button bluebutton">AKURL_CANCEL</a>
		</div>
	</div>
	<div class="clr"></div>
</div>

<div id="ak-url-progress" style="display: none">
	<div class="circle">2</div>
	<h2>AKURL_TITLE_STEP2</h2>
	<div class="area-container">
		<div id="ak-url-importing">
			<div class="warn-not-close">AKURL_DO_NOT_CLOSE</div>
			<div id="ak-url-progressbar" class="progressbar">
				<div id="ak-url-progressbar-inner" class="progressbar-inner">&nbsp;</div>
			</div>
			<div id="ak-url-progresstext"></div>
		</div>
	</div>
</div>

<div id="ak-url-complete" style="display: none">
	<div class="circle">3</div>
	<h2>AKURL_TITLE_STEP3</h2>
	<div class="area-container">
		<div id="ak-url-reload" class="button">AKURL_BTN_RELOAD</div>
	</div>
</div>

<div id="ak-url-error" class="error" style="display: none;">
	<h3>ERROR_OCCURED</h3>
	<p id="ak-url-errorMessage" class="errorMessage"></p>
	<div id="ak-url-gotoStart" class="button">BTN_GOTOSTART</div>
</div>
<?php
	}

	/**
	 * Outputs HTML to be shown before Step 1's archive selection pane
	 */
	public function onPage1Step1()
	{
?>
	<a id="ak-url-showgui" class="button bluebutton loprofile">AKURL_IMPORT</a>
<?php
	}

	public function urlimport($params)
	{
		$this->params = $params;

		// Fetch data
		$filename		= $this->getParam('file');
		$frag			= $this->getParam('frag', -1);
		$totalSize		= $this->getParam('totalSize', -1);
		$doneSize		= $this->getParam('doneSize', -1);

		debugMsg('Importing from URL');
		debugMsg('  file      : ' . $filename);
		debugMsg('  frag      : ' . $frag);
		debugMsg('  totalSize : ' . $totalSize);
		debugMsg('  doneSize  : ' . $doneSize);

		// Init retArray
		$retArray = array(
			"status"		=> true,
			"error"			=> '',
			"frag"			=> $frag,
			"totalSize"		=> $totalSize,
			"doneSize"		=> $doneSize,
			"percent"		=> 0,
		);

		try {
			AKFactory::set('kickstart.tuning.max_exec_time', '5');
			AKFactory::set('kickstart.tuning.run_time_bias', '75');
			$timer = new AKCoreTimer();
			$start = $timer->getRunningTime(); // Mark the start of this download
			$break = false; // Don't break the step

			while( ($timer->getTimeLeft() > 0) && !$break )
			{
				// Figure out where on Earth to put that file
				$local_file = KSROOTDIR . '/' . basename($filename);

				debugMsg("- Importing from $filename");

				// Do we have to initialize the file?
				if($frag == -1)
				{
					debugMsg("-- First frag, killing local file");
					// Currently downloaded size
					$doneSize = 0;

					// Delete and touch the output file
					@unlink($local_file);
					$fp = @fopen($local_file, 'wb');

					if($fp !== false)
					{
						@fclose($fp);
					}

					// Init
					$frag = 0;
				}

				// Calculate from and length
				$length = 1048576;
				$from = $frag * $length;
				$to = $length + $from - 1;
				//if($from == 0) $from = 1;

				// Try to download the first frag
				$temp_file = $local_file . '.tmp';
				@unlink($temp_file);
				$required_time = 1.0;
				debugMsg("-- Importing frag $frag, byte position from/to: $from / $to");

				$filesize = 0;

				try
				{
					$ch = curl_init();
					curl_setopt($ch, CURLOPT_URL, $filename);
					curl_setopt($ch, CURLOPT_RANGE, "$from-$to");
					curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
					curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
					@curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

					$result = curl_exec($ch);

					$errno = curl_errno($ch);
					$errmsg = curl_error($ch);
					$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

					if ($result === false)
					{
						$error = "cURL error $errno: $errmsg";
					}
					elseif ($http_status > 299)
					{
						$result = false;
						$error = "HTTP status $http_status";
					}
					else
					{
						$result = file_put_contents($temp_file, $result);

						if ($result === false)
						{
							$error = "Could not open temporary file $temp_file for writing";
						}
					}

					curl_close($ch);
				}
				catch (Exception $e)
				{
					$error = $e->getMessage();
				}

				if(!$result) {
					@unlink($temp_file);

					// Failed download
					if ($frag == 0)
					{
						// Failure to download first frag = failure to download. Period.
						$retArray['status'] = false;
						$retArray['error'] = $error;

						debugMsg("-- Download FAILED");

						return $retArray;
					}
					else
					{
						// Since this is a staggered download, consider this normal and finish
						$frag = -1;
						debugMsg("-- Import complete");
						$doneSize = $totalSize;
						$break = true;
						continue;
					}
				}

				// Add the currently downloaded frag to the total size of downloaded files
				if($result)
				{
					clearstatcache();
					$filesize = (int)@filesize($temp_file);
					debugMsg("-- Successful download of $filesize bytes");
					$doneSize += $filesize;

					// Append the file
					$fp = @fopen($local_file,'ab');

					if($fp === false)
					{
						debugMsg("-- Can't open local file for writing");
						// Can't open the file for writing
						@unlink($temp_file);
						$retArray['status'] = false;
						$retArray['error'] = 'Can\'t write to the local file';

						return false;
					}

					$tf = fopen($temp_file,'rb');

					while(!feof($tf))
					{
						$data = fread($tf, 262144);
						fwrite($fp, $data);
					}

					fclose($tf);
					fclose($fp);
					@unlink($temp_file);

					debugMsg("-- Temporary file merged and removed");

					if ($filesize > $length)
					{
						debugMsg("-- Read more data than the requested length. I assume this file is complete.");
						$frag = -1;
					}
					else
					{
						$frag++;

						debugMsg("-- Proceeding to next fragment, frag $frag");
					}
				}

				// Advance the frag pointer and mark the end
				$end = $timer->getRunningTime();

				// Do we predict that we have enough time?
				$required_time = max(1.1 * ($end - $start), $required_time);

				if( $required_time > (10-$end+$start) )
				{
					$break = true;
				}

				$start = $end;
			}

			if ($frag == -1)
			{
				$percent = 100;
			}
			elseif($doneSize <= 0)
			{
				$percent = 0;
			}
			else
			{
				if ($totalSize > 0)
				{
					$percent = 100 * ($doneSize / $totalSize);
				}
				else
				{
					$percent = 0;
				}
			}

			// Update $retArray
			$retArray = array(
				"status"		=> true,
				"error"			=> '',
				"frag"			=> $frag,
				"totalSize"		=> $totalSize,
				"doneSize"		=> $doneSize,
				"percent"		=> $percent,
			);
		}
		catch(Exception $e)
		{
			debugMsg("EXCEPTION RAISED:");
			debugMsg($e->getMessage());
			$retArray['status'] = false;
			$retArray['error'] = $e->getMessage();
		}

		return $retArray;
	}

	public function getjurl($params)
	{
		return array(
			"url"		=> $this->getLatestJoomlaURL(),
		);
	}

	public function onLoadTranslations()
	{
		$translation = AKText::getInstance();
		$translation->addDefaultLanguageStrings(array(
			'AKURL_IMPORT'		=> "Import from URL",
			'AKURL_TITLE_STEP1'	=> "Specify the URL",
			'AKURL_FILENAME'	=> "URL to import",
			'AKURL_JOOMLA'		=> "Latest Joomla! release",
			'AKURL_WORDPRESS'	=> "Latest WordPress release",
			'AKURL_CANCEL'		=> "Cancel import",
			'AKURL_TITLE_STEP2'	=> "Importing...",
			'AKURL_DO_NOT_CLOSE'	=> "Please do not close this window while your backup archives are being imported",
			'AKURL_TITLE_STEP3'	=> "Import is complete",
			'AKURL_BTN_RELOAD'	=> "Reload Kickstart",
		));
	}

	private function getLatestJoomlaURL()
	{
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, self::$downloadPageURL);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		@curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

		$pageHTML = curl_exec($ch);
		$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

		if (($pageHTML === false) || ($http_status >= 300))
		{
			return '';
		}

		$uniqueHTMLid = '<a id="latest"';

		$posStart = strpos($pageHTML, $uniqueHTMLid);

		if ($posStart === false)
		{
			return '';
		}

		$posStart += strlen($uniqueHTMLid);
		$posEnd = strpos($pageHTML, '>', $posStart);

		if ($posEnd === false)
		{
			return '';
		}

		$innerAttributes = substr($pageHTML, $posStart, $posEnd - $posStart);

		$posStart = strpos($innerAttributes, '"');
		$posEnd = strpos($innerAttributes, '"', $posStart + 1);

		$url = substr($innerAttributes, $posStart + 1, $posEnd - $posStart - 1);

		return $url;
	}
}