ETH Price: $3,294.84 (-3.82%)
Gas: 7 Gwei

Contract

0x41d95799CED5195B781e8BC386CB60f578227b19
 

Overview

ETH Balance

0.465783008206658899 ETH

Eth Value

$1,534.68 (@ $3,294.84/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Reclaim Contribu...122850712021-04-21 18:10:291169 days ago1619028629IN
0x41d95799...578227b19
0 ETH0.0152216200
Reclaim Contribu...115771342021-01-02 20:16:351277 days ago1609618595IN
0x41d95799...578227b19
0 ETH0.00692723104
Reclaim Contribu...113276362020-11-25 13:00:191316 days ago1606309219IN
0x41d95799...578227b19
0 ETH0.0040630861
Change Investor ...113268252020-11-25 9:47:121316 days ago1606297632IN
0x41d95799...578227b19
0 ETH0.0021624542
Reclaim Contribu...105022452020-07-21 10:37:111443 days ago1595327831IN
0x41d95799...578227b19
0 ETH0.00705917106
Reclaim Contribu...102431732020-06-11 7:53:161483 days ago1591861996IN
0x41d95799...578227b19
0 ETH0.00467251
Reclaim Contribu...100411932020-05-10 22:39:341514 days ago1589150374IN
0x41d95799...578227b19
0 ETH0.0015985924
Reclaim Contribu...99553442020-04-27 15:37:041528 days ago1588001824IN
0x41d95799...578227b19
0 ETH0.0019982430
Reclaim Contribu...98718072020-04-14 17:01:071541 days ago1586883667IN
0x41d95799...578227b19
0 ETH0.0015191322.8070883
Reclaim Local No...98394922020-04-09 17:56:271546 days ago1586454987IN
0x41d95799...578227b19
0 ETH0.000126293
Reclaim Ethic Hu...98394762020-04-09 17:51:311546 days ago1586454691IN
0x41d95799...578227b19
0 ETH0.000227914
Reclaim Contribu...97772072020-03-31 3:50:381555 days ago1585626638IN
0x41d95799...578227b19
0 ETH0.0016385524.6
Reclaim Contribu...97359082020-03-24 19:15:501561 days ago1585077350IN
0x41d95799...578227b19
0 ETH0.0018321620
Reclaim Contribu...96973592020-03-18 19:01:101567 days ago1584558070IN
0x41d95799...578227b19
0 ETH0.0013321620
Reclaim Contribu...96964872020-03-18 15:51:121568 days ago1584546672IN
0x41d95799...578227b19
0 ETH0.001665225
Reclaim Contribu...96949952020-03-18 10:10:191568 days ago1584526219IN
0x41d95799...578227b19
0 ETH0.001731826
Reclaim Contribu...96901762020-03-17 16:35:341569 days ago1584462934IN
0x41d95799...578227b19
0 ETH0.0022525.00000004
Reclaim Contribu...96841952020-03-16 18:26:281569 days ago1584383188IN
0x41d95799...578227b19
0 ETH0.0021624
Reclaim Contribu...96627022020-03-13 10:49:191573 days ago1584096559IN
0x41d95799...578227b19
0 ETH0.006370
Reclaim Contribu...96626102020-03-13 10:28:511573 days ago1584095331IN
0x41d95799...578227b19
0 ETH0.0063971
Reclaim Contribu...96582192020-03-12 18:07:501574 days ago1584036470IN
0x41d95799...578227b19
0 ETH0.00965816145
Reclaim Contribu...96582162020-03-12 18:06:581574 days ago1584036418IN
0x41d95799...578227b19
0 ETH0.00965816145
Reclaim Contribu...96557472020-03-12 8:46:541574 days ago1584002814IN
0x41d95799...578227b19
0 ETH0.00339751
Reclaim Contribu...96523202020-03-11 20:12:091574 days ago1583957529IN
0x41d95799...578227b19
0 ETH0.0013987621
Reclaim Contribu...96520632020-03-11 19:21:011574 days ago1583954461IN
0x41d95799...578227b19
0 ETH0.0027482430
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
122850712021-04-21 18:10:291169 days ago1619028629
0x41d95799...578227b19
1.60019329 ETH
115771342021-01-02 20:16:351277 days ago1609618595
0x41d95799...578227b19
0.76700381 ETH
113276362020-11-25 13:00:191316 days ago1606309219
0x41d95799...578227b19
0.10721669 ETH
105022452020-07-21 10:37:111443 days ago1595327831
0x41d95799...578227b19
5.10732277 ETH
102431732020-06-11 7:53:161483 days ago1591861996
0x41d95799...578227b19
0.10721669 ETH
100411932020-05-10 22:39:341514 days ago1589150374
0x41d95799...578227b19
1.37348438 ETH
99553442020-04-27 15:37:041528 days ago1588001824
0x41d95799...578227b19
4.91287372 ETH
98718072020-04-14 17:01:071541 days ago1586883667
0x41d95799...578227b19
1.24320152 ETH
98394922020-04-09 17:56:271546 days ago1586454987
0x41d95799...578227b19
1.27663682 ETH
98394762020-04-09 17:51:311546 days ago1586454691
0x41d95799...578227b19
0.95747762 ETH
97772072020-03-31 3:50:381555 days ago1585626638
0x41d95799...578227b19
0.51154886 ETH
97359082020-03-24 19:15:501561 days ago1585077350
0x41d95799...578227b19
0.82604754 ETH
96973592020-03-18 19:01:101567 days ago1584558070
0x41d95799...578227b19
0.07055745 ETH
96964872020-03-18 15:51:121568 days ago1584546672
0x41d95799...578227b19
1.53659449 ETH
96949952020-03-18 10:10:191568 days ago1584526219
0x41d95799...578227b19
0.51211193 ETH
96582192020-03-12 18:07:501574 days ago1584036470
0x41d95799...578227b19
0.5529556 ETH
96582162020-03-12 18:06:581574 days ago1584036418
0x41d95799...578227b19
1.81411078 ETH
96557472020-03-12 8:46:541574 days ago1584002814
0x41d95799...578227b19
0.51400896 ETH
96523202020-03-11 20:12:091574 days ago1583957529
0x41d95799...578227b19
0.52815046 ETH
96520632020-03-11 19:21:011574 days ago1583954461
0x41d95799...578227b19
1.50736298 ETH
96519612020-03-11 18:58:081574 days ago1583953088
0x41d95799...578227b19
0.18882004 ETH
96519282020-03-11 18:51:301574 days ago1583952690
0x41d95799...578227b19
0.25088224 ETH
96518642020-03-11 18:35:501574 days ago1583951750
0x41d95799...578227b19
1.72457294 ETH
96503562020-03-11 13:01:521575 days ago1583931712
0x41d95799...578227b19
0.10645788 ETH
96499452020-03-11 11:27:231575 days ago1583926043
0x41d95799...578227b19
0.15854861 ETH
View All Internal Transactions
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x2a84Aa3B...Af71E656B
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
EthicHubLending

Compiler Version
v0.4.25+commit.59dbf8f1

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-05-21
*/

pragma solidity ^0.4.13;

contract Ownable {
  address public owner;


  event OwnershipRenounced(address indexed previousOwner);
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to relinquish control of the contract.
   */
  function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(owner);
    owner = address(0);
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(address _newOwner) public onlyOwner {
    _transferOwnership(_newOwner);
  }

  /**
   * @dev Transfers control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function _transferOwnership(address _newOwner) internal {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }
}

contract EthicHubStorageInterface {

    //modifier for access in sets and deletes
    modifier onlyEthicHubContracts() {_;}

    // Setters
    function setAddress(bytes32 _key, address _value) external;
    function setUint(bytes32 _key, uint _value) external;
    function setString(bytes32 _key, string _value) external;
    function setBytes(bytes32 _key, bytes _value) external;
    function setBool(bytes32 _key, bool _value) external;
    function setInt(bytes32 _key, int _value) external;
    // Deleters
    function deleteAddress(bytes32 _key) external;
    function deleteUint(bytes32 _key) external;
    function deleteString(bytes32 _key) external;
    function deleteBytes(bytes32 _key) external;
    function deleteBool(bytes32 _key) external;
    function deleteInt(bytes32 _key) external;

    // Getters
    function getAddress(bytes32 _key) external view returns (address);
    function getUint(bytes32 _key) external view returns (uint);
    function getString(bytes32 _key) external view returns (string);
    function getBytes(bytes32 _key) external view returns (bytes);
    function getBool(bytes32 _key) external view returns (bool);
    function getInt(bytes32 _key) external view returns (int);
}

library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return a / b;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
    c = a + b;
    assert(c >= a);
    return c;
  }
}

contract EthicHubReputationInterface {
    modifier onlyUsersContract(){_;}
    modifier onlyLendingContract(){_;}
    function burnReputation(uint delayDays)  external;
    function incrementReputation(uint completedProjectsByTier)  external;
    function initLocalNodeReputation(address localNode)  external;
    function initCommunityReputation(address community)  external;
    function getCommunityReputation(address target) public view returns(uint256);
    function getLocalNodeReputation(address target) public view returns(uint256);
}

contract Pausable is Ownable {
  event Pause();
  event Unpause();

  bool public paused = false;


  /**
   * @dev Modifier to make a function callable only when the contract is not paused.
   */
  modifier whenNotPaused() {
    require(!paused);
    _;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is paused.
   */
  modifier whenPaused() {
    require(paused);
    _;
  }

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() onlyOwner whenNotPaused public {
    paused = true;
    emit Pause();
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() onlyOwner whenPaused public {
    paused = false;
    emit Unpause();
  }
}

contract EthicHubBase {

    uint8 public version;

    EthicHubStorageInterface public ethicHubStorage = EthicHubStorageInterface(0);

    constructor(address _storageAddress) public {
        require(_storageAddress != address(0));
        ethicHubStorage = EthicHubStorageInterface(_storageAddress);
    }

}

contract EthicHubLending is EthicHubBase, Ownable, Pausable {
    using SafeMath for uint256;
    //uint256 public minContribAmount = 0.1 ether;                          // 0.1 ether
    enum LendingState {
        Uninitialized,
        AcceptingContributions,
        ExchangingToFiat,
        AwaitingReturn,
        ProjectNotFunded,
        ContributionReturned,
        Default
    }
    mapping(address => Investor) public investors;
    uint256 public investorCount;
    uint256 public reclaimedContributions;
    uint256 public reclaimedSurpluses;
    uint256 public fundingStartTime;                                     // Start time of contribution period in UNIX time
    uint256 public fundingEndTime;                                       // End time of contribution period in UNIX time
    uint256 public totalContributed;
    bool public capReached;
    LendingState public state;
    uint256 public annualInterest;
    uint256 public totalLendingAmount;
    uint256 public lendingDays;
    uint256 public borrowerReturnDays;
    uint256 public initialEthPerFiatRate;
    uint256 public totalLendingFiatAmount;
    address public borrower;
    address public localNode;
    address public ethicHubTeam;
    //uint256 public borrowerReturnDate;
    uint256 public borrowerReturnEthPerFiatRate;
    uint256 public ethichubFee;
    uint256 public localNodeFee;
    uint256 public tier;
    // interest rate is using base uint 100 and 100% 10000, this means 1% is 100
    // this guarantee we can have a 2 decimal presicion in our calculation
    uint256 public constant interestBaseUint = 100;
    uint256 public constant interestBasePercent = 10000;
    bool public localNodeFeeReclaimed;
    bool public ethicHubTeamFeeReclaimed;
    uint256 public surplusEth;
    uint256 public returnedEth;

    struct Investor {
        uint256 amount;
        bool isCompensated;
        bool surplusEthReclaimed;
    }

    // events
    event onCapReached(uint endTime);
    event onContribution(uint totalContributed, address indexed investor, uint amount, uint investorsCount);
    event onCompensated(address indexed contributor, uint amount);
    event onSurplusSent(uint256 amount);
    event onSurplusReclaimed(address indexed contributor, uint amount);
    event StateChange(uint state);
    event onInitalRateSet(uint rate);
    event onReturnRateSet(uint rate);
    event onReturnAmount(address indexed borrower, uint amount);
    event onBorrowerChanged(address indexed newBorrower);
    event onInvestorChanged(address indexed oldInvestor, address indexed newInvestor);

    // modifiers
    modifier checkProfileRegistered(string profile) {
        bool isRegistered = ethicHubStorage.getBool(keccak256(abi.encodePacked("user", profile, msg.sender)));
        require(isRegistered, "Sender not registered in EthicHub.com");
        _;
    }

    modifier checkIfArbiter() {
        address arbiter = ethicHubStorage.getAddress(keccak256(abi.encodePacked("arbiter", this)));
        require(arbiter == msg.sender, "Sender not authorized");
        _;
    }

    modifier onlyOwnerOrLocalNode() {
        require(localNode == msg.sender || owner == msg.sender,"Sender not authorized");
        _;
    }

    //modifier onlyInvestorOrPaymentGateway() {
    //    bool isInvestor = ethicHubStorage.getBool(keccak256(abi.encodePacked("user", "investor", msg.sender)));
    //    bool isPaymentGateway = ethicHubStorage.getBool(keccak256(abi.encodePacked("user", "paymentGateway", msg.sender)));
    //    require(isPaymentGateway || isInvestor, "Sender not authorized");
    //    _;
    //}

    constructor(
        uint256 _fundingStartTime,
        uint256 _fundingEndTime,
        address _borrower,
        uint256 _annualInterest,
        uint256 _totalLendingAmount,
        uint256 _lendingDays,
        address _storageAddress,
        address _localNode,
        address _ethicHubTeam,
        uint256 _ethichubFee,
        uint256 _localNodeFee
        )
        EthicHubBase(_storageAddress)
        public {
        require(_fundingEndTime > fundingStartTime, "fundingEndTime should be later than fundingStartTime");
        require(_borrower != address(0), "No borrower set");
        require(ethicHubStorage.getBool(keccak256(abi.encodePacked("user", "representative", _borrower))), "Borrower not registered representative");
        require(_localNode != address(0), "No Local Node set");
        require(_ethicHubTeam != address(0), "No EthicHub Team set");
        require(ethicHubStorage.getBool(keccak256(abi.encodePacked("user", "localNode", _localNode))), "Local Node is not registered");
        require(_totalLendingAmount > 0, "_totalLendingAmount must be > 0");
        require(_lendingDays > 0, "_lendingDays must be > 0");
        require(_annualInterest > 0 && _annualInterest < 100, "_annualInterest must be between 0 and 100");
        version = 7;
        reclaimedContributions = 0;
        reclaimedSurpluses = 0;
        borrowerReturnDays = 0;
        fundingStartTime = _fundingStartTime;
        fundingEndTime = _fundingEndTime;
        localNode = _localNode;
        ethicHubTeam = _ethicHubTeam;
        borrower = _borrower;
        annualInterest = _annualInterest;
        totalLendingAmount = _totalLendingAmount;
        lendingDays = _lendingDays;
        ethichubFee = _ethichubFee;
        localNodeFee = _localNodeFee;
        state = LendingState.Uninitialized;
    }

    function saveInitialParametersToStorage(uint256 _maxDelayDays, uint256 _tier, uint256 _communityMembers, address _community) external onlyOwnerOrLocalNode {
        require(_maxDelayDays != 0, "_maxDelayDays must be > 0");
        require(state == LendingState.Uninitialized, "State must be Uninitialized");
        require(_tier > 0, "_tier must be > 0");
        require(_communityMembers > 0, "_communityMembers must be > 0");
        require(ethicHubStorage.getBool(keccak256(abi.encodePacked("user", "community", _community))), "Community is not registered");
        ethicHubStorage.setUint(keccak256(abi.encodePacked("lending.maxDelayDays", this)), _maxDelayDays);
        ethicHubStorage.setAddress(keccak256(abi.encodePacked("lending.community", this)), _community);
        ethicHubStorage.setAddress(keccak256(abi.encodePacked("lending.localNode", this)), localNode);
        ethicHubStorage.setUint(keccak256(abi.encodePacked("lending.tier", this)), _tier);
        ethicHubStorage.setUint(keccak256(abi.encodePacked("lending.communityMembers", this)), _communityMembers);
        tier = _tier;
        state = LendingState.AcceptingContributions;
        emit StateChange(uint(state));

    }

    function setBorrower(address _borrower) external checkIfArbiter {
        require(_borrower != address(0), "No borrower set");
        require(ethicHubStorage.getBool(keccak256(abi.encodePacked("user", "representative", _borrower))), "Borrower not registered representative");
        borrower = _borrower;
        emit onBorrowerChanged(borrower);
    }

    function changeInvestorAddress(address oldInvestor, address newInvestor) external checkIfArbiter {
        require(newInvestor != address(0));
        require(ethicHubStorage.getBool(keccak256(abi.encodePacked("user", "investor", newInvestor))));
        //oldInvestor should have invested in this project
        require(investors[oldInvestor].amount != 0);
        //newInvestor should not have invested anything in this project to not complicate return calculation
        require(investors[newInvestor].amount == 0);
        investors[newInvestor].amount = investors[oldInvestor].amount;
        investors[newInvestor].isCompensated = investors[oldInvestor].isCompensated;
        investors[newInvestor].surplusEthReclaimed = investors[oldInvestor].surplusEthReclaimed;
        delete investors[oldInvestor];
        emit onInvestorChanged(oldInvestor, newInvestor);
    }

    function() public payable whenNotPaused {
        require(state == LendingState.AwaitingReturn || state == LendingState.AcceptingContributions || state == LendingState.ExchangingToFiat, "Can't receive ETH in this state");
        if(state == LendingState.AwaitingReturn) {
            returnBorrowedEth();
        } else if (state == LendingState.ExchangingToFiat) {
            // borrower can send surplus eth back to contract to avoid paying interest
            sendBackSurplusEth();
        } else {
            require(ethicHubStorage.getBool(keccak256(abi.encodePacked("user", "investor", msg.sender))), "Sender is not registered lender");
            contributeWithAddress(msg.sender);
        }
    }

    function sendBackSurplusEth() internal {
        require(state == LendingState.ExchangingToFiat);
        require(msg.sender == borrower);
        surplusEth = surplusEth.add(msg.value);
        require(surplusEth <= totalLendingAmount);
        emit onSurplusSent(msg.value);
    }

    /**
     * After the contribution period ends unsuccesfully, this method enables the contributor
     *  to retrieve their contribution
     */
    function declareProjectNotFunded() external onlyOwnerOrLocalNode {
        require(totalContributed < totalLendingAmount);
        require(state == LendingState.AcceptingContributions);
        require(now > fundingEndTime);
        state = LendingState.ProjectNotFunded;
        emit StateChange(uint(state));
    }

    function declareProjectDefault() external onlyOwnerOrLocalNode {
        require(state == LendingState.AwaitingReturn);
        uint maxDelayDays = getMaxDelayDays();
        require(getDelayDays(now) >= maxDelayDays);
        EthicHubReputationInterface reputation = EthicHubReputationInterface(ethicHubStorage.getAddress(keccak256(abi.encodePacked("contract.name", "reputation"))));
        require(reputation != address(0));
        ethicHubStorage.setUint(keccak256(abi.encodePacked("lending.delayDays", this)), maxDelayDays);
        reputation.burnReputation(maxDelayDays);
        state = LendingState.Default;
        emit StateChange(uint(state));
    }

    function setBorrowerReturnEthPerFiatRate(uint256 _borrowerReturnEthPerFiatRate) external onlyOwnerOrLocalNode {
        require(state == LendingState.AwaitingReturn, "State is not AwaitingReturn");
        borrowerReturnEthPerFiatRate = _borrowerReturnEthPerFiatRate;
        emit onReturnRateSet(borrowerReturnEthPerFiatRate);
    }

    /**
    * Marks the initial exchange period as over (the ETH collected amount has been exchanged for local Fiat currency)
    * If there was surplus, the  amount returned is substracted over the total amount collected
    * Sets the local currency to return, on the basis of which the interest will be calculated
    * @param _initialEthPerFiatRate the rate with 2 decimals. i.e. 444.22 is 44422 , 1245.00 is 124500
    */
    function finishInitialExchangingPeriod(uint256 _initialEthPerFiatRate) external onlyOwnerOrLocalNode {
        require(capReached == true, "Cap not reached");
        require(state == LendingState.ExchangingToFiat, "State is not ExchangingToFiat");
        initialEthPerFiatRate = _initialEthPerFiatRate;
        if (surplusEth > 0) {
            totalLendingAmount = totalLendingAmount.sub(surplusEth);
        }
        totalLendingFiatAmount = totalLendingAmount.mul(initialEthPerFiatRate);
        emit onInitalRateSet(initialEthPerFiatRate);
        state = LendingState.AwaitingReturn;
        emit StateChange(uint(state));
    }

    /**
     * Method to reclaim contribution after project is declared default (% of partial funds)
     * @param  beneficiary the contributor
     *
     */
    function reclaimContributionDefault(address beneficiary) external {
        require(state == LendingState.Default);
        require(!investors[beneficiary].isCompensated);
        // contribution = contribution * partial_funds / total_funds
        uint256 contribution = checkInvestorReturns(beneficiary);
        require(contribution > 0);
        investors[beneficiary].isCompensated = true;
        reclaimedContributions = reclaimedContributions.add(1);
        doReclaim(beneficiary, contribution);
    }

    /**
     * Method to reclaim contribution after a project is declared as not funded
     * @param  beneficiary the contributor
     *
     */
    function reclaimContribution(address beneficiary) external {
        require(state == LendingState.ProjectNotFunded, "State is not ProjectNotFunded");
        require(!investors[beneficiary].isCompensated, "Contribution already reclaimed");
        uint256 contribution = investors[beneficiary].amount;
        require(contribution > 0, "Contribution is 0");
        investors[beneficiary].isCompensated = true;
        reclaimedContributions = reclaimedContributions.add(1);
        doReclaim(beneficiary, contribution);
    }

    function reclaimSurplusEth(address beneficiary) external {
        require(surplusEth > 0, "No surplus ETH");
        // only can be reclaimed after cap reduced
        require(state != LendingState.ExchangingToFiat, "State is ExchangingToFiat");
        require(!investors[beneficiary].surplusEthReclaimed, "Surplus already reclaimed");
        uint256 surplusContribution = investors[beneficiary].amount.mul(surplusEth).div(surplusEth.add(totalLendingAmount));
        require(surplusContribution > 0, "Surplus is 0");
        investors[beneficiary].surplusEthReclaimed = true;
        reclaimedSurpluses = reclaimedSurpluses.add(1);
        emit onSurplusReclaimed(beneficiary, surplusContribution);
        doReclaim(beneficiary, surplusContribution);
    }

    function reclaimContributionWithInterest(address beneficiary) external {
        require(state == LendingState.ContributionReturned, "State is not ContributionReturned");
        require(!investors[beneficiary].isCompensated, "Lender already compensated");
        uint256 contribution = checkInvestorReturns(beneficiary);
        require(contribution > 0, "Contribution is 0");
        investors[beneficiary].isCompensated = true;
        reclaimedContributions = reclaimedContributions.add(1);
        doReclaim(beneficiary, contribution);
    }

    function reclaimLocalNodeFee() external {
        require(state == LendingState.ContributionReturned, "State is not ContributionReturned");
        require(localNodeFeeReclaimed == false, "Local Node's fee already reclaimed");
        uint256 fee = totalLendingFiatAmount.mul(localNodeFee).mul(interestBaseUint).div(interestBasePercent).div(borrowerReturnEthPerFiatRate);
        require(fee > 0, "Local Node's team fee is 0");
        localNodeFeeReclaimed = true;
        doReclaim(localNode, fee);
    }

    function reclaimEthicHubTeamFee() external {
        require(state == LendingState.ContributionReturned, "State is not ContributionReturned");
        require(ethicHubTeamFeeReclaimed == false, "EthicHub team's fee already reclaimed");
        uint256 fee = totalLendingFiatAmount.mul(ethichubFee).mul(interestBaseUint).div(interestBasePercent).div(borrowerReturnEthPerFiatRate);
        require(fee > 0, "EthicHub's team fee is 0");
        ethicHubTeamFeeReclaimed = true;
        doReclaim(ethicHubTeam, fee);
    }

    function reclaimLeftoverEth() external checkIfArbiter {
        require(state == LendingState.ContributionReturned || state == LendingState.Default, "State is not ContributionReturned or Default");
        require(localNodeFeeReclaimed, "Local Node fee is not reclaimed");
        require(ethicHubTeamFeeReclaimed, "Team fee is not reclaimed");
        require(investorCount == reclaimedContributions, "Not all investors have reclaimed their share");
        if(surplusEth > 0) {
            require(investorCount == reclaimedSurpluses, "Not all investors have reclaimed their surplus");
        }
        doReclaim(ethicHubTeam, address(this).balance);
    }

    function doReclaim(address target, uint256 amount) internal {
        if ( address(this).balance < amount ) {
            target.transfer(address(this).balance);
        } else {
            target.transfer(amount);
        }
    }

    function returnBorrowedEth() internal {
        require(state == LendingState.AwaitingReturn, "State is not AwaitingReturn");
        require(msg.sender == borrower, "Only the borrower can repay");
        require(borrowerReturnEthPerFiatRate > 0, "Second exchange rate not set");
        bool projectRepayed = false;
        uint excessRepayment = 0;
        uint newReturnedEth = 0;
        emit onReturnAmount(msg.sender, msg.value);
        (newReturnedEth, projectRepayed, excessRepayment) = calculatePaymentGoal(borrowerReturnAmount(), returnedEth, msg.value);
        returnedEth = newReturnedEth;
        if (projectRepayed == true) {
            borrowerReturnDays = getDaysPassedBetweenDates(fundingEndTime, now);
            state = LendingState.ContributionReturned;
            emit StateChange(uint(state));
            updateReputation();
        }
        if (excessRepayment > 0) {
            msg.sender.transfer(excessRepayment);
        }
    }



    // @notice make cotribution throught a paymentGateway
    // @param contributor Address
    function contributeForAddress(address contributor) external checkProfileRegistered('paymentGateway') payable whenNotPaused {
        contributeWithAddress(contributor);
    }

    // @notice Function to participate in contribution period
    //  Amounts from the same address should be added up
    //  If cap is reached, end time should be modified
    //  Funds should be transferred into multisig wallet
    // @param contributor Address
    function contributeWithAddress(address contributor) internal whenNotPaused {
        require(state == LendingState.AcceptingContributions, "state is not AcceptingContributions");
        require(isContribPeriodRunning(), "can't contribute outside contribution period");

        uint oldTotalContributed = totalContributed;
        uint newTotalContributed = 0;
        uint excessContribValue = 0;
        (newTotalContributed, capReached, excessContribValue) = calculatePaymentGoal(totalLendingAmount, oldTotalContributed, msg.value);
        totalContributed = newTotalContributed;
        if (capReached) {
            fundingEndTime = now;
            emit onCapReached(fundingEndTime);
        }
        if (investors[contributor].amount == 0) {
            investorCount = investorCount.add(1);
        }
        if (excessContribValue > 0) {
            contributor.transfer(excessContribValue);
            investors[contributor].amount = investors[contributor].amount.add(msg.value).sub(excessContribValue);
            emit onContribution(newTotalContributed, contributor, msg.value.sub(excessContribValue), investorCount);
        } else {
            investors[contributor].amount = investors[contributor].amount.add(msg.value);
            emit onContribution(newTotalContributed, contributor, msg.value, investorCount);
        }
    }

    /**
     * Calculates if a target value is reached after increment, and by how much it was surpassed.
     * @param goal the target to achieve
     * @param oldTotal the total so far after the increment
     * @param contribValue the increment
     * @return (the incremented count, not bigger than max), (goal has been reached), (excess to return)
     */
    function calculatePaymentGoal(uint goal, uint oldTotal, uint contribValue) internal pure returns(uint, bool, uint) {
        uint newTotal = oldTotal.add(contribValue);
        bool goalReached = false;
        uint excess = 0;
        if (newTotal >= goal && oldTotal < goal) {
            goalReached = true;
            excess = newTotal.sub(goal);
            contribValue = contribValue.sub(excess);
            newTotal = goal;
        }
        return (newTotal, goalReached, excess);
    }

    function sendFundsToBorrower() external onlyOwnerOrLocalNode {
      //Waiting for Exchange
        require(state == LendingState.AcceptingContributions);
        require(capReached);
        state = LendingState.ExchangingToFiat;
        emit StateChange(uint(state));
        borrower.transfer(totalContributed);
    }

    function updateReputation() internal {
        EthicHubReputationInterface reputation = EthicHubReputationInterface(
            ethicHubStorage.getAddress(keccak256(abi.encodePacked("contract.name", "reputation")))
            );
        require(reputation != address(0));
        uint delayDays = getDelayDays(now);
        if (delayDays > 0) {
            ethicHubStorage.setUint(keccak256(abi.encodePacked("lending.delayDays", this)), delayDays);
            reputation.burnReputation(delayDays);
        } else {
            uint completedProjectsByTier = ethicHubStorage.getUint(keccak256(abi.encodePacked("community.completedProjectsByTier", this, tier))).add(1);
            ethicHubStorage.setUint(keccak256(abi.encodePacked("community.completedProjectsByTier", this, tier)), completedProjectsByTier);
            reputation.incrementReputation(completedProjectsByTier);
        }
    }
    /**
    * Calculates days passed after defaulting
    * @param date timestamp to calculate days
    * @return day number
    */
    function getDelayDays(uint date) public view returns(uint) {
        uint lendingDaysSeconds = lendingDays * 1 days;
        uint defaultTime = fundingEndTime.add(lendingDaysSeconds);
        if (date < defaultTime) {
            return 0;
        } else {
            return getDaysPassedBetweenDates(defaultTime, date);
        }
    }

    /**
    * Calculates days passed between two dates in seconds
    * @param firstDate timestamp
    * @param lastDate timestamp
    * @return days passed
    */
    function getDaysPassedBetweenDates(uint firstDate, uint lastDate) public pure returns(uint) {
        require(firstDate <= lastDate, "lastDate must be bigger than firstDate");
        return lastDate.sub(firstDate).div(60).div(60).div(24);
    }

    // lendingInterestRate with 2 decimal
    // 15 * (lending days)/ 365 + 4% local node fee + 3% LendingDev fee
    function lendingInterestRatePercentage() public view returns(uint256){
        return annualInterest.mul(interestBaseUint)
            // current days
            .mul(getDaysPassedBetweenDates(fundingEndTime, now)).div(365)
            .add(localNodeFee.mul(interestBaseUint))
            .add(ethichubFee.mul(interestBaseUint))
            .add(interestBasePercent);
    }

    // lendingInterestRate with 2 decimal
    function investorInterest() public view returns(uint256){
        return annualInterest.mul(interestBaseUint).mul(borrowerReturnDays).div(365).add(interestBasePercent);
    }

    function borrowerReturnFiatAmount() public view returns(uint256) {
        return totalLendingFiatAmount.mul(lendingInterestRatePercentage()).div(interestBasePercent);
    }

    function borrowerReturnAmount() public view returns(uint256) {
        return borrowerReturnFiatAmount().div(borrowerReturnEthPerFiatRate);
    }

    function isContribPeriodRunning() public view returns(bool) {
        return fundingStartTime <= now && fundingEndTime > now && !capReached;
    }

    function checkInvestorContribution(address investor) public view returns(uint256){
        return investors[investor].amount;
    }

    function checkInvestorReturns(address investor) public view returns(uint256) {
        uint256 investorAmount = 0;
        if (state == LendingState.ContributionReturned) {
            investorAmount = investors[investor].amount;
            if (surplusEth > 0){
                investorAmount = investors[investor].amount.mul(totalLendingAmount).div(totalContributed);
            }
            return investorAmount.mul(initialEthPerFiatRate).mul(investorInterest()).div(borrowerReturnEthPerFiatRate).div(interestBasePercent);
        } else if (state == LendingState.Default){
            investorAmount = investors[investor].amount;
            // contribution = contribution * partial_funds / total_funds
            return investorAmount.mul(returnedEth).div(totalLendingAmount);
        } else {
            return 0;
        }
    }

    function getMaxDelayDays() public view returns(uint256){
        return ethicHubStorage.getUint(keccak256(abi.encodePacked("lending.maxDelayDays", this)));
    }

    function getUserContributionReclaimStatus(address userAddress) public view returns(bool isCompensated, bool surplusEthReclaimed){
        isCompensated = investors[userAddress].isCompensated;
        surplusEthReclaimed = investors[userAddress].surplusEthReclaimed;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"totalContributed","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"localNodeFeeReclaimed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"interestBasePercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"localNode","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"sendFundsToBorrower","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalLendingAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tier","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"}],"name":"reclaimSurplusEth","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"fundingStartTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"borrowerReturnFiatAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ethicHubTeam","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lendingInterestRatePercentage","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMaxDelayDays","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"oldInvestor","type":"address"},{"name":"newInvestor","type":"address"}],"name":"changeInvestorAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"reclaimLeftoverEth","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"declareProjectDefault","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initialEthPerFiatRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"capReached","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"date","type":"uint256"}],"name":"getDelayDays","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"}],"name":"reclaimContributionDefault","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_maxDelayDays","type":"uint256"},{"name":"_tier","type":"uint256"},{"name":"_communityMembers","type":"uint256"},{"name":"_community","type":"address"}],"name":"saveInitialParametersToStorage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"investorInterest","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"interestBaseUint","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ethicHubStorage","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"borrowerReturnDays","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_borrowerReturnEthPerFiatRate","type":"uint256"}],"name":"setBorrowerReturnEthPerFiatRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"investors","outputs":[{"name":"amount","type":"uint256"},{"name":"isCompensated","type":"bool"},{"name":"surplusEthReclaimed","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ethicHubTeamFeeReclaimed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_initialEthPerFiatRate","type":"uint256"}],"name":"finishInitialExchangingPeriod","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"declareProjectNotFunded","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"fundingEndTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"localNodeFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"surplusEth","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"borrower","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"firstDate","type":"uint256"},{"name":"lastDate","type":"uint256"}],"name":"getDaysPassedBetweenDates","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"userAddress","type":"address"}],"name":"getUserContributionReclaimStatus","outputs":[{"name":"isCompensated","type":"bool"},{"name":"surplusEthReclaimed","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"reclaimedSurpluses","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lendingDays","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"investor","type":"address"}],"name":"checkInvestorReturns","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"}],"name":"reclaimContributionWithInterest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"borrowerReturnAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"reclaimedContributions","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"annualInterest","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"contributor","type":"address"}],"name":"contributeForAddress","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"reclaimEthicHubTeamFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"state","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_borrower","type":"address"}],"name":"setBorrower","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isContribPeriodRunning","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ethichubFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"investorCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"reclaimLocalNodeFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalLendingFiatAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"borrowerReturnEthPerFiatRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"}],"name":"reclaimContribution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"investor","type":"address"}],"name":"checkInvestorContribution","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"returnedEth","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_fundingStartTime","type":"uint256"},{"name":"_fundingEndTime","type":"uint256"},{"name":"_borrower","type":"address"},{"name":"_annualInterest","type":"uint256"},{"name":"_totalLendingAmount","type":"uint256"},{"name":"_lendingDays","type":"uint256"},{"name":"_storageAddress","type":"address"},{"name":"_localNode","type":"address"},{"name":"_ethicHubTeam","type":"address"},{"name":"_ethichubFee","type":"uint256"},{"name":"_localNodeFee","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"endTime","type":"uint256"}],"name":"onCapReached","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"totalContributed","type":"uint256"},{"indexed":true,"name":"investor","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"investorsCount","type":"uint256"}],"name":"onContribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"contributor","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"onCompensated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"onSurplusSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"contributor","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"onSurplusReclaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"state","type":"uint256"}],"name":"StateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"rate","type":"uint256"}],"name":"onInitalRateSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"rate","type":"uint256"}],"name":"onReturnRateSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"borrower","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"onReturnAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"newBorrower","type":"address"}],"name":"onBorrowerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"oldInvestor","type":"address"},{"indexed":true,"name":"newInvestor","type":"address"}],"name":"onInvestorChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

Deployed Bytecode

0x6080604052600436106102d15763ffffffff60e060020a600035041663023f4147811461057557806306c7a6031461059c5780630f226b6c146105c55780630f82c53e146105da578063106099021461060b57806315d28e111461062057806316f4d022146106355780631a776b3c1461064a5780631df935581461066b57806327f397a9146106805780632e7cece3146106955780633f4ba83a146106aa57806341c8b1de146106bf57806342159ca3146106d45780634419da33146106e957806348f918e01461071057806349b88203146107255780634b3c55131461073a5780634f9359451461074f578063532da8f914610764578063534ddf191461077c578063547ac0531461079d57806354fd4d50146107c75780635c07993b146107f25780635c975abb1461080757806361c4adaa1461081c57806367453969146108315780636ab4f921146108465780636ca78a1e1461085b5780636f7bc9be14610873578063715018a6146108b4578063717ba064146108c957806372ea2e6d146108de578063742ba8de146108f657806374eedd461461090b57806375079cf5146109205780637ce64dfb146109355780637df1f1b91461094a57806381c9a1141461095f5780638456cb591461097a57806387cf34cf1461098f5780638da5cb5b146109cb5780638e74e19e146109e057806397299d8a146109f55780639ab4d3a814610a0a5780639b82860914610a2b578063a5f2e07914610a4c578063aceefefd14610a61578063b2552fc414610a76578063bb316f0614610a8b578063bd366ddc14610a9f578063c19d93fb14610ab4578063c762d5f714610aed578063cfefe5a214610b0e578063d6b37ce914610b23578063d7e64c0014610b38578063da7855a314610b4d578063dee1bfbe14610b62578063e0341ff914610b77578063e78686eb14610b8c578063f2fde38b14610bad578063f8a321e114610bce578063f98db28d14610bef575b60015460a060020a900460ff16156102e857600080fd5b6003600954610100900460ff16600681111561030057fe5b148061032157506001600954610100900460ff16600681111561031f57fe5b145b8061034157506002600954610100900460ff16600681111561033f57fe5b145b1515610397576040805160e560020a62461bcd02815260206004820152601f60248201527f43616e277420726563656976652045544820696e207468697320737461746500604482015290519081900360640190fd5b6003600954610100900460ff1660068111156103af57fe5b14156103c2576103bd610c04565b610573565b6002600954610100900460ff1660068111156103da57fe5b14156103e8576103bd610e35565b6000546040805160e160020a633ab9b2b9026020808301919091527f696e766573746f72000000000000000000000000000000000000000000000000602483015233606060020a02602c830152825180830382018152918301928390528151610100909404600160a060020a031693637ae1cfca93918291908401908083835b602083106104875780518252601f199092019160209182019101610468565b51815160209384036101000a60001901801990921691161790526040805192909401829003822063ffffffff881660e060020a0283526004830152925160248083019650939450929083900301905081600087803b1580156104e857600080fd5b505af11580156104fc573d6000803e3d6000fd5b505050506040513d602081101561051257600080fd5b5051151561056a576040805160e560020a62461bcd02815260206004820152601f60248201527f53656e646572206973206e6f742072656769737465726564206c656e64657200604482015290519081900360640190fd5b61057333610ec9565b005b34801561058157600080fd5b5061058a61122d565b60408051918252519081900360200190f35b3480156105a857600080fd5b506105b1611233565b604080519115158252519081900360200190f35b3480156105d157600080fd5b5061058a61123c565b3480156105e657600080fd5b506105ef611242565b60408051600160a060020a039092168252519081900360200190f35b34801561061757600080fd5b50610573611251565b34801561062c57600080fd5b5061058a61136f565b34801561064157600080fd5b5061058a611375565b34801561065657600080fd5b50610573600160a060020a036004351661137b565b34801561067757600080fd5b5061058a6115f6565b34801561068c57600080fd5b5061058a6115fc565b3480156106a157600080fd5b506105ef611623565b3480156106b657600080fd5b50610573611632565b3480156106cb57600080fd5b5061058a6116aa565b3480156106e057600080fd5b5061058a611724565b3480156106f557600080fd5b50610573600160a060020a0360043581169060243516611849565b34801561071c57600080fd5b50610573611be9565b34801561073157600080fd5b50610573611fdd565b34801561074657600080fd5b5061058a6123aa565b34801561075b57600080fd5b506105b16123b0565b34801561077057600080fd5b5061058a6004356123b9565b34801561078857600080fd5b50610573600160a060020a0360043516612401565b3480156107a957600080fd5b50610573600435602435604435600160a060020a03606435166124ac565b3480156107d357600080fd5b506107dc612ddc565b6040805160ff9092168252519081900360200190f35b3480156107fe57600080fd5b5061058a612de5565b34801561081357600080fd5b506105b1612e0f565b34801561082857600080fd5b5061058a612e1f565b34801561083d57600080fd5b506105ef612e24565b34801561085257600080fd5b5061058a612e38565b34801561086757600080fd5b50610573600435612e3e565b34801561087f57600080fd5b50610894600160a060020a0360043516612f4d565b604080519384529115156020840152151582820152519081900360600190f35b3480156108c057600080fd5b50610573612f72565b3480156108d557600080fd5b506105b1612fe0565b3480156108ea57600080fd5b50610573600435612fee565b34801561090257600080fd5b506105736131df565b34801561091757600080fd5b5061058a6132cd565b34801561092c57600080fd5b5061058a6132d3565b34801561094157600080fd5b5061058a6132d9565b34801561095657600080fd5b506105ef6132df565b34801561096b57600080fd5b5061058a6004356024356132ee565b34801561098657600080fd5b50610573613391565b34801561099b57600080fd5b506109b0600160a060020a036004351661340e565b60408051921515835290151560208301528051918290030190f35b3480156109d757600080fd5b506105ef613439565b3480156109ec57600080fd5b5061058a613448565b348015610a0157600080fd5b5061058a61344e565b348015610a1657600080fd5b5061058a600160a060020a0360043516613454565b348015610a3757600080fd5b50610573600160a060020a0360043516613562565b348015610a5857600080fd5b5061058a6136bc565b348015610a6d57600080fd5b5061058a6136cc565b348015610a8257600080fd5b5061058a6136d2565b610573600160a060020a03600435166136d8565b348015610aab57600080fd5b50610573613927565b348015610ac057600080fd5b50610ac9613ad7565b60405180826006811115610ad957fe5b60ff16815260200191505060405180910390f35b348015610af957600080fd5b50610573600160a060020a0360043516613ae5565b348015610b1a57600080fd5b506105b1613ec0565b348015610b2f57600080fd5b5061058a613ee7565b348015610b4457600080fd5b5061058a613eed565b348015610b5957600080fd5b50610573613ef3565b348015610b6e57600080fd5b5061058a61409c565b348015610b8357600080fd5b5061058a6140a2565b348015610b9857600080fd5b50610573600160a060020a03600435166140a8565b348015610bb957600080fd5b50610573600160a060020a03600435166141fc565b348015610bda57600080fd5b5061058a600160a060020a036004351661421c565b348015610bfb57600080fd5b5061058a614237565b600080806003600954610100900460ff166006811115610c2057fe5b14610c75576040805160e560020a62461bcd02815260206004820152601b60248201527f5374617465206973206e6f74204177616974696e6752657475726e0000000000604482015290519081900360640190fd5b601054600160a060020a03163314610cd7576040805160e560020a62461bcd02815260206004820152601b60248201527f4f6e6c792074686520626f72726f7765722063616e2072657061790000000000604482015290519081900360640190fd5b601354600010610d31576040805160e560020a62461bcd02815260206004820152601c60248201527f5365636f6e642065786368616e67652072617465206e6f742073657400000000604482015290519081900360640190fd5b5050604080513481529051600092508291829133917f0e128ee884ff8004f547a4cb1730d37374f537cb49dfc3813955457399f1b006919081900360200190a2610d85610d7c6136bc565b6019543461423d565b60198390559094509250905060018315151415610df857610da8600754426132ee565b600d556009805461ff0019166105001790819055600080516020614a2783398151915290610100900460ff166006811115610ddf57fe5b60408051918252519081900360200190a1610df86142ad565b6000821115610e3057604051339083156108fc029084906000818181858888f19350505050158015610e2e573d6000803e3d6000fd5b505b505050565b6002600954610100900460ff166006811115610e4d57fe5b14610e5757600080fd5b601054600160a060020a03163314610e6e57600080fd5b601854610e81903463ffffffff6148d016565b6018819055600b541015610e9457600080fd5b6040805134815290517f0b4c8d1b2cae9c489899020a2321c20022e928a3f605fc963d318092e4260c329181900360200190a1565b6001546000908190819060a060020a900460ff1615610ee757600080fd5b6001600954610100900460ff166006811115610eff57fe5b14610f7a576040805160e560020a62461bcd02815260206004820152602360248201527f7374617465206973206e6f7420416363657074696e67436f6e7472696275746960448201527f6f6e730000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b610f82613ec0565b1515610ffe576040805160e560020a62461bcd02815260206004820152602c60248201527f63616e277420636f6e74726962757465206f75747369646520636f6e7472696260448201527f7574696f6e20706572696f640000000000000000000000000000000000000000606482015290519081900360840190fd5b60085492506000915060009050611018600b54843461423d565b6009805460ff19169215159290921791829055600883905591935090915060ff16156110775742600781905560408051918252517fcdf2a87753a725b409e9ce02d5505652d7e5f5e226b2b4aa7b2ec3f1b4454d2f9181900360200190a15b600160a060020a03841660009081526002602052604090205415156110ae576003546110aa90600163ffffffff6148d016565b6003555b600081111561119c57604051600160a060020a0385169082156108fc029083906000818181858888f193505050501580156110ed573d6000803e3d6000fd5b50600160a060020a03841660009081526002602052604090205461112990829061111d903463ffffffff6148d016565b9063ffffffff6148dd16565b600160a060020a0385166000818152600260205260409020919091557fa4343ae98cbe49a830f8d4239e189409bfc6939e7f70d8af07acd896d89580a583611177348563ffffffff6148dd16565b60035460408051938452602084019290925282820152519081900360600190a2610e2e565b600160a060020a0384166000908152600260205260409020546111c5903463ffffffff6148d016565b600160a060020a0385166000818152600260209081526040918290209390935560035481518681523494810194909452838201525190917fa4343ae98cbe49a830f8d4239e189409bfc6939e7f70d8af07acd896d89580a5919081900360600190a250505050565b60085481565b60175460ff1681565b61271081565b601154600160a060020a031681565b601154600160a060020a03163314806112745750600154600160a060020a031633145b15156112b8576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614a67833981519152604482015290519081900360640190fd5b6001600954610100900460ff1660068111156112d057fe5b146112da57600080fd5b60095460ff1615156112eb57600080fd5b6009805461ff0019166102001790819055600080516020614a2783398151915290610100900460ff16600681111561131f57fe5b60408051918252519081900360200190a1601054600854604051600160a060020a039092169181156108fc0291906000818181858888f1935050505015801561136c573d6000803e3d6000fd5b50565b600b5481565b60165481565b6000806018541115156113d8576040805160e560020a62461bcd02815260206004820152600e60248201527f4e6f20737572706c757320455448000000000000000000000000000000000000604482015290519081900360640190fd5b6002600954610100900460ff1660068111156113f057fe5b1415611446576040805160e560020a62461bcd02815260206004820152601960248201527f53746174652069732045786368616e67696e67546f4669617400000000000000604482015290519081900360640190fd5b600160a060020a038216600090815260026020526040902060010154610100900460ff16156114bf576040805160e560020a62461bcd02815260206004820152601960248201527f537572706c757320616c7265616479207265636c61696d656400000000000000604482015290519081900360640190fd5b6115106114d9600b546018546148d090919063ffffffff16565b601854600160a060020a0385166000908152600260205260409020546115049163ffffffff6148ef16565b9063ffffffff61491816565b90506000811161156a576040805160e560020a62461bcd02815260206004820152600c60248201527f537572706c757320697320300000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03821660009081526002602052604090206001908101805461ff0019166101001790556005546115a69163ffffffff6148d016565b600555604080518281529051600160a060020a038416917ffe1013231e75cf275d3c8a58285a703c0d1ad21d583517ed94c8b686412f4ca0919081900360200190a26115f2828261492d565b5050565b60065481565b600061161e61271061150461160f6116aa565b600f549063ffffffff6148ef16565b905090565b601254600160a060020a031681565b600154600160a060020a0316331461164957600080fd5b60015460a060020a900460ff16151561166157600080fd5b6001805474ff0000000000000000000000000000000000000000191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b600061161e6127106117186116cb60646014546148ef90919063ffffffff16565b601554611718906116e390606463ffffffff6148ef16565b61171861016d6115046116f8600754426132ee565b600a5461170c90606463ffffffff6148ef16565b9063ffffffff6148ef16565b9063ffffffff6148d016565b60008054604080517f6c656e64696e672e6d617844656c61794461797300000000000000000000000060208083019190915230606060020a026034830152825180830360280181526048909201928390528151610100909404600160a060020a03169363bd02d0f593918291908401908083835b602083106117b75780518252601f199092019160209182019101611798565b51815160209384036101000a60001901801990921691161790526040805192909401829003822063ffffffff881660e060020a0283526004830152925160248083019650939450929083900301905081600087803b15801561181857600080fd5b505af115801561182c573d6000803e3d6000fd5b505050506040513d602081101561184257600080fd5b5051905090565b60008054604080517f617262697465720000000000000000000000000000000000000000000000000060208083019190915230606060020a0260278301528251808303601b018152603b909201928390528151610100909404600160a060020a0316936321f8a72193918291908401908083835b602083106118dc5780518252601f1990920191602091820191016118bd565b51815160209384036101000a60001901801990921691161790526040805192909401829003822063ffffffff881660e060020a0283526004830152925160248083019650939450929083900301905081600087803b15801561193d57600080fd5b505af1158015611951573d6000803e3d6000fd5b505050506040513d602081101561196757600080fd5b50519050600160a060020a03811633146119b9576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614a67833981519152604482015290519081900360640190fd5b600160a060020a03821615156119ce57600080fd5b6000546040805160e160020a633ab9b2b9026020808301919091527f696e766573746f720000000000000000000000000000000000000000000000006024830152600160a060020a03868116606060020a02602c8401528351808403830181529284019384905282516101009095041693637ae1cfca93918291908401908083835b60208310611a6f5780518252601f199092019160209182019101611a50565b51815160209384036101000a60001901801990921691161790526040805192909401829003822063ffffffff881660e060020a0283526004830152925160248083019650939450929083900301905081600087803b158015611ad057600080fd5b505af1158015611ae4573d6000803e3d6000fd5b505050506040513d6020811015611afa57600080fd5b50511515611b0757600080fd5b600160a060020a0383166000908152600260205260409020541515611b2b57600080fd5b600160a060020a03821660009081526002602052604090205415611b4e57600080fd5b600160a060020a0383811660008181526002602052604080822080549487168084528284209586556001808301805491909701805460ff191660ff928316151517808255885461ff00199091166101009182900490931615150291909117905584845290839055845461ffff1916909455517fe885da7a4af28452538a02823a397cd8734085c273324cc6d5feb174fa352c2d9190a3505050565b60008054604080517f617262697465720000000000000000000000000000000000000000000000000060208083019190915230606060020a0260278301528251808303601b018152603b909201928390528151610100909404600160a060020a0316936321f8a72193918291908401908083835b60208310611c7c5780518252601f199092019160209182019101611c5d565b51815160209384036101000a60001901801990921691161790526040805192909401829003822063ffffffff881660e060020a0283526004830152925160248083019650939450929083900301905081600087803b158015611cdd57600080fd5b505af1158015611cf1573d6000803e3d6000fd5b505050506040513d6020811015611d0757600080fd5b50519050600160a060020a0381163314611d59576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614a67833981519152604482015290519081900360640190fd5b6005600954610100900460ff166006811115611d7157fe5b1480611d9257506006600954610100900460ff166006811115611d9057fe5b145b1515611dfc576040805160e560020a62461bcd02815260206004820152602c6024820152600080516020614a4783398151915260448201527f64206f722044656661756c740000000000000000000000000000000000000000606482015290519081900360840190fd5b60175460ff161515611e58576040805160e560020a62461bcd02815260206004820152601f60248201527f4c6f63616c204e6f646520666565206973206e6f74207265636c61696d656400604482015290519081900360640190fd5b601754610100900460ff161515611eb9576040805160e560020a62461bcd02815260206004820152601960248201527f5465616d20666565206973206e6f74207265636c61696d656400000000000000604482015290519081900360640190fd5b60045460035414611f3a576040805160e560020a62461bcd02815260206004820152602c60248201527f4e6f7420616c6c20696e766573746f72732068617665207265636c61696d656460448201527f2074686569722073686172650000000000000000000000000000000000000000606482015290519081900360840190fd5b60006018541115611fc65760055460035414611fc6576040805160e560020a62461bcd02815260206004820152602e60248201527f4e6f7420616c6c20696e766573746f72732068617665207265636c61696d656460448201527f20746865697220737572706c7573000000000000000000000000000000000000606482015290519081900360840190fd5b60125461136c90600160a060020a0316303161492d565b6011546000908190600160a060020a03163314806120055750600154600160a060020a031633145b1515612049576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614a67833981519152604482015290519081900360640190fd5b6003600954610100900460ff16600681111561206157fe5b1461206b57600080fd5b612073611724565b91508161207f426123b9565b101561208a57600080fd5b600060019054906101000a9004600160a060020a0316600160a060020a03166321f8a72160405160200180807f636f6e74726163742e6e616d6500000000000000000000000000000000000000815250600d01807f72657075746174696f6e00000000000000000000000000000000000000000000815250600a0190506040516020818303038152906040526040518082805190602001908083835b602083106121455780518252601f199092019160209182019101612126565b51815160209384036101000a60001901801990921691161790526040805192909401829003822063ffffffff881660e060020a0283526004830152925160248083019650939450929083900301905081600087803b1580156121a657600080fd5b505af11580156121ba573d6000803e3d6000fd5b505050506040513d60208110156121d057600080fd5b50519050600160a060020a03811615156121e957600080fd5b600054604080517f6c656e64696e672e64656c61794461797300000000000000000000000000000060208083019190915230606060020a026031830152825180830360250181526045909201928390528151610100909404600160a060020a03169363e2a4853a93918291908401908083835b6020831061227b5780518252601f19909201916020918201910161225c565b5181516020939093036101000a60001901801990911692169190911790526040805191909301819003812063ffffffff871660e060020a028252600482015260248101899052915160448084019550600094509092839003019050818387803b1580156122e757600080fd5b505af11580156122fb573d6000803e3d6000fd5b5050505080600160a060020a0316639c6c3439836040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561234857600080fd5b505af115801561235c573d6000803e3d6000fd5b50506009805461ff0019166106001790819055600080516020614a278339815191529250610100900460ff169050600681111561239557fe5b60408051918252519081900360200190a15050565b600e5481565b60095460ff1681565b600c5460075460009162015180029082906123da908363ffffffff6148d016565b9050808410156123ed57600092506123fa565b6123f781856132ee565b92505b5050919050565b60006006600954610100900460ff16600681111561241b57fe5b1461242557600080fd5b600160a060020a03821660009081526002602052604090206001015460ff161561244e57600080fd5b61245782613454565b90506000811161246657600080fd5b600160a060020a03821660009081526002602052604090206001908101805460ff19168217905560045461249f9163ffffffff6148d016565b6004556115f2828261492d565b601154600160a060020a03163314806124cf5750600154600160a060020a031633145b1515612513576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614a67833981519152604482015290519081900360640190fd5b83151561256a576040805160e560020a62461bcd02815260206004820152601960248201527f5f6d617844656c617944617973206d757374206265203e203000000000000000604482015290519081900360640190fd5b6000600954610100900460ff16600681111561258257fe5b146125d7576040805160e560020a62461bcd02815260206004820152601b60248201527f5374617465206d75737420626520556e696e697469616c697a65640000000000604482015290519081900360640190fd5b6000831161262f576040805160e560020a62461bcd02815260206004820152601160248201527f5f74696572206d757374206265203e2030000000000000000000000000000000604482015290519081900360640190fd5b60008211612687576040805160e560020a62461bcd02815260206004820152601d60248201527f5f636f6d6d756e6974794d656d62657273206d757374206265203e2030000000604482015290519081900360640190fd5b6000546040805160e160020a633ab9b2b9026020808301919091527f636f6d6d756e69747900000000000000000000000000000000000000000000006024830152600160a060020a03858116606060020a02602d8401528351808403602101815260419093019384905282516101009095041693637ae1cfca93918291908401908083835b6020831061272b5780518252601f19909201916020918201910161270c565b51815160209384036101000a60001901801990921691161790526040805192909401829003822063ffffffff881660e060020a0283526004830152925160248083019650939450929083900301905081600087803b15801561278c57600080fd5b505af11580156127a0573d6000803e3d6000fd5b505050506040513d60208110156127b657600080fd5b5051151561280e576040805160e560020a62461bcd02815260206004820152601b60248201527f436f6d6d756e697479206973206e6f7420726567697374657265640000000000604482015290519081900360640190fd5b600054604080517f6c656e64696e672e6d617844656c61794461797300000000000000000000000060208083019190915230606060020a026034830152825180830360280181526048909201928390528151610100909404600160a060020a03169363e2a4853a93918291908401908083835b602083106128a05780518252601f199092019160209182019101612881565b5181516020939093036101000a60001901801990911692169190911790526040805191909301819003812063ffffffff871660e060020a0282526004820152602481018b9052915160448084019550600094509092839003019050818387803b15801561290c57600080fd5b505af1158015612920573d6000803e3d6000fd5b5050600054604080517f6c656e64696e672e636f6d6d756e69747900000000000000000000000000000060208083019190915230606060020a026031830152825180830360250181526045909201928390528151610100909404600160a060020a0316955063ca446dd99450909282918401908083835b602083106129b65780518252601f199092019160209182019101612997565b5181516020939093036101000a60001901801990911692169190911790526040805191909301819003812063ffffffff871660e060020a0282526004820152600160a060020a0388166024820152915160448084019550600094509092839003019050818387803b158015612a2a57600080fd5b505af1158015612a3e573d6000803e3d6000fd5b5050600054604080517f6c656e64696e672e6c6f63616c4e6f646500000000000000000000000000000060208083019190915230606060020a026031830152825180830360250181526045909201928390528151610100909404600160a060020a0316955063ca446dd99450909282918401908083835b60208310612ad45780518252601f199092019160209182019101612ab5565b5181516020939093036101000a60001901801990911692169190911790526040805191909301819003812060115463ffffffff881660e060020a0283526004830191909152600160a060020a03166024820152915160448084019550600094509092839003019050818387803b158015612b4d57600080fd5b505af1158015612b61573d6000803e3d6000fd5b5050600054604080517f6c656e64696e672e74696572000000000000000000000000000000000000000060208083019190915230606060020a02602c830152825180830382018152918301928390528151610100909404600160a060020a0316955063e2a4853a9450909282918401908083835b60208310612bf45780518252601f199092019160209182019101612bd5565b5181516020939093036101000a60001901801990911692169190911790526040805191909301819003812063ffffffff871660e060020a0282526004820152602481018a9052915160448084019550600094509092839003019050818387803b158015612c6057600080fd5b505af1158015612c74573d6000803e3d6000fd5b5050600054604080517f6c656e64696e672e636f6d6d756e6974794d656d62657273000000000000000060208083019190915230606060020a0260388301528251808303602c018152604c909201928390528151610100909404600160a060020a0316955063e2a4853a9450909282918401908083835b60208310612d0a5780518252601f199092019160209182019101612ceb565b5181516020939093036101000a60001901801990911692169190911790526040805191909301819003812063ffffffff871660e060020a028252600482015260248101899052915160448084019550600094509092839003019050818387803b158015612d7657600080fd5b505af1158015612d8a573d6000803e3d6000fd5b5050506016849055506009805461ff00191661010090811791829055600080516020614a27833981519152910460ff166006811115612dc557fe5b60408051918252519081900360200190a150505050565b60005460ff1681565b600061161e61271061171861016d611504600d5461170c6064600a546148ef90919063ffffffff16565b60015460a060020a900460ff1681565b606481565b6000546101009004600160a060020a031681565b600d5481565b601154600160a060020a0316331480612e615750600154600160a060020a031633145b1515612ea5576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614a67833981519152604482015290519081900360640190fd5b6003600954610100900460ff166006811115612ebd57fe5b14612f12576040805160e560020a62461bcd02815260206004820152601b60248201527f5374617465206973206e6f74204177616974696e6752657475726e0000000000604482015290519081900360640190fd5b60138190556040805182815290517f499bfdefd9cffe675ab5ceb2d530c45fc77e72ac9993fcafa283fa4f693f58cc9181900360200190a150565b6002602052600090815260409020805460019091015460ff8082169161010090041683565b600154600160a060020a03163314612f8957600080fd5b600154604051600160a060020a03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a26001805473ffffffffffffffffffffffffffffffffffffffff19169055565b601754610100900460ff1681565b601154600160a060020a03163314806130115750600154600160a060020a031633145b1515613055576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614a67833981519152604482015290519081900360640190fd5b60095460ff1615156001146130b4576040805160e560020a62461bcd02815260206004820152600f60248201527f436170206e6f7420726561636865640000000000000000000000000000000000604482015290519081900360640190fd5b6002600954610100900460ff1660068111156130cc57fe5b14613121576040805160e560020a62461bcd02815260206004820152601d60248201527f5374617465206973206e6f742045786368616e67696e67546f46696174000000604482015290519081900360640190fd5b600e8190556018546000101561314a57601854600b546131469163ffffffff6148dd16565b600b555b600e54600b5461315f9163ffffffff6148ef16565b600f55600e5460408051918252517fc58ca3e22df5440a4929f433f6a66fa434ad60e93f5beccf99c9d4e4a8620ca69181900360200190a16009805461ff0019166103001790819055600080516020614a2783398151915290610100900460ff1660068111156131cb57fe5b60408051918252519081900360200190a150565b601154600160a060020a03163314806132025750600154600160a060020a031633145b1515613246576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614a67833981519152604482015290519081900360640190fd5b600b546008541061325657600080fd5b6001600954610100900460ff16600681111561326e57fe5b1461327857600080fd5b600754421161328657600080fd5b6009805461ff0019166104001790819055600080516020614a2783398151915290610100900460ff1660068111156132ba57fe5b60408051918252519081900360200190a1565b60075481565b60155481565b60185481565b601054600160a060020a031681565b60008183111561336e576040805160e560020a62461bcd02815260206004820152602660248201527f6c61737444617465206d75737420626520626967676572207468616e2066697260448201527f7374446174650000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6133886018611504603c818181888a63ffffffff6148dd16565b90505b92915050565b600154600160a060020a031633146133a857600080fd5b60015460a060020a900460ff16156133bf57600080fd5b6001805474ff0000000000000000000000000000000000000000191660a060020a1790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b600160a060020a031660009081526002602052604090206001015460ff808216926101009092041690565b600154600160a060020a031681565b60055481565b600c5481565b6000806005600954610100900460ff16600681111561346f57fe5b14156135035750600160a060020a038216600090815260026020526040812054601854909110156134d157600854600b54600160a060020a0385166000908152600260205260409020546134ce9291611504919063ffffffff6148ef16565b90505b6134fc6127106115046013546115046134e8612de5565b600e5461170c90889063ffffffff6148ef16565b915061355c565b6006600954610100900460ff16600681111561351b57fe5b14156135575750600160a060020a038216600090815260026020526040902054600b546019546134fc919061150490849063ffffffff6148ef16565b600091505b50919050565b60006005600954610100900460ff16600681111561357c57fe5b146135e5576040805160e560020a62461bcd0281526020600482015260216024820152600080516020614a4783398151915260448201527f6400000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a03821660009081526002602052604090206001015460ff1615613659576040805160e560020a62461bcd02815260206004820152601a60248201527f4c656e64657220616c726561647920636f6d70656e7361746564000000000000604482015290519081900360640190fd5b61366282613454565b905060008111612466576040805160e560020a62461bcd02815260206004820152601160248201527f436f6e747269627574696f6e2069732030000000000000000000000000000000604482015290519081900360640190fd5b600061161e6013546115046115fc565b60045481565b600a5481565b6040805190810160405280600e81526020017f7061796d656e744761746577617900000000000000000000000000000000000081525060008060019054906101000a9004600160a060020a0316600160a060020a0316637ae1cfca8333604051602001808060e160020a633ab9b2b90281525060040183805190602001908083835b602083106137795780518252601f19909201916020918201910161375a565b6001836020036101000a03801982511681845116808217855250505050505090500182600160a060020a0316600160a060020a0316606060020a028152601401925050506040516020818303038152906040526040518082805190602001908083835b602083106137fb5780518252601f1990920191602091820191016137dc565b51815160209384036101000a60001901801990921691161790526040805192909401829003822063ffffffff881660e060020a0283526004830152925160248083019650939450929083900301905081600087803b15801561385c57600080fd5b505af1158015613870573d6000803e3d6000fd5b505050506040513d602081101561388657600080fd5b50519050801515613907576040805160e560020a62461bcd02815260206004820152602560248201527f53656e646572206e6f74207265676973746572656420696e204574686963487560448201527f622e636f6d000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60015460a060020a900460ff161561391e57600080fd5b610e3083610ec9565b60006005600954610100900460ff16600681111561394157fe5b146139aa576040805160e560020a62461bcd0281526020600482015260216024820152600080516020614a4783398151915260448201527f6400000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b601754610100900460ff1615613a30576040805160e560020a62461bcd02815260206004820152602560248201527f4574686963487562207465616d27732066656520616c7265616479207265636c60448201527f61696d6564000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b613a58601354611504612710611504606461170c601454600f546148ef90919063ffffffff16565b905060008111613ab2576040805160e560020a62461bcd02815260206004820152601860248201527f45746869634875622773207465616d2066656520697320300000000000000000604482015290519081900360640190fd5b6017805461ff00191661010017905560125461136c90600160a060020a03168261492d565b600954610100900460ff1681565b60008054604080517f617262697465720000000000000000000000000000000000000000000000000060208083019190915230606060020a0260278301528251808303601b018152603b909201928390528151610100909404600160a060020a0316936321f8a72193918291908401908083835b60208310613b785780518252601f199092019160209182019101613b59565b51815160209384036101000a60001901801990921691161790526040805192909401829003822063ffffffff881660e060020a0283526004830152925160248083019650939450929083900301905081600087803b158015613bd957600080fd5b505af1158015613bed573d6000803e3d6000fd5b505050506040513d6020811015613c0357600080fd5b50519050600160a060020a0381163314613c55576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614a67833981519152604482015290519081900360640190fd5b600160a060020a0382161515613cb5576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f20626f72726f776572207365740000000000000000000000000000000000604482015290519081900360640190fd5b6000546040805160e160020a633ab9b2b9026020808301919091527f726570726573656e7461746976650000000000000000000000000000000000006024830152600160a060020a03868116606060020a0260328401528351808403602601815260469093019384905282516101009095041693637ae1cfca93918291908401908083835b60208310613d595780518252601f199092019160209182019101613d3a565b51815160209384036101000a60001901801990921691161790526040805192909401829003822063ffffffff881660e060020a0283526004830152925160248083019650939450929083900301905081600087803b158015613dba57600080fd5b505af1158015613dce573d6000803e3d6000fd5b505050506040513d6020811015613de457600080fd5b50511515613e62576040805160e560020a62461bcd02815260206004820152602660248201527f426f72726f776572206e6f74207265676973746572656420726570726573656e60448201527f7461746976650000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6010805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384811691909117918290556040519116907f6adac3ed7dd72483b9de68eaf670500779a4bfbef4b611ffcd782b9085aa7e1090600090a25050565b60004260065411158015613ed5575042600754115b801561161e57505060095460ff161590565b60145481565b60035481565b60006005600954610100900460ff166006811115613f0d57fe5b14613f76576040805160e560020a62461bcd0281526020600482015260216024820152600080516020614a4783398151915260448201527f6400000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60175460ff1615613ff7576040805160e560020a62461bcd02815260206004820152602260248201527f4c6f63616c204e6f646527732066656520616c7265616479207265636c61696d60448201527f6564000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b61401f601354611504612710611504606461170c601554600f546148ef90919063ffffffff16565b905060008111614079576040805160e560020a62461bcd02815260206004820152601a60248201527f4c6f63616c204e6f64652773207465616d206665652069732030000000000000604482015290519081900360640190fd5b6017805460ff1916600117905560115461136c90600160a060020a03168261492d565b600f5481565b60135481565b60006004600954610100900460ff1660068111156140c257fe5b14614117576040805160e560020a62461bcd02815260206004820152601d60248201527f5374617465206973206e6f742050726f6a6563744e6f7446756e646564000000604482015290519081900360640190fd5b600160a060020a03821660009081526002602052604090206001015460ff161561418b576040805160e560020a62461bcd02815260206004820152601e60248201527f436f6e747269627574696f6e20616c7265616479207265636c61696d65640000604482015290519081900360640190fd5b50600160a060020a038116600090815260026020526040812054908111612466576040805160e560020a62461bcd02815260206004820152601160248201527f436f6e747269627574696f6e2069732030000000000000000000000000000000604482015290519081900360640190fd5b600154600160a060020a0316331461421357600080fd5b61136c816149a8565b600160a060020a031660009081526002602052604090205490565b60195481565b60008080808080614254888863ffffffff6148d016565b9250600091506000905088831015801561426d57508888105b1561429e5760019150614286838a63ffffffff6148dd16565b9050614298878263ffffffff6148dd16565b96508892505b91989097509095509350505050565b60008060008060019054906101000a9004600160a060020a0316600160a060020a03166321f8a72160405160200180807f636f6e74726163742e6e616d6500000000000000000000000000000000000000815250600d01807f72657075746174696f6e00000000000000000000000000000000000000000000815250600a0190506040516020818303038152906040526040518082805190602001908083835b6020831061436c5780518252601f19909201916020918201910161434d565b51815160209384036101000a60001901801990921691161790526040805192909401829003822063ffffffff881660e060020a0283526004830152925160248083019650939450929083900301905081600087803b1580156143cd57600080fd5b505af11580156143e1573d6000803e3d6000fd5b505050506040513d60208110156143f757600080fd5b50519250600160a060020a038316151561441057600080fd5b614419426123b9565b915060008211156145a057600054604080517f6c656e64696e672e64656c61794461797300000000000000000000000000000060208083019190915230606060020a026031830152825180830360250181526045909201928390528151610100909404600160a060020a03169363e2a4853a93918291908401908083835b602083106144b65780518252601f199092019160209182019101614497565b5181516020939093036101000a60001901801990911692169190911790526040805191909301819003812063ffffffff871660e060020a028252600482015260248101899052915160448084019550600094509092839003019050818387803b15801561452257600080fd5b505af1158015614536573d6000803e3d6000fd5b5050505082600160a060020a0316639c6c3439836040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561458357600080fd5b505af1158015614597573d6000803e3d6000fd5b50505050610e30565b6147216001600060019054906101000a9004600160a060020a0316600160a060020a031663bd02d0f53060165460405160200180807f636f6d6d756e6974792e636f6d706c6574656450726f6a65637473427954696581526020017f720000000000000000000000000000000000000000000000000000000000000081525060210183600160a060020a0316600160a060020a0316606060020a028152601401828152602001925050506040516020818303038152906040526040518082805190602001908083835b602083106146885780518252601f199092019160209182019101614669565b51815160209384036101000a60001901801990921691161790526040805192909401829003822063ffffffff881660e060020a0283526004830152925160248083019650939450929083900301905081600087803b1580156146e957600080fd5b505af11580156146fd573d6000803e3d6000fd5b505050506040513d602081101561471357600080fd5b50519063ffffffff6148d016565b600054601654604080517f636f6d6d756e6974792e636f6d706c6574656450726f6a6563747342795469656020808301919091527f72000000000000000000000000000000000000000000000000000000000000008284015230606060020a026041830152605580830194909452825180830390940184526075909101918290528251949550610100909304600160a060020a03169363e2a4853a938291908401908083835b602083106147e65780518252601f1990920191602091820191016147c7565b5181516020939093036101000a60001901801990911692169190911790526040805191909301819003812063ffffffff871660e060020a028252600482015260248101889052915160448084019550600094509092839003019050818387803b15801561485257600080fd5b505af1158015614866573d6000803e3d6000fd5b5050505082600160a060020a03166337681083826040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b1580156148b357600080fd5b505af11580156148c7573d6000803e3d6000fd5b50505050505050565b8181018281101561338b57fe5b6000828211156148e957fe5b50900390565b60008215156149005750600061338b565b5081810281838281151561491057fe5b041461338b57fe5b6000818381151561492557fe5b049392505050565b303181111561497257604051600160a060020a03831690303180156108fc02916000818181858888f1935050505015801561496c573d6000803e3d6000fd5b506115f2565b604051600160a060020a0383169082156108fc029083906000818181858888f19350505050158015610e30573d6000803e3d6000fd5b600160a060020a03811615156149bd57600080fd5b600154604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055560049628ca47affc2c0364f092b96d5c6037157da8dd90c96c281f775bd576a45b95374617465206973206e6f7420436f6e747269627574696f6e52657475726e6553656e646572206e6f7420617574686f72697a65640000000000000000000000a165627a7a72305820f118f2d354a9d995675478712288c36d4f2844367bb14225308ab2e5399390100029

Deployed Bytecode Sourcemap

5583:25033:0:-;;;;;;;;;-1:-1:-1;;;5583:25033:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4710:6;;-1:-1:-1;;;4710:6:0;;;;4709:7;4701:16;;;;;;13709:27;13700:5;;;;;;;:36;;;;;;;;;:84;;;-1:-1:-1;13749:35:0;13740:5;;;;;;;:44;;;;;;;;;13700:84;:126;;;-1:-1:-1;13797:29:0;13788:5;;;;;;;:38;;;;;;;;;13700:126;13692:170;;;;;;;-1:-1:-1;;;;;13692:170:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13885:27;13876:5;;;;;;;:36;;;;;;;;;13873:481;;;13929:19;:17;:19::i;:::-;13873:481;;;13979:29;13970:5;;;;;;;:38;;;;;;;;;13966:388;;;14113:20;:18;:20::i;13966:388::-;14174:15;;14208:48;;;-1:-1:-1;;;;;14208:48:0;;;;;;;;;;;;;14245:10;-1:-1:-1;;;14208:48:0;;;;;;;26:21:-1;;;22:32;;6:49;;14208:48:0;;;;;;;14198:59;;14174:15;;;;-1:-1:-1;;;;;14174:15:0;;:23;;14208:48;;;14198:59;;;;;14208:48;14198:59;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;14198:59:0;;;;;;;;;;;;14174:84;;;-1:-1:-1;;;14174:84:0;;;;;;;;;;;;;;-1:-1:-1;263:2;;-1:-1;14174:84:0;;;;;;;-1:-1:-1;14174:84:0;-1:-1:-1;14174:84:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;14174:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14174:84:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14174:84:0;14166:128;;;;;;;-1:-1:-1;;;;;14166:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14309:33;14331:10;14309:21;:33::i;:::-;5583:25033;6406:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6406:31:0;;;;;;;;;;;;;;;;;;;;7290:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7290:33:0;;;;;;;;;;;;;;;;;;;;;;7232:51;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7232:51:0;;;;6771:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6771:24:0;;;;;;;;-1:-1:-1;;;;;6771:24:0;;;;;;;;;;;;;;25772:327;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25772:327:0;;;;6541:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6541:33:0;;;;6995:19;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6995:19:0;;;;18645:772;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;18645:772:0;-1:-1:-1;;;;;18645:772:0;;;;;6160:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6160:31:0;;;;28670:175;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28670:175:0;;;;6802:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6802:27:0;;;;5155:95;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5155:95:0;;;;28054:381;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28054:381:0;;;;30168:163;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30168:163:0;;;;12745:888;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;12745:888:0;-1:-1:-1;;;;;12745:888:0;;;;;;;;;;21042:668;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21042:668:0;;;;15147:672;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15147:672:0;;;;6654:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6654:36:0;;;;6444:22;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6444:22:0;;;;27159:345;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27159:345:0;;;;;17424:519;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17424:519:0;-1:-1:-1;;;;;17424:519:0;;;;;11150:1220;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11150:1220:0;;;;;;;-1:-1:-1;;;;;11150:1220:0;;;;;5288:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5288:20:0;;;;;;;;;;;;;;;;;;;;;;;28486:176;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28486:176:0;;;;4534:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4534:26:0;;;;7179:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7179:46:0;;;;5317:77;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5317:77:0;;;;6614:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6614:33:0;;;;15827:337;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15827:337:0;;;;;5989:45;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5989:45:0;-1:-1:-1;;;;;5989:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;668:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;668:114:0;;;;7330:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7330:36:0;;;;16605:647;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16605:647:0;;;;;14817:322;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14817:322:0;;;;6284:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6284:29:0;;;;6961:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6961:27:0;;;;7373:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7373:25:0;;;;6741:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6741:23:0;;;;27682:248;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27682:248:0;;;;;;;4975:93;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4975:93:0;;;;30339:274;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30339:274:0;-1:-1:-1;;;;;30339:274:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50:20:0;;;;6120:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6120:33:0;;;;6581:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6581:26:0;;;;29305:855;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;29305:855:0;-1:-1:-1;;;;;29305:855:0;;;;;19425:555;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19425:555:0;-1:-1:-1;;;;;19425:555:0;;;;;28853:147;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28853:147:0;;;;6076:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6076:37:0;;;;6505:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6505:29:0;;;;23052:176;;-1:-1:-1;;;;;23052:176:0;;;;;20509:525;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20509:525:0;;;;6473:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6473:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12378:359;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;12378:359:0;-1:-1:-1;;;;;12378:359:0;;;;;29008:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29008:148:0;;;;6928:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6928:26:0;;;;6041:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6041:28:0;;;;19988:513;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19988:513:0;;;;6697:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6697:37:0;;;;6878:43;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6878:43:0;;;;18102:535;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;18102:535:0;-1:-1:-1;;;;;18102:535:0;;;;;950:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;950:105:0;-1:-1:-1;;;;;950:105:0;;;;;29164:133;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;29164:133:0;-1:-1:-1;;;;;29164:133:0;;;;;7405:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7405:26:0;;;;21963:983;22256:19;;;22029:27;22020:5;;;;;;;:36;;;;;;;;;22012:76;;;;;-1:-1:-1;;;;;22012:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22121:8;;-1:-1:-1;;;;;22121:8:0;22107:10;:22;22099:62;;;;;-1:-1:-1;;;;;22099:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22180:28;;22211:1;-1:-1:-1;22172:73:0;;;;;-1:-1:-1;;;;;22172:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22368:37:0;;;22395:9;22368:37;;;;22278:5;;-1:-1:-1;22278:5:0;;;;22383:10;;22368:37;;;;;;;;;;22468:68;22489:22;:20;:22::i;:::-;22513:11;;22526:9;22468:20;:68::i;:::-;22547:11;:28;;;22416:120;;-1:-1:-1;22416:120:0;-1:-1:-1;22416:120:0;-1:-1:-1;22608:4:0;22590:22;;;;22586:255;;;22650:46;22676:14;;22692:3;22650:25;:46::i;:::-;22629:18;:67;22711:5;:41;;-1:-1:-1;;22711:41:0;;;;;;;-1:-1:-1;;;;;;;;;;;22772:24:0;22711:41;22789:5;;;;22784:11;;;;;;;;22772:24;;;;;;;;;;;;;;;22811:18;:16;:18::i;:::-;22873:1;22855:15;:19;22851:88;;;22891:36;;:10;;:36;;;;;22911:15;;22891:36;;;;22911:15;22891:10;:36;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22891:36:0;22851:88;21963:983;;;:::o;14369:288::-;14436:29;14427:5;;;;;;;:38;;;;;;;;;14419:47;;;;;;14499:8;;-1:-1:-1;;;;;14499:8:0;14485:10;:22;14477:31;;;;;;14532:10;;:25;;14547:9;14532:25;:14;:25;:::i;:::-;14519:10;:38;;;14590:18;;-1:-1:-1;14576:32:0;14568:41;;;;;;14625:24;;;14639:9;14625:24;;;;;;;;;;;;;14369:288::o;23506:1374::-;4710:6;;23789:24;;;;;;-1:-1:-1;;;4710:6:0;;;;4709:7;4701:16;;;;;;23609:35;23600:5;;;;;;;:44;;;;;;;;;23592:92;;;;;-1:-1:-1;;;;;23592:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23703:24;:22;:24::i;:::-;23695:81;;;;;;;-1:-1:-1;;;;;23695:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23816:16;;23789:43;;23870:1;23843:28;;23908:1;23882:27;;23976:72;23997:18;;24017:19;24038:9;23976:20;:72::i;:::-;23942:10;23920:128;;-1:-1:-1;;23920:128:0;;;;;;;;;;;;24059:16;:38;;;;;-1:-1:-1;23920:128:0;;-1:-1:-1;23920:128:0;24112:10;24108:111;;;24156:3;24139:14;:20;;;24179:28;;;;;;;;;;;;;;;;24108:111;-1:-1:-1;;;;;24233:22:0;;;;;;:9;:22;;;;;:29;:34;24229:103;;;24300:13;;:20;;24318:1;24300:20;:17;:20;:::i;:::-;24284:13;:36;24229:103;24367:1;24346:18;:22;24342:531;;;24385:40;;-1:-1:-1;;;;;24385:20:0;;;:40;;;;;24406:18;;24385:40;;;;24406:18;24385:20;:40;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;;;;24472:22:0;;;;;;:9;:22;;;;;:29;:68;;24521:18;;24472:44;;24506:9;24472:44;:33;:44;:::i;:::-;:48;:68;:48;:68;:::i;:::-;-1:-1:-1;;;;;24440:22:0;;;;;;:9;:22;;;;;:100;;;;24560:98;24575:19;24609:33;:9;24623:18;24609:33;:13;:33;:::i;:::-;24644:13;;24560:98;;;;;;;;;;;;;;;;;;;;;;;;;;24342:531;;;-1:-1:-1;;;;;24723:22:0;;;;;;:9;:22;;;;;:29;:44;;24757:9;24723:44;:33;:44;:::i;:::-;-1:-1:-1;;;;;24691:22:0;;;;;;:9;:22;;;;;;;;;:76;;;;24847:13;;24787:74;;;;;24836:9;24787:74;;;;;;;;;;;;24691:22;;24787:74;;;;;;;;;;23506:1374;;;;:::o;6406:31::-;;;;:::o;7290:33::-;;;;;;:::o;7232:51::-;7278:5;7232:51;:::o;6771:24::-;;;-1:-1:-1;;;;;6771:24:0;;:::o;25772:327::-;8788:9;;-1:-1:-1;;;;;8788:9:0;8801:10;8788:23;;:46;;-1:-1:-1;8815:5:0;;-1:-1:-1;;;;;8815:5:0;8824:10;8815:19;8788:46;8780:79;;;;;;;-1:-1:-1;;;;;8780:79:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8780:79:0;;;;;;;;;;;;;;;25891:35;25882:5;;;;;;;:44;;;;;;;;;25874:53;;;;;;25946:10;;;;25938:19;;;;;;;;25968:5;:37;;-1:-1:-1;;25968:37:0;;;;;;;-1:-1:-1;;;;;;;;;;;26021:24:0;25968:37;26038:5;;;;26033:11;;;;;;;;26021:24;;;;;;;;;;;;;;;26056:8;;26074:16;;26056:35;;-1:-1:-1;;;;;26056:8:0;;;;:35;;;;;26074:16;26056:8;:35;:8;:35;26074:16;26056:8;:35;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26056:35:0;25772:327::o;6541:33::-;;;;:::o;6995:19::-;;;;:::o;18645:772::-;18996:27;18734:1;18721:10;;:14;18713:41;;;;;;;-1:-1:-1;;;;;18713:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18834:29;18825:5;;;;;;;:38;;;;;;;;;;18817:76;;;;;-1:-1:-1;;;;;18817:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18913:22:0;;;;;;:9;:22;;;;;:42;;;;;;;;18912:43;18904:81;;;;;-1:-1:-1;;;;;18904:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19026:85;19076:34;19091:18;;19076:10;;:14;;:34;;;;:::i;:::-;19060:10;;-1:-1:-1;;;;;19026:22:0;;;;;;:9;:22;;;;;:29;:45;;;:33;:45;:::i;:::-;:49;:85;:49;:85;:::i;:::-;18996:115;-1:-1:-1;19152:1:0;19130:23;;19122:48;;;;;-1:-1:-1;;;;;19122:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19181:22:0;;;;;;:9;:22;;;;;19226:4;19181:42;;;:49;;-1:-1:-1;;19181:49:0;;;;;19262:18;;:25;;;:22;:25;:::i;:::-;19241:18;:46;19303:52;;;;;;;;-1:-1:-1;;;;;19303:52:0;;;;;;;;;;;;;19366:43;19376:11;19389:19;19366:9;:43::i;:::-;18645:772;;:::o;6160:31::-;;;;:::o;28670:175::-;28726:7;28753:84;7278:5;28753:59;28780:31;:29;:31::i;:::-;28753:22;;;:59;:26;:59;:::i;:84::-;28746:91;;28670:175;:::o;6802:27::-;;;-1:-1:-1;;;;;6802:27:0;;:::o;5155:95::-;553:5;;-1:-1:-1;;;;;553:5:0;539:10;:19;531:28;;;;;;4870:6;;-1:-1:-1;;;4870:6:0;;;;4862:15;;;;;;;;5209:6;:14;;-1:-1:-1;;5209:14:0;;;5235:9;;;;5218:5;;5235:9;5155:95::o;28054:381::-;28115:7;28141:286;7278:5;28141:247;28354:33;7222:3;28354:11;;:15;;:33;;;;:::i;:::-;28300:12;;28141:194;;28300:34;;7222:3;28300:34;:16;:34;:::i;:::-;28141:140;28277:3;28141:131;28225:46;28251:14;;28267:3;28225:25;:46::i;:::-;28141:14;;:36;;7222:3;28141:36;:18;:36;:::i;:::-;:83;:131;:83;:131;:::i;:140::-;:158;:194;:158;:194;:::i;30168:163::-;30215:7;30241:15;;30275:46;;;;;;;;;;;;30316:4;-1:-1:-1;;;30275:46:0;;;;;;;26:21:-1;;;22:32;;6:49;;30275:46:0;;;;;;;;30265:57;;30241:15;;;;-1:-1:-1;;;;;30241:15:0;;:23;;30275:46;;;30265:57;;;;;30275:46;30265:57;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;30265:57:0;;;;;;;;;;;;30241:82;;;-1:-1:-1;;;30241:82:0;;;;;;;;;;;;;;-1:-1:-1;263:2;;-1:-1;30241:82:0;;;;;;;-1:-1:-1;30241:82:0;-1:-1:-1;30241:82:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;30241:82:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30241:82:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30241:82:0;;-1:-1:-1;30168:163:0;:::o;12745:888::-;8553:15;8571;;8608:33;;;;;;;;;;;;8636:4;-1:-1:-1;;;8608:33:0;;;;;;;26:21:-1;;;22:32;;6:49;;8608:33:0;;;;;;;;8598:44;;8571:15;;;;-1:-1:-1;;;;;8571:15:0;;:26;;8608:33;;;8598:44;;;;;8608:33;8598:44;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;8598:44:0;;;;;;;;;;;;8571:72;;;-1:-1:-1;;;8571:72:0;;;;;;;;;;;;;;-1:-1:-1;263:2;;-1:-1;8571:72:0;;;;;;;-1:-1:-1;8571:72:0;-1:-1:-1;8571:72:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;8571:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8571:72:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8571:72:0;;-1:-1:-1;;;;;;8662:21:0;;8673:10;8662:21;8654:55;;;;;-1:-1:-1;;;;;8654:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8654:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;12861:25:0;;;;12853:34;;;;;;12906:15;;12940:49;;;-1:-1:-1;;;;;12940:49:0;;;;;;;;;;;;;-1:-1:-1;;;;;12940:49:0;;;-1:-1:-1;;;12940:49:0;;;;;;;26:21:-1;;;22:32;;6:49;;12940::0;;;;;;;12930:60;;12906:15;;;;;;:23;;12940:49;;;12930:60;;;;;12940:49;12930:60;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;12930:60:0;;;;;;;;;;;;12906:85;;;-1:-1:-1;;;12906:85:0;;;;;;;;;;;;;;-1:-1:-1;263:2;;-1:-1;12906:85:0;;;;;;;-1:-1:-1;12906:85:0;-1:-1:-1;12906:85:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;12906:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12906:85:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12906:85:0;12898:94;;;;;;;;-1:-1:-1;;;;;13071:22:0;;;;;;:9;:22;;;;;:29;:34;;13063:43;;;;;;-1:-1:-1;;;;;13235:22:0;;;;;;:9;:22;;;;;:29;:34;13227:43;;;;;;-1:-1:-1;;;;;13313:22:0;;;;;;;:9;:22;;;;;;:29;;13281:22;;;;;;;;;:61;;;13392:36;;;;;;13353;;;;:75;;-1:-1:-1;;13353:75:0;13392:36;;;;13353:75;;;;;;13484:42;;-1:-1:-1;;13439:87:0;;;13392:36;13484:42;;;;;;;13439:87;;;;;;;;;13544:22;;;13537:29;;;;;;-1:-1:-1;;13537:29:0;;;;13582:43;;;13313:22;13582:43;12745:888;;;:::o;21042:668::-;8553:15;8571;;8608:33;;;;;;;;;;;;8636:4;-1:-1:-1;;;8608:33:0;;;;;;;26:21:-1;;;22:32;;6:49;;8608:33:0;;;;;;;;8598:44;;8571:15;;;;-1:-1:-1;;;;;8571:15:0;;:26;;8608:33;;;8598:44;;;;;8608:33;8598:44;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;8598:44:0;;;;;;;;;;;;8571:72;;;-1:-1:-1;;;8571:72:0;;;;;;;;;;;;;;-1:-1:-1;263:2;;-1:-1;8571:72:0;;;;;;;-1:-1:-1;8571:72:0;-1:-1:-1;8571:72:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;8571:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8571:72:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8571:72:0;;-1:-1:-1;;;;;;8662:21:0;;8673:10;8662:21;8654:55;;;;;-1:-1:-1;;;;;8654:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8654:55:0;;;;;;;;;;;;;;;21124:33;21115:5;;;;;;;:42;;;;;;;;;:75;;;-1:-1:-1;21170:20:0;21161:5;;;;;;;:29;;;;;;;;;21115:75;21107:132;;;;;;;-1:-1:-1;;;;;21107:132:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21107:132:0;;;;;;;;;;;;;;;;;;;;21258:21;;;;21250:65;;;;;;;-1:-1:-1;;;;;21250:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21334:24;;;;;;;21326:62;;;;;;;-1:-1:-1;;;;;21326:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21424:22;;21407:13;;:39;21399:96;;;;;-1:-1:-1;;;;;21399:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21522:1;21509:10;;:14;21506:140;;;21565:18;;21548:13;;:35;21540:94;;;;;-1:-1:-1;;;;;21540:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21666:12;;21656:46;;-1:-1:-1;;;;;21666:12:0;21688:4;21680:21;21656:9;:46::i;15147:672::-;8788:9;;15277:17;;;;-1:-1:-1;;;;;8788:9:0;8801:10;8788:23;;:46;;-1:-1:-1;8815:5:0;;-1:-1:-1;;;;;8815:5:0;8824:10;8815:19;8788:46;8780:79;;;;;;;-1:-1:-1;;;;;8780:79:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8780:79:0;;;;;;;;;;;;;;;15238:27;15229:5;;;;;;;:36;;;;;;;;;15221:45;;;;;;15297:17;:15;:17::i;:::-;15277:37;;15354:12;15333:17;15346:3;15333:12;:17::i;:::-;:33;;15325:42;;;;;;15447:15;;;;;;;;;-1:-1:-1;;;;;15447:15:0;-1:-1:-1;;;;;15447:26:0;;15484:47;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;15484:47:0;;;15474:58;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;15474:58:0;;;;;;;;;;;;15447:86;;;-1:-1:-1;;;15447:86:0;;;;;;;;;;;;;;-1:-1:-1;263:2;;-1:-1;15447:86:0;;;;;;;-1:-1:-1;15447:86:0;-1:-1:-1;15447:86:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;15447:86:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15447:86:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15447:86:0;;-1:-1:-1;;;;;;15553:24:0;;;;15545:33;;;;;;15589:15;;15623:43;;;;;;;;;;;;15661:4;-1:-1:-1;;;15623:43:0;;;;;;;26:21:-1;;;22:32;;6:49;;15623:43:0;;;;;;;;15613:54;;15589:15;;;;-1:-1:-1;;;;;15589:15:0;;:23;;15623:43;;;15613:54;;;;;15623:43;15613:54;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;15613:54:0;;;;;;;;;;;;15589:93;;;-1:-1:-1;;;15589:93:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;15589:93:0;;;;;;;-1:-1:-1;15589:93:0;-1:-1:-1;15589:93:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;15589:93:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15589:93:0;;;;15693:10;-1:-1:-1;;;;;15693:25:0;;15719:12;15693:39;;;;;-1:-1:-1;;;15693:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15693:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;15743:5:0;:28;;-1:-1:-1;;15743:28:0;;;;;;;-1:-1:-1;;;;;;;;;;;15787:24:0;-1:-1:-1;15743:28:0;15804:5;;;;;-1:-1:-1;15751:20:0;15799:11;;;;;;;15787:24;;;;;;;;;;;;;;;15147:672;;:::o;6654:36::-;;;;:::o;6444:22::-;;;;;;:::o;27159:345::-;27255:11;;27305:14;;27212:4;;27269:6;27255:20;;27212:4;;27305:38;;27255:20;27305:38;:18;:38;:::i;:::-;27286:57;;27365:11;27358:4;:18;27354:143;;;27400:1;27393:8;;;;27354:143;27441:44;27467:11;27480:4;27441:25;:44::i;:::-;27434:51;;27354:143;27159:345;;;;;:::o;17424:519::-;17677:20;17518;17509:5;;;;;;;:29;;;;;;;;;17501:38;;;;;;-1:-1:-1;;;;;17559:22:0;;;;;;:9;:22;;;;;:36;;;;;17558:37;17550:46;;;;;;17700:33;17721:11;17700:20;:33::i;:::-;17677:56;-1:-1:-1;17767:1:0;17752:16;;17744:25;;;;;;-1:-1:-1;;;;;17780:22:0;;;;;;:9;:22;;;;;17819:4;17780:36;;;:43;;-1:-1:-1;;17780:43:0;;;;;17859:22;;:29;;;:26;:29;:::i;:::-;17834:22;:54;17899:36;17909:11;17922:12;17899:9;:36::i;11150:1220::-;8788:9;;-1:-1:-1;;;;;8788:9:0;8801:10;8788:23;;:46;;-1:-1:-1;8815:5:0;;-1:-1:-1;;;;;8815:5:0;8824:10;8815:19;8788:46;8780:79;;;;;;;-1:-1:-1;;;;;8780:79:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8780:79:0;;;;;;;;;;;;;;;11324:18;;;11316:56;;;;;-1:-1:-1;;;;;11316:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11400:26;11391:5;;;;;;;:35;;;;;;;;;11383:75;;;;;-1:-1:-1;;;;;11383:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11485:1;11477:9;;11469:39;;;;;-1:-1:-1;;;;;11469:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11547:1;11527:21;;11519:63;;;;;-1:-1:-1;;;;;11519:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11601:15;;11635:49;;;-1:-1:-1;;;;;11635:49:0;;;;;;;;;;;;;-1:-1:-1;;;;;11635:49:0;;;-1:-1:-1;;;11635:49:0;;;;;;;26:21:-1;;;22:32;;6:49;;11635::0;;;;;;;;11625:60;;11601:15;;;;;;:23;;11635:49;;;11625:60;;;;;11635:49;11625:60;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;11625:60:0;;;;;;;;;;;;11601:85;;;-1:-1:-1;;;11601:85:0;;;;;;;;;;;;;;-1:-1:-1;263:2;;-1:-1;11601:85:0;;;;;;;-1:-1:-1;11601:85:0;-1:-1:-1;11601:85:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;11601:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11601:85:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11601:85:0;11593:125;;;;;;;-1:-1:-1;;;;;11593:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11729:15;;11763:46;;;;;;;;;;;;11804:4;-1:-1:-1;;;11763:46:0;;;;;;;26:21:-1;;;22:32;;6:49;;11763:46:0;;;;;;;;11753:57;;11729:15;;;;-1:-1:-1;;;;;11729:15:0;;:23;;11763:46;;;11753:57;;;;;11763:46;11753:57;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;11753:57:0;;;;;;;;;;;;11729:97;;;-1:-1:-1;;;11729:97:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;11729:97:0;;;;;;;-1:-1:-1;11729:97:0;-1:-1:-1;11729:97:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;11729:97:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;11837:15:0;;11874:43;;;;;;;;;;;;11912:4;-1:-1:-1;;;11874:43:0;;;;;;;26:21:-1;;;22:32;;6:49;;11874:43:0;;;;;;;;11864:54;;11837:15;;;;-1:-1:-1;;;;;11837:15:0;;-1:-1:-1;11837:26:0;;-1:-1:-1;11874:43:0;;;;11864:54;;;;11874:43;11864:54;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;11864:54:0;;;;;;;;;;;;11837:94;;;-1:-1:-1;;;11837:94:0;;;;;;;-1:-1:-1;;;;;11837:94:0;;;;;;;;;;;;;-1:-1:-1;;;;11837:94:0;;;;;;;-1:-1:-1;11837:94:0;-1:-1:-1;11837:94:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;11837:94:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;11942:15:0;;11979:43;;;;;;;;;;;;12017:4;-1:-1:-1;;;11979:43:0;;;;;;;26:21:-1;;;22:32;;6:49;;11979:43:0;;;;;;;;11969:54;;11942:15;;;;-1:-1:-1;;;;;11942:15:0;;-1:-1:-1;11942:26:0;;-1:-1:-1;11979:43:0;;;;11969:54;;;;11979:43;11969:54;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;11969:54:0;;;;;;;;;;;;12025:9;;11942:93;;;-1:-1:-1;;;11942:93:0;;;;;;;;;;-1:-1:-1;;;;;12025:9:0;11942:93;;;;;;;;;;;-1:-1:-1;;;;11942:93:0;;;;;;;-1:-1:-1;11942:93:0;-1:-1:-1;11942:93:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;11942:93:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;12046:15:0;;12080:38;;;;;;;;;;;;12113:4;-1:-1:-1;;;12080:38:0;;;;;;;26:21:-1;;;22:32;;6:49;;12080:38:0;;;;;;;12070:49;;12046:15;;;;-1:-1:-1;;;;;12046:15:0;;-1:-1:-1;12046:23:0;;-1:-1:-1;12080:38:0;;;;12070:49;;;;12080:38;12070:49;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;12070:49:0;;;;;;;;;;;;12046:81;;;-1:-1:-1;;;12046:81:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;12046:81:0;;;;;;;-1:-1:-1;12046:81:0;-1:-1:-1;12046:81:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;12046:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;12138:15:0;;12172:50;;;;;;;;;;;;12217:4;-1:-1:-1;;;12172:50:0;;;;;;;26:21:-1;;;22:32;;6:49;;12172:50:0;;;;;;;;12162:61;;12138:15;;;;-1:-1:-1;;;;;12138:15:0;;-1:-1:-1;12138:23:0;;-1:-1:-1;12172:50:0;;;;12162:61;;;;12172:50;12162:61;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;12162:61:0;;;;;;;;;;;;12138:105;;;-1:-1:-1;;;12138:105:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;12138:105:0;;;;;;;-1:-1:-1;12138:105:0;-1:-1:-1;12138:105:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;12138:105:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;12254:4:0;:12;;;-1:-1:-1;12277:5:0;:43;;-1:-1:-1;;12277:43:0;;;;;;;;;-1:-1:-1;;;;;;;;;;;12336:24:0;12353:5;;;12348:11;;;;;;;;12336:24;;;;;;;;;;;;;;;11150:1220;;;;:::o;5288:20::-;;;;;;:::o;28486:176::-;28534:7;28560:94;7278:5;28560:69;28625:3;28560:60;28601:18;;28560:36;7222:3;28560:14;;:18;;:36;;;;:::i;4534:26::-;;;-1:-1:-1;;;4534:26:0;;;;;:::o;7179:46::-;7222:3;7179:46;:::o;5317:77::-;;;;;;-1:-1:-1;;;;;5317:77:0;;:::o;6614:33::-;;;;:::o;15827:337::-;8788:9;;-1:-1:-1;;;;;8788:9:0;8801:10;8788:23;;:46;;-1:-1:-1;8815:5:0;;-1:-1:-1;;;;;8815:5:0;8824:10;8815:19;8788:46;8780:79;;;;;;;-1:-1:-1;;;;;8780:79:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8780:79:0;;;;;;;;;;;;;;;15965:27;15956:5;;;;;;;:36;;;;;;;;;15948:76;;;;;-1:-1:-1;;;;;15948:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16035:28;:60;;;16111:45;;;;;;;;;;;;;;;;;15827:337;:::o;5989:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;668:114::-;553:5;;-1:-1:-1;;;;;553:5:0;539:10;:19;531:28;;;;;;745:5;;726:25;;-1:-1:-1;;;;;745:5:0;;;;726:25;;745:5;;726:25;758:5;:18;;-1:-1:-1;;758:18:0;;;668:114::o;7330:36::-;;;;;;;;;:::o;16605:647::-;8788:9;;-1:-1:-1;;;;;8788:9:0;8801:10;8788:23;;:46;;-1:-1:-1;8815:5:0;;-1:-1:-1;;;;;8815:5:0;8824:10;8815:19;8788:46;8780:79;;;;;;;-1:-1:-1;;;;;8780:79:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8780:79:0;;;;;;;;;;;;;;;16725:10;;;;:18;;:10;:18;16717:46;;;;;-1:-1:-1;;;;;16717:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16791:29;16782:5;;;;;;;:38;;;;;;;;;16774:80;;;;;-1:-1:-1;;;;;16774:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16865:21;:46;;;16926:10;;16939:1;-1:-1:-1;16922:102:0;;;17001:10;;16978:18;;:34;;;:22;:34;:::i;:::-;16957:18;:55;16922:102;17082:21;;17059:18;;:45;;;:22;:45;:::i;:::-;17034:22;:70;17136:21;;17120:38;;;;;;;;;;;;;;;;17169:5;:35;;-1:-1:-1;;17169:35:0;;;;;;;-1:-1:-1;;;;;;;;;;;17220:24:0;17169:35;17237:5;;;;17232:11;;;;;;;;17220:24;;;;;;;;;;;;;;;16605:647;:::o;14817:322::-;8788:9;;-1:-1:-1;;;;;8788:9:0;8801:10;8788:23;;:46;;-1:-1:-1;8815:5:0;;-1:-1:-1;;;;;8815:5:0;8824:10;8815:19;8788:46;8780:79;;;;;;;-1:-1:-1;;;;;8780:79:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8780:79:0;;;;;;;;;;;;;;;14920:18;;14901:16;;:37;14893:46;;;;;;14967:35;14958:5;;;;;;;:44;;;;;;;;;14950:53;;;;;;15028:14;;15022:3;:20;15014:29;;;;;;15054:5;:37;;-1:-1:-1;;15054:37:0;;;;;;;-1:-1:-1;;;;;;;;;;;15107:24:0;15054:37;15124:5;;;;15119:11;;;;;;;;15107:24;;;;;;;;;;;;;;;14817:322::o;6284:29::-;;;;:::o;6961:27::-;;;;:::o;7373:25::-;;;;:::o;6741:23::-;;;-1:-1:-1;;;;;6741:23:0;;:::o;27682:248::-;27768:4;27793:21;;;;27785:72;;;;;-1:-1:-1;;;;;27785:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27875:47;27919:2;27875:39;27911:2;27875:39;27911:2;27875:39;:8;27888:9;27875:23;:12;:23;:::i;:47::-;27868:54;;27682:248;;;;;:::o;4975:93::-;553:5;;-1:-1:-1;;;;;553:5:0;539:10;:19;531:28;;;;;;4710:6;;-1:-1:-1;;;4710:6:0;;;;4709:7;4701:16;;;;;;5039:4;5030:13;;-1:-1:-1;;5030:13:0;-1:-1:-1;;;5030:13:0;;;5055:7;;;;5030:13;;5055:7;4975:93::o;30339:274::-;-1:-1:-1;;;;;30494:22:0;30422:18;30494:22;;;:9;:22;;;;;:36;;;;;;;;;30563:42;;;;;30339:274::o;50:20::-;;;-1:-1:-1;;;;;50:20:0;;:::o;6120:33::-;;;;:::o;6581:26::-;;;;:::o;29305:855::-;29373:7;;29443:33;29434:5;;;;;;;:42;;;;;;;;;29430:723;;;-1:-1:-1;;;;;;29510:19:0;;;;;;:9;:19;;;;;:26;29555:10;;29510:26;;-1:-1:-1;29551:143:0;;;29661:16;;29637:18;;-1:-1:-1;;;;;29606:19:0;;;;;;:9;:19;;;;;:26;:72;;29661:16;29606:50;;:26;:50;:30;:50;:::i;:72::-;29589:89;;29551:143;29715:124;7278:5;29715:99;29785:28;;29715:65;29761:18;:16;:18::i;:::-;29734:21;;29715:41;;:14;;:41;:18;:41;:::i;:124::-;29708:131;;;;29430:723;29870:20;29861:5;;;;;;;:29;;;;;;;;;29857:296;;;-1:-1:-1;;;;;;29923:19:0;;;;;;:9;:19;;;;;:26;30081:18;;30064:11;;30045:55;;30081:18;30045:31;;29923:26;;30045:31;:18;:31;:::i;29857:296::-;30140:1;30133:8;;29857:296;29305:855;;;;:::o;19425:555::-;19693:20;19524:33;19515:5;;;;;;;:42;;;;;;;;;19507:88;;;;;-1:-1:-1;;;;;19507:88:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19507:88:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19615:22:0;;;;;;:9;:22;;;;;:36;;;;;19614:37;19606:76;;;;;-1:-1:-1;;;;;19606:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19716:33;19737:11;19716:20;:33::i;:::-;19693:56;-1:-1:-1;19783:1:0;19768:16;;19760:46;;;;;-1:-1:-1;;;;;19760:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;28853:147;28905:7;28932:60;28963:28;;28932:26;:24;:26::i;6076:37::-;;;;:::o;6505:29::-;;;;:::o;23052:176::-;8255:253;;;;;;;;;;;;;;;;;;8314:17;8334:15;;;;;;;;;-1:-1:-1;;;;;8334:15:0;-1:-1:-1;;;;;8334:23:0;;8393:7;8402:10;8368:45;;;;;;-1:-1:-1;;;;;8368:45:0;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;8368:45:0;;;;;;;-1:-1:-1;;;;;8368:45:0;-1:-1:-1;;;;;8368:45:0;-1:-1:-1;;;8368:45:0;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;8368:45:0;;;8358:56;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;8358:56:0;;;;;;;;;;;;8334:81;;;-1:-1:-1;;;8334:81:0;;;;;;;;;;;;;;-1:-1:-1;263:2;;-1:-1;8334:81:0;;;;;;;-1:-1:-1;8334:81:0;-1:-1:-1;8334:81:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;8334:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8334:81:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8334:81:0;;-1:-1:-1;8426:62:0;;;;;;;;-1:-1:-1;;;;;8426:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4710:6;;-1:-1:-1;;;4710:6:0;;;;4709:7;4701:16;;;;;;23186:34;23208:11;23186:21;:34::i;20509:525::-;20756:11;20580:33;20571:5;;;;;;;:42;;;;;;;;;20563:88;;;;;-1:-1:-1;;;;;20563:88:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20563:88:0;;;;;;;;;;;;;;;;;;;;20670:24;;;;;;;:33;20662:83;;;;;-1:-1:-1;;;;;20662:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20770:120;20861:28;;20770:86;7278:5;20770:61;7222:3;20770:39;20797:11;;20770:22;;:26;;:39;;;;:::i;:120::-;20756:134;-1:-1:-1;20915:1:0;20909:7;;20901:44;;;;;-1:-1:-1;;;;;20901:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20956:24;:31;;-1:-1:-1;;20956:31:0;;;;;21008:12;;20998:28;;-1:-1:-1;;;;;21008:12:0;21022:3;20998:9;:28::i;6473:25::-;;;;;;;;;:::o;12378:359::-;8553:15;8571;;8608:33;;;;;;;;;;;;8636:4;-1:-1:-1;;;8608:33:0;;;;;;;26:21:-1;;;22:32;;6:49;;8608:33:0;;;;;;;;8598:44;;8571:15;;;;-1:-1:-1;;;;;8571:15:0;;:26;;8608:33;;;8598:44;;;;;8608:33;8598:44;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;8598:44:0;;;;;;;;;;;;8571:72;;;-1:-1:-1;;;8571:72:0;;;;;;;;;;;;;;-1:-1:-1;263:2;;-1:-1;8571:72:0;;;;;;;-1:-1:-1;8571:72:0;-1:-1:-1;8571:72:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;8571:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8571:72:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8571:72:0;;-1:-1:-1;;;;;;8662:21:0;;8673:10;8662:21;8654:55;;;;;-1:-1:-1;;;;;8654:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8654:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;12461:23:0;;;;12453:51;;;;;-1:-1:-1;;;;;12453:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12523:15;;12557:53;;;-1:-1:-1;;;;;12557:53:0;;;;;;;;;;;;;-1:-1:-1;;;;;12557:53:0;;;-1:-1:-1;;;12557:53:0;;;;;;;26:21:-1;;;22:32;;6:49;;12557:53:0;;;;;;;;12547:64;;12523:15;;;;;;:23;;12557:53;;;12547:64;;;;;12557:53;12547:64;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;12547:64:0;;;;;;;;;;;;12523:89;;;-1:-1:-1;;;12523:89:0;;;;;;;;;;;;;;-1:-1:-1;263:2;;-1:-1;12523:89:0;;;;;;;-1:-1:-1;12523:89:0;-1:-1:-1;12523:89:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;12523:89:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12523:89:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12523:89:0;12515:140;;;;;;;-1:-1:-1;;;;;12515:140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12666:8;:20;;-1:-1:-1;;12666:20:0;-1:-1:-1;;;;;12666:20:0;;;;;;;;;;;12702:27;;12720:8;;;12702:27;;-1:-1:-1;;12702:27:0;12378:359;;:::o;29008:148::-;29062:4;29106:3;29086:16;;:23;;:47;;;;;29130:3;29113:14;;:20;29086:47;:62;;;;-1:-1:-1;;29138:10:0;;;;29137:11;;29008:148::o;6928:26::-;;;;:::o;6041:28::-;;;;:::o;19988:513::-;20226:11;20056:33;20047:5;;;;;;;:42;;;;;;;;;20039:88;;;;;-1:-1:-1;;;;;20039:88:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20039:88:0;;;;;;;;;;;;;;;;;;;;20146:21;;;;:30;20138:77;;;;;-1:-1:-1;;;;;20138:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20240:121;20332:28;;20240:87;7278:5;20240:62;7222:3;20240:40;20267:12;;20240:22;;:26;;:40;;;;:::i;:121::-;20226:135;-1:-1:-1;20386:1:0;20380:7;;20372:46;;;;;-1:-1:-1;;;;;20372:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20429:21;:28;;-1:-1:-1;;20429:28:0;20453:4;20429:28;;;20478:9;;20468:25;;-1:-1:-1;;;;;20478:9:0;20489:3;20468:9;:25::i;6697:37::-;;;;:::o;6878:43::-;;;;:::o;18102:535::-;18354:20;18189:29;18180:5;;;;;;;:38;;;;;;;;;18172:80;;;;;-1:-1:-1;;;;;18172:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18272:22:0;;;;;;:9;:22;;;;;:36;;;;;18271:37;18263:80;;;;;-1:-1:-1;;;;;18263:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18377:22:0;;;;;;:9;:22;;;;;:29;;18425:16;;18417:46;;;;;-1:-1:-1;;;;;18417:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;950:105;553:5;;-1:-1:-1;;;;;553:5:0;539:10;:19;531:28;;;;;;1020:29;1039:9;1020:18;:29::i;29164:133::-;-1:-1:-1;;;;;29263:19:0;29237:7;29263:19;;;:9;:19;;;;;:26;;29164:133::o;7405:26::-;;;;:::o;25256:508::-;25353:4;;;;;;25398:26;:8;25411:12;25398:26;:12;:26;:::i;:::-;25382:42;;25454:5;25435:24;;25484:1;25470:15;;25512:4;25500:8;:16;;:35;;;;;25531:4;25520:8;:15;25500:35;25496:212;;;25566:4;;-1:-1:-1;25594:18:0;:8;25607:4;25594:18;:12;:18;:::i;:::-;25585:27;-1:-1:-1;25642:24:0;:12;25585:27;25642:24;:16;:24;:::i;:::-;25627:39;;25692:4;25681:15;;25496:212;25726:8;;25736:11;;-1:-1:-1;25749:6:0;;-1:-1:-1;25256:508:0;-1:-1:-1;;;;25256:508:0:o;26107:909::-;26155:38;26394:14;26647:28;26238:15;;;;;;;;;-1:-1:-1;;;;;26238:15:0;-1:-1:-1;;;;;26238:26:0;;26275:47;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;26275:47:0;;;26265:58;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;26265:58:0;;;;;;;;;;;;26238:86;;;-1:-1:-1;;;26238:86:0;;;;;;;;;;;;;;-1:-1:-1;263:2;;-1:-1;26238:86:0;;;;;;;-1:-1:-1;26238:86:0;-1:-1:-1;26238:86:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;26238:86:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26238:86:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26238:86:0;;-1:-1:-1;;;;;;26358:24:0;;;;26350:33;;;;;;26411:17;26424:3;26411:12;:17::i;:::-;26394:34;;26455:1;26443:9;:13;26439:570;;;26473:15;;26507:43;;;;;;;;;;;;26545:4;-1:-1:-1;;;26507:43:0;;;;;;;26:21:-1;;;22:32;;6:49;;26507:43:0;;;;;;;;26497:54;;26473:15;;;;-1:-1:-1;;;;;26473:15:0;;:23;;26507:43;;;26497:54;;;;;26507:43;26497:54;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;26497:54:0;;;;;;;;;;;;26473:90;;;-1:-1:-1;;;26473:90:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;26473:90:0;;;;;;;-1:-1:-1;26473:90:0;-1:-1:-1;26473:90:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;26473:90:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26473:90:0;;;;26578:10;-1:-1:-1;;;;;26578:25:0;;26604:9;26578:36;;;;;-1:-1:-1;;;26578:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26578:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26578:36:0;;;;26439:570;;;26678:108;26784:1;26678:15;;;;;;;;;-1:-1:-1;;;;;26678:15:0;-1:-1:-1;;;;;26678:23:0;;26766:4;26772;;26712:65;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26712:65:0;-1:-1:-1;;;;;26712:65:0;-1:-1:-1;;;26712:65:0;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;26712:65:0;;;26702:76;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;26702:76:0;;;;;;;;;;;;26678:101;;;-1:-1:-1;;;26678:101:0;;;;;;;;;;;;;;-1:-1:-1;263:2;;-1:-1;26678:101:0;;;;;;;-1:-1:-1;26678:101:0;-1:-1:-1;26678:101:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;26678:101:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26678:101:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26678:101:0;;:108;:105;:108;:::i;:::-;26801:15;;26895:4;;26835:65;;;;;;;;;;;;;;;;;26889:4;-1:-1:-1;;;26835:65:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;26835:65:0;;;;;;;;26825:76;;26647:139;;-1:-1:-1;26801:15:0;;;;-1:-1:-1;;;;;26801:15:0;;:23;;26835:65;;26825:76;;;;;26835:65;26825:76;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;26825:76:0;;;;;;;;;;;;26801:126;;;-1:-1:-1;;;26801:126:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;26801:126:0;;;;;;;-1:-1:-1;26801:126:0;-1:-1:-1;26801:126:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;26801:126:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26801:126:0;;;;26942:10;-1:-1:-1;;;;;26942:30:0;;26973:23;26942:55;;;;;-1:-1:-1;;;26942:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26942:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26942:55:0;;;;26107:909;;;:::o;3770:127::-;3850:5;;;3869:6;;;;3862:14;;;3590:113;3648:7;3671:6;;;;3664:14;;;;-1:-1:-1;3692:5:0;;;3590:113::o;2725:384::-;2783:9;3013:6;;3009:37;;;-1:-1:-1;3037:1:0;3030:8;;3009:37;-1:-1:-1;3058:5:0;;;3062:1;3058;:5;3077;;;;;;;;:10;3070:18;;;3196:277;3254:7;3466:1;3462;:5;;;;;;;;;3196:277;-1:-1:-1;;;3196:277:0:o;21718:237::-;21802:4;21794:21;:30;-1:-1:-1;21789:159:0;;;21842:38;;-1:-1:-1;;;;;21842:15:0;;;21866:4;21858:21;21842:38;;;;;;;;;21858:21;21842:15;:38;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21842:38:0;21789:159;;;21913:23;;-1:-1:-1;;;;;21913:15:0;;;:23;;;;;21929:6;;21913:23;;;;21929:6;21913:15;:23;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;1196:175:0;-1:-1:-1;;;;;1267:23:0;;;;1259:32;;;;;;1324:5;;1303:38;;-1:-1:-1;;;;;1303:38:0;;;;1324:5;;1303:38;;1324:5;;1303:38;1348:5;:17;;-1:-1:-1;;1348:17:0;-1:-1:-1;;;;;1348:17:0;;;;;;;;;;1196:175::o

Swarm Source

bzzr://f118f2d354a9d995675478712288c36d4f2844367bb14225308ab2e539939010

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.