Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 260 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Ready For Commit... | 11078719 | 1960 days ago | IN | 0 ETH | 0.00102868 | ||||
| Ready For Commit... | 11078505 | 1960 days ago | IN | 0 ETH | 0.00076054 | ||||
| Ready For Commit... | 11078430 | 1960 days ago | IN | 0 ETH | 0.00097506 | ||||
| Ready For Commit... | 11077965 | 1960 days ago | IN | 0 ETH | 0.00077361 | ||||
| Ready For Commit... | 11077830 | 1960 days ago | IN | 0 ETH | 0.00087755 | ||||
| Ready For Commit... | 11077830 | 1960 days ago | IN | 0 ETH | 0.00087755 | ||||
| Ready For Commit... | 11077830 | 1960 days ago | IN | 0 ETH | 0.00092143 | ||||
| Ready For Commit... | 11077812 | 1960 days ago | IN | 0 ETH | 0.00087755 | ||||
| Ready For Commit... | 11077812 | 1960 days ago | IN | 0 ETH | 0.00087755 | ||||
| Ready For Commit... | 11077812 | 1960 days ago | IN | 0 ETH | 0.00087717 | ||||
| Ready For Commit... | 11077812 | 1960 days ago | IN | 0 ETH | 0.00087802 | ||||
| Ready For Commit... | 11077812 | 1960 days ago | IN | 0 ETH | 0.00087755 | ||||
| Ready For Commit... | 11077811 | 1960 days ago | IN | 0 ETH | 0.00087755 | ||||
| Ready For Commit... | 11077811 | 1960 days ago | IN | 0 ETH | 0.00087755 | ||||
| Ready For Commit... | 11077811 | 1960 days ago | IN | 0 ETH | 0.00087755 | ||||
| Ready For Commit... | 11077811 | 1960 days ago | IN | 0 ETH | 0.00087717 | ||||
| Ready For Commit... | 11077807 | 1960 days ago | IN | 0 ETH | 0.00096489 | ||||
| Ready For Commit... | 11077788 | 1960 days ago | IN | 0 ETH | 0.00087717 | ||||
| Ready For Commit... | 11077787 | 1960 days ago | IN | 0 ETH | 0.00082924 | ||||
| Ready For Commit... | 11077786 | 1960 days ago | IN | 0 ETH | 0.00087717 | ||||
| Ready For Commit... | 11077508 | 1960 days ago | IN | 0 ETH | 0.00084464 | ||||
| Ready For Commit... | 11077505 | 1960 days ago | IN | 0 ETH | 0.00092103 | ||||
| Ready For Commit... | 11077504 | 1960 days ago | IN | 0 ETH | 0.00084464 | ||||
| Ready For Commit... | 11077499 | 1960 days ago | IN | 0 ETH | 0.00084428 | ||||
| Ready For Commit... | 11077476 | 1960 days ago | IN | 0 ETH | 0.00102381 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
Elections
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.6.12;
import "./SafeMath.sol";
import "./IElections.sol";
import "./IDelegation.sol";
import "./IGuardiansRegistration.sol";
import "./ICommittee.sol";
import "./ICertification.sol";
import "./ManagedContract.sol";
contract Elections is IElections, ManagedContract {
using SafeMath for uint256;
uint32 constant PERCENT_MILLIE_BASE = 100000;
mapping(address => mapping(address => uint256)) voteUnreadyVotes; // by => to => expiration
mapping(address => uint256) public votersStake;
mapping(address => address) voteOutVotes; // by => to
mapping(address => uint256) accumulatedStakesForVoteOut; // addr => total stake
mapping(address => bool) votedOutGuardians;
struct Settings {
uint32 minSelfStakePercentMille;
uint32 voteUnreadyPercentMilleThreshold;
uint32 voteOutPercentMilleThreshold;
}
Settings settings;
constructor(IContractRegistry _contractRegistry, address _registryAdmin, uint32 minSelfStakePercentMille, uint32 voteUnreadyPercentMilleThreshold, uint32 voteOutPercentMilleThreshold) ManagedContract(_contractRegistry, _registryAdmin) public {
setMinSelfStakePercentMille(minSelfStakePercentMille);
setVoteOutPercentMilleThreshold(voteOutPercentMilleThreshold);
setVoteUnreadyPercentMilleThreshold(voteUnreadyPercentMilleThreshold);
}
modifier onlyDelegationsContract() {
require(msg.sender == address(delegationsContract), "caller is not the delegations contract");
_;
}
modifier onlyGuardiansRegistrationContract() {
require(msg.sender == address(guardianRegistrationContract), "caller is not the guardian registrations contract");
_;
}
/*
* External functions
*/
function readyToSync() external override onlyWhenActive {
address guardian = guardianRegistrationContract.resolveGuardianAddress(msg.sender); // this validates registration
require(!isVotedOut(guardian), "caller is voted-out");
emit GuardianStatusUpdated(guardian, true, false);
committeeContract.removeMember(guardian);
}
function readyForCommittee() external override onlyWhenActive {
_readyForCommittee(msg.sender);
}
function canJoinCommittee(address guardian) external view override returns (bool) {
guardian = guardianRegistrationContract.resolveGuardianAddress(guardian); // this validates registration
if (isVotedOut(guardian)) {
return false;
}
(, uint256 effectiveStake, ) = getGuardianStakeInfo(guardian, settings);
return committeeContract.checkAddMember(guardian, effectiveStake);
}
function getEffectiveStake(address guardian) external override view returns (uint effectiveStake) {
(, effectiveStake, ) = getGuardianStakeInfo(guardian, settings);
}
/// @dev returns the current committee
function getCommittee() external override view returns (address[] memory committee, uint256[] memory weights, address[] memory orbsAddrs, bool[] memory certification, bytes4[] memory ips) {
IGuardiansRegistration _guardianRegistrationContract = guardianRegistrationContract;
(committee, weights, certification) = committeeContract.getCommittee();
orbsAddrs = _guardianRegistrationContract.getGuardiansOrbsAddress(committee);
ips = _guardianRegistrationContract.getGuardianIps(committee);
}
// Vote-unready
function voteUnready(address subject, uint voteExpiration) external override onlyWhenActive {
require(voteExpiration >= block.timestamp, "vote expiration time must not be in the past");
address voter = guardianRegistrationContract.resolveGuardianAddress(msg.sender);
voteUnreadyVotes[voter][subject] = voteExpiration;
emit VoteUnreadyCasted(voter, subject, voteExpiration);
(address[] memory generalCommittee, uint256[] memory generalWeights, bool[] memory certification) = committeeContract.getCommittee();
bool votedUnready = isCommitteeVoteUnreadyThresholdReached(generalCommittee, generalWeights, certification, subject);
if (votedUnready) {
clearCommitteeUnreadyVotes(generalCommittee, subject);
emit GuardianVotedUnready(subject);
emit GuardianStatusUpdated(subject, false, false);
committeeContract.removeMember(subject);
}
}
function getVoteUnreadyVote(address voter, address subject) public override view returns (bool valid, uint256 expiration) {
expiration = voteUnreadyVotes[voter][subject];
valid = expiration != 0 && block.timestamp < expiration;
}
function getVoteUnreadyStatus(address subject) external override view returns (address[] memory committee, uint256[] memory weights, bool[] memory certification, bool[] memory votes, bool subjectInCommittee, bool subjectInCertifiedCommittee) {
(committee, weights, certification) = committeeContract.getCommittee();
votes = new bool[](committee.length);
for (uint i = 0; i < committee.length; i++) {
address memberAddr = committee[i];
if (block.timestamp < voteUnreadyVotes[memberAddr][subject]) {
votes[i] = true;
}
if (memberAddr == subject) {
subjectInCommittee = true;
subjectInCertifiedCommittee = certification[i];
}
}
}
// Vote-out
function voteOut(address subject) external override onlyWhenActive {
Settings memory _settings = settings;
address voter = msg.sender;
address prevSubject = voteOutVotes[voter];
voteOutVotes[voter] = subject;
emit VoteOutCasted(voter, subject);
uint256 voterStake = delegationsContract.getDelegatedStake(voter);
if (prevSubject == address(0)) {
votersStake[voter] = voterStake;
}
if (subject == address(0)) {
delete votersStake[voter];
}
uint totalStake = delegationsContract.getTotalDelegatedStake();
if (prevSubject != address(0) && prevSubject != subject) {
applyVoteOutVotesFor(prevSubject, 0, voterStake, totalStake, _settings);
}
if (subject != address(0)) {
uint voteStakeAdded = prevSubject != subject ? voterStake : 0;
applyVoteOutVotesFor(subject, voteStakeAdded, 0, totalStake, _settings); // recheck also if not new
}
}
function getVoteOutVote(address voter) external override view returns (address) {
return voteOutVotes[voter];
}
function getVoteOutStatus(address subject) external override view returns (bool votedOut, uint votedStake, uint totalDelegatedStake) {
votedOut = isVotedOut(subject);
votedStake = accumulatedStakesForVoteOut[subject];
totalDelegatedStake = delegationsContract.getTotalDelegatedStake();
}
/*
* Notification functions from other PoS contracts
*/
function delegatedStakeChange(address delegate, uint256 selfStake, uint256 delegatedStake, uint256 totalDelegatedStake) external override onlyDelegationsContract onlyWhenActive {
Settings memory _settings = settings;
uint effectiveStake = calcEffectiveStake(selfStake, delegatedStake, _settings);
emit StakeChanged(delegate, selfStake, delegatedStake, effectiveStake);
committeeContract.memberWeightChange(delegate, effectiveStake);
applyStakesToVoteOutBy(delegate, delegatedStake, totalDelegatedStake, _settings);
}
/// @dev Called by: guardian registration contract
/// Notifies a new guardian was unregistered
function guardianUnregistered(address guardian) external override onlyGuardiansRegistrationContract onlyWhenActive {
emit GuardianStatusUpdated(guardian, false, false);
committeeContract.removeMember(guardian);
}
/// @dev Called by: guardian registration contract
/// Notifies on a guardian certification change
function guardianCertificationChanged(address guardian, bool isCertified) external override onlyWhenActive {
committeeContract.memberCertificationChange(guardian, isCertified);
}
/*
* Governance functions
*/
function setMinSelfStakePercentMille(uint32 minSelfStakePercentMille) public override onlyFunctionalManager {
require(minSelfStakePercentMille <= PERCENT_MILLIE_BASE, "minSelfStakePercentMille must be 100000 at most");
emit MinSelfStakePercentMilleChanged(minSelfStakePercentMille, settings.minSelfStakePercentMille);
settings.minSelfStakePercentMille = minSelfStakePercentMille;
}
function getMinSelfStakePercentMille() external override view returns (uint32) {
return settings.minSelfStakePercentMille;
}
function setVoteOutPercentMilleThreshold(uint32 voteOutPercentMilleThreshold) public override onlyFunctionalManager {
require(voteOutPercentMilleThreshold <= PERCENT_MILLIE_BASE, "voteOutPercentMilleThreshold must not be larger than 100000");
emit VoteOutPercentMilleThresholdChanged(voteOutPercentMilleThreshold, settings.voteOutPercentMilleThreshold);
settings.voteOutPercentMilleThreshold = voteOutPercentMilleThreshold;
}
function getVoteOutPercentMilleThreshold() external override view returns (uint32) {
return settings.voteOutPercentMilleThreshold;
}
function setVoteUnreadyPercentMilleThreshold(uint32 voteUnreadyPercentMilleThreshold) public override onlyFunctionalManager {
require(voteUnreadyPercentMilleThreshold <= PERCENT_MILLIE_BASE, "voteUnreadyPercentMilleThreshold must not be larger than 100000");
emit VoteUnreadyPercentMilleThresholdChanged(voteUnreadyPercentMilleThreshold, settings.voteUnreadyPercentMilleThreshold);
settings.voteUnreadyPercentMilleThreshold = voteUnreadyPercentMilleThreshold;
}
function getVoteUnreadyPercentMilleThreshold() external override view returns (uint32) {
return settings.voteUnreadyPercentMilleThreshold;
}
function getSettings() external override view returns (
uint32 minSelfStakePercentMille,
uint32 voteUnreadyPercentMilleThreshold,
uint32 voteOutPercentMilleThreshold
) {
Settings memory _settings = settings;
minSelfStakePercentMille = _settings.minSelfStakePercentMille;
voteUnreadyPercentMilleThreshold = _settings.voteUnreadyPercentMilleThreshold;
voteOutPercentMilleThreshold = _settings.voteOutPercentMilleThreshold;
}
function initReadyForCommittee(address[] calldata guardians) external override onlyInitializationAdmin {
for (uint i = 0; i < guardians.length; i++) {
_readyForCommittee(guardians[i]);
}
}
/*
* Private functions
*/
function _readyForCommittee(address guardian) private {
guardian = guardianRegistrationContract.resolveGuardianAddress(guardian); // this validates registration
require(!isVotedOut(guardian), "caller is voted-out");
emit GuardianStatusUpdated(guardian, true, true);
(, uint256 effectiveStake, ) = getGuardianStakeInfo(guardian, settings);
committeeContract.addMember(guardian, effectiveStake, certificationContract.isGuardianCertified(guardian));
}
function calcEffectiveStake(uint256 selfStake, uint256 delegatedStake, Settings memory _settings) private pure returns (uint256) {
if (selfStake.mul(PERCENT_MILLIE_BASE) >= delegatedStake.mul(_settings.minSelfStakePercentMille)) {
return delegatedStake;
}
return selfStake.mul(PERCENT_MILLIE_BASE).div(_settings.minSelfStakePercentMille); // never overflows or divides by zero
}
function getGuardianStakeInfo(address guardian, Settings memory _settings) private view returns (uint256 selfStake, uint256 effectiveStake, uint256 delegatedStake) {
IDelegations _delegationsContract = delegationsContract;
(,selfStake) = _delegationsContract.getDelegationInfo(guardian);
delegatedStake = _delegationsContract.getDelegatedStake(guardian);
effectiveStake = calcEffectiveStake(selfStake, delegatedStake, _settings);
}
// Vote-unready
function isCommitteeVoteUnreadyThresholdReached(address[] memory committee, uint256[] memory weights, bool[] memory certification, address subject) private returns (bool) {
Settings memory _settings = settings;
uint256 totalCommitteeStake = 0;
uint256 totalVoteUnreadyStake = 0;
uint256 totalCertifiedStake = 0;
uint256 totalCertifiedVoteUnreadyStake = 0;
address member;
uint256 memberStake;
bool isSubjectCertified;
for (uint i = 0; i < committee.length; i++) {
member = committee[i];
memberStake = weights[i];
if (member == subject && certification[i]) {
isSubjectCertified = true;
}
totalCommitteeStake = totalCommitteeStake.add(memberStake);
if (certification[i]) {
totalCertifiedStake = totalCertifiedStake.add(memberStake);
}
(bool valid, uint256 expiration) = getVoteUnreadyVote(member, subject);
if (valid) {
totalVoteUnreadyStake = totalVoteUnreadyStake.add(memberStake);
if (certification[i]) {
totalCertifiedVoteUnreadyStake = totalCertifiedVoteUnreadyStake.add(memberStake);
}
} else if (expiration != 0) {
// Vote is stale, delete from state
delete voteUnreadyVotes[member][subject];
}
}
return (
totalCommitteeStake > 0 &&
totalVoteUnreadyStake.mul(PERCENT_MILLIE_BASE) >= uint256(_settings.voteUnreadyPercentMilleThreshold).mul(totalCommitteeStake)
) || (
isSubjectCertified &&
totalCertifiedStake > 0 &&
totalCertifiedVoteUnreadyStake.mul(PERCENT_MILLIE_BASE) >= uint256(_settings.voteUnreadyPercentMilleThreshold).mul(totalCertifiedStake)
);
}
function clearCommitteeUnreadyVotes(address[] memory committee, address subject) private {
for (uint i = 0; i < committee.length; i++) {
voteUnreadyVotes[committee[i]][subject] = 0; // clear vote-outs
}
}
// Vote-out
function applyStakesToVoteOutBy(address voter, uint256 currentVoterStake, uint256 totalGovernanceStake, Settings memory _settings) private {
address subject = voteOutVotes[voter];
if (subject == address(0)) return;
uint256 prevVoterStake = votersStake[voter];
votersStake[voter] = currentVoterStake;
applyVoteOutVotesFor(subject, currentVoterStake, prevVoterStake, totalGovernanceStake, _settings);
}
function applyVoteOutVotesFor(address subject, uint256 voteOutStakeAdded, uint256 voteOutStakeRemoved, uint256 totalGovernanceStake, Settings memory _settings) private {
if (isVotedOut(subject)) {
return;
}
uint256 accumulated = accumulatedStakesForVoteOut[subject].
sub(voteOutStakeRemoved).
add(voteOutStakeAdded);
bool shouldBeVotedOut = totalGovernanceStake > 0 && accumulated.mul(PERCENT_MILLIE_BASE) >= uint256(_settings.voteOutPercentMilleThreshold).mul(totalGovernanceStake);
if (shouldBeVotedOut) {
votedOutGuardians[subject] = true;
emit GuardianVotedOut(subject);
emit GuardianStatusUpdated(subject, false, false);
committeeContract.removeMember(subject);
}
accumulatedStakesForVoteOut[subject] = accumulated;
}
function isVotedOut(address guardian) private view returns (bool) {
return votedOutGuardians[guardian];
}
/*
* Contracts topology / registry interface
*/
ICommittee committeeContract;
IDelegations delegationsContract;
IGuardiansRegistration guardianRegistrationContract;
ICertification certificationContract;
function refreshContracts() external override {
committeeContract = ICommittee(getCommitteeContract());
delegationsContract = IDelegations(getDelegationsContract());
guardianRegistrationContract = IGuardiansRegistration(getGuardiansRegistrationContract());
certificationContract = ICertification(getCertificationContract());
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.6.12;
import "./IContractRegistry.sol";
import "./WithClaimableRegistryManagement.sol";
import "./Initializable.sol";
contract ContractRegistryAccessor is WithClaimableRegistryManagement, Initializable {
IContractRegistry private contractRegistry;
constructor(IContractRegistry _contractRegistry, address _registryAdmin) public {
require(address(_contractRegistry) != address(0), "_contractRegistry cannot be 0");
setContractRegistry(_contractRegistry);
_transferRegistryManagement(_registryAdmin);
}
modifier onlyAdmin {
require(isAdmin(), "sender is not an admin (registryManger or initializationAdmin)");
_;
}
function isManager(string memory role) internal view returns (bool) {
IContractRegistry _contractRegistry = contractRegistry;
return isAdmin() || _contractRegistry != IContractRegistry(0) && contractRegistry.getManager(role) == msg.sender;
}
function isAdmin() internal view returns (bool) {
return msg.sender == registryAdmin() || msg.sender == initializationAdmin() || msg.sender == address(contractRegistry);
}
function getProtocolContract() internal view returns (address) {
return contractRegistry.getContract("protocol");
}
function getStakingRewardsContract() internal view returns (address) {
return contractRegistry.getContract("stakingRewards");
}
function getFeesAndBootstrapRewardsContract() internal view returns (address) {
return contractRegistry.getContract("feesAndBootstrapRewards");
}
function getCommitteeContract() internal view returns (address) {
return contractRegistry.getContract("committee");
}
function getElectionsContract() internal view returns (address) {
return contractRegistry.getContract("elections");
}
function getDelegationsContract() internal view returns (address) {
return contractRegistry.getContract("delegations");
}
function getGuardiansRegistrationContract() internal view returns (address) {
return contractRegistry.getContract("guardiansRegistration");
}
function getCertificationContract() internal view returns (address) {
return contractRegistry.getContract("certification");
}
function getStakingContract() internal view returns (address) {
return contractRegistry.getContract("staking");
}
function getSubscriptionsContract() internal view returns (address) {
return contractRegistry.getContract("subscriptions");
}
function getStakingRewardsWallet() internal view returns (address) {
return contractRegistry.getContract("stakingRewardsWallet");
}
function getBootstrapRewardsWallet() internal view returns (address) {
return contractRegistry.getContract("bootstrapRewardsWallet");
}
function getGeneralFeesWallet() internal view returns (address) {
return contractRegistry.getContract("generalFeesWallet");
}
function getCertifiedFeesWallet() internal view returns (address) {
return contractRegistry.getContract("certifiedFeesWallet");
}
function getStakingContractHandler() internal view returns (address) {
return contractRegistry.getContract("stakingContractHandler");
}
/*
* Governance functions
*/
event ContractRegistryAddressUpdated(address addr);
function setContractRegistry(IContractRegistry newContractRegistry) public onlyAdmin {
require(newContractRegistry.getPreviousContractRegistry() == address(contractRegistry), "new contract registry must provide the previous contract registry");
contractRegistry = newContractRegistry;
emit ContractRegistryAddressUpdated(address(newContractRegistry));
}
function getContractRegistry() public view returns (IContractRegistry) {
return contractRegistry;
}
}
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.6.12;
/// @title Elections contract interface
interface ICertification /* is Ownable */ {
event GuardianCertificationUpdate(address indexed guardian, bool isCertified);
/*
* External methods
*/
/// @dev Returns the certification status of a guardian
function isGuardianCertified(address guardian) external view returns (bool isCertified);
/// @dev Sets the guardian certification status
function setGuardianCertification(address guardian, bool isCertified) external /* Owner only */ ;
}
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.6.12;
/// @title Committee contract interface
interface ICommittee {
event CommitteeChange(address indexed addr, uint256 weight, bool certification, bool inCommittee);
event CommitteeSnapshot(address[] addrs, uint256[] weights, bool[] certification);
// No external functions
/*
* External functions
*/
/// @dev Called by: Elections contract
/// Notifies a weight change of certification change of a member
function memberWeightChange(address addr, uint256 weight) external /* onlyElectionsContract onlyWhenActive */;
function memberCertificationChange(address addr, bool isCertified) external /* onlyElectionsContract onlyWhenActive */;
/// @dev Called by: Elections contract
/// Notifies a a member removal for example due to voteOut / voteUnready
function removeMember(address addr) external returns (bool memberRemoved, uint removedMemberEffectiveStake, bool removedMemberCertified)/* onlyElectionContract */;
/// @dev Called by: Elections contract
/// Notifies a new member applicable for committee (due to registration, unbanning, certification change)
function addMember(address addr, uint256 weight, bool isCertified) external returns (bool memberAdded) /* onlyElectionsContract */;
/// @dev Called by: Elections contract
/// Checks if addMember() would add a the member to the committee
function checkAddMember(address addr, uint256 weight) external view returns (bool wouldAddMember);
/// @dev Called by: Elections contract
/// Returns the committee members and their weights
function getCommittee() external view returns (address[] memory addrs, uint256[] memory weights, bool[] memory certification);
function getCommitteeStats() external view returns (uint generalCommitteeSize, uint certifiedCommitteeSize, uint totalStake);
function getMemberInfo(address addr) external view returns (bool inCommittee, uint weight, bool isCertified, uint totalCommitteeWeight);
function emitCommitteeSnapshot() external;
/*
* Governance functions
*/
event MaxCommitteeSizeChanged(uint8 newValue, uint8 oldValue);
function setMaxCommitteeSize(uint8 maxCommitteeSize) external /* onlyFunctionalManager onlyWhenActive */;
function getMaxCommitteeSize() external view returns (uint8);
}
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.6.12;
interface IContractRegistry {
event ContractAddressUpdated(string contractName, address addr, bool managedContract);
event ManagerChanged(string role, address newManager);
event ContractRegistryUpdated(address newContractRegistry);
/*
* External functions
*/
/// @dev updates the contracts address and emits a corresponding event
/// managedContract indicates whether the contract is managed by the registry and notified on changes
function setContract(string calldata contractName, address addr, bool managedContract) external /* onlyAdmin */;
/// @dev returns the current address of the given contracts
function getContract(string calldata contractName) external view returns (address);
/// @dev returns the list of contract addresses managed by the registry
function getManagedContracts() external view returns (address[] memory);
function setManager(string calldata role, address manager) external /* onlyAdmin */;
function getManager(string calldata role) external view returns (address);
function lockContracts() external /* onlyAdmin */;
function unlockContracts() external /* onlyAdmin */;
function setNewContractRegistry(IContractRegistry newRegistry) external /* onlyAdmin */;
function getPreviousContractRegistry() external view returns (address);
}
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.6.12;
/// @title Delegations contract interface
interface IDelegations /* is IStakeChangeNotifier */ {
// Delegation state change events
event DelegatedStakeChanged(address indexed addr, uint256 selfDelegatedStake, uint256 delegatedStake, address indexed delegator, uint256 delegatorContributedStake);
// Function calls
event Delegated(address indexed from, address indexed to);
/*
* External functions
*/
/// @dev Stake delegation
function delegate(address to) external /* onlyWhenActive */;
function refreshStake(address addr) external /* onlyWhenActive */;
function getDelegatedStake(address addr) external view returns (uint256);
function getDelegation(address addr) external view returns (address);
function getDelegationInfo(address addr) external view returns (address delegation, uint256 delegatorStake);
function getTotalDelegatedStake() external view returns (uint256) ;
/*
* Governance functions
*/
event DelegationsImported(address[] from, address indexed to);
event DelegationInitialized(address indexed from, address indexed to);
function importDelegations(address[] calldata from, address to) external /* onlyMigrationManager onlyDuringDelegationImport */;
function initDelegation(address from, address to) external /* onlyInitializationAdmin */;
}
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.6.12;
/// @title Elections contract interface
interface IElections {
// Election state change events
event StakeChanged(address indexed addr, uint256 selfStake, uint256 delegatedStake, uint256 effectiveStake);
event GuardianStatusUpdated(address indexed guardian, bool readyToSync, bool readyForCommittee);
// Vote out / Vote unready
event GuardianVotedUnready(address indexed guardian);
event VoteUnreadyCasted(address indexed voter, address indexed subject, uint256 expiration);
event GuardianVotedOut(address indexed guardian);
event VoteOutCasted(address indexed voter, address indexed subject);
/*
* External functions
*/
/// @dev Called by a guardian when ready to start syncing with other nodes
function readyToSync() external;
/// @dev Called by a guardian when ready to join the committee, typically after syncing is complete or after being voted out
function readyForCommittee() external;
/// @dev Called to test if a guardian calling readyForCommittee() will lead to joining the committee
function canJoinCommittee(address guardian) external view returns (bool);
/// @dev Returns an address effective stake
function getEffectiveStake(address guardian) external view returns (uint effectiveStake);
/// @dev returns the current committee
/// used also by the rewards and fees contracts
function getCommittee() external view returns (address[] memory committee, uint256[] memory weights, address[] memory orbsAddrs, bool[] memory certification, bytes4[] memory ips);
// Vote-unready
/// @dev Called by a guardian as part of the automatic vote-unready flow
function voteUnready(address subject, uint expiration) external;
function getVoteUnreadyVote(address voter, address subject) external view returns (bool valid, uint256 expiration);
/// @dev Returns the current vote-unready status of a subject guardian.
/// votes indicates wether the specific committee member voted the guardian unready
function getVoteUnreadyStatus(address subject) external view returns (
address[] memory committee,
uint256[] memory weights,
bool[] memory certification,
bool[] memory votes,
bool subjectInCommittee,
bool subjectInCertifiedCommittee
);
// Vote-out
/// @dev Casts a voteOut vote by the sender to the given address
function voteOut(address subject) external;
/// @dev Returns the subject address the addr has voted-out against
function getVoteOutVote(address voter) external view returns (address);
/// @dev Returns the governance voteOut status of a guardian.
/// A guardian is voted out if votedStake / totalDelegatedStake (in percent mille) > threshold
function getVoteOutStatus(address subject) external view returns (bool votedOut, uint votedStake, uint totalDelegatedStake);
/*
* Notification functions from other PoS contracts
*/
/// @dev Called by: delegation contract
/// Notifies a delegated stake change event
/// total_delegated_stake = 0 if addr delegates to another guardian
function delegatedStakeChange(address delegate, uint256 selfStake, uint256 delegatedStake, uint256 totalDelegatedStake) external /* onlyDelegationsContract onlyWhenActive */;
/// @dev Called by: guardian registration contract
/// Notifies a new guardian was unregistered
function guardianUnregistered(address guardian) external /* onlyGuardiansRegistrationContract */;
/// @dev Called by: guardian registration contract
/// Notifies on a guardian certification change
function guardianCertificationChanged(address guardian, bool isCertified) external /* onlyCertificationContract */;
/*
* Governance functions
*/
event VoteUnreadyTimeoutSecondsChanged(uint32 newValue, uint32 oldValue);
event VoteOutPercentMilleThresholdChanged(uint32 newValue, uint32 oldValue);
event VoteUnreadyPercentMilleThresholdChanged(uint32 newValue, uint32 oldValue);
event MinSelfStakePercentMilleChanged(uint32 newValue, uint32 oldValue);
/// @dev Sets the minimum self-stake required for the effective stake
/// minSelfStakePercentMille - the minimum self stake in percent-mille (0-100,000)
function setMinSelfStakePercentMille(uint32 minSelfStakePercentMille) external /* onlyFunctionalManager onlyWhenActive */;
/// @dev Returns the minimum self-stake required for the effective stake
function getMinSelfStakePercentMille() external view returns (uint32);
/// @dev Sets the vote-out threshold
/// voteOutPercentMilleThreshold - the minimum threshold in percent-mille (0-100,000)
function setVoteOutPercentMilleThreshold(uint32 voteUnreadyPercentMilleThreshold) external /* onlyFunctionalManager onlyWhenActive */;
/// @dev Returns the vote-out threshold
function getVoteOutPercentMilleThreshold() external view returns (uint32);
/// @dev Sets the vote-unready threshold
/// voteUnreadyPercentMilleThreshold - the minimum threshold in percent-mille (0-100,000)
function setVoteUnreadyPercentMilleThreshold(uint32 voteUnreadyPercentMilleThreshold) external /* onlyFunctionalManager onlyWhenActive */;
/// @dev Returns the vote-unready threshold
function getVoteUnreadyPercentMilleThreshold() external view returns (uint32);
/// @dev Returns the contract's settings
function getSettings() external view returns (
uint32 minSelfStakePercentMille,
uint32 voteUnreadyPercentMilleThreshold,
uint32 voteOutPercentMilleThreshold
);
function initReadyForCommittee(address[] calldata guardians) external /* onlyInitializationAdmin */;
}
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.6.12;
/// @title Guardian registration contract interface
interface IGuardiansRegistration {
event GuardianRegistered(address indexed guardian);
event GuardianUnregistered(address indexed guardian);
event GuardianDataUpdated(address indexed guardian, bool isRegistered, bytes4 ip, address orbsAddr, string name, string website);
event GuardianMetadataChanged(address indexed guardian, string key, string newValue, string oldValue);
/*
* External methods
*/
/// @dev Called by a participant who wishes to register as a guardian
function registerGuardian(bytes4 ip, address orbsAddr, string calldata name, string calldata website) external;
/// @dev Called by a participant who wishes to update its propertires
function updateGuardian(bytes4 ip, address orbsAddr, string calldata name, string calldata website) external;
/// @dev Called by a participant who wishes to update its IP address (can be call by both main and Orbs addresses)
function updateGuardianIp(bytes4 ip) external /* onlyWhenActive */;
/// @dev Called by a participant to update additional guardian metadata properties.
function setMetadata(string calldata key, string calldata value) external;
/// @dev Called by a participant to get additional guardian metadata properties.
function getMetadata(address guardian, string calldata key) external view returns (string memory);
/// @dev Called by a participant who wishes to unregister
function unregisterGuardian() external;
/// @dev Returns a guardian's data
function getGuardianData(address guardian) external view returns (bytes4 ip, address orbsAddr, string memory name, string memory website, uint registrationTime, uint lastUpdateTime);
/// @dev Returns the Orbs addresses of a list of guardians
function getGuardiansOrbsAddress(address[] calldata guardianAddrs) external view returns (address[] memory orbsAddrs);
/// @dev Returns a guardian's ip
function getGuardianIp(address guardian) external view returns (bytes4 ip);
/// @dev Returns guardian ips
function getGuardianIps(address[] calldata guardian) external view returns (bytes4[] memory ips);
/// @dev Returns true if the given address is of a registered guardian
function isRegistered(address guardian) external view returns (bool);
/// @dev Translates a list guardians Orbs addresses to guardian addresses
function getGuardianAddresses(address[] calldata orbsAddrs) external view returns (address[] memory guardianAddrs);
/// @dev Resolves the guardian address for a guardian, given a Guardian/Orbs address
function resolveGuardianAddress(address guardianOrOrbsAddress) external view returns (address guardianAddress);
/*
* Governance functions
*/
function migrateGuardians(address[] calldata guardiansToMigrate, IGuardiansRegistration previousContract) external /* onlyInitializationAdmin */;
}
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.6.12;
interface ILockable {
event Locked();
event Unlocked();
function lock() external /* onlyLockOwner */;
function unlock() external /* onlyLockOwner */;
function isLocked() view external returns (bool);
}
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.6.12;
contract Initializable {
address private _initializationAdmin;
event InitializationComplete();
constructor() public{
_initializationAdmin = msg.sender;
}
modifier onlyInitializationAdmin() {
require(msg.sender == initializationAdmin(), "sender is not the initialization admin");
_;
}
/*
* External functions
*/
function initializationAdmin() public view returns (address) {
return _initializationAdmin;
}
function initializationComplete() external onlyInitializationAdmin {
_initializationAdmin = address(0);
emit InitializationComplete();
}
function isInitializationComplete() public view returns (bool) {
return _initializationAdmin == address(0);
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.6.12;
import "./ContractRegistryAccessor.sol";
import "./ILockable.sol";
contract Lockable is ILockable, ContractRegistryAccessor {
bool public locked;
constructor(IContractRegistry _contractRegistry, address _registryAdmin) ContractRegistryAccessor(_contractRegistry, _registryAdmin) public {}
modifier onlyLockOwner() {
require(msg.sender == registryAdmin() || msg.sender == address(getContractRegistry()), "caller is not a lock owner");
_;
}
function lock() external override onlyLockOwner {
locked = true;
emit Locked();
}
function unlock() external override onlyLockOwner {
locked = false;
emit Unlocked();
}
function isLocked() external override view returns (bool) {
return locked;
}
modifier onlyWhenActive() {
require(!locked, "contract is locked for this operation");
_;
}
}
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.6.12;
import "./Lockable.sol";
contract ManagedContract is Lockable {
constructor(IContractRegistry _contractRegistry, address _registryAdmin) Lockable(_contractRegistry, _registryAdmin) public {}
modifier onlyMigrationManager {
require(isManager("migrationManager"), "sender is not the migration manager");
_;
}
modifier onlyFunctionalManager {
require(isManager("functionalManager"), "sender is not the functional manager");
_;
}
function refreshContracts() virtual external {}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.6.12;
import "./Context.sol";
/**
* @title Claimable
* @dev Extension for the Ownable contract, where the ownership needs to be claimed.
* This allows the new owner to accept the transfer.
*/
contract WithClaimableRegistryManagement is Context {
address private _registryAdmin;
address private _pendingRegistryAdmin;
event RegistryManagementTransferred(address indexed previousRegistryAdmin, address indexed newRegistryAdmin);
/**
* @dev Initializes the contract setting the deployer as the initial registryRegistryAdmin.
*/
constructor () internal {
address msgSender = _msgSender();
_registryAdmin = msgSender;
emit RegistryManagementTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current registryAdmin.
*/
function registryAdmin() public view returns (address) {
return _registryAdmin;
}
/**
* @dev Throws if called by any account other than the registryAdmin.
*/
modifier onlyRegistryAdmin() {
require(isRegistryAdmin(), "WithClaimableRegistryManagement: caller is not the registryAdmin");
_;
}
/**
* @dev Returns true if the caller is the current registryAdmin.
*/
function isRegistryAdmin() public view returns (bool) {
return _msgSender() == _registryAdmin;
}
/**
* @dev Leaves the contract without registryAdmin. It will not be possible to call
* `onlyManager` functions anymore. Can only be called by the current registryAdmin.
*
* NOTE: Renouncing registryManagement will leave the contract without an registryAdmin,
* thereby removing any functionality that is only available to the registryAdmin.
*/
function renounceRegistryManagement() public onlyRegistryAdmin {
emit RegistryManagementTransferred(_registryAdmin, address(0));
_registryAdmin = address(0);
}
/**
* @dev Transfers registryManagement of the contract to a new account (`newManager`).
*/
function _transferRegistryManagement(address newRegistryAdmin) internal {
require(newRegistryAdmin != address(0), "RegistryAdmin: new registryAdmin is the zero address");
emit RegistryManagementTransferred(_registryAdmin, newRegistryAdmin);
_registryAdmin = newRegistryAdmin;
}
/**
* @dev Modifier throws if called by any account other than the pendingManager.
*/
modifier onlyPendingRegistryAdmin() {
require(msg.sender == _pendingRegistryAdmin, "Caller is not the pending registryAdmin");
_;
}
/**
* @dev Allows the current registryAdmin to set the pendingManager address.
* @param newRegistryAdmin The address to transfer registryManagement to.
*/
function transferRegistryManagement(address newRegistryAdmin) public onlyRegistryAdmin {
_pendingRegistryAdmin = newRegistryAdmin;
}
/**
* @dev Allows the _pendingRegistryAdmin address to finalize the transfer.
*/
function claimRegistryManagement() external onlyPendingRegistryAdmin {
_transferRegistryManagement(_pendingRegistryAdmin);
_pendingRegistryAdmin = address(0);
}
/**
* @dev Returns the current pendingRegistryAdmin
*/
function pendingRegistryAdmin() public view returns (address) {
return _pendingRegistryAdmin;
}
}
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IContractRegistry","name":"_contractRegistry","type":"address"},{"internalType":"address","name":"_registryAdmin","type":"address"},{"internalType":"uint32","name":"minSelfStakePercentMille","type":"uint32"},{"internalType":"uint32","name":"voteUnreadyPercentMilleThreshold","type":"uint32"},{"internalType":"uint32","name":"voteOutPercentMilleThreshold","type":"uint32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"ContractRegistryAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"guardian","type":"address"},{"indexed":false,"internalType":"bool","name":"readyToSync","type":"bool"},{"indexed":false,"internalType":"bool","name":"readyForCommittee","type":"bool"}],"name":"GuardianStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"guardian","type":"address"}],"name":"GuardianVotedOut","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"guardian","type":"address"}],"name":"GuardianVotedUnready","type":"event"},{"anonymous":false,"inputs":[],"name":"InitializationComplete","type":"event"},{"anonymous":false,"inputs":[],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"newValue","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"oldValue","type":"uint32"}],"name":"MinSelfStakePercentMilleChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousRegistryAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newRegistryAdmin","type":"address"}],"name":"RegistryManagementTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"selfStake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"delegatedStake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"effectiveStake","type":"uint256"}],"name":"StakeChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"Unlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":true,"internalType":"address","name":"subject","type":"address"}],"name":"VoteOutCasted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"newValue","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"oldValue","type":"uint32"}],"name":"VoteOutPercentMilleThresholdChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":true,"internalType":"address","name":"subject","type":"address"},{"indexed":false,"internalType":"uint256","name":"expiration","type":"uint256"}],"name":"VoteUnreadyCasted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"newValue","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"oldValue","type":"uint32"}],"name":"VoteUnreadyPercentMilleThresholdChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"newValue","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"oldValue","type":"uint32"}],"name":"VoteUnreadyTimeoutSecondsChanged","type":"event"},{"inputs":[{"internalType":"address","name":"guardian","type":"address"}],"name":"canJoinCommittee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRegistryManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegate","type":"address"},{"internalType":"uint256","name":"selfStake","type":"uint256"},{"internalType":"uint256","name":"delegatedStake","type":"uint256"},{"internalType":"uint256","name":"totalDelegatedStake","type":"uint256"}],"name":"delegatedStakeChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCommittee","outputs":[{"internalType":"address[]","name":"committee","type":"address[]"},{"internalType":"uint256[]","name":"weights","type":"uint256[]"},{"internalType":"address[]","name":"orbsAddrs","type":"address[]"},{"internalType":"bool[]","name":"certification","type":"bool[]"},{"internalType":"bytes4[]","name":"ips","type":"bytes4[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractRegistry","outputs":[{"internalType":"contract IContractRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"guardian","type":"address"}],"name":"getEffectiveStake","outputs":[{"internalType":"uint256","name":"effectiveStake","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinSelfStakePercentMille","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSettings","outputs":[{"internalType":"uint32","name":"minSelfStakePercentMille","type":"uint32"},{"internalType":"uint32","name":"voteUnreadyPercentMilleThreshold","type":"uint32"},{"internalType":"uint32","name":"voteOutPercentMilleThreshold","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVoteOutPercentMilleThreshold","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"subject","type":"address"}],"name":"getVoteOutStatus","outputs":[{"internalType":"bool","name":"votedOut","type":"bool"},{"internalType":"uint256","name":"votedStake","type":"uint256"},{"internalType":"uint256","name":"totalDelegatedStake","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"voter","type":"address"}],"name":"getVoteOutVote","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVoteUnreadyPercentMilleThreshold","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"subject","type":"address"}],"name":"getVoteUnreadyStatus","outputs":[{"internalType":"address[]","name":"committee","type":"address[]"},{"internalType":"uint256[]","name":"weights","type":"uint256[]"},{"internalType":"bool[]","name":"certification","type":"bool[]"},{"internalType":"bool[]","name":"votes","type":"bool[]"},{"internalType":"bool","name":"subjectInCommittee","type":"bool"},{"internalType":"bool","name":"subjectInCertifiedCommittee","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"voter","type":"address"},{"internalType":"address","name":"subject","type":"address"}],"name":"getVoteUnreadyVote","outputs":[{"internalType":"bool","name":"valid","type":"bool"},{"internalType":"uint256","name":"expiration","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"guardian","type":"address"},{"internalType":"bool","name":"isCertified","type":"bool"}],"name":"guardianCertificationChanged","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"guardian","type":"address"}],"name":"guardianUnregistered","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"guardians","type":"address[]"}],"name":"initReadyForCommittee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializationAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initializationComplete","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitializationComplete","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRegistryAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingRegistryAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"readyForCommittee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"readyToSync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refreshContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registryAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceRegistryManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IContractRegistry","name":"newContractRegistry","type":"address"}],"name":"setContractRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"minSelfStakePercentMille","type":"uint32"}],"name":"setMinSelfStakePercentMille","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"voteOutPercentMilleThreshold","type":"uint32"}],"name":"setVoteOutPercentMilleThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"voteUnreadyPercentMilleThreshold","type":"uint32"}],"name":"setVoteUnreadyPercentMilleThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRegistryAdmin","type":"address"}],"name":"transferRegistryManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"subject","type":"address"}],"name":"voteOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"subject","type":"address"},{"internalType":"uint256","name":"voteExpiration","type":"uint256"}],"name":"voteUnready","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"votersStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405162004e0c38038062004e0c833981810160405260a08110156200003757600080fd5b508051602082015160408301516060840151608090940151929391929091908484818181816000620000686200015d565b600080546001600160a01b0319166001600160a01b03831690811782556040519293509160008051602062004dec833981519152908290a350600280546001600160a01b031916331790556001600160a01b0382166200010f576040805162461bcd60e51b815260206004820152601d60248201527f5f636f6e747261637452656769737472792063616e6e6f742062652030000000604482015290519081900360640190fd5b6200011a8262000161565b6200012581620002b9565b5050505050506200013c836200034a60201b60201c565b620001478162000465565b62000152826200059c565b50505050506200086a565b3390565b6200016b620006cb565b620001a85760405162461bcd60e51b815260040180806020018281038252603e81526020018062004c6c603e913960400191505060405180910390fd5b600354604080516301e32edf60e21b815290516001600160a01b039283169284169163078cbb7c916004808301926020929190829003018186803b158015620001f057600080fd5b505afa15801562000205573d6000803e3d6000fd5b505050506040513d60208110156200021c57600080fd5b50516001600160a01b031614620002655760405162461bcd60e51b815260040180806020018281038252604181526020018062004caa6041913960600191505060405180910390fd5b600380546001600160a01b0383166001600160a01b0319909116811790915560408051918252517ffea2d033438b968078a6264409d0104b5f3d2ce7b795afc74918e70f3534f22b9181900360200190a150565b6001600160a01b038116620003005760405162461bcd60e51b815260040180806020018281038252603481526020018062004db86034913960400191505060405180910390fd5b600080546040516001600160a01b038085169392169160008051602062004dec83398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082019091526011815270333ab731ba34b7b730b626b0b730b3b2b960791b60208201526200037d906200072c565b620003ba5760405162461bcd60e51b815260040180806020018281038252602481526020018062004d266024913960400191505060405180910390fd5b620186a063ffffffff82161115620004045760405162461bcd60e51b815260040180806020018281038252602f81526020018062004d89602f913960400191505060405180910390fd5b6009546040805163ffffffff8085168252909216602083015280517f5f1e6a4b65e5b155a39124570a9d52d1a94b94d17b9cefb044afd83367344f739281900390910190a16009805463ffffffff191663ffffffff92909216919091179055565b604080518082019091526011815270333ab731ba34b7b730b626b0b730b3b2b960791b602082015262000498906200072c565b620004d55760405162461bcd60e51b815260040180806020018281038252602481526020018062004d266024913960400191505060405180910390fd5b620186a063ffffffff821611156200051f5760405162461bcd60e51b815260040180806020018281038252603b81526020018062004ceb603b913960400191505060405180910390fd5b6009546040805163ffffffff848116825268010000000000000000909304909216602083015280517f1d5d5428459ec4611f1aa061bef9eeb6e83fb6f5408c6dc5c2f022ba9ef4715c9281900390910190a16009805463ffffffff909216680100000000000000000263ffffffff60401b19909216919091179055565b604080518082019091526011815270333ab731ba34b7b730b626b0b730b3b2b960791b6020820152620005cf906200072c565b6200060c5760405162461bcd60e51b815260040180806020018281038252602481526020018062004d266024913960400191505060405180910390fd5b620186a063ffffffff82161115620006565760405162461bcd60e51b815260040180806020018281038252603f81526020018062004d4a603f913960400191505060405180910390fd5b6009546040805163ffffffff8481168252640100000000909304909216602083015280517ff85225604b27cb71d925b3e5e40561ca03066d501e90ac8bfaa6784f1cd878679281900390910190a16009805463ffffffff9092166401000000000263ffffffff60201b19909216919091179055565b6000620006d76200084c565b6001600160a01b0316336001600160a01b03161480620007115750620006fc6200085b565b6001600160a01b0316336001600160a01b0316145b806200072757506003546001600160a01b031633145b905090565b6003546000906001600160a01b031662000745620006cb565b806200084557506001600160a01b03811615801590620008455750600354604051631ee441e960e01b815260206004820181815286516024840152865133946001600160a01b031693631ee441e99389939283926044019185019080838360005b83811015620007c0578181015183820152602001620007a6565b50505050905090810190601f168015620007ee5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156200080c57600080fd5b505afa15801562000821573d6000803e3d6000fd5b505050506040513d60208110156200083857600080fd5b50516001600160a01b0316145b9392505050565b6000546001600160a01b031690565b6002546001600160a01b031690565b6143f2806200087a6000396000f3fe608060405234801561001057600080fd5b50600436106102ad5760003560e01c8063a4e2d6341161017b578063d3705cb7116100d8578063e7366dc81161008c578063f27f3bb411610071578063f27f3bb414610957578063f83d08ba1461097d578063fcd13d6514610985576102ad565b8063e7366dc814610921578063eec0701f1461094f576102ad565b8063daa00faa116100bd578063daa00faa146108ad578063dfc8fdd0146108f3578063e4e9922214610919576102ad565b8063d3705cb714610864578063d55c9bcf14610887576102ad565b8063bac5e9911161012f578063ca0809c811610114578063ca0809c8146107e4578063cf30901214610854578063d25235261461085c576102ad565b8063bac5e99114610795578063c7af3a94146107b8576102ad565b8063ab8f6ffe11610160578063ab8f6ffe14610636578063acdb8e0414610785578063b364cc381461078d576102ad565b8063a4e2d63414610626578063a69df4b51461062e576102ad565b806348106fe31161022957806374c16b23116101dd578063868ca49d116101c2578063868ca49d146104a057806394470457146104a8578063a0774f7514610603576102ad565b806374c16b231461046857806385b4bb5314610470576102ad565b80635f94cd9c1161020e5780635f94cd9c14610402578063615c25451461040a57806361885df814610430576102ad565b806348106fe3146103f25780634fa293c3146103fa576102ad565b80631ee2960e116102805780632987cea0116102655780632987cea0146103a05780632a1fac72146103c6578063333df154146103ce576102ad565b80631ee2960e14610377578063245dcad314610398576102ad565b806302211f5e146102b257806307b490af146102ea578063090b7f1f146103125780631a0b2c4f1461035b575b600080fd5b6102d8600480360360208110156102c857600080fd5b50356001600160a01b03166109ab565b60408051918252519081900360200190f35b6103106004803603602081101561030057600080fd5b50356001600160a01b03166109fc565b005b6103406004803603604081101561032857600080fd5b506001600160a01b0381358116916020013516610d0f565b60408051921515835260208301919091528051918290030190f35b610363610d4e565b604080519115158252519081900360200190f35b61037f610d72565b6040805163ffffffff9092168252519081900360200190f35b610310610d86565b610310600480360360208110156103b657600080fd5b50356001600160a01b0316610deb565b610310610e68565b6103d6610f12565b604080516001600160a01b039092168252519081900360200190f35b610363610f21565b61037f610f31565b6103d6610f49565b6103d66004803603602081101561042057600080fd5b50356001600160a01b0316610f58565b6103106004803603608081101561044657600080fd5b506001600160a01b038135169060208101359060408101359060600135610f79565b6103d661114d565b61047861115c565b6040805163ffffffff9485168152928416602084015292168183015290519081900360600190f35b6103106111b4565b6104ce600480360360208110156104be57600080fd5b50356001600160a01b03166113d6565b60405180806020018060200180602001806020018715158152602001861515815260200185810385528b818151815260200191508051906020019060200280838360005b8381101561052a578181015183820152602001610512565b5050505090500185810384528a818151815260200191508051906020019060200280838360005b83811015610569578181015183820152602001610551565b50505050905001858103835289818151815260200191508051906020019060200280838360005b838110156105a8578181015183820152602001610590565b50505050905001858103825288818151815260200191508051906020019060200280838360005b838110156105e75781810151838201526020016105cf565b505050509050019a505050505050505050505060405180910390f35b6103106004803603602081101561061957600080fd5b503563ffffffff16611732565b610363611880565b6103106118a1565b61063e611984565b60405180806020018060200180602001806020018060200186810386528b818151815260200191508051906020019060200280838360005b8381101561068e578181015183820152602001610676565b5050505090500186810385528a818151815260200191508051906020019060200280838360005b838110156106cd5781810151838201526020016106b5565b50505050905001868103845289818151815260200191508051906020019060200280838360005b8381101561070c5781810151838201526020016106f4565b50505050905001868103835288818151815260200191508051906020019060200280838360005b8381101561074b578181015183820152602001610733565b5050505091909101878103835288518152885160209182019250818a019102808383600083156105e75781810151838201526020016105cf565b610310611ee9565b61037f611f8e565b610310600480360360208110156107ab57600080fd5b503563ffffffff16611f9a565b610310600480360360408110156107ce57600080fd5b506001600160a01b0381351690602001356120f0565b610310600480360360208110156107fa57600080fd5b81019060208101813564010000000081111561081557600080fd5b82018360208201111561082757600080fd5b8035906020019184602083028401116401000000008311171561084957600080fd5b509092509050612600565b61036361268e565b6103106126af565b6103106004803603602081101561087a57600080fd5b503563ffffffff16612737565b6103106004803603602081101561089d57600080fd5b50356001600160a01b0316612874565b6108d3600480360360208110156108c357600080fd5b50356001600160a01b03166129c2565b604080519315158452602084019290925282820152519081900360600190f35b6103636004803603602081101561090957600080fd5b50356001600160a01b0316612a79565b6103d6612c13565b6103106004803603604081101561093757600080fd5b506001600160a01b0381351690602001351515612c22565b610310612cff565b6102d86004803603602081101561096d57600080fd5b50356001600160a01b0316612e01565b610310612e13565b6103106004803603602081101561099b57600080fd5b50356001600160a01b0316612f0d565b6040805160608101825260095463ffffffff80821683526401000000008204811660208401526801000000000000000090910416918101919091526000906109f490839061308d565b509392505050565b60035474010000000000000000000000000000000000000000900460ff1615610a565760405162461bcd60e51b81526004018080602001828103825260258152602001806140e76025913960400191505060405180910390fd5b610a5e6140c6565b506040805160608101825260095463ffffffff808216835264010000000082048116602080850191909152680100000000000000009092041682840152336000818152600690925283822080546001600160a01b038781167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355955194959294921692909184917f275bb5f10bdccb6cea621dfabf75682103f2392a02061d953ebe212cfa26ef0e91a3600b54604080517f7c47c16d0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015291516000939290921691637c47c16d91602480820192602092909190829003018186803b158015610b7857600080fd5b505afa158015610b8c573d6000803e3d6000fd5b505050506040513d6020811015610ba257600080fd5b505190506001600160a01b038216610bd0576001600160a01b03831660009081526005602052604090208190555b6001600160a01b038516610bf8576001600160a01b0383166000908152600560205260408120555b600b54604080517fcf3b670b00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163cf3b670b916004808301926020929190829003018186803b158015610c5657600080fd5b505afa158015610c6a573d6000803e3d6000fd5b505050506040513d6020811015610c8057600080fd5b505190506001600160a01b03831615801590610cae5750856001600160a01b0316836001600160a01b031614155b15610cc157610cc18360008484896131ce565b6001600160a01b03861615610d07576000866001600160a01b0316846001600160a01b03161415610cf3576000610cf5565b825b9050610d0587826000858a6131ce565b505b505050505050565b6001600160a01b0380831660009081526004602090815260408083209385168352929052908120548015801590610d4557508042105b91509250929050565b600080546001600160a01b0316610d636133b4565b6001600160a01b031614905090565b600954640100000000900463ffffffff1690565b60035474010000000000000000000000000000000000000000900460ff1615610de05760405162461bcd60e51b81526004018080602001828103825260258152602001806140e76025913960400191505060405180910390fd5b610de9336133b8565b565b610df3610d4e565b610e2e5760405162461bcd60e51b81526004018080602001828103825260408152602001806143516040913960400191505060405180910390fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b610e70610f12565b6001600160a01b0316336001600160a01b031614610ebf5760405162461bcd60e51b81526004018080602001828103825260268152602001806141ed6026913960400191505060405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556040517f2a2b3ea974fb057582c3b210ef8b5f81492d15673f49d4384bfa3b896a964c3c90600090a1565b6002546001600160a01b031690565b6002546001600160a01b03161590565b60095468010000000000000000900463ffffffff1690565b6001546001600160a01b031690565b6001600160a01b03808216600090815260066020526040902054165b919050565b600b546001600160a01b03163314610fc25760405162461bcd60e51b81526004018080602001828103825260268152602001806142f76026913960400191505060405180910390fd5b60035474010000000000000000000000000000000000000000900460ff161561101c5760405162461bcd60e51b81526004018080602001828103825260258152602001806140e76025913960400191505060405180910390fd5b6110246140c6565b506040805160608101825260095463ffffffff8082168352640100000000820481166020840152680100000000000000009091041691810191909152600061106d858584613678565b604080518781526020810187905280820183905290519192506001600160a01b038816917fd5c5ef58495d970aa497140d952854435af4876c07e0735daaa3fc32874c3cf89181900360600190a2600a54604080517f68f52e500000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015260248201859052915191909216916368f52e5091604480830192600092919082900301818387803b15801561112957600080fd5b505af115801561113d573d6000803e3d6000fd5b50505050610d07868585856136e0565b6000546001600160a01b031690565b60008060006111696140c6565b50506040805160608101825260095463ffffffff8082168084526401000000008304821660208501819052680100000000000000009093049091169290930182905291949193509150565b60035474010000000000000000000000000000000000000000900460ff161561120e5760405162461bcd60e51b81526004018080602001828103825260258152602001806140e76025913960400191505060405180910390fd5b600c54604080517f10b3b29300000000000000000000000000000000000000000000000000000000815233600482015290516000926001600160a01b0316916310b3b293916024808301926020929190829003018186803b15801561127257600080fd5b505afa158015611286573d6000803e3d6000fd5b505050506040513d602081101561129c57600080fd5b505190506112a981613731565b156112fb576040805162461bcd60e51b815260206004820152601360248201527f63616c6c657220697320766f7465642d6f757400000000000000000000000000604482015290519081900360640190fd5b60408051600181526000602082015281516001600160a01b038416927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b1580156113a757600080fd5b505af11580156113bb573d6000803e3d6000fd5b505050506040513d60608110156113d157600080fd5b505050565b606080606080600080600a60009054906101000a90046001600160a01b03166001600160a01b031663ab8f6ffe6040518163ffffffff1660e01b815260040160006040518083038186803b15801561142d57600080fd5b505afa158015611441573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052606081101561148857600080fd5b81019080805160405193929190846401000000008211156114a857600080fd5b9083019060208201858111156114bd57600080fd5b82518660208202830111640100000000821117156114da57600080fd5b82525081516020918201928201910280838360005b838110156115075781810151838201526020016114ef565b505050509050016040526020018051604051939291908464010000000082111561153057600080fd5b90830190602082018581111561154557600080fd5b825186602082028301116401000000008211171561156257600080fd5b82525081516020918201928201910280838360005b8381101561158f578181015183820152602001611577565b50505050905001604052602001805160405193929190846401000000008211156115b857600080fd5b9083019060208201858111156115cd57600080fd5b82518660208202830111640100000000821117156115ea57600080fd5b82525081516020918201928201910280838360005b838110156116175781810151838201526020016115ff565b50505050905001604052505050809650819750829850505050855167ffffffffffffffff8111801561164857600080fd5b50604051908082528060200260200182016040528015611672578160200160208202803683370190505b50925060005b865181101561172857600087828151811061168f57fe5b6020908102919091018101516001600160a01b038082166000908152600484526040808220928e16825291909352909120549091504210156116ea5760018583815181106116d957fe5b911515602092830291909101909101525b886001600160a01b0316816001600160a01b0316141561171f576001935085828151811061171457fe5b602002602001015192505b50600101611678565b5091939550919395565b6117706040518060400160405280601181526020017f66756e6374696f6e616c4d616e6167657200000000000000000000000000000081525061374f565b6117ab5760405162461bcd60e51b81526004018080602001828103825260248152602001806142136024913960400191505060405180910390fd5b620186a063ffffffff821611156117f35760405162461bcd60e51b815260040180806020018281038252603f815260200180614237603f913960400191505060405180910390fd5b6009546040805163ffffffff8481168252640100000000909304909216602083015280517ff85225604b27cb71d925b3e5e40561ca03066d501e90ac8bfaa6784f1cd878679281900390910190a16009805463ffffffff909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff909216919091179055565b60035474010000000000000000000000000000000000000000900460ff1690565b6118a961114d565b6001600160a01b0316336001600160a01b031614806118e057506118cb612c13565b6001600160a01b0316336001600160a01b0316145b611931576040805162461bcd60e51b815260206004820152601a60248201527f63616c6c6572206973206e6f742061206c6f636b206f776e6572000000000000604482015290519081900360640190fd5b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f19aad37188a1d3921e29eb3c66acf43d81975e107cb650d58cca878627955fd690600090a1565b600c54600a54604080517fab8f6ffe000000000000000000000000000000000000000000000000000000008152905160609384938493849384936001600160a01b0390811693169163ab8f6ffe916004808301926000929190829003018186803b1580156119f157600080fd5b505afa158015611a05573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526060811015611a4c57600080fd5b8101908080516040519392919084640100000000821115611a6c57600080fd5b908301906020820185811115611a8157600080fd5b8251866020820283011164010000000082111715611a9e57600080fd5b82525081516020918201928201910280838360005b83811015611acb578181015183820152602001611ab3565b5050505090500160405260200180516040519392919084640100000000821115611af457600080fd5b908301906020820185811115611b0957600080fd5b8251866020820283011164010000000082111715611b2657600080fd5b82525081516020918201928201910280838360005b83811015611b53578181015183820152602001611b3b565b5050505090500160405260200180516040519392919084640100000000821115611b7c57600080fd5b908301906020820185811115611b9157600080fd5b8251866020820283011164010000000082111715611bae57600080fd5b82525081516020918201928201910280838360005b83811015611bdb578181015183820152602001611bc3565b505050509190910160408190527ffccea80d000000000000000000000000000000000000000000000000000000008152602060048201818152895160248401528951999f50979d50959a506001600160a01b0389169763fccea80d978f979096508695506044909201935081870192500280838360005b83811015611c6a578181015183820152602001611c52565b505050509050019250505060006040518083038186803b158015611c8d57600080fd5b505afa158015611ca1573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015611ce857600080fd5b8101908080516040519392919084640100000000821115611d0857600080fd5b908301906020820185811115611d1d57600080fd5b8251866020820283011164010000000082111715611d3a57600080fd5b82525081516020918201928201910280838360005b83811015611d67578181015183820152602001611d4f565b505050509050016040525050509350806001600160a01b031663c697a996876040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019060200280838360005b83811015611dd5578181015183820152602001611dbd565b505050509050019250505060006040518083038186803b158015611df857600080fd5b505afa158015611e0c573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015611e5357600080fd5b8101908080516040519392919084640100000000821115611e7357600080fd5b908301906020820185811115611e8857600080fd5b8251866020820283011164010000000082111715611ea557600080fd5b82525081516020918201928201910280838360005b83811015611ed2578181015183820152602001611eba565b505050509050016040525050509150509091929394565b611ef1610d4e565b611f2c5760405162461bcd60e51b81526004018080602001828103825260408152602001806143516040913960400191505060405180910390fd5b600080546040516001600160a01b03909116907f1f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60095463ffffffff1690565b611fd86040518060400160405280601181526020017f66756e6374696f6e616c4d616e6167657200000000000000000000000000000081525061374f565b6120135760405162461bcd60e51b81526004018080602001828103825260248152602001806142136024913960400191505060405180910390fd5b620186a063ffffffff8216111561205b5760405162461bcd60e51b815260040180806020018281038252603b8152602001806141b2603b913960400191505060405180910390fd5b6009546040805163ffffffff848116825268010000000000000000909304909216602083015280517f1d5d5428459ec4611f1aa061bef9eeb6e83fb6f5408c6dc5c2f022ba9ef4715c9281900390910190a16009805463ffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff909216919091179055565b60035474010000000000000000000000000000000000000000900460ff161561214a5760405162461bcd60e51b81526004018080602001828103825260258152602001806140e76025913960400191505060405180910390fd5b428110156121895760405162461bcd60e51b815260040180806020018281038252602c815260200180614391602c913960400191505060405180910390fd5b600c54604080517f10b3b29300000000000000000000000000000000000000000000000000000000815233600482015290516000926001600160a01b0316916310b3b293916024808301926020929190829003018186803b1580156121ed57600080fd5b505afa158015612201573d6000803e3d6000fd5b505050506040513d602081101561221757600080fd5b50516001600160a01b0380821660008181526004602090815260408083209489168084529482529182902087905581518781529151949550929391927fcb530db56313ef43bf663c10381c044eada437428b9644aabfff5f46b6f6605b92918290030190a36060806060600a60009054906101000a90046001600160a01b03166001600160a01b031663ab8f6ffe6040518163ffffffff1660e01b815260040160006040518083038186803b1580156122cf57600080fd5b505afa1580156122e3573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052606081101561232a57600080fd5b810190808051604051939291908464010000000082111561234a57600080fd5b90830190602082018581111561235f57600080fd5b825186602082028301116401000000008211171561237c57600080fd5b82525081516020918201928201910280838360005b838110156123a9578181015183820152602001612391565b50505050905001604052602001805160405193929190846401000000008211156123d257600080fd5b9083019060208201858111156123e757600080fd5b825186602082028301116401000000008211171561240457600080fd5b82525081516020918201928201910280838360005b83811015612431578181015183820152602001612419565b505050509050016040526020018051604051939291908464010000000082111561245a57600080fd5b90830190602082018581111561246f57600080fd5b825186602082028301116401000000008211171561248c57600080fd5b82525081516020918201928201910280838360005b838110156124b95781810151838201526020016124a1565b5050505090500160405250505092509250925060006124da8484848a61387d565b90508015610d05576124ec8488613aab565b6040516001600160a01b038816907fc808d7f6285926a53d708653414e2d2a88e3c1715debb80fb09ca41d744e5ba690600090a2604080516000808252602082015281516001600160a01b038a16927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b1580156125cb57600080fd5b505af11580156125df573d6000803e3d6000fd5b505050506040513d60608110156125f557600080fd5b505050505050505050565b612608610f12565b6001600160a01b0316336001600160a01b0316146126575760405162461bcd60e51b81526004018080602001828103825260268152602001806141ed6026913960400191505060405180910390fd5b60005b818110156113d15761268683838381811061267157fe5b905060200201356001600160a01b03166133b8565b60010161265a565b60035474010000000000000000000000000000000000000000900460ff1681565b6001546001600160a01b031633146126f85760405162461bcd60e51b815260040180806020018281038252602781526020018061418b6027913960400191505060405180910390fd5b60015461270d906001600160a01b0316613b06565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6127756040518060400160405280601181526020017f66756e6374696f6e616c4d616e6167657200000000000000000000000000000081525061374f565b6127b05760405162461bcd60e51b81526004018080602001828103825260248152602001806142136024913960400191505060405180910390fd5b620186a063ffffffff821611156127f85760405162461bcd60e51b815260040180806020018281038252602f8152602001806142a7602f913960400191505060405180910390fd5b6009546040805163ffffffff8085168252909216602083015280517f5f1e6a4b65e5b155a39124570a9d52d1a94b94d17b9cefb044afd83367344f739281900390910190a1600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff92909216919091179055565b600c546001600160a01b031633146128bd5760405162461bcd60e51b81526004018080602001828103825260318152602001806142766031913960400191505060405180910390fd5b60035474010000000000000000000000000000000000000000900460ff16156129175760405162461bcd60e51b81526004018080602001828103825260258152602001806140e76025913960400191505060405180910390fd5b604080516000808252602082015281516001600160a01b038416927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b1580156113a757600080fd5b60008060006129d084613731565b6001600160a01b0380861660009081526007602090815260409182902054600b5483517fcf3b670b00000000000000000000000000000000000000000000000000000000815293519598509096509092169263cf3b670b92600480840193919291829003018186803b158015612a4557600080fd5b505afa158015612a59573d6000803e3d6000fd5b505050506040513d6020811015612a6f57600080fd5b5051929491935050565b600c54604080517f10b3b2930000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152915160009392909216916310b3b29391602480820192602092909190829003018186803b158015612ae357600080fd5b505afa158015612af7573d6000803e3d6000fd5b505050506040513d6020811015612b0d57600080fd5b50519150612b1a82613731565b15612b2757506000610f74565b6040805160608101825260095463ffffffff8082168352640100000000820481166020840152680100000000000000009091041691810191909152600090612b7090849061308d565b50600a54604080517f2e983ab00000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015260248201859052915193955091169250632e983ab0916044808301926020929190829003018186803b158015612be057600080fd5b505afa158015612bf4573d6000803e3d6000fd5b505050506040513d6020811015612c0a57600080fd5b50519392505050565b6003546001600160a01b031690565b60035474010000000000000000000000000000000000000000900460ff1615612c7c5760405162461bcd60e51b81526004018080602001828103825260258152602001806140e76025913960400191505060405180910390fd5b600a54604080517fe66b9c1d0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015284151560248301529151919092169163e66b9c1d91604480830192600092919082900301818387803b158015612ceb57600080fd5b505af1158015610d07573d6000803e3d6000fd5b612d07613bbe565b600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055612d47613c7f565b600b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055612d87613d0f565b600c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055612dc7613d9f565b600d80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60056020526000908152604090205481565b612e1b61114d565b6001600160a01b0316336001600160a01b03161480612e525750612e3d612c13565b6001600160a01b0316336001600160a01b0316145b612ea3576040805162461bcd60e51b815260206004820152601a60248201527f63616c6c6572206973206e6f742061206c6f636b206f776e6572000000000000604482015290519081900360640190fd5b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f0f2e5b6c72c6a4491efd919a9f9a409f324ef0708c11ee57d410c2cb06c0992b90600090a1565b612f15613e2f565b612f505760405162461bcd60e51b815260040180806020018281038252603e81526020018061410c603e913960400191505060405180910390fd5b600354604080517f078cbb7c00000000000000000000000000000000000000000000000000000000815290516001600160a01b039283169284169163078cbb7c916004808301926020929190829003018186803b158015612fb057600080fd5b505afa158015612fc4573d6000803e3d6000fd5b505050506040513d6020811015612fda57600080fd5b50516001600160a01b0316146130215760405162461bcd60e51b815260040180806020018281038252604181526020018061414a6041913960600191505060405180910390fd5b600380546001600160a01b0383167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517ffea2d033438b968078a6264409d0104b5f3d2ce7b795afc74918e70f3534f22b9181900360200190a150565b600b54604080517ffab46d660000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301528251600094859485949390911692839263fab46d6692602480840193919291829003018186803b1580156130fa57600080fd5b505afa15801561310e573d6000803e3d6000fd5b505050506040513d604081101561312457600080fd5b50602090810151604080517f7c47c16d0000000000000000000000000000000000000000000000000000000081526001600160a01b038a81166004830152915192975090841692637c47c16d92602480840193829003018186803b15801561318b57600080fd5b505afa15801561319f573d6000803e3d6000fd5b505050506040513d60208110156131b557600080fd5b505191506131c4848387613678565b9250509250925092565b6131d785613731565b156131e1576133ad565b6001600160a01b03851660009081526007602052604081205461321090869061320a9087613e8a565b90613ed5565b90506000808411801561324b575061323b84846040015163ffffffff16613f2f90919063ffffffff16565b61324883620186a0613f2f565b10155b90508015613392576001600160a01b03871660008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f0bc20ba748c0b7a01e134c521b1e20764a53c3a6b4710a54cbbcf6c8bb3ba3079190a2604080516000808252602082015281516001600160a01b038a16927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b15801561336557600080fd5b505af1158015613379573d6000803e3d6000fd5b505050506040513d606081101561338f57600080fd5b50505b506001600160a01b0386166000908152600760205260409020555b5050505050565b3390565b600c54604080517f10b3b2930000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152915191909216916310b3b293916024808301926020929190829003018186803b15801561341e57600080fd5b505afa158015613432573d6000803e3d6000fd5b505050506040513d602081101561344857600080fd5b5051905061345581613731565b156134a7576040805162461bcd60e51b815260206004820152601360248201527f63616c6c657220697320766f7465642d6f757400000000000000000000000000604482015290519081900360640190fd5b604080516001808252602082015281516001600160a01b038416927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a26040805160608101825260095463ffffffff808216835264010000000082048116602084015268010000000000000000909104169181019190915260009061353390839061308d565b50600a54600d54604080517fdc8b6d730000000000000000000000000000000000000000000000000000000081526001600160a01b0388811660048301529151949650928116945063e272079f93879387939092169163dc8b6d73916024808301926020929190829003018186803b1580156135ae57600080fd5b505afa1580156135c2573d6000803e3d6000fd5b505050506040513d60208110156135d857600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526001600160a01b0390941660048501526024840192909252151560448301525160648083019260209291908290030181600087803b15801561364857600080fd5b505af115801561365c573d6000803e3d6000fd5b505050506040513d602081101561367257600080fd5b50505050565b6000613697826000015163ffffffff1684613f2f90919063ffffffff16565b6136a485620186a0613f2f565b106136b05750816136d9565b81516136d69063ffffffff908116906136d0908790620186a090613f2f16565b90613f88565b90505b9392505050565b6001600160a01b0380851660009081526006602052604090205416806137065750613672565b6001600160a01b0385166000908152600560205260409020805490859055610d0782868387876131ce565b6001600160a01b031660009081526008602052604090205460ff1690565b6003546000906001600160a01b0316613766613e2f565b806136d957506001600160a01b038116158015906136d957506003546040517f1ee441e900000000000000000000000000000000000000000000000000000000815260206004820181815286516024840152865133946001600160a01b031693631ee441e99389939283926044019185019080838360005b838110156137f65781810151838201526020016137de565b50505050905090810190601f1680156138235780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561384057600080fd5b505afa158015613854573d6000803e3d6000fd5b505050506040513d602081101561386a57600080fd5b50516001600160a01b0316149392505050565b60006138876140c6565b506040805160608101825260095463ffffffff80821683526401000000008204811660208401526801000000000000000090910416918101919091526000808080808080805b8d51811015613a1a578d81815181106138e257fe5b602002602001015193508c81815181106138f857fe5b602002602001015192508a6001600160a01b0316846001600160a01b031614801561393357508b818151811061392a57fe5b60200260200101515b1561393d57600191505b6139478884613ed5565b97508b818151811061395557fe5b60200260200101511561396f5761396c8684613ed5565b95505b60008061397c868e610d0f565b9150915081156139bd576139908986613ed5565b98508d838151811061399e57fe5b6020026020010151156139b8576139b58786613ed5565b96505b613a10565b8015613a105760046000876001600160a01b03166001600160a01b0316815260200190815260200160002060008e6001600160a01b03166001600160a01b03168152602001908152602001600020600090555b50506001016138cd565b50600087118015613a535750613a4387896020015163ffffffff16613f2f90919063ffffffff16565b613a5087620186a0613f2f565b10155b80613a9a5750808015613a665750600085115b8015613a9a5750613a8a85896020015163ffffffff16613f2f90919063ffffffff16565b613a9785620186a0613f2f565b10155b9d9c50505050505050505050505050565b60005b82518110156113d157600060046000858481518110613ac957fe5b6020908102919091018101516001600160a01b03908116835282820193909352604091820160009081209387168152929052902055600101613aae565b6001600160a01b038116613b4b5760405162461bcd60e51b815260040180806020018281038252603481526020018061431d6034913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f1f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e91a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052600960248301527f636f6d6d69747465650000000000000000000000000000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613c4e57600080fd5b505afa158015613c62573d6000803e3d6000fd5b505050506040513d6020811015613c7857600080fd5b5051905090565b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052600b60248301527f64656c65676174696f6e73000000000000000000000000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613c4e57600080fd5b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052601560248301527f677561726469616e73526567697374726174696f6e0000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613c4e57600080fd5b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052600d60248301527f63657274696669636174696f6e00000000000000000000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613c4e57600080fd5b6000613e3961114d565b6001600160a01b0316336001600160a01b03161480613e705750613e5b610f12565b6001600160a01b0316336001600160a01b0316145b80613e8557506003546001600160a01b031633145b905090565b6000613ecc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613fca565b90505b92915050565b600082820183811015613ecc576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082613f3e57506000613ecf565b82820282848281613f4b57fe5b0414613ecc5760405162461bcd60e51b81526004018080602001828103825260218152602001806142d66021913960400191505060405180910390fd5b6000613ecc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614061565b600081848411156140595760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561401e578181015183820152602001614006565b50505050905090810190601f16801561404b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836140b05760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561401e578181015183820152602001614006565b5060008385816140bc57fe5b0495945050505050565b60408051606081018252600080825260208201819052918101919091529056fe636f6e7472616374206973206c6f636b656420666f722074686973206f7065726174696f6e73656e646572206973206e6f7420616e2061646d696e202872656769737472794d616e676572206f7220696e697469616c697a6174696f6e41646d696e296e657720636f6e7472616374207265676973747279206d7573742070726f76696465207468652070726576696f757320636f6e747261637420726567697374727943616c6c6572206973206e6f74207468652070656e64696e6720726567697374727941646d696e766f74654f757450657263656e744d696c6c655468726573686f6c64206d757374206e6f74206265206c6172676572207468616e2031303030303073656e646572206973206e6f742074686520696e697469616c697a6174696f6e2061646d696e73656e646572206973206e6f74207468652066756e6374696f6e616c206d616e61676572766f7465556e726561647950657263656e744d696c6c655468726573686f6c64206d757374206e6f74206265206c6172676572207468616e2031303030303063616c6c6572206973206e6f742074686520677561726469616e20726567697374726174696f6e7320636f6e74726163746d696e53656c665374616b6550657263656e744d696c6c65206d75737420626520313030303030206174206d6f7374536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7763616c6c6572206973206e6f74207468652064656c65676174696f6e7320636f6e7472616374526567697374727941646d696e3a206e657720726567697374727941646d696e20697320746865207a65726f206164647265737357697468436c61696d61626c6552656769737472794d616e6167656d656e743a2063616c6c6572206973206e6f742074686520726567697374727941646d696e766f74652065787069726174696f6e2074696d65206d757374206e6f7420626520696e207468652070617374a2646970667358221220c3ca483dbb96e8549753f7683a38b72d05867935aff013e8a6570d02dbe2df8364736f6c634300060c003373656e646572206973206e6f7420616e2061646d696e202872656769737472794d616e676572206f7220696e697469616c697a6174696f6e41646d696e296e657720636f6e7472616374207265676973747279206d7573742070726f76696465207468652070726576696f757320636f6e7472616374207265676973747279766f74654f757450657263656e744d696c6c655468726573686f6c64206d757374206e6f74206265206c6172676572207468616e2031303030303073656e646572206973206e6f74207468652066756e6374696f6e616c206d616e61676572766f7465556e726561647950657263656e744d696c6c655468726573686f6c64206d757374206e6f74206265206c6172676572207468616e203130303030306d696e53656c665374616b6550657263656e744d696c6c65206d75737420626520313030303030206174206d6f7374526567697374727941646d696e3a206e657720726567697374727941646d696e20697320746865207a65726f20616464726573731f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e0000000000000000000000005454223e3078db87e55a15be541cc925f3702eb0000000000000000000000000628e8c4d1611ed5b748f59f5ce694809af2f91d40000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000111700000000000000000000000000000000000000000000000000000000000011170
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102ad5760003560e01c8063a4e2d6341161017b578063d3705cb7116100d8578063e7366dc81161008c578063f27f3bb411610071578063f27f3bb414610957578063f83d08ba1461097d578063fcd13d6514610985576102ad565b8063e7366dc814610921578063eec0701f1461094f576102ad565b8063daa00faa116100bd578063daa00faa146108ad578063dfc8fdd0146108f3578063e4e9922214610919576102ad565b8063d3705cb714610864578063d55c9bcf14610887576102ad565b8063bac5e9911161012f578063ca0809c811610114578063ca0809c8146107e4578063cf30901214610854578063d25235261461085c576102ad565b8063bac5e99114610795578063c7af3a94146107b8576102ad565b8063ab8f6ffe11610160578063ab8f6ffe14610636578063acdb8e0414610785578063b364cc381461078d576102ad565b8063a4e2d63414610626578063a69df4b51461062e576102ad565b806348106fe31161022957806374c16b23116101dd578063868ca49d116101c2578063868ca49d146104a057806394470457146104a8578063a0774f7514610603576102ad565b806374c16b231461046857806385b4bb5314610470576102ad565b80635f94cd9c1161020e5780635f94cd9c14610402578063615c25451461040a57806361885df814610430576102ad565b806348106fe3146103f25780634fa293c3146103fa576102ad565b80631ee2960e116102805780632987cea0116102655780632987cea0146103a05780632a1fac72146103c6578063333df154146103ce576102ad565b80631ee2960e14610377578063245dcad314610398576102ad565b806302211f5e146102b257806307b490af146102ea578063090b7f1f146103125780631a0b2c4f1461035b575b600080fd5b6102d8600480360360208110156102c857600080fd5b50356001600160a01b03166109ab565b60408051918252519081900360200190f35b6103106004803603602081101561030057600080fd5b50356001600160a01b03166109fc565b005b6103406004803603604081101561032857600080fd5b506001600160a01b0381358116916020013516610d0f565b60408051921515835260208301919091528051918290030190f35b610363610d4e565b604080519115158252519081900360200190f35b61037f610d72565b6040805163ffffffff9092168252519081900360200190f35b610310610d86565b610310600480360360208110156103b657600080fd5b50356001600160a01b0316610deb565b610310610e68565b6103d6610f12565b604080516001600160a01b039092168252519081900360200190f35b610363610f21565b61037f610f31565b6103d6610f49565b6103d66004803603602081101561042057600080fd5b50356001600160a01b0316610f58565b6103106004803603608081101561044657600080fd5b506001600160a01b038135169060208101359060408101359060600135610f79565b6103d661114d565b61047861115c565b6040805163ffffffff9485168152928416602084015292168183015290519081900360600190f35b6103106111b4565b6104ce600480360360208110156104be57600080fd5b50356001600160a01b03166113d6565b60405180806020018060200180602001806020018715158152602001861515815260200185810385528b818151815260200191508051906020019060200280838360005b8381101561052a578181015183820152602001610512565b5050505090500185810384528a818151815260200191508051906020019060200280838360005b83811015610569578181015183820152602001610551565b50505050905001858103835289818151815260200191508051906020019060200280838360005b838110156105a8578181015183820152602001610590565b50505050905001858103825288818151815260200191508051906020019060200280838360005b838110156105e75781810151838201526020016105cf565b505050509050019a505050505050505050505060405180910390f35b6103106004803603602081101561061957600080fd5b503563ffffffff16611732565b610363611880565b6103106118a1565b61063e611984565b60405180806020018060200180602001806020018060200186810386528b818151815260200191508051906020019060200280838360005b8381101561068e578181015183820152602001610676565b5050505090500186810385528a818151815260200191508051906020019060200280838360005b838110156106cd5781810151838201526020016106b5565b50505050905001868103845289818151815260200191508051906020019060200280838360005b8381101561070c5781810151838201526020016106f4565b50505050905001868103835288818151815260200191508051906020019060200280838360005b8381101561074b578181015183820152602001610733565b5050505091909101878103835288518152885160209182019250818a019102808383600083156105e75781810151838201526020016105cf565b610310611ee9565b61037f611f8e565b610310600480360360208110156107ab57600080fd5b503563ffffffff16611f9a565b610310600480360360408110156107ce57600080fd5b506001600160a01b0381351690602001356120f0565b610310600480360360208110156107fa57600080fd5b81019060208101813564010000000081111561081557600080fd5b82018360208201111561082757600080fd5b8035906020019184602083028401116401000000008311171561084957600080fd5b509092509050612600565b61036361268e565b6103106126af565b6103106004803603602081101561087a57600080fd5b503563ffffffff16612737565b6103106004803603602081101561089d57600080fd5b50356001600160a01b0316612874565b6108d3600480360360208110156108c357600080fd5b50356001600160a01b03166129c2565b604080519315158452602084019290925282820152519081900360600190f35b6103636004803603602081101561090957600080fd5b50356001600160a01b0316612a79565b6103d6612c13565b6103106004803603604081101561093757600080fd5b506001600160a01b0381351690602001351515612c22565b610310612cff565b6102d86004803603602081101561096d57600080fd5b50356001600160a01b0316612e01565b610310612e13565b6103106004803603602081101561099b57600080fd5b50356001600160a01b0316612f0d565b6040805160608101825260095463ffffffff80821683526401000000008204811660208401526801000000000000000090910416918101919091526000906109f490839061308d565b509392505050565b60035474010000000000000000000000000000000000000000900460ff1615610a565760405162461bcd60e51b81526004018080602001828103825260258152602001806140e76025913960400191505060405180910390fd5b610a5e6140c6565b506040805160608101825260095463ffffffff808216835264010000000082048116602080850191909152680100000000000000009092041682840152336000818152600690925283822080546001600160a01b038781167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355955194959294921692909184917f275bb5f10bdccb6cea621dfabf75682103f2392a02061d953ebe212cfa26ef0e91a3600b54604080517f7c47c16d0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015291516000939290921691637c47c16d91602480820192602092909190829003018186803b158015610b7857600080fd5b505afa158015610b8c573d6000803e3d6000fd5b505050506040513d6020811015610ba257600080fd5b505190506001600160a01b038216610bd0576001600160a01b03831660009081526005602052604090208190555b6001600160a01b038516610bf8576001600160a01b0383166000908152600560205260408120555b600b54604080517fcf3b670b00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163cf3b670b916004808301926020929190829003018186803b158015610c5657600080fd5b505afa158015610c6a573d6000803e3d6000fd5b505050506040513d6020811015610c8057600080fd5b505190506001600160a01b03831615801590610cae5750856001600160a01b0316836001600160a01b031614155b15610cc157610cc18360008484896131ce565b6001600160a01b03861615610d07576000866001600160a01b0316846001600160a01b03161415610cf3576000610cf5565b825b9050610d0587826000858a6131ce565b505b505050505050565b6001600160a01b0380831660009081526004602090815260408083209385168352929052908120548015801590610d4557508042105b91509250929050565b600080546001600160a01b0316610d636133b4565b6001600160a01b031614905090565b600954640100000000900463ffffffff1690565b60035474010000000000000000000000000000000000000000900460ff1615610de05760405162461bcd60e51b81526004018080602001828103825260258152602001806140e76025913960400191505060405180910390fd5b610de9336133b8565b565b610df3610d4e565b610e2e5760405162461bcd60e51b81526004018080602001828103825260408152602001806143516040913960400191505060405180910390fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b610e70610f12565b6001600160a01b0316336001600160a01b031614610ebf5760405162461bcd60e51b81526004018080602001828103825260268152602001806141ed6026913960400191505060405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556040517f2a2b3ea974fb057582c3b210ef8b5f81492d15673f49d4384bfa3b896a964c3c90600090a1565b6002546001600160a01b031690565b6002546001600160a01b03161590565b60095468010000000000000000900463ffffffff1690565b6001546001600160a01b031690565b6001600160a01b03808216600090815260066020526040902054165b919050565b600b546001600160a01b03163314610fc25760405162461bcd60e51b81526004018080602001828103825260268152602001806142f76026913960400191505060405180910390fd5b60035474010000000000000000000000000000000000000000900460ff161561101c5760405162461bcd60e51b81526004018080602001828103825260258152602001806140e76025913960400191505060405180910390fd5b6110246140c6565b506040805160608101825260095463ffffffff8082168352640100000000820481166020840152680100000000000000009091041691810191909152600061106d858584613678565b604080518781526020810187905280820183905290519192506001600160a01b038816917fd5c5ef58495d970aa497140d952854435af4876c07e0735daaa3fc32874c3cf89181900360600190a2600a54604080517f68f52e500000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015260248201859052915191909216916368f52e5091604480830192600092919082900301818387803b15801561112957600080fd5b505af115801561113d573d6000803e3d6000fd5b50505050610d07868585856136e0565b6000546001600160a01b031690565b60008060006111696140c6565b50506040805160608101825260095463ffffffff8082168084526401000000008304821660208501819052680100000000000000009093049091169290930182905291949193509150565b60035474010000000000000000000000000000000000000000900460ff161561120e5760405162461bcd60e51b81526004018080602001828103825260258152602001806140e76025913960400191505060405180910390fd5b600c54604080517f10b3b29300000000000000000000000000000000000000000000000000000000815233600482015290516000926001600160a01b0316916310b3b293916024808301926020929190829003018186803b15801561127257600080fd5b505afa158015611286573d6000803e3d6000fd5b505050506040513d602081101561129c57600080fd5b505190506112a981613731565b156112fb576040805162461bcd60e51b815260206004820152601360248201527f63616c6c657220697320766f7465642d6f757400000000000000000000000000604482015290519081900360640190fd5b60408051600181526000602082015281516001600160a01b038416927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b1580156113a757600080fd5b505af11580156113bb573d6000803e3d6000fd5b505050506040513d60608110156113d157600080fd5b505050565b606080606080600080600a60009054906101000a90046001600160a01b03166001600160a01b031663ab8f6ffe6040518163ffffffff1660e01b815260040160006040518083038186803b15801561142d57600080fd5b505afa158015611441573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052606081101561148857600080fd5b81019080805160405193929190846401000000008211156114a857600080fd5b9083019060208201858111156114bd57600080fd5b82518660208202830111640100000000821117156114da57600080fd5b82525081516020918201928201910280838360005b838110156115075781810151838201526020016114ef565b505050509050016040526020018051604051939291908464010000000082111561153057600080fd5b90830190602082018581111561154557600080fd5b825186602082028301116401000000008211171561156257600080fd5b82525081516020918201928201910280838360005b8381101561158f578181015183820152602001611577565b50505050905001604052602001805160405193929190846401000000008211156115b857600080fd5b9083019060208201858111156115cd57600080fd5b82518660208202830111640100000000821117156115ea57600080fd5b82525081516020918201928201910280838360005b838110156116175781810151838201526020016115ff565b50505050905001604052505050809650819750829850505050855167ffffffffffffffff8111801561164857600080fd5b50604051908082528060200260200182016040528015611672578160200160208202803683370190505b50925060005b865181101561172857600087828151811061168f57fe5b6020908102919091018101516001600160a01b038082166000908152600484526040808220928e16825291909352909120549091504210156116ea5760018583815181106116d957fe5b911515602092830291909101909101525b886001600160a01b0316816001600160a01b0316141561171f576001935085828151811061171457fe5b602002602001015192505b50600101611678565b5091939550919395565b6117706040518060400160405280601181526020017f66756e6374696f6e616c4d616e6167657200000000000000000000000000000081525061374f565b6117ab5760405162461bcd60e51b81526004018080602001828103825260248152602001806142136024913960400191505060405180910390fd5b620186a063ffffffff821611156117f35760405162461bcd60e51b815260040180806020018281038252603f815260200180614237603f913960400191505060405180910390fd5b6009546040805163ffffffff8481168252640100000000909304909216602083015280517ff85225604b27cb71d925b3e5e40561ca03066d501e90ac8bfaa6784f1cd878679281900390910190a16009805463ffffffff909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff909216919091179055565b60035474010000000000000000000000000000000000000000900460ff1690565b6118a961114d565b6001600160a01b0316336001600160a01b031614806118e057506118cb612c13565b6001600160a01b0316336001600160a01b0316145b611931576040805162461bcd60e51b815260206004820152601a60248201527f63616c6c6572206973206e6f742061206c6f636b206f776e6572000000000000604482015290519081900360640190fd5b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f19aad37188a1d3921e29eb3c66acf43d81975e107cb650d58cca878627955fd690600090a1565b600c54600a54604080517fab8f6ffe000000000000000000000000000000000000000000000000000000008152905160609384938493849384936001600160a01b0390811693169163ab8f6ffe916004808301926000929190829003018186803b1580156119f157600080fd5b505afa158015611a05573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526060811015611a4c57600080fd5b8101908080516040519392919084640100000000821115611a6c57600080fd5b908301906020820185811115611a8157600080fd5b8251866020820283011164010000000082111715611a9e57600080fd5b82525081516020918201928201910280838360005b83811015611acb578181015183820152602001611ab3565b5050505090500160405260200180516040519392919084640100000000821115611af457600080fd5b908301906020820185811115611b0957600080fd5b8251866020820283011164010000000082111715611b2657600080fd5b82525081516020918201928201910280838360005b83811015611b53578181015183820152602001611b3b565b5050505090500160405260200180516040519392919084640100000000821115611b7c57600080fd5b908301906020820185811115611b9157600080fd5b8251866020820283011164010000000082111715611bae57600080fd5b82525081516020918201928201910280838360005b83811015611bdb578181015183820152602001611bc3565b505050509190910160408190527ffccea80d000000000000000000000000000000000000000000000000000000008152602060048201818152895160248401528951999f50979d50959a506001600160a01b0389169763fccea80d978f979096508695506044909201935081870192500280838360005b83811015611c6a578181015183820152602001611c52565b505050509050019250505060006040518083038186803b158015611c8d57600080fd5b505afa158015611ca1573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015611ce857600080fd5b8101908080516040519392919084640100000000821115611d0857600080fd5b908301906020820185811115611d1d57600080fd5b8251866020820283011164010000000082111715611d3a57600080fd5b82525081516020918201928201910280838360005b83811015611d67578181015183820152602001611d4f565b505050509050016040525050509350806001600160a01b031663c697a996876040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019060200280838360005b83811015611dd5578181015183820152602001611dbd565b505050509050019250505060006040518083038186803b158015611df857600080fd5b505afa158015611e0c573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015611e5357600080fd5b8101908080516040519392919084640100000000821115611e7357600080fd5b908301906020820185811115611e8857600080fd5b8251866020820283011164010000000082111715611ea557600080fd5b82525081516020918201928201910280838360005b83811015611ed2578181015183820152602001611eba565b505050509050016040525050509150509091929394565b611ef1610d4e565b611f2c5760405162461bcd60e51b81526004018080602001828103825260408152602001806143516040913960400191505060405180910390fd5b600080546040516001600160a01b03909116907f1f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60095463ffffffff1690565b611fd86040518060400160405280601181526020017f66756e6374696f6e616c4d616e6167657200000000000000000000000000000081525061374f565b6120135760405162461bcd60e51b81526004018080602001828103825260248152602001806142136024913960400191505060405180910390fd5b620186a063ffffffff8216111561205b5760405162461bcd60e51b815260040180806020018281038252603b8152602001806141b2603b913960400191505060405180910390fd5b6009546040805163ffffffff848116825268010000000000000000909304909216602083015280517f1d5d5428459ec4611f1aa061bef9eeb6e83fb6f5408c6dc5c2f022ba9ef4715c9281900390910190a16009805463ffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff909216919091179055565b60035474010000000000000000000000000000000000000000900460ff161561214a5760405162461bcd60e51b81526004018080602001828103825260258152602001806140e76025913960400191505060405180910390fd5b428110156121895760405162461bcd60e51b815260040180806020018281038252602c815260200180614391602c913960400191505060405180910390fd5b600c54604080517f10b3b29300000000000000000000000000000000000000000000000000000000815233600482015290516000926001600160a01b0316916310b3b293916024808301926020929190829003018186803b1580156121ed57600080fd5b505afa158015612201573d6000803e3d6000fd5b505050506040513d602081101561221757600080fd5b50516001600160a01b0380821660008181526004602090815260408083209489168084529482529182902087905581518781529151949550929391927fcb530db56313ef43bf663c10381c044eada437428b9644aabfff5f46b6f6605b92918290030190a36060806060600a60009054906101000a90046001600160a01b03166001600160a01b031663ab8f6ffe6040518163ffffffff1660e01b815260040160006040518083038186803b1580156122cf57600080fd5b505afa1580156122e3573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052606081101561232a57600080fd5b810190808051604051939291908464010000000082111561234a57600080fd5b90830190602082018581111561235f57600080fd5b825186602082028301116401000000008211171561237c57600080fd5b82525081516020918201928201910280838360005b838110156123a9578181015183820152602001612391565b50505050905001604052602001805160405193929190846401000000008211156123d257600080fd5b9083019060208201858111156123e757600080fd5b825186602082028301116401000000008211171561240457600080fd5b82525081516020918201928201910280838360005b83811015612431578181015183820152602001612419565b505050509050016040526020018051604051939291908464010000000082111561245a57600080fd5b90830190602082018581111561246f57600080fd5b825186602082028301116401000000008211171561248c57600080fd5b82525081516020918201928201910280838360005b838110156124b95781810151838201526020016124a1565b5050505090500160405250505092509250925060006124da8484848a61387d565b90508015610d05576124ec8488613aab565b6040516001600160a01b038816907fc808d7f6285926a53d708653414e2d2a88e3c1715debb80fb09ca41d744e5ba690600090a2604080516000808252602082015281516001600160a01b038a16927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b1580156125cb57600080fd5b505af11580156125df573d6000803e3d6000fd5b505050506040513d60608110156125f557600080fd5b505050505050505050565b612608610f12565b6001600160a01b0316336001600160a01b0316146126575760405162461bcd60e51b81526004018080602001828103825260268152602001806141ed6026913960400191505060405180910390fd5b60005b818110156113d15761268683838381811061267157fe5b905060200201356001600160a01b03166133b8565b60010161265a565b60035474010000000000000000000000000000000000000000900460ff1681565b6001546001600160a01b031633146126f85760405162461bcd60e51b815260040180806020018281038252602781526020018061418b6027913960400191505060405180910390fd5b60015461270d906001600160a01b0316613b06565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6127756040518060400160405280601181526020017f66756e6374696f6e616c4d616e6167657200000000000000000000000000000081525061374f565b6127b05760405162461bcd60e51b81526004018080602001828103825260248152602001806142136024913960400191505060405180910390fd5b620186a063ffffffff821611156127f85760405162461bcd60e51b815260040180806020018281038252602f8152602001806142a7602f913960400191505060405180910390fd5b6009546040805163ffffffff8085168252909216602083015280517f5f1e6a4b65e5b155a39124570a9d52d1a94b94d17b9cefb044afd83367344f739281900390910190a1600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff92909216919091179055565b600c546001600160a01b031633146128bd5760405162461bcd60e51b81526004018080602001828103825260318152602001806142766031913960400191505060405180910390fd5b60035474010000000000000000000000000000000000000000900460ff16156129175760405162461bcd60e51b81526004018080602001828103825260258152602001806140e76025913960400191505060405180910390fd5b604080516000808252602082015281516001600160a01b038416927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b1580156113a757600080fd5b60008060006129d084613731565b6001600160a01b0380861660009081526007602090815260409182902054600b5483517fcf3b670b00000000000000000000000000000000000000000000000000000000815293519598509096509092169263cf3b670b92600480840193919291829003018186803b158015612a4557600080fd5b505afa158015612a59573d6000803e3d6000fd5b505050506040513d6020811015612a6f57600080fd5b5051929491935050565b600c54604080517f10b3b2930000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152915160009392909216916310b3b29391602480820192602092909190829003018186803b158015612ae357600080fd5b505afa158015612af7573d6000803e3d6000fd5b505050506040513d6020811015612b0d57600080fd5b50519150612b1a82613731565b15612b2757506000610f74565b6040805160608101825260095463ffffffff8082168352640100000000820481166020840152680100000000000000009091041691810191909152600090612b7090849061308d565b50600a54604080517f2e983ab00000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015260248201859052915193955091169250632e983ab0916044808301926020929190829003018186803b158015612be057600080fd5b505afa158015612bf4573d6000803e3d6000fd5b505050506040513d6020811015612c0a57600080fd5b50519392505050565b6003546001600160a01b031690565b60035474010000000000000000000000000000000000000000900460ff1615612c7c5760405162461bcd60e51b81526004018080602001828103825260258152602001806140e76025913960400191505060405180910390fd5b600a54604080517fe66b9c1d0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015284151560248301529151919092169163e66b9c1d91604480830192600092919082900301818387803b158015612ceb57600080fd5b505af1158015610d07573d6000803e3d6000fd5b612d07613bbe565b600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055612d47613c7f565b600b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055612d87613d0f565b600c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055612dc7613d9f565b600d80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60056020526000908152604090205481565b612e1b61114d565b6001600160a01b0316336001600160a01b03161480612e525750612e3d612c13565b6001600160a01b0316336001600160a01b0316145b612ea3576040805162461bcd60e51b815260206004820152601a60248201527f63616c6c6572206973206e6f742061206c6f636b206f776e6572000000000000604482015290519081900360640190fd5b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f0f2e5b6c72c6a4491efd919a9f9a409f324ef0708c11ee57d410c2cb06c0992b90600090a1565b612f15613e2f565b612f505760405162461bcd60e51b815260040180806020018281038252603e81526020018061410c603e913960400191505060405180910390fd5b600354604080517f078cbb7c00000000000000000000000000000000000000000000000000000000815290516001600160a01b039283169284169163078cbb7c916004808301926020929190829003018186803b158015612fb057600080fd5b505afa158015612fc4573d6000803e3d6000fd5b505050506040513d6020811015612fda57600080fd5b50516001600160a01b0316146130215760405162461bcd60e51b815260040180806020018281038252604181526020018061414a6041913960600191505060405180910390fd5b600380546001600160a01b0383167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517ffea2d033438b968078a6264409d0104b5f3d2ce7b795afc74918e70f3534f22b9181900360200190a150565b600b54604080517ffab46d660000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301528251600094859485949390911692839263fab46d6692602480840193919291829003018186803b1580156130fa57600080fd5b505afa15801561310e573d6000803e3d6000fd5b505050506040513d604081101561312457600080fd5b50602090810151604080517f7c47c16d0000000000000000000000000000000000000000000000000000000081526001600160a01b038a81166004830152915192975090841692637c47c16d92602480840193829003018186803b15801561318b57600080fd5b505afa15801561319f573d6000803e3d6000fd5b505050506040513d60208110156131b557600080fd5b505191506131c4848387613678565b9250509250925092565b6131d785613731565b156131e1576133ad565b6001600160a01b03851660009081526007602052604081205461321090869061320a9087613e8a565b90613ed5565b90506000808411801561324b575061323b84846040015163ffffffff16613f2f90919063ffffffff16565b61324883620186a0613f2f565b10155b90508015613392576001600160a01b03871660008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f0bc20ba748c0b7a01e134c521b1e20764a53c3a6b4710a54cbbcf6c8bb3ba3079190a2604080516000808252602082015281516001600160a01b038a16927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b15801561336557600080fd5b505af1158015613379573d6000803e3d6000fd5b505050506040513d606081101561338f57600080fd5b50505b506001600160a01b0386166000908152600760205260409020555b5050505050565b3390565b600c54604080517f10b3b2930000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152915191909216916310b3b293916024808301926020929190829003018186803b15801561341e57600080fd5b505afa158015613432573d6000803e3d6000fd5b505050506040513d602081101561344857600080fd5b5051905061345581613731565b156134a7576040805162461bcd60e51b815260206004820152601360248201527f63616c6c657220697320766f7465642d6f757400000000000000000000000000604482015290519081900360640190fd5b604080516001808252602082015281516001600160a01b038416927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a26040805160608101825260095463ffffffff808216835264010000000082048116602084015268010000000000000000909104169181019190915260009061353390839061308d565b50600a54600d54604080517fdc8b6d730000000000000000000000000000000000000000000000000000000081526001600160a01b0388811660048301529151949650928116945063e272079f93879387939092169163dc8b6d73916024808301926020929190829003018186803b1580156135ae57600080fd5b505afa1580156135c2573d6000803e3d6000fd5b505050506040513d60208110156135d857600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526001600160a01b0390941660048501526024840192909252151560448301525160648083019260209291908290030181600087803b15801561364857600080fd5b505af115801561365c573d6000803e3d6000fd5b505050506040513d602081101561367257600080fd5b50505050565b6000613697826000015163ffffffff1684613f2f90919063ffffffff16565b6136a485620186a0613f2f565b106136b05750816136d9565b81516136d69063ffffffff908116906136d0908790620186a090613f2f16565b90613f88565b90505b9392505050565b6001600160a01b0380851660009081526006602052604090205416806137065750613672565b6001600160a01b0385166000908152600560205260409020805490859055610d0782868387876131ce565b6001600160a01b031660009081526008602052604090205460ff1690565b6003546000906001600160a01b0316613766613e2f565b806136d957506001600160a01b038116158015906136d957506003546040517f1ee441e900000000000000000000000000000000000000000000000000000000815260206004820181815286516024840152865133946001600160a01b031693631ee441e99389939283926044019185019080838360005b838110156137f65781810151838201526020016137de565b50505050905090810190601f1680156138235780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561384057600080fd5b505afa158015613854573d6000803e3d6000fd5b505050506040513d602081101561386a57600080fd5b50516001600160a01b0316149392505050565b60006138876140c6565b506040805160608101825260095463ffffffff80821683526401000000008204811660208401526801000000000000000090910416918101919091526000808080808080805b8d51811015613a1a578d81815181106138e257fe5b602002602001015193508c81815181106138f857fe5b602002602001015192508a6001600160a01b0316846001600160a01b031614801561393357508b818151811061392a57fe5b60200260200101515b1561393d57600191505b6139478884613ed5565b97508b818151811061395557fe5b60200260200101511561396f5761396c8684613ed5565b95505b60008061397c868e610d0f565b9150915081156139bd576139908986613ed5565b98508d838151811061399e57fe5b6020026020010151156139b8576139b58786613ed5565b96505b613a10565b8015613a105760046000876001600160a01b03166001600160a01b0316815260200190815260200160002060008e6001600160a01b03166001600160a01b03168152602001908152602001600020600090555b50506001016138cd565b50600087118015613a535750613a4387896020015163ffffffff16613f2f90919063ffffffff16565b613a5087620186a0613f2f565b10155b80613a9a5750808015613a665750600085115b8015613a9a5750613a8a85896020015163ffffffff16613f2f90919063ffffffff16565b613a9785620186a0613f2f565b10155b9d9c50505050505050505050505050565b60005b82518110156113d157600060046000858481518110613ac957fe5b6020908102919091018101516001600160a01b03908116835282820193909352604091820160009081209387168152929052902055600101613aae565b6001600160a01b038116613b4b5760405162461bcd60e51b815260040180806020018281038252603481526020018061431d6034913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f1f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e91a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052600960248301527f636f6d6d69747465650000000000000000000000000000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613c4e57600080fd5b505afa158015613c62573d6000803e3d6000fd5b505050506040513d6020811015613c7857600080fd5b5051905090565b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052600b60248301527f64656c65676174696f6e73000000000000000000000000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613c4e57600080fd5b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052601560248301527f677561726469616e73526567697374726174696f6e0000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613c4e57600080fd5b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052600d60248301527f63657274696669636174696f6e00000000000000000000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613c4e57600080fd5b6000613e3961114d565b6001600160a01b0316336001600160a01b03161480613e705750613e5b610f12565b6001600160a01b0316336001600160a01b0316145b80613e8557506003546001600160a01b031633145b905090565b6000613ecc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613fca565b90505b92915050565b600082820183811015613ecc576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082613f3e57506000613ecf565b82820282848281613f4b57fe5b0414613ecc5760405162461bcd60e51b81526004018080602001828103825260218152602001806142d66021913960400191505060405180910390fd5b6000613ecc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614061565b600081848411156140595760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561401e578181015183820152602001614006565b50505050905090810190601f16801561404b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836140b05760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561401e578181015183820152602001614006565b5060008385816140bc57fe5b0495945050505050565b60408051606081018252600080825260208201819052918101919091529056fe636f6e7472616374206973206c6f636b656420666f722074686973206f7065726174696f6e73656e646572206973206e6f7420616e2061646d696e202872656769737472794d616e676572206f7220696e697469616c697a6174696f6e41646d696e296e657720636f6e7472616374207265676973747279206d7573742070726f76696465207468652070726576696f757320636f6e747261637420726567697374727943616c6c6572206973206e6f74207468652070656e64696e6720726567697374727941646d696e766f74654f757450657263656e744d696c6c655468726573686f6c64206d757374206e6f74206265206c6172676572207468616e2031303030303073656e646572206973206e6f742074686520696e697469616c697a6174696f6e2061646d696e73656e646572206973206e6f74207468652066756e6374696f6e616c206d616e61676572766f7465556e726561647950657263656e744d696c6c655468726573686f6c64206d757374206e6f74206265206c6172676572207468616e2031303030303063616c6c6572206973206e6f742074686520677561726469616e20726567697374726174696f6e7320636f6e74726163746d696e53656c665374616b6550657263656e744d696c6c65206d75737420626520313030303030206174206d6f7374536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7763616c6c6572206973206e6f74207468652064656c65676174696f6e7320636f6e7472616374526567697374727941646d696e3a206e657720726567697374727941646d696e20697320746865207a65726f206164647265737357697468436c61696d61626c6552656769737472794d616e6167656d656e743a2063616c6c6572206973206e6f742074686520726567697374727941646d696e766f74652065787069726174696f6e2074696d65206d757374206e6f7420626520696e207468652070617374a2646970667358221220c3ca483dbb96e8549753f7683a38b72d05867935aff013e8a6570d02dbe2df8364736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005454223e3078db87e55a15be541cc925f3702eb0000000000000000000000000628e8c4d1611ed5b748f59f5ce694809af2f91d40000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000111700000000000000000000000000000000000000000000000000000000000011170
-----Decoded View---------------
Arg [0] : _contractRegistry (address): 0x5454223e3078Db87e55a15bE541cc925f3702eB0
Arg [1] : _registryAdmin (address): 0x628E8C4d1611ed5B748f59F5cE694809AF2F91d4
Arg [2] : minSelfStakePercentMille (uint32): 8000
Arg [3] : voteUnreadyPercentMilleThreshold (uint32): 70000
Arg [4] : voteOutPercentMilleThreshold (uint32): 70000
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000005454223e3078db87e55a15be541cc925f3702eb0
Arg [1] : 000000000000000000000000628e8c4d1611ed5b748f59f5ce694809af2f91d4
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001f40
Arg [3] : 0000000000000000000000000000000000000000000000000000000000011170
Arg [4] : 0000000000000000000000000000000000000000000000000000000000011170
Deployed Bytecode Sourcemap
276:14660:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2520:169;;;;;;;;;;;;;;;;-1:-1:-1;2520:169:2;-1:-1:-1;;;;;2520:169:2;;:::i;:::-;;;;;;;;;;;;;;;;5037:885;;;;;;;;;;;;;;;;-1:-1:-1;5037:885:2;-1:-1:-1;;;;;5037:885:2;;:::i;:::-;;4119:234;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4119:234:2;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1312:108:14;;;:::i;:::-;;;;;;;;;;;;;;;;;;9140:143:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2024:100;;;:::i;2837:144:14:-;;;;;;;;;;;;;;;;-1:-1:-1;2837:144:14;-1:-1:-1;;;;;2837:144:14;;:::i;558:156:10:-;;;:::i;447:105::-;;;:::i;:::-;;;;-1:-1:-1;;;;;447:105:10;;;;;;;;;;;;;;720:121;;;:::i;8531:135:2:-;;;:::i;3336:108:14:-;;;:::i;5925:114:2:-;;;;;;;;;;;;;;;;-1:-1:-1;5925:114:2;-1:-1:-1;;;;;5925:114:2;;:::i;6401:530::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;6401:530:2;;;;;;;;;;;;;;;;;;:::i;881:93:14:-;;;:::i;9286:438:2:-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1688:333;;;:::i;4356:664::-;;;;;;;;;;;;;;;;-1:-1:-1;4356:664:2;-1:-1:-1;;;;;4356:664:2;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8669:468;;;;;;;;;;;;;;;;-1:-1:-1;8669:468:2;;;;:::i;765:88:11:-;;;:::i;653:106::-;;;:::i;2732:498:2:-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;2732:498:2;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2732:498:2;;;;;;;;;;;;;;;;;;;;;;;;;1805:179:14;;;:::i;7966:127:2:-;;;:::i;8096:432::-;;;;;;;;;;;;;;;;-1:-1:-1;8096:432:2;;;;:::i;3251:865::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3251:865:2;;;;;;;;:::i;9727:196::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9727:196:2;;-1:-1:-1;9727:196:2;-1:-1:-1;9727:196:2;:::i;197:18:11:-;;;:::i;3082:180:14:-;;;:::i;7575:388:2:-;;;;;;;;;;;;;;;;-1:-1:-1;7575:388:2;;;;:::i;7032:217::-;;;;;;;;;;;;;;;;-1:-1:-1;7032:217:2;-1:-1:-1;;;;;7032:217:2;;:::i;6042:294::-;;;;;;;;;;;;;;;;-1:-1:-1;6042:294:2;-1:-1:-1;;;;;6042:294:2;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2127:390;;;;;;;;;;;;;;;;-1:-1:-1;2127:390:2;-1:-1:-1;;;;;2127:390:2;;:::i;3855:111:1:-;;;:::i;7353:181:2:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7353:181:2;;;;;;;;;;:::i;14598:335::-;;;:::i;500:46::-;;;;;;;;;;;;;;;;-1:-1:-1;500:46:2;-1:-1:-1;;;;;500:46:2;;:::i;546:101:11:-;;;:::i;3468:381:1:-;;;;;;;;;;;;;;;;-1:-1:-1;3468:381:1;-1:-1:-1;;;;;3468:381:1;;:::i;2520:169:2:-;2645:40;;;;;;;;2676:8;2645:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;2597:19;;2645:40;;2666:8;;2645:20;:40::i;:::-;-1:-1:-1;2622:63:2;2520:169;-1:-1:-1;;;2520:169:2:o;5037:885::-;904:6:11;;;;;;;903:7;895:57;;;;-1:-1:-1;;;895:57:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5108:25:2::1;;:::i;:::-;-1:-1:-1::0;5108:36:2::1;::::0;;::::1;::::0;::::1;::::0;;5136:8:::1;5108:36:::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;;;;;::::1;;::::0;;;;5165:10:::1;-1:-1:-1::0;5201:19:2;;;:12:::1;:19:::0;;;;;;;;-1:-1:-1;;;;;5225:29:2;;::::1;::::0;;::::1;::::0;::::1;::::0;;;5263;;5108:36;;5165:10;;5201:19;::::1;::::0;5225:29;;5165:10;;5263:29:::1;::::0;::::1;5318:19;::::0;:44:::1;::::0;;;;;-1:-1:-1;;;;;5318:44:2;;::::1;;::::0;::::1;::::0;;;5297:18:::1;::::0;5318:19;;;::::1;::::0;:37:::1;::::0;:44;;;;;::::1;::::0;;;;;;;;;:19;:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;5318:44:2;;-1:-1:-1;;;;;;5371:25:2;::::1;5367:72;;-1:-1:-1::0;;;;;5403:18:2;::::1;;::::0;;;:11:::1;:18;::::0;;;;:31;;;5367:72:::1;-1:-1:-1::0;;;;;5447:21:2;::::1;5443:62;;-1:-1:-1::0;;;;;5482:18:2;::::1;;::::0;;;:11:::1;:18;::::0;;;;5475:25;5443:62:::1;5527:19;::::0;:44:::1;::::0;;;;;;;5509:15:::1;::::0;-1:-1:-1;;;;;5527:19:2::1;::::0;:42:::1;::::0;:44:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:19;:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;5527:44:2;;-1:-1:-1;;;;;;5580:25:2;::::1;::::0;;::::1;::::0;:51:::1;;;5624:7;-1:-1:-1::0;;;;;5609:22:2::1;:11;-1:-1:-1::0;;;;;5609:22:2::1;;;5580:51;5576:138;;;5638:71;5659:11;5672:1;5675:10;5687;5699:9;5638:20;:71::i;:::-;-1:-1:-1::0;;;;;5722:21:2;::::1;::::0;5718:201:::1;;5750:19;5787:7;-1:-1:-1::0;;;;;5772:22:2::1;:11;-1:-1:-1::0;;;;;5772:22:2::1;;;:39;;5810:1;5772:39;;;5797:10;5772:39;5750:61;;5816:71;5837:7;5846:14;5862:1;5865:10;5877:9;5816:20;:71::i;:::-;5718:201;;963:1:11;;;;;5037:885:2::0;:::o;4119:234::-;-1:-1:-1;;;;;4258:23:2;;;4209:10;4258:23;;;:16;:23;;;;;;;;:32;;;;;;;;;;;;4302:15;;;;;:47;;;4339:10;4321:15;:28;4302:47;4294:55;;4119:234;;;;;:::o;1312:108:14:-;1360:4;1399:14;;-1:-1:-1;;;;;1399:14:14;1383:12;:10;:12::i;:::-;-1:-1:-1;;;;;1383:30:14;;1376:37;;1312:108;:::o;9140:143:2:-;9238:8;:41;;;;;;;9140:143::o;2024:100::-;904:6:11;;;;;;;903:7;895:57;;;;-1:-1:-1;;;895:57:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2090:30:2::1;2109:10;2090:18;:30::i;:::-;2024:100::o:0;2837:144:14:-;1117:17;:15;:17::i;:::-;1109:94;;;;-1:-1:-1;;;1109:94:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2934:21:::1;:40:::0;;;::::1;-1:-1:-1::0;;;;;2934:40:14;;;::::1;::::0;;;::::1;::::0;;2837:144::o;558:156:10:-;318:21;:19;:21::i;:::-;-1:-1:-1;;;;;304:35:10;:10;-1:-1:-1;;;;;304:35:10;;296:86;;;;-1:-1:-1;;;296:86:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;635:20:::1;:33:::0;;;::::1;::::0;;683:24:::1;::::0;::::1;::::0;666:1:::1;::::0;683:24:::1;558:156::o:0;447:105::-;525:20;;-1:-1:-1;;;;;525:20:10;447:105;:::o;720:121::-;800:20;;-1:-1:-1;;;;;800:20:10;:34;720:121;:::o;8531:135:2:-;8625:8;:37;;;;;;;8531:135::o;3336:108:14:-;3414:21;;-1:-1:-1;;;;;3414:21:14;3336:108;:::o;5925:114:2:-;-1:-1:-1;;;;;6016:19:2;;;5996:7;6016:19;;;:12;:19;;;;;;;5925:114;;;;:::o;6401:530::-;1404:19;;-1:-1:-1;;;;;1404:19:2;1382:10;:42;1374:93;;;;-1:-1:-1;;;1374:93:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;904:6:11::1;::::0;;;::::1;;;903:7;895:57;;;;-1:-1:-1::0;;;895:57:11::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6582:25:2::2;;:::i;:::-;-1:-1:-1::0;6582:36:2::2;::::0;;::::2;::::0;::::2;::::0;;6610:8:::2;6582:36:::0;::::2;::::0;;::::2;::::0;;;;::::2;::::0;::::2;;::::0;::::2;::::0;;;;::::2;;::::0;;;;;;;-1:-1:-1;6645:56:2::2;6664:9:::0;6675:14;6582:36;6645:18:::2;:56::i;:::-;6710:65;::::0;;;;;::::2;::::0;::::2;::::0;;;;;;;;;;;6623:78;;-1:-1:-1;;;;;;6710:65:2;::::2;::::0;::::2;::::0;;;;;;;::::2;6780:17;::::0;:62:::2;::::0;;;;;-1:-1:-1;;;;;6780:62:2;;::::2;;::::0;::::2;::::0;;;;;;;;;:17;;;::::2;::::0;:36:::2;::::0;:62;;;;;:17:::2;::::0;:62;;;;;;;:17;;:62;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;6847:80;6870:8;6880:14;6896:19;6917:9;6847:22;:80::i;881:93:14:-:0;927:7;953:14;-1:-1:-1;;;;;953:14:14;881:93;:::o;9286:438:2:-;9344:31;9379:39;9422:35;9465:25;;:::i;:::-;-1:-1:-1;;9465:36:2;;;;;;;;9493:8;9465:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9465:36:2;-1:-1:-1;9286:438:2:o;1688:333::-;904:6:11;;;;;;;903:7;895:57;;;;-1:-1:-1;;;895:57:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1767:28:2::1;::::0;:63:::1;::::0;;;;;1819:10:::1;1767:63;::::0;::::1;::::0;;;1748:16:::1;::::0;-1:-1:-1;;;;;1767:28:2::1;::::0;:51:::1;::::0;:63;;;;;::::1;::::0;;;;;;;;:28;:63;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;1767:63:2;;-1:-1:-1;1874:20:2::1;1767:63:::0;1874:10:::1;:20::i;:::-;1873:21;1865:53;;;::::0;;-1:-1:-1;;;1865:53:2;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;1928:44;::::0;;1960:4:::1;1928:44:::0;;1966:5:::1;1928:44;::::0;::::1;::::0;;;-1:-1:-1;;;;;1928:44:2;::::1;::::0;::::1;::::0;;;;;;::::1;1977:17;::::0;:40:::1;::::0;;;;;-1:-1:-1;;;;;1977:40:2;;::::1;;::::0;::::1;::::0;;;:17;;;::::1;::::0;:30:::1;::::0;:40;;;;;::::1;::::0;;;;;;;;:17:::1;::::0;:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;1688:333:2:o;4356:664::-;4435:26;4463:24;4489:27;4518:19;4539:23;4564:32;4640:17;;;;;;;;;-1:-1:-1;;;;;4640:17:2;-1:-1:-1;;;;;4640:30:2;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4640:32:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4640:32:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4640:32:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4602:70;;;;;;;;;;;;4696:9;:16;4685:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4685:28:2;;4677:36;;4722:6;4717:300;4738:9;:16;4734:1;:20;4717:300;;;4766:18;4787:9;4797:1;4787:12;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4826:28:2;;;;;;;:16;:28;;;;;;:37;;;;;;;;;;;;;4787:12;;-1:-1:-1;4808:15:2;:55;4804:88;;;4882:4;4871:5;4877:1;4871:8;;;;;;;;:15;;;:8;;;;;;;;;;;:15;4804:88;4915:7;-1:-1:-1;;;;;4901:21:2;:10;-1:-1:-1;;;;;4901:21:2;;4897:116;;;4951:4;4930:25;;4991:13;5005:1;4991:16;;;;;;;;;;;;;;4961:46;;4897:116;-1:-1:-1;4756:3:2;;4717:300;;;;4356:664;;;;;;;:::o;8669:468::-;458:30:12;;;;;;;;;;;;;;;;;;:9;:30::i;:::-;450:79;;;;-1:-1:-1;;;450:79:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;397:6:2::1;8805:55;::::0;::::1;;;8797:131;;;;-1:-1:-1::0;;;8797:131:2::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9011:8;:41:::0;8937:116:::1;::::0;;9011:41:::1;8937:116:::0;;::::1;::::0;;9011:41;;;::::1;::::0;;::::1;8937:116;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;9057:8;:76:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;8669:468::o;765:88:11:-;840:6;;;;;;;;765:88::o;653:106::-;427:15;:13;:15::i;:::-;-1:-1:-1;;;;;413:29:11;:10;-1:-1:-1;;;;;413:29:11;;:77;;;;468:21;:19;:21::i;:::-;-1:-1:-1;;;;;446:44:11;:10;-1:-1:-1;;;;;446:44:11;;413:77;405:116;;;;;-1:-1:-1;;;405:116:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;713:6:::1;:14:::0;;;::::1;::::0;;742:10:::1;::::0;::::1;::::0;722:5:::1;::::0;742:10:::1;653:106::o:0;2732:498:2:-;2979:28;;3049:17;;:32;;;;;;;;2788:26;;;;;;;;;;-1:-1:-1;;;;;2979:28:2;;;;3049:17;;:30;;:32;;;;;2924:52;;3049:32;;;;;;;:17;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3049:32:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3049:32:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3049:32:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;3049:32:2;;;;;;;;3097:64;;;;;;;;;;;;;;;;;;3011:70;;-1:-1:-1;3011:70:2;;-1:-1:-1;3011:70:2;;-1:-1:-1;;;;;;3097:53:2;;;;;3011:70;;3097:64;;-1:-1:-1;3097:64:2;;-1:-1:-1;3097:64:2;;;;;-1:-1:-1;3097:64:2;;;;-1:-1:-1;3097:64:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3097:64:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3085:76;;3171:29;-1:-1:-1;;;;;3171:44:2;;3216:9;3171:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3171:55:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3165:61;;2732:498;;;;;;:::o;1805:179:14:-;1117:17;:15;:17::i;:::-;1109:94;;;;-1:-1:-1;;;1109:94:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1937:1:::1;1913:14:::0;;1883:57:::1;::::0;-1:-1:-1;;;;;1913:14:14;;::::1;::::0;1883:57:::1;::::0;1937:1;;1883:57:::1;1975:1;1950:27:::0;;;::::1;::::0;;1805:179::o;7966:127:2:-;8056:8;:33;;;7966:127;:::o;8096:432::-;458:30:12;;;;;;;;;;;;;;;;;;:9;:30::i;:::-;450:79;;;;-1:-1:-1;;;450:79:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;397:6:2::1;8224:51;::::0;::::1;;;8216:123;;;;-1:-1:-1::0;;;8216:123:2::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8414:8;:37:::0;8348:104:::1;::::0;;8414:37:::1;8348:104:::0;;::::1;::::0;;8414:37;;;::::1;::::0;;::::1;8348:104;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;8456:8;:68:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;8096:432::o;3251:865::-;904:6:11;;;;;;;903:7;895:57;;;;-1:-1:-1;;;895:57:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3373:15:2::1;3355:14;:33;;3347:90;;;;-1:-1:-1::0;;;3347:90:2::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3458:28;::::0;:63:::1;::::0;;;;;3510:10:::1;3458:63;::::0;::::1;::::0;;;3442:13:::1;::::0;-1:-1:-1;;;;;3458:28:2::1;::::0;:51:::1;::::0;:63;;;;;::::1;::::0;;;;;;;;:28;:63;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;3458:63:2;-1:-1:-1;;;;;3525:23:2;;::::1;;::::0;;;:16:::1;3458:63;3525:23:::0;;;;;;;:32;;::::1;::::0;;;;;;;;;;:49;;;3583;;;;;;;3458:63;;-1:-1:-1;3525:32:2;;:23;;3583:49:::1;::::0;;;;;;;::::1;3638:33;3673:31:::0;3706:27:::1;3737:17;;;;;;;;;-1:-1:-1::0;;;;;3737:17:2::1;-1:-1:-1::0;;;;;3737:30:2::1;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;::::1;;::::0;::::1;::::0;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;::::0;;-1:-1:-1;3737:32:2;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;::::0;;-1:-1:-1;3737:32:2;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;::::0;;-1:-1:-1;3737:32:2;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;::::0;::::1;;3637:132;;;;;;3774:17;3794:96;3833:16;3851:14;3867:13;3882:7;3794:38;:96::i;:::-;3774:116;;3898:12;3894:219;;;3917:53;3944:16;3962:7;3917:26;:53::i;:::-;3980:29;::::0;-1:-1:-1;;;;;3980:29:2;::::1;::::0;::::1;::::0;;;::::1;4020:44;::::0;;4051:5:::1;4020:44:::0;;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;4020:44:2;::::1;::::0;::::1;::::0;;;;;;::::1;4069:17;::::0;:39:::1;::::0;;;;;-1:-1:-1;;;;;4069:39:2;;::::1;;::::0;::::1;::::0;;;:17;;;::::1;::::0;:30:::1;::::0;:39;;;;;::::1;::::0;;;;;;;;:17:::1;::::0;:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;963:1:11::1;;;;;3251:865:2::0;;:::o;9727:196::-;318:21:10;:19;:21::i;:::-;-1:-1:-1;;;;;304:35:10;:10;-1:-1:-1;;;;;304:35:10;;296:86;;;;-1:-1:-1;;;296:86:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9839:6:2::1;9834:86;9851:20:::0;;::::1;9834:86;;;9883:32;9902:9;;9912:1;9902:12;;;;;;;;;;;;;-1:-1:-1::0;;;;;9902:12:2::1;9883:18;:32::i;:::-;9873:3;;9834:86;;197:18:11::0;;;;;;;;;:::o;3082:180:14:-;2575:21;;-1:-1:-1;;;;;2575:21:14;2561:10;:35;2553:87;;;;-1:-1:-1;;;2553:87:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3189:21:::1;::::0;3161:50:::1;::::0;-1:-1:-1;;;;;3189:21:14::1;3161:27;:50::i;:::-;3221:21;:34:::0;;;::::1;::::0;;3082:180::o;7575:388:2:-;458:30:12;;;;;;;;;;;;;;;;;;:9;:30::i;:::-;450:79;;;;-1:-1:-1;;;450:79:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;397:6:2::1;7695:47;::::0;::::1;;;7687:107;;;;-1:-1:-1::0;;;7687:107:2::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7861:8;:33:::0;7803:92:::1;::::0;;7861:33:::1;7803:92:::0;;::::1;::::0;;7861:33;;::::1;7803:92;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;7899:8;:60:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;7575:388::o;7032:217::-;1559:28;;-1:-1:-1;;;;;1559:28:2;1537:10;:51;1529:113;;;;-1:-1:-1;;;1529:113:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;904:6:11::1;::::0;;;::::1;;;903:7;895:57;;;;-1:-1:-1::0;;;895:57:11::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7156:45:2::2;::::0;;7188:5:::2;7156:45:::0;;;::::2;::::0;::::2;::::0;;;-1:-1:-1;;;;;7156:45:2;::::2;::::0;::::2;::::0;;;;;;::::2;7205:17;::::0;:40:::2;::::0;;;;;-1:-1:-1;;;;;7205:40:2;;::::2;;::::0;::::2;::::0;;;:17;;;::::2;::::0;:30:::2;::::0;:40;;;;;::::2;::::0;;;;;;;;:17:::2;::::0;:40;::::2;;::::0;::::2;;;;::::0;::::2;6042:294:::0;6117:13;6132:15;6149:24;6190:19;6201:7;6190:10;:19::i;:::-;-1:-1:-1;;;;;6226:36:2;;;;;;;:27;:36;;;;;;;;;;6288:19;;:44;;;;;;;6179:30;;-1:-1:-1;6226:36:2;;-1:-1:-1;6288:19:2;;;;:42;;:44;;;;;6226:36;;6288:44;;;;;;:19;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6288:44:2;6042:294;;;;-1:-1:-1;;6042:294:2:o;2127:390::-;2224:28;;:61;;;;;;-1:-1:-1;;;;;2224:61:2;;;;;;;;;2203:4;;2224:28;;;;;:51;;:61;;;;;;;;;;;;;;;:28;:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2224:61:2;;-1:-1:-1;2325:20:2;2224:61;2325:10;:20::i;:::-;2321:48;;;-1:-1:-1;2359:5:2;2352:12;;2321:48;2404:40;;;;;;;;2435:8;2404:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;2376:22;;2404:40;;2425:8;;2404:20;:40::i;:::-;-1:-1:-1;2455:17:2;;:58;;;;;;-1:-1:-1;;;;;2455:58:2;;;;;;;;;;;;;;;2373:71;;-1:-1:-1;2455:17:2;;;-1:-1:-1;2455:32:2;;:58;;;;;;;;;;;;;;:17;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2455:58:2;;2127:390;-1:-1:-1;;;2127:390:2:o;3855:111:1:-;3943:16;;-1:-1:-1;;;;;3943:16:1;3855:111;:::o;7353:181:2:-;904:6:11;;;;;;;903:7;895:57;;;;-1:-1:-1;;;895:57:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7464:17:2::1;::::0;:66:::1;::::0;;;;;-1:-1:-1;;;;;7464:66:2;;::::1;;::::0;::::1;::::0;;::::1;;::::0;;;;;;:17;;;::::1;::::0;:43:::1;::::0;:66;;;;;:17:::1;::::0;:66;;;;;;;:17;;:66;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;14598:335:::0;14679:22;:20;:22::i;:::-;14648:17;:54;;;;-1:-1:-1;;;;;14648:54:2;;;;;;;;;;14741:24;:22;:24::i;:::-;14706:19;:60;;;;-1:-1:-1;;;;;14706:60:2;;;;;;;;;;14824:34;:32;:34::i;:::-;14770:28;:89;;;;-1:-1:-1;;;;;14770:89:2;;;;;;;;;;14902:26;:24;:26::i;:::-;14863:21;:66;;;;-1:-1:-1;;;;;14863:66:2;;;;;;;;;;14598:335::o;500:46::-;;;;;;;;;;;;;:::o;546:101:11:-;427:15;:13;:15::i;:::-;-1:-1:-1;;;;;413:29:11;:10;-1:-1:-1;;;;;413:29:11;;:77;;;;468:21;:19;:21::i;:::-;-1:-1:-1;;;;;446:44:11;:10;-1:-1:-1;;;;;446:44:11;;413:77;405:116;;;;;-1:-1:-1;;;405:116:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;604:6:::1;:13:::0;;;::::1;::::0;::::1;::::0;;632:8:::1;::::0;::::1;::::0;604:13;;632:8:::1;546:101::o:0;3468:381:1:-;641:9;:7;:9::i;:::-;633:84;;;;-1:-1:-1;;;633:84:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3632:16:::1;::::0;3571:49:::1;::::0;;;;;;;-1:-1:-1;;;;;3632:16:1;;::::1;::::0;3571:47;::::1;::::0;::::1;::::0;:49:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:47;:49;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;3571:49:1;-1:-1:-1;;;;;3571:78:1::1;;3563:156;;;;-1:-1:-1::0;;;3563:156:1::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3729:16;:38:::0;;-1:-1:-1;;;;;3729:38:1;::::1;::::0;;;::::1;::::0;::::1;::::0;;;3782:60:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;3468:381:::0;:::o;10816:440:2:-;11020:19;;11058:48;;;;;;-1:-1:-1;;;;;11058:48:2;;;;;;;;;10913:17;;;;;;11020:19;;;;;;;11058:38;;:48;;;;;;;;;;;;;11020:19;11058:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11058:48:2;;;;;;11127;;;;;-1:-1:-1;;;;;11127:48:2;;;;;;;;;11058;;-1:-1:-1;11127:38:2;;;;;;:48;;;;;;;;;;:38;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11127:48:2;;-1:-1:-1;11196:56:2;11215:9;11127:48;11242:9;11196:18;:56::i;:::-;11179:73;;10816:440;;;;;;:::o;13503:762::-;13679:19;13690:7;13679:10;:19::i;:::-;13675:41;;;13705:7;;13675:41;-1:-1:-1;;;;;13742:36:2;;13720:19;13742:36;;;:27;:36;;;;;;:92;;13816:17;;13742:65;;13787:19;13742:44;:65::i;:::-;:73;;:92::i;:::-;13720:114;;13839:21;13886:1;13863:20;:24;:141;;;;;13931:73;13983:20;13939:9;:38;;;13931:47;;:51;;:73;;;;:::i;:::-;13891:36;:11;397:6;13891:15;:36::i;:::-;:113;;13863:141;13839:165;;14012:16;14008:199;;;-1:-1:-1;;;;;14035:26:2;;;;;;:17;:26;;;;;;:33;;;;14064:4;14035:33;;;14078:25;;;14035:26;14078:25;14114:44;;;14145:5;14114:44;;;;;;;;;-1:-1:-1;;;;;14114:44:2;;;;;;;;;;;14163:17;;:39;;;;;;-1:-1:-1;;;;;14163:39:2;;;;;;;;;:17;;;;;:30;;:39;;;;;;;;;;;;;;:17;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14008:199:2;-1:-1:-1;;;;;;14211:36:2;;;;;;:27;:36;;;;;:50;13503:762;;;;;;:::o;590:104:0:-;677:10;590:104;:::o;9961:461:2:-;10030:28;;:61;;;;;;-1:-1:-1;;;;;10030:61:2;;;;;;;;;:28;;;;;:51;;:61;;;;;;;;;;;;;;:28;:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10030:61:2;;-1:-1:-1;10135:20:2;10030:61;10135:10;:20::i;:::-;10134:21;10126:53;;;;;-1:-1:-1;;;10126:53:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;10189:43;;;10221:4;10189:43;;;;;;;;;-1:-1:-1;;;;;10189:43:2;;;;;;;;;;;10268:40;;;;;;;;10299:8;10268:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;10240:22;;10268:40;;10289:8;;10268:20;:40::i;:::-;-1:-1:-1;10312:17:2;;10366:21;;:51;;;;;;-1:-1:-1;;;;;10366:51:2;;;;;;;;;10237:71;;-1:-1:-1;10312:17:2;;;;-1:-1:-1;10312:27:2;;10340:8;;10237:71;;10366:21;;;;:41;;:51;;;;;;;;;;;;;;:21;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10366:51:2;10312:106;;;;;;;;;;;-1:-1:-1;;;;;10312:106:2;;;;;;;;;;;;;;;;;;;;;;;;;;10366:51;;10312:106;;;;;;;-1:-1:-1;10312:106:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;9961:461:2:o;10425:388::-;10545:7;10600:54;10619:9;:34;;;10600:54;;:14;:18;;:54;;;;:::i;:::-;10562:34;:9;397:6;10562:13;:34::i;:::-;:92;10558:129;;-1:-1:-1;10668:14:2;10661:21;;10558:129;10736:34;;10697:74;;;;;;;:34;;:9;;397:6;;10697:13;:34;:::i;:::-;:38;;:74::i;:::-;10690:81;;10425:388;;;;;;:::o;13084:413::-;-1:-1:-1;;;;;13245:19:2;;;13227:15;13245:19;;;:12;:19;;;;;;;13272:21;13268:34;;13295:7;;;13268:34;-1:-1:-1;;;;;13331:18:2;;13306:22;13331:18;;;:11;:18;;;;;;;13353:38;;;;13396:97;13417:7;13374:17;13331:18;13461:20;13483:9;13396:20;:97::i;14268:108::-;-1:-1:-1;;;;;14345:27:2;14328:4;14345:27;;;:17;:27;;;;;;;;;14268:108::o;742:261:1:-;858:16;;804:4;;-1:-1:-1;;;;;858:16:1;891:9;:7;:9::i;:::-;:105;;;-1:-1:-1;;;;;;904:41:1;;;;;;:92;;-1:-1:-1;949:16:1;;:33;;;;;;;;;;;;;;;;;;;;986:10;;-1:-1:-1;;;;;949:16:1;;:27;;977:4;;949:33;;;;;;;;;;;;:16;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;949:33:1;-1:-1:-1;;;;;949:47:1;;884:112;742:261;-1:-1:-1;;;742:261:1:o;11277:1575:2:-;11442:4;11452:25;;:::i;:::-;-1:-1:-1;11452:36:2;;;;;;;;11480:8;11452:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;11715:754:2;11736:9;:16;11732:1;:20;11715:754;;;11773:9;11783:1;11773:12;;;;;;;;;;;;;;11764:21;;11804:7;11812:1;11804:10;;;;;;;;;;;;;;11790:24;;11834:7;-1:-1:-1;;;;;11824:17:2;:6;-1:-1:-1;;;;;11824:17:2;;:37;;;;;11845:13;11859:1;11845:16;;;;;;;;;;;;;;11824:37;11820:80;;;11890:4;11869:25;;11820:80;11927:36;:19;11951:11;11927:23;:36::i;:::-;11905:58;;11972:13;11986:1;11972:16;;;;;;;;;;;;;;11968:92;;;12018:36;:19;12042:11;12018:23;:36::i;:::-;11996:58;;11968:92;12066:10;12078:18;12100:35;12119:6;12127:7;12100:18;:35::i;:::-;12065:70;;;;12144:5;12140:325;;;12181:38;:21;12207:11;12181:25;:38::i;:::-;12157:62;;12229:13;12243:1;12229:16;;;;;;;;;;;;;;12225:116;;;12287:47;:30;12322:11;12287:34;:47::i;:::-;12254:80;;12225:116;12140:325;;;12356:15;;12352:113;;12426:16;:24;12443:6;-1:-1:-1;;;;;12426:24:2;-1:-1:-1;;;;;12426:24:2;;;;;;;;;;;;:33;12451:7;-1:-1:-1;;;;;12426:33:2;-1:-1:-1;;;;;12426:33:2;;;;;;;;;;;;12419:40;;;12352:113;-1:-1:-1;;11754:3:2;;11715:754;;;;12507:1;12485:19;:23;:156;;;;;12565:76;12621:19;12573:9;:42;;;12565:51;;:55;;:76;;;;:::i;:::-;12515:46;:21;397:6;12515:25;:46::i;:::-;:126;;12485:156;12480:368;;;;12654:18;:48;;;;;12701:1;12679:19;:23;12654:48;:190;;;;;12768:76;12824:19;12776:9;:42;;;12768:51;;:55;;:76;;;;:::i;:::-;12709:55;:30;397:6;12709:34;:55::i;:::-;:135;;12654:190;12473:375;11277:1575;-1:-1:-1;;;;;;;;;;;;;11277:1575:2:o;12855:212::-;12953:6;12948:116;12969:9;:16;12965:1;:20;12948:116;;;13039:1;12997:16;:30;13014:9;13024:1;13014:12;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12997:30:2;;;;;;;;;;;;;;;;-1:-1:-1;12997:30:2;;;:39;;;;;;;;;;:43;12987:3;;12948:116;;2096:305:14;-1:-1:-1;;;;;2186:30:14;;2178:95;;;;-1:-1:-1;;;2178:95:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2318:14;;;2288:63;;-1:-1:-1;;;;;2288:63:14;;;;2318:14;;;2288:63;;;2361:14;:33;;;;-1:-1:-1;;;;;2361:33:14;;;;;;;;;;2096:305::o;1639:129:1:-;1720:16;;:41;;;;;;;;;;;;;;;;;;;;;;;;;1694:7;;-1:-1:-1;;;;;1720:16:1;;:28;;:41;;;;;;;;;;;:16;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1720:41:1;;-1:-1:-1;1639:129:1;:::o;1909:133::-;1992:16;;:43;;;;;;;;;;;;;;;;;;;;;;;;;1966:7;;-1:-1:-1;;;;;1992:16:1;;:28;;:43;;;;;;;;;;;:16;:43;;;;;;;;;;2048:153;2141:16;;:53;;;;;;;;;;;;;;;;;;;;;;;;;2115:7;;-1:-1:-1;;;;;2141:16:1;;:28;;:53;;;;;;;;;;;:16;:53;;;;;;;;;;2207:137;2292:16;;:45;;;;;;;;;;;;;;;;;;;;;;;;;2266:7;;-1:-1:-1;;;;;2292:16:1;;:28;;:45;;;;;;;;;;;:16;:45;;;;;;;;;;1009:183;1051:4;1088:15;:13;:15::i;:::-;-1:-1:-1;;;;;1074:29:1;:10;-1:-1:-1;;;;;1074:29:1;;:68;;;;1121:21;:19;:21::i;:::-;-1:-1:-1;;;;;1107:35:1;:10;-1:-1:-1;;;;;1107:35:1;;1074:68;:111;;;-1:-1:-1;1168:16:1;;-1:-1:-1;;;;;1168:16:1;1146:10;:39;1074:111;1067:118;;1009:183;:::o;1321:134:13:-;1379:7;1405:43;1409:1;1412;1405:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1398:50;;1321:134;;;;;:::o;874:176::-;932:7;963:5;;;986:6;;;;978:46;;;;;-1:-1:-1;;;978:46:13;;;;;;;;;;;;;;;;;;;;;;;;;;;2180:459;2238:7;2479:6;2475:45;;-1:-1:-1;2508:1:13;2501:8;;2475:45;2542:5;;;2546:1;2542;:5;:1;2565:5;;;;;:10;2557:56;;;;-1:-1:-1;;;2557:56:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3101:130;3159:7;3185:39;3189:1;3192;3185:39;;;;;;;;;;;;;;;;;:3;:39::i;1746:187::-;1832:7;1867:12;1859:6;;;;1851:29;;;;-1:-1:-1;;;1851:29:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1902:5:13;;;1746:187::o;3713:272::-;3799:7;3833:12;3826:5;3818:28;;;;-1:-1:-1;;;3818:28:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3856:9;3872:1;3868;:5;;;;;;;3713:272;-1:-1:-1;;;;;3713:272:13:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://c3ca483dbb96e8549753f7683a38b72d05867935aff013e8a6570d02dbe2df83
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.