ETH Price: $2,395.66 (-4.36%)

Contract

0xC7bf1D7Aa00b194bC6d0b1895390802F2bbC4593
 

Overview

ETH Balance

1.236553057165594658 ETH

Eth Value

$2,962.36 (@ $2,395.66/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Rebalance Reward...160213262022-11-21 22:19:11652 days ago1669069151IN
0xC7bf1D7A...F2bbC4593
0 ETH0.174221500
Rebalance Reward...154453372022-08-31 7:42:25735 days ago1661931745IN
0xC7bf1D7A...F2bbC4593
0 ETH0.0051321314.72879871
Rebalance Reward...148693772022-05-29 23:47:11828 days ago1653868031IN
0xC7bf1D7A...F2bbC4593
0 ETH0.0004966516
Rebalance Reward...142933212022-02-28 7:39:35919 days ago1646033975IN
0xC7bf1D7A...F2bbC4593
0 ETH0.0014899648
Rebalance Reward...142898452022-02-27 18:29:36919 days ago1645986576IN
0xC7bf1D7A...F2bbC4593
0 ETH0.0207055759
Rebalance Reward...137169532021-11-30 20:36:031008 days ago1638304563IN
0xC7bf1D7A...F2bbC4593
0 ETH0.00564727182
Transfer137169382021-11-30 20:33:351008 days ago1638304415IN
0xC7bf1D7A...F2bbC4593
60 ETH0.00389233167.8238942
0x60806040137157282021-11-30 16:06:421008 days ago1638288402IN
 Contract Creation
0 ETH0.68866425250

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
206293282024-08-28 19:58:356 days ago1724875115
0xC7bf1D7A...F2bbC4593
0.06508173 ETH
206293282024-08-28 19:58:356 days ago1724875115
0xC7bf1D7A...F2bbC4593
1.30163479 ETH
201771122024-06-26 16:39:3569 days ago1719419975
0xC7bf1D7A...F2bbC4593
2.46164386 ETH
201680532024-06-25 10:18:4770 days ago1719310727
0xC7bf1D7A...F2bbC4593
0.55010088 ETH
200533292024-06-09 9:19:3587 days ago1717924775
0xC7bf1D7A...F2bbC4593
0.1295602 ETH
200533282024-06-09 9:19:2387 days ago1717924763
0xC7bf1D7A...F2bbC4593
2.59120406 ETH
194781562024-03-20 20:01:47167 days ago1710964907
0xC7bf1D7A...F2bbC4593
4.70839832 ETH
194773262024-03-20 17:13:59167 days ago1710954839
0xC7bf1D7A...F2bbC4593
0.24781043 ETH
194773262024-03-20 17:13:59167 days ago1710954839
0xC7bf1D7A...F2bbC4593
4.95620876 ETH
189037702023-12-31 6:46:47248 days ago1704005207
0xC7bf1D7A...F2bbC4593
2.32422619 ETH
189013252023-12-30 22:32:47248 days ago1703975567
0xC7bf1D7A...F2bbC4593
0.12232769 ETH
189013252023-12-30 22:32:47248 days ago1703975567
0xC7bf1D7A...F2bbC4593
2.44655389 ETH
183264262023-10-11 9:52:35329 days ago1697017955
0xC7bf1D7A...F2bbC4593
2.27424816 ETH
183253322023-10-11 6:10:47329 days ago1697004647
0xC7bf1D7A...F2bbC4593
0.11969727 ETH
183253252023-10-11 6:09:23329 days ago1697004563
0xC7bf1D7A...F2bbC4593
2.39394544 ETH
177493502023-07-22 14:45:35409 days ago1690037135
0xC7bf1D7A...F2bbC4593
5.01761271 ETH
177493412023-07-22 14:43:47409 days ago1690037027
0xC7bf1D7A...F2bbC4593
0.26408487 ETH
177493252023-07-22 14:40:35409 days ago1690036835
0xC7bf1D7A...F2bbC4593
5.28169759 ETH
171734822023-05-02 13:47:35490 days ago1683035255
0xC7bf1D7A...F2bbC4593
8.68201922 ETH
171733282023-05-02 13:16:47490 days ago1683033407
0xC7bf1D7A...F2bbC4593
0.45694838 ETH
171733252023-05-02 13:16:11490 days ago1683033371
0xC7bf1D7A...F2bbC4593
9.1389676 ETH
165974342023-02-10 9:22:35572 days ago1676020955
0xC7bf1D7A...F2bbC4593
10.42488569 ETH
165973252023-02-10 9:00:47572 days ago1676019647
0xC7bf1D7A...F2bbC4593
0.54867819 ETH
165973252023-02-10 9:00:47572 days ago1676019647
0xC7bf1D7A...F2bbC4593
10.97356388 ETH
160214032022-11-21 22:34:47652 days ago1669070087
0xC7bf1D7A...F2bbC4593
15.29451076 ETH
View All Internal Transactions
Loading...
Loading

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

Contract Name:
ModelBasedFarmingManager

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-19
*/

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: @ethereansos/swissknife/contracts/lib/GeneralUtilities.sol


pragma solidity >=0.7.0;


library BehaviorUtilities {

    function randomKey(uint256 i) internal view returns (bytes32) {
        return keccak256(abi.encode(i, block.timestamp, block.number, tx.origin, tx.gasprice, block.coinbase, block.difficulty, msg.sender, blockhash(block.number - 5)));
    }

    function calculateProjectedArraySizeAndLoopUpperBound(uint256 arraySize, uint256 start, uint256 offset) internal pure returns(uint256 projectedArraySize, uint256 projectedArrayLoopUpperBound) {
        if(arraySize != 0 && start < arraySize && offset != 0) {
            uint256 length = start + offset;
            if(start < (length = length > arraySize ? arraySize : length)) {
                projectedArraySize = (projectedArrayLoopUpperBound = length) - start;
            }
        }
    }
}

library ReflectionUtilities {

    function read(address subject, bytes memory inputData) internal view returns(bytes memory returnData) {
        bool result;
        (result, returnData) = subject.staticcall(inputData);
        if(!result) {
            assembly {
                revert(add(returnData, 0x20), mload(returnData))
            }
        }
    }

    function submit(address subject, uint256 value, bytes memory inputData) internal returns(bytes memory returnData) {
        bool result;
        (result, returnData) = subject.call{value : value}(inputData);
        if(!result) {
            assembly {
                revert(add(returnData, 0x20), mload(returnData))
            }
        }
    }

    function isContract(address subject) internal view returns (bool) {
        if(subject == address(0)) {
            return false;
        }
        uint256 codeLength;
        assembly {
            codeLength := extcodesize(subject)
        }
        return codeLength > 0;
    }

    function clone(address originalContract) internal returns(address copyContract) {
        assembly {
            mstore(
                0,
                or(
                    0x5880730000000000000000000000000000000000000000803b80938091923cF3,
                    mul(originalContract, 0x1000000000000000000)
                )
            )
            copyContract := create(0, 0, 32)
            switch extcodesize(copyContract)
                case 0 {
                    invalid()
                }
        }
    }
}

library BytesUtilities {

    bytes private constant ALPHABET = "0123456789abcdef";
    string internal constant BASE64_ENCODER_DATA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

    function asAddress(bytes memory b) internal pure returns(address) {
        if(b.length == 0) {
            return address(0);
        }
        if(b.length == 20) {
            address addr;
            assembly {
                addr := mload(add(b, 20))
            }
            return addr;
        }
        return abi.decode(b, (address));
    }

    function asAddressArray(bytes memory b) internal pure returns(address[] memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (address[]));
        }
    }

    function asBool(bytes memory bs) internal pure returns(bool) {
        return asUint256(bs) != 0;
    }

    function asBoolArray(bytes memory b) internal pure returns(bool[] memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (bool[]));
        }
    }

    function asBytesArray(bytes memory b) internal pure returns(bytes[] memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (bytes[]));
        }
    }

    function asString(bytes memory b) internal pure returns(string memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (string));
        }
    }

    function asStringArray(bytes memory b) internal pure returns(string[] memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (string[]));
        }
    }

    function asUint256(bytes memory bs) internal pure returns(uint256 x) {
        if (bs.length >= 32) {
            assembly {
                x := mload(add(bs, add(0x20, 0)))
            }
        }
    }

    function asUint256Array(bytes memory b) internal pure returns(uint256[] memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (uint256[]));
        }
    }

    function toString(bytes memory data) internal pure returns(string memory) {
        bytes memory str = new bytes(2 + data.length * 2);
        str[0] = "0";
        str[1] = "x";
        for (uint256 i = 0; i < data.length; i++) {
            str[2+i*2] = ALPHABET[uint256(uint8(data[i] >> 4))];
            str[3+i*2] = ALPHABET[uint256(uint8(data[i] & 0x0f))];
        }
        return string(str);
    }

    function asSingletonArray(bytes memory a) internal pure returns(bytes[] memory array) {
        array = new bytes[](1);
        array[0] = a;
    }

    function toBase64(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        string memory table = BASE64_ENCODER_DATA;

        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        string memory result = new string(encodedLen + 32);

        assembly {
            mstore(result, encodedLen)

            let tablePtr := add(table, 1)

            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            let resultPtr := add(result, 32)

            for {} lt(dataPtr, endPtr) {}
            {
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }
}

library StringUtilities {

    bytes1 private constant CHAR_0 = bytes1('0');
    bytes1 private constant CHAR_A = bytes1('A');
    bytes1 private constant CHAR_a = bytes1('a');
    bytes1 private constant CHAR_f = bytes1('f');

    bytes  internal constant BASE64_DECODER_DATA = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                                   hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                                   hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                                   hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

    function isEmpty(string memory test) internal pure returns (bool) {
        return equals(test, "");
    }

    function equals(string memory a, string memory b) internal pure returns(bool) {
        return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));
    }

    function toLowerCase(string memory str) internal pure returns(string memory) {
        bytes memory bStr = bytes(str);
        for (uint256 i = 0; i < bStr.length; i++) {
            bStr[i] = bStr[i] >= 0x41 && bStr[i] <= 0x5A ? bytes1(uint8(bStr[i]) + 0x20) : bStr[i];
        }
        return string(bStr);
    }

    function asBytes(string memory str) internal pure returns(bytes memory toDecode) {
        bytes memory data = abi.encodePacked(str);
        if(data.length == 0 || data[0] != "0" || (data[1] != "x" && data[1] != "X")) {
            return "";
        }
        uint256 start = 2;
        toDecode = new bytes((data.length - 2) / 2);

        for(uint256 i = 0; i < toDecode.length; i++) {
            toDecode[i] = bytes1(_fromHexChar(uint8(data[start++])) + _fromHexChar(uint8(data[start++])) * 16);
        }
    }

    function toBase64(string memory input) internal pure returns(string memory) {
        return BytesUtilities.toBase64(abi.encodePacked(input));
    }

    function fromBase64(string memory _data) internal pure returns (bytes memory) {
        bytes memory data = bytes(_data);

        if (data.length == 0) return new bytes(0);
        require(data.length % 4 == 0, "invalid base64 decoder input");

        bytes memory table = BASE64_DECODER_DATA;

        uint256 decodedLen = (data.length / 4) * 3;

        bytes memory result = new bytes(decodedLen + 32);

        assembly {
            let lastBytes := mload(add(data, mload(data)))
            if eq(and(lastBytes, 0xFF), 0x3d) {
                decodedLen := sub(decodedLen, 1)
                if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                    decodedLen := sub(decodedLen, 1)
                }
            }

            mstore(result, decodedLen)

            let tablePtr := add(table, 1)

            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            let resultPtr := add(result, 32)

            for {} lt(dataPtr, endPtr) {}
            {
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

               let output := add(
                   add(
                       shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                       shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                   add(
                       shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                               and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                    )
                )
                mstore(resultPtr, shl(232, output))
                resultPtr := add(resultPtr, 3)
            }
        }

        return result;
    }

    function _fromHexChar(uint8 c) private pure returns (uint8) {
        bytes1 charc = bytes1(c);
        return charc < CHAR_0 || charc > CHAR_f ? 0 : (charc < CHAR_A ? 0 : 10) + c - uint8(charc < CHAR_A ? CHAR_0 : charc < CHAR_a ? CHAR_A : CHAR_a);
    }
}

library Uint256Utilities {
    function asSingletonArray(uint256 n) internal pure returns(uint256[] memory array) {
        array = new uint256[](1);
        array[0] = n;
    }

    function toHex(uint256 _i) internal pure returns (string memory) {
        return BytesUtilities.toString(abi.encodePacked(_i));
    }

    function toString(uint256 _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint256 j = _i;
        uint256 len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint256 k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

    function sum(uint256[] memory arr) internal pure returns (uint256 result) {
        for(uint256 i = 0; i < arr.length; i++) {
            result += arr[i];
        }
    }
}

library AddressUtilities {
    function asSingletonArray(address a) internal pure returns(address[] memory array) {
        array = new address[](1);
        array[0] = a;
    }

    function toString(address _addr) internal pure returns (string memory) {
        return _addr == address(0) ? "0x0000000000000000000000000000000000000000" : BytesUtilities.toString(abi.encodePacked(_addr));
    }
}

library Bytes32Utilities {

    function asSingletonArray(bytes32 a) internal pure returns(bytes32[] memory array) {
        array = new bytes32[](1);
        array[0] = a;
    }

    function toString(bytes32 bt) internal pure returns (string memory) {
        return bt == bytes32(0) ?  "0x0000000000000000000000000000000000000000000000000000000000000000" : BytesUtilities.toString(abi.encodePacked(bt));
    }
}

library TransferUtilities {
    using ReflectionUtilities for address;

    function balanceOf(address erc20TokenAddress, address account) internal view returns(uint256) {
        if(erc20TokenAddress == address(0)) {
            return account.balance;
        }
        return abi.decode(erc20TokenAddress.read(abi.encodeWithSelector(IERC20(erc20TokenAddress).balanceOf.selector, account)), (uint256));
    }

    function allowance(address erc20TokenAddress, address account, address spender) internal view returns(uint256) {
        if(erc20TokenAddress == address(0)) {
            return 0;
        }
        return abi.decode(erc20TokenAddress.read(abi.encodeWithSelector(IERC20(erc20TokenAddress).allowance.selector, account, spender)), (uint256));
    }

    function safeApprove(address erc20TokenAddress, address spender, uint256 value) internal {
        bytes memory returnData = erc20TokenAddress.submit(0, abi.encodeWithSelector(IERC20(erc20TokenAddress).approve.selector, spender, value));
        require(returnData.length == 0 || abi.decode(returnData, (bool)), 'APPROVE_FAILED');
    }

    function safeTransfer(address erc20TokenAddress, address to, uint256 value) internal {
        if(value == 0) {
            return;
        }
        if(erc20TokenAddress == address(0)) {
            to.submit(value, "");
            return;
        }
        bytes memory returnData = erc20TokenAddress.submit(0, abi.encodeWithSelector(IERC20(erc20TokenAddress).transfer.selector, to, value));
        require(returnData.length == 0 || abi.decode(returnData, (bool)), 'TRANSFER_FAILED');
    }

    function safeTransferFrom(address erc20TokenAddress, address from, address to, uint256 value) internal {
        if(value == 0) {
            return;
        }
        if(erc20TokenAddress == address(0)) {
            to.submit(value, "");
            return;
        }
        bytes memory returnData = erc20TokenAddress.submit(0, abi.encodeWithSelector(IERC20(erc20TokenAddress).transferFrom.selector, from, to, value));
        require(returnData.length == 0 || abi.decode(returnData, (bool)), 'TRANSFERFROM_FAILED');
    }
}
// File: @ethereansos/covenants/contracts/farming/FarmDataRegular.sol

pragma solidity >=0.7.0;

struct FarmingPositionRequest {
    uint256 setupIndex; // index of the chosen setup.
    uint256 amount0; // amount of main token or liquidity pool token.
    uint256 amount1; // amount of other token or liquidity pool token. Needed for gen2
    address positionOwner; // position extension or address(0) [msg.sender].
    uint256 amount0Min;
    uint256 amount1Min;
}

struct FarmingSetupConfiguration {
    bool add; // true if we're adding a new setup, false we're updating it.
    bool disable;
    uint256 index; // index of the setup we're updating.
    FarmingSetupInfo info; // data of the new or updated setup
}

struct FarmingSetupInfo {
    uint256 blockDuration; // duration of setup
    uint256 startBlock; // optional start block used for the delayed activation of the first setup
    uint256 originalRewardPerBlock;
    uint256 minStakeable; // minimum amount of staking tokens.
    uint256 renewTimes; // if the setup is renewable or if it's one time.
    address liquidityPoolTokenAddress; // address of the liquidity pool token
    address mainTokenAddress; // eg. buidl address.
    bool involvingETH; // if the setup involves ETH or not.
    uint256 setupsCount; // number of setups created by this info.
    uint256 lastSetupIndex; // index of last setup;
    int24 tickLower; // Gen2 Only - tickLower of the UniswapV3 pool
    int24 tickUpper; // Gen 2 Only - tickUpper of the UniswapV3 pool
}

struct FarmingSetup {
    uint256 infoIndex; // setup info
    bool active; // if the setup is active or not.
    uint256 startBlock; // farming setup start block.
    uint256 endBlock; // farming setup end block.
    uint256 lastUpdateBlock; // number of the block where an update was triggered.
    uint256 deprecatedObjectId; // need for gen2. uniswapV3 NFT position Id
    uint256 rewardPerBlock; // farming setup reward per single block.
    uint128 totalSupply; // Total LP token liquidity of all the positions of this setup
}

struct FarmingPosition {
    address uniqueOwner; // address representing the owner of the position.
    uint256 setupIndex; // the setup index related to this position.
    uint256 creationBlock; // block when this position was created.
    uint256 tokenId; // amount of liquidity pool token in the position.
    uint256 reward; // position reward.
}
// File: @ethereansos/covenants/contracts/farming/IFarmMainRegular.sol

pragma solidity >=0.7.0;
pragma abicoder v2;


interface IFarmMainRegular {

    function ONE_HUNDRED() external view returns(uint256);
    function _rewardTokenAddress() external view returns(address);
    function position(uint256 positionId) external view returns (FarmingPosition memory);
    function setups() external view returns (FarmingSetup[] memory);
    function setup(uint256 setupIndex) external view returns (FarmingSetup memory, FarmingSetupInfo memory);
    function setFarmingSetups(FarmingSetupConfiguration[] memory farmingSetups) external;
    function openPosition(FarmingPositionRequest calldata request) external payable returns(uint256 positionId);
    function addLiquidity(uint256 positionId, FarmingPositionRequest calldata request) external payable;
}
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol



pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @ethereansos/swissknife/contracts/generic/model/ILazyInitCapableElement.sol


pragma solidity >=0.7.0;


interface ILazyInitCapableElement is IERC165 {

    function lazyInit(bytes calldata lazyInitData) external returns(bytes memory initResponse);
    function initializer() external view returns(address);

    event Host(address indexed from, address indexed to);

    function host() external view returns(address);
    function setHost(address newValue) external returns(address oldValue);

    function subjectIsAuthorizedFor(address subject, address location, bytes4 selector, bytes calldata payload, uint256 value) external view returns(bool);
}
// File: contracts/base/model/ITreasuryManager.sol


pragma solidity >=0.7.0;


interface ITreasuryManager is ILazyInitCapableElement {

    struct TransferEntry {
        address token;
        uint256[] objectIds;
        uint256[] values;
        address receiver;
        bool safe;
        bool batch;
        bool withData;
        bytes data;
    }

    function transfer(address token, uint256 value, address receiver, uint256 tokenType, uint256 objectId, bool safe, bool withData, bytes calldata data) external returns(bool result, bytes memory returnData);
    function batchTransfer(TransferEntry[] calldata transferEntries) external returns(bool[] memory results, bytes[] memory returnDatas);

    function submit(address location, bytes calldata payload, address restReceiver) external payable returns(bytes memory response);

    function setAdditionalFunction(bytes4 selector, address newServer, bool log) external returns (address oldServer);
    event AdditionalFunction(address caller, bytes4 indexed selector, address indexed oldServer, address indexed newServer);
}
// File: contracts/base/model/IProposalsManager.sol


pragma solidity >=0.7.0;



interface IProposalsManager is IERC1155Receiver, ILazyInitCapableElement {

    struct ProposalCode {
        address location;
        bytes bytecode;
    }

    struct ProposalCodes {
        ProposalCode[] codes;
        bool alsoTerminate;
    }

    struct Proposal {
        address proposer;
        address[] codeSequence;
        uint256 creationBlock;
        uint256 accept;
        uint256 refuse;
        address triggeringRules;
        address[] canTerminateAddresses;
        address[] validatorsAddresses;
        bool validationPassed;
        uint256 terminationBlock;
        bytes votingTokens;
    }

    struct ProposalConfiguration {
        address[] collections;
        uint256[] objectIds;
        uint256[] weights;
        address creationRules;
        address triggeringRules;
        address[] canTerminateAddresses;
        address[] validatorsAddresses;
    }

    function batchCreate(ProposalCodes[] calldata codeSequences) external returns(bytes32[] memory createdProposalIds);

    function list(bytes32[] calldata proposalIds) external view returns(Proposal[] memory);

    function votes(bytes32[] calldata proposalIds, address[] calldata voters, bytes32[][] calldata items) external view returns(uint256[][] memory accepts, uint256[][] memory refuses, uint256[][] memory toWithdraw);
    function weight(bytes32 code) external view returns(uint256);

    function vote(address erc20TokenAddress, bytes memory permitSignature, bytes32 proposalId, uint256 accept, uint256 refuse, address voter, bool alsoTerminate) external payable;
    function batchVote(bytes[] calldata data) external payable;

    function withdrawAll(bytes32[] memory proposalIds, address voterOrReceiver, bool afterTermination) external;

    function terminate(bytes32[] calldata proposalIds) external;

    function configuration() external view returns(ProposalConfiguration memory);
    function setConfiguration(ProposalConfiguration calldata newValue) external returns(ProposalConfiguration memory oldValue);

    function lastProposalId() external view returns(bytes32);

    function lastVoteBlock(address voter) external view returns (uint256);

    event ProposalCreated(address indexed proposer, address indexed code, bytes32 indexed proposalId);
    event ProposalWeight(bytes32 indexed proposalId, address indexed collection, uint256 indexed id, bytes32 key, uint256 weight);
    event ProposalTerminated(bytes32 indexed proposalId, bool result, bytes errorData);

    event Accept(bytes32 indexed proposalId, address indexed voter, bytes32 indexed item, uint256 amount);
    event MoveToAccept(bytes32 indexed proposalId, address indexed voter, bytes32 indexed item, uint256 amount);
    event RetireAccept(bytes32 indexed proposalId, address indexed voter, bytes32 indexed item, uint256 amount);

    event Refuse(bytes32 indexed proposalId, address indexed voter, bytes32 indexed item, uint256 amount);
    event MoveToRefuse(bytes32 indexed proposalId, address indexed voter, bytes32 indexed item, uint256 amount);
    event RetireRefuse(bytes32 indexed proposalId, address indexed voter, bytes32 indexed item, uint256 amount);
}

interface IProposalChecker {
    function check(address proposalsManagerAddress, bytes32 id, bytes calldata data, address from, address voter) external view returns(bool);
}

interface IExternalProposalsManagerCommands {
    function createProposalCodeSequence(bytes32 proposalId, IProposalsManager.ProposalCode[] memory codeSequenceInput, address sender) external returns (address[] memory codeSequence, IProposalsManager.ProposalConfiguration memory localConfiguration);
    function proposalCanBeFinalized(bytes32 proposalId, IProposalsManager.Proposal memory proposal, bool validationPassed, bool result) external view returns (bool);
    function isVotable(bytes32 proposalId, IProposalsManager.Proposal memory proposal, address from, address voter, bool voteOrWithtraw) external view returns (bytes memory response);
}
// File: contracts/base/model/IStateManager.sol


pragma solidity >=0.7.0;


interface IStateManager is ILazyInitCapableElement {

    struct StateEntry {
        string key;
        bytes32 entryType;
        bytes value;
    }

    function size() external view returns (uint256);
    function all() external view returns (StateEntry[] memory);
    function partialList(uint256 start, uint256 offset) external view returns (StateEntry[] memory);
    function list(string[] calldata keys) external view returns (StateEntry[] memory);
    function listByIndices(uint256[] calldata indices) external view returns (StateEntry[] memory);

    function exists(string calldata key) external view returns(bool result, uint256 index);

    function get(string calldata key) external view returns(StateEntry memory);
    function getByIndex(uint256 index) external view returns(StateEntry memory);

    function set(StateEntry calldata newValue) external returns(bytes memory replacedValue);
    function batchSet(StateEntry[] calldata newValues) external returns(bytes[] memory replacedValues);

    function remove(string calldata key) external returns(bytes32 removedType, bytes memory removedValue);
    function batchRemove(string[] calldata keys) external returns(bytes32[] memory removedTypes, bytes[] memory removedValues);
    function removeByIndices(uint256[] calldata indices) external returns(bytes32[] memory removedTypes, bytes[] memory removedValues);
}
// File: contracts/base/model/IMicroservicesManager.sol


pragma solidity >=0.7.0;


interface IMicroservicesManager is ILazyInitCapableElement {

    struct Microservice {
        string key;
        address location;
        string methodSignature;
        bool submittable;
        string returnAbiParametersArray;
        bool isInternal;
        bool needsSender;
    }

    function size() external view returns (uint256);
    function all() external view returns (Microservice[] memory);
    function partialList(uint256 start, uint256 offset) external view returns (Microservice[] memory);
    function list(string[] calldata keys) external view returns (Microservice[] memory);
    function listByIndices(uint256[] calldata indices) external view returns (Microservice[] memory);

    function exists(string calldata key) external view returns(bool result, uint256 index);

    function get(string calldata key) external view returns(Microservice memory);
    function getByIndex(uint256 index) external view returns(Microservice memory);

    function set(Microservice calldata newValue) external returns(Microservice memory replacedValue);
    function batchSet(Microservice[] calldata newValues) external returns(Microservice[] memory replacedValues);

    event MicroserviceAdded(address indexed sender, bytes32 indexed keyHash, string key, address indexed location, string methodSignature, bool submittable, string returnAbiParametersArray, bool isInternal, bool needsSender);

    function remove(string calldata key) external returns(Microservice memory removedValue);
    function batchRemove(string[] calldata keys) external returns(Microservice[] memory removedValues);
    function removeByIndices(uint256[] calldata indices) external returns(Microservice[] memory removedValues);

    event MicroserviceRemoved(address indexed sender, bytes32 indexed keyHash, string key, address indexed location, string methodSignature, bool submittable, string returnAbiParametersArray, bool isInternal, bool needsSender);

    function read(string calldata key, bytes calldata data) external view returns(bytes memory returnData);
    function submit(string calldata key, bytes calldata data) external payable returns(bytes memory returnData);
}
// File: @ethereansos/swissknife/contracts/dynamicMetadata/model/IDynamicMetadataCapableElement.sol

//SPDX-License-Identifier: MIT
pragma solidity >=0.7.0;


interface IDynamicMetadataCapableElement is ILazyInitCapableElement {

    function uri() external view returns(string memory);
    function plainUri() external view returns(string memory);

    function setUri(string calldata newValue) external returns (string memory oldValue);

    function dynamicUriResolver() external view returns(address);
    function setDynamicUriResolver(address newValue) external returns(address oldValue);
}
// File: contracts/core/model/IOrganization.sol


pragma solidity >=0.7.0;


interface IOrganization is IDynamicMetadataCapableElement {

    struct Component {
        bytes32 key;
        address location;
        bool active;
        bool log;
    }

    function keyOf(address componentAddress) external view returns(bytes32);
    function history(bytes32 key) external view returns(address[] memory componentsAddresses);
    function batchHistory(bytes32[] calldata keys) external view returns(address[][] memory componentsAddresses);

    function get(bytes32 key) external view returns(address componentAddress);
    function list(bytes32[] calldata keys) external view returns(address[] memory componentsAddresses);
    function isActive(address subject) external view returns(bool);
    function keyIsActive(bytes32 key) external view returns(bool);

    function set(Component calldata) external returns(address replacedComponentAddress);
    function batchSet(Component[] calldata) external returns (address[] memory replacedComponentAddresses);

    event ComponentSet(bytes32 indexed key, address indexed from, address indexed to, bool active);

    function submit(address location, bytes calldata payload, address restReceiver) external payable returns(bytes memory response);
}
// File: contracts/base/lib/KnowledgeBase.sol


pragma solidity >=0.7.0;







library Grimoire {
    bytes32 constant public COMPONENT_KEY_TREASURY_MANAGER = 0xcfe1633df53a0649d88d788961f26058c5e7a0b5644675f19f67bb2975827ba2;
    bytes32 constant public COMPONENT_KEY_STATE_MANAGER = 0xd1d09e8f5708558865b8acd5f13c69781ae600e42dbc7f52b8ef1b9e33dbcd36;
    bytes32 constant public COMPONENT_KEY_MICROSERVICES_MANAGER = 0x0aef4c8f864010d3e1817691f51ade95a646fffafd7f3df9cb8200def342cfd7;
    bytes32 constant public COMPONENT_KEY_PROPOSALS_MANAGER = 0xa504406933af7ca120d20b97dfc79ea9788beb3c4d3ac1ff9a2c292b2c28e0cc;
}

library Getters {

    function treasuryManager(IOrganization organization) internal view returns(ITreasuryManager) {
        return ITreasuryManager(organization.get(Grimoire.COMPONENT_KEY_TREASURY_MANAGER));
    }

    function stateManager(IOrganization organization) internal view returns(IStateManager) {
        return IStateManager(organization.get(Grimoire.COMPONENT_KEY_STATE_MANAGER));
    }

    function microservicesManager(IOrganization organization) internal view returns(IMicroservicesManager) {
        return IMicroservicesManager(organization.get(Grimoire.COMPONENT_KEY_MICROSERVICES_MANAGER));
    }

    function proposalsManager(IOrganization organization) internal view returns(IProposalsManager) {
        return IProposalsManager(organization.get(Grimoire.COMPONENT_KEY_PROPOSALS_MANAGER));
    }
}

library Setters {

    function replaceTreasuryManager(IOrganization organization, address newComponentAddress) internal returns(ITreasuryManager oldComponent) {
        require(newComponentAddress != address(0), "void");
        oldComponent = ITreasuryManager(organization.set(IOrganization.Component(Grimoire.COMPONENT_KEY_TREASURY_MANAGER, newComponentAddress, false, true)));
    }

    function replaceStateManager(IOrganization organization, address newComponentAddress) internal returns(IStateManager oldComponent) {
        require(newComponentAddress != address(0), "void");
        oldComponent = IStateManager(organization.set(IOrganization.Component(Grimoire.COMPONENT_KEY_STATE_MANAGER, newComponentAddress, false ,true)));
    }

    function replaceMicroservicesManager(IOrganization organization, address newComponentAddress) internal returns(IMicroservicesManager oldComponent) {
        require(newComponentAddress != address(0), "void");
        oldComponent = IMicroservicesManager(organization.set(IOrganization.Component(Grimoire.COMPONENT_KEY_MICROSERVICES_MANAGER, newComponentAddress, true, true)));
    }

    function replaceProposalsManager(IOrganization organization, address newComponentAddress) internal returns(IProposalsManager oldComponent) {
        require(newComponentAddress != address(0), "void");
        oldComponent = IProposalsManager(organization.set(IOrganization.Component(Grimoire.COMPONENT_KEY_PROPOSALS_MANAGER, newComponentAddress, true, true)));
    }
}

library Treasury {
    using ReflectionUtilities for address;

    function storeETH(IOrganization organization, uint256 value) internal {
        if(value != 0) {
            organization.get(Grimoire.COMPONENT_KEY_TREASURY_MANAGER).submit(value, "");
        }
    }

    function callTemporaryFunction(ITreasuryManager treasuryManager, bytes4 selector, address subject, uint256 value, bytes memory data) internal returns(bytes memory response) {
        address oldServer = treasuryManager.setAdditionalFunction(selector, subject, false);
        response = address(treasuryManager).submit(value, abi.encodePacked(selector, data));
        treasuryManager.setAdditionalFunction(selector, oldServer, false);
    }
}

library State {
    using BytesUtilities for bytes;

    bytes32 constant public ENTRY_TYPE_ADDRESS = 0x421683f821a0574472445355be6d2b769119e8515f8376a1d7878523dfdecf7b;
    bytes32 constant public ENTRY_TYPE_ADDRESS_ARRAY = 0x23d8ff3dc5aed4a634bcf123581c95e70c60ac0e5246916790aef6d4451ff4c1;
    bytes32 constant public ENTRY_TYPE_BOOL = 0xc1053bdab4a5cf55238b667c39826bbb11a58be126010e7db397c1b67c24271b;
    bytes32 constant public ENTRY_TYPE_BOOL_ARRAY = 0x8761250c4d2c463ce51f91f5d2c2508fa9142f8a42aa9f30b965213bf3e6c2ac;
    bytes32 constant public ENTRY_TYPE_BYTES = 0xb963e9b45d014edd60cff22ec9ad383335bbc3f827be2aee8e291972b0fadcf2;
    bytes32 constant public ENTRY_TYPE_BYTES_ARRAY = 0x084b42f8a8730b98eb0305d92103d9107363192bb66162064a34dc5716ebe1a0;
    bytes32 constant public ENTRY_TYPE_STRING = 0x97fc46276c172633607a331542609db1e3da793fca183d594ed5a61803a10792;
    bytes32 constant public ENTRY_TYPE_STRING_ARRAY = 0xa227fd7a847724343a7dda3598ee0fb2d551b151b73e4a741067596daa6f5658;
    bytes32 constant public ENTRY_TYPE_UINT256 = 0xec13d6d12b88433319b64e1065a96ea19cd330ef6603f5f6fb685dde3959a320;
    bytes32 constant public ENTRY_TYPE_UINT256_ARRAY = 0xc1b76e99a35aa41ed28bbbd9e6c7228760c87b410ebac94fa6431da9b592411f;

    function getAddress(IStateManager stateManager, string memory name) internal view returns(address) {
        return stateManager.get(name).value.asAddress();
    }

    function setAddress(IStateManager stateManager, string memory name, address val) internal returns(address oldValue) {
        return stateManager.set(IStateManager.StateEntry(name, ENTRY_TYPE_ADDRESS, abi.encodePacked(val))).asAddress();
    }

    function getAddressArray(IStateManager stateManager, string memory name) internal view returns(address[] memory) {
        return stateManager.get(name).value.asAddressArray();
    }

    function setAddressArray(IStateManager stateManager, string memory name, address[] memory val) internal returns(address[] memory oldValue) {
        return stateManager.set(IStateManager.StateEntry(name, ENTRY_TYPE_ADDRESS_ARRAY, abi.encode(val))).asAddressArray();
    }

    function getBool(IStateManager stateManager, string memory name) internal view returns(bool) {
        return stateManager.get(name).value.asBool();
    }

    function setBool(IStateManager stateManager, string memory name, bool val) internal returns(bool oldValue) {
        return stateManager.set(IStateManager.StateEntry(name, ENTRY_TYPE_BOOL, abi.encode(val ? 1 : 0))).asBool();
    }

    function getBoolArray(IStateManager stateManager, string memory name) internal view returns(bool[] memory) {
        return stateManager.get(name).value.asBoolArray();
    }

    function setBoolArray(IStateManager stateManager, string memory name, bool[] memory val) internal returns(bool[] memory oldValue) {
        return stateManager.set(IStateManager.StateEntry(name, ENTRY_TYPE_BOOL_ARRAY, abi.encode(val))).asBoolArray();
    }

    function getBytes(IStateManager stateManager, string memory name) internal view returns(bytes memory) {
        return stateManager.get(name).value;
    }

    function setBytes(IStateManager stateManager, string memory name, bytes memory val) internal returns(bytes memory oldValue) {
        return stateManager.set(IStateManager.StateEntry(name, ENTRY_TYPE_BYTES, val));
    }

    function getBytesArray(IStateManager stateManager, string memory name) internal view returns(bytes[] memory) {
        return stateManager.get(name).value.asBytesArray();
    }

    function setBytesArray(IStateManager stateManager, string memory name, bytes[] memory val) internal returns(bytes[] memory oldValue) {
        return stateManager.set(IStateManager.StateEntry(name, ENTRY_TYPE_BYTES_ARRAY, abi.encode(val))).asBytesArray();
    }

    function getString(IStateManager stateManager, string memory name) internal view returns(string memory) {
        return string(stateManager.get(name).value);
    }

    function setString(IStateManager stateManager, string memory name, string memory val) internal returns(string memory oldValue) {
        return string(stateManager.set(IStateManager.StateEntry(name, ENTRY_TYPE_STRING, bytes(val))));
    }

    function getStringArray(IStateManager stateManager, string memory name) internal view returns(string[] memory) {
        return stateManager.get(name).value.asStringArray();
    }

    function setStringArray(IStateManager stateManager, string memory name, string[] memory val) internal returns(string[] memory oldValue) {
        return stateManager.set(IStateManager.StateEntry(name, ENTRY_TYPE_STRING_ARRAY, abi.encode(val))).asStringArray();
    }

    function getUint256(IStateManager stateManager, string memory name) internal view returns(uint256) {
        return stateManager.get(name).value.asUint256();
    }

    function setUint256(IStateManager stateManager, string memory name, uint256 val) internal returns(uint256 oldValue) {
        return stateManager.set(IStateManager.StateEntry(name, ENTRY_TYPE_UINT256, abi.encode(val))).asUint256();
    }

    function getUint256Array(IStateManager stateManager, string memory name) internal view returns(uint256[] memory) {
        return stateManager.get(name).value.asUint256Array();
    }

    function setUint256Array(IStateManager stateManager, string memory name, uint256[] memory val) internal returns(uint256[] memory oldValue) {
        return stateManager.set(IStateManager.StateEntry(name, ENTRY_TYPE_UINT256_ARRAY, abi.encode(val))).asUint256Array();
    }
}
// File: @ethereansos/swissknife/contracts/generic/impl/LazyInitCapableElement.sol


pragma solidity >=0.7.0;



abstract contract LazyInitCapableElement is ILazyInitCapableElement {
    using ReflectionUtilities for address;

    address public override initializer;
    address public override host;

    constructor(bytes memory lazyInitData) {
        if(lazyInitData.length > 0) {
            _privateLazyInit(lazyInitData);
        }
    }

    function lazyInit(bytes calldata lazyInitData) override external returns (bytes memory lazyInitResponse) {
        return _privateLazyInit(lazyInitData);
    }

    function supportsInterface(bytes4 interfaceId) override external view returns(bool) {
        return
            interfaceId == type(IERC165).interfaceId ||
            interfaceId == this.supportsInterface.selector ||
            interfaceId == type(ILazyInitCapableElement).interfaceId ||
            interfaceId == this.lazyInit.selector ||
            interfaceId == this.initializer.selector ||
            interfaceId == this.subjectIsAuthorizedFor.selector ||
            interfaceId == this.host.selector ||
            interfaceId == this.setHost.selector ||
            _supportsInterface(interfaceId);
    }

    function setHost(address newValue) external override authorizedOnly returns(address oldValue) {
        oldValue = host;
        host = newValue;
        emit Host(oldValue, newValue);
    }

    function subjectIsAuthorizedFor(address subject, address location, bytes4 selector, bytes calldata payload, uint256 value) public override virtual view returns(bool) {
        (bool chidlElementValidationIsConsistent, bool chidlElementValidationResult) = _subjectIsAuthorizedFor(subject, location, selector, payload, value);
        if(chidlElementValidationIsConsistent) {
            return chidlElementValidationResult;
        }
        if(subject == host) {
            return true;
        }
        if(!host.isContract()) {
            return false;
        }
        (bool result, bytes memory resultData) = host.staticcall(abi.encodeWithSelector(ILazyInitCapableElement(host).subjectIsAuthorizedFor.selector, subject, location, selector, payload, value));
        return result && abi.decode(resultData, (bool));
    }

    function _privateLazyInit(bytes memory lazyInitData) private returns (bytes memory lazyInitResponse) {
        require(initializer == address(0), "init");
        initializer = msg.sender;
        (host, lazyInitResponse) = abi.decode(lazyInitData, (address, bytes));
        emit Host(address(0), host);
        lazyInitResponse = _lazyInit(lazyInitResponse);
    }

    function _lazyInit(bytes memory) internal virtual returns (bytes memory) {
        return "";
    }

    function _supportsInterface(bytes4 selector) internal virtual view returns (bool);

    function _subjectIsAuthorizedFor(address, address, bytes4, bytes calldata, uint256) internal virtual view returns(bool, bool) {
    }

    modifier authorizedOnly {
        require(_authorizedOnly(), "unauthorized");
        _;
    }

    function _authorizedOnly() internal returns(bool) {
        return subjectIsAuthorizedFor(msg.sender, address(this), msg.sig, msg.data, msg.value);
    }
}
// File: contracts/ext/util/IFarmingExtensionRegular.sol


pragma solidity >=0.7.0;



interface IFarmingExtensionRegular is ILazyInitCapableElement {

    function init(bool byMint, address host, address treasury) external;

    function setTreasury(address treasury) external;

    function data() external view returns(address farmMainContract, bool byMint, address host, address treasury, address rewardTokenAddress);

    function transferTo(uint256 amount) external;

    function backToYou(uint256 amount) external payable;

    function setFarmingSetups(FarmingSetupConfiguration[] memory farmingSetups) external;
}
// File: contracts/ext/modelBasedFarmingManager/model/IModelBasedFarmingManager.sol


pragma solidity >=0.7.0;



interface IModelBasedFarmingManager is ILazyInitCapableElement, IFarmingExtensionRegular {

    function executorRewardPercentage() external view returns(uint256);

    function setExecutorRewardPercentage(uint256 newValue) external returns(uint256 oldValue);

    function reservedBalance() external view returns (uint256);

    function lastRebalanceBlock() external view returns (uint256);

    function rebalanceInterval() external view returns (uint256);

    function nextRebalanceBlock() external view returns (uint256);

    function models() external view returns(FarmingSetupInfo[] memory farmingSetups, uint256[] memory rebalancePercentages);

    function flushBackToTreasury(address[] calldata tokenAddresses) external;

    function rebalanceRewardsPerBlock(address executorRewardReceiver) external;
}
// File: contracts/ext/modelBasedFarmingManager/impl/ModelBasedFarmingManager.sol


pragma solidity >=0.7.0;









contract ModelBasedFarmingManager is IModelBasedFarmingManager, LazyInitCapableElement {
    using Getters for IOrganization;
    using TransferUtilities for address;

    uint256 private constant ONE_HUNDRED = 1e18;

    uint256 public override executorRewardPercentage;

    bytes32 private _flushKey;

    FarmingSetupInfo[] private _models;
    uint256[] private _rebalancePercentages;

    address private _farmingContract;

    address private _rewardTokenAddress;

    uint256 public override lastRebalanceBlock;
    uint256 public override rebalanceInterval;

    uint256 public override reservedBalance;

    modifier farmingOnly() {
        require(msg.sender == _farmingContract, "Unauthorized");
        _;
    }

    constructor(bytes memory lazyInitData) LazyInitCapableElement(lazyInitData) {
    }

    function _lazyInit(bytes memory lazyInitData) internal override returns(bytes memory) {
        uint256 firstRebalanceBlock;
        uint256 _rebalanceInterval;

        FarmingSetupInfo[] memory infoModels;
        (_flushKey, executorRewardPercentage, infoModels, _rebalancePercentages, firstRebalanceBlock, _rebalanceInterval) = abi.decode(lazyInitData, (bytes32, uint256, FarmingSetupInfo[], uint256[], uint256, uint256));

        for(uint256 i = 0; i < infoModels.length; i++) {
            _models.push(infoModels[i]);
        }

        if((rebalanceInterval = _rebalanceInterval) > 0) {
            if(firstRebalanceBlock != 0 && _rebalanceInterval < firstRebalanceBlock) {
                lastRebalanceBlock = firstRebalanceBlock - _rebalanceInterval;
            }
        }
        _rewardTokenAddress = IFarmMainRegular(_farmingContract = msg.sender)._rewardTokenAddress();
        _setModels(_models, _rebalancePercentages);
        return "";
    }

    receive() external payable {
        require (_rewardTokenAddress == address(0));
    }

    function _supportsInterface(bytes4 interfaceId) override internal pure returns(bool) {
        return
            interfaceId == type(IFarmingExtensionRegular).interfaceId ||
            interfaceId == this.init.selector ||
            interfaceId == this.setTreasury.selector ||
            interfaceId == this.data.selector ||
            interfaceId == this.transferTo.selector ||
            interfaceId == this.backToYou.selector ||
            interfaceId == this.setFarmingSetups.selector ||
            interfaceId == type(IModelBasedFarmingManager).interfaceId ||
            interfaceId == this.reservedBalance.selector ||
            interfaceId == this.lastRebalanceBlock.selector ||
            interfaceId == this.rebalanceInterval.selector ||
            interfaceId == this.nextRebalanceBlock.selector ||
            interfaceId == this.models.selector ||
            interfaceId == this.flushBackToTreasury.selector ||
            interfaceId == this.rebalanceRewardsPerBlock.selector;
    }

    function init(bool, address, address) external override {
        revert("Impossibru!");
    }

    function setTreasury(address) external override authorizedOnly {
        revert("Impossibru!");
    }

    function data() view public virtual override returns(address farmingContract, bool byMint, address _host, address treasury, address rewardTokenAddress) {
        return (_farmingContract, false, host, address(IOrganization(host).treasuryManager()), _rewardTokenAddress);
    }

    function transferTo(uint256 amount) external override farmingOnly {
        reservedBalance -= amount;
        _rewardTokenAddress.safeTransfer(_farmingContract, amount);
    }

    function backToYou(uint256 amount) payable external override farmingOnly {
        if(_rewardTokenAddress != address(0)) {
            return _rewardTokenAddress.safeTransferFrom(msg.sender, address(this), amount);
        }
        require(msg.value == amount, "invalid sent amount");
    }

    function setFarmingSetups(FarmingSetupConfiguration[] memory farmingSetups) external override authorizedOnly {
        IFarmMainRegular(_farmingContract).setFarmingSetups(farmingSetups);
    }

    function setExecutorRewardPercentage(uint256 newValue) external override authorizedOnly returns(uint256 oldValue) {
        oldValue = executorRewardPercentage;
        executorRewardPercentage = newValue;
    }

    function nextRebalanceBlock() public override view returns (uint256) {
        return lastRebalanceBlock == 0 || rebalanceInterval == 0 ? 0 : (lastRebalanceBlock + rebalanceInterval);
    }

    function models() external override view returns(FarmingSetupInfo[] memory, uint256[] memory) {
        return (_models, _rebalancePercentages);
    }

    function flushBackToTreasury(address[] calldata tokenAddresses) external override authorizedOnly {
        address to = _flushBackReceiver();
        for(uint256 i = 0; i < tokenAddresses.length; i++) {
            address tokenAddress = tokenAddresses[i];
            uint256 balance = tokenAddress.balanceOf(address(this));
            if(balance > 0) {
                tokenAddress.safeTransfer(to, balance);
            }
        }
    }

    function _flushBackReceiver() private view returns(address to) {
        if(_flushKey != bytes32(0)) {
            to = address(IOrganization(host).get(_flushKey));
        }
        to = to != address(0) ? to : address(IOrganization(host).treasuryManager());
    }

    function rebalanceRewardsPerBlock(address executorRewardReceiver) external override {
        require(block.number >= nextRebalanceBlock(), "Too early BRO");
        lastRebalanceBlock = block.number;

        uint256 actualBalance = _rewardTokenAddress.balanceOf(address(this));

        require(actualBalance > 0, "no balance");

        uint256 balance = actualBalance < reservedBalance ? 0 : actualBalance - reservedBalance;

        require(balance > 0, "No balance!");

        if(executorRewardPercentage > 0) {
            address to = executorRewardReceiver == address(0) ? msg.sender : executorRewardReceiver;
            uint256 executorRewardFee = _calculatePercentage(balance, executorRewardPercentage);
            _rewardTokenAddress.safeTransfer(to, executorRewardFee);
            balance -= executorRewardFee;
        }

        reservedBalance += balance;

        uint256 remainingBalance = balance;
        uint256 currentReward = 0;
        FarmingSetupConfiguration[] memory farmingSetups = new FarmingSetupConfiguration[](_models.length);
        uint256 i;
        for(i = 0; i < _rebalancePercentages.length; i++) {
            require((_models[i].originalRewardPerBlock = (currentReward = _calculatePercentage(balance, _rebalancePercentages[i])) / _models[i].blockDuration) > 0, "zero reward");
            require(currentReward < remainingBalance && currentReward < balance, "overflow");
            remainingBalance -= currentReward;
            farmingSetups[i] = FarmingSetupConfiguration(
                true,
                false,
                0,
                _models[i]
            );
        }
        i = _rebalancePercentages.length;
        _models[i].originalRewardPerBlock = remainingBalance / _models[i].blockDuration;
        farmingSetups[i] = FarmingSetupConfiguration(
            true,
            false,
            0,
            _models[i]
        );
        IFarmMainRegular(_farmingContract).setFarmingSetups(farmingSetups);
    }

    function _setModels(FarmingSetupInfo[] memory farmingSetups, uint256[] memory rebalancePercentages) private returns(FarmingSetupInfo[] memory oldFarmingSetups, uint256[] memory oldRebalancePercentages) {
        require(farmingSetups.length > 0 && (farmingSetups.length - 1) == _rebalancePercentages.length, "Invalid data");
        oldFarmingSetups = _models;
        oldRebalancePercentages = _rebalancePercentages;
        delete _rebalancePercentages;
        delete _models;
        uint256 percentage = 0;
        for(uint256 i = 0; i < rebalancePercentages.length; i++) {
            farmingSetups[i].renewTimes = 0;
            _models.push(farmingSetups[i]);
            percentage += rebalancePercentages[i];
            _rebalancePercentages.push(rebalancePercentages[i]);
        }
        farmingSetups[farmingSetups.length - 1].renewTimes = 0;
        _models.push(farmingSetups[farmingSetups.length - 1]);
        require(percentage < ONE_HUNDRED, "More than one hundred");
    }

    function _calculatePercentage(uint256 totalSupply, uint256 percentage) private pure returns(uint256) {
        return (totalSupply * ((percentage * 1e18) / ONE_HUNDRED)) / 1e18;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes","name":"lazyInitData","type":"bytes"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Host","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"backToYou","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"data","outputs":[{"internalType":"address","name":"farmingContract","type":"address"},{"internalType":"bool","name":"byMint","type":"bool"},{"internalType":"address","name":"_host","type":"address"},{"internalType":"address","name":"treasury","type":"address"},{"internalType":"address","name":"rewardTokenAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"executorRewardPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokenAddresses","type":"address[]"}],"name":"flushBackToTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"host","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRebalanceBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"lazyInitData","type":"bytes"}],"name":"lazyInit","outputs":[{"internalType":"bytes","name":"lazyInitResponse","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"models","outputs":[{"components":[{"internalType":"uint256","name":"blockDuration","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"originalRewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"minStakeable","type":"uint256"},{"internalType":"uint256","name":"renewTimes","type":"uint256"},{"internalType":"address","name":"liquidityPoolTokenAddress","type":"address"},{"internalType":"address","name":"mainTokenAddress","type":"address"},{"internalType":"bool","name":"involvingETH","type":"bool"},{"internalType":"uint256","name":"setupsCount","type":"uint256"},{"internalType":"uint256","name":"lastSetupIndex","type":"uint256"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"}],"internalType":"struct FarmingSetupInfo[]","name":"","type":"tuple[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextRebalanceBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebalanceInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"executorRewardReceiver","type":"address"}],"name":"rebalanceRewardsPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setExecutorRewardPercentage","outputs":[{"internalType":"uint256","name":"oldValue","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"bool","name":"disable","type":"bool"},{"internalType":"uint256","name":"index","type":"uint256"},{"components":[{"internalType":"uint256","name":"blockDuration","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"originalRewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"minStakeable","type":"uint256"},{"internalType":"uint256","name":"renewTimes","type":"uint256"},{"internalType":"address","name":"liquidityPoolTokenAddress","type":"address"},{"internalType":"address","name":"mainTokenAddress","type":"address"},{"internalType":"bool","name":"involvingETH","type":"bool"},{"internalType":"uint256","name":"setupsCount","type":"uint256"},{"internalType":"uint256","name":"lastSetupIndex","type":"uint256"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"}],"internalType":"struct FarmingSetupInfo","name":"info","type":"tuple"}],"internalType":"struct FarmingSetupConfiguration[]","name":"farmingSetups","type":"tuple[]"}],"name":"setFarmingSetups","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newValue","type":"address"}],"name":"setHost","outputs":[{"internalType":"address","name":"oldValue","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"subject","type":"address"},{"internalType":"address","name":"location","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"subjectIsAuthorizedFor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

Deployed Bytecode

0x60806040526004361061012e5760003560e01c80639986df2c116100ab578063c85e0be21161006f578063c85e0be21461036a578063cd6e1d7c1461038a578063de859680146103aa578063e15cc7a0146103ca578063f0f44260146103ea578063f437bc591461040a57600080fd5b80639986df2c146102b95780639ce110d7146102dc578063a1aabda614610314578063a5bd290b1461032a578063ba0f49b71461034a57600080fd5b8063457f4bcc116100f2578063457f4bcc146101f257806373d4a13a1461021f5780637517f9b81461026e578063780f581914610284578063814809021461029957600080fd5b806301ffc9a7146101505780630346140d146101855780630569256a146101a5578063130721b6146101b857806316d1d916146101dc57600080fd5b3661014b576007546001600160a01b03161561014957600080fd5b005b600080fd5b34801561015c57600080fd5b5061017061016b366004612aa4565b61042a565b60405190151581526020015b60405180910390f35b34801561019157600080fd5b506101496101a03660046128b7565b610512565b6101496101b3366004612b01565b61054d565b3480156101c457600080fd5b506101ce60025481565b60405190815260200161017c565b3480156101e857600080fd5b506101ce60095481565b3480156101fe57600080fd5b5061021261020d366004612abf565b610607565b60405161017c9190612d59565b34801561022b57600080fd5b5061023461064f565b604080516001600160a01b03968716815294151560208601529285169284019290925283166060830152909116608082015260a00161017c565b34801561027a57600080fd5b506101ce60085481565b34801561029057600080fd5b506101ce610696565b3480156102a557600080fd5b506101ce6102b4366004612b01565b6106c8565b3480156102c557600080fd5b506102ce6106f9565b60405161017c929190612ce0565b3480156102e857600080fd5b506000546102fc906001600160a01b031681565b6040516001600160a01b03909116815260200161017c565b34801561032057600080fd5b506101ce600a5481565b34801561033657600080fd5b5061014961034536600461251a565b610852565b34801561035657600080fd5b50610149610365366004612b01565b610e49565b34801561037657600080fd5b506102fc61038536600461251a565b610ec6565b34801561039657600080fd5b506101706103a53660046125fe565b610f40565b3480156103b657600080fd5b506101496103c53660046126f5565b611071565b3480156103d657600080fd5b506101496103e5366004612680565b6110fa565b3480156103f657600080fd5b5061014961040536600461251a565b6111ac565b34801561041657600080fd5b506001546102fc906001600160a01b031681565b60006001600160e01b031982166301ffc9a760e01b148061045b57506001600160e01b031982166301ffc9a760e01b145b8061047657506001600160e01b03198216630a267c7760e21b145b8061049157506001600160e01b0319821663115fd2f360e21b145b806104ac57506001600160e01b03198216639ce110d760e01b145b806104c757506001600160e01b0319821663335b875f60e21b145b806104e257506001600160e01b0319821663f437bc5960e01b145b806104fd57506001600160e01b0319821663642f05f160e11b145b8061050c575061050c826111d0565b92915050565b60405162461bcd60e51b815260206004820152600b60248201526a496d706f7373696272752160a81b60448201526064015b60405180910390fd5b6006546001600160a01b031633146105965760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610544565b6007546001600160a01b0316156105c2576007546105bf906001600160a01b0316333084611365565b50565b8034146105bf5760405162461bcd60e51b81526020600482015260136024820152721a5b9d985b1a59081cd95b9d08185b5bdd5b9d606a1b6044820152606401610544565b606061064883838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061146d92505050565b9392505050565b60065460015460009182918291829182916001600160a01b03908116918391166106788161152f565b600754939992985090965094506001600160a01b0390911692509050565b6000600854600014806106a95750600954155b6106c2576009546008546106bd9190612e54565b905090565b50600090565b60006106d26115c9565b6106ee5760405162461bcd60e51b815260040161054490612d8c565b506002805491905590565b6060806004600581805480602002602001604051908101604052809291908181526020016000905b828210156107f25760008481526020908190206040805161018081018252600a8602909201805483526001808201548486015260028083015493850193909352600382015460608501526004820154608085015260058201546001600160a01b0390811660a0860152600683015490811660c0860152600160a01b900460ff16151560e08501526007820154610100850152600882015461012085015260099091015480830b830b830b61014085015263010000009004820b820b90910b6101608301529083529092019101610721565b5050505091508080548060200260200160405190810160405280929190818152602001828054801561084357602002820191906000526020600020905b81548152602001906001019080831161082f575b50505050509050915091509091565b61085a610696565b4310156108995760405162461bcd60e51b815260206004820152600d60248201526c546f6f206561726c792042524f60981b6044820152606401610544565b436008556007546000906108b6906001600160a01b0316306115e6565b9050600081116108f55760405162461bcd60e51b815260206004820152600a6024820152696e6f2062616c616e636560b01b6044820152606401610544565b6000600a54821061091257600a5461090d9083612ead565b610915565b60005b9050600081116109555760405162461bcd60e51b815260206004820152600b60248201526a4e6f2062616c616e63652160a81b6044820152606401610544565b600254156109af5760006001600160a01b038416156109745783610976565b335b905060006109868360025461166a565b6007549091506109a0906001600160a01b0316838361169e565b6109aa8184612ead565b925050505b80600a60008282546109c19190612e54565b90915550506004548190600090819067ffffffffffffffff8111156109e8576109e8612f37565b604051908082528060200260200182016040528015610a2157816020015b610a0e612247565b815260200190600190039081610a065790505b50905060005b600554811015610c6957600060048281548110610a4657610a46612f21565b90600052602060002090600a020160000154610a7f8760058581548110610a6f57610a6f612f21565b906000526020600020015461166a565b9450610a8b9085612e6c565b60048381548110610a9e57610a9e612f21565b90600052602060002090600a020160020181905511610aed5760405162461bcd60e51b815260206004820152600b60248201526a1e995c9bc81c995dd85c9960aa1b6044820152606401610544565b8383108015610afb57508483105b610b325760405162461bcd60e51b81526020600482015260086024820152676f766572666c6f7760c01b6044820152606401610544565b610b3c8385612ead565b935060405180608001604052806001151581526020016000151581526020016000815260200160048381548110610b7557610b75612f21565b60009182526020918290206040805161018081018252600a9093029091018054835260018101549383019390935260028084015491830191909152600383015460608301526004830154608083015260058301546001600160a01b0390811660a0840152600684015490811660c084015260ff600160a01b90910416151560e08301526007830154610100830152600883015461012083015260099092015480830b830b830b61014083015263010000009004820b820b90910b61016082015290528251839083908110610c4b57610c4b612f21565b60200260200101819052508080610c6190612ef0565b915050610a27565b506005546004805482908110610c8157610c81612f21565b90600052602060002090600a02016000015484610c9e9190612e6c565b60048281548110610cb157610cb1612f21565b90600052602060002090600a02016002018190555060405180608001604052806001151581526020016000151581526020016000815260200160048381548110610cfd57610cfd612f21565b60009182526020918290206040805161018081018252600a9093029091018054835260018101549383019390935260028084015491830191909152600383015460608301526004830154608083015260058301546001600160a01b0390811660a0840152600684015490811660c084015260ff600160a01b90910416151560e08301526007830154610100830152600883015461012083015260099092015480830b830b830b61014083015263010000009004820b820b90910b61016082015290528251839083908110610dd357610dd3612f21565b60209081029190910101526006546040516301bd0b2d60e71b81526001600160a01b039091169063de85968090610e0e908590600401612c6b565b600060405180830381600087803b158015610e2857600080fd5b505af1158015610e3c573d6000803e3d6000fd5b5050505050505050505050565b6006546001600160a01b03163314610e925760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610544565b80600a6000828254610ea49190612ead565b90915550506006546007546105bf916001600160a01b0391821691168361169e565b6000610ed06115c9565b610eec5760405162461bcd60e51b815260040161054490612d8c565b50600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fe2302c6b581cf0c2edec4248d3a7af323db67692e29b6dc37a7d9736bf5e436990600090a3919050565b600080806001546001600160a01b038a811691161415610f6557600192505050611067565b600154610f7a906001600160a01b0316611794565b610f8957600092505050611067565b60015460405160009182916001600160a01b039091169063335b875f60e21b90610fc1908e908e908e908e908e908e90602401612c07565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610fff9190612beb565b600060405180830381855afa9150503d806000811461103a576040519150601f19603f3d011682016040523d82523d6000602084013e61103f565b606091505b5091509150818015611060575080806020019051810190611060919061289a565b9450505050505b9695505050505050565b6110796115c9565b6110955760405162461bcd60e51b815260040161054490612d8c565b6006546040516301bd0b2d60e71b81526001600160a01b039091169063de859680906110c5908490600401612c6b565b600060405180830381600087803b1580156110df57600080fd5b505af11580156110f3573d6000803e3d6000fd5b5050505050565b6111026115c9565b61111e5760405162461bcd60e51b815260040161054490612d8c565b60006111286117b3565b905060005b828110156111a657600084848381811061114957611149612f21565b905060200201602081019061115e919061251a565b905060006111756001600160a01b038316306115e6565b90508015611191576111916001600160a01b038316858361169e565b5050808061119e90612ef0565b91505061112d565b50505050565b6111b46115c9565b6105125760405162461bcd60e51b815260040161054490612d8c565b60006001600160e01b031982166370c2868560e11b148061120157506001600160e01b03198216630346140d60e01b145b8061121c57506001600160e01b03198216630787a21360e51b145b8061123757506001600160e01b031982166339ea509d60e11b145b8061125257506001600160e01b0319821663ba0f49b760e01b145b8061126d57506001600160e01b031982166302b492b560e11b145b8061128857506001600160e01b031982166301bd0b2d60e71b145b806112a357506001600160e01b03198216637aa5ee1160e11b145b806112be57506001600160e01b031982166350d55ed360e11b145b806112d957506001600160e01b03198216630ea2ff3760e31b145b806112f457506001600160e01b03198216630b68ec8b60e11b145b8061130f57506001600160e01b0319821663780f581960e01b145b8061132a57506001600160e01b03198216632661b7cb60e21b145b8061134557506001600160e01b0319821663070ae63d60e51b145b8061050c57506001600160e01b0319821663a5bd290b60e01b1492915050565b8061136f576111a6565b6001600160a01b0384166113a8576040805160208101909152600081526113a2906001600160a01b03841690839061186c565b506111a6565b604080516001600160a01b038581166024830152848116604483015260648083018590528351808403909101815260849092019092526020810180516001600160e01b03166323b872dd60e01b17905260009161140a9190871690839061186c565b905080516000148061142b57508080602001905181019061142b919061289a565b6110f35760405162461bcd60e51b81526020600482015260136024820152721514905394d19154919493d357d19052531151606a1b6044820152606401610544565b6000546060906001600160a01b0316156114b25760405162461bcd60e51b8152600401610544906020808252600490820152631a5b9a5d60e21b604082015260600190565b600080546001600160a01b0319163317905581516114d99083016020908101908401612554565b600180546001600160a01b039093166001600160a01b0319909316831790556040519092506000907fe2302c6b581cf0c2edec4248d3a7af323db67692e29b6dc37a7d9736bf5e4369908290a361050c816118e5565b60405163023aa9ab60e61b81527fcfe1633df53a0649d88d788961f26058c5e7a0b5644675f19f67bb2975827ba260048201526000906001600160a01b03831690638eaa6ac09060240160206040518083038186803b15801561159157600080fd5b505afa1580156115a5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050c9190612537565b60006106bd33306000356001600160e01b03191660003634610f40565b60006001600160a01b03831661160757506001600160a01b0381163161050c565b604080516001600160a01b038481166024808401919091528351808403909101815260449092019092526020810180516001600160e01b03166370a0823160e01b17905261165791851690611cae565b8060200190518101906106489190612b1a565b6000670de0b6b3a7640000806116808482612e8e565b61168a9190612e6c565b6116949085612e8e565b6106489190612e6c565b806116a857505050565b6001600160a01b0383166116db576040805160208101909152600081526111a6906001600160a01b03841690839061186c565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092019092526020810180516001600160e01b031663a9059cbb60e01b1790526000916117359190861690839061186c565b9050805160001480611756575080806020019051810190611756919061289a565b6111a65760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b6044820152606401610544565b60006001600160a01b0382166117ac57506000919050565b503b151590565b600354600090156118465760015460035460405163023aa9ab60e61b81526001600160a01b0390921691638eaa6ac0916117f39160040190815260200190565b60206040518083038186803b15801561180b57600080fd5b505afa15801561181f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118439190612537565b90505b6001600160a01b038116611869576001546106bd906001600160a01b031661152f565b90565b60606000846001600160a01b031684846040516118899190612beb565b60006040518083038185875af1925050503d80600081146118c6576040519150601f19603f3d011682016040523d82523d6000602084013e6118cb565b606091505b5092509050806118dd57815160208301fd5b509392505050565b60606000806060848060200190518101906119009190612902565b600360006002600060056000869d50879e508891905090805190602001906119299291906122ee565b50509690965595909555509093506000925050505b8151811015611a6f57600482828151811061195b5761195b612f21565b6020908102919091018101518254600181810185556000948552938390208251600a9092020190815591810151928201929092556040820151600280830191909155606083015160038301556080830151600483015560a08301516005830180546001600160a01b039283166001600160a01b031990911617905560c084015160068401805460e08701511515600160a01b026001600160a81b03199091169290931691909117919091179055610100830151600783015561012083015160088301556101408301516009909201805461016090940151820b62ffffff90811663010000000265ffffffffffff199095169390920b9091169190911791909117905580611a6781612ef0565b91505061193e565b5060098290558115611a9c578215801590611a8957508282105b15611a9c57611a988284612ead565b6008555b600680546001600160a01b03191633908117909155604080516217216d60e61b815290516305c85b4091600480820192602092909190829003018186803b158015611ae657600080fd5b505afa158015611afa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1e9190612537565b600760006101000a8154816001600160a01b0302191690836001600160a01b03160217905550611c946004805480602002602001604051908101604052809291908181526020016000905b82821015611c3a5760008481526020908190206040805161018081018252600a8602909201805483526001808201548486015260028083015493850193909352600382015460608501526004820154608085015260058201546001600160a01b0390811660a0860152600683015490811660c0860152600160a01b900460ff16151560e08501526007820154610100850152600882015461012085015260099091015480830b830b830b61014085015263010000009004820b820b90910b6101608301529083529092019101611b69565b505050506005805480602002602001604051908101604052809291908181526020018280548015611c8a57602002820191906000526020600020905b815481526020019060010190808311611c76575b5050505050611d23565b505060408051602081019091526000815295945050505050565b60606000836001600160a01b031683604051611cca9190612beb565b600060405180830381855afa9150503d8060008114611d05576040519150601f19603f3d011682016040523d82523d6000602084013e611d0a565b606091505b509250905080611d1c57815160208301fd5b5092915050565b60608060008451118015611d4557506005548451611d4390600190612ead565b145b611d805760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964206461746160a01b6044820152606401610544565b6004805480602002602001604051908101604052809291908181526020016000905b82821015611e735760008481526020908190206040805161018081018252600a8602909201805483526001808201548486015260028083015493850193909352600382015460608501526004820154608085015260058201546001600160a01b0390811660a0860152600683015490811660c0860152600160a01b900460ff16151560e08501526007820154610100850152600882015461012085015260099091015480830b830b830b61014085015263010000009004820b820b90910b6101608301529083529092019101611da2565b5050505091506005805480602002602001604051908101604052809291908181526020018280548015611ec557602002820191906000526020600020905b815481526020019060010190808311611eb1575b5050505050905060056000611eda9190612339565b611ee660046000612357565b6000805b845181101561209b576000868281518110611f0757611f07612f21565b602002602001015160800181815250506004868281518110611f2b57611f2b612f21565b6020908102919091018101518254600181810185556000948552938390208251600a9092020190815591810151928201929092556040820151600280830191909155606083015160038301556080830151600483015560a08301516005830180546001600160a01b039283166001600160a01b031990911617905560c084015160068401805460e08701511515600160a01b026001600160a81b03199091169290931691909117919091179055610100830151600783015561012083015160088301556101408301516009909201805461016090940151820b62ffffff90811663010000000265ffffffffffff199095169390920b90911691909117919091179055845185908290811061204157612041612f21565b6020026020010151826120549190612e54565b9150600585828151811061206a5761206a612f21565b602090810291909101810151825460018101845560009384529190922001558061209381612ef0565b915050611eea565b50600085600187516120ad9190612ead565b815181106120bd576120bd612f21565b60200260200101516080018181525050600485600187516120de9190612ead565b815181106120ee576120ee612f21565b6020908102919091018101518254600181810185556000948552938390208251600a9092020190815591810151928201929092556040820151600280830191909155606083015160038301556080830151600483015560a08301516005830180546001600160a01b039283166001600160a01b031990911617905560c084015160068401805460e08701511515600160a01b026001600160a81b03199091169290931691909117919091179055610100830151600783015561012083015160088301556101408301516009909201805461016090940151820b62ffffff90811663010000000265ffffffffffff199095169390920b90911691909117919091179055670de0b6b3a7640000811061223f5760405162461bcd60e51b8152602060048201526015602482015274135bdc99481d1a185b881bdb99481a1d5b991c9959605a1b6044820152606401610544565b509250929050565b6040518060800160405280600015158152602001600015158152602001600081526020016122e9604051806101800160405280600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000151581526020016000815260200160008152602001600060020b8152602001600060020b81525090565b905290565b828054828255906000526020600020908101928215612329579160200282015b8281111561232957825182559160200191906001019061230e565b50612335929150612378565b5090565b50805460008255906000526020600020908101906105bf9190612378565b50805460008255600a02906000526020600020908101906105bf919061238d565b5b808211156123355760008155600101612379565b5b80821115612335576000808255600182018190556002820181905560038201819055600482018190556005820180546001600160a01b03191690556006820180546001600160a81b031916905560078201819055600882015560098101805465ffffffffffff19169055600a0161238e565b803561240b81612f4d565b919050565b805161240b81612f4d565b600082601f83011261242c57600080fd5b8151602061244161243c83612e30565b612dff565b80838252828201915082860187848660051b890101111561246157600080fd5b60005b8581101561248057815184529284019290840190600101612464565b5090979650505050505050565b803561240b81612f62565b805161240b81612f62565b80356001600160e01b03198116811461240b57600080fd5b60008083601f8401126124cd57600080fd5b50813567ffffffffffffffff8111156124e557600080fd5b6020830191508360208285010111156124fd57600080fd5b9250929050565b803561240b81612f70565b805161240b81612f70565b60006020828403121561252c57600080fd5b813561064881612f4d565b60006020828403121561254957600080fd5b815161064881612f4d565b6000806040838503121561256757600080fd5b825161257281612f4d565b602084015190925067ffffffffffffffff8082111561259057600080fd5b818501915085601f8301126125a457600080fd5b8151818111156125b6576125b6612f37565b6125c9601f8201601f1916602001612dff565b91508082528660208285010111156125e057600080fd5b6125f1816020840160208601612ec4565b5080925050509250929050565b60008060008060008060a0878903121561261757600080fd5b863561262281612f4d565b9550602087013561263281612f4d565b9450612640604088016124a3565b9350606087013567ffffffffffffffff81111561265c57600080fd5b61266889828a016124bb565b979a9699509497949695608090950135949350505050565b6000806020838503121561269357600080fd5b823567ffffffffffffffff808211156126ab57600080fd5b818501915085601f8301126126bf57600080fd5b8135818111156126ce57600080fd5b8660208260051b85010111156126e357600080fd5b60209290920196919550909350505050565b6000602080838503121561270857600080fd5b823567ffffffffffffffff81111561271f57600080fd5b8301601f8101851361273057600080fd5b803561273e61243c82612e30565b818152838101908385016101e0808502860187018a101561275e57600080fd5b600095505b8486101561288c57818a038181121561277b57600080fd5b612783612db2565b833561278e81612f62565b81528389013561279d81612f62565b818a0152604084810135818301526060610180605f1985018113156127c157600080fd5b6127c9612ddb565b94508187013585526080808801358d87015260a0808901358588015260c09450848901358488015260e0808a013583890152610100925061280b838b01612400565b82890152610120915061281f828b01612400565b868901526101409550612833868b0161248d565b908801526101608981013583890152838a0135828901526128576101a08b01612504565b868901526128686101c08b01612504565b90880152505050820192909252855250600195909501949286019290810190612763565b509098975050505050505050565b6000602082840312156128ac57600080fd5b815161064881612f62565b6000806000606084860312156128cc57600080fd5b83356128d781612f62565b925060208401356128e781612f4d565b915060408401356128f781612f4d565b809150509250925092565b60008060008060008060c0878903121561291b57600080fd5b8651955060208701519450604087015167ffffffffffffffff8082111561294157600080fd5b818901915089601f83011261295557600080fd5b815161296361243c82612e30565b80828252602082019150602085018d60206101808602880101111561298757600080fd5b600095505b83861015612a6257610180818f0312156129a557600080fd5b6129ad612ddb565b81518152602082015160208201526040820151604082015260608201516060820152608082015160808201526129e560a08301612410565b60a08201526129f660c08301612410565b60c0820152612a0760e08301612498565b60e0820152610100820151610100820152610120820151610120820152612a31610140830161250f565b610140820152612a44610160830161250f565b6101608201528352600195909501946020909201916101800161298c565b5060608c01519098509350505080821115612a7c57600080fd5b50612a8989828a0161241b565b9350506080870151915060a087015190509295509295509295565b600060208284031215612ab657600080fd5b610648826124a3565b60008060208385031215612ad257600080fd5b823567ffffffffffffffff811115612ae957600080fd5b612af5858286016124bb565b90969095509350505050565b600060208284031215612b1357600080fd5b5035919050565b600060208284031215612b2c57600080fd5b5051919050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a0810151612b7960a08401826001600160a01b03169052565b5060c0810151612b9460c08401826001600160a01b03169052565b5060e0810151612ba860e084018215159052565b506101008181015190830152610120808201519083015261014080820151612bd48285018260020b9052565b5050610160808201516111a68285018260020b9052565b60008251612bfd818460208701612ec4565b9190910192915050565b6001600160a01b038781168252861660208201526001600160e01b03198516604082015260a06060820181905281018390526000838560c0840137600060c0858401015260c0601f19601f8601168301019050826080830152979650505050505050565b602080825282518282018190526000919060409081850190868401855b82811015612cd357815180511515855286810151151587860152858101518686015260609081015190612cbd81870183612b33565b50506101e0939093019290850190600101612c88565b5091979650505050505050565b604080825283519082018190526000906020906060840190828701845b82811015612d2457612d10848351612b33565b610180939093019290840190600101612cfd565b5050508381038285015284518082528583019183019060005b8181101561248057835183529284019291840191600101612d3d565b6020815260008251806020840152612d78816040850160208701612ec4565b601f01601f19169190910160400192915050565b6020808252600c908201526b1d5b985d5d1a1bdc9a5e995960a21b604082015260600190565b6040516080810167ffffffffffffffff81118282101715612dd557612dd5612f37565b60405290565b604051610180810167ffffffffffffffff81118282101715612dd557612dd5612f37565b604051601f8201601f1916810167ffffffffffffffff81118282101715612e2857612e28612f37565b604052919050565b600067ffffffffffffffff821115612e4a57612e4a612f37565b5060051b60200190565b60008219821115612e6757612e67612f0b565b500190565b600082612e8957634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612ea857612ea8612f0b565b500290565b600082821015612ebf57612ebf612f0b565b500390565b60005b83811015612edf578181015183820152602001612ec7565b838111156111a65750506000910152565b6000600019821415612f0457612f04612f0b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146105bf57600080fd5b80151581146105bf57600080fd5b8060020b81146105bf57600080fdfea26469706673582212208a1e237207eb49d438db7147965ed108daa63346d0a7055dac759b75ffb45e2b64736f6c63430008060033

Deployed Bytecode Sourcemap

50352:8728:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52238:19;;-1:-1:-1;;;;;52238:19:0;:33;52229:43;;;;;;50352:8728;;;;;45946:629;;;;;;;;;;-1:-1:-1;45946:629:0;;;;;:::i;:::-;;:::i;:::-;;;18003:14:1;;17996:22;17978:41;;17966:2;17951:18;45946:629:0;;;;;;;;53321:96;;;;;;;;;;-1:-1:-1;53321:96:0;;;;;:::i;:::-;;:::i;54009:296::-;;;;;;:::i;:::-;;:::i;50580:48::-;;;;;;;;;;;;;;;;;;;18176:25:1;;;18164:2;18149:18;50580:48:0;18131:76:1;50894:41:0;;;;;;;;;;;;;;;;45777:161;;;;;;;;;;-1:-1:-1;45777:161:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;53536:278::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;14988:15:1;;;14970:34;;15047:14;;15040:22;15035:2;15020:18;;15013:50;15099:15;;;15079:18;;;15072:43;;;;15151:15;;15146:2;15131:18;;15124:43;15204:15;;;15198:3;15183:19;;15176:44;14919:3;14904:19;53536:278:0;14886:340:1;50845:42:0;;;;;;;;;;;;;;;;54737:191;;;;;;;;;;;;;:::i;54515:214::-;;;;;;;;;;-1:-1:-1;54515:214:0;;;;;:::i;:::-;;:::i;54936:152::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;45548:35::-;;;;;;;;;;-1:-1:-1;45548:35:0;;;;-1:-1:-1;;;;;45548:35:0;;;;;;-1:-1:-1;;;;;13491:32:1;;;13473:51;;13461:2;13446:18;45548:35:0;13428:102:1;50944:39:0;;;;;;;;;;;;;;;;55832:2034;;;;;;;;;;-1:-1:-1;55832:2034:0;;;;;:::i;:::-;;:::i;53822:179::-;;;;;;;;;;-1:-1:-1;53822:179:0;;;;;:::i;:::-;;:::i;46583:194::-;;;;;;;;;;-1:-1:-1;46583:194:0;;;;;:::i;:::-;;:::i;46785:840::-;;;;;;;;;;-1:-1:-1;46785:840:0;;;;;:::i;:::-;;:::i;54313:194::-;;;;;;;;;;-1:-1:-1;54313:194:0;;;;;:::i;:::-;;:::i;55096:450::-;;;;;;;;;;-1:-1:-1;55096:450:0;;;;;:::i;:::-;;:::i;53425:103::-;;;;;;;;;;-1:-1:-1;53425:103:0;;;;;:::i;:::-;;:::i;45590:28::-;;;;;;;;;;-1:-1:-1;45590:28:0;;;;-1:-1:-1;;;;;45590:28:0;;;45946:629;46024:4;-1:-1:-1;;;;;;46061:40:0;;-1:-1:-1;;;46061:40:0;;:103;;-1:-1:-1;;;;;;;46118:46:0;;-1:-1:-1;;;46118:46:0;46061:103;:176;;;-1:-1:-1;;;;;;;46181:56:0;;-1:-1:-1;;;46181:56:0;46061:176;:230;;;-1:-1:-1;;;;;;;46254:37:0;;-1:-1:-1;;;46254:37:0;46061:230;:287;;;-1:-1:-1;;;;;;;46308:40:0;;-1:-1:-1;;;46308:40:0;46061:287;:355;;;-1:-1:-1;;;;;;;46365:51:0;;-1:-1:-1;;;46365:51:0;46061:355;:405;;;-1:-1:-1;;;;;;;46433:33:0;;-1:-1:-1;;;46433:33:0;46061:405;:458;;;-1:-1:-1;;;;;;;46483:36:0;;-1:-1:-1;;;46483:36:0;46061:458;:506;;;;46536:31;46555:11;46536:18;:31::i;:::-;46041:526;45946:629;-1:-1:-1;;45946:629:0:o;53321:96::-;53388:21;;-1:-1:-1;;;53388:21:0;;18800:2:1;53388:21:0;;;18782::1;18839:2;18819:18;;;18812:30;-1:-1:-1;;;18858:18:1;;;18851:41;18909:18;;53388:21:0;;;;;;;;54009:296;51048:16;;-1:-1:-1;;;;;51048:16:0;51034:10;:30;51026:55;;;;-1:-1:-1;;;51026:55:0;;19140:2:1;51026:55:0;;;19122:21:1;19179:2;19159:18;;;19152:30;-1:-1:-1;;;19198:18:1;;;19191:42;19250:18;;51026:55:0;19112:162:1;51026:55:0;54096:19:::1;::::0;-1:-1:-1;;;;;54096:19:0::1;:33:::0;54093:143:::1;;54153:19;::::0;:71:::1;::::0;-1:-1:-1;;;;;54153:19:0::1;54190:10;54210:4;54217:6:::0;54153:36:::1;:71::i;:::-;54009:296:::0;:::o;54093:143::-:1;54267:6;54254:9;:19;54246:51;;;::::0;-1:-1:-1;;;54246:51:0;;20859:2:1;54246:51:0::1;::::0;::::1;20841:21:1::0;20898:2;20878:18;;;20871:30;-1:-1:-1;;;20917:18:1;;;20910:49;20976:18;;54246:51:0::1;20831:169:1::0;45777:161:0;45851:29;45900:30;45917:12;;45900:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45900:16:0;;-1:-1:-1;;;45900:30:0:i;:::-;45893:37;45777:161;-1:-1:-1;;;45777:161:0:o;53536:278::-;53707:16;;;53732:4;53589:23;;;;;;;;;;-1:-1:-1;;;;;53707:16:0;;;;53589:23;;53732:4;53746:37;53732:4;53746:35;:37::i;:::-;53786:19;;53699:107;;;;-1:-1:-1;53699:107:0;;-1:-1:-1;53699:107:0;-1:-1:-1;;;;;;53786:19:0;;;;-1:-1:-1;53536:278:0;-1:-1:-1;53536:278:0:o;54737:191::-;54797:7;54824:18;;54846:1;54824:23;:49;;;-1:-1:-1;54851:17:0;;:22;54824:49;:96;;54902:17;;54881:18;;:38;;;;:::i;:::-;54817:103;;54737:191;:::o;54824:96::-;-1:-1:-1;54876:1:0;;54737:191::o;54515:214::-;54611:16;48397:17;:15;:17::i;:::-;48389:42;;;;-1:-1:-1;;;48389:42:0;;;;;;;:::i;:::-;-1:-1:-1;54651:24:0::1;::::0;;54686:35;;;54651:24;54515:214::o;54936:152::-;54985:25;55012:16;55049:7;55058:21;55041:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55041:39:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;55041:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54936:152;;:::o;55832:2034::-;55951:20;:18;:20::i;:::-;55935:12;:36;;55927:62;;;;-1:-1:-1;;;55927:62:0;;22224:2:1;55927:62:0;;;22206:21:1;22263:2;22243:18;;;22236:30;-1:-1:-1;;;22282:18:1;;;22275:43;22335:18;;55927:62:0;22196:163:1;55927:62:0;56021:12;56000:18;:33;56070:19;;56046:21;;56070:44;;-1:-1:-1;;;;;56070:19:0;56108:4;56070:29;:44::i;:::-;56046:68;;56151:1;56135:13;:17;56127:40;;;;-1:-1:-1;;;56127:40:0;;19831:2:1;56127:40:0;;;19813:21:1;19870:2;19850:18;;;19843:30;-1:-1:-1;;;19889:18:1;;;19882:40;19939:18;;56127:40:0;19803:160:1;56127:40:0;56180:15;56214;;56198:13;:31;:69;;56252:15;;56236:31;;:13;:31;:::i;:::-;56198:69;;;56232:1;56198:69;56180:87;;56298:1;56288:7;:11;56280:35;;;;-1:-1:-1;;;56280:35:0;;22906:2:1;56280:35:0;;;22888:21:1;22945:2;22925:18;;;22918:30;-1:-1:-1;;;22964:18:1;;;22957:41;23015:18;;56280:35:0;22878:161:1;56280:35:0;56331:24;;:28;56328:358;;56376:10;-1:-1:-1;;;;;56389:36:0;;;:74;;56441:22;56389:74;;;56428:10;56389:74;56376:87;;56478:25;56506:55;56527:7;56536:24;;56506:20;:55::i;:::-;56576:19;;56478:83;;-1:-1:-1;56576:55:0;;-1:-1:-1;;;;;56576:19:0;56609:2;56478:83;56576:32;:55::i;:::-;56646:28;56657:17;56646:28;;:::i;:::-;;;56361:325;;56328:358;56717:7;56698:15;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;56901:7:0;:14;56764:7;;56737:24;;;;56869:47;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;56818:98;;56927:9;56947:556;56962:21;:28;56958:32;;56947:556;;;57161:1;57133:7;57141:1;57133:10;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;;57074:55;57095:7;57104:21;57126:1;57104:24;;;;;;;;:::i;:::-;;;;;;;;;57074:20;:55::i;:::-;57058:71;-1:-1:-1;57057:100:0;;57058:71;57057:100;:::i;:::-;57021:7;57029:1;57021:10;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;:136;;;57020:142;57012:166;;;;-1:-1:-1;;;57012:166:0;;22566:2:1;57012:166:0;;;22548:21:1;22605:2;22585:18;;;22578:30;-1:-1:-1;;;22624:18:1;;;22617:41;22675:18;;57012:166:0;22538:161:1;57012:166:0;57217:16;57201:13;:32;:59;;;;;57253:7;57237:13;:23;57201:59;57193:80;;;;-1:-1:-1;;;57193:80:0;;23246:2:1;57193:80:0;;;23228:21:1;23285:1;23265:18;;;23258:29;-1:-1:-1;;;23303:18:1;;;23296:38;23351:18;;57193:80:0;23218:157:1;57193:80:0;57288:33;57308:13;57288:33;;:::i;:::-;;;57355:136;;;;;;;;57399:4;57355:136;;;;;;57422:5;57355:136;;;;;;57446:1;57355:136;;;;57466:7;57474:1;57466:10;;;;;;;;:::i;:::-;;;;;;;;;;57355:136;;;;;;;;57466:10;;;;;;;57355:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57355:136:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57355:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57336:16;;:13;;57350:1;;57336:16;;;;;;:::i;:::-;;;;;;:155;;;;56992:3;;;;;:::i;:::-;;;;56947:556;;;-1:-1:-1;57517:21:0;:28;57611:7;:10;;57517:28;;57611:10;;;;;;:::i;:::-;;;;;;;;;;;:24;;;57592:16;:43;;;;:::i;:::-;57556:7;57564:1;57556:10;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;:79;;;;57665:116;;;;;;;;57705:4;57665:116;;;;;;57724:5;57665:116;;;;;;57744:1;57665:116;;;;57760:7;57768:1;57760:10;;;;;;;;:::i;:::-;;;;;;;;;;57665:116;;;;;;;;57760:10;;;;;;;57665:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57665:116:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57665:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57646:16;;:13;;57660:1;;57646:16;;;;;;:::i;:::-;;;;;;;;;;:135;57809:16;;57792:66;;-1:-1:-1;;;57792:66:0;;-1:-1:-1;;;;;57809:16:0;;;;57792:51;;:66;;57844:13;;57792:66;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55916:1950;;;;;;55832:2034;:::o;53822:179::-;51048:16;;-1:-1:-1;;;;;51048:16:0;51034:10;:30;51026:55;;;;-1:-1:-1;;;51026:55:0;;19140:2:1;51026:55:0;;;19122:21:1;19179:2;19159:18;;;19152:30;-1:-1:-1;;;19198:18:1;;;19191:42;19250:18;;51026:55:0;19112:162:1;51026:55:0;53918:6:::1;53899:15;;:25;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;53968:16:0::1;::::0;53935:19:::1;::::0;:58:::1;::::0;-1:-1:-1;;;;;53935:19:0;;::::1;::::0;53968:16:::1;53986:6:::0;53935:32:::1;:58::i;46583:194::-:0;46659:16;48397:17;:15;:17::i;:::-;48389:42;;;;-1:-1:-1;;;48389:42:0;;;;;;;:::i;:::-;-1:-1:-1;46699:4:0::1;::::0;;-1:-1:-1;;;;;46714:15:0;;::::1;-1:-1:-1::0;;;;;;46714:15:0;::::1;::::0;::::1;::::0;;;46745:24:::1;::::0;46699:4;::::1;::::0;46714:15;46699:4;;46745:24:::1;::::0;46699:4:::1;::::0;46745:24:::1;46583:194:::0;;;:::o;46785:840::-;46945:4;;;47245;;-1:-1:-1;;;;;47234:15:0;;;47245:4;;47234:15;47231:58;;;47273:4;47266:11;;;;;;47231:58;47303:4;;:17;;-1:-1:-1;;;;;47303:4:0;:15;:17::i;:::-;47299:62;;47344:5;47337:12;;;;;;47299:62;47412:4;;47428:130;;47372:11;;;;-1:-1:-1;;;;;47412:4:0;;;;-1:-1:-1;;;47451:61:0;47428:130;;47514:7;;47523:8;;47533;;47543:7;;;;47552:5;;47428:130;;;:::i;:::-;;;;-1:-1:-1;;47428:130:0;;;;;;;;;;;;;;-1:-1:-1;;;;;47428:130:0;-1:-1:-1;;;;;;47428:130:0;;;;;;;;;;47412:147;;;;47428:130;47412:147;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47371:188;;;;47577:6;:40;;;;;47598:10;47587:30;;;;;;;;;;;;:::i;:::-;47570:47;;;;;;46785:840;;;;;;;;;:::o;54313:194::-;48397:17;:15;:17::i;:::-;48389:42;;;;-1:-1:-1;;;48389:42:0;;;;;;;:::i;:::-;54450:16:::1;::::0;54433:66:::1;::::0;-1:-1:-1;;;54433:66:0;;-1:-1:-1;;;;;54450:16:0;;::::1;::::0;54433:51:::1;::::0;:66:::1;::::0;54485:13;;54433:66:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;54313:194:::0;:::o;55096:450::-;48397:17;:15;:17::i;:::-;48389:42;;;;-1:-1:-1;;;48389:42:0;;;;;;;:::i;:::-;55204:10:::1;55217:20;:18;:20::i;:::-;55204:33;;55252:9;55248:291;55267:25:::0;;::::1;55248:291;;;55314:20;55337:14;;55352:1;55337:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;55314:40:::0;-1:-1:-1;55369:15:0::1;55387:37;-1:-1:-1::0;;;;;55387:22:0;::::1;55418:4;55387:22;:37::i;:::-;55369:55:::0;-1:-1:-1;55442:11:0;;55439:89:::1;;55474:38;-1:-1:-1::0;;;;;55474:25:0;::::1;55500:2:::0;55504:7;55474:25:::1;:38::i;:::-;55299:240;;55294:3;;;;;:::i;:::-;;;;55248:291;;;;55193:353;55096:450:::0;;:::o;53425:103::-;48397:17;:15;:17::i;:::-;48389:42;;;;-1:-1:-1;;;48389:42:0;;;;;;;:::i;52288:1025::-;52367:4;-1:-1:-1;;;;;;52404:57:0;;-1:-1:-1;;;52404:57:0;;:107;;-1:-1:-1;;;;;;;52478:33:0;;-1:-1:-1;;;52478:33:0;52404:107;:164;;;-1:-1:-1;;;;;;;52528:40:0;;-1:-1:-1;;;52528:40:0;52404:164;:214;;;-1:-1:-1;;;;;;;52585:33:0;;-1:-1:-1;;;52585:33:0;52404:214;:270;;;-1:-1:-1;;;;;;;52635:39:0;;-1:-1:-1;;;52635:39:0;52404:270;:325;;;-1:-1:-1;;;;;;;52691:38:0;;-1:-1:-1;;;52691:38:0;52404:325;:387;;;-1:-1:-1;;;;;;;52746:45:0;;-1:-1:-1;;;52746:45:0;52404:387;:462;;;-1:-1:-1;;;;;;;52808:58:0;;-1:-1:-1;;;52808:58:0;52404:462;:523;;;-1:-1:-1;;;;;;;52883:44:0;;-1:-1:-1;;;52883:44:0;52404:523;:587;;;-1:-1:-1;;;;;;;52944:47:0;;-1:-1:-1;;;52944:47:0;52404:587;:650;;;-1:-1:-1;;;;;;;53008:46:0;;-1:-1:-1;;;53008:46:0;52404:650;:714;;;-1:-1:-1;;;;;;;53071:47:0;;-1:-1:-1;;;53071:47:0;52404:714;:766;;;-1:-1:-1;;;;;;;53135:35:0;;-1:-1:-1;;;53135:35:0;52404:766;:831;;;-1:-1:-1;;;;;;;53187:48:0;;-1:-1:-1;;;53187:48:0;52404:831;:901;;;-1:-1:-1;;;;;;;53252:53:0;;-1:-1:-1;;;53252:53:0;52384:921;52288:1025;-1:-1:-1;;52288:1025:0:o;17094:536::-;17211:10;17208:48;;17238:7;;17208:48;-1:-1:-1;;;;;17269:31:0;;17266:104;;17317:20;;;;;;;;;-1:-1:-1;17317:20:0;;;;-1:-1:-1;;;;;17317:9:0;;;17327:5;;17317:9;:20::i;:::-;;17352:7;;17266:104;17434:88;;;-1:-1:-1;;;;;14557:15:1;;;17434:88:0;;;14539:34:1;14609:15;;;14589:18;;;14582:43;14641:18;;;;14634:34;;;17434:88:0;;;;;;;;;;14474:18:1;;;;17434:88:0;;;;;;;;-1:-1:-1;;;;;17434:88:0;-1:-1:-1;;;17434:88:0;;;-1:-1:-1;;17406:117:0;;:24;;;;-1:-1:-1;;17406:24:0;:117::i;:::-;17380:143;;17542:10;:17;17563:1;17542:22;:56;;;;17579:10;17568:30;;;;;;;;;;;;:::i;:::-;17534:88;;;;-1:-1:-1;;;17534:88:0;;20170:2:1;17534:88:0;;;20152:21:1;20209:2;20189:18;;;20182:30;-1:-1:-1;;;20228:18:1;;;20221:49;20287:18;;17534:88:0;20142:169:1;47633:372:0;47776:1;47753:11;47703:29;;-1:-1:-1;;;;;47753:11:0;:25;47745:42;;;;-1:-1:-1;;;47745:42:0;;;;;;21892:2:1;21874:21;;;21931:1;21911:18;;;21904:29;-1:-1:-1;;;21964:2:1;21949:18;;21942:34;22008:2;21993:18;;21864:153;47745:42:0;47798:11;:24;;-1:-1:-1;;;;;;47798:24:0;47812:10;47798:24;;;47860:42;;;;;;;;;;;;;;:::i;:::-;47834:4;47833:69;;-1:-1:-1;;;;;47833:69:0;;;-1:-1:-1;;;;;;47833:69:0;;;;;;;47918:22;;47833:69;;-1:-1:-1;47834:4:0;;47918:22;;47834:4;;47918:22;47970:27;47980:16;47970:9;:27::i;36584:194::-;36712:57;;-1:-1:-1;;;36712:57:0;;36092:66;36712:57;;;18176:25:1;36659:16:0;;-1:-1:-1;;;;;36712:16:0;;;;;18149:18:1;;36712:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;48459:155::-;48503:4;48527:79;48550:10;48570:4;48577:7;;-1:-1:-1;;;;;;48577:7:0;48586:8;;48596:9;48527:22;:79::i;15529:339::-;15614:7;-1:-1:-1;;;;;15637:31:0;;15634:85;;-1:-1:-1;;;;;;15692:15:0;;;15685:22;;15634:85;15770:77;;;-1:-1:-1;;;;;13491:32:1;;;15770:77:0;;;;13473:51:1;;;;15770:77:0;;;;;;;;;;13446:18:1;;;;15770:77:0;;;;;;;;-1:-1:-1;;;;;15770:77:0;-1:-1:-1;;;15770:77:0;;;15747:101;;:22;;;;:101::i;:::-;15736:124;;;;;;;;;;;;:::i;58892:185::-;58984:7;59065:4;;59028:17;:10;59065:4;59028:17;:::i;:::-;59027:33;;;;:::i;:::-;59012:49;;:11;:49;:::i;:::-;59011:58;;;;:::i;16582:504::-;16681:10;16678:48;;16582:504;;;:::o;16678:48::-;-1:-1:-1;;;;;16739:31:0;;16736:104;;16787:20;;;;;;;;;-1:-1:-1;16787:20:0;;;;-1:-1:-1;;;;;16787:9:0;;;16797:5;;16787:9;:20::i;16736:104::-;16904:78;;;-1:-1:-1;;;;;15423:32:1;;;16904:78:0;;;15405:51:1;15472:18;;;;15465:34;;;16904:78:0;;;;;;;;;;15378:18:1;;;;16904:78:0;;;;;;;;-1:-1:-1;;;;;16904:78:0;-1:-1:-1;;;16904:78:0;;;-1:-1:-1;;16876:107:0;;:24;;;;-1:-1:-1;;16876:24:0;:107::i;:::-;16850:133;;17002:10;:17;17023:1;17002:22;:56;;;;17039:10;17028:30;;;;;;;;;;;;:::i;:::-;16994:84;;;;-1:-1:-1;;;16994:84:0;;21207:2:1;16994:84:0;;;21189:21:1;21246:2;21226:18;;;21219:30;-1:-1:-1;;;21265:18:1;;;21258:45;21320:18;;16994:84:0;21179:165:1;4477:289:0;4537:4;-1:-1:-1;;;;;4557:21:0;;4554:65;;-1:-1:-1;4602:5:0;;4477:289;-1:-1:-1;4477:289:0:o;4554:65::-;-1:-1:-1;4696:20:0;4744:14;;;4477:289::o;55554:270::-;55631:9;;55605:10;;55631:23;55628:103;;55698:4;;55708:9;;55684:34;;-1:-1:-1;;;55684:34:0;;-1:-1:-1;;;;;55698:4:0;;;;55684:23;;:34;;;;18176:25:1;;;18164:2;18149:18;;18131:76;55684:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55671:48;;55628:103;-1:-1:-1;;;;;55746:16:0;;:70;;55792:4;;55778:37;;-1:-1:-1;;;;;55792:4:0;55778:35;:37::i;55746:70::-;55554:270;:::o;4114:355::-;4203:23;4239:11;4284:7;-1:-1:-1;;;;;4284:12:0;4305:5;4312:9;4284:38;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4261:61:0;-1:-1:-1;4261:61:0;-1:-1:-1;4261:61:0;4333:129;;4424:10;4418:17;4411:4;4399:10;4395:21;4388:48;4333:129;4228:241;4114:355;;;;;:::o;51201:982::-;51273:12;51298:27;51336:26;51375:36;51549:12;51538:93;;;;;;;;;;;;:::i;:::-;51423:9;;51434:24;;51472:21;;51422:209;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;51422:209:0;;;;;;;;-1:-1:-1;51422:209:0;;-1:-1:-1;51648:9:0;;-1:-1:-1;;;51644:101:0;51667:10;:17;51663:1;:21;51644:101;;;51706:7;51719:10;51730:1;51719:13;;;;;;;;:::i;:::-;;;;;;;;;;;;51706:27;;;;;;;;-1:-1:-1;51706:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51706:27:0;;;-1:-1:-1;;;;;;51706:27:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51706:27:0;-1:-1:-1;;;;;;51706:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51706:27:0;;;;;;;;;;;;;;;;;;;;51686:3;;;;:::i;:::-;;;;51644:101;;;-1:-1:-1;51761:17:0;:38;;;51760:44;;51757:244;;51824:24;;;;;:68;;;51873:19;51852:18;:40;51824:68;51821:169;;;51934:40;51956:18;51934:19;:40;:::i;:::-;51913:18;:61;51821:169;52050:16;:29;;-1:-1:-1;;;;;;52050:29:0;52069:10;52050:29;;;;;;52033:69;;;-1:-1:-1;;;52033:69:0;;;;:67;;:69;;;;;;;;;;;;;;;52069:10;52033:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52011:19;;:91;;;;;-1:-1:-1;;;;;52011:91:0;;;;;-1:-1:-1;;;;;52011:91:0;;;;;;52113:42;52124:7;52113:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52113:42:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52113:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52133:21;52113:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:10;:42::i;:::-;-1:-1:-1;;52166:9:0;;;;;;;;;-1:-1:-1;52166:9:0;;;51201:982;-1:-1:-1;;;;;51201:982:0:o;3772:334::-;3849:23;3885:11;3930:7;-1:-1:-1;;;;;3930:18:0;3949:9;3930:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3907:52:0;-1:-1:-1;3907:52:0;-1:-1:-1;3907:52:0;3970:129;;4061:10;4055:17;4048:4;4036:10;4032:21;4025:48;3970:129;3874:232;3772:334;;;;:::o;57874:1010::-;57990:42;58034:40;58118:1;58095:13;:20;:24;:86;;;;-1:-1:-1;58153:21:0;:28;58124:20;;:24;;58147:1;;58124:24;:::i;:::-;58123:58;58095:86;58087:111;;;;-1:-1:-1;;;58087:111:0;;20518:2:1;58087:111:0;;;20500:21:1;20557:2;20537:18;;;20530:30;-1:-1:-1;;;20576:18:1;;;20569:42;20628:18;;58087:111:0;20490:162:1;58087:111:0;58228:7;58209:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58209:26:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;58209:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58272:21;58246:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58311:21;;58304:28;;;;:::i;:::-;58343:14;58350:7;;58343:14;:::i;:::-;58368:18;58405:9;58401:278;58424:20;:27;58420:1;:31;58401:278;;;58503:1;58473:13;58487:1;58473:16;;;;;;;;:::i;:::-;;;;;;;:27;;:31;;;;;58519:7;58532:13;58546:1;58532:16;;;;;;;;:::i;:::-;;;;;;;;;;;;58519:30;;;;;;;;-1:-1:-1;58519:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58519:30:0;;;-1:-1:-1;;;;;;58519:30:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;58519:30:0;-1:-1:-1;;;;;;58519:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58519:30:0;;;;;;;;;;;;;;;;;;;;58578:23;;:20;;58599:1;;58578:23;;;;;;:::i;:::-;;;;;;;58564:37;;;;;:::i;:::-;;;58616:21;58643:20;58664:1;58643:23;;;;;;;;:::i;:::-;;;;;;;;;;;;58616:51;;;;;;;-1:-1:-1;58616:51:0;;;;;;;;;58453:3;;;;:::i;:::-;;;;58401:278;;;;58742:1;58689:13;58726:1;58703:13;:20;:24;;;;:::i;:::-;58689:39;;;;;;;;:::i;:::-;;;;;;;:50;;:54;;;;;58754:7;58767:13;58804:1;58781:13;:20;:24;;;;:::i;:::-;58767:39;;;;;;;;:::i;:::-;;;;;;;;;;;;58754:53;;;;;;;;-1:-1:-1;58754:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58754:53:0;;;-1:-1:-1;;;;;;58754:53:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;58754:53:0;-1:-1:-1;;;;;;58754:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58754:53:0;;;;;;;;;;;;;;;;;;;;50567:4;58826:24;;58818:58;;;;-1:-1:-1;;;58818:58:0;;19481:2:1;58818:58:0;;;19463:21:1;19520:2;19500:18;;;19493:30;-1:-1:-1;;;19539:18:1;;;19532:51;19600:18;;58818:58:0;19453:171:1;58818:58:0;58076:808;57874:1010;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:134:1;82:20;;111:31;82:20;111:31;:::i;:::-;63:85;;;:::o;153:138::-;232:13;;254:31;232:13;254:31;:::i;296:695::-;361:5;414:3;407:4;399:6;395:17;391:27;381:2;;432:1;429;422:12;381:2;461:6;455:13;487:4;511:85;527:68;592:2;527:68;:::i;:::-;511:85;:::i;:::-;618:3;642:2;637:3;630:15;670:2;665:3;661:12;654:19;;705:2;697:6;693:15;757:3;752:2;746;743:1;739:10;731:6;727:23;723:32;720:41;717:2;;;774:1;771;764:12;717:2;796:1;806:156;820:2;817:1;814:9;806:156;;;877:10;;865:23;;908:12;;;;940;;;;838:1;831:9;806:156;;;-1:-1:-1;980:5:1;;371:620;-1:-1:-1;;;;;;;371:620:1:o;996:128::-;1061:20;;1090:28;1061:20;1090:28;:::i;1129:132::-;1205:13;;1227:28;1205:13;1227:28;:::i;1266:173::-;1333:20;;-1:-1:-1;;;;;;1382:32:1;;1372:43;;1362:2;;1429:1;1426;1419:12;1444:347;1495:8;1505:6;1559:3;1552:4;1544:6;1540:17;1536:27;1526:2;;1577:1;1574;1567:12;1526:2;-1:-1:-1;1600:20:1;;1643:18;1632:30;;1629:2;;;1675:1;1672;1665:12;1629:2;1712:4;1704:6;1700:17;1688:29;;1764:3;1757:4;1748:6;1740;1736:19;1732:30;1729:39;1726:2;;;1781:1;1778;1771:12;1726:2;1516:275;;;;;:::o;1796:130::-;1862:20;;1891:29;1862:20;1891:29;:::i;1931:134::-;2008:13;;2030:29;2008:13;2030:29;:::i;2070:247::-;2129:6;2182:2;2170:9;2161:7;2157:23;2153:32;2150:2;;;2198:1;2195;2188:12;2150:2;2237:9;2224:23;2256:31;2281:5;2256:31;:::i;2322:251::-;2392:6;2445:2;2433:9;2424:7;2420:23;2416:32;2413:2;;;2461:1;2458;2451:12;2413:2;2493:9;2487:16;2512:31;2537:5;2512:31;:::i;2578:841::-;2674:6;2682;2735:2;2723:9;2714:7;2710:23;2706:32;2703:2;;;2751:1;2748;2741:12;2703:2;2783:9;2777:16;2802:31;2827:5;2802:31;:::i;:::-;2901:2;2886:18;;2880:25;2852:5;;-1:-1:-1;2924:18:1;2954:14;;;2951:2;;;2981:1;2978;2971:12;2951:2;3019:6;3008:9;3004:22;2994:32;;3064:7;3057:4;3053:2;3049:13;3045:27;3035:2;;3086:1;3083;3076:12;3035:2;3115;3109:9;3137:2;3133;3130:10;3127:2;;;3143:18;;:::i;:::-;3185:53;3228:2;3209:13;;-1:-1:-1;;3205:27:1;3234:2;3201:36;3185:53;:::i;:::-;3172:66;;3261:2;3254:5;3247:17;3301:7;3296:2;3291;3287;3283:11;3279:20;3276:33;3273:2;;;3322:1;3319;3312:12;3273:2;3335:54;3386:2;3381;3374:5;3370:14;3365:2;3361;3357:11;3335:54;:::i;:::-;;3408:5;3398:15;;;;2693:726;;;;;:::o;3424:827::-;3529:6;3537;3545;3553;3561;3569;3622:3;3610:9;3601:7;3597:23;3593:33;3590:2;;;3639:1;3636;3629:12;3590:2;3678:9;3665:23;3697:31;3722:5;3697:31;:::i;:::-;3747:5;-1:-1:-1;3804:2:1;3789:18;;3776:32;3817:33;3776:32;3817:33;:::i;:::-;3869:7;-1:-1:-1;3895:37:1;3928:2;3913:18;;3895:37;:::i;:::-;3885:47;;3983:2;3972:9;3968:18;3955:32;4010:18;4002:6;3999:30;3996:2;;;4042:1;4039;4032:12;3996:2;4081:58;4131:7;4122:6;4111:9;4107:22;4081:58;:::i;:::-;3580:671;;;;-1:-1:-1;3580:671:1;;;;;4240:3;4225:19;;;4212:33;;3580:671;-1:-1:-1;;;;3580:671:1:o;4256:615::-;4342:6;4350;4403:2;4391:9;4382:7;4378:23;4374:32;4371:2;;;4419:1;4416;4409:12;4371:2;4459:9;4446:23;4488:18;4529:2;4521:6;4518:14;4515:2;;;4545:1;4542;4535:12;4515:2;4583:6;4572:9;4568:22;4558:32;;4628:7;4621:4;4617:2;4613:13;4609:27;4599:2;;4650:1;4647;4640:12;4599:2;4690;4677:16;4716:2;4708:6;4705:14;4702:2;;;4732:1;4729;4722:12;4702:2;4785:7;4780:2;4770:6;4767:1;4763:14;4759:2;4755:23;4751:32;4748:45;4745:2;;;4806:1;4803;4796:12;4745:2;4837;4829:11;;;;;4859:6;;-1:-1:-1;4361:510:1;;-1:-1:-1;;;;4361:510:1:o;4876:2700::-;5003:6;5034:2;5077;5065:9;5056:7;5052:23;5048:32;5045:2;;;5093:1;5090;5083:12;5045:2;5133:9;5120:23;5166:18;5158:6;5155:30;5152:2;;;5198:1;5195;5188:12;5152:2;5221:22;;5274:4;5266:13;;5262:27;-1:-1:-1;5252:2:1;;5303:1;5300;5293:12;5252:2;5339;5326:16;5362:85;5378:68;5443:2;5378:68;:::i;5362:85::-;5481:15;;;5512:12;;;;5544:11;;;5574:6;5607:11;;;5599:20;;5595:29;;5592:42;-1:-1:-1;5589:2:1;;;5647:1;5644;5637:12;5589:2;5669:1;5660:10;;5679:1867;5693:2;5690:1;5687:9;5679:1867;;;5761:3;5752:7;5748:17;5789:2;5785;5781:11;5778:2;;;5805:1;5802;5795:12;5778:2;5835:22;;:::i;:::-;5898:3;5885:17;5915:30;5937:7;5915:30;:::i;:::-;5958:22;;6021:12;;;6008:26;6047:30;6008:26;6047:30;:::i;:::-;6097:14;;;6090:31;6144:2;6195:12;;;6182:26;6166:14;;;6159:50;6232:2;6257:6;-1:-1:-1;;6283:16:1;;6279:25;-1:-1:-1;6276:2:1;;;6317:1;6314;6307:12;6276:2;6349:22;;:::i;:::-;6334:37;;6422:2;6417:3;6413:12;6400:26;6391:7;6384:43;6450:4;6514:2;6509:3;6505:12;6492:26;6487:2;6478:7;6474:16;6467:52;6543:3;6606;6601;6597:13;6584:27;6579:2;6570:7;6566:16;6559:53;6636:3;6625:14;;6699:3;6694;6690:13;6677:27;6672:2;6663:7;6659:16;6652:53;6729:3;6792;6787;6783:13;6770:27;6765:2;6756:7;6752:16;6745:53;6822:3;6811:14;;6864:33;6892:3;6887;6883:13;6864:33;:::i;:::-;6858:3;6849:7;6845:17;6838:60;6922:3;6911:14;;6964:33;6992:3;6987;6983:13;6964:33;:::i;:::-;6958:3;6949:7;6945:17;6938:60;7022:3;7011:14;;7064:30;7089:3;7084;7080:13;7064:30;:::i;:::-;7045:17;;;7038:57;7119:3;7174:13;;;7161:27;7142:17;;;7135:54;7241:12;;;7228:26;7209:17;;;7202:53;7294:31;7320:3;7311:13;;7294:31;:::i;:::-;7288:3;7279:7;7275:17;7268:58;7365:31;7391:3;7386;7382:13;7365:31;:::i;:::-;7346:17;;;7339:58;-1:-1:-1;;;7417:14:1;;7410:31;;;;7454:18;;-1:-1:-1;5711:1:1;5704:9;;;;;7492:12;;;;7524;;;;5679:1867;;;-1:-1:-1;7565:5:1;;5014:2562;-1:-1:-1;;;;;;;;5014:2562:1:o;7581:245::-;7648:6;7701:2;7689:9;7680:7;7676:23;7672:32;7669:2;;;7717:1;7714;7707:12;7669:2;7749:9;7743:16;7768:28;7790:5;7768:28;:::i;7831:523::-;7905:6;7913;7921;7974:2;7962:9;7953:7;7949:23;7945:32;7942:2;;;7990:1;7987;7980:12;7942:2;8029:9;8016:23;8048:28;8070:5;8048:28;:::i;:::-;8095:5;-1:-1:-1;8152:2:1;8137:18;;8124:32;8165:33;8124:32;8165:33;:::i;:::-;8217:7;-1:-1:-1;8276:2:1;8261:18;;8248:32;8289:33;8248:32;8289:33;:::i;:::-;8341:7;8331:17;;;7932:422;;;;;:::o;8359:2326::-;8558:6;8566;8574;8582;8590;8598;8651:3;8639:9;8630:7;8626:23;8622:33;8619:2;;;8668:1;8665;8658:12;8619:2;8697:9;8691:16;8681:26;;8747:2;8736:9;8732:18;8726:25;8716:35;;8795:2;8784:9;8780:18;8774:25;8818:18;8859:2;8851:6;8848:14;8845:2;;;8875:1;8872;8865:12;8845:2;8913:6;8902:9;8898:22;8888:32;;8958:7;8951:4;8947:2;8943:13;8939:27;8929:2;;8980:1;8977;8970:12;8929:2;9009;9003:9;9032:85;9048:68;9113:2;9048:68;:::i;9032:85::-;9139:3;9163:2;9158:3;9151:15;9191:2;9186:3;9182:12;9175:19;;9222:2;9218;9214:11;9275:7;9270:2;9260:6;9256:2;9252:15;9248:2;9244:24;9240:33;9237:46;9234:2;;;9296:1;9293;9286:12;9234:2;9318:1;9309:10;;9328:1049;9342:2;9339:1;9336:9;9328:1049;;;9413:6;9407:3;9398:7;9394:17;9390:30;9387:2;;;9433:1;9430;9423:12;9387:2;9463:22;;:::i;:::-;9518:3;9512:10;9505:5;9498:25;9574:2;9569:3;9565:12;9559:19;9554:2;9547:5;9543:14;9536:43;9630:2;9625:3;9621:12;9615:19;9610:2;9603:5;9599:14;9592:43;9686:2;9681:3;9677:12;9671:19;9666:2;9659:5;9655:14;9648:43;9743:3;9738;9734:13;9728:20;9722:3;9715:5;9711:15;9704:45;9786:44;9825:3;9820;9816:13;9786:44;:::i;:::-;9780:3;9773:5;9769:15;9762:69;9868:44;9907:3;9902;9898:13;9868:44;:::i;:::-;9862:3;9855:5;9851:15;9844:69;9950:41;9986:3;9981;9977:13;9950:41;:::i;:::-;9944:3;9937:5;9933:15;9926:66;10044:3;10039;10035:13;10029:20;10023:3;10016:5;10012:15;10005:45;10102:3;10097;10093:13;10087:20;10081:3;10074:5;10070:15;10063:45;10145:42;10182:3;10177;10173:13;10145:42;:::i;:::-;10139:3;10132:5;10128:15;10121:67;10225:42;10262:3;10257;10253:13;10225:42;:::i;:::-;10219:3;10208:15;;10201:67;10281:18;;9360:1;9353:9;;;;;10328:2;10319:12;;;;10360:6;10351:16;9328:1049;;;-1:-1:-1;10447:2:1;10432:18;;10426:25;10396:5;;-1:-1:-1;10426:25:1;-1:-1:-1;;;10463:16:1;;;10460:2;;;10492:1;10489;10482:12;10460:2;;10515:74;10581:7;10570:8;10559:9;10555:24;10515:74;:::i;:::-;10505:84;;;10629:3;10618:9;10614:19;10608:26;10598:36;;10674:3;10663:9;10659:19;10653:26;10643:36;;8609:2076;;;;;;;;:::o;10690:184::-;10748:6;10801:2;10789:9;10780:7;10776:23;10772:32;10769:2;;;10817:1;10814;10807:12;10769:2;10840:28;10858:9;10840:28;:::i;10879:409::-;10949:6;10957;11010:2;10998:9;10989:7;10985:23;10981:32;10978:2;;;11026:1;11023;11016:12;10978:2;11066:9;11053:23;11099:18;11091:6;11088:30;11085:2;;;11131:1;11128;11121:12;11085:2;11170:58;11220:7;11211:6;11200:9;11196:22;11170:58;:::i;:::-;11247:8;;11144:84;;-1:-1:-1;10968:320:1;-1:-1:-1;;;;10968:320:1:o;11293:180::-;11352:6;11405:2;11393:9;11384:7;11380:23;11376:32;11373:2;;;11421:1;11418;11411:12;11373:2;-1:-1:-1;11444:23:1;;11363:110;-1:-1:-1;11363:110:1:o;11478:184::-;11548:6;11601:2;11589:9;11580:7;11576:23;11572:32;11569:2;;;11617:1;11614;11607:12;11569:2;-1:-1:-1;11640:16:1;;11559:103;-1:-1:-1;11559:103:1:o;11968:1075::-;12056:5;12050:12;12045:3;12038:25;12112:4;12105:5;12101:16;12095:23;12088:4;12083:3;12079:14;12072:47;12168:4;12161:5;12157:16;12151:23;12144:4;12139:3;12135:14;12128:47;12224:4;12217:5;12213:16;12207:23;12200:4;12195:3;12191:14;12184:47;12280:4;12273:5;12269:16;12263:23;12256:4;12251:3;12247:14;12240:47;12333:4;12326:5;12322:16;12316:23;12348:48;12390:4;12385:3;12381:14;12367:12;-1:-1:-1;;;;;11733:31:1;11721:44;;11711:60;12348:48;;12444:4;12437:5;12433:16;12427:23;12459:50;12503:4;12498:3;12494:14;12478;-1:-1:-1;;;;;11733:31:1;11721:44;;11711:60;12459:50;;12557:4;12550:5;12546:16;12540:23;12572:47;12613:4;12608:3;12604:14;12588;11846:13;11839:21;11827:34;;11817:50;12572:47;-1:-1:-1;12638:6:1;12680:14;;;12674:21;12660:12;;;12653:43;12715:6;12757:14;;;12751:21;12737:12;;;12730:43;12792:6;12835:14;;;12829:21;12859:46;12892:12;;;12829:21;11947:1;11936:20;11924:33;;11914:49;12859:46;;;12924:6;12978:2;12971:5;12967:14;12961:21;12991:46;13033:2;13028:3;13024:12;13008:14;11947:1;11936:20;11924:33;;11914:49;13048:274;13177:3;13215:6;13209:13;13231:53;13277:6;13272:3;13265:4;13257:6;13253:17;13231:53;:::i;:::-;13300:16;;;;;13185:137;-1:-1:-1;;13185:137:1:o;13535:759::-;-1:-1:-1;;;;;13840:15:1;;;13822:34;;13892:15;;13887:2;13872:18;;13865:43;-1:-1:-1;;;;;;13944:33:1;;13939:2;13924:18;;13917:61;13802:3;14009:2;13994:18;;13987:31;;;14034:19;;14027:35;;;13765:4;14055:6;14105;14099:3;14084:19;;14071:49;14170:1;14164:3;14155:6;14144:9;14140:22;14136:32;14129:43;14240:3;14233:2;14229:7;14224:2;14216:6;14212:15;14208:29;14197:9;14193:45;14189:55;14181:63;;14281:6;14275:3;14264:9;14260:19;14253:35;13774:520;;;;;;;;;:::o;15510:1066::-;15767:2;15819:21;;;15889:13;;15792:18;;;15911:22;;;15738:4;;15767:2;15952;;15970:18;;;;16011:15;;;15738:4;16054:496;16068:6;16065:1;16062:13;16054:496;;;16127:13;;16179:9;;16172:17;16165:25;16153:38;;16245:11;;;16239:18;16232:26;16225:34;16211:12;;;16204:56;16300:11;;;16294:18;16280:12;;;16273:40;16336:4;16379:11;;;16373:18;;16404:62;16453:12;;;16373:18;16404:62;:::i;:::-;-1:-1:-1;;16495:6:1;16486:16;;;;;16525:15;;;;16090:1;16083:9;16054:496;;;-1:-1:-1;16567:3:1;;15747:829;-1:-1:-1;;;;;;;15747:829:1:o;16581:1252::-;16917:2;16929:21;;;16999:13;;16902:18;;;17021:22;;;16869:4;;17096;;17074:2;17059:18;;;17123:15;;;16869:4;17166:201;17180:6;17177:1;17174:13;17166:201;;;17229:54;17279:3;17270:6;17264:13;17229:54;:::i;:::-;17312:6;17303:16;;;;;17342:15;;;;17202:1;17195:9;17166:201;;;-1:-1:-1;;;17403:19:1;;;17383:18;;;17376:47;17473:13;;17495:21;;;17571:15;;;;17534:12;;;17606:1;17616:189;17632:8;17627:3;17624:17;17616:189;;;17701:15;;17687:30;;17778:17;;;;17739:14;;;;17660:1;17651:11;17616:189;;18212:381;18359:2;18348:9;18341:21;18322:4;18391:6;18385:13;18434:6;18429:2;18418:9;18414:18;18407:34;18450:66;18509:6;18504:2;18493:9;18489:18;18484:2;18476:6;18472:15;18450:66;:::i;:::-;18577:2;18556:15;-1:-1:-1;;18552:29:1;18537:45;;;;18584:2;18533:54;;18331:262;-1:-1:-1;;18331:262:1:o;21349:336::-;21551:2;21533:21;;;21590:2;21570:18;;;21563:30;-1:-1:-1;;;21624:2:1;21609:18;;21602:42;21676:2;21661:18;;21523:162::o;23562:253::-;23634:2;23628:9;23676:4;23664:17;;23711:18;23696:34;;23732:22;;;23693:62;23690:2;;;23758:18;;:::i;:::-;23794:2;23787:22;23608:207;:::o;23820:255::-;23892:2;23886:9;23934:6;23922:19;;23971:18;23956:34;;23992:22;;;23953:62;23950:2;;;24018:18;;:::i;24080:275::-;24151:2;24145:9;24216:2;24197:13;;-1:-1:-1;;24193:27:1;24181:40;;24251:18;24236:34;;24272:22;;;24233:62;24230:2;;;24298:18;;:::i;:::-;24334:2;24327:22;24125:230;;-1:-1:-1;24125:230:1:o;24360:208::-;24445:4;24478:18;24470:6;24467:30;24464:2;;;24500:18;;:::i;:::-;-1:-1:-1;24545:1:1;24541:14;24557:4;24537:25;;24454:114::o;24573:128::-;24613:3;24644:1;24640:6;24637:1;24634:13;24631:2;;;24650:18;;:::i;:::-;-1:-1:-1;24686:9:1;;24621:80::o;24706:217::-;24746:1;24772;24762:2;;24816:10;24811:3;24807:20;24804:1;24797:31;24851:4;24848:1;24841:15;24879:4;24876:1;24869:15;24762:2;-1:-1:-1;24908:9:1;;24752:171::o;24928:168::-;24968:7;25034:1;25030;25026:6;25022:14;25019:1;25016:21;25011:1;25004:9;24997:17;24993:45;24990:2;;;25041:18;;:::i;:::-;-1:-1:-1;25081:9:1;;24980:116::o;25101:125::-;25141:4;25169:1;25166;25163:8;25160:2;;;25174:18;;:::i;:::-;-1:-1:-1;25211:9:1;;25150:76::o;25231:258::-;25303:1;25313:113;25327:6;25324:1;25321:13;25313:113;;;25403:11;;;25397:18;25384:11;;;25377:39;25349:2;25342:10;25313:113;;;25444:6;25441:1;25438:13;25435:2;;;-1:-1:-1;;25479:1:1;25461:16;;25454:27;25284:205::o;25494:135::-;25533:3;-1:-1:-1;;25554:17:1;;25551:2;;;25574:18;;:::i;:::-;-1:-1:-1;25621:1:1;25610:13;;25541:88::o;25634:127::-;25695:10;25690:3;25686:20;25683:1;25676:31;25726:4;25723:1;25716:15;25750:4;25747:1;25740:15;25766:127;25827:10;25822:3;25818:20;25815:1;25808:31;25858:4;25855:1;25848:15;25882:4;25879:1;25872:15;25898:127;25959:10;25954:3;25950:20;25947:1;25940:31;25990:4;25987:1;25980:15;26014:4;26011:1;26004:15;26030:131;-1:-1:-1;;;;;26105:31:1;;26095:42;;26085:2;;26151:1;26148;26141:12;26166:118;26252:5;26245:13;26238:21;26231:5;26228:32;26218:2;;26274:1;26271;26264:12;26289:118;26376:5;26373:1;26362:20;26355:5;26352:31;26342:2;;26397:1;26394;26387:12

Swarm Source

ipfs://8a1e237207eb49d438db7147965ed108daa63346d0a7055dac759b75ffb45e2b

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.