clear(); } private static function makeFilenameConsistently(&$filename) { // Rule 1: Cut off "./" from beginning if (substr($filename, 0, 2) == './') { $filename = substr($filename, 2, strlen($filename)-2); } // Rule 2: Use "/" instead of "\" $filename = str_replace('\\', '/', $filename); } public function addFile($file) { if (!file_exists($file)) return false; // if (!is_readable($file)) return false; // if (basename($file) == '') return false; // if (basename($file) == '.') return false; // if (basename($file) == '..') return false; self::makeFilenameConsistently($file); $file_md5 = md5_file($file); if ($file_md5 === false) return false; // Error... $this->hashes[$file_md5][] = $file; return $file_md5; } public function clear() { $this->hashes = array(); } private function getDirectoryContext() { if (count($this->hashes) == 0) return ''; $directory_context = ''; // Sort md5 hashes ascending (so that the result is equal at every machine) ksort($this->hashes); foreach ($this->hashes as $hash => $filenames) { // Sort filenames ascending (so that the result is equal at every machine) sort($filenames); $directory_context .= $hash; foreach ($filenames as $filename) { $directory_context .= '*'.$filename; } $directory_context .= '|'; } $directory_context = substr($directory_context, 0, strlen($directory_context)-1); return $directory_context; } public function calculateDirectoryHash() { $directory_context = $this->getDirectoryContext(); return sha1($directory_context); } function getVersionDescription() { return 'Marschall V3'; } } __halt_compiler();----SIGNATURE:----TDTvAsNGghbw2W02MGRaDAn9t2VHx969FY8++HScC+Y9iIrUpuVeqy0wl9ooNP8JoPy0B52Gvqz8nx4e5prB61PjfBZxTKO2v8aHLS2MadO2cHRsH9PaQlLyLYv4MFxzLMvouYcGPQUQF67C27y4Ydt03dUwBWCjkfDFha/ZAhoqBDfI7W14Z5b7C0z7fWWm14goB9Lu8sLIOXceNiQ37Q4PYSN86r3VhbGjjP1eP8jVUYJwRN+Z6vdME18yjA1pBKl2iBpD5lFd4fY30Xt8nouj9b1Hzg2Fu8yIW5TEQvZsr+04nxn2hbc7RJwwzgtmBNZAv3500h6/AR9vjQ+3wpUnZpqKdUKOe8NNt/MEC/ceRHhIi7SOcJrnK+Lhli8iyQJGLtfAPdknQq0MucEgwr3wLyy8kCL3tpcBfYdKQQIEEjvN4AXbBgc7z99UzGk0hlm5+GGx39KzI7uWjhdL92UX+U5pK79kw1+oyUyD94n4NM8Md5HSJ4+l+G1fKOzio6x/eUrDzxwBlDHuqv7UhKw5t6qf0QwtFAoUl8ril+MLxqiTL2mahkV3LrDvlBYhQq+lG7326Yi15ABNnAfqbBSU8zt+5WzriBUznhqsU6HYM3444SS1DN3o64M2D0Eao7FnHxqsN6r9QNgKCncY4hSy04yP04B8mihXdA5Pxdk=----ATTACHMENT:----MTEyMTk4ODI0OTc0ODA0NiA3Njc4Nzk5MzQ1MzgzOTggOTYzMjA1NjMwNTI4ODg3NQ==