POL Price: $0.371298 (-0.98%)
Gas: 30 GWei
 

Overview

TokenID

318

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
AuctionableERC1155

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
istanbul EvmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-07-06
*/

pragma solidity ^0.8.0;
pragma experimental ABIEncoderV2;



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


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external;
}


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {

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

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


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}


/**
 * @dev Storage based implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165Storage is ERC165 {
    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return super.supportsInterface(interfaceId) || _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}


// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    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 substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    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.
     *
     * _Available since v3.4._
     */
    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.
     *
     * _Available since v3.4._
     */
    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.
     *
     * _Available since v3.4._
     */
    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 addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

contract EIP712Base {
    struct EIP712Domain {
        string name;
        string version;
        uint256 chainId;
        address verifyingContract;
    }

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH =
        keccak256(
            bytes(
                "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
            )
        );

    bytes32 internal domainSeperator;

    constructor(string memory name, string memory version) public {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(version)),
                getChainID(),
                address(this)
            )
        );
    }

    function getChainID() internal view returns (uint256 id) {
        assembly {
            id := chainid()
        }
    }

    function getDomainSeperator() private view returns (bytes32) {
        return domainSeperator;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
            );
    }
}

contract EIP712MetaTransaction is EIP712Base {
    using SafeMath for uint256;
    bytes32 private constant META_TRANSACTION_TYPEHASH =
        keccak256(
            bytes(
                "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
            )
        );

    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    constructor(string memory name, string memory version)
        public
        EIP712Base(name, version)
    {}

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx =
            MetaTransaction({
                nonce: nonces[userAddress],
                from: userAddress,
                functionSignature: functionSignature
            });
        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );
        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) =
            address(this).call(
                abi.encodePacked(functionSignature, userAddress)
            );

        require(success, "Function call not successfull");
        nonces[userAddress] = nonces[userAddress].add(1);
        emit MetaTransactionExecuted(
            userAddress,
            payable(msg.sender),
            functionSignature
        );
        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }

    function _msgSender() internal view returns (address sender) {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = msg.sender;
        }
        return sender;
    }

    // To recieve ether in contract
    receive() external payable {}
}

abstract contract Ownable {
    mapping(uint256 => address payable) internal _owners;

    function msgSender() private view returns (address sender) {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = msg.sender;
        }
        return sender;
    }

    modifier notOwnerOf(uint256 _tokenId) {
        require(ownerOf(_tokenId) != msgSender());
        _;
    }

    modifier onlyOwnerOf(uint256 _tokenId) {
        require(ownerOf(_tokenId) == msgSender());
        _;
    }

    function ownerOf(uint256 _tokenId) public view returns (address payable) {
        address payable owner = _owners[_tokenId];
        require(owner != address(0));
        return owner;
    }
}

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

/**
 *
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract CreatorsHubBase is
    ERC165Storage,
    IERC1155,
    IERC1155MetadataURI,
    EIP712MetaTransaction("ERC1155", "1"),
    Ownable
{
    using SafeMath for uint256;
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

    // Mapping from account to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    // Mapping from account to true / false mint approvals
    mapping(address => bool) private _mintApprovals;

    // Mapping from account to root operators approvals
    mapping(address => bool) internal _rootOperators;

    mapping(uint256 => string) private _metaFileUrl;

    // Mapping from token ID to proof checksums
    mapping(uint256 => string[]) private _proofChecksums;

    // Mapping from token ID to secret field
    mapping(uint256 => string) private _secretFields;

    // Mapping from token ID to fees lock (true/false)
    mapping(uint256 => bool) private _feesLock;

    // Mapping from token ID to flag (paused = true, active = false)
    mapping(uint256 => bool) internal _isPaused;

    struct Listing {
        uint256 initialPrice;
        uint256 price;
        bool biddingEnabled;
        uint256 activeTill;
        address payable currentBidder;
        bool operatorBid;
    }

    struct Fee {
        string name;
        address payable recipient;
        uint256 value; // 185 basis points = 1.85%
        bool percentage;
    }
    // Mapping from token ID to array of fees (initial sale)
    mapping(uint256 => Fee[]) internal _creatorFees;

    // Mapping from token ID to array of fees (reselling)
    mapping(uint256 => Fee[]) internal _resellerFees;

    // Mapping from token ID to account price
    mapping(uint256 => mapping(address => Listing)) internal _tokenListings;

    function addCreatorFees(uint256 tokenId, Fee[] memory fees) public {
        require(_feesLock[tokenId] == false, "Fees locked");
        require(
            _owners[tokenId] == _msgSender() ||
                _rootOperators[_msgSender()] == true,
            "Must be owner or operator"
        );
        for (uint256 i = 0; i < fees.length; i++) {
            if (fees[i].percentage == true) {
                require(
                    fees[i].value < 10000,
                    "Fee must be between 1-10000 basis points"
                );
                require(
                    fees[i].value > 0,
                    "Fee must be between 1-10000 basis points"
                );
            }
            _creatorFees[tokenId].push(fees[i]);
        }
    }

    function addResellerFees(uint256 tokenId, Fee[] memory fees) public {
        require(_feesLock[tokenId] == false, "Fees locked");
        require(
            _owners[tokenId] == _msgSender() ||
                _rootOperators[_msgSender()] == true,
            "Must be owner or operator"
        );
        for (uint256 i = 0; i < fees.length; i++) {
            _resellerFees[tokenId].push(fees[i]);
        }
    }

    modifier notPaused(uint256 _tokenId) {
        require(_isPaused[_tokenId] != true, "Cannot trade paused token");
        _;
    }

    function pauseToken(uint256 tokenId, bool isPausedFlag) public {
        require(_rootOperators[_msgSender()] == true, "Must be operator");
        _isPaused[tokenId] = isPausedFlag;
    }

    function lockFees(uint256 tokenId) public {
        require(
            _owners[tokenId] == _msgSender() ||
                _rootOperators[_msgSender()] == true,
            "Must be owner or operator"
        );
        _feesLock[tokenId] = true;
    }

    function getListing(uint256 tokenId, address seller)
        public
        view
        returns (Listing memory)
    {
        return _tokenListings[tokenId][seller];
    }

    function getCreatorFees(uint256 tokenId)
        public
        view
        returns (Fee[] memory)
    {
        return _creatorFees[tokenId];
    }

    function getResellerFees(uint256 tokenId)
        public
        view
        returns (Fee[] memory)
    {
        return _resellerFees[tokenId];
    }

    function setTokenPrice(
        uint256 _tokenId,
        uint256 price,
        bool biddingEnabled,
        uint256 numberOfDays
    ) public {
        require(
            _balances[_tokenId][_msgSender()] > 0,
            "Caller must own given token"
        );
        if (_tokenListings[_tokenId][_msgSender()].biddingEnabled) {
            require(
                _tokenListings[_tokenId][_msgSender()].currentBidder ==
                    payable(0),
                "Auction in progress"
            );
        }

        if (numberOfDays > 0) {
            _tokenListings[_tokenId][_msgSender()] = Listing(
                price,
                price,
                biddingEnabled,
                block.timestamp + (numberOfDays * 1 days), // active for x days from now
                payable(0),
                false
            );
        } else {
            _tokenListings[_tokenId][_msgSender()] = Listing(
                price,
                price,
                biddingEnabled,
                0, // active for unlimited time
                payable(0),
                false
            );
        }
    }

    function addMetaFileUrl(uint256 id, string memory url) public {
        require(
            _owners[id] == _msgSender() || _rootOperators[_msgSender()] == true,
            "Must be owner or operator"
        );
        require(bytes(_metaFileUrl[id]).length == 0, "File url already set");

        _metaFileUrl[id] = url;
    }

    function setSecretField(uint256 id, string memory secret) public {
        require(
            _owners[id] == _msgSender() || _rootOperators[_msgSender()] == true,
            "Must be owner or operator"
        );
        require(bytes(_secretFields[id]).length == 0, "Secret already set");

        _secretFields[id] = secret;
    }

    function getSecretField(uint256 id) public view returns (string memory) {
        require(_balances[id][_msgSender()] > 0, "Caller must own given token");

        return _secretFields[id];
    }

    function getMetaFileUrl(uint256 id) public view returns (string memory) {
        return _metaFileUrl[id];
    }

    function addProofChecksums(uint256 id, string[] memory checksums) public {
        require(
            _owners[id] == _msgSender() || _rootOperators[_msgSender()] == true,
            "Must be owner or operator"
        );

        for (uint256 i = 0; i < checksums.length; i++) {
            _proofChecksums[id].push(checksums[i]);
        }
    }

    function getChecksums(uint256 id) public view returns (string[] memory) {
        return _proofChecksums[id];
    }

    // Used as the URI for all token types by relying on ID substition, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /*
     *     bytes4(keccak256('balanceOf(address,uint256)')) == 0x00fdd58e
     *     bytes4(keccak256('balanceOfBatch(address[],uint256[])')) == 0x4e1273f4
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,uint256,bytes)')) == 0xf242432a
     *     bytes4(keccak256('safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)')) == 0x2eb2c2d6
     *
     *     => 0x00fdd58e ^ 0x4e1273f4 ^ 0xa22cb465 ^
     *        0xe985e9c5 ^ 0xf242432a ^ 0x2eb2c2d6 == 0xd9b67a26
     */
    bytes4 private constant _INTERFACE_ID_ERC1155 = 0xd9b67a26;

    /*
     *     bytes4(keccak256('uri(uint256)')) == 0x0e89341c
     */
    bytes4 private constant _INTERFACE_ID_ERC1155_METADATA_URI = 0x0e89341c;

    /**
     * @dev See {_setURI}.
     */
    event TokenUpgrade(uint256 oldId, uint256 newId);

    constructor(string memory tokenUri) {
        _setURI(tokenUri);

        // register the supported interfaces to conform to ERC1155 via ERC165
        _registerInterface(_INTERFACE_ID_ERC1155);

        // register the supported interfaces to conform to ERC1155MetadataURI via ERC165
        _registerInterface(_INTERFACE_ID_ERC1155_METADATA_URI);

        _rootOperators[_msgSender()] = true;
    }

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substituion mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256 tokenId)
        external
        view
        override
        returns (string memory)
    {
        return string(abi.encodePacked(_uri, Strings.uint2str(tokenId)));
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id)
        public
        view
        override
        returns (uint256)
    {
        require(
            account != address(0),
            "ERC1155: balance query for the zero address"
        );
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        override
        returns (uint256[] memory)
    {
        require(
            accounts.length == ids.length,
            "ERC1155: accounts and ids length mismatch"
        );

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            require(
                accounts[i] != address(0),
                "ERC1155: batch balance query for the zero address"
            );
            batchBalances[i] = _balances[ids[i]][accounts[i]];
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        require(
            _msgSender() != operator,
            "ERC1155: setting approval status for self"
        );

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC1155-isApprovedForAll}.
     */
    function isApprovedForAll(address account, address operator)
        public
        view
        override
        returns (bool)
    {
        return _operatorApprovals[account][operator];
    }

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(to != address(0), "ERC1155: transfer to the zero address");
        require(
            _rootOperators[_msgSender()] == true,
            "Caller is not root operator"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(
            operator,
            from,
            to,
            _asSingletonArray(id),
            _asSingletonArray(amount),
            data
        );

        _balances[id][from] = _balances[id][from].sub(
            amount,
            "ERC1155: insufficient balance for transfer"
        );
        _balances[id][to] = _balances[id][to].add(amount);

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount
    ) internal {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(
            operator,
            from,
            to,
            _asSingletonArray(id),
            _asSingletonArray(amount),
            "0x0"
        );

        _balances[id][from] = _balances[id][from].sub(
            amount,
            "ERC1155: insufficient balance for transfer"
        );
        _balances[id][to] = _balances[id][to].add(amount);

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, "0x0");
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );
        require(to != address(0), "ERC1155: transfer to the zero address");
        require(
            _rootOperators[_msgSender()] == true,
            "Caller is not root operator"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];
            _balances[id][from] = _balances[id][from].sub(
                amount,
                "ERC1155: insufficient balance for transfer"
            );
            _balances[id][to] = _balances[id][to].add(amount);
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(
            operator,
            from,
            to,
            ids,
            amounts,
            data
        );
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substituion mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function mint(
        address account,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public {
        require(account != address(0), "ERC1155: mint to the zero address");
        require(
            _owners[id] == address(0),
            "You are not allowed to mint given id"
        );

        address caller = _msgSender();

        _beforeTokenTransfer(
            caller,
            address(0),
            account,
            _asSingletonArray(id),
            _asSingletonArray(amount),
            data
        );

        _balances[id][account] = _balances[id][account].add(amount);
        _owners[id] = payable(caller);

        emit TransferSingle(caller, address(0), account, id, amount);

        _doSafeTransferAcceptanceCheck(
            caller,
            address(0),
            account,
            id,
            amount,
            data
        );
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `account`
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address account,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(
            operator,
            account,
            address(0),
            _asSingletonArray(id),
            _asSingletonArray(amount),
            ""
        );

        _balances[id][account] = _balances[id][account].sub(
            amount,
            "ERC1155: burn amount exceeds balance"
        );

        emit TransferSingle(operator, account, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][account] = _balances[ids[i]][account].sub(
                amounts[i],
                "ERC1155: burn amount exceeds balance"
            );
        }

        emit TransferBatch(operator, account, address(0), ids, amounts);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try
                IERC1155Receiver(to).onERC1155Received(
                    operator,
                    from,
                    id,
                    amount,
                    data
                )
            returns (bytes4 response) {
                if (
                    response != IERC1155Receiver(to).onERC1155Received.selector
                ) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try
                IERC1155Receiver(to).onERC1155BatchReceived(
                    operator,
                    from,
                    ids,
                    amounts,
                    data
                )
            returns (bytes4 response) {
                if (
                    response !=
                    IERC1155Receiver(to).onERC1155BatchReceived.selector
                ) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element)
        private
        pure
        returns (uint256[] memory)
    {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

abstract contract Auctionable is Ownable, CreatorsHubBase {
    event Bid(
        address indexed _bidder,
        uint256 indexed _amount,
        uint256 indexed _tokenId
    );
    event AcceptBid(
        address indexed _bidder,
        address indexed _seller,
        uint256 _amount,
        uint256 indexed _tokenId
    );
    event CancelBid(
        address indexed _bidder,
        uint256 indexed _amount,
        uint256 indexed _tokenId
    );
    event Sold(
        address indexed _buyer,
        address indexed _seller,
        uint256 _amount,
        uint256 indexed _tokenId
    );

    function clearBid(uint256 _tokenId, address seller) private {
        _tokenListings[_tokenId][seller].currentBidder = payable(0);
        _tokenListings[_tokenId][seller].price = _tokenListings[_tokenId][
            seller
        ]
            .initialPrice;
        _tokenListings[_tokenId][seller].operatorBid = false;
    }

    function returnCurrentBid(uint256 _tokenId, address seller) private {
        uint256 currentBid = _tokenListings[_tokenId][seller].price;
        address payable currentBidder =
            _tokenListings[_tokenId][seller].currentBidder;
        if (
            currentBidder != address(0) &&
            !_tokenListings[_tokenId][seller].operatorBid
        ) {
            currentBidder.transfer(currentBid);
        }
    }

    function isGreaterBid(uint256 _tokenId, address seller)
        private
        view
        returns (bool)
    {
        return msg.value > _tokenListings[_tokenId][seller].price;
    }

    function bid(uint256 _tokenId, address seller)
        public
        payable
        notPaused(_tokenId)
    {
        require(
            _tokenListings[_tokenId][seller].biddingEnabled,
            "Must be auction"
        );
        require(seller != _msgSender(), "Seller cannot bid");
        require(isGreaterBid(_tokenId, seller), "Current bid is higher");
        if (_tokenListings[_tokenId][seller].activeTill != 0) {
            require(
                _tokenListings[_tokenId][seller].activeTill > block.timestamp,
                "Listing expired"
            );
        }
        returnCurrentBid(_tokenId, seller);
        _tokenListings[_tokenId][seller].currentBidder = payable(_msgSender());
        _tokenListings[_tokenId][seller].price = msg.value;
        _tokenListings[_tokenId][seller].operatorBid = false;
        emit Bid(_msgSender(), msg.value, _tokenId);
    }

    function operatorBid(
        uint256 _tokenId,
        address seller,
        uint256 price,
        address bidder
    ) public payable notPaused(_tokenId) {
        require(_rootOperators[_msgSender()] == true, "Must be operator");
        require(
            _tokenListings[_tokenId][seller].biddingEnabled,
            "Must be auction"
        );
        require(
            price > _tokenListings[_tokenId][seller].price,
            "Current bid is higher"
        );
        if (_tokenListings[_tokenId][seller].activeTill != 0) {
            require(
                _tokenListings[_tokenId][seller].activeTill > block.timestamp,
                "Listing expired"
            );
        }
        returnCurrentBid(_tokenId, seller);
        _tokenListings[_tokenId][seller].currentBidder = payable(bidder);
        _tokenListings[_tokenId][seller].price = price;
        _tokenListings[_tokenId][seller].operatorBid = true;
        emit Bid(bidder, price, _tokenId);
    }

    function operatorCancelBid(uint256 _tokenId, address seller)
        public
        payable
    {
        require(_rootOperators[_msgSender()] == true, "Must be operator");
        require(
            _tokenListings[_tokenId][seller].biddingEnabled,
            "Must be auction"
        );
        require(
            _tokenListings[_tokenId][seller].currentBidder != address(0),
            "No bid to cancel"
        );
        address payable bidder = _tokenListings[_tokenId][seller].currentBidder;
        uint256 bidAmount = _tokenListings[_tokenId][seller].price;
        returnCurrentBid(_tokenId, seller);
        clearBid(_tokenId, seller);
        emit CancelBid(bidder, bidAmount, _tokenId);
    }

    function acceptBid(uint256 _tokenId) public notPaused(_tokenId) {
        require(
            _tokenListings[_tokenId][_msgSender()].biddingEnabled,
            "Must be auction"
        );
        require(
            balanceOf(_msgSender(), _tokenId) > 0,
            "Seller does not own token anymore"
        );
        uint256 currentBid = _tokenListings[_tokenId][_msgSender()].price;
        address currentBidder =
            _tokenListings[_tokenId][_msgSender()].currentBidder;
        if (!_tokenListings[_tokenId][_msgSender()].operatorBid) {
            payout(_tokenId, _msgSender());
        }
        transferFrom(_msgSender(), currentBidder, _tokenId, 1);
        clearBid(_tokenId, _msgSender());
        emit AcceptBid(currentBidder, _msgSender(), currentBid, _tokenId);
    }

    function payout(uint256 _tokenId, address _seller) private {
        uint256 totalPrice = _tokenListings[_tokenId][_seller].price;
        uint256 allFees = 0;

        if (_seller == _owners[_tokenId]) {
            Fee[] memory fees = getCreatorFees(_tokenId);
            for (uint256 i = 0; i < fees.length; ++i) {
                if (fees[i].percentage) {
                    uint256 fee = (fees[i].value * totalPrice) / 10000;
                    allFees += fee;
                    fees[i].recipient.transfer(fee);
                } else {
                    allFees += fees[i].value;
                    fees[i].recipient.transfer(fees[i].value);
                }
            }
        } else {
            Fee[] memory fees = getResellerFees(_tokenId);
            for (uint256 i = 0; i < fees.length; ++i) {
                if (fees[i].percentage) {
                    uint256 fee = (fees[i].value * totalPrice) / 10000;
                    allFees += fee;
                    fees[i].recipient.transfer(fee);
                } else {
                    allFees += fees[i].value;
                    fees[i].recipient.transfer(fees[i].value);
                }
            }
        }
        payable(_seller).transfer(totalPrice - allFees);
    }

    function cancelBid(uint256 _tokenId, address seller) public {
        address payable bidder = _tokenListings[_tokenId][seller].currentBidder;
        require(
            _msgSender() == bidder || _msgSender() == seller,
            "You must be last bidder or owner"
        );
        uint256 bidAmount = _tokenListings[_tokenId][seller].price;
        returnCurrentBid(_tokenId, seller);
        clearBid(_tokenId, seller);
        emit CancelBid(bidder, bidAmount, _tokenId);
    }

    function buy(uint256 _tokenId, address seller)
        public
        payable
        notOwnerOf(_tokenId)
        notPaused(_tokenId)
    {
        uint256 salePrice = _tokenListings[_tokenId][seller].price;
        uint256 sentPrice = msg.value;
        address buyer = _msgSender();
        require(
            balanceOf(seller, _tokenId) > 0,
            "Seller does not own token anymore"
        );
        require(salePrice > 0, "Cannot buy this token");
        require(
            _tokenListings[_tokenId][seller].biddingEnabled == false,
            "Cannot buy, auction in progress"
        );
        require(sentPrice >= salePrice, "Insufficient value sent");
        if (_tokenListings[_tokenId][seller].activeTill != 0) {
            require(
                _tokenListings[_tokenId][seller].activeTill > block.timestamp,
                "Listing expired"
            );
        }
        payout(_tokenId, seller);
        clearBid(_tokenId, seller);
        transferFrom(seller, buyer, _tokenId, 1);
        Sold(buyer, seller, sentPrice, _tokenId);
    }
}

contract AuctionableERC1155 is
    CreatorsHubBase("https://creatorshub.license.rocks/api/public/metaFile/"),
    Auctionable
{
    constructor() {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_bidder","type":"address"},{"indexed":true,"internalType":"address","name":"_seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"AcceptBid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"_bidder","type":"address"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Bid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_bidder","type":"address"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"CancelBid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_buyer","type":"address"},{"indexed":true,"internalType":"address","name":"_seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Sold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newId","type":"uint256"}],"name":"TokenUpgrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"acceptBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bool","name":"percentage","type":"bool"}],"internalType":"struct CreatorsHubBase.Fee[]","name":"fees","type":"tuple[]"}],"name":"addCreatorFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"url","type":"string"}],"name":"addMetaFileUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string[]","name":"checksums","type":"string[]"}],"name":"addProofChecksums","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bool","name":"percentage","type":"bool"}],"internalType":"struct CreatorsHubBase.Fee[]","name":"fees","type":"tuple[]"}],"name":"addResellerFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"seller","type":"address"}],"name":"bid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"seller","type":"address"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"seller","type":"address"}],"name":"cancelBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getChecksums","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getCreatorFees","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bool","name":"percentage","type":"bool"}],"internalType":"struct CreatorsHubBase.Fee[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"seller","type":"address"}],"name":"getListing","outputs":[{"components":[{"internalType":"uint256","name":"initialPrice","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"biddingEnabled","type":"bool"},{"internalType":"uint256","name":"activeTill","type":"uint256"},{"internalType":"address payable","name":"currentBidder","type":"address"},{"internalType":"bool","name":"operatorBid","type":"bool"}],"internalType":"struct CreatorsHubBase.Listing","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getMetaFileUrl","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getResellerFees","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bool","name":"percentage","type":"bool"}],"internalType":"struct CreatorsHubBase.Fee[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getSecretField","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"lockFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"bidder","type":"address"}],"name":"operatorBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"seller","type":"address"}],"name":"operatorCancelBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"isPausedFlag","type":"bool"}],"name":"pauseToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","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":"uint256","name":"amount","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":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"secret","type":"string"}],"name":"setSecretField","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"biddingEnabled","type":"bool"},{"internalType":"uint256","name":"numberOfDays","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b5060405180606001604052806036815260200162004fd160369139604051806040016040528060078152602001664552433131353560c81b815250604051806040016040528060018152602001603160f81b815250818160405180608001604052806052815260200162005007605291398051906020012082805190602001208280519060200120620000a96200014f60201b60201c565b30604051602001620000c0959493929190620002cc565b60408051601f19818403018152919052805160209091012060015550620000ec92508391505062000153565b620000fe636cdb3d1360e11b6200016c565b620001106303a24d0760e21b6200016c565b60016007600062000120620001c7565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055506200036c565b4690565b80516200016890601090602084019062000226565b5050565b6001600160e01b03198082161415620001a25760405162461bcd60e51b81526004016200019990620002f8565b60405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b6000333014156200022057600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150620002239050565b50335b90565b82805462000234906200032f565b90600052602060002090601f016020900481019282620002585760008555620002a3565b82601f106200027357805160ff1916838001178555620002a3565b82800160010185558215620002a3579182015b82811115620002a357825182559160200191906001019062000286565b50620002b1929150620002b5565b5090565b5b80821115620002b15760008155600101620002b6565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b6002810460018216806200034457607f821691505b602082108114156200036657634e487b7160e01b600052602260045260246000fd5b50919050565b614c55806200037c6000396000f3fe6080604052600436106101e65760003560e01c8063744561ac11610102578063b901fd8711610095578063d66675ed11610064578063d66675ed146105a4578063dcee692b146105c4578063e985e9c5146105e4578063f242432a14610604576101ed565b8063b901fd8714610524578063c1b3626714610544578063cb462a4b14610571578063cbd21f5914610591576101ed565b8063935b74c8116100d1578063935b74c8146104a45780639a8a2f78146104d15780639f04996d146104f1578063a22cb46514610504576101ed565b8063744561ac146104315780637463688514610451578063781a1d1b146104715780637deb602514610491576101ed565b8063314a97671161017a57806359d79c911161014957806359d79c91146103a457806361ab63d6146103c45780636352211e146103e4578063731133e914610411576101ed565b8063314a976714610324578063474c819e146103445780634c23a525146103645780634e1273f414610377576101ed565b806325ee6ee9116101b657806325ee6ee9146102955780632b1fd58a146102c25780632d0335ab146102e45780632eb2c2d614610304576101ed565b8062fdd58e146101f257806301ffc9a7146102285780630c53c51c146102555780630e89341c14610275576101ed565b366101ed57005b600080fd5b3480156101fe57600080fd5b5061021261020d366004613966565b610624565b60405161021f919061492a565b60405180910390f35b34801561023457600080fd5b50610248610243366004613ab0565b61067d565b60405161021f9190614147565b6102686102633660046138ec565b6106b4565b60405161021f9190614194565b34801561028157600080fd5b50610268610290366004613ae8565b610834565b3480156102a157600080fd5b506102b56102b0366004613ae8565b610868565b60405161021f919061407c565b3480156102ce57600080fd5b506102e26102dd366004613ae8565b61099e565b005b3480156102f057600080fd5b506102126102ff366004613755565b610ba8565b34801561031057600080fd5b506102e261031f3660046137a9565b610bc3565b34801561033057600080fd5b506102e261033f366004613d2d565b610e12565b34801561035057600080fd5b506102e261035f366004613d2d565b610ee4565b6102e2610372366004613b24565b610fb1565b34801561038357600080fd5b506103976103923660046139f1565b6111b9565b60405161021f919061410f565b3480156103b057600080fd5b506102e26103bf366004613d67565b61135f565b3480156103d057600080fd5b506102e26103df366004613b00565b61160f565b3480156103f057600080fd5b506104046103ff366004613ae8565b611701565b60405161021f9190613f39565b34801561041d57600080fd5b506102e261042c366004613991565b611723565b34801561043d57600080fd5b5061026861044c366004613ae8565b61186f565b34801561045d57600080fd5b506102e261046c366004613bff565b611966565b34801561047d57600080fd5b506102e261048c366004613b6d565b611bac565b6102e261049f366004613b00565b611ca3565b3480156104b057600080fd5b506104c46104bf366004613b00565b611ecf565b60405161021f91906148de565b3480156104dd57600080fd5b506102e26104ec366004613d0b565b611f52565b6102e26104ff366004613b00565b611fbc565b34801561051057600080fd5b506102e261051f3660046138b8565b6121a8565b34801561053057600080fd5b506102e261053f366004613bff565b612276565b34801561055057600080fd5b5061056461055f366004613ae8565b6123ed565b60405161021f919061401c565b34801561057d57600080fd5b506102e261058c366004613ae8565b6124ce565b6102e261059f366004613b00565b61255f565b3480156105b057600080fd5b506102b56105bf366004613ae8565b61266d565b3480156105d057600080fd5b506102686105df366004613ae8565b612798565b3480156105f057600080fd5b506102486105ff366004613771565b6127b5565b34801561061057600080fd5b506102e261061f366004613852565b6127e3565b60006001600160a01b0383166106555760405162461bcd60e51b815260040161064c906142d3565b60405180910390fd5b5060009081526004602090815260408083206001600160a01b03949094168352929052205490565b600061068882612968565b806106ac57506001600160e01b0319821660009081526020819052604090205460ff165b90505b919050565b60408051606081810183526001600160a01b038816600081815260026020908152908590205484528301529181018690526106f28782878787612981565b61070e5760405162461bcd60e51b815260040161064c90614588565b600080306001600160a01b0316888a60405160200161072e929190613e41565b60408051601f198184030181529082905261074891613e25565b6000604051808303816000865af19150503d8060008114610785576040519150601f19603f3d011682016040523d82523d6000602084013e61078a565b606091505b5091509150816107ac5760405162461bcd60e51b815260040161064c9061439d565b6001600160a01b0389166000908152600260205260409020546107d0906001612a01565b6001600160a01b038a166000908152600260205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610820908b9033908c90613f4d565b60405180910390a198975050505050505050565b6060601061084183612a14565b604051602001610852929190613e78565b6040516020818303038152906040529050919050565b6060600d6000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561099357838290600052602060002090600402016040518060800160405290816000820180546108d090614a58565b80601f01602080910402602001604051908101604052809291908181526020018280546108fc90614a58565b80156109495780601f1061091e57610100808354040283529160200191610949565b820191906000526020600020905b81548152906001019060200180831161092c57829003601f168201915b50505091835250506001828101546001600160a01b03166020808401919091526002840154604084015260039093015460ff1615156060909201919091529183529201910161089d565b505050509050919050565b6000818152600c6020526040902054819060ff161515600114156109d45760405162461bcd60e51b815260040161064c906143d4565b6000828152600f60205260408120906109eb612b59565b6001600160a01b0316815260208101919091526040016000206002015460ff16610a275760405162461bcd60e51b815260040161064c90614670565b6000610a3a610a34612b59565b84610624565b11610a575760405162461bcd60e51b815260040161064c9061477d565b6000828152600f6020526040812081610a6e612b59565b6001600160a01b03166001600160a01b031681526020019081526020016000206001015490506000600f60008581526020019081526020016000206000610ab3612b59565b6001600160a01b0390811682526020808301939093526040918201600090812060040154888252600f90945291822092169250610aee612b59565b6001600160a01b03168152602081019190915260400160002060040154600160a01b900460ff16610b2a57610b2a84610b25612b59565b612bb6565b610b3e610b35612b59565b82866001613006565b610b4f84610b4a612b59565b613186565b83610b58612b59565b6001600160a01b0316826001600160a01b03167fd6deddb2e105b46d4644d24aac8c58493a0f107e7973b2fe8d8fa7931a2912be85604051610b9a919061492a565b60405180910390a450505050565b6001600160a01b031660009081526002602052604090205490565b8151835114610be45760405162461bcd60e51b815260040161064c90614807565b6001600160a01b038416610c0a5760405162461bcd60e51b815260040161064c906144b7565b60076000610c16612b59565b6001600160a01b0316815260208101919091526040016000205460ff161515600114610c545760405162461bcd60e51b815260040161064c9061440b565b6000610c5e612b59565b9050610c6e818787878787610e0a565b60005b8451811015610da4576000858281518110610c9c57634e487b7160e01b600052603260045260246000fd5b602002602001015190506000858381518110610cc857634e487b7160e01b600052603260045260246000fd5b60200260200101519050610d35816040518060600160405280602a8152602001614bf6602a91396004600086815260200190815260200160002060008d6001600160a01b03166001600160a01b03168152602001908152602001600020546131cb9092919063ffffffff16565b60008381526004602090815260408083206001600160a01b038e811685529252808320939093558a1681522054610d6c9082612a01565b60009283526004602090815260408085206001600160a01b038c1686529091529092209190915550610d9d81614a93565b9050610c71565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610df4929190614122565b60405180910390a4610e0a8187878787876131f7565b505050505050565b610e1a612b59565b6000838152600360205260409020546001600160a01b0390811691161480610e6c575060076000610e49612b59565b6001600160a01b0316815260208101919091526040016000205460ff1615156001145b610e885760405162461bcd60e51b815260040161064c906144fc565b6000828152600a602052604090208054610ea190614a58565b159050610ec05760405162461bcd60e51b815260040161064c9061460d565b6000828152600a602090815260409091208251610edf92840190613593565b505050565b610eec612b59565b6000838152600360205260409020546001600160a01b0390811691161480610f3e575060076000610f1b612b59565b6001600160a01b0316815260208101919091526040016000205460ff1615156001145b610f5a5760405162461bcd60e51b815260040161064c906144fc565b60008281526008602052604090208054610f7390614a58565b159050610f925760405162461bcd60e51b815260040161064c9061436f565b60008281526008602090815260409091208251610edf92840190613593565b6000848152600c6020526040902054849060ff16151560011415610fe75760405162461bcd60e51b815260040161064c906143d4565b60076000610ff3612b59565b6001600160a01b0316815260208101919091526040016000205460ff1615156001146110315760405162461bcd60e51b815260040161064c9061427a565b6000858152600f602090815260408083206001600160a01b038816845290915290206002015460ff166110765760405162461bcd60e51b815260040161064c90614670565b6000858152600f602090815260408083206001600160a01b038816845290915290206001015483116110ba5760405162461bcd60e51b815260040161064c906142a4565b6000858152600f602090815260408083206001600160a01b038816845290915290206003015415611129576000858152600f602090815260408083206001600160a01b038816845290915290206003015442106111295760405162461bcd60e51b815260040161064c9061484f565b611133858561330e565b6000858152600f602090815260408083206001600160a01b03888116855292528083206004810180546001909201889055600160a01b6001600160a01b031990921693871693841760ff60a01b19169190911790555187928692917f19421268847f42dd61705778018ddfc43bcdce8517e7a630acb12f122c7094819190a45050505050565b606081518351146111dc5760405162461bcd60e51b815260040161064c906147be565b600083516001600160401b0381111561120557634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561122e578160200160208202803683370190505b50905060005b84518110156113575760006001600160a01b031685828151811061126857634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614156112975760405162461bcd60e51b815260040161064c9061431e565b600460008583815181106112bb57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060008683815181106112f357634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205482828151811061133c57634e487b7160e01b600052603260045260246000fd5b602090810291909101015261135081614a93565b9050611234565b509392505050565b600084815260046020526040812081611376612b59565b6001600160a01b03166001600160a01b0316815260200190815260200160002054116113b45760405162461bcd60e51b815260040161064c906141fb565b6000848152600f60205260408120906113cb612b59565b6001600160a01b0316815260208101919091526040016000206002015460ff1615611444576000848152600f6020526040812081611407612b59565b6001600160a01b03908116825260208201929092526040016000206004015416146114445760405162461bcd60e51b815260040161064c9061448a565b8015611537576040518060c001604052808481526020018481526020018315158152602001826201518061147891906149f6565b6114829042614999565b8152600060208083018290526040928301829052878252600f9052908120906114a9612b59565b6001600160a01b0390811682526020808301939093526040918201600020845181559284015160018401559083015160028301805491151560ff199092169190911790556060830151600383015560808301516004909201805460a0909401511515600160a01b0260ff60a01b19939092166001600160a01b03199094169390931791909116179055611609565b6040805160c0810182528481526020808201869052841515828401526000606083018190526080830181905260a08301819052878152600f909152918220909161157f612b59565b6001600160a01b0390811682526020808301939093526040918201600020845181559284015160018401559083015160028301805491151560ff199092169190911790556060830151600383015560808301516004909201805460a0909401511515600160a01b0260ff60a01b19939092166001600160a01b031990941693909317919091161790555b50505050565b6000828152600f602090815260408083206001600160a01b0380861685529252909120600401541680611640612b59565b6001600160a01b0316148061166d5750816001600160a01b0316611662612b59565b6001600160a01b0316145b6116895760405162461bcd60e51b815260040161064c906146ff565b6000838152600f602090815260408083206001600160a01b03861684529091529020600101546116b9848461330e565b6116c38484613186565b8381836001600160a01b03167f09dcebe16a733e22cc47e4959c50d4f21624d9f1815db32c2e439fbbd7b3eda060405160405180910390a450505050565b6000818152600360205260408120546001600160a01b0316806106ac57600080fd5b6001600160a01b0384166117495760405162461bcd60e51b815260040161064c90614878565b6000838152600360205260409020546001600160a01b03161561177e5760405162461bcd60e51b815260040161064c906145c9565b6000611788612b59565b90506117a98160008761179a886133b6565b6117a3886133b6565b87610e0a565b60008481526004602090815260408083206001600160a01b03891684529091529020546117d69084612a01565b60008581526004602090815260408083206001600160a01b038a811680865291845282852095909555888452600390925280832080546001600160a01b0319169486169485179055519092907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906118519089908990614933565b60405180910390a46118688160008787878761340f565b5050505050565b6000818152600460205260408120606091908161188a612b59565b6001600160a01b03166001600160a01b0316815260200190815260200160002054116118c85760405162461bcd60e51b815260040161064c906141fb565b6000828152600a6020526040902080546118e190614a58565b80601f016020809104026020016040519081016040528092919081815260200182805461190d90614a58565b801561195a5780601f1061192f5761010080835404028352916020019161195a565b820191906000526020600020905b81548152906001019060200180831161193d57829003601f168201915b50505050509050919050565b6000828152600b602052604090205460ff16156119955760405162461bcd60e51b815260040161064c906148b9565b61199d612b59565b6000838152600360205260409020546001600160a01b03908116911614806119ef5750600760006119cc612b59565b6001600160a01b0316815260208101919091526040016000205460ff1615156001145b611a0b5760405162461bcd60e51b815260040161064c906144fc565b60005b8151811015610edf57818181518110611a3757634e487b7160e01b600052603260045260246000fd5b6020026020010151606001511515600115151415611ae657612710828281518110611a7257634e487b7160e01b600052603260045260246000fd5b60200260200101516040015110611a9b5760405162461bcd60e51b815260040161064c90614442565b6000828281518110611abd57634e487b7160e01b600052603260045260246000fd5b60200260200101516040015111611ae65760405162461bcd60e51b815260040161064c90614442565b6000838152600d602052604090208251839083908110611b1657634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018101845560009384529282902081518051929460040290910192611b4f92849290910190613593565b5060208201516001820180546001600160a01b0319166001600160a01b03909216919091179055604082015160028201556060909101516003909101805460ff191691151591909117905580611ba481614a93565b915050611a0e565b611bb4612b59565b6000838152600360205260409020546001600160a01b0390811691161480611c06575060076000611be3612b59565b6001600160a01b0316815260208101919091526040016000205460ff1615156001145b611c225760405162461bcd60e51b815260040161064c906144fc565b60005b8151811015610edf5760008381526009602052604090208251839083908110611c5e57634e487b7160e01b600052603260045260246000fd5b60209081029190910181015182546001810184556000938452928290208151611c909491909101929190910190613593565b5080611c9b81614a93565b915050611c25565b81611cac612b59565b6001600160a01b0316611cbe82611701565b6001600160a01b03161415611cd257600080fd5b6000838152600c6020526040902054839060ff16151560011415611d085760405162461bcd60e51b815260040161064c906143d4565b6000848152600f602090815260408083206001600160a01b0387168452909152812060010154903490611d39612b59565b90506000611d478789610624565b11611d645760405162461bcd60e51b815260040161064c9061477d565b60008311611d845760405162461bcd60e51b815260040161064c906146d0565b6000878152600f602090815260408083206001600160a01b038a16845290915290206002015460ff1615611dca5760405162461bcd60e51b815260040161064c90614699565b82821015611dea5760405162461bcd60e51b815260040161064c90614639565b6000878152600f602090815260408083206001600160a01b038a16845290915290206003015415611e59576000878152600f602090815260408083206001600160a01b038a1684529091529020600301544210611e595760405162461bcd60e51b815260040161064c9061484f565b611e638787612bb6565b611e6d8787613186565b611e7a8682896001613006565b86866001600160a01b0316826001600160a01b03167f16dd16959a056953a63cf14bf427881e762e54f03d86b864efea8238dd3b822f85604051611ebe919061492a565b60405180910390a450505050505050565b611ed7613617565b506000918252600f602090815260408084206001600160a01b039384168552825292839020835160c08101855281548152600182015492810192909252600281015460ff90811615159483019490945260038101546060830152600401549182166080820152600160a01b909104909116151560a082015290565b60076000611f5e612b59565b6001600160a01b0316815260208101919091526040016000205460ff161515600114611f9c5760405162461bcd60e51b815260040161064c9061427a565b6000918252600c6020526040909120805460ff1916911515919091179055565b6000828152600c6020526040902054829060ff16151560011415611ff25760405162461bcd60e51b815260040161064c906143d4565b6000838152600f602090815260408083206001600160a01b038616845290915290206002015460ff166120375760405162461bcd60e51b815260040161064c90614670565b61203f612b59565b6001600160a01b0316826001600160a01b031614156120705760405162461bcd60e51b815260040161064c9061455d565b61207a83836134e0565b6120965760405162461bcd60e51b815260040161064c906142a4565b6000838152600f602090815260408083206001600160a01b038616845290915290206003015415612105576000838152600f602090815260408083206001600160a01b038616845290915290206003015442106121055760405162461bcd60e51b815260040161064c9061484f565b61210f838361330e565b612117612b59565b6000848152600f602090815260408083206001600160a01b03878116855292529091206004810180543460019093018390556001600160a01b031916939092169290921760ff60a01b19169055839061216e612b59565b6001600160a01b03167f19421268847f42dd61705778018ddfc43bcdce8517e7a630acb12f122c70948160405160405180910390a4505050565b816001600160a01b03166121ba612b59565b6001600160a01b031614156121e15760405162461bcd60e51b815260040161064c90614734565b80600560006121ee612b59565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155612232612b59565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161226a9190614147565b60405180910390a35050565b6000828152600b602052604090205460ff16156122a55760405162461bcd60e51b815260040161064c906148b9565b6122ad612b59565b6000838152600360205260409020546001600160a01b03908116911614806122ff5750600760006122dc612b59565b6001600160a01b0316815260208101919091526040016000205460ff1615156001145b61231b5760405162461bcd60e51b815260040161064c906144fc565b60005b8151811015610edf576000838152600e60205260409020825183908390811061235757634e487b7160e01b600052603260045260246000fd5b60209081029190910181015182546001810184556000938452928290208151805192946004029091019261239092849290910190613593565b5060208201516001820180546001600160a01b0319166001600160a01b03909216919091179055604082015160028201556060909101516003909101805460ff1916911515919091179055806123e581614a93565b91505061231e565b606060096000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561099357838290600052602060002001805461244190614a58565b80601f016020809104026020016040519081016040528092919081815260200182805461246d90614a58565b80156124ba5780601f1061248f576101008083540402835291602001916124ba565b820191906000526020600020905b81548152906001019060200180831161249d57829003601f168201915b505050505081526020019060010190612422565b6124d6612b59565b6000828152600360205260409020546001600160a01b0390811691161480612528575060076000612505612b59565b6001600160a01b0316815260208101919091526040016000205460ff1615156001145b6125445760405162461bcd60e51b815260040161064c906144fc565b6000908152600b60205260409020805460ff19166001179055565b6007600061256b612b59565b6001600160a01b0316815260208101919091526040016000205460ff1615156001146125a95760405162461bcd60e51b815260040161064c9061427a565b6000828152600f602090815260408083206001600160a01b038516845290915290206002015460ff166125ee5760405162461bcd60e51b815260040161064c90614670565b6000828152600f602090815260408083206001600160a01b038581168552925290912060040154166126325760405162461bcd60e51b815260040161064c90614533565b6000828152600f602090815260408083206001600160a01b038581168552925290912060048101546001909101549116906116b9848461330e565b6060600e6000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561099357838290600052602060002090600402016040518060800160405290816000820180546126d590614a58565b80601f016020809104026020016040519081016040528092919081815260200182805461270190614a58565b801561274e5780601f106127235761010080835404028352916020019161274e565b820191906000526020600020905b81548152906001019060200180831161273157829003601f168201915b50505091835250506001828101546001600160a01b03166020808401919091526002840154604084015260039093015460ff161515606090920191909152918352920191016126a2565b60008181526008602052604090208054606091906118e190614a58565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6001600160a01b0384166128095760405162461bcd60e51b815260040161064c906144b7565b60076000612815612b59565b6001600160a01b0316815260208101919091526040016000205460ff1615156001146128535760405162461bcd60e51b815260040161064c9061440b565b600061285d612b59565b905061286e81878761179a886133b6565b6128b5836040518060600160405280602a8152602001614bf6602a913960008781526004602090815260408083206001600160a01b038d16845290915290205491906131cb565b60008581526004602090815260408083206001600160a01b038b811685529252808320939093558716815220546128ec9084612a01565b60008581526004602090815260408083206001600160a01b03808b168086529190935292819020939093559151909188811691908416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906129529089908990614933565b60405180910390a4610e0a81878787878761340f565b6001600160e01b031981166301ffc9a760e01b14919050565b600060016129966129918761350d565b61356b565b838686604051600081526020016040526040516129b69493929190614176565b6020604051602081039080840390855afa1580156129d8573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b6000612a0d8284614999565b9392505050565b606081612a3957506040805180820190915260018152600360fc1b60208201526106af565b8160005b8115612a635780612a4d81614a93565b9150612a5c9050600a836149d6565b9150612a3d565b6000816001600160401b03811115612a8b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612ab5576020820181803683370190505b509050815b8515612b5057612acb600182614a15565b90506000612ada600a886149d6565b612ae590600a6149f6565b612aef9088614a15565b612afa9060306149b1565b905060008160f81b905080848481518110612b2557634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612b47600a896149d6565b97505050612aba565b50949350505050565b600033301415612bb057600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150612bb39050565b50335b90565b6000828152600f602090815260408083206001600160a01b03808616808652918452828520600101548786526003909452918420549293929091161415612de1576000612c0285610868565b905060005b8151811015612dda57818181518110612c3057634e487b7160e01b600052603260045260246000fd5b60200260200101516060015115612d0057600061271085848481518110612c6757634e487b7160e01b600052603260045260246000fd5b602002602001015160400151612c7d91906149f6565b612c8791906149d6565b9050612c938185614999565b9350828281518110612cb557634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015612cf9573d6000803e3d6000fd5b5050612dca565b818181518110612d2057634e487b7160e01b600052603260045260246000fd5b60200260200101516040015183612d379190614999565b9250818181518110612d5957634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516001600160a01b03166108fc838381518110612d9157634e487b7160e01b600052603260045260246000fd5b6020026020010151604001519081150290604051600060405180830381858888f19350505050158015612dc8573d6000803e3d6000fd5b505b612dd381614a93565b9050612c07565b5050612fc7565b6000612dec8561266d565b905060005b8151811015612fc457818181518110612e1a57634e487b7160e01b600052603260045260246000fd5b60200260200101516060015115612eea57600061271085848481518110612e5157634e487b7160e01b600052603260045260246000fd5b602002602001015160400151612e6791906149f6565b612e7191906149d6565b9050612e7d8185614999565b9350828281518110612e9f57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015612ee3573d6000803e3d6000fd5b5050612fb4565b818181518110612f0a57634e487b7160e01b600052603260045260246000fd5b60200260200101516040015183612f219190614999565b9250818181518110612f4357634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516001600160a01b03166108fc838381518110612f7b57634e487b7160e01b600052603260045260246000fd5b6020026020010151604001519081150290604051600060405180830381858888f19350505050158015612fb2573d6000803e3d6000fd5b505b612fbd81614a93565b9050612df1565b50505b6001600160a01b0383166108fc612fde8385614a15565b6040518115909202916000818181858888f19350505050158015611868573d6000803e3d6000fd5b6001600160a01b03831661302c5760405162461bcd60e51b815260040161064c906144b7565b6000613036612b59565b9050613071818686613047876133b6565b613050876133b6565b6040518060400160405280600381526020016203078360ec1b815250610e0a565b6130b8826040518060600160405280602a8152602001614bf6602a913960008681526004602090815260408083206001600160a01b038c16845290915290205491906131cb565b60008481526004602090815260408083206001600160a01b038a811685529252808320939093558616815220546130ef9083612a01565b60008481526004602090815260408083206001600160a01b03808a168086529190935292819020939093559151909187811691908416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906131559088908890614933565b60405180910390a461186881868686866040518060400160405280600381526020016203078360ec1b81525061340f565b6000918252600f602090815260408084206001600160a01b03939093168452919052902060048101805482546001909301929092556001600160a81b03199091169055565b600081848411156131ef5760405162461bcd60e51b815260040161064c9190614194565b505050900390565b613209846001600160a01b0316613587565b15610e0a5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906132429089908990889088908890600401613f79565b602060405180830381600087803b15801561325c57600080fd5b505af192505050801561328c575060408051601f3d908101601f1916820190925261328991810190613acc565b60015b6132d557613298614ae0565b806132a357506132bd565b8060405162461bcd60e51b815260040161064c9190614194565b60405162461bcd60e51b815260040161064c906141a7565b6001600160e01b0319811663bc197c8160e01b146133055760405162461bcd60e51b815260040161064c90614232565b50505050505050565b6000828152600f602090815260408083206001600160a01b03858116855292529091206001810154600490910154909116801580159061337b57506000848152600f602090815260408083206001600160a01b0387168452909152902060040154600160a01b900460ff16155b15611609576040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015611868573d6000803e3d6000fd5b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106133fe57634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b613421846001600160a01b0316613587565b15610e0a5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061345a9089908990889088908890600401613fd7565b602060405180830381600087803b15801561347457600080fd5b505af19250505080156134a4575060408051601f3d908101601f191682019092526134a191810190613acc565b60015b6134b057613298614ae0565b6001600160e01b0319811663f23a6e6160e01b146133055760405162461bcd60e51b815260040161064c90614232565b6000918252600f602090815260408084206001600160a01b03939093168452919052902060010154341190565b6000604051806080016040528060438152602001614bb3604391398051602091820120835184830151604080870151805190860120905161354e9501614152565b604051602081830303815290604052805190602001209050919050565b600061357561358d565b8260405160200161354e929190613f1e565b3b151590565b60015490565b82805461359f90614a58565b90600052602060002090601f0160209004810192826135c15760008555613607565b82601f106135da57805160ff1916838001178555613607565b82800160010185558215613607579182015b828111156136075782518255916020019190600101906135ec565b5061361392915061365a565b5090565b6040518060c0016040528060008152602001600081526020016000151581526020016000815260200160006001600160a01b031681526020016000151581525090565b5b80821115613613576000815560010161365b565b600082601f83011261367f578081fd5b8135602061369461368f8361496a565b614941565b82815281810190858301838502870184018810156136b0578586fd5b855b858110156136ce578135845292840192908401906001016136b2565b5090979650505050505050565b803580151581146106af57600080fd5b600082601f8301126136fb578081fd5b81356001600160401b0381111561371457613714614ac4565b613727601f8201601f1916602001614941565b81815284602083860101111561373b578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215613766578081fd5b8135612a0d81614b84565b60008060408385031215613783578081fd5b823561378e81614b84565b9150602083013561379e81614b84565b809150509250929050565b600080600080600060a086880312156137c0578081fd5b85356137cb81614b84565b945060208601356137db81614b84565b935060408601356001600160401b03808211156137f6578283fd5b61380289838a0161366f565b94506060880135915080821115613817578283fd5b61382389838a0161366f565b93506080880135915080821115613838578283fd5b50613845888289016136eb565b9150509295509295909350565b600080600080600060a08688031215613869578283fd5b853561387481614b84565b9450602086013561388481614b84565b9350604086013592506060860135915060808601356001600160401b038111156138ac578182fd5b613845888289016136eb565b600080604083850312156138ca578182fd5b82356138d581614b84565b91506138e3602084016136db565b90509250929050565b600080600080600060a08688031215613903578283fd5b853561390e81614b84565b945060208601356001600160401b03811115613928578384fd5b613934888289016136eb565b9450506040860135925060608601359150608086013560ff81168114613958578182fd5b809150509295509295909350565b60008060408385031215613978578182fd5b823561398381614b84565b946020939093013593505050565b600080600080608085870312156139a6578182fd5b84356139b181614b84565b9350602085013592506040850135915060608501356001600160401b038111156139d9578182fd5b6139e5878288016136eb565b91505092959194509250565b60008060408385031215613a03578182fd5b82356001600160401b0380821115613a19578384fd5b818501915085601f830112613a2c578384fd5b81356020613a3c61368f8361496a565b82815281810190858301838502870184018b1015613a58578889fd5b8896505b84871015613a83578035613a6f81614b84565b835260019690960195918301918301613a5c565b5096505086013592505080821115613a99578283fd5b50613aa68582860161366f565b9150509250929050565b600060208284031215613ac1578081fd5b8135612a0d81614b9c565b600060208284031215613add578081fd5b8151612a0d81614b9c565b600060208284031215613af9578081fd5b5035919050565b60008060408385031215613b12578182fd5b82359150602083013561379e81614b84565b60008060008060808587031215613b39578182fd5b843593506020850135613b4b81614b84565b9250604085013591506060850135613b6281614b84565b939692955090935050565b60008060408385031215613b7f578182fd5b823591506020808401356001600160401b03811115613b9c578283fd5b8401601f81018613613bac578283fd5b8035613bba61368f8261496a565b81815283810190838501865b84811015613bef57613bdd8b8884358901016136eb565b84529286019290860190600101613bc6565b5096999098509650505050505050565b60008060408385031215613c11578182fd5b823591506020808401356001600160401b0380821115613c2f578384fd5b818601915086601f830112613c42578384fd5b8135613c5061368f8261496a565b81815284810190848601875b84811015613cfa57813587016080818e03601f19011215613c7b57898afd5b604051608081018181108982111715613c9657613c96614ac4565b604052818a013588811115613ca9578b8cfd5b613cb78f8c838601016136eb565b8252506040820135613cc881614b84565b818b015260608201356040820152613ce2608083016136db565b60608201528552509287019290870190600101613c5c565b50979a909950975050505050505050565b60008060408385031215613d1d578182fd5b823591506138e3602084016136db565b60008060408385031215613d3f578182fd5b8235915060208301356001600160401b03811115613d5b578182fd5b613aa6858286016136eb565b60008060008060808587031215613d7c578182fd5b8435935060208501359250613d93604086016136db565b9396929550929360600135925050565b6000815180845260208085019450808401835b83811015613dd257815187529582019590820190600101613db6565b509495945050505050565b60008151808452613df5816020860160208601614a2c565b601f01601f19169290920160200192915050565b60008151613e1b818560208601614a2c565b9290920192915050565b60008251613e37818460208701614a2c565b9190910192915050565b60008351613e53818460208801614a2c565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b8254600090819060028104600180831680613e9457607f831692505b6020808410821415613eb457634e487b7160e01b87526022600452602487fd5b818015613ec85760018114613ed957613f05565b60ff19861689528489019650613f05565b613ee28b61498d565b885b86811015613efd5781548b820152908501908301613ee4565b505084890196505b505050505050613f158185613e09565b95945050505050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b03848116825283166020820152606060408201819052600090613f1590830184613ddd565b6001600160a01b0386811682528516602082015260a060408201819052600090613fa590830186613da3565b8281036060840152613fb78186613da3565b90508281036080840152613fcb8185613ddd565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061401190830184613ddd565b979650505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561406f57603f1988860301845261405d858351613ddd565b94509285019290850190600101614041565b5092979650505050505050565b60208082528251828201819052600091906040908185019080840286018301878501865b8381101561410157603f198984030185528151608081518186526140c682870182613ddd565b838b01516001600160a01b0316878c0152898401518a88015260609384015115159390960192909252505093860193908601906001016140a0565b509098975050505050505050565b600060208252612a0d6020830184613da3565b6000604082526141356040830185613da3565b8281036020840152613f158185613da3565b901515815260200190565b93845260208401929092526001600160a01b03166040830152606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252612a0d6020830184613ddd565b60208082526034908201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b6020808252601b908201527f43616c6c6572206d757374206f776e20676976656e20746f6b656e0000000000604082015260600190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526010908201526f26bab9ba1031329037b832b930ba37b960811b604082015260600190565b60208082526015908201527421bab93932b73a103134b21034b9903434b3b432b960591b604082015260600190565b6020808252602b908201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526031908201527f455243313135353a2062617463682062616c616e636520717565727920666f7260408201527020746865207a65726f206164647265737360781b606082015260800190565b602080825260149082015273119a5b19481d5c9b08185b1c9958591e481cd95d60621b604082015260600190565b6020808252601d908201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c6c000000604082015260600190565b60208082526019908201527f43616e6e6f742074726164652070617573656420746f6b656e00000000000000604082015260600190565b6020808252601b908201527f43616c6c6572206973206e6f7420726f6f74206f70657261746f720000000000604082015260600190565b60208082526028908201527f466565206d757374206265206265747765656e20312d313030303020626173696040820152677320706f696e747360c01b606082015260800190565b60208082526013908201527241756374696f6e20696e2070726f677265737360681b604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526019908201527f4d757374206265206f776e6572206f72206f70657261746f7200000000000000604082015260600190565b60208082526010908201526f139bc8189a59081d1bc818d85b98d95b60821b604082015260600190565b60208082526011908201527014d95b1b195c8818d85b9b9bdd08189a59607a1b604082015260600190565b60208082526021908201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636040820152600d60fb1b606082015260800190565b60208082526024908201527f596f7520617265206e6f7420616c6c6f77656420746f206d696e7420676976656040820152631b881a5960e21b606082015260800190565b60208082526012908201527114d958dc995d08185b1c9958591e481cd95d60721b604082015260600190565b60208082526017908201527f496e73756666696369656e742076616c75652073656e74000000000000000000604082015260600190565b6020808252600f908201526e26bab9ba1031329030bab1ba34b7b760891b604082015260600190565b6020808252601f908201527f43616e6e6f74206275792c2061756374696f6e20696e2070726f677265737300604082015260600190565b60208082526015908201527421b0b73737ba10313abc903a3434b9903a37b5b2b760591b604082015260600190565b6020808252818101527f596f75206d757374206265206c61737420626964646572206f72206f776e6572604082015260600190565b60208082526029908201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604082015268103337b91039b2b63360b91b606082015260800190565b60208082526021908201527f53656c6c657220646f6573206e6f74206f776e20746f6b656e20616e796d6f726040820152606560f81b606082015260800190565b60208082526029908201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b6020808252600f908201526e131a5cdd1a5b99c8195e1c1a5c9959608a1b604082015260600190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252600b908201526a1199595cc81b1bd8dad95960aa1b604082015260600190565b8151815260208083015190820152604080830151151590820152606080830151908201526080808301516001600160a01b03169082015260a09182015115159181019190915260c00190565b90815260200190565b918252602082015260400190565b6040518181016001600160401b038111828210171561496257614962614ac4565b604052919050565b60006001600160401b0382111561498357614983614ac4565b5060209081020190565b60009081526020902090565b600082198211156149ac576149ac614aae565b500190565b600060ff821660ff84168060ff038211156149ce576149ce614aae565b019392505050565b6000826149f157634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615614a1057614a10614aae565b500290565b600082821015614a2757614a27614aae565b500390565b60005b83811015614a47578181015183820152602001614a2f565b838111156116095750506000910152565b600281046001821680614a6c57607f821691505b60208210811415614a8d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614aa757614aa7614aae565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60e01c90565b600060443d1015614af057612bb3565b600481823e6308c379a0614b048251614ada565b14614b0e57612bb3565b6040513d600319016004823e80513d6001600160401b038160248401118184111715614b3d5750505050612bb3565b82840192508251915080821115614b575750505050612bb3565b503d83016020828401011115614b6f57505050612bb3565b601f01601f1916810160200160405291505090565b6001600160a01b0381168114614b9957600080fd5b50565b6001600160e01b031981168114614b9957600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529455243313135353a20696e73756666696369656e742062616c616e636520666f72207472616e73666572a26469706673582212205edde900f7dc021834e6dd606e4063b39c1e163b3ea2c84565b690113aee2b3964736f6c6343000800003368747470733a2f2f63726561746f72736875622e6c6963656e73652e726f636b732f6170692f7075626c69632f6d65746146696c652f454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429

Deployed Bytecode

0x6080604052600436106101e65760003560e01c8063744561ac11610102578063b901fd8711610095578063d66675ed11610064578063d66675ed146105a4578063dcee692b146105c4578063e985e9c5146105e4578063f242432a14610604576101ed565b8063b901fd8714610524578063c1b3626714610544578063cb462a4b14610571578063cbd21f5914610591576101ed565b8063935b74c8116100d1578063935b74c8146104a45780639a8a2f78146104d15780639f04996d146104f1578063a22cb46514610504576101ed565b8063744561ac146104315780637463688514610451578063781a1d1b146104715780637deb602514610491576101ed565b8063314a97671161017a57806359d79c911161014957806359d79c91146103a457806361ab63d6146103c45780636352211e146103e4578063731133e914610411576101ed565b8063314a976714610324578063474c819e146103445780634c23a525146103645780634e1273f414610377576101ed565b806325ee6ee9116101b657806325ee6ee9146102955780632b1fd58a146102c25780632d0335ab146102e45780632eb2c2d614610304576101ed565b8062fdd58e146101f257806301ffc9a7146102285780630c53c51c146102555780630e89341c14610275576101ed565b366101ed57005b600080fd5b3480156101fe57600080fd5b5061021261020d366004613966565b610624565b60405161021f919061492a565b60405180910390f35b34801561023457600080fd5b50610248610243366004613ab0565b61067d565b60405161021f9190614147565b6102686102633660046138ec565b6106b4565b60405161021f9190614194565b34801561028157600080fd5b50610268610290366004613ae8565b610834565b3480156102a157600080fd5b506102b56102b0366004613ae8565b610868565b60405161021f919061407c565b3480156102ce57600080fd5b506102e26102dd366004613ae8565b61099e565b005b3480156102f057600080fd5b506102126102ff366004613755565b610ba8565b34801561031057600080fd5b506102e261031f3660046137a9565b610bc3565b34801561033057600080fd5b506102e261033f366004613d2d565b610e12565b34801561035057600080fd5b506102e261035f366004613d2d565b610ee4565b6102e2610372366004613b24565b610fb1565b34801561038357600080fd5b506103976103923660046139f1565b6111b9565b60405161021f919061410f565b3480156103b057600080fd5b506102e26103bf366004613d67565b61135f565b3480156103d057600080fd5b506102e26103df366004613b00565b61160f565b3480156103f057600080fd5b506104046103ff366004613ae8565b611701565b60405161021f9190613f39565b34801561041d57600080fd5b506102e261042c366004613991565b611723565b34801561043d57600080fd5b5061026861044c366004613ae8565b61186f565b34801561045d57600080fd5b506102e261046c366004613bff565b611966565b34801561047d57600080fd5b506102e261048c366004613b6d565b611bac565b6102e261049f366004613b00565b611ca3565b3480156104b057600080fd5b506104c46104bf366004613b00565b611ecf565b60405161021f91906148de565b3480156104dd57600080fd5b506102e26104ec366004613d0b565b611f52565b6102e26104ff366004613b00565b611fbc565b34801561051057600080fd5b506102e261051f3660046138b8565b6121a8565b34801561053057600080fd5b506102e261053f366004613bff565b612276565b34801561055057600080fd5b5061056461055f366004613ae8565b6123ed565b60405161021f919061401c565b34801561057d57600080fd5b506102e261058c366004613ae8565b6124ce565b6102e261059f366004613b00565b61255f565b3480156105b057600080fd5b506102b56105bf366004613ae8565b61266d565b3480156105d057600080fd5b506102686105df366004613ae8565b612798565b3480156105f057600080fd5b506102486105ff366004613771565b6127b5565b34801561061057600080fd5b506102e261061f366004613852565b6127e3565b60006001600160a01b0383166106555760405162461bcd60e51b815260040161064c906142d3565b60405180910390fd5b5060009081526004602090815260408083206001600160a01b03949094168352929052205490565b600061068882612968565b806106ac57506001600160e01b0319821660009081526020819052604090205460ff165b90505b919050565b60408051606081810183526001600160a01b038816600081815260026020908152908590205484528301529181018690526106f28782878787612981565b61070e5760405162461bcd60e51b815260040161064c90614588565b600080306001600160a01b0316888a60405160200161072e929190613e41565b60408051601f198184030181529082905261074891613e25565b6000604051808303816000865af19150503d8060008114610785576040519150601f19603f3d011682016040523d82523d6000602084013e61078a565b606091505b5091509150816107ac5760405162461bcd60e51b815260040161064c9061439d565b6001600160a01b0389166000908152600260205260409020546107d0906001612a01565b6001600160a01b038a166000908152600260205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610820908b9033908c90613f4d565b60405180910390a198975050505050505050565b6060601061084183612a14565b604051602001610852929190613e78565b6040516020818303038152906040529050919050565b6060600d6000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561099357838290600052602060002090600402016040518060800160405290816000820180546108d090614a58565b80601f01602080910402602001604051908101604052809291908181526020018280546108fc90614a58565b80156109495780601f1061091e57610100808354040283529160200191610949565b820191906000526020600020905b81548152906001019060200180831161092c57829003601f168201915b50505091835250506001828101546001600160a01b03166020808401919091526002840154604084015260039093015460ff1615156060909201919091529183529201910161089d565b505050509050919050565b6000818152600c6020526040902054819060ff161515600114156109d45760405162461bcd60e51b815260040161064c906143d4565b6000828152600f60205260408120906109eb612b59565b6001600160a01b0316815260208101919091526040016000206002015460ff16610a275760405162461bcd60e51b815260040161064c90614670565b6000610a3a610a34612b59565b84610624565b11610a575760405162461bcd60e51b815260040161064c9061477d565b6000828152600f6020526040812081610a6e612b59565b6001600160a01b03166001600160a01b031681526020019081526020016000206001015490506000600f60008581526020019081526020016000206000610ab3612b59565b6001600160a01b0390811682526020808301939093526040918201600090812060040154888252600f90945291822092169250610aee612b59565b6001600160a01b03168152602081019190915260400160002060040154600160a01b900460ff16610b2a57610b2a84610b25612b59565b612bb6565b610b3e610b35612b59565b82866001613006565b610b4f84610b4a612b59565b613186565b83610b58612b59565b6001600160a01b0316826001600160a01b03167fd6deddb2e105b46d4644d24aac8c58493a0f107e7973b2fe8d8fa7931a2912be85604051610b9a919061492a565b60405180910390a450505050565b6001600160a01b031660009081526002602052604090205490565b8151835114610be45760405162461bcd60e51b815260040161064c90614807565b6001600160a01b038416610c0a5760405162461bcd60e51b815260040161064c906144b7565b60076000610c16612b59565b6001600160a01b0316815260208101919091526040016000205460ff161515600114610c545760405162461bcd60e51b815260040161064c9061440b565b6000610c5e612b59565b9050610c6e818787878787610e0a565b60005b8451811015610da4576000858281518110610c9c57634e487b7160e01b600052603260045260246000fd5b602002602001015190506000858381518110610cc857634e487b7160e01b600052603260045260246000fd5b60200260200101519050610d35816040518060600160405280602a8152602001614bf6602a91396004600086815260200190815260200160002060008d6001600160a01b03166001600160a01b03168152602001908152602001600020546131cb9092919063ffffffff16565b60008381526004602090815260408083206001600160a01b038e811685529252808320939093558a1681522054610d6c9082612a01565b60009283526004602090815260408085206001600160a01b038c1686529091529092209190915550610d9d81614a93565b9050610c71565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610df4929190614122565b60405180910390a4610e0a8187878787876131f7565b505050505050565b610e1a612b59565b6000838152600360205260409020546001600160a01b0390811691161480610e6c575060076000610e49612b59565b6001600160a01b0316815260208101919091526040016000205460ff1615156001145b610e885760405162461bcd60e51b815260040161064c906144fc565b6000828152600a602052604090208054610ea190614a58565b159050610ec05760405162461bcd60e51b815260040161064c9061460d565b6000828152600a602090815260409091208251610edf92840190613593565b505050565b610eec612b59565b6000838152600360205260409020546001600160a01b0390811691161480610f3e575060076000610f1b612b59565b6001600160a01b0316815260208101919091526040016000205460ff1615156001145b610f5a5760405162461bcd60e51b815260040161064c906144fc565b60008281526008602052604090208054610f7390614a58565b159050610f925760405162461bcd60e51b815260040161064c9061436f565b60008281526008602090815260409091208251610edf92840190613593565b6000848152600c6020526040902054849060ff16151560011415610fe75760405162461bcd60e51b815260040161064c906143d4565b60076000610ff3612b59565b6001600160a01b0316815260208101919091526040016000205460ff1615156001146110315760405162461bcd60e51b815260040161064c9061427a565b6000858152600f602090815260408083206001600160a01b038816845290915290206002015460ff166110765760405162461bcd60e51b815260040161064c90614670565b6000858152600f602090815260408083206001600160a01b038816845290915290206001015483116110ba5760405162461bcd60e51b815260040161064c906142a4565b6000858152600f602090815260408083206001600160a01b038816845290915290206003015415611129576000858152600f602090815260408083206001600160a01b038816845290915290206003015442106111295760405162461bcd60e51b815260040161064c9061484f565b611133858561330e565b6000858152600f602090815260408083206001600160a01b03888116855292528083206004810180546001909201889055600160a01b6001600160a01b031990921693871693841760ff60a01b19169190911790555187928692917f19421268847f42dd61705778018ddfc43bcdce8517e7a630acb12f122c7094819190a45050505050565b606081518351146111dc5760405162461bcd60e51b815260040161064c906147be565b600083516001600160401b0381111561120557634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561122e578160200160208202803683370190505b50905060005b84518110156113575760006001600160a01b031685828151811061126857634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614156112975760405162461bcd60e51b815260040161064c9061431e565b600460008583815181106112bb57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060008683815181106112f357634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205482828151811061133c57634e487b7160e01b600052603260045260246000fd5b602090810291909101015261135081614a93565b9050611234565b509392505050565b600084815260046020526040812081611376612b59565b6001600160a01b03166001600160a01b0316815260200190815260200160002054116113b45760405162461bcd60e51b815260040161064c906141fb565b6000848152600f60205260408120906113cb612b59565b6001600160a01b0316815260208101919091526040016000206002015460ff1615611444576000848152600f6020526040812081611407612b59565b6001600160a01b03908116825260208201929092526040016000206004015416146114445760405162461bcd60e51b815260040161064c9061448a565b8015611537576040518060c001604052808481526020018481526020018315158152602001826201518061147891906149f6565b6114829042614999565b8152600060208083018290526040928301829052878252600f9052908120906114a9612b59565b6001600160a01b0390811682526020808301939093526040918201600020845181559284015160018401559083015160028301805491151560ff199092169190911790556060830151600383015560808301516004909201805460a0909401511515600160a01b0260ff60a01b19939092166001600160a01b03199094169390931791909116179055611609565b6040805160c0810182528481526020808201869052841515828401526000606083018190526080830181905260a08301819052878152600f909152918220909161157f612b59565b6001600160a01b0390811682526020808301939093526040918201600020845181559284015160018401559083015160028301805491151560ff199092169190911790556060830151600383015560808301516004909201805460a0909401511515600160a01b0260ff60a01b19939092166001600160a01b031990941693909317919091161790555b50505050565b6000828152600f602090815260408083206001600160a01b0380861685529252909120600401541680611640612b59565b6001600160a01b0316148061166d5750816001600160a01b0316611662612b59565b6001600160a01b0316145b6116895760405162461bcd60e51b815260040161064c906146ff565b6000838152600f602090815260408083206001600160a01b03861684529091529020600101546116b9848461330e565b6116c38484613186565b8381836001600160a01b03167f09dcebe16a733e22cc47e4959c50d4f21624d9f1815db32c2e439fbbd7b3eda060405160405180910390a450505050565b6000818152600360205260408120546001600160a01b0316806106ac57600080fd5b6001600160a01b0384166117495760405162461bcd60e51b815260040161064c90614878565b6000838152600360205260409020546001600160a01b03161561177e5760405162461bcd60e51b815260040161064c906145c9565b6000611788612b59565b90506117a98160008761179a886133b6565b6117a3886133b6565b87610e0a565b60008481526004602090815260408083206001600160a01b03891684529091529020546117d69084612a01565b60008581526004602090815260408083206001600160a01b038a811680865291845282852095909555888452600390925280832080546001600160a01b0319169486169485179055519092907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906118519089908990614933565b60405180910390a46118688160008787878761340f565b5050505050565b6000818152600460205260408120606091908161188a612b59565b6001600160a01b03166001600160a01b0316815260200190815260200160002054116118c85760405162461bcd60e51b815260040161064c906141fb565b6000828152600a6020526040902080546118e190614a58565b80601f016020809104026020016040519081016040528092919081815260200182805461190d90614a58565b801561195a5780601f1061192f5761010080835404028352916020019161195a565b820191906000526020600020905b81548152906001019060200180831161193d57829003601f168201915b50505050509050919050565b6000828152600b602052604090205460ff16156119955760405162461bcd60e51b815260040161064c906148b9565b61199d612b59565b6000838152600360205260409020546001600160a01b03908116911614806119ef5750600760006119cc612b59565b6001600160a01b0316815260208101919091526040016000205460ff1615156001145b611a0b5760405162461bcd60e51b815260040161064c906144fc565b60005b8151811015610edf57818181518110611a3757634e487b7160e01b600052603260045260246000fd5b6020026020010151606001511515600115151415611ae657612710828281518110611a7257634e487b7160e01b600052603260045260246000fd5b60200260200101516040015110611a9b5760405162461bcd60e51b815260040161064c90614442565b6000828281518110611abd57634e487b7160e01b600052603260045260246000fd5b60200260200101516040015111611ae65760405162461bcd60e51b815260040161064c90614442565b6000838152600d602052604090208251839083908110611b1657634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018101845560009384529282902081518051929460040290910192611b4f92849290910190613593565b5060208201516001820180546001600160a01b0319166001600160a01b03909216919091179055604082015160028201556060909101516003909101805460ff191691151591909117905580611ba481614a93565b915050611a0e565b611bb4612b59565b6000838152600360205260409020546001600160a01b0390811691161480611c06575060076000611be3612b59565b6001600160a01b0316815260208101919091526040016000205460ff1615156001145b611c225760405162461bcd60e51b815260040161064c906144fc565b60005b8151811015610edf5760008381526009602052604090208251839083908110611c5e57634e487b7160e01b600052603260045260246000fd5b60209081029190910181015182546001810184556000938452928290208151611c909491909101929190910190613593565b5080611c9b81614a93565b915050611c25565b81611cac612b59565b6001600160a01b0316611cbe82611701565b6001600160a01b03161415611cd257600080fd5b6000838152600c6020526040902054839060ff16151560011415611d085760405162461bcd60e51b815260040161064c906143d4565b6000848152600f602090815260408083206001600160a01b0387168452909152812060010154903490611d39612b59565b90506000611d478789610624565b11611d645760405162461bcd60e51b815260040161064c9061477d565b60008311611d845760405162461bcd60e51b815260040161064c906146d0565b6000878152600f602090815260408083206001600160a01b038a16845290915290206002015460ff1615611dca5760405162461bcd60e51b815260040161064c90614699565b82821015611dea5760405162461bcd60e51b815260040161064c90614639565b6000878152600f602090815260408083206001600160a01b038a16845290915290206003015415611e59576000878152600f602090815260408083206001600160a01b038a1684529091529020600301544210611e595760405162461bcd60e51b815260040161064c9061484f565b611e638787612bb6565b611e6d8787613186565b611e7a8682896001613006565b86866001600160a01b0316826001600160a01b03167f16dd16959a056953a63cf14bf427881e762e54f03d86b864efea8238dd3b822f85604051611ebe919061492a565b60405180910390a450505050505050565b611ed7613617565b506000918252600f602090815260408084206001600160a01b039384168552825292839020835160c08101855281548152600182015492810192909252600281015460ff90811615159483019490945260038101546060830152600401549182166080820152600160a01b909104909116151560a082015290565b60076000611f5e612b59565b6001600160a01b0316815260208101919091526040016000205460ff161515600114611f9c5760405162461bcd60e51b815260040161064c9061427a565b6000918252600c6020526040909120805460ff1916911515919091179055565b6000828152600c6020526040902054829060ff16151560011415611ff25760405162461bcd60e51b815260040161064c906143d4565b6000838152600f602090815260408083206001600160a01b038616845290915290206002015460ff166120375760405162461bcd60e51b815260040161064c90614670565b61203f612b59565b6001600160a01b0316826001600160a01b031614156120705760405162461bcd60e51b815260040161064c9061455d565b61207a83836134e0565b6120965760405162461bcd60e51b815260040161064c906142a4565b6000838152600f602090815260408083206001600160a01b038616845290915290206003015415612105576000838152600f602090815260408083206001600160a01b038616845290915290206003015442106121055760405162461bcd60e51b815260040161064c9061484f565b61210f838361330e565b612117612b59565b6000848152600f602090815260408083206001600160a01b03878116855292529091206004810180543460019093018390556001600160a01b031916939092169290921760ff60a01b19169055839061216e612b59565b6001600160a01b03167f19421268847f42dd61705778018ddfc43bcdce8517e7a630acb12f122c70948160405160405180910390a4505050565b816001600160a01b03166121ba612b59565b6001600160a01b031614156121e15760405162461bcd60e51b815260040161064c90614734565b80600560006121ee612b59565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155612232612b59565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161226a9190614147565b60405180910390a35050565b6000828152600b602052604090205460ff16156122a55760405162461bcd60e51b815260040161064c906148b9565b6122ad612b59565b6000838152600360205260409020546001600160a01b03908116911614806122ff5750600760006122dc612b59565b6001600160a01b0316815260208101919091526040016000205460ff1615156001145b61231b5760405162461bcd60e51b815260040161064c906144fc565b60005b8151811015610edf576000838152600e60205260409020825183908390811061235757634e487b7160e01b600052603260045260246000fd5b60209081029190910181015182546001810184556000938452928290208151805192946004029091019261239092849290910190613593565b5060208201516001820180546001600160a01b0319166001600160a01b03909216919091179055604082015160028201556060909101516003909101805460ff1916911515919091179055806123e581614a93565b91505061231e565b606060096000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561099357838290600052602060002001805461244190614a58565b80601f016020809104026020016040519081016040528092919081815260200182805461246d90614a58565b80156124ba5780601f1061248f576101008083540402835291602001916124ba565b820191906000526020600020905b81548152906001019060200180831161249d57829003601f168201915b505050505081526020019060010190612422565b6124d6612b59565b6000828152600360205260409020546001600160a01b0390811691161480612528575060076000612505612b59565b6001600160a01b0316815260208101919091526040016000205460ff1615156001145b6125445760405162461bcd60e51b815260040161064c906144fc565b6000908152600b60205260409020805460ff19166001179055565b6007600061256b612b59565b6001600160a01b0316815260208101919091526040016000205460ff1615156001146125a95760405162461bcd60e51b815260040161064c9061427a565b6000828152600f602090815260408083206001600160a01b038516845290915290206002015460ff166125ee5760405162461bcd60e51b815260040161064c90614670565b6000828152600f602090815260408083206001600160a01b038581168552925290912060040154166126325760405162461bcd60e51b815260040161064c90614533565b6000828152600f602090815260408083206001600160a01b038581168552925290912060048101546001909101549116906116b9848461330e565b6060600e6000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561099357838290600052602060002090600402016040518060800160405290816000820180546126d590614a58565b80601f016020809104026020016040519081016040528092919081815260200182805461270190614a58565b801561274e5780601f106127235761010080835404028352916020019161274e565b820191906000526020600020905b81548152906001019060200180831161273157829003601f168201915b50505091835250506001828101546001600160a01b03166020808401919091526002840154604084015260039093015460ff161515606090920191909152918352920191016126a2565b60008181526008602052604090208054606091906118e190614a58565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6001600160a01b0384166128095760405162461bcd60e51b815260040161064c906144b7565b60076000612815612b59565b6001600160a01b0316815260208101919091526040016000205460ff1615156001146128535760405162461bcd60e51b815260040161064c9061440b565b600061285d612b59565b905061286e81878761179a886133b6565b6128b5836040518060600160405280602a8152602001614bf6602a913960008781526004602090815260408083206001600160a01b038d16845290915290205491906131cb565b60008581526004602090815260408083206001600160a01b038b811685529252808320939093558716815220546128ec9084612a01565b60008581526004602090815260408083206001600160a01b03808b168086529190935292819020939093559151909188811691908416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906129529089908990614933565b60405180910390a4610e0a81878787878761340f565b6001600160e01b031981166301ffc9a760e01b14919050565b600060016129966129918761350d565b61356b565b838686604051600081526020016040526040516129b69493929190614176565b6020604051602081039080840390855afa1580156129d8573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b6000612a0d8284614999565b9392505050565b606081612a3957506040805180820190915260018152600360fc1b60208201526106af565b8160005b8115612a635780612a4d81614a93565b9150612a5c9050600a836149d6565b9150612a3d565b6000816001600160401b03811115612a8b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612ab5576020820181803683370190505b509050815b8515612b5057612acb600182614a15565b90506000612ada600a886149d6565b612ae590600a6149f6565b612aef9088614a15565b612afa9060306149b1565b905060008160f81b905080848481518110612b2557634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612b47600a896149d6565b97505050612aba565b50949350505050565b600033301415612bb057600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150612bb39050565b50335b90565b6000828152600f602090815260408083206001600160a01b03808616808652918452828520600101548786526003909452918420549293929091161415612de1576000612c0285610868565b905060005b8151811015612dda57818181518110612c3057634e487b7160e01b600052603260045260246000fd5b60200260200101516060015115612d0057600061271085848481518110612c6757634e487b7160e01b600052603260045260246000fd5b602002602001015160400151612c7d91906149f6565b612c8791906149d6565b9050612c938185614999565b9350828281518110612cb557634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015612cf9573d6000803e3d6000fd5b5050612dca565b818181518110612d2057634e487b7160e01b600052603260045260246000fd5b60200260200101516040015183612d379190614999565b9250818181518110612d5957634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516001600160a01b03166108fc838381518110612d9157634e487b7160e01b600052603260045260246000fd5b6020026020010151604001519081150290604051600060405180830381858888f19350505050158015612dc8573d6000803e3d6000fd5b505b612dd381614a93565b9050612c07565b5050612fc7565b6000612dec8561266d565b905060005b8151811015612fc457818181518110612e1a57634e487b7160e01b600052603260045260246000fd5b60200260200101516060015115612eea57600061271085848481518110612e5157634e487b7160e01b600052603260045260246000fd5b602002602001015160400151612e6791906149f6565b612e7191906149d6565b9050612e7d8185614999565b9350828281518110612e9f57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015612ee3573d6000803e3d6000fd5b5050612fb4565b818181518110612f0a57634e487b7160e01b600052603260045260246000fd5b60200260200101516040015183612f219190614999565b9250818181518110612f4357634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516001600160a01b03166108fc838381518110612f7b57634e487b7160e01b600052603260045260246000fd5b6020026020010151604001519081150290604051600060405180830381858888f19350505050158015612fb2573d6000803e3d6000fd5b505b612fbd81614a93565b9050612df1565b50505b6001600160a01b0383166108fc612fde8385614a15565b6040518115909202916000818181858888f19350505050158015611868573d6000803e3d6000fd5b6001600160a01b03831661302c5760405162461bcd60e51b815260040161064c906144b7565b6000613036612b59565b9050613071818686613047876133b6565b613050876133b6565b6040518060400160405280600381526020016203078360ec1b815250610e0a565b6130b8826040518060600160405280602a8152602001614bf6602a913960008681526004602090815260408083206001600160a01b038c16845290915290205491906131cb565b60008481526004602090815260408083206001600160a01b038a811685529252808320939093558616815220546130ef9083612a01565b60008481526004602090815260408083206001600160a01b03808a168086529190935292819020939093559151909187811691908416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906131559088908890614933565b60405180910390a461186881868686866040518060400160405280600381526020016203078360ec1b81525061340f565b6000918252600f602090815260408084206001600160a01b03939093168452919052902060048101805482546001909301929092556001600160a81b03199091169055565b600081848411156131ef5760405162461bcd60e51b815260040161064c9190614194565b505050900390565b613209846001600160a01b0316613587565b15610e0a5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906132429089908990889088908890600401613f79565b602060405180830381600087803b15801561325c57600080fd5b505af192505050801561328c575060408051601f3d908101601f1916820190925261328991810190613acc565b60015b6132d557613298614ae0565b806132a357506132bd565b8060405162461bcd60e51b815260040161064c9190614194565b60405162461bcd60e51b815260040161064c906141a7565b6001600160e01b0319811663bc197c8160e01b146133055760405162461bcd60e51b815260040161064c90614232565b50505050505050565b6000828152600f602090815260408083206001600160a01b03858116855292529091206001810154600490910154909116801580159061337b57506000848152600f602090815260408083206001600160a01b0387168452909152902060040154600160a01b900460ff16155b15611609576040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015611868573d6000803e3d6000fd5b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106133fe57634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b613421846001600160a01b0316613587565b15610e0a5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061345a9089908990889088908890600401613fd7565b602060405180830381600087803b15801561347457600080fd5b505af19250505080156134a4575060408051601f3d908101601f191682019092526134a191810190613acc565b60015b6134b057613298614ae0565b6001600160e01b0319811663f23a6e6160e01b146133055760405162461bcd60e51b815260040161064c90614232565b6000918252600f602090815260408084206001600160a01b03939093168452919052902060010154341190565b6000604051806080016040528060438152602001614bb3604391398051602091820120835184830151604080870151805190860120905161354e9501614152565b604051602081830303815290604052805190602001209050919050565b600061357561358d565b8260405160200161354e929190613f1e565b3b151590565b60015490565b82805461359f90614a58565b90600052602060002090601f0160209004810192826135c15760008555613607565b82601f106135da57805160ff1916838001178555613607565b82800160010185558215613607579182015b828111156136075782518255916020019190600101906135ec565b5061361392915061365a565b5090565b6040518060c0016040528060008152602001600081526020016000151581526020016000815260200160006001600160a01b031681526020016000151581525090565b5b80821115613613576000815560010161365b565b600082601f83011261367f578081fd5b8135602061369461368f8361496a565b614941565b82815281810190858301838502870184018810156136b0578586fd5b855b858110156136ce578135845292840192908401906001016136b2565b5090979650505050505050565b803580151581146106af57600080fd5b600082601f8301126136fb578081fd5b81356001600160401b0381111561371457613714614ac4565b613727601f8201601f1916602001614941565b81815284602083860101111561373b578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215613766578081fd5b8135612a0d81614b84565b60008060408385031215613783578081fd5b823561378e81614b84565b9150602083013561379e81614b84565b809150509250929050565b600080600080600060a086880312156137c0578081fd5b85356137cb81614b84565b945060208601356137db81614b84565b935060408601356001600160401b03808211156137f6578283fd5b61380289838a0161366f565b94506060880135915080821115613817578283fd5b61382389838a0161366f565b93506080880135915080821115613838578283fd5b50613845888289016136eb565b9150509295509295909350565b600080600080600060a08688031215613869578283fd5b853561387481614b84565b9450602086013561388481614b84565b9350604086013592506060860135915060808601356001600160401b038111156138ac578182fd5b613845888289016136eb565b600080604083850312156138ca578182fd5b82356138d581614b84565b91506138e3602084016136db565b90509250929050565b600080600080600060a08688031215613903578283fd5b853561390e81614b84565b945060208601356001600160401b03811115613928578384fd5b613934888289016136eb565b9450506040860135925060608601359150608086013560ff81168114613958578182fd5b809150509295509295909350565b60008060408385031215613978578182fd5b823561398381614b84565b946020939093013593505050565b600080600080608085870312156139a6578182fd5b84356139b181614b84565b9350602085013592506040850135915060608501356001600160401b038111156139d9578182fd5b6139e5878288016136eb565b91505092959194509250565b60008060408385031215613a03578182fd5b82356001600160401b0380821115613a19578384fd5b818501915085601f830112613a2c578384fd5b81356020613a3c61368f8361496a565b82815281810190858301838502870184018b1015613a58578889fd5b8896505b84871015613a83578035613a6f81614b84565b835260019690960195918301918301613a5c565b5096505086013592505080821115613a99578283fd5b50613aa68582860161366f565b9150509250929050565b600060208284031215613ac1578081fd5b8135612a0d81614b9c565b600060208284031215613add578081fd5b8151612a0d81614b9c565b600060208284031215613af9578081fd5b5035919050565b60008060408385031215613b12578182fd5b82359150602083013561379e81614b84565b60008060008060808587031215613b39578182fd5b843593506020850135613b4b81614b84565b9250604085013591506060850135613b6281614b84565b939692955090935050565b60008060408385031215613b7f578182fd5b823591506020808401356001600160401b03811115613b9c578283fd5b8401601f81018613613bac578283fd5b8035613bba61368f8261496a565b81815283810190838501865b84811015613bef57613bdd8b8884358901016136eb565b84529286019290860190600101613bc6565b5096999098509650505050505050565b60008060408385031215613c11578182fd5b823591506020808401356001600160401b0380821115613c2f578384fd5b818601915086601f830112613c42578384fd5b8135613c5061368f8261496a565b81815284810190848601875b84811015613cfa57813587016080818e03601f19011215613c7b57898afd5b604051608081018181108982111715613c9657613c96614ac4565b604052818a013588811115613ca9578b8cfd5b613cb78f8c838601016136eb565b8252506040820135613cc881614b84565b818b015260608201356040820152613ce2608083016136db565b60608201528552509287019290870190600101613c5c565b50979a909950975050505050505050565b60008060408385031215613d1d578182fd5b823591506138e3602084016136db565b60008060408385031215613d3f578182fd5b8235915060208301356001600160401b03811115613d5b578182fd5b613aa6858286016136eb565b60008060008060808587031215613d7c578182fd5b8435935060208501359250613d93604086016136db565b9396929550929360600135925050565b6000815180845260208085019450808401835b83811015613dd257815187529582019590820190600101613db6565b509495945050505050565b60008151808452613df5816020860160208601614a2c565b601f01601f19169290920160200192915050565b60008151613e1b818560208601614a2c565b9290920192915050565b60008251613e37818460208701614a2c565b9190910192915050565b60008351613e53818460208801614a2c565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b8254600090819060028104600180831680613e9457607f831692505b6020808410821415613eb457634e487b7160e01b87526022600452602487fd5b818015613ec85760018114613ed957613f05565b60ff19861689528489019650613f05565b613ee28b61498d565b885b86811015613efd5781548b820152908501908301613ee4565b505084890196505b505050505050613f158185613e09565b95945050505050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b03848116825283166020820152606060408201819052600090613f1590830184613ddd565b6001600160a01b0386811682528516602082015260a060408201819052600090613fa590830186613da3565b8281036060840152613fb78186613da3565b90508281036080840152613fcb8185613ddd565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061401190830184613ddd565b979650505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561406f57603f1988860301845261405d858351613ddd565b94509285019290850190600101614041565b5092979650505050505050565b60208082528251828201819052600091906040908185019080840286018301878501865b8381101561410157603f198984030185528151608081518186526140c682870182613ddd565b838b01516001600160a01b0316878c0152898401518a88015260609384015115159390960192909252505093860193908601906001016140a0565b509098975050505050505050565b600060208252612a0d6020830184613da3565b6000604082526141356040830185613da3565b8281036020840152613f158185613da3565b901515815260200190565b93845260208401929092526001600160a01b03166040830152606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252612a0d6020830184613ddd565b60208082526034908201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b6020808252601b908201527f43616c6c6572206d757374206f776e20676976656e20746f6b656e0000000000604082015260600190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526010908201526f26bab9ba1031329037b832b930ba37b960811b604082015260600190565b60208082526015908201527421bab93932b73a103134b21034b9903434b3b432b960591b604082015260600190565b6020808252602b908201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526031908201527f455243313135353a2062617463682062616c616e636520717565727920666f7260408201527020746865207a65726f206164647265737360781b606082015260800190565b602080825260149082015273119a5b19481d5c9b08185b1c9958591e481cd95d60621b604082015260600190565b6020808252601d908201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c6c000000604082015260600190565b60208082526019908201527f43616e6e6f742074726164652070617573656420746f6b656e00000000000000604082015260600190565b6020808252601b908201527f43616c6c6572206973206e6f7420726f6f74206f70657261746f720000000000604082015260600190565b60208082526028908201527f466565206d757374206265206265747765656e20312d313030303020626173696040820152677320706f696e747360c01b606082015260800190565b60208082526013908201527241756374696f6e20696e2070726f677265737360681b604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526019908201527f4d757374206265206f776e6572206f72206f70657261746f7200000000000000604082015260600190565b60208082526010908201526f139bc8189a59081d1bc818d85b98d95b60821b604082015260600190565b60208082526011908201527014d95b1b195c8818d85b9b9bdd08189a59607a1b604082015260600190565b60208082526021908201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636040820152600d60fb1b606082015260800190565b60208082526024908201527f596f7520617265206e6f7420616c6c6f77656420746f206d696e7420676976656040820152631b881a5960e21b606082015260800190565b60208082526012908201527114d958dc995d08185b1c9958591e481cd95d60721b604082015260600190565b60208082526017908201527f496e73756666696369656e742076616c75652073656e74000000000000000000604082015260600190565b6020808252600f908201526e26bab9ba1031329030bab1ba34b7b760891b604082015260600190565b6020808252601f908201527f43616e6e6f74206275792c2061756374696f6e20696e2070726f677265737300604082015260600190565b60208082526015908201527421b0b73737ba10313abc903a3434b9903a37b5b2b760591b604082015260600190565b6020808252818101527f596f75206d757374206265206c61737420626964646572206f72206f776e6572604082015260600190565b60208082526029908201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604082015268103337b91039b2b63360b91b606082015260800190565b60208082526021908201527f53656c6c657220646f6573206e6f74206f776e20746f6b656e20616e796d6f726040820152606560f81b606082015260800190565b60208082526029908201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b6020808252600f908201526e131a5cdd1a5b99c8195e1c1a5c9959608a1b604082015260600190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252600b908201526a1199595cc81b1bd8dad95960aa1b604082015260600190565b8151815260208083015190820152604080830151151590820152606080830151908201526080808301516001600160a01b03169082015260a09182015115159181019190915260c00190565b90815260200190565b918252602082015260400190565b6040518181016001600160401b038111828210171561496257614962614ac4565b604052919050565b60006001600160401b0382111561498357614983614ac4565b5060209081020190565b60009081526020902090565b600082198211156149ac576149ac614aae565b500190565b600060ff821660ff84168060ff038211156149ce576149ce614aae565b019392505050565b6000826149f157634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615614a1057614a10614aae565b500290565b600082821015614a2757614a27614aae565b500390565b60005b83811015614a47578181015183820152602001614a2f565b838111156116095750506000910152565b600281046001821680614a6c57607f821691505b60208210811415614a8d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614aa757614aa7614aae565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60e01c90565b600060443d1015614af057612bb3565b600481823e6308c379a0614b048251614ada565b14614b0e57612bb3565b6040513d600319016004823e80513d6001600160401b038160248401118184111715614b3d5750505050612bb3565b82840192508251915080821115614b575750505050612bb3565b503d83016020828401011115614b6f57505050612bb3565b601f01601f1916810160200160405291505090565b6001600160a01b0381168114614b9957600080fd5b50565b6001600160e01b031981168114614b9957600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529455243313135353a20696e73756666696369656e742062616c616e636520666f72207472616e73666572a26469706673582212205edde900f7dc021834e6dd606e4063b39c1e163b3ea2c84565b690113aee2b3964736f6c63430008000033

Deployed Bytecode Sourcemap

62074:155:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41344:301;;;;;;;;;;-1:-1:-1;41344:301:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8864:190;;;;;;;;;;-1:-1:-1;8864:190:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27237:1140::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;40992:201::-;;;;;;;;;;-1:-1:-1;40992:201:0;;;;;:::i;:::-;;:::i;36002:155::-;;;;;;;;;;-1:-1:-1;36002:155:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;58337:816::-;;;;;;;;;;-1:-1:-1;58337:816:0;;;;;:::i;:::-;;:::i;:::-;;28803:107;;;;;;;;;;-1:-1:-1;28803:107:0;;;;;:::i;:::-;;:::i;45180:1265::-;;;;;;;;;;-1:-1:-1;45180:1265:0;;;;;:::i;:::-;;:::i;37856:343::-;;;;;;;;;;-1:-1:-1;37856:343:0;;;;;:::i;:::-;;:::i;37511:337::-;;;;;;;;;;-1:-1:-1;37511:337:0;;;;;:::i;:::-;;:::i;56580:1011::-;;;;;;:::i;:::-;;:::i;41811:695::-;;;;;;;;;;-1:-1:-1;41811:695:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;36330:1173::-;;;;;;;;;;-1:-1:-1;36330:1173:0;;;;;:::i;:::-;;:::i;60460:496::-;;;;;;;;;;-1:-1:-1;60460:496:0;;;;;:::i;:::-;;:::i;30953:195::-;;;;;;;;;;-1:-1:-1;30953:195:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;47771:949::-;;;;;;;;;;-1:-1:-1;47771:949:0;;;;;:::i;:::-;;:::i;38207:199::-;;;;;;;;;;-1:-1:-1;38207:199:0;;;;;:::i;:::-;;:::i;33970:792::-;;;;;;;;;;-1:-1:-1;33970:792:0;;;;;:::i;:::-;;:::i;38536:358::-;;;;;;;;;;-1:-1:-1;38536:358:0;;;;;:::i;:::-;;:::i;60964:1103::-;;;;;;:::i;:::-;;:::i;35815:179::-;;;;;;;;;;-1:-1:-1;35815:179:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35347:191::-;;;;;;;;;;-1:-1:-1;35347:191:0;;;;;:::i;:::-;;:::i;55656:916::-;;;;;;:::i;:::-;;:::i;42579:380::-;;;;;;;;;;-1:-1:-1;42579:380:0;;;;;:::i;:::-;;:::i;34770:428::-;;;;;;;;;;-1:-1:-1;34770:428:0;;;;;:::i;:::-;;:::i;38902:117::-;;;;;;;;;;-1:-1:-1;38902:117:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35546:261::-;;;;;;;;;;-1:-1:-1;35546:261:0;;;;;:::i;:::-;;:::i;57599:730::-;;;;;;:::i;:::-;;:::i;36165:157::-;;;;;;;;;;-1:-1:-1;36165:157:0;;;;;:::i;:::-;;:::i;38414:114::-;;;;;;;;;;-1:-1:-1;38414:114:0;;;;;:::i;:::-;;:::i;43031:201::-;;;;;;;;;;-1:-1:-1;43031:201:0;;;;;:::i;:::-;;:::i;43304:980::-;;;;;;;;;;-1:-1:-1;43304:980:0;;;;;:::i;:::-;;:::i;41344:301::-;41458:7;-1:-1:-1;;;;;41505:21:0;;41483:114;;;;-1:-1:-1;;;41483:114:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;41615:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;41615:22:0;;;;;;;;;;;;41344:301::o;8864:190::-;8949:4;8973:36;8997:11;8973:23;:36::i;:::-;:73;;;-1:-1:-1;;;;;;;9013:33:0;;:20;:33;;;;;;;;;;;;;8973:73;8966:80;;8864:190;;;;:::o;27237:1140::-;27508:168;;;27438:12;27508:168;;;;;-1:-1:-1;;;;;27550:19:0;;27463:29;27550:19;;;:6;:19;;;;;;;;;27508:168;;;;;;;;;;;27709:45;27557:11;27508:168;27737:4;27743;27749;27709:6;:45::i;:::-;27687:128;;;;-1:-1:-1;;;27687:128:0;;;;;;;:::i;:::-;27924:12;27938:23;27986:4;-1:-1:-1;;;;;27978:18:0;28032:17;28051:11;28015:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;28015:48:0;;;;;;;;;;27978:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27923:155;;;;28099:7;28091:49;;;;-1:-1:-1;;;28091:49:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28173:19:0;;;;;;:6;:19;;;;;;:26;;28197:1;28173:23;:26::i;:::-;-1:-1:-1;;;;;28151:19:0;;;;;;:6;:19;;;;;;;:48;;;;28215:126;;;;;28158:11;;28287:10;;28313:17;;28215:126;:::i;:::-;;;;;;;;28359:10;27237:1140;-1:-1:-1;;;;;;;;27237:1140:0:o;40992:201::-;41090:13;41152:4;41158:25;41175:7;41158:16;:25::i;:::-;41135:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41121:64;;40992:201;;;:::o;36002:155::-;36091:12;36128;:21;36141:7;36128:21;;;;;;;;;;;36121:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36121:28:0;;;-1:-1:-1;;36121:28:0;;;;;-1:-1:-1;;;;;36121:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36002:155;;;:::o;58337:816::-;35262:19;;;;:9;:19;;;;;;58391:8;;35262:19;;:27;;:19;:27;;35254:65;;;;-1:-1:-1;;;35254:65:0;;;;;;;:::i;:::-;58434:24:::1;::::0;;;:14:::1;:24;::::0;;;;;58459:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;58434:38:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;58434:38:0;:53:::1;;::::0;::::1;;58412:118;;;;-1:-1:-1::0;;;58412:118:0::1;;;;;;;:::i;:::-;58599:1;58563:33;58573:12;:10;:12::i;:::-;58587:8;58563:9;:33::i;:::-;:37;58541:120;;;;-1:-1:-1::0;;;58541:120:0::1;;;;;;;:::i;:::-;58672:18;58693:24:::0;;;:14:::1;:24;::::0;;;;58672:18;58718:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;58693:38:0::1;-1:-1:-1::0;;;;;58693:38:0::1;;;;;;;;;;;;:44;;;58672:65;;58748:21;58785:14;:24;58800:8;58785:24;;;;;;;;;;;:38;58810:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;58785:38:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;58785:38:0;;;:52:::1;;::::0;58853:24;;;:14:::1;:24:::0;;;;;;58785:52;::::1;::::0;-1:-1:-1;58878:12:0::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;58853:38:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;58853:38:0;:50:::1;;::::0;-1:-1:-1;;;58853:50:0;::::1;;;58848:114;;58920:30;58927:8;58937:12;:10;:12::i;:::-;58920:6;:30::i;:::-;58972:54;58985:12;:10;:12::i;:::-;58999:13;59014:8;59024:1;58972:12;:54::i;:::-;59037:32;59046:8;59056:12;:10;:12::i;:::-;59037:8;:32::i;:::-;59136:8;59110:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;59085:60:0::1;59095:13;-1:-1:-1::0;;;;;59085:60:0::1;;59124:10;59085:60;;;;;;:::i;:::-;;;;;;;;35330:1;;58337:816:::0;;:::o;28803:107::-;-1:-1:-1;;;;;28890:12:0;28856:13;28890:12;;;:6;:12;;;;;;;28803:107::o;45180:1265::-;45427:7;:14;45413:3;:10;:28;45391:118;;;;-1:-1:-1;;;45391:118:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45528:16:0;;45520:66;;;;-1:-1:-1;;;45520:66:0;;;;;;;:::i;:::-;45619:14;:28;45634:12;:10;:12::i;:::-;-1:-1:-1;;;;;45619:28:0;;;;;;;;;;;;-1:-1:-1;45619:28:0;;;;:36;;:28;:36;45597:113;;;;-1:-1:-1;;;45597:113:0;;;;;;;:::i;:::-;45723:16;45742:12;:10;:12::i;:::-;45723:31;;45767:60;45788:8;45798:4;45804:2;45808:3;45813:7;45822:4;45767:20;:60::i;:::-;45845:9;45840:356;45864:3;:10;45860:1;:14;45840:356;;;45896:10;45909:3;45913:1;45909:6;;;;;;-1:-1:-1;;;45909:6:0;;;;;;;;;;;;;;;45896:19;;45930:14;45947:7;45955:1;45947:10;;;;;;-1:-1:-1;;;45947:10:0;;;;;;;;;;;;;;;45930:27;;45994:126;46036:6;45994:126;;;;;;;;;;;;;;;;;:9;:13;46004:2;45994:13;;;;;;;;;;;:19;46008:4;-1:-1:-1;;;;;45994:19:0;-1:-1:-1;;;;;45994:19:0;;;;;;;;;;;;;:23;;:126;;;;;:::i;:::-;45972:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;45972:19:0;;;;;;;;;;:148;;;;46155:17;;;;;;:29;;46177:6;46155:21;:29::i;:::-;46135:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;46135:17:0;;;;;;;;;;:49;;;;-1:-1:-1;45876:3:0;;;:::i;:::-;;;45840:356;;;;46243:2;-1:-1:-1;;;;;46213:47:0;46237:4;-1:-1:-1;;;;;46213:47:0;46227:8;-1:-1:-1;;;;;46213:47:0;;46247:3;46252:7;46213:47;;;;;;;:::i;:::-;;;;;;;;46273:164;46323:8;46346:4;46365:2;46382:3;46400:7;46422:4;46273:35;:164::i;:::-;45180:1265;;;;;;:::o;37856:343::-;37969:12;:10;:12::i;:::-;37954:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;37954:11:0;;;:27;;;;:67;;;37985:14;:28;38000:12;:10;:12::i;:::-;-1:-1:-1;;;;;37985:28:0;;;;;;;;;;;;-1:-1:-1;37985:28:0;;;;:36;;:28;:36;37954:67;37932:142;;;;-1:-1:-1;;;37932:142:0;;;;;;;:::i;:::-;38099:17;;;;:13;:17;;;;;38093:31;;;;;:::i;:::-;:36;;-1:-1:-1;38085:67:0;;;;-1:-1:-1;;;38085:67:0;;;;;;;:::i;:::-;38165:17;;;;:13;:17;;;;;;;;:26;;;;;;;;:::i;:::-;;37856:343;;:::o;37511:337::-;37621:12;:10;:12::i;:::-;37606:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;37606:11:0;;;:27;;;;:67;;;37637:14;:28;37652:12;:10;:12::i;:::-;-1:-1:-1;;;;;37637:28:0;;;;;;;;;;;;-1:-1:-1;37637:28:0;;;;:36;;:28;:36;37606:67;37584:142;;;;-1:-1:-1;;;37584:142:0;;;;;;;:::i;:::-;37751:16;;;;:12;:16;;;;;37745:30;;;;;:::i;:::-;:35;;-1:-1:-1;37737:68:0;;;;-1:-1:-1;;;37737:68:0;;;;;;;:::i;:::-;37818:16;;;;:12;:16;;;;;;;;:22;;;;;;;;:::i;56580:1011::-;35262:19;;;;:9;:19;;;;;;56734:8;;35262:19;;:27;;:19;:27;;35254:65;;;;-1:-1:-1;;;35254:65:0;;;;;;;:::i;:::-;56763:14:::1;:28;56778:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;56763:28:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;56763:28:0;;::::1;;:36;;:28:::0;:36:::1;56755:65;;;;-1:-1:-1::0;;;56755:65:0::1;;;;;;;:::i;:::-;56853:24;::::0;;;:14:::1;:24;::::0;;;;;;;-1:-1:-1;;;;;56853:32:0;::::1;::::0;;;;;;;:47:::1;;::::0;::::1;;56831:112;;;;-1:-1:-1::0;;;56831:112:0::1;;;;;;;:::i;:::-;56984:24;::::0;;;:14:::1;:24;::::0;;;;;;;-1:-1:-1;;;;;56984:32:0;::::1;::::0;;;;;;;:38:::1;;::::0;56976:46;::::1;56954:117;;;;-1:-1:-1::0;;;56954:117:0::1;;;;;;;:::i;:::-;57086:24;::::0;;;:14:::1;:24;::::0;;;;;;;-1:-1:-1;;;;;57086:32:0;::::1;::::0;;;;;;;:43:::1;;::::0;:48;57082:219:::1;;57177:24;::::0;;;:14:::1;:24;::::0;;;;;;;-1:-1:-1;;;;;57177:32:0;::::1;::::0;;;;;;;:43:::1;;::::0;57223:15:::1;-1:-1:-1::0;57151:138:0::1;;;;-1:-1:-1::0;;;57151:138:0::1;;;;;;;:::i;:::-;57311:34;57328:8;57338:6;57311:16;:34::i;:::-;57356:24;::::0;;;:14:::1;:24;::::0;;;;;;;-1:-1:-1;;;;;57356:32:0;;::::1;::::0;;;;;;;:46:::1;::::0;::::1;:64:::0;;;57431:38;;::::1;:46:::0;;;-1:-1:-1;;;;;;;;;57356:64:0;;::::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;;57488:51:0::1;::::0;;;::::1;::::0;;57555:28;57356:24;;57431:46;;57356:64;57555:28:::1;::::0;57356:24;57555:28:::1;56580:1011:::0;;;;;:::o;41811:695::-;41950:16;42025:3;:10;42006:8;:15;:29;41984:120;;;;-1:-1:-1;;;41984:120:0;;;;;;;:::i;:::-;42117:30;42164:8;:15;-1:-1:-1;;;;;42150:30:0;;;;;-1:-1:-1;;;42150:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42150:30:0;;42117:63;;42198:9;42193:273;42217:8;:15;42213:1;:19;42193:273;;;42303:1;-1:-1:-1;;;;;42280:25:0;:8;42289:1;42280:11;;;;;;-1:-1:-1;;;42280:11:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42280:25:0;;;42254:136;;;;-1:-1:-1;;;42254:136:0;;;;;;;:::i;:::-;42424:9;:17;42434:3;42438:1;42434:6;;;;;;-1:-1:-1;;;42434:6:0;;;;;;;;;;;;;;;42424:17;;;;;;;;;;;:30;42442:8;42451:1;42442:11;;;;;;-1:-1:-1;;;42442:11:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42424:30:0;-1:-1:-1;;;;;42424:30:0;;;;;;;;;;;;;42405:13;42419:1;42405:16;;;;;;-1:-1:-1;;;42405:16:0;;;;;;;;;;;;;;;;;;:49;42234:3;;;:::i;:::-;;;42193:273;;;-1:-1:-1;42485:13:0;41811:695;-1:-1:-1;;;41811:695:0:o;36330:1173::-;36548:1;36512:19;;;:9;:19;;;;;36548:1;36532:12;:10;:12::i;:::-;-1:-1:-1;;;;;36512:33:0;-1:-1:-1;;;;;36512:33:0;;;;;;;;;;;;;:37;36490:114;;;;-1:-1:-1;;;36490:114:0;;;;;;;:::i;:::-;36619:24;;;;:14;:24;;;;;;36644:12;:10;:12::i;:::-;-1:-1:-1;;;;;36619:38:0;;;;;;;;;;;;-1:-1:-1;36619:38:0;:53;;;;;36615:254;;;36800:1;36715:24;;;:14;:24;;;;;36800:1;36740:12;:10;:12::i;:::-;-1:-1:-1;;;;;36715:38:0;;;;;;;;;;;;;;-1:-1:-1;36715:38:0;:52;;;;:87;36689:168;;;;-1:-1:-1;;;36689:168:0;;;;;;;:::i;:::-;36885:16;;36881:615;;36959:246;;;;;;;;36985:5;36959:246;;;;37009:5;36959:246;;;;37033:14;36959:246;;;;;;37085:12;37100:6;37085:21;;;;:::i;:::-;37066:41;;:15;:41;:::i;:::-;36959:246;;37164:1;36959:246;;;;;;;;;;;;;;36918:24;;;:14;:24;;;;;;36943:12;:10;:12::i;:::-;-1:-1:-1;;;;;36918:38:0;;;;;;;;;;;;;;;;;-1:-1:-1;36918:38:0;:287;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36918:287:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36918:287:0;-1:-1:-1;;;;36918:287:0;;;;-1:-1:-1;;;;;;36918:287:0;;;;;;;;;;;;;;36881:615;;;37279:205;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37279:205:0;;;;;;;;;;;;;;;;;;37238:24;;;:14;:24;;;;;;37279:205;;37263:12;:10;:12::i;:::-;-1:-1:-1;;;;;37238:38:0;;;;;;;;;;;;;;;;;-1:-1:-1;37238:38:0;:246;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37238:246:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37238:246:0;-1:-1:-1;;;;37238:246:0;;;;-1:-1:-1;;;;;;37238:246:0;;;;;;;;;;;;;;36881:615;36330:1173;;;;:::o;60460:496::-;60531:22;60556:24;;;:14;:24;;;;;;;;-1:-1:-1;;;;;60556:32:0;;;;;;;;;;:46;;;;;60635:12;:10;:12::i;:::-;-1:-1:-1;;;;;60635:22:0;;:48;;;;60677:6;-1:-1:-1;;;;;60661:22:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;60661:22:0;;60635:48;60613:130;;;;-1:-1:-1;;;60613:130:0;;;;;;;:::i;:::-;60754:17;60774:24;;;:14;:24;;;;;;;;-1:-1:-1;;;;;60774:32:0;;;;;;;;;:38;;;60823:34;60789:8;60799:6;60823:16;:34::i;:::-;60868:26;60877:8;60887:6;60868:8;:26::i;:::-;60939:8;60928:9;60920:6;-1:-1:-1;;;;;60910:38:0;;;;;;;;;;;60460:496;;;;:::o;30953:195::-;31009:15;31061:17;;;:7;:17;;;;;;-1:-1:-1;;;;;31061:17:0;31097:19;31089:28;;;;;47771:949;-1:-1:-1;;;;;47918:21:0;;47910:67;;;;-1:-1:-1;;;47910:67:0;;;;;;;:::i;:::-;48033:1;48010:11;;;:7;:11;;;;;;-1:-1:-1;;;;;48010:11:0;:25;47988:111;;;;-1:-1:-1;;;47988:111:0;;;;;;;:::i;:::-;48112:14;48129:12;:10;:12::i;:::-;48112:29;;48154:194;48189:6;48218:1;48235:7;48257:21;48275:2;48257:17;:21::i;:::-;48293:25;48311:6;48293:17;:25::i;:::-;48333:4;48154:20;:194::i;:::-;48386:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;48386:22:0;;;;;;;;;;:34;;48413:6;48386:26;:34::i;:::-;48361:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;48361:22:0;;;;;;;;;;;;:59;;;;48431:11;;;:7;:11;;;;;;:29;;-1:-1:-1;;;;;;48431:29:0;;;;;;;;;48478:55;48361:22;;48431:29;48478:55;;;;48361:13;;48526:6;;48478:55;:::i;:::-;;;;;;;;48546:166;48591:6;48620:1;48637:7;48659:2;48676:6;48697:4;48546:30;:166::i;:::-;47771:949;;;;;:::o;38207:199::-;38328:1;38298:13;;;:9;:13;;;;;38264;;38328:1;;38312:12;:10;:12::i;:::-;-1:-1:-1;;;;;38298:27:0;-1:-1:-1;;;;;38298:27:0;;;;;;;;;;;;;:31;38290:71;;;;-1:-1:-1;;;38290:71:0;;;;;;;:::i;:::-;38381:17;;;;:13;:17;;;;;38374:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38207:199;;;:::o;33970:792::-;34056:18;;;;:9;:18;;;;;;;;:27;34048:51;;;;-1:-1:-1;;;34048:51:0;;;;;;;:::i;:::-;34152:12;:10;:12::i;:::-;34132:16;;;;:7;:16;;;;;;-1:-1:-1;;;;;34132:16:0;;;:32;;;;:89;;;34185:14;:28;34200:12;:10;:12::i;:::-;-1:-1:-1;;;;;34185:28:0;;;;;;;;;;;;-1:-1:-1;34185:28:0;;;;:36;;:28;:36;34132:89;34110:164;;;;-1:-1:-1;;;34110:164:0;;;;;;;:::i;:::-;34290:9;34285:470;34309:4;:11;34305:1;:15;34285:470;;;34346:4;34351:1;34346:7;;;;;;-1:-1:-1;;;34346:7:0;;;;;;;;;;;;;;;:18;;;:26;;34368:4;34346:26;;;34342:352;;;34439:5;34423:4;34428:1;34423:7;;;;;;-1:-1:-1;;;34423:7:0;;;;;;;;;;;;;;;:13;;;:21;34393:135;;;;-1:-1:-1;;;34393:135:0;;;;;;;:::i;:::-;34593:1;34577:4;34582:1;34577:7;;;;;;-1:-1:-1;;;34577:7:0;;;;;;;;;;;;;;;:13;;;:17;34547:131;;;;-1:-1:-1;;;34547:131:0;;;;;;;:::i;:::-;34708:21;;;;:12;:21;;;;;34735:7;;:4;;34740:1;;34735:7;;;;-1:-1:-1;;;34735:7:0;;;;;;;;;;;;;;;;;;;;34708:35;;;;;;;-1:-1:-1;34708:35:0;;;;;;;;;;;34735:7;;34708:35;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;34708:35:0;;;;;;;;;-1:-1:-1;;;;;;34708:35:0;-1:-1:-1;;;;;34708:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34708:35:0;;;;;;;;;;34322:3;;;;:::i;:::-;;;;34285:470;;38536:358;38657:12;:10;:12::i;:::-;38642:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;38642:11:0;;;:27;;;;:67;;;38673:14;:28;38688:12;:10;:12::i;:::-;-1:-1:-1;;;;;38673:28:0;;;;;;;;;;;;-1:-1:-1;38673:28:0;;;;:36;;:28;:36;38642:67;38620:142;;;;-1:-1:-1;;;38620:142:0;;;;;;;:::i;:::-;38780:9;38775:112;38799:9;:16;38795:1;:20;38775:112;;;38837:19;;;;:15;:19;;;;;38862:12;;:9;;38872:1;;38862:12;;;;-1:-1:-1;;;38862:12:0;;;;;;;;;;;;;;;;;;;;38837:38;;;;;;;-1:-1:-1;38837:38:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;38817:3:0;;;;:::i;:::-;;;;38775:112;;60964:1103;61064:8;30794:11;:9;:11::i;:::-;-1:-1:-1;;;;;30773:32:0;:17;30781:8;30773:7;:17::i;:::-;-1:-1:-1;;;;;30773:32:0;;;30765:41;;;;;;35262:19:::1;::::0;;;:9:::1;:19;::::0;;;;;61093:8;;35262:19:::1;;:27;;:19:::0;:27:::1;;35254:65;;;;-1:-1:-1::0;;;35254:65:0::1;;;;;;;:::i;:::-;61119:17:::2;61139:24:::0;;;:14:::2;:24;::::0;;;;;;;-1:-1:-1;;;;;61139:32:0;::::2;::::0;;;;;;;:38:::2;;::::0;;61208:9:::2;::::0;61244:12:::2;:10;:12::i;:::-;61228:28;;61319:1;61289:27;61299:6;61307:8;61289:9;:27::i;:::-;:31;61267:114;;;;-1:-1:-1::0;;;61267:114:0::2;;;;;;;:::i;:::-;61412:1;61400:9;:13;61392:47;;;;-1:-1:-1::0;;;61392:47:0::2;;;;;;;:::i;:::-;61472:24;::::0;;;:14:::2;:24;::::0;;;;;;;-1:-1:-1;;;;;61472:32:0;::::2;::::0;;;;;;;:47:::2;;::::0;::::2;;:56;61450:137;;;;-1:-1:-1::0;;;61450:137:0::2;;;;;;;:::i;:::-;61619:9;61606;:22;;61598:58;;;;-1:-1:-1::0;;;61598:58:0::2;;;;;;;:::i;:::-;61671:24;::::0;;;:14:::2;:24;::::0;;;;;;;-1:-1:-1;;;;;61671:32:0;::::2;::::0;;;;;;;:43:::2;;::::0;:48;61667:219:::2;;61762:24;::::0;;;:14:::2;:24;::::0;;;;;;;-1:-1:-1;;;;;61762:32:0;::::2;::::0;;;;;;;:43:::2;;::::0;61808:15:::2;-1:-1:-1::0;61736:138:0::2;;;;-1:-1:-1::0;;;61736:138:0::2;;;;;;;:::i;:::-;61896:24;61903:8;61913:6;61896;:24::i;:::-;61931:26;61940:8;61950:6;61931:8;:26::i;:::-;61968:40;61981:6;61989:5;61996:8;62006:1;61968:12;:40::i;:::-;62050:8;62031:6;-1:-1:-1::0;;;;;62019:40:0::2;62024:5;-1:-1:-1::0;;;;;62019:40:0::2;;62039:9;62019:40;;;;;;:::i;:::-;;;;;;;;35330:1;;;30817::::1;60964:1103:::0;;;:::o;35815:179::-;35916:14;;:::i;:::-;-1:-1:-1;35955:23:0;;;;:14;:23;;;;;;;;-1:-1:-1;;;;;35955:31:0;;;;;;;;;;;35948:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35948:38:0;;;;;;;;;;;;;35815:179::o;35347:191::-;35429:14;:28;35444:12;:10;:12::i;:::-;-1:-1:-1;;;;;35429:28:0;;;;;;;;;;;;-1:-1:-1;35429:28:0;;;;:36;;:28;:36;35421:65;;;;-1:-1:-1;;;35421:65:0;;;;;;;:::i;:::-;35497:18;;;;:9;:18;;;;;;:33;;-1:-1:-1;;35497:33:0;;;;;;;;;;35347:191::o;55656:916::-;35262:19;;;;:9;:19;;;;;;55755:8;;35262:19;;:27;;:19;:27;;35254:65;;;;-1:-1:-1;;;35254:65:0;;;;;;;:::i;:::-;55803:24:::1;::::0;;;:14:::1;:24;::::0;;;;;;;-1:-1:-1;;;;;55803:32:0;::::1;::::0;;;;;;;:47:::1;;::::0;::::1;;55781:112;;;;-1:-1:-1::0;;;55781:112:0::1;;;;;;;:::i;:::-;55922:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;55912:22:0::1;:6;-1:-1:-1::0;;;;;55912:22:0::1;;;55904:52;;;;-1:-1:-1::0;;;55904:52:0::1;;;;;;;:::i;:::-;55975:30;55988:8;55998:6;55975:12;:30::i;:::-;55967:64;;;;-1:-1:-1::0;;;55967:64:0::1;;;;;;;:::i;:::-;56046:24;::::0;;;:14:::1;:24;::::0;;;;;;;-1:-1:-1;;;;;56046:32:0;::::1;::::0;;;;;;;:43:::1;;::::0;:48;56042:219:::1;;56137:24;::::0;;;:14:::1;:24;::::0;;;;;;;-1:-1:-1;;;;;56137:32:0;::::1;::::0;;;;;;;:43:::1;;::::0;56183:15:::1;-1:-1:-1::0;56111:138:0::1;;;;-1:-1:-1::0;;;56111:138:0::1;;;;;;;:::i;:::-;56271:34;56288:8;56298:6;56271:16;:34::i;:::-;56373:12;:10;:12::i;:::-;56316:24;::::0;;;:14:::1;:24;::::0;;;;;;;-1:-1:-1;;;;;56316:32:0;;::::1;::::0;;;;;;;:46:::1;::::0;::::1;:70:::0;;56438:9:::1;56316:70:::0;56397:38;;::::1;:50:::0;;;-1:-1:-1;;;;;;56316:70:0::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;56458:52:0::1;::::0;;56316:24;;56530:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;56526:38:0::1;;;;;;;;;;;55656:916:::0;;;:::o;42579:380::-;42744:8;-1:-1:-1;;;;;42728:24:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;42728:24:0;;;42706:115;;;;-1:-1:-1;;;42706:115:0;;;;;;;:::i;:::-;42879:8;42834:18;:32;42853:12;:10;:12::i;:::-;-1:-1:-1;;;;;42834:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;42834:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;42834:53:0;;;;;;;;;;;42918:12;:10;:12::i;:::-;-1:-1:-1;;;;;42903:48:0;;42942:8;42903:48;;;;;;:::i;:::-;;;;;;;;42579:380;;:::o;34770:428::-;34857:18;;;;:9;:18;;;;;;;;:27;34849:51;;;;-1:-1:-1;;;34849:51:0;;;;;;;:::i;:::-;34953:12;:10;:12::i;:::-;34933:16;;;;:7;:16;;;;;;-1:-1:-1;;;;;34933:16:0;;;:32;;;;:89;;;34986:14;:28;35001:12;:10;:12::i;:::-;-1:-1:-1;;;;;34986:28:0;;;;;;;;;;;;-1:-1:-1;34986:28:0;;;;:36;;:28;:36;34933:89;34911:164;;;;-1:-1:-1;;;34911:164:0;;;;;;;:::i;:::-;35091:9;35086:105;35110:4;:11;35106:1;:15;35086:105;;;35143:22;;;;:13;:22;;;;;35171:7;;:4;;35176:1;;35171:7;;;;-1:-1:-1;;;35171:7:0;;;;;;;;;;;;;;;;;;;;35143:36;;;;;;;-1:-1:-1;35143:36:0;;;;;;;;;;;35171:7;;35143:36;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;35143:36:0;;;;;;;;;-1:-1:-1;;;;;;35143:36:0;-1:-1:-1;;;;;35143:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35143:36:0;;;;;;;;;;35123:3;;;;:::i;:::-;;;;35086:105;;38902:117;38957:15;38992;:19;39008:2;38992:19;;;;;;;;;;;38985:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35546:261;35641:12;:10;:12::i;:::-;35621:16;;;;:7;:16;;;;;;-1:-1:-1;;;;;35621:16:0;;;:32;;;;:89;;;35674:14;:28;35689:12;:10;:12::i;:::-;-1:-1:-1;;;;;35674:28:0;;;;;;;;;;;;-1:-1:-1;35674:28:0;;;;:36;;:28;:36;35621:89;35599:164;;;;-1:-1:-1;;;35599:164:0;;;;;;;:::i;:::-;35774:18;;;;:9;:18;;;;;:25;;-1:-1:-1;;35774:25:0;35795:4;35774:25;;;35546:261::o;57599:730::-;57717:14;:28;57732:12;:10;:12::i;:::-;-1:-1:-1;;;;;57717:28:0;;;;;;;;;;;;-1:-1:-1;57717:28:0;;;;:36;;:28;:36;57709:65;;;;-1:-1:-1;;;57709:65:0;;;;;;;:::i;:::-;57807:24;;;;:14;:24;;;;;;;;-1:-1:-1;;;;;57807:32:0;;;;;;;;;:47;;;;;57785:112;;;;-1:-1:-1;;;57785:112:0;;;;;;;:::i;:::-;57988:1;57930:24;;;:14;:24;;;;;;;;-1:-1:-1;;;;;57930:32:0;;;;;;;;;;:46;;;;57908:126;;;;-1:-1:-1;;;57908:126:0;;;;;;;:::i;:::-;58045:22;58070:24;;;:14;:24;;;;;;;;-1:-1:-1;;;;;58070:32:0;;;;;;;;;;:46;;;;;58147:38;;;;58070:46;;;58196:34;58070:24;:32;58196:16;:34::i;36165:157::-;36255:12;36292:13;:22;36306:7;36292:22;;;;;;;;;;;36285:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36285:29:0;;;-1:-1:-1;;36285:29:0;;;;;-1:-1:-1;;;;;36285:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38414:114;38504:16;;;;:12;:16;;;;;38497:23;;38471:13;;38504:16;38497:23;;;:::i;43031:201::-;-1:-1:-1;;;;;43187:27:0;;;43158:4;43187:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;43031:201::o;43304:980::-;-1:-1:-1;;;;;43498:16:0;;43490:66;;;;-1:-1:-1;;;43490:66:0;;;;;;;:::i;:::-;43589:14;:28;43604:12;:10;:12::i;:::-;-1:-1:-1;;;;;43589:28:0;;;;;;;;;;;;-1:-1:-1;43589:28:0;;;;:36;;:28;:36;43567:113;;;;-1:-1:-1;;;43567:113:0;;;;;;;:::i;:::-;43693:16;43712:12;:10;:12::i;:::-;43693:31;;43737:185;43772:8;43795:4;43814:2;43831:21;43849:2;43831:17;:21::i;43737:185::-;43957:114;43995:6;43957:114;;;;;;;;;;;;;;;;;:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;43957:19:0;;;;;;;;;;;:114;:23;:114::i;:::-;43935:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;43935:19:0;;;;;;;;;;:136;;;;44102:17;;;;;;:29;;44124:6;44102:21;:29::i;:::-;44082:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;44082:17:0;;;;;;;;;;;;;;:49;;;;44149:46;;44082:17;;44149:46;;;;;;;;;;;;44092:2;;44188:6;;44149:46;:::i;:::-;;;;;;;;44208:68;44239:8;44249:4;44255:2;44259;44263:6;44271:4;44208:30;:68::i;8242:157::-;-1:-1:-1;;;;;;8351:40:0;;-1:-1:-1;;;8351:40:0;8242:157;;;:::o;28918:405::-;29096:4;29156:159;29184:47;29203:27;29223:6;29203:19;:27::i;:::-;29184:18;:47::i;:::-;29250:4;29273;29296;29156:159;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29133:182:0;:6;-1:-1:-1;;;;;29133:182:0;;29113:202;;28918:405;;;;;;;:::o;12370:98::-;12428:7;12455:5;12459:1;12455;:5;:::i;:::-;12448:12;12370:98;-1:-1:-1;;;12370:98:0:o;31178:621::-;31258:27;31307:7;31303:50;;-1:-1:-1;31331:10:0;;;;;;;;;;;;-1:-1:-1;;;31331:10:0;;;;;;31303:50;31375:2;31363:9;31410:69;31417:6;;31410:69;;31440:5;;;;:::i;:::-;;-1:-1:-1;31460:7:0;;-1:-1:-1;31465:2:0;31460:7;;:::i;:::-;;;31410:69;;;31489:17;31519:3;-1:-1:-1;;;;;31509:14:0;;;;;-1:-1:-1;;;31509:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31509:14:0;-1:-1:-1;31489:34:0;-1:-1:-1;31546:3:0;31560:202;31567:7;;31560:202;;31595:5;31599:1;31595;:5;:::i;:::-;31591:9;-1:-1:-1;31615:10:0;31646:7;31651:2;31646;:7;:::i;:::-;31645:14;;31657:2;31645:14;:::i;:::-;31640:19;;:2;:19;:::i;:::-;31629:31;;:2;:31;:::i;:::-;31615:46;;31676:9;31695:4;31688:12;;31676:24;;31725:2;31715:4;31720:1;31715:7;;;;;;-1:-1:-1;;;31715:7:0;;;;;;;;;;;;:12;-1:-1:-1;;;;;31715:12:0;;;;;;;;-1:-1:-1;31742:8:0;31748:2;31742:8;;:::i;:::-;;;31560:202;;;;;-1:-1:-1;31786:4:0;31178:621;-1:-1:-1;;;;31178:621:0:o;29331:602::-;29376:14;29407:10;29429:4;29407:27;29403:499;;;29451:18;29472:8;;29451:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;29511:8:0;29722:17;29716:24;-1:-1:-1;;;;;29690:134:0;;-1:-1:-1;29550:289:0;;-1:-1:-1;29550:289:0;;-1:-1:-1;29880:10:0;29403:499;29331:602;:::o;59161:1291::-;59231:18;59252:24;;;:14;:24;;;;;;;;-1:-1:-1;;;;;59252:33:0;;;;;;;;;;;;:39;;;59349:17;;;:7;:17;;;;;;;59252:39;;59231:18;59349:17;;;59338:28;59334:1053;;;59383:17;59403:24;59418:8;59403:14;:24::i;:::-;59383:44;;59447:9;59442:421;59466:4;:11;59462:1;:15;59442:421;;;59507:4;59512:1;59507:7;;;;;;-1:-1:-1;;;59507:7:0;;;;;;;;;;;;;;;:18;;;59503:345;;;59550:11;59595:5;59581:10;59565:4;59570:1;59565:7;;;;;;-1:-1:-1;;;59565:7:0;;;;;;;;;;;;;;;:13;;;:26;;;;:::i;:::-;59564:36;;;;:::i;:::-;59550:50;-1:-1:-1;59623:14:0;59550:50;59623:14;;:::i;:::-;;;59660:4;59665:1;59660:7;;;;;;-1:-1:-1;;;59660:7:0;;;;;;;;;;;;;;;:17;;;-1:-1:-1;;;;;59660:26:0;:31;59687:3;59660:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59503:345;;;;59751:4;59756:1;59751:7;;;;;;-1:-1:-1;;;59751:7:0;;;;;;;;;;;;;;;:13;;;59740:24;;;;;:::i;:::-;;;59787:4;59792:1;59787:7;;;;;;-1:-1:-1;;;59787:7:0;;;;;;;;;;;;;;;:17;;;-1:-1:-1;;;;;59787:26:0;:41;59814:4;59819:1;59814:7;;;;;;-1:-1:-1;;;59814:7:0;;;;;;;;;;;;;;;:13;;;59787:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59503:345;59479:3;;;:::i;:::-;;;59442:421;;;;59334:1053;;;;59895:17;59915:25;59931:8;59915:15;:25::i;:::-;59895:45;;59960:9;59955:421;59979:4;:11;59975:1;:15;59955:421;;;60020:4;60025:1;60020:7;;;;;;-1:-1:-1;;;60020:7:0;;;;;;;;;;;;;;;:18;;;60016:345;;;60063:11;60108:5;60094:10;60078:4;60083:1;60078:7;;;;;;-1:-1:-1;;;60078:7:0;;;;;;;;;;;;;;;:13;;;:26;;;;:::i;:::-;60077:36;;;;:::i;:::-;60063:50;-1:-1:-1;60136:14:0;60063:50;60136:14;;:::i;:::-;;;60173:4;60178:1;60173:7;;;;;;-1:-1:-1;;;60173:7:0;;;;;;;;;;;;;;;:17;;;-1:-1:-1;;;;;60173:26:0;:31;60200:3;60173:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60016:345;;;;60264:4;60269:1;60264:7;;;;;;-1:-1:-1;;;60264:7:0;;;;;;;;;;;;;;;:13;;;60253:24;;;;;:::i;:::-;;;60300:4;60305:1;60300:7;;;;;;-1:-1:-1;;;60300:7:0;;;;;;;;;;;;;;;:17;;;-1:-1:-1;;;;;60300:26:0;:41;60327:4;60332:1;60327:7;;;;;;-1:-1:-1;;;60327:7:0;;;;;;;;;;;;;;;:13;;;60300:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60016:345;59992:3;;;:::i;:::-;;;59955:421;;;;59334:1053;;-1:-1:-1;;;;;60397:25:0;;:47;60423:20;60436:7;60423:10;:20;:::i;:::-;60397:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44292:811;-1:-1:-1;;;;;44439:16:0;;44431:66;;;;-1:-1:-1;;;44431:66:0;;;;;;;:::i;:::-;44510:16;44529:12;:10;:12::i;:::-;44510:31;;44554:186;44589:8;44612:4;44631:2;44648:21;44666:2;44648:17;:21::i;:::-;44684:25;44702:6;44684:17;:25::i;:::-;44554:186;;;;;;;;;;;;;-1:-1:-1;;;44554:186:0;;;:20;:186::i;:::-;44775:114;44813:6;44775:114;;;;;;;;;;;;;;;;;:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;44775:19:0;;;;;;;;;;;:114;:23;:114::i;:::-;44753:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;44753:19:0;;;;;;;;;;:136;;;;44920:17;;;;;;:29;;44942:6;44920:21;:29::i;:::-;44900:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;44900:17:0;;;;;;;;;;;;;;:49;;;;44967:46;;44900:17;;44967:46;;;;;;;;;;;;44910:2;;45006:6;;44967:46;:::i;:::-;;;;;;;;45026:69;45057:8;45067:4;45073:2;45077;45081:6;45026:69;;;;;;;;;;;;;-1:-1:-1;;;45026:69:0;;;:30;:69::i;54666:336::-;54794:1;54737:24;;;:14;:24;;;;;;;;-1:-1:-1;;;;;54737:32:0;;;;;;;;;;;:46;;;:59;;54848:83;;54737:59;54807:38;;;:124;;;;-1:-1:-1;;;;;;54942:52:0;;;;;54666:336::o;14649:206::-;14735:7;14796:12;14788:6;;;;14780:29;;;;-1:-1:-1;;;14780:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;14831:5:0;;;14649:206::o;52786:1000::-;53026:15;:2;-1:-1:-1;;;;;53026:13:0;;:15::i;:::-;53022:757;;;53079:203;;-1:-1:-1;;;53079:203:0;;-1:-1:-1;;;;;53079:43:0;;;;;:203;;53145:8;;53176:4;;53203:3;;53229:7;;53259:4;;53079:203;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53079:203:0;;;;;;;;-1:-1:-1;;53079:203:0;;;;;;;;;;;;:::i;:::-;;;53058:710;;;;:::i;:::-;;;;;;;;53641:6;53634:14;;-1:-1:-1;;;53634:14:0;;;;;;;;:::i;53058:710::-;53690:62;;-1:-1:-1;;;53690:62:0;;;;;;;:::i;53058:710::-;-1:-1:-1;;;;;;53367:85:0;;-1:-1:-1;;;53367:85:0;53341:224;;53495:50;;-1:-1:-1;;;53495:50:0;;;;;;;:::i;53341:224::-;53296:284;52786:1000;;;;;;:::o;55010:438::-;55089:18;55110:24;;;:14;:24;;;;;;;;-1:-1:-1;;;;;55110:32:0;;;;;;;;;;:38;;;;55204:46;;;;;55110:38;;55204:46;55279:27;;;;;:89;;-1:-1:-1;55324:24:0;;;;:14;:24;;;;;;;;-1:-1:-1;;;;;55324:32:0;;;;;;;;;:44;;;-1:-1:-1;;;55324:44:0;;;;55323:45;55279:89;55261:180;;;55395:34;;-1:-1:-1;;;;;55395:22:0;;;:34;;;;;55418:10;;55395:34;;;;55418:10;55395:22;:34;;;;;;;;;;;;;;;;;;;53794:230;53946:16;;;53960:1;53946:16;;;;;;;;;53887;;53921:22;;53946:16;;;;;;;;;;;;-1:-1:-1;53946:16:0;53921:41;;53984:7;53973:5;53979:1;53973:8;;;;;;-1:-1:-1;;;53973:8:0;;;;;;;;;;;;;;;;;;:18;54011:5;53794:230;-1:-1:-1;;53794:230:0:o;51836:942::-;52051:15;:2;-1:-1:-1;;;;;52051:13:0;;:15::i;:::-;52047:724;;;52104:196;;-1:-1:-1;;;52104:196:0;;-1:-1:-1;;;;;52104:38:0;;;;;:196;;52165:8;;52196:4;;52223:2;;52248:6;;52277:4;;52104:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52104:196:0;;;;;;;;-1:-1:-1;;52104:196:0;;;;;;;;;;;;:::i;:::-;;;52083:677;;;;:::i;:::-;-1:-1:-1;;;;;;52385:59:0;;-1:-1:-1;;;52385:59:0;52359:198;;52487:50;;-1:-1:-1;;;52487:50:0;;;;;;;:::i;55456:192::-;55561:4;55602:24;;;:14;:24;;;;;;;;-1:-1:-1;;;;;55602:32:0;;;;;;;;;;;:38;;;55590:9;:50;;55456:192::o;28385:410::-;28495:7;26438:108;;;;;;;;;;;;;;;;;26414:143;;;;;;;28649:12;;28684:11;;;;28728:24;;;;;28718:35;;;;;;28568:204;;;;;;:::i;:::-;;;;;;;;;;;;;28540:247;;;;;;28520:267;;28385:410;;;:::o;26002:258::-;26101:7;26203:20;:18;:20::i;:::-;26225:11;26174:63;;;;;;;;;:::i;17343:422::-;17710:20;17749:8;;;17343:422::o;25531:102::-;25610:15;;25531:102;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:705:1;;127:3;120:4;112:6;108:17;104:27;94:2;;149:5;142;135:20;94:2;189:6;176:20;215:4;239:65;254:49;300:2;254:49;:::i;:::-;239:65;:::i;:::-;338:15;;;369:12;;;;401:15;;;447:11;;;435:24;;431:33;;428:42;-1:-1:-1;425:2:1;;;487:5;480;473:20;425:2;513:5;527:163;541:2;538:1;535:9;527:163;;;598:17;;586:30;;636:12;;;;668;;;;559:1;552:9;527:163;;;-1:-1:-1;708:5:1;;84:635;-1:-1:-1;;;;;;;84:635:1:o;724:162::-;791:20;;847:13;;840:21;830:32;;820:2;;876:1;873;866:12;891:551;;988:3;981:4;973:6;969:17;965:27;955:2;;1010:5;1003;996:20;955:2;1050:6;1037:20;-1:-1:-1;;;;;1072:2:1;1069:26;1066:2;;;1098:18;;:::i;:::-;1142:54;1184:2;1165:13;;-1:-1:-1;;1161:27:1;1190:4;1157:38;1142:54;:::i;:::-;1221:2;1212:7;1205:19;1267:3;1260:4;1255:2;1247:6;1243:15;1239:26;1236:35;1233:2;;;1288:5;1281;1274:20;1233:2;1357;1350:4;1342:6;1338:17;1331:4;1322:7;1318:18;1305:55;1380:16;;;1398:4;1376:27;1369:42;;;;1384:7;945:497;-1:-1:-1;;945:497:1:o;1447:259::-;;1559:2;1547:9;1538:7;1534:23;1530:32;1527:2;;;1580:6;1572;1565:22;1527:2;1624:9;1611:23;1643:33;1670:5;1643:33;:::i;1711:402::-;;;1840:2;1828:9;1819:7;1815:23;1811:32;1808:2;;;1861:6;1853;1846:22;1808:2;1905:9;1892:23;1924:33;1951:5;1924:33;:::i;:::-;1976:5;-1:-1:-1;2033:2:1;2018:18;;2005:32;2046:35;2005:32;2046:35;:::i;:::-;2100:7;2090:17;;;1798:315;;;;;:::o;2118:1129::-;;;;;;2357:3;2345:9;2336:7;2332:23;2328:33;2325:2;;;2379:6;2371;2364:22;2325:2;2423:9;2410:23;2442:33;2469:5;2442:33;:::i;:::-;2494:5;-1:-1:-1;2551:2:1;2536:18;;2523:32;2564:35;2523:32;2564:35;:::i;:::-;2618:7;-1:-1:-1;2676:2:1;2661:18;;2648:32;-1:-1:-1;;;;;2729:14:1;;;2726:2;;;2761:6;2753;2746:22;2726:2;2789:67;2848:7;2839:6;2828:9;2824:22;2789:67;:::i;:::-;2779:77;;2909:2;2898:9;2894:18;2881:32;2865:48;;2938:2;2928:8;2925:16;2922:2;;;2959:6;2951;2944:22;2922:2;2987:69;3048:7;3037:8;3026:9;3022:24;2987:69;:::i;:::-;2977:79;;3109:3;3098:9;3094:19;3081:33;3065:49;;3139:2;3129:8;3126:16;3123:2;;;3160:6;3152;3145:22;3123:2;;3188:53;3233:7;3222:8;3211:9;3207:24;3188:53;:::i;:::-;3178:63;;;2315:932;;;;;;;;:::o;3252:760::-;;;;;;3441:3;3429:9;3420:7;3416:23;3412:33;3409:2;;;3463:6;3455;3448:22;3409:2;3507:9;3494:23;3526:33;3553:5;3526:33;:::i;:::-;3578:5;-1:-1:-1;3635:2:1;3620:18;;3607:32;3648:35;3607:32;3648:35;:::i;:::-;3702:7;-1:-1:-1;3756:2:1;3741:18;;3728:32;;-1:-1:-1;3807:2:1;3792:18;;3779:32;;-1:-1:-1;3862:3:1;3847:19;;3834:33;-1:-1:-1;;;;;3879:30:1;;3876:2;;;3927:6;3919;3912:22;3876:2;3955:51;3998:7;3989:6;3978:9;3974:22;3955:51;:::i;4017:329::-;;;4143:2;4131:9;4122:7;4118:23;4114:32;4111:2;;;4164:6;4156;4149:22;4111:2;4208:9;4195:23;4227:33;4254:5;4227:33;:::i;:::-;4279:5;-1:-1:-1;4303:37:1;4336:2;4321:18;;4303:37;:::i;:::-;4293:47;;4101:245;;;;;:::o;4351:792::-;;;;;;4538:3;4526:9;4517:7;4513:23;4509:33;4506:2;;;4560:6;4552;4545:22;4506:2;4604:9;4591:23;4623:33;4650:5;4623:33;:::i;:::-;4675:5;-1:-1:-1;4731:2:1;4716:18;;4703:32;-1:-1:-1;;;;;4747:30:1;;4744:2;;;4795:6;4787;4780:22;4744:2;4823:51;4866:7;4857:6;4846:9;4842:22;4823:51;:::i;:::-;4813:61;;;4921:2;4910:9;4906:18;4893:32;4883:42;;4972:2;4961:9;4957:18;4944:32;4934:42;;5028:3;5017:9;5013:19;5000:33;5077:4;5068:7;5064:18;5055:7;5052:31;5042:2;;5102:6;5094;5087:22;5042:2;5130:7;5120:17;;;4496:647;;;;;;;;:::o;5148:327::-;;;5277:2;5265:9;5256:7;5252:23;5248:32;5245:2;;;5298:6;5290;5283:22;5245:2;5342:9;5329:23;5361:33;5388:5;5361:33;:::i;:::-;5413:5;5465:2;5450:18;;;;5437:32;;-1:-1:-1;;;5235:240:1:o;5480:616::-;;;;;5652:3;5640:9;5631:7;5627:23;5623:33;5620:2;;;5674:6;5666;5659:22;5620:2;5718:9;5705:23;5737:33;5764:5;5737:33;:::i;:::-;5789:5;-1:-1:-1;5841:2:1;5826:18;;5813:32;;-1:-1:-1;5892:2:1;5877:18;;5864:32;;-1:-1:-1;5947:2:1;5932:18;;5919:32;-1:-1:-1;;;;;5963:30:1;;5960:2;;;6011:6;6003;5996:22;5960:2;6039:51;6082:7;6073:6;6062:9;6058:22;6039:51;:::i;:::-;6029:61;;;5610:486;;;;;;;:::o;6101:1295::-;;;6280:2;6268:9;6259:7;6255:23;6251:32;6248:2;;;6301:6;6293;6286:22;6248:2;6346:9;6333:23;-1:-1:-1;;;;;6416:2:1;6408:6;6405:14;6402:2;;;6437:6;6429;6422:22;6402:2;6480:6;6469:9;6465:22;6455:32;;6525:7;6518:4;6514:2;6510:13;6506:27;6496:2;;6552:6;6544;6537:22;6496:2;6593;6580:16;6615:4;6639:65;6654:49;6700:2;6654:49;:::i;6639:65::-;6738:15;;;6769:12;;;;6801:11;;;6839;;;6831:20;;6827:29;;6824:42;-1:-1:-1;6821:2:1;;;6884:6;6876;6869:22;6821:2;6911:6;6902:15;;6926:240;6940:2;6937:1;6934:9;6926:240;;;7011:3;6998:17;7028:33;7055:5;7028:33;:::i;:::-;7074:18;;6958:1;6951:9;;;;;7112:12;;;;7144;;6926:240;;;-1:-1:-1;7185:5:1;-1:-1:-1;;7228:18:1;;7215:32;;-1:-1:-1;;7259:16:1;;;7256:2;;;7293:6;7285;7278:22;7256:2;;7321:69;7382:7;7371:8;7360:9;7356:24;7321:69;:::i;:::-;7311:79;;;6238:1158;;;;;:::o;7401:257::-;;7512:2;7500:9;7491:7;7487:23;7483:32;7480:2;;;7533:6;7525;7518:22;7480:2;7577:9;7564:23;7596:32;7622:5;7596:32;:::i;7663:261::-;;7785:2;7773:9;7764:7;7760:23;7756:32;7753:2;;;7806:6;7798;7791:22;7753:2;7843:9;7837:16;7862:32;7888:5;7862:32;:::i;7929:190::-;;8041:2;8029:9;8020:7;8016:23;8012:32;8009:2;;;8062:6;8054;8047:22;8009:2;-1:-1:-1;8090:23:1;;7999:120;-1:-1:-1;7999:120:1:o;8124:327::-;;;8253:2;8241:9;8232:7;8228:23;8224:32;8221:2;;;8274:6;8266;8259:22;8221:2;8315:9;8302:23;8292:33;;8375:2;8364:9;8360:18;8347:32;8388:33;8415:5;8388:33;:::i;8456:539::-;;;;;8619:3;8607:9;8598:7;8594:23;8590:33;8587:2;;;8641:6;8633;8626:22;8587:2;8682:9;8669:23;8659:33;;8742:2;8731:9;8727:18;8714:32;8755:33;8782:5;8755:33;:::i;:::-;8807:5;-1:-1:-1;8859:2:1;8844:18;;8831:32;;-1:-1:-1;8915:2:1;8900:18;;8887:32;8928:35;8887:32;8928:35;:::i;:::-;8577:418;;;;-1:-1:-1;8577:418:1;;-1:-1:-1;;8577:418:1:o;9000:997::-;;;9164:2;9152:9;9143:7;9139:23;9135:32;9132:2;;;9185:6;9177;9170:22;9132:2;9226:9;9213:23;9203:33;;9255:2;9308;9297:9;9293:18;9280:32;-1:-1:-1;;;;;9327:6:1;9324:30;9321:2;;;9372:6;9364;9357:22;9321:2;9400:22;;9453:4;9445:13;;9441:27;-1:-1:-1;9431:2:1;;9487:6;9479;9472:22;9431:2;9528;9515:16;9551:65;9566:49;9612:2;9566:49;:::i;9551:65::-;9650:15;;;9681:12;;;;9713:11;;;9742:6;9757:210;9771:2;9768:1;9765:9;9757:210;;;9828:64;9884:7;9879:2;9872:3;9859:17;9855:2;9851:26;9847:35;9828:64;:::i;:::-;9816:77;;9913:12;;;;9945;;;;9789:1;9782:9;9757:210;;;-1:-1:-1;9122:875:1;;9986:5;;-1:-1:-1;9122:875:1;-1:-1:-1;;;;;;;9122:875:1:o;10002:1778::-;;;10177:2;10165:9;10156:7;10152:23;10148:32;10145:2;;;10198:6;10190;10183:22;10145:2;10239:9;10226:23;10216:33;;10268:2;10321;10310:9;10306:18;10293:32;-1:-1:-1;;;;;10385:2:1;10377:6;10374:14;10371:2;;;10406:6;10398;10391:22;10371:2;10449:6;10438:9;10434:22;10424:32;;10494:7;10487:4;10483:2;10479:13;10475:27;10465:2;;10521:6;10513;10506:22;10465:2;10562;10549:16;10585:65;10600:49;10646:2;10600:49;:::i;10585:65::-;10684:15;;;10715:12;;;;10747:11;;;10776:6;10791:959;10805:2;10802:1;10799:9;10791:959;;;10868:17;;10860:26;;10938:4;10910:16;;;-1:-1:-1;;10906:30:1;10902:41;10899:2;;;10961:6;10953;10946:22;10899:2;11003;10997:9;11049:4;11041:6;11037:17;11108:6;11096:10;11093:22;11088:2;11076:10;11073:18;11070:46;11067:2;;;11119:18;;:::i;:::-;11159:2;11152:22;11216:11;;;11203:25;11244:16;;;11241:2;;;11278:6;11270;11263:22;11241:2;11315:55;11362:7;11357:2;11346:8;11342:2;11338:17;11334:26;11315:55;:::i;:::-;11307:6;11300:71;;11418:2;11414;11410:11;11397:25;11435:33;11462:5;11435:33;:::i;:::-;11488:15;;;11481:30;11569:2;11561:11;;11548:25;11543:2;11531:15;;11524:50;11611:32;11637:4;11629:13;;11611:32;:::i;:::-;11606:2;11594:15;;11587:57;11657:19;;-1:-1:-1;11696:12:1;;;;11728;;;;10823:1;10816:9;10791:959;;;-1:-1:-1;10135:1645:1;;11769:5;;-1:-1:-1;10135:1645:1;-1:-1:-1;;;;;;;;10135:1645:1:o;11785:260::-;;;11911:2;11899:9;11890:7;11886:23;11882:32;11879:2;;;11932:6;11924;11917:22;11879:2;11973:9;11960:23;11950:33;;12002:37;12035:2;12024:9;12020:18;12002:37;:::i;12050:411::-;;;12189:2;12177:9;12168:7;12164:23;12160:32;12157:2;;;12210:6;12202;12195:22;12157:2;12251:9;12238:23;12228:33;;12312:2;12301:9;12297:18;12284:32;-1:-1:-1;;;;;12331:6:1;12328:30;12325:2;;;12376:6;12368;12361:22;12325:2;12404:51;12447:7;12438:6;12427:9;12423:22;12404:51;:::i;12466:397::-;;;;;12626:3;12614:9;12605:7;12601:23;12597:33;12594:2;;;12648:6;12640;12633:22;12594:2;12689:9;12676:23;12666:33;;12746:2;12735:9;12731:18;12718:32;12708:42;;12769:37;12802:2;12791:9;12787:18;12769:37;:::i;:::-;12584:279;;;;-1:-1:-1;12759:47:1;;12853:2;12838:18;12825:32;;-1:-1:-1;;12584:279:1:o;12868:443::-;;12965:5;12959:12;12992:6;12987:3;12980:19;13018:4;13047:2;13042:3;13038:12;13031:19;;13084:2;13077:5;13073:14;13105:3;13117:169;13131:6;13128:1;13125:13;13117:169;;;13192:13;;13180:26;;13226:12;;;;13261:15;;;;13153:1;13146:9;13117:169;;;-1:-1:-1;13302:3:1;;12935:376;-1:-1:-1;;;;;12935:376:1:o;13316:270::-;;13408:5;13402:12;13435:6;13430:3;13423:19;13451:63;13507:6;13500:4;13495:3;13491:14;13484:4;13477:5;13473:16;13451:63;:::i;:::-;13568:2;13547:15;-1:-1:-1;;13543:29:1;13534:39;;;;13575:4;13530:50;;13378:208;-1:-1:-1;;13378:208:1:o;13591:186::-;;13672:5;13666:12;13687:52;13732:6;13727:3;13720:4;13713:5;13709:16;13687:52;:::i;:::-;13755:16;;;;;13642:135;-1:-1:-1;;13642:135:1:o;13782:274::-;;13949:6;13943:13;13965:53;14011:6;14006:3;13999:4;13991:6;13987:17;13965:53;:::i;:::-;14034:16;;;;;13919:137;-1:-1:-1;;13919:137:1:o;14061:415::-;;14256:6;14250:13;14272:53;14318:6;14313:3;14306:4;14298:6;14294:17;14272:53;:::i;:::-;14394:2;14390:15;;;;-1:-1:-1;;14386:53:1;14347:16;;;;14372:68;;;14467:2;14456:14;;14226:250;-1:-1:-1;;14226:250:1:o;14481:1180::-;14715:13;;14481:1180;;;;14788:1;14773:17;;14809:1;14845:18;;;;14872:2;;14926:4;14918:6;14914:17;14904:27;;14872:2;14952;15000;14992:6;14989:14;14969:18;14966:38;14963:2;;;-1:-1:-1;;;15027:33:1;;15083:4;15080:1;15073:15;15113:4;15034:3;15101:17;14963:2;15144:18;15171:104;;;;15289:1;15284:324;;;;15137:471;;15171:104;-1:-1:-1;;15204:24:1;;15192:37;;15249:16;;;;-1:-1:-1;15171:104:1;;15284:324;15320:39;15352:6;15320:39;:::i;:::-;15381:3;15397:165;15411:6;15408:1;15405:13;15397:165;;;15489:14;;15476:11;;;15469:35;15532:16;;;;15426:10;;15397:165;;;15401:3;;15591:6;15586:3;15582:16;15575:23;;15137:471;;;;;;;15624:31;15651:3;15643:6;15624:31;:::i;:::-;15617:38;14665:996;-1:-1:-1;;;;;14665:996:1:o;15666:392::-;-1:-1:-1;;;15924:27:1;;15976:1;15967:11;;15960:27;;;;16012:2;16003:12;;15996:28;16049:2;16040:12;;15914:144::o;16063:219::-;-1:-1:-1;;;;;16243:32:1;;;;16225:51;;16213:2;16198:18;;16180:102::o;16287:444::-;-1:-1:-1;;;;;16544:15:1;;;16526:34;;16596:15;;16591:2;16576:18;;16569:43;16648:2;16643;16628:18;;16621:30;;;16287:444;;16668:57;;16706:18;;16698:6;16668:57;:::i;16736:851::-;-1:-1:-1;;;;;17133:15:1;;;17115:34;;17185:15;;17180:2;17165:18;;17158:43;17095:3;17232:2;17217:18;;17210:31;;;16736:851;;17264:63;;17307:19;;17299:6;17264:63;:::i;:::-;17375:9;17367:6;17363:22;17358:2;17347:9;17343:18;17336:50;17409;17452:6;17444;17409:50;:::i;:::-;17395:64;;17508:9;17500:6;17496:22;17490:3;17479:9;17475:19;17468:51;17536:45;17574:6;17566;17536:45;:::i;:::-;17528:53;17067:520;-1:-1:-1;;;;;;;;17067:520:1:o;17592:573::-;-1:-1:-1;;;;;17889:15:1;;;17871:34;;17941:15;;17936:2;17921:18;;17914:43;17988:2;17973:18;;17966:34;;;18031:2;18016:18;;18009:34;;;17851:3;18074;18059:19;;18052:32;;;17592:573;;18101:58;;18139:19;;18131:6;18101:58;:::i;:::-;18093:66;17823:342;-1:-1:-1;;;;;;;17823:342:1:o;18170:819::-;;18361:2;18401;18390:9;18386:18;18431:2;18420:9;18413:21;18454:6;18489;18483:13;18520:6;18512;18505:22;18558:2;18547:9;18543:18;18536:25;;18621:2;18615;18607:6;18603:15;18592:9;18588:31;18584:40;18570:54;;18659:2;18651:6;18647:15;18680:4;18693:267;18707:6;18704:1;18701:13;18693:267;;;18800:2;18796:7;18784:9;18776:6;18772:22;18768:36;18763:3;18756:49;18828:52;18873:6;18864;18858:13;18828:52;:::i;:::-;18818:62;-1:-1:-1;18938:12:1;;;;18903:15;;;;18729:1;18722:9;18693:267;;;-1:-1:-1;18977:6:1;;18341:648;-1:-1:-1;;;;;;;18341:648:1:o;18994:1276::-;19207:2;19259:21;;;19329:13;;19232:18;;;19351:22;;;18994:1276;;19207:2;19392;;19410:18;;;;19470:15;;;19455:31;;19451:40;;19514:15;;;18994:1276;19560:681;19574:6;19571:1;19568:13;19560:681;;;19667:2;19663:7;19651:9;19643:6;19639:22;19635:36;19630:3;19623:49;19701:6;19695:13;19731:4;19774:2;19768:9;19805:2;19797:6;19790:18;19835:60;19891:2;19883:6;19879:15;19865:12;19835:60;:::i;:::-;19942:11;;;19936:18;-1:-1:-1;;;;;19932:44:1;19915:15;;;19908:69;20020:11;;;20014:18;19997:15;;;19990:43;20056:4;20117:11;;;20111:18;20104:26;20097:34;20080:15;;;;20073:59;;;;-1:-1:-1;;20219:12:1;;;;20184:15;;;;19973:1;19589:9;19560:681;;;-1:-1:-1;20258:6:1;;19187:1083;-1:-1:-1;;;;;;;;19187:1083:1:o;20275:267::-;;20454:2;20443:9;20436:21;20474:62;20532:2;20521:9;20517:18;20509:6;20474:62;:::i;20547:477::-;;20804:2;20793:9;20786:21;20830:62;20888:2;20877:9;20873:18;20865:6;20830:62;:::i;:::-;20940:9;20932:6;20928:22;20923:2;20912:9;20908:18;20901:50;20968;21011:6;21003;20968:50;:::i;21029:187::-;21194:14;;21187:22;21169:41;;21157:2;21142:18;;21124:92::o;21221:417::-;21452:25;;;21508:2;21493:18;;21486:34;;;;-1:-1:-1;;;;;21556:32:1;21551:2;21536:18;;21529:60;21620:2;21605:18;;21598:34;21439:3;21424:19;;21406:232::o;21643:398::-;21870:25;;;21943:4;21931:17;;;;21926:2;21911:18;;21904:45;21980:2;21965:18;;21958:34;22023:2;22008:18;;22001:34;21857:3;21842:19;;21824:217::o;22046:230::-;;22193:2;22182:9;22175:21;22213:57;22266:2;22255:9;22251:18;22243:6;22213:57;:::i;22518:416::-;22720:2;22702:21;;;22759:2;22739:18;;;22732:30;22798:34;22793:2;22778:18;;22771:62;-1:-1:-1;;;22864:2:1;22849:18;;22842:50;22924:3;22909:19;;22692:242::o;22939:351::-;23141:2;23123:21;;;23180:2;23160:18;;;23153:30;23219:29;23214:2;23199:18;;23192:57;23281:2;23266:18;;23113:177::o;23295:404::-;23497:2;23479:21;;;23536:2;23516:18;;;23509:30;23575:34;23570:2;23555:18;;23548:62;-1:-1:-1;;;23641:2:1;23626:18;;23619:38;23689:3;23674:19;;23469:230::o;23704:340::-;23906:2;23888:21;;;23945:2;23925:18;;;23918:30;-1:-1:-1;;;23979:2:1;23964:18;;23957:46;24035:2;24020:18;;23878:166::o;24049:345::-;24251:2;24233:21;;;24290:2;24270:18;;;24263:30;-1:-1:-1;;;24324:2:1;24309:18;;24302:51;24385:2;24370:18;;24223:171::o;24399:407::-;24601:2;24583:21;;;24640:2;24620:18;;;24613:30;24679:34;24674:2;24659:18;;24652:62;-1:-1:-1;;;24745:2:1;24730:18;;24723:41;24796:3;24781:19;;24573:233::o;24811:413::-;25013:2;24995:21;;;25052:2;25032:18;;;25025:30;25091:34;25086:2;25071:18;;25064:62;-1:-1:-1;;;25157:2:1;25142:18;;25135:47;25214:3;25199:19;;24985:239::o;25229:344::-;25431:2;25413:21;;;25470:2;25450:18;;;25443:30;-1:-1:-1;;;25504:2:1;25489:18;;25482:50;25564:2;25549:18;;25403:170::o;25578:353::-;25780:2;25762:21;;;25819:2;25799:18;;;25792:30;25858:31;25853:2;25838:18;;25831:59;25922:2;25907:18;;25752:179::o;25936:349::-;26138:2;26120:21;;;26177:2;26157:18;;;26150:30;26216:27;26211:2;26196:18;;26189:55;26276:2;26261:18;;26110:175::o;26290:351::-;26492:2;26474:21;;;26531:2;26511:18;;;26504:30;26570:29;26565:2;26550:18;;26543:57;26632:2;26617:18;;26464:177::o;26646:404::-;26848:2;26830:21;;;26887:2;26867:18;;;26860:30;26926:34;26921:2;26906:18;;26899:62;-1:-1:-1;;;26992:2:1;26977:18;;26970:38;27040:3;27025:19;;26820:230::o;27055:343::-;27257:2;27239:21;;;27296:2;27276:18;;;27269:30;-1:-1:-1;;;27330:2:1;27315:18;;27308:49;27389:2;27374:18;;27229:169::o;27403:401::-;27605:2;27587:21;;;27644:2;27624:18;;;27617:30;27683:34;27678:2;27663:18;;27656:62;-1:-1:-1;;;27749:2:1;27734:18;;27727:35;27794:3;27779:19;;27577:227::o;27809:349::-;28011:2;27993:21;;;28050:2;28030:18;;;28023:30;28089:27;28084:2;28069:18;;28062:55;28149:2;28134:18;;27983:175::o;28163:340::-;28365:2;28347:21;;;28404:2;28384:18;;;28377:30;-1:-1:-1;;;28438:2:1;28423:18;;28416:46;28494:2;28479:18;;28337:166::o;28508:341::-;28710:2;28692:21;;;28749:2;28729:18;;;28722:30;-1:-1:-1;;;28783:2:1;28768:18;;28761:47;28840:2;28825:18;;28682:167::o;28854:397::-;29056:2;29038:21;;;29095:2;29075:18;;;29068:30;29134:34;29129:2;29114:18;;29107:62;-1:-1:-1;;;29200:2:1;29185:18;;29178:31;29241:3;29226:19;;29028:223::o;29256:400::-;29458:2;29440:21;;;29497:2;29477:18;;;29470:30;29536:34;29531:2;29516:18;;29509:62;-1:-1:-1;;;29602:2:1;29587:18;;29580:34;29646:3;29631:19;;29430:226::o;29661:342::-;29863:2;29845:21;;;29902:2;29882:18;;;29875:30;-1:-1:-1;;;29936:2:1;29921:18;;29914:48;29994:2;29979:18;;29835:168::o;30008:347::-;30210:2;30192:21;;;30249:2;30229:18;;;30222:30;30288:25;30283:2;30268:18;;30261:53;30346:2;30331:18;;30182:173::o;30360:339::-;30562:2;30544:21;;;30601:2;30581:18;;;30574:30;-1:-1:-1;;;30635:2:1;30620:18;;30613:45;30690:2;30675:18;;30534:165::o;30704:355::-;30906:2;30888:21;;;30945:2;30925:18;;;30918:30;30984:33;30979:2;30964:18;;30957:61;31050:2;31035:18;;30878:181::o;31064:345::-;31266:2;31248:21;;;31305:2;31285:18;;;31278:30;-1:-1:-1;;;31339:2:1;31324:18;;31317:51;31400:2;31385:18;;31238:171::o;31414:356::-;31616:2;31598:21;;;31635:18;;;31628:30;31694:34;31689:2;31674:18;;31667:62;31761:2;31746:18;;31588:182::o;31775:405::-;31977:2;31959:21;;;32016:2;31996:18;;;31989:30;32055:34;32050:2;32035:18;;32028:62;-1:-1:-1;;;32121:2:1;32106:18;;32099:39;32170:3;32155:19;;31949:231::o;32185:397::-;32387:2;32369:21;;;32426:2;32406:18;;;32399:30;32465:34;32460:2;32445:18;;32438:62;-1:-1:-1;;;32531:2:1;32516:18;;32509:31;32572:3;32557:19;;32359:223::o;32587:405::-;32789:2;32771:21;;;32828:2;32808:18;;;32801:30;32867:34;32862:2;32847:18;;32840:62;-1:-1:-1;;;32933:2:1;32918:18;;32911:39;32982:3;32967:19;;32761:231::o;32997:404::-;33199:2;33181:21;;;33238:2;33218:18;;;33211:30;33277:34;33272:2;33257:18;;33250:62;-1:-1:-1;;;33343:2:1;33328:18;;33321:38;33391:3;33376:19;;33171:230::o;33406:339::-;33608:2;33590:21;;;33647:2;33627:18;;;33620:30;-1:-1:-1;;;33681:2:1;33666:18;;33659:45;33736:2;33721:18;;33580:165::o;33750:397::-;33952:2;33934:21;;;33991:2;33971:18;;;33964:30;34030:34;34025:2;34010:18;;34003:62;-1:-1:-1;;;34096:2:1;34081:18;;34074:31;34137:3;34122:19;;33924:223::o;34152:335::-;34354:2;34336:21;;;34393:2;34373:18;;;34366:30;-1:-1:-1;;;34427:2:1;34412:18;;34405:41;34478:2;34463:18;;34326:161::o;34492:608::-;34707:13;;34689:32;;34777:4;34765:17;;;34759:24;34737:20;;;34730:54;34854:4;34842:17;;;34836:24;34829:32;34822:40;34800:20;;;34793:70;34919:4;34907:17;;;34901:24;34879:20;;;34872:54;34986:4;34974:17;;;34968:24;-1:-1:-1;;;;;34964:50:1;34942:20;;;34935:80;35002:3;35073:17;;;35067:24;35060:32;35053:40;35031:20;;;35024:70;;;;34676:3;34661:19;;34643:457::o;35105:177::-;35251:25;;;35239:2;35224:18;;35206:76::o;35287:248::-;35461:25;;;35517:2;35502:18;;35495:34;35449:2;35434:18;;35416:119::o;35540:251::-;35610:2;35604:9;35640:17;;;-1:-1:-1;;;;;35672:34:1;;35708:22;;;35669:62;35666:2;;;35734:18;;:::i;:::-;35770:2;35763:22;35584:207;;-1:-1:-1;35584:207:1:o;35796:192::-;;-1:-1:-1;;;;;35887:6:1;35884:30;35881:2;;;35917:18;;:::i;:::-;-1:-1:-1;35977:4:1;35958:17;;;35954:28;;35871:117::o;35993:129::-;;36061:17;;;36111:4;36095:21;;;36051:71::o;36127:128::-;;36198:1;36194:6;36191:1;36188:13;36185:2;;;36204:18;;:::i;:::-;-1:-1:-1;36240:9:1;;36175:80::o;36260:204::-;;36334:4;36331:1;36327:12;36366:4;36363:1;36359:12;36401:3;36395:4;36391:14;36386:3;36383:23;36380:2;;;36409:18;;:::i;:::-;36445:13;;36306:158;-1:-1:-1;;;36306:158:1:o;36469:217::-;;36535:1;36525:2;;-1:-1:-1;;;36560:31:1;;36614:4;36611:1;36604:15;36642:4;36567:1;36632:15;36525:2;-1:-1:-1;36671:9:1;;36515:171::o;36691:168::-;;36797:1;36793;36789:6;36785:14;36782:1;36779:21;36774:1;36767:9;36760:17;36756:45;36753:2;;;36804:18;;:::i;:::-;-1:-1:-1;36844:9:1;;36743:116::o;36864:125::-;;36932:1;36929;36926:8;36923:2;;;36937:18;;:::i;:::-;-1:-1:-1;36974:9:1;;36913:76::o;36994:258::-;37066:1;37076:113;37090:6;37087:1;37084:13;37076:113;;;37166:11;;;37160:18;37147:11;;;37140:39;37112:2;37105:10;37076:113;;;37207:6;37204:1;37201:13;37198:2;;;-1:-1:-1;;37242:1:1;37224:16;;37217:27;37047:205::o;37257:380::-;37342:1;37332:12;;37389:1;37379:12;;;37400:2;;37454:4;37446:6;37442:17;37432:27;;37400:2;37507;37499:6;37496:14;37476:18;37473:38;37470:2;;;37553:10;37548:3;37544:20;37541:1;37534:31;37588:4;37585:1;37578:15;37616:4;37613:1;37606:15;37470:2;;37312:325;;;:::o;37642:135::-;;-1:-1:-1;;37702:17:1;;37699:2;;;37722:18;;:::i;:::-;-1:-1:-1;37769:1:1;37758:13;;37689:88::o;37782:127::-;37843:10;37838:3;37834:20;37831:1;37824:31;37874:4;37871:1;37864:15;37898:4;37895:1;37888:15;37914:127;37975:10;37970:3;37966:20;37963:1;37956:31;38006:4;38003:1;37996:15;38030:4;38027:1;38020:15;38046:88;38121:3;38117:15;;38103:31::o;38139:764::-;;38220:4;38202:16;38199:26;38196:2;;;38228:5;;38196:2;38269:1;38264:3;38259;38244:27;38331:10;38293:36;38324:3;38318:10;38293:36;:::i;:::-;38290:52;38280:2;;38346:5;;38280:2;38380;38374:9;38420:16;-1:-1:-1;;38416:29:1;38413:1;38374:9;38392:54;38475:4;38469:11;38499:16;-1:-1:-1;;;;;38605:2:1;38598:4;38590:6;38586:17;38583:25;38578:2;38570:6;38567:14;38564:45;38561:2;;;38612:5;;;;;;38561:2;38649:6;38643:4;38639:17;38628:28;;38685:3;38679:10;38665:24;;38712:2;38704:6;38701:14;38698:2;;;38718:5;;;;;;38698:2;;38779:16;38773:4;38769:27;38762:4;38753:6;38748:3;38744:16;38740:27;38737:60;38734:2;;;38800:5;;;;;38734:2;38865;38844:15;-1:-1:-1;;38840:29:1;38831:39;;38872:4;38827:50;38823:2;38816:62;38835:3;-1:-1:-1;;38186:717:1;:::o;38908:133::-;-1:-1:-1;;;;;38985:31:1;;38975:42;;38965:2;;39031:1;39028;39021:12;38965:2;38955:86;:::o;39046:133::-;-1:-1:-1;;;;;;39122:32:1;;39112:43;;39102:2;;39169:1;39166;39159:12

Swarm Source

ipfs://5edde900f7dc021834e6dd606e4063b39c1e163b3ea2c84565b690113aee2b39
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.