Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0.5 ETH
Eth Value
$1,338.05 (@ $2,676.11/ETH)More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,107 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Execute Pull Pay... | 13231995 | 1061 days ago | IN | 0 ETH | 0.02248031 | ||||
Register Pull Pa... | 13225488 | 1062 days ago | IN | 0 ETH | 0.0361625 | ||||
Register Pull Pa... | 13199498 | 1066 days ago | IN | 0 ETH | 0.0576878 | ||||
Register Pull Pa... | 13102827 | 1081 days ago | IN | 0 ETH | 0.04950681 | ||||
Execute Pull Pay... | 12329847 | 1201 days ago | IN | 0 ETH | 0.0124583 | ||||
Execute Pull Pay... | 11692924 | 1299 days ago | IN | 0 ETH | 0.00529206 | ||||
Delete Pull Paym... | 11686277 | 1300 days ago | IN | 0 ETH | 0.00596505 | ||||
Register Pull Pa... | 11686236 | 1300 days ago | IN | 0 ETH | 0.05360097 | ||||
Register Pull Pa... | 11645630 | 1307 days ago | IN | 0 ETH | 0.02961172 | ||||
Register Pull Pa... | 11552882 | 1321 days ago | IN | 0 ETH | 0.0688551 | ||||
Execute Pull Pay... | 11471379 | 1333 days ago | IN | 0 ETH | 0.01044843 | ||||
Delete Pull Paym... | 11436542 | 1339 days ago | IN | 0 ETH | 0.00075056 | ||||
Delete Pull Paym... | 11436542 | 1339 days ago | IN | 0 ETH | 0.00075023 | ||||
Delete Pull Paym... | 11436542 | 1339 days ago | IN | 0 ETH | 0.00164749 | ||||
Delete Pull Paym... | 11436541 | 1339 days ago | IN | 0 ETH | 0.00159034 | ||||
Delete Pull Paym... | 11436540 | 1339 days ago | IN | 0 ETH | 0.00159068 | ||||
Delete Pull Paym... | 11436540 | 1339 days ago | IN | 0 ETH | 0.00159068 | ||||
Delete Pull Paym... | 11436539 | 1339 days ago | IN | 0 ETH | 0.00159068 | ||||
Delete Pull Paym... | 11436538 | 1339 days ago | IN | 0 ETH | 0.00075056 | ||||
Delete Pull Paym... | 11436538 | 1339 days ago | IN | 0 ETH | 0.00075056 | ||||
Delete Pull Paym... | 11436538 | 1339 days ago | IN | 0 ETH | 0.00176111 | ||||
Delete Pull Paym... | 11436538 | 1339 days ago | IN | 0 ETH | 0.00176111 | ||||
Delete Pull Paym... | 11436537 | 1339 days ago | IN | 0 ETH | 0.00176111 | ||||
Delete Pull Paym... | 11436537 | 1339 days ago | IN | 0 ETH | 0.00176111 | ||||
Delete Pull Paym... | 11436537 | 1339 days ago | IN | 0 ETH | 0.00083098 |
Latest 8 internal transactions
Advanced mode:
Loading...
Loading
Contract Name:
PumaPayPullPaymentV2_2
Compiler Version
v0.5.10+commit.5a6ea5b1
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-02-25 */ pragma solidity 0.5.10; /** * @title ERC20 interface * @dev see https://eips.ethereum.org/EIPS/eip-20 */ interface IERC20 { function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @title SafeMath * @dev Unsigned math operations with safety checks that revert on error */ library SafeMath { /** * @dev Multiplies two unsigned integers, reverts on 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-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b); return c; } /** * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a); uint256 c = a - b; return c; } /** * @dev Adds two unsigned integers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; } /** * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0); return a % b; } } /** * @title PayableOwnable * @dev The PayableOwnable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". * PayableOwnable is extended from open-zeppelin Ownable smart contract, with the difference of making the owner * a payable address. */ contract PayableOwnable { address payable internal _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor() internal { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } /** * @return the address of the owner. */ function owner() public view returns (address payable) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner()); _; } /** * @return true if `msg.sender` is the owner of the contract. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev Allows the current owner to relinquish control of the contract. * @notice Renouncing to ownership will leave the contract without an owner. * It will not be possible to call the functions with the `onlyOwner` * modifier anymore. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address payable newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function _transferOwnership(address payable newOwner) internal { require(newOwner != address(0)); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /// @title PumaPay Pull Payment V2.1 - Contract that facilitates our pull payment protocol /// V2.1 of the protocol removes the notion of the `pull payment executors` i.e. the addresses /// that can execute a pull payment `executePullPayment()`. That function is now publicly available. /// We are also changing the `pullPayments` mapping. Instead of having address -> address -> PullPayment, /// ot will be address -> bytes32 -> PullPayment, with bytes32 being the pull payment ID. /// @author PumaPay Dev Team - <[email protected]> contract PumaPayPullPaymentV2_2 is PayableOwnable { using SafeMath for uint256; /// =============================================================================================================== /// Events /// =============================================================================================================== event LogExecutorAdded(address executor); event LogExecutorRemoved(address executor); event LogSmartContractActorFunded(string actorRole, address actor, uint256 timestamp); event LogPaymentRegistered( address customerAddress, bytes32 paymentID, bytes32 businessID, bytes32 uniqueReferenceID ); event LogPaymentCancelled( address customerAddress, bytes32 paymentID, bytes32 businessID, bytes32 uniqueReferenceID ); event LogPullPaymentExecuted( address customerAddress, bytes32 paymentID, bytes32 businessID, bytes32 uniqueReferenceID, uint256 amountInPMA, uint256 conversionRate ); /// =============================================================================================================== /// Constants /// =============================================================================================================== uint256 constant private RATE_CALCULATION_NUMBER = 10 ** 26; /// Check `calculatePMAFromFiat()` for more details uint256 constant private OVERFLOW_LIMITER_NUMBER = 10 ** 20; /// 1e^20 - Prevent numeric overflows /// @dev The following variables are not needed any more, but are kept hre for clarity on the calculation that /// is being done for the PMA to Fiat from rate. /// uint256 constant private DECIMAL_FIXER = 10 ** 10; /// 1e^10 - This transforms the Rate from decimals to uint256 /// uint256 constant private FIAT_TO_CENT_FIXER = 100; /// Fiat currencies have 100 cents in 1 basic monetary unit. uint256 constant private ONE_ETHER = 1 ether; /// PumaPay token has 18 decimals - same as one ETHER uint256 constant private FUNDING_AMOUNT = 0.5 ether; /// Amount to transfer to owner/executor uint256 constant private MINIMUM_AMOUNT_OF_ETH_FOR_OPERATORS = 0.15 ether; /// min amount of ETH for owner/executor bytes32 constant private TYPE_SINGLE_PULL_PAYMENT = "2"; bytes32 constant private TYPE_RECURRING_PULL_PAYMENT = "3"; bytes32 constant private TYPE_RECURRING_PULL_PAYMENT_WITH_INITIAL = "4"; bytes32 constant private TYPE_PULL_PAYMENT_WITH_FREE_TRIAL = "5"; bytes32 constant private TYPE_PULL_PAYMENT_WITH_PAID_TRIAL = "6"; bytes32 constant private TYPE_SINGLE_DYNAMIC_PULL_PAYMENT = "7"; bytes32 constant private EMPTY_BYTES32 = ""; /// =============================================================================================================== /// Members /// =============================================================================================================== IERC20 public token; mapping(address => bool) public executors; mapping(bytes32 => PullPayment) public pullPayments; struct PullPayment { bytes32[3] paymentIds; /// [0] paymentID / [1] businessID / [2] uniqueReferenceID bytes32 paymentType; /// Type of Pull Payment - must be one of the defined pull payment types string currency; /// 3-letter abbr i.e. 'EUR' / 'USD' etc. uint256 initialConversionRate; /// conversion rate for first payment execution uint256 initialPaymentAmountInCents; /// initial payment amount in fiat in cents uint256 fiatAmountInCents; /// payment amount in fiat in cents uint256 frequency; /// how often merchant can pull - in seconds uint256 numberOfPayments; /// amount of pull payments merchant can make uint256 startTimestamp; /// when subscription starts - in seconds uint256 trialPeriod; /// trial period of the pull payment - in seconds uint256 nextPaymentTimestamp; /// timestamp of next payment uint256 lastPaymentTimestamp; /// timestamp of last payment uint256 cancelTimestamp; /// timestamp the payment was cancelled address treasuryAddress; /// address which pma tokens will be transfer to on execution address executorAddress; /// address that can execute the pull payment } /// =============================================================================================================== /// Modifiers /// =============================================================================================================== modifier isExecutor() { require(executors[msg.sender], "msg.sender not an executor"); _; } modifier executorExists(address _executor) { require(executors[_executor], "Executor does not exists."); _; } modifier executorDoesNotExists(address _executor) { require(!executors[_executor], "Executor already exists."); _; } modifier paymentExists(bytes32 _paymentID) { require(pullPayments[_paymentID].paymentIds[0] != "", "Pull Payment does not exists."); _; } modifier paymentNotCancelled(bytes32 _paymentID) { require(pullPayments[_paymentID].cancelTimestamp == 0, "Pull Payment is cancelled"); _; } modifier isValidPullPaymentExecutionRequest( bytes32 _paymentID, uint256 _paymentNumber) { require(pullPayments[_paymentID].numberOfPayments == _paymentNumber, "Invalid pull payment execution request - Pull payment number of payment is invalid"); require((pullPayments[_paymentID].initialPaymentAmountInCents > 0 || (now >= pullPayments[_paymentID].startTimestamp && now >= pullPayments[_paymentID].nextPaymentTimestamp) ), "Invalid pull payment execution request - Time of execution is invalid." ); require(pullPayments[_paymentID].numberOfPayments > 0, "Invalid pull payment execution request - Number of payments is zero."); require( (pullPayments[_paymentID].cancelTimestamp == 0 || pullPayments[_paymentID].cancelTimestamp > pullPayments[_paymentID].nextPaymentTimestamp), "Invalid pull payment execution request - Pull payment is cancelled"); require(keccak256( abi.encodePacked(pullPayments[_paymentID].paymentIds[0]) ) == keccak256(abi.encodePacked(_paymentID)), "Invalid pull payment execution request - Payment ID not matching."); _; } modifier isValidDeletionRequest(bytes32 _paymentID, address _customerAddress) { require(_paymentID != EMPTY_BYTES32, "Invalid deletion request - Payment ID is empty."); require(_customerAddress != address(0), "Invalid deletion request - Client address is ZERO_ADDRESS."); _; } modifier isValidAddress(address _address) { require(_address != address(0), "Invalid address - ZERO_ADDRESS provided"); _; } modifier validAmount(uint256 _amount) { require(_amount > 0, "Invalid amount - Must be higher than zero"); require(_amount <= OVERFLOW_LIMITER_NUMBER, "Invalid amount - Must be lower than the overflow limit."); _; } /// =============================================================================================================== /// Constructor /// =============================================================================================================== /// @dev Contract constructor - sets the token address that the contract facilitates. /// @param _token Token Address. constructor(address _token) public { require(_token != address(0), "Invalid address for token - ZERO_ADDRESS provided"); token = IERC20(_token); } // @notice Will receive any eth sent to the contract function() external payable { } /// =============================================================================================================== /// Public Functions - Owner Only /// =============================================================================================================== /// @dev Adds a new executor. - can be executed only by the onwer. /// When adding a new executor 0.5 ETH is transferred to allow the executor to pay for gas. /// The balance of the owner is also checked and if funding is needed 0.5 ETH is transferred. /// @param _executor - address of the executor which cannot be zero address. function addExecutor(address payable _executor) public onlyOwner isValidAddress(_executor) executorDoesNotExists(_executor) { executors[_executor] = true; if (isFundingNeeded(_executor)) { _executor.transfer(FUNDING_AMOUNT); emit LogSmartContractActorFunded("executor", _executor, now); } if (isFundingNeeded(owner())) { owner().transfer(FUNDING_AMOUNT); emit LogSmartContractActorFunded("owner", owner(), now); } emit LogExecutorAdded(_executor); } /// @dev Removes a new executor. - can be executed only by the owner. /// The balance of the owner is checked and if funding is needed 0.5 ETH is transferred. /// @param _executor - address of the executor which cannot be zero address. function removeExecutor(address payable _executor) public onlyOwner isValidAddress(_executor) executorExists(_executor) { executors[_executor] = false; if (isFundingNeeded(owner())) { owner().transfer(FUNDING_AMOUNT); emit LogSmartContractActorFunded("owner", owner(), now); } emit LogExecutorRemoved(_executor); } /// =============================================================================================================== /// Public Functions - Executors Only /// =============================================================================================================== /// @dev Registers a new pull payment to the PumaPay Pull Payment Contract - The registration can be executed only /// by one of the executors of the PumaPay Pull Payment Contract /// and the PumaPay Pull Payment Contract checks that the pull payment has been singed by the customer of the account. /// If the pull payment doesn't have a trial period, the first execution will take place.' /// The pull payment is updated accordingly in terms of how many payments can happen, and when is the next payment date. /// (For more details on the above check the 'executePullPayment' method. /// The balance of the executor (msg.sender) is checked and if funding is needed 0.5 ETH is transferred. /// Emits 'LogPaymentRegistered' with customer address, pull payment executor address and paymentID. /// @param v - recovery ID of the ETH signature. - https://github.com/ethereum/EIPs/issues/155 /// @param r - R output of ECDSA signature. /// @param s - S output of ECDSA signature. /// @param _paymentDetails - all the relevant id-related details for the payment. /// @param _addresses - all the relevant addresses for the payment. /// @param _paymentAmounts - all the relevant amounts for the payment. /// @param _paymentTimestamps - all the relevant timestamps for the payment. /// @param _currency - currency of the payment / 3-letter abbr i.e. 'EUR'. function registerPullPayment( uint8 v, bytes32 r, bytes32 s, bytes32[4] memory _paymentDetails, // 0 paymentID, 1 businessID, 2 uniqueReferenceID, 3 paymentType address[3] memory _addresses, // 0 customer, 1 executor, 2 treasury uint256[3] memory _paymentAmounts, // 0 _initialConversionRate, 1 _fiatAmountInCents, 2 _initialPaymentAmountInCents uint256[4] memory _paymentTimestamps, // 0 _frequency, 1 _numberOfPayments, 2 _startTimestamp, 3 _trialPeriod string memory _currency ) public isExecutor() { require(pullPayments[_paymentDetails[0]].paymentIds[0] == "", "Pull Payment already exists."); require(_paymentDetails[0] != EMPTY_BYTES32, "Payment ID is empty."); require(_paymentDetails[1] != EMPTY_BYTES32, "Business ID is empty."); require(_paymentDetails[2] != EMPTY_BYTES32, "Unique Reference ID is empty."); require(_paymentDetails[3] != EMPTY_BYTES32, "Payment Type is empty."); require(_addresses[0] != address(0), "Customer Address is ZERO_ADDRESS."); require(_addresses[1] != address(0), "Treasury Address is ZERO_ADDRESS."); require(_paymentAmounts[0] > 0, "Initial conversion rate is zero."); require(_paymentAmounts[1] > 0, "Payment amount in fiat is zero."); require(_paymentAmounts[2] >= 0, "Initial payment amount in fiat is less than zero."); require(_paymentTimestamps[0] > 0, "Payment frequency is zero."); require(_paymentTimestamps[1] > 0, "Payment number of payments is zero."); require(_paymentTimestamps[2] > 0, "Payment start time is zero."); require(_paymentTimestamps[3] >= 0, "Payment trial period is less than zero."); require(_paymentAmounts[0] <= OVERFLOW_LIMITER_NUMBER, "Initial conversion rate is higher thant the overflow limit."); require(_paymentAmounts[1] <= OVERFLOW_LIMITER_NUMBER, "Payment amount in fiat is higher thant the overflow limit."); require(_paymentAmounts[2] <= OVERFLOW_LIMITER_NUMBER, "Payment initial amount in fiat is higher thant the overflow limit."); require(_paymentTimestamps[0] <= OVERFLOW_LIMITER_NUMBER, "Payment frequency is higher thant the overflow limit."); require(_paymentTimestamps[1] <= OVERFLOW_LIMITER_NUMBER, "Payment number of payments is higher thant the overflow limit."); require(_paymentTimestamps[2] <= OVERFLOW_LIMITER_NUMBER, "Payment start time is higher thant the overflow limit."); require(_paymentTimestamps[3] <= OVERFLOW_LIMITER_NUMBER, "Payment trial period is higher thant the overflow limit."); require(bytes(_currency).length > 0, "Currency is empty"); pullPayments[_paymentDetails[0]].paymentIds[0] = _paymentDetails[0]; pullPayments[_paymentDetails[0]].paymentType = _paymentDetails[3]; pullPayments[_paymentDetails[0]].executorAddress = _addresses[1]; pullPayments[_paymentDetails[0]].treasuryAddress = _addresses[2]; pullPayments[_paymentDetails[0]].initialConversionRate = _paymentAmounts[0]; pullPayments[_paymentDetails[0]].fiatAmountInCents = _paymentAmounts[1]; pullPayments[_paymentDetails[0]].initialPaymentAmountInCents = _paymentAmounts[2]; pullPayments[_paymentDetails[0]].frequency = _paymentTimestamps[0]; pullPayments[_paymentDetails[0]].numberOfPayments = _paymentTimestamps[1]; pullPayments[_paymentDetails[0]].startTimestamp = _paymentTimestamps[2]; pullPayments[_paymentDetails[0]].trialPeriod = _paymentTimestamps[3]; pullPayments[_paymentDetails[0]].currency = _currency; require(isValidRegistration( v, r, s, _addresses[0], pullPayments[_paymentDetails[0]]), "Invalid pull payment registration - ECRECOVER_FAILED" ); pullPayments[_paymentDetails[0]].paymentIds[1] = _paymentDetails[1]; pullPayments[_paymentDetails[0]].paymentIds[2] = _paymentDetails[2]; pullPayments[_paymentDetails[0]].cancelTimestamp = 0; /// @dev In case of a free trial period the start timestamp of the payment /// is the start timestamp that was signed by the customer + the trial period. /// A payment is not needed during registration. if (_paymentDetails[3] == TYPE_PULL_PAYMENT_WITH_FREE_TRIAL) { pullPayments[_paymentDetails[0]].nextPaymentTimestamp = _paymentTimestamps[2] + _paymentTimestamps[3]; pullPayments[_paymentDetails[0]].lastPaymentTimestamp = 0; /// @dev In case of a recurring payment with initial amount /// the first payment of the 'initialPaymentAmountInCents' and 'initialConversionRate' /// will happen on registration. /// Once it happens, we set the next payment timestamp as /// the start timestamp signed by the customer + trial period } else if (_paymentDetails[3] == TYPE_RECURRING_PULL_PAYMENT_WITH_INITIAL) { require(executePullPaymentOnRegistration( [_paymentDetails[0], _paymentDetails[1], _paymentDetails[2]], // 0 paymentID, 1 businessID, 2 uniqueReferenceID [_addresses[0], _addresses[1], _addresses[2]], // 0 Customer Address, 1 executor Address, 2 Treasury Address [_paymentAmounts[2], _paymentAmounts[0]] // 0 initialPaymentAmountInCents, 1 initialConversionRate )); pullPayments[_paymentDetails[0]].lastPaymentTimestamp = now; pullPayments[_paymentDetails[0]].nextPaymentTimestamp = _paymentTimestamps[2] + _paymentTimestamps[0]; /// @dev In the case od a paid trial, the first payment happens /// on registration using the 'initialPaymentAmountInCents' and 'initialConversionRate'. /// When the first payment takes place we set the next payment timestamp /// as the start timestamp that was signed by the customer + the trial period } else if (_paymentDetails[3] == TYPE_PULL_PAYMENT_WITH_PAID_TRIAL) { require(executePullPaymentOnRegistration( [_paymentDetails[0], _paymentDetails[1], _paymentDetails[2]], /// paymentID , businessID , uniqueReferenceID [_addresses[0], _addresses[1], _addresses[2]], // 0 Customer Address, 1 executor Address, 2 Treasury Address [_paymentAmounts[2], _paymentAmounts[0]] /// 0 initialPaymentAmountInCents, 1 initialConversionRate )); pullPayments[_paymentDetails[0]].lastPaymentTimestamp = now; pullPayments[_paymentDetails[0]].nextPaymentTimestamp = _paymentTimestamps[2] + _paymentTimestamps[3]; /// @dev For the rest of the cases the first payment happens on registration /// using the 'fiatAmountInCents' and 'initialConversionRate'. /// When the first payment takes place, the number of payment is decreased by 1, /// and the next payment timestamp is set to the start timestamp signed by the /// customer + the frequency of the payment. } else { require(executePullPaymentOnRegistration( [_paymentDetails[0], _paymentDetails[1], _paymentDetails[2]], /// paymentID , businessID , uniqueReferenceID [_addresses[0], _addresses[1], _addresses[2]], // 0 Customer Address, 1 executor Address, 2 Treasury Address [_paymentAmounts[1], _paymentAmounts[0]] /// fiatAmountInCents, initialConversionRate )); pullPayments[_paymentDetails[0]].lastPaymentTimestamp = now; pullPayments[_paymentDetails[0]].nextPaymentTimestamp = _paymentTimestamps[2] + _paymentTimestamps[0]; pullPayments[_paymentDetails[0]].numberOfPayments = _paymentTimestamps[1] - 1; } if (isFundingNeeded(msg.sender)) { msg.sender.transfer(FUNDING_AMOUNT); emit LogSmartContractActorFunded("executor", msg.sender, now); } emit LogPaymentRegistered(_addresses[0], _paymentDetails[0], _paymentDetails[1], _paymentDetails[2]); } /// @dev Deletes a pull payment for a pull payment executor - The deletion needs can be executed only by one of the /// executors of the PumaPay Pull Payment Contract /// and the PumaPay Pull Payment Contract checks that the pull payment executor and the paymentID have /// been singed by the customer of the account. /// This method sets the cancellation of the pull payment in the pull payments array for this pull payment executor specified. /// The balance of the executor (msg.sender) is checked and if funding is needed 0.5 ETH is transferred. /// Emits 'LogPaymentCancelled' with pull payment executor address and paymentID. /// @param v - recovery ID of the ETH signature. - https://github.com/ethereum/EIPs/issues/155 /// @param r - R output of ECDSA signature. /// @param s - S output of ECDSA signature. /// @param _paymentID - ID of the payment. /// @param _customerAddress - customer address that is linked to this pull payment. /// @param _pullPaymentExecutor - address that is allowed to execute this pull payment. function deletePullPayment( uint8 v, bytes32 r, bytes32 s, bytes32 _paymentID, address _customerAddress, address _pullPaymentExecutor ) public isExecutor() paymentExists(_paymentID) paymentNotCancelled(_paymentID) isValidDeletionRequest(_paymentID, _customerAddress) { require(isValidDeletion(v, r, s, _paymentID, _customerAddress, _pullPaymentExecutor), "Invalid deletion - ECRECOVER_FAILED."); pullPayments[_paymentID].cancelTimestamp = now; if (isFundingNeeded(msg.sender)) { msg.sender.transfer(FUNDING_AMOUNT); emit LogSmartContractActorFunded("executor", msg.sender, now); } emit LogPaymentCancelled( _customerAddress, _paymentID, pullPayments[_paymentID].paymentIds[1], pullPayments[_paymentID].paymentIds[2] ); } /// =============================================================================================================== /// Public Functions /// =============================================================================================================== /// @dev Executes a pull payment for the msg.sender - The pull payment should exist and the payment request /// should be valid in terms of when it can be executed. /// Emits 'LogPullPaymentExecuted' with customer address, msg.sender as the pull payment executor address and the paymentID. /// Use Case: Single/Recurring Fixed Pull Payment /// ------------------------------------------------ /// We calculate the amount in PMA using the conversion rate specified when calling the method. /// From the 'conversionRate' and the 'fiatAmountInCents' we calculate the amount of PMA that /// the business need to receive in their treasuryAddress. /// The smart contract transfers from the customer account to the treasury wallet the amount in PMA. /// After execution we set the last payment timestamp to NOW, the next payment timestamp is incremented by /// the frequency and the number of payments is decreased by 1. /// @param _customerAddress - address of the customer from which the msg.sender requires to pull funds. /// @param _paymentID - ID of the payment. /// @param _paymentDetails - Payment details - [0] conversion rate // [1] payment Number function executePullPayment(address _customerAddress, bytes32 _paymentID, uint256[2] memory _paymentDetails) public paymentExists(_paymentID) isValidPullPaymentExecutionRequest(_paymentID, _paymentDetails[1]) validAmount(_paymentDetails[0]) returns (bool) { uint256 conversionRate = _paymentDetails[0]; address customerAddress = _customerAddress; bytes32[3] memory paymentIds = pullPayments[_paymentID].paymentIds; address treasury = pullPayments[_paymentID].treasuryAddress; uint256 amountInPMA = calculatePMAFromFiat(pullPayments[paymentIds[0]].fiatAmountInCents, conversionRate); pullPayments[paymentIds[0]].nextPaymentTimestamp = pullPayments[paymentIds[0]].nextPaymentTimestamp + pullPayments[paymentIds[0]].frequency; pullPayments[paymentIds[0]].numberOfPayments = pullPayments[paymentIds[0]].numberOfPayments - 1; pullPayments[paymentIds[0]].lastPaymentTimestamp = now; require(token.transferFrom( customerAddress, treasury, amountInPMA )); emit LogPullPaymentExecuted( customerAddress, paymentIds[0], paymentIds[1], paymentIds[2], amountInPMA, conversionRate ); return true; } /// =============================================================================================================== /// Internal Functions /// =============================================================================================================== /// @dev The new version of the smart contract allows for the first execution to happen on registration, /// unless the pull payment has free trial. Check the comments on 'registerPullPayment' method for more details. function executePullPaymentOnRegistration( bytes32[3] memory _paymentDetails, // 0 paymentID, 1 businessID, 2 uniqueReferenceID address[3] memory _addresses, // 0 customer Address, 1, executor Address, 2 treasury Address uint256[2] memory _paymentAmounts // 0 _fiatAmountInCents, 1 _conversionRate ) internal returns (bool) { uint256 amountInPMA = calculatePMAFromFiat(_paymentAmounts[0], _paymentAmounts[1]); require(token.transferFrom(_addresses[0], _addresses[2], amountInPMA)); emit LogPullPaymentExecuted( _addresses[0], _paymentDetails[0], _paymentDetails[1], _paymentDetails[2], amountInPMA, _paymentAmounts[1] ); return true; } /// @dev Calculates the PMA Rate for the fiat currency specified - The rate is set every 10 minutes by our PMA server /// for the currencies specified in the smart contract. /// @param _fiatAmountInCents - payment amount in fiat CENTS so that is always integer /// @param _conversionRate - conversion rate with which the payment needs to take place /// RATE CALCULATION EXAMPLE /// ------------------------ /// RATE ==> 1 PMA = 0.01 USD$ /// 1 USD$ = 1/0.01 PMA = 100 PMA /// Start the calculation from one ether - PMA Token has 18 decimals /// Multiply by the DECIMAL_FIXER (1e+10) to fix the multiplication of the rate /// Multiply with the fiat amount in cents /// Divide by the Rate of PMA to Fiat in cents /// Divide by the FIAT_TO_CENT_FIXER to fix the _fiatAmountInCents /// --------------------------------------------------------------------------------------------------------------- /// To save on gas, we have 'pre-calculated' the equation below and have set a constant in its place. /// ONE_ETHER.mul(DECIMAL_FIXER).div(FIAT_TO_CENT_FIXER) = RATE_CALCULATION_NUMBER /// ONE_ETHER = 10^18 | /// DECIMAL_FIXER = 10^10 | => 10^18 * 10^10 / 100 ==> 10^26 => RATE_CALCULATION_NUMBER = 10^26 /// FIAT_TO_CENT_FIXER = 100 | /// NOTE: The aforementioned value is linked to the OVERFLOW_LIMITER_NUMBER which is set to 10^20. /// --------------------------------------------------------------------------------------------------------------- function calculatePMAFromFiat(uint256 _fiatAmountInCents, uint256 _conversionRate) internal pure validAmount(_fiatAmountInCents) validAmount(_conversionRate) returns (uint256) { return RATE_CALCULATION_NUMBER.mul(_fiatAmountInCents).div(_conversionRate); } /// @dev Checks if a registration request is valid by comparing the v, r, s params /// and the hashed params with the customer address. /// @param v - recovery ID of the ETH signature. - https://github.com/ethereum/EIPs/issues/155 /// @param r - R output of ECDSA signature. /// @param s - S output of ECDSA signature. /// @param _customerAddress - customer address that is linked to this pull payment. /// @param _pullPayment - pull payment to be validated. /// @return bool - if the v, r, s params with the hashed params match the customer address function isValidRegistration( uint8 v, bytes32 r, bytes32 s, address _customerAddress, PullPayment memory _pullPayment ) internal pure returns (bool) { return ecrecover( keccak256( abi.encodePacked( _pullPayment.executorAddress, _pullPayment.paymentIds[0], _pullPayment.paymentType, _pullPayment.treasuryAddress, _pullPayment.currency, _pullPayment.initialPaymentAmountInCents, _pullPayment.fiatAmountInCents, _pullPayment.frequency, _pullPayment.numberOfPayments, _pullPayment.startTimestamp, _pullPayment.trialPeriod ) ), v, r, s) == _customerAddress; } /// @dev Checks if a deletion request is valid by comparing the v, r, s params /// and the hashed params with the customer address. /// @param v - recovery ID of the ETH signature. - https://github.com/ethereum/EIPs/issues/155 /// @param r - R output of ECDSA signature. /// @param s - S output of ECDSA signature. /// @param _paymentID - ID of the payment. /// @param _customerAddress - customer address that is linked to this pull payment. /// @param _pullPaymentExecutor - address that is allowed to execute this pull payment. /// @return bool - if the v, r, s params with the hashed params match the customer address function isValidDeletion( uint8 v, bytes32 r, bytes32 s, bytes32 _paymentID, address _customerAddress, address _pullPaymentExecutor ) internal view returns (bool) { return ecrecover( keccak256( abi.encodePacked( _paymentID, _pullPaymentExecutor ) ), v, r, s) == _customerAddress && keccak256( abi.encodePacked(pullPayments[_paymentID].paymentIds[0]) ) == keccak256(abi.encodePacked(_paymentID) ); } /// @dev Checks if the address of an owner/executor needs to be funded. /// The minimum amount the owner/executors should always have is 0.15 ETH /// @param _address - address of owner/executors that the balance is checked against. /// @return bool - whether the address needs more ETH. function isFundingNeeded(address _address) private view returns (bool) { return address(_address).balance <= MINIMUM_AMOUNT_OF_ETH_FOR_OPERATORS; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"pullPayments","outputs":[{"name":"paymentType","type":"bytes32"},{"name":"currency","type":"string"},{"name":"initialConversionRate","type":"uint256"},{"name":"initialPaymentAmountInCents","type":"uint256"},{"name":"fiatAmountInCents","type":"uint256"},{"name":"frequency","type":"uint256"},{"name":"numberOfPayments","type":"uint256"},{"name":"startTimestamp","type":"uint256"},{"name":"trialPeriod","type":"uint256"},{"name":"nextPaymentTimestamp","type":"uint256"},{"name":"lastPaymentTimestamp","type":"uint256"},{"name":"cancelTimestamp","type":"uint256"},{"name":"treasuryAddress","type":"address"},{"name":"executorAddress","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_executor","type":"address"}],"name":"addExecutor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_executor","type":"address"}],"name":"removeExecutor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"},{"name":"_paymentDetails","type":"bytes32[4]"},{"name":"_addresses","type":"address[3]"},{"name":"_paymentAmounts","type":"uint256[3]"},{"name":"_paymentTimestamps","type":"uint256[4]"},{"name":"_currency","type":"string"}],"name":"registerPullPayment","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"executors","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"},{"name":"_paymentID","type":"bytes32"},{"name":"_customerAddress","type":"address"},{"name":"_pullPaymentExecutor","type":"address"}],"name":"deletePullPayment","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_customerAddress","type":"address"},{"name":"_paymentID","type":"bytes32"},{"name":"_paymentDetails","type":"uint256[2]"}],"name":"executePullPayment","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_token","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"executor","type":"address"}],"name":"LogExecutorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"executor","type":"address"}],"name":"LogExecutorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"actorRole","type":"string"},{"indexed":false,"name":"actor","type":"address"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"LogSmartContractActorFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"customerAddress","type":"address"},{"indexed":false,"name":"paymentID","type":"bytes32"},{"indexed":false,"name":"businessID","type":"bytes32"},{"indexed":false,"name":"uniqueReferenceID","type":"bytes32"}],"name":"LogPaymentRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"customerAddress","type":"address"},{"indexed":false,"name":"paymentID","type":"bytes32"},{"indexed":false,"name":"businessID","type":"bytes32"},{"indexed":false,"name":"uniqueReferenceID","type":"bytes32"}],"name":"LogPaymentCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"customerAddress","type":"address"},{"indexed":false,"name":"paymentID","type":"bytes32"},{"indexed":false,"name":"businessID","type":"bytes32"},{"indexed":false,"name":"uniqueReferenceID","type":"bytes32"},{"indexed":false,"name":"amountInPMA","type":"uint256"},{"indexed":false,"name":"conversionRate","type":"uint256"}],"name":"LogPullPaymentExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162004be638038062004be6833981810160405260208110156200003757600080fd5b8101908080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200018c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603181526020018062004bb56031913960400191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506149d780620001de6000396000f3fe6080604052600436106100a75760003560e01c80638f32d59b116100645780638f32d59b1461050e5780639ac2a0111461053d578063d8516935146105a6578063f2fde38b14610642578063fbe77c6614610693578063fc0c546a14610747576100a7565b806306751135146100a95780631f5a0bbe1461021057806324788429146102615780633f72b458146102b2578063715018a6146104a05780638da5cb5b146104b7575b005b3480156100b557600080fd5b506100e2600480360360208110156100cc57600080fd5b810190808035906020019092919050505061079e565b604051808f8152602001806020018e81526020018d81526020018c81526020018b81526020018a81526020018981526020018881526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182810382528f818151815260200191508051906020019080838360005b838110156101c85780820151818401526020810190506101ad565b50505050905090810190601f1680156101f55780820380516001836020036101000a031916815260200191505b509f5050505050505050505050505050505060405180910390f35b34801561021c57600080fd5b5061025f6004803603602081101561023357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108e2565b005b34801561026d57600080fd5b506102b06004803603602081101561028457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d14565b005b3480156102be57600080fd5b5061049e60048036036102408110156102d657600080fd5b81019080803560ff169060200190929190803590602001909291908035906020019092919080608001906004806020026040519081016040528092919082600460200280828437600081840152601f19601f820116905080830192505050505050919291929080606001906003806020026040519081016040528092919082600360200280828437600081840152601f19601f820116905080830192505050505050919291929080606001906003806020026040519081016040528092919082600360200280828437600081840152601f19601f820116905080830192505050505050919291929080608001906004806020026040519081016040528092919082600460200280828437600081840152601f19601f82011690508083019250505050505091929192908035906020019064010000000081111561041857600080fd5b82018360208201111561042a57600080fd5b8035906020019184600183028401116401000000008311171561044c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611043565b005b3480156104ac57600080fd5b506104b5612baf565b005b3480156104c357600080fd5b506104cc612c7f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561051a57600080fd5b50610523612ca8565b604051808215151515815260200191505060405180910390f35b34801561054957600080fd5b5061058c6004803603602081101561056057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612cff565b604051808215151515815260200191505060405180910390f35b3480156105b257600080fd5b50610640600480360360c08110156105c957600080fd5b81019080803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d1f565b005b34801561064e57600080fd5b506106916004803603602081101561066557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613238565b005b34801561069f57600080fd5b5061072d600480360360808110156106b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f8201169050808301925050505050509192919290505050613255565b604051808215151515815260200191505060405180910390f35b34801561075357600080fd5b5061075c613aa5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6003602052806000526040600020600091509050806003015490806004018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108505780601f1061082557610100808354040283529160200191610850565b820191906000526020600020905b81548152906001019060200180831161083357829003601f168201915b50505050509080600501549080600601549080600701549080600801549080600901549080600a01549080600b01549080600c01549080600d01549080600e01549080600f0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060100160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508e565b6108ea612ca8565b6108f357600080fd5b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561097a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061497c6027913960400191505060405180910390fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610a3b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4578656375746f7220616c7265616479206578697374732e000000000000000081525060200191505060405180910390fd5b6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610a9c83613acb565b15610b95578273ffffffffffffffffffffffffffffffffffffffff166108fc6706f05b59d3b200009081150290604051600060405180830381858888f19350505050158015610aef573d6000803e3d6000fd5b507ff1dc68e5a16317df216458b71f8b5d94664142dcd04b1b2a4153a548ef717705834260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260088152602001807f6578656375746f72000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b610ba5610ba0612c7f565b613acb565b15610cac57610bb2612c7f565b73ffffffffffffffffffffffffffffffffffffffff166108fc6706f05b59d3b200009081150290604051600060405180830381858888f19350505050158015610bff573d6000803e3d6000fd5b507ff1dc68e5a16317df216458b71f8b5d94664142dcd04b1b2a4153a548ef717705610c29612c7f565b4260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260058152602001807f6f776e6572000000000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b7f8002cf25aa76b379f7f97c8fe71f2bb091370573ab719fd656612219aae890ba83604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b610d1c612ca8565b610d2557600080fd5b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061497c6027913960400191505060405180910390fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e6c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4578656375746f7220646f6573206e6f74206578697374732e0000000000000081525060200191505060405180910390fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610ed4610ecf612c7f565b613acb565b15610fdb57610ee1612c7f565b73ffffffffffffffffffffffffffffffffffffffff166108fc6706f05b59d3b200009081150290604051600060405180830381858888f19350505050158015610f2e573d6000803e3d6000fd5b507ff1dc68e5a16317df216458b71f8b5d94664142dcd04b1b2a4153a548ef717705610f58612c7f565b4260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260058152602001807f6f776e6572000000000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b7f67c86b0b9218d30f0d89e72b9aafcace5cd51e46f60fdf6f3323877952e21c4b83604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611102576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6d73672e73656e646572206e6f7420616e206578656375746f7200000000000081525060200191505060405180910390fd5b6000600360008760006004811061111557fe5b6020020151815260200190815260200160002060000160006003811061113757fe5b0154146111ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f50756c6c205061796d656e7420616c7265616479206578697374732e0000000081525060200191505060405180910390fd5b6000801916856000600481106111be57fe5b60200201511415611237576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061796d656e7420494420697320656d7074792e00000000000000000000000081525060200191505060405180910390fd5b60008019168560016004811061124957fe5b602002015114156112c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f427573696e65737320494420697320656d7074792e000000000000000000000081525060200191505060405180910390fd5b6000801916856002600481106112d457fe5b6020020151141561134d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f556e69717565205265666572656e636520494420697320656d7074792e00000081525060200191505060405180910390fd5b60008019168560036004811061135f57fe5b602002015114156113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f5061796d656e74205479706520697320656d7074792e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16846000600381106113fd57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16141561146f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806146cd6021913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168460016003811061149457fe5b602002015173ffffffffffffffffffffffffffffffffffffffff161415611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806147a86021913960400191505060405180910390fd5b60008360006003811061151557fe5b60200201511161158d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f496e697469616c20636f6e76657273696f6e2072617465206973207a65726f2e81525060200191505060405180910390fd5b60008360016003811061159c57fe5b602002015111611614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5061796d656e7420616d6f756e7420696e2066696174206973207a65726f2e0081525060200191505060405180910390fd5b60008360026003811061162357fe5b6020020151101561167f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806148b76031913960400191505060405180910390fd5b60008260006004811061168e57fe5b602002015111611706576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f5061796d656e74206672657175656e6379206973207a65726f2e00000000000081525060200191505060405180910390fd5b60008260016004811061171557fe5b602002015111611770576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146686023913960400191505060405180910390fd5b60008260026004811061177f57fe5b6020020151116117f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f5061796d656e742073746172742074696d65206973207a65726f2e000000000081525060200191505060405180910390fd5b60008260036004811061180657fe5b60200201511015611862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061450f6027913960400191505060405180910390fd5b68056bc75e2d631000008360006003811061187957fe5b602002015111156118d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b8152602001806145ca603b913960400191505060405180910390fd5b68056bc75e2d63100000836001600381106118ec57fe5b60200201511115611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180614734603a913960400191505060405180910390fd5b68056bc75e2d631000008360026003811061195f57fe5b602002015111156119bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806145886042913960600191505060405180910390fd5b68056bc75e2d63100000826000600481106119d257fe5b60200201511115611a2e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806149116035913960400191505060405180910390fd5b68056bc75e2d6310000082600160048110611a4557fe5b60200201511115611aa1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806147c9603e913960400191505060405180910390fd5b68056bc75e2d6310000082600260048110611ab857fe5b60200201511115611b14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806149466036913960400191505060405180910390fd5b68056bc75e2d6310000082600360048110611b2b57fe5b60200201511115611b87576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806148486038913960400191505060405180910390fd5b6000815111611bfe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f43757272656e637920697320656d70747900000000000000000000000000000081525060200191505060405180910390fd5b84600060048110611c0b57fe5b60200201516003600087600060048110611c2157fe5b60200201518152602001908152602001600020600001600060038110611c4357fe5b018190555084600360048110611c5557fe5b60200201516003600087600060048110611c6b57fe5b602002015181526020019081526020016000206003018190555083600160038110611c9257fe5b60200201516003600087600060048110611ca857fe5b6020020151815260200190815260200160002060100160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600260038110611d0957fe5b60200201516003600087600060048110611d1f57fe5b60200201518152602001908152602001600020600f0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600060038110611d8057fe5b60200201516003600087600060048110611d9657fe5b602002015181526020019081526020016000206005018190555082600160038110611dbd57fe5b60200201516003600087600060048110611dd357fe5b602002015181526020019081526020016000206007018190555082600260038110611dfa57fe5b60200201516003600087600060048110611e1057fe5b602002015181526020019081526020016000206006018190555081600060048110611e3757fe5b60200201516003600087600060048110611e4d57fe5b602002015181526020019081526020016000206008018190555081600160048110611e7457fe5b60200201516003600087600060048110611e8a57fe5b602002015181526020019081526020016000206009018190555081600260048110611eb157fe5b60200201516003600087600060048110611ec757fe5b60200201518152602001908152602001600020600a018190555081600360048110611eee57fe5b60200201516003600087600060048110611f0457fe5b60200201518152602001908152602001600020600b0181905550806003600087600060048110611f3057fe5b602002015181526020019081526020016000206004019080519060200190611f599291906143df565b506121a888888887600060038110611f6d57fe5b6020020151600360008b600060048110611f8357fe5b60200201518152602001908152602001600020604051806101e001604052908160008201600380602002604051908101604052809291908260038015611fde576020028201915b815481526020019060010190808311611fca575b5050505050815260200160038201548152602001600482018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561208a5780601f1061205f5761010080835404028352916020019161208a565b820191906000526020600020905b81548152906001019060200180831161206d57829003601f168201915b505050505081526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152602001600e8201548152602001600f820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016010820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050613af7565b6121fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806146346034913960400191505060405180910390fd5b8460016004811061220a57fe5b6020020151600360008760006004811061222057fe5b6020020151815260200190815260200160002060000160016003811061224257fe5b01819055508460026004811061225457fe5b6020020151600360008760006004811061226a57fe5b6020020151815260200190815260200160002060000160026003811061228c57fe5b0181905550600060036000876000600481106122a457fe5b60200201518152602001908152602001600020600e01819055507f3500000000000000000000000000000000000000000000000000000000000000856003600481106122ec57fe5b60200201511415612379578160036004811061230457fe5b60200201518260026004811061231657fe5b602002015101600360008760006004811061232d57fe5b60200201518152602001908152602001600020600c01819055506000600360008760006004811061235a57fe5b60200201518152602001908152602001600020600d01819055506129e4565b7f3400000000000000000000000000000000000000000000000000000000000000856003600481106123a757fe5b6020020151141561259b576125116040518060600160405280876000600481106123cd57fe5b60200201518152602001876001600481106123e457fe5b60200201518152602001876002600481106123fb57fe5b602002015181525060405180606001604052808760006003811061241b57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018760016003811061245e57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001876002600381106124a157fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506040518060400160405280876002600381106124ed57fe5b602002015181526020018760006003811061250457fe5b6020020151815250613cf9565b61251a57600080fd5b42600360008760006004811061252c57fe5b60200201518152602001908152602001600020600d01819055508160006004811061255357fe5b60200201518260026004811061256557fe5b602002015101600360008760006004811061257c57fe5b60200201518152602001908152602001600020600c01819055506129e3565b7f3600000000000000000000000000000000000000000000000000000000000000856003600481106125c957fe5b602002015114156127bd576127336040518060600160405280876000600481106125ef57fe5b602002015181526020018760016004811061260657fe5b602002015181526020018760026004811061261d57fe5b602002015181525060405180606001604052808760006003811061263d57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018760016003811061268057fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001876002600381106126c357fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525060405180604001604052808760026003811061270f57fe5b602002015181526020018760006003811061272657fe5b6020020151815250613cf9565b61273c57600080fd5b42600360008760006004811061274e57fe5b60200201518152602001908152602001600020600d01819055508160036004811061277557fe5b60200201518260026004811061278757fe5b602002015101600360008760006004811061279e57fe5b60200201518152602001908152602001600020600c01819055506129e2565b61291c6040518060600160405280876000600481106127d857fe5b60200201518152602001876001600481106127ef57fe5b602002015181526020018760026004811061280657fe5b602002015181525060405180606001604052808760006003811061282657fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018760016003811061286957fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001876002600381106128ac57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506040518060400160405280876001600381106128f857fe5b602002015181526020018760006003811061290f57fe5b6020020151815250613cf9565b61292557600080fd5b42600360008760006004811061293757fe5b60200201518152602001908152602001600020600d01819055508160006004811061295e57fe5b60200201518260026004811061297057fe5b602002015101600360008760006004811061298757fe5b60200201518152602001908152602001600020600c01819055506001826001600481106129b057fe5b60200201510360036000876000600481106129c757fe5b60200201518152602001908152602001600020600901819055505b5b5b6129ed33613acb565b15612ae6573373ffffffffffffffffffffffffffffffffffffffff166108fc6706f05b59d3b200009081150290604051600060405180830381858888f19350505050158015612a40573d6000803e3d6000fd5b507ff1dc68e5a16317df216458b71f8b5d94664142dcd04b1b2a4153a548ef717705334260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260088152602001807f6578656375746f72000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b7fc0028b6a3e328c438fb316cb08abd17e0f2132ef9c24f0404864f57e4488812d84600060038110612b1457fe5b602002015186600060048110612b2657fe5b602002015187600160048110612b3857fe5b602002015188600260048110612b4a57fe5b6020020151604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390a15050505050505050565b612bb7612ca8565b612bc057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b60026020528060005260406000206000915054906101000a900460ff1681565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612dde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6d73672e73656e646572206e6f7420616e206578656375746f7200000000000081525060200191505060405180910390fd5b82600060036000838152602001908152602001600020600001600060038110612e0357fe5b01541415612e79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f50756c6c205061796d656e7420646f6573206e6f74206578697374732e00000081525060200191505060405180910390fd5b83600060036000838152602001908152602001600020600e015414612f06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f50756c6c205061796d656e742069732063616e63656c6c65640000000000000081525060200191505060405180910390fd5b84846000801916821415612f65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614605602f913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612feb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061476e603a913960400191505060405180910390fd5b612ff98a8a8a8a8a8a613f59565b61304e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806144a76024913960400191505060405180910390fd5b4260036000898152602001908152602001600020600e018190555061307233613acb565b1561316b573373ffffffffffffffffffffffffffffffffffffffff166108fc6706f05b59d3b200009081150290604051600060405180830381858888f193505050501580156130c5573d6000803e3d6000fd5b507ff1dc68e5a16317df216458b71f8b5d94664142dcd04b1b2a4153a548ef717705334260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260088152602001807f6578656375746f72000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b7fc85a0b1d6f3141384cf8132808219851926be1209fa52f30c8713b3f3c6da18c8688600360008b81526020019081526020016000206000016001600381106131b057fe5b0154600360008c81526020019081526020016000206000016002600381106131d457fe5b0154604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390a150505050505050505050565b613240612ca8565b61324957600080fd5b613252816140d3565b50565b60008260006003600083815260200190815260200160002060000160006003811061327c57fe5b015414156132f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f50756c6c205061796d656e7420646f6573206e6f74206578697374732e00000081525060200191505060405180910390fd5b838360016002811061330057fe5b602002015180600360008481526020019081526020016000206009015414613373576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260528152602001806145366052913960600191505060405180910390fd5b6000600360008481526020019081526020016000206006015411806133d0575060036000838152602001908152602001600020600a015442101580156133cf575060036000838152602001908152602001600020600c01544210155b5b613425576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260468152602001806146ee6046913960600191505060405180910390fd5b6000600360008481526020019081526020016000206009015411613494576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260448152602001806144cb6044913960600191505060405180910390fd5b600060036000848152602001908152602001600020600e015414806134e4575060036000838152602001908152602001600020600c015460036000848152602001908152602001600020600e0154115b613539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604281526020018061468b6042913960600191505060405180910390fd5b8160405160200180828152602001915050604051602081830303815290604052805190602001206003600084815260200190815260200160002060000160006003811061358257fe5b0154604051602001808281526020019150506040516020818303038152906040528051906020012014613600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260418152602001806148076041913960600191505060405180910390fd5b8460006002811061360d57fe5b60200201516000811161366b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806148e86029913960400191505060405180910390fd5b68056bc75e2d631000008111156136cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806148806037913960400191505060405180910390fd5b6000866000600281106136dc57fe5b6020020151905060008990506136f061445f565b600360008b815260200190815260200160002060000160038060200260405190810160405280929190826003801561373d576020028201915b815481526020019060010190808311613729575b505050505090506000600360008c8152602001908152602001600020600f0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006137b2600360008560006003811061379557fe5b6020020151815260200190815260200160002060070154866141cb565b905060036000846000600381106137c557fe5b602002015181526020019081526020016000206008015460036000856000600381106137ed57fe5b60200201518152602001908152602001600020600c015401600360008560006003811061381657fe5b60200201518152602001908152602001600020600c01819055506001600360008560006003811061384357fe5b602002015181526020019081526020016000206009015403600360008560006003811061386c57fe5b602002015181526020019081526020016000206009018190555042600360008560006003811061389857fe5b60200201518152602001908152602001600020600d0181905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8584846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561398f57600080fd5b505af11580156139a3573d6000803e3d6000fd5b505050506040513d60208110156139b957600080fd5b81019080805190602001909291905050506139d357600080fd5b7f1a5c297cf93353fa05129304db62d9b76b2ebe8b3a31f577aa3e2cd46c6f82828484600060038110613a0257fe5b602002015185600160038110613a1457fe5b602002015186600260038110613a2657fe5b6020020151858a604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390a1600199505050505050505050509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000670214e8348c4f00008273ffffffffffffffffffffffffffffffffffffffff163111159050919050565b60008273ffffffffffffffffffffffffffffffffffffffff166001836101c001518460000151600060038110613b2957fe5b60200201518560200151866101a00151876040015188608001518960a001518a60c001518b60e001518c61010001518d6101200151604051602001808c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018b81526020018a81526020018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b815260140188805190602001908083835b60208310613c0a5780518252602082019150602081019050602083039250613be7565b6001836020036101000a0380198251168184511680821785525050505050509050018781526020018681526020018581526020018481526020018381526020018281526020019b5050505050505050505050506040516020818303038152906040528051906020012088888860405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015613ccd573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600080613d2883600060028110613d0c57fe5b602002015184600160028110613d1e57fe5b60200201516141cb565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd85600060038110613d7557fe5b602002015186600260038110613d8757fe5b6020020151846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015613e2957600080fd5b505af1158015613e3d573d6000803e3d6000fd5b505050506040513d6020811015613e5357600080fd5b8101908080519060200190929190505050613e6d57600080fd5b7f1a5c297cf93353fa05129304db62d9b76b2ebe8b3a31f577aa3e2cd46c6f828284600060038110613e9b57fe5b602002015186600060038110613ead57fe5b602002015187600160038110613ebf57fe5b602002015188600260038110613ed157fe5b60200201518588600160028110613ee457fe5b6020020151604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390a160019150509392505050565b60008273ffffffffffffffffffffffffffffffffffffffff1660018584604051602001808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b8152601401925050506040516020818303038152906040528051906020012089898960405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561402c573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff161480156140c757508360405160200180828152602001915050604051602081830303815290604052805190602001206003600086815260200190815260200160002060000160006003811061409d57fe5b01546040516020018082815260200191505060405160208183030381529060405280519060200120145b90509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561410d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008260008111614227576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806148e86029913960400191505060405180910390fd5b68056bc75e2d63100000811115614289576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806148806037913960400191505060405180910390fd5b82600081116142e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806148e86029913960400191505060405180910390fd5b68056bc75e2d63100000811115614345576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806148806037913960400191505060405180910390fd5b61437584614367876a52b7d2dcc80cd2e400000061437f90919063ffffffff16565b6143b990919063ffffffff16565b9250505092915050565b60008083141561439257600090506143b3565b60008284029050828482816143a357fe5b04146143ae57600080fd5b809150505b92915050565b60008082116143c757600080fd5b60008284816143d257fe5b0490508091505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061442057805160ff191683800117855561444e565b8280016001018555821561444e579182015b8281111561444d578251825591602001919060010190614432565b5b50905061445b9190614481565b5090565b6040518060600160405280600390602082028038833980820191505090505090565b6144a391905b8082111561449f576000816000905550600101614487565b5090565b9056fe496e76616c69642064656c6574696f6e202d2045435245434f5645525f4641494c45442e496e76616c69642070756c6c207061796d656e7420657865637574696f6e2072657175657374202d204e756d626572206f66207061796d656e7473206973207a65726f2e5061796d656e7420747269616c20706572696f64206973206c657373207468616e207a65726f2e496e76616c69642070756c6c207061796d656e7420657865637574696f6e2072657175657374202d2050756c6c207061796d656e74206e756d626572206f66207061796d656e7420697320696e76616c69645061796d656e7420696e697469616c20616d6f756e7420696e206669617420697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e697469616c20636f6e76657273696f6e207261746520697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e76616c69642064656c6574696f6e2072657175657374202d205061796d656e7420494420697320656d7074792e496e76616c69642070756c6c207061796d656e7420726567697374726174696f6e202d2045435245434f5645525f4641494c45445061796d656e74206e756d626572206f66207061796d656e7473206973207a65726f2e496e76616c69642070756c6c207061796d656e7420657865637574696f6e2072657175657374202d2050756c6c207061796d656e742069732063616e63656c6c6564437573746f6d65722041646472657373206973205a45524f5f414444524553532e496e76616c69642070756c6c207061796d656e7420657865637574696f6e2072657175657374202d2054696d65206f6620657865637574696f6e20697320696e76616c69642e5061796d656e7420616d6f756e7420696e206669617420697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e76616c69642064656c6574696f6e2072657175657374202d20436c69656e742061646472657373206973205a45524f5f414444524553532e54726561737572792041646472657373206973205a45524f5f414444524553532e5061796d656e74206e756d626572206f66207061796d656e747320697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e76616c69642070756c6c207061796d656e7420657865637574696f6e2072657175657374202d205061796d656e74204944206e6f74206d61746368696e672e5061796d656e7420747269616c20706572696f6420697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e76616c696420616d6f756e74202d204d757374206265206c6f776572207468616e20746865206f766572666c6f77206c696d69742e496e697469616c207061796d656e7420616d6f756e7420696e2066696174206973206c657373207468616e207a65726f2e496e76616c696420616d6f756e74202d204d75737420626520686967686572207468616e207a65726f5061796d656e74206672657175656e637920697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e5061796d656e742073746172742074696d6520697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e76616c69642061646472657373202d205a45524f5f414444524553532070726f7669646564a265627a7a7230582078bec68d1480cf9101c04257d6aeaaa02ed94a3a5a1c89ae0c41f943ddacef6564736f6c634300050a0032496e76616c6964206164647265737320666f7220746f6b656e202d205a45524f5f414444524553532070726f7669646564000000000000000000000000846c66cf71c43f80403b51fe3906b3599d63336f
Deployed Bytecode
0x6080604052600436106100a75760003560e01c80638f32d59b116100645780638f32d59b1461050e5780639ac2a0111461053d578063d8516935146105a6578063f2fde38b14610642578063fbe77c6614610693578063fc0c546a14610747576100a7565b806306751135146100a95780631f5a0bbe1461021057806324788429146102615780633f72b458146102b2578063715018a6146104a05780638da5cb5b146104b7575b005b3480156100b557600080fd5b506100e2600480360360208110156100cc57600080fd5b810190808035906020019092919050505061079e565b604051808f8152602001806020018e81526020018d81526020018c81526020018b81526020018a81526020018981526020018881526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182810382528f818151815260200191508051906020019080838360005b838110156101c85780820151818401526020810190506101ad565b50505050905090810190601f1680156101f55780820380516001836020036101000a031916815260200191505b509f5050505050505050505050505050505060405180910390f35b34801561021c57600080fd5b5061025f6004803603602081101561023357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108e2565b005b34801561026d57600080fd5b506102b06004803603602081101561028457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d14565b005b3480156102be57600080fd5b5061049e60048036036102408110156102d657600080fd5b81019080803560ff169060200190929190803590602001909291908035906020019092919080608001906004806020026040519081016040528092919082600460200280828437600081840152601f19601f820116905080830192505050505050919291929080606001906003806020026040519081016040528092919082600360200280828437600081840152601f19601f820116905080830192505050505050919291929080606001906003806020026040519081016040528092919082600360200280828437600081840152601f19601f820116905080830192505050505050919291929080608001906004806020026040519081016040528092919082600460200280828437600081840152601f19601f82011690508083019250505050505091929192908035906020019064010000000081111561041857600080fd5b82018360208201111561042a57600080fd5b8035906020019184600183028401116401000000008311171561044c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611043565b005b3480156104ac57600080fd5b506104b5612baf565b005b3480156104c357600080fd5b506104cc612c7f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561051a57600080fd5b50610523612ca8565b604051808215151515815260200191505060405180910390f35b34801561054957600080fd5b5061058c6004803603602081101561056057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612cff565b604051808215151515815260200191505060405180910390f35b3480156105b257600080fd5b50610640600480360360c08110156105c957600080fd5b81019080803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d1f565b005b34801561064e57600080fd5b506106916004803603602081101561066557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613238565b005b34801561069f57600080fd5b5061072d600480360360808110156106b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f8201169050808301925050505050509192919290505050613255565b604051808215151515815260200191505060405180910390f35b34801561075357600080fd5b5061075c613aa5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6003602052806000526040600020600091509050806003015490806004018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108505780601f1061082557610100808354040283529160200191610850565b820191906000526020600020905b81548152906001019060200180831161083357829003601f168201915b50505050509080600501549080600601549080600701549080600801549080600901549080600a01549080600b01549080600c01549080600d01549080600e01549080600f0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060100160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508e565b6108ea612ca8565b6108f357600080fd5b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561097a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061497c6027913960400191505060405180910390fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610a3b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4578656375746f7220616c7265616479206578697374732e000000000000000081525060200191505060405180910390fd5b6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610a9c83613acb565b15610b95578273ffffffffffffffffffffffffffffffffffffffff166108fc6706f05b59d3b200009081150290604051600060405180830381858888f19350505050158015610aef573d6000803e3d6000fd5b507ff1dc68e5a16317df216458b71f8b5d94664142dcd04b1b2a4153a548ef717705834260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260088152602001807f6578656375746f72000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b610ba5610ba0612c7f565b613acb565b15610cac57610bb2612c7f565b73ffffffffffffffffffffffffffffffffffffffff166108fc6706f05b59d3b200009081150290604051600060405180830381858888f19350505050158015610bff573d6000803e3d6000fd5b507ff1dc68e5a16317df216458b71f8b5d94664142dcd04b1b2a4153a548ef717705610c29612c7f565b4260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260058152602001807f6f776e6572000000000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b7f8002cf25aa76b379f7f97c8fe71f2bb091370573ab719fd656612219aae890ba83604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b610d1c612ca8565b610d2557600080fd5b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061497c6027913960400191505060405180910390fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e6c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4578656375746f7220646f6573206e6f74206578697374732e0000000000000081525060200191505060405180910390fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610ed4610ecf612c7f565b613acb565b15610fdb57610ee1612c7f565b73ffffffffffffffffffffffffffffffffffffffff166108fc6706f05b59d3b200009081150290604051600060405180830381858888f19350505050158015610f2e573d6000803e3d6000fd5b507ff1dc68e5a16317df216458b71f8b5d94664142dcd04b1b2a4153a548ef717705610f58612c7f565b4260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260058152602001807f6f776e6572000000000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b7f67c86b0b9218d30f0d89e72b9aafcace5cd51e46f60fdf6f3323877952e21c4b83604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611102576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6d73672e73656e646572206e6f7420616e206578656375746f7200000000000081525060200191505060405180910390fd5b6000600360008760006004811061111557fe5b6020020151815260200190815260200160002060000160006003811061113757fe5b0154146111ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f50756c6c205061796d656e7420616c7265616479206578697374732e0000000081525060200191505060405180910390fd5b6000801916856000600481106111be57fe5b60200201511415611237576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061796d656e7420494420697320656d7074792e00000000000000000000000081525060200191505060405180910390fd5b60008019168560016004811061124957fe5b602002015114156112c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f427573696e65737320494420697320656d7074792e000000000000000000000081525060200191505060405180910390fd5b6000801916856002600481106112d457fe5b6020020151141561134d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f556e69717565205265666572656e636520494420697320656d7074792e00000081525060200191505060405180910390fd5b60008019168560036004811061135f57fe5b602002015114156113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f5061796d656e74205479706520697320656d7074792e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16846000600381106113fd57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16141561146f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806146cd6021913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168460016003811061149457fe5b602002015173ffffffffffffffffffffffffffffffffffffffff161415611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806147a86021913960400191505060405180910390fd5b60008360006003811061151557fe5b60200201511161158d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f496e697469616c20636f6e76657273696f6e2072617465206973207a65726f2e81525060200191505060405180910390fd5b60008360016003811061159c57fe5b602002015111611614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5061796d656e7420616d6f756e7420696e2066696174206973207a65726f2e0081525060200191505060405180910390fd5b60008360026003811061162357fe5b6020020151101561167f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806148b76031913960400191505060405180910390fd5b60008260006004811061168e57fe5b602002015111611706576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f5061796d656e74206672657175656e6379206973207a65726f2e00000000000081525060200191505060405180910390fd5b60008260016004811061171557fe5b602002015111611770576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146686023913960400191505060405180910390fd5b60008260026004811061177f57fe5b6020020151116117f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f5061796d656e742073746172742074696d65206973207a65726f2e000000000081525060200191505060405180910390fd5b60008260036004811061180657fe5b60200201511015611862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061450f6027913960400191505060405180910390fd5b68056bc75e2d631000008360006003811061187957fe5b602002015111156118d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b8152602001806145ca603b913960400191505060405180910390fd5b68056bc75e2d63100000836001600381106118ec57fe5b60200201511115611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180614734603a913960400191505060405180910390fd5b68056bc75e2d631000008360026003811061195f57fe5b602002015111156119bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806145886042913960600191505060405180910390fd5b68056bc75e2d63100000826000600481106119d257fe5b60200201511115611a2e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806149116035913960400191505060405180910390fd5b68056bc75e2d6310000082600160048110611a4557fe5b60200201511115611aa1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806147c9603e913960400191505060405180910390fd5b68056bc75e2d6310000082600260048110611ab857fe5b60200201511115611b14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806149466036913960400191505060405180910390fd5b68056bc75e2d6310000082600360048110611b2b57fe5b60200201511115611b87576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806148486038913960400191505060405180910390fd5b6000815111611bfe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f43757272656e637920697320656d70747900000000000000000000000000000081525060200191505060405180910390fd5b84600060048110611c0b57fe5b60200201516003600087600060048110611c2157fe5b60200201518152602001908152602001600020600001600060038110611c4357fe5b018190555084600360048110611c5557fe5b60200201516003600087600060048110611c6b57fe5b602002015181526020019081526020016000206003018190555083600160038110611c9257fe5b60200201516003600087600060048110611ca857fe5b6020020151815260200190815260200160002060100160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600260038110611d0957fe5b60200201516003600087600060048110611d1f57fe5b60200201518152602001908152602001600020600f0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600060038110611d8057fe5b60200201516003600087600060048110611d9657fe5b602002015181526020019081526020016000206005018190555082600160038110611dbd57fe5b60200201516003600087600060048110611dd357fe5b602002015181526020019081526020016000206007018190555082600260038110611dfa57fe5b60200201516003600087600060048110611e1057fe5b602002015181526020019081526020016000206006018190555081600060048110611e3757fe5b60200201516003600087600060048110611e4d57fe5b602002015181526020019081526020016000206008018190555081600160048110611e7457fe5b60200201516003600087600060048110611e8a57fe5b602002015181526020019081526020016000206009018190555081600260048110611eb157fe5b60200201516003600087600060048110611ec757fe5b60200201518152602001908152602001600020600a018190555081600360048110611eee57fe5b60200201516003600087600060048110611f0457fe5b60200201518152602001908152602001600020600b0181905550806003600087600060048110611f3057fe5b602002015181526020019081526020016000206004019080519060200190611f599291906143df565b506121a888888887600060038110611f6d57fe5b6020020151600360008b600060048110611f8357fe5b60200201518152602001908152602001600020604051806101e001604052908160008201600380602002604051908101604052809291908260038015611fde576020028201915b815481526020019060010190808311611fca575b5050505050815260200160038201548152602001600482018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561208a5780601f1061205f5761010080835404028352916020019161208a565b820191906000526020600020905b81548152906001019060200180831161206d57829003601f168201915b505050505081526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152602001600e8201548152602001600f820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016010820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050613af7565b6121fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806146346034913960400191505060405180910390fd5b8460016004811061220a57fe5b6020020151600360008760006004811061222057fe5b6020020151815260200190815260200160002060000160016003811061224257fe5b01819055508460026004811061225457fe5b6020020151600360008760006004811061226a57fe5b6020020151815260200190815260200160002060000160026003811061228c57fe5b0181905550600060036000876000600481106122a457fe5b60200201518152602001908152602001600020600e01819055507f3500000000000000000000000000000000000000000000000000000000000000856003600481106122ec57fe5b60200201511415612379578160036004811061230457fe5b60200201518260026004811061231657fe5b602002015101600360008760006004811061232d57fe5b60200201518152602001908152602001600020600c01819055506000600360008760006004811061235a57fe5b60200201518152602001908152602001600020600d01819055506129e4565b7f3400000000000000000000000000000000000000000000000000000000000000856003600481106123a757fe5b6020020151141561259b576125116040518060600160405280876000600481106123cd57fe5b60200201518152602001876001600481106123e457fe5b60200201518152602001876002600481106123fb57fe5b602002015181525060405180606001604052808760006003811061241b57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018760016003811061245e57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001876002600381106124a157fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506040518060400160405280876002600381106124ed57fe5b602002015181526020018760006003811061250457fe5b6020020151815250613cf9565b61251a57600080fd5b42600360008760006004811061252c57fe5b60200201518152602001908152602001600020600d01819055508160006004811061255357fe5b60200201518260026004811061256557fe5b602002015101600360008760006004811061257c57fe5b60200201518152602001908152602001600020600c01819055506129e3565b7f3600000000000000000000000000000000000000000000000000000000000000856003600481106125c957fe5b602002015114156127bd576127336040518060600160405280876000600481106125ef57fe5b602002015181526020018760016004811061260657fe5b602002015181526020018760026004811061261d57fe5b602002015181525060405180606001604052808760006003811061263d57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018760016003811061268057fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001876002600381106126c357fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525060405180604001604052808760026003811061270f57fe5b602002015181526020018760006003811061272657fe5b6020020151815250613cf9565b61273c57600080fd5b42600360008760006004811061274e57fe5b60200201518152602001908152602001600020600d01819055508160036004811061277557fe5b60200201518260026004811061278757fe5b602002015101600360008760006004811061279e57fe5b60200201518152602001908152602001600020600c01819055506129e2565b61291c6040518060600160405280876000600481106127d857fe5b60200201518152602001876001600481106127ef57fe5b602002015181526020018760026004811061280657fe5b602002015181525060405180606001604052808760006003811061282657fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018760016003811061286957fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001876002600381106128ac57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506040518060400160405280876001600381106128f857fe5b602002015181526020018760006003811061290f57fe5b6020020151815250613cf9565b61292557600080fd5b42600360008760006004811061293757fe5b60200201518152602001908152602001600020600d01819055508160006004811061295e57fe5b60200201518260026004811061297057fe5b602002015101600360008760006004811061298757fe5b60200201518152602001908152602001600020600c01819055506001826001600481106129b057fe5b60200201510360036000876000600481106129c757fe5b60200201518152602001908152602001600020600901819055505b5b5b6129ed33613acb565b15612ae6573373ffffffffffffffffffffffffffffffffffffffff166108fc6706f05b59d3b200009081150290604051600060405180830381858888f19350505050158015612a40573d6000803e3d6000fd5b507ff1dc68e5a16317df216458b71f8b5d94664142dcd04b1b2a4153a548ef717705334260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260088152602001807f6578656375746f72000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b7fc0028b6a3e328c438fb316cb08abd17e0f2132ef9c24f0404864f57e4488812d84600060038110612b1457fe5b602002015186600060048110612b2657fe5b602002015187600160048110612b3857fe5b602002015188600260048110612b4a57fe5b6020020151604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390a15050505050505050565b612bb7612ca8565b612bc057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b60026020528060005260406000206000915054906101000a900460ff1681565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612dde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6d73672e73656e646572206e6f7420616e206578656375746f7200000000000081525060200191505060405180910390fd5b82600060036000838152602001908152602001600020600001600060038110612e0357fe5b01541415612e79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f50756c6c205061796d656e7420646f6573206e6f74206578697374732e00000081525060200191505060405180910390fd5b83600060036000838152602001908152602001600020600e015414612f06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f50756c6c205061796d656e742069732063616e63656c6c65640000000000000081525060200191505060405180910390fd5b84846000801916821415612f65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614605602f913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612feb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061476e603a913960400191505060405180910390fd5b612ff98a8a8a8a8a8a613f59565b61304e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806144a76024913960400191505060405180910390fd5b4260036000898152602001908152602001600020600e018190555061307233613acb565b1561316b573373ffffffffffffffffffffffffffffffffffffffff166108fc6706f05b59d3b200009081150290604051600060405180830381858888f193505050501580156130c5573d6000803e3d6000fd5b507ff1dc68e5a16317df216458b71f8b5d94664142dcd04b1b2a4153a548ef717705334260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260088152602001807f6578656375746f72000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b7fc85a0b1d6f3141384cf8132808219851926be1209fa52f30c8713b3f3c6da18c8688600360008b81526020019081526020016000206000016001600381106131b057fe5b0154600360008c81526020019081526020016000206000016002600381106131d457fe5b0154604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390a150505050505050505050565b613240612ca8565b61324957600080fd5b613252816140d3565b50565b60008260006003600083815260200190815260200160002060000160006003811061327c57fe5b015414156132f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f50756c6c205061796d656e7420646f6573206e6f74206578697374732e00000081525060200191505060405180910390fd5b838360016002811061330057fe5b602002015180600360008481526020019081526020016000206009015414613373576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260528152602001806145366052913960600191505060405180910390fd5b6000600360008481526020019081526020016000206006015411806133d0575060036000838152602001908152602001600020600a015442101580156133cf575060036000838152602001908152602001600020600c01544210155b5b613425576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260468152602001806146ee6046913960600191505060405180910390fd5b6000600360008481526020019081526020016000206009015411613494576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260448152602001806144cb6044913960600191505060405180910390fd5b600060036000848152602001908152602001600020600e015414806134e4575060036000838152602001908152602001600020600c015460036000848152602001908152602001600020600e0154115b613539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604281526020018061468b6042913960600191505060405180910390fd5b8160405160200180828152602001915050604051602081830303815290604052805190602001206003600084815260200190815260200160002060000160006003811061358257fe5b0154604051602001808281526020019150506040516020818303038152906040528051906020012014613600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260418152602001806148076041913960600191505060405180910390fd5b8460006002811061360d57fe5b60200201516000811161366b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806148e86029913960400191505060405180910390fd5b68056bc75e2d631000008111156136cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806148806037913960400191505060405180910390fd5b6000866000600281106136dc57fe5b6020020151905060008990506136f061445f565b600360008b815260200190815260200160002060000160038060200260405190810160405280929190826003801561373d576020028201915b815481526020019060010190808311613729575b505050505090506000600360008c8152602001908152602001600020600f0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006137b2600360008560006003811061379557fe5b6020020151815260200190815260200160002060070154866141cb565b905060036000846000600381106137c557fe5b602002015181526020019081526020016000206008015460036000856000600381106137ed57fe5b60200201518152602001908152602001600020600c015401600360008560006003811061381657fe5b60200201518152602001908152602001600020600c01819055506001600360008560006003811061384357fe5b602002015181526020019081526020016000206009015403600360008560006003811061386c57fe5b602002015181526020019081526020016000206009018190555042600360008560006003811061389857fe5b60200201518152602001908152602001600020600d0181905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8584846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561398f57600080fd5b505af11580156139a3573d6000803e3d6000fd5b505050506040513d60208110156139b957600080fd5b81019080805190602001909291905050506139d357600080fd5b7f1a5c297cf93353fa05129304db62d9b76b2ebe8b3a31f577aa3e2cd46c6f82828484600060038110613a0257fe5b602002015185600160038110613a1457fe5b602002015186600260038110613a2657fe5b6020020151858a604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390a1600199505050505050505050509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000670214e8348c4f00008273ffffffffffffffffffffffffffffffffffffffff163111159050919050565b60008273ffffffffffffffffffffffffffffffffffffffff166001836101c001518460000151600060038110613b2957fe5b60200201518560200151866101a00151876040015188608001518960a001518a60c001518b60e001518c61010001518d6101200151604051602001808c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018b81526020018a81526020018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b815260140188805190602001908083835b60208310613c0a5780518252602082019150602081019050602083039250613be7565b6001836020036101000a0380198251168184511680821785525050505050509050018781526020018681526020018581526020018481526020018381526020018281526020019b5050505050505050505050506040516020818303038152906040528051906020012088888860405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015613ccd573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600080613d2883600060028110613d0c57fe5b602002015184600160028110613d1e57fe5b60200201516141cb565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd85600060038110613d7557fe5b602002015186600260038110613d8757fe5b6020020151846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015613e2957600080fd5b505af1158015613e3d573d6000803e3d6000fd5b505050506040513d6020811015613e5357600080fd5b8101908080519060200190929190505050613e6d57600080fd5b7f1a5c297cf93353fa05129304db62d9b76b2ebe8b3a31f577aa3e2cd46c6f828284600060038110613e9b57fe5b602002015186600060038110613ead57fe5b602002015187600160038110613ebf57fe5b602002015188600260038110613ed157fe5b60200201518588600160028110613ee457fe5b6020020151604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390a160019150509392505050565b60008273ffffffffffffffffffffffffffffffffffffffff1660018584604051602001808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b8152601401925050506040516020818303038152906040528051906020012089898960405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561402c573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff161480156140c757508360405160200180828152602001915050604051602081830303815290604052805190602001206003600086815260200190815260200160002060000160006003811061409d57fe5b01546040516020018082815260200191505060405160208183030381529060405280519060200120145b90509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561410d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008260008111614227576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806148e86029913960400191505060405180910390fd5b68056bc75e2d63100000811115614289576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806148806037913960400191505060405180910390fd5b82600081116142e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806148e86029913960400191505060405180910390fd5b68056bc75e2d63100000811115614345576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806148806037913960400191505060405180910390fd5b61437584614367876a52b7d2dcc80cd2e400000061437f90919063ffffffff16565b6143b990919063ffffffff16565b9250505092915050565b60008083141561439257600090506143b3565b60008284029050828482816143a357fe5b04146143ae57600080fd5b809150505b92915050565b60008082116143c757600080fd5b60008284816143d257fe5b0490508091505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061442057805160ff191683800117855561444e565b8280016001018555821561444e579182015b8281111561444d578251825591602001919060010190614432565b5b50905061445b9190614481565b5090565b6040518060600160405280600390602082028038833980820191505090505090565b6144a391905b8082111561449f576000816000905550600101614487565b5090565b9056fe496e76616c69642064656c6574696f6e202d2045435245434f5645525f4641494c45442e496e76616c69642070756c6c207061796d656e7420657865637574696f6e2072657175657374202d204e756d626572206f66207061796d656e7473206973207a65726f2e5061796d656e7420747269616c20706572696f64206973206c657373207468616e207a65726f2e496e76616c69642070756c6c207061796d656e7420657865637574696f6e2072657175657374202d2050756c6c207061796d656e74206e756d626572206f66207061796d656e7420697320696e76616c69645061796d656e7420696e697469616c20616d6f756e7420696e206669617420697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e697469616c20636f6e76657273696f6e207261746520697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e76616c69642064656c6574696f6e2072657175657374202d205061796d656e7420494420697320656d7074792e496e76616c69642070756c6c207061796d656e7420726567697374726174696f6e202d2045435245434f5645525f4641494c45445061796d656e74206e756d626572206f66207061796d656e7473206973207a65726f2e496e76616c69642070756c6c207061796d656e7420657865637574696f6e2072657175657374202d2050756c6c207061796d656e742069732063616e63656c6c6564437573746f6d65722041646472657373206973205a45524f5f414444524553532e496e76616c69642070756c6c207061796d656e7420657865637574696f6e2072657175657374202d2054696d65206f6620657865637574696f6e20697320696e76616c69642e5061796d656e7420616d6f756e7420696e206669617420697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e76616c69642064656c6574696f6e2072657175657374202d20436c69656e742061646472657373206973205a45524f5f414444524553532e54726561737572792041646472657373206973205a45524f5f414444524553532e5061796d656e74206e756d626572206f66207061796d656e747320697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e76616c69642070756c6c207061796d656e7420657865637574696f6e2072657175657374202d205061796d656e74204944206e6f74206d61746368696e672e5061796d656e7420747269616c20706572696f6420697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e76616c696420616d6f756e74202d204d757374206265206c6f776572207468616e20746865206f766572666c6f77206c696d69742e496e697469616c207061796d656e7420616d6f756e7420696e2066696174206973206c657373207468616e207a65726f2e496e76616c696420616d6f756e74202d204d75737420626520686967686572207468616e207a65726f5061796d656e74206672657175656e637920697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e5061796d656e742073746172742074696d6520697320686967686572207468616e7420746865206f766572666c6f77206c696d69742e496e76616c69642061646472657373202d205a45524f5f414444524553532070726f7669646564a265627a7a7230582078bec68d1480cf9101c04257d6aeaaa02ed94a3a5a1c89ae0c41f943ddacef6564736f6c634300050a0032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000846c66cf71c43f80403b51fe3906b3599d63336f
-----Decoded View---------------
Arg [0] : _token (address): 0x846C66cf71C43f80403B51fE3906B3599D63336f
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000846c66cf71c43f80403b51fe3906b3599d63336f
Deployed Bytecode Sourcemap
5584:32059:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8888:51;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8888:51:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8888:51:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;8888:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14814:587;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14814:587:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14814:587:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;15658:406;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15658:406:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15658:406:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;17819:8307;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17819:8307:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;17819:8307:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;17819:8307:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;17819:8307:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;17819:8307:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;17819:8307:0;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;17819:8307:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;17819:8307:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;17819:8307:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;17819:8307:0;;;;;;;;;;;;;;;:::i;:::-;;4254:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4254:140:0;;;:::i;:::-;;3533:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3533:87:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3876:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3876:92:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;8840:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8840:41:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8840:41:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;27227:946;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27227:946:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;27227:946:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4571:117;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4571:117:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4571:117:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;29704:1380;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29704:1380:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;29704:1380:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;29704:1380:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;8814:19;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8814:19:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;8888:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14814:587::-;3753:9;:7;:9::i;:::-;3745:18;;;;;;14909:9;13112:1;13092:22;;:8;:22;;;;13084:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14947:9;11034;:20;11044:9;11034:20;;;;;;;;;;;;;;;;;;;;;;;;;11033:21;11025:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14997:4;14974:9;:20;14984:9;14974:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;15016:26;15032:9;15016:15;:26::i;:::-;15012:168;;;15059:9;:18;;:34;7843:9;15059:34;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15059:34:0;15113:55;15153:9;15164:3;15113:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15012:168;15196:24;15212:7;:5;:7::i;:::-;15196:15;:24::i;:::-;15192:159;;;15237:7;:5;:7::i;:::-;:16;;:32;7843:9;15237:32;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15237:32:0;15289:50;15326:7;:5;:7::i;:::-;15335:3;15289:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15192:159;15366:27;15383:9;15366:27;;;;;;;;;;;;;;;;;;;;;;13169:1;3774;14814:587;:::o;15658:406::-;3753:9;:7;:9::i;:::-;3745:18;;;;;;15756:9;13112:1;13092:22;;:8;:22;;;;13084:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15787:9;10888;:20;10898:9;10888:20;;;;;;;;;;;;;;;;;;;;;;;;;10880:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15837:5;15814:9;:20;15824:9;15814:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;15857:24;15873:7;:5;:7::i;:::-;15857:15;:24::i;:::-;15853:159;;;15898:7;:5;:7::i;:::-;:16;;:32;7843:9;15898:32;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15898:32:0;15950:50;15987:7;:5;:7::i;:::-;15996:3;15950:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15853:159;16027:29;16046:9;16027:29;;;;;;;;;;;;;;;;;;;;;;13169:1;3774;15658:406;:::o;17819:8307::-;10748:9;:21;10758:10;10748:21;;;;;;;;;;;;;;;;;;;;;;;;;10740:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18432:52;:12;:32;18445:15;18461:1;18445:18;;;;;;;;;;;18432:32;;;;;;;;;;;:43;;18476:1;18432:46;;;;;;;;;:52;18424:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18558:13;18536:35;;;:15;18552:1;18536:18;;;;;;;;;;;:35;;18528:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18637:13;18615:35;;;:15;18631:1;18615:18;;;;;;;;;;;:35;;18607:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18717:13;18695:35;;;:15;18711:1;18695:18;;;;;;;;;;;:35;;18687:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18805:13;18783:35;;;:15;18799:1;18783:18;;;;;;;;;;;:35;;18775:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18889:1;18864:27;;:10;18875:1;18864:13;;;;;;;;;;;:27;;;;18856:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18973:1;18948:27;;:10;18959:1;18948:13;;;;;;;;;;;:27;;;;18940:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19053:1;19032:15;19048:1;19032:18;;;;;;;;;;;:22;19024:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19131:1;19110:15;19126:1;19110:18;;;;;;;;;;;:22;19102:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19209:1;19187:15;19203:1;19187:18;;;;;;;;;;;:23;;19179:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19307:1;19283:18;19302:1;19283:21;;;;;;;;;;;:25;19275:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19382:1;19358:18;19377:1;19358:21;;;;;;;;;;;:25;19350:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19466:1;19442:18;19461:1;19442:21;;;;;;;;;;;:25;19434:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19543:1;19518:18;19537:1;19518:21;;;;;;;;;;;:26;;19510:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7194:8;19607:15;19623:1;19607:18;;;;;;;;;;;:45;;19599:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7194:8;19735:15;19751:1;19735:18;;;;;;;;;;;:45;;19727:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7194:8;19862:15;19878:1;19862:18;;;;;;;;;;;:45;;19854:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7194:8;19997:18;20016:1;19997:21;;;;;;;;;;;:48;;19989:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7194:8;20122:18;20141:1;20122:21;;;;;;;;;;;:48;;20114:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7194:8;20256:18;20275:1;20256:21;;;;;;;;;;;:48;;20248:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7194:8;20382:18;20401:1;20382:21;;;;;;;;;;;:48;;20374:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20536:1;20516:9;20510:23;:27;20502:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20619:15;20635:1;20619:18;;;;;;;;;;;20570:12;:32;20583:15;20599:1;20583:18;;;;;;;;;;;20570:32;;;;;;;;;;;:43;;20614:1;20570:46;;;;;;;;:67;;;;20695:15;20711:1;20695:18;;;;;;;;;;;20648:12;:32;20661:15;20677:1;20661:18;;;;;;;;;;;20648:32;;;;;;;;;;;:44;;:65;;;;20775:10;20786:1;20775:13;;;;;;;;;;;20724:12;:32;20737:15;20753:1;20737:18;;;;;;;;;;;20724:32;;;;;;;;;;;:48;;;:64;;;;;;;;;;;;;;;;;;20850:10;20861:1;20850:13;;;;;;;;;;;20799:12;:32;20812:15;20828:1;20812:18;;;;;;;;;;;20799:32;;;;;;;;;;;:48;;;:64;;;;;;;;;;;;;;;;;;20931:15;20947:1;20931:18;;;;;;;;;;;20874:12;:32;20887:15;20903:1;20887:18;;;;;;;;;;;20874:32;;;;;;;;;;;:54;;:75;;;;21013:15;21029:1;21013:18;;;;;;;;;;;20960:12;:32;20973:15;20989:1;20973:18;;;;;;;;;;;20960:32;;;;;;;;;;;:50;;:71;;;;21105:15;21121:1;21105:18;;;;;;;;;;;21042:12;:32;21055:15;21071:1;21055:18;;;;;;;;;;;21042:32;;;;;;;;;;;:60;;:81;;;;21179:18;21198:1;21179:21;;;;;;;;;;;21134:12;:32;21147:15;21163:1;21147:18;;;;;;;;;;;21134:32;;;;;;;;;;;:42;;:66;;;;21263:18;21282:1;21263:21;;;;;;;;;;;21211:12;:32;21224:15;21240:1;21224:18;;;;;;;;;;;21211:32;;;;;;;;;;;:49;;:73;;;;21345:18;21364:1;21345:21;;;;;;;;;;;21295:12;:32;21308:15;21324:1;21308:18;;;;;;;;;;;21295:32;;;;;;;;;;;:47;;:71;;;;21424:18;21443:1;21424:21;;;;;;;;;;;21377:12;:32;21390:15;21406:1;21390:18;;;;;;;;;;;21377:32;;;;;;;;;;;:44;;:68;;;;21500:9;21456:12;:32;21469:15;21485:1;21469:18;;;;;;;;;;;21456:32;;;;;;;;;;;:41;;:53;;;;;;;;;;;;:::i;:::-;;21528:163;21566:1;21586;21606;21626:10;21637:1;21626:13;;;;;;;;;;;21658:12;:32;21671:15;21687:1;21671:18;;;;;;;;;;;21658:32;;;;;;;;;;;21528:163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;:163::i;:::-;21520:251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21831:15;21847:1;21831:18;;;;;;;;;;;21782:12;:32;21795:15;21811:1;21795:18;;;;;;;;;;;21782:32;;;;;;;;;;;:43;;21826:1;21782:46;;;;;;;;:67;;;;21909:15;21925:1;21909:18;;;;;;;;;;;21860:12;:32;21873:15;21889:1;21873:18;;;;;;;;;;;21860:32;;;;;;;;;;;:43;;21904:1;21860:46;;;;;;;;:67;;;;21989:1;21938:12;:32;21951:15;21967:1;21951:18;;;;;;;;;;;21938:32;;;;;;;;;;;:48;;:52;;;;22257:33;22235:15;22251:1;22235:18;;;;;;;;;;;:55;22231:3596;;;22387:18;22406:1;22387:21;;;;;;;;;;;22363:18;22382:1;22363:21;;;;;;;;;;;:45;22307:12;:32;22320:15;22336:1;22320:18;;;;;;;;;;;22307:32;;;;;;;;;;;:53;;:101;;;;22479:1;22423:12;:32;22436:15;22452:1;22436:18;;;;;;;;;;;22423:32;;;;;;;;;;;:53;;:57;;;;22231:3596;;;22889:40;22867:15;22883:1;22867:18;;;;;;;;;;;:62;22863:2964;;;22954:435;;;;;;;;;23010:15;23026:1;23010:18;;;;;;;;;;;22954:435;;;;23030:15;23046:1;23030:18;;;;;;;;;;;22954:435;;;;23050:15;23066:1;23050:18;;;;;;;;;;;22954:435;;;;;;;;;;;23143:10;23154:1;23143:13;;;;;;;;;;;22954:435;;;;;;;;23158:10;23169:1;23158:13;;;;;;;;;;;22954:435;;;;;;;;23173:10;23184:1;23173:13;;;;;;;;;;;22954:435;;;;;;;;;;;;;;;23273:15;23289:1;23273:18;;;;;;;;;;;22954:435;;;;23293:15;23309:1;23293:18;;;;;;;;;;;22954:435;;;:32;:435::i;:::-;22946:444;;;;;;23461:3;23405:12;:32;23418:15;23434:1;23418:18;;;;;;;;;;;23405:32;;;;;;;;;;;:53;;:59;;;;23559:18;23578:1;23559:21;;;;;;;;;;;23535:18;23554:1;23535:21;;;;;;;;;;;:45;23479:12;:32;23492:15;23508:1;23492:18;;;;;;;;;;;23479:32;;;;;;;;;;;:53;;:101;;;;22863:2964;;;23980:33;23958:15;23974:1;23958:18;;;;;;;;;;;:55;23954:1873;;;24038:433;;;;;;;;;24094:15;24110:1;24094:18;;;;;;;;;;;24038:433;;;;24114:15;24130:1;24114:18;;;;;;;;;;;24038:433;;;;24134:15;24150:1;24134:18;;;;;;;;;;;24038:433;;;;;;;;;;;24224:10;24235:1;24224:13;;;;;;;;;;;24038:433;;;;;;;;24239:10;24250:1;24239:13;;;;;;;;;;;24038:433;;;;;;;;24254:10;24265:1;24254:13;;;;;;;;;;;24038:433;;;;;;;;;;;;;;;24354:15;24370:1;24354:18;;;;;;;;;;;24038:433;;;;24374:15;24390:1;24374:18;;;;;;;;;;;24038:433;;;:32;:433::i;:::-;24030:442;;;;;;24543:3;24487:12;:32;24500:15;24516:1;24500:18;;;;;;;;;;;24487:32;;;;;;;;;;;:53;;:59;;;;24641:18;24660:1;24641:21;;;;;;;;;;;24617:18;24636:1;24617:21;;;;;;;;;;;:45;24561:12;:32;24574:15;24590:1;24574:18;;;;;;;;;;;24561:32;;;;;;;;;;;:53;;:101;;;;23954:1873;;;25113:419;;;;;;;;;25169:15;25185:1;25169:18;;;;;;;;;;;25113:419;;;;25189:15;25205:1;25189:18;;;;;;;;;;;25113:419;;;;25209:15;25225:1;25209:18;;;;;;;;;;;25113:419;;;;;;;;;;;25299:10;25310:1;25299:13;;;;;;;;;;;25113:419;;;;;;;;25314:10;25325:1;25314:13;;;;;;;;;;;25113:419;;;;;;;;25329:10;25340:1;25329:13;;;;;;;;;;;25113:419;;;;;;;;;;;;;;;25429:15;25445:1;25429:18;;;;;;;;;;;25113:419;;;;25449:15;25465:1;25449:18;;;;;;;;;;;25113:419;;;:32;:419::i;:::-;25105:428;;;;;;25604:3;25548:12;:32;25561:15;25577:1;25561:18;;;;;;;;;;;25548:32;;;;;;;;;;;:53;;:59;;;;25702:18;25721:1;25702:21;;;;;;;;;;;25678:18;25697:1;25678:21;;;;;;;;;;;:45;25622:12;:32;25635:15;25651:1;25635:18;;;;;;;;;;;25622:32;;;;;;;;;;;:53;;:101;;;;25814:1;25790:18;25809:1;25790:21;;;;;;;;;;;:25;25738:12;:32;25751:15;25767:1;25751:18;;;;;;;;;;;25738:32;;;;;;;;;;;:49;;:77;;;;23954:1873;22863:2964;22231:3596;25841:27;25857:10;25841:15;:27::i;:::-;25837:171;;;25885:10;:19;;:35;7843:9;25885:35;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25885:35:0;25940:56;25980:10;25992:3;25940:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25837:171;26023:95;26044:10;26055:1;26044:13;;;;;;;;;;;26059:15;26075:1;26059:18;;;;;;;;;;;26079:15;26095:1;26079:18;;;;;;;;;;;26099:15;26115:1;26099:18;;;;;;;;;;;26023:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17819:8307;;;;;;;;:::o;4254:140::-;3753:9;:7;:9::i;:::-;3745:18;;;;;;4353:1;4316:40;;4337:6;;;;;;;;;;;4316:40;;;;;;;;;;;;4384:1;4367:6;;:19;;;;;;;;;;;;;;;;;;4254:140::o;3533:87::-;3571:15;3606:6;;;;;;;;;;;3599:13;;3533:87;:::o;3876:92::-;3916:4;3954:6;;;;;;;;;;;3940:20;;:10;:20;;;3933:27;;3876:92;:::o;8840:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;27227:946::-;10748:9;:21;10758:10;10748:21;;;;;;;;;;;;;;;;;;;;;;;;;10740:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27471:10;11171:44;:12;:24;11184:10;11171:24;;;;;;;;;;;:35;;11207:1;11171:38;;;;;;;;;:44;;11163:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27508:10;11387:1;11343:12;:24;11356:10;11343:24;;;;;;;;;;;:40;;;:45;11335:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27548:10;27560:16;12828:13;12814:27;;;:10;:27;;12806:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12940:1;12912:30;;:16;:30;;;;12904:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27602:76;27618:1;27621;27624;27627:10;27639:16;27657:20;27602:15;:76::i;:::-;27594:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27773:3;27730:12;:24;27743:10;27730:24;;;;;;;;;;;:40;;:46;;;;27791:27;27807:10;27791:15;:27::i;:::-;27787:171;;;27835:10;:19;;:35;7843:9;27835:35;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27835:35:0;27890:56;27930:10;27942:3;27890:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27787:171;27973:192;28007:16;28038:10;28063:12;:24;28076:10;28063:24;;;;;;;;;;;:35;;28099:1;28063:38;;;;;;;;;28116:12;:24;28129:10;28116:24;;;;;;;;;;;:35;;28152:1;28116:38;;;;;;;;;27973:192;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11429:1;;11260;10811;27227:946;;;;;;:::o;4571:117::-;3753:9;:7;:9::i;:::-;3745:18;;;;;;4652:28;4671:8;4652:18;:28::i;:::-;4571:117;:::o;29704:1380::-;29979:4;29844:10;11171:44;:12;:24;11184:10;11171:24;;;;;;;;;;;:35;;11207:1;11171:38;;;;;;;;;:44;;11163:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29896:10;29908:15;29924:1;29908:18;;;;;;;;;;;11615:14;11570:12;:24;11583:10;11570:24;;;;;;;;;;;:41;;;:59;11562:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11804:1;11749:12;:24;11762:10;11749:24;;;;;;;;;;;:52;;;:56;:182;;;;11826:12;:24;11839:10;11826:24;;;;;;;;;;;:39;;;11819:3;:46;;:111;;;;;11885:12;:24;11898:10;11885:24;;;;;;;;;;;:45;;;11878:3;:52;;11819:111;11749:182;11740:291;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12094:1;12050:12;:24;12063:10;12050:24;;;;;;;;;;;:41;;;:45;12042:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12259:1;12215:12;:24;12228:10;12215:24;;;;;;;;;;;:40;;;:45;:155;;;;12325:12;:24;12338:10;12325:24;;;;;;;;;;;:45;;;12273:12;:24;12286:10;12273:24;;;;;;;;;;;:40;;;:97;12215:155;12192:263;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12596:10;12579:28;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;12579:28:0;;;12569:39;;;;;;12515:12;:24;12528:10;12515:24;;;;;;;;;;;:35;;12551:1;12515:38;;;;;;;;;12498:56;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;12498:56:0;;;12474:91;;;;;;:134;12466:225;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29945:15;29961:1;29945:18;;;;;;;;;;;13251:1;13241:7;:11;13233:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7194:8;13317:7;:34;;13309:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30001:22;30026:15;30042:1;30026:18;;;;;;;;;;;30001:43;;30055:23;30081:16;30055:42;;30108:28;;:::i;:::-;30139:12;:24;30152:10;30139:24;;;;;;;;;;;:35;;30108:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30185:16;30204:12;:24;30217:10;30204:24;;;;;;;;;;;:40;;;;;;;;;;;;30185:59;;30255:19;30277:83;30298:12;:27;30311:10;30322:1;30311:13;;;;;;;;;;;30298:27;;;;;;;;;;;:45;;;30345:14;30277:20;:83::i;:::-;30255:105;;30484:12;:27;30497:10;30508:1;30497:13;;;;;;;;;;;30484:27;;;;;;;;;;;:37;;;30433:12;:27;30446:10;30457:1;30446:13;;;;;;;;;;;30433:27;;;;;;;;;;;:48;;;:88;30373:12;:27;30386:10;30397:1;30386:13;;;;;;;;;;;30373:27;;;;;;;;;;;:48;;:148;;;;30626:1;30579:12;:27;30592:10;30603:1;30592:13;;;;;;;;;;;30579:27;;;;;;;;;;;:44;;;:48;30532:12;:27;30545:10;30556:1;30545:13;;;;;;;;;;;30532:27;;;;;;;;;;;:44;;:95;;;;30689:3;30638:12;:27;30651:10;30662:1;30651:13;;;;;;;;;;;30638:27;;;;;;;;;;;:48;;:54;;;;30711:5;;;;;;;;;;;:18;;;30748:15;30782:8;30809:11;30711:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30711:124:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30711:124:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30711:124:0;;;;;;;;;;;;;;;;30703:133;;;;;;30852:202;30889:15;30919:10;30930:1;30919:13;;;;;;;;;;;30947:10;30958:1;30947:13;;;;;;;;;;;30975:10;30986:1;30975:13;;;;;;;;;;;31003:11;31029:14;30852:202;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31072:4;31065:11;;;;;;;12702:1;11260;;29704:1380;;;;;;:::o;8814:19::-;;;;;;;;;;;;;:::o;37464:176::-;37544:4;7989:10;37576:8;37568:25;;;:64;;37561:71;;37464:176;;;:::o;34903:943::-;35112:4;35822:16;35141:697;;:677;35232:12;:28;;;35283:12;:23;;;35307:1;35283:26;;;;;;;;;;;35332:12;:24;;;35379:12;:28;;;35430:12;:21;;;35474:12;:40;;;35537:12;:30;;;35590:12;:22;;;35635:12;:29;;;35687:12;:27;;;35737:12;:24;;;35193:587;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;35193:587:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;35193:587:0;;;35165:630;;;;;;35810:1;35813;35816;35141:677;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35141:677:0;;;;;;;;:697;;;35134:704;;34903:943;;;;;;;:::o;31627:805::-;31987:4;32004:19;32026:60;32047:15;32063:1;32047:18;;;;;;;;;;;32067:15;32083:1;32067:18;;;;;;;;;;;32026:20;:60::i;:::-;32004:82;;32105:5;;;;;;;;;;;:18;;;32124:10;32135:1;32124:13;;;;;;;;;;;32139:10;32150:1;32139:13;;;;;;;;;;;32154:11;32105:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32105:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32105:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32105:61:0;;;;;;;;;;;;;;;;32097:70;;;;;;32183:219;32220:10;32231:1;32220:13;;;;;;;;;;;32248:15;32264:1;32248:18;;;;;;;;;;;32281:15;32297:1;32281:18;;;;;;;;;;;32314:15;32330:1;32314:18;;;;;;;;;;;32347:11;32373:15;32389:1;32373:18;;;;;;;;;;;32183:219;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32420:4;32413:11;;;31627:805;;;;;:::o;36518:633::-;36749:4;36970:16;36778:208;;:188;36869:10;36902:20;36830:111;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;36830:111:0;;;36802:154;;;;;;36958:1;36961;36964;36778:188;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36778:188:0;;;;;;;;:208;;;:365;;;;;37121:10;37104:28;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;37104:28:0;;;37094:49;;;;;;37040:12;:24;37053:10;37040:24;;;;;;;;;;;:35;;37076:1;37040:38;;;;;;;;;37023:56;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;37023:56:0;;;36999:91;;;;;;:144;36778:365;36771:372;;36518:633;;;;;;;;:::o;4838:195::-;4940:1;4920:22;;:8;:22;;;;4912:31;;;;;;4988:8;4959:38;;4980:6;;;;;;;;;;;4959:38;;;;;;;;;;;;5017:8;5008:6;;:17;;;;;;;;;;;;;;;;;;4838:195;:::o;34012:295::-;34204:7;34136:18;13251:1;13241:7;:11;13233:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7194:8;13317:7;:34;;13309:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34173:15;13251:1;13241:7;:11;13233:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7194:8;13317:7;:34;;13309:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34231:68;34283:15;34231:47;34259:18;7073:8;34231:27;;:47;;;;:::i;:::-;:51;;:68;;;;:::i;:::-;34224:75;;13422:1;34012:295;;;;;:::o;997:433::-;1055:7;1304:1;1299;:6;1295:47;;;1329:1;1322:8;;;;1295:47;1354:9;1370:1;1366;:5;1354:17;;1399:1;1394;1390;:5;;;;;;:10;1382:19;;;;;;1421:1;1414:8;;;997:433;;;;;:::o;1565:303::-;1623:7;1722:1;1718;:5;1710:14;;;;;;1735:9;1751:1;1747;:5;;;;;;1735:17;;1859:1;1852:8;;;1565:303;;;;:::o;5584:32059::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;5584:32059:0;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://78bec68d1480cf9101c04257d6aeaaa02ed94a3a5a1c89ae0c41f943ddacef65
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $2,691.13 | 0.5 | $1,345.56 |
Loading...
Loading
[ Download: CSV Export ]
[ 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.