!C99Shell v. 2.5 [PHP 8 Update] [24.05.2025]!

Software: Apache/2.4.41 (Ubuntu). PHP/8.0.30 

uname -a: Linux apirnd 5.4.0-204-generic #224-Ubuntu SMP Thu Dec 5 13:38:28 UTC 2024 x86_64 

uid=33(www-data) gid=33(www-data) groups=33(www-data) 

Safe-mode: OFF (not secure)

/uploads/script/vendor/moneyphp/money/src/Exchange/   drwxr-xr-x
Free 13.23 GB of 57.97 GB (22.83%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Self remove    Logout    


Viewing file:     IndirectExchange.php (5.69 KB)      -rw-r--r--
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php

namespace Money\Exchange;

use 
Money\Calculator;
use 
Money\Calculator\BcMathCalculator;
use 
Money\Calculator\GmpCalculator;
use 
Money\Calculator\PhpCalculator;
use 
Money\Currencies;
use 
Money\Currency;
use 
Money\CurrencyPair;
use 
Money\Exception\UnresolvableCurrencyPairException;
use 
Money\Exchange;

/**
 * Provides a way to get an exchange rate through a minimal set of intermediate conversions.
 *
 * @author Michael Cordingley <Michael.Cordingley@gmail.com>
 */
final class IndirectExchange implements Exchange
{
    
/**
     * @var Calculator
     */
    
private static $calculator;

    
/**
     * @var array
     */
    
private static $calculators = [
        
BcMathCalculator::class,
        
GmpCalculator::class,
        
PhpCalculator::class,
    ];

    
/**
     * @var Currencies
     */
    
private $currencies;

    
/**
     * @var Exchange
     */
    
private $exchange;

    
/**
     * @param Exchange   $exchange
     * @param Currencies $currencies
     */
    
public function __construct(Exchange $exchangeCurrencies $currencies)
    {
        
$this->exchange $exchange;
        
$this->currencies $currencies;
    }

    
/**
     * @param string $calculator
     */
    
public static function registerCalculator($calculator)
    {
        if (
is_a($calculatorCalculator::class, true) === false) {
            throw new 
\InvalidArgumentException('Calculator must implement '.Calculator::class);
        }

        
array_unshift(self::$calculators$calculator);
    }

    
/**
     * {@inheritdoc}
     */
    
public function quote(Currency $baseCurrencyCurrency $counterCurrency)
    {
        try {
            return 
$this->exchange->quote($baseCurrency$counterCurrency);
        } catch (
UnresolvableCurrencyPairException $exception) {
            
$rate array_reduce($this->getConversions($baseCurrency$counterCurrency), function ($carryCurrencyPair $pair) {
                return static::
getCalculator()->multiply($carry$pair->getConversionRatio());
            }, 
'1.0');

            return new 
CurrencyPair($baseCurrency$counterCurrency$rate);
        }
    }

    
/**
     * @param Currency $baseCurrency
     * @param Currency $counterCurrency
     *
     * @return CurrencyPair[]
     *
     * @throws UnresolvableCurrencyPairException
     */
    
private function getConversions(Currency $baseCurrencyCurrency $counterCurrency)
    {
        
$startNode $this->initializeNode($baseCurrency);
        
$startNode->discovered true;

        
$nodes = [$baseCurrency->getCode() => $startNode];

        
$frontier = new \SplQueue();
        
$frontier->enqueue($startNode);

        while (
$frontier->count()) {
            
/** @var \stdClass $currentNode */
            
$currentNode $frontier->dequeue();

            
/** @var Currency $currentCurrency */
            
$currentCurrency $currentNode->currency;

            if (
$currentCurrency->equals($counterCurrency)) {
                return 
$this->reconstructConversionChain($nodes$currentNode);
            }

            
/** @var Currency $candidateCurrency */
            
foreach ($this->currencies as $candidateCurrency) {
                if (!isset(
$nodes[$candidateCurrency->getCode()])) {
                    
$nodes[$candidateCurrency->getCode()] = $this->initializeNode($candidateCurrency);
                }

                
/** @var \stdClass $node */
                
$node $nodes[$candidateCurrency->getCode()];

                if (!
$node->discovered) {
                    try {
                        
// Check if the candidate is a neighbor. This will throw an exception if it isn't.
                        
$this->exchange->quote($currentCurrency$candidateCurrency);

                        
$node->discovered true;
                        
$node->parent $currentNode;

                        
$frontier->enqueue($node);
                    } catch (
UnresolvableCurrencyPairException $exception) {
                        
// Not a neighbor. Move on.
                    
}
                }
            }
        }

        throw 
UnresolvableCurrencyPairException::createFromCurrencies($baseCurrency$counterCurrency);
    }

    
/**
     * @param Currency $currency
     *
     * @return \stdClass
     */
    
private function initializeNode(Currency $currency)
    {
        
$node = new \stdClass();

        
$node->currency $currency;
        
$node->discovered false;
        
$node->parent null;

        return 
$node;
    }

    
/**
     * @param array     $currencies
     * @param \stdClass $goalNode
     *
     * @return CurrencyPair[]
     */
    
private function reconstructConversionChain(array $currencies\stdClass $goalNode)
    {
        
$current $goalNode;
        
$conversions = [];

        while (
$current->parent) {
            
$previous $currencies[$current->parent->currency->getCode()];
            
$conversions[] = $this->exchange->quote($previous->currency$current->currency);
            
$current $previous;
        }

        return 
array_reverse($conversions);
    }

    
/**
     * @return Calculator
     */
    
private function getCalculator()
    {
        if (
null === self::$calculator) {
            
self::$calculator self::initializeCalculator();
        }

        return 
self::$calculator;
    }

    
/**
     * @return Calculator
     *
     * @throws \RuntimeException If cannot find calculator for money calculations
     */
    
private static function initializeCalculator()
    {
        
$calculators self::$calculators;

        foreach (
$calculators as $calculator) {
            
/** @var Calculator $calculator */
            
if ($calculator::supported()) {
                return new 
$calculator();
            }
        }

        throw new 
\RuntimeException('Cannot find calculator for money calculations');
    }
}

:: Command execute ::

Enter:
 
Select:
 

:: Search ::
  - regexp 

:: Upload ::
 
[ Read-Only ]

:: Make Dir ::
 
[ Read-Only ]
:: Make File ::
 
[ Read-Only ]

:: Go Dir ::
 
:: Go File ::
 

--[ c99shell v. 2.5 [PHP 8 Update] [24.05.2025] | Generation time: 0.0052 ]--