ETH Price: $3,611.95 (-2.64%)

Token

ERC-20: Concave Presale Token (pCNV)
 

Overview

Max Total Supply

340,563.666666666666666651 pCNV

Holders

55

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
4,202.999999999999999999 pCNV

Value
$0.00
0x7287c2833d51b49af4ebcceec51c0635f14c72a7
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
pCNV

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-14
*/

// SPDX-License-Identifier: WTFPL
pragma solidity >=0.8.0;
/**

     ██████╗ ██████╗ ███╗   ██╗ ██████╗ █████╗ ██╗   ██╗██████╗ 
    ██╔════╝██╔═══██╗████╗  ██║██╔════╝██╔══██╗██║   ██║╚════██╗
    ██║     ██║   ██║██╔██╗ ██║██║     ███████║██║   ██║ █████╔╝
    ██║     ██║   ██║██║╚██╗██║██║     ██╔══██║╚██╗ ██╔╝ ╚═══██╗
    ╚██████╗╚██████╔╝██║ ╚████║╚██████╗██║  ██║ ╚████╔╝ ██████╔╝
     ╚═════╝ ╚═════╝ ╚═╝  ╚═══╝ ╚═════╝╚═╝  ╚═╝  ╚═══╝  ╚═════╝
    
    Concave Presale Token

    pCNV to CNV mechanics
    ---------------------
    The contract features two vesting schedules to redeem pCNV into CNV. Both
    schedules are linear, and have a duration of 2 years.

    The first vesting schedule determines how many pCNV a holder can redeem at
    any point in time. At contract inception - 0% of a holder's pCNV can be
    redeemed. At the end of 2 years, 100% of a holder's pCNV can be redeemed.
    It goes from 0% to 100% in a linear fashion.

    The second vesting schedule determines the percent of CNV supply that pCNV
    corresponds to. This vesting schedule also begins at 0% on day one, and
    advances linearly to reach 10% at the end of year two.

    The following is a breakdown of a pCNV to CNV redemption:

    Assumptions:
        - Alice holds 100 pCNV
        - pCNV total supply is 200
        - CNV total supply is 1000
        - 1 year has passed and Alice has not made any previous redemptions

    Then:
        - The first vesting schedule tells us that users may redeem 50% of their
          holdings, so Alice may redeem 50 pCNV.
        - The second vesting schedule tells us that pCNV total supply corresponds
          to 5% of total CNV supply.
        - Since total CNV supply is 1000, 5% of it is 50, so 50 CNV are what
          correspond to the 200 pCNV supply.
        - Alice has 50% of total pCNV supply
        - Thus, Alice is entitled to 50% of the claimable CNV supply, i.e Alice
          is entitled to 25 CNV

    Conclusion:
        - Alice burns 50 pCNV
        - Alice mints 25 CNV


    ---------------------
    @author 0xBarista & Dionysus (ConcaveFi)
*/

/* -------------------------------------------------------------------------- */
/*                                   IMPORTS                                  */
/* -------------------------------------------------------------------------- */


pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*///////////////////////////////////////////////////////////////
                                  EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*///////////////////////////////////////////////////////////////
                             METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*///////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*///////////////////////////////////////////////////////////////
                             EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    bytes32 public constant PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*///////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*///////////////////////////////////////////////////////////////
                              ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*///////////////////////////////////////////////////////////////
                              EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            bytes32 digest = keccak256(
                abi.encodePacked(
                    "\x19\x01",
                    DOMAIN_SEPARATOR(),
                    keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
                )
            );

            address recoveredAddress = ecrecover(digest, v, r, s);

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*///////////////////////////////////////////////////////////////
                       INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}


pragma solidity >=0.8.0;


/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @author Modified from Gnosis (https://github.com/gnosis/gp-v2-contracts/blob/main/src/contracts/libraries/GPv2SafeERC20.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
library SafeTransferLib {
    /*///////////////////////////////////////////////////////////////
                            ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool callStatus;

        assembly {
            // Transfer the ETH and store if it succeeded or not.
            callStatus := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(callStatus, "ETH_TRANSFER_FAILED");
    }

    /*///////////////////////////////////////////////////////////////
                           ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool callStatus;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "from" argument.
            mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 100 because the calldata length is 4 + 32 * 3.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool callStatus;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 68 because the calldata length is 4 + 32 * 2.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool callStatus;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 68 because the calldata length is 4 + 32 * 2.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "APPROVE_FAILED");
    }

    /*///////////////////////////////////////////////////////////////
                         INTERNAL HELPER LOGIC
    //////////////////////////////////////////////////////////////*/

    function didLastOptionalReturnCallSucceed(bool callStatus) private pure returns (bool success) {
        assembly {
            // Get how many bytes the call returned.
            let returnDataSize := returndatasize()

            // If the call reverted:
            if iszero(callStatus) {
                // Copy the revert message into memory.
                returndatacopy(0, 0, returnDataSize)

                // Revert with the same message.
                revert(0, returnDataSize)
            }

            switch returnDataSize
            case 32 {
                // Copy the return data into memory.
                returndatacopy(0, 0, returnDataSize)

                // Set success to whether it returned true.
                success := iszero(iszero(mload(0)))
            }
            case 0 {
                // There was no return data.
                success := 1
            }
            default {
                // It returned some malformed input.
                success := 0
            }
        }
    }
}


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}


pragma solidity >=0.8.0;

interface ICNV {
    function mint(address to, uint256 amount) external returns (uint256);

    function totalSupply() external view returns (uint256);
}


/// @notice Concave Presale Token
/// @author 0xBarista & Dionysus (ConcaveFi)
contract pCNV is ERC20("Concave Presale Token", "pCNV", 18) {

    /* ---------------------------------------------------------------------- */
    /*                                DEPENDENCIES                            */
    /* ---------------------------------------------------------------------- */

    using SafeTransferLib for ERC20;

    /* ---------------------------------------------------------------------- */
    /*                             IMMUTABLE STATE                            */
    /* ---------------------------------------------------------------------- */

    /// @notice UNIX timestamp when contact was created
    uint256 public immutable GENESIS = block.timestamp;

    /// @notice Two years in seconds
    uint256 public immutable TWO_YEARS = 63072000;

    /// @notice FRAX tokenIn address
    ERC20 public immutable FRAX = ERC20(0x853d955aCEf822Db058eb8505911ED77F175b99e);

    /// @notice DAI tokenIn address
    ERC20 public immutable DAI = ERC20(0x6B175474E89094C44Da98b954EedeAC495271d0F);

    /// @notice Error related to amount
    string constant AMOUNT_ERROR = "!AMOUNT";

    /// @notice Error related to token address
    string constant TOKEN_IN_ERROR = "!TOKEN_IN";

    /* ---------------------------------------------------------------------- */
    /*                              MUTABLE STATE                             */
    /* ---------------------------------------------------------------------- */

    /// @notice CNV ERC20 token
    /// @dev will be address(0) until redeemable = true
    ICNV public CNV;

    /// @notice Address that is recipient of raised funds + access control
    address public treasury = 0x226e7AF139a0F34c6771DeB252F9988876ac1Ced;

    /// @notice Returns the current merkle root being used
    bytes32 public merkleRoot;

    /// @notice Returns an array of all merkle roots used
    bytes32[] public roots;

    /// @notice Returns the current pCNV price in DAI/FRAX
    uint256 public rate;

    /// @notice Returns the max supply of pCNV that is allowed to be minted (in total)
    uint256 public maxSupply = 33000000000000000000000000;

    /// @notice Returns the total amount of pCNV that has cumulatively been minted
    uint256 public totalMinted;

    /// @notice Returns if pCNV are redeemable for CNV
    bool public redeemable;

    /// @notice Returns whether transfers are paused
    bool public transfersPaused;

    /* ---------------------------------------------------------------------- */
    /*                              STRUCTURED STATE                          */
    /* ---------------------------------------------------------------------- */

    /// @notice Structure of Participant vesting storage
    struct Participant {
        uint256 purchased; // amount (in total) of pCNV that user has purchased
        uint256 redeemed;  // amount (in total) of pCNV that user has redeemed
    }

    /// @notice             maps an account to vesting storage
    /// address             - account to check
    /// returns Participant - Structured vesting storage
    mapping(address => Participant) public participants;

    /// @notice             amount of DAI/FRAX user has spent for a specific root
    /// bytes32             - merkle root
    /// address             - account to check
    /// returns uint256     - amount in DAI/FRAX (denominated in ether) spent purchasing pCNV
    mapping(bytes32 => mapping(address => uint256)) public spentAmounts;

    /* ---------------------------------------------------------------------- */
    /*                                  EVENTS                                */
    /* ---------------------------------------------------------------------- */

    /// @notice Emitted when treasury changes treasury address
    /// @param  treasury address of new treasury
    event TreasurySet(address treasury);

    /// @notice Emitted when redeemable is set to true and CNV address is set
    /// @param  CNV address of CNV token
    event RedeemableSet(address CNV);

    /// @notice             Emitted when a new round is set by treasury
    /// @param  merkleRoot  new merkle root
    /// @param  rate        new price of pCNV in DAI/FRAX
    event NewRound(bytes32 merkleRoot, uint256 rate);

    /// @notice             Emitted when maxSupply of pCNV is burned or minted to target
    /// @param  target      target to which to mint pCNV or burn if target = address(0)
    /// @param  amount      amount of pCNV minted to target or burned
    /// @param  maxSupply   new maxSupply
    event Managed(address target, uint256 amount, uint256 maxSupply);

    /// @notice                 Emitted when pCNV minted via "mint()" or "mintWithPermit"
    /// @param  depositedFrom   address from which DAI/FRAX was deposited
    /// @param  mintedTo        address to which pCNV were minted to
    /// @param  amount          amount of pCNV minted
    /// @param  deposited       amount of DAI/FRAX deposited
    /// @param  totalMinted     total amount of pCNV minted so far
    event Minted(
        address indexed depositedFrom,
        address indexed mintedTo,
        uint256 amount,
        uint256 deposited,
        uint256 totalMinted
    );

    /// @notice             Emitted when pCNV redeemed for CNV by callign "redeem()"
    /// @param  burnedFrom  address from which pCNV were burned
    /// @param  mintedTo    address to which CNV were minted to
    /// @param  burned      amount of pCNV burned
    /// @param  minted      amount of CNV minted
    event Redeemed(
        address indexed burnedFrom,
        address indexed mintedTo,
        uint256 burned,
        uint256 minted
    );

    /* ---------------------------------------------------------------------- */
    /*                                MODIFIERS                               */
    /* ---------------------------------------------------------------------- */

    /// @notice only allows Concave treasury
    modifier onlyConcave() {
        require(msg.sender == treasury, "!CONCAVE");
        _;
    }

    /* ---------------------------------------------------------------------- */
    /*                              ONLY CONCAVE                              */
    /* ---------------------------------------------------------------------- */

    /// @notice Set a new treasury address if treasury
    function setTreasury(
        address _treasury
    ) external onlyConcave {
        treasury = _treasury;

        emit TreasurySet(_treasury);
    }

    /// @notice         allow pCNV to be redeemed for CNV by setting redeemable as true and setting CNV address
    /// @param  _CNV    address of CNV
    function setRedeemable(
        address _CNV
    ) external onlyConcave {
        // Allow tokens to be redeemed for CNV
        redeemable = true;
        // Set CNV address so tokens can be minted
        CNV = ICNV(_CNV);

        emit RedeemableSet(_CNV);
    }

    /// @notice             Update merkle root and rate
    /// @param _merkleRoot  root of merkle tree
    /// @param _rate        price of pCNV in DAI/FRAX
    function setRound(
        bytes32 _merkleRoot,
        uint256 _rate
    ) external onlyConcave {
        require(_rate > 0, "!RATE");
        // push new root to array of all roots - for viewing
        roots.push(_merkleRoot);
        // update merkle root
        merkleRoot = _merkleRoot;
        // update rate
        rate = _rate;

        emit NewRound(merkleRoot,rate);
    }

    /// @notice         Reduce an "amount" of available supply of pCNV or mint it to "target"
    /// @param target   address to which to mint; if address(0), will burn
    /// @param amount   to reduce from max supply or mint to "target"
    function manage(
        address target,
        uint256 amount
    ) external onlyConcave {
        // declare new variable for totalMinted + amount (gas savings)
        uint256 newAmount;
        // if target is address 0, reduce supply
        if (target == address(0)) {
            // avoid subtracting into negatives
            require(amount <= maxSupply, AMOUNT_ERROR);
            // new maxSupply would be set to maxSupply minus amount
            newAmount = maxSupply - amount;
            // Make sure there's enough unminted supply to allow for supply reduction
            require(newAmount >= totalMinted, AMOUNT_ERROR);
            // Reduce max supply by "amount"
            maxSupply = newAmount;
            // end the function

            emit Managed(target, amount, maxSupply);
            return;
        }
        // new maxSupply would be set to totalMinted + amount
        newAmount = totalMinted + amount;
        // make sure total newAmount (totalMinted + amount) is less than or equal to maximum supply
        require(newAmount <= maxSupply, AMOUNT_ERROR);
        // set totalMinted to newAmount (totalMinted + amount)
        totalMinted = newAmount;
        // mint target amount
        _mint(target, amount);

        emit Managed(target, amount, maxSupply);
    }

    /// @notice         Allows Concave to pause transfers in the event of a bug
    /// @param paused   if transfers should be paused or not
    function setTransfersPaused(bool paused) external onlyConcave {
        transfersPaused = paused;
    }

    /* ---------------------------------------------------------------------- */
    /*                              PUBLIC LOGIC                              */
    /* ---------------------------------------------------------------------- */

    /// @notice               mint pCNV by providing merkle proof and depositing DAI/FRAX
    /// @param to             whitelisted address pCNV will be minted to
    /// @param tokenIn        address of tokenIn user wishes to deposit (DAI/FRAX)
    /// @param maxAmount      max amount of DAI/FRAX sender can deposit for pCNV, to verify merkle proof
    /// @param amountIn       amount of DAI/FRAX sender wishes to deposit for pCNV
    /// @param proof          merkle proof to prove "to" and "maxAmount" are in merkle tree
    function mint(
        address to,
        address tokenIn,
        uint256 maxAmount,
        uint256 amountIn,
        bytes32[] calldata proof
    ) external returns (uint256 amountOut) {
        return _purchase(msg.sender, to, tokenIn, maxAmount, amountIn, proof);
    }

    /// @notice               mint pCNV by providing merkle proof and depositing DAI; uses EIP-2612 permit to save a transaction
    /// @param to             whitelisted address pCNV will be minted to
    /// @param tokenIn        address of tokenIn user wishes to deposit (DAI)
    /// @param maxAmount      max amount of DAI sender can deposit for pCNV, to verify merkle proof
    /// @param amountIn       amount of DAI sender wishes to deposit for pCNV
    /// @param proof          merkle proof to prove "to" and "maxAmount" are in merkle tree
    /// @param permitDeadline EIP-2612 : time when permit is no longer valid
    /// @param v              EIP-2612 : part of EIP-2612 signature
    /// @param r              EIP-2612 : part of EIP-2612 signature
    /// @param s              EIP-2612 : part of EIP-2612 signature
    function mintWithPermit(
        address to,
        address tokenIn,
        uint256 maxAmount,
        uint256 amountIn,
        bytes32[] calldata proof,
        uint256 permitDeadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountOut) {
        // Make sure payment tokenIn is DAI
        require(tokenIn == address(DAI), TOKEN_IN_ERROR);
        // Approve tokens for spender - https://eips.ethereum.org/EIPS/eip-2612
        ERC20(tokenIn).permit(msg.sender, address(this), amountIn, permitDeadline, v, r, s);
        // allow sender to mint for "to"
        return _purchase(msg.sender, to, tokenIn, maxAmount, amountIn, proof);
    }

    /// @notice         transfer "amount" of tokens from msg.sender to "to"
    /// @dev            calls "_beforeTransfer" to update vesting storage for "from" and "to"
    /// @param to       address tokens are being sent to
    /// @param amount   number of tokens being transfered
    function transfer(
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        // update vesting storage for both users
        _beforeTransfer(msg.sender, to, amount);
        // default ERC20 transfer
        return super.transfer(to, amount);
    }

    /// @notice         transfer "amount" of tokens from "from" to "to"
    /// @dev            calls "_beforeTransfer" to update vesting storage for "from" and "to"
    /// @param from     address tokens are being transfered from
    /// @param to       address tokens are being sent to
    /// @param amount   number of tokens being transfered
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        // update vesting storage for both users
        _beforeTransfer(from, to, amount);
        // default ERC20 transfer
        return super.transferFrom(from, to, amount);
    }

    /// @notice         redeem pCNV for CNV
    /// @param to       address that will receive redeemed CNV
    /// @param amountIn amount of pCNV to redeem
    function redeem(
        address to,
        uint256 amountIn
    ) external {
        // Make sure pCNV is currently redeemable for CNV
        require(redeemable, "!REDEEMABLE");

        // Access participant storage
        Participant storage participant = participants[msg.sender];

        // Calculate CNV owed to sender for redeeming "amountIn"
        uint256 amountOut = redeemAmountOut(msg.sender, amountIn);

        // Increase participant.redeemed by amount being redeemed
        participant.redeemed += amountIn;

        // Burn users pCNV
        _burn(msg.sender, amountIn);

        // Mint user CNV
        CNV.mint(to, amountOut);

        emit Redeemed(msg.sender, to, amountIn, amountOut);
    }

    /* ---------------------------------------------------------------------- */
    /*                               PUBLIC VIEW                              */
    /* ---------------------------------------------------------------------- */

    /// @notice         Returns the amount of CNV a user will receive for redeeming `amountIn` of pCNV
    /// @param who      address that will receive redeemed CNV
    /// @param amountIn amount of pCNV
    function redeemAmountOut(address who, uint256 amountIn) public view returns (uint256) {
        // Make sure amountIn is less than participants maximum redeem amount in
        require(amountIn <= maxRedeemAmountIn(who), AMOUNT_ERROR);

        // Calculate percentage of maxRedeemAmountIn that participant is redeeming
        uint256 ratio = 1e18 * amountIn / maxRedeemAmountIn(who);

        // Calculate portion of maxRedeemAmountOut to mint using above percentage
        return maxRedeemAmountOut(who) * ratio / 1e18;
    }

    /// @notice     Returns amount of pCNV that user can redeem according to vesting schedule
    /// @dev        Returns redeem * percentageVested / (eth normalized) - total already redeemed
    /// @param who  address to check
    function maxRedeemAmountIn(
        address who
    ) public view returns (uint256) {
        // Make sure pCNV is currently redeemable for CNV
        if (!redeemable) return 0;
        // Make sure there's CNV supply
        if (CNV.totalSupply() == 0) return 0;
        // Access sender's participant memory
        Participant memory participant = participants[who];
        // return maximum amount of pCNV "who" can currently redeem
        return participant.purchased * purchaseVested() / 1e18 - participant.redeemed;
    }

    /// @notice     Returns amount of CNV that an account can currently redeem for
    /// @param who  address to check
    function maxRedeemAmountOut(
        address who
    ) public view returns (uint256) {
        return amountVested() * percentToRedeem(who) / 1e18;
    }

    /// @notice     Returns percentage (denominated in ether) of pCNV supply that a given account can currently redeem
    /// @param who  address to check
    function percentToRedeem(
        address who
    ) public view returns (uint256) {
        return 1e18 * maxRedeemAmountIn(who) / maxSupply;
    }

    /// @notice Returns the amount of time (in seconds) that has passed since the contract was created
    function elapsed() public view returns (uint256) {
        return block.timestamp - GENESIS;
    }

    /// @notice Returns the percentage of CNV supply (denominated in ether) that all pCNV is currently redeemable for
    function supplyVested() public view returns (uint256) {
        return elapsed() > TWO_YEARS ? 1e17 : 1e17 * elapsed() / TWO_YEARS;
    }

    /// @notice Returns the percent of pCNV that is redeemable
    function purchaseVested() public view returns (uint256) {
        return elapsed() > TWO_YEARS ? 1e18 : 1e18 * elapsed() / TWO_YEARS;
    }

    /// @notice Returns total amount of CNV supply that is vested
    function amountVested() public view returns (uint256) {
        return CNV.totalSupply() * supplyVested() / 1e18;
    }

    /* ---------------------------------------------------------------------- */
    /*                             INTERNAL LOGIC                             */
    /* ---------------------------------------------------------------------- */

    /// @notice               Deposits FRAX/DAI for pCNV if merkle proof exists in specified round
    /// @param sender         address sending transaction
    /// @param to             whitelisted address purchased pCNV will be sent to
    /// @param tokenIn        address of tokenIn user wishes to deposit
    /// @param maxAmount      max amount of DAI/FRAX sender can deposit for pCNV
    /// @param amountIn       amount of DAI/FRAX sender wishes to deposit for pCNV
    /// @param proof          merkle proof to prove address and amount are in tree
    function _purchase(
        address sender,
        address to,
        address tokenIn,
        uint256 maxAmount,
        uint256 amountIn,
        bytes32[] calldata proof
    ) internal returns(uint256 amountOut) {
        // Make sure payment tokenIn is either DAI or FRAX
        require(tokenIn == address(DAI) || tokenIn == address(FRAX), TOKEN_IN_ERROR);

        // Require merkle proof with `to` and `maxAmount` to be successfully verified
        require(MerkleProof.verify(proof, merkleRoot, keccak256(abi.encodePacked(to, maxAmount))), "!PROOF");

        // Verify amount claimed by user does not surpass "maxAmount"
        uint256 newAmount = spentAmounts[merkleRoot][to] + amountIn; // save gas
        require(newAmount <= maxAmount, AMOUNT_ERROR);
        spentAmounts[merkleRoot][to] = newAmount;

        // Calculate rate of pCNV that should be returned for "amountIn"
        amountOut = amountIn * 1e18 / rate;

        // make sure total minted + amount is less than or equal to maximum supply
        require(totalMinted + amountOut <= maxSupply, AMOUNT_ERROR);

        // Interface storage for participant
        Participant storage participant = participants[to];

        // Increase participant.purchased to account for newly purchased tokens
        participant.purchased += amountOut;

        // Increase totalMinted to account for newly minted supply
        totalMinted += amountOut;

        // Transfer amountIn*ratio of tokenIn to treasury address
        ERC20(tokenIn).safeTransferFrom(sender, treasury, amountIn);

        // Mint tokens to address after pulling
        _mint(to, amountOut);

        emit Minted(sender, to, amountOut, amountIn, totalMinted);
    }

    /// @notice         Maintains total amount of redeemable tokens when pCNV is being transfered
    /// @param from     address tokens are being transfered from
    /// @param to       address tokens are being sent to
    /// @param amount   number of tokens being transfered
    function _beforeTransfer(
        address from,
        address to,
        uint256 amount
    ) internal {
        // transfers must not be paused
        require(!transfersPaused, "PAUSED");

        // Interface "to" participant storage
        Participant storage toParticipant = participants[to];

        // Interface "from" participant storage
        Participant storage fromParticipant = participants[from];

        // calculate amount to adjust redeem amounts by
        uint256 adjustedAmount = amount * fromParticipant.redeemed / fromParticipant.purchased;

        // reduce "from" redeemed by amount * "from" redeem purchase ratio
        fromParticipant.redeemed -= adjustedAmount;

        // reduce "from" purchased amount by the amount being sent
        fromParticipant.purchased -= amount;

        // increase "to" redeemed by amount * "from" redeem purchase ratio
        toParticipant.redeemed += adjustedAmount;

        // increase "to" purchased by amount received
        toParticipant.purchased += amount;
    }

    /// @notice         Rescues accidentally sent tokens and ETH
    /// @param token    address of token to rescue, if address(0) rescue ETH
    function rescue(address token) external onlyConcave {
        if (token == address(0)) payable(treasury).transfer( address(this).balance );
        else ERC20(token).transfer(treasury, ERC20(token).balanceOf(address(this)));
    }
}

/**

    "someone spent a lot of computational power and time to bruteforce that contract address
    so basically to have that many leading zeros
    you can't just create a contract and get that, the odds are 1 in trillions to get something like that
    there's a way to guess which contract address you will get, using a script.. and you have to bruteforce for a very long time to get that many leading 0's
    fun fact, the more leading 0's a contract has, the cheaper gas will be for users to interact with the contract"
    
        - some solidity dev

    © 2022 WTFPL – Do What the Fuck You Want to Public License.
*/

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"Managed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"depositedFrom","type":"address"},{"indexed":true,"internalType":"address","name":"mintedTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"deposited","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalMinted","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"rate","type":"uint256"}],"name":"NewRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"CNV","type":"address"}],"name":"RedeemableSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"burnedFrom","type":"address"},{"indexed":true,"internalType":"address","name":"mintedTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"burned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minted","type":"uint256"}],"name":"Redeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasury","type":"address"}],"name":"TreasurySet","type":"event"},{"inputs":[],"name":"CNV","outputs":[{"internalType":"contract ICNV","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAI","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FRAX","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GENESIS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TWO_YEARS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountVested","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"elapsed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"manage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"maxRedeemAmountIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"maxRedeemAmountOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"permitDeadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"mintWithPermit","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"participants","outputs":[{"internalType":"uint256","name":"purchased","type":"uint256"},{"internalType":"uint256","name":"redeemed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"percentToRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"purchaseVested","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"redeemAmountOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redeemable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"roots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_CNV","type":"address"}],"name":"setRedeemable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"setRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"setTransfersPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"spentAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyVested","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transfersPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

6101606040524260e0908152506303c267006101009081525073853d955acef822db058eb8505911ed77f175b99e73ffffffffffffffffffffffffffffffffffffffff166101209073ffffffffffffffffffffffffffffffffffffffff16815250736b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff166101409073ffffffffffffffffffffffffffffffffffffffff1681525073226e7af139a0f34c6771deb252f9988876ac1ced600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506a1b4c0595a86aa1c1000000600b553480156200011957600080fd5b506040518060400160405280601581526020017f436f6e636176652050726573616c6520546f6b656e00000000000000000000008152506040518060400160405280600481526020017f70434e560000000000000000000000000000000000000000000000000000000081525060128260009080519060200190620001a092919062000280565b508160019080519060200190620001b992919062000280565b508060ff1660808160ff16815250504660a08181525050620001e0620001f060201b60201c565b60c0818152505050505062000531565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600060405162000224919062000440565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200162000265959493929190620004d4565b60405160208183030381529060405280519060200120905090565b8280546200028e906200035f565b90600052602060002090601f016020900481019282620002b25760008555620002fe565b82601f10620002cd57805160ff1916838001178555620002fe565b82800160010185558215620002fe579182015b82811115620002fd578251825591602001919060010190620002e0565b5b5090506200030d919062000311565b5090565b5b808211156200032c57600081600090555060010162000312565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200037857607f821691505b602082108114156200038f576200038e62000330565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154620003c4816200035f565b620003d0818662000395565b94506001821660008114620003ee5760018114620004005762000437565b60ff1983168652818601935062000437565b6200040b85620003a0565b60005b838110156200042f578154818901526001820191506020810190506200040e565b838801955050505b50505092915050565b60006200044e8284620003b5565b915081905092915050565b6000819050919050565b6200046e8162000459565b82525050565b6000819050919050565b620004898162000474565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620004bc826200048f565b9050919050565b620004ce81620004af565b82525050565b600060a082019050620004eb600083018862000463565b620004fa602083018762000463565b62000509604083018662000463565b6200051860608301856200047e565b620005276080830184620004c3565b9695505050505050565b60805160a05160c05160e05161010051610120516101405161425b620005c46000396000818161196701528181611f4c01526127fe015260008181611b7301526128530152600081816108cb015281816114430152818161147101528181611ac60152611af40152600081816112420152611b9701526000611323015260006112ef015260006112c9015261425b6000f3fe608060405234801561001057600080fd5b506004361061027f5760003560e01c8063500432de1161015c578063b0e4556f116100ce578063d5abeb0111610087578063d5abeb01146107f3578063dd62ed3e14610811578063e0bab4c414610841578063e1de7c801461085f578063f0f442601461087d578063f4b6c10b146108995761027f565b8063b0e4556f1461071d578063b7dec1b71461073b578063c2b40ae414610759578063c89380fd14610789578063d505accf146107b9578063d51a020b146107d55761027f565b8063839bacea11610120578063839bacea1461063357806395d89b411461066357806396fb8b10146106815780639b68c01a146106b1578063a2309ff8146106cf578063a9059cbb146106ed5761027f565b8063500432de1461057b57806361d027b31461059957806370a08231146105b75780637ecebe00146105e7578063839006f2146106175761027f565b80632c4e722e116101f557806330bbb032116101b957806330bbb032146104a5578063313ce567146104d55780633644e515146104f357806344e46dff146105115780634563f30a1461052d578063472598ac1461054b5761027f565b80632c4e722e1461040f5780632d7ecd111461042d5780632eb4a7ab1461044b5780632f29d8c51461046957806330adf81f146104875761027f565b80630cf5e156116102475780630cf5e1561461033d578063103a34721461035957806318160ddd146103895780631e9a6950146103a757806323b872dd146103c357806329175b59146103f35761027f565b806301edf6a01461028457806306fdde03146102a2578063095ea7b3146102c057806309e69ede146102f05780630b0eee3014610321575b600080fd5b61028c6108c9565b6040516102999190612fd5565b60405180910390f35b6102aa6108ed565b6040516102b79190613089565b60405180910390f35b6102da60048036038101906102d5919061313f565b61097b565b6040516102e7919061319a565b60405180910390f35b61030a600480360381019061030591906131b5565b610a6d565b6040516103189291906131e2565b60405180910390f35b61033b6004803603810190610336919061313f565b610a91565b005b61035760048036038101906103529190613241565b610d8f565b005b610373600480360381019061036e9190613281565b610eda565b6040516103809190612fd5565b60405180910390f35b610391610eff565b60405161039e9190612fd5565b60405180910390f35b6103c160048036038101906103bc919061313f565b610f05565b005b6103dd60048036038101906103d891906132c1565b6110d8565b6040516103ea919061319a565b60405180910390f35b61040d600480360381019061040891906131b5565b6110f9565b005b61041761121f565b6040516104249190612fd5565b60405180910390f35b610435611225565b604051610442919061319a565b60405180910390f35b610453611238565b6040516104609190613323565b60405180910390f35b61047161123e565b60405161047e9190612fd5565b60405180910390f35b61048f611271565b60405161049c9190613323565b60405180910390f35b6104bf60048036038101906104ba91906131b5565b611295565b6040516104cc9190612fd5565b60405180910390f35b6104dd6112c7565b6040516104ea919061335a565b60405180910390f35b6104fb6112eb565b6040516105089190613323565b60405180910390f35b61052b600480360381019061052691906133a1565b611348565b005b6105356113f5565b604051610542919061319a565b60405180910390f35b610565600480360381019061056091906131b5565b611408565b6040516105729190612fd5565b60405180910390f35b61058361143f565b6040516105909190612fd5565b60405180910390f35b6105a16114c9565b6040516105ae91906133dd565b60405180910390f35b6105d160048036038101906105cc91906131b5565b6114ef565b6040516105de9190612fd5565b60405180910390f35b61060160048036038101906105fc91906131b5565b611507565b60405161060e9190612fd5565b60405180910390f35b610631600480360381019061062c91906131b5565b61151f565b005b61064d600480360381019061064891906131b5565b611770565b60405161065a9190612fd5565b60405180910390f35b61066b6118d5565b6040516106789190613089565b60405180910390f35b61069b60048036038101906106969190613489565b611963565b6040516106a89190612fd5565b60405180910390f35b6106b9611ac2565b6040516106c69190612fd5565b60405180910390f35b6106d7611b4c565b6040516106e49190612fd5565b60405180910390f35b6107076004803603810190610702919061313f565b611b52565b604051610714919061319a565b60405180910390f35b610725611b71565b60405161073291906135d3565b60405180910390f35b610743611b95565b6040516107509190612fd5565b60405180910390f35b610773600480360381019061076e91906135ee565b611bb9565b6040516107809190613323565b60405180910390f35b6107a3600480360381019061079e919061361b565b611bdd565b6040516107b09190612fd5565b60405180910390f35b6107d360048036038101906107ce91906136b5565b611bfa565b005b6107dd611ef9565b6040516107ea9190613778565b60405180910390f35b6107fb611f1f565b6040516108089190612fd5565b60405180910390f35b61082b60048036038101906108269190613793565b611f25565b6040516108389190612fd5565b60405180910390f35b610849611f4a565b60405161085691906135d3565b60405180910390f35b610867611f6e565b6040516108749190612fd5565b60405180910390f35b610897600480360381019061089291906131b5565b61202b565b005b6108b360048036038101906108ae919061313f565b612136565b6040516108c09190612fd5565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b600080546108fa90613802565b80601f016020809104026020016040519081016040528092919081815260200182805461092690613802565b80156109735780601f1061094857610100808354040283529160200191610973565b820191906000526020600020905b81548152906001019060200180831161095657829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610a5b9190612fd5565b60405180910390a36001905092915050565b600e6020528060005260406000206000915090508060000154908060010154905082565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1890613880565b60405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cad57600b548211156040518060400160405280600781526020017f21414d4f554e540000000000000000000000000000000000000000000000000081525090610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb9190613089565b60405180910390fd5b5081600b54610be391906138cf565b9050600c548110156040518060400160405280600781526020017f21414d4f554e540000000000000000000000000000000000000000000000000081525090610c62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c599190613089565b60405180910390fd5b5080600b819055507fc5c33ab5e6467a87a001b77efc45aa27f6890b08565b99b7101becae3d82320e8383600b54604051610c9f93929190613903565b60405180910390a150610d8b565b81600c54610cbb919061393a565b9050600b548111156040518060400160405280600781526020017f21414d4f554e540000000000000000000000000000000000000000000000000081525090610d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d319190613089565b60405180910390fd5b5080600c81905550610d4c8383612217565b7fc5c33ab5e6467a87a001b77efc45aa27f6890b08565b99b7101becae3d82320e8383600b54604051610d8193929190613903565b60405180910390a1505b5050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1690613880565b60405180910390fd5b60008111610e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e59906139dc565b60405180910390fd5b60098290806001815401808255809150506001900390600052602060002001600090919091909150558160088190555080600a819055507fc9714d3f318877e8200732d0c1e80981c397cbde2518a4b32c68d9ba1eab3b50600854600a54604051610ece9291906139fc565b60405180910390a15050565b600f602052816000526040600020602052806000526040600020600091509150505481565b60025481565b600d60009054906101000a900460ff16610f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4b90613a71565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000610fa33384612136565b905082826001016000828254610fb9919061393a565b92505081905550610fca33846122e7565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1985836040518363ffffffff1660e01b8152600401611027929190613a91565b6020604051808303816000875af1158015611046573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106a9190613acf565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f5cdf07ad0fc222442720b108e3ed4c4640f0fadc2ab2253e66f259a0fea8348085846040516110ca9291906131e2565b60405180910390a350505050565b60006110e58484846123b7565b6110f0848484612524565b90509392505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118090613880565b60405180910390fd5b6001600d60006101000a81548160ff02191690831515021790555080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f08a70b59fdbd316124e15d456e01ec3de1649714455b3f77a6302bb3a3feb95e8160405161121491906133dd565b60405180910390a150565b600a5481565b600d60009054906101000a900460ff1681565b60085481565b60007f00000000000000000000000000000000000000000000000000000000000000004261126c91906138cf565b905090565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6000600b546112a383611770565b670de0b6b3a76400006112b69190613afc565b6112c09190613b85565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f000000000000000000000000000000000000000000000000000000000000000046146113215761131c61276e565b611343565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf90613880565b60405180910390fd5b80600d60016101000a81548160ff02191690831515021790555050565b600d60019054906101000a900460ff1681565b6000670de0b6b3a764000061141c83611295565b611424611f6e565b61142e9190613afc565b6114389190613b85565b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000061146a61123e565b116114ba577f000000000000000000000000000000000000000000000000000000000000000061149861123e565b67016345785d8a00006114ab9190613afc565b6114b59190613b85565b6114c4565b67016345785d8a00005b905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60036020528060005260406000206000915090505481565b60056020528060005260406000206000915090505481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a690613880565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561165257600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561164c573d6000803e3d6000fd5b5061176d565b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116ca91906133dd565b602060405180830381865afa1580156116e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170b9190613acf565b6040518363ffffffff1660e01b8152600401611728929190613a91565b6020604051808303816000875af1158015611747573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176b9190613bcb565b505b50565b6000600d60009054906101000a900460ff1661178f57600090506118d0565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118229190613acf565b141561183157600090506118d0565b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820154815260200160018201548152505090508060200151670de0b6b3a76400006118a9611ac2565b83600001516118b89190613afc565b6118c29190613b85565b6118cc91906138cf565b9150505b919050565b600180546118e290613802565b80601f016020809104026020016040519081016040528092919081815260200182805461190e90613802565b801561195b5780601f106119305761010080835404028352916020019161195b565b820191906000526020600020905b81548152906001019060200180831161193e57829003601f168201915b505050505081565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600981526020017f21544f4b454e5f494e000000000000000000000000000000000000000000000081525090611a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a229190613089565b60405180910390fd5b508973ffffffffffffffffffffffffffffffffffffffff1663d505accf33308b898989896040518863ffffffff1660e01b8152600401611a719796959493929190613bf8565b600060405180830381600087803b158015611a8b57600080fd5b505af1158015611a9f573d6000803e3d6000fd5b50505050611ab2338c8c8c8c8c8c6127fa565b90509a9950505050505050505050565b60007f0000000000000000000000000000000000000000000000000000000000000000611aed61123e565b11611b3d577f0000000000000000000000000000000000000000000000000000000000000000611b1b61123e565b670de0b6b3a7640000611b2e9190613afc565b611b389190613b85565b611b47565b670de0b6b3a76400005b905090565b600c5481565b6000611b5f3384846123b7565b611b698383612cf9565b905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60098181548110611bc957600080fd5b906000526020600020016000915090505481565b6000611bee338888888888886127fa565b90509695505050505050565b42841015611c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3490613cb3565b60405180910390fd5b6000611c476112eb565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9898989600560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558a604051602001611ccf96959493929190613cd3565b60405160208183030381529060405280519060200120604051602001611cf6929190613dac565b604051602081830303815290604052805190602001209050600060018286868660405160008152602001604052604051611d339493929190613de3565b6020604051602081039080840390855afa158015611d55573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015611dc957508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dff90613e74565b60405180910390fd5b86600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611ee89190612fd5565b60405180910390a350505050505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b6004602052816000526040600020602052806000526040600020600091509150505481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000670de0b6b3a7640000611f8161143f565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120129190613acf565b61201c9190613afc565b6120269190613b85565b905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b290613880565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f3c864541ef71378c6229510ed90f376565ee42d9c5e0904a984a9e863e6db44f8160405161212b91906133dd565b60405180910390a150565b600061214183611770565b8211156040518060400160405280600781526020017f21414d4f554e5400000000000000000000000000000000000000000000000000815250906121bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b29190613089565b60405180910390fd5b5060006121c784611770565b83670de0b6b3a76400006121db9190613afc565b6121e59190613b85565b9050670de0b6b3a7640000816121fa86611408565b6122049190613afc565b61220e9190613b85565b91505092915050565b8060026000828254612229919061393a565b9250508190555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516122db9190612fd5565b60405180910390a35050565b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461233691906138cf565b9250508190555080600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516123ab9190612fd5565b60405180910390a35050565b600d60019054906101000a900460ff1615612407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fe90613ee0565b60405180910390fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001548260010154856124a49190613afc565b6124ae9190613b85565b9050808260010160008282546124c491906138cf565b92505081905550838260000160008282546124df91906138cf565b92505081905550808360010160008282546124fa919061393a565b9250508190555083836000016000828254612515919061393a565b92505081905550505050505050565b600080600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461265a5782816125d991906138cf565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b82600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126a991906138cf565b9250508190555082600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161275a9190612fd5565b60405180910390a360019150509392505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516127a09190613f9f565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016127df959493929190613fb6565b60405160208183030381529060405280519060200120905090565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614806128a157507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b6040518060400160405280600981526020017f21544f4b454e5f494e000000000000000000000000000000000000000000000081525090612918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290f9190613089565b60405180910390fd5b5061298f838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506008548988604051602001612974929190614072565b60405160208183030381529060405280519060200120612e0d565b6129ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c5906140ea565b60405180910390fd5b600084600f6000600854815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a2e919061393a565b9050858111156040518060400160405280600781526020017f21414d4f554e540000000000000000000000000000000000000000000000000081525090612aab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa29190613089565b60405180910390fd5b5080600f6000600854815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600a54670de0b6b3a764000086612b1a9190613afc565b612b249190613b85565b9150600b5482600c54612b37919061393a565b11156040518060400160405280600781526020017f21414d4f554e540000000000000000000000000000000000000000000000000081525090612bb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba79190613089565b60405180910390fd5b506000600e60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905082816000016000828254612c08919061393a565b9250508190555082600c6000828254612c21919061393a565b92505081905550612c778a600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16888b73ffffffffffffffffffffffffffffffffffffffff16612e24909392919063ffffffff16565b612c818984612217565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f68c721f9a38584842eb66945b43c95066397ce5f2576fcc0588471c85d209d0c8589600c54604051612ce49392919061410a565b60405180910390a35050979650505050505050565b600081600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d4a91906138cf565b9250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612dfb9190612fd5565b60405180910390a36001905092915050565b600082612e1a8584612ee7565b1490509392505050565b60006040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015273ffffffffffffffffffffffffffffffffffffffff8416602482015282604482015260008060648360008a5af1915050612ea181612f5c565b612ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed79061418d565b60405180910390fd5b5050505050565b60008082905060005b8451811015612f51576000858281518110612f0e57612f0d6141ad565b5b60200260200101519050808311612f3057612f298382612fa5565b9250612f3d565b612f3a8184612fa5565b92505b508080612f49906141dc565b915050612ef0565b508091505092915050565b60003d82612f6e57806000803e806000fd5b8060208114612f885760008114612f995760009250612f9e565b816000803e60005115159250612f9e565b600192505b5050919050565b600082600052816020526040600020905092915050565b6000819050919050565b612fcf81612fbc565b82525050565b6000602082019050612fea6000830184612fc6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561302a57808201518184015260208101905061300f565b83811115613039576000848401525b50505050565b6000601f19601f8301169050919050565b600061305b82612ff0565b6130658185612ffb565b935061307581856020860161300c565b61307e8161303f565b840191505092915050565b600060208201905081810360008301526130a38184613050565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130e0826130b5565b9050919050565b6130f0816130d5565b81146130fb57600080fd5b50565b60008135905061310d816130e7565b92915050565b61311c81612fbc565b811461312757600080fd5b50565b60008135905061313981613113565b92915050565b60008060408385031215613156576131556130ab565b5b6000613164858286016130fe565b92505060206131758582860161312a565b9150509250929050565b60008115159050919050565b6131948161317f565b82525050565b60006020820190506131af600083018461318b565b92915050565b6000602082840312156131cb576131ca6130ab565b5b60006131d9848285016130fe565b91505092915050565b60006040820190506131f76000830185612fc6565b6132046020830184612fc6565b9392505050565b6000819050919050565b61321e8161320b565b811461322957600080fd5b50565b60008135905061323b81613215565b92915050565b60008060408385031215613258576132576130ab565b5b60006132668582860161322c565b92505060206132778582860161312a565b9150509250929050565b60008060408385031215613298576132976130ab565b5b60006132a68582860161322c565b92505060206132b7858286016130fe565b9150509250929050565b6000806000606084860312156132da576132d96130ab565b5b60006132e8868287016130fe565b93505060206132f9868287016130fe565b925050604061330a8682870161312a565b9150509250925092565b61331d8161320b565b82525050565b60006020820190506133386000830184613314565b92915050565b600060ff82169050919050565b6133548161333e565b82525050565b600060208201905061336f600083018461334b565b92915050565b61337e8161317f565b811461338957600080fd5b50565b60008135905061339b81613375565b92915050565b6000602082840312156133b7576133b66130ab565b5b60006133c58482850161338c565b91505092915050565b6133d7816130d5565b82525050565b60006020820190506133f260008301846133ce565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261341d5761341c6133f8565b5b8235905067ffffffffffffffff81111561343a576134396133fd565b5b60208301915083602082028301111561345657613455613402565b5b9250929050565b6134668161333e565b811461347157600080fd5b50565b6000813590506134838161345d565b92915050565b6000806000806000806000806000806101208b8d0312156134ad576134ac6130ab565b5b60006134bb8d828e016130fe565b9a505060206134cc8d828e016130fe565b99505060406134dd8d828e0161312a565b98505060606134ee8d828e0161312a565b97505060808b013567ffffffffffffffff81111561350f5761350e6130b0565b5b61351b8d828e01613407565b965096505060a061352e8d828e0161312a565b94505060c061353f8d828e01613474565b93505060e06135508d828e0161322c565b9250506101006135628d828e0161322c565b9150509295989b9194979a5092959850565b6000819050919050565b600061359961359461358f846130b5565b613574565b6130b5565b9050919050565b60006135ab8261357e565b9050919050565b60006135bd826135a0565b9050919050565b6135cd816135b2565b82525050565b60006020820190506135e860008301846135c4565b92915050565b600060208284031215613604576136036130ab565b5b60006136128482850161312a565b91505092915050565b60008060008060008060a08789031215613638576136376130ab565b5b600061364689828a016130fe565b965050602061365789828a016130fe565b955050604061366889828a0161312a565b945050606061367989828a0161312a565b935050608087013567ffffffffffffffff81111561369a576136996130b0565b5b6136a689828a01613407565b92509250509295509295509295565b600080600080600080600060e0888a0312156136d4576136d36130ab565b5b60006136e28a828b016130fe565b97505060206136f38a828b016130fe565b96505060406137048a828b0161312a565b95505060606137158a828b0161312a565b94505060806137268a828b01613474565b93505060a06137378a828b0161322c565b92505060c06137488a828b0161322c565b91505092959891949750929550565b6000613762826135a0565b9050919050565b61377281613757565b82525050565b600060208201905061378d6000830184613769565b92915050565b600080604083850312156137aa576137a96130ab565b5b60006137b8858286016130fe565b92505060206137c9858286016130fe565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061381a57607f821691505b6020821081141561382e5761382d6137d3565b5b50919050565b7f21434f4e43415645000000000000000000000000000000000000000000000000600082015250565b600061386a600883612ffb565b915061387582613834565b602082019050919050565b600060208201905081810360008301526138998161385d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138da82612fbc565b91506138e583612fbc565b9250828210156138f8576138f76138a0565b5b828203905092915050565b600060608201905061391860008301866133ce565b6139256020830185612fc6565b6139326040830184612fc6565b949350505050565b600061394582612fbc565b915061395083612fbc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613985576139846138a0565b5b828201905092915050565b7f2152415445000000000000000000000000000000000000000000000000000000600082015250565b60006139c6600583612ffb565b91506139d182613990565b602082019050919050565b600060208201905081810360008301526139f5816139b9565b9050919050565b6000604082019050613a116000830185613314565b613a1e6020830184612fc6565b9392505050565b7f2152454445454d41424c45000000000000000000000000000000000000000000600082015250565b6000613a5b600b83612ffb565b9150613a6682613a25565b602082019050919050565b60006020820190508181036000830152613a8a81613a4e565b9050919050565b6000604082019050613aa660008301856133ce565b613ab36020830184612fc6565b9392505050565b600081519050613ac981613113565b92915050565b600060208284031215613ae557613ae46130ab565b5b6000613af384828501613aba565b91505092915050565b6000613b0782612fbc565b9150613b1283612fbc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b4b57613b4a6138a0565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613b9082612fbc565b9150613b9b83612fbc565b925082613bab57613baa613b56565b5b828204905092915050565b600081519050613bc581613375565b92915050565b600060208284031215613be157613be06130ab565b5b6000613bef84828501613bb6565b91505092915050565b600060e082019050613c0d600083018a6133ce565b613c1a60208301896133ce565b613c276040830188612fc6565b613c346060830187612fc6565b613c41608083018661334b565b613c4e60a0830185613314565b613c5b60c0830184613314565b98975050505050505050565b7f5045524d49545f444541444c494e455f45585049524544000000000000000000600082015250565b6000613c9d601783612ffb565b9150613ca882613c67565b602082019050919050565b60006020820190508181036000830152613ccc81613c90565b9050919050565b600060c082019050613ce86000830189613314565b613cf560208301886133ce565b613d0260408301876133ce565b613d0f6060830186612fc6565b613d1c6080830185612fc6565b613d2960a0830184612fc6565b979650505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000613d75600283613d34565b9150613d8082613d3f565b600282019050919050565b6000819050919050565b613da6613da18261320b565b613d8b565b82525050565b6000613db782613d68565b9150613dc38285613d95565b602082019150613dd38284613d95565b6020820191508190509392505050565b6000608082019050613df86000830187613314565b613e05602083018661334b565b613e126040830185613314565b613e1f6060830184613314565b95945050505050565b7f494e56414c49445f5349474e4552000000000000000000000000000000000000600082015250565b6000613e5e600e83612ffb565b9150613e6982613e28565b602082019050919050565b60006020820190508181036000830152613e8d81613e51565b9050919050565b7f5041555345440000000000000000000000000000000000000000000000000000600082015250565b6000613eca600683612ffb565b9150613ed582613e94565b602082019050919050565b60006020820190508181036000830152613ef981613ebd565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154613f2d81613802565b613f378186613f00565b94506001821660008114613f525760018114613f6357613f96565b60ff19831686528186019350613f96565b613f6c85613f0b565b60005b83811015613f8e57815481890152600182019150602081019050613f6f565b838801955050505b50505092915050565b6000613fab8284613f20565b915081905092915050565b600060a082019050613fcb6000830188613314565b613fd86020830187613314565b613fe56040830186613314565b613ff26060830185612fc6565b613fff60808301846133ce565b9695505050505050565b60008160601b9050919050565b600061402182614009565b9050919050565b600061403382614016565b9050919050565b61404b614046826130d5565b614028565b82525050565b6000819050919050565b61406c61406782612fbc565b614051565b82525050565b600061407e828561403a565b60148201915061408e828461405b565b6020820191508190509392505050565b7f2150524f4f460000000000000000000000000000000000000000000000000000600082015250565b60006140d4600683612ffb565b91506140df8261409e565b602082019050919050565b60006020820190508181036000830152614103816140c7565b9050919050565b600060608201905061411f6000830186612fc6565b61412c6020830185612fc6565b6141396040830184612fc6565b949350505050565b7f5452414e534645525f46524f4d5f4641494c4544000000000000000000000000600082015250565b6000614177601483612ffb565b915061418282614141565b602082019050919050565b600060208201905081810360008301526141a68161416a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006141e782612fbc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561421a576142196138a0565b5b60018201905091905056fea2646970667358221220217a641487b29466e91201f217f80331f68cd4f02432c373946b117282bb64f264736f6c634300080b0033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061027f5760003560e01c8063500432de1161015c578063b0e4556f116100ce578063d5abeb0111610087578063d5abeb01146107f3578063dd62ed3e14610811578063e0bab4c414610841578063e1de7c801461085f578063f0f442601461087d578063f4b6c10b146108995761027f565b8063b0e4556f1461071d578063b7dec1b71461073b578063c2b40ae414610759578063c89380fd14610789578063d505accf146107b9578063d51a020b146107d55761027f565b8063839bacea11610120578063839bacea1461063357806395d89b411461066357806396fb8b10146106815780639b68c01a146106b1578063a2309ff8146106cf578063a9059cbb146106ed5761027f565b8063500432de1461057b57806361d027b31461059957806370a08231146105b75780637ecebe00146105e7578063839006f2146106175761027f565b80632c4e722e116101f557806330bbb032116101b957806330bbb032146104a5578063313ce567146104d55780633644e515146104f357806344e46dff146105115780634563f30a1461052d578063472598ac1461054b5761027f565b80632c4e722e1461040f5780632d7ecd111461042d5780632eb4a7ab1461044b5780632f29d8c51461046957806330adf81f146104875761027f565b80630cf5e156116102475780630cf5e1561461033d578063103a34721461035957806318160ddd146103895780631e9a6950146103a757806323b872dd146103c357806329175b59146103f35761027f565b806301edf6a01461028457806306fdde03146102a2578063095ea7b3146102c057806309e69ede146102f05780630b0eee3014610321575b600080fd5b61028c6108c9565b6040516102999190612fd5565b60405180910390f35b6102aa6108ed565b6040516102b79190613089565b60405180910390f35b6102da60048036038101906102d5919061313f565b61097b565b6040516102e7919061319a565b60405180910390f35b61030a600480360381019061030591906131b5565b610a6d565b6040516103189291906131e2565b60405180910390f35b61033b6004803603810190610336919061313f565b610a91565b005b61035760048036038101906103529190613241565b610d8f565b005b610373600480360381019061036e9190613281565b610eda565b6040516103809190612fd5565b60405180910390f35b610391610eff565b60405161039e9190612fd5565b60405180910390f35b6103c160048036038101906103bc919061313f565b610f05565b005b6103dd60048036038101906103d891906132c1565b6110d8565b6040516103ea919061319a565b60405180910390f35b61040d600480360381019061040891906131b5565b6110f9565b005b61041761121f565b6040516104249190612fd5565b60405180910390f35b610435611225565b604051610442919061319a565b60405180910390f35b610453611238565b6040516104609190613323565b60405180910390f35b61047161123e565b60405161047e9190612fd5565b60405180910390f35b61048f611271565b60405161049c9190613323565b60405180910390f35b6104bf60048036038101906104ba91906131b5565b611295565b6040516104cc9190612fd5565b60405180910390f35b6104dd6112c7565b6040516104ea919061335a565b60405180910390f35b6104fb6112eb565b6040516105089190613323565b60405180910390f35b61052b600480360381019061052691906133a1565b611348565b005b6105356113f5565b604051610542919061319a565b60405180910390f35b610565600480360381019061056091906131b5565b611408565b6040516105729190612fd5565b60405180910390f35b61058361143f565b6040516105909190612fd5565b60405180910390f35b6105a16114c9565b6040516105ae91906133dd565b60405180910390f35b6105d160048036038101906105cc91906131b5565b6114ef565b6040516105de9190612fd5565b60405180910390f35b61060160048036038101906105fc91906131b5565b611507565b60405161060e9190612fd5565b60405180910390f35b610631600480360381019061062c91906131b5565b61151f565b005b61064d600480360381019061064891906131b5565b611770565b60405161065a9190612fd5565b60405180910390f35b61066b6118d5565b6040516106789190613089565b60405180910390f35b61069b60048036038101906106969190613489565b611963565b6040516106a89190612fd5565b60405180910390f35b6106b9611ac2565b6040516106c69190612fd5565b60405180910390f35b6106d7611b4c565b6040516106e49190612fd5565b60405180910390f35b6107076004803603810190610702919061313f565b611b52565b604051610714919061319a565b60405180910390f35b610725611b71565b60405161073291906135d3565b60405180910390f35b610743611b95565b6040516107509190612fd5565b60405180910390f35b610773600480360381019061076e91906135ee565b611bb9565b6040516107809190613323565b60405180910390f35b6107a3600480360381019061079e919061361b565b611bdd565b6040516107b09190612fd5565b60405180910390f35b6107d360048036038101906107ce91906136b5565b611bfa565b005b6107dd611ef9565b6040516107ea9190613778565b60405180910390f35b6107fb611f1f565b6040516108089190612fd5565b60405180910390f35b61082b60048036038101906108269190613793565b611f25565b6040516108389190612fd5565b60405180910390f35b610849611f4a565b60405161085691906135d3565b60405180910390f35b610867611f6e565b6040516108749190612fd5565b60405180910390f35b610897600480360381019061089291906131b5565b61202b565b005b6108b360048036038101906108ae919061313f565b612136565b6040516108c09190612fd5565b60405180910390f35b7f0000000000000000000000000000000000000000000000000000000003c2670081565b600080546108fa90613802565b80601f016020809104026020016040519081016040528092919081815260200182805461092690613802565b80156109735780601f1061094857610100808354040283529160200191610973565b820191906000526020600020905b81548152906001019060200180831161095657829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610a5b9190612fd5565b60405180910390a36001905092915050565b600e6020528060005260406000206000915090508060000154908060010154905082565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1890613880565b60405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cad57600b548211156040518060400160405280600781526020017f21414d4f554e540000000000000000000000000000000000000000000000000081525090610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb9190613089565b60405180910390fd5b5081600b54610be391906138cf565b9050600c548110156040518060400160405280600781526020017f21414d4f554e540000000000000000000000000000000000000000000000000081525090610c62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c599190613089565b60405180910390fd5b5080600b819055507fc5c33ab5e6467a87a001b77efc45aa27f6890b08565b99b7101becae3d82320e8383600b54604051610c9f93929190613903565b60405180910390a150610d8b565b81600c54610cbb919061393a565b9050600b548111156040518060400160405280600781526020017f21414d4f554e540000000000000000000000000000000000000000000000000081525090610d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d319190613089565b60405180910390fd5b5080600c81905550610d4c8383612217565b7fc5c33ab5e6467a87a001b77efc45aa27f6890b08565b99b7101becae3d82320e8383600b54604051610d8193929190613903565b60405180910390a1505b5050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1690613880565b60405180910390fd5b60008111610e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e59906139dc565b60405180910390fd5b60098290806001815401808255809150506001900390600052602060002001600090919091909150558160088190555080600a819055507fc9714d3f318877e8200732d0c1e80981c397cbde2518a4b32c68d9ba1eab3b50600854600a54604051610ece9291906139fc565b60405180910390a15050565b600f602052816000526040600020602052806000526040600020600091509150505481565b60025481565b600d60009054906101000a900460ff16610f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4b90613a71565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000610fa33384612136565b905082826001016000828254610fb9919061393a565b92505081905550610fca33846122e7565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1985836040518363ffffffff1660e01b8152600401611027929190613a91565b6020604051808303816000875af1158015611046573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106a9190613acf565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f5cdf07ad0fc222442720b108e3ed4c4640f0fadc2ab2253e66f259a0fea8348085846040516110ca9291906131e2565b60405180910390a350505050565b60006110e58484846123b7565b6110f0848484612524565b90509392505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118090613880565b60405180910390fd5b6001600d60006101000a81548160ff02191690831515021790555080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f08a70b59fdbd316124e15d456e01ec3de1649714455b3f77a6302bb3a3feb95e8160405161121491906133dd565b60405180910390a150565b600a5481565b600d60009054906101000a900460ff1681565b60085481565b60007f0000000000000000000000000000000000000000000000000000000061e122544261126c91906138cf565b905090565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6000600b546112a383611770565b670de0b6b3a76400006112b69190613afc565b6112c09190613b85565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000001281565b60007f000000000000000000000000000000000000000000000000000000000000000146146113215761131c61276e565b611343565b7fb56ca4693fdb6ac6263e1072b2f3aeeb0cbb15df689937d45305506f01bc53cb5b905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf90613880565b60405180910390fd5b80600d60016101000a81548160ff02191690831515021790555050565b600d60019054906101000a900460ff1681565b6000670de0b6b3a764000061141c83611295565b611424611f6e565b61142e9190613afc565b6114389190613b85565b9050919050565b60007f0000000000000000000000000000000000000000000000000000000003c2670061146a61123e565b116114ba577f0000000000000000000000000000000000000000000000000000000003c2670061149861123e565b67016345785d8a00006114ab9190613afc565b6114b59190613b85565b6114c4565b67016345785d8a00005b905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60036020528060005260406000206000915090505481565b60056020528060005260406000206000915090505481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a690613880565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561165257600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561164c573d6000803e3d6000fd5b5061176d565b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116ca91906133dd565b602060405180830381865afa1580156116e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170b9190613acf565b6040518363ffffffff1660e01b8152600401611728929190613a91565b6020604051808303816000875af1158015611747573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176b9190613bcb565b505b50565b6000600d60009054906101000a900460ff1661178f57600090506118d0565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118229190613acf565b141561183157600090506118d0565b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820154815260200160018201548152505090508060200151670de0b6b3a76400006118a9611ac2565b83600001516118b89190613afc565b6118c29190613b85565b6118cc91906138cf565b9150505b919050565b600180546118e290613802565b80601f016020809104026020016040519081016040528092919081815260200182805461190e90613802565b801561195b5780601f106119305761010080835404028352916020019161195b565b820191906000526020600020905b81548152906001019060200180831161193e57829003601f168201915b505050505081565b60007f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600981526020017f21544f4b454e5f494e000000000000000000000000000000000000000000000081525090611a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a229190613089565b60405180910390fd5b508973ffffffffffffffffffffffffffffffffffffffff1663d505accf33308b898989896040518863ffffffff1660e01b8152600401611a719796959493929190613bf8565b600060405180830381600087803b158015611a8b57600080fd5b505af1158015611a9f573d6000803e3d6000fd5b50505050611ab2338c8c8c8c8c8c6127fa565b90509a9950505050505050505050565b60007f0000000000000000000000000000000000000000000000000000000003c26700611aed61123e565b11611b3d577f0000000000000000000000000000000000000000000000000000000003c26700611b1b61123e565b670de0b6b3a7640000611b2e9190613afc565b611b389190613b85565b611b47565b670de0b6b3a76400005b905090565b600c5481565b6000611b5f3384846123b7565b611b698383612cf9565b905092915050565b7f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e81565b7f0000000000000000000000000000000000000000000000000000000061e1225481565b60098181548110611bc957600080fd5b906000526020600020016000915090505481565b6000611bee338888888888886127fa565b90509695505050505050565b42841015611c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3490613cb3565b60405180910390fd5b6000611c476112eb565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9898989600560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558a604051602001611ccf96959493929190613cd3565b60405160208183030381529060405280519060200120604051602001611cf6929190613dac565b604051602081830303815290604052805190602001209050600060018286868660405160008152602001604052604051611d339493929190613de3565b6020604051602081039080840390855afa158015611d55573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015611dc957508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dff90613e74565b60405180910390fd5b86600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611ee89190612fd5565b60405180910390a350505050505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b6004602052816000526040600020602052806000526040600020600091509150505481565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f81565b6000670de0b6b3a7640000611f8161143f565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120129190613acf565b61201c9190613afc565b6120269190613b85565b905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b290613880565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f3c864541ef71378c6229510ed90f376565ee42d9c5e0904a984a9e863e6db44f8160405161212b91906133dd565b60405180910390a150565b600061214183611770565b8211156040518060400160405280600781526020017f21414d4f554e5400000000000000000000000000000000000000000000000000815250906121bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b29190613089565b60405180910390fd5b5060006121c784611770565b83670de0b6b3a76400006121db9190613afc565b6121e59190613b85565b9050670de0b6b3a7640000816121fa86611408565b6122049190613afc565b61220e9190613b85565b91505092915050565b8060026000828254612229919061393a565b9250508190555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516122db9190612fd5565b60405180910390a35050565b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461233691906138cf565b9250508190555080600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516123ab9190612fd5565b60405180910390a35050565b600d60019054906101000a900460ff1615612407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fe90613ee0565b60405180910390fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001548260010154856124a49190613afc565b6124ae9190613b85565b9050808260010160008282546124c491906138cf565b92505081905550838260000160008282546124df91906138cf565b92505081905550808360010160008282546124fa919061393a565b9250508190555083836000016000828254612515919061393a565b92505081905550505050505050565b600080600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461265a5782816125d991906138cf565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b82600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126a991906138cf565b9250508190555082600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161275a9190612fd5565b60405180910390a360019150509392505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516127a09190613f9f565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016127df959493929190613fb6565b60405160208183030381529060405280519060200120905090565b60007f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614806128a157507f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b6040518060400160405280600981526020017f21544f4b454e5f494e000000000000000000000000000000000000000000000081525090612918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290f9190613089565b60405180910390fd5b5061298f838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506008548988604051602001612974929190614072565b60405160208183030381529060405280519060200120612e0d565b6129ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c5906140ea565b60405180910390fd5b600084600f6000600854815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a2e919061393a565b9050858111156040518060400160405280600781526020017f21414d4f554e540000000000000000000000000000000000000000000000000081525090612aab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa29190613089565b60405180910390fd5b5080600f6000600854815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600a54670de0b6b3a764000086612b1a9190613afc565b612b249190613b85565b9150600b5482600c54612b37919061393a565b11156040518060400160405280600781526020017f21414d4f554e540000000000000000000000000000000000000000000000000081525090612bb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba79190613089565b60405180910390fd5b506000600e60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905082816000016000828254612c08919061393a565b9250508190555082600c6000828254612c21919061393a565b92505081905550612c778a600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16888b73ffffffffffffffffffffffffffffffffffffffff16612e24909392919063ffffffff16565b612c818984612217565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f68c721f9a38584842eb66945b43c95066397ce5f2576fcc0588471c85d209d0c8589600c54604051612ce49392919061410a565b60405180910390a35050979650505050505050565b600081600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d4a91906138cf565b9250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612dfb9190612fd5565b60405180910390a36001905092915050565b600082612e1a8584612ee7565b1490509392505050565b60006040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015273ffffffffffffffffffffffffffffffffffffffff8416602482015282604482015260008060648360008a5af1915050612ea181612f5c565b612ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed79061418d565b60405180910390fd5b5050505050565b60008082905060005b8451811015612f51576000858281518110612f0e57612f0d6141ad565b5b60200260200101519050808311612f3057612f298382612fa5565b9250612f3d565b612f3a8184612fa5565b92505b508080612f49906141dc565b915050612ef0565b508091505092915050565b60003d82612f6e57806000803e806000fd5b8060208114612f885760008114612f995760009250612f9e565b816000803e60005115159250612f9e565b600192505b5050919050565b600082600052816020526040600020905092915050565b6000819050919050565b612fcf81612fbc565b82525050565b6000602082019050612fea6000830184612fc6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561302a57808201518184015260208101905061300f565b83811115613039576000848401525b50505050565b6000601f19601f8301169050919050565b600061305b82612ff0565b6130658185612ffb565b935061307581856020860161300c565b61307e8161303f565b840191505092915050565b600060208201905081810360008301526130a38184613050565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130e0826130b5565b9050919050565b6130f0816130d5565b81146130fb57600080fd5b50565b60008135905061310d816130e7565b92915050565b61311c81612fbc565b811461312757600080fd5b50565b60008135905061313981613113565b92915050565b60008060408385031215613156576131556130ab565b5b6000613164858286016130fe565b92505060206131758582860161312a565b9150509250929050565b60008115159050919050565b6131948161317f565b82525050565b60006020820190506131af600083018461318b565b92915050565b6000602082840312156131cb576131ca6130ab565b5b60006131d9848285016130fe565b91505092915050565b60006040820190506131f76000830185612fc6565b6132046020830184612fc6565b9392505050565b6000819050919050565b61321e8161320b565b811461322957600080fd5b50565b60008135905061323b81613215565b92915050565b60008060408385031215613258576132576130ab565b5b60006132668582860161322c565b92505060206132778582860161312a565b9150509250929050565b60008060408385031215613298576132976130ab565b5b60006132a68582860161322c565b92505060206132b7858286016130fe565b9150509250929050565b6000806000606084860312156132da576132d96130ab565b5b60006132e8868287016130fe565b93505060206132f9868287016130fe565b925050604061330a8682870161312a565b9150509250925092565b61331d8161320b565b82525050565b60006020820190506133386000830184613314565b92915050565b600060ff82169050919050565b6133548161333e565b82525050565b600060208201905061336f600083018461334b565b92915050565b61337e8161317f565b811461338957600080fd5b50565b60008135905061339b81613375565b92915050565b6000602082840312156133b7576133b66130ab565b5b60006133c58482850161338c565b91505092915050565b6133d7816130d5565b82525050565b60006020820190506133f260008301846133ce565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261341d5761341c6133f8565b5b8235905067ffffffffffffffff81111561343a576134396133fd565b5b60208301915083602082028301111561345657613455613402565b5b9250929050565b6134668161333e565b811461347157600080fd5b50565b6000813590506134838161345d565b92915050565b6000806000806000806000806000806101208b8d0312156134ad576134ac6130ab565b5b60006134bb8d828e016130fe565b9a505060206134cc8d828e016130fe565b99505060406134dd8d828e0161312a565b98505060606134ee8d828e0161312a565b97505060808b013567ffffffffffffffff81111561350f5761350e6130b0565b5b61351b8d828e01613407565b965096505060a061352e8d828e0161312a565b94505060c061353f8d828e01613474565b93505060e06135508d828e0161322c565b9250506101006135628d828e0161322c565b9150509295989b9194979a5092959850565b6000819050919050565b600061359961359461358f846130b5565b613574565b6130b5565b9050919050565b60006135ab8261357e565b9050919050565b60006135bd826135a0565b9050919050565b6135cd816135b2565b82525050565b60006020820190506135e860008301846135c4565b92915050565b600060208284031215613604576136036130ab565b5b60006136128482850161312a565b91505092915050565b60008060008060008060a08789031215613638576136376130ab565b5b600061364689828a016130fe565b965050602061365789828a016130fe565b955050604061366889828a0161312a565b945050606061367989828a0161312a565b935050608087013567ffffffffffffffff81111561369a576136996130b0565b5b6136a689828a01613407565b92509250509295509295509295565b600080600080600080600060e0888a0312156136d4576136d36130ab565b5b60006136e28a828b016130fe565b97505060206136f38a828b016130fe565b96505060406137048a828b0161312a565b95505060606137158a828b0161312a565b94505060806137268a828b01613474565b93505060a06137378a828b0161322c565b92505060c06137488a828b0161322c565b91505092959891949750929550565b6000613762826135a0565b9050919050565b61377281613757565b82525050565b600060208201905061378d6000830184613769565b92915050565b600080604083850312156137aa576137a96130ab565b5b60006137b8858286016130fe565b92505060206137c9858286016130fe565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061381a57607f821691505b6020821081141561382e5761382d6137d3565b5b50919050565b7f21434f4e43415645000000000000000000000000000000000000000000000000600082015250565b600061386a600883612ffb565b915061387582613834565b602082019050919050565b600060208201905081810360008301526138998161385d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138da82612fbc565b91506138e583612fbc565b9250828210156138f8576138f76138a0565b5b828203905092915050565b600060608201905061391860008301866133ce565b6139256020830185612fc6565b6139326040830184612fc6565b949350505050565b600061394582612fbc565b915061395083612fbc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613985576139846138a0565b5b828201905092915050565b7f2152415445000000000000000000000000000000000000000000000000000000600082015250565b60006139c6600583612ffb565b91506139d182613990565b602082019050919050565b600060208201905081810360008301526139f5816139b9565b9050919050565b6000604082019050613a116000830185613314565b613a1e6020830184612fc6565b9392505050565b7f2152454445454d41424c45000000000000000000000000000000000000000000600082015250565b6000613a5b600b83612ffb565b9150613a6682613a25565b602082019050919050565b60006020820190508181036000830152613a8a81613a4e565b9050919050565b6000604082019050613aa660008301856133ce565b613ab36020830184612fc6565b9392505050565b600081519050613ac981613113565b92915050565b600060208284031215613ae557613ae46130ab565b5b6000613af384828501613aba565b91505092915050565b6000613b0782612fbc565b9150613b1283612fbc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b4b57613b4a6138a0565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613b9082612fbc565b9150613b9b83612fbc565b925082613bab57613baa613b56565b5b828204905092915050565b600081519050613bc581613375565b92915050565b600060208284031215613be157613be06130ab565b5b6000613bef84828501613bb6565b91505092915050565b600060e082019050613c0d600083018a6133ce565b613c1a60208301896133ce565b613c276040830188612fc6565b613c346060830187612fc6565b613c41608083018661334b565b613c4e60a0830185613314565b613c5b60c0830184613314565b98975050505050505050565b7f5045524d49545f444541444c494e455f45585049524544000000000000000000600082015250565b6000613c9d601783612ffb565b9150613ca882613c67565b602082019050919050565b60006020820190508181036000830152613ccc81613c90565b9050919050565b600060c082019050613ce86000830189613314565b613cf560208301886133ce565b613d0260408301876133ce565b613d0f6060830186612fc6565b613d1c6080830185612fc6565b613d2960a0830184612fc6565b979650505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000613d75600283613d34565b9150613d8082613d3f565b600282019050919050565b6000819050919050565b613da6613da18261320b565b613d8b565b82525050565b6000613db782613d68565b9150613dc38285613d95565b602082019150613dd38284613d95565b6020820191508190509392505050565b6000608082019050613df86000830187613314565b613e05602083018661334b565b613e126040830185613314565b613e1f6060830184613314565b95945050505050565b7f494e56414c49445f5349474e4552000000000000000000000000000000000000600082015250565b6000613e5e600e83612ffb565b9150613e6982613e28565b602082019050919050565b60006020820190508181036000830152613e8d81613e51565b9050919050565b7f5041555345440000000000000000000000000000000000000000000000000000600082015250565b6000613eca600683612ffb565b9150613ed582613e94565b602082019050919050565b60006020820190508181036000830152613ef981613ebd565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154613f2d81613802565b613f378186613f00565b94506001821660008114613f525760018114613f6357613f96565b60ff19831686528186019350613f96565b613f6c85613f0b565b60005b83811015613f8e57815481890152600182019150602081019050613f6f565b838801955050505b50505092915050565b6000613fab8284613f20565b915081905092915050565b600060a082019050613fcb6000830188613314565b613fd86020830187613314565b613fe56040830186613314565b613ff26060830185612fc6565b613fff60808301846133ce565b9695505050505050565b60008160601b9050919050565b600061402182614009565b9050919050565b600061403382614016565b9050919050565b61404b614046826130d5565b614028565b82525050565b6000819050919050565b61406c61406782612fbc565b614051565b82525050565b600061407e828561403a565b60148201915061408e828461405b565b6020820191508190509392505050565b7f2150524f4f460000000000000000000000000000000000000000000000000000600082015250565b60006140d4600683612ffb565b91506140df8261409e565b602082019050919050565b60006020820190508181036000830152614103816140c7565b9050919050565b600060608201905061411f6000830186612fc6565b61412c6020830185612fc6565b6141396040830184612fc6565b949350505050565b7f5452414e534645525f46524f4d5f4641494c4544000000000000000000000000600082015250565b6000614177601483612ffb565b915061418282614141565b602082019050919050565b600060208201905081810360008301526141a68161416a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006141e782612fbc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561421a576142196138a0565b5b60018201905091905056fea2646970667358221220217a641487b29466e91201f217f80331f68cd4f02432c373946b117282bb64f264736f6c634300080b0033

Deployed Bytecode Sourcemap

18107:21920:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18866:45;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4017:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5653:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21266:51;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;26026:1337;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25378:398;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21595:67;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4301:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31692:743;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31197:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24935:274;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20120:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20473:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19936:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34935:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4652:146;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34672:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4073:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8111:179;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27514:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20558:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34349:157;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35162:139;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19799:68;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4336:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4919:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39791:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33677:542;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4044:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29539:705;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35373:141;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20382:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30541:297;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18958:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18769:50;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20029:22;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28407:283;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7080:1023;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19699:15;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20236:53;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4389:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19083:78;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35589:121;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24618:156;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32899:538;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18866:45;;;:::o;4017:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5653:217::-;5727:4;5777:6;5744:9;:21;5754:10;5744:21;;;;;;;;;;;;;;;:30;5766:7;5744:30;;;;;;;;;;;;;;;:39;;;;5822:7;5801:37;;5810:10;5801:37;;;5831:6;5801:37;;;;;;:::i;:::-;;;;;;;;5858:4;5851:11;;5653:217;;;;:::o;21266:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26026:1337::-;24265:8;;;;;;;;;;;24251:22;;:10;:22;;;24243:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;26203:17:::1;26303:1:::0;26285:20:::1;;:6;:20;;;26281:599;;;26389:9;;26379:6;:19;;26400:12;;;;;;;;;;;;;;;;::::0;26371:42:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26521:6;26509:9;;:18;;;;:::i;:::-;26497:30;;26650:11;;26637:9;:24;;26663:12;;;;;;;;;;;;;;;;::::0;26629:47:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26749:9;26737;:21;;;;26813:34;26821:6;26829;26837:9;;26813:34;;;;;;;;:::i;:::-;;;;;;;;26862:7;;;26281:599;26979:6;26965:11;;:20;;;;:::i;:::-;26953:32;;27118:9;;27105;:22;;27129:12;;;;;;;;;;;;;;;;::::0;27097:45:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;27231:9;27217:11;:23;;;;27282:21;27288:6;27296;27282:5;:21::i;:::-;27321:34;27329:6;27337;27345:9;;27321:34;;;;;;;;:::i;:::-;;;;;;;;26120:1243;24297:1;26026:1337:::0;;:::o;25378:398::-;24265:8;;;;;;;;;;;24251:22;;:10;:22;;;24243:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;25505:1:::1;25497:5;:9;25489:27;;;;;;;;;;;;:::i;:::-;;;;;;;;;25589:5;25600:11;25589:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25667:11;25654:10;:24;;;;25720:5;25713:4;:12;;;;25743:25;25752:10;;25763:4;;25743:25;;;;;;;:::i;:::-;;;;;;;;25378:398:::0;;:::o;21595:67::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4301:26::-;;;;:::o;31692:743::-;31850:10;;;;;;;;;;;31842:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;31928:31;31962:12;:24;31975:10;31962:24;;;;;;;;;;;;;;;31928:58;;32065:17;32085:37;32101:10;32113:8;32085:15;:37::i;:::-;32065:57;;32226:8;32202:11;:20;;;:32;;;;;;;:::i;:::-;;;;;;;;32275:27;32281:10;32293:8;32275:5;:27::i;:::-;32341:3;;;;;;;;;;;:8;;;32350:2;32354:9;32341:23;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32403:2;32382:45;;32391:10;32382:45;;;32407:8;32417:9;32382:45;;;;;;;:::i;:::-;;;;;;;;31772:663;;31692:743;;:::o;31197:328::-;31328:4;31395:33;31411:4;31417:2;31421:6;31395:15;:33::i;:::-;31481:36;31500:4;31506:2;31510:6;31481:18;:36::i;:::-;31474:43;;31197:328;;;;;:::o;24935:274::-;24265:8;;;;;;;;;;;24251:22;;:10;:22;;;24243:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;25081:4:::1;25068:10;;:17;;;;;;;;;;;;;;;;;;25159:4;25148:3;;:16;;;;;;;;;;;;;;;;;;25182:19;25196:4;25182:19;;;;;;:::i;:::-;;;;;;;;24935:274:::0;:::o;20120:19::-;;;;:::o;20473:22::-;;;;;;;;;;;;;:::o;19936:25::-;;;;:::o;34935:100::-;34975:7;35020;35002:15;:25;;;;:::i;:::-;34995:32;;34935:100;:::o;4652:146::-;4703:95;4652:146;:::o;34672:151::-;34747:7;34806:9;;34781:22;34799:3;34781:17;:22::i;:::-;34774:4;:29;;;;:::i;:::-;:41;;;;:::i;:::-;34767:48;;34672:151;;;:::o;4073:31::-;;;:::o;8111:179::-;8168:7;8212:16;8195:13;:33;:87;;8258:24;:22;:24::i;:::-;8195:87;;;8231:24;8195:87;8188:94;;8111:179;:::o;27514:105::-;24265:8;;;;;;;;;;;24251:22;;:10;:22;;;24243:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;27605:6:::1;27587:15;;:24;;;;;;;;;;;;;;;;;;27514:105:::0;:::o;20558:27::-;;;;;;;;;;;;;:::o;34349:157::-;34427:7;34494:4;34471:20;34487:3;34471:15;:20::i;:::-;34454:14;:12;:14::i;:::-;:37;;;;:::i;:::-;:44;;;;:::i;:::-;34447:51;;34349:157;;;:::o;35162:139::-;35207:7;35246:9;35234;:7;:9::i;:::-;:21;:59;;35284:9;35272;:7;:9::i;:::-;35265:4;:16;;;;:::i;:::-;:28;;;;:::i;:::-;35234:59;;;35258:4;35234:59;35227:66;;35162:139;:::o;19799:68::-;;;;;;;;;;;;;:::o;4336:44::-;;;;;;;;;;;;;;;;;:::o;4919:41::-;;;;;;;;;;;;;;;;;:::o;39791:233::-;24265:8;;;;;;;;;;;24251:22;;:10;:22;;;24243:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;39875:1:::1;39858:19;;:5;:19;;;39854:162;;;39887:8;;;;;;;;;;;39879:26;;:51;39907:21;39879:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;39854:162;;;39952:5;39946:21;;;39968:8;;;;;;;;;;;39984:5;39978:22;;;40009:4;39978:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39946:70;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39854:162;39791:233:::0;:::o;33677:542::-;33754:7;33838:10;;;;;;;;;;;33833:25;;33857:1;33850:8;;;;33833:25;33935:1;33914:3;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:22;33910:36;;;33945:1;33938:8;;;;33910:36;34004:30;34037:12;:17;34050:3;34037:17;;;;;;;;;;;;;;;34004:50;;;;;;;;;;;;;;;;;;;;;;;;;;;34191:11;:20;;;34184:4;34165:16;:14;:16::i;:::-;34141:11;:21;;;:40;;;;:::i;:::-;:47;;;;:::i;:::-;:70;;;;:::i;:::-;34134:77;;;33677:542;;;;:::o;4044:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29539:705::-;29816:17;29918:3;29899:23;;:7;:23;;;29924:14;;;;;;;;;;;;;;;;;29891:48;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;30037:7;30031:21;;;30053:10;30073:4;30080:8;30090:14;30106:1;30109;30112;30031:83;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30174:62;30184:10;30196:2;30200:7;30209:9;30220:8;30230:5;;30174:9;:62::i;:::-;30167:69;;29539:705;;;;;;;;;;;;:::o;35373:141::-;35420:7;35459:9;35447;:7;:9::i;:::-;:21;:59;;35497:9;35485;:7;:9::i;:::-;35478:4;:16;;;;:::i;:::-;:28;;;;:::i;:::-;35447:59;;;35471:4;35447:59;35440:66;;35373:141;:::o;20382:26::-;;;;:::o;30541:297::-;30645:4;30712:39;30728:10;30740:2;30744:6;30712:15;:39::i;:::-;30804:26;30819:2;30823:6;30804:14;:26::i;:::-;30797:33;;30541:297;;;;:::o;18958:79::-;;;:::o;18769:50::-;;;:::o;20029:22::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28407:283::-;28583:17;28620:62;28630:10;28642:2;28646:7;28655:9;28666:8;28676:5;;28620:9;:62::i;:::-;28613:69;;28407:283;;;;;;;;:::o;7080:1023::-;7308:15;7296:8;:27;;7288:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;7521:14;7638:18;:16;:18::i;:::-;4703:95;7717:5;7724:7;7733:5;7740:6;:13;7747:5;7740:13;;;;;;;;;;;;;;;;:15;;;;;;;;;;;;7757:8;7689:77;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7679:88;;;;;;7566:220;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7538:263;;;;;;7521:280;;7818:24;7845:26;7855:6;7863:1;7866;7869;7845:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7818:53;;7924:1;7896:30;;:16;:30;;;;:59;;;;;7950:5;7930:25;;:16;:25;;;7896:59;7888:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;8030:5;7991:9;:27;8001:16;7991:27;;;;;;;;;;;;;;;:36;8019:7;7991:36;;;;;;;;;;;;;;;:44;;;;7496:551;;8080:7;8064:31;;8073:5;8064:31;;;8089:5;8064:31;;;;;;:::i;:::-;;;;;;;;7080:1023;;;;;;;:::o;19699:15::-;;;;;;;;;;;;;:::o;20236:53::-;;;;:::o;4389:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19083:78::-;;;:::o;35589:121::-;35634:7;35698:4;35681:14;:12;:14::i;:::-;35661:3;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34;;;;:::i;:::-;:41;;;;:::i;:::-;35654:48;;35589:121;:::o;24618:156::-;24265:8;;;;;;;;;;;24251:22;;:10;:22;;;24243:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;24717:9:::1;24706:8;;:20;;;;;;;;;;;;;;;;;;24744:22;24756:9;24744:22;;;;;;:::i;:::-;;;;;;;;24618:156:::0;:::o;32899:538::-;32976:7;33098:22;33116:3;33098:17;:22::i;:::-;33086:8;:34;;33122:12;;;;;;;;;;;;;;;;;33078:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;33232:13;33266:22;33284:3;33266:17;:22::i;:::-;33255:8;33248:4;:15;;;;:::i;:::-;:40;;;;:::i;:::-;33232:56;;33425:4;33417:5;33391:23;33410:3;33391:18;:23::i;:::-;:31;;;;:::i;:::-;:38;;;;:::i;:::-;33384:45;;;32899:538;;;;:::o;8955:335::-;9041:6;9026:11;;:21;;;;;;;:::i;:::-;;;;;;;;9215:6;9198:9;:13;9208:2;9198:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;9271:2;9250:32;;9267:1;9250:32;;;9275:6;9250:32;;;;;;:::i;:::-;;;;;;;;8955:335;;:::o;9298:338::-;9390:6;9371:9;:15;9381:4;9371:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;9559:6;9544:11;;:21;;;;;;;;;;;9617:1;9594:34;;9603:4;9594:34;;;9621:6;9594:34;;;;;;:::i;:::-;;;;;;;;9298:338;;:::o;38571:1068::-;38742:15;;;;;;;;;;;38741:16;38733:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;38828:33;38864:12;:16;38877:2;38864:16;;;;;;;;;;;;;;;38828:52;;38942:35;38980:12;:18;38993:4;38980:18;;;;;;;;;;;;;;;38942:56;;39068:22;39129:15;:25;;;39102:15;:24;;;39093:6;:33;;;;:::i;:::-;:61;;;;:::i;:::-;39068:86;;39271:14;39243:15;:24;;;:42;;;;;;;:::i;:::-;;;;;;;;39395:6;39366:15;:25;;;:35;;;;;;;:::i;:::-;;;;;;;;39516:14;39490:13;:22;;;:40;;;;;;;:::i;:::-;;;;;;;;39625:6;39598:13;:23;;;:33;;;;;;;:::i;:::-;;;;;;;;38681:958;;;38571:1068;;;:::o;6271:612::-;6393:4;6410:15;6428:9;:15;6438:4;6428:15;;;;;;;;;;;;;;;:27;6444:10;6428:27;;;;;;;;;;;;;;;;6410:45;;6519:17;6508:7;:28;6504:80;;6578:6;6568:7;:16;;;;:::i;:::-;6538:9;:15;6548:4;6538:15;;;;;;;;;;;;;;;:27;6554:10;6538:27;;;;;;;;;;;;;;;:46;;;;6504:80;6616:6;6597:9;:15;6607:4;6597:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;6790:6;6773:9;:13;6783:2;6773:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;6840:2;6825:26;;6834:4;6825:26;;;6844:6;6825:26;;;;;;:::i;:::-;;;;;;;;6871:4;6864:11;;;6271:612;;;;;:::o;8298:457::-;8363:7;8464:95;8598:4;8582:22;;;;;;:::i;:::-;;;;;;;;8627:14;8664:13;8708:4;8431:301;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8403:344;;;;;;8383:364;;8298:457;:::o;36530:1751::-;36735:17;36852:3;36833:23;;:7;:23;;;:51;;;;36879:4;36860:24;;:7;:24;;;36833:51;36886:14;;;;;;;;;;;;;;;;;36825:76;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;37009:81;37028:5;;37009:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37035:10;;37074:2;37078:9;37057:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37047:42;;;;;;37009:18;:81::i;:::-;37001:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;37185:17;37236:8;37205:12;:24;37218:10;;37205:24;;;;;;;;;;;:28;37230:2;37205:28;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;37185:59;;37288:9;37275;:22;;37299:12;;;;;;;;;;;;;;;;;37267:45;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;37354:9;37323:12;:24;37336:10;;37323:24;;;;;;;;;;;:28;37348:2;37323:28;;;;;;;;;;;;;;;:40;;;;37480:4;;37473;37462:8;:15;;;;:::i;:::-;:22;;;;:::i;:::-;37450:34;;37616:9;;37603;37589:11;;:23;;;;:::i;:::-;:36;;37627:12;;;;;;;;;;;;;;;;;37581:59;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;37699:31;37733:12;:16;37746:2;37733:16;;;;;;;;;;;;;;;37699:50;;37868:9;37843:11;:21;;;:34;;;;;;;:::i;:::-;;;;;;;;37973:9;37958:11;;:24;;;;;;;:::i;:::-;;;;;;;;38062:59;38094:6;38102:8;;;;;;;;;;;38112;38068:7;38062:31;;;;:59;;;;;;:::i;:::-;38183:20;38189:2;38193:9;38183:5;:20::i;:::-;38236:2;38221:52;;38228:6;38221:52;;;38240:9;38251:8;38261:11;;38221:52;;;;;;;;:::i;:::-;;;;;;;;36754:1527;;36530:1751;;;;;;;;;:::o;5878:385::-;5948:4;5990:6;5965:9;:21;5975:10;5965:21;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;6164:6;6147:9;:13;6157:2;6147:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;6220:2;6199:32;;6208:10;6199:32;;;6224:6;6199:32;;;;;;:::i;:::-;;;;;;;;6251:4;6244:11;;5878:385;;;;:::o;16367:190::-;16492:4;16545;16516:25;16529:5;16536:4;16516:12;:25::i;:::-;:33;16509:40;;16367:190;;;;;:::o;10866:1242::-;11010:15;11144:4;11138:11;11264:66;11245:17;11238:93;11426:42;11420:4;11416:53;11412:1;11393:17;11389:25;11382:88;11567:42;11563:2;11559:51;11554:2;11535:17;11531:26;11524:87;11698:6;11693:2;11674:17;11670:26;11663:42;11998:1;11995;11990:3;11971:17;11968:1;11961:5;11954;11949:51;11935:65;;11047:964;12031:44;12064:10;12031:32;:44::i;:::-;12023:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;10999:1109;10866:1242;;;;:::o;16919:675::-;17002:7;17022:20;17045:4;17022:27;;17065:9;17060:497;17084:5;:12;17080:1;:16;17060:497;;;17118:20;17141:5;17147:1;17141:8;;;;;;;;:::i;:::-;;;;;;;;17118:31;;17184:12;17168;:28;17164:382;;17311:42;17326:12;17340;17311:14;:42::i;:::-;17296:57;;17164:382;;;17488:42;17503:12;17517;17488:14;:42::i;:::-;17473:57;;17164:382;17103:454;17098:3;;;;;:::i;:::-;;;;17060:497;;;;17574:12;17567:19;;;16919:675;;;;:::o;14451:1072::-;14532:12;14657:16;14737:10;14727:244;;14846:14;14843:1;14840;14825:36;14941:14;14938:1;14931:25;14727:244;14994:14;15027:2;15022:248;;;;15289:1;15284:99;;;;15489:1;15478:12;;14987:518;;15022:248;15124:14;15121:1;15118;15103:36;15251:1;15245:8;15238:16;15231:24;15220:35;;15022:248;;15284:99;15367:1;15356:12;;14987:518;;14566:950;14451:1072;;;:::o;17602:224::-;17670:13;17733:1;17727:4;17720:15;17762:1;17756:4;17749:15;17803:4;17797;17787:21;17778:30;;17602:224;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:99::-;494:6;528:5;522:12;512:22;;442:99;;;:::o;547:169::-;631:11;665:6;660:3;653:19;705:4;700:3;696:14;681:29;;547:169;;;;:::o;722:307::-;790:1;800:113;814:6;811:1;808:13;800:113;;;899:1;894:3;890:11;884:18;880:1;875:3;871:11;864:39;836:2;833:1;829:10;824:15;;800:113;;;931:6;928:1;925:13;922:101;;;1011:1;1002:6;997:3;993:16;986:27;922:101;771:258;722:307;;;:::o;1035:102::-;1076:6;1127:2;1123:7;1118:2;1111:5;1107:14;1103:28;1093:38;;1035:102;;;:::o;1143:364::-;1231:3;1259:39;1292:5;1259:39;:::i;:::-;1314:71;1378:6;1373:3;1314:71;:::i;:::-;1307:78;;1394:52;1439:6;1434:3;1427:4;1420:5;1416:16;1394:52;:::i;:::-;1471:29;1493:6;1471:29;:::i;:::-;1466:3;1462:39;1455:46;;1235:272;1143:364;;;;:::o;1513:313::-;1626:4;1664:2;1653:9;1649:18;1641:26;;1713:9;1707:4;1703:20;1699:1;1688:9;1684:17;1677:47;1741:78;1814:4;1805:6;1741:78;:::i;:::-;1733:86;;1513:313;;;;:::o;1913:117::-;2022:1;2019;2012:12;2036:117;2145:1;2142;2135:12;2159:126;2196:7;2236:42;2229:5;2225:54;2214:65;;2159:126;;;:::o;2291:96::-;2328:7;2357:24;2375:5;2357:24;:::i;:::-;2346:35;;2291:96;;;:::o;2393:122::-;2466:24;2484:5;2466:24;:::i;:::-;2459:5;2456:35;2446:63;;2505:1;2502;2495:12;2446:63;2393:122;:::o;2521:139::-;2567:5;2605:6;2592:20;2583:29;;2621:33;2648:5;2621:33;:::i;:::-;2521:139;;;;:::o;2666:122::-;2739:24;2757:5;2739:24;:::i;:::-;2732:5;2729:35;2719:63;;2778:1;2775;2768:12;2719:63;2666:122;:::o;2794:139::-;2840:5;2878:6;2865:20;2856:29;;2894:33;2921:5;2894:33;:::i;:::-;2794:139;;;;:::o;2939:474::-;3007:6;3015;3064:2;3052:9;3043:7;3039:23;3035:32;3032:119;;;3070:79;;:::i;:::-;3032:119;3190:1;3215:53;3260:7;3251:6;3240:9;3236:22;3215:53;:::i;:::-;3205:63;;3161:117;3317:2;3343:53;3388:7;3379:6;3368:9;3364:22;3343:53;:::i;:::-;3333:63;;3288:118;2939:474;;;;;:::o;3419:90::-;3453:7;3496:5;3489:13;3482:21;3471:32;;3419:90;;;:::o;3515:109::-;3596:21;3611:5;3596:21;:::i;:::-;3591:3;3584:34;3515:109;;:::o;3630:210::-;3717:4;3755:2;3744:9;3740:18;3732:26;;3768:65;3830:1;3819:9;3815:17;3806:6;3768:65;:::i;:::-;3630:210;;;;:::o;3846:329::-;3905:6;3954:2;3942:9;3933:7;3929:23;3925:32;3922:119;;;3960:79;;:::i;:::-;3922:119;4080:1;4105:53;4150:7;4141:6;4130:9;4126:22;4105:53;:::i;:::-;4095:63;;4051:117;3846:329;;;;:::o;4181:332::-;4302:4;4340:2;4329:9;4325:18;4317:26;;4353:71;4421:1;4410:9;4406:17;4397:6;4353:71;:::i;:::-;4434:72;4502:2;4491:9;4487:18;4478:6;4434:72;:::i;:::-;4181:332;;;;;:::o;4519:77::-;4556:7;4585:5;4574:16;;4519:77;;;:::o;4602:122::-;4675:24;4693:5;4675:24;:::i;:::-;4668:5;4665:35;4655:63;;4714:1;4711;4704:12;4655:63;4602:122;:::o;4730:139::-;4776:5;4814:6;4801:20;4792:29;;4830:33;4857:5;4830:33;:::i;:::-;4730:139;;;;:::o;4875:474::-;4943:6;4951;5000:2;4988:9;4979:7;4975:23;4971:32;4968:119;;;5006:79;;:::i;:::-;4968:119;5126:1;5151:53;5196:7;5187:6;5176:9;5172:22;5151:53;:::i;:::-;5141:63;;5097:117;5253:2;5279:53;5324:7;5315:6;5304:9;5300:22;5279:53;:::i;:::-;5269:63;;5224:118;4875:474;;;;;:::o;5355:::-;5423:6;5431;5480:2;5468:9;5459:7;5455:23;5451:32;5448:119;;;5486:79;;:::i;:::-;5448:119;5606:1;5631:53;5676:7;5667:6;5656:9;5652:22;5631:53;:::i;:::-;5621:63;;5577:117;5733:2;5759:53;5804:7;5795:6;5784:9;5780:22;5759:53;:::i;:::-;5749:63;;5704:118;5355:474;;;;;:::o;5835:619::-;5912:6;5920;5928;5977:2;5965:9;5956:7;5952:23;5948:32;5945:119;;;5983:79;;:::i;:::-;5945:119;6103:1;6128:53;6173:7;6164:6;6153:9;6149:22;6128:53;:::i;:::-;6118:63;;6074:117;6230:2;6256:53;6301:7;6292:6;6281:9;6277:22;6256:53;:::i;:::-;6246:63;;6201:118;6358:2;6384:53;6429:7;6420:6;6409:9;6405:22;6384:53;:::i;:::-;6374:63;;6329:118;5835:619;;;;;:::o;6460:118::-;6547:24;6565:5;6547:24;:::i;:::-;6542:3;6535:37;6460:118;;:::o;6584:222::-;6677:4;6715:2;6704:9;6700:18;6692:26;;6728:71;6796:1;6785:9;6781:17;6772:6;6728:71;:::i;:::-;6584:222;;;;:::o;6812:86::-;6847:7;6887:4;6880:5;6876:16;6865:27;;6812:86;;;:::o;6904:112::-;6987:22;7003:5;6987:22;:::i;:::-;6982:3;6975:35;6904:112;;:::o;7022:214::-;7111:4;7149:2;7138:9;7134:18;7126:26;;7162:67;7226:1;7215:9;7211:17;7202:6;7162:67;:::i;:::-;7022:214;;;;:::o;7242:116::-;7312:21;7327:5;7312:21;:::i;:::-;7305:5;7302:32;7292:60;;7348:1;7345;7338:12;7292:60;7242:116;:::o;7364:133::-;7407:5;7445:6;7432:20;7423:29;;7461:30;7485:5;7461:30;:::i;:::-;7364:133;;;;:::o;7503:323::-;7559:6;7608:2;7596:9;7587:7;7583:23;7579:32;7576:119;;;7614:79;;:::i;:::-;7576:119;7734:1;7759:50;7801:7;7792:6;7781:9;7777:22;7759:50;:::i;:::-;7749:60;;7705:114;7503:323;;;;:::o;7832:118::-;7919:24;7937:5;7919:24;:::i;:::-;7914:3;7907:37;7832:118;;:::o;7956:222::-;8049:4;8087:2;8076:9;8072:18;8064:26;;8100:71;8168:1;8157:9;8153:17;8144:6;8100:71;:::i;:::-;7956:222;;;;:::o;8184:117::-;8293:1;8290;8283:12;8307:117;8416:1;8413;8406:12;8430:117;8539:1;8536;8529:12;8570:568;8643:8;8653:6;8703:3;8696:4;8688:6;8684:17;8680:27;8670:122;;8711:79;;:::i;:::-;8670:122;8824:6;8811:20;8801:30;;8854:18;8846:6;8843:30;8840:117;;;8876:79;;:::i;:::-;8840:117;8990:4;8982:6;8978:17;8966:29;;9044:3;9036:4;9028:6;9024:17;9014:8;9010:32;9007:41;9004:128;;;9051:79;;:::i;:::-;9004:128;8570:568;;;;;:::o;9144:118::-;9215:22;9231:5;9215:22;:::i;:::-;9208:5;9205:33;9195:61;;9252:1;9249;9242:12;9195:61;9144:118;:::o;9268:135::-;9312:5;9350:6;9337:20;9328:29;;9366:31;9391:5;9366:31;:::i;:::-;9268:135;;;;:::o;9409:1721::-;9565:6;9573;9581;9589;9597;9605;9613;9621;9629;9637;9686:3;9674:9;9665:7;9661:23;9657:33;9654:120;;;9693:79;;:::i;:::-;9654:120;9813:1;9838:53;9883:7;9874:6;9863:9;9859:22;9838:53;:::i;:::-;9828:63;;9784:117;9940:2;9966:53;10011:7;10002:6;9991:9;9987:22;9966:53;:::i;:::-;9956:63;;9911:118;10068:2;10094:53;10139:7;10130:6;10119:9;10115:22;10094:53;:::i;:::-;10084:63;;10039:118;10196:2;10222:53;10267:7;10258:6;10247:9;10243:22;10222:53;:::i;:::-;10212:63;;10167:118;10352:3;10341:9;10337:19;10324:33;10384:18;10376:6;10373:30;10370:117;;;10406:79;;:::i;:::-;10370:117;10519:80;10591:7;10582:6;10571:9;10567:22;10519:80;:::i;:::-;10501:98;;;;10295:314;10648:3;10675:53;10720:7;10711:6;10700:9;10696:22;10675:53;:::i;:::-;10665:63;;10619:119;10777:3;10804:51;10847:7;10838:6;10827:9;10823:22;10804:51;:::i;:::-;10794:61;;10748:117;10904:3;10931:53;10976:7;10967:6;10956:9;10952:22;10931:53;:::i;:::-;10921:63;;10875:119;11033:3;11060:53;11105:7;11096:6;11085:9;11081:22;11060:53;:::i;:::-;11050:63;;11004:119;9409:1721;;;;;;;;;;;;;:::o;11136:60::-;11164:3;11185:5;11178:12;;11136:60;;;:::o;11202:142::-;11252:9;11285:53;11303:34;11312:24;11330:5;11312:24;:::i;:::-;11303:34;:::i;:::-;11285:53;:::i;:::-;11272:66;;11202:142;;;:::o;11350:126::-;11400:9;11433:37;11464:5;11433:37;:::i;:::-;11420:50;;11350:126;;;:::o;11482:139::-;11545:9;11578:37;11609:5;11578:37;:::i;:::-;11565:50;;11482:139;;;:::o;11627:157::-;11727:50;11771:5;11727:50;:::i;:::-;11722:3;11715:63;11627:157;;:::o;11790:248::-;11896:4;11934:2;11923:9;11919:18;11911:26;;11947:84;12028:1;12017:9;12013:17;12004:6;11947:84;:::i;:::-;11790:248;;;;:::o;12044:329::-;12103:6;12152:2;12140:9;12131:7;12127:23;12123:32;12120:119;;;12158:79;;:::i;:::-;12120:119;12278:1;12303:53;12348:7;12339:6;12328:9;12324:22;12303:53;:::i;:::-;12293:63;;12249:117;12044:329;;;;:::o;12379:1141::-;12501:6;12509;12517;12525;12533;12541;12590:3;12578:9;12569:7;12565:23;12561:33;12558:120;;;12597:79;;:::i;:::-;12558:120;12717:1;12742:53;12787:7;12778:6;12767:9;12763:22;12742:53;:::i;:::-;12732:63;;12688:117;12844:2;12870:53;12915:7;12906:6;12895:9;12891:22;12870:53;:::i;:::-;12860:63;;12815:118;12972:2;12998:53;13043:7;13034:6;13023:9;13019:22;12998:53;:::i;:::-;12988:63;;12943:118;13100:2;13126:53;13171:7;13162:6;13151:9;13147:22;13126:53;:::i;:::-;13116:63;;13071:118;13256:3;13245:9;13241:19;13228:33;13288:18;13280:6;13277:30;13274:117;;;13310:79;;:::i;:::-;13274:117;13423:80;13495:7;13486:6;13475:9;13471:22;13423:80;:::i;:::-;13405:98;;;;13199:314;12379:1141;;;;;;;;:::o;13526:1199::-;13637:6;13645;13653;13661;13669;13677;13685;13734:3;13722:9;13713:7;13709:23;13705:33;13702:120;;;13741:79;;:::i;:::-;13702:120;13861:1;13886:53;13931:7;13922:6;13911:9;13907:22;13886:53;:::i;:::-;13876:63;;13832:117;13988:2;14014:53;14059:7;14050:6;14039:9;14035:22;14014:53;:::i;:::-;14004:63;;13959:118;14116:2;14142:53;14187:7;14178:6;14167:9;14163:22;14142:53;:::i;:::-;14132:63;;14087:118;14244:2;14270:53;14315:7;14306:6;14295:9;14291:22;14270:53;:::i;:::-;14260:63;;14215:118;14372:3;14399:51;14442:7;14433:6;14422:9;14418:22;14399:51;:::i;:::-;14389:61;;14343:117;14499:3;14526:53;14571:7;14562:6;14551:9;14547:22;14526:53;:::i;:::-;14516:63;;14470:119;14628:3;14655:53;14700:7;14691:6;14680:9;14676:22;14655:53;:::i;:::-;14645:63;;14599:119;13526:1199;;;;;;;;;;:::o;14731:138::-;14793:9;14826:37;14857:5;14826:37;:::i;:::-;14813:50;;14731:138;;;:::o;14875:155::-;14974:49;15017:5;14974:49;:::i;:::-;14969:3;14962:62;14875:155;;:::o;15036:246::-;15141:4;15179:2;15168:9;15164:18;15156:26;;15192:83;15272:1;15261:9;15257:17;15248:6;15192:83;:::i;:::-;15036:246;;;;:::o;15288:474::-;15356:6;15364;15413:2;15401:9;15392:7;15388:23;15384:32;15381:119;;;15419:79;;:::i;:::-;15381:119;15539:1;15564:53;15609:7;15600:6;15589:9;15585:22;15564:53;:::i;:::-;15554:63;;15510:117;15666:2;15692:53;15737:7;15728:6;15717:9;15713:22;15692:53;:::i;:::-;15682:63;;15637:118;15288:474;;;;;:::o;15768:180::-;15816:77;15813:1;15806:88;15913:4;15910:1;15903:15;15937:4;15934:1;15927:15;15954:320;15998:6;16035:1;16029:4;16025:12;16015:22;;16082:1;16076:4;16072:12;16103:18;16093:81;;16159:4;16151:6;16147:17;16137:27;;16093:81;16221:2;16213:6;16210:14;16190:18;16187:38;16184:84;;;16240:18;;:::i;:::-;16184:84;16005:269;15954:320;;;:::o;16280:158::-;16420:10;16416:1;16408:6;16404:14;16397:34;16280:158;:::o;16444:365::-;16586:3;16607:66;16671:1;16666:3;16607:66;:::i;:::-;16600:73;;16682:93;16771:3;16682:93;:::i;:::-;16800:2;16795:3;16791:12;16784:19;;16444:365;;;:::o;16815:419::-;16981:4;17019:2;17008:9;17004:18;16996:26;;17068:9;17062:4;17058:20;17054:1;17043:9;17039:17;17032:47;17096:131;17222:4;17096:131;:::i;:::-;17088:139;;16815:419;;;:::o;17240:180::-;17288:77;17285:1;17278:88;17385:4;17382:1;17375:15;17409:4;17406:1;17399:15;17426:191;17466:4;17486:20;17504:1;17486:20;:::i;:::-;17481:25;;17520:20;17538:1;17520:20;:::i;:::-;17515:25;;17559:1;17556;17553:8;17550:34;;;17564:18;;:::i;:::-;17550:34;17609:1;17606;17602:9;17594:17;;17426:191;;;;:::o;17623:442::-;17772:4;17810:2;17799:9;17795:18;17787:26;;17823:71;17891:1;17880:9;17876:17;17867:6;17823:71;:::i;:::-;17904:72;17972:2;17961:9;17957:18;17948:6;17904:72;:::i;:::-;17986;18054:2;18043:9;18039:18;18030:6;17986:72;:::i;:::-;17623:442;;;;;;:::o;18071:305::-;18111:3;18130:20;18148:1;18130:20;:::i;:::-;18125:25;;18164:20;18182:1;18164:20;:::i;:::-;18159:25;;18318:1;18250:66;18246:74;18243:1;18240:81;18237:107;;;18324:18;;:::i;:::-;18237:107;18368:1;18365;18361:9;18354:16;;18071:305;;;;:::o;18382:155::-;18522:7;18518:1;18510:6;18506:14;18499:31;18382:155;:::o;18543:365::-;18685:3;18706:66;18770:1;18765:3;18706:66;:::i;:::-;18699:73;;18781:93;18870:3;18781:93;:::i;:::-;18899:2;18894:3;18890:12;18883:19;;18543:365;;;:::o;18914:419::-;19080:4;19118:2;19107:9;19103:18;19095:26;;19167:9;19161:4;19157:20;19153:1;19142:9;19138:17;19131:47;19195:131;19321:4;19195:131;:::i;:::-;19187:139;;18914:419;;;:::o;19339:332::-;19460:4;19498:2;19487:9;19483:18;19475:26;;19511:71;19579:1;19568:9;19564:17;19555:6;19511:71;:::i;:::-;19592:72;19660:2;19649:9;19645:18;19636:6;19592:72;:::i;:::-;19339:332;;;;;:::o;19677:161::-;19817:13;19813:1;19805:6;19801:14;19794:37;19677:161;:::o;19844:366::-;19986:3;20007:67;20071:2;20066:3;20007:67;:::i;:::-;20000:74;;20083:93;20172:3;20083:93;:::i;:::-;20201:2;20196:3;20192:12;20185:19;;19844:366;;;:::o;20216:419::-;20382:4;20420:2;20409:9;20405:18;20397:26;;20469:9;20463:4;20459:20;20455:1;20444:9;20440:17;20433:47;20497:131;20623:4;20497:131;:::i;:::-;20489:139;;20216:419;;;:::o;20641:332::-;20762:4;20800:2;20789:9;20785:18;20777:26;;20813:71;20881:1;20870:9;20866:17;20857:6;20813:71;:::i;:::-;20894:72;20962:2;20951:9;20947:18;20938:6;20894:72;:::i;:::-;20641:332;;;;;:::o;20979:143::-;21036:5;21067:6;21061:13;21052:22;;21083:33;21110:5;21083:33;:::i;:::-;20979:143;;;;:::o;21128:351::-;21198:6;21247:2;21235:9;21226:7;21222:23;21218:32;21215:119;;;21253:79;;:::i;:::-;21215:119;21373:1;21398:64;21454:7;21445:6;21434:9;21430:22;21398:64;:::i;:::-;21388:74;;21344:128;21128:351;;;;:::o;21485:348::-;21525:7;21548:20;21566:1;21548:20;:::i;:::-;21543:25;;21582:20;21600:1;21582:20;:::i;:::-;21577:25;;21770:1;21702:66;21698:74;21695:1;21692:81;21687:1;21680:9;21673:17;21669:105;21666:131;;;21777:18;;:::i;:::-;21666:131;21825:1;21822;21818:9;21807:20;;21485:348;;;;:::o;21839:180::-;21887:77;21884:1;21877:88;21984:4;21981:1;21974:15;22008:4;22005:1;21998:15;22025:185;22065:1;22082:20;22100:1;22082:20;:::i;:::-;22077:25;;22116:20;22134:1;22116:20;:::i;:::-;22111:25;;22155:1;22145:35;;22160:18;;:::i;:::-;22145:35;22202:1;22199;22195:9;22190:14;;22025:185;;;;:::o;22216:137::-;22270:5;22301:6;22295:13;22286:22;;22317:30;22341:5;22317:30;:::i;:::-;22216:137;;;;:::o;22359:345::-;22426:6;22475:2;22463:9;22454:7;22450:23;22446:32;22443:119;;;22481:79;;:::i;:::-;22443:119;22601:1;22626:61;22679:7;22670:6;22659:9;22655:22;22626:61;:::i;:::-;22616:71;;22572:125;22359:345;;;;:::o;22710:878::-;22967:4;23005:3;22994:9;22990:19;22982:27;;23019:71;23087:1;23076:9;23072:17;23063:6;23019:71;:::i;:::-;23100:72;23168:2;23157:9;23153:18;23144:6;23100:72;:::i;:::-;23182;23250:2;23239:9;23235:18;23226:6;23182:72;:::i;:::-;23264;23332:2;23321:9;23317:18;23308:6;23264:72;:::i;:::-;23346:69;23410:3;23399:9;23395:19;23386:6;23346:69;:::i;:::-;23425:73;23493:3;23482:9;23478:19;23469:6;23425:73;:::i;:::-;23508;23576:3;23565:9;23561:19;23552:6;23508:73;:::i;:::-;22710:878;;;;;;;;;;:::o;23594:173::-;23734:25;23730:1;23722:6;23718:14;23711:49;23594:173;:::o;23773:366::-;23915:3;23936:67;24000:2;23995:3;23936:67;:::i;:::-;23929:74;;24012:93;24101:3;24012:93;:::i;:::-;24130:2;24125:3;24121:12;24114:19;;23773:366;;;:::o;24145:419::-;24311:4;24349:2;24338:9;24334:18;24326:26;;24398:9;24392:4;24388:20;24384:1;24373:9;24369:17;24362:47;24426:131;24552:4;24426:131;:::i;:::-;24418:139;;24145:419;;;:::o;24570:775::-;24803:4;24841:3;24830:9;24826:19;24818:27;;24855:71;24923:1;24912:9;24908:17;24899:6;24855:71;:::i;:::-;24936:72;25004:2;24993:9;24989:18;24980:6;24936:72;:::i;:::-;25018;25086:2;25075:9;25071:18;25062:6;25018:72;:::i;:::-;25100;25168:2;25157:9;25153:18;25144:6;25100:72;:::i;:::-;25182:73;25250:3;25239:9;25235:19;25226:6;25182:73;:::i;:::-;25265;25333:3;25322:9;25318:19;25309:6;25265:73;:::i;:::-;24570:775;;;;;;;;;:::o;25351:148::-;25453:11;25490:3;25475:18;;25351:148;;;;:::o;25505:214::-;25645:66;25641:1;25633:6;25629:14;25622:90;25505:214;:::o;25725:400::-;25885:3;25906:84;25988:1;25983:3;25906:84;:::i;:::-;25899:91;;25999:93;26088:3;25999:93;:::i;:::-;26117:1;26112:3;26108:11;26101:18;;25725:400;;;:::o;26131:79::-;26170:7;26199:5;26188:16;;26131:79;;;:::o;26216:157::-;26321:45;26341:24;26359:5;26341:24;:::i;:::-;26321:45;:::i;:::-;26316:3;26309:58;26216:157;;:::o;26379:663::-;26620:3;26642:148;26786:3;26642:148;:::i;:::-;26635:155;;26800:75;26871:3;26862:6;26800:75;:::i;:::-;26900:2;26895:3;26891:12;26884:19;;26913:75;26984:3;26975:6;26913:75;:::i;:::-;27013:2;27008:3;27004:12;26997:19;;27033:3;27026:10;;26379:663;;;;;:::o;27048:545::-;27221:4;27259:3;27248:9;27244:19;27236:27;;27273:71;27341:1;27330:9;27326:17;27317:6;27273:71;:::i;:::-;27354:68;27418:2;27407:9;27403:18;27394:6;27354:68;:::i;:::-;27432:72;27500:2;27489:9;27485:18;27476:6;27432:72;:::i;:::-;27514;27582:2;27571:9;27567:18;27558:6;27514:72;:::i;:::-;27048:545;;;;;;;:::o;27599:164::-;27739:16;27735:1;27727:6;27723:14;27716:40;27599:164;:::o;27769:366::-;27911:3;27932:67;27996:2;27991:3;27932:67;:::i;:::-;27925:74;;28008:93;28097:3;28008:93;:::i;:::-;28126:2;28121:3;28117:12;28110:19;;27769:366;;;:::o;28141:419::-;28307:4;28345:2;28334:9;28330:18;28322:26;;28394:9;28388:4;28384:20;28380:1;28369:9;28365:17;28358:47;28422:131;28548:4;28422:131;:::i;:::-;28414:139;;28141:419;;;:::o;28566:156::-;28706:8;28702:1;28694:6;28690:14;28683:32;28566:156;:::o;28728:365::-;28870:3;28891:66;28955:1;28950:3;28891:66;:::i;:::-;28884:73;;28966:93;29055:3;28966:93;:::i;:::-;29084:2;29079:3;29075:12;29068:19;;28728:365;;;:::o;29099:419::-;29265:4;29303:2;29292:9;29288:18;29280:26;;29352:9;29346:4;29342:20;29338:1;29327:9;29323:17;29316:47;29380:131;29506:4;29380:131;:::i;:::-;29372:139;;29099:419;;;:::o;29524:147::-;29625:11;29662:3;29647:18;;29524:147;;;;:::o;29677:144::-;29729:4;29752:3;29744:11;;29775:3;29772:1;29765:14;29809:4;29806:1;29796:18;29788:26;;29677:144;;;:::o;29849:849::-;29954:3;29991:5;29985:12;30020:36;30046:9;30020:36;:::i;:::-;30072:88;30153:6;30148:3;30072:88;:::i;:::-;30065:95;;30191:1;30180:9;30176:17;30207:1;30202:137;;;;30353:1;30348:344;;;;30169:523;;30202:137;30286:4;30282:9;30271;30267:25;30262:3;30255:38;30322:6;30317:3;30313:16;30306:23;;30202:137;;30348:344;30415:41;30450:5;30415:41;:::i;:::-;30478:1;30492:154;30506:6;30503:1;30500:13;30492:154;;;30580:7;30574:14;30570:1;30565:3;30561:11;30554:35;30630:1;30621:7;30617:15;30606:26;;30528:4;30525:1;30521:12;30516:17;;30492:154;;;30675:6;30670:3;30666:16;30659:23;;30355:337;;30169:523;;29958:740;;29849:849;;;;:::o;30704:273::-;30835:3;30857:94;30947:3;30938:6;30857:94;:::i;:::-;30850:101;;30968:3;30961:10;;30704:273;;;;:::o;30983:664::-;31188:4;31226:3;31215:9;31211:19;31203:27;;31240:71;31308:1;31297:9;31293:17;31284:6;31240:71;:::i;:::-;31321:72;31389:2;31378:9;31374:18;31365:6;31321:72;:::i;:::-;31403;31471:2;31460:9;31456:18;31447:6;31403:72;:::i;:::-;31485;31553:2;31542:9;31538:18;31529:6;31485:72;:::i;:::-;31567:73;31635:3;31624:9;31620:19;31611:6;31567:73;:::i;:::-;30983:664;;;;;;;;:::o;31653:94::-;31686:8;31734:5;31730:2;31726:14;31705:35;;31653:94;;;:::o;31753:::-;31792:7;31821:20;31835:5;31821:20;:::i;:::-;31810:31;;31753:94;;;:::o;31853:100::-;31892:7;31921:26;31941:5;31921:26;:::i;:::-;31910:37;;31853:100;;;:::o;31959:157::-;32064:45;32084:24;32102:5;32084:24;:::i;:::-;32064:45;:::i;:::-;32059:3;32052:58;31959:157;;:::o;32122:79::-;32161:7;32190:5;32179:16;;32122:79;;;:::o;32207:157::-;32312:45;32332:24;32350:5;32332:24;:::i;:::-;32312:45;:::i;:::-;32307:3;32300:58;32207:157;;:::o;32370:397::-;32510:3;32525:75;32596:3;32587:6;32525:75;:::i;:::-;32625:2;32620:3;32616:12;32609:19;;32638:75;32709:3;32700:6;32638:75;:::i;:::-;32738:2;32733:3;32729:12;32722:19;;32758:3;32751:10;;32370:397;;;;;:::o;32773:156::-;32913:8;32909:1;32901:6;32897:14;32890:32;32773:156;:::o;32935:365::-;33077:3;33098:66;33162:1;33157:3;33098:66;:::i;:::-;33091:73;;33173:93;33262:3;33173:93;:::i;:::-;33291:2;33286:3;33282:12;33275:19;;32935:365;;;:::o;33306:419::-;33472:4;33510:2;33499:9;33495:18;33487:26;;33559:9;33553:4;33549:20;33545:1;33534:9;33530:17;33523:47;33587:131;33713:4;33587:131;:::i;:::-;33579:139;;33306:419;;;:::o;33731:442::-;33880:4;33918:2;33907:9;33903:18;33895:26;;33931:71;33999:1;33988:9;33984:17;33975:6;33931:71;:::i;:::-;34012:72;34080:2;34069:9;34065:18;34056:6;34012:72;:::i;:::-;34094;34162:2;34151:9;34147:18;34138:6;34094:72;:::i;:::-;33731:442;;;;;;:::o;34179:170::-;34319:22;34315:1;34307:6;34303:14;34296:46;34179:170;:::o;34355:366::-;34497:3;34518:67;34582:2;34577:3;34518:67;:::i;:::-;34511:74;;34594:93;34683:3;34594:93;:::i;:::-;34712:2;34707:3;34703:12;34696:19;;34355:366;;;:::o;34727:419::-;34893:4;34931:2;34920:9;34916:18;34908:26;;34980:9;34974:4;34970:20;34966:1;34955:9;34951:17;34944:47;35008:131;35134:4;35008:131;:::i;:::-;35000:139;;34727:419;;;:::o;35152:180::-;35200:77;35197:1;35190:88;35297:4;35294:1;35287:15;35321:4;35318:1;35311:15;35338:233;35377:3;35400:24;35418:5;35400:24;:::i;:::-;35391:33;;35446:66;35439:5;35436:77;35433:103;;;35516:18;;:::i;:::-;35433:103;35563:1;35556:5;35552:13;35545:20;;35338:233;;;:::o

Swarm Source

ipfs://217a641487b29466e91201f217f80331f68cd4f02432c373946b117282bb64f2
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.