ETH Price: $3,212.42 (+3.86%)
Gas: 12 Gwei

Contract

0x14413419452Aaf089762A0c5e95eD2A13bBC488C
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Verify Header An...196590182024-04-15 6:05:4715 mins ago1713161147IN
0x14413419...13bBC488C
0 ETH0.002053529.17530146
Verify Header An...196585732024-04-15 4:35:591 hr ago1713155759IN
0x14413419...13bBC488C
0 ETH0.001887977.55143073
Verify Header An...196585592024-04-15 4:33:111 hr ago1713155591IN
0x14413419...13bBC488C
0 ETH0.001666137.7952773
Verify Header An...196570482024-04-14 23:29:116 hrs ago1713137351IN
0x14413419...13bBC488C
0 ETH0.002011910.22974423
Verify Header An...196547092024-04-14 15:36:3514 hrs ago1713108995IN
0x14413419...13bBC488C
0 ETH0.0028828214.62177821
Verify Header An...196544312024-04-14 14:40:3515 hrs ago1713105635IN
0x14413419...13bBC488C
0 ETH0.0022968212.15883833
Verify Header An...196540072024-04-14 13:15:1117 hrs ago1713100511IN
0x14413419...13bBC488C
0 ETH0.0027231312.73778119
Verify Header An...196512802024-04-14 4:05:2326 hrs ago1713067523IN
0x14413419...13bBC488C
0 ETH0.0024528711.35795457
Verify Header An...196512482024-04-14 3:58:4726 hrs ago1713067127IN
0x14413419...13bBC488C
0 ETH0.002802312.37506116
Verify Header An...196507332024-04-14 2:14:2328 hrs ago1713060863IN
0x14413419...13bBC488C
0 ETH0.002661212.45019294
Verify Header An...196506832024-04-14 2:04:2328 hrs ago1713060263IN
0x14413419...13bBC488C
0 ETH0.0027632812.90240555
Verify Header An...196497822024-04-13 23:02:3531 hrs ago1713049355IN
0x14413419...13bBC488C
0 ETH0.0170363979.68976991
Verify Header An...196486572024-04-13 19:13:2335 hrs ago1713035603IN
0x14413419...13bBC488C
0 ETH0.0042313616.92519225
Verify Header An...196479752024-04-13 16:55:3537 hrs ago1713027335IN
0x14413419...13bBC488C
0 ETH0.0030755414.36043905
Verify Header An...196470672024-04-13 13:52:2340 hrs ago1713016343IN
0x14413419...13bBC488C
0 ETH0.0030460214.26508404
Verify Header An...196468222024-04-13 13:02:4741 hrs ago1713013367IN
0x14413419...13bBC488C
0 ETH0.002744612.8075268
Verify Header An...196467232024-04-13 12:42:5941 hrs ago1713012179IN
0x14413419...13bBC488C
0 ETH0.0026250512.25836971
Verify Header An...196467202024-04-13 12:42:2341 hrs ago1713012143IN
0x14413419...13bBC488C
0 ETH0.002805712.57640526
Verify Header An...196466812024-04-13 12:34:3541 hrs ago1713011675IN
0x14413419...13bBC488C
0 ETH0.0021506511.40603377
Verify Header An...196463952024-04-13 11:36:5942 hrs ago1713008219IN
0x14413419...13bBC488C
0 ETH0.0027398610.95981807
Verify Header An...196463212024-04-13 11:21:5942 hrs ago1713007319IN
0x14413419...13bBC488C
0 ETH0.0021633810.10246115
Verify Header An...196463022024-04-13 11:18:1143 hrs ago1713007091IN
0x14413419...13bBC488C
0 ETH0.0028594111.45562232
Verify Header An...196461652024-04-13 10:50:3543 hrs ago1713005435IN
0x14413419...13bBC488C
0 ETH0.0027314810.92524979
Verify Header An...196461442024-04-13 10:46:2343 hrs ago1713005183IN
0x14413419...13bBC488C
0 ETH0.0028536811.41456027
Verify Header An...196461192024-04-13 10:41:1143 hrs ago1713004871IN
0x14413419...13bBC488C
0 ETH0.00266512.46588516
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EthCrossChainManager

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-19
*/

pragma solidity ^0.5.0;
pragma experimental ABIEncoderV2;

contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return _msgSender() == _owner;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public  onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by a pauser (`account`).
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by a pauser (`account`).
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor () internal {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view returns (bool) {
        return _paused;
    }

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

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

    /**
     * @dev Called to pause, triggers stopped state.
     */
    function _pause() internal whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Called to unpause, returns to normal state.
     */
    function _unpause() internal whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

library ZeroCopySink {
    /* @notice          Convert boolean value into bytes
    *  @param b         The boolean value
    *  @return          Converted bytes array
    */
    function WriteBool(bool b) internal pure returns (bytes memory) {
        bytes memory buff;
        assembly{
            buff := mload(0x40)
            mstore(buff, 1)
            switch iszero(b)
            case 1 {
                mstore(add(buff, 0x20), shl(248, 0x00))
                // mstore8(add(buff, 0x20), 0x00)
            }
            default {
                mstore(add(buff, 0x20), shl(248, 0x01))
                // mstore8(add(buff, 0x20), 0x01)
            }
            mstore(0x40, add(buff, 0x21))
        }
        return buff;
    }

    /* @notice          Convert byte value into bytes
    *  @param b         The byte value
    *  @return          Converted bytes array
    */
    function WriteByte(byte b) internal pure returns (bytes memory) {
        return WriteUint8(uint8(b));
    }

    /* @notice          Convert uint8 value into bytes
    *  @param v         The uint8 value
    *  @return          Converted bytes array
    */
    function WriteUint8(uint8 v) internal pure returns (bytes memory) {
        bytes memory buff;
        assembly{
            buff := mload(0x40)
            mstore(buff, 1)
            mstore(add(buff, 0x20), shl(248, v))
            // mstore(add(buff, 0x20), byte(0x1f, v))
            mstore(0x40, add(buff, 0x21))
        }
        return buff;
    }

    /* @notice          Convert uint16 value into bytes
    *  @param v         The uint16 value
    *  @return          Converted bytes array
    */
    function WriteUint16(uint16 v) internal pure returns (bytes memory) {
        bytes memory buff;

        assembly{
            buff := mload(0x40)
            let byteLen := 0x02
            mstore(buff, byteLen)
            for {
                let mindex := 0x00
                let vindex := 0x1f
            } lt(mindex, byteLen) {
                mindex := add(mindex, 0x01)
                vindex := sub(vindex, 0x01)
            }{
                mstore8(add(add(buff, 0x20), mindex), byte(vindex, v))
            }
            mstore(0x40, add(buff, 0x22))
        }
        return buff;
    }
    
    /* @notice          Convert uint32 value into bytes
    *  @param v         The uint32 value
    *  @return          Converted bytes array
    */
    function WriteUint32(uint32 v) internal pure returns(bytes memory) {
        bytes memory buff;
        assembly{
            buff := mload(0x40)
            let byteLen := 0x04
            mstore(buff, byteLen)
            for {
                let mindex := 0x00
                let vindex := 0x1f
            } lt(mindex, byteLen) {
                mindex := add(mindex, 0x01)
                vindex := sub(vindex, 0x01)
            }{
                mstore8(add(add(buff, 0x20), mindex), byte(vindex, v))
            }
            mstore(0x40, add(buff, 0x24))
        }
        return buff;
    }

    /* @notice          Convert uint64 value into bytes
    *  @param v         The uint64 value
    *  @return          Converted bytes array
    */
    function WriteUint64(uint64 v) internal pure returns(bytes memory) {
        bytes memory buff;

        assembly{
            buff := mload(0x40)
            let byteLen := 0x08
            mstore(buff, byteLen)
            for {
                let mindex := 0x00
                let vindex := 0x1f
            } lt(mindex, byteLen) {
                mindex := add(mindex, 0x01)
                vindex := sub(vindex, 0x01)
            }{
                mstore8(add(add(buff, 0x20), mindex), byte(vindex, v))
            }
            mstore(0x40, add(buff, 0x28))
        }
        return buff;
    }

    /* @notice          Convert limited uint256 value into bytes
    *  @param v         The uint256 value
    *  @return          Converted bytes array
    */
    function WriteUint255(uint256 v) internal pure returns (bytes memory) {
        require(v <= 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, "Value exceeds uint255 range");
        bytes memory buff;

        assembly{
            buff := mload(0x40)
            let byteLen := 0x20
            mstore(buff, byteLen)
            for {
                let mindex := 0x00
                let vindex := 0x1f
            } lt(mindex, byteLen) {
                mindex := add(mindex, 0x01)
                vindex := sub(vindex, 0x01)
            }{
                mstore8(add(add(buff, 0x20), mindex), byte(vindex, v))
            }
            mstore(0x40, add(buff, 0x40))
        }
        return buff;
    }

    /* @notice          Encode bytes format data into bytes
    *  @param data      The bytes array data
    *  @return          Encoded bytes array
    */
    function WriteVarBytes(bytes memory data) internal pure returns (bytes memory) {
        uint64 l = uint64(data.length);
        return abi.encodePacked(WriteVarUint(l), data);
    }

    function WriteVarUint(uint64 v) internal pure returns (bytes memory) {
        if (v < 0xFD){
    		return WriteUint8(uint8(v));
    	} else if (v <= 0xFFFF) {
    		return abi.encodePacked(WriteByte(0xFD), WriteUint16(uint16(v)));
    	} else if (v <= 0xFFFFFFFF) {
            return abi.encodePacked(WriteByte(0xFE), WriteUint32(uint32(v)));
    	} else {
    		return abi.encodePacked(WriteByte(0xFF), WriteUint64(uint64(v)));
    	}
    }
}

library ZeroCopySource {
    /* @notice              Read next byte as boolean type starting at offset from buff
    *  @param buff          Source bytes array
    *  @param offset        The position from where we read the boolean value
    *  @return              The the read boolean value and new offset
    */
    function NextBool(bytes memory buff, uint256 offset) internal pure returns(bool, uint256) {
        require(offset + 1 <= buff.length && offset < offset + 1, "Offset exceeds limit");
        // byte === bytes1
        byte v;
        assembly{
            v := mload(add(add(buff, 0x20), offset))
        }
        bool value;
        if (v == 0x01) {
		    value = true;
    	} else if (v == 0x00) {
            value = false;
        } else {
            revert("NextBool value error");
        }
        return (value, offset + 1);
    }

    /* @notice              Read next byte starting at offset from buff
    *  @param buff          Source bytes array
    *  @param offset        The position from where we read the byte value
    *  @return              The read byte value and new offset
    */
    function NextByte(bytes memory buff, uint256 offset) internal pure returns (byte, uint256) {
        require(offset + 1 <= buff.length && offset < offset + 1, "NextByte, Offset exceeds maximum");
        byte v;
        assembly{
            v := mload(add(add(buff, 0x20), offset))
        }
        return (v, offset + 1);
    }

    /* @notice              Read next byte as uint8 starting at offset from buff
    *  @param buff          Source bytes array
    *  @param offset        The position from where we read the byte value
    *  @return              The read uint8 value and new offset
    */
    function NextUint8(bytes memory buff, uint256 offset) internal pure returns (uint8, uint256) {
        require(offset + 1 <= buff.length && offset < offset + 1, "NextUint8, Offset exceeds maximum");
        uint8 v;
        assembly{
            let tmpbytes := mload(0x40)
            let bvalue := mload(add(add(buff, 0x20), offset))
            mstore8(tmpbytes, byte(0, bvalue))
            mstore(0x40, add(tmpbytes, 0x01))
            v := mload(sub(tmpbytes, 0x1f))
        }
        return (v, offset + 1);
    }

    /* @notice              Read next two bytes as uint16 type starting from offset
    *  @param buff          Source bytes array
    *  @param offset        The position from where we read the uint16 value
    *  @return              The read uint16 value and updated offset
    */
    function NextUint16(bytes memory buff, uint256 offset) internal pure returns (uint16, uint256) {
        require(offset + 2 <= buff.length && offset < offset + 2, "NextUint16, offset exceeds maximum");
        
        uint16 v;
        assembly {
            let tmpbytes := mload(0x40)
            let bvalue := mload(add(add(buff, 0x20), offset))
            mstore8(tmpbytes, byte(0x01, bvalue))
            mstore8(add(tmpbytes, 0x01), byte(0, bvalue))
            mstore(0x40, add(tmpbytes, 0x02))
            v := mload(sub(tmpbytes, 0x1e))
        }
        return (v, offset + 2);
    }


    /* @notice              Read next four bytes as uint32 type starting from offset
    *  @param buff          Source bytes array
    *  @param offset        The position from where we read the uint32 value
    *  @return              The read uint32 value and updated offset
    */
    function NextUint32(bytes memory buff, uint256 offset) internal pure returns (uint32, uint256) {
        require(offset + 4 <= buff.length && offset < offset + 4, "NextUint32, offset exceeds maximum");
        uint32 v;
        assembly {
            let tmpbytes := mload(0x40)
            let byteLen := 0x04
            for {
                let tindex := 0x00
                let bindex := sub(byteLen, 0x01)
                let bvalue := mload(add(add(buff, 0x20), offset))
            } lt(tindex, byteLen) {
                tindex := add(tindex, 0x01)
                bindex := sub(bindex, 0x01)
            }{
                mstore8(add(tmpbytes, tindex), byte(bindex, bvalue))
            }
            mstore(0x40, add(tmpbytes, byteLen))
            v := mload(sub(tmpbytes, sub(0x20, byteLen)))
        }
        return (v, offset + 4);
    }

    /* @notice              Read next eight bytes as uint64 type starting from offset
    *  @param buff          Source bytes array
    *  @param offset        The position from where we read the uint64 value
    *  @return              The read uint64 value and updated offset
    */
    function NextUint64(bytes memory buff, uint256 offset) internal pure returns (uint64, uint256) {
        require(offset + 8 <= buff.length && offset < offset + 8, "NextUint64, offset exceeds maximum");
        uint64 v;
        assembly {
            let tmpbytes := mload(0x40)
            let byteLen := 0x08
            for {
                let tindex := 0x00
                let bindex := sub(byteLen, 0x01)
                let bvalue := mload(add(add(buff, 0x20), offset))
            } lt(tindex, byteLen) {
                tindex := add(tindex, 0x01)
                bindex := sub(bindex, 0x01)
            }{
                mstore8(add(tmpbytes, tindex), byte(bindex, bvalue))
            }
            mstore(0x40, add(tmpbytes, byteLen))
            v := mload(sub(tmpbytes, sub(0x20, byteLen)))
        }
        return (v, offset + 8);
    }

    /* @notice              Read next 32 bytes as uint256 type starting from offset,
                            there are limits considering the numerical limits in multi-chain
    *  @param buff          Source bytes array
    *  @param offset        The position from where we read the uint256 value
    *  @return              The read uint256 value and updated offset
    */
    function NextUint255(bytes memory buff, uint256 offset) internal pure returns (uint256, uint256) {
        require(offset + 32 <= buff.length && offset < offset + 32, "NextUint255, offset exceeds maximum");
        uint256 v;
        assembly {
            let tmpbytes := mload(0x40)
            let byteLen := 0x20
            for {
                let tindex := 0x00
                let bindex := sub(byteLen, 0x01)
                let bvalue := mload(add(add(buff, 0x20), offset))
            } lt(tindex, byteLen) {
                tindex := add(tindex, 0x01)
                bindex := sub(bindex, 0x01)
            }{
                mstore8(add(tmpbytes, tindex), byte(bindex, bvalue))
            }
            mstore(0x40, add(tmpbytes, byteLen))
            v := mload(tmpbytes)
        }
        require(v <= 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, "Value exceeds the range");
        return (v, offset + 32);
    }
    /* @notice              Read next variable bytes starting from offset,
                            the decoding rule coming from multi-chain
    *  @param buff          Source bytes array
    *  @param offset        The position from where we read the bytes value
    *  @return              The read variable bytes array value and updated offset
    */
    function NextVarBytes(bytes memory buff, uint256 offset) internal pure returns(bytes memory, uint256) {
        uint len;
        (len, offset) = NextVarUint(buff, offset);
        require(offset + len <= buff.length && offset < offset + len, "NextVarBytes, offset exceeds maximum");
        bytes memory tempBytes;
        assembly{
            switch iszero(len)
            case 0 {
                // Get a location of some free memory and store it in tempBytes as
                // Solidity does for memory variables.
                tempBytes := mload(0x40)

                // The first word of the slice result is potentially a partial
                // word read from the original array. To read it, we calculate
                // the length of that partial word and start copying that many
                // bytes into the array. The first word we copy will start with
                // data we don't care about, but the last `lengthmod` bytes will
                // land at the beginning of the contents of the new array. When
                // we're done copying, we overwrite the full first word with
                // the actual length of the slice.
                let lengthmod := and(len, 31)

                // The multiplication in the next line is necessary
                // because when slicing multiples of 32 bytes (lengthmod == 0)
                // the following copy loop was copying the origin's length
                // and then ending prematurely not copying everything it should.
                let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))
                let end := add(mc, len)

                for {
                    // The multiplication in the next line has the same exact purpose
                    // as the one above.
                    let cc := add(add(add(buff, lengthmod), mul(0x20, iszero(lengthmod))), offset)
                } lt(mc, end) {
                    mc := add(mc, 0x20)
                    cc := add(cc, 0x20)
                } {
                    mstore(mc, mload(cc))
                }

                mstore(tempBytes, len)

                //update free-memory pointer
                //allocating the array padded to 32 bytes like the compiler does now
                mstore(0x40, and(add(mc, 31), not(31)))
            }
            //if we want a zero-length slice let's just return a zero-length array
            default {
                tempBytes := mload(0x40)

                mstore(0x40, add(tempBytes, 0x20))
            }
        }

        return (tempBytes, offset + len);
    }
    /* @notice              Read next 32 bytes starting from offset,
    *  @param buff          Source bytes array
    *  @param offset        The position from where we read the bytes value
    *  @return              The read bytes32 value and updated offset
    */
    function NextHash(bytes memory buff, uint256 offset) internal pure returns (bytes32 , uint256) {
        require(offset + 32 <= buff.length && offset < offset + 32, "NextHash, offset exceeds maximum");
        bytes32 v;
        assembly {
            v := mload(add(buff, add(offset, 0x20)))
        }
        return (v, offset + 32);
    }

    /* @notice              Read next 20 bytes starting from offset,
    *  @param buff          Source bytes array
    *  @param offset        The position from where we read the bytes value
    *  @return              The read bytes20 value and updated offset
    */
    function NextBytes20(bytes memory buff, uint256 offset) internal pure returns (bytes20 , uint256) {
        require(offset + 20 <= buff.length && offset < offset + 20, "NextBytes20, offset exceeds maximum");
        bytes20 v;
        assembly {
            v := mload(add(buff, add(offset, 0x20)))
        }
        return (v, offset + 20);
    }
    
    function NextVarUint(bytes memory buff, uint256 offset) internal pure returns(uint, uint256) {
        byte v;
        (v, offset) = NextByte(buff, offset);

        uint value;
        if (v == 0xFD) {
            // return NextUint16(buff, offset);
            (value, offset) = NextUint16(buff, offset);
            require(value >= 0xFD && value <= 0xFFFF, "NextUint16, value outside range");
            return (value, offset);
        } else if (v == 0xFE) {
            // return NextUint32(buff, offset);
            (value, offset) = NextUint32(buff, offset);
            require(value > 0xFFFF && value <= 0xFFFFFFFF, "NextVarUint, value outside range");
            return (value, offset);
        } else if (v == 0xFF) {
            // return NextUint64(buff, offset);
            (value, offset) = NextUint64(buff, offset);
            require(value > 0xFFFFFFFF, "NextVarUint, value outside range");
            return (value, offset);
        } else{
            // return (uint8(v), offset);
            value = uint8(v);
            require(value < 0xFD, "NextVarUint, value outside range");
            return (value, offset);
        }
    }
}

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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


library Utils {

    /* @notice      Convert the bytes array to bytes32 type, the bytes array length must be 32
    *  @param _bs   Source bytes array
    *  @return      bytes32
    */
    function bytesToBytes32(bytes memory _bs) internal pure returns (bytes32 value) {
        require(_bs.length == 32, "bytes length is not 32.");
        assembly {
            // load 32 bytes from memory starting from position _bs + 0x20 since the first 0x20 bytes stores _bs length
            value := mload(add(_bs, 0x20))
        }
    }

    /* @notice      Convert bytes to uint256
    *  @param _b    Source bytes should have length of 32
    *  @return      uint256
    */
    function bytesToUint256(bytes memory _bs) internal pure returns (uint256 value) {
        require(_bs.length == 32, "bytes length is not 32.");
        assembly {
            // load 32 bytes from memory starting from position _bs + 32
            value := mload(add(_bs, 0x20))
        }
        require(value <= 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, "Value exceeds the range");
    }

    /* @notice      Convert uint256 to bytes
    *  @param _b    uint256 that needs to be converted
    *  @return      bytes
    */
    function uint256ToBytes(uint256 _value) internal pure returns (bytes memory bs) {
        require(_value <= 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, "Value exceeds the range");
        assembly {
            // Get a location of some free memory and store it in result as
            // Solidity does for memory variables.
            bs := mload(0x40)
            // Put 0x20 at the first word, the length of bytes for uint256 value
            mstore(bs, 0x20)
            //In the next word, put value in bytes format to the next 32 bytes
            mstore(add(bs, 0x20), _value)
            // Update the free-memory pointer by padding our last write location to 32 bytes
            mstore(0x40, add(bs, 0x40))
        }
    }

    /* @notice      Convert bytes to address
    *  @param _bs   Source bytes: bytes length must be 20
    *  @return      Converted address from source bytes
    */
    function bytesToAddress(bytes memory _bs) internal pure returns (address addr)
    {
        require(_bs.length == 20, "bytes length does not match address");
        assembly {
            // for _bs, first word store _bs.length, second word store _bs.value
            // load 32 bytes from mem[_bs+20], convert it into Uint160, meaning we take last 20 bytes as addr (address).
            addr := mload(add(_bs, 0x14))
        }

    }
    
    /* @notice      Convert address to bytes
    *  @param _addr Address need to be converted
    *  @return      Converted bytes from address
    */
    function addressToBytes(address _addr) internal pure returns (bytes memory bs){
        assembly {
            // Get a location of some free memory and store it in result as
            // Solidity does for memory variables.
            bs := mload(0x40)
            // Put 20 (address byte length) at the first word, the length of bytes for uint256 value
            mstore(bs, 0x14)
            // logical shift left _a by 12 bytes, change _a from right-aligned to left-aligned
            mstore(add(bs, 0x20), shl(96, _addr))
            // Update the free-memory pointer by padding our last write location to 32 bytes
            mstore(0x40, add(bs, 0x40))
       }
    }

    /* @notice          Do hash leaf as the multi-chain does
    *  @param _data     Data in bytes format
    *  @return          Hashed value in bytes32 format
    */
    function hashLeaf(bytes memory _data) internal pure returns (bytes32 result)  {
        result = sha256(abi.encodePacked(byte(0x0), _data));
    }

    /* @notice          Do hash children as the multi-chain does
    *  @param _l        Left node
    *  @param _r        Right node
    *  @return          Hashed value in bytes32 format
    */
    function hashChildren(bytes32 _l, bytes32  _r) internal pure returns (bytes32 result)  {
        result = sha256(abi.encodePacked(bytes1(0x01), _l, _r));
    }

    /* @notice              Compare if two bytes are equal, which are in storage and memory, seperately
                            Refer from https://github.com/summa-tx/bitcoin-spv/blob/master/solidity/contracts/BytesLib.sol#L368
    *  @param _preBytes     The bytes stored in storage
    *  @param _postBytes    The bytes stored in memory
    *  @return              Bool type indicating if they are equal
    */
    function equalStorage(bytes storage _preBytes, bytes memory _postBytes) internal view returns (bool) {
        bool success = true;

        assembly {
            // we know _preBytes_offset is 0
            let fslot := sload(_preBytes_slot)
            // Arrays of 31 bytes or less have an even value in their slot,
            // while longer arrays have an odd value. The actual length is
            // the slot divided by two for odd values, and the lowest order
            // byte divided by two for even values.
            // If the slot is even, bitwise and the slot with 255 and divide by
            // two to get the length. If the slot is odd, bitwise and the slot
            // with -1 and divide by two.
            let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)
            let mlength := mload(_postBytes)

            // if lengths don't match the arrays are not equal
            switch eq(slength, mlength)
            case 1 {
                // fslot can contain both the length and contents of the array
                // if slength < 32 bytes so let's prepare for that
                // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage
                // slength != 0
                if iszero(iszero(slength)) {
                    switch lt(slength, 32)
                    case 1 {
                        // blank the last byte which is the length
                        fslot := mul(div(fslot, 0x100), 0x100)

                        if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {
                            // unsuccess:
                            success := 0
                        }
                    }
                    default {
                        // cb is a circuit breaker in the for loop since there's
                        //  no said feature for inline assembly loops
                        // cb = 1 - don't breaker
                        // cb = 0 - break
                        let cb := 1

                        // get the keccak hash to get the contents of the array
                        mstore(0x0, _preBytes_slot)
                        let sc := keccak256(0x0, 0x20)

                        let mc := add(_postBytes, 0x20)
                        let end := add(mc, mlength)

                        // the next line is the loop condition:
                        // while(uint(mc < end) + cb == 2)
                        for {} eq(add(lt(mc, end), cb), 2) {
                            sc := add(sc, 1)
                            mc := add(mc, 0x20)
                        } {
                            if iszero(eq(sload(sc), mload(mc))) {
                                // unsuccess:
                                success := 0
                                cb := 0
                            }
                        }
                    }
                }
            }
            default {
                // unsuccess:
                success := 0
            }
        }

        return success;
    }

    /* @notice              Slice the _bytes from _start index till the result has length of _length
                            Refer from https://github.com/summa-tx/bitcoin-spv/blob/master/solidity/contracts/BytesLib.sol#L246
    *  @param _bytes        The original bytes needs to be sliced
    *  @param _start        The index of _bytes for the start of sliced bytes
    *  @param _length       The index of _bytes for the end of sliced bytes
    *  @return              The sliced bytes
    */
    function slice(
        bytes memory _bytes,
        uint _start,
        uint _length
    )
        internal
        pure
        returns (bytes memory)
    {
        require(_bytes.length >= (_start + _length));

        bytes memory tempBytes;

        assembly {
            switch iszero(_length)
            case 0 {
                // Get a location of some free memory and store it in tempBytes as
                // Solidity does for memory variables.
                tempBytes := mload(0x40)

                // The first word of the slice result is potentially a partial
                // word read from the original array. To read it, we calculate
                // the length of that partial word and start copying that many
                // bytes into the array. The first word we copy will start with
                // data we don't care about, but the last `lengthmod` bytes will
                // land at the beginning of the contents of the new array. When
                // we're done copying, we overwrite the full first word with
                // the actual length of the slice.
                // lengthmod <= _length % 32
                let lengthmod := and(_length, 31)

                // The multiplication in the next line is necessary
                // because when slicing multiples of 32 bytes (lengthmod == 0)
                // the following copy loop was copying the origin's length
                // and then ending prematurely not copying everything it should.
                let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))
                let end := add(mc, _length)

                for {
                    // The multiplication in the next line has the same exact purpose
                    // as the one above.
                    let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)
                } lt(mc, end) {
                    mc := add(mc, 0x20)
                    cc := add(cc, 0x20)
                } {
                    mstore(mc, mload(cc))
                }

                mstore(tempBytes, _length)

                //update free-memory pointer
                //allocating the array padded to 32 bytes like the compiler does now
                mstore(0x40, and(add(mc, 31), not(31)))
            }
            //if we want a zero-length slice let's just return a zero-length array
            default {
                tempBytes := mload(0x40)

                mstore(0x40, add(tempBytes, 0x20))
            }
        }

        return tempBytes;
    }
    /* @notice              Check if the elements number of _signers within _keepers array is no less than _m
    *  @param _keepers      The array consists of serveral address
    *  @param _signers      Some specific addresses to be looked into
    *  @param _m            The number requirement paramter
    *  @return              True means containment, false meansdo do not contain.
    */
    function containMAddresses(address[] memory _keepers, address[] memory _signers, uint _m) internal pure returns (bool){
        uint m = 0;
        for(uint i = 0; i < _signers.length; i++){
            for (uint j = 0; j < _keepers.length; j++) {
                if (_signers[i] == _keepers[j]) {
                    m++;
                    delete _keepers[j];
                }
            }
        }
        return m >= _m;
    }

    /* @notice              TODO
    *  @param key
    *  @return
    */
    function compressMCPubKey(bytes memory key) internal pure returns (bytes memory newkey) {
         require(key.length >= 67, "key lenggh is too short");
         newkey = slice(key, 0, 35);
         if (uint8(key[66]) % 2 == 0){
             newkey[2] = byte(0x02);
         } else {
             newkey[2] = byte(0x03);
         }
         return newkey;
    }
    
    /**
     * @dev Returns true if `account` is a contract.
     *      Refer from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol#L18
     *
     * This test is non-exhaustive, and there may be false-negatives: during the
     * execution of a contract's constructor, its address will be reported as
     * not containing a contract.
     *
     * IMPORTANT: It is unsafe to assume that an address for which this
     * function returns false is an externally-owned account (EOA) and not a
     * contract.
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }
}

library ECCUtils {
    using SafeMath for uint256;
    
    struct Header {
        uint32 version;
        uint64 chainId;
        uint32 timestamp;
        uint32 height;
        uint64 consensusData;
        bytes32 prevBlockHash;
        bytes32 transactionsRoot;
        bytes32 crossStatesRoot;
        bytes32 blockRoot;
        bytes consensusPayload;
        bytes20 nextBookkeeper;
    }

    struct ToMerkleValue {
        bytes  txHash;  // cross chain txhash
        uint64 fromChainID;
        TxParam makeTxParam;
    }

    struct TxParam {
        bytes txHash; //  source chain txhash
        bytes crossChainId;
        bytes fromContract;
        uint64 toChainId;
        bytes toContract;
        bytes method;
        bytes args;
    }

    uint constant POLYCHAIN_PUBKEY_LEN = 67;
    uint constant POLYCHAIN_SIGNATURE_LEN = 65;

    /* @notice                  Verify Poly chain transaction whether exist or not
    *  @param _auditPath        Poly chain merkle proof
    *  @param _root             Poly chain root
    *  @return                  The verified value included in _auditPath
    */
    function merkleProve(bytes memory _auditPath, bytes32 _root) internal pure returns (bytes memory) {
        uint256 off = 0;
        bytes memory value;
        (value, off)  = ZeroCopySource.NextVarBytes(_auditPath, off);

        bytes32 hash = Utils.hashLeaf(value);
        uint size = _auditPath.length.sub(off).div(33);
        bytes32 nodeHash;
        byte pos;
        for (uint i = 0; i < size; i++) {
            (pos, off) = ZeroCopySource.NextByte(_auditPath, off);
            (nodeHash, off) = ZeroCopySource.NextHash(_auditPath, off);
            if (pos == 0x00) {
                hash = Utils.hashChildren(nodeHash, hash);
            } else if (pos == 0x01) {
                hash = Utils.hashChildren(hash, nodeHash);
            } else {
                revert("merkleProve, NextByte for position info failed");
            }
        }
        require(hash == _root, "merkleProve, expect root is not equal actual root");
        return value;
    }

    /* @notice              calculate next book keeper according to public key list
    *  @param _keyLen       consensus node number
    *  @param _m            minimum signature number
    *  @param _pubKeyList   consensus node public key list
    *  @return              two element: next book keeper, consensus node signer addresses
    */
    function _getBookKeeper(uint _keyLen, uint _m, bytes memory _pubKeyList) internal pure returns (bytes20, address[] memory){
         bytes memory buff;
         buff = ZeroCopySink.WriteUint16(uint16(_keyLen));
         address[] memory keepers = new address[](_keyLen);
         bytes32 hash;
         bytes memory publicKey;
         for(uint i = 0; i < _keyLen; i++){
             publicKey = Utils.slice(_pubKeyList, i*POLYCHAIN_PUBKEY_LEN, POLYCHAIN_PUBKEY_LEN);
             buff =  abi.encodePacked(buff, ZeroCopySink.WriteVarBytes(Utils.compressMCPubKey(publicKey)));
             hash = keccak256(Utils.slice(publicKey, 3, 64));
             keepers[i] = address(uint160(uint256(hash)));
         }

         buff = abi.encodePacked(buff, ZeroCopySink.WriteUint16(uint16(_m)));
         bytes20  nextBookKeeper = ripemd160(abi.encodePacked(sha256(buff)));
         return (nextBookKeeper, keepers);
    }

    /* @notice              Verify public key derived from Poly chain
    *  @param _pubKeyList   serialized consensus node public key list
    *  @param _sigList      consensus node signature list
    *  @return              return two element: next book keeper, consensus node signer addresses
    */
    function verifyPubkey(bytes memory _pubKeyList) internal pure returns (bytes20, address[] memory) {
        require(_pubKeyList.length % POLYCHAIN_PUBKEY_LEN == 0, "_pubKeyList length illegal!");
        uint n = _pubKeyList.length / POLYCHAIN_PUBKEY_LEN;
        require(n >= 1, "too short _pubKeyList!");
        return _getBookKeeper(n, n - (n - 1) / 3, _pubKeyList);
    }

    /* @notice              Verify Poly chain consensus node signature
    *  @param _rawHeader    Poly chain block header raw bytes
    *  @param _sigList      consensus node signature list
    *  @param _keepers      addresses corresponding with Poly chain book keepers' public keys
    *  @param _m            minimum signature number
    *  @return              true or false
    */
    function verifySig(bytes memory _rawHeader, bytes memory _sigList, address[] memory _keepers, uint _m) internal pure returns (bool){
        bytes32 hash = getHeaderHash(_rawHeader);

        uint sigCount = _sigList.length.div(POLYCHAIN_SIGNATURE_LEN);
        address[] memory signers = new address[](sigCount);
        bytes32 r;
        bytes32 s;
        uint8 v;
        for(uint j = 0; j  < sigCount; j++){
            r = Utils.bytesToBytes32(Utils.slice(_sigList, j*POLYCHAIN_SIGNATURE_LEN, 32));
            s =  Utils.bytesToBytes32(Utils.slice(_sigList, j*POLYCHAIN_SIGNATURE_LEN + 32, 32));
            v =  uint8(_sigList[j*POLYCHAIN_SIGNATURE_LEN + 64]) + 27;
            signers[j] =  ecrecover(sha256(abi.encodePacked(hash)), v, r, s);
            if (signers[j] == address(0)) return false;
        }
        return Utils.containMAddresses(_keepers, signers, _m);
    }
    

    /* @notice               Serialize Poly chain book keepers' info in Ethereum addresses format into raw bytes
    *  @param keepersBytes   The serialized addresses
    *  @return               serialized bytes result
    */
    function serializeKeepers(address[] memory keepers) internal pure returns (bytes memory) {
        uint256 keeperLen = keepers.length;
        bytes memory keepersBytes = ZeroCopySink.WriteUint64(uint64(keeperLen));
        for(uint i = 0; i < keeperLen; i++) {
            keepersBytes = abi.encodePacked(keepersBytes, ZeroCopySink.WriteVarBytes(Utils.addressToBytes(keepers[i])));
        }
        return keepersBytes;
    }

    /* @notice               Deserialize bytes into Ethereum addresses
    *  @param keepersBytes   The serialized addresses derived from Poly chain book keepers in bytes format
    *  @return               addresses
    */
    function deserializeKeepers(bytes memory keepersBytes) internal pure returns (address[] memory) {
        uint256 off = 0;
        uint64 keeperLen;
        (keeperLen, off) = ZeroCopySource.NextUint64(keepersBytes, off);
        address[] memory keepers = new address[](keeperLen);
        bytes memory keeperBytes;
        for(uint i = 0; i < keeperLen; i++) {
            (keeperBytes, off) = ZeroCopySource.NextVarBytes(keepersBytes, off);
            keepers[i] = Utils.bytesToAddress(keeperBytes);
        }
        return keepers;
    }

    /* @notice               Deserialize Poly chain transaction raw value
    *  @param _valueBs       Poly chain transaction raw bytes
    *  @return               ToMerkleValue struct
    */
    function deserializeMerkleValue(bytes memory _valueBs) internal pure returns (ToMerkleValue memory) {
        ToMerkleValue memory toMerkleValue;
        uint256 off = 0;

        (toMerkleValue.txHash, off) = ZeroCopySource.NextVarBytes(_valueBs, off);

        (toMerkleValue.fromChainID, off) = ZeroCopySource.NextUint64(_valueBs, off);

        TxParam memory txParam;

        (txParam.txHash, off) = ZeroCopySource.NextVarBytes(_valueBs, off);
        
        (txParam.crossChainId, off) = ZeroCopySource.NextVarBytes(_valueBs, off);

        (txParam.fromContract, off) = ZeroCopySource.NextVarBytes(_valueBs, off);

        (txParam.toChainId, off) = ZeroCopySource.NextUint64(_valueBs, off);

        (txParam.toContract, off) = ZeroCopySource.NextVarBytes(_valueBs, off);

        (txParam.method, off) = ZeroCopySource.NextVarBytes(_valueBs, off);

        (txParam.args, off) = ZeroCopySource.NextVarBytes(_valueBs, off);
        toMerkleValue.makeTxParam = txParam;

        return toMerkleValue;
    }

    /* @notice            Deserialize Poly chain block header raw bytes
    *  @param _valueBs    Poly chain block header raw bytes
    *  @return            Header struct
    */
    function deserializeHeader(bytes memory _headerBs) internal pure returns (Header memory) {
        Header memory header;
        uint256 off = 0;
        (header.version, off)  = ZeroCopySource.NextUint32(_headerBs, off);

        (header.chainId, off) = ZeroCopySource.NextUint64(_headerBs, off);

        (header.prevBlockHash, off) = ZeroCopySource.NextHash(_headerBs, off);

        (header.transactionsRoot, off) = ZeroCopySource.NextHash(_headerBs, off);

        (header.crossStatesRoot, off) = ZeroCopySource.NextHash(_headerBs, off);

        (header.blockRoot, off) = ZeroCopySource.NextHash(_headerBs, off);

        (header.timestamp, off) = ZeroCopySource.NextUint32(_headerBs, off);

        (header.height, off) = ZeroCopySource.NextUint32(_headerBs, off);

        (header.consensusData, off) = ZeroCopySource.NextUint64(_headerBs, off);

        (header.consensusPayload, off) = ZeroCopySource.NextVarBytes(_headerBs, off);

        (header.nextBookkeeper, off) = ZeroCopySource.NextBytes20(_headerBs, off);

        return header;
    }

    /* @notice            Deserialize Poly chain block header raw bytes
    *  @param rawHeader   Poly chain block header raw bytes
    *  @return            header hash same as Poly chain
    */
    function getHeaderHash(bytes memory rawHeader) internal pure returns (bytes32) {
        return sha256(abi.encodePacked(sha256(rawHeader)));
    }
}

interface IEthCrossChainData {
    function putCurEpochStartHeight(uint32 curEpochStartHeight) external returns (bool);
    function getCurEpochStartHeight() external view returns (uint32);
    function putCurEpochConPubKeyBytes(bytes calldata curEpochPkBytes) external returns (bool);
    function getCurEpochConPubKeyBytes() external view returns (bytes memory);
    function markFromChainTxExist(uint64 fromChainId, bytes32 fromChainTx) external returns (bool);
    function checkIfFromChainTxExist(uint64 fromChainId, bytes32 fromChainTx) external view returns (bool);
    function getEthTxHashIndex() external view returns (uint256);
    function putEthTxHash(bytes32 ethTxHash) external returns (bool);
    function putExtraData(bytes32 key1, bytes32 key2, bytes calldata value) external returns (bool);
    function getExtraData(bytes32 key1, bytes32 key2) external view returns (bytes memory);
    function transferOwnership(address newOwner) external;
    function pause() external returns (bool);
    function unpause() external returns (bool);
    function paused() external view returns (bool);
    // Not used currently by ECCM
    function getEthTxHash(uint256 ethTxHashIndex) external view returns (bytes32);
}

interface IUpgradableECCM {
    function pause() external returns (bool);
    function unpause() external returns (bool);
    function paused() external view returns (bool);
    function upgradeToNew(address) external returns (bool);
    function isOwner() external view returns (bool);
    function setChainId(uint64 _newChainId) external returns (bool);
}


interface IEthCrossChainManager {
    function crossChain(uint64 _toChainId, bytes calldata _toContract, bytes calldata _method, bytes calldata _txData) external returns (bool);
}

contract UpgradableECCM is IUpgradableECCM, Ownable, Pausable {
    address public EthCrossChainDataAddress;
    uint64 public chainId;  
    
    constructor (address ethCrossChainDataAddr, uint64 _chainId) Pausable() Ownable()  public {
        EthCrossChainDataAddress = ethCrossChainDataAddr;
        chainId = _chainId;
    }
    function pause() onlyOwner public returns (bool) {
        if (!paused()) {
            _pause();
        }
        IEthCrossChainData eccd = IEthCrossChainData(EthCrossChainDataAddress);
        if (!eccd.paused()) {
            require(eccd.pause(), "pause EthCrossChainData contract failed");
        }
        return true;
    }
    
    function unpause() onlyOwner public returns (bool) {
        if (paused()) {
            _unpause();
        }
        IEthCrossChainData eccd = IEthCrossChainData(EthCrossChainDataAddress);
        if (eccd.paused()) {
            require(eccd.unpause(), "unpause EthCrossChainData contract failed");
        }
        return true;
    }

    // if we want to upgrade this contract, we need to invoke this method 
    function upgradeToNew(address newEthCrossChainManagerAddress) whenPaused onlyOwner public returns (bool) {
        IEthCrossChainData eccd = IEthCrossChainData(EthCrossChainDataAddress);
        eccd.transferOwnership(newEthCrossChainManagerAddress);
        return true;
    }
    
    function setChainId(uint64 _newChainId) whenPaused onlyOwner public returns (bool) {
        chainId = _newChainId;
        return true;
    }
}

contract EthCrossChainManager is IEthCrossChainManager, UpgradableECCM {
    using SafeMath for uint256;
    
    address public whiteLister;
    mapping(address => bool) public whiteListFromContract;
    mapping(address => mapping(bytes => bool)) public whiteListContractMethodMap;

    event InitGenesisBlockEvent(uint256 height, bytes rawHeader);
    event ChangeBookKeeperEvent(uint256 height, bytes rawHeader);
    event CrossChainEvent(address indexed sender, bytes txId, address proxyOrAssetContract, uint64 toChainId, bytes toContract, bytes rawdata);
    event VerifyHeaderAndExecuteTxEvent(uint64 fromChainID, bytes toContract, bytes crossChainTxHash, bytes fromChainTxHash);
    constructor(
        address _eccd, 
        uint64 _chainId, 
        address[] memory fromContractWhiteList, 
        bytes[] memory contractMethodWhiteList
    ) UpgradableECCM(_eccd,_chainId) public {
        whiteLister = msg.sender;
        for (uint i=0;i<fromContractWhiteList.length;i++) {
            whiteListFromContract[fromContractWhiteList[i]] = true;
        }
        for (uint i=0;i<contractMethodWhiteList.length;i++) {
            (address toContract,bytes[] memory methods) = abi.decode(contractMethodWhiteList[i],(address,bytes[]));
            for (uint j=0;j<methods.length;j++) {
                whiteListContractMethodMap[toContract][methods[j]] = true;
            }
        }
    }
    
    modifier onlyWhiteLister() {
        require(msg.sender == whiteLister, "Not whiteLister");
        _;
    }

    function setWhiteLister(address newWL) public onlyWhiteLister {
        require(newWL!=address(0), "Can not transfer to address(0)");
        whiteLister = newWL;
    }
    
    function setFromContractWhiteList(address[] memory fromContractWhiteList) public onlyWhiteLister {
        for (uint i=0;i<fromContractWhiteList.length;i++) {
            whiteListFromContract[fromContractWhiteList[i]] = true;
        }
    }
    
    function removeFromContractWhiteList(address[] memory fromContractWhiteList) public onlyWhiteLister {
        for (uint i=0;i<fromContractWhiteList.length;i++) {
            whiteListFromContract[fromContractWhiteList[i]] = false;
        }
    }
    
    function setContractMethodWhiteList(bytes[] memory contractMethodWhiteList) public onlyWhiteLister {
        for (uint i=0;i<contractMethodWhiteList.length;i++) {
            (address toContract,bytes[] memory methods) = abi.decode(contractMethodWhiteList[i],(address,bytes[]));
            for (uint j=0;j<methods.length;j++) {
                whiteListContractMethodMap[toContract][methods[j]] = true;
            }
        }
    }
    
    function removeContractMethodWhiteList(bytes[] memory contractMethodWhiteList) public onlyWhiteLister {
        for (uint i=0;i<contractMethodWhiteList.length;i++) {
            (address toContract,bytes[] memory methods) = abi.decode(contractMethodWhiteList[i],(address,bytes[]));
            for (uint j=0;j<methods.length;j++) {
                whiteListContractMethodMap[toContract][methods[j]] = false;
            }
        }
    }

    /* @notice              sync Poly chain genesis block header to smart contrat
    *  @dev                 this function can only be called once, nextbookkeeper of rawHeader can't be empty
    *  @param rawHeader     Poly chain genesis block raw header or raw Header including switching consensus peers info
    *  @return              true or false
    */
    function initGenesisBlock(bytes memory rawHeader, bytes memory pubKeyList) whenNotPaused public returns(bool) {
        // Load Ethereum cross chain data contract
        IEthCrossChainData eccd = IEthCrossChainData(EthCrossChainDataAddress);
        
        // Make sure the contract has not been initialized before
        require(eccd.getCurEpochConPubKeyBytes().length == 0, "EthCrossChainData contract has already been initialized!");
        
        // Parse header and convit the public keys into nextBookKeeper and compare it with header.nextBookKeeper to verify the validity of signature
        ECCUtils.Header memory header = ECCUtils.deserializeHeader(rawHeader);
        (bytes20 nextBookKeeper, address[] memory keepers) = ECCUtils.verifyPubkey(pubKeyList);
        require(header.nextBookkeeper == nextBookKeeper, "NextBookers illegal");
        
        // Record current epoch start height and public keys (by storing them in address format)
        require(eccd.putCurEpochStartHeight(header.height), "Save Poly chain current epoch start height to Data contract failed!");
        require(eccd.putCurEpochConPubKeyBytes(ECCUtils.serializeKeepers(keepers)), "Save Poly chain current epoch book keepers to Data contract failed!");
        
        // Fire the event
        emit InitGenesisBlockEvent(header.height, rawHeader);
        return true;
    }
    
    /* @notice              change Poly chain consensus book keeper
    *  @param rawHeader     Poly chain change book keeper block raw header
    *  @param pubKeyList    Poly chain consensus nodes public key list
    *  @param sigList       Poly chain consensus nodes signature list
    *  @return              true or false
    */
    function changeBookKeeper(bytes memory rawHeader, bytes memory pubKeyList, bytes memory sigList) whenNotPaused public returns(bool) {
        // Load Ethereum cross chain data contract
        ECCUtils.Header memory header = ECCUtils.deserializeHeader(rawHeader);
        IEthCrossChainData eccd = IEthCrossChainData(EthCrossChainDataAddress);
        
        // Make sure rawHeader.height is higher than recorded current epoch start height
        uint64 curEpochStartHeight = eccd.getCurEpochStartHeight();
        require(header.height > curEpochStartHeight, "The height of header is lower than current epoch start height!");
        
        // Ensure the rawHeader is the key header including info of switching consensus peers by containing non-empty nextBookKeeper field
        require(header.nextBookkeeper != bytes20(0), "The nextBookKeeper of header is empty");
        
        // Verify signature of rawHeader comes from pubKeyList
        address[] memory polyChainBKs = ECCUtils.deserializeKeepers(eccd.getCurEpochConPubKeyBytes());
        uint n = polyChainBKs.length;
        require(ECCUtils.verifySig(rawHeader, sigList, polyChainBKs, n - (n - 1) / 3), "Verify signature failed!");
        
        // Convert pubKeyList into ethereum address format and make sure the compound address from the converted ethereum addresses
        // equals passed in header.nextBooker
        (bytes20 nextBookKeeper, address[] memory keepers) = ECCUtils.verifyPubkey(pubKeyList);
        require(header.nextBookkeeper == nextBookKeeper, "NextBookers illegal");
        
        // update current epoch start height of Poly chain and current epoch consensus peers book keepers addresses
        require(eccd.putCurEpochStartHeight(header.height), "Save MC LatestHeight to Data contract failed!");
        require(eccd.putCurEpochConPubKeyBytes(ECCUtils.serializeKeepers(keepers)), "Save Poly chain book keepers bytes to Data contract failed!");
        
        // Fire the change book keeper event
        emit ChangeBookKeeperEvent(header.height, rawHeader);
        return true;
    }


    /* @notice              ERC20 token cross chain to other blockchain.
    *                       this function push tx event to blockchain
    *  @param toChainId     Target chain id
    *  @param toContract    Target smart contract address in target block chain
    *  @param txData        Transaction data for target chain, include to_address, amount
    *  @return              true or false
    */
    function crossChain(uint64 toChainId, bytes calldata toContract, bytes calldata method, bytes calldata txData) whenNotPaused external returns (bool) {
        // Only allow whitelist contract to call
        require(whiteListFromContract[msg.sender],"Invalid from contract");
        
        // Load Ethereum cross chain data contract
        IEthCrossChainData eccd = IEthCrossChainData(EthCrossChainDataAddress);
        
        // To help differentiate two txs, the ethTxHashIndex is increasing automatically
        uint256 txHashIndex = eccd.getEthTxHashIndex();
        
        // Convert the uint256 into bytes
        bytes memory paramTxHash = Utils.uint256ToBytes(txHashIndex);
        
        // Construct the makeTxParam, and put the hash info storage, to help provide proof of tx existence
        bytes memory rawParam = abi.encodePacked(ZeroCopySink.WriteVarBytes(paramTxHash),
            ZeroCopySink.WriteVarBytes(abi.encodePacked(sha256(abi.encodePacked(address(this), paramTxHash)))),
            ZeroCopySink.WriteVarBytes(Utils.addressToBytes(msg.sender)),
            ZeroCopySink.WriteUint64(toChainId),
            ZeroCopySink.WriteVarBytes(toContract),
            ZeroCopySink.WriteVarBytes(method),
            ZeroCopySink.WriteVarBytes(txData)
        );
        
        // Must save it in the storage to be included in the proof to be verified.
        require(eccd.putEthTxHash(keccak256(rawParam)), "Save ethTxHash by index to Data contract failed!");
        
        // Fire the cross chain event denoting there is a cross chain request from Ethereum network to other public chains through Poly chain network
        emit CrossChainEvent(tx.origin, paramTxHash, msg.sender, toChainId, toContract, rawParam);
        return true;
    }
    /* @notice              Verify Poly chain header and proof, execute the cross chain tx from Poly chain to Ethereum
    *  @param proof         Poly chain tx merkle proof
    *  @param rawHeader     The header containing crossStateRoot to verify the above tx merkle proof
    *  @param headerProof   The header merkle proof used to verify rawHeader
    *  @param curRawHeader  Any header in current epoch consensus of Poly chain
    *  @param headerSig     The coverted signature veriable for solidity derived from Poly chain consensus nodes' signature
    *                       used to verify the validity of curRawHeader
    *  @return              true or false
    */
    function verifyHeaderAndExecuteTx(bytes memory proof, bytes memory rawHeader, bytes memory headerProof, bytes memory curRawHeader,bytes memory headerSig) whenNotPaused public returns (bool){
        ECCUtils.Header memory header = ECCUtils.deserializeHeader(rawHeader);
        // Load ehereum cross chain data contract
        IEthCrossChainData eccd = IEthCrossChainData(EthCrossChainDataAddress);
        
        // Get stored consensus public key bytes of current poly chain epoch and deserialize Poly chain consensus public key bytes to address[]
        address[] memory polyChainBKs = ECCUtils.deserializeKeepers(eccd.getCurEpochConPubKeyBytes());

        uint256 curEpochStartHeight = eccd.getCurEpochStartHeight();

        uint n = polyChainBKs.length;
        if (header.height >= curEpochStartHeight) {
            // It's enough to verify rawHeader signature
            require(ECCUtils.verifySig(rawHeader, headerSig, polyChainBKs, n - ( n - 1) / 3), "Verify poly chain header signature failed!");
        } else {
            // We need to verify the signature of curHeader 
            require(ECCUtils.verifySig(curRawHeader, headerSig, polyChainBKs, n - ( n - 1) / 3), "Verify poly chain current epoch header signature failed!");

            // Then use curHeader.StateRoot and headerProof to verify rawHeader.CrossStateRoot
            ECCUtils.Header memory curHeader = ECCUtils.deserializeHeader(curRawHeader);
            bytes memory proveValue = ECCUtils.merkleProve(headerProof, curHeader.blockRoot);
            require(ECCUtils.getHeaderHash(rawHeader) == Utils.bytesToBytes32(proveValue), "verify header proof failed!");
        }
        
        // Through rawHeader.CrossStatesRoot, the toMerkleValue or cross chain msg can be verified and parsed from proof
        bytes memory toMerkleValueBs = ECCUtils.merkleProve(proof, header.crossStatesRoot);
        
        // Parse the toMerkleValue struct and make sure the tx has not been processed, then mark this tx as processed
        ECCUtils.ToMerkleValue memory toMerkleValue = ECCUtils.deserializeMerkleValue(toMerkleValueBs);
        require(!eccd.checkIfFromChainTxExist(toMerkleValue.fromChainID, Utils.bytesToBytes32(toMerkleValue.txHash)), "the transaction has been executed!");
        require(eccd.markFromChainTxExist(toMerkleValue.fromChainID, Utils.bytesToBytes32(toMerkleValue.txHash)), "Save crosschain tx exist failed!");
        
        // Ethereum ChainId is 2, we need to check the transaction is for Ethereum network
        require(toMerkleValue.makeTxParam.toChainId == chainId, "This Tx is not aiming at this network!");
        
        // Obtain the targeting contract, so that Ethereum cross chain manager contract can trigger the executation of cross chain tx on Ethereum side
        address toContract = Utils.bytesToAddress(toMerkleValue.makeTxParam.toContract);
        
        // only invoke PreWhiteListed Contract and method For Now
        require(whiteListContractMethodMap[toContract][toMerkleValue.makeTxParam.method],"Invalid to contract or method");

        //TODO: check this part to make sure we commit the next line when doing local net UT test
        require(_executeCrossChainTx(toContract, toMerkleValue.makeTxParam.method, toMerkleValue.makeTxParam.args, toMerkleValue.makeTxParam.fromContract, toMerkleValue.fromChainID), "Execute CrossChain Tx failed!");

        // Fire the cross chain event denoting the executation of cross chain tx is successful,
        // and this tx is coming from other public chains to current Ethereum network
        emit VerifyHeaderAndExecuteTxEvent(toMerkleValue.fromChainID, toMerkleValue.makeTxParam.toContract, toMerkleValue.txHash, toMerkleValue.makeTxParam.txHash);

        return true;
    }
    
    /* @notice                  Dynamically invoke the targeting contract, and trigger executation of cross chain tx on Ethereum side
    *  @param _toContract       The targeting contract that will be invoked by the Ethereum Cross Chain Manager contract
    *  @param _method           At which method will be invoked within the targeting contract
    *  @param _args             The parameter that will be passed into the targeting contract
    *  @param _fromContractAddr From chain smart contract address
    *  @param _fromChainId      Indicate from which chain current cross chain tx comes 
    *  @return                  true or false
    */
    function _executeCrossChainTx(address _toContract, bytes memory _method, bytes memory _args, bytes memory _fromContractAddr, uint64 _fromChainId) internal returns (bool){
        // Ensure the targeting contract gonna be invoked is indeed a contract rather than a normal account address
        require(Utils.isContract(_toContract), "The passed in address is not a contract!");
        bytes memory returnData;
        bool success;
        
        // The returnData will be bytes32, the last byte must be 01;
        (success, returnData) = _toContract.call(abi.encodePacked(bytes4(keccak256(abi.encodePacked(_method, "(bytes,bytes,uint64)"))), abi.encode(_args, _fromContractAddr, _fromChainId)));
        
        // Ensure the executation is successful
        require(success == true, "EthCrossChain call business contract failed");
        
        // Ensure the returned value is true
        require(returnData.length != 0, "No return value from business contract!");
        (bool res,) = ZeroCopySource.NextBool(returnData, 31);
        require(res == true, "EthCrossChain call business contract return is not true");
        
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_eccd","type":"address"},{"internalType":"uint64","name":"_chainId","type":"uint64"},{"internalType":"address[]","name":"fromContractWhiteList","type":"address[]"},{"internalType":"bytes[]","name":"contractMethodWhiteList","type":"bytes[]"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"height","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"rawHeader","type":"bytes"}],"name":"ChangeBookKeeperEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"bytes","name":"txId","type":"bytes"},{"indexed":false,"internalType":"address","name":"proxyOrAssetContract","type":"address"},{"indexed":false,"internalType":"uint64","name":"toChainId","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"toContract","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"rawdata","type":"bytes"}],"name":"CrossChainEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"height","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"rawHeader","type":"bytes"}],"name":"InitGenesisBlockEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"fromChainID","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"toContract","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"crossChainTxHash","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"fromChainTxHash","type":"bytes"}],"name":"VerifyHeaderAndExecuteTxEvent","type":"event"},{"constant":true,"inputs":[],"name":"EthCrossChainDataAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"chainId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"rawHeader","type":"bytes"},{"internalType":"bytes","name":"pubKeyList","type":"bytes"},{"internalType":"bytes","name":"sigList","type":"bytes"}],"name":"changeBookKeeper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint64","name":"toChainId","type":"uint64"},{"internalType":"bytes","name":"toContract","type":"bytes"},{"internalType":"bytes","name":"method","type":"bytes"},{"internalType":"bytes","name":"txData","type":"bytes"}],"name":"crossChain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"rawHeader","type":"bytes"},{"internalType":"bytes","name":"pubKeyList","type":"bytes"}],"name":"initGenesisBlock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes[]","name":"contractMethodWhiteList","type":"bytes[]"}],"name":"removeContractMethodWhiteList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"fromContractWhiteList","type":"address[]"}],"name":"removeFromContractWhiteList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint64","name":"_newChainId","type":"uint64"}],"name":"setChainId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes[]","name":"contractMethodWhiteList","type":"bytes[]"}],"name":"setContractMethodWhiteList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"fromContractWhiteList","type":"address[]"}],"name":"setFromContractWhiteList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newWL","type":"address"}],"name":"setWhiteLister","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newEthCrossChainManagerAddress","type":"address"}],"name":"upgradeToNew","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"bytes","name":"rawHeader","type":"bytes"},{"internalType":"bytes","name":"headerProof","type":"bytes"},{"internalType":"bytes","name":"curRawHeader","type":"bytes"},{"internalType":"bytes","name":"headerSig","type":"bytes"}],"name":"verifyHeaderAndExecuteTx","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"whiteListContractMethodMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteListFromContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"whiteLister","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040516200549a3803806200549a83398101604081905262000034916200043e565b838360006200004b6001600160e01b036200021a16565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000805460ff60a01b19168155600180546001600160401b03909316600160a01b02600160a01b600160e01b03196001600160a01b039095166001600160a01b031994851617949094169390931790925560028054909116331790555b82518110156200014a576001600360008584815181106200010f57fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101620000f2565b5060005b81518110156200020f57600060608383815181106200016957fe5b6020026020010151806020019051620001869190810190620003e7565b909250905060005b815181101562000203576001600160a01b0383166000908152600460205260409020825160019190849084908110620001c357fe5b6020026020010151604051620001da91906200050d565b908152604051908190036020019020805491151560ff199092169190911790556001016200018e565b5050506001016200014e565b505050505062000611565b3390565b80516200022b81620005ec565b92915050565b600082601f8301126200024357600080fd5b81516200025a620002548262000549565b62000522565b915081818352602084019350602081019050838560208402820111156200028057600080fd5b60005b83811015620002b057816200029988826200021e565b845250602092830192919091019060010162000283565b5050505092915050565b600082601f830112620002cc57600080fd5b8151620002dd620002548262000549565b81815260209384019390925082018360005b83811015620002b0578151860162000308888262000384565b8452506020928301929190910190600101620002ef565b600082601f8301126200033157600080fd5b815162000342620002548262000549565b81815260209384019390925082018360005b83811015620002b057815186016200036d888262000384565b845250602092830192919091019060010162000354565b600082601f8301126200039657600080fd5b8151620003a762000254826200056a565b91508082526020830160208301858383011115620003c457600080fd5b620003d1838284620005b9565b50505092915050565b80516200022b8162000606565b60008060408385031215620003fb57600080fd5b60006200040985856200021e565b92505060208301516001600160401b038111156200042657600080fd5b6200043485828601620002ba565b9150509250929050565b600080600080608085870312156200045557600080fd5b60006200046387876200021e565b94505060206200047687828801620003da565b93505060408501516001600160401b038111156200049357600080fd5b620004a18782880162000231565b92505060608501516001600160401b03811115620004be57600080fd5b620004cc878288016200031f565b91505092959194509250565b6000620004e58262000592565b620004f1818562000596565b935062000503818560208601620005b9565b9290920192915050565b60006200051b8284620004d8565b9392505050565b6040518181016001600160401b03811182821017156200054157600080fd5b604052919050565b60006001600160401b038211156200056057600080fd5b5060209081020190565b60006001600160401b038211156200058157600080fd5b506020601f91909101601f19160190565b5190565b919050565b60006001600160a01b0382166200022b565b6001600160401b031690565b60005b83811015620005d6578181015183820152602001620005bc565b83811115620005e6576000848401525b50505050565b620005f7816200059b565b81146200060357600080fd5b50565b620005f781620005ad565b614e7980620006216000396000f3fe608060405234801561001057600080fd5b506004361061014c5760003560e01c80638da5cb5b116100c3578063bd5cf6251161007c578063bd5cf6251461026e578063d07033aa14610281578063d450e04c14610294578063ef26e41d146102a7578063f2fde38b146102af578063f76fe431146102c25761014c565b80638da5cb5b146102105780638f32d59b146102185780639576bfbd146102205780639a8a059214610233578063a692f6d414610248578063ba1c9bc71461025b5761014c565b80635c975abb116101155780635c975abb146101bf5780636f31031d146101c7578063715018a6146101da57806373f53ba4146101e25780637e724ff3146101f55780638456cb59146102085761014c565b8062ba1694146101515780631753acca1461016f57806329dcf4ab1461018457806334a773eb146101a45780633f4ba83a146101b7575b600080fd5b6101596102d5565b60405161016691906147dc565b60405180910390f35b61018261017d3660046134e2565b6102e4565b005b6101976101923660046135bb565b6103d1565b60405161016691906147f8565b6101976101b2366004613586565b610796565b610197610a49565b610197610b9e565b6101976101d5366004613751565b610bae565b610182610c28565b6101976101f03660046133f8565b610c96565b6101976102033660046133f8565b610cab565b610197610d66565b610159610eb1565b610197610ec0565b61018261022e3660046133f8565b610ee4565b61023b610f56565b6040516101669190614c3c565b6101826102563660046134ae565b610f6c565b610197610269366004613467565b610fee565b61019761027c36600461376f565b61101f565b61018261028f3660046134e2565b6113a8565b6101976102a236600461364c565b61148c565b610159611943565b6101826102bd3660046133f8565b611952565b6101826102d03660046134ae565b611982565b6001546001600160a01b031681565b6002546001600160a01b031633146103175760405162461bcd60e51b815260040161030e906148ee565b60405180910390fd5b60005b81518110156103cd576000606083838151811061033357fe5b602002602001015180602001905161034e9190810190613416565b909250905060005b81518110156103c2576001600160a01b0383166000908152600460205260408120835184908490811061038557fe5b602002602001015160405161039a9190614740565b908152604051908190036020019020805491151560ff19909216919091179055600101610356565b50505060010161031a565b5050565b60008054600160a01b900460ff16156103fc5760405162461bcd60e51b815260040161030e906149fe565b6104046130e2565b61040d85611a04565b90506000600160009054906101000a90046001600160a01b031690506000816001600160a01b0316635ac407906040518163ffffffff1660e01b815260040160206040518083038186803b15801561046457600080fd5b505afa158015610478573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061049c9190810190613733565b63ffffffff169050806001600160401b0316836060015163ffffffff16116104d65760405162461bcd60e51b815260040161030e90614a2e565b6101408301516bffffffffffffffffffffffff19166105075760405162461bcd60e51b815260040161030e9061493e565b6060610586836001600160a01b03166369d480746040518163ffffffff1660e01b815260040160006040518083038186803b15801561054557600080fd5b505afa158015610559573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105819190810190613552565b611b23565b80519091506105a1898884600360001986015b048503611bd6565b6105bd5760405162461bcd60e51b815260040161030e906149ce565b600060606105ca8a611dd9565b91509150816001600160601b0319168761014001516001600160601b031916146106065760405162461bcd60e51b815260040161030e90614a1e565b6060870151604051638a8bd17f60e01b81526001600160a01b03881691638a8bd17f916106369190600401614c0e565b602060405180830381600087803b15801561065057600080fd5b505af1158015610664573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106889190810190613516565b6106a45760405162461bcd60e51b815260040161030e90614ace565b856001600160a01b03166341973cd96106bc83611e55565b6040518263ffffffff1660e01b81526004016106d89190614849565b602060405180830381600087803b1580156106f257600080fd5b505af1158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061072a9190810190613516565b6107465760405162461bcd60e51b815260040161030e90614a4e565b7fe60d33488cba3977bf65766cd2f8ac9617f64bf3b3198aff6240ce5c7d43b69087606001518c60405161077b929190614c1c565b60405180910390a160019750505050505050505b9392505050565b60008054600160a01b900460ff16156107c15760405162461bcd60e51b815260040161030e906149fe565b60015460408051631a75201d60e21b815290516001600160a01b039092169182916369d48074916004808301926000929190829003018186803b15801561080757600080fd5b505afa15801561081b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108439190810190613552565b51156108615760405162461bcd60e51b815260040161030e90614b5e565b6108696130e2565b61087285611a04565b90506000606061088186611dd9565b91509150816001600160601b0319168361014001516001600160601b031916146108bd5760405162461bcd60e51b815260040161030e90614a1e565b6060830151604051638a8bd17f60e01b81526001600160a01b03861691638a8bd17f916108ed9190600401614c0e565b602060405180830381600087803b15801561090757600080fd5b505af115801561091b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061093f9190810190613516565b61095b5760405162461bcd60e51b815260040161030e9061499e565b836001600160a01b03166341973cd961097383611e55565b6040518263ffffffff1660e01b815260040161098f9190614849565b602060405180830381600087803b1580156109a957600080fd5b505af11580156109bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109e19190810190613516565b6109fd5760405162461bcd60e51b815260040161030e90614b7e565b7ff01968fc3a2655cf1b5144cb32de6dc898f91b9239c103744e8457152ab2fbde836060015188604051610a32929190614c1c565b60405180910390a160019450505050505b92915050565b6000610a53610ec0565b610a6f5760405162461bcd60e51b815260040161030e90614a6e565b610a77610b9e565b15610a8457610a84611ec4565b60015460408051635c975abb60e01b815290516001600160a01b03909216918291635c975abb916004808301926020929190829003018186803b158015610aca57600080fd5b505afa158015610ade573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b029190810190613516565b15610b9657806001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610b4257600080fd5b505af1158015610b56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b7a9190810190613516565b610b965760405162461bcd60e51b815260040161030e9061494e565b600191505090565b600054600160a01b900460ff1690565b60008054600160a01b900460ff16610bd85760405162461bcd60e51b815260040161030e906148fe565b610be0610ec0565b610bfc5760405162461bcd60e51b815260040161030e90614a6e565b506001805467ffffffffffffffff60a01b1916600160a01b6001600160401b038416021781555b919050565b610c30610ec0565b610c4c5760405162461bcd60e51b815260040161030e90614a6e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60036020526000908152604090205460ff1681565b60008054600160a01b900460ff16610cd55760405162461bcd60e51b815260040161030e906148fe565b610cdd610ec0565b610cf95760405162461bcd60e51b815260040161030e90614a6e565b60015460405163f2fde38b60e01b81526001600160a01b0390911690819063f2fde38b90610d2b9086906004016147dc565b600060405180830381600087803b158015610d4557600080fd5b505af1158015610d59573d6000803e3d6000fd5b5060019695505050505050565b6000610d70610ec0565b610d8c5760405162461bcd60e51b815260040161030e90614a6e565b610d94610b9e565b610da057610da0611f3a565b60015460408051635c975abb60e01b815290516001600160a01b03909216918291635c975abb916004808301926020929190829003018186803b158015610de657600080fd5b505afa158015610dfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e1e9190810190613516565b610b9657806001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610e5d57600080fd5b505af1158015610e71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e959190810190613516565b610b965760405162461bcd60e51b815260040161030e9061491e565b6000546001600160a01b031690565b600080546001600160a01b0316610ed5611f9c565b6001600160a01b031614905090565b6002546001600160a01b03163314610f0e5760405162461bcd60e51b815260040161030e906148ee565b6001600160a01b038116610f345760405162461bcd60e51b815260040161030e90614ade565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600154600160a01b90046001600160401b031681565b6002546001600160a01b03163314610f965760405162461bcd60e51b815260040161030e906148ee565b60005b81518110156103cd57600160036000848481518110610fb457fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101610f99565b6004602090815260009283526040909220815180830184018051928152908401929093019190912091525460ff1681565b60008054600160a01b900460ff161561104a5760405162461bcd60e51b815260040161030e906149fe565b3360009081526003602052604090205460ff166110795760405162461bcd60e51b815260040161030e906149ee565b60015460408051600162c2db5f60e01b0319815290516001600160a01b0390921691600091839163ff3d24a191600480820192602092909190829003018186803b1580156110c657600080fd5b505afa1580156110da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110fe9190810190613534565b9050606061110b82611fa0565b9050606061111882611fe4565b6111ae600230856040516020016111309291906146a0565b60408051601f198184030181529082905261114a91614740565b602060405180830381855afa158015611167573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525061118a9190810190613534565b60405160200161119a919061470f565b604051602081830303815290604052611fe4565b6111bf6111ba3361201b565b611fe4565b6111c88f612036565b6112078f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611fe492505050565b6112468e8e8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611fe492505050565b6112858d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611fe492505050565b60405160200161129b9796959493929190614764565b60408051601f19818403018152908290528051602082012063130f33d960e21b83529092506001600160a01b03861691634c3ccf64916112dd91600401614806565b602060405180830381600087803b1580156112f757600080fd5b505af115801561130b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061132f9190810190613516565b61134b5760405162461bcd60e51b815260040161030e90614bce565b326001600160a01b03167f6ad3bf15c1988bc04bc153490cab16db8efb9a3990215bf1c64ea6e28be8848383338f8f8f8760405161138e9695949392919061485a565b60405180910390a25060019b9a5050505050505050505050565b6002546001600160a01b031633146113d25760405162461bcd60e51b815260040161030e906148ee565b60005b81518110156103cd57600060608383815181106113ee57fe5b60200260200101518060200190516114099190810190613416565b909250905060005b8151811015611481576001600160a01b038316600090815260046020526040902082516001919084908490811061144457fe5b60200260200101516040516114599190614740565b908152604051908190036020019020805491151560ff19909216919091179055600101611411565b5050506001016113d5565b60008054600160a01b900460ff16156114b75760405162461bcd60e51b815260040161030e906149fe565b6114bf6130e2565b6114c886611a04565b90506000600160009054906101000a90046001600160a01b031690506060611522826001600160a01b03166369d480746040518163ffffffff1660e01b815260040160006040518083038186803b15801561054557600080fd5b90506000826001600160a01b0316635ac407906040518163ffffffff1660e01b815260040160206040518083038186803b15801561155f57600080fd5b505afa158015611573573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115979190810190613733565b63ffffffff16905060008251905081856060015163ffffffff16106115e9576115c88a888560036000198601610599565b6115e45760405162461bcd60e51b815260040161030e90614bfe565b61166f565b6115fb88888560036000198601610599565b6116175760405162461bcd60e51b815260040161030e90614afe565b61161f6130e2565b61162889611a04565b9050606061163b8b836101000151612079565b905061164681612178565b61164f8d6121a3565b1461166c5760405162461bcd60e51b815260040161030e9061496e565b50505b606061167f8c8760e00151612079565b905061168961313d565b61169282612260565b9050856001600160a01b0316630586763c82602001516116b58460000151612178565b6040518363ffffffff1660e01b81526004016116d2929190614c4a565b60206040518083038186803b1580156116ea57600080fd5b505afa1580156116fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117229190810190613516565b1561173f5760405162461bcd60e51b815260040161030e90614bbe565b856001600160a01b031663e90bfdcf82602001516117608460000151612178565b6040518363ffffffff1660e01b815260040161177d929190614c4a565b602060405180830381600087803b15801561179757600080fd5b505af11580156117ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117cf9190810190613516565b6117eb5760405162461bcd60e51b815260040161030e9061498e565b6001546040820151606001516001600160401b03908116600160a01b90920416146118285760405162461bcd60e51b815260040161030e906149ae565b600061183b82604001516080015161233c565b6001600160a01b038116600090815260046020526040908190208482015160a0015191519293509161186d9190614740565b9081526040519081900360200190205460ff1661189c5760405162461bcd60e51b815260040161030e906149de565b6118c581836040015160a00151846040015160c001518560400151604001518660200151612367565b6118e15760405162461bcd60e51b815260040161030e9061490e565b602082015160408084015160808101518551915192517f8a4a2663ce60ce4955c595da2894de0415240f1ace024cfbff85f513b656bdae9461192594909391614c65565b60405180910390a16001985050505050505050505b95945050505050565b6002546001600160a01b031681565b61195a610ec0565b6119765760405162461bcd60e51b815260040161030e90614a6e565b61197f816124d8565b50565b6002546001600160a01b031633146119ac5760405162461bcd60e51b815260040161030e906148ee565b60005b81518110156103cd576000600360008484815181106119ca57fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790556001016119af565b611a0c6130e2565b611a146130e2565b6000611a208482612559565b63ffffffff90911683529050611a3684826125e2565b6001600160401b0390911660208401529050611a528482612669565b60a08401919091529050611a668482612669565b60c08401919091529050611a7a8482612669565b60e08401919091529050611a8e8482612669565b6101008401919091529050611aa38482612559565b63ffffffff90911660408401529050611abc8482612559565b63ffffffff90911660608401529050611ad584826125e2565b6001600160401b0390911660808401529050611af184826126ae565b6101208401919091529050611b068482612762565b506bffffffffffffffffffffffff19166101408301525092915050565b6060600080611b3284826125e2565b80935081925050506060816001600160401b0316604051908082528060200260200182016040528015611b6f578160200160208202803883390190505b509050606060005b836001600160401b0316811015611bcb57611b9287866126ae565b95509150611b9f8261233c565b838281518110611bab57fe5b6001600160a01b0390921660209283029190910190910152600101611b77565b509095945050505050565b600080611be2866121a3565b90506000611bfb604187516127ab90919063ffffffff16565b9050606081604051908082528060200260200182016040528015611c29578160200160208202803883390190505b50905060008080805b85811015611dbc57611c51611c4c8c6041840260206127ed565b612178565b9350611c68611c4c8c6041840260200160206127ed565b92508a6041820260400181518110611c7c57fe5b602001015160f81c60f81b60f81c601b0191506001600288604051602001611ca4919061470f565b60408051601f1981840301815290829052611cbe91614740565b602060405180830381855afa158015611cdb573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250611cfe9190810190613534565b83868660405160008152602001604052604051611d1e9493929190614814565b6020604051602081039080840390855afa158015611d40573d6000803e3d6000fd5b50505060206040510351858281518110611d5657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006001600160a01b0316858281518110611d8d57fe5b60200260200101516001600160a01b03161415611db4576000975050505050505050611dd1565b600101611c32565b50611dc889858a61286d565b96505050505050505b949350505050565b600060606043835181611de857fe5b0615611e065760405162461bcd60e51b815260040161030e90614aae565b60006043845181611e1357fe5b0490506001811015611e375760405162461bcd60e51b815260040161030e90614b2e565b611e4b81600360001982010483038661290e565b9250925050915091565b805160609081611e6482612036565b905060005b82811015611ebc5781611e916111ba878481518110611e8457fe5b602002602001015161201b565b604051602001611ea292919061474c565b60408051601f198184030181529190529150600101611e69565b509392505050565b600054600160a01b900460ff16611eed5760405162461bcd60e51b815260040161030e906148fe565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611f23611f9c565b604051611f3091906147ea565b60405180910390a1565b600054600160a01b900460ff1615611f645760405162461bcd60e51b815260040161030e906149fe565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f235b3390565b60606001600160ff1b03821115611fc95760405162461bcd60e51b815260040161030e90614a5e565b60405190506020815281602082015260408101604052919050565b8051606090611ff281612ac3565b8360405160200161200492919061474c565b604051602081830303815290604052915050919050565b604080516014815260609290921b6020830152818101905290565b6040516008808252606091906000601f5b828210156120695785811a826020860101536001919091019060001901612047565b5050506028810160405292915050565b606060008161208885836126ae565b92509050600061209782612b7a565b905060006120c060216120b4868a51612b9590919063ffffffff16565b9063ffffffff6127ab16565b9050600080805b8381101561214b576120d98a88612bd7565b975091506120e78a88612669565b975092506001600160f81b0319821661210b576121048386612c20565b9450612143565b600160f81b6001600160f81b03198316141561212b576121048584612c20565b60405162461bcd60e51b815260040161030e90614a8e565b6001016120c7565b5087841461216b5760405162461bcd60e51b815260040161030e90614a0e565b5092979650505050505050565b6000815160201461219b5760405162461bcd60e51b815260040161030e90614b1e565b506020015190565b6000600280836040516121b69190614740565b602060405180830381855afa1580156121d3573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052506121f69190810190613534565b604051602001612206919061470f565b60408051601f198184030181529082905261222091614740565b602060405180830381855afa15801561223d573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250610a439190810190613534565b61226861313d565b61227061313d565b600061227c84826126ae565b908352905061228b84826125e2565b6001600160401b03909116602084015290506122a5613161565b6122af85836126ae565b90825291506122be85836126ae565b602083019190915291506122d285836126ae565b604083019190915291506122e685836125e2565b6001600160401b039091166060830152915061230285836126ae565b6080830191909152915061231685836126ae565b60a0830191909152915061232a85836126ae565b5060c082015260408301525092915050565b6000815160141461235f5760405162461bcd60e51b815260040161030e9061495e565b506014015190565b600061237286612c97565b61238e5760405162461bcd60e51b815260040161030e90614abe565b60606000876001600160a01b0316876040516020016123ad91906147c5565b604051602081830303815290604052805190602001208787876040516020016123d8939291906148ba565b60408051601f19818403018152908290526123f69291602001614724565b60408051601f198184030181529082905261241091614740565b6000604051808303816000865af19150503d806000811461244d576040519150601f19603f3d011682016040523d82523d6000602084013e612452565b606091505b50925090506001811515146124795760405162461bcd60e51b815260040161030e90614a3e565b81516124975760405162461bcd60e51b815260040161030e90614b0e565b60006124a483601f612cce565b5090506001811515146124c95760405162461bcd60e51b815260040161030e90614b3e565b50600198975050505050505050565b6001600160a01b0381166124fe5760405162461bcd60e51b815260040161030e9061497e565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000808351836004011115801561257257508260040183105b61258e5760405162461bcd60e51b815260040161030e90614bde565b600060405160046000600182038760208a0101515b838310156125c35780821a838601536001830192506001820391506125a3565b50505080820160405260200390035192505050600482015b9250929050565b600080835183600801111580156125fb57508260080183105b6126175760405162461bcd60e51b815260040161030e90614b9e565b600060405160086000600182038760208a0101515b8383101561264c5780821a8386015360018301925060018203915061262c565b505050808201604052602003900351956008949094019450505050565b6000808351836020011115801561268257508260200183105b61269e5760405162461bcd60e51b815260040161030e90614b8e565b5050602091810182015192910190565b60606000806126bd8585612d67565b8651909550909150818501118015906126d7575080840184105b6126f35760405162461bcd60e51b815260040161030e90614bee565b60608115801561270e57604051915060208201604052612758565b6040519150601f8316801560200281840101848101888315602002848c0101015b8183101561274757805183526020928301920161272f565b5050848452601f01601f1916604052505b5095930193505050565b6000808351836014011115801561277b57508260140183105b6127975760405162461bcd60e51b815260040161030e906149be565b505081810160200151601482019250929050565b600061078f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612eac565b6060818301845110156127ff57600080fd5b60608215801561281a57604051915060208201604052612864565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561285357805183526020928301920161283b565b5050858452601f01601f1916604052505b50949350505050565b600080805b84518110156129025760005b86518110156128f95786818151811061289357fe5b60200260200101516001600160a01b03168683815181106128b057fe5b60200260200101516001600160a01b031614156128f15782806001019350508681815181106128db57fe5b6020026020010160006001600160a01b03168152505b60010161287e565b50600101612872565b50909111159392505050565b600060608061291c86612ee3565b905060608660405190808252806020026020018201604052801561294a578160200160208202803883390190505b50905060006060815b898110156129e15761296a886043830260436127ed565b9150846129796111ba84612f26565b60405160200161298a92919061474c565b60405160208183030381529060405294506129a882600360406127ed565b8051906020012092508260001c8482815181106129c157fe5b6001600160a01b0390921660209283029190910190910152600101612953565b50836129ec89612ee3565b6040516020016129fd92919061474c565b604051602081830303815290604052935060006003600286604051612a229190614740565b602060405180830381855afa158015612a3f573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250612a629190810190613534565b604051602001612a72919061470f565b60408051601f1981840301815290829052612a8c91614740565b602060405180830381855afa158015612aa9573d6000803e3d6000fd5b50506040515160601b9b949a509398505050505050505050565b606060fd826001600160401b03161015612ae757612ae082612fdf565b9050610c23565b61ffff826001600160401b031611612b3657612b0660fd60f81b612ffb565b612b0f83612ee3565b604051602001612b2092919061474c565b6040516020818303038152906040529050610c23565b63ffffffff826001600160401b031611612b6057612b57607f60f91b612ffb565b612b0f83613009565b612b716001600160f81b0319612ffb565b612b0f83612036565b60006002600060f81b836040516020016122069291906146f3565b600061078f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061304c565b60008083518360010111158015612bf057508260010183105b612c0c5760405162461bcd60e51b815260040161030e90614a9e565b505081810160200151600182019250929050565b60006002600160f81b8484604051602001612c3d939291906146bc565b60408051601f1981840301815290829052612c5791614740565b602060405180830381855afa158015612c74573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525061078f9190810190613534565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590611dd15750141592915050565b60008083518360010111158015612ce757508260010183105b612d035760405162461bcd60e51b815260040161030e90614b6e565b838301602001516000600160f81b6001600160f81b031983161415612d2a57506001612d59565b6001600160f81b03198216612d4157506000612d59565b60405162461bcd60e51b815260040161030e90614a7e565b956001949094019450505050565b6000806000612d768585612bd7565b94509050600060fd60f81b6001600160f81b031983161415612ddf57612d9c8686613078565b955061ffff16905060fd8110801590612db7575061ffff8111155b612dd35760405162461bcd60e51b815260040161030e9061492e565b92508391506125db9050565b607f60f91b6001600160f81b031983161415612e3a57612dff8686612559565b955063ffffffff16905061ffff81118015612e1e575063ffffffff8111155b612dd35760405162461bcd60e51b815260040161030e90614aee565b6001600160f81b03198083161415612e8657612e5686866125e2565b95506001600160401b0316905063ffffffff8111612dd35760405162461bcd60e51b815260040161030e90614aee565b5060f881901c60fd8110612dd35760405162461bcd60e51b815260040161030e90614aee565b60008183612ecd5760405162461bcd60e51b815260040161030e9190614849565b506000838581612ed957fe5b0495945050505050565b6040516002808252606091906000601f5b82821015612f165785811a826020860101536001919091019060001901612ef4565b5050506022810160405292915050565b6060604382511015612f4a5760405162461bcd60e51b815260040161030e90614bae565b612f5782600060236127ed565b9050600282604281518110612f6857fe5b016020015160f81c81612f7757fe5b0660ff1660001415612fb157600260f81b81600281518110612f9557fe5b60200101906001600160f81b031916908160001a905350610c23565b600360f81b81600281518110612fc357fe5b60200101906001600160f81b031916908160001a905350919050565b604080516001815260f89290921b602083015260218201905290565b6060610a438260f81c612fdf565b6040516004808252606091906000601f5b8282101561303c5785811a82602086010153600191909101906000190161301a565b5050506024810160405292915050565b600081848411156130705760405162461bcd60e51b815260040161030e9190614849565b505050900390565b6000808351836002011115801561309157508260020183105b6130ad5760405162461bcd60e51b815260040161030e90614b4e565b6000604051846020870101518060011a82538060001a6001830153506002818101604052601d19909101519694019450505050565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201839052610100820183905261012082015261014081019190915290565b604080516060808201835281526000602082015290810161315c613161565b905290565b6040518060e0016040528060608152602001606081526020016060815260200160006001600160401b031681526020016060815260200160608152602001606081525090565b8035610a4381614dfe565b8051610a4381614dfe565b600082601f8301126131ce57600080fd5b81356131e16131dc82614cdd565b614cb7565b9150818183526020840193506020810190508385602084028201111561320657600080fd5b60005b83811015613232578161321c88826131a7565b8452506020928301929190910190600101613209565b5050505092915050565b600082601f83011261324d57600080fd5b815161325b6131dc82614cdd565b81815260209384019390925082018360005b838110156132325781518601613283888261339c565b845250602092830192919091019060010161326d565b600082601f8301126132aa57600080fd5b81356132b86131dc82614cdd565b81815260209384019390925082018360005b8381101561323257813586016132e0888261334d565b84525060209283019291909101906001016132ca565b8051610a4381614e12565b8051610a4381614e1b565b60008083601f84011261331e57600080fd5b5081356001600160401b0381111561333557600080fd5b6020830191508360018202830111156125db57600080fd5b600082601f83011261335e57600080fd5b813561336c6131dc82614cfd565b9150808252602083016020830185838301111561338857600080fd5b613393838284614da1565b50505092915050565b600082601f8301126133ad57600080fd5b81516133bb6131dc82614cfd565b915080825260208301602083018583830111156133d757600080fd5b613393838284614dad565b8051610a4381614e24565b8035610a4381614e2d565b60006020828403121561340a57600080fd5b6000611dd184846131a7565b6000806040838503121561342957600080fd5b600061343585856131b2565b92505060208301516001600160401b0381111561345157600080fd5b61345d8582860161323c565b9150509250929050565b6000806040838503121561347a57600080fd5b600061348685856131a7565b92505060208301356001600160401b038111156134a257600080fd5b61345d8582860161334d565b6000602082840312156134c057600080fd5b81356001600160401b038111156134d657600080fd5b611dd1848285016131bd565b6000602082840312156134f457600080fd5b81356001600160401b0381111561350a57600080fd5b611dd184828501613299565b60006020828403121561352857600080fd5b6000611dd184846132f6565b60006020828403121561354657600080fd5b6000611dd18484613301565b60006020828403121561356457600080fd5b81516001600160401b0381111561357a57600080fd5b611dd18482850161339c565b6000806040838503121561359957600080fd5b82356001600160401b038111156135af57600080fd5b6134868582860161334d565b6000806000606084860312156135d057600080fd5b83356001600160401b038111156135e657600080fd5b6135f28682870161334d565b93505060208401356001600160401b0381111561360e57600080fd5b61361a8682870161334d565b92505060408401356001600160401b0381111561363657600080fd5b6136428682870161334d565b9150509250925092565b600080600080600060a0868803121561366457600080fd5b85356001600160401b0381111561367a57600080fd5b6136868882890161334d565b95505060208601356001600160401b038111156136a257600080fd5b6136ae8882890161334d565b94505060408601356001600160401b038111156136ca57600080fd5b6136d68882890161334d565b93505060608601356001600160401b038111156136f257600080fd5b6136fe8882890161334d565b92505060808601356001600160401b0381111561371a57600080fd5b6137268882890161334d565b9150509295509295909350565b60006020828403121561374557600080fd5b6000611dd184846133e2565b60006020828403121561376357600080fd5b6000611dd184846133ed565b60008060008060008060006080888a03121561378a57600080fd5b60006137968a8a6133ed565b97505060208801356001600160401b038111156137b257600080fd5b6137be8a828b0161330c565b965096505060408801356001600160401b038111156137dc57600080fd5b6137e88a828b0161330c565b945094505060608801356001600160401b0381111561380657600080fd5b6138128a828b0161330c565b925092505092959891949750929550565b61382c81614d85565b82525050565b61382c81614d31565b61382c61384782614d31565b614ddd565b61382c81614d3c565b61382c61386182614d41565b614d4e565b61382c81614d4e565b61382c61386182614d4e565b61382c61386182614d51565b60006138938385614d28565b93506138a0838584614da1565b6138a983614dee565b9093019392505050565b60006138be82614d24565b6138c88185614d28565b93506138d8818560208601614dad565b6138a981614dee565b60006138ec82614d24565b6138f68185610c23565b9350613906818560208601614dad565b9290920192915050565b600061391d600f83614d28565b6e2737ba103bb434ba32a634b9ba32b960891b815260200192915050565b6000613948601483614d28565b7314185d5cd8589b194e881b9bdd081c185d5cd95960621b815260200192915050565b6000613978601d83614d28565b7f457865637574652043726f7373436861696e205478206661696c656421000000815260200192915050565b60006139b1602783614d28565b7f70617573652045746843726f7373436861696e4461746120636f6e74726163748152660819985a5b195960ca1b602082015260400192915050565b60006139fa601f83614d28565b7f4e65787455696e7431362c2076616c7565206f7574736964652072616e676500815260200192915050565b6000613a33602583614d28565b7f546865206e657874426f6f6b4b6565706572206f662068656164657220697320815264656d70747960d81b602082015260400192915050565b6000613a7a602983614d28565b7f756e70617573652045746843726f7373436861696e4461746120636f6e74726181526818dd0819985a5b195960ba1b602082015260400192915050565b6000613ac5602383614d28565b7f6279746573206c656e67746820646f6573206e6f74206d61746368206164647281526265737360e81b602082015260400192915050565b6000613b0a601b83614d28565b7f766572696679206865616465722070726f6f66206661696c6564210000000000815260200192915050565b6000613b43602683614d28565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b6000613b8b602083614d28565b7f536176652063726f7373636861696e207478206578697374206661696c656421815260200192915050565b6000613bc4604383614d28565b7f5361766520506f6c7920636861696e2063757272656e742065706f636820737481527f6172742068656967687420746f204461746120636f6e7472616374206661696c60208201526265642160e81b604082015260600192915050565b6000613c2f602683614d28565b7f54686973205478206973206e6f742061696d696e672061742074686973206e6581526574776f726b2160d01b602082015260400192915050565b6000613c77602383614d28565b7f4e657874427974657332302c206f66667365742065786365656473206d6178698152626d756d60e81b602082015260400192915050565b6000613cbc601883614d28565b7f566572696679207369676e6174757265206661696c6564210000000000000000815260200192915050565b6000613cf5601d83614d28565b7f496e76616c696420746f20636f6e7472616374206f72206d6574686f64000000815260200192915050565b6000613d2e601583614d28565b74125b9d985b1a5908199c9bdb4818dbdb9d1c9858dd605a1b815260200192915050565b6000613d5f601083614d28565b6f14185d5cd8589b194e881c185d5cd95960821b815260200192915050565b6000613d8b603183614d28565b7f6d65726b6c6550726f76652c2065787065637420726f6f74206973206e6f7420815270195c5d585b081858dd1d585b081c9bdbdd607a1b602082015260400192915050565b6000613dde601383614d28565b7213995e1d109bdbdad95c9cc81a5b1b1959d85b606a1b815260200192915050565b6000613e0d603e83614d28565b7f54686520686569676874206f6620686561646572206973206c6f77657220746881527f616e2063757272656e742065706f636820737461727420686569676874210000602082015260400192915050565b6000613e6c602b83614d28565b7f45746843726f7373436861696e2063616c6c20627573696e65737320636f6e7481526a1c9858dd0819985a5b195960aa1b602082015260400192915050565b6000613eb9603b83614d28565b7f5361766520506f6c7920636861696e20626f6f6b206b6565706572732062797481527f657320746f204461746120636f6e7472616374206661696c6564210000000000602082015260400192915050565b6000613f18601783614d28565b7f56616c75652065786365656473207468652072616e6765000000000000000000815260200192915050565b6000613f51602083614d28565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b6000613f8a601483614d28565b732732bc3a2137b7b6103b30b63ab29032b93937b960611b815260200192915050565b6000613fba602e83614d28565b7f6d65726b6c6550726f76652c204e6578744279746520666f7220706f7369746981526d1bdb881a5b999bc819985a5b195960921b602082015260400192915050565b600061400a602083614d28565b7f4e657874427974652c204f66667365742065786365656473206d6178696d756d815260200192915050565b6000614043601b83614d28565b7f5f7075624b65794c697374206c656e67746820696c6c6567616c210000000000815260200192915050565b600061407c602883614d28565b7f5468652070617373656420696e2061646472657373206973206e6f74206120638152676f6e74726163742160c01b602082015260400192915050565b60006140c6602d83614d28565b7f53617665204d43204c617465737448656967687420746f204461746120636f6e81526c7472616374206661696c65642160981b602082015260400192915050565b6000614115601e83614d28565b7f43616e206e6f74207472616e7366657220746f20616464726573732830290000815260200192915050565b600061414e602083614d28565b7f4e65787456617255696e742c2076616c7565206f7574736964652072616e6765815260200192915050565b6000614187603883614d28565b7f56657269667920706f6c7920636861696e2063757272656e742065706f63682081527f686561646572207369676e6174757265206661696c6564210000000000000000602082015260400192915050565b60006141e6601483610c23565b732862797465732c62797465732c75696e7436342960601b815260140192915050565b6000614216602783614d28565b7f4e6f2072657475726e2076616c75652066726f6d20627573696e65737320636f8152666e74726163742160c81b602082015260400192915050565b600061425f601783614d28565b7f6279746573206c656e677468206973206e6f742033322e000000000000000000815260200192915050565b6000614298601683614d28565b75746f6f2073686f7274205f7075624b65794c6973742160501b815260200192915050565b60006142ca603783614d28565b7f45746843726f7373436861696e2063616c6c20627573696e65737320636f6e7481527f726163742072657475726e206973206e6f742074727565000000000000000000602082015260400192915050565b6000614329602283614d28565b7f4e65787455696e7431362c206f66667365742065786365656473206d6178696d815261756d60f01b602082015260400192915050565b600061436d603883614d28565b7f45746843726f7373436861696e4461746120636f6e747261637420686173206181527f6c7265616479206265656e20696e697469616c697a6564210000000000000000602082015260400192915050565b60006143cc601483614d28565b7313d9999cd95d08195e18d959591cc81b1a5b5a5d60621b815260200192915050565b60006143fc604383614d28565b7f5361766520506f6c7920636861696e2063757272656e742065706f636820626f81527f6f6b206b65657065727320746f204461746120636f6e7472616374206661696c60208201526265642160e81b604082015260600192915050565b6000614467602083614d28565b7f4e657874486173682c206f66667365742065786365656473206d6178696d756d815260200192915050565b60006144a0602283614d28565b7f4e65787455696e7436342c206f66667365742065786365656473206d6178696d815261756d60f01b602082015260400192915050565b60006144e4601783614d28565b7f6b6579206c656e67676820697320746f6f2073686f7274000000000000000000815260200192915050565b600061451d602283614d28565b7f746865207472616e73616374696f6e20686173206265656e2065786563757465815261642160f01b602082015260400192915050565b6000614561603083614d28565b7f536176652065746854784861736820627920696e64657820746f20446174612081526f636f6e7472616374206661696c65642160801b602082015260400192915050565b60006145b3602283614d28565b7f4e65787455696e7433322c206f66667365742065786365656473206d6178696d815261756d60f01b602082015260400192915050565b60006145f7602483614d28565b7f4e65787456617242797465732c206f66667365742065786365656473206d6178815263696d756d60e01b602082015260400192915050565b600061463d602a83614d28565b7f56657269667920706f6c7920636861696e20686561646572207369676e6174758152697265206661696c65642160b01b602082015260400192915050565b61382c81614d96565b61382c81614d6a565b61382c81614d73565b61382c81614d7f565b60006146ac828561383b565b601482019150611dd182846138e1565b60006146c88286613855565b6001820191506146d8828561386f565b6020820191506146e8828461386f565b506020019392505050565b60006146ff8285613855565b600182019150611dd182846138e1565b600061471b828461386f565b50602001919050565b6000614730828561387b565b600482019150611dd182846138e1565b600061078f82846138e1565b600061475882856138e1565b9150611dd182846138e1565b6000614770828a6138e1565b915061477c82896138e1565b915061478882886138e1565b915061479482876138e1565b91506147a082866138e1565b91506147ac82856138e1565b91506147b882846138e1565b9998505050505050505050565b60006147d182846138e1565b915061078f826141d9565b60208101610a438284613832565b60208101610a438284613823565b60208101610a43828461384c565b60208101610a438284613866565b608081016148228287613866565b61482f6020830186614697565b61483c6040830185613866565b61193a6060830184613866565b6020808252810161078f81846138b3565b60a0808252810161486b81896138b3565b905061487a6020830188613823565b614887604083018761468e565b818103606083015261489a818587613887565b905081810360808301526148ae81846138b3565b98975050505050505050565b606080825281016148cb81866138b3565b905081810360208301526148df81856138b3565b9050611dd1604083018461468e565b60208082528101610a4381613910565b60208082528101610a438161393b565b60208082528101610a438161396b565b60208082528101610a43816139a4565b60208082528101610a43816139ed565b60208082528101610a4381613a26565b60208082528101610a4381613a6d565b60208082528101610a4381613ab8565b60208082528101610a4381613afd565b60208082528101610a4381613b36565b60208082528101610a4381613b7e565b60208082528101610a4381613bb7565b60208082528101610a4381613c22565b60208082528101610a4381613c6a565b60208082528101610a4381613caf565b60208082528101610a4381613ce8565b60208082528101610a4381613d21565b60208082528101610a4381613d52565b60208082528101610a4381613d7e565b60208082528101610a4381613dd1565b60208082528101610a4381613e00565b60208082528101610a4381613e5f565b60208082528101610a4381613eac565b60208082528101610a4381613f0b565b60208082528101610a4381613f44565b60208082528101610a4381613f7d565b60208082528101610a4381613fad565b60208082528101610a4381613ffd565b60208082528101610a4381614036565b60208082528101610a438161406f565b60208082528101610a43816140b9565b60208082528101610a4381614108565b60208082528101610a4381614141565b60208082528101610a438161417a565b60208082528101610a4381614209565b60208082528101610a4381614252565b60208082528101610a438161428b565b60208082528101610a43816142bd565b60208082528101610a438161431c565b60208082528101610a4381614360565b60208082528101610a43816143bf565b60208082528101610a43816143ef565b60208082528101610a438161445a565b60208082528101610a4381614493565b60208082528101610a43816144d7565b60208082528101610a4381614510565b60208082528101610a4381614554565b60208082528101610a43816145a6565b60208082528101610a43816145ea565b60208082528101610a4381614630565b60208101610a438284614685565b60408101614c2a828561467c565b8181036020830152611dd181846138b3565b60208101610a43828461468e565b60408101614c58828561468e565b61078f6020830184613866565b60808101614c73828761468e565b8181036020830152614c8581866138b3565b90508181036040830152614c9981856138b3565b90508181036060830152614cad81846138b3565b9695505050505050565b6040518181016001600160401b0381118282101715614cd557600080fd5b604052919050565b60006001600160401b03821115614cf357600080fd5b5060209081020190565b60006001600160401b03821115614d1357600080fd5b506020601f91909101601f19160190565b5190565b90815260200190565b6000610a4382614d5e565b151590565b6001600160f81b03191690565b90565b6001600160e01b03191690565b6001600160a01b031690565b63ffffffff1690565b6001600160401b031690565b60ff1690565b6000610a43826000610a4382614d31565b6000610a4382614d6a565b82818337506000910152565b60005b83811015614dc8578181015183820152602001614db0565b83811115614dd7576000848401525b50505050565b6000610a43826000610a4382614df8565b601f01601f191690565b60601b90565b614e0781614d31565b811461197f57600080fd5b614e0781614d3c565b614e0781614d4e565b614e0781614d6a565b614e0781614d7356fea365627a7a72315820b95be34f8d27a791a7640ee656771bd241a4a5b83063cb97d397ae46fbcd0de66c6578706572696d656e74616cf564736f6c63430005110040000000000000000000000000cf2afe102057ba5c16f899271045a0a37fcb10f20000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000004000000000000000000000000250e76987d838a75310c34bf422ea9f1ac4cc906000000000000000000000000af83ce8d461e8834de03a3803c968615013c6b3d0000000000000000000000002cdfc90250ef967036838da601099656e74bcfc50000000000000000000000009a016ce184a22dbf6c17daa59eb7d3140dbd1c54000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000250e76987d838a75310c34bf422ea9f1ac4cc9060000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000006756e6c6f636b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000002cdfc90250ef967036838da601099656e74bcfc50000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000006756e6c6f636b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000009a016ce184a22dbf6c17daa59eb7d3140dbd1c5400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000c616464457874656e73696f6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f72656d6f7665457874656e73696f6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d72656769737465724173736574000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006756e6c6f636b0000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061014c5760003560e01c80638da5cb5b116100c3578063bd5cf6251161007c578063bd5cf6251461026e578063d07033aa14610281578063d450e04c14610294578063ef26e41d146102a7578063f2fde38b146102af578063f76fe431146102c25761014c565b80638da5cb5b146102105780638f32d59b146102185780639576bfbd146102205780639a8a059214610233578063a692f6d414610248578063ba1c9bc71461025b5761014c565b80635c975abb116101155780635c975abb146101bf5780636f31031d146101c7578063715018a6146101da57806373f53ba4146101e25780637e724ff3146101f55780638456cb59146102085761014c565b8062ba1694146101515780631753acca1461016f57806329dcf4ab1461018457806334a773eb146101a45780633f4ba83a146101b7575b600080fd5b6101596102d5565b60405161016691906147dc565b60405180910390f35b61018261017d3660046134e2565b6102e4565b005b6101976101923660046135bb565b6103d1565b60405161016691906147f8565b6101976101b2366004613586565b610796565b610197610a49565b610197610b9e565b6101976101d5366004613751565b610bae565b610182610c28565b6101976101f03660046133f8565b610c96565b6101976102033660046133f8565b610cab565b610197610d66565b610159610eb1565b610197610ec0565b61018261022e3660046133f8565b610ee4565b61023b610f56565b6040516101669190614c3c565b6101826102563660046134ae565b610f6c565b610197610269366004613467565b610fee565b61019761027c36600461376f565b61101f565b61018261028f3660046134e2565b6113a8565b6101976102a236600461364c565b61148c565b610159611943565b6101826102bd3660046133f8565b611952565b6101826102d03660046134ae565b611982565b6001546001600160a01b031681565b6002546001600160a01b031633146103175760405162461bcd60e51b815260040161030e906148ee565b60405180910390fd5b60005b81518110156103cd576000606083838151811061033357fe5b602002602001015180602001905161034e9190810190613416565b909250905060005b81518110156103c2576001600160a01b0383166000908152600460205260408120835184908490811061038557fe5b602002602001015160405161039a9190614740565b908152604051908190036020019020805491151560ff19909216919091179055600101610356565b50505060010161031a565b5050565b60008054600160a01b900460ff16156103fc5760405162461bcd60e51b815260040161030e906149fe565b6104046130e2565b61040d85611a04565b90506000600160009054906101000a90046001600160a01b031690506000816001600160a01b0316635ac407906040518163ffffffff1660e01b815260040160206040518083038186803b15801561046457600080fd5b505afa158015610478573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061049c9190810190613733565b63ffffffff169050806001600160401b0316836060015163ffffffff16116104d65760405162461bcd60e51b815260040161030e90614a2e565b6101408301516bffffffffffffffffffffffff19166105075760405162461bcd60e51b815260040161030e9061493e565b6060610586836001600160a01b03166369d480746040518163ffffffff1660e01b815260040160006040518083038186803b15801561054557600080fd5b505afa158015610559573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105819190810190613552565b611b23565b80519091506105a1898884600360001986015b048503611bd6565b6105bd5760405162461bcd60e51b815260040161030e906149ce565b600060606105ca8a611dd9565b91509150816001600160601b0319168761014001516001600160601b031916146106065760405162461bcd60e51b815260040161030e90614a1e565b6060870151604051638a8bd17f60e01b81526001600160a01b03881691638a8bd17f916106369190600401614c0e565b602060405180830381600087803b15801561065057600080fd5b505af1158015610664573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106889190810190613516565b6106a45760405162461bcd60e51b815260040161030e90614ace565b856001600160a01b03166341973cd96106bc83611e55565b6040518263ffffffff1660e01b81526004016106d89190614849565b602060405180830381600087803b1580156106f257600080fd5b505af1158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061072a9190810190613516565b6107465760405162461bcd60e51b815260040161030e90614a4e565b7fe60d33488cba3977bf65766cd2f8ac9617f64bf3b3198aff6240ce5c7d43b69087606001518c60405161077b929190614c1c565b60405180910390a160019750505050505050505b9392505050565b60008054600160a01b900460ff16156107c15760405162461bcd60e51b815260040161030e906149fe565b60015460408051631a75201d60e21b815290516001600160a01b039092169182916369d48074916004808301926000929190829003018186803b15801561080757600080fd5b505afa15801561081b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108439190810190613552565b51156108615760405162461bcd60e51b815260040161030e90614b5e565b6108696130e2565b61087285611a04565b90506000606061088186611dd9565b91509150816001600160601b0319168361014001516001600160601b031916146108bd5760405162461bcd60e51b815260040161030e90614a1e565b6060830151604051638a8bd17f60e01b81526001600160a01b03861691638a8bd17f916108ed9190600401614c0e565b602060405180830381600087803b15801561090757600080fd5b505af115801561091b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061093f9190810190613516565b61095b5760405162461bcd60e51b815260040161030e9061499e565b836001600160a01b03166341973cd961097383611e55565b6040518263ffffffff1660e01b815260040161098f9190614849565b602060405180830381600087803b1580156109a957600080fd5b505af11580156109bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109e19190810190613516565b6109fd5760405162461bcd60e51b815260040161030e90614b7e565b7ff01968fc3a2655cf1b5144cb32de6dc898f91b9239c103744e8457152ab2fbde836060015188604051610a32929190614c1c565b60405180910390a160019450505050505b92915050565b6000610a53610ec0565b610a6f5760405162461bcd60e51b815260040161030e90614a6e565b610a77610b9e565b15610a8457610a84611ec4565b60015460408051635c975abb60e01b815290516001600160a01b03909216918291635c975abb916004808301926020929190829003018186803b158015610aca57600080fd5b505afa158015610ade573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b029190810190613516565b15610b9657806001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610b4257600080fd5b505af1158015610b56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b7a9190810190613516565b610b965760405162461bcd60e51b815260040161030e9061494e565b600191505090565b600054600160a01b900460ff1690565b60008054600160a01b900460ff16610bd85760405162461bcd60e51b815260040161030e906148fe565b610be0610ec0565b610bfc5760405162461bcd60e51b815260040161030e90614a6e565b506001805467ffffffffffffffff60a01b1916600160a01b6001600160401b038416021781555b919050565b610c30610ec0565b610c4c5760405162461bcd60e51b815260040161030e90614a6e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60036020526000908152604090205460ff1681565b60008054600160a01b900460ff16610cd55760405162461bcd60e51b815260040161030e906148fe565b610cdd610ec0565b610cf95760405162461bcd60e51b815260040161030e90614a6e565b60015460405163f2fde38b60e01b81526001600160a01b0390911690819063f2fde38b90610d2b9086906004016147dc565b600060405180830381600087803b158015610d4557600080fd5b505af1158015610d59573d6000803e3d6000fd5b5060019695505050505050565b6000610d70610ec0565b610d8c5760405162461bcd60e51b815260040161030e90614a6e565b610d94610b9e565b610da057610da0611f3a565b60015460408051635c975abb60e01b815290516001600160a01b03909216918291635c975abb916004808301926020929190829003018186803b158015610de657600080fd5b505afa158015610dfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e1e9190810190613516565b610b9657806001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610e5d57600080fd5b505af1158015610e71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e959190810190613516565b610b965760405162461bcd60e51b815260040161030e9061491e565b6000546001600160a01b031690565b600080546001600160a01b0316610ed5611f9c565b6001600160a01b031614905090565b6002546001600160a01b03163314610f0e5760405162461bcd60e51b815260040161030e906148ee565b6001600160a01b038116610f345760405162461bcd60e51b815260040161030e90614ade565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600154600160a01b90046001600160401b031681565b6002546001600160a01b03163314610f965760405162461bcd60e51b815260040161030e906148ee565b60005b81518110156103cd57600160036000848481518110610fb457fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101610f99565b6004602090815260009283526040909220815180830184018051928152908401929093019190912091525460ff1681565b60008054600160a01b900460ff161561104a5760405162461bcd60e51b815260040161030e906149fe565b3360009081526003602052604090205460ff166110795760405162461bcd60e51b815260040161030e906149ee565b60015460408051600162c2db5f60e01b0319815290516001600160a01b0390921691600091839163ff3d24a191600480820192602092909190829003018186803b1580156110c657600080fd5b505afa1580156110da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110fe9190810190613534565b9050606061110b82611fa0565b9050606061111882611fe4565b6111ae600230856040516020016111309291906146a0565b60408051601f198184030181529082905261114a91614740565b602060405180830381855afa158015611167573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525061118a9190810190613534565b60405160200161119a919061470f565b604051602081830303815290604052611fe4565b6111bf6111ba3361201b565b611fe4565b6111c88f612036565b6112078f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611fe492505050565b6112468e8e8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611fe492505050565b6112858d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611fe492505050565b60405160200161129b9796959493929190614764565b60408051601f19818403018152908290528051602082012063130f33d960e21b83529092506001600160a01b03861691634c3ccf64916112dd91600401614806565b602060405180830381600087803b1580156112f757600080fd5b505af115801561130b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061132f9190810190613516565b61134b5760405162461bcd60e51b815260040161030e90614bce565b326001600160a01b03167f6ad3bf15c1988bc04bc153490cab16db8efb9a3990215bf1c64ea6e28be8848383338f8f8f8760405161138e9695949392919061485a565b60405180910390a25060019b9a5050505050505050505050565b6002546001600160a01b031633146113d25760405162461bcd60e51b815260040161030e906148ee565b60005b81518110156103cd57600060608383815181106113ee57fe5b60200260200101518060200190516114099190810190613416565b909250905060005b8151811015611481576001600160a01b038316600090815260046020526040902082516001919084908490811061144457fe5b60200260200101516040516114599190614740565b908152604051908190036020019020805491151560ff19909216919091179055600101611411565b5050506001016113d5565b60008054600160a01b900460ff16156114b75760405162461bcd60e51b815260040161030e906149fe565b6114bf6130e2565b6114c886611a04565b90506000600160009054906101000a90046001600160a01b031690506060611522826001600160a01b03166369d480746040518163ffffffff1660e01b815260040160006040518083038186803b15801561054557600080fd5b90506000826001600160a01b0316635ac407906040518163ffffffff1660e01b815260040160206040518083038186803b15801561155f57600080fd5b505afa158015611573573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115979190810190613733565b63ffffffff16905060008251905081856060015163ffffffff16106115e9576115c88a888560036000198601610599565b6115e45760405162461bcd60e51b815260040161030e90614bfe565b61166f565b6115fb88888560036000198601610599565b6116175760405162461bcd60e51b815260040161030e90614afe565b61161f6130e2565b61162889611a04565b9050606061163b8b836101000151612079565b905061164681612178565b61164f8d6121a3565b1461166c5760405162461bcd60e51b815260040161030e9061496e565b50505b606061167f8c8760e00151612079565b905061168961313d565b61169282612260565b9050856001600160a01b0316630586763c82602001516116b58460000151612178565b6040518363ffffffff1660e01b81526004016116d2929190614c4a565b60206040518083038186803b1580156116ea57600080fd5b505afa1580156116fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117229190810190613516565b1561173f5760405162461bcd60e51b815260040161030e90614bbe565b856001600160a01b031663e90bfdcf82602001516117608460000151612178565b6040518363ffffffff1660e01b815260040161177d929190614c4a565b602060405180830381600087803b15801561179757600080fd5b505af11580156117ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117cf9190810190613516565b6117eb5760405162461bcd60e51b815260040161030e9061498e565b6001546040820151606001516001600160401b03908116600160a01b90920416146118285760405162461bcd60e51b815260040161030e906149ae565b600061183b82604001516080015161233c565b6001600160a01b038116600090815260046020526040908190208482015160a0015191519293509161186d9190614740565b9081526040519081900360200190205460ff1661189c5760405162461bcd60e51b815260040161030e906149de565b6118c581836040015160a00151846040015160c001518560400151604001518660200151612367565b6118e15760405162461bcd60e51b815260040161030e9061490e565b602082015160408084015160808101518551915192517f8a4a2663ce60ce4955c595da2894de0415240f1ace024cfbff85f513b656bdae9461192594909391614c65565b60405180910390a16001985050505050505050505b95945050505050565b6002546001600160a01b031681565b61195a610ec0565b6119765760405162461bcd60e51b815260040161030e90614a6e565b61197f816124d8565b50565b6002546001600160a01b031633146119ac5760405162461bcd60e51b815260040161030e906148ee565b60005b81518110156103cd576000600360008484815181106119ca57fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790556001016119af565b611a0c6130e2565b611a146130e2565b6000611a208482612559565b63ffffffff90911683529050611a3684826125e2565b6001600160401b0390911660208401529050611a528482612669565b60a08401919091529050611a668482612669565b60c08401919091529050611a7a8482612669565b60e08401919091529050611a8e8482612669565b6101008401919091529050611aa38482612559565b63ffffffff90911660408401529050611abc8482612559565b63ffffffff90911660608401529050611ad584826125e2565b6001600160401b0390911660808401529050611af184826126ae565b6101208401919091529050611b068482612762565b506bffffffffffffffffffffffff19166101408301525092915050565b6060600080611b3284826125e2565b80935081925050506060816001600160401b0316604051908082528060200260200182016040528015611b6f578160200160208202803883390190505b509050606060005b836001600160401b0316811015611bcb57611b9287866126ae565b95509150611b9f8261233c565b838281518110611bab57fe5b6001600160a01b0390921660209283029190910190910152600101611b77565b509095945050505050565b600080611be2866121a3565b90506000611bfb604187516127ab90919063ffffffff16565b9050606081604051908082528060200260200182016040528015611c29578160200160208202803883390190505b50905060008080805b85811015611dbc57611c51611c4c8c6041840260206127ed565b612178565b9350611c68611c4c8c6041840260200160206127ed565b92508a6041820260400181518110611c7c57fe5b602001015160f81c60f81b60f81c601b0191506001600288604051602001611ca4919061470f565b60408051601f1981840301815290829052611cbe91614740565b602060405180830381855afa158015611cdb573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250611cfe9190810190613534565b83868660405160008152602001604052604051611d1e9493929190614814565b6020604051602081039080840390855afa158015611d40573d6000803e3d6000fd5b50505060206040510351858281518110611d5657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006001600160a01b0316858281518110611d8d57fe5b60200260200101516001600160a01b03161415611db4576000975050505050505050611dd1565b600101611c32565b50611dc889858a61286d565b96505050505050505b949350505050565b600060606043835181611de857fe5b0615611e065760405162461bcd60e51b815260040161030e90614aae565b60006043845181611e1357fe5b0490506001811015611e375760405162461bcd60e51b815260040161030e90614b2e565b611e4b81600360001982010483038661290e565b9250925050915091565b805160609081611e6482612036565b905060005b82811015611ebc5781611e916111ba878481518110611e8457fe5b602002602001015161201b565b604051602001611ea292919061474c565b60408051601f198184030181529190529150600101611e69565b509392505050565b600054600160a01b900460ff16611eed5760405162461bcd60e51b815260040161030e906148fe565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611f23611f9c565b604051611f3091906147ea565b60405180910390a1565b600054600160a01b900460ff1615611f645760405162461bcd60e51b815260040161030e906149fe565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f235b3390565b60606001600160ff1b03821115611fc95760405162461bcd60e51b815260040161030e90614a5e565b60405190506020815281602082015260408101604052919050565b8051606090611ff281612ac3565b8360405160200161200492919061474c565b604051602081830303815290604052915050919050565b604080516014815260609290921b6020830152818101905290565b6040516008808252606091906000601f5b828210156120695785811a826020860101536001919091019060001901612047565b5050506028810160405292915050565b606060008161208885836126ae565b92509050600061209782612b7a565b905060006120c060216120b4868a51612b9590919063ffffffff16565b9063ffffffff6127ab16565b9050600080805b8381101561214b576120d98a88612bd7565b975091506120e78a88612669565b975092506001600160f81b0319821661210b576121048386612c20565b9450612143565b600160f81b6001600160f81b03198316141561212b576121048584612c20565b60405162461bcd60e51b815260040161030e90614a8e565b6001016120c7565b5087841461216b5760405162461bcd60e51b815260040161030e90614a0e565b5092979650505050505050565b6000815160201461219b5760405162461bcd60e51b815260040161030e90614b1e565b506020015190565b6000600280836040516121b69190614740565b602060405180830381855afa1580156121d3573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052506121f69190810190613534565b604051602001612206919061470f565b60408051601f198184030181529082905261222091614740565b602060405180830381855afa15801561223d573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250610a439190810190613534565b61226861313d565b61227061313d565b600061227c84826126ae565b908352905061228b84826125e2565b6001600160401b03909116602084015290506122a5613161565b6122af85836126ae565b90825291506122be85836126ae565b602083019190915291506122d285836126ae565b604083019190915291506122e685836125e2565b6001600160401b039091166060830152915061230285836126ae565b6080830191909152915061231685836126ae565b60a0830191909152915061232a85836126ae565b5060c082015260408301525092915050565b6000815160141461235f5760405162461bcd60e51b815260040161030e9061495e565b506014015190565b600061237286612c97565b61238e5760405162461bcd60e51b815260040161030e90614abe565b60606000876001600160a01b0316876040516020016123ad91906147c5565b604051602081830303815290604052805190602001208787876040516020016123d8939291906148ba565b60408051601f19818403018152908290526123f69291602001614724565b60408051601f198184030181529082905261241091614740565b6000604051808303816000865af19150503d806000811461244d576040519150601f19603f3d011682016040523d82523d6000602084013e612452565b606091505b50925090506001811515146124795760405162461bcd60e51b815260040161030e90614a3e565b81516124975760405162461bcd60e51b815260040161030e90614b0e565b60006124a483601f612cce565b5090506001811515146124c95760405162461bcd60e51b815260040161030e90614b3e565b50600198975050505050505050565b6001600160a01b0381166124fe5760405162461bcd60e51b815260040161030e9061497e565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000808351836004011115801561257257508260040183105b61258e5760405162461bcd60e51b815260040161030e90614bde565b600060405160046000600182038760208a0101515b838310156125c35780821a838601536001830192506001820391506125a3565b50505080820160405260200390035192505050600482015b9250929050565b600080835183600801111580156125fb57508260080183105b6126175760405162461bcd60e51b815260040161030e90614b9e565b600060405160086000600182038760208a0101515b8383101561264c5780821a8386015360018301925060018203915061262c565b505050808201604052602003900351956008949094019450505050565b6000808351836020011115801561268257508260200183105b61269e5760405162461bcd60e51b815260040161030e90614b8e565b5050602091810182015192910190565b60606000806126bd8585612d67565b8651909550909150818501118015906126d7575080840184105b6126f35760405162461bcd60e51b815260040161030e90614bee565b60608115801561270e57604051915060208201604052612758565b6040519150601f8316801560200281840101848101888315602002848c0101015b8183101561274757805183526020928301920161272f565b5050848452601f01601f1916604052505b5095930193505050565b6000808351836014011115801561277b57508260140183105b6127975760405162461bcd60e51b815260040161030e906149be565b505081810160200151601482019250929050565b600061078f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612eac565b6060818301845110156127ff57600080fd5b60608215801561281a57604051915060208201604052612864565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561285357805183526020928301920161283b565b5050858452601f01601f1916604052505b50949350505050565b600080805b84518110156129025760005b86518110156128f95786818151811061289357fe5b60200260200101516001600160a01b03168683815181106128b057fe5b60200260200101516001600160a01b031614156128f15782806001019350508681815181106128db57fe5b6020026020010160006001600160a01b03168152505b60010161287e565b50600101612872565b50909111159392505050565b600060608061291c86612ee3565b905060608660405190808252806020026020018201604052801561294a578160200160208202803883390190505b50905060006060815b898110156129e15761296a886043830260436127ed565b9150846129796111ba84612f26565b60405160200161298a92919061474c565b60405160208183030381529060405294506129a882600360406127ed565b8051906020012092508260001c8482815181106129c157fe5b6001600160a01b0390921660209283029190910190910152600101612953565b50836129ec89612ee3565b6040516020016129fd92919061474c565b604051602081830303815290604052935060006003600286604051612a229190614740565b602060405180830381855afa158015612a3f573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250612a629190810190613534565b604051602001612a72919061470f565b60408051601f1981840301815290829052612a8c91614740565b602060405180830381855afa158015612aa9573d6000803e3d6000fd5b50506040515160601b9b949a509398505050505050505050565b606060fd826001600160401b03161015612ae757612ae082612fdf565b9050610c23565b61ffff826001600160401b031611612b3657612b0660fd60f81b612ffb565b612b0f83612ee3565b604051602001612b2092919061474c565b6040516020818303038152906040529050610c23565b63ffffffff826001600160401b031611612b6057612b57607f60f91b612ffb565b612b0f83613009565b612b716001600160f81b0319612ffb565b612b0f83612036565b60006002600060f81b836040516020016122069291906146f3565b600061078f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061304c565b60008083518360010111158015612bf057508260010183105b612c0c5760405162461bcd60e51b815260040161030e90614a9e565b505081810160200151600182019250929050565b60006002600160f81b8484604051602001612c3d939291906146bc565b60408051601f1981840301815290829052612c5791614740565b602060405180830381855afa158015612c74573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525061078f9190810190613534565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590611dd15750141592915050565b60008083518360010111158015612ce757508260010183105b612d035760405162461bcd60e51b815260040161030e90614b6e565b838301602001516000600160f81b6001600160f81b031983161415612d2a57506001612d59565b6001600160f81b03198216612d4157506000612d59565b60405162461bcd60e51b815260040161030e90614a7e565b956001949094019450505050565b6000806000612d768585612bd7565b94509050600060fd60f81b6001600160f81b031983161415612ddf57612d9c8686613078565b955061ffff16905060fd8110801590612db7575061ffff8111155b612dd35760405162461bcd60e51b815260040161030e9061492e565b92508391506125db9050565b607f60f91b6001600160f81b031983161415612e3a57612dff8686612559565b955063ffffffff16905061ffff81118015612e1e575063ffffffff8111155b612dd35760405162461bcd60e51b815260040161030e90614aee565b6001600160f81b03198083161415612e8657612e5686866125e2565b95506001600160401b0316905063ffffffff8111612dd35760405162461bcd60e51b815260040161030e90614aee565b5060f881901c60fd8110612dd35760405162461bcd60e51b815260040161030e90614aee565b60008183612ecd5760405162461bcd60e51b815260040161030e9190614849565b506000838581612ed957fe5b0495945050505050565b6040516002808252606091906000601f5b82821015612f165785811a826020860101536001919091019060001901612ef4565b5050506022810160405292915050565b6060604382511015612f4a5760405162461bcd60e51b815260040161030e90614bae565b612f5782600060236127ed565b9050600282604281518110612f6857fe5b016020015160f81c81612f7757fe5b0660ff1660001415612fb157600260f81b81600281518110612f9557fe5b60200101906001600160f81b031916908160001a905350610c23565b600360f81b81600281518110612fc357fe5b60200101906001600160f81b031916908160001a905350919050565b604080516001815260f89290921b602083015260218201905290565b6060610a438260f81c612fdf565b6040516004808252606091906000601f5b8282101561303c5785811a82602086010153600191909101906000190161301a565b5050506024810160405292915050565b600081848411156130705760405162461bcd60e51b815260040161030e9190614849565b505050900390565b6000808351836002011115801561309157508260020183105b6130ad5760405162461bcd60e51b815260040161030e90614b4e565b6000604051846020870101518060011a82538060001a6001830153506002818101604052601d19909101519694019450505050565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201839052610100820183905261012082015261014081019190915290565b604080516060808201835281526000602082015290810161315c613161565b905290565b6040518060e0016040528060608152602001606081526020016060815260200160006001600160401b031681526020016060815260200160608152602001606081525090565b8035610a4381614dfe565b8051610a4381614dfe565b600082601f8301126131ce57600080fd5b81356131e16131dc82614cdd565b614cb7565b9150818183526020840193506020810190508385602084028201111561320657600080fd5b60005b83811015613232578161321c88826131a7565b8452506020928301929190910190600101613209565b5050505092915050565b600082601f83011261324d57600080fd5b815161325b6131dc82614cdd565b81815260209384019390925082018360005b838110156132325781518601613283888261339c565b845250602092830192919091019060010161326d565b600082601f8301126132aa57600080fd5b81356132b86131dc82614cdd565b81815260209384019390925082018360005b8381101561323257813586016132e0888261334d565b84525060209283019291909101906001016132ca565b8051610a4381614e12565b8051610a4381614e1b565b60008083601f84011261331e57600080fd5b5081356001600160401b0381111561333557600080fd5b6020830191508360018202830111156125db57600080fd5b600082601f83011261335e57600080fd5b813561336c6131dc82614cfd565b9150808252602083016020830185838301111561338857600080fd5b613393838284614da1565b50505092915050565b600082601f8301126133ad57600080fd5b81516133bb6131dc82614cfd565b915080825260208301602083018583830111156133d757600080fd5b613393838284614dad565b8051610a4381614e24565b8035610a4381614e2d565b60006020828403121561340a57600080fd5b6000611dd184846131a7565b6000806040838503121561342957600080fd5b600061343585856131b2565b92505060208301516001600160401b0381111561345157600080fd5b61345d8582860161323c565b9150509250929050565b6000806040838503121561347a57600080fd5b600061348685856131a7565b92505060208301356001600160401b038111156134a257600080fd5b61345d8582860161334d565b6000602082840312156134c057600080fd5b81356001600160401b038111156134d657600080fd5b611dd1848285016131bd565b6000602082840312156134f457600080fd5b81356001600160401b0381111561350a57600080fd5b611dd184828501613299565b60006020828403121561352857600080fd5b6000611dd184846132f6565b60006020828403121561354657600080fd5b6000611dd18484613301565b60006020828403121561356457600080fd5b81516001600160401b0381111561357a57600080fd5b611dd18482850161339c565b6000806040838503121561359957600080fd5b82356001600160401b038111156135af57600080fd5b6134868582860161334d565b6000806000606084860312156135d057600080fd5b83356001600160401b038111156135e657600080fd5b6135f28682870161334d565b93505060208401356001600160401b0381111561360e57600080fd5b61361a8682870161334d565b92505060408401356001600160401b0381111561363657600080fd5b6136428682870161334d565b9150509250925092565b600080600080600060a0868803121561366457600080fd5b85356001600160401b0381111561367a57600080fd5b6136868882890161334d565b95505060208601356001600160401b038111156136a257600080fd5b6136ae8882890161334d565b94505060408601356001600160401b038111156136ca57600080fd5b6136d68882890161334d565b93505060608601356001600160401b038111156136f257600080fd5b6136fe8882890161334d565b92505060808601356001600160401b0381111561371a57600080fd5b6137268882890161334d565b9150509295509295909350565b60006020828403121561374557600080fd5b6000611dd184846133e2565b60006020828403121561376357600080fd5b6000611dd184846133ed565b60008060008060008060006080888a03121561378a57600080fd5b60006137968a8a6133ed565b97505060208801356001600160401b038111156137b257600080fd5b6137be8a828b0161330c565b965096505060408801356001600160401b038111156137dc57600080fd5b6137e88a828b0161330c565b945094505060608801356001600160401b0381111561380657600080fd5b6138128a828b0161330c565b925092505092959891949750929550565b61382c81614d85565b82525050565b61382c81614d31565b61382c61384782614d31565b614ddd565b61382c81614d3c565b61382c61386182614d41565b614d4e565b61382c81614d4e565b61382c61386182614d4e565b61382c61386182614d51565b60006138938385614d28565b93506138a0838584614da1565b6138a983614dee565b9093019392505050565b60006138be82614d24565b6138c88185614d28565b93506138d8818560208601614dad565b6138a981614dee565b60006138ec82614d24565b6138f68185610c23565b9350613906818560208601614dad565b9290920192915050565b600061391d600f83614d28565b6e2737ba103bb434ba32a634b9ba32b960891b815260200192915050565b6000613948601483614d28565b7314185d5cd8589b194e881b9bdd081c185d5cd95960621b815260200192915050565b6000613978601d83614d28565b7f457865637574652043726f7373436861696e205478206661696c656421000000815260200192915050565b60006139b1602783614d28565b7f70617573652045746843726f7373436861696e4461746120636f6e74726163748152660819985a5b195960ca1b602082015260400192915050565b60006139fa601f83614d28565b7f4e65787455696e7431362c2076616c7565206f7574736964652072616e676500815260200192915050565b6000613a33602583614d28565b7f546865206e657874426f6f6b4b6565706572206f662068656164657220697320815264656d70747960d81b602082015260400192915050565b6000613a7a602983614d28565b7f756e70617573652045746843726f7373436861696e4461746120636f6e74726181526818dd0819985a5b195960ba1b602082015260400192915050565b6000613ac5602383614d28565b7f6279746573206c656e67746820646f6573206e6f74206d61746368206164647281526265737360e81b602082015260400192915050565b6000613b0a601b83614d28565b7f766572696679206865616465722070726f6f66206661696c6564210000000000815260200192915050565b6000613b43602683614d28565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b6000613b8b602083614d28565b7f536176652063726f7373636861696e207478206578697374206661696c656421815260200192915050565b6000613bc4604383614d28565b7f5361766520506f6c7920636861696e2063757272656e742065706f636820737481527f6172742068656967687420746f204461746120636f6e7472616374206661696c60208201526265642160e81b604082015260600192915050565b6000613c2f602683614d28565b7f54686973205478206973206e6f742061696d696e672061742074686973206e6581526574776f726b2160d01b602082015260400192915050565b6000613c77602383614d28565b7f4e657874427974657332302c206f66667365742065786365656473206d6178698152626d756d60e81b602082015260400192915050565b6000613cbc601883614d28565b7f566572696679207369676e6174757265206661696c6564210000000000000000815260200192915050565b6000613cf5601d83614d28565b7f496e76616c696420746f20636f6e7472616374206f72206d6574686f64000000815260200192915050565b6000613d2e601583614d28565b74125b9d985b1a5908199c9bdb4818dbdb9d1c9858dd605a1b815260200192915050565b6000613d5f601083614d28565b6f14185d5cd8589b194e881c185d5cd95960821b815260200192915050565b6000613d8b603183614d28565b7f6d65726b6c6550726f76652c2065787065637420726f6f74206973206e6f7420815270195c5d585b081858dd1d585b081c9bdbdd607a1b602082015260400192915050565b6000613dde601383614d28565b7213995e1d109bdbdad95c9cc81a5b1b1959d85b606a1b815260200192915050565b6000613e0d603e83614d28565b7f54686520686569676874206f6620686561646572206973206c6f77657220746881527f616e2063757272656e742065706f636820737461727420686569676874210000602082015260400192915050565b6000613e6c602b83614d28565b7f45746843726f7373436861696e2063616c6c20627573696e65737320636f6e7481526a1c9858dd0819985a5b195960aa1b602082015260400192915050565b6000613eb9603b83614d28565b7f5361766520506f6c7920636861696e20626f6f6b206b6565706572732062797481527f657320746f204461746120636f6e7472616374206661696c6564210000000000602082015260400192915050565b6000613f18601783614d28565b7f56616c75652065786365656473207468652072616e6765000000000000000000815260200192915050565b6000613f51602083614d28565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b6000613f8a601483614d28565b732732bc3a2137b7b6103b30b63ab29032b93937b960611b815260200192915050565b6000613fba602e83614d28565b7f6d65726b6c6550726f76652c204e6578744279746520666f7220706f7369746981526d1bdb881a5b999bc819985a5b195960921b602082015260400192915050565b600061400a602083614d28565b7f4e657874427974652c204f66667365742065786365656473206d6178696d756d815260200192915050565b6000614043601b83614d28565b7f5f7075624b65794c697374206c656e67746820696c6c6567616c210000000000815260200192915050565b600061407c602883614d28565b7f5468652070617373656420696e2061646472657373206973206e6f74206120638152676f6e74726163742160c01b602082015260400192915050565b60006140c6602d83614d28565b7f53617665204d43204c617465737448656967687420746f204461746120636f6e81526c7472616374206661696c65642160981b602082015260400192915050565b6000614115601e83614d28565b7f43616e206e6f74207472616e7366657220746f20616464726573732830290000815260200192915050565b600061414e602083614d28565b7f4e65787456617255696e742c2076616c7565206f7574736964652072616e6765815260200192915050565b6000614187603883614d28565b7f56657269667920706f6c7920636861696e2063757272656e742065706f63682081527f686561646572207369676e6174757265206661696c6564210000000000000000602082015260400192915050565b60006141e6601483610c23565b732862797465732c62797465732c75696e7436342960601b815260140192915050565b6000614216602783614d28565b7f4e6f2072657475726e2076616c75652066726f6d20627573696e65737320636f8152666e74726163742160c81b602082015260400192915050565b600061425f601783614d28565b7f6279746573206c656e677468206973206e6f742033322e000000000000000000815260200192915050565b6000614298601683614d28565b75746f6f2073686f7274205f7075624b65794c6973742160501b815260200192915050565b60006142ca603783614d28565b7f45746843726f7373436861696e2063616c6c20627573696e65737320636f6e7481527f726163742072657475726e206973206e6f742074727565000000000000000000602082015260400192915050565b6000614329602283614d28565b7f4e65787455696e7431362c206f66667365742065786365656473206d6178696d815261756d60f01b602082015260400192915050565b600061436d603883614d28565b7f45746843726f7373436861696e4461746120636f6e747261637420686173206181527f6c7265616479206265656e20696e697469616c697a6564210000000000000000602082015260400192915050565b60006143cc601483614d28565b7313d9999cd95d08195e18d959591cc81b1a5b5a5d60621b815260200192915050565b60006143fc604383614d28565b7f5361766520506f6c7920636861696e2063757272656e742065706f636820626f81527f6f6b206b65657065727320746f204461746120636f6e7472616374206661696c60208201526265642160e81b604082015260600192915050565b6000614467602083614d28565b7f4e657874486173682c206f66667365742065786365656473206d6178696d756d815260200192915050565b60006144a0602283614d28565b7f4e65787455696e7436342c206f66667365742065786365656473206d6178696d815261756d60f01b602082015260400192915050565b60006144e4601783614d28565b7f6b6579206c656e67676820697320746f6f2073686f7274000000000000000000815260200192915050565b600061451d602283614d28565b7f746865207472616e73616374696f6e20686173206265656e2065786563757465815261642160f01b602082015260400192915050565b6000614561603083614d28565b7f536176652065746854784861736820627920696e64657820746f20446174612081526f636f6e7472616374206661696c65642160801b602082015260400192915050565b60006145b3602283614d28565b7f4e65787455696e7433322c206f66667365742065786365656473206d6178696d815261756d60f01b602082015260400192915050565b60006145f7602483614d28565b7f4e65787456617242797465732c206f66667365742065786365656473206d6178815263696d756d60e01b602082015260400192915050565b600061463d602a83614d28565b7f56657269667920706f6c7920636861696e20686561646572207369676e6174758152697265206661696c65642160b01b602082015260400192915050565b61382c81614d96565b61382c81614d6a565b61382c81614d73565b61382c81614d7f565b60006146ac828561383b565b601482019150611dd182846138e1565b60006146c88286613855565b6001820191506146d8828561386f565b6020820191506146e8828461386f565b506020019392505050565b60006146ff8285613855565b600182019150611dd182846138e1565b600061471b828461386f565b50602001919050565b6000614730828561387b565b600482019150611dd182846138e1565b600061078f82846138e1565b600061475882856138e1565b9150611dd182846138e1565b6000614770828a6138e1565b915061477c82896138e1565b915061478882886138e1565b915061479482876138e1565b91506147a082866138e1565b91506147ac82856138e1565b91506147b882846138e1565b9998505050505050505050565b60006147d182846138e1565b915061078f826141d9565b60208101610a438284613832565b60208101610a438284613823565b60208101610a43828461384c565b60208101610a438284613866565b608081016148228287613866565b61482f6020830186614697565b61483c6040830185613866565b61193a6060830184613866565b6020808252810161078f81846138b3565b60a0808252810161486b81896138b3565b905061487a6020830188613823565b614887604083018761468e565b818103606083015261489a818587613887565b905081810360808301526148ae81846138b3565b98975050505050505050565b606080825281016148cb81866138b3565b905081810360208301526148df81856138b3565b9050611dd1604083018461468e565b60208082528101610a4381613910565b60208082528101610a438161393b565b60208082528101610a438161396b565b60208082528101610a43816139a4565b60208082528101610a43816139ed565b60208082528101610a4381613a26565b60208082528101610a4381613a6d565b60208082528101610a4381613ab8565b60208082528101610a4381613afd565b60208082528101610a4381613b36565b60208082528101610a4381613b7e565b60208082528101610a4381613bb7565b60208082528101610a4381613c22565b60208082528101610a4381613c6a565b60208082528101610a4381613caf565b60208082528101610a4381613ce8565b60208082528101610a4381613d21565b60208082528101610a4381613d52565b60208082528101610a4381613d7e565b60208082528101610a4381613dd1565b60208082528101610a4381613e00565b60208082528101610a4381613e5f565b60208082528101610a4381613eac565b60208082528101610a4381613f0b565b60208082528101610a4381613f44565b60208082528101610a4381613f7d565b60208082528101610a4381613fad565b60208082528101610a4381613ffd565b60208082528101610a4381614036565b60208082528101610a438161406f565b60208082528101610a43816140b9565b60208082528101610a4381614108565b60208082528101610a4381614141565b60208082528101610a438161417a565b60208082528101610a4381614209565b60208082528101610a4381614252565b60208082528101610a438161428b565b60208082528101610a43816142bd565b60208082528101610a438161431c565b60208082528101610a4381614360565b60208082528101610a43816143bf565b60208082528101610a43816143ef565b60208082528101610a438161445a565b60208082528101610a4381614493565b60208082528101610a43816144d7565b60208082528101610a4381614510565b60208082528101610a4381614554565b60208082528101610a43816145a6565b60208082528101610a43816145ea565b60208082528101610a4381614630565b60208101610a438284614685565b60408101614c2a828561467c565b8181036020830152611dd181846138b3565b60208101610a43828461468e565b60408101614c58828561468e565b61078f6020830184613866565b60808101614c73828761468e565b8181036020830152614c8581866138b3565b90508181036040830152614c9981856138b3565b90508181036060830152614cad81846138b3565b9695505050505050565b6040518181016001600160401b0381118282101715614cd557600080fd5b604052919050565b60006001600160401b03821115614cf357600080fd5b5060209081020190565b60006001600160401b03821115614d1357600080fd5b506020601f91909101601f19160190565b5190565b90815260200190565b6000610a4382614d5e565b151590565b6001600160f81b03191690565b90565b6001600160e01b03191690565b6001600160a01b031690565b63ffffffff1690565b6001600160401b031690565b60ff1690565b6000610a43826000610a4382614d31565b6000610a4382614d6a565b82818337506000910152565b60005b83811015614dc8578181015183820152602001614db0565b83811115614dd7576000848401525b50505050565b6000610a43826000610a4382614df8565b601f01601f191690565b60601b90565b614e0781614d31565b811461197f57600080fd5b614e0781614d3c565b614e0781614d4e565b614e0781614d6a565b614e0781614d7356fea365627a7a72315820b95be34f8d27a791a7640ee656771bd241a4a5b83063cb97d397ae46fbcd0de66c6578706572696d656e74616cf564736f6c63430005110040

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000cf2afe102057ba5c16f899271045a0a37fcb10f20000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000004000000000000000000000000250e76987d838a75310c34bf422ea9f1ac4cc906000000000000000000000000af83ce8d461e8834de03a3803c968615013c6b3d0000000000000000000000002cdfc90250ef967036838da601099656e74bcfc50000000000000000000000009a016ce184a22dbf6c17daa59eb7d3140dbd1c54000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000250e76987d838a75310c34bf422ea9f1ac4cc9060000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000006756e6c6f636b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000002cdfc90250ef967036838da601099656e74bcfc50000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000006756e6c6f636b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000009a016ce184a22dbf6c17daa59eb7d3140dbd1c5400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000c616464457874656e73696f6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f72656d6f7665457874656e73696f6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d72656769737465724173736574000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006756e6c6f636b0000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _eccd (address): 0xcF2afe102057bA5c16f899271045a0A37fCb10f2
Arg [1] : _chainId (uint64): 2
Arg [2] : fromContractWhiteList (address[]): 0x250e76987d838a75310c34bf422ea9f1AC4Cc906,0xAF83Ce8d461E8834dE03A3803c968615013c6B3d,0x2cdfc90250EF967036838DA601099656e74bCfc5,0x9a016Ce184a22DbF6c17daA59Eb7d3140DBd1c54
Arg [3] : contractMethodWhiteList (bytes[]): System.Byte[],System.Byte[],System.Byte[]

-----Encoded View---------------
43 Constructor Arguments found :
Arg [0] : 000000000000000000000000cf2afe102057ba5c16f899271045a0a37fcb10f2
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 000000000000000000000000250e76987d838a75310c34bf422ea9f1ac4cc906
Arg [6] : 000000000000000000000000af83ce8d461e8834de03a3803c968615013c6b3d
Arg [7] : 0000000000000000000000002cdfc90250ef967036838da601099656e74bcfc5
Arg [8] : 0000000000000000000000009a016ce184a22dbf6c17daa59eb7d3140dbd1c54
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [13] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [14] : 000000000000000000000000250e76987d838a75310c34bf422ea9f1ac4cc906
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [19] : 756e6c6f636b0000000000000000000000000000000000000000000000000000
Arg [20] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [21] : 0000000000000000000000002cdfc90250ef967036838da601099656e74bcfc5
Arg [22] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [23] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [24] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [25] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [26] : 756e6c6f636b0000000000000000000000000000000000000000000000000000
Arg [27] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [28] : 0000000000000000000000009a016ce184a22dbf6c17daa59eb7d3140dbd1c54
Arg [29] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [30] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [31] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [32] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [33] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [34] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [35] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [36] : 616464457874656e73696f6e0000000000000000000000000000000000000000
Arg [37] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [38] : 72656d6f7665457874656e73696f6e0000000000000000000000000000000000
Arg [39] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [40] : 7265676973746572417373657400000000000000000000000000000000000000
Arg [41] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [42] : 756e6c6f636b0000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

53946:15984:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53946:15984:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52443:39;;;:::i;:::-;;;;;;;;;;;;;;;;56658:444;;;;;;;;;:::i;:::-;;59217:2120;;;;;;;;;:::i;:::-;;;;;;;;57475:1391;;;;;;;;;:::i;53070:347::-;;;:::i;3285:78::-;;;:::i;53794:145::-;;;;;;;;;:::i;1981:140::-;;;:::i;54096:53::-;;;;;;;;;:::i;53501:281::-;;;;;;;;;:::i;52717:341::-;;;:::i;1170:79::-;;;:::i;1536:94::-;;;:::i;55503:171::-;;;;;;;;;:::i;52489:21::-;;;:::i;:::-;;;;;;;;55686:246;;;;;;;;;:::i;54156:76::-;;;;;;;;;:::i;61760:1804::-;;;;;;;;;:::i;56206:440::-;;;;;;;;;:::i;64256:3818::-;;;;;;;;;:::i;54063:26::-;;;:::i;2276:110::-;;;;;;;;;:::i;55944:250::-;;;;;;;;;:::i;52443:39::-;;;-1:-1:-1;;;;;52443:39:0;;:::o;56658:444::-;55444:11;;-1:-1:-1;;;;;55444:11:0;55430:10;:25;55422:53;;;;-1:-1:-1;;;55422:53:0;;;;;;;;;;;;;;;;;56776:6;56771:324;56787:23;:30;56785:1;:32;56771:324;;;56839:18;56858:22;56895:23;56919:1;56895:26;;;;;;;;;;;;;;56884:56;;;;;;;;;;;;;;56838:102;;-1:-1:-1;56838:102:0;-1:-1:-1;56960:6:0;56955:129;56971:7;:14;56969:1;:16;56955:129;;;-1:-1:-1;;;;;57010:38:0;;57063:5;57010:38;;;:26;:38;;;;;57049:10;;:7;;57057:1;;57049:10;;;;;;;;;;;;57010:50;;;;;;;;;;;;;;;;;;;;;:58;;;;;-1:-1:-1;;57010:58:0;;;;;;;;;;56986:3;56955:129;;;-1:-1:-1;;;56818:3:0;;56771:324;;;;56658:444;:::o;59217:2120::-;59343:4;3522:7;;-1:-1:-1;;;3522:7:0;;;;3521:8;3513:37;;;;-1:-1:-1;;;3513:37:0;;;;;;;;;59412:29;;:::i;:::-;59444:37;59471:9;59444:26;:37::i;:::-;59412:69;;59492:23;59537:24;;;;;;;;;-1:-1:-1;;;;;59537:24:0;59492:70;;59673:26;59702:4;-1:-1:-1;;;;;59702:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59702:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59702:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;59702:29:0;;;;;;;;;59673:58;;;;59766:19;-1:-1:-1;;;;;59750:35:0;:6;:13;;;:35;;;59742:110;;;;-1:-1:-1;;;59742:110:0;;;;;;;;;60021:21;;;;-1:-1:-1;;60021:35:0;60013:85;;;;-1:-1:-1;;;60013:85:0;;;;;;;;;60183:29;60215:61;60243:4;-1:-1:-1;;;;;60243:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60243:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60243:32:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;60243:32:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;60243:32:0;;;;;;;;;60215:27;:61::i;:::-;60296:19;;60183:93;;-1:-1:-1;60334:69:0;60353:9;60364:7;60183:93;60401:1;-1:-1:-1;;60392:5:0;;60391:11;;60387:1;:15;60334:18;:69::i;:::-;60326:106;;;;-1:-1:-1;;;60326:106:0;;;;;;;;;60634:22;60658:24;60686:33;60708:10;60686:21;:33::i;:::-;60633:86;;;;60763:14;-1:-1:-1;;;;;60738:39:0;;:6;:21;;;-1:-1:-1;;;;;60738:39:0;;;60730:71;;;;-1:-1:-1;;;60730:71:0;;;;;;;;;60975:13;;;;60947:42;;-1:-1:-1;;;60947:42:0;;-1:-1:-1;;;;;60947:27:0;;;;;:42;;60975:13;60947:42;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60947:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60947:42:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;60947:42:0;;;;;;;;;60939:100;;;;-1:-1:-1;;;60939:100:0;;;;;;;;;61058:4;-1:-1:-1;;;;;61058:30:0;;61089:34;61115:7;61089:25;:34::i;:::-;61058:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61058:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61058:66:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;61058:66:0;;;;;;;;;61050:138;;;;-1:-1:-1;;;61050:138:0;;;;;;;;;61260:47;61282:6;:13;;;61297:9;61260:47;;;;;;;;;;;;;;;;61325:4;61318:11;;;;;;;;;3561:1;59217:2120;;;;;:::o;57475:1391::-;57579:4;3522:7;;-1:-1:-1;;;3522:7:0;;;;3521:8;3513:37;;;;-1:-1:-1;;;3513:37:0;;;;;;;;;57693:24;;57814:32;;;-1:-1:-1;;;57814:32:0;;;;-1:-1:-1;;;;;57693:24:0;;;;;;57814:30;;:32;;;;;57648:23;;57814:32;;;;;;;57693:24;57814:32;;;5:2:-1;;;;30:1;27;20:12;5:2;57814:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57814:32:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;57814:32:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;57814:32:0;;;;;;;;;:39;:44;57806:113;;;;-1:-1:-1;;;57806:113:0;;;;;;;;;58090:29;;:::i;:::-;58122:37;58149:9;58122:26;:37::i;:::-;58090:69;;58171:22;58195:24;58223:33;58245:10;58223:21;:33::i;:::-;58170:86;;;;58300:14;-1:-1:-1;;;;;58275:39:0;;:6;:21;;;-1:-1:-1;;;;;58275:39:0;;;58267:71;;;;-1:-1:-1;;;58267:71:0;;;;;;;;;58493:13;;;;58465:42;;-1:-1:-1;;;58465:42:0;;-1:-1:-1;;;;;58465:27:0;;;;;:42;;58493:13;58465:42;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58465:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58465:42:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;58465:42:0;;;;;;;;;58457:122;;;;-1:-1:-1;;;58457:122:0;;;;;;;;;58598:4;-1:-1:-1;;;;;58598:30:0;;58629:34;58655:7;58629:25;:34::i;:::-;58598:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58598:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58598:66:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;58598:66:0;;;;;;;;;58590:146;;;;-1:-1:-1;;;58590:146:0;;;;;;;;;58789:47;58811:6;:13;;;58826:9;58789:47;;;;;;;;;;;;;;;;58854:4;58847:11;;;;;;3561:1;57475:1391;;;;:::o;53070:347::-;53115:4;1382:9;:7;:9::i;:::-;1374:54;;;;-1:-1:-1;;;1374:54:0;;;;;;;;;53136:8;:6;:8::i;:::-;53132:51;;;53161:10;:8;:10::i;:::-;53238:24;;53278:13;;;-1:-1:-1;;;53278:13:0;;;;-1:-1:-1;;;;;53238:24:0;;;;;;53278:11;;:13;;;;;;;;;;;;;;53238:24;53278:13;;;5:2:-1;;;;30:1;27;20:12;5:2;53278:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53278:13:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;53278:13:0;;;;;;;;;53274:114;;;53316:4;-1:-1:-1;;;;;53316:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53316:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53316:14:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;53316:14:0;;;;;;;;;53308:68;;;;-1:-1:-1;;;53308:68:0;;;;;;;;;53405:4;53398:11;;;53070:347;:::o;3285:78::-;3324:4;3348:7;-1:-1:-1;;;3348:7:0;;;;;3285:78::o;53794:145::-;53871:4;3721:7;;-1:-1:-1;;;3721:7:0;;;;3713:40;;;;-1:-1:-1;;;3713:40:0;;;;;;;;;1382:9;:7;:9::i;:::-;1374:54;;;;-1:-1:-1;;;1374:54:0;;;;;;;;;-1:-1:-1;53888:7:0;:21;;-1:-1:-1;;;;53888:21:0;-1:-1:-1;;;;;;;;53888:21:0;;;;;;1439:1;53794:145;;;:::o;1981:140::-;1382:9;:7;:9::i;:::-;1374:54;;;;-1:-1:-1;;;1374:54:0;;;;;;;;;2080:1;2064:6;;2043:40;;-1:-1:-1;;;;;2064:6:0;;;;2043:40;;2080:1;;2043:40;2111:1;2094:19;;-1:-1:-1;;;;;;2094:19:0;;;1981:140::o;54096:53::-;;;;;;;;;;;;;;;:::o;53501:281::-;53600:4;3721:7;;-1:-1:-1;;;3721:7:0;;;;3713:40;;;;-1:-1:-1;;;3713:40:0;;;;;;;;;1382:9;:7;:9::i;:::-;1374:54;;;;-1:-1:-1;;;1374:54:0;;;;;;;;;53662:24;;53698:54;;-1:-1:-1;;;53698:54:0;;-1:-1:-1;;;;;53662:24:0;;;;;;53698:22;;:54;;53721:30;;53698:54;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53698:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;53770:4:0;;53501:281;-1:-1:-1;;;;;;53501:281:0:o;52717:341::-;52760:4;1382:9;:7;:9::i;:::-;1374:54;;;;-1:-1:-1;;;1374:54:0;;;;;;;;;52782:8;:6;:8::i;:::-;52777:50;;52807:8;:6;:8::i;:::-;52882:24;;52923:13;;;-1:-1:-1;;;52923:13:0;;;;-1:-1:-1;;;;;52882:24:0;;;;;;52923:11;;:13;;;;;;;;;;;;;;52882:24;52923:13;;;5:2:-1;;;;30:1;27;20:12;5:2;52923:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52923:13:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;52923:13:0;;;;;;;;;52918:111;;52961:4;-1:-1:-1;;;;;52961:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52961:12:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52961:12:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;52961:12:0;;;;;;;;;52953:64;;;;-1:-1:-1;;;52953:64:0;;;;;;;;1170:79;1208:7;1235:6;-1:-1:-1;;;;;1235:6:0;1170:79;:::o;1536:94::-;1576:4;1616:6;;-1:-1:-1;;;;;1616:6:0;1600:12;:10;:12::i;:::-;-1:-1:-1;;;;;1600:22:0;;1593:29;;1536:94;:::o;55503:171::-;55444:11;;-1:-1:-1;;;;;55444:11:0;55430:10;:25;55422:53;;;;-1:-1:-1;;;55422:53:0;;;;;;;;;-1:-1:-1;;;;;55584:17:0;;55576:60;;;;-1:-1:-1;;;55576:60:0;;;;;;;;;55647:11;:19;;-1:-1:-1;;;;;;55647:19:0;-1:-1:-1;;;;;55647:19:0;;;;;;;;;;55503:171::o;52489:21::-;;;-1:-1:-1;;;52489:21:0;;-1:-1:-1;;;;;52489:21:0;;:::o;55686:246::-;55444:11;;-1:-1:-1;;;;;55444:11:0;55430:10;:25;55422:53;;;;-1:-1:-1;;;55422:53:0;;;;;;;;;55799:6;55794:131;55810:21;:28;55808:1;:30;55794:131;;;55909:4;55859:21;:47;55881:21;55903:1;55881:24;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55859:47:0;;;;;;;;;;;-1:-1:-1;55859:47:0;:54;;-1:-1:-1;;55859:54:0;;;;;;;;;;-1:-1:-1;55839:3:0;55794:131;;54156:76;;;;;;;;;;;;;;22:14:-1;;143:32;;;;;198:20;;224:31;;;156:18;;;283;;;;273:49;;;;328:32;;54156:76:0;;;;:::o;61760:1804::-;61903:4;3522:7;;-1:-1:-1;;;3522:7:0;;;;3521:8;3513:37;;;;-1:-1:-1;;;3513:37:0;;;;;;;;;62000:10;61978:33;;;;:21;:33;;;;;;;;61970:66;;;;-1:-1:-1;;;61970:66:0;;;;;;;;;62154:24;;62312;;;-1:-1:-1;;;;;;62312:24:0;;;;-1:-1:-1;;;;;62154:24:0;;;;62109:23;;62154:24;;62312:22;;:24;;;;;;;;;;;;;;;62154;62312;;;5:2:-1;;;;30:1;27;20:12;5:2;62312:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62312:24:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;62312:24:0;;;;;;;;;62290:46;;62400:24;62427:33;62448:11;62427:20;:33::i;:::-;62400:60;;62589:21;62630:39;62657:11;62630:26;:39::i;:::-;62684:98;62728:52;62760:4;62767:11;62735:44;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;62735:44:0;;;;62728:52;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62728:52:0;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;62728:52:0;;;;;;;;;62711:70;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;62711:70:0;;;62684:26;:98::i;:::-;62797:60;62824:32;62845:10;62824:20;:32::i;:::-;62797:26;:60::i;:::-;62872:35;62897:9;62872:24;:35::i;:::-;62922:38;62949:10;;62922:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;62922:26:0;;-1:-1:-1;;;62922:38:0:i;:::-;62975:34;63002:6;;62975:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;62975:26:0;;-1:-1:-1;;;62975:34:0:i;:::-;63024;63051:6;;63024:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;63024:26:0;;-1:-1:-1;;;63024:34:0:i;:::-;62613:456;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;62613:456:0;;;;63200:19;;49:4:-1;63200:19:0;;;-1:-1:-1;;;63182:38:0;;62613:456;;-1:-1:-1;;;;;;63182:17:0;;;;;:38;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63182:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;63182:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;63182:38:0;;;;;;;;;63174:99;;;;-1:-1:-1;;;63174:99:0;;;;;;;;;63466:9;-1:-1:-1;;;;;63450:84:0;;63477:11;63490:10;63502:9;63513:10;;63525:8;63450:84;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63552:4:0;;61760:1804;-1:-1:-1;;;;;;;;;;;61760:1804:0:o;56206:440::-;55444:11;;-1:-1:-1;;;;;55444:11:0;55430:10;:25;55422:53;;;;-1:-1:-1;;;55422:53:0;;;;;;;;;56321:6;56316:323;56332:23;:30;56330:1;:32;56316:323;;;56384:18;56403:22;56440:23;56464:1;56440:26;;;;;;;;;;;;;;56429:56;;;;;;;;;;;;;;56383:102;;-1:-1:-1;56383:102:0;-1:-1:-1;56505:6:0;56500:128;56516:7;:14;56514:1;:16;56500:128;;;-1:-1:-1;;;;;56555:38:0;;;;;;:26;:38;;;;;56594:10;;56608:4;;56555:38;56594:7;;56602:1;;56594:10;;;;;;;;;;;;56555:50;;;;;;;;;;;;;;;;;;;;;:57;;;;;-1:-1:-1;;56555:57:0;;;;;;;;;;56531:3;56500:128;;;-1:-1:-1;;;56363:3:0;;56316:323;;64256:3818;64440:4;3522:7;;-1:-1:-1;;;3522:7:0;;;;3521:8;3513:37;;;;-1:-1:-1;;;3513:37:0;;;;;;;;;64456:29;;:::i;:::-;64488:37;64515:9;64488:26;:37::i;:::-;64456:69;;64587:23;64632:24;;;;;;;;;-1:-1:-1;;;;;64632:24:0;64587:70;;64823:29;64855:61;64883:4;-1:-1:-1;;;;;64883:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;64855:61:0;64823:93;;64929:27;64959:4;-1:-1:-1;;;;;64959:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64959:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64959:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;64959:29:0;;;;;;;;;64929:59;;;;65001:6;65010:12;:19;65001:28;;65061:19;65044:6;:13;;;:36;;;65040:900;;65163:72;65182:9;65193;65204:12;65233:1;-1:-1:-1;;65224:5:0;;65222:12;;65163:72;65155:127;;;;-1:-1:-1;;;65155:127:0;;;;;;;;;65040:900;;;65385:75;65404:12;65418:9;65429:12;65458:1;-1:-1:-1;;65449:5:0;;65447:12;;65385:75;65377:144;;;;-1:-1:-1;;;65377:144:0;;;;;;;;;65634:32;;:::i;:::-;65669:40;65696:12;65669:26;:40::i;:::-;65634:75;;65724:23;65750:54;65771:11;65784:9;:19;;;65750:20;:54::i;:::-;65724:80;;65864:32;65885:10;65864:20;:32::i;:::-;65827:33;65850:9;65827:22;:33::i;:::-;:69;65819:109;;;;-1:-1:-1;;;65819:109:0;;;;;;;;;65040:900;;;66082:28;66113:51;66134:5;66141:6;:22;;;66113:20;:51::i;:::-;66082:82;;66304:43;;:::i;:::-;66350:48;66382:15;66350:31;:48::i;:::-;66304:94;;66418:4;-1:-1:-1;;;;;66418:28:0;;66447:13;:25;;;66474:42;66495:13;:20;;;66474;:42::i;:::-;66418:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66418:99:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66418:99:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;66418:99:0;;;;;;;;;66417:100;66409:147;;;;-1:-1:-1;;;66409:147:0;;;;;;;;;66575:4;-1:-1:-1;;;;;66575:25:0;;66601:13;:25;;;66628:42;66649:13;:20;;;66628;:42::i;:::-;66575:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66575:96:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66575:96:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;66575:96:0;;;;;;;;;66567:141;;;;-1:-1:-1;;;66567:141:0;;;;;;;;;66868:7;;66829:25;;;;:35;;;-1:-1:-1;;;;;66829:46:0;;;-1:-1:-1;;;66868:7:0;;;;66829:46;66821:97;;;;-1:-1:-1;;;66821:97:0;;;;;;;;;67091:18;67112:58;67133:13;:25;;;:36;;;67112:20;:58::i;:::-;-1:-1:-1;;;;;67266:38:0;;;;;;:26;:38;;;;;;;67305:25;;;;:32;;;67266:72;;67091:79;;-1:-1:-1;67266:38:0;:72;;67305:32;67266:72;;;;;;;;;;;;;;;;;;;67258:113;;;;-1:-1:-1;;;67258:113:0;;;;;;;;;67491:165;67512:10;67524:13;:25;;;:32;;;67558:13;:25;;;:30;;;67590:13;:25;;;:38;;;67630:13;:25;;;67491:20;:165::i;:::-;67483:207;;;;-1:-1:-1;;;67483:207:0;;;;;;;;;67922:25;;;;67949;;;;;:36;;;;67987:20;;68009:32;;67892:150;;;;;;67922:25;;67987:20;67892:150;;;;;;;;;;68062:4;68055:11;;;;;;;;;;3561:1;64256:3818;;;;;;;:::o;54063:26::-;;;-1:-1:-1;;;;;54063:26:0;;:::o;2276:110::-;1382:9;:7;:9::i;:::-;1374:54;;;;-1:-1:-1;;;1374:54:0;;;;;;;;;2350:28;2369:8;2350:18;:28::i;:::-;2276:110;:::o;55944:250::-;55444:11;;-1:-1:-1;;;;;55444:11:0;55430:10;:25;55422:53;;;;-1:-1:-1;;;55422:53:0;;;;;;;;;56060:6;56055:132;56071:21;:28;56069:1;:30;56055:132;;;56170:5;56120:21;:47;56142:21;56164:1;56142:24;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56120:47:0;;;;;;;;;;;-1:-1:-1;56120:47:0;:55;;-1:-1:-1;;56120:55:0;;;;;;;;;;-1:-1:-1;56100:3:0;56055:132;;49130:1080;49204:13;;:::i;:::-;49230:20;;:::i;:::-;49261:11;49312:41;49338:9;49261:11;49312:25;:41::i;:::-;49287:66;;;;;;;-1:-1:-1;49390:41:0;49416:9;49287:66;49390:25;:41::i;:::-;-1:-1:-1;;;;;49366:65:0;;;49367:14;;;49366:65;;-1:-1:-1;49474:39:0;49498:9;49366:65;49474:23;:39::i;:::-;49445:20;;;49444:69;;;;;-1:-1:-1;49559:39:0;49583:9;49444:69;49559:23;:39::i;:::-;49527:23;;;49526:72;;;;;-1:-1:-1;49643:39:0;49667:9;49526:72;49643:23;:39::i;:::-;49612:22;;;49611:71;;;;;-1:-1:-1;49721:39:0;49745:9;49611:71;49721:23;:39::i;:::-;49696:16;;;49695:65;;;;;-1:-1:-1;49799:41:0;49825:9;49695:65;49799:25;:41::i;:::-;49773:67;;;;49774:16;;;49773:67;;-1:-1:-1;49876:41:0;49902:9;49773:67;49876:25;:41::i;:::-;49853:64;;;;49854:13;;;49853:64;;-1:-1:-1;49960:41:0;49986:9;49853:64;49960:25;:41::i;:::-;-1:-1:-1;;;;;49930:71:0;;;49931:20;;;49930:71;;-1:-1:-1;50047:43:0;50075:9;49930:71;50047:27;:43::i;:::-;50015:23;;;50014:76;;;;;-1:-1:-1;50134:42:0;50161:9;50014:76;50134:26;:42::i;:::-;-1:-1:-1;;;50103:73:0;50104:21;;;50103:73;-1:-1:-1;50104:21:0;49130:1080;-1:-1:-1;;49130:1080:0:o;47138:554::-;47216:16;47245:11;;47317:44;47343:12;47245:11;47317:25;:44::i;:::-;47298:63;;;;;;;;47372:24;47413:9;-1:-1:-1;;;;;47399:24:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;47399:24:0;-1:-1:-1;47372:51:0;-1:-1:-1;47434:24:0;47473:6;47469:191;47489:9;-1:-1:-1;;;;;47485:13:0;:1;:13;47469:191;;;47541:46;47569:12;47583:3;47541:27;:46::i;:::-;47520:67;-1:-1:-1;47520:67:0;-1:-1:-1;47615:33:0;47520:67;47615:20;:33::i;:::-;47602:7;47610:1;47602:10;;;;;;;;-1:-1:-1;;;;;47602:46:0;;;:10;;;;;;;;;;;:46;47500:3;;47469:191;;;-1:-1:-1;47677:7:0;;47138:554;-1:-1:-1;;;;;47138:554:0:o;45320:903::-;45446:4;45462:12;45477:25;45491:10;45477:13;:25::i;:::-;45462:40;;45515:13;45531:44;41659:2;45531:8;:15;:19;;:44;;;;:::i;:::-;45515:60;;45586:24;45627:8;45613:23;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;45613:23:0;-1:-1:-1;45586:50:0;-1:-1:-1;45647:9:0;;;;45705:447;45726:8;45721:1;:13;45705:447;;;45759:74;45780:52;45792:8;41659:2;45802:1;:25;45829:2;45780:11;:52::i;:::-;45759:20;:74::i;:::-;45755:78;;45853:79;45874:57;45886:8;41659:2;45896:1;:25;45924:2;45896:30;45928:2;45874:11;:57::i;45853:79::-;45848:84;;45958:8;41659:2;45967:1;:25;45995:2;45967:30;45958:40;;;;;;;;;;;;;;;;45952:47;;46002:2;45952:52;45947:57;;46033:50;46043:30;46067:4;46050:22;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;46050:22:0;;;;46043:30;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46043:30:0;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;46043:30:0;;;;;;;;;46075:1;46078;46081;46033:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46033:50:0;;;;;;;;46019:7;46027:1;46019:10;;;;;;;;;;;;;:64;-1:-1:-1;;;;;46019:64:0;;;-1:-1:-1;;;;;46019:64:0;;;;;46124:1;-1:-1:-1;;;;;46102:24:0;:7;46110:1;46102:10;;;;;;;;;;;;;;-1:-1:-1;;;;;46102:24:0;;46098:42;;;46135:5;46128:12;;;;;;;;;;;46098:42;45736:3;;45705:447;;;;46169:46;46193:8;46203:7;46212:2;46169:23;:46::i;:::-;46162:53;;;;;;;;45320:903;;;;;;;:::o;44537:381::-;44608:7;44617:16;41610:2;44654:11;:18;:41;;;;;;:46;44646:86;;;;-1:-1:-1;;;44646:86:0;;;;;;;;;44743:6;41610:2;44752:11;:18;:41;;;;;;44743:50;;44817:1;44812;:6;;44804:41;;;;-1:-1:-1;;;44804:41:0;;;;;;;;;44863:47;44878:1;44895;-1:-1:-1;;44886:5:0;;44885:11;44881:1;:15;44898:11;44863:14;:47::i;:::-;44856:54;;;;;44537:381;;;:::o;46468:434::-;46588:14;;46543:12;;;46641:43;46588:14;46641:24;:43::i;:::-;46613:71;-1:-1:-1;46699:6:0;46695:170;46715:9;46711:1;:13;46695:170;;;46778:12;46792:60;46819:32;46840:7;46848:1;46840:10;;;;;;;;;;;;;;46819:20;:32::i;46792:60::-;46761:92;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;46761:92:0;;;;-1:-1:-1;46726:3:0;;46695:170;;;-1:-1:-1;46882:12:0;46468:434;-1:-1:-1;;;46468:434:0:o;4046:112::-;3721:7;;-1:-1:-1;;;3721:7:0;;;;3713:40;;;;-1:-1:-1;;;3713:40:0;;;;;;;;;4107:5;4097:15;;-1:-1:-1;;;;4097:15:0;;;4128:22;4137:12;:10;:12::i;:::-;4128:22;;;;;;;;;;;;;;;4046:112::o;3853:110::-;3522:7;;-1:-1:-1;;;3522:7:0;;;;3521:8;3513:37;;;;-1:-1:-1;;;3513:37:0;;;;;;;;;3905:7;:14;;-1:-1:-1;;;;3905:14:0;-1:-1:-1;;;3905:14:0;;;3935:20;3942:12;331:98;411:10;331:98;:::o;28360:772::-;28423:15;-1:-1:-1;;;;;28459:6:0;:76;;28451:112;;;;-1:-1:-1;;;28451:112:0;;;;;;;;;28739:4;28733:11;28727:17;;28851:4;28847:2;28840:16;28972:6;28965:4;28961:2;28957:13;28950:29;29108:4;29104:2;29100:13;29094:4;29087:27;28583:542;;;:::o;9161:185::-;9269:11;;9226:12;;9316:15;9269:11;9316:12;:15::i;:::-;9333:4;9299:39;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;9299:39:0;;;9292:46;;;9161:185;;;:::o;29923:690::-;30177:4;30171:11;;30309:4;30298:16;;29985:15;30446:14;;;;30439:4;30431:13;;30424:37;30582:13;;;30569:27;;30171:11;30021:585::o;7452:622::-;7597:4;7591:11;7631:4;7649:21;;;7505:12;;7591:11;7721:4;7757;7684:307;7788:7;7780:6;7777:19;7684:307;;;7973:1;7965:6;7960:15;7951:6;7944:4;7938;7934:15;7930:28;7922:54;7838:4;7826:17;;;;;-1:-1:-1;;7871:17:0;7684:307;;;-1:-1:-1;;;8028:4:0;8018:15;;8012:4;8005:29;8018:15;7452:622;-1:-1:-1;;7452:622:0:o;41943:991::-;42027:12;42052:11;42027:12;42123:44;42151:10;42052:11;42123:27;:44::i;:::-;42107:60;-1:-1:-1;42107:60:0;-1:-1:-1;42180:12:0;42195:21;42107:60;42195:14;:21::i;:::-;42180:36;;42227:9;42239:34;42270:2;42239:26;42261:3;42239:10;:17;:21;;:26;;;;:::i;:::-;:30;:34;:30;:34;:::i;:::-;42227:46;-1:-1:-1;42284:16:0;;;42330:488;42351:4;42347:1;:8;42330:488;;;42390:40;42414:10;42426:3;42390:23;:40::i;:::-;42377:53;-1:-1:-1;42377:53:0;-1:-1:-1;42463:40:0;42487:10;42377:53;42463:23;:40::i;:::-;42445:58;-1:-1:-1;42445:58:0;-1:-1:-1;;;;;;;42522:11:0;;42518:289;;42561:34;42580:8;42590:4;42561:18;:34::i;:::-;42554:41;;42518:289;;;-1:-1:-1;;;;;;;;;42621:11:0;;;42617:190;;;42660:34;42679:4;42685:8;42660:18;:34::i;42617:190::-;42735:56;;-1:-1:-1;;;42735:56:0;;;;;;;;42617:190;42357:3;;42330:488;;;;42844:5;42836:4;:13;42828:75;;;;-1:-1:-1;;;42828:75:0;;;;;;;;;-1:-1:-1;42921:5:0;;41943:991;-1:-1:-1;;;;;;;41943:991:0:o;27296:347::-;27361:13;27395:3;:10;27409:2;27395:16;27387:52;;;;-1:-1:-1;;;27387:52:0;;;;;;;;;-1:-1:-1;27619:4:0;27610:14;27604:21;;27459:177::o;50418:148::-;50488:7;50515:43;50539:17;50546:9;50539:17;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50539:17:0;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;50539:17:0;;;;;;;;;50522:35;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;50522:35:0;;;;50515:43;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50515:43:0;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;50515:43:0;;;;;;;;47897:1042;47975:20;;:::i;:::-;48008:34;;:::i;:::-;48053:11;48111:42;48139:8;48053:11;48111:27;:42::i;:::-;48081:72;;;;-1:-1:-1;48201:40:0;48227:8;48081:72;48201:25;:40::i;:::-;-1:-1:-1;;;;;48166:75:0;;;48167:25;;;48166:75;;-1:-1:-1;48254:22:0;;:::i;:::-;48313:42;48341:8;48351:3;48313:27;:42::i;:::-;48289:66;;;;-1:-1:-1;48406:42:0;48434:8;48289:66;48406:27;:42::i;:::-;48377:20;;;48376:72;;;;;-1:-1:-1;48491:42:0;48519:8;48376:72;48491:27;:42::i;:::-;48462:20;;;48461:72;;;;;-1:-1:-1;48573:40:0;48599:8;48461:72;48573:25;:40::i;:::-;-1:-1:-1;;;;;48546:67:0;;;48547:17;;;48546:67;;-1:-1:-1;48654:42:0;48682:8;48546:67;48654:27;:42::i;:::-;48627:18;;;48626:70;;;;;-1:-1:-1;48733:42:0;48761:8;48626:70;48733:27;:42::i;:::-;48710:14;;;48709:66;;;;;-1:-1:-1;48810:42:0;48838:8;48709:66;48810:27;:42::i;:::-;-1:-1:-1;48789:12:0;;;48788:64;48863:25;;;:35;-1:-1:-1;48863:25:0;47897:1042;-1:-1:-1;;47897:1042:0:o;29310:447::-;29375:12;29413:3;:10;29427:2;29413:16;29405:64;;;;-1:-1:-1;;;29405:64:0;;;;;;;;;-1:-1:-1;29731:4:0;29722:14;29716:21;;29489:259::o;68744:1183::-;68908:4;69049:29;69066:11;69049:16;:29::i;:::-;69041:82;;;;-1:-1:-1;;;69041:82:0;;;;;;;;;69134:23;69168:12;69295:11;-1:-1:-1;;;;;69295:16:0;69363:7;69346:49;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;69346::0;;;69336:60;;;;;;69410:5;69417:17;69436:12;69399:50;;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;69399:50:0;;;;69312:138;;;49:4:-1;69312:138:0;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;69312:138:0;;;;69295:156;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;69271:180:0;-1:-1:-1;69271:180:0;-1:-1:-1;69540:4:0;69529:15;;;;69521:71;;;;-1:-1:-1;;;69521:71:0;;;;;;;;;69667:17;;69659:74;;;;-1:-1:-1;;;69659:74:0;;;;;;;;;69745:8;69758:39;69782:10;69794:2;69758:23;:39::i;:::-;-1:-1:-1;69744:53:0;-1:-1:-1;69823:4:0;69816:11;;;;69808:79;;;;-1:-1:-1;;;69808:79:0;;;;;;;;;-1:-1:-1;69915:4:0;;68744:1183;-1:-1:-1;;;;;;;;68744:1183:0:o;2492:229::-;-1:-1:-1;;;;;2566:22:0;;2558:73;;;;-1:-1:-1;;;2558:73:0;;;;;;;;;2668:6;;;2647:38;;-1:-1:-1;;;;;2647:38:0;;;;2668:6;;;2647:38;;;2696:6;:17;;-1:-1:-1;;;;;;2696:17:0;-1:-1:-1;;;;;2696:17:0;;;;;;;;;;2492:229::o;13332:875::-;13410:6;13418:7;13460:4;:11;13446:6;13455:1;13446:10;:25;;:48;;;;;13484:6;13493:1;13484:10;13475:6;:19;13446:48;13438:95;;;;-1:-1:-1;;;13438:95:0;;;;;;;;;13544:8;13609:4;13603:11;13643:4;13698;13747;13738:7;13734:18;13811:6;13804:4;13798;13794:15;13790:28;13784:35;13661:386;13846:7;13838:6;13835:19;13661:386;;;14024:6;14016;14011:20;14002:6;13992:8;13988:21;13980:52;13896:4;13888:6;13884:17;13874:27;;13941:4;13933:6;13929:17;13919:27;;13661:386;;;-1:-1:-1;;;14074:22:0;;;14068:4;14061:36;14140:4;14136:18;14122:33;;14116:40;;-1:-1:-1;;;14197:1:0;14188:10;;13332:875;;;;;;:::o;14506:::-;14584:6;14592:7;14634:4;:11;14620:6;14629:1;14620:10;:25;;:48;;;;;14658:6;14667:1;14658:10;14649:6;:19;14620:48;14612:95;;;;-1:-1:-1;;;14612:95:0;;;;;;;;;14718:8;14783:4;14777:11;14817:4;14872;14921;14912:7;14908:18;14985:6;14978:4;14972;14968:15;14964:28;14958:35;14835:386;15020:7;15012:6;15009:19;14835:386;;;15198:6;15190;15185:20;15176:6;15166:8;15162:21;15154:52;15070:4;15062:6;15058:17;15048:27;;15115:4;15107:6;15103:17;15093:27;;14835:386;;;-1:-1:-1;;;15248:22:0;;;15242:4;15235:36;15314:4;15310:18;15296:33;;15290:40;;15371:1;15362:10;;;;;-1:-1:-1;;;;14506:875:0:o;20056:348::-;20132:7;20142;20185:4;:11;20170:6;20179:2;20170:11;:26;;:50;;;;;20209:6;20218:2;20209:11;20200:6;:20;20170:50;20162:95;;;;-1:-1:-1;;;20162:95:0;;;;;;;;;-1:-1:-1;;20345:4:0;20323:28;;;;;20317:35;;20333:17;;;20056:348::o;17120:2656::-;17199:12;17213:7;17233:8;17268:25;17280:4;17286:6;17268:11;:25::i;:::-;17328:11;;17252:41;;-1:-1:-1;17252:41:0;;-1:-1:-1;17312:12:0;;;:27;;;;:52;;;17361:3;17352:6;:12;17343:6;:21;17312:52;17304:101;;;;-1:-1:-1;;;17304:101:0;;;;;;;;;17416:22;17479:11;;17504:1991;;;;19639:4;19633:11;19620:24;;19692:4;19681:9;19677:20;19671:4;19664:34;17472:2241;;17504:1991;17689:4;17683:11;17670:24;;18354:2;18349:3;18345:12;18742:9;18735:17;18729:4;18725:28;18713:9;18702;18698:25;18694:60;18791:3;18787:2;18783:12;19042:6;19028:9;19021:17;19015:4;19011:28;18999:9;18993:4;18989:20;18985:55;18981:68;18815:432;19076:3;19072:2;19069:11;18815:432;;;19218:9;;19207:21;;19118:4;19110:13;;;;19151;18815:432;;;-1:-1:-1;;19267:22:0;;;19475:2;19458:11;-1:-1:-1;;19454:25:0;19448:4;19441:39;-1:-1:-1;17472:2241:0;-1:-1:-1;19744:9:0;19755:12;;;-1:-1:-1;;;17120:2656:0:o;20686:354::-;20765:7;20775;20818:4;:11;20803:6;20812:2;20803:11;:26;;:50;;;;;20842:6;20851:2;20842:11;20833:6;:20;20803:50;20795:98;;;;-1:-1:-1;;;20795:98:0;;;;;;;;;-1:-1:-1;;20959:28:0;;;20981:4;20959:28;20953:35;21029:2;21020:11;;20686:354;;;;;:::o;24811:132::-;24869:7;24896:39;24900:1;24903;24896:39;;;;;;;;;;;;;;;;;:3;:39::i;35418:2645::-;35565:12;35630:7;35621:6;:16;35603:6;:13;:35;;35595:44;;;;;;35652:22;35718:15;;35747:2051;;;;37942:4;37936:11;37923:24;;37995:4;37984:9;37980:20;37974:4;37967:34;35711:2305;;35747:2051;35932:4;35926:11;35913:24;;36647:2;36638:7;36634:16;37035:9;37028:17;37022:4;37018:28;37006:9;36995;36991:25;36987:60;37084:7;37080:2;37076:16;37341:6;37327:9;37320:17;37314:4;37310:28;37298:9;37290:6;37286:22;37282:57;37278:70;37112:434;37375:3;37371:2;37368:11;37112:434;;;37517:9;;37506:21;;37417:4;37409:13;;;;37450;37112:434;;;-1:-1:-1;;37566:26:0;;;37778:2;37761:11;-1:-1:-1;;37757:25:0;37751:4;37744:39;-1:-1:-1;35711:2305:0;-1:-1:-1;38046:9:0;35418:2645;-1:-1:-1;;;;35418:2645:0:o;38471:445::-;38584:4;;;38621:263;38641:8;:15;38637:1;:19;38621:263;;;38682:6;38677:196;38698:8;:15;38694:1;:19;38677:196;;;38758:8;38767:1;38758:11;;;;;;;;;;;;;;-1:-1:-1;;;;;38743:26:0;:8;38752:1;38743:11;;;;;;;;;;;;;;-1:-1:-1;;;;;38743:26:0;;38739:119;;;38794:3;;;;;;;38827:8;38836:1;38827:11;;;;;;;;;;;;;38820:18;-1:-1:-1;;;;;38820:18:0;;;;38739:119;38715:3;;38677:196;;;-1:-1:-1;38658:3:0;;38621:263;;;-1:-1:-1;;;;38901:7:0;;38471:445;-1:-1:-1;;;38471:445:0:o;43292:929::-;43388:7;43397:16;43426:17;43462:41;43494:7;43462:24;:41::i;:::-;43455:48;;43515:24;43556:7;43542:22;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;43542:22:0;-1:-1:-1;43515:49:0;-1:-1:-1;43576:12:0;43600:22;43576:12;43634:376;43654:7;43650:1;:11;43634:376;;;43695:70;43707:11;41610:2;43720:1;:22;41610:2;43695:11;:70::i;:::-;43683:82;;43806:4;43812:61;43839:33;43862:9;43839:22;:33::i;43812:61::-;43789:85;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;43789:85:0;;;43781:93;;43907:29;43919:9;43930:1;43933:2;43907:11;:29::i;:::-;43897:40;;;;;;43890:47;;43990:4;43982:13;;43953:7;43961:1;43953:10;;;;;;;;-1:-1:-1;;;;;43953:44:0;;;:10;;;;;;;;;;;:44;43663:3;;43634:376;;;;44047:4;44053:36;44085:2;44053:24;:36::i;:::-;44030:60;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;44030:60:0;;;44023:67;;44102:23;44128:41;44155:12;44162:4;44155:12;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44155:12:0;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44155:12:0;;;;;;;;;44138:30;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;44138:30:0;;;;44128:41;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;44128:41:0;;;;;;44205:7;;-1:-1:-1;43292:929:0;;-1:-1:-1;;;;;;;;;43292:929:0:o;9354:453::-;9409:12;9442:4;9438:1;-1:-1:-1;;;;;9438:8:0;;9434:366;;;9463:20;9480:1;9463:10;:20::i;:::-;9456:27;;;;9434:366;9507:6;9502:1;-1:-1:-1;;;;;9502:11:0;;9498:302;;9548:15;-1:-1:-1;;;9548:9:0;:15::i;:::-;9565:22;9584:1;9565:11;:22::i;:::-;9531:57;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;9531:57:0;;;9524:64;;;;9498:302;9612:10;9607:1;-1:-1:-1;;;;;9607:15:0;;9603:197;;9663:15;-1:-1:-1;;;9663:9:0;:15::i;:::-;9680:22;9699:1;9680:11;:22::i;9603:197::-;9751:15;-1:-1:-1;;;;;;9751:9:0;:15::i;:::-;9768:22;9787:1;9768:11;:22::i;30793:148::-;30854:14;30891:42;30920:3;30915:9;;30926:5;30898:34;;;;;;;;;;22956:136;23014:7;23041:43;23045:1;23048;23041:43;;;;;;;;;;;;;;;;;:3;:43::i;10972:337::-;11048:4;11054:7;11096:4;:11;11082:6;11091:1;11082:10;:25;;:48;;;;;11120:6;11129:1;11120:10;11111:6;:19;11082:48;11074:93;;;;-1:-1:-1;;;11074:93:0;;;;;;;;;-1:-1:-1;;11229:28:0;;;11243:4;11229:28;11223:35;11299:1;11290:10;;10972:337;;;;;:::o;31150:161::-;31220:14;31257:46;31288:4;31281:12;;31295:2;31299;31264:38;;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;31264:38:0;;;;31257:46;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31257:46:0;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;31257:46:0;;;;;;;;39959:810;40019:4;40678:20;;40521:66;40718:15;;;;;:42;;-1:-1:-1;40737:23:0;;;40710:51;-1:-1:-1;;39959:810:0:o;10139:556::-;10214:4;10220:7;10262:4;:11;10248:6;10257:1;10248:10;:25;;:48;;;;;10286:6;10295:1;10286:10;10277:6;:19;10248:48;10240:81;;;;-1:-1:-1;;;10240:81:0;;;;;;;;;10411:28;;;10425:4;10411:28;10405:35;10360:6;-1:-1:-1;;;;;;;;;10486:9:0;;;10482:169;;;-1:-1:-1;10514:4:0;10482:169;;;-1:-1:-1;;;;;;10537:9:0;;10533:118;;-1:-1:-1;10571:5:0;10533:118;;;10609:30;;-1:-1:-1;;;10609:30:0;;;;;;;;10533:118;10669:5;10685:1;10676:10;;;;;-1:-1:-1;;;;10139:556:0:o;21052:1186::-;21130:4;21136:7;21156:6;21187:22;21196:4;21202:6;21187:8;:22::i;:::-;21173:36;-1:-1:-1;21173:36:0;-1:-1:-1;21222:10:0;-1:-1:-1;;;;;;;;;21247:9:0;;;21243:988;;;21340:24;21351:4;21357:6;21340:10;:24::i;:::-;21322:42;-1:-1:-1;21322:42:0;;;-1:-1:-1;21396:4:0;21387:13;;;;;:32;;;21413:6;21404:5;:15;;21387:32;21379:76;;;;-1:-1:-1;;;21379:76:0;;;;;;;;;21478:5;-1:-1:-1;21485:6:0;;-1:-1:-1;21470:22:0;;-1:-1:-1;21470:22:0;21243:988;-1:-1:-1;;;;;;;;;21514:9:0;;;21510:721;;;21607:24;21618:4;21624:6;21607:10;:24::i;:::-;21589:42;-1:-1:-1;21589:42:0;;;-1:-1:-1;21662:6:0;21654:14;;:37;;;;;21681:10;21672:5;:19;;21654:37;21646:82;;;;-1:-1:-1;;;21646:82:0;;;;;;;;21510:721;-1:-1:-1;;;;;;21787:9:0;;;;21783:448;;;21880:24;21891:4;21897:6;21880:10;:24::i;:::-;21862:42;-1:-1:-1;;;;;;21862:42:0;;-1:-1:-1;21935:10:0;21927:18;;21919:63;;;;-1:-1:-1;;;21919:63:0;;;;;;;;21783:448;-1:-1:-1;22102:8:0;;;;22141:4;22133:12;;22125:57;;;;-1:-1:-1;;;22125:57:0;;;;;;;;25473:346;25559:7;25662:12;25654:6;25646:29;;;;-1:-1:-1;;;25646:29:0;;;;;;;;;;;25686:9;25702:1;25698;:5;;;;;;;25473:346;-1:-1:-1;;;;;25473:346:0:o;5881:623::-;6027:4;6021:11;6061:4;6079:21;;;5935:12;;6021:11;6151:4;6187;6114:307;6218:7;6210:6;6207:19;6114:307;;;6403:1;6395:6;6390:15;6381:6;6374:4;6368;6364:15;6360:28;6352:54;6268:4;6256:17;;;;;-1:-1:-1;;6301:17:0;6114:307;;;-1:-1:-1;;;6458:4:0;6448:15;;6442:4;6435:29;6448:15;5881:623;-1:-1:-1;;5881:623:0:o;39001:370::-;39068:19;39123:2;39109:3;:10;:16;;39101:52;;;;-1:-1:-1;;;39101:52:0;;;;;;;;;39174:17;39180:3;39185:1;39188:2;39174:5;:17::i;:::-;39165:26;;39224:1;39213:3;39217:2;39213:7;;;;;;;;;;;;;;39207:18;;;;;;:23;;39229:1;39207:23;39203:136;;;39264:4;39259:10;;39247:6;39254:1;39247:9;;;;;;;;;;;:22;-1:-1:-1;;;;;39247:22:0;;;;;;;;;39203:136;;;39321:4;39316:10;;39304:6;39311:1;39304:9;;;;;;;;;;;:22;-1:-1:-1;;;;;39304:22:0;;;;;;;;;39001:370;;;:::o;5355:364::-;5497:4;5491:11;;5529:1;5516:15;;5573:3;5569:11;;;;5562:4;5552:15;;5545:36;5673:4;5663:15;;5650:29;;5491:11;5355:364::o;5085:110::-;5135:12;5167:20;5184:1;5178:8;;5167:10;:20::i;6670:620::-;6813:4;6807:11;6847:4;6865:21;;;6723:12;;6807:11;6937:4;6973;6900:307;7004:7;6996:6;6993:19;6900:307;;;7189:1;7181:6;7176:15;7167:6;7160:4;7154;7150:15;7146:28;7138:54;7054:4;7042:17;;;;;-1:-1:-1;;7087:17:0;6900:307;;;-1:-1:-1;;;7244:4:0;7234:15;;7228:4;7221:29;7234:15;6670:620;-1:-1:-1;;6670:620:0:o;23429:192::-;23515:7;23551:12;23543:6;;;;23535:29;;;;-1:-1:-1;;;23535:29:0;;;;;;;;;;-1:-1:-1;;;23587:5:0;;;23429:192::o;12424:608::-;12502:6;12510:7;12552:4;:11;12538:6;12547:1;12538:10;:25;;:48;;;;;12576:6;12585:1;12576:10;12567:6;:19;12538:48;12530:95;;;;-1:-1:-1;;;12530:95:0;;;;;;;;;12646:8;12711:4;12705:11;12771:6;12764:4;12758;12754:15;12750:28;12744:35;12822:6;12816:4;12811:18;12801:8;12793:37;12881:6;12878:1;12873:15;12866:4;12856:8;12852:19;12844:45;-1:-1:-1;12930:4:0;12916:19;;;12910:4;12903:33;-1:-1:-1;;12961:19:0;;;12955:26;;13013:10;;;-1:-1:-1;;;;12424:608:0:o;53946:15984::-;;;;;;;;;-1:-1:-1;53946:15984:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;53946:15984:0;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53946:15984:0;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;142:150;228:13;;246:41;228:13;246:41;;317:707;;434:3;427:4;419:6;415:17;411:27;401:2;;452:1;449;442:12;401:2;489:6;476:20;511:80;526:64;583:6;526:64;;;511:80;;;502:89;;608:5;633:6;626:5;619:21;663:4;655:6;651:17;641:27;;685:4;680:3;676:14;669:21;;738:6;785:3;777:4;769:6;765:17;760:3;756:27;753:36;750:2;;;802:1;799;792:12;750:2;827:1;812:206;837:6;834:1;831:13;812:206;;;895:3;917:37;950:3;938:10;917:37;;;905:50;;-1:-1;978:4;969:14;;;;997;;;;;859:1;852:9;812:206;;;816:14;394:630;;;;;;;;1048:693;;1177:3;1170:4;1162:6;1158:17;1154:27;1144:2;;1195:1;1192;1185:12;1144:2;1225:6;1219:13;1247:81;1262:65;1320:6;1262:65;;1247:81;1356:21;;;1400:4;1388:17;;;;1238:90;;-1:-1;1413:14;;1388:17;1508:1;1493:242;1518:6;1515:1;1512:13;1493:242;;;1594:3;1588:10;1580:6;1576:23;1618:53;1667:3;1655:10;1618:53;;;1606:66;;-1:-1;1695:4;1686:14;;;;1714;;;;;1540:1;1533:9;1493:242;;1765:693;;1887:3;1880:4;1872:6;1868:17;1864:27;1854:2;;1905:1;1902;1895:12;1854:2;1942:6;1929:20;1964:85;1979:69;2041:6;1979:69;;1964:85;2077:21;;;2121:4;2109:17;;;;1955:94;;-1:-1;2134:14;;2109:17;2229:1;2214:238;2239:6;2236:1;2233:13;2214:238;;;2322:3;2309:17;2301:6;2297:30;2346:42;2384:3;2372:10;2346:42;;;2334:55;;-1:-1;2412:4;2403:14;;;;2431;;;;;2261:1;2254:9;2214:238;;2466:128;2541:13;;2559:30;2541:13;2559:30;;2601:134;2679:13;;2697:33;2679:13;2697:33;;2756:336;;;2870:3;2863:4;2855:6;2851:17;2847:27;2837:2;;2888:1;2885;2878:12;2837:2;-1:-1;2908:20;;-1:-1;;;;;2937:30;;2934:2;;;2980:1;2977;2970:12;2934:2;3014:4;3006:6;3002:17;2990:29;;3065:3;3057:4;3049:6;3045:17;3035:8;3031:32;3028:41;3025:2;;;3082:1;3079;3072:12;3101:432;;3198:3;3191:4;3183:6;3179:17;3175:27;3165:2;;3216:1;3213;3206:12;3165:2;3253:6;3240:20;3275:60;3290:44;3327:6;3290:44;;3275:60;3266:69;;3355:6;3348:5;3341:21;3391:4;3383:6;3379:17;3424:4;3417:5;3413:16;3459:3;3450:6;3445:3;3441:16;3438:25;3435:2;;;3476:1;3473;3466:12;3435:2;3486:41;3520:6;3515:3;3510;3486:41;;;3158:375;;;;;;;;3542:434;;3650:3;3643:4;3635:6;3631:17;3627:27;3617:2;;3668:1;3665;3658:12;3617:2;3698:6;3692:13;3720:60;3735:44;3772:6;3735:44;;3720:60;3711:69;;3800:6;3793:5;3786:21;3836:4;3828:6;3824:17;3869:4;3862:5;3858:16;3904:3;3895:6;3890:3;3886:16;3883:25;3880:2;;;3921:1;3918;3911:12;3880:2;3931:39;3963:6;3958:3;3953;3931:39;;5025:132;5102:13;;5120:32;5102:13;5120:32;;5164:128;5230:20;;5255:32;5230:20;5255:32;;5299:241;;5403:2;5391:9;5382:7;5378:23;5374:32;5371:2;;;5419:1;5416;5409:12;5371:2;5454:1;5471:53;5516:7;5496:9;5471:53;;5547:546;;;5713:2;5701:9;5692:7;5688:23;5684:32;5681:2;;;5729:1;5726;5719:12;5681:2;5764:1;5781:72;5845:7;5825:9;5781:72;;;5771:82;;5743:116;5911:2;5900:9;5896:18;5890:25;-1:-1;;;;;5927:6;5924:30;5921:2;;;5967:1;5964;5957:12;5921:2;5987:90;6069:7;6060:6;6049:9;6045:22;5987:90;;;5977:100;;5869:214;5675:418;;;;;;6100:462;;;6226:2;6214:9;6205:7;6201:23;6197:32;6194:2;;;6242:1;6239;6232:12;6194:2;6277:1;6294:53;6339:7;6319:9;6294:53;;;6284:63;;6256:97;6412:2;6401:9;6397:18;6384:32;-1:-1;;;;;6428:6;6425:30;6422:2;;;6468:1;6465;6458:12;6422:2;6488:58;6538:7;6529:6;6518:9;6514:22;6488:58;;6569:377;;6698:2;6686:9;6677:7;6673:23;6669:32;6666:2;;;6714:1;6711;6704:12;6666:2;6749:31;;-1:-1;;;;;6789:30;;6786:2;;;6832:1;6829;6822:12;6786:2;6852:78;6922:7;6913:6;6902:9;6898:22;6852:78;;6953:387;;7087:2;7075:9;7066:7;7062:23;7058:32;7055:2;;;7103:1;7100;7093:12;7055:2;7138:31;;-1:-1;;;;;7178:30;;7175:2;;;7221:1;7218;7211:12;7175:2;7241:83;7316:7;7307:6;7296:9;7292:22;7241:83;;7347:257;;7459:2;7447:9;7438:7;7434:23;7430:32;7427:2;;;7475:1;7472;7465:12;7427:2;7510:1;7527:61;7580:7;7560:9;7527:61;;7611:263;;7726:2;7714:9;7705:7;7701:23;7697:32;7694:2;;;7742:1;7739;7732:12;7694:2;7777:1;7794:64;7850:7;7830:9;7794:64;;7881:360;;8005:2;7993:9;7984:7;7980:23;7976:32;7973:2;;;8021:1;8018;8011:12;7973:2;8056:24;;-1:-1;;;;;8089:30;;8086:2;;;8132:1;8129;8122:12;8086:2;8152:73;8217:7;8208:6;8197:9;8193:22;8152:73;;8248:574;;;8387:2;8375:9;8366:7;8362:23;8358:32;8355:2;;;8403:1;8400;8393:12;8355:2;8438:31;;-1:-1;;;;;8478:30;;8475:2;;;8521:1;8518;8511:12;8475:2;8541:62;8595:7;8586:6;8575:9;8571:22;8541:62;;8829:803;;;;8994:2;8982:9;8973:7;8969:23;8965:32;8962:2;;;9010:1;9007;9000:12;8962:2;9045:31;;-1:-1;;;;;9085:30;;9082:2;;;9128:1;9125;9118:12;9082:2;9148:62;9202:7;9193:6;9182:9;9178:22;9148:62;;;9138:72;;9024:192;9275:2;9264:9;9260:18;9247:32;-1:-1;;;;;9291:6;9288:30;9285:2;;;9331:1;9328;9321:12;9285:2;9351:62;9405:7;9396:6;9385:9;9381:22;9351:62;;;9341:72;;9226:193;9478:2;9467:9;9463:18;9450:32;-1:-1;;;;;9494:6;9491:30;9488:2;;;9534:1;9531;9524:12;9488:2;9554:62;9608:7;9599:6;9588:9;9584:22;9554:62;;;9544:72;;9429:193;8956:676;;;;;;9639:1263;;;;;;9856:3;9844:9;9835:7;9831:23;9827:33;9824:2;;;9873:1;9870;9863:12;9824:2;9908:31;;-1:-1;;;;;9948:30;;9945:2;;;9991:1;9988;9981:12;9945:2;10011:62;10065:7;10056:6;10045:9;10041:22;10011:62;;;10001:72;;9887:192;10138:2;10127:9;10123:18;10110:32;-1:-1;;;;;10154:6;10151:30;10148:2;;;10194:1;10191;10184:12;10148:2;10214:62;10268:7;10259:6;10248:9;10244:22;10214:62;;;10204:72;;10089:193;10341:2;10330:9;10326:18;10313:32;-1:-1;;;;;10357:6;10354:30;10351:2;;;10397:1;10394;10387:12;10351:2;10417:62;10471:7;10462:6;10451:9;10447:22;10417:62;;;10407:72;;10292:193;10544:2;10533:9;10529:18;10516:32;-1:-1;;;;;10560:6;10557:30;10554:2;;;10600:1;10597;10590:12;10554:2;10620:62;10674:7;10665:6;10654:9;10650:22;10620:62;;;10610:72;;10495:193;10747:3;10736:9;10732:19;10719:33;-1:-1;;;;;10764:6;10761:30;10758:2;;;10804:1;10801;10794:12;10758:2;10824:62;10878:7;10869:6;10858:9;10854:22;10824:62;;;10814:72;;10698:194;9818:1084;;;;;;;;;11179:261;;11293:2;11281:9;11272:7;11268:23;11264:32;11261:2;;;11309:1;11306;11299:12;11261:2;11344:1;11361:63;11416:7;11396:9;11361:63;;11447:239;;11550:2;11538:9;11529:7;11525:23;11521:32;11518:2;;;11566:1;11563;11556:12;11518:2;11601:1;11618:52;11662:7;11642:9;11618:52;;11693:987;;;;;;;;11904:3;11892:9;11883:7;11879:23;11875:33;11872:2;;;11921:1;11918;11911:12;11872:2;11956:1;11973:52;12017:7;11997:9;11973:52;;;11963:62;;11935:96;12090:2;12079:9;12075:18;12062:32;-1:-1;;;;;12106:6;12103:30;12100:2;;;12146:1;12143;12136:12;12100:2;12174:64;12230:7;12221:6;12210:9;12206:22;12174:64;;;12164:74;;;;12041:203;12303:2;12292:9;12288:18;12275:32;-1:-1;;;;;12319:6;12316:30;12313:2;;;12359:1;12356;12349:12;12313:2;12387:64;12443:7;12434:6;12423:9;12419:22;12387:64;;;12377:74;;;;12254:203;12516:2;12505:9;12501:18;12488:32;-1:-1;;;;;12532:6;12529:30;12526:2;;;12572:1;12569;12562:12;12526:2;12600:64;12656:7;12647:6;12636:9;12632:22;12600:64;;;12590:74;;;;12467:203;11866:814;;;;;;;;;;;12687:142;12778:45;12817:5;12778:45;;;12773:3;12766:58;12760:69;;;12836:113;12919:24;12937:5;12919:24;;12956:152;13057:45;13077:24;13095:5;13077:24;;;13057:45;;13115:104;13192:21;13207:5;13192:21;;13226:148;13325:43;13344:23;13361:5;13344:23;;;13325:43;;13381:113;13464:24;13482:5;13464:24;;13501:152;13602:45;13622:24;13640:5;13622:24;;13660:148;13759:43;13778:23;13795:5;13778:23;;13838:297;;13952:70;14015:6;14010:3;13952:70;;;13945:77;;14034:43;14070:6;14065:3;14058:5;14034:43;;;14099:29;14121:6;14099:29;;;14090:39;;;;13938:197;-1:-1;;;13938:197;14143:343;;14253:38;14285:5;14253:38;;;14303:70;14366:6;14361:3;14303:70;;;14296:77;;14378:52;14423:6;14418:3;14411:4;14404:5;14400:16;14378:52;;;14451:29;14473:6;14451:29;;14493:356;;14621:38;14653:5;14621:38;;;14671:88;14752:6;14747:3;14671:88;;;14664:95;;14764:52;14809:6;14804:3;14797:4;14790:5;14786:16;14764:52;;;14828:16;;;;;14601:248;-1:-1;;14601:248;15908:315;;16068:67;16132:2;16127:3;16068:67;;;-1:-1;;;16148:38;;16214:2;16205:12;;16054:169;-1:-1;;16054:169;16232:320;;16392:67;16456:2;16451:3;16392:67;;;-1:-1;;;16472:43;;16543:2;16534:12;;16378:174;-1:-1;;16378:174;16561:329;;16721:67;16785:2;16780:3;16721:67;;;16821:31;16801:52;;16881:2;16872:12;;16707:183;-1:-1;;16707:183;16899:376;;17059:67;17123:2;17118:3;17059:67;;;17159:34;17139:55;;-1:-1;;;17223:2;17214:12;;17207:31;17266:2;17257:12;;17045:230;-1:-1;;17045:230;17284:331;;17444:67;17508:2;17503:3;17444:67;;;17544:33;17524:54;;17606:2;17597:12;;17430:185;-1:-1;;17430:185;17624:374;;17784:67;17848:2;17843:3;17784:67;;;17884:34;17864:55;;-1:-1;;;17948:2;17939:12;;17932:29;17989:2;17980:12;;17770:228;-1:-1;;17770:228;18007:378;;18167:67;18231:2;18226:3;18167:67;;;18267:34;18247:55;;-1:-1;;;18331:2;18322:12;;18315:33;18376:2;18367:12;;18153:232;-1:-1;;18153:232;18394:372;;18554:67;18618:2;18613:3;18554:67;;;18654:34;18634:55;;-1:-1;;;18718:2;18709:12;;18702:27;18757:2;18748:12;;18540:226;-1:-1;;18540:226;18775:327;;18935:67;18999:2;18994:3;18935:67;;;19035:29;19015:50;;19093:2;19084:12;;18921:181;-1:-1;;18921:181;19111:375;;19271:67;19335:2;19330:3;19271:67;;;19371:34;19351:55;;-1:-1;;;19435:2;19426:12;;19419:30;19477:2;19468:12;;19257:229;-1:-1;;19257:229;19495:332;;19655:67;19719:2;19714:3;19655:67;;;19755:34;19735:55;;19818:2;19809:12;;19641:186;-1:-1;;19641:186;19836:441;;19996:67;20060:2;20055:3;19996:67;;;20096:34;20076:55;;20165:34;20160:2;20151:12;;20144:56;-1:-1;;;20229:2;20220:12;;20213:27;20268:2;20259:12;;19982:295;-1:-1;;19982:295;20286:375;;20446:67;20510:2;20505:3;20446:67;;;20546:34;20526:55;;-1:-1;;;20610:2;20601:12;;20594:30;20652:2;20643:12;;20432:229;-1:-1;;20432:229;20670:372;;20830:67;20894:2;20889:3;20830:67;;;20930:34;20910:55;;-1:-1;;;20994:2;20985:12;;20978:27;21033:2;21024:12;;20816:226;-1:-1;;20816:226;21051:324;;21211:67;21275:2;21270:3;21211:67;;;21311:26;21291:47;;21366:2;21357:12;;21197:178;-1:-1;;21197:178;21384:329;;21544:67;21608:2;21603:3;21544:67;;;21644:31;21624:52;;21704:2;21695:12;;21530:183;-1:-1;;21530:183;21722:321;;21882:67;21946:2;21941:3;21882:67;;;-1:-1;;;21962:44;;22034:2;22025:12;;21868:175;-1:-1;;21868:175;22052:316;;22212:67;22276:2;22271:3;22212:67;;;-1:-1;;;22292:39;;22359:2;22350:12;;22198:170;-1:-1;;22198:170;22377:386;;22537:67;22601:2;22596:3;22537:67;;;22637:34;22617:55;;-1:-1;;;22701:2;22692:12;;22685:41;22754:2;22745:12;;22523:240;-1:-1;;22523:240;22772:319;;22932:67;22996:2;22991:3;22932:67;;;-1:-1;;;23012:42;;23082:2;23073:12;;22918:173;-1:-1;;22918:173;23100:399;;23260:67;23324:2;23319:3;23260:67;;;23360:34;23340:55;;23429:32;23424:2;23415:12;;23408:54;23490:2;23481:12;;23246:253;-1:-1;;23246:253;23508:380;;23668:67;23732:2;23727:3;23668:67;;;23768:34;23748:55;;-1:-1;;;23832:2;23823:12;;23816:35;23879:2;23870:12;;23654:234;-1:-1;;23654:234;23897:396;;24057:67;24121:2;24116:3;24057:67;;;24157:34;24137:55;;24226:29;24221:2;24212:12;;24205:51;24284:2;24275:12;;24043:250;-1:-1;;24043:250;24302:323;;24462:67;24526:2;24521:3;24462:67;;;24562:25;24542:46;;24616:2;24607:12;;24448:177;-1:-1;;24448:177;24634:332;;24794:67;24858:2;24853:3;24794:67;;;24894:34;24874:55;;24957:2;24948:12;;24780:186;-1:-1;;24780:186;24975:320;;25135:67;25199:2;25194:3;25135:67;;;-1:-1;;;25215:43;;25286:2;25277:12;;25121:174;-1:-1;;25121:174;25304:383;;25464:67;25528:2;25523:3;25464:67;;;25564:34;25544:55;;-1:-1;;;25628:2;25619:12;;25612:38;25678:2;25669:12;;25450:237;-1:-1;;25450:237;25696:332;;25856:67;25920:2;25915:3;25856:67;;;25956:34;25936:55;;26019:2;26010:12;;25842:186;-1:-1;;25842:186;26037:327;;26197:67;26261:2;26256:3;26197:67;;;26297:29;26277:50;;26355:2;26346:12;;26183:181;-1:-1;;26183:181;26373:377;;26533:67;26597:2;26592:3;26533:67;;;26633:34;26613:55;;-1:-1;;;26697:2;26688:12;;26681:32;26741:2;26732:12;;26519:231;-1:-1;;26519:231;26759:382;;26919:67;26983:2;26978:3;26919:67;;;27019:34;26999:55;;-1:-1;;;27083:2;27074:12;;27067:37;27132:2;27123:12;;26905:236;-1:-1;;26905:236;27150:330;;27310:67;27374:2;27369:3;27310:67;;;27410:32;27390:53;;27471:2;27462:12;;27296:184;-1:-1;;27296:184;27489:332;;27649:67;27713:2;27708:3;27649:67;;;27749:34;27729:55;;27812:2;27803:12;;27635:186;-1:-1;;27635:186;27830:393;;27990:67;28054:2;28049:3;27990:67;;;28090:34;28070:55;;28159:26;28154:2;28145:12;;28138:48;28214:2;28205:12;;27976:247;-1:-1;;27976:247;28232:356;;28410:85;28492:2;28487:3;28410:85;;;-1:-1;;;28508:43;;28579:2;28570:12;;28396:192;-1:-1;;28396:192;28597:376;;28757:67;28821:2;28816:3;28757:67;;;28857:34;28837:55;;-1:-1;;;28921:2;28912:12;;28905:31;28964:2;28955:12;;28743:230;-1:-1;;28743:230;28982:323;;29142:67;29206:2;29201:3;29142:67;;;29242:25;29222:46;;29296:2;29287:12;;29128:177;-1:-1;;29128:177;29314:322;;29474:67;29538:2;29533:3;29474:67;;;-1:-1;;;29554:45;;29627:2;29618:12;;29460:176;-1:-1;;29460:176;29645:392;;29805:67;29869:2;29864:3;29805:67;;;29905:34;29885:55;;29974:25;29969:2;29960:12;;29953:47;30028:2;30019:12;;29791:246;-1:-1;;29791:246;30046:371;;30206:67;30270:2;30265:3;30206:67;;;30306:34;30286:55;;-1:-1;;;30370:2;30361:12;;30354:26;30408:2;30399:12;;30192:225;-1:-1;;30192:225;30426:393;;30586:67;30650:2;30645:3;30586:67;;;30686:34;30666:55;;30755:26;30750:2;30741:12;;30734:48;30810:2;30801:12;;30572:247;-1:-1;;30572:247;30828:320;;30988:67;31052:2;31047:3;30988:67;;;-1:-1;;;31068:43;;31139:2;31130:12;;30974:174;-1:-1;;30974:174;31157:441;;31317:67;31381:2;31376:3;31317:67;;;31417:34;31397:55;;31486:34;31481:2;31472:12;;31465:56;-1:-1;;;31550:2;31541:12;;31534:27;31589:2;31580:12;;31303:295;-1:-1;;31303:295;31607:332;;31767:67;31831:2;31826:3;31767:67;;;31867:34;31847:55;;31930:2;31921:12;;31753:186;-1:-1;;31753:186;31948:371;;32108:67;32172:2;32167:3;32108:67;;;32208:34;32188:55;;-1:-1;;;32272:2;32263:12;;32256:26;32310:2;32301:12;;32094:225;-1:-1;;32094:225;32328:323;;32488:67;32552:2;32547:3;32488:67;;;32588:25;32568:46;;32642:2;32633:12;;32474:177;-1:-1;;32474:177;32660:371;;32820:67;32884:2;32879:3;32820:67;;;32920:34;32900:55;;-1:-1;;;32984:2;32975:12;;32968:26;33022:2;33013:12;;32806:225;-1:-1;;32806:225;33040:385;;33200:67;33264:2;33259:3;33200:67;;;33300:34;33280:55;;-1:-1;;;33364:2;33355:12;;33348:40;33416:2;33407:12;;33186:239;-1:-1;;33186:239;33434:371;;33594:67;33658:2;33653:3;33594:67;;;33694:34;33674:55;;-1:-1;;;33758:2;33749:12;;33742:26;33796:2;33787:12;;33580:225;-1:-1;;33580:225;33814:373;;33974:67;34038:2;34033:3;33974:67;;;34074:34;34054:55;;-1:-1;;;34138:2;34129:12;;34122:28;34178:2;34169:12;;33960:227;-1:-1;;33960:227;34196:379;;34356:67;34420:2;34415:3;34356:67;;;34456:34;34436:55;;-1:-1;;;34520:2;34511:12;;34504:34;34566:2;34557:12;;34342:233;-1:-1;;34342:233;34583:124;34665:36;34695:5;34665:36;;34714:110;34795:23;34812:5;34795:23;;34831:110;34912:23;34929:5;34912:23;;34948:107;35027:22;35043:5;35027:22;;35062:401;;35227:75;35298:3;35289:6;35227:75;;;35324:2;35319:3;35315:12;35308:19;;35345:93;35434:3;35425:6;35345:93;;35470:517;;35643:73;35712:3;35703:6;35643:73;;;35738:1;35733:3;35729:11;35722:18;;35751:75;35822:3;35813:6;35751:75;;;35848:2;35843:3;35839:12;35832:19;;35862:75;35933:3;35924:6;35862:75;;;-1:-1;35959:2;35950:12;;35631:356;-1:-1;;;35631:356;35994:396;;36157:73;36226:3;36217:6;36157:73;;;36252:1;36247:3;36243:11;36236:18;;36272:93;36361:3;36352:6;36272:93;;36397:244;;36516:75;36587:3;36578:6;36516:75;;;-1:-1;36613:2;36604:12;;36504:137;-1:-1;36504:137;36648:396;;36811:73;36880:3;36871:6;36811:73;;;36906:1;36901:3;36897:11;36890:18;;36926:93;37015:3;37006:6;36926:93;;37051:254;;37191:89;37276:3;37267:6;37191:89;;37581:419;;37771:93;37860:3;37851:6;37771:93;;;37764:100;;37882:93;37971:3;37962:6;37882:93;;38007:1204;;38427:93;38516:3;38507:6;38427:93;;;38420:100;;38538:93;38627:3;38618:6;38538:93;;;38531:100;;38649:93;38738:3;38729:6;38649:93;;;38642:100;;38760:93;38849:3;38840:6;38760:93;;;38753:100;;38871:93;38960:3;38951:6;38871:93;;;38864:100;;38982:93;39071:3;39062:6;38982:93;;;38975:100;;39093:93;39182:3;39173:6;39093:93;;;39086:100;38408:803;-1:-1;;;;;;;;;38408:803;39218:529;;39463:93;39552:3;39543:6;39463:93;;;39456:100;;39574:148;39718:3;39574:148;;39754:213;39872:2;39857:18;;39886:71;39861:9;39930:6;39886:71;;39974:229;40100:2;40085:18;;40114:79;40089:9;40166:6;40114:79;;40210:201;40322:2;40307:18;;40336:65;40311:9;40374:6;40336:65;;40418:213;40536:2;40521:18;;40550:71;40525:9;40594:6;40550:71;;40638:539;40836:3;40821:19;;40851:71;40825:9;40895:6;40851:71;;;40933:68;40997:2;40986:9;40982:18;40973:6;40933:68;;;41012:72;41080:2;41069:9;41065:18;41056:6;41012:72;;;41095;41163:2;41152:9;41148:18;41139:6;41095:72;;41184:297;41320:2;41334:47;;;41305:18;;41395:76;41305:18;41457:6;41395:76;;41488:943;41788:3;41803:47;;;41773:19;;41864:76;41773:19;41926:6;41864:76;;;41856:84;;41951:80;42027:2;42016:9;42012:18;42003:6;41951:80;;;42042:70;42108:2;42097:9;42093:18;42084:6;42042:70;;;42160:9;42154:4;42150:20;42145:2;42134:9;42130:18;42123:48;42185:86;42266:4;42257:6;42249;42185:86;;;42177:94;;42320:9;42314:4;42310:20;42304:3;42293:9;42289:19;42282:49;42345:76;42416:4;42407:6;42345:76;;;42337:84;41759:672;-1:-1;;;;;;;;41759:672;42438:599;42646:2;42660:47;;;42631:18;;42721:76;42631:18;42783:6;42721:76;;;42713:84;;42845:9;42839:4;42835:20;42830:2;42819:9;42815:18;42808:48;42870:76;42941:4;42932:6;42870:76;;;42862:84;;42957:70;43023:2;43012:9;43008:18;42999:6;42957:70;;43352:407;43543:2;43557:47;;;43528:18;;43618:131;43528:18;43618:131;;43766:407;43957:2;43971:47;;;43942:18;;44032:131;43942:18;44032:131;;44180:407;44371:2;44385:47;;;44356:18;;44446:131;44356:18;44446:131;;44594:407;44785:2;44799:47;;;44770:18;;44860:131;44770:18;44860:131;;45008:407;45199:2;45213:47;;;45184:18;;45274:131;45184:18;45274:131;;45422:407;45613:2;45627:47;;;45598:18;;45688:131;45598:18;45688:131;;45836:407;46027:2;46041:47;;;46012:18;;46102:131;46012:18;46102:131;;46250:407;46441:2;46455:47;;;46426:18;;46516:131;46426:18;46516:131;;46664:407;46855:2;46869:47;;;46840:18;;46930:131;46840:18;46930:131;;47078:407;47269:2;47283:47;;;47254:18;;47344:131;47254:18;47344:131;;47492:407;47683:2;47697:47;;;47668:18;;47758:131;47668:18;47758:131;;47906:407;48097:2;48111:47;;;48082:18;;48172:131;48082:18;48172:131;;48320:407;48511:2;48525:47;;;48496:18;;48586:131;48496:18;48586:131;;48734:407;48925:2;48939:47;;;48910:18;;49000:131;48910:18;49000:131;;49148:407;49339:2;49353:47;;;49324:18;;49414:131;49324:18;49414:131;;49562:407;49753:2;49767:47;;;49738:18;;49828:131;49738:18;49828:131;;49976:407;50167:2;50181:47;;;50152:18;;50242:131;50152:18;50242:131;;50390:407;50581:2;50595:47;;;50566:18;;50656:131;50566:18;50656:131;;50804:407;50995:2;51009:47;;;50980:18;;51070:131;50980:18;51070:131;;51218:407;51409:2;51423:47;;;51394:18;;51484:131;51394:18;51484:131;;51632:407;51823:2;51837:47;;;51808:18;;51898:131;51808:18;51898:131;;52046:407;52237:2;52251:47;;;52222:18;;52312:131;52222:18;52312:131;;52460:407;52651:2;52665:47;;;52636:18;;52726:131;52636:18;52726:131;;52874:407;53065:2;53079:47;;;53050:18;;53140:131;53050:18;53140:131;;53288:407;53479:2;53493:47;;;53464:18;;53554:131;53464:18;53554:131;;53702:407;53893:2;53907:47;;;53878:18;;53968:131;53878:18;53968:131;;54116:407;54307:2;54321:47;;;54292:18;;54382:131;54292:18;54382:131;;54530:407;54721:2;54735:47;;;54706:18;;54796:131;54706:18;54796:131;;54944:407;55135:2;55149:47;;;55120:18;;55210:131;55120:18;55210:131;;55358:407;55549:2;55563:47;;;55534:18;;55624:131;55534:18;55624:131;;55772:407;55963:2;55977:47;;;55948:18;;56038:131;55948:18;56038:131;;56186:407;56377:2;56391:47;;;56362:18;;56452:131;56362:18;56452:131;;56600:407;56791:2;56805:47;;;56776:18;;56866:131;56776:18;56866:131;;57014:407;57205:2;57219:47;;;57190:18;;57280:131;57190:18;57280:131;;57428:407;57619:2;57633:47;;;57604:18;;57694:131;57604:18;57694:131;;57842:407;58033:2;58047:47;;;58018:18;;58108:131;58018:18;58108:131;;58256:407;58447:2;58461:47;;;58432:18;;58522:131;58432:18;58522:131;;58670:407;58861:2;58875:47;;;58846:18;;58936:131;58846:18;58936:131;;59084:407;59275:2;59289:47;;;59260:18;;59350:131;59260:18;59350:131;;59498:407;59689:2;59703:47;;;59674:18;;59764:131;59674:18;59764:131;;59912:407;60103:2;60117:47;;;60088:18;;60178:131;60088:18;60178:131;;60326:407;60517:2;60531:47;;;60502:18;;60592:131;60502:18;60592:131;;60740:407;60931:2;60945:47;;;60916:18;;61006:131;60916:18;61006:131;;61154:407;61345:2;61359:47;;;61330:18;;61420:131;61330:18;61420:131;;61568:407;61759:2;61773:47;;;61744:18;;61834:131;61744:18;61834:131;;61982:407;62173:2;62187:47;;;62158:18;;62248:131;62158:18;62248:131;;62396:407;62587:2;62601:47;;;62572:18;;62662:131;62572:18;62662:131;;62810:407;63001:2;63015:47;;;62986:18;;63076:131;62986:18;63076:131;;63224:407;63415:2;63429:47;;;63400:18;;63490:131;63400:18;63490:131;;63638:407;63829:2;63843:47;;;63814:18;;63904:131;63814:18;63904:131;;64052:209;64168:2;64153:18;;64182:69;64157:9;64224:6;64182:69;;64268:406;64431:2;64416:18;;64445:70;64420:9;64488:6;64445:70;;;64563:9;64557:4;64553:20;64548:2;64537:9;64533:18;64526:48;64588:76;64659:4;64650:6;64588:76;;64681:209;64797:2;64782:18;;64811:69;64786:9;64853:6;64811:69;;64897:320;65041:2;65026:18;;65055:69;65030:9;65097:6;65055:69;;;65135:72;65203:2;65192:9;65188:18;65179:6;65135:72;;65224:771;65466:3;65451:19;;65481:69;65455:9;65523:6;65481:69;;;65598:9;65592:4;65588:20;65583:2;65572:9;65568:18;65561:48;65623:72;65690:4;65681:6;65623:72;;;65615:80;;65743:9;65737:4;65733:20;65728:2;65717:9;65713:18;65706:48;65768:72;65835:4;65826:6;65768:72;;;65760:80;;65888:9;65882:4;65878:20;65873:2;65862:9;65858:18;65851:48;65913:72;65980:4;65971:6;65913:72;;;65905:80;65437:558;-1:-1;;;;;;65437:558;66002:256;66064:2;66058:9;66090:17;;;-1:-1;;;;;66150:34;;66186:22;;;66147:62;66144:2;;;66222:1;66219;66212:12;66144:2;66238;66231:22;66042:216;;-1:-1;66042:216;66265:304;;-1:-1;;;;;66416:6;66413:30;66410:2;;;66456:1;66453;66446:12;66410:2;-1:-1;66491:4;66479:17;;;66544:15;;66347:222;67204:317;;-1:-1;;;;;67335:6;67332:30;67329:2;;;67375:1;67372;67365:12;67329:2;-1:-1;67506:4;67442;67419:17;;;;-1:-1;;67415:33;67496:15;;67266:255;67856:117;67939:12;;67910:63;68238:162;68340:19;;;68389:4;68380:14;;68333:67;68887:91;;68949:24;68967:5;68949:24;;69091:85;69157:13;69150:21;;69133:43;69183:144;-1:-1;;;;;;69244:78;;69227:100;69334:72;69396:5;69379:27;69413:144;-1:-1;;;;;;69474:78;;69457:100;69564:121;-1:-1;;;;;69626:54;;69609:76;69771:88;69843:10;69832:22;;69815:44;69866:96;-1:-1;;;;;69927:30;;69910:52;69969:81;70040:4;70029:16;;70012:38;70057:129;;70144:37;70175:5;70193:121;70272:37;70303:5;70272:37;;70436:106;;70514:23;70531:5;70514:23;;70550:145;70631:6;70626:3;70621;70608:30;-1:-1;70687:1;70669:16;;70662:27;70601:94;70704:268;70769:1;70776:101;70790:6;70787:1;70784:13;70776:101;;;70857:11;;;70851:18;70838:11;;;70831:39;70812:2;70805:10;70776:101;;;70892:6;70889:1;70886:13;70883:2;;;70957:1;70948:6;70943:3;70939:16;70932:27;70883:2;70753:219;;;;;70980:95;;71044:26;71064:5;71323:89;71387:20;71401:5;71387:20;;71419:97;71507:2;71487:14;-1:-1;;71483:28;;71467:49;71524:94;71598:2;71594:14;;71566:52;71626:117;71695:24;71713:5;71695:24;;;71688:5;71685:35;71675:2;;71734:1;71731;71724:12;71890:111;71956:21;71971:5;71956:21;;72008:117;72077:24;72095:5;72077:24;;72256:115;72324:23;72341:5;72324:23;;72378:115;72446:23;72463:5;72446:23;

Swarm Source

bzzr://b95be34f8d27a791a7640ee656771bd241a4a5b83063cb97d397ae46fbcd0de6

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

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