ETH Price: $3,279.14 (-3.37%)

Contract

0xF9E8c18A855183246DBF19C8b249921fa64bD33c
 

Overview

ETH Balance

1.018658159106203029 ETH

Eth Value

$3,340.32 (@ $3,279.14/ETH)

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Settled Convertv...236352472025-10-22 19:49:1115 days ago1761162551IN
ItoVault: Deployer
0 ETH0.000071351.12228702
Settled Convertv...236352092025-10-22 19:41:2315 days ago1761162083IN
ItoVault: Deployer
0 ETH0.000134312.11257455
Settled Convert ...138652152021-12-24 2:41:281414 days ago1640313688IN
ItoVault: Deployer
0 ETH0.0024271570.10442011
Register Globall...138652152021-12-24 2:41:281414 days ago1640313688IN
ItoVault: Deployer
0 ETH0.0050521470.10442011
Withdraw WEI131932672021-09-09 18:52:021519 days ago1631213522IN
ItoVault: Deployer
0 ETH0.0040918899.48652488
Repayv SPY131930732021-09-09 18:10:351519 days ago1631211035IN
ItoVault: Deployer
0 ETH0.0055532688.47285116
Withdraw WEI131930622021-09-09 18:08:321519 days ago1631210912IN
ItoVault: Deployer
0 ETH0.0031863388.21037668
Repayv SPY131930472021-09-09 18:05:441519 days ago1631210744IN
ItoVault: Deployer
0 ETH0.00651603103.8263618
Oracle Updatewei...131544812021-09-03 18:51:061525 days ago1630695066IN
ItoVault: Deployer
0 ETH0.0029902388.69954717
Oracle Updatewei...130834702021-08-23 19:33:021536 days ago1629747182IN
ItoVault: Deployer
0 ETH0.001685650
Gov Start Global...130580212021-08-19 20:53:051540 days ago1629406385IN
ItoVault: Deployer
0 ETH0.0030373260
Oracle Updatewei...130145212021-08-13 4:00:311547 days ago1628827231IN
ItoVault: Deployer
0 ETH0.0010113630
Oracle Updatewei...129610292021-08-04 21:20:131555 days ago1628112013IN
ItoVault: Deployer
0 ETH0.0012136336
Withdraw WEI129603952021-08-04 18:57:041555 days ago1628103424IN
ItoVault: Deployer
0 ETH0.0020379749.5495
Repayv SPY129603542021-08-04 18:48:261555 days ago1628102906IN
ItoVault: Deployer
0 ETH0.0025127342.9
Oracle Updatewei...128715502021-07-21 19:05:201569 days ago1626894320IN
ItoVault: Deployer
0 ETH0.001146234
Oracle Updatewei...127775722021-07-07 2:11:561584 days ago1625623916IN
ItoVault: Deployer
0 ETH0.001146234
Oracle Updatewei...126033702021-06-09 23:47:021611 days ago1623282422IN
ItoVault: Deployer
0 ETH0.0004045412
Oracle Updatewei...124890972021-05-23 6:53:301629 days ago1621752810IN
ItoVault: Deployer
0 ETH0.0010116930.01
Oracle Updatewei...124349512021-05-14 21:21:151637 days ago1621027275IN
ItoVault: Deployer
0 ETH0.0039443117
Oracle Updatewei...123310362021-04-28 20:13:331653 days ago1619640813IN
ItoVault: Deployer
0 ETH0.0022620767.1
Oracle Updatewei...122720672021-04-19 18:21:111662 days ago1618856471IN
ItoVault: Deployer
0 ETH0.00509051151
Oracle Updatewei...121560662021-04-01 21:30:041680 days ago1617312604IN
ItoVault: Deployer
0 ETH0.00424597131
Oracle Updatewei...120785862021-03-20 23:08:231692 days ago1616281703IN
ItoVault: Deployer
0 ETH0.00356175109.89
Oracle Updatewei...120255592021-03-12 19:22:451700 days ago1615576965IN
ItoVault: Deployer
0 ETH0.00457009141
View all transactions

Latest 9 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer236352472025-10-22 19:49:1115 days ago1761162551
ItoVault: Deployer
0.13915381 ETH
Transfer236352092025-10-22 19:41:2315 days ago1761162083
ItoVault: Deployer
1.26898817 ETH
-138652152021-12-24 2:41:281414 days ago1640313688
ItoVault: Deployer
1.07319984 ETH
-131932672021-09-09 18:52:021519 days ago1631213522
ItoVault: Deployer
23 ETH
-131930622021-09-09 18:08:321519 days ago1631210912
ItoVault: Deployer
0.15 ETH
-129603952021-08-04 18:57:041555 days ago1628103424
ItoVault: Deployer
22 ETH
-112847582020-11-18 22:59:391814 days ago1605740379
ItoVault: Deployer
0.05 ETH
-112714022020-11-16 21:43:071816 days ago1605562987
ItoVault: Deployer
 Contract Creation0 ETH
-112714022020-11-16 21:43:071816 days ago1605562987
ItoVault: Deployer
 Contract Creation0 ETH
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
VaultSystem

Compiler Version
v0.7.2+commit.51b20bc0

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity Multiple files format)

File 1 of 3: VaultSystem.sol
pragma solidity 0.7.2;

// SPDX-License-Identifier: JPLv1.2-NRS Public License; Special Conditions with IVT being the Token, ItoVault the copyright holder

import "./SafeMath.sol";
import "./GeneralToken.sol";

contract VaultSystem {
    using SafeMath for uint256;
    
    event loguint(string name, uint value);
    
    GeneralToken public vSPYToken;
    GeneralToken public ivtToken;
    
    // NB: None of the storage variables below should store numbers greater than 1E36.   uint256 overflow above 1E73.
    // So it is safe to mul two numbers always. But to mul more than 2 requires decimal counting.
    
    uint public weiPervSPY = 10 ** 18; 
    uint public maxvSPYE18 = 1000 * 10 ** 18;           // Upper Bound on Number of vSPY tokens
    uint public outstandingvSPYE18 = 0;                 // Current outstanding vSPY tokens
    
    
    // Forward (not counter) Vault System
    uint public initialLTVE10   = 7 * 10 ** 9;    // Maximum starting loan to value of a vault                [Integer / 1E10]
    uint public maintLTVE10     = 8 * 10 ** 9;      // Maximum maintnenance loan to value of a vault            [Integer / 1E10]
    uint public liqPenaltyE10   = 1 * 10 ** 9;    // Bonus paid to any address for liquidating non-compliant
                                                // contract                                                 [Integer / 1E10]

    // In this system, individual vaults *are* addresses.  Instances of vaults then are mapped by bare address
    // Each vault has an "asset" side and a "debt" side
    mapping(address => uint) public weiAsset;           // Weis the Vault owns -- the asset side
    mapping(address => uint) public vSPYDebtE18;        // vSPY -- the debt side of the balance sheet of each Vault
    
    
    // Counter Vault Contract
    uint public initialLTVCounterVaultE10   = 7 * 10 ** 9;                // Maximum starting loan to value of a vault                [Integer / 1E10]
    uint public maintLTVCounterVaultE10     = 8 * 10 ** 9;                // Maximum maintnenance loan to value of a vault            [Integer / 1E10]
    uint public liqPenaltyCounterVaultE10   = 1 * 10 ** 9;              // Bonus paid to any address for liquidating non-compliant
                                                                        // contract                                                 [Integer / 1E10]
    mapping(address => uint) public vSPYAssetCounterVaultE18;             // vSPY deposited in inverse vault
    mapping(address => uint) public weiDebtCounterVault;                     // weiDebtCounterVault

    
    // The following variables track all Vaults.  Not strictly needed, but helps liquidate non-compliant vaults
    mapping(address => bool) public isAddressRegistered;    // Forward map to emulate a "set" struct
    address[] public registeredAddresses;                   // Backward map for "set" struct
    
    address payable public owner;                           // owner is also governor here.  to be passed to WATDAO in the future
    address payable public oracle;                          // 
    
    
    bool public inGlobalSettlement = false;
    uint public globalSettlementStartTime;
    uint public settledWeiPervSPY; 
    bool public isGloballySettled = false;
    
    
    uint public lastOracleTime;
    bool public oracleChallenged = false;   // Is the whitelisted oracle (system) in challenge?         
    uint public lastChallengeValue; // The weiPervSPY value of the last challenge                [Integer atomic weis per 1 unit SPX (e.g. SPX ~ $3300 in Oct 2020)]
    uint public lastChallengeIVT;   // The WATs staked in the last challenge                    [WAT atomic units]
    uint public lastChallengeTime;  // The time of the last challenge, used for challenge expiry[Seconds since Epoch]
    
    
    uint[] public challengeIVTokens;    // Dynamic array of all challenges, integer indexed to match analagous arrays, used like a stack in code
    uint[] public challengeValues;  // Dynamic array of all challenges, integer indexed, used like a stack in code
    address[] public challengers;   // Dynamic array of all challengers, integer indexed, used like a stack in code
    
    constructor() {
        owner = msg.sender;
        oracle = msg.sender;
        vSPYToken = new GeneralToken(10 ** 30, address(this), "vSPY Token V_1_0_0", "vSPY V1_0"); // 18 decimals after the point, 12 before
        ivtToken = new GeneralToken(10 ** 30, msg.sender, "ItoVault Token V_1_0_0", "IVT V1_0");
    }

    
    // Oracle Functions
    function oracleUpdateweiPervSPY(uint _weiPervSPY) public {
        require(msg.sender == oracle, "Disallowed: You are not oracle");
        weiPervSPY = _weiPervSPY;
        lastOracleTime = block.timestamp;
    }
    

    // Governance Functions
    function govUpdateinitialLTVE10(uint _initialLTVE10) public {
        require(msg.sender == owner, "Disallowed: You are not governance");
        initialLTVE10 = _initialLTVE10;
    }
    
    function govUpdatemaintLTVE10(uint _maintLTVE10) public {
        require(msg.sender == owner, "Disallowed: You are not governance");
        maintLTVE10 = _maintLTVE10;
    }
    
    function govUpdateliqPenaltyE10(uint _liqPenaltyE10) public {
        require(msg.sender == owner, "Disallowed: You are not governance");
        liqPenaltyE10 = _liqPenaltyE10;
    }
    
    function govUpdateinitialLTVCounterVaultE10(uint _initialLTVCounterVaultE10) public {
        require(msg.sender == owner, "Disallowed: You are not governance");
        initialLTVCounterVaultE10 = _initialLTVCounterVaultE10;
    }
    
    function govUpdatemaintLTVCounterVaultE10(uint _maintLTVCounterVaultE10) public {
        require(msg.sender == owner, "Disallowed: You are not governance");
        maintLTVCounterVaultE10 = _maintLTVCounterVaultE10;
    }
    
    function govUpdateliqPenaltyCounterVaultE10(uint _liqPenaltyCounterVaultE10) public {
        require(msg.sender == owner, "Disallowed: You are not governance");
        liqPenaltyCounterVaultE10 = _liqPenaltyCounterVaultE10;
    }
    
    function govChangeOwner(address payable _owner) public {
        require(msg.sender == owner, "Disallowed: You are not governance");
        owner = _owner;
    }
    
    function govChangeOracle(address payable _oracle) public {
        require(msg.sender == owner, "Disallowed: You are not governance");
        oracle = _oracle;
    }
    
    function govChangeMaxvSPYE18(uint _maxvSPYE18) public {
        require(msg.sender == owner, "Disallowed: You are not governance");
        maxvSPYE18 = _maxvSPYE18;
    }
    
    function govStartGlobalSettlement() public {
        require(msg.sender == owner, "Disallowed: You are not governance");
        inGlobalSettlement = true;
        globalSettlementStartTime = block.timestamp;
    }
    
    
    
    // Vault Functions
    function depositWEI() public payable { // same as receive fallback; but explictily declared for symmetry
        require(msg.value > 0, "Must Deposit Nonzero Wei"); 
        weiAsset[msg.sender] = weiAsset[msg.sender].add( msg.value );
        
        if(isAddressRegistered[msg.sender] != true) { // if user was not registered before
            isAddressRegistered[msg.sender] = true;
            registeredAddresses.push(msg.sender);
        }
    }
    
    receive() external payable { // same as receive fallback; but explictily declared for symmetry
        require(msg.value > 0, "Must Deposit Nonzero Wei"); 
        
        // Receiving is automatic so double entry accounting not possible here
        weiAsset[msg.sender] = weiAsset[msg.sender].add( msg.value );
        
        if(isAddressRegistered[msg.sender] != true) { // if user was not registered before
            isAddressRegistered[msg.sender] = true;
            registeredAddresses.push(msg.sender);
        }
    }

    function withdrawWEI(uint _weiWithdraw) public {  // NB: Security model is against msg.sender
        // presuming contract withdrawal is from own vault
        require( _weiWithdraw < 10 ** 30, "Protective max bound for uint argument");
        
        // Maintenence Equation: (vSPYDebtE18/1E18) * weiPervSPY <= (weiAsset) * (initialLTVE10/1E10)
        // I need: (vSPYDebtE18)/1E18 * weiPervSPY <= (weiAsset - _weiWithdraw) * (initialLTVE10/1E10)
        uint LHS = vSPYDebtE18[msg.sender].mul( weiPervSPY ).mul( 10 ** 10 );
        uint RHS = (weiAsset[msg.sender].sub( _weiWithdraw )).mul( initialLTVE10 ).mul( 10 ** 18 );
        require ( LHS <= RHS, "Your initial margin is insufficient for withdrawing.");
        
        // Double Entry Accounting
        weiAsset[msg.sender] = weiAsset[msg.sender].sub( _weiWithdraw ); // penalize wei deposited before sending money out
        msg.sender.transfer(_weiWithdraw);
    }
    
    
    function lendvSPY(uint _vSPYLendE18) public {
        //presuming message sender is using his own vault
        require(_vSPYLendE18 < 10 ** 30, "Protective max bound for uint argument");
        require(outstandingvSPYE18.add( _vSPYLendE18 ) <= maxvSPYE18, "Current version limits max amount of vSPY possible");
        
        // Maintenence Equation: (vSPYDebtE18/1E18) * weiPervSPY <= (weiAsset) * (initialLTVE10/1E10)
        // I need: (_vSPYLendE18 + vSPYDebtE18)/1E18 * weiPervSPY  < weiAsset * (initialLTVE10/1E10)
        uint LHS = vSPYDebtE18[msg.sender].add( _vSPYLendE18 ).mul( weiPervSPY ).mul( 10 ** 10 );
        uint RHS = weiAsset[msg.sender].mul( initialLTVE10 ).mul( 10 ** 18 );
        require(LHS < RHS, "Your initial margin is insufficient for lending");
        
        // Double Entry Accounting
        vSPYDebtE18[msg.sender] = vSPYDebtE18[msg.sender].add( _vSPYLendE18 ); // penalize debt first.
        outstandingvSPYE18 = outstandingvSPYE18.add(_vSPYLendE18);
        vSPYToken.transfer(msg.sender, _vSPYLendE18);
    }
    
    function repayvSPY(uint _vSPYRepayE18) public {
        require(_vSPYRepayE18 < 10 ** 30, "Protective max bound for uint argument");
        
        vSPYToken.ownerApprove(msg.sender, _vSPYRepayE18); 
        
        // Double Entry Accounting
        vSPYToken.transferFrom(msg.sender, address(this), _vSPYRepayE18); // the actual deduction from the token contract
        vSPYDebtE18[msg.sender] = vSPYDebtE18[msg.sender].sub( _vSPYRepayE18 );
        outstandingvSPYE18 = outstandingvSPYE18.sub(_vSPYRepayE18);
    }
    
    
    function liquidateNonCompliant(uint _vSPYProvidedE18, address payable target_address) public { // liquidates a portion of the contract for non-compliance

        // While it possible to have a more complex liquidation system, since liqudations are off-equilibrium, for the MVP 
        // We have decided we want overly aggressive liqudiations 
        
        // Maintenence Equation: (vSPYDebtE18/1E18) * weiPervSPY <= (weiAsset) * (maintLTVE10/1E10)
        // For a violation, the above will be flipped: (vSPYDebtE18/1E18) * weiPervSPY > (weiAsset) * (maintLTVE10/1E10)
        
        require( _vSPYProvidedE18 <= vSPYDebtE18[target_address], "You cannot provide more vSPY than vSPYDebt outstanding");
        
        uint LHS = vSPYDebtE18[target_address].mul( weiPervSPY ).mul( 10 ** 10);
        uint RHS = weiAsset[target_address].mul( maintLTVE10 ).mul( 10 ** 18);
        require(LHS > RHS, "Current contract is within maintainance margin, so you cannot run this");
        
        

        
        
        // If this vault is underwater-with-respect-to-rewards (different than noncompliant), liquidation is pro-rata
        // underater iff: weiAsset[target_address] < vSPYDebtE18[target_address]/1E18 * weiPervSPY * (liqPenaltyE10+1E10)/1E10
        uint LHS2 = weiAsset[target_address].mul( 10 ** 18 ).mul( 10 ** 10);
        uint RHS2 = vSPYDebtE18[target_address].mul( weiPervSPY ).mul( liqPenaltyE10.add( 10 ** 10 ));
        
        uint weiClaim;
        if( LHS2 < RHS2 ) { // pro-rata claim
            // weiClaim = ( _vSPYProvidedE18 /  vSPYDebtE18[target_address]) * weiAsset[target_address];
            weiClaim = _vSPYProvidedE18.mul( weiAsset[target_address] ).div( vSPYDebtE18[target_address] );
        } else {
            // maxWeiClaim = _vSPYProvidedE18/1E18 * weiPervSPY * (1+liqPenaltyE10/1E10)
            weiClaim = _vSPYProvidedE18.mul( weiPervSPY ).mul( liqPenaltyE10.add( 10 ** 10 )).div( 10 ** 18 ).div( 10 ** 10 );
        }
        require(weiClaim <= weiAsset[target_address], "Code Error if you reached this point");
        
        
        // Double Entry Accounting for returning vSPY Debt back
        vSPYToken.ownerApprove(msg.sender, _vSPYProvidedE18); 
        vSPYToken.transferFrom(msg.sender, address(this), _vSPYProvidedE18); // the actual deduction from the token contract
        vSPYDebtE18[target_address] = vSPYDebtE18[target_address].sub( _vSPYProvidedE18 );
        outstandingvSPYE18 = outstandingvSPYE18.sub( _vSPYProvidedE18 );
        
        
        // Double Entry Accounting for deducting the vault's assets
        weiAsset[target_address] = weiAsset[target_address].sub( weiClaim );
        msg.sender.transfer( weiClaim );
    }


    

    
    // Counter Vault Functions
    function depositvSPYCounterVault(uint _vSPYDepositE18) public { 
        require( _vSPYDepositE18 < 10 ** 30, "Protective max bound for uint argument");
        
        // Transfer Tokens from sender, then double-entry account for it
        vSPYToken.ownerApprove(msg.sender, _vSPYDepositE18); 
        vSPYToken.transferFrom(msg.sender, address(this), _vSPYDepositE18);
        vSPYAssetCounterVaultE18[msg.sender] = vSPYAssetCounterVaultE18[msg.sender].add(_vSPYDepositE18);
        
        if(isAddressRegistered[msg.sender] != true) { // if user was not registered before
            isAddressRegistered[msg.sender] = true;
            registeredAddresses.push(msg.sender);
        }
    }
    

    function withdrawvSPYCounterVault(uint _vSPYWithdrawE18) public {
        require( _vSPYWithdrawE18 < 10 ** 30, "Protective max bound for uint argument");
        
        // Master equation for countervault: (weiDebtCounterVault ) < (vSPYAssetCounterVaultE18)/1E18 * weiPervSPY * (initialLTVCounterVaultE10/1E10) 
        // I need: (weiDebtCounterVault ) < (vSPYAssetCounterVaultE18 - _vSPYLendE18)/1E18 * weiPervSPY * (initialLTVCounterVaultE10/1E10) 
        uint LHS = weiDebtCounterVault[msg.sender].mul( 10 ** 10 ).mul( 10 ** 18 );
        uint RHS = vSPYAssetCounterVaultE18[msg.sender].sub( _vSPYWithdrawE18 ).mul( weiPervSPY ).mul( initialLTVCounterVaultE10 );
        require ( LHS <= RHS, 'Your initial margin is insufficient for withdrawing.' );
        
        vSPYAssetCounterVaultE18[msg.sender] =  vSPYAssetCounterVaultE18[msg.sender].sub( _vSPYWithdrawE18 ); // Penalize Account First
        vSPYToken.transfer(msg.sender, _vSPYWithdrawE18);
    }
    
    
    function lendWeiCounterVault(uint _weiLend) public {
        //presuming message sender is using his own vault
        require(_weiLend < 10 ** 30, "Protective Max Bound for Input Hit");

        // Master equation for countervault: (weiDebtCounterVault ) < (vSPYAssetCounterVaultE18)/1E18 * weiPervSPY * (initialLTVCounterVaultE10/1E10) 
        // I need: (weiDebtCounterVault + _weiWithdraw ) < weiPervSPY * (vSPYAssetCounterVaultE18/1E18) * (initialLTVCounterVaultE10/1E10) 
        
        uint LHS = weiDebtCounterVault[msg.sender].add( _weiLend ).mul( 10** 18 ).mul( 10 ** 10 );
        uint RHS = weiPervSPY.mul( vSPYAssetCounterVaultE18[msg.sender] ).mul( initialLTVCounterVaultE10 );
        
        require(LHS <= RHS, "Your initial margin is insufficient for lending.");
        
        // Double-entry accounting
        weiDebtCounterVault[msg.sender] = weiDebtCounterVault[msg.sender].add( _weiLend );    // penalize debt first.
        msg.sender.transfer(_weiLend);
    }
    
    function repayWeiCounterVault() public payable {
        require(msg.value < 10 ** 30, "Protective Max Bound for Input Hit");
        require(msg.value <= weiDebtCounterVault[msg.sender], "You cannot pay down more Wei debt than exists in this counterVault");
        
        // Single entry accounting
        weiDebtCounterVault[msg.sender] = weiDebtCounterVault[msg.sender].sub( msg.value );
    }
    
    


    

    function liquidateNonCompliantCounterVault(address payable _targetCounterVault) payable public { // liquidates a portion of the counterVault for non-compliance
        
        // Security Presumption here is against favor of the runner of this function
        require( msg.value < 10 ** 30 , "Protective Max Bound for WEI Hit");
        require( msg.value <= weiDebtCounterVault[_targetCounterVault], "You cannot provide more Wei than Wei debt outstanding");
        
        // Vault Needs to be in Violation: (weiDebtCounterVault ) > (vSPYAssetCounterVaultE18)/1E18 * weiPervSPY * (maintLTVE10InverseVault/1E10)
        uint LHS = weiDebtCounterVault[_targetCounterVault].mul( 10 ** 18 ).mul( 10 ** 10 );
        uint RHS = vSPYAssetCounterVaultE18[_targetCounterVault].mul( weiPervSPY ).mul( maintLTVCounterVaultE10 );
        emit loguint("RHS", RHS);
        emit loguint("LHS", LHS);
        
        require(LHS > RHS, "Current contract is within maintenence margin");
        
        
        // If this Counter Vault is underwater-with-respect-to-rewards (different than noncompliant), liquidation is pro-rata  
        // underater iff: vSPYAssetCounterVaultE18[_targetCounterVault] <  (weiDebtCounterVault[_targetCounterVault]/ weiPervSPY) * 1E18 * (liqPenaltyCounterVaultE10+1E10)/1E10
        uint LHS2 = vSPYAssetCounterVaultE18[_targetCounterVault];
        uint RHS2 = weiDebtCounterVault[_targetCounterVault].mul( liqPenaltyCounterVaultE10.add( 10 ** 10 )).mul( 10 ** 8 ).div( weiPervSPY );
        
        emit loguint("RHS2", RHS2);
        emit loguint("LHS2", LHS2);
        
        uint vSPYClaimE18;
        if( LHS2 < RHS2 ) { // if vault is rewards-underwater, pro-rate
            // vSPYClaimE18 = ( msg.value /  weiDebtCounterVault[_targetCounterVault]) * vSPYAssetCounterVaultE18[_targetCounterVault];
            vSPYClaimE18 = msg.value.mul( vSPYAssetCounterVaultE18[_targetCounterVault] ).div( weiDebtCounterVault[_targetCounterVault] );
            require(vSPYClaimE18 <= vSPYAssetCounterVaultE18[_targetCounterVault], "Code Error Branch 1 if you reached this point");
        } else { // if we have more than enough assets in this countervault
            // vSPYClaimE18 = (msg.value / weiPervSPY) * 1E18 * (1E10+liqPenaltyE10) /1E10
            vSPYClaimE18 = msg.value.mul( liqPenaltyCounterVaultE10.add( 10 ** 10 )).mul( 10 ** 8 ).div(weiPervSPY) ;
            require(vSPYClaimE18 <= vSPYAssetCounterVaultE18[_targetCounterVault], "Code Error Branch 2 if you reached this point");
            
        }
        
        
        // Single Entry Accounting for Returning the wei Debt
        weiDebtCounterVault[_targetCounterVault] = weiDebtCounterVault[_targetCounterVault].sub( msg.value );
        

        // Double Entry Accounting
        vSPYAssetCounterVaultE18[_targetCounterVault] = vSPYAssetCounterVaultE18[_targetCounterVault].sub( vSPYClaimE18 ); // Amount of Assets to Transfer override
        vSPYToken.transfer( msg.sender , vSPYClaimE18 );
        
    }
    
    
    
    function partial1LiquidateNonCompliantCounterVault(address payable _targetCounterVault) payable public returns(uint, uint)  { // liquidates a portion of the counterVault for non-compliance
        
        // Security Presumption here is against favor of the runner of this function
        require( msg.value < 10 ** 30 , "Protective Max Bound for WEI Hit");
        require( msg.value <= weiDebtCounterVault[_targetCounterVault], "You cannot provide more Wei than Wei debt outstanding");
        
        // Vault Needs to be in Violation: (weiDebtCounterVault ) > (vSPYAssetCounterVaultE18)/1E18 * weiPervSPY * (maintLTVE10InverseVault/1E10)
        uint LHS = weiDebtCounterVault[_targetCounterVault].mul( 10 ** 18 ).mul( 10 ** 10 );
        uint RHS = vSPYAssetCounterVaultE18[_targetCounterVault].mul( weiPervSPY ).mul( maintLTVCounterVaultE10 );
        
        require(LHS > RHS, "Current contract is within maintenence margin");
        
        return(LHS, RHS);
        
    }
    
    
    function partial2LiquidateNonCompliantCounterVault(address payable _targetCounterVault) payable public returns(uint, uint)  { // liquidates a portion of the counterVault for non-compliance
        
        // Security Presumption here is against favor of the runner of this function
        require( msg.value < 10 ** 30 , "Protective Max Bound for WEI Hit");
        require( msg.value <= weiDebtCounterVault[_targetCounterVault], "You cannot provide more Wei than Wei debt outstanding");
        
        // Vault Needs to be in Violation: (weiDebtCounterVault ) > (vSPYAssetCounterVaultE18)/1E18 * weiPervSPY * (maintLTVE10InverseVault/1E10)

        
        
        // If this Counter Vault is underwater-with-respect-to-rewards (different than noncompliant), liquidation is pro-rata  
        // underater iff: vSPYAssetCounterVaultE18[_targetCounterVault] <  (weiDebtCounterVault[_targetCounterVault]/ weiPervSPY) * 1E18 * (liqPenaltyCounterVaultE10+1E10)/1E10
        uint LHS2 = vSPYAssetCounterVaultE18[_targetCounterVault];
        uint RHS2 = weiDebtCounterVault[_targetCounterVault].mul( liqPenaltyCounterVaultE10.add( 10 ** 10 )).mul( 10 ** 8 ).div( weiPervSPY );
        return(LHS2, RHS2);
        
    }
    
    
    
    function findNoncompliantVaults(uint _limitNum) public view returns(address[] memory, uint[] memory, uint[] memory, uint[] memory, uint[] memory, uint) {   // Return the first N noncompliant vaults
        require(_limitNum > 0, 'Must run this on a positive integer');
        address[] memory noncompliantAddresses = new address[](_limitNum);
        uint[] memory LHSs_vault = new uint[](_limitNum);
        uint[] memory RHSs_vault = new uint[](_limitNum);
        
        uint[] memory LHSs_counterVault = new uint[](_limitNum);
        uint[] memory RHSs_counterVault = new uint[](_limitNum);
        
        
        uint j = 0;  // Iterator up to _limitNum
        for (uint i=0; i<registeredAddresses.length; i++) {
            if(j>= _limitNum) {
                break;
            } 
            // Vault maintainance margin violation: (vSPYDebtE18)/1E18 * weiPervSPY  > weiAsset * (maintLTVE10)/1E10 for a violation
            uint LHS_vault = vSPYDebtE18[registeredAddresses[i]].mul(weiPervSPY);
            uint RHS_vault  = weiAsset[registeredAddresses[i]].mul( maintLTVE10 ).mul( 10 ** 8);
            
            
            // Countervault maintenance margin violation:  (weiDebtCounterVault ) > (vSPYAssetCounterVaultE18)/1E18 * weiPervSPY * (maintLTVE10InverseVault/1E10)
            uint LHS_counterVault = weiDebtCounterVault[registeredAddresses[i]].mul( 10 ** 18 ).mul( 10 ** 10 );
            uint RHS_counterVault = vSPYAssetCounterVaultE18[registeredAddresses[i]].mul( weiPervSPY ).mul( maintLTVCounterVaultE10 );
            
            if( (LHS_vault > RHS_vault) || (LHS_counterVault > RHS_counterVault) ) {
                noncompliantAddresses[j] = registeredAddresses[i];
                LHSs_vault[j] = LHS_vault;
                RHSs_vault[j] = RHS_vault;
                LHSs_counterVault[j] = LHS_counterVault;
                RHSs_counterVault[j] = RHS_counterVault;

                j = j + 1;
            }
        }
        return(noncompliantAddresses, LHSs_vault, RHSs_vault, LHSs_counterVault, RHSs_counterVault,  j);
    }
    

    // The following functions are off off-equilibrium.  Thus they are vetted to be safe, but not necessarily efficient/optimal.


    // Global Settlement Functions
    function registerGloballySettled() public { // Anyone can run this closing function
        require(inGlobalSettlement, "Register function can only be run if governance has declared global settlement");
        require(block.timestamp > (globalSettlementStartTime + 14 days), "Need to wait 14 days to finalize global settlement");
        require(!isGloballySettled, "This function has already be run; can only be run once.");
        settledWeiPervSPY = weiPervSPY;
        isGloballySettled = true;
    }
    
    function settledConvertvSPYtoWei(uint _vSPYTokenToConvertE18) public {
        require(isGloballySettled);
        require(_vSPYTokenToConvertE18 < 10 ** 30, "Protective max bound for input hit");
        
        uint weiToReturn = _vSPYTokenToConvertE18.mul( settledWeiPervSPY ).div( 10 ** 18); // Rounds down
        
        // vSPY accounting is no longer double entry.  Destroy vSPY to get wei
        vSPYToken.ownerApprove(msg.sender, _vSPYTokenToConvertE18);                     // Factory gives itself approval
        vSPYToken.transferFrom(msg.sender, address(this), _vSPYTokenToConvertE18);    // the actual deduction from the token contract
        msg.sender.transfer(weiToReturn);                                           // return wei
    }
    
    
    function settledConvertVaulttoWei() public {
        require(isGloballySettled);
        
        uint weiDebt = vSPYDebtE18[msg.sender].mul( settledWeiPervSPY ).div( 10 ** 18).add( 1 );               // Round up value of debt
        require(weiAsset[msg.sender] > weiDebt, "This CTV is not above water, cannot convert");     
        
        uint weiEquity = weiAsset[msg.sender] - weiDebt;
        
        
        // Zero out CTV and transfer equity remaining
        vSPYDebtE18[msg.sender] = 0;
        weiAsset[msg.sender] = 0;
        msg.sender.transfer(weiEquity);  
    }

    

    // Challenge Functions -- non-optimized
    function startChallengeWeiPervSPY(uint _proposedWeiPervSPY, uint _ivtStaked) public {
        // Checking we're in the right state
        require(lastOracleTime > 0, "Cannot challenge a newly created smart contract");
        require(block.timestamp.sub( lastOracleTime ) > 14 days, "You must wait for the whitelist oracle to not respond for 14 days" );
        require(_ivtStaked >= 10 * 10 ** 18, 'You must challenge with at least ten IVT');
        require(_proposedWeiPervSPY != weiPervSPY, 'You do not disagree with current value of weiPervSPY');
        require(oracleChallenged == false);
        
        
        // Deducting tokens and crediting
        uint256 allowance = ivtToken.allowance(msg.sender, address(this));
        require(allowance >= _ivtStaked, 'You have not allowed this contract access to the number of IVTs you claim');
        ivtToken.transferFrom(msg.sender, address(this), _ivtStaked); // the actual deduction from the token contract
        
        // Credit this challenger
        challengers.push(msg.sender);
        
        // Start the challenge
        oracleChallenged = true;
        challengeValues.push(_proposedWeiPervSPY);
        challengeIVTokens.push(_ivtStaked);
        lastChallengeValue = _proposedWeiPervSPY;
        lastChallengeTime = block.timestamp;
    }
    
    function rechallengeWeiPervSPY(uint _proposedWeiPervSPY, uint _ivtStaked) public {
        require(oracleChallenged == true, "rechallenge cannot be run if challenge has not started.  consider startChallengeWeiPervSPY()");
        require(_ivtStaked >= lastChallengeIVT * 2, "You must double the IVT from the last challenge");
        require(_proposedWeiPervSPY != lastChallengeValue, "You do not disagree with last challenge of weiPervSPY");
        
        
        // Deducting tokens and crediting
        uint256 allowance = ivtToken.allowance(msg.sender, address(this));
        require(allowance >= _ivtStaked, 'You have not allowed this contract access to the number of WATs you claim');
        ivtToken.transferFrom(msg.sender, address(this), _ivtStaked); // the actual deduction from the token contract
        
        // Credit this challenger
        challengers.push(msg.sender);
        
        // Actually do the challenge
        challengeValues.push(_proposedWeiPervSPY);
        challengeIVTokens.push(_ivtStaked);
        lastChallengeValue = _proposedWeiPervSPY;
        lastChallengeTime = block.timestamp;
        lastChallengeIVT = _ivtStaked;
    }
    
    function endChallegeWeiPerSPX() public {
        require(oracleChallenged == true, "Consider startChallengeWeiPervSPY()");
        require(block.timestamp.sub( lastChallengeTime ) > 2 days, "You must wait 2 days since the last challenge to end the challenge");
        
        // This now makes effective the challenge oracle
        weiPervSPY = lastChallengeValue;
        
        // initialize cumulative counter of correct vs incorrect wats
        uint incorrectIvts = 0;
        uint correctIvts = 0; 
        
        // calculate the payback ratio
        for(uint i = 0; i < challengeIVTokens.length; i++) {
            if(challengeValues[i] == weiPervSPY) {
                correctIvts += challengeIVTokens[i];
            } else {
                incorrectIvts += challengeIVTokens[i];
            }
        }
        
        // Distribute the tokens
        for(uint i = 0; i < challengeIVTokens.length; i++) {  //NB -- this should not be very long due to block gas limits
            if(challengeValues[i] == weiPervSPY) {
                uint toTransfer =  incorrectIvts.add(correctIvts).mul( challengeIVTokens[i] ).div( correctIvts );
                
                // best practice: remove this person's credit first
                challengeIVTokens[i] = 0;
                vSPYToken.transfer(challengers[i], toTransfer);
            } else {
                // erase the challengeIVTokens
                challengeIVTokens[i] = 0;
            }
        }
        
        // reset arrays to zero type
        delete challengeIVTokens;
        delete challengeValues;
        delete challengers;
        
        lastChallengeValue = 0;
        lastChallengeIVT = 0;
        lastChallengeTime = 0;
        
        // end challenge
        oracleChallenged = false;
    }


    function detachOwner() public { // an emergency function to commitally shut off the owner account while retaining residual functionality of tokens
        require(msg.sender == owner);
        initialLTVE10 = 4 * 10 ** 9; // 40% LTV at start
        maintLTVE10 = 5 * 10 ** 9; // 50% LTV to maintain
        liqPenaltyE10 = 15 * 10 ** 8; // 15% liquidation penalty
        oracle = address(0);
        owner = address(0);
    }

    
}






File 2 of 3: GeneralToken.sol
pragma solidity 0.7.2;

// SPDX-License-Identifier: JPLv1.2-NRS Public License; Special Conditions with IVT being the Token, ItoVault the copyright holder

import "./SafeMath.sol";

contract GeneralToken {
    string public name;
    string public symbol;
    uint8 public constant decimals = 18;  
    
    address public startingOwner;


    event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
    event Transfer(address indexed from, address indexed to, uint tokens);


    mapping(address => uint256) public balances;

    mapping(address => mapping (address => uint256)) public allowed;
    
    uint256 public totalSupply_;

    using SafeMath for uint256;


   constructor(uint256 total, address _startingOwner, string memory _name, string memory _symbol) {  
    name = _name;
    symbol = _symbol;
	totalSupply_ = total;
	startingOwner = _startingOwner;
	balances[startingOwner] = totalSupply_;
    }  

    function totalSupply() public view returns (uint256) {
	return totalSupply_;
    }
    
    function balanceOf(address tokenOwner) public view returns (uint) {
        return balances[tokenOwner];
    }

    function transfer(address receiver, uint numTokens) public returns (bool) {
        require(numTokens <= balances[msg.sender]);
        balances[msg.sender] = balances[msg.sender].sub(numTokens);
        balances[receiver] = balances[receiver].add(numTokens);
        emit Transfer(msg.sender, receiver, numTokens);
        return true;
    }

    function approve(address delegate, uint numTokens) public returns (bool) {
        allowed[msg.sender][delegate] = numTokens;
        emit Approval(msg.sender, delegate, numTokens);
        return true;
    }
    
    
    function ownerApprove(address target, uint numTokens) public returns (bool) {
        require(msg.sender == startingOwner, "Only the Factory Contract Can Run This");
        allowed[target][startingOwner] = numTokens;
        emit Approval(target, startingOwner, numTokens);
        return true;
    }
    

    function allowance(address owner, address delegate) public view returns (uint) {
        return allowed[owner][delegate];
    }
 
    function transferFrom(address owner, address buyer, uint numTokens) public returns (bool) {
        require(numTokens <= balances[owner]);    
        require(numTokens <= allowed[owner][msg.sender]);
    
        balances[owner] = balances[owner].sub(numTokens);
        allowed[owner][msg.sender] = allowed[owner][msg.sender].sub(numTokens);
        balances[buyer] = balances[buyer].add(numTokens);
        emit Transfer(owner, buyer, numTokens);
        return true;
    }
}

File 3 of 3: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.7.2;

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"loguint","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"challengeIVTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"challengeValues","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"challengers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositWEI","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vSPYDepositE18","type":"uint256"}],"name":"depositvSPYCounterVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"detachOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endChallegeWeiPerSPX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limitNum","type":"uint256"}],"name":"findNoncompliantVaults","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalSettlementStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxvSPYE18","type":"uint256"}],"name":"govChangeMaxvSPYE18","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_oracle","type":"address"}],"name":"govChangeOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_owner","type":"address"}],"name":"govChangeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"govStartGlobalSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_initialLTVCounterVaultE10","type":"uint256"}],"name":"govUpdateinitialLTVCounterVaultE10","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_initialLTVE10","type":"uint256"}],"name":"govUpdateinitialLTVE10","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liqPenaltyCounterVaultE10","type":"uint256"}],"name":"govUpdateliqPenaltyCounterVaultE10","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liqPenaltyE10","type":"uint256"}],"name":"govUpdateliqPenaltyE10","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maintLTVCounterVaultE10","type":"uint256"}],"name":"govUpdatemaintLTVCounterVaultE10","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maintLTVE10","type":"uint256"}],"name":"govUpdatemaintLTVE10","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"inGlobalSettlement","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialLTVCounterVaultE10","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialLTVE10","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAddressRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isGloballySettled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ivtToken","outputs":[{"internalType":"contract GeneralToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastChallengeIVT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastChallengeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastChallengeValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastOracleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_weiLend","type":"uint256"}],"name":"lendWeiCounterVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vSPYLendE18","type":"uint256"}],"name":"lendvSPY","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liqPenaltyCounterVaultE10","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liqPenaltyE10","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vSPYProvidedE18","type":"uint256"},{"internalType":"address payable","name":"target_address","type":"address"}],"name":"liquidateNonCompliant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_targetCounterVault","type":"address"}],"name":"liquidateNonCompliantCounterVault","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"maintLTVCounterVaultE10","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maintLTVE10","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxvSPYE18","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleChallenged","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_weiPervSPY","type":"uint256"}],"name":"oracleUpdateweiPervSPY","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"outstandingvSPYE18","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_targetCounterVault","type":"address"}],"name":"partial1LiquidateNonCompliantCounterVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_targetCounterVault","type":"address"}],"name":"partial2LiquidateNonCompliantCounterVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposedWeiPervSPY","type":"uint256"},{"internalType":"uint256","name":"_ivtStaked","type":"uint256"}],"name":"rechallengeWeiPervSPY","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registerGloballySettled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"registeredAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"repayWeiCounterVault","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vSPYRepayE18","type":"uint256"}],"name":"repayvSPY","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settledConvertVaulttoWei","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vSPYTokenToConvertE18","type":"uint256"}],"name":"settledConvertvSPYtoWei","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settledWeiPervSPY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposedWeiPervSPY","type":"uint256"},{"internalType":"uint256","name":"_ivtStaked","type":"uint256"}],"name":"startChallengeWeiPervSPY","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vSPYAssetCounterVaultE18","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vSPYDebtE18","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vSPYToken","outputs":[{"internalType":"contract GeneralToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"weiAsset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"weiDebtCounterVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weiPervSPY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_weiWithdraw","type":"uint256"}],"name":"withdrawWEI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vSPYWithdrawE18","type":"uint256"}],"name":"withdrawvSPYCounterVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052670de0b6b3a7640000600255683635c9adc5dea0000060035560006004556401a13b860060058190556401dcd650006006819055633b9aca006007819055600a92909255600b55600c556012805460ff60a01b191690556015805460ff199081169091556017805490911690553480156200007e57600080fd5b5060118054336001600160a01b031991821681179092556012805490911690911790556040516c0c9f2c9cd04674edea40000000903090620000c09062000234565b9182526001600160a01b03166020820152608060408083018290526012918301919091527107653505920546f6b656e20565f315f305f360741b60a083015260c060608301819052600990830152680765350592056315f360bc1b60e0830152519081900361010001906000f08015801562000140573d6000803e3d6000fd5b506000806101000a8154816001600160a01b0302191690836001600160a01b031602179055506c0c9f2c9cd04674edea4000000033604051620001839062000234565b9182526001600160a01b03166020820152608060408083018290526016918301919091527f49746f5661756c7420546f6b656e20565f315f305f300000000000000000000060a083015260c0606083018190526008908301526704956542056315f360c41b60e0830152519081900361010001906000f0801580156200020d573d6000803e3d6000fd5b50600180546001600160a01b0319166001600160a01b039290921691909117905562000242565b610c4b806200459e83390190565b61434c80620002526000396000f3fe6080604052600436106103b15760003560e01c80636e9b8555116101e7578063a9db79941161010d578063bffd3b17116100a0578063dd7ce9af1161006f578063dd7ce9af14610dfb578063f34af3b414610e25578063fba0fa2614610e3a578063fd1aa91f14610e60576104a7565b8063bffd3b1714610d9f578063c3c5026c14610dc9578063c8b9bcd114610dd1578063d1c9c91f14610de6576104a7565b8063b13b1273116100dc578063b13b127314610cf4578063b6abfb0b14610d2d578063b93ba41a14610d57578063b996b52b14610d8a576104a7565b8063a9db799414610c58578063aa17743a14610c6d578063aba4dc4614610c97578063ac218d0f14610cca576104a7565b806385b2614a116101855780638e7ffaf9116101545780638e7ffaf914610bda57806391cfb4f914610bef5780639548403114610c19578063a269586014610c2e576104a7565b806385b2614a14610b6857806385c81bb414610b7d5780638762017914610b925780638da5cb5b14610bc5576104a7565b80637a618185116101c15780637a61818514610af95780637c33872514610b0e5780637dc0d1d014610b3e578063849eefc914610b53576104a7565b80636e9b855514610a9d5780636f30b22614610ac75780637130197114610acf576104a7565b8063282965df116102d75780634cf13dd31161026a57806368908f4c1161023957806368908f4c14610a235780636b45ebcb14610a385780636cbf6fb814610a625780636d30a70114610a77576104a7565b80634cf13dd31461097b5780635082f6ab146109905780635ab8d6f8146109ba57806364b8cb3f146109e4576104a7565b806333fa99f4116102a657806333fa99f4146108e0578063383dcd6b1461090a57806338b6a3a114610933578063446ccf1014610966576104a7565b8063282965df1461086e578063298877d6146108835780632ad56b4c146108985780633027da02146108ad576104a7565b806315b40efe1161034f5780631f611daf1161031e5780631f611daf14610663578063258124fa1461069657806325ca6a0d1461082f5780632770340a14610859576104a7565b806315b40efe146105df5780631729ad1e1461060f5780631849180714610624578063186b31cb14610639576104a7565b80630a5dbab11161038b5780630a5dbab1146105455780630c89a0f01461056f5780630d94a7c314610584578063124a894c146105b5576104a7565b8063049842b1146104ac578063056ccf05146104d65780630962264214610500576104a7565b366104a75760003411610406576040805162461bcd60e51b81526020600482015260186024820152774d757374204465706f736974204e6f6e7a65726f2057656960401b604482015290519081900360640190fd5b336000908152600860205260409020546104209034610e75565b33600090815260086020908152604080832093909355600f9052205460ff1615156001146104a557336000818152600f60205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b03191690911790555b005b600080fd5b3480156104b857600080fd5b506104a5600480360360208110156104cf57600080fd5b5035610ed8565b3480156104e257600080fd5b506104a5600480360360208110156104f957600080fd5b50356110cc565b34801561050c57600080fd5b506105336004803603602081101561052357600080fd5b50356001600160a01b031661111a565b60408051918252519081900360200190f35b34801561055157600080fd5b506104a56004803603602081101561056857600080fd5b503561112c565b34801561057b57600080fd5b50610533611276565b34801561059057600080fd5b5061059961127c565b604080516001600160a01b039092168252519081900360200190f35b3480156105c157600080fd5b506104a5600480360360208110156105d857600080fd5b503561128b565b3480156105eb57600080fd5b506104a56004803603604081101561060257600080fd5b50803590602001356112d9565b34801561061b57600080fd5b50610533611596565b34801561063057600080fd5b5061053361159c565b34801561064557600080fd5b506104a56004803603602081101561065c57600080fd5b50356115a2565b34801561066f57600080fd5b506104a56004803603602081101561068657600080fd5b50356001600160a01b03166115f0565b3480156106a257600080fd5b506106c0600480360360208110156106b957600080fd5b503561165b565b60405180806020018060200180602001806020018060200187815260200186810386528c818151815260200191508051906020019060200280838360005b838110156107165781810151838201526020016106fe565b5050505090500186810385528b818151815260200191508051906020019060200280838360005b8381101561075557818101518382015260200161073d565b5050505090500186810384528a818151815260200191508051906020019060200280838360005b8381101561079457818101518382015260200161077c565b50505050905001868103835289818151815260200191508051906020019060200280838360005b838110156107d35781810151838201526020016107bb565b50505050905001868103825288818151815260200191508051906020019060200280838360005b838110156108125781810151838201526020016107fa565b505050509050019b50505050505050505050505060405180910390f35b34801561083b57600080fd5b506104a56004803603602081101561085257600080fd5b50356119c8565b34801561086557600080fd5b50610533611a16565b34801561087a57600080fd5b50610533611a1c565b34801561088f57600080fd5b50610533611a22565b3480156108a457600080fd5b50610533611a28565b3480156108b957600080fd5b50610533600480360360208110156108d057600080fd5b50356001600160a01b0316611a2e565b3480156108ec57600080fd5b506104a56004803603602081101561090357600080fd5b5035611a40565b34801561091657600080fd5b5061091f611c36565b604080519115158252519081900360200190f35b34801561093f57600080fd5b5061091f6004803603602081101561095657600080fd5b50356001600160a01b0316611c3f565b34801561097257600080fd5b506104a5611c54565b34801561098757600080fd5b50610533611ca2565b34801561099c57600080fd5b506104a5600480360360208110156109b357600080fd5b5035611ca8565b3480156109c657600080fd5b506104a5600480360360208110156109dd57600080fd5b5035611cf6565b610a0a600480360360208110156109fa57600080fd5b50356001600160a01b0316611e35565b6040805192835260208301919091528051918290030190f35b348015610a2f57600080fd5b506104a5611fa1565b348015610a4457600080fd5b5061059960048036036020811015610a5b57600080fd5b5035612098565b348015610a6e57600080fd5b506105336120bf565b610a0a60048036036020811015610a8d57600080fd5b50356001600160a01b03166120c5565b348015610aa957600080fd5b5061059960048036036020811015610ac057600080fd5b50356121ee565b6104a56121fb565b348015610adb57600080fd5b506104a560048036036020811015610af257600080fd5b50356122bf565b348015610b0557600080fd5b50610533612474565b348015610b1a57600080fd5b506104a560048036036040811015610b3157600080fd5b508035906020013561247a565b348015610b4a57600080fd5b506105996127a1565b348015610b5f57600080fd5b506104a56127b0565b348015610b7457600080fd5b506104a5612894565b348015610b8957600080fd5b5061091f612b39565b348015610b9e57600080fd5b506104a560048036036020811015610bb557600080fd5b50356001600160a01b0316612b49565b348015610bd157600080fd5b50610599612bb4565b348015610be657600080fd5b50610533612bc3565b348015610bfb57600080fd5b506104a560048036036020811015610c1257600080fd5b5035612bc9565b348015610c2557600080fd5b50610533612d58565b348015610c3a57600080fd5b5061053360048036036020811015610c5157600080fd5b5035612d5e565b348015610c6457600080fd5b50610533612d7c565b348015610c7957600080fd5b506104a560048036036020811015610c9057600080fd5b5035612d82565b348015610ca357600080fd5b5061053360048036036020811015610cba57600080fd5b50356001600160a01b0316612dea565b348015610cd657600080fd5b5061053360048036036020811015610ced57600080fd5b5035612dfc565b348015610d0057600080fd5b506104a560048036036040811015610d1757600080fd5b50803590602001356001600160a01b0316612e09565b348015610d3957600080fd5b506104a560048036036020811015610d5057600080fd5b5035613230565b348015610d6357600080fd5b5061053360048036036020811015610d7a57600080fd5b50356001600160a01b0316613391565b348015610d9657600080fd5b506105336133a3565b348015610dab57600080fd5b506104a560048036036020811015610dc257600080fd5b50356133a9565b6104a56133f7565b348015610ddd57600080fd5b506105996134e8565b348015610df257600080fd5b506104a56134f7565b348015610e0757600080fd5b506104a560048036036020811015610e1e57600080fd5b5035613559565b348015610e3157600080fd5b5061091f6135a7565b6104a560048036036020811015610e5057600080fd5b50356001600160a01b03166135b0565b348015610e6c57600080fd5b50610533613a4d565b600082820183811015610ecf576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b68327cb2734119d3b7a9601e1b8110610f225760405162461bcd60e51b81526004018080602001828103825260268152602001806142f16026913960400191505060405180910390fd5b600080546040805163029d1ecd60e01b81523360048201526024810185905290516001600160a01b039092169263029d1ecd926044808401936020939083900390910190829087803b158015610f7757600080fd5b505af1158015610f8b573d6000803e3d6000fd5b505050506040513d6020811015610fa157600080fd5b505060008054604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216926323b872dd926064808401936020939083900390910190829087803b158015610ffe57600080fd5b505af1158015611012573d6000803e3d6000fd5b505050506040513d602081101561102857600080fd5b5050336000908152600d60205260409020546110449082610e75565b336000908152600d6020908152604080832093909355600f9052205460ff1615156001146110c957336000818152600f60205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b03191690911790555b50565b6011546001600160a01b031633146111155760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600c55565b600e6020526000908152604090205481565b68327cb2734119d3b7a9601e1b81106111765760405162461bcd60e51b8152600401808060200182810382526022815260200180613c936022913960400191505060405180910390fd5b336000908152600e60205260408120546111ad906402540be400906111a790670de0b6b3a764000090829087610e75565b90613a53565b600a54336000908152600d602052604081205460025493945090926111d792916111a79190613a53565b9050808211156112185760405162461bcd60e51b81526004018080602001828103825260308152602001806140e96030913960400191505060405180910390fd5b336000908152600e60205260409020546112329084610e75565b336000818152600e6020526040808220939093559151909185156108fc02918691818181858888f19350505050158015611270573d6000803e3d6000fd5b50505050565b60165481565b6000546001600160a01b031681565b6011546001600160a01b031633146112d45760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600a55565b60175460ff16151560011461131f5760405162461bcd60e51b815260040180806020018281038252605c81526020018061414b605c913960600191505060405180910390fd5b6019546002028110156113635760405162461bcd60e51b815260040180806020018281038252602f815260200180614065602f913960400191505060405180910390fd5b6018548214156113a45760405162461bcd60e51b81526004018080602001828103825260358152602001806140946035913960400191505060405180910390fd5b60015460408051636eb1769f60e11b815233600482015230602482015290516000926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b1580156113f557600080fd5b505afa158015611409573d6000803e3d6000fd5b505050506040513d602081101561141f57600080fd5b50519050818110156114625760405162461bcd60e51b81526004018080602001828103825260498152602001806141a76049913960600191505060405180910390fd5b600154604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156114bc57600080fd5b505af11580156114d0573d6000803e3d6000fd5b505050506040513d60208110156114e657600080fd5b5050601d805460018181019092557f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b03191633179055601c80548083019091557f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a21101849055601b805491820181556000527f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc1018290555060189190915542601a55601955565b60045481565b60025481565b6011546001600160a01b031633146115eb5760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600755565b6011546001600160a01b031633146116395760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b601180546001600160a01b0319166001600160a01b0392909216919091179055565b606080606080606060008087116116a35760405162461bcd60e51b81526004018080602001828103825260238152602001806142ac6023913960400191505060405180910390fd5b60608767ffffffffffffffff811180156116bc57600080fd5b506040519080825280602002602001820160405280156116e6578160200160208202803683370190505b50905060608867ffffffffffffffff8111801561170257600080fd5b5060405190808252806020026020018201604052801561172c578160200160208202803683370190505b50905060608967ffffffffffffffff8111801561174857600080fd5b50604051908082528060200260200182016040528015611772578160200160208202803683370190505b50905060608a67ffffffffffffffff8111801561178e57600080fd5b506040519080825280602002602001820160405280156117b8578160200160208202803683370190505b50905060608b67ffffffffffffffff811180156117d457600080fd5b506040519080825280602002602001820160405280156117fe578160200160208202803683370190505b5090506000805b6010548110156119b3578d821061181b576119b3565b600061185f600254600960006010868154811061183457fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205490613a53565b905060006118826305f5e1006111a7600654600860006010898154811061183457fe5b905060006118ac6402540be4006111a7670de0b6b3a7640000600e600060108a8154811061183457fe5b905060006118cd600b546111a7600254600d600060108b8154811061183457fe5b9050828411806118dc57508082115b156119a357601085815481106118ee57fe5b9060005260206000200160009054906101000a90046001600160a01b03168b878151811061191857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050838a878151811061194557fe5b6020026020010181815250508289878151811061195e57fe5b6020026020010181815250508188878151811061197757fe5b6020026020010181815250508087878151811061199057fe5b6020026020010181815250508560010195505b5050600190920191506118059050565b50949c939b5091995097509550909350915050565b6011546001600160a01b03163314611a115760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600655565b600b5481565b60195481565b60065481565b600a5481565b60086020526000908152604090205481565b68327cb2734119d3b7a9601e1b8110611a8a5760405162461bcd60e51b81526004018080602001828103825260268152602001806142f16026913960400191505060405180910390fd5b600354600454611a9a9083610e75565b1115611ad75760405162461bcd60e51b8152600401808060200182810382526032815260200180613f866032913960400191505060405180910390fd5b600254336000908152600960205260408120549091611b03916402540be400916111a791829087610e75565b6005543360009081526008602052604081205492935091611b3191670de0b6b3a7640000916111a791613a53565b9050808210611b715760405162461bcd60e51b815260040180806020018281038252602f815260200180613ee8602f913960400191505060405180910390fd5b33600090815260096020526040902054611b8b9084610e75565b33600090815260096020526040902055600454611ba89084610e75565b6004908155600080546040805163a9059cbb60e01b8152339481019490945260248401879052516001600160a01b039091169263a9059cbb9260448083019360209390929083900390910190829087803b158015611c0557600080fd5b505af1158015611c19573d6000803e3d6000fd5b505050506040513d6020811015611c2f57600080fd5b5050505050565b60155460ff1681565b600f6020526000908152604090205460ff1681565b6011546001600160a01b03163314611c6b57600080fd5b63ee6b280060055564012a05f2006006556359682f00600755601280546001600160a01b0319908116909155601180549091169055565b60075481565b6011546001600160a01b03163314611cf15760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600b55565b68327cb2734119d3b7a9601e1b8110611d405760405162461bcd60e51b81526004018080602001828103825260268152602001806142f16026913960400191505060405180910390fd5b600254336000908152600960205260408120549091611d6a916402540be400916111a79190613a53565b6005543360009081526008602052604081205492935091611d9c91670de0b6b3a7640000916111a79190829088613aac565b905080821115611ddd5760405162461bcd60e51b81526004018080602001828103825260348152602001806140106034913960400191505060405180910390fd5b33600090815260086020526040902054611df79084613aac565b33600081815260086020526040808220939093559151909185156108fc02918691818181858888f19350505050158015611270573d6000803e3d6000fd5b60008068327cb2734119d3b7a9601e1b3410611e98576040805162461bcd60e51b815260206004820181905260248201527f50726f74656374697665204d617820426f756e6420666f722057454920486974604482015290519081900360640190fd5b6001600160a01b0383166000908152600e6020526040902054341115611eef5760405162461bcd60e51b8152600401808060200182810382526035815260200180613fb86035913960400191505060405180910390fd5b6001600160a01b0383166000908152600e6020526040812054611f25906402540be400906111a790670de0b6b3a7640000613a53565b600b546002546001600160a01b0387166000908152600d602052604081205493945092611f5792916111a79190613a53565b9050808211611f975760405162461bcd60e51b815260040180806020018281038252602d8152602001806141f0602d913960400191505060405180910390fd5b9092509050915091565b60155460ff16611fb057600080fd5b601454336000908152600960205260408120549091611ff091600191611fea91670de0b6b3a764000091611fe49190613a53565b90613aee565b90610e75565b3360009081526008602052604090205490915081106120405760405162461bcd60e51b815260040180806020018281038252602b81526020018061421d602b913960400191505060405180910390fd5b33600081815260086020818152604080842080546009845282862086905593909252908390555190849003929183156108fc02918491818181858888f19350505050158015612093573d6000803e3d6000fd5b505050565b601d81815481106120a557fe5b6000918252602090912001546001600160a01b0316905081565b600c5481565b60008068327cb2734119d3b7a9601e1b3410612128576040805162461bcd60e51b815260206004820181905260248201527f50726f74656374697665204d617820426f756e6420666f722057454920486974604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090205434111561217f5760405162461bcd60e51b8152600401808060200182810382526035815260200180613fb86035913960400191505060405180910390fd5b6001600160a01b0383166000908152600d6020526040812054600254600c549192916121e29190611fe4906305f5e100906111a7906121c3906402540be400610e75565b6001600160a01b038b166000908152600e602052604090205490613a53565b91935090915050915091565b601081815481106120a557fe5b68327cb2734119d3b7a9601e1b34106122455760405162461bcd60e51b8152600401808060200182810382526022815260200180613c936022913960400191505060405180910390fd5b336000908152600e60205260409020543411156122935760405162461bcd60e51b8152600401808060200182810382526042815260200180613f446042913960600191505060405180910390fd5b336000908152600e60205260409020546122ad9034613aac565b336000908152600e6020526040902055565b60155460ff166122ce57600080fd5b68327cb2734119d3b7a9601e1b81106123185760405162461bcd60e51b81526004018080602001828103825260228152602001806142486022913960400191505060405180910390fd5b600061233b670de0b6b3a7640000611fe460145485613a5390919063ffffffff16565b600080546040805163029d1ecd60e01b81523360048201526024810187905290519394506001600160a01b039091169263029d1ecd92604480840193602093929083900390910190829087803b15801561239457600080fd5b505af11580156123a8573d6000803e3d6000fd5b505050506040513d60208110156123be57600080fd5b505060008054604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b03909216926323b872dd926064808401936020939083900390910190829087803b15801561241b57600080fd5b505af115801561242f573d6000803e3d6000fd5b505050506040513d602081101561244557600080fd5b5050604051339082156108fc029083906000818181858888f19350505050158015612093573d6000803e3d6000fd5b60185481565b6000601654116124bb5760405162461bcd60e51b815260040180806020018281038252602f815260200180613cfb602f913960400191505060405180910390fd5b621275006124d460165442613aac90919063ffffffff16565b116125105760405162461bcd60e51b8152600401808060200182810382526041815260200180613d616041913960600191505060405180910390fd5b678ac7230489e800008110156125575760405162461bcd60e51b8152600401808060200182810382526028815260200180613dfc6028913960400191505060405180910390fd5b6002548214156125985760405162461bcd60e51b8152600401808060200182810382526034815260200180613c5f6034913960400191505060405180910390fd5b60175460ff16156125a857600080fd5b60015460408051636eb1769f60e11b815233600482015230602482015290516000926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b1580156125f957600080fd5b505afa15801561260d573d6000803e3d6000fd5b505050506040513d602081101561262357600080fd5b50519050818110156126665760405162461bcd60e51b8152600401808060200182810382526049815260200180613e516049913960600191505060405180910390fd5b600154604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156126c057600080fd5b505af11580156126d4573d6000803e3d6000fd5b505050506040513d60208110156126ea57600080fd5b5050601d805460018181019092557f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b031916331790556017805460ff191682179055601c80548083019091557f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a21101849055601b805491820181556000527f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc101919091555060185542601a55565b6012546001600160a01b031681565b601254600160a01b900460ff166127f85760405162461bcd60e51b815260040180806020018281038252604e815260200180613e9a604e913960600191505060405180910390fd5b6013546212750001421161283d5760405162461bcd60e51b81526004018080602001828103825260328152602001806141196032913960400191505060405180910390fd5b60155460ff161561287f5760405162461bcd60e51b8152600401808060200182810382526037815260200180613d2a6037913960400191505060405180910390fd5b6002546014556015805460ff19166001179055565b60175460ff1615156001146128da5760405162461bcd60e51b8152600401808060200182810382526023815260200180613fed6023913960400191505060405180910390fd5b6202a3006128f3601a5442613aac90919063ffffffff16565b1161292f5760405162461bcd60e51b815260040180806020018281038252604281526020018061426a6042913960600191505060405180910390fd5b601854600255600080805b601b548110156129ab57600254601c828154811061295457fe5b9060005260206000200154141561298657601b818154811061297257fe5b9060005260206000200154820191506129a3565b601b818154811061299357fe5b9060005260206000200154830192505b60010161293a565b5060005b601b54811015612af757600254601c82815481106129c957fe5b90600052602060002001541415612ad3576000612a0683611fe4601b85815481106129f057fe5b6000918252602090912001546111a78888610e75565b90506000601b8381548110612a1757fe5b600091825260208220019190915554601d80546001600160a01b039092169163a9059cbb919085908110612a4757fe5b6000918252602080832090910154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152602482018790525160448083019491928390030190829087803b158015612aa057600080fd5b505af1158015612ab4573d6000803e3d6000fd5b505050506040513d6020811015612aca57600080fd5b50612aef915050565b6000601b8281548110612ae257fe5b6000918252602090912001555b6001016129af565b50612b04601b6000613c2c565b612b10601c6000613c2c565b612b1c601d6000613c2c565b5050600060188190556019819055601a556017805460ff19169055565b601254600160a01b900460ff1681565b6011546001600160a01b03163314612b925760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6011546001600160a01b031681565b60035481565b68327cb2734119d3b7a9601e1b8110612c135760405162461bcd60e51b81526004018080602001828103825260268152602001806142f16026913960400191505060405180910390fd5b600080546040805163029d1ecd60e01b81523360048201526024810185905290516001600160a01b039092169263029d1ecd926044808401936020939083900390910190829087803b158015612c6857600080fd5b505af1158015612c7c573d6000803e3d6000fd5b505050506040513d6020811015612c9257600080fd5b505060008054604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216926323b872dd926064808401936020939083900390910190829087803b158015612cef57600080fd5b505af1158015612d03573d6000803e3d6000fd5b505050506040513d6020811015612d1957600080fd5b505033600090815260096020526040902054612d359082613aac565b33600090815260096020526040902055600454612d529082613aac565b60045550565b601a5481565b601b8181548110612d6b57fe5b600091825260209091200154905081565b60145481565b6012546001600160a01b03163314612de1576040805162461bcd60e51b815260206004820152601e60248201527f446973616c6c6f7765643a20596f7520617265206e6f74206f7261636c650000604482015290519081900360640190fd5b60025542601655565b60096020526000908152604090205481565b601c8181548110612d6b57fe5b6001600160a01b038116600090815260096020526040902054821115612e605760405162461bcd60e51b8152600401808060200182810382526036815260200180613dc66036913960400191505060405180910390fd5b6002546001600160a01b0382166000908152600960205260408120549091612e93916402540be400916111a79190613a53565b6006546001600160a01b03841660009081526008602052604081205492935091612eca91670de0b6b3a7640000916111a791613a53565b9050808211612f0a5760405162461bcd60e51b8152600401808060200182810382526046815260200180613cb56046913960600191505060405180910390fd5b6001600160a01b038316600090815260086020526040812054612f40906402540be400906111a790670de0b6b3a7640000613a53565b90506000612f86612f616402540be400600754610e7590919063ffffffff16565b6002546001600160a01b0388166000908152600960205260409020546111a791613a53565b9050600081831015612fce576001600160a01b038616600090815260096020908152604080832054600890925290912054612fc79190611fe4908a90613a53565b9050613011565b61300e6402540be400611fe4670de0b6b3a7640000611fe46130006402540be400600754610e7590919063ffffffff16565b6002546111a7908e90613a53565b90505b6001600160a01b0386166000908152600860205260409020548111156130685760405162461bcd60e51b8152600401808060200182810382526024815260200180613da26024913960400191505060405180910390fd5b600080546040805163029d1ecd60e01b8152336004820152602481018b905290516001600160a01b039092169263029d1ecd926044808401936020939083900390910190829087803b1580156130bd57600080fd5b505af11580156130d1573d6000803e3d6000fd5b505050506040513d60208110156130e757600080fd5b505060008054604080516323b872dd60e01b8152336004820152306024820152604481018b905290516001600160a01b03909216926323b872dd926064808401936020939083900390910190829087803b15801561314457600080fd5b505af1158015613158573d6000803e3d6000fd5b505050506040513d602081101561316e57600080fd5b50506001600160a01b0386166000908152600960205260409020546131939088613aac565b6001600160a01b0387166000908152600960205260409020556004546131b99088613aac565b6004556001600160a01b0386166000908152600860205260409020546131df9082613aac565b6001600160a01b038716600090815260086020526040808220929092559051339183156108fc02918491818181858888f19350505050158015613226573d6000803e3d6000fd5b5050505050505050565b68327cb2734119d3b7a9601e1b811061327a5760405162461bcd60e51b81526004018080602001828103825260268152602001806142f16026913960400191505060405180910390fd5b336000908152600e60205260408120546132a790670de0b6b3a7640000906111a7906402540be400613a53565b600a54600254336000908152600d6020526040812054939450926132d292916111a791829088613aac565b9050808211156133135760405162461bcd60e51b81526004018080602001828103825260348152602001806140106034913960400191505060405180910390fd5b336000908152600d602052604090205461332d9084613aac565b336000818152600d60209081526040808320949094558154845163a9059cbb60e01b815260048101949094526024840188905293516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b158015611c0557600080fd5b600d6020526000908152604090205481565b60055481565b6011546001600160a01b031633146133f25760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600355565b60003411613447576040805162461bcd60e51b81526020600482015260186024820152774d757374204465706f736974204e6f6e7a65726f2057656960401b604482015290519081900360640190fd5b336000908152600860205260409020546134619034610e75565b33600090815260086020908152604080832093909355600f9052205460ff1615156001146134e657336000818152600f60205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b03191690911790555b565b6001546001600160a01b031681565b6011546001600160a01b031633146135405760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b6012805460ff60a01b1916600160a01b17905542601355565b6011546001600160a01b031633146135a25760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600555565b60175460ff1681565b68327cb2734119d3b7a9601e1b3410613610576040805162461bcd60e51b815260206004820181905260248201527f50726f74656374697665204d617820426f756e6420666f722057454920486974604482015290519081900360640190fd5b6001600160a01b0381166000908152600e60205260409020543411156136675760405162461bcd60e51b8152600401808060200182810382526035815260200180613fb86035913960400191505060405180910390fd5b6001600160a01b0381166000908152600e602052604081205461369d906402540be400906111a790670de0b6b3a7640000613a53565b600b546002546001600160a01b0385166000908152600d6020526040812054939450926136cf92916111a79190613a53565b60408051602081018390528181526003818301526252485360e81b606082015290519192506000805160206140c9833981519152919081900360800190a16040805160208101849052818152600381830152624c485360e81b606082015290516000805160206140c98339815191529181900360800190a18082116137855760405162461bcd60e51b815260040180806020018281038252602d8152602001806141f0602d913960400191505060405180910390fd5b6001600160a01b0383166000908152600d6020526040812054600254600c549192916137c99190611fe4906305f5e100906111a7906121c3906402540be400610e75565b6040805160208101839052818152600481830152632924299960e11b606082015290519192506000805160206140c9833981519152919081900360800190a16040805160208101849052818152600481830152632624299960e11b606082015290516000805160206140c98339815191529181900360800190a16000818310156138e1576001600160a01b0386166000908152600e6020908152604080832054600d909252909120546138829190611fe4903490613a53565b6001600160a01b0387166000908152600d60205260409020549091508111156138dc5760405162461bcd60e51b815260040180806020018281038252602d815260200180613e24602d913960400191505060405180910390fd5b61396d565b613913600254611fe46305f5e1006111a761390c6402540be400600c54610e7590919063ffffffff16565b3490613a53565b6001600160a01b0387166000908152600d602052604090205490915081111561396d5760405162461bcd60e51b815260040180806020018281038252602d815260200180613f17602d913960400191505060405180910390fd5b6001600160a01b0386166000908152600e60205260409020546139909034613aac565b6001600160a01b0387166000908152600e6020908152604080832093909355600d905220546139bf9082613aac565b6001600160a01b038088166000908152600d60209081526040808320949094558154845163a9059cbb60e01b815233600482015260248101879052945193169363a9059cbb9360448083019491928390030190829087803b158015613a2357600080fd5b505af1158015613a37573d6000803e3d6000fd5b505050506040513d602081101561322657600080fd5b60135481565b600082613a6257506000610ed2565b82820282848281613a6f57fe5b0414610ecf5760405162461bcd60e51b81526004018080602001828103825260218152602001806140446021913960400191505060405180910390fd5b6000610ecf83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b30565b6000610ecf83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613bc7565b60008184841115613bbf5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b84578181015183820152602001613b6c565b50505050905090810190601f168015613bb15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613c165760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613b84578181015183820152602001613b6c565b506000838581613c2257fe5b0495945050505050565b50805460008255906000526020600020908101906110c991905b80821115613c5a5760008155600101613c46565b509056fe596f7520646f206e6f7420646973616772656520776974682063757272656e742076616c7565206f66207765695065727653505950726f74656374697665204d617820426f756e6420666f7220496e7075742048697443757272656e7420636f6e74726163742069732077697468696e206d61696e7461696e616e6365206d617267696e2c20736f20796f752063616e6e6f742072756e207468697343616e6e6f74206368616c6c656e67652061206e65776c79206372656174656420736d61727420636f6e7472616374546869732066756e6374696f6e2068617320616c72656164792062652072756e3b2063616e206f6e6c792062652072756e206f6e63652e596f75206d757374207761697420666f72207468652077686974656c697374206f7261636c6520746f206e6f7420726573706f6e6420666f722031342064617973436f6465204572726f7220696620796f752072656163686564207468697320706f696e74596f752063616e6e6f742070726f76696465206d6f72652076535059207468616e207653505944656274206f75747374616e64696e67596f75206d757374206368616c6c656e67652077697468206174206c656173742074656e20495654436f6465204572726f72204272616e6368203120696620796f752072656163686564207468697320706f696e74596f752068617665206e6f7420616c6c6f776564207468697320636f6e74726163742061636365737320746f20746865206e756d626572206f66204956547320796f7520636c61696d52656769737465722066756e6374696f6e2063616e206f6e6c792062652072756e20696620676f7665726e616e636520686173206465636c6172656420676c6f62616c20736574746c656d656e74596f757220696e697469616c206d617267696e20697320696e73756666696369656e7420666f72206c656e64696e67436f6465204572726f72204272616e6368203220696620796f752072656163686564207468697320706f696e74596f752063616e6e6f742070617920646f776e206d6f7265205765692064656274207468616e2065786973747320696e207468697320636f756e7465725661756c7443757272656e742076657273696f6e206c696d697473206d617820616d6f756e74206f66207653505920706f737369626c65596f752063616e6e6f742070726f76696465206d6f726520576569207468616e205765692064656274206f75747374616e64696e67436f6e73696465722073746172744368616c6c656e6765576569506572765350592829596f757220696e697469616c206d617267696e20697320696e73756666696369656e7420666f72207769746864726177696e672e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77596f75206d75737420646f75626c6520746865204956542066726f6d20746865206c617374206368616c6c656e6765596f7520646f206e6f742064697361677265652077697468206c617374206368616c6c656e6765206f66207765695065727653505956b033c912409c2aad1b37f58cfd6ee2012622b4210104a14e06aef2233597fd596f757220696e697469616c206d617267696e20697320696e73756666696369656e7420666f72206c656e64696e672e4e65656420746f2077616974203134206461797320746f2066696e616c697a6520676c6f62616c20736574746c656d656e7472656368616c6c656e67652063616e6e6f742062652072756e206966206368616c6c656e676520686173206e6f7420737461727465642e2020636f6e73696465722073746172744368616c6c656e6765576569506572765350592829596f752068617665206e6f7420616c6c6f776564207468697320636f6e74726163742061636365737320746f20746865206e756d626572206f66205741547320796f7520636c61696d43757272656e7420636f6e74726163742069732077697468696e206d61696e74656e656e6365206d617267696e5468697320435456206973206e6f742061626f76652077617465722c2063616e6e6f7420636f6e7665727450726f74656374697665206d617820626f756e6420666f7220696e70757420686974596f75206d7573742077616974203220646179732073696e636520746865206c617374206368616c6c656e676520746f20656e6420746865206368616c6c656e67654d7573742072756e2074686973206f6e206120706f73697469766520696e7465676572446973616c6c6f7765643a20596f7520617265206e6f7420676f7665726e616e636550726f74656374697665206d617820626f756e6420666f722075696e7420617267756d656e74a26469706673582212202cad6883ce2c5875fee7f4761e0b18f8f1097c709d66973b3e97b57d28d0e30864736f6c6343000702003360806040523480156200001157600080fd5b5060405162000c4b38038062000c4b833981810160405260808110156200003757600080fd5b815160208301516040808501805191519395929483019291846401000000008211156200006357600080fd5b9083019060208201858111156200007957600080fd5b82516401000000008111828201881017156200009457600080fd5b82525081516020918201929091019080838360005b83811015620000c3578181015183820152602001620000a9565b50505050905090810190601f168015620000f15780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200011557600080fd5b9083019060208201858111156200012b57600080fd5b82516401000000008111828201881017156200014657600080fd5b82525081516020918201929091019080838360005b83811015620001755781810151838201526020016200015b565b50505050905090810190601f168015620001a35780820380516001836020036101000a031916815260200191505b5060405250508251620001bf9150600090602085019062000211565b508051620001d590600190602084019062000211565b5050506005829055600280546001600160a01b0319166001600160a01b03928316179081905516600090815260036020526040902055620002ad565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200025457805160ff191683800117855562000284565b8280016001018555821562000284579182015b828111156200028457825182559160200191906001019062000267565b506200029292915062000296565b5090565b5b8082111562000292576000815560010162000297565b61098e80620002bd6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063324536eb1161008c57806395d89b411161006657806395d89b41146102c8578063a9059cbb146102d0578063dd62ed3e146102fc578063ec318dc81461032a576100ea565b8063324536eb1461026c5780635c6581651461027457806370a08231146102a2576100ea565b806318160ddd116100c857806318160ddd146101d857806323b872dd146101f257806327e235e314610228578063313ce5671461024e576100ea565b8063029d1ecd146100ef57806306fdde031461012f578063095ea7b3146101ac575b600080fd5b61011b6004803603604081101561010557600080fd5b506001600160a01b03813516906020013561034e565b604080519115158252519081900360200190f35b610137610407565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610171578181015183820152602001610159565b50505050905090810190601f16801561019e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61011b600480360360408110156101c257600080fd5b506001600160a01b038135169060200135610495565b6101e06104fb565b60408051918252519081900360200190f35b61011b6004803603606081101561020857600080fd5b506001600160a01b03813581169160208101359091169060400135610501565b6101e06004803603602081101561023e57600080fd5b50356001600160a01b031661064f565b610256610661565b6040805160ff9092168252519081900360200190f35b6101e0610666565b6101e06004803603604081101561028a57600080fd5b506001600160a01b038135811691602001351661066c565b6101e0600480360360208110156102b857600080fd5b50356001600160a01b0316610689565b6101376106a4565b61011b600480360360408110156102e657600080fd5b506001600160a01b0381351690602001356106fe565b6101e06004803603604081101561031257600080fd5b506001600160a01b03813581169160200135166107be565b6103326107e9565b604080516001600160a01b039092168252519081900360200190f35b6002546000906001600160a01b0316331461039a5760405162461bcd60e51b81526004018080602001828103825260268152602001806109336026913960400191505060405180910390fd5b6001600160a01b0380841660008181526004602090815260408083206002805487168552908352928190208790559154825187815292519416937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a350600192915050565b6000805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561048d5780601f106104625761010080835404028352916020019161048d565b820191906000526020600020905b81548152906001019060200180831161047057829003601f168201915b505050505081565b3360008181526004602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60055490565b6001600160a01b03831660009081526003602052604081205482111561052657600080fd5b6001600160a01b038416600090815260046020908152604080832033845290915290205482111561055657600080fd5b6001600160a01b03841660009081526003602052604090205461057990836107f8565b6001600160a01b03851660009081526003602090815260408083209390935560048152828220338352905220546105b090836107f8565b6001600160a01b0380861660009081526004602090815260408083203384528252808320949094559186168152600390915220546105ee9083610841565b6001600160a01b0380851660008181526003602090815260409182902094909455805186815290519193928816927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35060019392505050565b60036020526000908152604090205481565b601281565b60055481565b600460209081526000928352604080842090915290825290205481565b6001600160a01b031660009081526003602052604090205490565b60018054604080516020600284861615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561048d5780601f106104625761010080835404028352916020019161048d565b3360009081526003602052604081205482111561071a57600080fd5b3360009081526003602052604090205461073490836107f8565b33600090815260036020526040808220929092556001600160a01b038516815220546107609083610841565b6001600160a01b0384166000818152600360209081526040918290209390935580518581529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350600192915050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b6002546001600160a01b031681565b600061083a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061089b565b9392505050565b60008282018381101561083a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000818484111561092a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156108ef5781810151838201526020016108d7565b50505050905090810190601f16801561091c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505090039056fe4f6e6c792074686520466163746f727920436f6e74726163742043616e2052756e2054686973a264697066735822122082a7b3fffed66de333732de5476306f7383f3360cf83e39c4d8c8520d071ab1264736f6c63430007020033

Deployed Bytecode

0x6080604052600436106103b15760003560e01c80636e9b8555116101e7578063a9db79941161010d578063bffd3b17116100a0578063dd7ce9af1161006f578063dd7ce9af14610dfb578063f34af3b414610e25578063fba0fa2614610e3a578063fd1aa91f14610e60576104a7565b8063bffd3b1714610d9f578063c3c5026c14610dc9578063c8b9bcd114610dd1578063d1c9c91f14610de6576104a7565b8063b13b1273116100dc578063b13b127314610cf4578063b6abfb0b14610d2d578063b93ba41a14610d57578063b996b52b14610d8a576104a7565b8063a9db799414610c58578063aa17743a14610c6d578063aba4dc4614610c97578063ac218d0f14610cca576104a7565b806385b2614a116101855780638e7ffaf9116101545780638e7ffaf914610bda57806391cfb4f914610bef5780639548403114610c19578063a269586014610c2e576104a7565b806385b2614a14610b6857806385c81bb414610b7d5780638762017914610b925780638da5cb5b14610bc5576104a7565b80637a618185116101c15780637a61818514610af95780637c33872514610b0e5780637dc0d1d014610b3e578063849eefc914610b53576104a7565b80636e9b855514610a9d5780636f30b22614610ac75780637130197114610acf576104a7565b8063282965df116102d75780634cf13dd31161026a57806368908f4c1161023957806368908f4c14610a235780636b45ebcb14610a385780636cbf6fb814610a625780636d30a70114610a77576104a7565b80634cf13dd31461097b5780635082f6ab146109905780635ab8d6f8146109ba57806364b8cb3f146109e4576104a7565b806333fa99f4116102a657806333fa99f4146108e0578063383dcd6b1461090a57806338b6a3a114610933578063446ccf1014610966576104a7565b8063282965df1461086e578063298877d6146108835780632ad56b4c146108985780633027da02146108ad576104a7565b806315b40efe1161034f5780631f611daf1161031e5780631f611daf14610663578063258124fa1461069657806325ca6a0d1461082f5780632770340a14610859576104a7565b806315b40efe146105df5780631729ad1e1461060f5780631849180714610624578063186b31cb14610639576104a7565b80630a5dbab11161038b5780630a5dbab1146105455780630c89a0f01461056f5780630d94a7c314610584578063124a894c146105b5576104a7565b8063049842b1146104ac578063056ccf05146104d65780630962264214610500576104a7565b366104a75760003411610406576040805162461bcd60e51b81526020600482015260186024820152774d757374204465706f736974204e6f6e7a65726f2057656960401b604482015290519081900360640190fd5b336000908152600860205260409020546104209034610e75565b33600090815260086020908152604080832093909355600f9052205460ff1615156001146104a557336000818152600f60205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b03191690911790555b005b600080fd5b3480156104b857600080fd5b506104a5600480360360208110156104cf57600080fd5b5035610ed8565b3480156104e257600080fd5b506104a5600480360360208110156104f957600080fd5b50356110cc565b34801561050c57600080fd5b506105336004803603602081101561052357600080fd5b50356001600160a01b031661111a565b60408051918252519081900360200190f35b34801561055157600080fd5b506104a56004803603602081101561056857600080fd5b503561112c565b34801561057b57600080fd5b50610533611276565b34801561059057600080fd5b5061059961127c565b604080516001600160a01b039092168252519081900360200190f35b3480156105c157600080fd5b506104a5600480360360208110156105d857600080fd5b503561128b565b3480156105eb57600080fd5b506104a56004803603604081101561060257600080fd5b50803590602001356112d9565b34801561061b57600080fd5b50610533611596565b34801561063057600080fd5b5061053361159c565b34801561064557600080fd5b506104a56004803603602081101561065c57600080fd5b50356115a2565b34801561066f57600080fd5b506104a56004803603602081101561068657600080fd5b50356001600160a01b03166115f0565b3480156106a257600080fd5b506106c0600480360360208110156106b957600080fd5b503561165b565b60405180806020018060200180602001806020018060200187815260200186810386528c818151815260200191508051906020019060200280838360005b838110156107165781810151838201526020016106fe565b5050505090500186810385528b818151815260200191508051906020019060200280838360005b8381101561075557818101518382015260200161073d565b5050505090500186810384528a818151815260200191508051906020019060200280838360005b8381101561079457818101518382015260200161077c565b50505050905001868103835289818151815260200191508051906020019060200280838360005b838110156107d35781810151838201526020016107bb565b50505050905001868103825288818151815260200191508051906020019060200280838360005b838110156108125781810151838201526020016107fa565b505050509050019b50505050505050505050505060405180910390f35b34801561083b57600080fd5b506104a56004803603602081101561085257600080fd5b50356119c8565b34801561086557600080fd5b50610533611a16565b34801561087a57600080fd5b50610533611a1c565b34801561088f57600080fd5b50610533611a22565b3480156108a457600080fd5b50610533611a28565b3480156108b957600080fd5b50610533600480360360208110156108d057600080fd5b50356001600160a01b0316611a2e565b3480156108ec57600080fd5b506104a56004803603602081101561090357600080fd5b5035611a40565b34801561091657600080fd5b5061091f611c36565b604080519115158252519081900360200190f35b34801561093f57600080fd5b5061091f6004803603602081101561095657600080fd5b50356001600160a01b0316611c3f565b34801561097257600080fd5b506104a5611c54565b34801561098757600080fd5b50610533611ca2565b34801561099c57600080fd5b506104a5600480360360208110156109b357600080fd5b5035611ca8565b3480156109c657600080fd5b506104a5600480360360208110156109dd57600080fd5b5035611cf6565b610a0a600480360360208110156109fa57600080fd5b50356001600160a01b0316611e35565b6040805192835260208301919091528051918290030190f35b348015610a2f57600080fd5b506104a5611fa1565b348015610a4457600080fd5b5061059960048036036020811015610a5b57600080fd5b5035612098565b348015610a6e57600080fd5b506105336120bf565b610a0a60048036036020811015610a8d57600080fd5b50356001600160a01b03166120c5565b348015610aa957600080fd5b5061059960048036036020811015610ac057600080fd5b50356121ee565b6104a56121fb565b348015610adb57600080fd5b506104a560048036036020811015610af257600080fd5b50356122bf565b348015610b0557600080fd5b50610533612474565b348015610b1a57600080fd5b506104a560048036036040811015610b3157600080fd5b508035906020013561247a565b348015610b4a57600080fd5b506105996127a1565b348015610b5f57600080fd5b506104a56127b0565b348015610b7457600080fd5b506104a5612894565b348015610b8957600080fd5b5061091f612b39565b348015610b9e57600080fd5b506104a560048036036020811015610bb557600080fd5b50356001600160a01b0316612b49565b348015610bd157600080fd5b50610599612bb4565b348015610be657600080fd5b50610533612bc3565b348015610bfb57600080fd5b506104a560048036036020811015610c1257600080fd5b5035612bc9565b348015610c2557600080fd5b50610533612d58565b348015610c3a57600080fd5b5061053360048036036020811015610c5157600080fd5b5035612d5e565b348015610c6457600080fd5b50610533612d7c565b348015610c7957600080fd5b506104a560048036036020811015610c9057600080fd5b5035612d82565b348015610ca357600080fd5b5061053360048036036020811015610cba57600080fd5b50356001600160a01b0316612dea565b348015610cd657600080fd5b5061053360048036036020811015610ced57600080fd5b5035612dfc565b348015610d0057600080fd5b506104a560048036036040811015610d1757600080fd5b50803590602001356001600160a01b0316612e09565b348015610d3957600080fd5b506104a560048036036020811015610d5057600080fd5b5035613230565b348015610d6357600080fd5b5061053360048036036020811015610d7a57600080fd5b50356001600160a01b0316613391565b348015610d9657600080fd5b506105336133a3565b348015610dab57600080fd5b506104a560048036036020811015610dc257600080fd5b50356133a9565b6104a56133f7565b348015610ddd57600080fd5b506105996134e8565b348015610df257600080fd5b506104a56134f7565b348015610e0757600080fd5b506104a560048036036020811015610e1e57600080fd5b5035613559565b348015610e3157600080fd5b5061091f6135a7565b6104a560048036036020811015610e5057600080fd5b50356001600160a01b03166135b0565b348015610e6c57600080fd5b50610533613a4d565b600082820183811015610ecf576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b68327cb2734119d3b7a9601e1b8110610f225760405162461bcd60e51b81526004018080602001828103825260268152602001806142f16026913960400191505060405180910390fd5b600080546040805163029d1ecd60e01b81523360048201526024810185905290516001600160a01b039092169263029d1ecd926044808401936020939083900390910190829087803b158015610f7757600080fd5b505af1158015610f8b573d6000803e3d6000fd5b505050506040513d6020811015610fa157600080fd5b505060008054604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216926323b872dd926064808401936020939083900390910190829087803b158015610ffe57600080fd5b505af1158015611012573d6000803e3d6000fd5b505050506040513d602081101561102857600080fd5b5050336000908152600d60205260409020546110449082610e75565b336000908152600d6020908152604080832093909355600f9052205460ff1615156001146110c957336000818152600f60205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b03191690911790555b50565b6011546001600160a01b031633146111155760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600c55565b600e6020526000908152604090205481565b68327cb2734119d3b7a9601e1b81106111765760405162461bcd60e51b8152600401808060200182810382526022815260200180613c936022913960400191505060405180910390fd5b336000908152600e60205260408120546111ad906402540be400906111a790670de0b6b3a764000090829087610e75565b90613a53565b600a54336000908152600d602052604081205460025493945090926111d792916111a79190613a53565b9050808211156112185760405162461bcd60e51b81526004018080602001828103825260308152602001806140e96030913960400191505060405180910390fd5b336000908152600e60205260409020546112329084610e75565b336000818152600e6020526040808220939093559151909185156108fc02918691818181858888f19350505050158015611270573d6000803e3d6000fd5b50505050565b60165481565b6000546001600160a01b031681565b6011546001600160a01b031633146112d45760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600a55565b60175460ff16151560011461131f5760405162461bcd60e51b815260040180806020018281038252605c81526020018061414b605c913960600191505060405180910390fd5b6019546002028110156113635760405162461bcd60e51b815260040180806020018281038252602f815260200180614065602f913960400191505060405180910390fd5b6018548214156113a45760405162461bcd60e51b81526004018080602001828103825260358152602001806140946035913960400191505060405180910390fd5b60015460408051636eb1769f60e11b815233600482015230602482015290516000926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b1580156113f557600080fd5b505afa158015611409573d6000803e3d6000fd5b505050506040513d602081101561141f57600080fd5b50519050818110156114625760405162461bcd60e51b81526004018080602001828103825260498152602001806141a76049913960600191505060405180910390fd5b600154604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156114bc57600080fd5b505af11580156114d0573d6000803e3d6000fd5b505050506040513d60208110156114e657600080fd5b5050601d805460018181019092557f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b03191633179055601c80548083019091557f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a21101849055601b805491820181556000527f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc1018290555060189190915542601a55601955565b60045481565b60025481565b6011546001600160a01b031633146115eb5760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600755565b6011546001600160a01b031633146116395760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b601180546001600160a01b0319166001600160a01b0392909216919091179055565b606080606080606060008087116116a35760405162461bcd60e51b81526004018080602001828103825260238152602001806142ac6023913960400191505060405180910390fd5b60608767ffffffffffffffff811180156116bc57600080fd5b506040519080825280602002602001820160405280156116e6578160200160208202803683370190505b50905060608867ffffffffffffffff8111801561170257600080fd5b5060405190808252806020026020018201604052801561172c578160200160208202803683370190505b50905060608967ffffffffffffffff8111801561174857600080fd5b50604051908082528060200260200182016040528015611772578160200160208202803683370190505b50905060608a67ffffffffffffffff8111801561178e57600080fd5b506040519080825280602002602001820160405280156117b8578160200160208202803683370190505b50905060608b67ffffffffffffffff811180156117d457600080fd5b506040519080825280602002602001820160405280156117fe578160200160208202803683370190505b5090506000805b6010548110156119b3578d821061181b576119b3565b600061185f600254600960006010868154811061183457fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205490613a53565b905060006118826305f5e1006111a7600654600860006010898154811061183457fe5b905060006118ac6402540be4006111a7670de0b6b3a7640000600e600060108a8154811061183457fe5b905060006118cd600b546111a7600254600d600060108b8154811061183457fe5b9050828411806118dc57508082115b156119a357601085815481106118ee57fe5b9060005260206000200160009054906101000a90046001600160a01b03168b878151811061191857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050838a878151811061194557fe5b6020026020010181815250508289878151811061195e57fe5b6020026020010181815250508188878151811061197757fe5b6020026020010181815250508087878151811061199057fe5b6020026020010181815250508560010195505b5050600190920191506118059050565b50949c939b5091995097509550909350915050565b6011546001600160a01b03163314611a115760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600655565b600b5481565b60195481565b60065481565b600a5481565b60086020526000908152604090205481565b68327cb2734119d3b7a9601e1b8110611a8a5760405162461bcd60e51b81526004018080602001828103825260268152602001806142f16026913960400191505060405180910390fd5b600354600454611a9a9083610e75565b1115611ad75760405162461bcd60e51b8152600401808060200182810382526032815260200180613f866032913960400191505060405180910390fd5b600254336000908152600960205260408120549091611b03916402540be400916111a791829087610e75565b6005543360009081526008602052604081205492935091611b3191670de0b6b3a7640000916111a791613a53565b9050808210611b715760405162461bcd60e51b815260040180806020018281038252602f815260200180613ee8602f913960400191505060405180910390fd5b33600090815260096020526040902054611b8b9084610e75565b33600090815260096020526040902055600454611ba89084610e75565b6004908155600080546040805163a9059cbb60e01b8152339481019490945260248401879052516001600160a01b039091169263a9059cbb9260448083019360209390929083900390910190829087803b158015611c0557600080fd5b505af1158015611c19573d6000803e3d6000fd5b505050506040513d6020811015611c2f57600080fd5b5050505050565b60155460ff1681565b600f6020526000908152604090205460ff1681565b6011546001600160a01b03163314611c6b57600080fd5b63ee6b280060055564012a05f2006006556359682f00600755601280546001600160a01b0319908116909155601180549091169055565b60075481565b6011546001600160a01b03163314611cf15760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600b55565b68327cb2734119d3b7a9601e1b8110611d405760405162461bcd60e51b81526004018080602001828103825260268152602001806142f16026913960400191505060405180910390fd5b600254336000908152600960205260408120549091611d6a916402540be400916111a79190613a53565b6005543360009081526008602052604081205492935091611d9c91670de0b6b3a7640000916111a79190829088613aac565b905080821115611ddd5760405162461bcd60e51b81526004018080602001828103825260348152602001806140106034913960400191505060405180910390fd5b33600090815260086020526040902054611df79084613aac565b33600081815260086020526040808220939093559151909185156108fc02918691818181858888f19350505050158015611270573d6000803e3d6000fd5b60008068327cb2734119d3b7a9601e1b3410611e98576040805162461bcd60e51b815260206004820181905260248201527f50726f74656374697665204d617820426f756e6420666f722057454920486974604482015290519081900360640190fd5b6001600160a01b0383166000908152600e6020526040902054341115611eef5760405162461bcd60e51b8152600401808060200182810382526035815260200180613fb86035913960400191505060405180910390fd5b6001600160a01b0383166000908152600e6020526040812054611f25906402540be400906111a790670de0b6b3a7640000613a53565b600b546002546001600160a01b0387166000908152600d602052604081205493945092611f5792916111a79190613a53565b9050808211611f975760405162461bcd60e51b815260040180806020018281038252602d8152602001806141f0602d913960400191505060405180910390fd5b9092509050915091565b60155460ff16611fb057600080fd5b601454336000908152600960205260408120549091611ff091600191611fea91670de0b6b3a764000091611fe49190613a53565b90613aee565b90610e75565b3360009081526008602052604090205490915081106120405760405162461bcd60e51b815260040180806020018281038252602b81526020018061421d602b913960400191505060405180910390fd5b33600081815260086020818152604080842080546009845282862086905593909252908390555190849003929183156108fc02918491818181858888f19350505050158015612093573d6000803e3d6000fd5b505050565b601d81815481106120a557fe5b6000918252602090912001546001600160a01b0316905081565b600c5481565b60008068327cb2734119d3b7a9601e1b3410612128576040805162461bcd60e51b815260206004820181905260248201527f50726f74656374697665204d617820426f756e6420666f722057454920486974604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090205434111561217f5760405162461bcd60e51b8152600401808060200182810382526035815260200180613fb86035913960400191505060405180910390fd5b6001600160a01b0383166000908152600d6020526040812054600254600c549192916121e29190611fe4906305f5e100906111a7906121c3906402540be400610e75565b6001600160a01b038b166000908152600e602052604090205490613a53565b91935090915050915091565b601081815481106120a557fe5b68327cb2734119d3b7a9601e1b34106122455760405162461bcd60e51b8152600401808060200182810382526022815260200180613c936022913960400191505060405180910390fd5b336000908152600e60205260409020543411156122935760405162461bcd60e51b8152600401808060200182810382526042815260200180613f446042913960600191505060405180910390fd5b336000908152600e60205260409020546122ad9034613aac565b336000908152600e6020526040902055565b60155460ff166122ce57600080fd5b68327cb2734119d3b7a9601e1b81106123185760405162461bcd60e51b81526004018080602001828103825260228152602001806142486022913960400191505060405180910390fd5b600061233b670de0b6b3a7640000611fe460145485613a5390919063ffffffff16565b600080546040805163029d1ecd60e01b81523360048201526024810187905290519394506001600160a01b039091169263029d1ecd92604480840193602093929083900390910190829087803b15801561239457600080fd5b505af11580156123a8573d6000803e3d6000fd5b505050506040513d60208110156123be57600080fd5b505060008054604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b03909216926323b872dd926064808401936020939083900390910190829087803b15801561241b57600080fd5b505af115801561242f573d6000803e3d6000fd5b505050506040513d602081101561244557600080fd5b5050604051339082156108fc029083906000818181858888f19350505050158015612093573d6000803e3d6000fd5b60185481565b6000601654116124bb5760405162461bcd60e51b815260040180806020018281038252602f815260200180613cfb602f913960400191505060405180910390fd5b621275006124d460165442613aac90919063ffffffff16565b116125105760405162461bcd60e51b8152600401808060200182810382526041815260200180613d616041913960600191505060405180910390fd5b678ac7230489e800008110156125575760405162461bcd60e51b8152600401808060200182810382526028815260200180613dfc6028913960400191505060405180910390fd5b6002548214156125985760405162461bcd60e51b8152600401808060200182810382526034815260200180613c5f6034913960400191505060405180910390fd5b60175460ff16156125a857600080fd5b60015460408051636eb1769f60e11b815233600482015230602482015290516000926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b1580156125f957600080fd5b505afa15801561260d573d6000803e3d6000fd5b505050506040513d602081101561262357600080fd5b50519050818110156126665760405162461bcd60e51b8152600401808060200182810382526049815260200180613e516049913960600191505060405180910390fd5b600154604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156126c057600080fd5b505af11580156126d4573d6000803e3d6000fd5b505050506040513d60208110156126ea57600080fd5b5050601d805460018181019092557f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b031916331790556017805460ff191682179055601c80548083019091557f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a21101849055601b805491820181556000527f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc101919091555060185542601a55565b6012546001600160a01b031681565b601254600160a01b900460ff166127f85760405162461bcd60e51b815260040180806020018281038252604e815260200180613e9a604e913960600191505060405180910390fd5b6013546212750001421161283d5760405162461bcd60e51b81526004018080602001828103825260328152602001806141196032913960400191505060405180910390fd5b60155460ff161561287f5760405162461bcd60e51b8152600401808060200182810382526037815260200180613d2a6037913960400191505060405180910390fd5b6002546014556015805460ff19166001179055565b60175460ff1615156001146128da5760405162461bcd60e51b8152600401808060200182810382526023815260200180613fed6023913960400191505060405180910390fd5b6202a3006128f3601a5442613aac90919063ffffffff16565b1161292f5760405162461bcd60e51b815260040180806020018281038252604281526020018061426a6042913960600191505060405180910390fd5b601854600255600080805b601b548110156129ab57600254601c828154811061295457fe5b9060005260206000200154141561298657601b818154811061297257fe5b9060005260206000200154820191506129a3565b601b818154811061299357fe5b9060005260206000200154830192505b60010161293a565b5060005b601b54811015612af757600254601c82815481106129c957fe5b90600052602060002001541415612ad3576000612a0683611fe4601b85815481106129f057fe5b6000918252602090912001546111a78888610e75565b90506000601b8381548110612a1757fe5b600091825260208220019190915554601d80546001600160a01b039092169163a9059cbb919085908110612a4757fe5b6000918252602080832090910154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152602482018790525160448083019491928390030190829087803b158015612aa057600080fd5b505af1158015612ab4573d6000803e3d6000fd5b505050506040513d6020811015612aca57600080fd5b50612aef915050565b6000601b8281548110612ae257fe5b6000918252602090912001555b6001016129af565b50612b04601b6000613c2c565b612b10601c6000613c2c565b612b1c601d6000613c2c565b5050600060188190556019819055601a556017805460ff19169055565b601254600160a01b900460ff1681565b6011546001600160a01b03163314612b925760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6011546001600160a01b031681565b60035481565b68327cb2734119d3b7a9601e1b8110612c135760405162461bcd60e51b81526004018080602001828103825260268152602001806142f16026913960400191505060405180910390fd5b600080546040805163029d1ecd60e01b81523360048201526024810185905290516001600160a01b039092169263029d1ecd926044808401936020939083900390910190829087803b158015612c6857600080fd5b505af1158015612c7c573d6000803e3d6000fd5b505050506040513d6020811015612c9257600080fd5b505060008054604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216926323b872dd926064808401936020939083900390910190829087803b158015612cef57600080fd5b505af1158015612d03573d6000803e3d6000fd5b505050506040513d6020811015612d1957600080fd5b505033600090815260096020526040902054612d359082613aac565b33600090815260096020526040902055600454612d529082613aac565b60045550565b601a5481565b601b8181548110612d6b57fe5b600091825260209091200154905081565b60145481565b6012546001600160a01b03163314612de1576040805162461bcd60e51b815260206004820152601e60248201527f446973616c6c6f7765643a20596f7520617265206e6f74206f7261636c650000604482015290519081900360640190fd5b60025542601655565b60096020526000908152604090205481565b601c8181548110612d6b57fe5b6001600160a01b038116600090815260096020526040902054821115612e605760405162461bcd60e51b8152600401808060200182810382526036815260200180613dc66036913960400191505060405180910390fd5b6002546001600160a01b0382166000908152600960205260408120549091612e93916402540be400916111a79190613a53565b6006546001600160a01b03841660009081526008602052604081205492935091612eca91670de0b6b3a7640000916111a791613a53565b9050808211612f0a5760405162461bcd60e51b8152600401808060200182810382526046815260200180613cb56046913960600191505060405180910390fd5b6001600160a01b038316600090815260086020526040812054612f40906402540be400906111a790670de0b6b3a7640000613a53565b90506000612f86612f616402540be400600754610e7590919063ffffffff16565b6002546001600160a01b0388166000908152600960205260409020546111a791613a53565b9050600081831015612fce576001600160a01b038616600090815260096020908152604080832054600890925290912054612fc79190611fe4908a90613a53565b9050613011565b61300e6402540be400611fe4670de0b6b3a7640000611fe46130006402540be400600754610e7590919063ffffffff16565b6002546111a7908e90613a53565b90505b6001600160a01b0386166000908152600860205260409020548111156130685760405162461bcd60e51b8152600401808060200182810382526024815260200180613da26024913960400191505060405180910390fd5b600080546040805163029d1ecd60e01b8152336004820152602481018b905290516001600160a01b039092169263029d1ecd926044808401936020939083900390910190829087803b1580156130bd57600080fd5b505af11580156130d1573d6000803e3d6000fd5b505050506040513d60208110156130e757600080fd5b505060008054604080516323b872dd60e01b8152336004820152306024820152604481018b905290516001600160a01b03909216926323b872dd926064808401936020939083900390910190829087803b15801561314457600080fd5b505af1158015613158573d6000803e3d6000fd5b505050506040513d602081101561316e57600080fd5b50506001600160a01b0386166000908152600960205260409020546131939088613aac565b6001600160a01b0387166000908152600960205260409020556004546131b99088613aac565b6004556001600160a01b0386166000908152600860205260409020546131df9082613aac565b6001600160a01b038716600090815260086020526040808220929092559051339183156108fc02918491818181858888f19350505050158015613226573d6000803e3d6000fd5b5050505050505050565b68327cb2734119d3b7a9601e1b811061327a5760405162461bcd60e51b81526004018080602001828103825260268152602001806142f16026913960400191505060405180910390fd5b336000908152600e60205260408120546132a790670de0b6b3a7640000906111a7906402540be400613a53565b600a54600254336000908152600d6020526040812054939450926132d292916111a791829088613aac565b9050808211156133135760405162461bcd60e51b81526004018080602001828103825260348152602001806140106034913960400191505060405180910390fd5b336000908152600d602052604090205461332d9084613aac565b336000818152600d60209081526040808320949094558154845163a9059cbb60e01b815260048101949094526024840188905293516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b158015611c0557600080fd5b600d6020526000908152604090205481565b60055481565b6011546001600160a01b031633146133f25760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600355565b60003411613447576040805162461bcd60e51b81526020600482015260186024820152774d757374204465706f736974204e6f6e7a65726f2057656960401b604482015290519081900360640190fd5b336000908152600860205260409020546134619034610e75565b33600090815260086020908152604080832093909355600f9052205460ff1615156001146134e657336000818152600f60205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b03191690911790555b565b6001546001600160a01b031681565b6011546001600160a01b031633146135405760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b6012805460ff60a01b1916600160a01b17905542601355565b6011546001600160a01b031633146135a25760405162461bcd60e51b81526004018080602001828103825260228152602001806142cf6022913960400191505060405180910390fd5b600555565b60175460ff1681565b68327cb2734119d3b7a9601e1b3410613610576040805162461bcd60e51b815260206004820181905260248201527f50726f74656374697665204d617820426f756e6420666f722057454920486974604482015290519081900360640190fd5b6001600160a01b0381166000908152600e60205260409020543411156136675760405162461bcd60e51b8152600401808060200182810382526035815260200180613fb86035913960400191505060405180910390fd5b6001600160a01b0381166000908152600e602052604081205461369d906402540be400906111a790670de0b6b3a7640000613a53565b600b546002546001600160a01b0385166000908152600d6020526040812054939450926136cf92916111a79190613a53565b60408051602081018390528181526003818301526252485360e81b606082015290519192506000805160206140c9833981519152919081900360800190a16040805160208101849052818152600381830152624c485360e81b606082015290516000805160206140c98339815191529181900360800190a18082116137855760405162461bcd60e51b815260040180806020018281038252602d8152602001806141f0602d913960400191505060405180910390fd5b6001600160a01b0383166000908152600d6020526040812054600254600c549192916137c99190611fe4906305f5e100906111a7906121c3906402540be400610e75565b6040805160208101839052818152600481830152632924299960e11b606082015290519192506000805160206140c9833981519152919081900360800190a16040805160208101849052818152600481830152632624299960e11b606082015290516000805160206140c98339815191529181900360800190a16000818310156138e1576001600160a01b0386166000908152600e6020908152604080832054600d909252909120546138829190611fe4903490613a53565b6001600160a01b0387166000908152600d60205260409020549091508111156138dc5760405162461bcd60e51b815260040180806020018281038252602d815260200180613e24602d913960400191505060405180910390fd5b61396d565b613913600254611fe46305f5e1006111a761390c6402540be400600c54610e7590919063ffffffff16565b3490613a53565b6001600160a01b0387166000908152600d602052604090205490915081111561396d5760405162461bcd60e51b815260040180806020018281038252602d815260200180613f17602d913960400191505060405180910390fd5b6001600160a01b0386166000908152600e60205260409020546139909034613aac565b6001600160a01b0387166000908152600e6020908152604080832093909355600d905220546139bf9082613aac565b6001600160a01b038088166000908152600d60209081526040808320949094558154845163a9059cbb60e01b815233600482015260248101879052945193169363a9059cbb9360448083019491928390030190829087803b158015613a2357600080fd5b505af1158015613a37573d6000803e3d6000fd5b505050506040513d602081101561322657600080fd5b60135481565b600082613a6257506000610ed2565b82820282848281613a6f57fe5b0414610ecf5760405162461bcd60e51b81526004018080602001828103825260218152602001806140446021913960400191505060405180910390fd5b6000610ecf83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b30565b6000610ecf83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613bc7565b60008184841115613bbf5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b84578181015183820152602001613b6c565b50505050905090810190601f168015613bb15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613c165760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613b84578181015183820152602001613b6c565b506000838581613c2257fe5b0495945050505050565b50805460008255906000526020600020908101906110c991905b80821115613c5a5760008155600101613c46565b509056fe596f7520646f206e6f7420646973616772656520776974682063757272656e742076616c7565206f66207765695065727653505950726f74656374697665204d617820426f756e6420666f7220496e7075742048697443757272656e7420636f6e74726163742069732077697468696e206d61696e7461696e616e6365206d617267696e2c20736f20796f752063616e6e6f742072756e207468697343616e6e6f74206368616c6c656e67652061206e65776c79206372656174656420736d61727420636f6e7472616374546869732066756e6374696f6e2068617320616c72656164792062652072756e3b2063616e206f6e6c792062652072756e206f6e63652e596f75206d757374207761697420666f72207468652077686974656c697374206f7261636c6520746f206e6f7420726573706f6e6420666f722031342064617973436f6465204572726f7220696620796f752072656163686564207468697320706f696e74596f752063616e6e6f742070726f76696465206d6f72652076535059207468616e207653505944656274206f75747374616e64696e67596f75206d757374206368616c6c656e67652077697468206174206c656173742074656e20495654436f6465204572726f72204272616e6368203120696620796f752072656163686564207468697320706f696e74596f752068617665206e6f7420616c6c6f776564207468697320636f6e74726163742061636365737320746f20746865206e756d626572206f66204956547320796f7520636c61696d52656769737465722066756e6374696f6e2063616e206f6e6c792062652072756e20696620676f7665726e616e636520686173206465636c6172656420676c6f62616c20736574746c656d656e74596f757220696e697469616c206d617267696e20697320696e73756666696369656e7420666f72206c656e64696e67436f6465204572726f72204272616e6368203220696620796f752072656163686564207468697320706f696e74596f752063616e6e6f742070617920646f776e206d6f7265205765692064656274207468616e2065786973747320696e207468697320636f756e7465725661756c7443757272656e742076657273696f6e206c696d697473206d617820616d6f756e74206f66207653505920706f737369626c65596f752063616e6e6f742070726f76696465206d6f726520576569207468616e205765692064656274206f75747374616e64696e67436f6e73696465722073746172744368616c6c656e6765576569506572765350592829596f757220696e697469616c206d617267696e20697320696e73756666696369656e7420666f72207769746864726177696e672e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77596f75206d75737420646f75626c6520746865204956542066726f6d20746865206c617374206368616c6c656e6765596f7520646f206e6f742064697361677265652077697468206c617374206368616c6c656e6765206f66207765695065727653505956b033c912409c2aad1b37f58cfd6ee2012622b4210104a14e06aef2233597fd596f757220696e697469616c206d617267696e20697320696e73756666696369656e7420666f72206c656e64696e672e4e65656420746f2077616974203134206461797320746f2066696e616c697a6520676c6f62616c20736574746c656d656e7472656368616c6c656e67652063616e6e6f742062652072756e206966206368616c6c656e676520686173206e6f7420737461727465642e2020636f6e73696465722073746172744368616c6c656e6765576569506572765350592829596f752068617665206e6f7420616c6c6f776564207468697320636f6e74726163742061636365737320746f20746865206e756d626572206f66205741547320796f7520636c61696d43757272656e7420636f6e74726163742069732077697468696e206d61696e74656e656e6365206d617267696e5468697320435456206973206e6f742061626f76652077617465722c2063616e6e6f7420636f6e7665727450726f74656374697665206d617820626f756e6420666f7220696e70757420686974596f75206d7573742077616974203220646179732073696e636520746865206c617374206368616c6c656e676520746f20656e6420746865206368616c6c656e67654d7573742072756e2074686973206f6e206120706f73697469766520696e7465676572446973616c6c6f7765643a20596f7520617265206e6f7420676f7665726e616e636550726f74656374697665206d617820626f756e6420666f722075696e7420617267756d656e74a26469706673582212202cad6883ce2c5875fee7f4761e0b18f8f1097c709d66973b3e97b57d28d0e30864736f6c63430007020033

Deployed Bytecode Sourcemap

218:30900:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7634:1;7622:9;:13;7614:50;;;;;-1:-1:-1;;;7614:50:2;;;;;;;;;;;;-1:-1:-1;;;7614:50:2;;;;;;;;;;;;;;;7798:10;7789:20;;;;:8;:20;;;;;;:37;;7815:9;7789:24;:37::i;:::-;7775:10;7766:20;;;;:8;:20;;;;;;;;:60;;;;7850:19;:31;;;;;;:39;;:31;:39;7847:197;;7963:10;7943:31;;;;:19;:31;;;;;:38;;-1:-1:-1;;7943:38:2;7977:4;7943:38;;;;;;7996:19;:36;;;;;;;;;;;;;;-1:-1:-1;;;;;;7996:36:2;;;;;;7847:197;218:30900;;;;;13466:708;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13466:708:2;;:::i;5981:234::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5981:234:2;;:::i;2541:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2541:51:2;-1:-1:-1;;;;;2541:51:2;;:::i;:::-;;;;;;;;;;;;;;;;15184:1006;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15184:1006:2;;:::i;3355:26::-;;;;;;;;;;;;;:::i;336:29::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;336:29:2;;;;;;;;;;;;;;5497:234;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5497:234:2;;:::i;27617:1196::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27617:1196:2;;;;;;;:::i;775:34::-;;;;;;;;;;;;;:::i;637:33::-;;;;;;;;;;;;;:::i;5299:186::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5299:186:2;;:::i;6227:165::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6227:165:2;-1:-1:-1;;;;;6227:165:2;;:::i;22006:2106::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22006:2106:2;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5109:178;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5109:178:2;;:::i;1997:53::-;;;;;;;;;;;;;:::i;3660:28::-;;;;;;;;;;;;;:::i;1050:41::-;;;;;;;;;;;;;:::i;1845:53::-;;;;;;;;;;;;;:::i;1587:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1587:40:2;-1:-1:-1;;;;;1587:40:2;;:::i;9023:1068::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9023:1068:2;;:::i;3299:37::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;2763:51;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2763:51:2;-1:-1:-1;;;;;2763:51:2;;:::i;30673:434::-;;;;;;;;;;;;;:::i;1180:41::-;;;;;;;;;;;;;:::i;5743:226::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5743:226:2;;:::i;8059:946::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8059:946:2;;:::i;19725:1002::-;;;;;;;;;;;;;;;;-1:-1:-1;19725:1002:2;-1:-1:-1;;;;;19725:1002:2;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25606:597;;;;;;;;;;;;;:::i;4169:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4169:28:2;;:::i;2149:53::-;;;;;;;;;;;;;:::i;20745:1237::-;;;;;;;;;;;;;;;;-1:-1:-1;20745:1237:2;-1:-1:-1;;;;;20745:1237:2;;:::i;2865:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2865:36:2;;:::i;16202:406::-;;;:::i;24820:768::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24820:768:2;;:::i;3494:30::-;;;;;;;;;;;;;:::i;26264:1341::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26264:1341:2;;;;;;;:::i;3096:29::-;;;;;;;;;;;;;:::i;24296:512::-;;;;;;;;;;;;;:::i;28825:1838::-;;;;;;;;;;;;;:::i;3173:38::-;;;;;;;;;;;;;:::i;6404:169::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6404:169:2;-1:-1:-1;;;;;6404:169:2;;:::i;2965:28::-;;;;;;;;;;;;;:::i;678:40::-;;;;;;;;;;;;;:::i;10103:530::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10103:530:2;;:::i;3776:29::-;;;;;;;;;;;;;:::i;3907:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3907:31:2;;:::i;3262:29::-;;;;;;;;;;;;;:::i;4651:217::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4651:217:2;;:::i;1685:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1685:43:2;-1:-1:-1;;;;;1685:43:2;;:::i;4053:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4053:29:2;;:::i;10651:2759::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10651:2759:2;;;;;;-1:-1:-1;;;;;10651:2759:2;;:::i;14188:978::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14188:978:2;;:::i;2431:56::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2431:56:2;-1:-1:-1;;;;;2431:56:2;;:::i;922:41::-;;;;;;;;;;;;;:::i;6585:174::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6585:174:2;;:::i;7037:461::-;;;:::i;372:28::-;;;;;;;;;;;;;:::i;6771:218::-;;;;;;;;;;;;;:::i;4911:186::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4911:186:2;;:::i;3388:36::-;;;;;;;;;;;;;:::i;16638:3063::-;;;;;;;;;;;;;;;;-1:-1:-1;16638:3063:2;-1:-1:-1;;;;;16638:3063:2;;:::i;3218:37::-;;;;;;;;;;;;;:::i;324:181:1:-;382:7;414:5;;;438:6;;;;430:46;;;;;-1:-1:-1;;;430:46:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;496:1;-1:-1:-1;324:181:1;;;;;:::o;13466:708:2:-;-1:-1:-1;;;13549:15:2;:26;13540:78;;;;-1:-1:-1;;;13540:78:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13713:9;;;:51;;;-1:-1:-1;;;13713:51:2;;13736:10;13713:51;;;;;;;;;;;;-1:-1:-1;;;;;13713:9:2;;;;:22;;:51;;;;;;;;;;;;;;;;;:9;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13776:9:2;;;:66;;;-1:-1:-1;;;13776:66:2;;13799:10;13776:66;;;;13819:4;13776:66;;;;;;;;;;;;-1:-1:-1;;;;;13776:9:2;;;;:22;;:66;;;;;13713:51;;13776:66;;;;;;;;;;:9;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13917:10:2;13892:36;;;;:24;13776:66;13892:36;;;;;:57;;13933:15;13892:40;:57::i;:::-;13878:10;13853:36;;;;:24;:36;;;;;;;;:96;;;;13973:19;:31;;;;;;:39;;:31;:39;13970:197;;14086:10;14066:31;;;;:19;:31;;;;;:38;;-1:-1:-1;;14066:38:2;14100:4;14066:38;;;;;;14119:19;:36;;;;;;;;;;;;;;-1:-1:-1;;;;;;14119:36:2;;;;;;13970:197;13466:708;:::o;5981:234::-;6098:5;;-1:-1:-1;;;;;6098:5:2;6084:10;:19;6076:66;;;;-1:-1:-1;;;6076:66:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6153:25;:54;5981:234::o;2541:51::-;;;;;;;;;;;;;:::o;15184:1006::-;-1:-1:-1;;;15313:8:2;:19;15305:66;;;;-1:-1:-1;;;15305:66:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15718:10;15687:8;15698:31;;;:19;:31;;;;;;:78;;15766:8;;15698:62;;15751:7;;15698:62;;15735:8;15698:35;:47::i;:::-;:51;;:62::i;:78::-;15858:25;;15839:10;15787:8;15814:36;;;:24;:36;;;;;;15798:10;;15687:89;;-1:-1:-1;15787:8:2;;15798:87;;15858:25;15798:54;;:10;:14;:54::i;:87::-;15787:98;;15921:3;15914;:10;;15906:71;;;;-1:-1:-1;;;15906:71:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16088:10;16068:31;;;;:19;:31;;;;;;:47;;16105:8;16068:35;:47::i;:::-;16054:10;16034:31;;;;:19;:31;;;;;;:81;;;;16153:29;;16054:10;;16153:29;;;;;16173:8;;16153:29;16034:31;16153:29;16173:8;16054:10;16153:29;;;;;;;;;;;;;;;;;;;;;15184:1006;;;:::o;3355:26::-;;;;:::o;336:29::-;;;-1:-1:-1;;;;;336:29:2;;:::o;5497:234::-;5614:5;;-1:-1:-1;;;;;5614:5:2;5600:10;:19;5592:66;;;;-1:-1:-1;;;5592:66:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5669:25;:54;5497:234::o;27617:1196::-;27717:16;;;;:24;;:16;:24;27709:129;;;;-1:-1:-1;;;27709:129:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27871:16;;27890:1;27871:20;27857:10;:34;;27849:94;;;;-1:-1:-1;;;27849:94:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27985:18;;27962:19;:41;;27954:107;;;;-1:-1:-1;;;27954:107:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28155:8;;:45;;;-1:-1:-1;;;28155:45:2;;28174:10;28155:45;;;;28194:4;28155:45;;;;;;28135:17;;-1:-1:-1;;;;;28155:8:2;;:18;;:45;;;;;;;;;;;;;;:8;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28155:45:2;;-1:-1:-1;28219:23:2;;;;28211:109;;;;-1:-1:-1;;;28211:109:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28331:8;;:60;;;-1:-1:-1;;;28331:60:2;;28353:10;28331:60;;;;28373:4;28331:60;;;;;;;;;;;;-1:-1:-1;;;;;28331:8:2;;;;:21;;:60;;;;;;;;;;;;;;;:8;;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28495:11:2;:28;;;;;;;;;;;;;-1:-1:-1;;;;;;28495:28:2;28512:10;28495:28;;;28582:15;:41;;;;;;;;;;;;;28634:17;:34;;;;;;;-1:-1:-1;28634:34:2;;;;;;-1:-1:-1;28679:18:2;:40;;;;28750:15;28730:17;:35;28776:16;:29;27617:1196::o;775:34::-;;;;:::o;637:33::-;;;;:::o;5299:186::-;5392:5;;-1:-1:-1;;;;;5392:5:2;5378:10;:19;5370:66;;;;-1:-1:-1;;;5370:66:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5447:13;:30;5299:186::o;6227:165::-;6315:5;;-1:-1:-1;;;;;6315:5:2;6301:10;:19;6293:66;;;;-1:-1:-1;;;6293:66:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6370:5;:14;;-1:-1:-1;;;;;;6370:14:2;-1:-1:-1;;;;;6370:14:2;;;;;;;;;;6227:165::o;22006:2106::-;22074:16;22092:13;22107;22122;22137;22152:4;22233:1;22221:9;:13;22213:61;;;;-1:-1:-1;;;22213:61:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22285:38;22340:9;22326:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22326:24:2;;22285:65;;22361:24;22399:9;22388:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22388:21:2;;22361:48;;22420:24;22458:9;22447:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22447:21:2;;22420:48;;22489:31;22534:9;22523:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22523:21:2;;22489:55;;22555:31;22600:9;22589:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22589:21:2;;22555:55;;22641:6;22696;22691:1308;22708:19;:26;22706:28;;22691:1308;;;22763:9;22759:1;:13;22756:58;;22793:5;;22756:58;22963:14;22980:51;23020:10;;22980:11;:35;22992:19;23012:1;22992:22;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22992:22:2;22980:35;;;;;;;;;;;;;;:39;:51::i;:::-;22963:68;;23046:14;23064:65;23121:7;23064:51;23102:11;;23064:8;:32;23073:19;23093:1;23073:22;;;;;;;23064:65;23046:83;;23335:21;23359:75;23424:8;23359:59;23408:8;23359:19;:43;23379:19;23399:1;23379:22;;;;;;;23359:75;23335:99;;23449:21;23473:97;23545:23;;23473:66;23527:10;;23473:24;:48;23498:19;23518:1;23498:22;;;;;;;23473:97;23449:121;;23616:9;23604;:21;23603:64;;;;23650:16;23631;:35;23603:64;23599:389;;;23716:19;23736:1;23716:22;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23716:22:2;23689:21;23711:1;23689:24;;;;;;;;;;;;;:49;-1:-1:-1;;;;;23689:49:2;;;-1:-1:-1;;;;;23689:49:2;;;;;23773:9;23757:10;23768:1;23757:13;;;;;;;;;;;;;:25;;;;;23817:9;23801:10;23812:1;23801:13;;;;;;;;;;;;;:25;;;;;23868:16;23845:17;23863:1;23845:20;;;;;;;;;;;;;:39;;;;;23926:16;23903:17;23921:1;23903:20;;;;;;;;;;;;;:39;;;;;23967:1;23971;23967:5;23963:9;;23599:389;-1:-1:-1;;22736:3:2;;;;;-1:-1:-1;22691:1308:2;;-1:-1:-1;22691:1308:2;;-1:-1:-1;24016:21:2;;24039:10;;-1:-1:-1;24051:10:2;;-1:-1:-1;24051:10:2;-1:-1:-1;24039:10:2;-1:-1:-1;24016:21:2;;-1:-1:-1;22006:2106:2;-1:-1:-1;;22006:2106:2:o;5109:178::-;5198:5;;-1:-1:-1;;;;;5198:5:2;5184:10;:19;5176:66;;;;-1:-1:-1;;;5176:66:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5253:11;:26;5109:178::o;1997:53::-;;;;:::o;3660:28::-;;;;:::o;1050:41::-;;;;:::o;1845:53::-;;;;:::o;1587:40::-;;;;;;;;;;;;;:::o;9023:1068::-;-1:-1:-1;;;9145:12:2;:23;9137:74;;;;-1:-1:-1;;;9137:74:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9272:10;;9230:18;;:38;;9254:12;9230:22;:38::i;:::-;:52;;9222:115;;;;-1:-1:-1;;;9222:115:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9623:10;;9586;9563:8;9574:23;;;:11;:23;;;;;;9563:8;;9574:77;;9641:8;;9574:61;;;;9603:12;9574:27;:43::i;:77::-;9699:13;;9682:10;9662:8;9673:20;;;:8;:20;;;;;;9563:88;;-1:-1:-1;9662:8:2;9673:57;;9720:8;;9673:41;;:24;:41::i;:57::-;9662:68;;9755:3;9749;:9;9741:69;;;;-1:-1:-1;;;9741:69:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9905:10;9893:23;;;;:11;:23;;;;;;:43;;9922:12;9893:27;:43::i;:::-;9879:10;9867:23;;;;:11;:23;;;;;:69;9992:18;;:36;;10015:12;9992:22;:36::i;:::-;9971:18;:57;;;10039:9;;;:44;;;-1:-1:-1;;;10039:44:2;;10058:10;10039:44;;;;;;;;;;;;;;-1:-1:-1;;;;;10039:9:2;;;;:18;;:44;;;;;;;;;;;;;;;;;;;:9;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9023:1068:2:o;3299:37::-;;;;;;:::o;2763:51::-;;;;;;;;;;;;;;;:::o;30673:434::-;30851:5;;-1:-1:-1;;;;;30851:5:2;30837:10;:19;30829:28;;;;;;30884:11;30868:13;:27;30940:11;30926;:25;31001:12;30985:13;:28;31051:6;:19;;-1:-1:-1;;;;;;31051:19:2;;;;;;31081:5;:18;;;;;;;30673:434::o;1180:41::-;;;;:::o;5743:226::-;5856:5;;-1:-1:-1;;;;;5856:5:2;5842:10;:19;5834:66;;;;-1:-1:-1;;;5834:66:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5911:23;:50;5743:226::o;8059:946::-;-1:-1:-1;;;8231:12:2;:23;8222:75;;;;-1:-1:-1;;;8222:75:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8565:10;;8548;8525:8;8536:23;;;:11;:23;;;;;;8525:8;;8536:57;;8583:8;;8536:41;;:23;:27;:41::i;:57::-;8663:13;;8625:10;8604:8;8616:20;;;:8;:20;;;;;;8525:68;;-1:-1:-1;8604:8:2;8615:79;;8684:8;;8615:63;;8663:13;8615:63;;8642:12;8616:24;:40::i;8615:79::-;8604:90;;8722:3;8715;:10;;8705:77;;;;-1:-1:-1;;;8705:77:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8871:10;8862:20;;;;:8;:20;;;;;;:40;;8888:12;8862:24;:40::i;:::-;8848:10;8839:20;;;;:8;:20;;;;;;:63;;;;8964:33;;8848:10;;8964:33;;;;;8984:12;;8964:33;8839:20;8964:33;8984:12;8848:10;8964:33;;;;;;;;;;;;;;;;;;;19725:1002;19836:4;19842;-1:-1:-1;;;20028:9:2;:20;20019:67;;;;;-1:-1:-1;;;20019:67:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20119:40:2;;;;;;:19;:40;;;;;;20106:9;:53;;20097:120;;;;-1:-1:-1;;;20097:120:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20396:40:2;;20385:8;20396:40;;;:19;:40;;;;;;:72;;20458:8;;20396:56;;20442:8;20396:44;:56::i;:72::-;20559:23;;20541:10;;-1:-1:-1;;;;;20490:45:2;;20479:8;20490:45;;;:24;:45;;;;;;20385:83;;-1:-1:-1;20479:8:2;20490:94;;20559:23;20490:63;;:45;:49;:63::i;:94::-;20479:105;;20619:3;20613;:9;20605:67;;;;-1:-1:-1;;;20605:67:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20700:3;;-1:-1:-1;20705:3:2;-1:-1:-1;19725:1002:2;;;:::o;25606:597::-;25668:17;;;;25660:26;;;;;;25751:17;;25734:10;25707:12;25722:23;;;:11;:23;;;;;;25707:12;;25722:72;;25791:1;;25722:63;;25776:8;;25722:48;;:23;:27;:48::i;:::-;:52;;:63::i;:::-;:67;;:72::i;:::-;25862:10;25853:20;;;;:8;:20;;;;;;25707:87;;-1:-1:-1;25853:30:2;-1:-1:-1;25845:86:2;;;;-1:-1:-1;;;25845:86:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25983:10;25957:14;25974:20;;;:8;:20;;;;;;;;;;26090:11;:23;;;;;:27;;;26128:20;;;;:24;;;;26163:30;25974;;;;;25983:10;26163:30;;;;;25974;;26163;25957:14;26163:30;25974;25983:10;26163:30;;;;;;;;;;;;;;;;;;;;;25606:597;;:::o;4169:28::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4169:28:2;;-1:-1:-1;4169:28:2;:::o;2149:53::-;;;;:::o;20745:1237::-;20856:4;20862;-1:-1:-1;;;21048:9:2;:20;21039:67;;;;;-1:-1:-1;;;21039:67:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21139:40:2;;;;;;:19;:40;;;;;;21126:9;:53;;21117:120;;;;-1:-1:-1;;;21117:120:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21746:45:2;;21734:9;21746:45;;;:24;:45;;;;;;21923:10;;21860:25;;21746:45;;21734:9;21814:121;;21923:10;21814:103;;21908:7;;21814:88;;21860:41;;21891:8;21860:29;:41::i;:::-;-1:-1:-1;;;;;21814:40:2;;;;;;:19;:40;;;;;;;:44;:88::i;:121::-;21953:4;;-1:-1:-1;21802:133:2;;-1:-1:-1;;20745:1237:2;;;:::o;2865:36::-;;;;;;;;;;16202:406;-1:-1:-1;;;16268:9:2;:20;16260:67;;;;-1:-1:-1;;;16260:67:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16379:10;16359:31;;;;:19;:31;;;;;;16346:9;:44;;16338:123;;;;-1:-1:-1;;;16338:123:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16572:10;16552:31;;;;:19;:31;;;;;;:48;;16589:9;16552:35;:48::i;:::-;16538:10;16518:31;;;;:19;:31;;;;;:82;16202:406::o;24820:768::-;24908:17;;;;24900:26;;;;;;-1:-1:-1;;;24945:22:2;:33;24937:80;;;;-1:-1:-1;;;24937:80:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25038:16;25057:62;25110:8;25057:47;25085:17;;25057:22;:26;;:47;;;;:::i;:62::-;25235:9;;;:58;;;-1:-1:-1;;;25235:58:2;;25258:10;25235:58;;;;;;;;;;;;25038:81;;-1:-1:-1;;;;;;25235:9:2;;;;:22;;:58;;;;;;;;;;;;;;;;;;:9;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25357:9:2;;;:73;;;-1:-1:-1;;;25357:73:2;;25380:10;25357:73;;;;25400:4;25357:73;;;;;;;;;;;;-1:-1:-1;;;;;25357:9:2;;;;:22;;:73;;;;;25235:58;;25357:73;;;;;;;;;;:9;:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25492:32:2;;:10;;:32;;;;;25512:11;;25492:32;;;;25512:11;25492:10;:32;;;;;;;;;;;;;;;;;;;3494:30;;;;:::o;26264:1341::-;26430:1;26413:14;;:18;26405:78;;;;-1:-1:-1;;;26405:78:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26542:7;26502:37;26523:14;;26502:15;:19;;:37;;;;:::i;:::-;:47;26494:126;;;;-1:-1:-1;;;26494:126:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26653:13;26639:10;:27;;26631:80;;;;-1:-1:-1;;;26631:80:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26753:10;;26730:19;:33;;26722:98;;;;-1:-1:-1;;;26722:98:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26839:16;;;;:25;26831:34;;;;;;26959:8;;:45;;;-1:-1:-1;;;26959:45:2;;26978:10;26959:45;;;;26998:4;26959:45;;;;;;26939:17;;-1:-1:-1;;;;;26959:8:2;;:18;;:45;;;;;;;;;;;;;;:8;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26959:45:2;;-1:-1:-1;27023:23:2;;;;27015:109;;;;-1:-1:-1;;;27015:109:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27135:8;;:60;;;-1:-1:-1;;;27135:60:2;;27157:10;27135:60;;;;27177:4;27135:60;;;;;;;;;;;;-1:-1:-1;;;;;27135:8:2;;;;:21;;:60;;;;;;;;;;;;;;;:8;;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27299:11:2;:28;;;;;;;;;;;;;-1:-1:-1;;;;;;27299:28:2;27316:10;27299:28;;;27380:16;:23;;-1:-1:-1;;27380:23:2;;;;;27414:15;:41;;;;;;;;;;;;;27466:17;:34;;;;;;;-1:-1:-1;27466:34:2;;;;;;;-1:-1:-1;27511:18:2;:40;27582:15;27562:17;:35;26264:1341::o;3096:29::-;;;-1:-1:-1;;;;;3096:29:2;;:::o;24296:512::-;24397:18;;-1:-1:-1;;;24397:18:2;;;;24389:109;;;;-1:-1:-1;;;24389:109:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24536:25;;24564:7;24536:35;24517:15;:55;24509:118;;;;-1:-1:-1;;;24509:118:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24647:17;;;;24646:18;24638:86;;;;-1:-1:-1;;;24638:86:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24755:10;;24735:17;:30;24776:17;:24;;-1:-1:-1;;24776:24:2;24796:4;24776:24;;;24296:512::o;28825:1838::-;28883:16;;;;:24;;:16;:24;28875:72;;;;-1:-1:-1;;;28875:72:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29009:6;28966:40;28987:17;;28966:15;:19;;:40;;;;:::i;:::-;:49;28958:128;;;;-1:-1:-1;;;28958:128:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29178:18;;29165:10;:31;-1:-1:-1;;;29403:262:2;29423:17;:24;29419:28;;29403:262;;;29494:10;;29472:15;29488:1;29472:18;;;;;;;;;;;;;;;;:32;29469:185;;;29540:17;29558:1;29540:20;;;;;;;;;;;;;;;;29525:35;;;;29469:185;;;29618:17;29636:1;29618:20;;;;;;;;;;;;;;;;29601:37;;;;29469:185;29449:3;;29403:262;;;;29723:6;29719:615;29739:17;:24;29735:28;;29719:615;;;29872:10;;29850:15;29866:1;29850:18;;;;;;;;;;;;;;;;:32;29847:476;;;29903:15;29922:77;29986:11;29922:58;29958:17;29976:1;29958:20;;;;;;;;;;;;;;;;;;29922:30;:13;29940:11;29922:17;:30::i;:77::-;29903:96;;30128:1;30105:17;30123:1;30105:20;;;;;;;;;;;;;;;;:24;;;;30148:9;30167:11;:14;;-1:-1:-1;;;;;30148:9:2;;;;:18;;30167:11;30179:1;;30167:14;;;;;;;;;;;;;;;;;;30148:46;;;-1:-1:-1;;;;;;30148:46:2;;;;;;;-1:-1:-1;;;;;30167:14:2;;;30148:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29847:476:2;;-1:-1:-1;;29847:476:2;;30306:1;30283:17;30301:1;30283:20;;;;;;;;;;;;;;;;;:24;29847:476;29765:3;;29719:615;;;-1:-1:-1;30392:24:2;30399:17;;30392:24;:::i;:::-;30427:22;30434:15;;30427:22;:::i;:::-;30460:18;30467:11;;30460:18;:::i;:::-;-1:-1:-1;;30520:1:2;30499:18;:22;;;30532:16;:20;;;30563:17;:21;30631:16;:24;;-1:-1:-1;;30631:24:2;;;28825:1838::o;3173:38::-;;;-1:-1:-1;;;3173:38:2;;;;;:::o;6404:169::-;6494:5;;-1:-1:-1;;;;;6494:5:2;6480:10;:19;6472:66;;;;-1:-1:-1;;;6472:66:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6549:6;:16;;-1:-1:-1;;;;;;6549:16:2;-1:-1:-1;;;;;6549:16:2;;;;;;;;;;6404:169::o;2965:28::-;;;-1:-1:-1;;;;;2965:28:2;;:::o;678:40::-;;;;:::o;10103:530::-;-1:-1:-1;;;10168:13:2;:24;10160:75;;;;-1:-1:-1;;;10160:75:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10256:9;;;:49;;;-1:-1:-1;;;10256:49:2;;10279:10;10256:49;;;;;;;;;;;;-1:-1:-1;;;;;10256:9:2;;;;:22;;:49;;;;;;;;;;;;;;;;;:9;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10363:9:2;;;:64;;;-1:-1:-1;;;10363:64:2;;10386:10;10363:64;;;;10406:4;10363:64;;;;;;;;;;;;-1:-1:-1;;;;;10363:9:2;;;;:22;;:64;;;;;10256:49;;10363:64;;;;;;;;;;:9;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10524:10:2;10512:23;;;;:11;10363:64;10512:23;;;;;:44;;10541:13;10512:27;:44::i;:::-;10498:10;10486:23;;;;:11;:23;;;;;:70;10588:18;;:37;;10611:13;10588:22;:37::i;:::-;10567:18;:58;-1:-1:-1;10103:530:2:o;3776:29::-;;;;:::o;3907:31::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3907:31:2;:::o;3262:29::-;;;;:::o;4651:217::-;4741:6;;-1:-1:-1;;;;;4741:6:2;4727:10;:20;4719:63;;;;;-1:-1:-1;;;4719:63:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;4793:10;:24;4845:15;4828:14;:32;4651:217::o;1685:43::-;;;;;;;;;;;;;:::o;4053:29::-;;;;;;;;;;10651:2759;-1:-1:-1;;;;;11281:27:2;;;;;;:11;:27;;;;;;11261:47;;;11252:115;;;;-1:-1:-1;;;11252:115:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11432:10;;-1:-1:-1;;;;;11399:27:2;;11388:8;11399:27;;;:11;:27;;;;;;11388:8;;11399:60;;11450:8;;11399:45;;:27;:31;:45::i;:60::-;11511:11;;-1:-1:-1;;;;;11481:24:2;;11470:8;11481:24;;;:8;:24;;;;;;11388:71;;-1:-1:-1;11470:8:2;11481:58;;11530:8;;11481:43;;:28;:43::i;:58::-;11470:69;;11564:3;11558;:9;11550:92;;;;-1:-1:-1;;;11550:92:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11954:24:2;;11942:9;11954:24;;;:8;:24;;;;;;:55;;12000:8;;11954:40;;11984:8;11954:28;:40::i;:55::-;11942:67;;12020:9;12032:81;12083:29;12102:8;12083:13;;:17;;:29;;;;:::i;:::-;12065:10;;-1:-1:-1;;;;;12032:27:2;;;;;;:11;:27;;;;;;:45;;:31;:45::i;:81::-;12020:93;;12134:13;12169:4;12162;:11;12158:499;;;-1:-1:-1;;;;;12380:27:2;;;;;;:11;:27;;;;;;;;;12348:8;:24;;;;;;;12326:83;;12380:27;12326:48;;:16;;:20;:48::i;:83::-;12315:94;;12158:499;;;12543:102;12635:8;12543:86;12619:8;12543:70;12583:29;12602:8;12583:13;;:17;;:29;;;;:::i;:::-;12565:10;;12543:34;;:16;;:20;:34::i;:102::-;12532:113;;12158:499;-1:-1:-1;;;;;12687:24:2;;;;;;:8;:24;;;;;;12675:36;;;12667:85;;;;-1:-1:-1;;;12667:85:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12848:9;;;:52;;;-1:-1:-1;;;12848:52:2;;12871:10;12848:52;;;;;;;;;;;;-1:-1:-1;;;;;12848:9:2;;;;:22;;:52;;;;;;;;;;;;;;;;;:9;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12912:9:2;;;:67;;;-1:-1:-1;;;12912:67:2;;12935:10;12912:67;;;;12955:4;12912:67;;;;;;;;;;;;-1:-1:-1;;;;;12912:9:2;;;;:22;;:67;;;;;12848:52;;12912:67;;;;;;;;;;:9;:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;13068:27:2;;;;;;:11;12912:67;13068:27;;;;;:51;;13101:16;13068:31;:51::i;:::-;-1:-1:-1;;;;;13038:27:2;;;;;;:11;:27;;;;;:81;13151:18;;:42;;13175:16;13151:22;:42::i;:::-;13130:18;:63;-1:-1:-1;;;;;13320:24:2;;;;;;:8;:24;;;;;;:40;;13350:8;13320:28;:40::i;:::-;-1:-1:-1;;;;;13293:24:2;;;;;;:8;:24;;;;;;:67;;;;13371:31;;:10;;:31;;;;;13392:8;;13371:31;13293:24;13371:31;13392:8;13371:10;:31;;;;;;;;;;;;;;;;;;;;;10651:2759;;;;;;;:::o;14188:978::-;-1:-1:-1;;;14272:16:2;:27;14263:79;;;;-1:-1:-1;;;14263:79:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14687:10;14656:8;14667:31;;;:19;:31;;;;;;:63;;14720:8;;14667:47;;14704:8;14667:35;:47::i;:63::-;14836:25;;14818:10;;14777;14741:8;14752:36;;;:24;:36;;;;;;14656:74;;-1:-1:-1;14741:8:2;14752:111;;14836:25;14752:78;;;;14794:16;14752:40;:60::i;:111::-;14741:122;;14891:3;14884;:10;;14874:78;;;;-1:-1:-1;;;14874:78:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15038:10;15013:36;;;;:24;:36;;;;;;:60;;15055:16;15013:40;:60::i;:::-;14998:10;14973:36;;;;:24;:36;;;;;;;;:100;;;;15110:9;;:48;;-1:-1:-1;;;15110:48:2;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15110:9:2;;;;:18;;:48;;;;;;;;;;;;;:9;:48;;;;;;;;;;2431:56;;;;;;;;;;;;;:::o;922:41::-;;;;:::o;6585:174::-;6672:5;;-1:-1:-1;;;;;6672:5:2;6658:10;:19;6650:66;;;;-1:-1:-1;;;6650:66:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6727:10;:24;6585:174::o;7037:461::-;7171:1;7159:9;:13;7151:50;;;;;-1:-1:-1;;;7151:50:2;;;;;;;;;;;;-1:-1:-1;;;7151:50:2;;;;;;;;;;;;;;;7245:10;7236:20;;;;:8;:20;;;;;;:37;;7262:9;7236:24;:37::i;:::-;7222:10;7213:20;;;;:8;:20;;;;;;;;:60;;;;7297:19;:31;;;;;;:39;;:31;:39;7294:197;;7410:10;7390:31;;;;:19;:31;;;;;:38;;-1:-1:-1;;7390:38:2;7424:4;7390:38;;;;;;7443:19;:36;;;;;;;;;;;;;;-1:-1:-1;;;;;;7443:36:2;;;;;;7294:197;7037:461::o;372:28::-;;;-1:-1:-1;;;;;372:28:2;;:::o;6771:218::-;6847:5;;-1:-1:-1;;;;;6847:5:2;6833:10;:19;6825:66;;;;-1:-1:-1;;;6825:66:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6902:18;:25;;-1:-1:-1;;;;6902:25:2;-1:-1:-1;;;6902:25:2;;;6966:15;6938:25;:43;6771:218::o;4911:186::-;5004:5;;-1:-1:-1;;;;;5004:5:2;4990:10;:19;4982:66;;;;-1:-1:-1;;;4982:66:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5059:13;:30;4911:186::o;3388:36::-;;;;;;:::o;16638:3063::-;-1:-1:-1;;;16912:9:2;:20;16903:67;;;;;-1:-1:-1;;;16903:67:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17003:40:2;;;;;;:19;:40;;;;;;16990:9;:53;;16981:120;;;;-1:-1:-1;;;16981:120:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17280:40:2;;17269:8;17280:40;;;:19;:40;;;;;;:72;;17342:8;;17280:56;;17326:8;17280:44;:56::i;:72::-;17443:23;;17425:10;;-1:-1:-1;;;;;17374:45:2;;17363:8;17374:45;;;:24;:45;;;;;;17269:83;;-1:-1:-1;17363:8:2;17374:94;;17443:23;17374:63;;:45;:49;:63::i;:94::-;17484:19;;;;;;;;;;;;;;;;;-1:-1:-1;;;17484:19:2;;;;;;17363:105;;-1:-1:-1;;;;;;;;;;;;17484:19:2;;;;;;;;;17519;;;;;;;;;;;;;;;;;-1:-1:-1;;;17519:19:2;;;;;;-1:-1:-1;;;;;;;;;;;17519:19:2;;;;;;;;17573:3;17567;:9;17559:67;;;;-1:-1:-1;;;17559:67:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17976:45:2;;17964:9;17976:45;;;:24;:45;;;;;;18153:10;;18090:25;;17976:45;;17964:9;18044:121;;18153:10;18044:103;;18138:7;;18044:88;;18090:41;;18121:8;18090:29;:41::i;18044:121::-;18191:21;;;;;;;;;;;;;;;;;-1:-1:-1;;;18191:21:2;;;;;;18032:133;;-1:-1:-1;;;;;;;;;;;;18191:21:2;;;;;;;;;18228;;;;;;;;;;;;;;;;;-1:-1:-1;;;18228:21:2;;;;;;-1:-1:-1;;;;;;;;;;;18228:21:2;;;;;;;;18270:17;18309:4;18302;:11;18298:921;;;-1:-1:-1;;;;;18595:40:2;;;;;;:19;:40;;;;;;;;;18542:24;:45;;;;;;;18527:110;;18595:40;18527:62;;:9;;:13;:62::i;:110::-;-1:-1:-1;;;;;18676:45:2;;;;;;:24;:45;;;;;;18512:125;;-1:-1:-1;18660:61:2;;;18652:119;;;;-1:-1:-1;;;18652:119:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18298:921;;;18970:88;19047:10;;18970:72;19033:7;18970:57;18985:41;19016:8;18985:25;;:29;;:41;;;;:::i;:::-;18970:9;;:13;:57::i;:88::-;-1:-1:-1;;;;;19098:45:2;;;;;;:24;:45;;;;;;18955:103;;-1:-1:-1;19082:61:2;;;19074:119;;;;-1:-1:-1;;;19074:119:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19355:40:2;;;;;;:19;:40;;;;;;:57;;19401:9;19355:44;:57::i;:::-;-1:-1:-1;;;;;19312:40:2;;;;;;:19;:40;;;;;;;;:100;;;;19519:24;:45;;;;:65;;19570:12;19519:49;:65::i;:::-;-1:-1:-1;;;;;19471:45:2;;;;;;;:24;:45;;;;;;;;:113;;;;19636:9;;:47;;-1:-1:-1;;;19636:47:2;;19656:10;19636:47;;;;;;;;;;;;:9;;;:18;;:47;;;;;;;;;;;;;;:9;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3218:37;;;;:::o;1678:471:1:-;1736:7;1981:6;1977:47;;-1:-1:-1;2011:1:1;2004:8;;1977:47;2048:5;;;2052:1;2048;:5;:1;2072:5;;;;;:10;2064:56;;;;-1:-1:-1;;;2064:56:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;788:136;846:7;873:43;877:1;880;873:43;;;;;;;;;;;;;;;;;:3;:43::i;2625:132::-;2683:7;2710:39;2714:1;2717;2710:39;;;;;;;;;;;;;;;;;:3;:39::i;1227:192::-;1313:7;1349:12;1341:6;;;;1333:29;;;;-1:-1:-1;;;1333:29:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1385:5:1;;;1227:192::o;3253:278::-;3339:7;3374:12;3367:5;3359:28;;;;-1:-1:-1;;;3359:28:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3398:9;3414:1;3410;:5;;;;;;;3253:278;-1:-1:-1;;;;;3253:278:1:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://82a7b3fffed66de333732de5476306f7383f3360cf83e39c4d8c8520d071ab12

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

Deployer address for ItoVault.

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.