ETH Price: $2,544.93 (+3.28%)

Dino Not Found (DINO404)
 

Overview

TokenID

3850

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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:
Dino404

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-02-10
*/

/*

██████╗ ██╗███╗   ██╗ ██████╗     ███╗   ██╗ ██████╗ ████████╗    ███████╗ ██████╗ ██╗   ██╗███╗   ██╗██████╗ 
██╔══██╗██║████╗  ██║██╔═══██╗    ████╗  ██║██╔═══██╗╚══██╔══╝    ██╔════╝██╔═══██╗██║   ██║████╗  ██║██╔══██╗
██║  ██║██║██╔██╗ ██║██║   ██║    ██╔██╗ ██║██║   ██║   ██║       █████╗  ██║   ██║██║   ██║██╔██╗ ██║██║  ██║
██║  ██║██║██║╚██╗██║██║   ██║    ██║╚██╗██║██║   ██║   ██║       ██╔══╝  ██║   ██║██║   ██║██║╚██╗██║██║  ██║
██████╔╝██║██║ ╚████║╚██████╔╝    ██║ ╚████║╚██████╔╝   ██║       ██║     ╚██████╔╝╚██████╔╝██║ ╚████║██████╔╝
╚═════╝ ╚═╝╚═╝  ╚═══╝ ╚═════╝     ╚═╝  ╚═══╝ ╚═════╝    ╚═╝       ╚═╝      ╚═════╝  ╚═════╝ ╚═╝  ╚═══╝╚═════╝ 
                                                                                                              
Website: https://dinonotfound.com
Twitter: https://twitter.com/dinonotfound404
*/

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Muldiv operation overflow.
     */
    error MathOverflowedMulDiv();

    enum Rounding {
        Floor, // Toward negative infinity
        Ceil, // Toward positive infinity
        Trunc, // Toward zero
        Expand // Away from zero
    }

    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds towards infinity instead
     * of rounding towards zero.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        if (b == 0) {
            // Guarantee the same behavior as in a regular Solidity division.
            return a / b;
        }

        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or
     * denominator == 0.
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by
     * Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0 = x * y; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            if (denominator <= prod1) {
                revert MathOverflowedMulDiv();
            }

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.
            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.

            uint256 twos = denominator & (0 - denominator);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also
            // works in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded
     * towards zero.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2 of a positive value rounded towards zero.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10 of a positive value rounded towards zero.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256 of a positive value rounded towards zero.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
        }
    }

    /**
     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
     */
    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
        return uint8(rounding) % 2 == 1;
    }
}


/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two signed numbers.
     */
    function min(int256 a, int256 b) internal pure returns (int256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant HEX_DIGITS = "0123456789abcdef";
    uint8 private constant ADDRESS_LENGTH = 20;

    /**
     * @dev The `value` string doesn't fit in the specified `length`.
     */
    error StringsInsufficientHexLength(uint256 value, uint256 length);

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toStringSigned(int256 value) internal pure returns (string memory) {
        return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value)));
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        uint256 localValue = value;
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = HEX_DIGITS[localValue & 0xf];
            localValue >>= 4;
        }
        if (localValue != 0) {
            revert StringsInsufficientHexLength(value, length);
        }
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal
     * representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);
    }

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b) internal pure returns (bool) {
        return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
    }
}

abstract contract Ownable {
    event OwnershipTransferred(address indexed user, address indexed newOwner);

    error Unauthorized();
    error InvalidOwner();

    address public owner;

    modifier onlyOwner() virtual {
        if (msg.sender != owner) revert Unauthorized();

        _;
    }

    constructor(address _owner) {
        if (_owner == address(0)) revert InvalidOwner();

        owner = _owner;

        emit OwnershipTransferred(address(0), _owner);
    }

    function transferOwnership(address _owner) public virtual onlyOwner {
        if (_owner == address(0)) revert InvalidOwner();

        owner = _owner;

        emit OwnershipTransferred(msg.sender, _owner);
    }

    function revokeOwnership() public virtual onlyOwner {
        owner = address(0);

        emit OwnershipTransferred(msg.sender, address(0));
    }
}

abstract contract ERC721Receiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721Receiver.onERC721Received.selector;
    }
}

/// @notice ERC404
///         A gas-efficient, mixed ERC20 / ERC721 implementation
///         with native liquidity and fractionalization.
///
///         This is an experimental standard designed to integrate
///         with pre-existing ERC20 / ERC721 support as smoothly as
///         possible.
///
/// @dev    In order to support full functionality of ERC20 and ERC721
///         supply assumptions are made that slightly constraint usage.
///         Ensure decimals are sufficiently large (standard 18 recommended)
///         as ids are effectively encoded in the lowest range of amounts.
///
///         NFTs are spent on ERC20 functions in a FILO queue, this is by
///         design.
///
abstract contract ERC404 is Ownable {
    // Events
    event ERC20Transfer(
        address indexed from,
        address indexed to,
        uint256 amount
    );
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 amount
    );
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed id
    );
    event ERC721Approval(
        address indexed owner,
        address indexed spender,
        uint256 indexed id
    );
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    // Errors
    error NotFound();
    error AlreadyExists();
    error InvalidRecipient();
    error InvalidSender();
    error UnsafeRecipient();

    // Metadata
    /// @dev Token name
    string public name;

    /// @dev Token symbol
    string public symbol;

    /// @dev Decimals for fractional representation
    uint8 public immutable decimals;

    /// @dev Total supply in fractionalized representation
    uint256 public immutable totalSupply;

    /// @dev Current mint counter, monotonically increasing to ensure accurate ownership
    uint256 public minted;

    // Mappings
    /// @dev Balance of user in fractional representation
    mapping(address => uint256) public balanceOf;

    /// @dev Allowance of user in fractional representation
    mapping(address => mapping(address => uint256)) public allowance;

    /// @dev Approval in native representaion
    mapping(uint256 => address) public getApproved;

    /// @dev Approval for all in native representation
    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /// @dev Owner of id in native representation
    mapping(uint256 => address) internal _ownerOf;

    /// @dev Array of owned ids in native representation
    mapping(address => uint256[]) internal _owned;

    /// @dev Tracks indices for the _owned mapping
    mapping(uint256 => uint256) internal _ownedIndex;

    /// @dev Addresses whitelisted from minting / burning for gas savings (pairs, routers, etc)
    mapping(address => bool) public whitelist;

    // Constructor
    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals,
        uint256 _totalNativeSupply,
        address _owner
    ) Ownable(_owner) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        totalSupply = _totalNativeSupply * (10 ** decimals);
    }

    /// @notice Initialization function to set pairs / etc
    ///         saving gas by avoiding mint / burn on unnecessary targets
    function setWhitelist(address target, bool state) public onlyOwner {
        whitelist[target] = state;
    }

    /// @notice Function to find owner of a given native token
    function ownerOf(uint256 id) public view virtual returns (address owner) {
        owner = _ownerOf[id];

        if (owner == address(0)) {
            revert NotFound();
        }
    }

    /// @notice tokenURI must be implemented by child contract
    function tokenURI(uint256 id) public view virtual returns (string memory);

    /// @notice Function for token approvals
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function approve(
        address spender,
        uint256 amountOrId
    ) public virtual returns (bool) {
        if (amountOrId <= minted && amountOrId > 0) {
            address owner = _ownerOf[amountOrId];

            if (msg.sender != owner && !isApprovedForAll[owner][msg.sender]) {
                revert Unauthorized();
            }

            getApproved[amountOrId] = spender;

            emit Approval(owner, spender, amountOrId);
        } else {
            allowance[msg.sender][spender] = amountOrId;

            emit Approval(msg.sender, spender, amountOrId);
        }

        return true;
    }

    /// @notice Function native approvals
    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    /// @notice Function for mixed transfers
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function transferFrom(
        address from,
        address to,
        uint256 amountOrId
    ) public virtual {
        if (amountOrId <= minted) {
            if (from != _ownerOf[amountOrId]) {
                revert InvalidSender();
            }

            if (to == address(0)) {
                revert InvalidRecipient();
            }

            if (
                msg.sender != from &&
                !isApprovedForAll[from][msg.sender] &&
                msg.sender != getApproved[amountOrId]
            ) {
                revert Unauthorized();
            }

            balanceOf[from] -= _getUnit();

            unchecked {
                balanceOf[to] += _getUnit();
            }

            _ownerOf[amountOrId] = to;
            delete getApproved[amountOrId];

            // update _owned for sender
            uint256 updatedId = _owned[from][_owned[from].length - 1];
            _owned[from][_ownedIndex[amountOrId]] = updatedId;
            // pop
            _owned[from].pop();
            // update index for the moved id
            _ownedIndex[updatedId] = _ownedIndex[amountOrId];
            // push token to to owned
            _owned[to].push(amountOrId);
            // update index for to owned
            _ownedIndex[amountOrId] = _owned[to].length - 1;

            emit Transfer(from, to, amountOrId);
            emit ERC20Transfer(from, to, _getUnit());
        } else {
            uint256 allowed = allowance[from][msg.sender];

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

            _transfer(from, to, amountOrId);
        }
    }

    /// @notice Function for fractional transfers
    function transfer(
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        return _transfer(msg.sender, to, amount);
    }

    /// @notice Function for native transfers with contract support
    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        if (
            to.code.length != 0 &&
            ERC721Receiver(to).onERC721Received(msg.sender, from, id, "") !=
            ERC721Receiver.onERC721Received.selector
        ) {
            revert UnsafeRecipient();
        }
    }

    /// @notice Function for native transfers with contract support and callback data
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes calldata data
    ) public virtual {
        transferFrom(from, to, id);

        if (
            to.code.length != 0 &&
            ERC721Receiver(to).onERC721Received(msg.sender, from, id, data) !=
            ERC721Receiver.onERC721Received.selector
        ) {
            revert UnsafeRecipient();
        }
    }

    /// @notice Internal function for fractional transfers
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal returns (bool) {
        uint256 unit = _getUnit();
        uint256 balanceBeforeSender = balanceOf[from];
        uint256 balanceBeforeReceiver = balanceOf[to];

        balanceOf[from] -= amount;

        unchecked {
            balanceOf[to] += amount;
        }

        // Skip burn for certain addresses to save gas
        if (!whitelist[from]) {
            uint256 tokens_to_burn = (balanceBeforeSender / unit) -
                (balanceOf[from] / unit);
            for (uint256 i = 0; i < tokens_to_burn; i++) {
                _burn(from);
            }
        }

        // Skip minting for certain addresses to save gas
        if (!whitelist[to]) {
            uint256 tokens_to_mint = (balanceOf[to] / unit) -
                (balanceBeforeReceiver / unit);
            for (uint256 i = 0; i < tokens_to_mint; i++) {
                _mint(to);
            }
        }

        emit ERC20Transfer(from, to, amount);
        return true;
    }

    // Internal utility logic
    function _getUnit() internal view returns (uint256) {
        return 10 ** decimals;
    }

    function _mint(address to) internal virtual {
        if (to == address(0)) {
            revert InvalidRecipient();
        }

        unchecked {
            minted++;
        }

        uint256 id = minted;

        if (_ownerOf[id] != address(0)) {
            revert AlreadyExists();
        }

        _ownerOf[id] = to;
        _owned[to].push(id);
        _ownedIndex[id] = _owned[to].length - 1;

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

    function _burn(address from) internal virtual {
        if (from == address(0)) {
            revert InvalidSender();
        }

        uint256 id = _owned[from][_owned[from].length - 1];
        _owned[from].pop();
        delete _ownedIndex[id];
        delete _ownerOf[id];
        delete getApproved[id];

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

    function _setNameSymbol(
        string memory _name,
        string memory _symbol
    ) internal {
        name = _name;
        symbol = _symbol;
    }
}

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides functions for encoding/decoding base64
library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

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

        // load the table into memory
        string memory table = TABLE_ENCODE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

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

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

        return result;
    }

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

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

        // load the table into memory
        bytes memory table = TABLE_DECODE;

        // every 4 characters represent 3 bytes
        uint256 decodedLen = (data.length / 4) * 3;

        // add some extra buffer at the end required for the writing
        bytes memory result = new bytes(decodedLen + 32);

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

            // set the actual output length
            mstore(result, decodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 4 characters at a time
            for {} lt(dataPtr, endPtr) {}
            {
               // read 4 characters
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

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

        return result;
    }
}

contract DinoData {

//// Bodys of Dinos
        bytes[] internal body_data = [
                bytes(hex'0605B76C3A0705B76C3A0805B76C3A0905B76D3B0606B76C3A0706B76C3A0806B76C3A0906B76C3A0a06B76D3B0607B76C3A0707B76C3A0807B76C3A0907B76C3A0a07B76D3B0608B76C3A0708B76C3A0808B76C3A0409B76C3A0609B76C3A0709B76C3A0809B76C3A0909B76D3B050aB76C3A060aB76C3A070aB76C3A080aB76C3A060bB76D3B080bB76D3B'),
                bytes(hex'06053B352007053B352008053B352009053B3520060655471C070655471C080655471C090655471C0a0654471C06076A571B07076A571B08076A571B09076A571B0a076A571B06087E661B07087E661B08087E661B04098D721906098D721907098E711908098E711909098D7219050aA1811D060aA1811D070aA1811D080aA0811D060bAD8A1D080bAD8A1D'),
                bytes(hex'0605745B2A0705745B2A0805745B2A0905735D2D0606745B2A0706745B2A0806745B2A0906745B2A0a06735D2D0607745B2A0707745B2A0807745B2A0907745B2A0a07735D2D0608745B2A0708745B2A0808745B2A0409745B2A0609745B2A0709745B2A0809745B2A0909735D2D050a745B2A060a745B2A070a745B2A080a745B2A060b735D2D080b735D2D'),
                bytes(hex'060553535307055353530805535353090553555606065353530706535353080653535309065353530a0653555606075353530707535353080753535309075353530a0753555606085353530708535353080853535304095454540609535353070953535308095353530909535556050a545454060a535353070a535353080a535353060b535556080b535556'),
                bytes(hex'06050F0F0F07050F0F0F08050F0F0F09050F0F0F06062525250706252525080625252509062525250a0625252506073C3C3C07073C3C3C08073C3C3C09073C3C3C0a073D3D3D06084E4E4E07084E4E4E08084E4E4E04096464640609646464070964646408096464640909656464050a7D7D7D060a7D7D7D070a7D7D7D080a7D7D7C060b929292080b929292'),
                bytes(hex'06053E263407053E263408053E263409053E26340606532B420706532B420806532B420906532B420a06532B420607712F560707712F560807712F560907712F560a07712F56060895316B070895316B080895316B0409B82B7E0609A72E750709A72E750809A72E750909A72E75050aB82B7E060aB82B7E070aB82B7E080aB82B7E060bCF2D8C080bCF2D8C'),
                bytes(hex'0605954C780705954C780805954C780905944E7A0606954C780706954C780806954C780906954C780a06944E7A0607954C780707954C780807954C780907954C780a07944E7A0608954C780708954C780808954C780409954D780609954C780709954C780809954C780909944E7A050a954D78060a954C78070a954C78080a954C78060b944E7A080b944E7A'),
                bytes(hex'060538235B070538235B080538235B090538245D060638235B070638235B080638235B090638235B0a0638245D060738235B070738235B080738235B090738235B0a0738245D060838235B070838235B080838235B040938255D060938235B070938235B080938235B090938245D050a38255D060a38235B070a38235B080a38235B060b38245D080b38245D'),
                bytes(hex'06051E272E07051E272E08051E272E09051E272E0606203D510706203D510806203D510906203D510a06203D5106071E4F7107071E4F7108071E4F7109071E4F710a071E4F7106081A5A8507081A5A8508081B5A8504091B6AA006091A6AA107091A6AA108091A6AA109091B6AA0050a1B7BBD060a1B7BBD070a1B7BBD080a1B7BBD060b1C86CE080b1C86CE'),
                bytes(hex'0605244235070524423608052442360905244235060621523D070621523D080621523D090621523D0a0621523E06072162470707216247080721624709072162470a072162470608226F4F0708226F4F0808226F4F040923875E060923875E070923875D080923875D090923875E050a239364060a239364070a239364080a239365060b229F6B080b229F6B'),
                bytes(hex'06050D524107050D524108050D524109050E534306060D524107060D524108060D524109060D52410a060E534306070D524107070D524108070D524109070D52410a070E534306080D524107080D524108080D524104090F544406090D524107090D524108090D524109090E5343050a0F5444060a0D5241070a0D5241080a0D5241060b0E5343080b0E5343'),
                bytes(hex'0605409EA80705409EA80805409EA80905409DA806063477BB07063477BB08063477BB09063477BB0a063477BB0607334EBB0707334EBB0807334EBB0907334EBB0a07344EBB0608943EA90708943EA90808943EA804099C6E3A06099C6E3A07099C6E3A08099C6E3A09099C6E3B050a86A939060a86A939070a86A939080a86A83A060b41983B080b41983B'),
                bytes(hex'060545B1B9070545B1B9080545B1B9090547B1B9060645B1B9070645B1B9080645B1B9090645B1B90a0647B1B9060745B1B9070745B1B9080745B1B9090745B1B90a0747B1B9060845B1B9070845B1B9080845B1B9040947B1B9060945B1B9070945B1B9080945B1B9090947B1B9050a47B1B9060a45B1B9070a45B1B9080a45B1B9060b47B1B9080b47B1B9'),
                bytes(hex'060591362B070591362B080591362B090591352B060691352B070691362B080691362B090691362B0a0691352B060791352B070791362B080791362B090791362B0a0791352B060891352B070891362B080891362B040991352B060991362B070991362B080991362B090991352B050a91362B060a91362B070a91362B080a91352B060b91352B080b91352B'),
                bytes(hex'0605282D550705282D550805282D550905282D550606252E6E0706252E6E0806252E6E0906252E6E0a06252E6E06072530810707253081080725308109072530810a072630810608212E900708212E900808222E8F0409202EA506091F2FA507091F2FA508091F2EA50909202EA5050a2133B8060a2133B8070a2133B8080a2233B7060b1E32D3080b1E32D3'),
                bytes(hex'060525398707052539870805253987090525398706062539870706253987080625398709062539870a0625398706072539870707253987080725398709072539870a0725398706082539870708253987080825398704092739860609253987070925398708092539870909253987050a273986060a253987070a253987080a253987060b253987080b253987')
        ];

	string[] internal body_traits = [
        'orange',
        'croc gradient',
        'brown',
        'gray',
        'grayspace gradient',
        'magenta gradient',
        'magenta',
        'dark purple',
        'blue gradient',
        'green gradient',
        'green',
        'rainbow',
        'aqua',
        'orange red',
        'royal gradient',
        'royal'
    ];

        uint[] internal  body_probability = [8, 11, 18, 27, 30, 33, 43, 53, 56, 59, 65, 67, 77, 87, 90, 100];

//// Chest of Dinos
        bytes[] internal chest_data = [
                bytes(hex'0708CB462D0808CB462D0809CB462D070aCB462D080aCB462D'),
                bytes(hex'070885853008088585300809858530070a858530080a858530'),
                bytes(hex'070887878708088787870809878787070a878787080a878787'),
                bytes(hex'070885428908088542890809854289070a854289080a854289'),
                bytes(hex'070823232308082323230809232323070a232323080a232323'),
                bytes(hex'07083670A608083670A608093670A6070a3670A6080a3670A6'),
                bytes(hex'07082988AA08082988AA08092988AA070a2988AA080a2988AA'),
                bytes(hex'07083FA19508083FA19508093FA195070a3FA195080a3FA195'),
                bytes(hex'0708262A8B0808262A8B0809262A8B070a262A8B080a262A8B')
        ];

	string[] internal chest_traits = [
        'red orange',       
        'croc green',
        'gray',       
        'purple',
        'charcoal',
        'blue',     
        'aqua',
        'teal',       
        'royal'
	];

        uint[] internal  chest_probability = [10, 18, 29, 42, 57, 68, 77, 89, 100];

//// Eyes of Dinos
        bytes[] internal eye_data = [
                bytes(hex'0706B8B23B0906395BD3'),
                bytes(hex'0706A1763B0906A1763B'),
                bytes(hex'0706D7D7D70906D7D7D7'),
                bytes(hex'070685EBFE090685EBFE'),
                bytes(hex'0706B73BB8090627BDC9'),
                bytes(hex'0706A03A8F0906A03A8F'),
                bytes(hex'07061FDBFE08061FDBFE09061FDBFE0a061FDBFE0b061FDBFE0c061FDBFE0d061FDBFE0e061FDBFE0f061FDBFE'),
                bytes(hex'07066D6D6E09066D6D6E'),
                bytes(hex'07062B7FB609062B7FB6'),
                bytes(hex'070642ABBE090642ABBE'),
                bytes(hex'07060B0B0B09060B0B0B'),
                bytes(hex'0706213ECF0906213ECF')
        ];

	string[] internal eye_traits = [
        'yellow blue', 
        'sand',
        'light gray',   
        'blue',
        'purple turquoise',   
        'purple',
        'lazer',       
        'dark gray',
        'denim',      
        'turquoise',
        'black',       
        'royal'
	];

        uint[] internal  eye_probability = [4, 19, 30, 36, 40, 48, 50, 58, 64, 70, 90, 100];


//// Face of Dinos
        bytes[] internal face_data = [
                bytes(hex''),
                bytes(hex'0605C5C5C50705C5C5C50805C5C5C50905C5C5C50606C5C5C50806C5C5C50a06C5C5C5'),
                bytes(hex'0606B5B5B50806B5B5B50a06B5B5B5'),
                bytes(hex'06051049e107051049e108051049e109051049e10a051049e104061049e105061049e106061049e108061049e10a061049e104071049e106071049e107071049e108071049e109071049e10a071049e1'),
                bytes(hex'0704b7b7b70804b7b7b70605b7b7b70705b7b7b70805b7b7b70905b7b7b70606b7b7b70806b7b7b70a06b7b7b70707b6b7b70907b6b7b70b07b6b7b7'),
                bytes(hex'070600000008060000000906000000')
        ];

	string[] internal face_traits = [
        'normal',
        'mask',
        'ninja',
        'based noun glasses',
        'dark skull',
        'vizor'
	];

        uint[] internal  face_probability = [65, 75, 85, 90, 95, 100];

//// Feet of Dinos
        bytes[] internal feet_data = [
                bytes(hex''),
                bytes(hex'0009222222000a222222010a222222000b222222020b222222000c222222010c222222020c222222030c222222010d222222030d222222050d3A9940060d3A9940070d3A9940080d3A993F'),
                bytes(hex'010821212201092121220209212121020a212122030a212121010b212122030b212122040b212121020c212122040c212122050c212121060cE7E7E8070c212121080cE7E7E8'),
                bytes(hex'040b84B3C60a0b84B3C6050c85B4C7060c85B5C7070c85B5C7080c85B4C7090c85B4C7060d464F53080d464F53')
        ];

	string[] internal feet_traits = [
        'normal', 
        'hoverboard', 
        'rocket boots', 
        'skateboard'
	];

        uint[] internal  feet_probability = [76, 84, 92, 100];

//// Heads of Dinos
        bytes[] internal head_data = [
                bytes(hex''),
                bytes(hex'060566A836070566A836080566A836090566A835050666A835040766A835'),
                bytes(hex'0703CE71390803CD713A0903CE71390504CE71390604CE71390704CD713A0804CD713A0904CD713A'),
                bytes(hex'06036CA93407036CA93408036CA93406046CA93407046AA83508046AA83509046AA8350a046BA835'),
                bytes(hex'0602eaeaea0702eaeaea0802e9e9e90603eaeaea0703eaeaea0803e9e9e90604eaeaea0704eaeaea0804e9e9e9'),
                bytes(hex'0503f0a92a0703f1a9290903f0a92a0504f1a9290604f0a82b0704f0a82a0804f1a92a0904f0a92a'),
                bytes(hex'0504C2C2C20604C2C2C20704C2C2C20804C2C2C20505C2C2C20506C2C2C20606C2C2C20507C2C2C20607C2C2C2'),
                bytes(hex'060340A235070340A235080341A235050440A235060440A235070440A235080440A235090440A2350a0441A235'),
                bytes(hex'05046060600604606060080460606009046060600505606060'),
                bytes(hex'0703194CD10803194DD20604194CD10704194CD10804194CD10904194DD2'),
                bytes(hex'07032424240803242424090325252405043DBAC906043DBAC907043DBAC908043DBAC909043DBAC9')
        ];

	string[] internal head_traits = [
        'none',
        'bandana',
        'cap backwards',
        'cap forwards',
        'chef',
        'crown',
        'headphones',
        'long peak cap forwards',
        'mouse ears',
        'silly blue bucket hat',
        'two tone cap backwards'
	];

        uint[] internal  head_probability = [45, 48, 57, 67, 71, 74, 78, 86, 88, 92, 100];

/////////////////// Spikes of Dinos
        bytes[] internal spike_data = [
                bytes(hex''),
                bytes(hex'0604BE96560804BE96560505BE96560507BE96560509BE9656'),
                bytes(hex'06043E91B708043E91B705053E91B705073E91B705093E91B7'),
                bytes(hex'0604BEBFBF0804BEBFBF0505BEBFBF0507BEBFBF0509BEBFBF'),
                bytes(hex'0604944C8C0804944C8C0505944C8C0507944C8C0509944C8C'),
                bytes(hex'06044C4C4C08044C4C4C05054C4C4C05074C4C4C05094C4C4C'),
                bytes(hex'06045C2789080459852D05052B66A10507895827050923A69B'),
                bytes(hex'06042970C708042970C705052970C705072970C705092970C7'),
                bytes(hex'06043B993B08043B993B05053B993B05073B993B05093B993B'),
                bytes(hex'06043A979908043A979905053A979905073A979905093A9799'),
                bytes(hex'0604A1514E0804A1514E0505A1514E0507A1514E0509A1514E'),
                bytes(hex'06041111110804111111050511111105071111110509111111'),
                bytes(hex'06043351AD08043351AD05053351AD05073351AD05093351AD')
        ];

	string[] internal spike_traits = [
        'none',     
        'gold',       
        'burnt blue',
        'light gray',  
        'purple',
        'dark gray', 
        'multicolor',
        'blue',
        'green',       
        'teal',
        'maroon',       
        'black',
        'royal'
	];

        uint[] internal  spike_probability = [4, 12, 20, 30, 38, 49, 52, 60, 68, 76, 84, 92, 100];

}

///// Based on Pandora and Based OnChain Dinos by Apex777.eth - @Apex_Ether
contract Dino404 is ERC404, DinoData {
    string public dataURI;
    string public baseTokenURI;

    constructor(
        address _owner
    ) ERC404("Dino Not Found", "DINO404", 18, 10000, _owner) {
        balanceOf[_owner] = 10000 * 10 ** 18;
    }

    function setDataURI(string memory _dataURI) public onlyOwner {
        dataURI = _dataURI;
    }

    function setTokenURI(string memory _tokenURI) public onlyOwner {
        baseTokenURI = _tokenURI;
    }

    function setNameSymbol(
        string memory _name,
        string memory _symbol
    ) public onlyOwner {
        _setNameSymbol(_name, _symbol);
    }

    function _getSVGTraitData(bytes memory data) internal pure returns (string memory) {

        require(data.length % 5 == 0, "#");

        /// if empty this is a transparent react
        if (data.length == 0) {
             return "<rect x=\"0\" y=\"0\" width=\"0\" height=\"0\" fill=\"rgb(0,0,0)\"/>"; 
        }

        // Initialize arrays to store values
        uint reactCount = data.length / 5;


        /// react string to return
        string memory rects;

        uint[] memory x = new uint[](reactCount);
        uint[] memory y = new uint[](reactCount);
        uint[] memory r = new uint[](reactCount);
        uint[] memory g = new uint[](reactCount);
        uint[] memory b = new uint[](reactCount);

        // Iterate through each react and get the values we need
        for (uint i = 0; i < reactCount; i++) {

            // Convert and assign values to respective arrays
            x[i] = uint8(data[i * 5]);
            y[i] = uint8(data[i * 5 + 1]);
            r[i] = uint8(data[i * 5 + 2]);
            g[i] = uint8(data[i * 5 + 3]);
            b[i] = uint8(data[i * 5 + 4]);

            // Convert uint values to strings
            string memory xStr = Strings.toString(x[i]);
            string memory yStr = Strings.toString(y[i]);
            string memory rStr = Strings.toString(r[i]);
            string memory gStr = Strings.toString(g[i]);
            string memory bStr = Strings.toString(b[i]);

            rects = string(abi.encodePacked(rects, '<rect x="', xStr, '" y="', yStr, '" width="1" height="1" fill="rgb(', rStr, ',', gStr, ',', bStr, ')" />'));
        }

        return rects;
    }


    function buildSVG(uint256[7] memory localTraits) internal view returns (string memory) {
        string memory svg = string(abi.encodePacked(
        '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" shape-rendering="crispEdges" width="512" height="512">',
        '<rect width="16" height="16" fill="#f9d3ad"/>',
            _getSVGTraitData(body_data[localTraits[0]]),
            _getSVGTraitData(chest_data[localTraits[1]]),
            _getSVGTraitData(eye_data[localTraits[2]]),
            _getSVGTraitData(spike_data[localTraits[3]]),
            _getSVGTraitData(feet_data[localTraits[4]]),
            _getSVGTraitData(face_data[localTraits[5]]),
            _getSVGTraitData(head_data[localTraits[6]]),
        '</svg>'
        ));
        return svg;
    }

    function _pickTraitByProbability(uint seed, bytes[] memory traitArray, uint[] memory traitProbability) internal pure returns (uint) {
        require(traitArray.length > 0, "e");
        require(traitArray.length == traitProbability.length, "l");
        
        for (uint i = 0; i < traitProbability.length; i++) {
            if(seed < traitProbability[i]) {
                return i;
            }
        }
        // Fallback, return first element as a safe default
        return 0;
    }

    function _getDinoTraits(uint256[7] memory traits) internal view returns (string memory) {
        string memory metadata = string(abi.encodePacked(
        '{"trait_type":"Body", "value":"', body_traits[traits[0]], '"},',
        '{"trait_type":"Chest", "value":"', chest_traits[traits[1]], '"},',
        '{"trait_type":"Eyes", "value":"', eye_traits[traits[2]], '"},',
        '{"trait_type":"Spikes", "value":"', spike_traits[traits[3]], '"},',
        '{"trait_type":"Feet", "value":"', feet_traits[traits[4]], '"},',
        '{"trait_type":"Face", "value":"', face_traits[traits[5]], '"},',
        '{"trait_type":"Head", "value":"', head_traits[traits[6]], '"}'
        ));
        return metadata;
    }

    function seeds(uint256 id) internal view returns (uint256[7] memory) {
        // Picking trait based on rarity
        return [
            _pickTraitByProbability(uint256(keccak256(abi.encodePacked(id, "body"))) % 100, body_data, body_probability),
            _pickTraitByProbability(uint256(keccak256(abi.encodePacked(id, "chest"))) % 100, chest_data, chest_probability),
            _pickTraitByProbability(uint256(keccak256(abi.encodePacked(id, "eye"))) % 100, eye_data, eye_probability),
            _pickTraitByProbability(uint256(keccak256(abi.encodePacked(id, "spike"))) % 100, spike_data, spike_probability),
            _pickTraitByProbability(uint256(keccak256(abi.encodePacked(id, "feet"))) % 100, feet_data, feet_probability),
            _pickTraitByProbability(uint256(keccak256(abi.encodePacked(id, "face"))) % 100, face_data, face_probability),
            _pickTraitByProbability(uint256(keccak256(abi.encodePacked(id, "head"))) % 100, head_data, head_probability)
        ];
    }

    function tokenURI(uint256 id) public view override returns (string memory) {
        if (bytes(baseTokenURI).length > 0) {
            return string.concat(baseTokenURI, Strings.toString(id));
        } else {
            uint256[7] memory trait_values = seeds(id);

            // Get image
            string memory preimage = buildSVG(trait_values);
            string memory image = Base64.encode(bytes(preimage));
            string memory traits = _getDinoTraits(trait_values);

            string memory jsonPreImage = string.concat(
                string.concat(
                    string.concat('{"name": "Dino Not Found #', Strings.toString(id)),
                    '","description":"A collection of 10,000 Dinos enabled by ERC404, an experimental token standard.","external_url":"https://dinonotfound.com","image":"data:image/svg+xml;base64,'
                ),
                string.concat(image)
            );
            string memory jsonPostImage = string.concat(
                '","attributes":[',traits
            );
            string memory jsonPostTraits = ']}';

            return
                string.concat(
                    "data:application/json;base64,",
                    Base64.encode(bytes(string.concat(
                        string.concat(jsonPreImage, jsonPostImage),
                        jsonPostTraits
                    )))
                );
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"NotFound","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnsafeRecipient","type":"error"},{"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":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":"ERC20Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ERC721Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amountOrId","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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_dataURI","type":"string"}],"name":"setDataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"setNameSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"amountOrId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60c06040526040518061020001604052806040518060c00160405280608c815260200162009807608c913981526020016040518060c00160405280608c815260200162009366608c913981526020016040518060c00160405280608c8152602001620094e7608c913981526020016040518060c00160405280608c815260200162009cf3608c913981526020016040518060c00160405280608c815260200162009573608c913981526020016040518060c00160405280608c815260200162009a1e608c913981526020016040518060c00160405280608c8152602001620098bb608c913981526020016040518060c00160405280608c81526020016200972b608c913981526020016040518060c00160405280608c815260200162009bea608c913981526020016040518060c00160405280608c815260200162009aaa608c913981526020016040518060c00160405280608c81526020016200962c608c913981526020016040518060c00160405280608c815260200162009e0b608c913981526020016040518060c00160405280608c81526020016200945b608c913981526020016040518060c00160405280608c815260200162009947608c913981526020016040518060c00160405280608c815260200162009d7f608c913981526020016040518060c00160405280608c815260200162009b5e608c9139815250600c906010620002109291906200244f565b506040518061020001604052806040518060400160405280600681526020017f6f72616e6765000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f63726f63206772616469656e740000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f62726f776e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f677261790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280601281526020017f677261797370616365206772616469656e74000000000000000000000000000081525081526020016040518060400160405280601081526020017f6d6167656e7461206772616469656e740000000000000000000000000000000081525081526020016040518060400160405280600781526020017f6d6167656e74610000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f6461726b20707572706c6500000000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f626c7565206772616469656e740000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f677265656e206772616469656e7400000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f677265656e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f7261696e626f770000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f617175610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f6f72616e6765207265640000000000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f726f79616c206772616469656e7400000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f726f79616c000000000000000000000000000000000000000000000000000000815250815250600d906010620005dd929190620024ad565b50604051806102000160405280600860ff168152602001600b60ff168152602001601260ff168152602001601b60ff168152602001601e60ff168152602001602160ff168152602001602b60ff168152602001603560ff168152602001603860ff168152602001603b60ff168152602001604160ff168152602001604360ff168152602001604d60ff168152602001605760ff168152602001605a60ff168152602001606460ff16815250600e9060106200069a9291906200250b565b506040518061012001604052806040518060400160405280601981526020017f0708cb462d0808cb462d0809cb462d070acb462d080acb462d0000000000000081525081526020016040518060400160405280601981526020017f070885853008088585300809858530070a858530080a8585300000000000000081525081526020016040518060400160405280601981526020017f070887878708088787870809878787070a878787080a8787870000000000000081525081526020016040518060400160405280601981526020017f070885428908088542890809854289070a854289080a8542890000000000000081525081526020016040518060400160405280601981526020017f070823232308082323230809232323070a232323080a2323230000000000000081525081526020016040518060400160405280601981526020017f07083670a608083670a608093670a6070a3670a6080a3670a60000000000000081525081526020016040518060400160405280601981526020017f07082988aa08082988aa08092988aa070a2988aa080a2988aa0000000000000081525081526020016040518060400160405280601981526020017f07083fa19508083fa19508093fa195070a3fa195080a3fa1950000000000000081525081526020016040518060400160405280601981526020017f0708262a8b0808262a8b0809262a8b070a262a8b080a262a8b00000000000000815250815250600f906009620008ca92919062002560565b506040518061012001604052806040518060400160405280600a81526020017f726564206f72616e67650000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f63726f6320677265656e0000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f677261790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f707572706c65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f63686172636f616c00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f626c75650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f617175610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f7465616c0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f726f79616c000000000000000000000000000000000000000000000000000000815250815250601090600962000afa929190620025be565b50604051806101200160405280600a60ff168152602001601260ff168152602001601d60ff168152602001602a60ff168152602001603960ff168152602001604460ff168152602001604d60ff168152602001605960ff168152602001606460ff16815250601190600962000b719291906200261c565b506040518061018001604052806040518060400160405280600a81526020017f0706b8b23b0906395bd30000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f0706a1763b0906a1763b0000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f0706d7d7d70906d7d7d70000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f070685ebfe090685ebfe0000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f0706b73bb8090627bdc90000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f0706a03a8f0906a03a8f0000000000000000000000000000000000000000000081525081526020016040518060600160405280602d815260200162009c76602d913981526020016040518060400160405280600a81526020017f07066d6d6e09066d6d6e0000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f07062b7fb609062b7fb60000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f070642abbe090642abbe0000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f07060b0b0b09060b0b0b0000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f0706213ecf0906213ecf00000000000000000000000000000000000000000000815250815250601290600c62000e3692919062002671565b506040518061018001604052806040518060400160405280600b81526020017f79656c6c6f7720626c756500000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f73616e640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f6c6967687420677261790000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f626c75650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280601081526020017f707572706c652074757271756f6973650000000000000000000000000000000081525081526020016040518060400160405280600681526020017f707572706c65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6c617a657200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f6461726b2067726179000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f64656e696d00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f74757271756f697365000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f626c61636b00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f726f79616c000000000000000000000000000000000000000000000000000000815250815250601390600c62001117929190620026cf565b50604051806101800160405280600460ff168152602001601360ff168152602001601e60ff168152602001602460ff168152602001602860ff168152602001603060ff168152602001603260ff168152602001603a60ff168152602001604060ff168152602001604660ff168152602001605a60ff168152602001606460ff16815250601490600c620011ac9291906200272d565b506040518060c0016040528060405180602001604052805f8152508152602001604051806060016040528060238152602001620093436023913981526020016040518060400160405280600f81526020017f0606b5b5b50806b5b5b50a06b5b5b50000000000000000000000000000000000815250815260200160405180608001604052806050815260200162009ca36050913981526020016040518060600160405280603c8152602001620093f2603c913981526020016040518060400160405280600f81526020017f07060000000806000000090600000000000000000000000000000000000000008152508152506015906006620012af92919062002782565b506040518060c001604052806040518060400160405280600681526020017f6e6f726d616c000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6d61736b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6e696e6a6100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280601281526020017f6261736564206e6f756e20676c6173736573000000000000000000000000000081525081526020016040518060400160405280600a81526020017f6461726b20736b756c6c0000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f76697a6f7200000000000000000000000000000000000000000000000000000081525081525060169060066200142d929190620027e0565b506040518060c00160405280604160ff168152602001604b60ff168152602001605560ff168152602001605a60ff168152602001605f60ff168152602001606460ff168152506017906006620014859291906200283e565b50604051806080016040528060405180602001604052805f81525081526020016040518060800160405280604b8152602001620099d3604b91398152602001604051806080016040528060468152602001620096e56046913981526020016040518060600160405280602d8152602001620096b8602d913981525060189060046200151292919062002893565b5060405180608001604052806040518060400160405280600681526020017f6e6f726d616c000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f686f766572626f6172640000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f726f636b657420626f6f7473000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f736b617465626f6172640000000000000000000000000000000000000000000081525081525060199060046200161a929190620028f1565b506040518060800160405280604c60ff168152602001605460ff168152602001605c60ff168152602001606460ff16815250601a9060046200165e9291906200294f565b5060405180610160016040528060405180602001604052805f81525081526020016040518060400160405280601e81526020017f060566a836070566a836080566a836090566a835050666a835040766a83500008152508152602001604051806060016040528060288152602001620097b7602891398152602001604051806060016040528060288152602001620098936028913981526020016040518060600160405280602d8152602001620095ff602d9139815260200160405180606001604052806028815260200162009b366028913981526020016040518060600160405280602d81526020016200942e602d913981526020016040518060600160405280602d815260200162009e97602d913981526020016040518060400160405280601981526020017f050460606006046060600804606060090460606005056060600000000000000081525081526020016040518060400160405280601e81526020017f0703194cd10803194dd20604194cd10704194cd10804194cd10904194dd200008152508152602001604051806060016040528060288152602001620097df60289139815250601b90600b62001819929190620029a4565b506040518061016001604052806040518060400160405280600481526020017f6e6f6e650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f62616e64616e610000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f636170206261636b77617264730000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f63617020666f727761726473000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f636865660000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f63726f776e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f6865616470686f6e65730000000000000000000000000000000000000000000081525081526020016040518060400160405280601681526020017f6c6f6e67207065616b2063617020666f7277617264730000000000000000000081525081526020016040518060400160405280600a81526020017f6d6f75736520656172730000000000000000000000000000000000000000000081525081526020016040518060400160405280601581526020017f73696c6c7920626c7565206275636b657420686174000000000000000000000081525081526020016040518060400160405280601681526020017f74776f20746f6e6520636170206261636b776172647300000000000000000000815250815250601c90600b62001abf92919062002a02565b50604051806101600160405280602d60ff168152602001603060ff168152602001603960ff168152602001604360ff168152602001604760ff168152602001604a60ff168152602001604e60ff168152602001605660ff168152602001605860ff168152602001605c60ff168152602001606460ff16815250601d90600b62001b4a92919062002a60565b50604051806101a0016040528060405180602001604052805f81525081526020016040518060400160405280601981526020017f0604be96560804be96560505be96560507be96560509be96560000000000000081525081526020016040518060400160405280601981526020017f06043e91b708043e91b705053e91b705073e91b705093e91b70000000000000081525081526020016040518060400160405280601981526020017f0604bebfbf0804bebfbf0505bebfbf0507bebfbf0509bebfbf0000000000000081525081526020016040518060400160405280601981526020017f0604944c8c0804944c8c0505944c8c0507944c8c0509944c8c0000000000000081525081526020016040518060400160405280601981526020017f06044c4c4c08044c4c4c05054c4c4c05074c4c4c05094c4c4c0000000000000081525081526020016040518060400160405280601981526020017f06045c2789080459852d05052b66a10507895827050923a69b0000000000000081525081526020016040518060400160405280601981526020017f06042970c708042970c705052970c705072970c705092970c70000000000000081525081526020016040518060400160405280601981526020017f06043b993b08043b993b05053b993b05073b993b05093b993b0000000000000081525081526020016040518060400160405280601981526020017f06043a979908043a979905053a979905073a979905093a97990000000000000081525081526020016040518060400160405280601981526020017f0604a1514e0804a1514e0505a1514e0507a1514e0509a1514e0000000000000081525081526020016040518060400160405280601981526020017f060411111108041111110505111111050711111105091111110000000000000081525081526020016040518060400160405280601981526020017f06043351ad08043351ad05053351ad05073351ad05093351ad00000000000000815250815250601e90600d62001e3f92919062002ab5565b50604051806101a001604052806040518060400160405280600481526020017f6e6f6e650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f676f6c640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f6275726e7420626c75650000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f6c6967687420677261790000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f707572706c65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f6461726b2067726179000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f6d756c7469636f6c6f720000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f626c75650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f677265656e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f7465616c0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6d61726f6f6e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f626c61636b00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f726f79616c000000000000000000000000000000000000000000000000000000815250815250601f90600d6200215b92919062002b13565b50604051806101a00160405280600460ff168152602001600c60ff168152602001601460ff168152602001601e60ff168152602001602660ff168152602001603160ff168152602001603460ff168152602001603c60ff168152602001604460ff168152602001604c60ff168152602001605460ff168152602001605c60ff168152602001606460ff16815250602090600d620021fa92919062002b71565b5034801562002207575f80fd5b5060405162009ec438038062009ec483398181016040528101906200222d919062002d1c565b6040518060400160405280600e81526020017f44696e6f204e6f7420466f756e640000000000000000000000000000000000008152506040518060400160405280600781526020017f44494e4f34303400000000000000000000000000000000000000000000000000815250601261271084805f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362002306576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508460019081620023b1919062002fb0565b508360029081620023c3919062002fb0565b508260ff1660808160ff1681525050608051600a620023e391906200321d565b82620023f091906200326d565b60a08181525050505050505069021e19e0c9bab240000060045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505062003407565b828054828255905f5260205f209081019282156200249a579160200282015b828111156200249957825182908162002488919062003323565b50916020019190600101906200246e565b5b509050620024a9919062002bc6565b5090565b828054828255905f5260205f20908101928215620024f8579160200282015b82811115620024f7578251829081620024e6919062002fb0565b5091602001919060010190620024cc565b5b50905062002507919062002bed565b5090565b828054828255905f5260205f209081019282156200254d579160200282015b828111156200254c578251829060ff169055916020019190600101906200252a565b5b5090506200255c919062002c14565b5090565b828054828255905f5260205f20908101928215620025ab579160200282015b82811115620025aa57825182908162002599919062003323565b50916020019190600101906200257f565b5b509050620025ba919062002bc6565b5090565b828054828255905f5260205f2090810192821562002609579160200282015b8281111562002608578251829081620025f7919062002fb0565b5091602001919060010190620025dd565b5b50905062002618919062002bed565b5090565b828054828255905f5260205f209081019282156200265e579160200282015b828111156200265d578251829060ff169055916020019190600101906200263b565b5b5090506200266d919062002c14565b5090565b828054828255905f5260205f20908101928215620026bc579160200282015b82811115620026bb578251829081620026aa919062003323565b509160200191906001019062002690565b5b509050620026cb919062002bc6565b5090565b828054828255905f5260205f209081019282156200271a579160200282015b828111156200271957825182908162002708919062002fb0565b5091602001919060010190620026ee565b5b50905062002729919062002bed565b5090565b828054828255905f5260205f209081019282156200276f579160200282015b828111156200276e578251829060ff169055916020019190600101906200274c565b5b5090506200277e919062002c14565b5090565b828054828255905f5260205f20908101928215620027cd579160200282015b82811115620027cc578251829081620027bb919062003323565b5091602001919060010190620027a1565b5b509050620027dc919062002bc6565b5090565b828054828255905f5260205f209081019282156200282b579160200282015b828111156200282a57825182908162002819919062002fb0565b5091602001919060010190620027ff565b5b5090506200283a919062002bed565b5090565b828054828255905f5260205f2090810192821562002880579160200282015b828111156200287f578251829060ff169055916020019190600101906200285d565b5b5090506200288f919062002c14565b5090565b828054828255905f5260205f20908101928215620028de579160200282015b82811115620028dd578251829081620028cc919062003323565b5091602001919060010190620028b2565b5b509050620028ed919062002bc6565b5090565b828054828255905f5260205f209081019282156200293c579160200282015b828111156200293b5782518290816200292a919062002fb0565b509160200191906001019062002910565b5b5090506200294b919062002bed565b5090565b828054828255905f5260205f2090810192821562002991579160200282015b8281111562002990578251829060ff169055916020019190600101906200296e565b5b509050620029a0919062002c14565b5090565b828054828255905f5260205f20908101928215620029ef579160200282015b82811115620029ee578251829081620029dd919062003323565b5091602001919060010190620029c3565b5b509050620029fe919062002bc6565b5090565b828054828255905f5260205f2090810192821562002a4d579160200282015b8281111562002a4c57825182908162002a3b919062002fb0565b509160200191906001019062002a21565b5b50905062002a5c919062002bed565b5090565b828054828255905f5260205f2090810192821562002aa2579160200282015b8281111562002aa1578251829060ff1690559160200191906001019062002a7f565b5b50905062002ab1919062002c14565b5090565b828054828255905f5260205f2090810192821562002b00579160200282015b8281111562002aff57825182908162002aee919062003323565b509160200191906001019062002ad4565b5b50905062002b0f919062002bc6565b5090565b828054828255905f5260205f2090810192821562002b5e579160200282015b8281111562002b5d57825182908162002b4c919062002fb0565b509160200191906001019062002b32565b5b50905062002b6d919062002bed565b5090565b828054828255905f5260205f2090810192821562002bb3579160200282015b8281111562002bb2578251829060ff1690559160200191906001019062002b90565b5b50905062002bc2919062002c14565b5090565b5b8082111562002be9575f818162002bdf919062002c31565b5060010162002bc7565b5090565b5b8082111562002c10575f818162002c06919062002c74565b5060010162002bee565b5090565b5b8082111562002c2d575f815f90555060010162002c15565b5090565b50805462002c3f9062002db0565b5f825580601f1062002c52575062002c71565b601f0160209004905f5260205f209081019062002c70919062002c14565b5b50565b50805462002c829062002db0565b5f825580601f1062002c95575062002cb4565b601f0160209004905f5260205f209081019062002cb3919062002c14565b5b50565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62002ce68262002cbb565b9050919050565b62002cf88162002cda565b811462002d03575f80fd5b50565b5f8151905062002d168162002ced565b92915050565b5f6020828403121562002d345762002d3362002cb7565b5b5f62002d438482850162002d06565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062002dc857607f821691505b60208210810362002dde5762002ddd62002d83565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262002e427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262002e05565b62002e4e868362002e05565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62002e9862002e9262002e8c8462002e66565b62002e6f565b62002e66565b9050919050565b5f819050919050565b62002eb38362002e78565b62002ecb62002ec28262002e9f565b84845462002e11565b825550505050565b5f90565b62002ee162002ed3565b62002eee81848462002ea8565b505050565b5b8181101562002f155762002f095f8262002ed7565b60018101905062002ef4565b5050565b601f82111562002f645762002f2e8162002de4565b62002f398462002df6565b8101602085101562002f49578190505b62002f6162002f588562002df6565b83018262002ef3565b50505b505050565b5f82821c905092915050565b5f62002f865f198460080262002f69565b1980831691505092915050565b5f62002fa0838362002f75565b9150826002028217905092915050565b62002fbb8262002d4c565b67ffffffffffffffff81111562002fd75762002fd662002d56565b5b62002fe3825462002db0565b62002ff082828562002f19565b5f60209050601f83116001811462003026575f841562003011578287015190505b6200301d858262002f93565b8655506200308c565b601f198416620030368662002de4565b5f5b828110156200305f5784890151825560018201915060208501945060208101905062003038565b868310156200307f57848901516200307b601f89168262002f75565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156200311e57808604811115620030f657620030f562003094565b5b6001851615620031065780820291505b80810290506200311685620030c1565b9450620030d6565b94509492505050565b5f826200313857600190506200320a565b8162003147575f90506200320a565b81600181146200316057600281146200316b57620031a1565b60019150506200320a565b60ff84111562003180576200317f62003094565b5b8360020a9150848211156200319a576200319962003094565b5b506200320a565b5060208310610133831016604e8410600b8410161715620031db5782820a905083811115620031d557620031d462003094565b5b6200320a565b620031ea8484846001620030cd565b9250905081840481111562003204576200320362003094565b5b81810290505b9392505050565b5f60ff82169050919050565b5f620032298262002e66565b9150620032368362003211565b9250620032657fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462003127565b905092915050565b5f620032798262002e66565b9150620032868362002e66565b9250828202620032968162002e66565b91508282048414831517620032b057620032af62003094565b5b5092915050565b5f81519050919050565b5f819050815f5260205f209050919050565b601f8211156200331e57620032e881620032c1565b620032f38462002df6565b8101602085101562003303578190505b6200331b620033128562002df6565b83018262002ef3565b50505b505050565b6200332e82620032b7565b67ffffffffffffffff8111156200334a576200334962002d56565b5b62003356825462002db0565b62003363828285620032d3565b5f60209050601f83116001811462003399575f841562003384578287015190505b62003390858262002f93565b865550620033ff565b601f198416620033a986620032c1565b5f5b82811015620033d257848901518255600182019150602085019450602081019050620033ab565b86831015620033f25784890151620033ee601f89168262002f75565b8355505b6001600288020188555050505b505050505050565b60805160a051615f13620034305f395f6108f601525f81816112c70152611ea60152615f135ff3fe608060405234801561000f575f80fd5b50600436106101a7575f3560e01c806370a08231116100f7578063c87b56dd11610095578063e0df5b6f1161006f578063e0df5b6f146104cb578063e985e9c5146104e7578063f28ca1dd14610517578063f2fde38b14610535576101a7565b8063c87b56dd1461044d578063d547cfb71461047d578063dd62ed3e1461049b576101a7565b80639b19251a116100d15780639b19251a146103b5578063a22cb465146103e5578063a9059cbb14610401578063b88d4fde14610431576101a7565b806370a08231146103495780638da5cb5b1461037957806395d89b4114610397576101a7565b80632b968958116101645780634f02c4201161013e5780634f02c420146102c3578063504334c2146102e157806353d6fd59146102fd5780636352211e14610319576101a7565b80632b9689581461027f578063313ce5671461028957806342842e0e146102a7576101a7565b806306fdde03146101ab578063081812fc146101c9578063095ea7b3146101f957806318160ddd1461022957806318d217c31461024757806323b872dd14610263575b5f80fd5b6101b3610551565b6040516101c091906141bf565b60405180910390f35b6101e360048036038101906101de9190614223565b6105dd565b6040516101f0919061428d565b60405180910390f35b610213600480360381019061020e91906142d0565b61060d565b6040516102209190614328565b60405180910390f35b6102316108f4565b60405161023e9190614350565b60405180910390f35b610261600480360381019061025c9190614495565b610918565b005b61027d600480360381019061027891906144dc565b6109af565b005b6102876111a6565b005b6102916112c5565b60405161029e9190614547565b60405180910390f35b6102c160048036038101906102bc91906144dc565b6112e9565b005b6102cb611418565b6040516102d89190614350565b60405180910390f35b6102fb60048036038101906102f69190614560565b61141e565b005b61031760048036038101906103129190614600565b6114b0565b005b610333600480360381019061032e9190614223565b61158c565b604051610340919061428d565b60405180910390f35b610363600480360381019061035e919061463e565b61162a565b6040516103709190614350565b60405180910390f35b61038161163f565b60405161038e919061428d565b60405180910390f35b61039f611662565b6040516103ac91906141bf565b60405180910390f35b6103cf60048036038101906103ca919061463e565b6116ee565b6040516103dc9190614328565b60405180910390f35b6103ff60048036038101906103fa9190614600565b61170b565b005b61041b600480360381019061041691906142d0565b611803565b6040516104289190614328565b60405180910390f35b61044b600480360381019061044691906146c6565b611817565b005b61046760048036038101906104629190614223565b61194c565b60405161047491906141bf565b60405180910390f35b610485611b25565b60405161049291906141bf565b60405180910390f35b6104b560048036038101906104b0919061474a565b611bb1565b6040516104c29190614350565b60405180910390f35b6104e560048036038101906104e09190614495565b611bd1565b005b61050160048036038101906104fc919061474a565b611c68565b60405161050e9190614328565b60405180910390f35b61051f611c92565b60405161052c91906141bf565b60405180910390f35b61054f600480360381019061054a919061463e565b611d1e565b005b6001805461055e906147b5565b80601f016020809104026020016040519081016040528092919081815260200182805461058a906147b5565b80156105d55780601f106105ac576101008083540402835291602001916105d5565b820191905f5260205f20905b8154815290600101906020018083116105b857829003601f168201915b505050505081565b6006602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600354821115801561061f57505f82115b15610807575f60085f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610716575060075f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561074d576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360065f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516107f99190614350565b60405180910390a3506108ea565b8160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516108e19190614350565b60405180910390a35b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461099c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80602190816109ab9190614982565b5050565b60035481116110675760085f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610a4d576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ab2576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610b70575060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015610bd8575060065f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610c0f576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c17611ea3565b60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610c629190614a7e565b92505081905550610c71611ea3565b60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f60095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610dc79190614a7e565b81548110610dd857610dd7614ab1565b5b905f5260205f20015490508060095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600a5f8581526020019081526020015f205481548110610e4457610e43614ab1565b5b905f5260205f20018190555060095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480610e9d57610e9c614ade565b5b600190038181905f5260205f20015f90559055600a5f8381526020019081526020015f2054600a5f8381526020019081526020015f208190555060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610f859190614a7e565b600a5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e03148761104c611ea3565b6040516110599190614350565b60405180910390a3506111a1565b5f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146111935781816111169190614a7e565b60055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b61119e848484611ed6565b50505b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461122a576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b7f000000000000000000000000000000000000000000000000000000000000000081565b6112f48383836109af565b5f8273ffffffffffffffffffffffffffffffffffffffff163b141580156113dc575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b815260040161137a93929190614b3e565b6020604051808303815f875af1158015611396573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ba9190614bdb565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611413576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60035481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114a2576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114ac828261221a565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611534576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611625576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6004602052805f5260405f205f915090505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002805461166f906147b5565b80601f016020809104026020016040519081016040528092919081815260200182805461169b906147b5565b80156116e65780601f106116bd576101008083540402835291602001916116e6565b820191905f5260205f20905b8154815290600101906020018083116116c957829003601f168201915b505050505081565b600b602052805f5260405f205f915054906101000a900460ff1681565b8060075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117f79190614328565b60405180910390a35050565b5f61180f338484611ed6565b905092915050565b6118228585856109af565b5f8473ffffffffffffffffffffffffffffffffffffffff163b1415801561190e575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b81526004016118ac959493929190614c32565b6020604051808303815f875af11580156118c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118ec9190614bdb565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611945576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60605f6022805461195c906147b5565b9050111561199657602261196f8361223e565b604051602001611980929190614d38565b6040516020818303038152906040529050611b20565b5f6119a083612308565b90505f6119ac82612cb2565b90505f6119b882613239565b90505f6119c4846133ac565b90505f6119d08761223e565b6040516020016119e09190614d81565b6040516020818303038152906040526040516020016119ff9190614eae565b60405160208183030381529060405283604051602001611a1f9190614ecf565b604051602081830303815290604052604051602001611a3f929190614ee5565b60405160208183030381529060405290505f82604051602001611a629190614f2e565b60405160208183030381529060405290505f6040518060400160405280600281526020017f5d7d0000000000000000000000000000000000000000000000000000000000008152509050611af78383604051602001611ac2929190614ee5565b60405160208183030381529060405282604051602001611ae3929190614ee5565b604051602081830303815290604052613239565b604051602001611b079190614f79565b6040516020818303038152906040529750505050505050505b919050565b60228054611b32906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054611b5e906147b5565b8015611ba95780601f10611b8057610100808354040283529160200191611ba9565b820191905f5260205f20905b815481529060010190602001808311611b8c57829003601f168201915b505050505081565b6005602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c55576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060229081611c649190614982565b5050565b6007602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b60218054611c9f906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ccb906147b5565b8015611d165780601f10611ced57610100808354040283529160200191611d16565b820191905f5260205f20905b815481529060010190602001808311611cf957829003601f168201915b505050505081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611da2576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e07576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b5f7f0000000000000000000000000000000000000000000000000000000000000000600a611ed191906150cd565b905090565b5f80611ee0611ea3565b90505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508460045f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611fb09190614a7e565b925050819055508460045f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550600b5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166120d4575f8360045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546120999190615144565b84846120a59190615144565b6120af9190614a7e565b90505f5b818110156120d1576120c48961354a565b80806001019150506120b3565b50505b600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166121a7575f838261212f9190615144565b8460045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546121789190615144565b6121829190614a7e565b90505f5b818110156121a4576121978861378f565b8080600101915050612186565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487876040516122049190614350565b60405180910390a3600193505050509392505050565b81600190816122299190614982565b5080600290816122399190614982565b505050565b60605f600161224c84613a11565b0190505f8167ffffffffffffffff81111561226a57612269614371565b5b6040519080825280601f01601f19166020018201604052801561229c5781602001600182028036833780820191505090505b5090505f82602001820190505b6001156122fd578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816122f2576122f1615117565b5b0494505f85036122a9575b819350505050919050565b612310614113565b6040518060e0016040528061247460648560405160200161233191906151de565b604051602081830303815290604052805190602001205f1c6123539190615203565b600c805480602002602001604051908101604052809291908181526020015f905b8282101561241c578382905f5260205f20018054612391906147b5565b80601f01602080910402602001604051908101604052809291908181526020018280546123bd906147b5565b80156124085780601f106123df57610100808354040283529160200191612408565b820191905f5260205f20905b8154815290600101906020018083116123eb57829003601f168201915b505050505081526020019060010190612374565b50505050600e80548060200260200160405190810160405280929190818152602001828054801561246a57602002820191905f5260205f20905b815481526020019060010190808311612456575b5050505050613b62565b81526020016125d260648560405160200161248f919061527d565b604051602081830303815290604052805190602001205f1c6124b19190615203565b600f805480602002602001604051908101604052809291908181526020015f905b8282101561257a578382905f5260205f200180546124ef906147b5565b80601f016020809104026020016040519081016040528092919081815260200182805461251b906147b5565b80156125665780601f1061253d57610100808354040283529160200191612566565b820191905f5260205f20905b81548152906001019060200180831161254957829003601f168201915b5050505050815260200190600101906124d2565b5050505060118054806020026020016040519081016040528092919081815260200182805480156125c857602002820191905f5260205f20905b8154815260200190600101908083116125b4575b5050505050613b62565b81526020016127306064856040516020016125ed91906152ec565b604051602081830303815290604052805190602001205f1c61260f9190615203565b6012805480602002602001604051908101604052809291908181526020015f905b828210156126d8578382905f5260205f2001805461264d906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054612679906147b5565b80156126c45780601f1061269b576101008083540402835291602001916126c4565b820191905f5260205f20905b8154815290600101906020018083116126a757829003601f168201915b505050505081526020019060010190612630565b50505050601480548060200260200160405190810160405280929190818152602001828054801561272657602002820191905f5260205f20905b815481526020019060010190808311612712575b5050505050613b62565b815260200161288e60648560405160200161274b919061535b565b604051602081830303815290604052805190602001205f1c61276d9190615203565b601e805480602002602001604051908101604052809291908181526020015f905b82821015612836578382905f5260205f200180546127ab906147b5565b80601f01602080910402602001604051908101604052809291908181526020018280546127d7906147b5565b80156128225780601f106127f957610100808354040283529160200191612822565b820191905f5260205f20905b81548152906001019060200180831161280557829003601f168201915b50505050508152602001906001019061278e565b50505050602080548060200260200160405190810160405280929190818152602001828054801561288457602002820191905f5260205f20905b815481526020019060010190808311612870575b5050505050613b62565b81526020016129ec6064856040516020016128a991906153ca565b604051602081830303815290604052805190602001205f1c6128cb9190615203565b6018805480602002602001604051908101604052809291908181526020015f905b82821015612994578382905f5260205f20018054612909906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054612935906147b5565b80156129805780601f1061295757610100808354040283529160200191612980565b820191905f5260205f20905b81548152906001019060200180831161296357829003601f168201915b5050505050815260200190600101906128ec565b50505050601a8054806020026020016040519081016040528092919081815260200182805480156129e257602002820191905f5260205f20905b8154815260200190600101908083116129ce575b5050505050613b62565b8152602001612b4a606485604051602001612a079190615439565b604051602081830303815290604052805190602001205f1c612a299190615203565b6015805480602002602001604051908101604052809291908181526020015f905b82821015612af2578382905f5260205f20018054612a67906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054612a93906147b5565b8015612ade5780601f10612ab557610100808354040283529160200191612ade565b820191905f5260205f20905b815481529060010190602001808311612ac157829003601f168201915b505050505081526020019060010190612a4a565b505050506017805480602002602001604051908101604052809291908181526020018280548015612b4057602002820191905f5260205f20905b815481526020019060010190808311612b2c575b5050505050613b62565b8152602001612ca8606485604051602001612b6591906154a8565b604051602081830303815290604052805190602001205f1c612b879190615203565b601b805480602002602001604051908101604052809291908181526020015f905b82821015612c50578382905f5260205f20018054612bc5906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054612bf1906147b5565b8015612c3c5780601f10612c1357610100808354040283529160200191612c3c565b820191905f5260205f20905b815481529060010190602001808311612c1f57829003601f168201915b505050505081526020019060010190612ba8565b50505050601d805480602002602001604051908101604052809291908181526020018280548015612c9e57602002820191905f5260205f20905b815481526020019060010190808311612c8a575b5050505050613b62565b8152509050919050565b60605f612d77600c845f60078110612ccd57612ccc614ab1565b5b602002015181548110612ce357612ce2614ab1565b5b905f5260205f20018054612cf6906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054612d22906147b5565b8015612d6d5780601f10612d4457610100808354040283529160200191612d6d565b820191905f5260205f20905b815481529060010190602001808311612d5057829003601f168201915b5050505050613c39565b612e3a600f85600160078110612d9057612d8f614ab1565b5b602002015181548110612da657612da5614ab1565b5b905f5260205f20018054612db9906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054612de5906147b5565b8015612e305780601f10612e0757610100808354040283529160200191612e30565b820191905f5260205f20905b815481529060010190602001808311612e1357829003601f168201915b5050505050613c39565b612efd601286600260078110612e5357612e52614ab1565b5b602002015181548110612e6957612e68614ab1565b5b905f5260205f20018054612e7c906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054612ea8906147b5565b8015612ef35780601f10612eca57610100808354040283529160200191612ef3565b820191905f5260205f20905b815481529060010190602001808311612ed657829003601f168201915b5050505050613c39565b612fc0601e87600360078110612f1657612f15614ab1565b5b602002015181548110612f2c57612f2b614ab1565b5b905f5260205f20018054612f3f906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054612f6b906147b5565b8015612fb65780601f10612f8d57610100808354040283529160200191612fb6565b820191905f5260205f20905b815481529060010190602001808311612f9957829003601f168201915b5050505050613c39565b613083601888600460078110612fd957612fd8614ab1565b5b602002015181548110612fef57612fee614ab1565b5b905f5260205f20018054613002906147b5565b80601f016020809104026020016040519081016040528092919081815260200182805461302e906147b5565b80156130795780601f1061305057610100808354040283529160200191613079565b820191905f5260205f20905b81548152906001019060200180831161305c57829003601f168201915b5050505050613c39565b61314660158960056007811061309c5761309b614ab1565b5b6020020151815481106130b2576130b1614ab1565b5b905f5260205f200180546130c5906147b5565b80601f01602080910402602001604051908101604052809291908181526020018280546130f1906147b5565b801561313c5780601f106131135761010080835404028352916020019161313c565b820191905f5260205f20905b81548152906001019060200180831161311f57829003601f168201915b5050505050613c39565b613209601b8a60066007811061315f5761315e614ab1565b5b60200201518154811061317557613174614ab1565b5b905f5260205f20018054613188906147b5565b80601f01602080910402602001604051908101604052809291908181526020018280546131b4906147b5565b80156131ff5780601f106131d6576101008083540402835291602001916131ff565b820191905f5260205f20905b8154815290600101906020018083116131e257829003601f168201915b5050505050613c39565b60405160200161321f9796959493929190615643565b604051602081830303815290604052905080915050919050565b60605f8251036132595760405180602001604052805f81525090506133a7565b5f604051806060016040528060408152602001615e9e6040913990505f60036002855161328691906156c8565b6132909190615144565b600461329c91906156fb565b90505f6020826132ac91906156c8565b67ffffffffffffffff8111156132c5576132c4614371565b5b6040519080825280601f01601f1916602001820160405280156132f75781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015613366576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f811685015182536001820191505061330b565b60038951066001811461338057600281146133905761339b565b613d3d60f01b600283035261339b565b603d60f81b60018303525b50505050508093505050505b919050565b60605f600d835f600781106133c4576133c3614ab1565b5b6020020151815481106133da576133d9614ab1565b5b905f5260205f20016010846001600781106133f8576133f7614ab1565b5b60200201518154811061340e5761340d614ab1565b5b905f5260205f200160138560026007811061342c5761342b614ab1565b5b60200201518154811061344257613441614ab1565b5b905f5260205f2001601f866003600781106134605761345f614ab1565b5b60200201518154811061347657613475614ab1565b5b905f5260205f200160198760046007811061349457613493614ab1565b5b6020020151815481106134aa576134a9614ab1565b5b905f5260205f20016016886005600781106134c8576134c7614ab1565b5b6020020151815481106134de576134dd614ab1565b5b905f5260205f2001601c896006600781106134fc576134fb614ab1565b5b60200201518154811061351257613511614ab1565b5b905f5260205f200160405160200161353097969594939291906159fc565b604051602081830303815290604052905080915050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036135af576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061363a9190614a7e565b8154811061364b5761364a614ab1565b5b905f5260205f200154905060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806136a3576136a2614ade565b5b600190038181905f5260205f20015f90559055600a5f8281526020019081526020015f205f905560085f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036137f4576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f81548092919060010191905055505f60035490505f73ffffffffffffffffffffffffffffffffffffffff1660085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146138a0576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061399d9190614a7e565b600a5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613a6d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613a6357613a62615117565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613aaa576d04ee2d6d415b85acef81000000008381613aa057613a9f615117565b5b0492506020810190505b662386f26fc100008310613ad957662386f26fc100008381613acf57613ace615117565b5b0492506010810190505b6305f5e1008310613b02576305f5e1008381613af857613af7615117565b5b0492506008810190505b6127108310613b27576127108381613b1d57613b1c615117565b5b0492506004810190505b60648310613b4a5760648381613b4057613b3f615117565b5b0492506002810190505b600a8310613b59576001810190505b80915050919050565b5f80835111613ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b9d90615b44565b60405180910390fd5b8151835114613bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613be190615bac565b60405180910390fd5b5f5b8251811015613c2d57828181518110613c0857613c07614ab1565b5b6020026020010151851015613c205780915050613c32565b8080600101915050613bec565b505f90505b9392505050565b60605f60058351613c4a9190615203565b14613c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c8190615c14565b60405180910390fd5b5f825103613cb2576040518060600160405280603a8152602001615e64603a9139905061410e565b5f60058351613cc19190615144565b905060605f8267ffffffffffffffff811115613ce057613cdf614371565b5b604051908082528060200260200182016040528015613d0e5781602001602082028036833780820191505090505b5090505f8367ffffffffffffffff811115613d2c57613d2b614371565b5b604051908082528060200260200182016040528015613d5a5781602001602082028036833780820191505090505b5090505f8467ffffffffffffffff811115613d7857613d77614371565b5b604051908082528060200260200182016040528015613da65781602001602082028036833780820191505090505b5090505f8567ffffffffffffffff811115613dc457613dc3614371565b5b604051908082528060200260200182016040528015613df25781602001602082028036833780820191505090505b5090505f8667ffffffffffffffff811115613e1057613e0f614371565b5b604051908082528060200260200182016040528015613e3e5781602001602082028036833780820191505090505b5090505f5b878110156141025789600582613e5991906156fb565b81518110613e6a57613e69614ab1565b5b602001015160f81c60f81b60f81c60ff16868281518110613e8e57613e8d614ab1565b5b602002602001018181525050896001600583613eaa91906156fb565b613eb491906156c8565b81518110613ec557613ec4614ab1565b5b602001015160f81c60f81b60f81c60ff16858281518110613ee957613ee8614ab1565b5b602002602001018181525050896002600583613f0591906156fb565b613f0f91906156c8565b81518110613f2057613f1f614ab1565b5b602001015160f81c60f81b60f81c60ff16848281518110613f4457613f43614ab1565b5b602002602001018181525050896003600583613f6091906156fb565b613f6a91906156c8565b81518110613f7b57613f7a614ab1565b5b602001015160f81c60f81b60f81c60ff16838281518110613f9f57613f9e614ab1565b5b602002602001018181525050896004600583613fbb91906156fb565b613fc591906156c8565b81518110613fd657613fd5614ab1565b5b602001015160f81c60f81b60f81c60ff16828281518110613ffa57613ff9614ab1565b5b6020026020010181815250505f61402a87838151811061401d5761401c614ab1565b5b602002602001015161223e565b90505f61405087848151811061404357614042614ab1565b5b602002602001015161223e565b90505f61407687858151811061406957614068614ab1565b5b602002602001015161223e565b90505f61409c87868151811061408f5761408e614ab1565b5b602002602001015161223e565b90505f6140c28787815181106140b5576140b4614ab1565b5b602002602001015161223e565b90508b85858585856040516020016140df96959493929190615dca565b6040516020818303038152906040529b5050505050508080600101915050613e43565b50859750505050505050505b919050565b6040518060e00160405280600790602082028036833780820191505090505090565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561416c578082015181840152602081019050614151565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61419182614135565b61419b818561413f565b93506141ab81856020860161414f565b6141b481614177565b840191505092915050565b5f6020820190508181035f8301526141d78184614187565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b614202816141f0565b811461420c575f80fd5b50565b5f8135905061421d816141f9565b92915050565b5f60208284031215614238576142376141e8565b5b5f6142458482850161420f565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6142778261424e565b9050919050565b6142878161426d565b82525050565b5f6020820190506142a05f83018461427e565b92915050565b6142af8161426d565b81146142b9575f80fd5b50565b5f813590506142ca816142a6565b92915050565b5f80604083850312156142e6576142e56141e8565b5b5f6142f3858286016142bc565b92505060206143048582860161420f565b9150509250929050565b5f8115159050919050565b6143228161430e565b82525050565b5f60208201905061433b5f830184614319565b92915050565b61434a816141f0565b82525050565b5f6020820190506143635f830184614341565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6143a782614177565b810181811067ffffffffffffffff821117156143c6576143c5614371565b5b80604052505050565b5f6143d86141df565b90506143e4828261439e565b919050565b5f67ffffffffffffffff82111561440357614402614371565b5b61440c82614177565b9050602081019050919050565b828183375f83830152505050565b5f614439614434846143e9565b6143cf565b9050828152602081018484840111156144555761445461436d565b5b614460848285614419565b509392505050565b5f82601f83011261447c5761447b614369565b5b813561448c848260208601614427565b91505092915050565b5f602082840312156144aa576144a96141e8565b5b5f82013567ffffffffffffffff8111156144c7576144c66141ec565b5b6144d384828501614468565b91505092915050565b5f805f606084860312156144f3576144f26141e8565b5b5f614500868287016142bc565b9350506020614511868287016142bc565b92505060406145228682870161420f565b9150509250925092565b5f60ff82169050919050565b6145418161452c565b82525050565b5f60208201905061455a5f830184614538565b92915050565b5f8060408385031215614576576145756141e8565b5b5f83013567ffffffffffffffff811115614593576145926141ec565b5b61459f85828601614468565b925050602083013567ffffffffffffffff8111156145c0576145bf6141ec565b5b6145cc85828601614468565b9150509250929050565b6145df8161430e565b81146145e9575f80fd5b50565b5f813590506145fa816145d6565b92915050565b5f8060408385031215614616576146156141e8565b5b5f614623858286016142bc565b9250506020614634858286016145ec565b9150509250929050565b5f60208284031215614653576146526141e8565b5b5f614660848285016142bc565b91505092915050565b5f80fd5b5f80fd5b5f8083601f84011261468657614685614369565b5b8235905067ffffffffffffffff8111156146a3576146a2614669565b5b6020830191508360018202830111156146bf576146be61466d565b5b9250929050565b5f805f805f608086880312156146df576146de6141e8565b5b5f6146ec888289016142bc565b95505060206146fd888289016142bc565b945050604061470e8882890161420f565b935050606086013567ffffffffffffffff81111561472f5761472e6141ec565b5b61473b88828901614671565b92509250509295509295909350565b5f80604083850312156147605761475f6141e8565b5b5f61476d858286016142bc565b925050602061477e858286016142bc565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806147cc57607f821691505b6020821081036147df576147de614788565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026148417fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614806565b61484b8683614806565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61488661488161487c846141f0565b614863565b6141f0565b9050919050565b5f819050919050565b61489f8361486c565b6148b36148ab8261488d565b848454614812565b825550505050565b5f90565b6148c76148bb565b6148d2818484614896565b505050565b5b818110156148f5576148ea5f826148bf565b6001810190506148d8565b5050565b601f82111561493a5761490b816147e5565b614914846147f7565b81016020851015614923578190505b61493761492f856147f7565b8301826148d7565b50505b505050565b5f82821c905092915050565b5f61495a5f198460080261493f565b1980831691505092915050565b5f614972838361494b565b9150826002028217905092915050565b61498b82614135565b67ffffffffffffffff8111156149a4576149a3614371565b5b6149ae82546147b5565b6149b98282856148f9565b5f60209050601f8311600181146149ea575f84156149d8578287015190505b6149e28582614967565b865550614a49565b601f1984166149f8866147e5565b5f5b82811015614a1f578489015182556001820191506020850194506020810190506149fa565b86831015614a3c5784890151614a38601f89168261494b565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614a88826141f0565b9150614a93836141f0565b9250828203905081811115614aab57614aaa614a51565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82825260208201905092915050565b50565b5f614b295f83614b0b565b9150614b3482614b1b565b5f82019050919050565b5f608082019050614b515f83018661427e565b614b5e602083018561427e565b614b6b6040830184614341565b8181036060830152614b7c81614b1e565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614bba81614b86565b8114614bc4575f80fd5b50565b5f81519050614bd581614bb1565b92915050565b5f60208284031215614bf057614bef6141e8565b5b5f614bfd84828501614bc7565b91505092915050565b5f614c118385614b0b565b9350614c1e838584614419565b614c2783614177565b840190509392505050565b5f608082019050614c455f83018861427e565b614c52602083018761427e565b614c5f6040830186614341565b8181036060830152614c72818486614c06565b90509695505050505050565b5f81905092915050565b5f8154614c94816147b5565b614c9e8186614c7e565b9450600182165f8114614cb85760018114614ccd57614cff565b60ff1983168652811515820286019350614cff565b614cd6856147e5565b5f5b83811015614cf757815481890152600182019150602081019050614cd8565b838801955050505b50505092915050565b5f614d1282614135565b614d1c8185614c7e565b9350614d2c81856020860161414f565b80840191505092915050565b5f614d438285614c88565b9150614d4f8284614d08565b91508190509392505050565b7f7b226e616d65223a202244696e6f204e6f7420466f756e642023000000000000815250565b5f614d8b82614d5b565b601a82019150614d9b8284614d08565b915081905092915050565b7f222c226465736372697074696f6e223a224120636f6c6c656374696f6e206f665f8201527f2031302c3030302044696e6f7320656e61626c6564206279204552433430342c60208201527f20616e206578706572696d656e74616c20746f6b656e207374616e646172642e60408201527f222c2265787465726e616c5f75726c223a2268747470733a2f2f64696e6f6e6f60608201527f74666f756e642e636f6d222c22696d616765223a22646174613a696d6167652f60808201527f7376672b786d6c3b6261736536342c000000000000000000000000000000000060a082015250565b5f614e9860af83614c7e565b9150614ea382614da6565b60af82019050919050565b5f614eb98284614d08565b9150614ec482614e8c565b915081905092915050565b5f614eda8284614d08565b915081905092915050565b5f614ef08285614d08565b9150614efc8284614d08565b91508190509392505050565b7f222c2261747472696275746573223a5b00000000000000000000000000000000815250565b5f614f3882614f08565b601082019150614f488284614d08565b915081905092915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815250565b5f614f8382614f53565b601d82019150614f938284614d08565b915081905092915050565b5f8160011c9050919050565b5f808291508390505b6001851115614ff357808604811115614fcf57614fce614a51565b5b6001851615614fde5780820291505b8081029050614fec85614f9e565b9450614fb3565b94509492505050565b5f8261500b57600190506150c6565b81615018575f90506150c6565b816001811461502e576002811461503857615067565b60019150506150c6565b60ff84111561504a57615049614a51565b5b8360020a91508482111561506157615060614a51565b5b506150c6565b5060208310610133831016604e8410600b841016171561509c5782820a90508381111561509757615096614a51565b5b6150c6565b6150a98484846001614faa565b925090508184048111156150c0576150bf614a51565b5b81810290505b9392505050565b5f6150d7826141f0565b91506150e28361452c565b925061510f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614ffc565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61514e826141f0565b9150615159836141f0565b92508261516957615168615117565b5b828204905092915050565b5f819050919050565b61518e615189826141f0565b615174565b82525050565b7f626f6479000000000000000000000000000000000000000000000000000000005f82015250565b5f6151c8600483614c7e565b91506151d382615194565b600482019050919050565b5f6151e9828461517d565b6020820191506151f8826151bc565b915081905092915050565b5f61520d826141f0565b9150615218836141f0565b92508261522857615227615117565b5b828206905092915050565b7f63686573740000000000000000000000000000000000000000000000000000005f82015250565b5f615267600583614c7e565b915061527282615233565b600582019050919050565b5f615288828461517d565b6020820191506152978261525b565b915081905092915050565b7f65796500000000000000000000000000000000000000000000000000000000005f82015250565b5f6152d6600383614c7e565b91506152e1826152a2565b600382019050919050565b5f6152f7828461517d565b602082019150615306826152ca565b915081905092915050565b7f7370696b650000000000000000000000000000000000000000000000000000005f82015250565b5f615345600583614c7e565b915061535082615311565b600582019050919050565b5f615366828461517d565b60208201915061537582615339565b915081905092915050565b7f66656574000000000000000000000000000000000000000000000000000000005f82015250565b5f6153b4600483614c7e565b91506153bf82615380565b600482019050919050565b5f6153d5828461517d565b6020820191506153e4826153a8565b915081905092915050565b7f66616365000000000000000000000000000000000000000000000000000000005f82015250565b5f615423600483614c7e565b915061542e826153ef565b600482019050919050565b5f615444828461517d565b60208201915061545382615417565b915081905092915050565b7f68656164000000000000000000000000000000000000000000000000000000005f82015250565b5f615492600483614c7e565b915061549d8261545e565b600482019050919050565b5f6154b3828461517d565b6020820191506154c282615486565b915081905092915050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f32305f8201527f30302f737667222076696577426f783d2230203020313620313622207368617060208201527f652d72656e646572696e673d2263726973704564676573222077696474683d2260408201527f35313222206865696768743d22353132223e0000000000000000000000000000606082015250565b5f615573607283614c7e565b915061557e826154cd565b607282019050919050565b7f3c726563742077696474683d22313622206865696768743d223136222066696c5f8201527f6c3d2223663964336164222f3e00000000000000000000000000000000000000602082015250565b5f6155e3602d83614c7e565b91506155ee82615589565b602d82019050919050565b7f3c2f7376673e00000000000000000000000000000000000000000000000000005f82015250565b5f61562d600683614c7e565b9150615638826155f9565b600682019050919050565b5f61564d82615567565b9150615658826155d7565b9150615664828a614d08565b91506156708289614d08565b915061567c8288614d08565b91506156888287614d08565b91506156948286614d08565b91506156a08285614d08565b91506156ac8284614d08565b91506156b782615621565b915081905098975050505050505050565b5f6156d2826141f0565b91506156dd836141f0565b92508282019050808211156156f5576156f4614a51565b5b92915050565b5f615705826141f0565b9150615710836141f0565b925082820261571e816141f0565b9150828204841483151761573557615734614a51565b5b5092915050565b7f7b2274726169745f74797065223a22426f6479222c202276616c7565223a22005f82015250565b5f615770601f83614c7e565b915061577b8261573c565b601f82019050919050565b7f227d2c00000000000000000000000000000000000000000000000000000000005f82015250565b5f6157ba600383614c7e565b91506157c582615786565b600382019050919050565b7f7b2274726169745f74797065223a224368657374222c202276616c7565223a225f82015250565b5f615804602083614c7e565b915061580f826157d0565b602082019050919050565b7f7b2274726169745f74797065223a2245796573222c202276616c7565223a22005f82015250565b5f61584e601f83614c7e565b91506158598261581a565b601f82019050919050565b7f7b2274726169745f74797065223a225370696b6573222c202276616c7565223a5f8201527f2200000000000000000000000000000000000000000000000000000000000000602082015250565b5f6158be602183614c7e565b91506158c982615864565b602182019050919050565b7f7b2274726169745f74797065223a2246656574222c202276616c7565223a22005f82015250565b5f615908601f83614c7e565b9150615913826158d4565b601f82019050919050565b7f7b2274726169745f74797065223a2246616365222c202276616c7565223a22005f82015250565b5f615952601f83614c7e565b915061595d8261591e565b601f82019050919050565b7f7b2274726169745f74797065223a2248656164222c202276616c7565223a22005f82015250565b5f61599c601f83614c7e565b91506159a782615968565b601f82019050919050565b7f227d0000000000000000000000000000000000000000000000000000000000005f82015250565b5f6159e6600283614c7e565b91506159f1826159b2565b600282019050919050565b5f615a0682615764565b9150615a12828a614c88565b9150615a1d826157ae565b9150615a28826157f8565b9150615a348289614c88565b9150615a3f826157ae565b9150615a4a82615842565b9150615a568288614c88565b9150615a61826157ae565b9150615a6c826158b2565b9150615a788287614c88565b9150615a83826157ae565b9150615a8e826158fc565b9150615a9a8286614c88565b9150615aa5826157ae565b9150615ab082615946565b9150615abc8285614c88565b9150615ac7826157ae565b9150615ad282615990565b9150615ade8284614c88565b9150615ae9826159da565b915081905098975050505050505050565b7f65000000000000000000000000000000000000000000000000000000000000005f82015250565b5f615b2e60018361413f565b9150615b3982615afa565b602082019050919050565b5f6020820190508181035f830152615b5b81615b22565b9050919050565b7f6c000000000000000000000000000000000000000000000000000000000000005f82015250565b5f615b9660018361413f565b9150615ba182615b62565b602082019050919050565b5f6020820190508181035f830152615bc381615b8a565b9050919050565b7f23000000000000000000000000000000000000000000000000000000000000005f82015250565b5f615bfe60018361413f565b9150615c0982615bca565b602082019050919050565b5f6020820190508181035f830152615c2b81615bf2565b9050919050565b7f3c7265637420783d2200000000000000000000000000000000000000000000005f82015250565b5f615c66600983614c7e565b9150615c7182615c32565b600982019050919050565b7f2220793d220000000000000000000000000000000000000000000000000000005f82015250565b5f615cb0600583614c7e565b9150615cbb82615c7c565b600582019050919050565b7f222077696474683d223122206865696768743d2231222066696c6c3d227267625f8201527f2800000000000000000000000000000000000000000000000000000000000000602082015250565b5f615d20602183614c7e565b9150615d2b82615cc6565b602182019050919050565b7f2c000000000000000000000000000000000000000000000000000000000000005f82015250565b5f615d6a600183614c7e565b9150615d7582615d36565b600182019050919050565b7f2922202f3e0000000000000000000000000000000000000000000000000000005f82015250565b5f615db4600583614c7e565b9150615dbf82615d80565b600582019050919050565b5f615dd58289614d08565b9150615de082615c5a565b9150615dec8288614d08565b9150615df782615ca4565b9150615e038287614d08565b9150615e0e82615d14565b9150615e1a8286614d08565b9150615e2582615d5e565b9150615e318285614d08565b9150615e3c82615d5e565b9150615e488284614d08565b9150615e5382615da8565b915081905097965050505050505056fe3c7265637420783d22302220793d2230222077696474683d223022206865696768743d2230222066696c6c3d2272676228302c302c3029222f3e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212200bd94cad79bbd623aa8c5128e5912d22eebe7a47baa534b1af1862cfb1d4f39f64736f6c634300081800330605c5c5c50705c5c5c50805c5c5c50905c5c5c50606c5c5c50806c5c5c50a06c5c5c506053b352007053b352008053b352009053b3520060655471c070655471c080655471c090655471c0a0654471c06076a571b07076a571b08076a571b09076a571b0a076a571b06087e661b07087e661b08087e661b04098d721906098d721907098e711908098e711909098d7219050aa1811d060aa1811d070aa1811d080aa0811d060bad8a1d080bad8a1d0704b7b7b70804b7b7b70605b7b7b70705b7b7b70805b7b7b70905b7b7b70606b7b7b70806b7b7b70a06b7b7b70707b6b7b70907b6b7b70b07b6b7b70504c2c2c20604c2c2c20704c2c2c20804c2c2c20505c2c2c20506c2c2c20606c2c2c20507c2c2c20607c2c2c2060545b1b9070545b1b9080545b1b9090547b1b9060645b1b9070645b1b9080645b1b9090645b1b90a0647b1b9060745b1b9070745b1b9080745b1b9090745b1b90a0747b1b9060845b1b9070845b1b9080845b1b9040947b1b9060945b1b9070945b1b9080945b1b9090947b1b9050a47b1b9060a45b1b9070a45b1b9080a45b1b9060b47b1b9080b47b1b90605745b2a0705745b2a0805745b2a0905735d2d0606745b2a0706745b2a0806745b2a0906745b2a0a06735d2d0607745b2a0707745b2a0807745b2a0907745b2a0a07735d2d0608745b2a0708745b2a0808745b2a0409745b2a0609745b2a0709745b2a0809745b2a0909735d2d050a745b2a060a745b2a070a745b2a080a745b2a060b735d2d080b735d2d06050f0f0f07050f0f0f08050f0f0f09050f0f0f06062525250706252525080625252509062525250a0625252506073c3c3c07073c3c3c08073c3c3c09073c3c3c0a073d3d3d06084e4e4e07084e4e4e08084e4e4e04096464640609646464070964646408096464640909656464050a7d7d7d060a7d7d7d070a7d7d7d080a7d7d7c060b929292080b9292920602eaeaea0702eaeaea0802e9e9e90603eaeaea0703eaeaea0803e9e9e90604eaeaea0704eaeaea0804e9e9e906050d524107050d524108050d524109050e534306060d524107060d524108060d524109060d52410a060e534306070d524107070d524108070d524109070d52410a070e534306080d524107080d524108080d524104090f544406090d524107090d524108090d524109090e5343050a0f5444060a0d5241070a0d5241080a0d5241060b0e5343080b0e5343040b84b3c60a0b84b3c6050c85b4c7060c85b5c7070c85b5c7080c85b4c7090c85b4c7060d464f53080d464f53010821212201092121220209212121020a212122030a212121010b212122030b212122040b212121020c212122040c212122050c212121060ce7e7e8070c212121080ce7e7e8060538235b070538235b080538235b090538245d060638235b070638235b080638235b090638235b0a0638245d060738235b070738235b080738235b090738235b0a0738245d060838235b070838235b080838235b040938255d060938235b070938235b080938235b090938245d050a38255d060a38235b070a38235b080a38235b060b38245d080b38245d0703ce71390803cd713a0903ce71390504ce71390604ce71390704cd713a0804cd713a0904cd713a07032424240803242424090325252405043dbac906043dbac907043dbac908043dbac909043dbac90605b76c3a0705b76c3a0805b76c3a0905b76d3b0606b76c3a0706b76c3a0806b76c3a0906b76c3a0a06b76d3b0607b76c3a0707b76c3a0807b76c3a0907b76c3a0a07b76d3b0608b76c3a0708b76c3a0808b76c3a0409b76c3a0609b76c3a0709b76c3a0809b76c3a0909b76d3b050ab76c3a060ab76c3a070ab76c3a080ab76c3a060bb76d3b080bb76d3b06036ca93407036ca93408036ca93406046ca93407046aa83508046aa83509046aa8350a046ba8350605954c780705954c780805954c780905944e7a0606954c780706954c780806954c780906954c780a06944e7a0607954c780707954c780807954c780907954c780a07944e7a0608954c780708954c780808954c780409954d780609954c780709954c780809954c780909944e7a050a954d78060a954c78070a954c78080a954c78060b944e7a080b944e7a060591362b070591362b080591362b090591352b060691352b070691362b080691362b090691362b0a0691352b060791352b070791362b080791362b090791362b0a0791352b060891352b070891362b080891362b040991352b060991362b070991362b080991362b090991352b050a91362b060a91362b070a91362b080a91352b060b91352b080b91352b0009222222000a222222010a222222000b222222020b222222000c222222010c222222020c222222030c222222010d222222030d222222050d3a9940060d3a9940070d3a9940080d3a993f06053e263407053e263408053e263409053e26340606532b420706532b420806532b420906532b420a06532b420607712f560707712f560807712f560907712f560a07712f56060895316b070895316b080895316b0409b82b7e0609a72e750709a72e750809a72e750909a72e75050ab82b7e060ab82b7e070ab82b7e080ab82b7e060bcf2d8c080bcf2d8c0605244235070524423608052442360905244235060621523d070621523d080621523d090621523d0a0621523e06072162470707216247080721624709072162470a072162470608226f4f0708226f4f0808226f4f040923875e060923875e070923875d080923875d090923875e050a239364060a239364070a239364080a239365060b229f6b080b229f6b0503f0a92a0703f1a9290903f0a92a0504f1a9290604f0a82b0704f0a82a0804f1a92a0904f0a92a060525398707052539870805253987090525398706062539870706253987080625398709062539870a0625398706072539870707253987080725398709072539870a0725398706082539870708253987080825398704092739860609253987070925398708092539870909253987050a273986060a253987070a253987080a253987060b253987080b25398706051e272e07051e272e08051e272e09051e272e0606203d510706203d510806203d510906203d510a06203d5106071e4f7107071e4f7108071e4f7109071e4f710a071e4f7106081a5a8507081a5a8508081b5a8504091b6aa006091a6aa107091a6aa108091a6aa109091b6aa0050a1b7bbd060a1b7bbd070a1b7bbd080a1b7bbd060b1c86ce080b1c86ce07061fdbfe08061fdbfe09061fdbfe0a061fdbfe0b061fdbfe0c061fdbfe0d061fdbfe0e061fdbfe0f061fdbfe06051049e107051049e108051049e109051049e10a051049e104061049e105061049e106061049e108061049e10a061049e104071049e106071049e107071049e108071049e109071049e10a071049e1060553535307055353530805535353090553555606065353530706535353080653535309065353530a0653555606075353530707535353080753535309075353530a0753555606085353530708535353080853535304095454540609535353070953535308095353530909535556050a545454060a535353070a535353080a535353060b535556080b5355560605282d550705282d550805282d550905282d550606252e6e0706252e6e0806252e6e0906252e6e0a06252e6e06072530810707253081080725308109072530810a072630810608212e900708212e900808222e8f0409202ea506091f2fa507091f2fa508091f2ea50909202ea5050a2133b8060a2133b8070a2133b8080a2233b7060b1e32d3080b1e32d30605409ea80705409ea80805409ea80905409da806063477bb07063477bb08063477bb09063477bb0a063477bb0607334ebb0707334ebb0807334ebb0907334ebb0a07344ebb0608943ea90708943ea90808943ea804099c6e3a06099c6e3a07099c6e3a08099c6e3a09099c6e3b050a86a939060a86a939070a86a939080a86a83a060b41983b080b41983b060340a235070340a235080341a235050440a235060440a235070440a235080440a235090440a2350a0441a2350000000000000000000000002bea8d5556496b882d374b1d353d7c8b02993cd7

Deployed Bytecode

0x608060405234801561000f575f80fd5b50600436106101a7575f3560e01c806370a08231116100f7578063c87b56dd11610095578063e0df5b6f1161006f578063e0df5b6f146104cb578063e985e9c5146104e7578063f28ca1dd14610517578063f2fde38b14610535576101a7565b8063c87b56dd1461044d578063d547cfb71461047d578063dd62ed3e1461049b576101a7565b80639b19251a116100d15780639b19251a146103b5578063a22cb465146103e5578063a9059cbb14610401578063b88d4fde14610431576101a7565b806370a08231146103495780638da5cb5b1461037957806395d89b4114610397576101a7565b80632b968958116101645780634f02c4201161013e5780634f02c420146102c3578063504334c2146102e157806353d6fd59146102fd5780636352211e14610319576101a7565b80632b9689581461027f578063313ce5671461028957806342842e0e146102a7576101a7565b806306fdde03146101ab578063081812fc146101c9578063095ea7b3146101f957806318160ddd1461022957806318d217c31461024757806323b872dd14610263575b5f80fd5b6101b3610551565b6040516101c091906141bf565b60405180910390f35b6101e360048036038101906101de9190614223565b6105dd565b6040516101f0919061428d565b60405180910390f35b610213600480360381019061020e91906142d0565b61060d565b6040516102209190614328565b60405180910390f35b6102316108f4565b60405161023e9190614350565b60405180910390f35b610261600480360381019061025c9190614495565b610918565b005b61027d600480360381019061027891906144dc565b6109af565b005b6102876111a6565b005b6102916112c5565b60405161029e9190614547565b60405180910390f35b6102c160048036038101906102bc91906144dc565b6112e9565b005b6102cb611418565b6040516102d89190614350565b60405180910390f35b6102fb60048036038101906102f69190614560565b61141e565b005b61031760048036038101906103129190614600565b6114b0565b005b610333600480360381019061032e9190614223565b61158c565b604051610340919061428d565b60405180910390f35b610363600480360381019061035e919061463e565b61162a565b6040516103709190614350565b60405180910390f35b61038161163f565b60405161038e919061428d565b60405180910390f35b61039f611662565b6040516103ac91906141bf565b60405180910390f35b6103cf60048036038101906103ca919061463e565b6116ee565b6040516103dc9190614328565b60405180910390f35b6103ff60048036038101906103fa9190614600565b61170b565b005b61041b600480360381019061041691906142d0565b611803565b6040516104289190614328565b60405180910390f35b61044b600480360381019061044691906146c6565b611817565b005b61046760048036038101906104629190614223565b61194c565b60405161047491906141bf565b60405180910390f35b610485611b25565b60405161049291906141bf565b60405180910390f35b6104b560048036038101906104b0919061474a565b611bb1565b6040516104c29190614350565b60405180910390f35b6104e560048036038101906104e09190614495565b611bd1565b005b61050160048036038101906104fc919061474a565b611c68565b60405161050e9190614328565b60405180910390f35b61051f611c92565b60405161052c91906141bf565b60405180910390f35b61054f600480360381019061054a919061463e565b611d1e565b005b6001805461055e906147b5565b80601f016020809104026020016040519081016040528092919081815260200182805461058a906147b5565b80156105d55780601f106105ac576101008083540402835291602001916105d5565b820191905f5260205f20905b8154815290600101906020018083116105b857829003601f168201915b505050505081565b6006602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600354821115801561061f57505f82115b15610807575f60085f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610716575060075f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561074d576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360065f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516107f99190614350565b60405180910390a3506108ea565b8160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516108e19190614350565b60405180910390a35b6001905092915050565b7f00000000000000000000000000000000000000000000021e19e0c9bab240000081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461099c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80602190816109ab9190614982565b5050565b60035481116110675760085f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610a4d576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ab2576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610b70575060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015610bd8575060065f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610c0f576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c17611ea3565b60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610c629190614a7e565b92505081905550610c71611ea3565b60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f60095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610dc79190614a7e565b81548110610dd857610dd7614ab1565b5b905f5260205f20015490508060095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600a5f8581526020019081526020015f205481548110610e4457610e43614ab1565b5b905f5260205f20018190555060095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480610e9d57610e9c614ade565b5b600190038181905f5260205f20015f90559055600a5f8381526020019081526020015f2054600a5f8381526020019081526020015f208190555060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610f859190614a7e565b600a5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e03148761104c611ea3565b6040516110599190614350565b60405180910390a3506111a1565b5f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146111935781816111169190614a7e565b60055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b61119e848484611ed6565b50505b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461122a576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b7f000000000000000000000000000000000000000000000000000000000000001281565b6112f48383836109af565b5f8273ffffffffffffffffffffffffffffffffffffffff163b141580156113dc575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b815260040161137a93929190614b3e565b6020604051808303815f875af1158015611396573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ba9190614bdb565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611413576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60035481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114a2576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114ac828261221a565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611534576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611625576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6004602052805f5260405f205f915090505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002805461166f906147b5565b80601f016020809104026020016040519081016040528092919081815260200182805461169b906147b5565b80156116e65780601f106116bd576101008083540402835291602001916116e6565b820191905f5260205f20905b8154815290600101906020018083116116c957829003601f168201915b505050505081565b600b602052805f5260405f205f915054906101000a900460ff1681565b8060075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117f79190614328565b60405180910390a35050565b5f61180f338484611ed6565b905092915050565b6118228585856109af565b5f8473ffffffffffffffffffffffffffffffffffffffff163b1415801561190e575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b81526004016118ac959493929190614c32565b6020604051808303815f875af11580156118c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118ec9190614bdb565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611945576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60605f6022805461195c906147b5565b9050111561199657602261196f8361223e565b604051602001611980929190614d38565b6040516020818303038152906040529050611b20565b5f6119a083612308565b90505f6119ac82612cb2565b90505f6119b882613239565b90505f6119c4846133ac565b90505f6119d08761223e565b6040516020016119e09190614d81565b6040516020818303038152906040526040516020016119ff9190614eae565b60405160208183030381529060405283604051602001611a1f9190614ecf565b604051602081830303815290604052604051602001611a3f929190614ee5565b60405160208183030381529060405290505f82604051602001611a629190614f2e565b60405160208183030381529060405290505f6040518060400160405280600281526020017f5d7d0000000000000000000000000000000000000000000000000000000000008152509050611af78383604051602001611ac2929190614ee5565b60405160208183030381529060405282604051602001611ae3929190614ee5565b604051602081830303815290604052613239565b604051602001611b079190614f79565b6040516020818303038152906040529750505050505050505b919050565b60228054611b32906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054611b5e906147b5565b8015611ba95780601f10611b8057610100808354040283529160200191611ba9565b820191905f5260205f20905b815481529060010190602001808311611b8c57829003601f168201915b505050505081565b6005602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c55576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060229081611c649190614982565b5050565b6007602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b60218054611c9f906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ccb906147b5565b8015611d165780601f10611ced57610100808354040283529160200191611d16565b820191905f5260205f20905b815481529060010190602001808311611cf957829003601f168201915b505050505081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611da2576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e07576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b5f7f0000000000000000000000000000000000000000000000000000000000000012600a611ed191906150cd565b905090565b5f80611ee0611ea3565b90505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508460045f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611fb09190614a7e565b925050819055508460045f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550600b5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166120d4575f8360045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546120999190615144565b84846120a59190615144565b6120af9190614a7e565b90505f5b818110156120d1576120c48961354a565b80806001019150506120b3565b50505b600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166121a7575f838261212f9190615144565b8460045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546121789190615144565b6121829190614a7e565b90505f5b818110156121a4576121978861378f565b8080600101915050612186565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487876040516122049190614350565b60405180910390a3600193505050509392505050565b81600190816122299190614982565b5080600290816122399190614982565b505050565b60605f600161224c84613a11565b0190505f8167ffffffffffffffff81111561226a57612269614371565b5b6040519080825280601f01601f19166020018201604052801561229c5781602001600182028036833780820191505090505b5090505f82602001820190505b6001156122fd578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816122f2576122f1615117565b5b0494505f85036122a9575b819350505050919050565b612310614113565b6040518060e0016040528061247460648560405160200161233191906151de565b604051602081830303815290604052805190602001205f1c6123539190615203565b600c805480602002602001604051908101604052809291908181526020015f905b8282101561241c578382905f5260205f20018054612391906147b5565b80601f01602080910402602001604051908101604052809291908181526020018280546123bd906147b5565b80156124085780601f106123df57610100808354040283529160200191612408565b820191905f5260205f20905b8154815290600101906020018083116123eb57829003601f168201915b505050505081526020019060010190612374565b50505050600e80548060200260200160405190810160405280929190818152602001828054801561246a57602002820191905f5260205f20905b815481526020019060010190808311612456575b5050505050613b62565b81526020016125d260648560405160200161248f919061527d565b604051602081830303815290604052805190602001205f1c6124b19190615203565b600f805480602002602001604051908101604052809291908181526020015f905b8282101561257a578382905f5260205f200180546124ef906147b5565b80601f016020809104026020016040519081016040528092919081815260200182805461251b906147b5565b80156125665780601f1061253d57610100808354040283529160200191612566565b820191905f5260205f20905b81548152906001019060200180831161254957829003601f168201915b5050505050815260200190600101906124d2565b5050505060118054806020026020016040519081016040528092919081815260200182805480156125c857602002820191905f5260205f20905b8154815260200190600101908083116125b4575b5050505050613b62565b81526020016127306064856040516020016125ed91906152ec565b604051602081830303815290604052805190602001205f1c61260f9190615203565b6012805480602002602001604051908101604052809291908181526020015f905b828210156126d8578382905f5260205f2001805461264d906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054612679906147b5565b80156126c45780601f1061269b576101008083540402835291602001916126c4565b820191905f5260205f20905b8154815290600101906020018083116126a757829003601f168201915b505050505081526020019060010190612630565b50505050601480548060200260200160405190810160405280929190818152602001828054801561272657602002820191905f5260205f20905b815481526020019060010190808311612712575b5050505050613b62565b815260200161288e60648560405160200161274b919061535b565b604051602081830303815290604052805190602001205f1c61276d9190615203565b601e805480602002602001604051908101604052809291908181526020015f905b82821015612836578382905f5260205f200180546127ab906147b5565b80601f01602080910402602001604051908101604052809291908181526020018280546127d7906147b5565b80156128225780601f106127f957610100808354040283529160200191612822565b820191905f5260205f20905b81548152906001019060200180831161280557829003601f168201915b50505050508152602001906001019061278e565b50505050602080548060200260200160405190810160405280929190818152602001828054801561288457602002820191905f5260205f20905b815481526020019060010190808311612870575b5050505050613b62565b81526020016129ec6064856040516020016128a991906153ca565b604051602081830303815290604052805190602001205f1c6128cb9190615203565b6018805480602002602001604051908101604052809291908181526020015f905b82821015612994578382905f5260205f20018054612909906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054612935906147b5565b80156129805780601f1061295757610100808354040283529160200191612980565b820191905f5260205f20905b81548152906001019060200180831161296357829003601f168201915b5050505050815260200190600101906128ec565b50505050601a8054806020026020016040519081016040528092919081815260200182805480156129e257602002820191905f5260205f20905b8154815260200190600101908083116129ce575b5050505050613b62565b8152602001612b4a606485604051602001612a079190615439565b604051602081830303815290604052805190602001205f1c612a299190615203565b6015805480602002602001604051908101604052809291908181526020015f905b82821015612af2578382905f5260205f20018054612a67906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054612a93906147b5565b8015612ade5780601f10612ab557610100808354040283529160200191612ade565b820191905f5260205f20905b815481529060010190602001808311612ac157829003601f168201915b505050505081526020019060010190612a4a565b505050506017805480602002602001604051908101604052809291908181526020018280548015612b4057602002820191905f5260205f20905b815481526020019060010190808311612b2c575b5050505050613b62565b8152602001612ca8606485604051602001612b6591906154a8565b604051602081830303815290604052805190602001205f1c612b879190615203565b601b805480602002602001604051908101604052809291908181526020015f905b82821015612c50578382905f5260205f20018054612bc5906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054612bf1906147b5565b8015612c3c5780601f10612c1357610100808354040283529160200191612c3c565b820191905f5260205f20905b815481529060010190602001808311612c1f57829003601f168201915b505050505081526020019060010190612ba8565b50505050601d805480602002602001604051908101604052809291908181526020018280548015612c9e57602002820191905f5260205f20905b815481526020019060010190808311612c8a575b5050505050613b62565b8152509050919050565b60605f612d77600c845f60078110612ccd57612ccc614ab1565b5b602002015181548110612ce357612ce2614ab1565b5b905f5260205f20018054612cf6906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054612d22906147b5565b8015612d6d5780601f10612d4457610100808354040283529160200191612d6d565b820191905f5260205f20905b815481529060010190602001808311612d5057829003601f168201915b5050505050613c39565b612e3a600f85600160078110612d9057612d8f614ab1565b5b602002015181548110612da657612da5614ab1565b5b905f5260205f20018054612db9906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054612de5906147b5565b8015612e305780601f10612e0757610100808354040283529160200191612e30565b820191905f5260205f20905b815481529060010190602001808311612e1357829003601f168201915b5050505050613c39565b612efd601286600260078110612e5357612e52614ab1565b5b602002015181548110612e6957612e68614ab1565b5b905f5260205f20018054612e7c906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054612ea8906147b5565b8015612ef35780601f10612eca57610100808354040283529160200191612ef3565b820191905f5260205f20905b815481529060010190602001808311612ed657829003601f168201915b5050505050613c39565b612fc0601e87600360078110612f1657612f15614ab1565b5b602002015181548110612f2c57612f2b614ab1565b5b905f5260205f20018054612f3f906147b5565b80601f0160208091040260200160405190810160405280929190818152602001828054612f6b906147b5565b8015612fb65780601f10612f8d57610100808354040283529160200191612fb6565b820191905f5260205f20905b815481529060010190602001808311612f9957829003601f168201915b5050505050613c39565b613083601888600460078110612fd957612fd8614ab1565b5b602002015181548110612fef57612fee614ab1565b5b905f5260205f20018054613002906147b5565b80601f016020809104026020016040519081016040528092919081815260200182805461302e906147b5565b80156130795780601f1061305057610100808354040283529160200191613079565b820191905f5260205f20905b81548152906001019060200180831161305c57829003601f168201915b5050505050613c39565b61314660158960056007811061309c5761309b614ab1565b5b6020020151815481106130b2576130b1614ab1565b5b905f5260205f200180546130c5906147b5565b80601f01602080910402602001604051908101604052809291908181526020018280546130f1906147b5565b801561313c5780601f106131135761010080835404028352916020019161313c565b820191905f5260205f20905b81548152906001019060200180831161311f57829003601f168201915b5050505050613c39565b613209601b8a60066007811061315f5761315e614ab1565b5b60200201518154811061317557613174614ab1565b5b905f5260205f20018054613188906147b5565b80601f01602080910402602001604051908101604052809291908181526020018280546131b4906147b5565b80156131ff5780601f106131d6576101008083540402835291602001916131ff565b820191905f5260205f20905b8154815290600101906020018083116131e257829003601f168201915b5050505050613c39565b60405160200161321f9796959493929190615643565b604051602081830303815290604052905080915050919050565b60605f8251036132595760405180602001604052805f81525090506133a7565b5f604051806060016040528060408152602001615e9e6040913990505f60036002855161328691906156c8565b6132909190615144565b600461329c91906156fb565b90505f6020826132ac91906156c8565b67ffffffffffffffff8111156132c5576132c4614371565b5b6040519080825280601f01601f1916602001820160405280156132f75781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015613366576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f811685015182536001820191505061330b565b60038951066001811461338057600281146133905761339b565b613d3d60f01b600283035261339b565b603d60f81b60018303525b50505050508093505050505b919050565b60605f600d835f600781106133c4576133c3614ab1565b5b6020020151815481106133da576133d9614ab1565b5b905f5260205f20016010846001600781106133f8576133f7614ab1565b5b60200201518154811061340e5761340d614ab1565b5b905f5260205f200160138560026007811061342c5761342b614ab1565b5b60200201518154811061344257613441614ab1565b5b905f5260205f2001601f866003600781106134605761345f614ab1565b5b60200201518154811061347657613475614ab1565b5b905f5260205f200160198760046007811061349457613493614ab1565b5b6020020151815481106134aa576134a9614ab1565b5b905f5260205f20016016886005600781106134c8576134c7614ab1565b5b6020020151815481106134de576134dd614ab1565b5b905f5260205f2001601c896006600781106134fc576134fb614ab1565b5b60200201518154811061351257613511614ab1565b5b905f5260205f200160405160200161353097969594939291906159fc565b604051602081830303815290604052905080915050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036135af576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061363a9190614a7e565b8154811061364b5761364a614ab1565b5b905f5260205f200154905060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806136a3576136a2614ade565b5b600190038181905f5260205f20015f90559055600a5f8281526020019081526020015f205f905560085f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036137f4576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f81548092919060010191905055505f60035490505f73ffffffffffffffffffffffffffffffffffffffff1660085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146138a0576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061399d9190614a7e565b600a5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613a6d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613a6357613a62615117565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613aaa576d04ee2d6d415b85acef81000000008381613aa057613a9f615117565b5b0492506020810190505b662386f26fc100008310613ad957662386f26fc100008381613acf57613ace615117565b5b0492506010810190505b6305f5e1008310613b02576305f5e1008381613af857613af7615117565b5b0492506008810190505b6127108310613b27576127108381613b1d57613b1c615117565b5b0492506004810190505b60648310613b4a5760648381613b4057613b3f615117565b5b0492506002810190505b600a8310613b59576001810190505b80915050919050565b5f80835111613ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b9d90615b44565b60405180910390fd5b8151835114613bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613be190615bac565b60405180910390fd5b5f5b8251811015613c2d57828181518110613c0857613c07614ab1565b5b6020026020010151851015613c205780915050613c32565b8080600101915050613bec565b505f90505b9392505050565b60605f60058351613c4a9190615203565b14613c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c8190615c14565b60405180910390fd5b5f825103613cb2576040518060600160405280603a8152602001615e64603a9139905061410e565b5f60058351613cc19190615144565b905060605f8267ffffffffffffffff811115613ce057613cdf614371565b5b604051908082528060200260200182016040528015613d0e5781602001602082028036833780820191505090505b5090505f8367ffffffffffffffff811115613d2c57613d2b614371565b5b604051908082528060200260200182016040528015613d5a5781602001602082028036833780820191505090505b5090505f8467ffffffffffffffff811115613d7857613d77614371565b5b604051908082528060200260200182016040528015613da65781602001602082028036833780820191505090505b5090505f8567ffffffffffffffff811115613dc457613dc3614371565b5b604051908082528060200260200182016040528015613df25781602001602082028036833780820191505090505b5090505f8667ffffffffffffffff811115613e1057613e0f614371565b5b604051908082528060200260200182016040528015613e3e5781602001602082028036833780820191505090505b5090505f5b878110156141025789600582613e5991906156fb565b81518110613e6a57613e69614ab1565b5b602001015160f81c60f81b60f81c60ff16868281518110613e8e57613e8d614ab1565b5b602002602001018181525050896001600583613eaa91906156fb565b613eb491906156c8565b81518110613ec557613ec4614ab1565b5b602001015160f81c60f81b60f81c60ff16858281518110613ee957613ee8614ab1565b5b602002602001018181525050896002600583613f0591906156fb565b613f0f91906156c8565b81518110613f2057613f1f614ab1565b5b602001015160f81c60f81b60f81c60ff16848281518110613f4457613f43614ab1565b5b602002602001018181525050896003600583613f6091906156fb565b613f6a91906156c8565b81518110613f7b57613f7a614ab1565b5b602001015160f81c60f81b60f81c60ff16838281518110613f9f57613f9e614ab1565b5b602002602001018181525050896004600583613fbb91906156fb565b613fc591906156c8565b81518110613fd657613fd5614ab1565b5b602001015160f81c60f81b60f81c60ff16828281518110613ffa57613ff9614ab1565b5b6020026020010181815250505f61402a87838151811061401d5761401c614ab1565b5b602002602001015161223e565b90505f61405087848151811061404357614042614ab1565b5b602002602001015161223e565b90505f61407687858151811061406957614068614ab1565b5b602002602001015161223e565b90505f61409c87868151811061408f5761408e614ab1565b5b602002602001015161223e565b90505f6140c28787815181106140b5576140b4614ab1565b5b602002602001015161223e565b90508b85858585856040516020016140df96959493929190615dca565b6040516020818303038152906040529b5050505050508080600101915050613e43565b50859750505050505050505b919050565b6040518060e00160405280600790602082028036833780820191505090505090565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561416c578082015181840152602081019050614151565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61419182614135565b61419b818561413f565b93506141ab81856020860161414f565b6141b481614177565b840191505092915050565b5f6020820190508181035f8301526141d78184614187565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b614202816141f0565b811461420c575f80fd5b50565b5f8135905061421d816141f9565b92915050565b5f60208284031215614238576142376141e8565b5b5f6142458482850161420f565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6142778261424e565b9050919050565b6142878161426d565b82525050565b5f6020820190506142a05f83018461427e565b92915050565b6142af8161426d565b81146142b9575f80fd5b50565b5f813590506142ca816142a6565b92915050565b5f80604083850312156142e6576142e56141e8565b5b5f6142f3858286016142bc565b92505060206143048582860161420f565b9150509250929050565b5f8115159050919050565b6143228161430e565b82525050565b5f60208201905061433b5f830184614319565b92915050565b61434a816141f0565b82525050565b5f6020820190506143635f830184614341565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6143a782614177565b810181811067ffffffffffffffff821117156143c6576143c5614371565b5b80604052505050565b5f6143d86141df565b90506143e4828261439e565b919050565b5f67ffffffffffffffff82111561440357614402614371565b5b61440c82614177565b9050602081019050919050565b828183375f83830152505050565b5f614439614434846143e9565b6143cf565b9050828152602081018484840111156144555761445461436d565b5b614460848285614419565b509392505050565b5f82601f83011261447c5761447b614369565b5b813561448c848260208601614427565b91505092915050565b5f602082840312156144aa576144a96141e8565b5b5f82013567ffffffffffffffff8111156144c7576144c66141ec565b5b6144d384828501614468565b91505092915050565b5f805f606084860312156144f3576144f26141e8565b5b5f614500868287016142bc565b9350506020614511868287016142bc565b92505060406145228682870161420f565b9150509250925092565b5f60ff82169050919050565b6145418161452c565b82525050565b5f60208201905061455a5f830184614538565b92915050565b5f8060408385031215614576576145756141e8565b5b5f83013567ffffffffffffffff811115614593576145926141ec565b5b61459f85828601614468565b925050602083013567ffffffffffffffff8111156145c0576145bf6141ec565b5b6145cc85828601614468565b9150509250929050565b6145df8161430e565b81146145e9575f80fd5b50565b5f813590506145fa816145d6565b92915050565b5f8060408385031215614616576146156141e8565b5b5f614623858286016142bc565b9250506020614634858286016145ec565b9150509250929050565b5f60208284031215614653576146526141e8565b5b5f614660848285016142bc565b91505092915050565b5f80fd5b5f80fd5b5f8083601f84011261468657614685614369565b5b8235905067ffffffffffffffff8111156146a3576146a2614669565b5b6020830191508360018202830111156146bf576146be61466d565b5b9250929050565b5f805f805f608086880312156146df576146de6141e8565b5b5f6146ec888289016142bc565b95505060206146fd888289016142bc565b945050604061470e8882890161420f565b935050606086013567ffffffffffffffff81111561472f5761472e6141ec565b5b61473b88828901614671565b92509250509295509295909350565b5f80604083850312156147605761475f6141e8565b5b5f61476d858286016142bc565b925050602061477e858286016142bc565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806147cc57607f821691505b6020821081036147df576147de614788565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026148417fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614806565b61484b8683614806565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61488661488161487c846141f0565b614863565b6141f0565b9050919050565b5f819050919050565b61489f8361486c565b6148b36148ab8261488d565b848454614812565b825550505050565b5f90565b6148c76148bb565b6148d2818484614896565b505050565b5b818110156148f5576148ea5f826148bf565b6001810190506148d8565b5050565b601f82111561493a5761490b816147e5565b614914846147f7565b81016020851015614923578190505b61493761492f856147f7565b8301826148d7565b50505b505050565b5f82821c905092915050565b5f61495a5f198460080261493f565b1980831691505092915050565b5f614972838361494b565b9150826002028217905092915050565b61498b82614135565b67ffffffffffffffff8111156149a4576149a3614371565b5b6149ae82546147b5565b6149b98282856148f9565b5f60209050601f8311600181146149ea575f84156149d8578287015190505b6149e28582614967565b865550614a49565b601f1984166149f8866147e5565b5f5b82811015614a1f578489015182556001820191506020850194506020810190506149fa565b86831015614a3c5784890151614a38601f89168261494b565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614a88826141f0565b9150614a93836141f0565b9250828203905081811115614aab57614aaa614a51565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82825260208201905092915050565b50565b5f614b295f83614b0b565b9150614b3482614b1b565b5f82019050919050565b5f608082019050614b515f83018661427e565b614b5e602083018561427e565b614b6b6040830184614341565b8181036060830152614b7c81614b1e565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614bba81614b86565b8114614bc4575f80fd5b50565b5f81519050614bd581614bb1565b92915050565b5f60208284031215614bf057614bef6141e8565b5b5f614bfd84828501614bc7565b91505092915050565b5f614c118385614b0b565b9350614c1e838584614419565b614c2783614177565b840190509392505050565b5f608082019050614c455f83018861427e565b614c52602083018761427e565b614c5f6040830186614341565b8181036060830152614c72818486614c06565b90509695505050505050565b5f81905092915050565b5f8154614c94816147b5565b614c9e8186614c7e565b9450600182165f8114614cb85760018114614ccd57614cff565b60ff1983168652811515820286019350614cff565b614cd6856147e5565b5f5b83811015614cf757815481890152600182019150602081019050614cd8565b838801955050505b50505092915050565b5f614d1282614135565b614d1c8185614c7e565b9350614d2c81856020860161414f565b80840191505092915050565b5f614d438285614c88565b9150614d4f8284614d08565b91508190509392505050565b7f7b226e616d65223a202244696e6f204e6f7420466f756e642023000000000000815250565b5f614d8b82614d5b565b601a82019150614d9b8284614d08565b915081905092915050565b7f222c226465736372697074696f6e223a224120636f6c6c656374696f6e206f665f8201527f2031302c3030302044696e6f7320656e61626c6564206279204552433430342c60208201527f20616e206578706572696d656e74616c20746f6b656e207374616e646172642e60408201527f222c2265787465726e616c5f75726c223a2268747470733a2f2f64696e6f6e6f60608201527f74666f756e642e636f6d222c22696d616765223a22646174613a696d6167652f60808201527f7376672b786d6c3b6261736536342c000000000000000000000000000000000060a082015250565b5f614e9860af83614c7e565b9150614ea382614da6565b60af82019050919050565b5f614eb98284614d08565b9150614ec482614e8c565b915081905092915050565b5f614eda8284614d08565b915081905092915050565b5f614ef08285614d08565b9150614efc8284614d08565b91508190509392505050565b7f222c2261747472696275746573223a5b00000000000000000000000000000000815250565b5f614f3882614f08565b601082019150614f488284614d08565b915081905092915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815250565b5f614f8382614f53565b601d82019150614f938284614d08565b915081905092915050565b5f8160011c9050919050565b5f808291508390505b6001851115614ff357808604811115614fcf57614fce614a51565b5b6001851615614fde5780820291505b8081029050614fec85614f9e565b9450614fb3565b94509492505050565b5f8261500b57600190506150c6565b81615018575f90506150c6565b816001811461502e576002811461503857615067565b60019150506150c6565b60ff84111561504a57615049614a51565b5b8360020a91508482111561506157615060614a51565b5b506150c6565b5060208310610133831016604e8410600b841016171561509c5782820a90508381111561509757615096614a51565b5b6150c6565b6150a98484846001614faa565b925090508184048111156150c0576150bf614a51565b5b81810290505b9392505050565b5f6150d7826141f0565b91506150e28361452c565b925061510f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614ffc565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61514e826141f0565b9150615159836141f0565b92508261516957615168615117565b5b828204905092915050565b5f819050919050565b61518e615189826141f0565b615174565b82525050565b7f626f6479000000000000000000000000000000000000000000000000000000005f82015250565b5f6151c8600483614c7e565b91506151d382615194565b600482019050919050565b5f6151e9828461517d565b6020820191506151f8826151bc565b915081905092915050565b5f61520d826141f0565b9150615218836141f0565b92508261522857615227615117565b5b828206905092915050565b7f63686573740000000000000000000000000000000000000000000000000000005f82015250565b5f615267600583614c7e565b915061527282615233565b600582019050919050565b5f615288828461517d565b6020820191506152978261525b565b915081905092915050565b7f65796500000000000000000000000000000000000000000000000000000000005f82015250565b5f6152d6600383614c7e565b91506152e1826152a2565b600382019050919050565b5f6152f7828461517d565b602082019150615306826152ca565b915081905092915050565b7f7370696b650000000000000000000000000000000000000000000000000000005f82015250565b5f615345600583614c7e565b915061535082615311565b600582019050919050565b5f615366828461517d565b60208201915061537582615339565b915081905092915050565b7f66656574000000000000000000000000000000000000000000000000000000005f82015250565b5f6153b4600483614c7e565b91506153bf82615380565b600482019050919050565b5f6153d5828461517d565b6020820191506153e4826153a8565b915081905092915050565b7f66616365000000000000000000000000000000000000000000000000000000005f82015250565b5f615423600483614c7e565b915061542e826153ef565b600482019050919050565b5f615444828461517d565b60208201915061545382615417565b915081905092915050565b7f68656164000000000000000000000000000000000000000000000000000000005f82015250565b5f615492600483614c7e565b915061549d8261545e565b600482019050919050565b5f6154b3828461517d565b6020820191506154c282615486565b915081905092915050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f32305f8201527f30302f737667222076696577426f783d2230203020313620313622207368617060208201527f652d72656e646572696e673d2263726973704564676573222077696474683d2260408201527f35313222206865696768743d22353132223e0000000000000000000000000000606082015250565b5f615573607283614c7e565b915061557e826154cd565b607282019050919050565b7f3c726563742077696474683d22313622206865696768743d223136222066696c5f8201527f6c3d2223663964336164222f3e00000000000000000000000000000000000000602082015250565b5f6155e3602d83614c7e565b91506155ee82615589565b602d82019050919050565b7f3c2f7376673e00000000000000000000000000000000000000000000000000005f82015250565b5f61562d600683614c7e565b9150615638826155f9565b600682019050919050565b5f61564d82615567565b9150615658826155d7565b9150615664828a614d08565b91506156708289614d08565b915061567c8288614d08565b91506156888287614d08565b91506156948286614d08565b91506156a08285614d08565b91506156ac8284614d08565b91506156b782615621565b915081905098975050505050505050565b5f6156d2826141f0565b91506156dd836141f0565b92508282019050808211156156f5576156f4614a51565b5b92915050565b5f615705826141f0565b9150615710836141f0565b925082820261571e816141f0565b9150828204841483151761573557615734614a51565b5b5092915050565b7f7b2274726169745f74797065223a22426f6479222c202276616c7565223a22005f82015250565b5f615770601f83614c7e565b915061577b8261573c565b601f82019050919050565b7f227d2c00000000000000000000000000000000000000000000000000000000005f82015250565b5f6157ba600383614c7e565b91506157c582615786565b600382019050919050565b7f7b2274726169745f74797065223a224368657374222c202276616c7565223a225f82015250565b5f615804602083614c7e565b915061580f826157d0565b602082019050919050565b7f7b2274726169745f74797065223a2245796573222c202276616c7565223a22005f82015250565b5f61584e601f83614c7e565b91506158598261581a565b601f82019050919050565b7f7b2274726169745f74797065223a225370696b6573222c202276616c7565223a5f8201527f2200000000000000000000000000000000000000000000000000000000000000602082015250565b5f6158be602183614c7e565b91506158c982615864565b602182019050919050565b7f7b2274726169745f74797065223a2246656574222c202276616c7565223a22005f82015250565b5f615908601f83614c7e565b9150615913826158d4565b601f82019050919050565b7f7b2274726169745f74797065223a2246616365222c202276616c7565223a22005f82015250565b5f615952601f83614c7e565b915061595d8261591e565b601f82019050919050565b7f7b2274726169745f74797065223a2248656164222c202276616c7565223a22005f82015250565b5f61599c601f83614c7e565b91506159a782615968565b601f82019050919050565b7f227d0000000000000000000000000000000000000000000000000000000000005f82015250565b5f6159e6600283614c7e565b91506159f1826159b2565b600282019050919050565b5f615a0682615764565b9150615a12828a614c88565b9150615a1d826157ae565b9150615a28826157f8565b9150615a348289614c88565b9150615a3f826157ae565b9150615a4a82615842565b9150615a568288614c88565b9150615a61826157ae565b9150615a6c826158b2565b9150615a788287614c88565b9150615a83826157ae565b9150615a8e826158fc565b9150615a9a8286614c88565b9150615aa5826157ae565b9150615ab082615946565b9150615abc8285614c88565b9150615ac7826157ae565b9150615ad282615990565b9150615ade8284614c88565b9150615ae9826159da565b915081905098975050505050505050565b7f65000000000000000000000000000000000000000000000000000000000000005f82015250565b5f615b2e60018361413f565b9150615b3982615afa565b602082019050919050565b5f6020820190508181035f830152615b5b81615b22565b9050919050565b7f6c000000000000000000000000000000000000000000000000000000000000005f82015250565b5f615b9660018361413f565b9150615ba182615b62565b602082019050919050565b5f6020820190508181035f830152615bc381615b8a565b9050919050565b7f23000000000000000000000000000000000000000000000000000000000000005f82015250565b5f615bfe60018361413f565b9150615c0982615bca565b602082019050919050565b5f6020820190508181035f830152615c2b81615bf2565b9050919050565b7f3c7265637420783d2200000000000000000000000000000000000000000000005f82015250565b5f615c66600983614c7e565b9150615c7182615c32565b600982019050919050565b7f2220793d220000000000000000000000000000000000000000000000000000005f82015250565b5f615cb0600583614c7e565b9150615cbb82615c7c565b600582019050919050565b7f222077696474683d223122206865696768743d2231222066696c6c3d227267625f8201527f2800000000000000000000000000000000000000000000000000000000000000602082015250565b5f615d20602183614c7e565b9150615d2b82615cc6565b602182019050919050565b7f2c000000000000000000000000000000000000000000000000000000000000005f82015250565b5f615d6a600183614c7e565b9150615d7582615d36565b600182019050919050565b7f2922202f3e0000000000000000000000000000000000000000000000000000005f82015250565b5f615db4600583614c7e565b9150615dbf82615d80565b600582019050919050565b5f615dd58289614d08565b9150615de082615c5a565b9150615dec8288614d08565b9150615df782615ca4565b9150615e038287614d08565b9150615e0e82615d14565b9150615e1a8286614d08565b9150615e2582615d5e565b9150615e318285614d08565b9150615e3c82615d5e565b9150615e488284614d08565b9150615e5382615da8565b915081905097965050505050505056fe3c7265637420783d22302220793d2230222077696474683d223022206865696768743d2230222066696c6c3d2272676228302c302c3029222f3e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212200bd94cad79bbd623aa8c5128e5912d22eebe7a47baa534b1af1862cfb1d4f39f64736f6c63430008180033

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

0000000000000000000000002bea8d5556496b882d374b1d353d7c8b02993cd7

-----Decoded View---------------
Arg [0] : _owner (address): 0x2BeA8d5556496b882D374b1d353D7c8b02993cD7

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000002bea8d5556496b882d374b1d353d7c8b02993cd7


Deployed Bytecode Sourcemap

50724:6863:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24198:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24909:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26740:642;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24434:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50993:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27789:1716;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22195:151;;;:::i;:::-;;24334:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29801:405;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24569:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51213:158;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26069:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26252:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24675:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21636:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24252;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25520:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27433:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29564:160;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30301:437;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56137:1447;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50796:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24789:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51099:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25020:68;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50768:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21968:219;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24198:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24909:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;26740:642::-;26843:4;26878:6;;26864:10;:20;;:38;;;;;26901:1;26888:10;:14;26864:38;26860:491;;;26919:13;26935:8;:20;26944:10;26935:20;;;;;;;;;;;;;;;;;;;;;26919:36;;26990:5;26976:19;;:10;:19;;;;:59;;;;;27000:16;:23;27017:5;27000:23;;;;;;;;;;;;;;;:35;27024:10;27000:35;;;;;;;;;;;;;;;;;;;;;;;;;26999:36;26976:59;26972:121;;;27063:14;;;;;;;;;;;;;;26972:121;27135:7;27109:11;:23;27121:10;27109:23;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;27180:7;27164:36;;27173:5;27164:36;;;27189:10;27164:36;;;;;;:::i;:::-;;;;;;;;26904:308;26860:491;;;27266:10;27233:9;:21;27243:10;27233:21;;;;;;;;;;;;;;;:30;27255:7;27233:30;;;;;;;;;;;;;;;:43;;;;27319:7;27298:41;;27307:10;27298:41;;;27328:10;27298:41;;;;;;:::i;:::-;;;;;;;;26860:491;27370:4;27363:11;;26740:642;;;;:::o;24434:36::-;;;:::o;50993:98::-;21723:5;;;;;;;;;;21709:19;;:10;:19;;;21705:46;;21737:14;;;;;;;;;;;;;;21705:46;51075:8:::1;51065:7;:18;;;;;;:::i;:::-;;50993:98:::0;:::o;27789:1716::-;27935:6;;27921:10;:20;27917:1581;;27970:8;:20;27979:10;27970:20;;;;;;;;;;;;;;;;;;;;;27962:28;;:4;:28;;;27958:91;;28018:15;;;;;;;;;;;;;;27958:91;28083:1;28069:16;;:2;:16;;;28065:82;;28113:18;;;;;;;;;;;;;;28065:82;28199:4;28185:18;;:10;:18;;;;:74;;;;;28225:16;:22;28242:4;28225:22;;;;;;;;;;;;;;;:34;28248:10;28225:34;;;;;;;;;;;;;;;;;;;;;;;;;28224:35;28185:74;:132;;;;;28294:11;:23;28306:10;28294:23;;;;;;;;;;;;;;;;;;;;;28280:37;;:10;:37;;;;28185:132;28163:226;;;28359:14;;;;;;;;;;;;;;28163:226;28424:10;:8;:10::i;:::-;28405:9;:15;28415:4;28405:15;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;28497:10;:8;:10::i;:::-;28480:9;:13;28490:2;28480:13;;;;;;;;;;;;;;;;:27;;;;;;;;;;;28562:2;28539:8;:20;28548:10;28539:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;28586:11;:23;28598:10;28586:23;;;;;;;;;;;;28579:30;;;;;;;;;;;28667:17;28687:6;:12;28694:4;28687:12;;;;;;;;;;;;;;;28722:1;28700:6;:12;28707:4;28700:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;28687:37;;;;;;;;:::i;:::-;;;;;;;;;;28667:57;;28779:9;28739:6;:12;28746:4;28739:12;;;;;;;;;;;;;;;28752:11;:23;28764:10;28752:23;;;;;;;;;;;;28739:37;;;;;;;;:::i;:::-;;;;;;;;;:49;;;;28823:6;:12;28830:4;28823:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28927:11;:23;28939:10;28927:23;;;;;;;;;;;;28902:11;:22;28914:9;28902:22;;;;;;;;;;;:48;;;;29004:6;:10;29011:2;29004:10;;;;;;;;;;;;;;;29020;29004:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29134:1;29114:6;:10;29121:2;29114:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;29088:11;:23;29100:10;29088:23;;;;;;;;;;;:47;;;;29176:10;29172:2;29157:30;;29166:4;29157:30;;;;;;;;;;;;29227:2;29207:35;;29221:4;29207:35;;;29231:10;:8;:10::i;:::-;29207:35;;;;;;:::i;:::-;;;;;;;;27943:1311;27917:1581;;;29275:15;29293:9;:15;29303:4;29293:15;;;;;;;;;;;;;;;:27;29309:10;29293:27;;;;;;;;;;;;;;;;29275:45;;29352:17;29341:7;:28;29337:101;;29428:10;29418:7;:20;;;;:::i;:::-;29388:9;:15;29398:4;29388:15;;;;;;;;;;;;;;;:27;29404:10;29388:27;;;;;;;;;;;;;;;:50;;;;29337:101;29455:31;29465:4;29471:2;29475:10;29455:9;:31::i;:::-;;29260:238;27917:1581;27789:1716;;;:::o;22195:151::-;21723:5;;;;;;;;;;21709:19;;:10;:19;;;21705:46;;21737:14;;;;;;;;;;;;;;21705:46;22274:1:::1;22258:5:::0;::::1;:18;;;;;;;;;;;;;;;;;;22335:1;22294:44;;22315:10;22294:44;;;;;;;;;;;;22195:151::o:0;24334:31::-;;;:::o;29801:405::-;29925:26;29938:4;29944:2;29948;29925:12;:26::i;:::-;30000:1;29982:2;:14;;;:19;;:154;;;;;30096:40;;;30018:118;;;30033:2;30018:35;;;30054:10;30066:4;30072:2;30018:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:118;;;;;29982:154;29964:235;;;30170:17;;;;;;;;;;;;;;29964:235;29801:405;;;:::o;24569:21::-;;;;:::o;51213:158::-;21723:5;;;;;;;;;;21709:19;;:10;:19;;;21705:46;;21737:14;;;;;;;;;;;;;;21705:46;51333:30:::1;51348:5;51355:7;51333:14;:30::i;:::-;51213:158:::0;;:::o;26069:111::-;21723:5;;;;;;;;;;21709:19;;:10;:19;;;21705:46;;21737:14;;;;;;;;;;;;;;21705:46;26167:5:::1;26147:9;:17;26157:6;26147:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;26069:111:::0;;:::o;26252:193::-;26310:13;26344:8;:12;26353:2;26344:12;;;;;;;;;;;;;;;;;;;;;26336:20;;26390:1;26373:19;;:5;:19;;;26369:69;;26416:10;;;;;;;;;;;;;;26369:69;26252:193;;;:::o;24675:44::-;;;;;;;;;;;;;;;;;:::o;21636:20::-;;;;;;;;;;;;:::o;24252:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25520:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;27433:207::-;27560:8;27519:16;:28;27536:10;27519:28;;;;;;;;;;;;;;;:38;27548:8;27519:38;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;27613:8;27586:46;;27601:10;27586:46;;;27623:8;27586:46;;;;;;:::i;:::-;;;;;;;;27433:207;;:::o;29564:160::-;29659:4;29683:33;29693:10;29705:2;29709:6;29683:9;:33::i;:::-;29676:40;;29564:160;;;;:::o;30301:437::-;30455:26;30468:4;30474:2;30478;30455:12;:26::i;:::-;30530:1;30512:2;:14;;;:19;;:156;;;;;30628:40;;;30548:120;;;30563:2;30548:35;;;30584:10;30596:4;30602:2;30606:4;;30548:63;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:120;;;;;30512:156;30494:237;;;30702:17;;;;;;;;;;;;;;30494:237;30301:437;;;;;:::o;56137:1447::-;56197:13;56256:1;56233:12;56227:26;;;;;:::i;:::-;;;:30;56223:1354;;;56295:12;56309:20;56326:2;56309:16;:20::i;:::-;56281:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56274:56;;;;56223:1354;56363:30;56396:9;56402:2;56396:5;:9::i;:::-;56363:42;;56448:22;56473;56482:12;56473:8;:22::i;:::-;56448:47;;56510:19;56532:30;56552:8;56532:13;:30::i;:::-;56510:52;;56577:20;56600:28;56615:12;56600:14;:28::i;:::-;56577:51;;56645:26;56786:20;56803:2;56786:16;:20::i;:::-;56742:65;;;;;;;;:::i;:::-;;;;;;;;;;;;;56706:320;;;;;;;;:::i;:::-;;;;;;;;;;;;;57059:5;57045:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;56674:406;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56645:435;;57095:27;57176:6;57125:72;;;;;;;;:::i;:::-;;;;;;;;;;;;;57095:102;;57212:28;:35;;;;;;;;;;;;;;;;;;;57378:168;57452:12;57466:13;57438:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57507:14;57398:146;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57378:13;:168::i;:::-;57288:277;;;;;;;;:::i;:::-;;;;;;;;;;;;;57264:301;;;;;;;;;56137:1447;;;;:::o;50796:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24789:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51099:106::-;21723:5;;;;;;;;;;21709:19;;:10;:19;;;21705:46;;21737:14;;;;;;;;;;;;;;21705:46;51188:9:::1;51173:12;:24;;;;;;:::i;:::-;;51099:106:::0;:::o;25020:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50768:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21968:219::-;21723:5;;;;;;;;;;21709:19;;:10;:19;;;21705:46;;21737:14;;;;;;;;;;;;;;21705:46;22069:1:::1;22051:20;;:6;:20;;::::0;22047:47:::1;;22080:14;;;;;;;;;;;;;;22047:47;22115:6;22107:5;::::0;:14:::1;;;;;;;;;;;;;;;;;;22172:6;22139:40;;22160:10;22139:40;;;;;;;;;;;;21968:219:::0;:::o;31938:92::-;31981:7;32014:8;32008:2;:14;;;;:::i;:::-;32001:21;;31938:92;:::o;30806:1093::-;30919:4;30936:12;30951:10;:8;:10::i;:::-;30936:25;;30972:27;31002:9;:15;31012:4;31002:15;;;;;;;;;;;;;;;;30972:45;;31028:29;31060:9;:13;31070:2;31060:13;;;;;;;;;;;;;;;;31028:45;;31105:6;31086:9;:15;31096:4;31086:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;31166:6;31149:9;:13;31159:2;31149:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;31257:9;:15;31267:4;31257:15;;;;;;;;;;;;;;;;;;;;;;;;;31252:251;;31289:22;31381:4;31363:9;:15;31373:4;31363:15;;;;;;;;;;;;;;;;:22;;;;:::i;:::-;31337:4;31315:19;:26;;;;:::i;:::-;31314:72;;;;:::i;:::-;31289:97;;31406:9;31401:91;31425:14;31421:1;:18;31401:91;;;31465:11;31471:4;31465:5;:11::i;:::-;31441:3;;;;;;;31401:91;;;;31274:229;31252:251;31579:9;:13;31589:2;31579:13;;;;;;;;;;;;;;;;;;;;;;;;;31574:247;;31609:22;31701:4;31677:21;:28;;;;:::i;:::-;31651:4;31635:9;:13;31645:2;31635:13;;;;;;;;;;;;;;;;:20;;;;:::i;:::-;31634:72;;;;:::i;:::-;31609:97;;31726:9;31721:89;31745:14;31741:1;:18;31721:89;;;31785:9;31791:2;31785:5;:9::i;:::-;31761:3;;;;;;;31721:89;;;;31594:227;31574:247;31858:2;31838:31;;31852:4;31838:31;;;31862:6;31838:31;;;;;;:::i;:::-;;;;;;;;31887:4;31880:11;;;;;30806:1093;;;;;:::o;32901:160::-;33021:5;33014:4;:12;;;;;;:::i;:::-;;33046:7;33037:6;:16;;;;;;:::i;:::-;;32901:160;;:::o;18929:718::-;18985:13;19036:14;19073:1;19053:17;19064:5;19053:10;:17::i;:::-;:21;19036:38;;19089:20;19123:6;19112:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19089:41;;19145:11;19274:6;19270:2;19266:15;19258:6;19254:28;19247:35;;19311:290;19318:4;19311:290;;;19343:5;;;;;;;;19485:10;19480:2;19473:5;19469:14;19464:32;19459:3;19451:46;19543:2;19534:11;;;;;;:::i;:::-;;;;;19577:1;19568:5;:10;19311:290;19564:21;19311:290;19622:6;19615:13;;;;;18929:718;;;:::o;55117:1012::-;55167:17;;:::i;:::-;55239:882;;;;;;;;55261:108;55336:3;55320:2;55303:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;55293:39;;;;;;55285:48;;:54;;;;:::i;:::-;55341:9;55261:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55352:16;55261:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;:108::i;:::-;55239:882;;;;55384:111;55460:3;55443:2;55426:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;55416:40;;;;;;55408:49;;:55;;;;:::i;:::-;55465:10;55384:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55477:17;55384:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;:111::i;:::-;55239:882;;;;55510:105;55584:3;55569:2;55552:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;55542:38;;;;;;55534:47;;:53;;;;:::i;:::-;55589:8;55510:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55599:15;55510:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;:105::i;:::-;55239:882;;;;55630:111;55706:3;55689:2;55672:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;55662:40;;;;;;55654:49;;:55;;;;:::i;:::-;55711:10;55630:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55723:17;55630:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;:111::i;:::-;55239:882;;;;55756:108;55831:3;55815:2;55798:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;55788:39;;;;;;55780:48;;:54;;;;:::i;:::-;55836:9;55756:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55847:16;55756:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;:108::i;:::-;55239:882;;;;55879:108;55954:3;55938:2;55921:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;55911:39;;;;;;55903:48;;:54;;;;:::i;:::-;55959:9;55879:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55970:16;55879:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;:108::i;:::-;55239:882;;;;56002:108;56077:3;56061:2;56044:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;56034:39;;;;;;56026:48;;:54;;;;:::i;:::-;56082:9;56002:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56093:16;56002:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;:108::i;:::-;55239:882;;;;;55117:1012;;;:::o;53073:793::-;53145:13;53171:17;53414:43;53431:9;53441:11;53453:1;53441:14;;;;;;;:::i;:::-;;;;;;53431:25;;;;;;;;:::i;:::-;;;;;;;;;53414:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:43::i;:::-;53472:44;53489:10;53500:11;53512:1;53500:14;;;;;;;:::i;:::-;;;;;;53489:26;;;;;;;;:::i;:::-;;;;;;;;;53472:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:44::i;:::-;53531:42;53548:8;53557:11;53569:1;53557:14;;;;;;;:::i;:::-;;;;;;53548:24;;;;;;;;:::i;:::-;;;;;;;;;53531:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:42::i;:::-;53588:44;53605:10;53616:11;53628:1;53616:14;;;;;;;:::i;:::-;;;;;;53605:26;;;;;;;;:::i;:::-;;;;;;;;;53588:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:44::i;:::-;53647:43;53664:9;53674:11;53686:1;53674:14;;;;;;;:::i;:::-;;;;;;53664:25;;;;;;;;:::i;:::-;;;;;;;;;53647:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:43::i;:::-;53705;53722:9;53732:11;53744:1;53732:14;;;;;;;:::i;:::-;;;;;;53722:25;;;;;;;;:::i;:::-;;;;;;;;;53705:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:43::i;:::-;53763;53780:9;53790:11;53802:1;53790:14;;;;;;;:::i;:::-;;;;;;53780:25;;;;;;;;:::i;:::-;;;;;;;;;53763:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:43::i;:::-;53198:638;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53171:666;;53855:3;53848:10;;;53073:793;;;:::o;33796:1912::-;33854:13;33899:1;33884:4;:11;:16;33880:31;;33902:9;;;;;;;;;;;;;;;;33880:31;33963:19;33985:12;;;;;;;;;;;;;;;;;33963:34;;34049:18;34095:1;34090;34076:4;:11;:15;;;;:::i;:::-;34075:21;;;;:::i;:::-;34070:1;:27;;;;:::i;:::-;34049:48;;34180:20;34227:2;34214:10;:15;;;;:::i;:::-;34203:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34180:50;;34327:10;34319:6;34312:26;34422:1;34415:5;34411:13;34481:4;34532;34526:11;34517:7;34513:25;34628:2;34620:6;34616:15;34701:754;34720:6;34711:7;34708:19;34701:754;;;34820:1;34811:7;34807:15;34796:26;;34859:7;34853:14;34985:4;34977:5;34973:2;34969:14;34965:25;34955:8;34951:40;34945:47;34934:9;34926:67;35039:1;35028:9;35024:17;35011:30;;35118:4;35110:5;35106:2;35102:14;35098:25;35088:8;35084:40;35078:47;35067:9;35059:67;35172:1;35161:9;35157:17;35144:30;;35251:4;35243:5;35240:1;35235:14;35231:25;35221:8;35217:40;35211:47;35200:9;35192:67;35305:1;35294:9;35290:17;35277:30;;35384:4;35376:5;35364:25;35354:8;35350:40;35344:47;35333:9;35325:67;35438:1;35427:9;35423:17;35410:30;;34744:711;34701:754;;;35528:1;35521:4;35515:11;35511:19;35549:1;35544:54;;;;35617:1;35612:52;;;;35504:160;;35544:54;35588:6;35583:3;35579:16;35575:1;35564:9;35560:17;35553:43;35544:54;;35612:52;35656:4;35651:3;35647:14;35643:1;35632:9;35628:17;35621:41;35504:160;;34252:1423;;;;35694:6;35687:13;;;;;33796:1912;;;;:::o;54388:721::-;54461:13;54487:22;54581:11;54593:6;54600:1;54593:9;;;;;;;:::i;:::-;;;;;;54581:22;;;;;;;;:::i;:::-;;;;;;;;;54657:12;54670:6;54677:1;54670:9;;;;;;;:::i;:::-;;;;;;54657:23;;;;;;;;:::i;:::-;;;;;;;;;54733:10;54744:6;54751:1;54744:9;;;;;;;:::i;:::-;;;;;;54733:21;;;;;;;;:::i;:::-;;;;;;;;;54809:12;54822:6;54829:1;54822:9;;;;;;;:::i;:::-;;;;;;54809:23;;;;;;;;:::i;:::-;;;;;;;;;54885:11;54897:6;54904:1;54897:9;;;;;;;:::i;:::-;;;;;;54885:22;;;;;;;;:::i;:::-;;;;;;;;;54960:11;54972:6;54979:1;54972:9;;;;;;;:::i;:::-;;;;;;54960:22;;;;;;;;:::i;:::-;;;;;;;;;55035:11;55047:6;55054:1;55047:9;;;;;;;:::i;:::-;;;;;;55035:22;;;;;;;;:::i;:::-;;;;;;;;;54519:555;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54487:588;;55093:8;55086:15;;;54388:721;;;:::o;32520:373::-;32597:1;32581:18;;:4;:18;;;32577:73;;32623:15;;;;;;;;;;;;;;32577:73;32662:10;32675:6;:12;32682:4;32675:12;;;;;;;;;;;;;;;32710:1;32688:6;:12;32695:4;32688:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;32675:37;;;;;;;;:::i;:::-;;;;;;;;;;32662:50;;32723:6;:12;32730:4;32723:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32759:11;:15;32771:2;32759:15;;;;;;;;;;;32752:22;;;32792:8;:12;32801:2;32792:12;;;;;;;;;;;;32785:19;;;;;;;;;;;32822:11;:15;32834:2;32822:15;;;;;;;;;;;;32815:22;;;;;;;;;;;32882:2;32878:1;32855:30;;32864:4;32855:30;;;;;;;;;;;;32566:327;32520:373;:::o;32038:474::-;32111:1;32097:16;;:2;:16;;;32093:74;;32137:18;;;;;;;;;;;;;;32093:74;32204:6;;:8;;;;;;;;;;;;;32236:10;32249:6;;32236:19;;32296:1;32272:26;;:8;:12;32281:2;32272:12;;;;;;;;;;;;;;;;;;;;;:26;;;32268:81;;32322:15;;;;;;;;;;;;;;32268:81;32376:2;32361:8;:12;32370:2;32361:12;;;;;;;;;;;;:17;;;;;;;;;;;;;;;;;;32389:6;:10;32396:2;32389:10;;;;;;;;;;;;;;;32405:2;32389:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32457:1;32437:6;:10;32444:2;32437:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;32419:11;:15;32431:2;32419:15;;;;;;;;;;;:39;;;;32501:2;32497;32476:28;;32493:1;32476:28;;;;;;;;;;;;32082:430;32038:474;:::o;14319:948::-;14372:7;14392:14;14409:1;14392:18;;14459:8;14450:5;:17;14446:106;;14497:8;14488:17;;;;;;:::i;:::-;;;;;14534:2;14524:12;;;;14446:106;14579:8;14570:5;:17;14566:106;;14617:8;14608:17;;;;;;:::i;:::-;;;;;14654:2;14644:12;;;;14566:106;14699:8;14690:5;:17;14686:106;;14737:8;14728:17;;;;;;:::i;:::-;;;;;14774:2;14764:12;;;;14686:106;14819:7;14810:5;:16;14806:103;;14856:7;14847:16;;;;;;:::i;:::-;;;;;14892:1;14882:11;;;;14806:103;14936:7;14927:5;:16;14923:103;;14973:7;14964:16;;;;;;:::i;:::-;;;;;15009:1;14999:11;;;;14923:103;15053:7;15044:5;:16;15040:103;;15090:7;15081:16;;;;;;:::i;:::-;;;;;15126:1;15116:11;;;;15040:103;15170:7;15161:5;:16;15157:68;;15208:1;15198:11;;;;15157:68;15253:6;15246:13;;;14319:948;;;:::o;53874:506::-;54000:4;54045:1;54025:10;:17;:21;54017:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;54092:16;:23;54071:10;:17;:44;54063:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;54147:6;54142:151;54163:16;:23;54159:1;:27;54142:151;;;54218:16;54235:1;54218:19;;;;;;;;:::i;:::-;;;;;;;;54211:4;:26;54208:74;;;54265:1;54258:8;;;;;54208:74;54188:3;;;;;;;54142:151;;;;54371:1;54364:8;;53874:506;;;;;;:::o;51379:1684::-;51447:13;51502:1;51497;51483:4;:11;:15;;;;:::i;:::-;:20;51475:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;51591:1;51576:4;:11;:16;51572:128;;51610:77;;;;;;;;;;;;;;;;;;;;;51572:128;51758:15;51790:1;51776:4;:11;:15;;;;:::i;:::-;51758:33;;51842:19;51874:15;51903:10;51892:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51874:40;;51925:15;51954:10;51943:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51925:40;;51976:15;52005:10;51994:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51976:40;;52027:15;52056:10;52045:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52027:40;;52078:15;52107:10;52096:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52078:40;;52202:6;52197:834;52218:10;52214:1;:14;52197:834;;;52328:4;52337:1;52333;:5;;;;:::i;:::-;52328:11;;;;;;;;:::i;:::-;;;;;;;;;;52322:18;;52315:25;;:1;52317;52315:4;;;;;;;;:::i;:::-;;;;;;;:25;;;;;52368:4;52381:1;52377;52373;:5;;;;:::i;:::-;:9;;;;:::i;:::-;52368:15;;;;;;;;:::i;:::-;;;;;;;;;;52362:22;;52355:29;;:1;52357;52355:4;;;;;;;;:::i;:::-;;;;;;;:29;;;;;52412:4;52425:1;52421;52417;:5;;;;:::i;:::-;:9;;;;:::i;:::-;52412:15;;;;;;;;:::i;:::-;;;;;;;;;;52406:22;;52399:29;;:1;52401;52399:4;;;;;;;;:::i;:::-;;;;;;;:29;;;;;52456:4;52469:1;52465;52461;:5;;;;:::i;:::-;:9;;;;:::i;:::-;52456:15;;;;;;;;:::i;:::-;;;;;;;;;;52450:22;;52443:29;;:1;52445;52443:4;;;;;;;;:::i;:::-;;;;;;;:29;;;;;52500:4;52513:1;52509;52505;:5;;;;:::i;:::-;:9;;;;:::i;:::-;52500:15;;;;;;;;:::i;:::-;;;;;;;;;;52494:22;;52487:29;;:1;52489;52487:4;;;;;;;;:::i;:::-;;;;;;;:29;;;;;52580:18;52601:22;52618:1;52620;52618:4;;;;;;;;:::i;:::-;;;;;;;;52601:16;:22::i;:::-;52580:43;;52638:18;52659:22;52676:1;52678;52676:4;;;;;;;;:::i;:::-;;;;;;;;52659:16;:22::i;:::-;52638:43;;52696:18;52717:22;52734:1;52736;52734:4;;;;;;;;:::i;:::-;;;;;;;;52717:16;:22::i;:::-;52696:43;;52754:18;52775:22;52792:1;52794;52792:4;;;;;;;;:::i;:::-;;;;;;;;52775:16;:22::i;:::-;52754:43;;52812:18;52833:22;52850:1;52852;52850:4;;;;;;;;:::i;:::-;;;;;;;;52833:16;:22::i;:::-;52812:43;;52904:5;52924:4;52939;52982;52993;53004;52887:131;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52872:147;;52235:796;;;;;52230:3;;;;;;;52197:834;;;;53050:5;53043:12;;;;;;;;;51379:1684;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:77;1713:7;1742:5;1731:16;;1676:77;;;:::o;1759:122::-;1832:24;1850:5;1832:24;:::i;:::-;1825:5;1822:35;1812:63;;1871:1;1868;1861:12;1812:63;1759:122;:::o;1887:139::-;1933:5;1971:6;1958:20;1949:29;;1987:33;2014:5;1987:33;:::i;:::-;1887:139;;;;:::o;2032:329::-;2091:6;2140:2;2128:9;2119:7;2115:23;2111:32;2108:119;;;2146:79;;:::i;:::-;2108:119;2266:1;2291:53;2336:7;2327:6;2316:9;2312:22;2291:53;:::i;:::-;2281:63;;2237:117;2032:329;;;;:::o;2367:126::-;2404:7;2444:42;2437:5;2433:54;2422:65;;2367:126;;;:::o;2499:96::-;2536:7;2565:24;2583:5;2565:24;:::i;:::-;2554:35;;2499:96;;;:::o;2601:118::-;2688:24;2706:5;2688:24;:::i;:::-;2683:3;2676:37;2601:118;;:::o;2725:222::-;2818:4;2856:2;2845:9;2841:18;2833:26;;2869:71;2937:1;2926:9;2922:17;2913:6;2869:71;:::i;:::-;2725:222;;;;:::o;2953:122::-;3026:24;3044:5;3026:24;:::i;:::-;3019:5;3016:35;3006:63;;3065:1;3062;3055:12;3006:63;2953:122;:::o;3081:139::-;3127:5;3165:6;3152:20;3143:29;;3181:33;3208:5;3181:33;:::i;:::-;3081:139;;;;:::o;3226:474::-;3294:6;3302;3351:2;3339:9;3330:7;3326:23;3322:32;3319:119;;;3357:79;;:::i;:::-;3319:119;3477:1;3502:53;3547:7;3538:6;3527:9;3523:22;3502:53;:::i;:::-;3492:63;;3448:117;3604:2;3630:53;3675:7;3666:6;3655:9;3651:22;3630:53;:::i;:::-;3620:63;;3575:118;3226:474;;;;;:::o;3706:90::-;3740:7;3783:5;3776:13;3769:21;3758:32;;3706:90;;;:::o;3802:109::-;3883:21;3898:5;3883:21;:::i;:::-;3878:3;3871:34;3802:109;;:::o;3917:210::-;4004:4;4042:2;4031:9;4027:18;4019:26;;4055:65;4117:1;4106:9;4102:17;4093:6;4055:65;:::i;:::-;3917:210;;;;:::o;4133:118::-;4220:24;4238:5;4220:24;:::i;:::-;4215:3;4208:37;4133:118;;:::o;4257:222::-;4350:4;4388:2;4377:9;4373:18;4365:26;;4401:71;4469:1;4458:9;4454:17;4445:6;4401:71;:::i;:::-;4257:222;;;;:::o;4485:117::-;4594:1;4591;4584:12;4608:117;4717:1;4714;4707:12;4731:180;4779:77;4776:1;4769:88;4876:4;4873:1;4866:15;4900:4;4897:1;4890:15;4917:281;5000:27;5022:4;5000:27;:::i;:::-;4992:6;4988:40;5130:6;5118:10;5115:22;5094:18;5082:10;5079:34;5076:62;5073:88;;;5141:18;;:::i;:::-;5073:88;5181:10;5177:2;5170:22;4960:238;4917:281;;:::o;5204:129::-;5238:6;5265:20;;:::i;:::-;5255:30;;5294:33;5322:4;5314:6;5294:33;:::i;:::-;5204:129;;;:::o;5339:308::-;5401:4;5491:18;5483:6;5480:30;5477:56;;;5513:18;;:::i;:::-;5477:56;5551:29;5573:6;5551:29;:::i;:::-;5543:37;;5635:4;5629;5625:15;5617:23;;5339:308;;;:::o;5653:146::-;5750:6;5745:3;5740;5727:30;5791:1;5782:6;5777:3;5773:16;5766:27;5653:146;;;:::o;5805:425::-;5883:5;5908:66;5924:49;5966:6;5924:49;:::i;:::-;5908:66;:::i;:::-;5899:75;;5997:6;5990:5;5983:21;6035:4;6028:5;6024:16;6073:3;6064:6;6059:3;6055:16;6052:25;6049:112;;;6080:79;;:::i;:::-;6049:112;6170:54;6217:6;6212:3;6207;6170:54;:::i;:::-;5889:341;5805:425;;;;;:::o;6250:340::-;6306:5;6355:3;6348:4;6340:6;6336:17;6332:27;6322:122;;6363:79;;:::i;:::-;6322:122;6480:6;6467:20;6505:79;6580:3;6572:6;6565:4;6557:6;6553:17;6505:79;:::i;:::-;6496:88;;6312:278;6250:340;;;;:::o;6596:509::-;6665:6;6714:2;6702:9;6693:7;6689:23;6685:32;6682:119;;;6720:79;;:::i;:::-;6682:119;6868:1;6857:9;6853:17;6840:31;6898:18;6890:6;6887:30;6884:117;;;6920:79;;:::i;:::-;6884:117;7025:63;7080:7;7071:6;7060:9;7056:22;7025:63;:::i;:::-;7015:73;;6811:287;6596:509;;;;:::o;7111:619::-;7188:6;7196;7204;7253:2;7241:9;7232:7;7228:23;7224:32;7221:119;;;7259:79;;:::i;:::-;7221:119;7379:1;7404:53;7449:7;7440:6;7429:9;7425:22;7404:53;:::i;:::-;7394:63;;7350:117;7506:2;7532:53;7577:7;7568:6;7557:9;7553:22;7532:53;:::i;:::-;7522:63;;7477:118;7634:2;7660:53;7705:7;7696:6;7685:9;7681:22;7660:53;:::i;:::-;7650:63;;7605:118;7111:619;;;;;:::o;7736:86::-;7771:7;7811:4;7804:5;7800:16;7789:27;;7736:86;;;:::o;7828:112::-;7911:22;7927:5;7911:22;:::i;:::-;7906:3;7899:35;7828:112;;:::o;7946:214::-;8035:4;8073:2;8062:9;8058:18;8050:26;;8086:67;8150:1;8139:9;8135:17;8126:6;8086:67;:::i;:::-;7946:214;;;;:::o;8166:834::-;8254:6;8262;8311:2;8299:9;8290:7;8286:23;8282:32;8279:119;;;8317:79;;:::i;:::-;8279:119;8465:1;8454:9;8450:17;8437:31;8495:18;8487:6;8484:30;8481:117;;;8517:79;;:::i;:::-;8481:117;8622:63;8677:7;8668:6;8657:9;8653:22;8622:63;:::i;:::-;8612:73;;8408:287;8762:2;8751:9;8747:18;8734:32;8793:18;8785:6;8782:30;8779:117;;;8815:79;;:::i;:::-;8779:117;8920:63;8975:7;8966:6;8955:9;8951:22;8920:63;:::i;:::-;8910:73;;8705:288;8166:834;;;;;:::o;9006:116::-;9076:21;9091:5;9076:21;:::i;:::-;9069:5;9066:32;9056:60;;9112:1;9109;9102:12;9056:60;9006:116;:::o;9128:133::-;9171:5;9209:6;9196:20;9187:29;;9225:30;9249:5;9225:30;:::i;:::-;9128:133;;;;:::o;9267:468::-;9332:6;9340;9389:2;9377:9;9368:7;9364:23;9360:32;9357:119;;;9395:79;;:::i;:::-;9357:119;9515:1;9540:53;9585:7;9576:6;9565:9;9561:22;9540:53;:::i;:::-;9530:63;;9486:117;9642:2;9668:50;9710:7;9701:6;9690:9;9686:22;9668:50;:::i;:::-;9658:60;;9613:115;9267:468;;;;;:::o;9741:329::-;9800:6;9849:2;9837:9;9828:7;9824:23;9820:32;9817:119;;;9855:79;;:::i;:::-;9817:119;9975:1;10000:53;10045:7;10036:6;10025:9;10021:22;10000:53;:::i;:::-;9990:63;;9946:117;9741:329;;;;:::o;10076:117::-;10185:1;10182;10175:12;10199:117;10308:1;10305;10298:12;10335:552;10392:8;10402:6;10452:3;10445:4;10437:6;10433:17;10429:27;10419:122;;10460:79;;:::i;:::-;10419:122;10573:6;10560:20;10550:30;;10603:18;10595:6;10592:30;10589:117;;;10625:79;;:::i;:::-;10589:117;10739:4;10731:6;10727:17;10715:29;;10793:3;10785:4;10777:6;10773:17;10763:8;10759:32;10756:41;10753:128;;;10800:79;;:::i;:::-;10753:128;10335:552;;;;;:::o;10893:963::-;10990:6;10998;11006;11014;11022;11071:3;11059:9;11050:7;11046:23;11042:33;11039:120;;;11078:79;;:::i;:::-;11039:120;11198:1;11223:53;11268:7;11259:6;11248:9;11244:22;11223:53;:::i;:::-;11213:63;;11169:117;11325:2;11351:53;11396:7;11387:6;11376:9;11372:22;11351:53;:::i;:::-;11341:63;;11296:118;11453:2;11479:53;11524:7;11515:6;11504:9;11500:22;11479:53;:::i;:::-;11469:63;;11424:118;11609:2;11598:9;11594:18;11581:32;11640:18;11632:6;11629:30;11626:117;;;11662:79;;:::i;:::-;11626:117;11775:64;11831:7;11822:6;11811:9;11807:22;11775:64;:::i;:::-;11757:82;;;;11552:297;10893:963;;;;;;;;:::o;11862:474::-;11930:6;11938;11987:2;11975:9;11966:7;11962:23;11958:32;11955:119;;;11993:79;;:::i;:::-;11955:119;12113:1;12138:53;12183:7;12174:6;12163:9;12159:22;12138:53;:::i;:::-;12128:63;;12084:117;12240:2;12266:53;12311:7;12302:6;12291:9;12287:22;12266:53;:::i;:::-;12256:63;;12211:118;11862:474;;;;;:::o;12342:180::-;12390:77;12387:1;12380:88;12487:4;12484:1;12477:15;12511:4;12508:1;12501:15;12528:320;12572:6;12609:1;12603:4;12599:12;12589:22;;12656:1;12650:4;12646:12;12677:18;12667:81;;12733:4;12725:6;12721:17;12711:27;;12667:81;12795:2;12787:6;12784:14;12764:18;12761:38;12758:84;;12814:18;;:::i;:::-;12758:84;12579:269;12528:320;;;:::o;12854:141::-;12903:4;12926:3;12918:11;;12949:3;12946:1;12939:14;12983:4;12980:1;12970:18;12962:26;;12854:141;;;:::o;13001:93::-;13038:6;13085:2;13080;13073:5;13069:14;13065:23;13055:33;;13001:93;;;:::o;13100:107::-;13144:8;13194:5;13188:4;13184:16;13163:37;;13100:107;;;;:::o;13213:393::-;13282:6;13332:1;13320:10;13316:18;13355:97;13385:66;13374:9;13355:97;:::i;:::-;13473:39;13503:8;13492:9;13473:39;:::i;:::-;13461:51;;13545:4;13541:9;13534:5;13530:21;13521:30;;13594:4;13584:8;13580:19;13573:5;13570:30;13560:40;;13289:317;;13213:393;;;;;:::o;13612:60::-;13640:3;13661:5;13654:12;;13612:60;;;:::o;13678:142::-;13728:9;13761:53;13779:34;13788:24;13806:5;13788:24;:::i;:::-;13779:34;:::i;:::-;13761:53;:::i;:::-;13748:66;;13678:142;;;:::o;13826:75::-;13869:3;13890:5;13883:12;;13826:75;;;:::o;13907:269::-;14017:39;14048:7;14017:39;:::i;:::-;14078:91;14127:41;14151:16;14127:41;:::i;:::-;14119:6;14112:4;14106:11;14078:91;:::i;:::-;14072:4;14065:105;13983:193;13907:269;;;:::o;14182:73::-;14227:3;14182:73;:::o;14261:189::-;14338:32;;:::i;:::-;14379:65;14437:6;14429;14423:4;14379:65;:::i;:::-;14314:136;14261:189;;:::o;14456:186::-;14516:120;14533:3;14526:5;14523:14;14516:120;;;14587:39;14624:1;14617:5;14587:39;:::i;:::-;14560:1;14553:5;14549:13;14540:22;;14516:120;;;14456:186;;:::o;14648:543::-;14749:2;14744:3;14741:11;14738:446;;;14783:38;14815:5;14783:38;:::i;:::-;14867:29;14885:10;14867:29;:::i;:::-;14857:8;14853:44;15050:2;15038:10;15035:18;15032:49;;;15071:8;15056:23;;15032:49;15094:80;15150:22;15168:3;15150:22;:::i;:::-;15140:8;15136:37;15123:11;15094:80;:::i;:::-;14753:431;;14738:446;14648:543;;;:::o;15197:117::-;15251:8;15301:5;15295:4;15291:16;15270:37;;15197:117;;;;:::o;15320:169::-;15364:6;15397:51;15445:1;15441:6;15433:5;15430:1;15426:13;15397:51;:::i;:::-;15393:56;15478:4;15472;15468:15;15458:25;;15371:118;15320:169;;;;:::o;15494:295::-;15570:4;15716:29;15741:3;15735:4;15716:29;:::i;:::-;15708:37;;15778:3;15775:1;15771:11;15765:4;15762:21;15754:29;;15494:295;;;;:::o;15794:1395::-;15911:37;15944:3;15911:37;:::i;:::-;16013:18;16005:6;16002:30;15999:56;;;16035:18;;:::i;:::-;15999:56;16079:38;16111:4;16105:11;16079:38;:::i;:::-;16164:67;16224:6;16216;16210:4;16164:67;:::i;:::-;16258:1;16282:4;16269:17;;16314:2;16306:6;16303:14;16331:1;16326:618;;;;16988:1;17005:6;17002:77;;;17054:9;17049:3;17045:19;17039:26;17030:35;;17002:77;17105:67;17165:6;17158:5;17105:67;:::i;:::-;17099:4;17092:81;16961:222;16296:887;;16326:618;16378:4;16374:9;16366:6;16362:22;16412:37;16444:4;16412:37;:::i;:::-;16471:1;16485:208;16499:7;16496:1;16493:14;16485:208;;;16578:9;16573:3;16569:19;16563:26;16555:6;16548:42;16629:1;16621:6;16617:14;16607:24;;16676:2;16665:9;16661:18;16648:31;;16522:4;16519:1;16515:12;16510:17;;16485:208;;;16721:6;16712:7;16709:19;16706:179;;;16779:9;16774:3;16770:19;16764:26;16822:48;16864:4;16856:6;16852:17;16841:9;16822:48;:::i;:::-;16814:6;16807:64;16729:156;16706:179;16931:1;16927;16919:6;16915:14;16911:22;16905:4;16898:36;16333:611;;;16296:887;;15886:1303;;;15794:1395;;:::o;17195:180::-;17243:77;17240:1;17233:88;17340:4;17337:1;17330:15;17364:4;17361:1;17354:15;17381:194;17421:4;17441:20;17459:1;17441:20;:::i;:::-;17436:25;;17475:20;17493:1;17475:20;:::i;:::-;17470:25;;17519:1;17516;17512:9;17504:17;;17543:1;17537:4;17534:11;17531:37;;;17548:18;;:::i;:::-;17531:37;17381:194;;;;:::o;17581:180::-;17629:77;17626:1;17619:88;17726:4;17723:1;17716:15;17750:4;17747:1;17740:15;17767:180;17815:77;17812:1;17805:88;17912:4;17909:1;17902:15;17936:4;17933:1;17926:15;17953:168;18036:11;18070:6;18065:3;18058:19;18110:4;18105:3;18101:14;18086:29;;17953:168;;;;:::o;18127:114::-;;:::o;18247:362::-;18388:3;18409:65;18472:1;18467:3;18409:65;:::i;:::-;18402:72;;18483:93;18572:3;18483:93;:::i;:::-;18601:1;18596:3;18592:11;18585:18;;18247:362;;;:::o;18615:748::-;18864:4;18902:3;18891:9;18887:19;18879:27;;18916:71;18984:1;18973:9;18969:17;18960:6;18916:71;:::i;:::-;18997:72;19065:2;19054:9;19050:18;19041:6;18997:72;:::i;:::-;19079;19147:2;19136:9;19132:18;19123:6;19079:72;:::i;:::-;19198:9;19192:4;19188:20;19183:2;19172:9;19168:18;19161:48;19226:130;19351:4;19226:130;:::i;:::-;19218:138;;18615:748;;;;;;:::o;19369:149::-;19405:7;19445:66;19438:5;19434:78;19423:89;;19369:149;;;:::o;19524:120::-;19596:23;19613:5;19596:23;:::i;:::-;19589:5;19586:34;19576:62;;19634:1;19631;19624:12;19576:62;19524:120;:::o;19650:141::-;19706:5;19737:6;19731:13;19722:22;;19753:32;19779:5;19753:32;:::i;:::-;19650:141;;;;:::o;19797:349::-;19866:6;19915:2;19903:9;19894:7;19890:23;19886:32;19883:119;;;19921:79;;:::i;:::-;19883:119;20041:1;20066:63;20121:7;20112:6;20101:9;20097:22;20066:63;:::i;:::-;20056:73;;20012:127;19797:349;;;;:::o;20174:314::-;20270:3;20291:70;20354:6;20349:3;20291:70;:::i;:::-;20284:77;;20371:56;20420:6;20415:3;20408:5;20371:56;:::i;:::-;20452:29;20474:6;20452:29;:::i;:::-;20447:3;20443:39;20436:46;;20174:314;;;;;:::o;20494:660::-;20699:4;20737:3;20726:9;20722:19;20714:27;;20751:71;20819:1;20808:9;20804:17;20795:6;20751:71;:::i;:::-;20832:72;20900:2;20889:9;20885:18;20876:6;20832:72;:::i;:::-;20914;20982:2;20971:9;20967:18;20958:6;20914:72;:::i;:::-;21033:9;21027:4;21023:20;21018:2;21007:9;21003:18;20996:48;21061:86;21142:4;21133:6;21125;21061:86;:::i;:::-;21053:94;;20494:660;;;;;;;;:::o;21160:148::-;21262:11;21299:3;21284:18;;21160:148;;;;:::o;21338:874::-;21441:3;21478:5;21472:12;21507:36;21533:9;21507:36;:::i;:::-;21559:89;21641:6;21636:3;21559:89;:::i;:::-;21552:96;;21679:1;21668:9;21664:17;21695:1;21690:166;;;;21870:1;21865:341;;;;21657:549;;21690:166;21774:4;21770:9;21759;21755:25;21750:3;21743:38;21836:6;21829:14;21822:22;21814:6;21810:35;21805:3;21801:45;21794:52;;21690:166;;21865:341;21932:38;21964:5;21932:38;:::i;:::-;21992:1;22006:154;22020:6;22017:1;22014:13;22006:154;;;22094:7;22088:14;22084:1;22079:3;22075:11;22068:35;22144:1;22135:7;22131:15;22120:26;;22042:4;22039:1;22035:12;22030:17;;22006:154;;;22189:6;22184:3;22180:16;22173:23;;21872:334;;21657:549;;21445:767;;21338:874;;;;:::o;22218:390::-;22324:3;22352:39;22385:5;22352:39;:::i;:::-;22407:89;22489:6;22484:3;22407:89;:::i;:::-;22400:96;;22505:65;22563:6;22558:3;22551:4;22544:5;22540:16;22505:65;:::i;:::-;22595:6;22590:3;22586:16;22579:23;;22328:280;22218:390;;;;:::o;22614:429::-;22791:3;22813:92;22901:3;22892:6;22813:92;:::i;:::-;22806:99;;22922:95;23013:3;23004:6;22922:95;:::i;:::-;22915:102;;23034:3;23027:10;;22614:429;;;;;:::o;23049:242::-;23218:66;23213:3;23206:79;23049:242;:::o;23297:542::-;23520:3;23535:138;23669:3;23535:138;:::i;:::-;23698:2;23693:3;23689:12;23682:19;;23718:95;23809:3;23800:6;23718:95;:::i;:::-;23711:102;;23830:3;23823:10;;23297:542;;;;:::o;23845:608::-;23985:66;23981:1;23973:6;23969:14;23962:90;24086:34;24081:2;24073:6;24069:15;24062:59;24155:34;24150:2;24142:6;24138:15;24131:59;24224:66;24219:2;24211:6;24207:15;24200:91;24326:66;24320:3;24312:6;24308:16;24301:92;24428:17;24422:3;24414:6;24410:16;24403:43;23845:608;:::o;24459:404::-;24619:3;24640:86;24722:3;24717;24640:86;:::i;:::-;24633:93;;24735;24824:3;24735:93;:::i;:::-;24853:3;24848;24844:13;24837:20;;24459:404;;;:::o;24869:541::-;25102:3;25124:95;25215:3;25206:6;25124:95;:::i;:::-;25117:102;;25236:148;25380:3;25236:148;:::i;:::-;25229:155;;25401:3;25394:10;;24869:541;;;;:::o;25416:275::-;25548:3;25570:95;25661:3;25652:6;25570:95;:::i;:::-;25563:102;;25682:3;25675:10;;25416:275;;;;:::o;25697:435::-;25877:3;25899:95;25990:3;25981:6;25899:95;:::i;:::-;25892:102;;26011:95;26102:3;26093:6;26011:95;:::i;:::-;26004:102;;26123:3;26116:10;;25697:435;;;;;:::o;26138:242::-;26307:66;26302:3;26295:79;26138:242;:::o;26386:542::-;26609:3;26624:138;26758:3;26624:138;:::i;:::-;26787:2;26782:3;26778:12;26771:19;;26807:95;26898:3;26889:6;26807:95;:::i;:::-;26800:102;;26919:3;26912:10;;26386:542;;;;:::o;26934:207::-;27103:31;27098:3;27091:44;26934:207;:::o;27147:542::-;27370:3;27385:138;27519:3;27385:138;:::i;:::-;27548:2;27543:3;27539:12;27532:19;;27568:95;27659:3;27650:6;27568:95;:::i;:::-;27561:102;;27680:3;27673:10;;27147:542;;;;:::o;27695:102::-;27737:8;27784:5;27781:1;27777:13;27756:34;;27695:102;;;:::o;27803:848::-;27864:5;27871:4;27895:6;27886:15;;27919:5;27910:14;;27933:712;27954:1;27944:8;27941:15;27933:712;;;28049:4;28044:3;28040:14;28034:4;28031:24;28028:50;;;28058:18;;:::i;:::-;28028:50;28108:1;28098:8;28094:16;28091:451;;;28523:4;28516:5;28512:16;28503:25;;28091:451;28573:4;28567;28563:15;28555:23;;28603:32;28626:8;28603:32;:::i;:::-;28591:44;;27933:712;;;27803:848;;;;;;;:::o;28657:1073::-;28711:5;28902:8;28892:40;;28923:1;28914:10;;28925:5;;28892:40;28951:4;28941:36;;28968:1;28959:10;;28970:5;;28941:36;29037:4;29085:1;29080:27;;;;29121:1;29116:191;;;;29030:277;;29080:27;29098:1;29089:10;;29100:5;;;29116:191;29161:3;29151:8;29148:17;29145:43;;;29168:18;;:::i;:::-;29145:43;29217:8;29214:1;29210:16;29201:25;;29252:3;29245:5;29242:14;29239:40;;;29259:18;;:::i;:::-;29239:40;29292:5;;;29030:277;;29416:2;29406:8;29403:16;29397:3;29391:4;29388:13;29384:36;29366:2;29356:8;29353:16;29348:2;29342:4;29339:12;29335:35;29319:111;29316:246;;;29472:8;29466:4;29462:19;29453:28;;29507:3;29500:5;29497:14;29494:40;;;29514:18;;:::i;:::-;29494:40;29547:5;;29316:246;29587:42;29625:3;29615:8;29609:4;29606:1;29587:42;:::i;:::-;29572:57;;;;29661:4;29656:3;29652:14;29645:5;29642:25;29639:51;;;29670:18;;:::i;:::-;29639:51;29719:4;29712:5;29708:16;29699:25;;28657:1073;;;;;;:::o;29736:281::-;29794:5;29818:23;29836:4;29818:23;:::i;:::-;29810:31;;29862:25;29878:8;29862:25;:::i;:::-;29850:37;;29906:104;29943:66;29933:8;29927:4;29906:104;:::i;:::-;29897:113;;29736:281;;;;:::o;30023:180::-;30071:77;30068:1;30061:88;30168:4;30165:1;30158:15;30192:4;30189:1;30182:15;30209:185;30249:1;30266:20;30284:1;30266:20;:::i;:::-;30261:25;;30300:20;30318:1;30300:20;:::i;:::-;30295:25;;30339:1;30329:35;;30344:18;;:::i;:::-;30329:35;30386:1;30383;30379:9;30374:14;;30209:185;;;;:::o;30400:79::-;30439:7;30468:5;30457:16;;30400:79;;;:::o;30485:157::-;30590:45;30610:24;30628:5;30610:24;:::i;:::-;30590:45;:::i;:::-;30585:3;30578:58;30485:157;;:::o;30648:154::-;30788:6;30784:1;30776:6;30772:14;30765:30;30648:154;:::o;30808:400::-;30968:3;30989:84;31071:1;31066:3;30989:84;:::i;:::-;30982:91;;31082:93;31171:3;31082:93;:::i;:::-;31200:1;31195:3;31191:11;31184:18;;30808:400;;;:::o;31214:522::-;31427:3;31442:75;31513:3;31504:6;31442:75;:::i;:::-;31542:2;31537:3;31533:12;31526:19;;31562:148;31706:3;31562:148;:::i;:::-;31555:155;;31727:3;31720:10;;31214:522;;;;:::o;31742:176::-;31774:1;31791:20;31809:1;31791:20;:::i;:::-;31786:25;;31825:20;31843:1;31825:20;:::i;:::-;31820:25;;31864:1;31854:35;;31869:18;;:::i;:::-;31854:35;31910:1;31907;31903:9;31898:14;;31742:176;;;;:::o;31924:155::-;32064:7;32060:1;32052:6;32048:14;32041:31;31924:155;:::o;32085:400::-;32245:3;32266:84;32348:1;32343:3;32266:84;:::i;:::-;32259:91;;32359:93;32448:3;32359:93;:::i;:::-;32477:1;32472:3;32468:11;32461:18;;32085:400;;;:::o;32491:522::-;32704:3;32719:75;32790:3;32781:6;32719:75;:::i;:::-;32819:2;32814:3;32810:12;32803:19;;32839:148;32983:3;32839:148;:::i;:::-;32832:155;;33004:3;32997:10;;32491:522;;;;:::o;33019:153::-;33159:5;33155:1;33147:6;33143:14;33136:29;33019:153;:::o;33178:400::-;33338:3;33359:84;33441:1;33436:3;33359:84;:::i;:::-;33352:91;;33452:93;33541:3;33452:93;:::i;:::-;33570:1;33565:3;33561:11;33554:18;;33178:400;;;:::o;33584:522::-;33797:3;33812:75;33883:3;33874:6;33812:75;:::i;:::-;33912:2;33907:3;33903:12;33896:19;;33932:148;34076:3;33932:148;:::i;:::-;33925:155;;34097:3;34090:10;;33584:522;;;;:::o;34112:155::-;34252:7;34248:1;34240:6;34236:14;34229:31;34112:155;:::o;34273:400::-;34433:3;34454:84;34536:1;34531:3;34454:84;:::i;:::-;34447:91;;34547:93;34636:3;34547:93;:::i;:::-;34665:1;34660:3;34656:11;34649:18;;34273:400;;;:::o;34679:522::-;34892:3;34907:75;34978:3;34969:6;34907:75;:::i;:::-;35007:2;35002:3;34998:12;34991:19;;35027:148;35171:3;35027:148;:::i;:::-;35020:155;;35192:3;35185:10;;34679:522;;;;:::o;35207:154::-;35347:6;35343:1;35335:6;35331:14;35324:30;35207:154;:::o;35367:400::-;35527:3;35548:84;35630:1;35625:3;35548:84;:::i;:::-;35541:91;;35641:93;35730:3;35641:93;:::i;:::-;35759:1;35754:3;35750:11;35743:18;;35367:400;;;:::o;35773:522::-;35986:3;36001:75;36072:3;36063:6;36001:75;:::i;:::-;36101:2;36096:3;36092:12;36085:19;;36121:148;36265:3;36121:148;:::i;:::-;36114:155;;36286:3;36279:10;;35773:522;;;;:::o;36301:154::-;36441:6;36437:1;36429:6;36425:14;36418:30;36301:154;:::o;36461:400::-;36621:3;36642:84;36724:1;36719:3;36642:84;:::i;:::-;36635:91;;36735:93;36824:3;36735:93;:::i;:::-;36853:1;36848:3;36844:11;36837:18;;36461:400;;;:::o;36867:522::-;37080:3;37095:75;37166:3;37157:6;37095:75;:::i;:::-;37195:2;37190:3;37186:12;37179:19;;37215:148;37359:3;37215:148;:::i;:::-;37208:155;;37380:3;37373:10;;36867:522;;;;:::o;37395:154::-;37535:6;37531:1;37523:6;37519:14;37512:30;37395:154;:::o;37555:400::-;37715:3;37736:84;37818:1;37813:3;37736:84;:::i;:::-;37729:91;;37829:93;37918:3;37829:93;:::i;:::-;37947:1;37942:3;37938:11;37931:18;;37555:400;;;:::o;37961:522::-;38174:3;38189:75;38260:3;38251:6;38189:75;:::i;:::-;38289:2;38284:3;38280:12;38273:19;;38309:148;38453:3;38309:148;:::i;:::-;38302:155;;38474:3;38467:10;;37961:522;;;;:::o;38489:517::-;38629:66;38625:1;38617:6;38613:14;38606:90;38730:66;38725:2;38717:6;38713:15;38706:91;38831:66;38826:2;38818:6;38814:15;38807:91;38932:66;38927:2;38919:6;38915:15;38908:91;38489:517;:::o;39012:404::-;39172:3;39193:86;39275:3;39270;39193:86;:::i;:::-;39186:93;;39288;39377:3;39288:93;:::i;:::-;39406:3;39401;39397:13;39390:20;;39012:404;;;:::o;39422:315::-;39562:66;39558:1;39550:6;39546:14;39539:90;39663:66;39658:2;39650:6;39646:15;39639:91;39422:315;:::o;39743:402::-;39903:3;39924:85;40006:2;40001:3;39924:85;:::i;:::-;39917:92;;40018:93;40107:3;40018:93;:::i;:::-;40136:2;40131:3;40127:12;40120:19;;39743:402;;;:::o;40151:156::-;40291:8;40287:1;40279:6;40275:14;40268:32;40151:156;:::o;40313:400::-;40473:3;40494:84;40576:1;40571:3;40494:84;:::i;:::-;40487:91;;40587:93;40676:3;40587:93;:::i;:::-;40705:1;40700:3;40696:11;40689:18;;40313:400;;;:::o;40719:2033::-;41442:3;41464:148;41608:3;41464:148;:::i;:::-;41457:155;;41629:148;41773:3;41629:148;:::i;:::-;41622:155;;41794:95;41885:3;41876:6;41794:95;:::i;:::-;41787:102;;41906:95;41997:3;41988:6;41906:95;:::i;:::-;41899:102;;42018:95;42109:3;42100:6;42018:95;:::i;:::-;42011:102;;42130:95;42221:3;42212:6;42130:95;:::i;:::-;42123:102;;42242:95;42333:3;42324:6;42242:95;:::i;:::-;42235:102;;42354:95;42445:3;42436:6;42354:95;:::i;:::-;42347:102;;42466:95;42557:3;42548:6;42466:95;:::i;:::-;42459:102;;42578:148;42722:3;42578:148;:::i;:::-;42571:155;;42743:3;42736:10;;40719:2033;;;;;;;;;;:::o;42758:191::-;42798:3;42817:20;42835:1;42817:20;:::i;:::-;42812:25;;42851:20;42869:1;42851:20;:::i;:::-;42846:25;;42894:1;42891;42887:9;42880:16;;42915:3;42912:1;42909:10;42906:36;;;42922:18;;:::i;:::-;42906:36;42758:191;;;;:::o;42955:410::-;42995:7;43018:20;43036:1;43018:20;:::i;:::-;43013:25;;43052:20;43070:1;43052:20;:::i;:::-;43047:25;;43107:1;43104;43100:9;43129:30;43147:11;43129:30;:::i;:::-;43118:41;;43308:1;43299:7;43295:15;43292:1;43289:22;43269:1;43262:9;43242:83;43219:139;;43338:18;;:::i;:::-;43219:139;43003:362;42955:410;;;;:::o;43371:214::-;43511:66;43507:1;43499:6;43495:14;43488:90;43371:214;:::o;43591:402::-;43751:3;43772:85;43854:2;43849:3;43772:85;:::i;:::-;43765:92;;43866:93;43955:3;43866:93;:::i;:::-;43984:2;43979:3;43975:12;43968:19;;43591:402;;;:::o;43999:214::-;44139:66;44135:1;44127:6;44123:14;44116:90;43999:214;:::o;44219:400::-;44379:3;44400:84;44482:1;44477:3;44400:84;:::i;:::-;44393:91;;44493:93;44582:3;44493:93;:::i;:::-;44611:1;44606:3;44602:11;44595:18;;44219:400;;;:::o;44625:214::-;44765:66;44761:1;44753:6;44749:14;44742:90;44625:214;:::o;44845:402::-;45005:3;45026:85;45108:2;45103:3;45026:85;:::i;:::-;45019:92;;45120:93;45209:3;45120:93;:::i;:::-;45238:2;45233:3;45229:12;45222:19;;44845:402;;;:::o;45253:214::-;45393:66;45389:1;45381:6;45377:14;45370:90;45253:214;:::o;45473:402::-;45633:3;45654:85;45736:2;45731:3;45654:85;:::i;:::-;45647:92;;45748:93;45837:3;45748:93;:::i;:::-;45866:2;45861:3;45857:12;45850:19;;45473:402;;;:::o;45881:315::-;46021:66;46017:1;46009:6;46005:14;45998:90;46122:66;46117:2;46109:6;46105:15;46098:91;45881:315;:::o;46202:402::-;46362:3;46383:85;46465:2;46460:3;46383:85;:::i;:::-;46376:92;;46477:93;46566:3;46477:93;:::i;:::-;46595:2;46590:3;46586:12;46579:19;;46202:402;;;:::o;46610:214::-;46750:66;46746:1;46738:6;46734:14;46727:90;46610:214;:::o;46830:402::-;46990:3;47011:85;47093:2;47088:3;47011:85;:::i;:::-;47004:92;;47105:93;47194:3;47105:93;:::i;:::-;47223:2;47218:3;47214:12;47207:19;;46830:402;;;:::o;47238:214::-;47378:66;47374:1;47366:6;47362:14;47355:90;47238:214;:::o;47458:402::-;47618:3;47639:85;47721:2;47716:3;47639:85;:::i;:::-;47632:92;;47733:93;47822:3;47733:93;:::i;:::-;47851:2;47846:3;47842:12;47835:19;;47458:402;;;:::o;47866:214::-;48006:66;48002:1;47994:6;47990:14;47983:90;47866:214;:::o;48086:402::-;48246:3;48267:85;48349:2;48344:3;48267:85;:::i;:::-;48260:92;;48361:93;48450:3;48361:93;:::i;:::-;48479:2;48474:3;48470:12;48463:19;;48086:402;;;:::o;48494:214::-;48634:66;48630:1;48622:6;48618:14;48611:90;48494:214;:::o;48714:400::-;48874:3;48895:84;48977:1;48972:3;48895:84;:::i;:::-;48888:91;;48988:93;49077:3;48988:93;:::i;:::-;49106:1;49101:3;49097:11;49090:18;;48714:400;;;:::o;49120:4917::-;50933:3;50955:148;51099:3;50955:148;:::i;:::-;50948:155;;51120:92;51208:3;51199:6;51120:92;:::i;:::-;51113:99;;51229:148;51373:3;51229:148;:::i;:::-;51222:155;;51394:148;51538:3;51394:148;:::i;:::-;51387:155;;51559:92;51647:3;51638:6;51559:92;:::i;:::-;51552:99;;51668:148;51812:3;51668:148;:::i;:::-;51661:155;;51833:148;51977:3;51833:148;:::i;:::-;51826:155;;51998:92;52086:3;52077:6;51998:92;:::i;:::-;51991:99;;52107:148;52251:3;52107:148;:::i;:::-;52100:155;;52272:148;52416:3;52272:148;:::i;:::-;52265:155;;52437:92;52525:3;52516:6;52437:92;:::i;:::-;52430:99;;52546:148;52690:3;52546:148;:::i;:::-;52539:155;;52711:148;52855:3;52711:148;:::i;:::-;52704:155;;52876:92;52964:3;52955:6;52876:92;:::i;:::-;52869:99;;52985:148;53129:3;52985:148;:::i;:::-;52978:155;;53150:148;53294:3;53150:148;:::i;:::-;53143:155;;53315:92;53403:3;53394:6;53315:92;:::i;:::-;53308:99;;53424:148;53568:3;53424:148;:::i;:::-;53417:155;;53589:148;53733:3;53589:148;:::i;:::-;53582:155;;53754:92;53842:3;53833:6;53754:92;:::i;:::-;53747:99;;53863:148;54007:3;53863:148;:::i;:::-;53856:155;;54028:3;54021:10;;49120:4917;;;;;;;;;;:::o;54043:151::-;54183:3;54179:1;54171:6;54167:14;54160:27;54043:151;:::o;54200:365::-;54342:3;54363:66;54427:1;54422:3;54363:66;:::i;:::-;54356:73;;54438:93;54527:3;54438:93;:::i;:::-;54556:2;54551:3;54547:12;54540:19;;54200:365;;;:::o;54571:419::-;54737:4;54775:2;54764:9;54760:18;54752:26;;54824:9;54818:4;54814:20;54810:1;54799:9;54795:17;54788:47;54852:131;54978:4;54852:131;:::i;:::-;54844:139;;54571:419;;;:::o;54996:151::-;55136:3;55132:1;55124:6;55120:14;55113:27;54996:151;:::o;55153:365::-;55295:3;55316:66;55380:1;55375:3;55316:66;:::i;:::-;55309:73;;55391:93;55480:3;55391:93;:::i;:::-;55509:2;55504:3;55500:12;55493:19;;55153:365;;;:::o;55524:419::-;55690:4;55728:2;55717:9;55713:18;55705:26;;55777:9;55771:4;55767:20;55763:1;55752:9;55748:17;55741:47;55805:131;55931:4;55805:131;:::i;:::-;55797:139;;55524:419;;;:::o;55949:151::-;56089:3;56085:1;56077:6;56073:14;56066:27;55949:151;:::o;56106:365::-;56248:3;56269:66;56333:1;56328:3;56269:66;:::i;:::-;56262:73;;56344:93;56433:3;56344:93;:::i;:::-;56462:2;56457:3;56453:12;56446:19;;56106:365;;;:::o;56477:419::-;56643:4;56681:2;56670:9;56666:18;56658:26;;56730:9;56724:4;56720:20;56716:1;56705:9;56701:17;56694:47;56758:131;56884:4;56758:131;:::i;:::-;56750:139;;56477:419;;;:::o;56902:214::-;57042:66;57038:1;57030:6;57026:14;57019:90;56902:214;:::o;57122:400::-;57282:3;57303:84;57385:1;57380:3;57303:84;:::i;:::-;57296:91;;57396:93;57485:3;57396:93;:::i;:::-;57514:1;57509:3;57505:11;57498:18;;57122:400;;;:::o;57528:214::-;57668:66;57664:1;57656:6;57652:14;57645:90;57528:214;:::o;57748:400::-;57908:3;57929:84;58011:1;58006:3;57929:84;:::i;:::-;57922:91;;58022:93;58111:3;58022:93;:::i;:::-;58140:1;58135:3;58131:11;58124:18;;57748:400;;;:::o;58154:256::-;58294:66;58290:1;58282:6;58278:14;58271:90;58395:3;58390:2;58382:6;58378:15;58371:28;58154:256;:::o;58420:418::-;58580:3;58605:85;58687:2;58682:3;58605:85;:::i;:::-;58598:92;;58703:93;58792:3;58703:93;:::i;:::-;58825:2;58820:3;58816:12;58809:19;;58420:418;;;:::o;58848:159::-;58992:3;58988:1;58980:6;58976:14;58969:27;58848:159;:::o;59017:416::-;59177:3;59202:84;59284:1;59279:3;59202:84;:::i;:::-;59195:91;;59299:93;59388:3;59299:93;:::i;:::-;59421:1;59416:3;59412:11;59405:18;;59017:416;;;:::o;59443:222::-;59587:66;59583:1;59575:6;59571:14;59564:90;59443:222;:::o;59675:416::-;59835:3;59860:84;59942:1;59937:3;59860:84;:::i;:::-;59853:91;;59957:93;60046:3;59957:93;:::i;:::-;60079:1;60074:3;60070:11;60063:18;;59675:416;;;:::o;60101:2727::-;61079:3;61105:95;61196:3;61187:6;61105:95;:::i;:::-;61098:102;;61221:148;61365:3;61221:148;:::i;:::-;61214:155;;61390:95;61481:3;61472:6;61390:95;:::i;:::-;61383:102;;61506:148;61650:3;61506:148;:::i;:::-;61499:155;;61675:95;61766:3;61757:6;61675:95;:::i;:::-;61668:102;;61791:148;61935:3;61791:148;:::i;:::-;61784:155;;61960:95;62051:3;62042:6;61960:95;:::i;:::-;61953:102;;62076:148;62220:3;62076:148;:::i;:::-;62069:155;;62245:95;62336:3;62327:6;62245:95;:::i;:::-;62238:102;;62361:148;62505:3;62361:148;:::i;:::-;62354:155;;62530:95;62621:3;62612:6;62530:95;:::i;:::-;62523:102;;62646:148;62790:3;62646:148;:::i;:::-;62639:155;;62815:3;62808:10;;60101:2727;;;;;;;;;:::o

Swarm Source

ipfs://0bd94cad79bbd623aa8c5128e5912d22eebe7a47baa534b1af1862cfb1d4f39f
Loading...
Loading
Loading...
Loading
[ 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.