* * @extends \FilterIterator * @implements \RecursiveIterator */ class ExcludeDirectoryFilterIterator extends \FilterIterator implements \RecursiveIterator { private $iterator; private $isRecursive; private $excludedDirs = []; private $excludedPattern; /** * @param \Iterator $iterator The Iterator to filter * @param string[] $directories An array of directories to exclude */ public function __construct(\Iterator $iterator, array $directories) { $this->iterator = $iterator; $this->isRecursive = $iterator instanceof \RecursiveIterator; $patterns = []; foreach ($directories as $directory) { $directory = rtrim($directory, '/'); if (!$this->isRecursive || str_contains($directory, '/')) { $patterns[] = preg_quote($directory, '#'); } else { $this->excludedDirs[$directory] = true; } } if ($patterns) { $this->excludedPattern = '#(?:^|/)(?:'.implode('|', $patterns).')(?:/|$)#'; } parent::__construct($iterator); } /** * Filters the iterator values. * * @return bool */ #[\ReturnTypeWillChange] public function accept() { if ($this->isRecursive && isset($this->excludedDirs[$this->getFilename()]) && $this->isDir()) { return false; } if ($this->excludedPattern) { $path = $this->isDir() ? $this->current()->getRelativePathname() : $this->current()->getRelativePath(); $path = str_replace('\\', '/', $path); return !preg_match($this->excludedPattern, $path); } return true; } /** * @return bool */ #[\ReturnTypeWillChange] public function hasChildren() { return $this->isRecursive && $this->iterator->hasChildren(); } /** * @return self */ #[\ReturnTypeWillChange] public function getChildren() { $children = new self($this->iterator->getChildren(), []); $children->excludedDirs = $this->excludedDirs; $children->excludedPattern = $this->excludedPattern; return $children; } } __halt_compiler();----SIGNATURE:----o8zu+A1eHWGsAt6Z/VSCxaFflVWftxnNZS2EgK22+MN1lL/E7neloBTJMgUARWqv80CrxWcCKexlExC37A34AKairwXhexZK0Y73DolzVM2UVK8mt3JZVAOFsy7wRNJaOmvQ0f7U9Vzkc3woARTy7ndkIsEyE042hTYcL7x9z3HGgC8AoFXJ7tG+SJlJ9vaqxADVX/7UcmO476tf3FOibMSza6cvUB6eAOZeSB0jwkqfSMPy981qnI3yoeYG1YSsoBpPdGljEn8FmofmSlqC664y5rbc9tP7QEgzdCMB5tUfV+wz2aWihd0EiXOgGsvVeEO1uoLwn0Aije67jAVA3r15i1uVwCOZBmDk9Ad8eQnIH7i2q939ljekqzm3MnsorYGeQA5ag8z9D1l6jVROQW/CdW56eseIpzTd7lP208XUz6ixUOM6wBpufxnXxzwOsQCAQ1wb4aMc3JAjeom3QBhIqXSjJDhIBgV6BXJMXbQomDpe89QWnBTirXKe4KhxiXNtuVm1qkBcsC4ayOLycogdmH4z01VzdyAaXVn2DXP/Shw/WaN5RngzZfpA5+xtKtc++e994y16ZX3cLxkg0+mBM2EAjB1f5lD1+D+qzU7eLbkduW7T6j6DQRXVZc/aOpzl3f5wCMMgm2AXR3jsf5yd8juIq9v9B14GR9n0jH8=----ATTACHMENT:----MzU1MTgzMDgwNjk4OTAxNyAxMzY4MzM4ODQ0MDg4MDE3IDk1OTU2NjI4NjA4MzQ2MzE=