Skip to content

Commit

Permalink
PHP 8.3: Typed class constants
Browse files Browse the repository at this point in the history
  • Loading branch information
julien-boudry committed May 28, 2024
1 parent 3105d7b commit 2b6dbf4
Show file tree
Hide file tree
Showing 35 changed files with 58 additions and 58 deletions.
8 changes: 3 additions & 5 deletions src/Algo/Method.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,15 @@ abstract class Method
use HasElection;
use CondorcetVersion;

private const METHOD_NAME = ['abstractMethod'];

public const IS_PROPORTIONAL = false;
public const IS_DETERMINISTIC = true;
public const bool IS_PROPORTIONAL = false;
public const bool IS_DETERMINISTIC = true;

public static ?int $MaxCandidates = null;

protected ?Result $Result = null;

// Internal precision
public const DECIMAL_PRECISION = 9;
public const int DECIMAL_PRECISION = 9;

// Static

Expand Down
2 changes: 2 additions & 0 deletions src/Algo/MethodInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
#[InternalModulesAPI]
interface MethodInterface
{
public const array METHOD_NAME = [];

public function __construct(Election $election);

public function setElection(Election $election): void;
Expand Down
2 changes: 1 addition & 1 deletion src/Algo/Methods/Borda/BordaCount.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
class BordaCount extends Method implements MethodInterface
{
// Method Name
public const METHOD_NAME = ['BordaCount', 'Borda Count', 'Borda', 'Méthode Borda'];
public const array METHOD_NAME = ['BordaCount', 'Borda Count', 'Borda', 'Méthode Borda'];

public static int $optionStarting = 1;

Expand Down
2 changes: 1 addition & 1 deletion src/Algo/Methods/Borda/DowdallSystem.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
class DowdallSystem extends BordaCount
{
// Method Name
public const METHOD_NAME = ['DowdallSystem', 'Dowdall System', 'Nauru', 'Borda Nauru'];
public const array METHOD_NAME = ['DowdallSystem', 'Dowdall System', 'Nauru', 'Borda Nauru'];

protected function getScoreByCandidateRanking(int $CandidatesRanked, Election $election): float
{
Expand Down
2 changes: 1 addition & 1 deletion src/Algo/Methods/CondorcetBasic.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
class CondorcetBasic extends Method implements MethodInterface
{
// Method Name
public const METHOD_NAME = ['CondorcetBasic'];
public const array METHOD_NAME = ['CondorcetBasic'];

// Basic Condorcet
protected ?int $CondorcetWinner = null;
Expand Down
4 changes: 2 additions & 2 deletions src/Algo/Methods/Copeland/Copeland.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@
class Copeland extends PairwiseStatsBased_Core
{
// Method Name
public const METHOD_NAME = ['Copeland'];
public const array METHOD_NAME = ['Copeland'];

protected const COUNT_TYPE = 'balance';
protected const string COUNT_TYPE = 'balance';


/////////// COMPUTE ///////////
Expand Down
2 changes: 1 addition & 1 deletion src/Algo/Methods/Dodgson/DodgsonQuick.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
class DodgsonQuick extends Method implements MethodInterface
{
// Method Name
public const METHOD_NAME = ['Dodgson Quick', 'DodgsonQuick', 'Dodgson Quick Winner'];
public const array METHOD_NAME = ['Dodgson Quick', 'DodgsonQuick', 'Dodgson Quick Winner'];

protected ?array $Stats = null;

Expand Down
4 changes: 2 additions & 2 deletions src/Algo/Methods/Dodgson/DodgsonTidemanApproximation.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@
class DodgsonTidemanApproximation extends PairwiseStatsBased_Core implements MethodInterface
{
// Method Name
public const METHOD_NAME = ['Dodgson Tideman Approximation', 'DodgsonTidemanApproximation', 'Dodgson Tideman', 'DodgsonTideman'];
public const array METHOD_NAME = ['Dodgson Tideman Approximation', 'DodgsonTidemanApproximation', 'Dodgson Tideman', 'DodgsonTideman'];

protected const COUNT_TYPE = 'sum_defeat_margin';
protected const string COUNT_TYPE = 'sum_defeat_margin';


/////////// COMPUTE ///////////
Expand Down
2 changes: 1 addition & 1 deletion src/Algo/Methods/HighestAverages/HighestAverages_Core.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

abstract class HighestAverages_Core extends Method implements MethodInterface
{
final public const IS_PROPORTIONAL = true;
final public const bool IS_PROPORTIONAL = true;

protected array $candidatesVotes = [];
protected array $candidatesSeats = [];
Expand Down
2 changes: 1 addition & 1 deletion src/Algo/Methods/HighestAverages/Jefferson.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
class Jefferson extends HighestAverages_Core implements MethodInterface
{
// Method Name
public const METHOD_NAME = ['Jefferson', 'D\'Hondt', 'Thomas Jefferson'];
public const array METHOD_NAME = ['Jefferson', 'D\'Hondt', 'Thomas Jefferson'];


/////////// COMPUTE ///////////
Expand Down
2 changes: 1 addition & 1 deletion src/Algo/Methods/HighestAverages/SainteLague.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class SainteLague extends HighestAverages_Core implements MethodInterface
public static int|float $optionFirstDivisor = 1;

// Method Name
public const METHOD_NAME = ['Sainte-Laguë', 'SainteLague', 'Webster', 'Major Fractions Method'];
public const array METHOD_NAME = ['Sainte-Laguë', 'SainteLague', 'Webster', 'Major Fractions Method'];

protected function computeQuotient(int $votesWeight, int $seats): float
{
Expand Down
2 changes: 1 addition & 1 deletion src/Algo/Methods/InstantRunoff/InstantRunoff.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
class InstantRunoff extends Method implements MethodInterface
{
// Method Name
public const METHOD_NAME = ['Instant-runoff', 'InstantRunoff', 'IRV', 'preferential voting', 'ranked-choice voting', 'alternative vote', 'AlternativeVote', 'transferable vote', 'Vote alternatif'];
public const array METHOD_NAME = ['Instant-runoff', 'InstantRunoff', 'IRV', 'preferential voting', 'ranked-choice voting', 'alternative vote', 'AlternativeVote', 'transferable vote', 'Vote alternatif'];

protected ?array $Stats = null;

Expand Down
2 changes: 1 addition & 1 deletion src/Algo/Methods/KemenyYoung/KemenyYoung.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
class KemenyYoung extends Method implements MethodInterface
{
// Method Name
public const METHOD_NAME = ['Kemeny–Young', 'Kemeny-Young', 'Kemeny Young', 'KemenyYoung', 'Kemeny rule', 'VoteFair popularity ranking', 'Maximum Likelihood Method', 'Median Relation'];
public const array METHOD_NAME = ['Kemeny–Young', 'Kemeny-Young', 'Kemeny Young', 'KemenyYoung', 'Kemeny rule', 'VoteFair popularity ranking', 'Maximum Likelihood Method', 'Median Relation'];

// Method Name
final public const CONFLICT_WARNING_CODE = 42;
Expand Down
2 changes: 1 addition & 1 deletion src/Algo/Methods/LargestRemainder/LargestRemainder.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
class LargestRemainder extends HighestAverages_Core implements MethodInterface
{
// Method Name
public const METHOD_NAME = ['Largest Remainder', 'LargestRemainder', 'LR', 'Hare–Niemeyer method', 'Hamilton method', 'Vinton\'s method'];
public const array METHOD_NAME = ['Largest Remainder', 'LargestRemainder', 'LR', 'Hare–Niemeyer method', 'Hamilton method', 'Vinton\'s method'];

public static StvQuotas $optionQuota = StvQuotas::HARE;

Expand Down
4 changes: 2 additions & 2 deletions src/Algo/Methods/Lotteries/RandomBallot.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@
class RandomBallot extends Method implements MethodInterface
{
// Method Name
public const METHOD_NAME = ['Random Ballot', 'single stochastic vote', 'lottery voting'];
public const array METHOD_NAME = ['Random Ballot', 'single stochastic vote', 'lottery voting'];

// Non deterministic method
public const IS_DETERMINISTIC = false;
public const bool IS_DETERMINISTIC = false;

// Options
public static ?Randomizer $optionRandomizer = null;
Expand Down
4 changes: 2 additions & 2 deletions src/Algo/Methods/Lotteries/RandomCandidates.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@
class RandomCandidates extends Method implements MethodInterface
{
// Method Name
public const METHOD_NAME = ['Random Candidates', 'Random Candidate'];
public const array METHOD_NAME = ['Random Candidates', 'Random Candidate'];

// Non deterministic method
public const IS_DETERMINISTIC = false;
public const bool IS_DETERMINISTIC = false;

// Options
public static ?Randomizer $optionRandomizer = null;
Expand Down
2 changes: 1 addition & 1 deletion src/Algo/Methods/Majority/FirstPastThePost.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
class FirstPastThePost extends Majority_Core
{
// Method Name
public const METHOD_NAME = ['First-past-the-post voting', 'First-past-the-post', 'First Choice', 'FirstChoice', 'FPTP', 'FPP', 'SMP', 'FTPT'];
public const array METHOD_NAME = ['First-past-the-post voting', 'First-past-the-post', 'First Choice', 'FirstChoice', 'FPTP', 'FPP', 'SMP', 'FTPT'];

// Mod
protected int $maxRound = 1;
Expand Down
2 changes: 1 addition & 1 deletion src/Algo/Methods/Majority/MultipleRoundsSystem.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
class MultipleRoundsSystem extends Majority_Core
{
// Method Name
public const METHOD_NAME = ['Multiple Rounds System', 'MultipleRoundsSystem', 'Multiple Rounds', 'Majority', 'Majority System', 'Two-round system', 'second ballot', 'runoff voting', 'ballotage', 'two round system', 'two round', 'two rounds', 'two rounds system', 'runoff voting'];
public const array METHOD_NAME = ['Multiple Rounds System', 'MultipleRoundsSystem', 'Multiple Rounds', 'Majority', 'Majority System', 'Two-round system', 'second ballot', 'runoff voting', 'ballotage', 'two round system', 'two round', 'two rounds', 'two rounds system', 'runoff voting'];

// Mod
protected static int $optionMAX_ROUND = 2;
Expand Down
4 changes: 2 additions & 2 deletions src/Algo/Methods/Minimax/MinimaxMargin.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@
class MinimaxMargin extends PairwiseStatsBased_Core
{
// Method Name
public const METHOD_NAME = ['Minimax Margin', 'MinimaxMargin', 'MinimaxMargin', 'Minimax_Margin'];
public const array METHOD_NAME = ['Minimax Margin', 'MinimaxMargin', 'MinimaxMargin', 'Minimax_Margin'];

protected const COUNT_TYPE = 'worst_pairwise_defeat_margin';
protected const string COUNT_TYPE = 'worst_pairwise_defeat_margin';


/////////// COMPUTE ///////////
Expand Down
4 changes: 2 additions & 2 deletions src/Algo/Methods/Minimax/MinimaxOpposition.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@
class MinimaxOpposition extends PairwiseStatsBased_Core
{
// Method Name
public const METHOD_NAME = ['Minimax Opposition', 'MinimaxOpposition', 'Minimax_Opposition'];
public const array METHOD_NAME = ['Minimax Opposition', 'MinimaxOpposition', 'Minimax_Opposition'];

protected const COUNT_TYPE = 'worst_pairwise_opposition';
protected const string COUNT_TYPE = 'worst_pairwise_opposition';


/////////// COMPUTE ///////////
Expand Down
4 changes: 2 additions & 2 deletions src/Algo/Methods/Minimax/MinimaxWinning.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@
class MinimaxWinning extends PairwiseStatsBased_Core
{
// Method Name
public const METHOD_NAME = ['Minimax Winning', 'MinimaxWinning', 'Minimax', 'Minimax_Winning', 'Simpson', 'Simpson-Kramer', 'Simpson-Kramer Method', 'Simpson Method'];
public const array METHOD_NAME = ['Minimax Winning', 'MinimaxWinning', 'Minimax', 'Minimax_Winning', 'Simpson', 'Simpson-Kramer', 'Simpson-Kramer Method', 'Simpson Method'];

protected const COUNT_TYPE = 'worst_pairwise_defeat_winning';
protected const string COUNT_TYPE = 'worst_pairwise_defeat_winning';


/////////// COMPUTE ///////////
Expand Down
2 changes: 1 addition & 1 deletion src/Algo/Methods/PairwiseStatsBased_Core.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

abstract class PairwiseStatsBased_Core extends Method implements MethodInterface
{
private const COUNT_TYPE = 'abstractCountType';
private const string COUNT_TYPE = 'abstractCountType';

protected readonly array $Comparison;

Expand Down
4 changes: 2 additions & 2 deletions src/Algo/Methods/RankedPairs/RankedPairsMargin.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
class RankedPairsMargin extends RankedPairs_Core
{
// Method Name
public const METHOD_NAME = ['Ranked Pairs Margin', 'RankedPairsMargin', 'Tideman Margin', 'RP Margin', 'Ranked Pairs', 'RankedPairs', 'Tideman method'];
public const array METHOD_NAME = ['Ranked Pairs Margin', 'RankedPairsMargin', 'Tideman Margin', 'RP Margin', 'Ranked Pairs', 'RankedPairs', 'Tideman method'];

protected const RP_VARIANT_1 = 'margin';
protected const string RP_VARIANT_1 = 'margin';
}
4 changes: 2 additions & 2 deletions src/Algo/Methods/RankedPairs/RankedPairsWinning.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
class RankedPairsWinning extends RankedPairs_Core
{
// Method Name
public const METHOD_NAME = ['Ranked Pairs Winning', 'RankedPairsWinning', 'Tideman Winning', 'RP Winning'];
public const array METHOD_NAME = ['Ranked Pairs Winning', 'RankedPairsWinning', 'Tideman Winning', 'RP Winning'];

protected const RP_VARIANT_1 = 'win';
protected const string RP_VARIANT_1 = 'win';
}
2 changes: 1 addition & 1 deletion src/Algo/Methods/RankedPairs/RankedPairs_Core.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
// Ranked Pairs is a Condorcet Algorithm | http://en.wikipedia.org/wiki/Ranked_Pairs
abstract class RankedPairs_Core extends Method implements MethodInterface
{
protected const RP_VARIANT_1 = 'abstractVariant';
protected const string RP_VARIANT_1 = 'abstractVariant';

// Limits
public static ?int $MaxCandidates = 60;
Expand Down
4 changes: 2 additions & 2 deletions src/Algo/Methods/STV/CPO_STV.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,12 @@
class CPO_STV extends SingleTransferableVote
{
// Method Name
public const METHOD_NAME = ['CPO STV', 'CPO-STV', 'CPO_STV', 'CPO', 'Comparison of Pairs of Outcomes by the Single Transferable Vote', 'Tideman STV'];
public const array METHOD_NAME = ['CPO STV', 'CPO-STV', 'CPO_STV', 'CPO', 'Comparison of Pairs of Outcomes by the Single Transferable Vote', 'Tideman STV'];

// Limits
public static ?int $MaxOutcomeComparisons = 12_000;

public const DEFAULT_METHODS_CHAINING = [
public const array DEFAULT_METHODS_CHAINING = [
SchulzeMargin::METHOD_NAME[0],
SchulzeWinning::METHOD_NAME[0],
SchulzeRatio::METHOD_NAME[0],
Expand Down
4 changes: 2 additions & 2 deletions src/Algo/Methods/STV/SingleTransferableVote.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@
// Single transferable vote | https://en.wikipedia.org/wiki/Single_transferable_vote
class SingleTransferableVote extends Method implements MethodInterface
{
final public const IS_PROPORTIONAL = true;
final public const bool IS_PROPORTIONAL = true;

// Method Name
public const METHOD_NAME = ['STV', 'Single Transferable Vote', 'SingleTransferableVote'];
public const array METHOD_NAME = ['STV', 'Single Transferable Vote', 'SingleTransferableVote'];

public static StvQuotas $optionQuota = StvQuotas::DROOP;

Expand Down
2 changes: 1 addition & 1 deletion src/Algo/Methods/Schulze/SchulzeMargin.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
class SchulzeMargin extends Schulze_Core
{
// Method Name
public const METHOD_NAME = ['Schulze Margin', 'SchulzeMargin', 'Schulze_Margin'];
public const array METHOD_NAME = ['Schulze Margin', 'SchulzeMargin', 'Schulze_Margin'];

protected function schulzeVariant(int $i, int $j, Election $election): int
{
Expand Down
2 changes: 1 addition & 1 deletion src/Algo/Methods/Schulze/SchulzeRatio.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
class SchulzeRatio extends Schulze_Core
{
// Method Name
public const METHOD_NAME = ['Schulze Ratio', 'SchulzeRatio', 'Schulze_Ratio'];
public const array METHOD_NAME = ['Schulze Ratio', 'SchulzeRatio', 'Schulze_Ratio'];

protected function schulzeVariant(int $i, int $j, Election $election): float
{
Expand Down
2 changes: 1 addition & 1 deletion src/Algo/Methods/Schulze/SchulzeWinning.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
class SchulzeWinning extends Schulze_Core
{
// Method Name
public const METHOD_NAME = ['Schulze Winning', 'Schulze', 'SchulzeWinning', 'Schulze_Winning', 'Schwartz Sequential Dropping', 'SSD', 'Cloneproof Schwartz Sequential Dropping', 'CSSD', 'Beatpath', 'Beatpath Method', 'Beatpath Winner', 'Path Voting', 'Path Winner'];
public const array METHOD_NAME = ['Schulze Winning', 'Schulze', 'SchulzeWinning', 'Schulze_Winning', 'Schwartz Sequential Dropping', 'SSD', 'Cloneproof Schwartz Sequential Dropping', 'CSSD', 'Beatpath', 'Beatpath Method', 'Beatpath Winner', 'Path Voting', 'Path Winner'];

protected function schulzeVariant(int $i, int $j, Election $election): int
{
Expand Down
16 changes: 8 additions & 8 deletions src/Console/Style/CondorcetStyle.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,14 @@

class CondorcetStyle extends SymfonyStyle
{
public const CONDORCET_MAIN_COLOR = '#f57255';
public const CONDORCET_SECONDARY_COLOR = '#8993c0';
public const CONDORCET_THIRD_COLOR = '#e3e1e0';

public const CONDORCET_WINNER_SYMBOL = '';
public const CONDORCET_LOSER_SYMBOL = '';
public const CONDORCET_WINNER_SYMBOL_FORMATED = '<fg=#ffff00>' . self::CONDORCET_WINNER_SYMBOL . '</>';
public const CONDORCET_LOSER_SYMBOL_FORMATED = '<fg=#33beff>' . self::CONDORCET_LOSER_SYMBOL . '</>';
public const string CONDORCET_MAIN_COLOR = '#f57255';
public const string CONDORCET_SECONDARY_COLOR = '#8993c0';
public const string CONDORCET_THIRD_COLOR = '#e3e1e0';

public const string CONDORCET_WINNER_SYMBOL = '';
public const string CONDORCET_LOSER_SYMBOL = '';
public const string CONDORCET_WINNER_SYMBOL_FORMATED = '<fg=#ffff00>' . self::CONDORCET_WINNER_SYMBOL . '</>';
public const string CONDORCET_LOSER_SYMBOL_FORMATED = '<fg=#33beff>' . self::CONDORCET_LOSER_SYMBOL . '</>';

public readonly TableStyle $MainTableStyle;
public readonly TableStyle $FirstColumnStyle;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class PdoHandlerDriver implements DataHandlerDriverInterface
use CondorcetVersion;

#[PublicAPI]
public const SEGMENT = [499, 50, 4, 1]; // Must be ordered desc.
public const array SEGMENT = [499, 50, 4, 1]; // Must be ordered desc.

protected \PDO $handler;
protected bool $transaction = false;
Expand Down
2 changes: 1 addition & 1 deletion src/Election.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ class Election
/////////// PROPERTIES ///////////

#[PublicAPI]
public const MAX_CANDIDATE_NAME_LENGTH = 100; // Max length for candidate name string (UTF-8)
public const int MAX_CANDIDATE_NAME_LENGTH = 100; // Max length for candidate name string (UTF-8)

#[PublicAPI]
public static ?int $maxParseIteration = null;
Expand Down
2 changes: 1 addition & 1 deletion src/Tools/Converters/CEF/CondorcetElectionFormat.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class CondorcetElectionFormat implements ConverterExport, ConverterImport
{
////// # Static Export Method //////

public const SPECIAL_KEYWORD_EMPTY_RANKING = '/EMPTY_RANKING/';
public const string SPECIAL_KEYWORD_EMPTY_RANKING = '/EMPTY_RANKING/';

#[PublicAPI]
#[Description("Create a CondorcetElectionFormat file from an Election object.\n")]
Expand Down
6 changes: 3 additions & 3 deletions tests/src/CondorcetTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@

class CondorcetTest_ValidAlgorithmName extends Method implements MethodInterface
{
public const METHOD_NAME = ['FirstMethodName', 'Alias1', 'Alias_2', 'Alias 3'];
public const array METHOD_NAME = ['FirstMethodName', 'Alias1', 'Alias_2', 'Alias 3'];


// Get the Result object
Expand Down Expand Up @@ -126,13 +126,13 @@ protected function makeRanking(): void

class CondorcetTest_DuplicateAlgorithmAlias extends CondorcetTest_ValidAlgorithmName implements MethodInterface
{
public const METHOD_NAME = ['SecondMethodName', 'Alias_2'];
public const array METHOD_NAME = ['SecondMethodName', 'Alias_2'];
}


class CondorcetTest_UnvalidAlgorithmName
{
public const METHOD_NAME = ['FirstMethodName', 'Alias1', 'Alias_2', 'Alias 3'];
public const array METHOD_NAME = ['FirstMethodName', 'Alias1', 'Alias_2', 'Alias 3'];


// Get the Result object
Expand Down

0 comments on commit 2b6dbf4

Please sign in to comment.