ETH Price: $3,361.08 (-2.17%)

Token

Colour Time (CT)
 

Overview

Max Total Supply

6 CT

Holders

5

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 CT
0xb4b57125af2acf9bf605a9d9c3d256537876f65a
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ColourTime721

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-11
*/

/**
 * Colour Time
 * Jonathan Chomko, 2022
*/

// File: @openzeppelin/contracts/utils/EnumerableSet.sol
// SPDX-License-Identifier: MIT

pragma solidity  ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

  /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

  /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

  /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

  /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

// File: @openzeppelin/contracts/utils/Address.sol



pragma solidity  ^0.8.0;


/**
 * @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);
            }
        }
    }
}

// File: @openzeppelin/contracts/utils/Context.sol



pragma solidity  ^0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
 abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/AccessControl.sol



// File @openzeppelin/contracts/access/[email protected]
pragma solidity  ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


// File: @openzeppelin/contracts/introspection/IERC165.sol

pragma solidity  ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol



pragma solidity  ^0.8.0;



/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
      * @dev Safely transfers `tokenId` token from `from` to `to`.
      *
      * Requirements:
      *
      * - `from` cannot be the zero address.
      * - `to` cannot be the zero address.
      * - `tokenId` token must exist and be owned by `from`.
      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
      *
      * Emits a {Transfer} event.
      */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Metadata.sol



pragma solidity  ^0.8.0;



/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol


pragma solidity  ^0.8.0;

// /**
//  * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
//  * @dev See https://eips.ethereum.org/EIPS/eip-721
//  */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}



// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol



pragma solidity  ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}

// File: @openzeppelin/contracts/introspection/ERC165.sol



pragma solidity  ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _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;
    }
}

///
/// @dev Interface for the NFT Royalty Standard
///
interface IERC2981 is IERC165 {
    /// ERC165 bytes to add to interface array - set in parent contract
    /// implementing this standard
    ///
    /// bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a
    /// bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;
    /// _registerInterface(_INTERFACE_ID_ERC2981);

    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _salePrice - the sale price of the NFT asset specified by _tokenId
    /// @return receiver - address of who should be sent the royalty payment
    /// @return royaltyAmount - the royalty payment amount for _salePrice
    function royaltyInfo(
        uint256 _tokenId,
        uint256 _salePrice
    ) external view returns (
        address receiver,
        uint256 royaltyAmount
    );
}

// File: @openzeppelin/contracts/utils/EnumerableMap.sol

pragma solidity  ^0.8.0;

/**
 * @dev Library for managing an enumerable variant of Solidity's
 * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
 * type.
 *
 * Maps have the following properties:
 *
 * - Entries are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Entries are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableMap for EnumerableMap.UintToAddressMap;
 *
 *     // Declare a set state variable
 *     EnumerableMap.UintToAddressMap private myMap;
 * }
 * ```
 *
 * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
 * supported.
 */
library EnumerableMap {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        // Storage of map keys and values
        MapEntry[] _entries;

        // Position of the entry defined by a key in the `entries` array, plus 1
        // because index 0 means a key is not in the map.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex == 0) { // Equivalent to !contains(map, key)
            map._entries.push(MapEntry({ _key: key, _value: value }));
            // The entry is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

    /**
     * @dev Removes a key-value pair from a map. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function _remove(Map storage map, bytes32 key) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex != 0) { // Equivalent to contains(map, key)
            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
            // in the array, and then remove the last entry (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;

            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            MapEntry storage lastEntry = map._entries[lastIndex];

            // Move the last entry to the index where the entry to delete is
            map._entries[toDeleteIndex] = lastEntry;
            // Update the index for the moved entry
            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved entry was stored
            map._entries.pop();

            // Delete the index for the deleted slot
            delete map._indexes[key];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function _contains(Map storage map, bytes32 key) private view returns (bool) {
        return map._indexes[key] != 0;
    }

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._entries.length;
    }

   /**
    * @dev Returns the key-value pair stored at position `index` in the map. O(1).
    *
    * Note that there are no guarantees on the ordering of entries inside the
    * array, and it may change when more entries are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
        require(map._entries.length > index, "EnumerableMap: index out of bounds");

        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
        return _remove(map._inner, bytes32(key));
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
        return _contains(map._inner, bytes32(key));
    }

    /**
     * @dev Returns the number of elements in the map. O(1).
     */
    function length(UintToAddressMap storage map) internal view returns (uint256) {
        return _length(map._inner);
    }

   /**
    * @dev Returns the element stored at position `index` in the set. O(1).
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     *
     * _Available since v3.4._
     */
    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}
pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
pragma solidity  ^0.8.0;

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from holder address to their (enumerable) set of owned tokens
    mapping (address => EnumerableSet.UintSet) private _holderTokens;

    // Enumerable mapping from token ids to their owners
    EnumerableMap.UintToAddressMap private _tokenOwners;

    // Mapping from token ID to approved address
    mapping (uint256 => address) private _tokenApprovals;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;


    // Optional mapping for token URIs - not used with on-chain
    // mapping (uint256 => string) private _tokenURIs;

    // Base URI
    string private _baseURI;

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }



    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _holderTokens[owner].length();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        // return json from folder
        // string memory output = string(abi.encodePacked(baseURI(), tokenId.toString(), ".json"));
        // return string(abi.encodePacked(baseURI(), tokenId.toString(), ".json"));
        return string(abi.encodePacked(baseURI(),tokenId.toString(),".json"));

        // return "hello";
    }


    //Return contract metadata for opensea view
    function contractURI() public view returns (string memory) {
        return string(abi.encodePacked(baseURI(), "contract_metadata", '.json'));
    }

    /**
    * @dev Returns the base URI set via {_setBaseURI}. This will be
    * automatically added as a prefix in {tokenURI} to each token's URI, or
    * to the token ID if no specific URI is set for that token ID.
    */
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }

     /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        return _holderTokens[owner].at(index);
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
        return _tokenOwners.length();
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(_msgSender() == owner || ERC721.isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _tokenOwners.contains(tokenId);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     d*
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId); // internal owner

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        // Clear metadata (if any)
        // if (bytes(_tokenURIs[tokenId]).length != 0) {
        //     delete _tokenURIs[tokenId];
        // }

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.remove(tokenId);

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(address from, address to, uint256 tokenId) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); // internal owner
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    // function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
    //     require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
    //     _tokenURIs[tokenId] = _tokenURI;
    // }

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        private returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }
        bytes memory returndata = to.functionCall(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ), "ERC721: transfer to non ERC721Receiver implementer");
        bytes4 retval = abi.decode(returndata, (bytes4));
        return (retval == _ERC721_RECEIVED);
    }

    function _approve(address to, uint256 tokenId) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }
}


// File: contracts/ColourTime721.sol
pragma solidity  ^0.8.0;

/**
 * @dev {ERC721} token, including:
 *
 *  - ability for holders to burn (destroy) their tokens
 *  - a minter role that allows for token minting (creation)
 *  - token ID and URI autogeneration
 *
 * This contract uses {AccessControl} to lock permissioned functions using the
 * different roles - head to its documentation for details.
 *
 * The account that deploys the contract will be granted the minter and pauser
 * roles, as well as the default admin role, which will let it grant both minter
 * and pauser roles to other accounts.
 */

contract ColourTime721 is Context, ERC721, Ownable {

    //withdrawal logic
    address payable public withdrawalAddress;

    //Token sale control logic
    uint256 public maxNumberOfPieces;
    uint256 public tokenCounter;
    uint256 public minTokenIdForSale;
    uint256 public maxTokenIdForSale;
    
    // Percentage of each sale to pay as royalties
    uint256 public royaltiesPercentage = 10;
    
    //Sale logic
    bool public standardSaleActive;
    uint256 public pricePerPiece;

    //Token Data
    struct tokenData {
        string[] colours;
        uint256[] speeds;
        string title;
    }

    mapping (uint256 => tokenData) public tokenDataMap;
    event Mint(address buyer, uint256 price, uint256 tokenId);

    constructor(
        uint256 givenPricePerPiece,
        address payable givenWithdrawalAddress
        
    ) ERC721("Colour Time", "CT") {
        pricePerPiece = givenPricePerPiece;
        withdrawalAddress = givenWithdrawalAddress;
        tokenCounter = 0;
        maxTokenIdForSale = 0;
        minTokenIdForSale = 1;
    }

    function setRoyaltiesPercentage( uint256 givenRoyaltiesPercentage ) external onlyOwner{
        royaltiesPercentage = givenRoyaltiesPercentage;
    }

    function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
        return interfaceId == type(IERC2981).interfaceId ||
        super.supportsInterface(interfaceId);
    }
    
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view
    returns (address receiver, uint256 royaltyAmount) {
        uint256 _royalties = (_salePrice * royaltiesPercentage) / 100;
        return (withdrawalAddress, _royalties);
    }

    //Generate svg
    function tokenURI(uint256 tokenId) override public view returns (string memory){
            
            require(_exists(tokenId)  || msg.sender == owner(), "ERC721Metadata: URI query for nonexistent token");
            string[9] memory parts;
            parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 10 10">  <rect width="10" height="10"><animate id="outerbox" attributeName="fill" values="';
            parts[1] = tokenDataMap[tokenId].colours[0];
            parts[2] = '" dur="';
            parts[3] = toString(tokenDataMap[tokenId].speeds[0]);
            parts[4] = '" repeatCount="indefinite"></animate></rect><rect x="2" y="2" width="6" height="6"><animate id="innerbox" attributeName="fill" values="';
            parts[5] = tokenDataMap[tokenId].colours[1];
            parts[6] = '" dur="';
            parts[7] = toString(tokenDataMap[tokenId].speeds[1]);
            parts[8] = '" repeatCount="indefinite"></animate></rect></svg>';

            string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6],parts[7], parts[8]));
            string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "Colour Time ', tokenDataMap[tokenId].title, '", "description": "Slowly shifting colours, records of time past. Jonathan Chomko, 2021", "image": "data:image/svg+xml;base64,',Base64.encode(bytes(output)),'"}'))));
            output = string(abi.encodePacked('data:application/json;base64,', json));
            return output;
    }

    function setSaleActive(bool isActive) external onlyOwner {
        standardSaleActive = isActive;
    }

    function setSaleRange(uint256 givenMinTokenIdForSale, uint256 givenMaxTokenIdForSale) external onlyOwner {
         maxTokenIdForSale = givenMaxTokenIdForSale;
         minTokenIdForSale = givenMinTokenIdForSale;
    }

    function setPrice(uint256 givenPrice) external onlyOwner {
        pricePerPiece = givenPrice;
    }

    //Set data for token svgs and titles
    function setTokenData(tokenData[] memory givenData )external onlyOwner {
        for(uint256 i = 0; i < givenData.length; i ++){
                     tokenDataMap[i] = givenData[i];
        }
    }

    //Withdrawal
    function setWithdrawalAddress(address payable givenWithdrawalAddress) external onlyOwner {
        withdrawalAddress = givenWithdrawalAddress;
    }

    function withdrawEth() external onlyOwner {
        Address.sendValue(withdrawalAddress, address(this).balance);
    }

    //Owner info
    function tokenInfo(uint256 tokenId) external view returns (address) {
        return (ownerOf(tokenId));
    }

    function getOwners(uint256 start, uint256 end) public view returns (address[] memory){
        address[] memory re = new address[](end - start);
        for (uint256 i = start; i < end; i++) {
                re[i - start] = ownerOf(i);
        }
        return re;
    }

    function mintItem(uint256 givenTokenId) public payable returns (uint256) {
        require(givenTokenId <= maxTokenIdForSale, "given token value is greater than sale limit");
        require(givenTokenId >= minTokenIdForSale, "given token value is less than sale limit");
        require(standardSaleActive || msg.sender == owner(), "sale must be active");
        require(msg.value == pricePerPiece, "must send in correct amount");

        _safeMint(msg.sender, givenTokenId);

        tokenCounter += 1;
        emit Mint(msg.sender, msg.value, givenTokenId);
        return tokenCounter;
    }

    //Helpers
    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
}


/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

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

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

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

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"givenPricePerPiece","type":"uint256"},{"internalType":"address payable","name":"givenWithdrawalAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNumberOfPieces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenIdForSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTokenIdForSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"givenTokenId","type":"uint256"}],"name":"mintItem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePerPiece","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltiesPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"givenPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"givenRoyaltiesPercentage","type":"uint256"}],"name":"setRoyaltiesPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive","type":"bool"}],"name":"setSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"givenMinTokenIdForSale","type":"uint256"},{"internalType":"uint256","name":"givenMaxTokenIdForSale","type":"uint256"}],"name":"setSaleRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string[]","name":"colours","type":"string[]"},{"internalType":"uint256[]","name":"speeds","type":"uint256[]"},{"internalType":"string","name":"title","type":"string"}],"internalType":"struct ColourTime721.tokenData[]","name":"givenData","type":"tuple[]"}],"name":"setTokenData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"givenWithdrawalAddress","type":"address"}],"name":"setWithdrawalAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"standardSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenDataMap","outputs":[{"internalType":"string","name":"title","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenInfo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

6080604052600a600f553480156200001657600080fd5b50604051620062863803806200628683398181016040528101906200003c919062000413565b6040518060400160405280600b81526020017f436f6c6f75722054696d650000000000000000000000000000000000000000008152506040518060400160405280600281526020017f4354000000000000000000000000000000000000000000000000000000000000815250620000c06301ffc9a760e01b6200025560201b60201c565b8160069080519060200190620000d892919062000335565b508060079080519060200190620000f192919062000335565b506200010a6380ac58cd60e01b6200025560201b60201c565b62000122635b5e139f60e01b6200025560201b60201c565b6200013a63780e9d6360e01b6200025560201b60201c565b505060006200014e6200032d60201b60201c565b905080600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508160118190555080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c819055506000600e819055506001600d819055505050620005b9565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620002c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002b89062000481565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b8280546200034390620004f2565b90600052602060002090601f016020900481019282620003675760008555620003b3565b82601f106200038257805160ff1916838001178555620003b3565b82800160010185558215620003b3579182015b82811115620003b257825182559160200191906001019062000395565b5b509050620003c29190620003c6565b5090565b5b80821115620003e1576000816000905550600101620003c7565b5090565b600081519050620003f68162000585565b92915050565b6000815190506200040d816200059f565b92915050565b600080604083850312156200042d576200042c62000557565b5b60006200043d85828601620003fc565b92505060206200045085828601620003e5565b9150509250929050565b600062000469601c83620004a3565b915062000476826200055c565b602082019050919050565b600060208201905081810360008301526200049c816200045a565b9050919050565b600082825260208201905092915050565b6000620004c182620004c8565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060028204905060018216806200050b57607f821691505b6020821081141562000522576200052162000528565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b6200059081620004b4565b81146200059c57600080fd5b50565b620005aa81620004e8565b8114620005b657600080fd5b50565b615cbd80620005c96000396000f3fe6080604052600436106102465760003560e01c806370a0823111610139578063c47f7cf2116100b6578063e8a3d4851161007a578063e8a3d485146108bc578063e985e9c5146108e7578063ed13c32814610924578063f2bcd0221461094d578063f2fde38b14610978578063fe3c4657146109a157610246565b8063c47f7cf2146107af578063c87b56dd146107ec578063cafa8dfe14610829578063cc33c87514610854578063d082e3811461089157610246565b80639466d206116100fd5780639466d206146106f257806395d89b411461071b578063a0ef91df14610746578063a22cb4651461075d578063b88d4fde1461078657610246565b806370a0823114610621578063715018a61461065e578063841718a6146106755780638da5cb5b1461069e57806391b7f5ed146106c957610246565b80632a55205a116101c75780634f6ccce71161018b5780634f6ccce71461052657806353d0023d14610563578063575ca2c71461058e5780636352211e146105b95780636c0360eb146105f657610246565b80632a55205a1461042e5780632f745c591461046c5780633effce33146104a957806342842e0e146104d257806347a6fee8146104fb57610246565b8063095ea7b31161020e578063095ea7b31461035857806317fb85941461038157806318160ddd146103b157806321b8092e146103dc57806323b872dd1461040557610246565b806301facb8e1461024b57806301ffc9a71461027657806304822058146102b357806306fdde03146102f0578063081812fc1461031b575b600080fd5b34801561025757600080fd5b506102606109cc565b60405161026d9190614c51565b60405180910390f35b34801561028257600080fd5b5061029d60048036038101906102989190613f76565b6109d2565b6040516102aa91906148f4565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613ffd565b610a4c565b6040516102e791906148d2565b60405180910390f35b3480156102fc57600080fd5b50610305610b33565b604051610312919061490f565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190613fd0565b610bc5565b60405161034f91906147f0565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a9190613ec0565b610c4a565b005b61039b60048036038101906103969190613fd0565b610d62565b6040516103a89190614c51565b60405180910390f35b3480156103bd57600080fd5b506103c6610f27565b6040516103d39190614c51565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe9190613d3d565b610f38565b005b34801561041157600080fd5b5061042c60048036038101906104279190613daa565b610ff8565b005b34801561043a57600080fd5b5061045560048036038101906104509190613ffd565b611058565b604051610463929190614872565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e9190613ec0565b6110a9565b6040516104a09190614c51565b60405180910390f35b3480156104b557600080fd5b506104d060048036038101906104cb9190613f00565b611104565b005b3480156104de57600080fd5b506104f960048036038101906104f49190613daa565b61122b565b005b34801561050757600080fd5b5061051061124b565b60405161051d9190614c51565b60405180910390f35b34801561053257600080fd5b5061054d60048036038101906105489190613fd0565b611251565b60405161055a9190614c51565b60405180910390f35b34801561056f57600080fd5b50610578611274565b60405161058591906148f4565b60405180910390f35b34801561059a57600080fd5b506105a3611287565b6040516105b09190614c51565b60405180910390f35b3480156105c557600080fd5b506105e060048036038101906105db9190613fd0565b61128d565b6040516105ed91906147f0565b60405180910390f35b34801561060257600080fd5b5061060b6112c4565b604051610618919061490f565b60405180910390f35b34801561062d57600080fd5b5061064860048036038101906106439190613d10565b611356565b6040516106559190614c51565b60405180910390f35b34801561066a57600080fd5b50610673611415565b005b34801561068157600080fd5b5061069c60048036038101906106979190613f49565b611552565b005b3480156106aa57600080fd5b506106b36115eb565b6040516106c091906147f0565b60405180910390f35b3480156106d557600080fd5b506106f060048036038101906106eb9190613fd0565b611615565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613fd0565b61169b565b005b34801561072757600080fd5b50610730611721565b60405161073d919061490f565b60405180910390f35b34801561075257600080fd5b5061075b6117b3565b005b34801561076957600080fd5b50610784600480360381019061077f9190613e80565b61185d565b005b34801561079257600080fd5b506107ad60048036038101906107a89190613dfd565b6119de565b005b3480156107bb57600080fd5b506107d660048036038101906107d19190613fd0565b611a40565b6040516107e3919061490f565b60405180910390f35b3480156107f857600080fd5b50610813600480360381019061080e9190613fd0565b611ae6565b604051610820919061490f565b60405180910390f35b34801561083557600080fd5b5061083e61209c565b60405161084b9190614c51565b60405180910390f35b34801561086057600080fd5b5061087b60048036038101906108769190613fd0565b6120a2565b60405161088891906147f0565b60405180910390f35b34801561089d57600080fd5b506108a66120b4565b6040516108b39190614c51565b60405180910390f35b3480156108c857600080fd5b506108d16120ba565b6040516108de919061490f565b60405180910390f35b3480156108f357600080fd5b5061090e60048036038101906109099190613d6a565b6120e8565b60405161091b91906148f4565b60405180910390f35b34801561093057600080fd5b5061094b60048036038101906109469190613ffd565b61217c565b005b34801561095957600080fd5b5061096261220a565b60405161096f919061480b565b60405180910390f35b34801561098457600080fd5b5061099f600480360381019061099a9190613d10565b612230565b005b3480156109ad57600080fd5b506109b66123dc565b6040516109c39190614c51565b60405180910390f35b600e5481565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a455750610a44826123e2565b5b9050919050565b606060008383610a5c9190614ef4565b67ffffffffffffffff811115610a7557610a746151b8565b5b604051908082528060200260200182016040528015610aa35781602001602082028036833780820191505090505b50905060008490505b83811015610b2857610abd8161128d565b828683610aca9190614ef4565b81518110610adb57610ada615189565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610b2090615053565b915050610aac565b508091505092915050565b606060068054610b4290614ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6e90614ff0565b8015610bbb5780601f10610b9057610100808354040283529160200191610bbb565b820191906000526020600020905b815481529060010190602001808311610b9e57829003601f168201915b5050505050905090565b6000610bd082612449565b610c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0690614b11565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c558261128d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbd90614b91565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ce5612466565b73ffffffffffffffffffffffffffffffffffffffff161480610d145750610d1381610d0e612466565b6120e8565b5b610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a90614a91565b60405180910390fd5b610d5d838361246e565b505050565b6000600e54821115610da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da0906149b1565b60405180910390fd5b600d54821015610dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de590614c11565b60405180910390fd5b601060009054906101000a900460ff1680610e3b5750610e0c6115eb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7190614c31565b60405180910390fd5b6011543414610ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb590614bb1565b60405180910390fd5b610ec83383612527565b6001600c6000828254610edb9190614e13565b925050819055507f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f333484604051610f159392919061489b565b60405180910390a1600c549050919050565b6000610f336002612545565b905090565b610f40612466565b73ffffffffffffffffffffffffffffffffffffffff16610f5e6115eb565b73ffffffffffffffffffffffffffffffffffffffff1614610fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fab90614b31565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611009611003612466565b8261255a565b611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103f90614bd1565b60405180910390fd5b611053838383612638565b505050565b60008060006064600f548561106d9190614e9a565b6110779190614e69565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168192509250509250929050565b60006110fc82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061284f90919063ffffffff16565b905092915050565b61110c612466565b73ffffffffffffffffffffffffffffffffffffffff1661112a6115eb565b73ffffffffffffffffffffffffffffffffffffffff1614611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117790614b31565b60405180910390fd5b60005b81518110156112275781818151811061119f5761119e615189565b5b60200260200101516012600083815260200190815260200160002060008201518160000190805190602001906111d6929190613708565b5060208201518160010190805190602001906111f3929190613768565b5060408201518160020190805190602001906112109291906137b5565b50905050808061121f90615053565b915050611183565b5050565b611246838383604051806020016040528060008152506119de565b505050565b600d5481565b60008061126883600261286990919063ffffffff16565b50905080915050919050565b601060009054906101000a900460ff1681565b60115481565b60006112bd82604051806060016040528060298152602001615b986029913960026128959092919063ffffffff16565b9050919050565b6060600880546112d390614ff0565b80601f01602080910402602001604051908101604052809291908181526020018280546112ff90614ff0565b801561134c5780601f106113215761010080835404028352916020019161134c565b820191906000526020600020905b81548152906001019060200180831161132f57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113be90614ab1565b60405180910390fd5b61140e600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206128b4565b9050919050565b61141d612466565b73ffffffffffffffffffffffffffffffffffffffff1661143b6115eb565b73ffffffffffffffffffffffffffffffffffffffff1614611491576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148890614b31565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61155a612466565b73ffffffffffffffffffffffffffffffffffffffff166115786115eb565b73ffffffffffffffffffffffffffffffffffffffff16146115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c590614b31565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61161d612466565b73ffffffffffffffffffffffffffffffffffffffff1661163b6115eb565b73ffffffffffffffffffffffffffffffffffffffff1614611691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168890614b31565b60405180910390fd5b8060118190555050565b6116a3612466565b73ffffffffffffffffffffffffffffffffffffffff166116c16115eb565b73ffffffffffffffffffffffffffffffffffffffff1614611717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170e90614b31565b60405180910390fd5b80600f8190555050565b60606007805461173090614ff0565b80601f016020809104026020016040519081016040528092919081815260200182805461175c90614ff0565b80156117a95780601f1061177e576101008083540402835291602001916117a9565b820191906000526020600020905b81548152906001019060200180831161178c57829003601f168201915b5050505050905090565b6117bb612466565b73ffffffffffffffffffffffffffffffffffffffff166117d96115eb565b73ffffffffffffffffffffffffffffffffffffffff161461182f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182690614b31565b60405180910390fd5b61185b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16476128c9565b565b611865612466565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ca906149f1565b60405180910390fd5b80600560006118e0612466565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661198d612466565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119d291906148f4565b60405180910390a35050565b6119ef6119e9612466565b8361255a565b611a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2590614bd1565b60405180910390fd5b611a3a848484846129bd565b50505050565b6012602052806000526040600020600091509050806002018054611a6390614ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8f90614ff0565b8015611adc5780601f10611ab157610100808354040283529160200191611adc565b820191906000526020600020905b815481529060010190602001808311611abf57829003601f168201915b5050505050905081565b6060611af182612449565b80611b2e5750611aff6115eb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6490614b71565b60405180910390fd5b611b7561383b565b6040518060e0016040528060b38152602001615ab360b3913981600060098110611ba257611ba1615189565b5b602002018190525060126000848152602001908152602001600020600001600081548110611bd357611bd2615189565b5b906000526020600020018054611be890614ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1490614ff0565b8015611c615780601f10611c3657610100808354040283529160200191611c61565b820191906000526020600020905b815481529060010190602001808311611c4457829003601f168201915b505050505081600160098110611c7a57611c79615189565b5b60200201819052506040518060400160405280600781526020017f22206475723d220000000000000000000000000000000000000000000000000081525081600260098110611ccc57611ccb615189565b5b6020020181905250611d1060126000858152602001908152602001600020600101600081548110611d0057611cff615189565b5b9060005260206000200154612a19565b81600360098110611d2457611d23615189565b5b60200201819052506040518060c0016040528060878152602001615bc16087913981600460098110611d5957611d58615189565b5b602002018190525060126000848152602001908152602001600020600001600181548110611d8a57611d89615189565b5b906000526020600020018054611d9f90614ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054611dcb90614ff0565b8015611e185780601f10611ded57610100808354040283529160200191611e18565b820191906000526020600020905b815481529060010190602001808311611dfb57829003601f168201915b505050505081600560098110611e3157611e30615189565b5b60200201819052506040518060400160405280600781526020017f22206475723d220000000000000000000000000000000000000000000000000081525081600660098110611e8357611e82615189565b5b6020020181905250611ec760126000858152602001908152602001600020600101600181548110611eb757611eb6615189565b5b9060005260206000200154612a19565b81600760098110611edb57611eda615189565b5b6020020181905250604051806060016040528060328152602001615b666032913981600860098110611f1057611f0f615189565b5b6020020181905250600081600060098110611f2e57611f2d615189565b5b602002015182600160098110611f4757611f46615189565b5b602002015183600260098110611f6057611f5f615189565b5b602002015184600360098110611f7957611f78615189565b5b602002015185600460098110611f9257611f91615189565b5b602002015186600560098110611fab57611faa615189565b5b602002015187600660098110611fc457611fc3615189565b5b602002015188600760098110611fdd57611fdc615189565b5b602002015189600860098110611ff657611ff5615189565b5b6020020151604051602001612013999897969594939291906146c8565b6040516020818303038152906040529050600061206d6012600087815260200190815260200160002060020161204884612b7a565b604051602001612059929190614774565b604051602081830303815290604052612b7a565b90508060405160200161208091906147b9565b6040516020818303038152906040529150819350505050919050565b600f5481565b60006120ad8261128d565b9050919050565b600c5481565b60606120c46112c4565b6040516020016120d49190614747565b604051602081830303815290604052905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612184612466565b73ffffffffffffffffffffffffffffffffffffffff166121a26115eb565b73ffffffffffffffffffffffffffffffffffffffff16146121f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ef90614b31565b60405180910390fd5b80600e8190555081600d819055505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612238612466565b73ffffffffffffffffffffffffffffffffffffffff166122566115eb565b73ffffffffffffffffffffffffffffffffffffffff16146122ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a390614b31565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561231c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231390614971565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b5481565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b600061245f826002612d1290919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124e18361128d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612541828260405180602001604052806000815250612d2c565b5050565b600061255382600001612d87565b9050919050565b600061256582612449565b6125a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259b90614a71565b60405180910390fd5b60006125af8361128d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061261e57508373ffffffffffffffffffffffffffffffffffffffff1661260684610bc5565b73ffffffffffffffffffffffffffffffffffffffff16145b8061262f575061262e81856120e8565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126588261128d565b73ffffffffffffffffffffffffffffffffffffffff16146126ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a590614b51565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561271e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612715906149d1565b60405180910390fd5b612729838383612d98565b61273460008261246e565b61278581600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612d9d90919063ffffffff16565b506127d781600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612db790919063ffffffff16565b506127ee81836002612dd19092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061285e8360000183612e06565b60001c905092915050565b60008060008061287c8660000186612e7a565b915091508160001c8160001c9350935050509250929050565b60006128a8846000018460001b84612f04565b60001c90509392505050565b60006128c282600001612fa5565b9050919050565b8047101561290c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290390614a31565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612932906147db565b60006040518083038185875af1925050503d806000811461296f576040519150601f19603f3d011682016040523d82523d6000602084013e612974565b606091505b50509050806129b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129af90614a11565b60405180910390fd5b505050565b6129c8848484612638565b6129d484848484612fb6565b612a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0a90614951565b60405180910390fd5b50505050565b60606000821415612a61576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b75565b600082905060005b60008214612a93578080612a7c90615053565b915050600a82612a8c9190614e69565b9150612a69565b60008167ffffffffffffffff811115612aaf57612aae6151b8565b5b6040519080825280601f01601f191660200182016040528015612ae15781602001600182028036833780820191505090505b5090505b60008514612b6e57600182612afa9190614ef4565b9150600a85612b09919061509c565b6030612b159190614e13565b60f81b818381518110612b2b57612b2a615189565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b679190614e69565b9450612ae5565b8093505050505b919050565b60606000825190506000811415612ba35760405180602001604052806000815250915050612d0d565b60006003600283612bb49190614e13565b612bbe9190614e69565b6004612bca9190614e9a565b90506000602082612bdb9190614e13565b67ffffffffffffffff811115612bf457612bf36151b8565b5b6040519080825280601f01601f191660200182016040528015612c265781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615c48604091399050600181016020830160005b86811015612cca5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612c51565b506003860660018114612ce45760028114612cf457612cff565b613d3d60f01b6002830352612cff565b603d60f81b60018303525b508484525050819450505050505b919050565b6000612d24836000018360001b61311a565b905092915050565b612d36838361313d565b612d436000848484612fb6565b612d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7990614951565b60405180910390fd5b505050565b600081600001805490509050919050565b505050565b6000612daf836000018360001b6132cb565b905092915050565b6000612dc9836000018360001b6133e3565b905092915050565b6000612dfd846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613453565b90509392505050565b600081836000018054905011612e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4890614931565b60405180910390fd5b826000018281548110612e6757612e66615189565b5b9060005260206000200154905092915050565b60008082846000018054905011612ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ebd90614ad1565b60405180910390fd5b6000846000018481548110612ede57612edd615189565b5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5d919061490f565b60405180910390fd5b5084600001600182612f789190614ef4565b81548110612f8957612f88615189565b5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612fd78473ffffffffffffffffffffffffffffffffffffffff1661353f565b612fe45760019050613112565b60006130ab63150b7a0260e01b612ff9612466565b88878760405160240161300f9493929190614826565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615a81603291398773ffffffffffffffffffffffffffffffffffffffff166135529092919063ffffffff16565b90506000818060200190518101906130c39190613fa3565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a490614af1565b60405180910390fd5b6131b681612449565b156131f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ed90614991565b60405180910390fd5b61320260008383612d98565b61325381600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612db790919063ffffffff16565b5061326a81836002612dd19092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080836001016000848152602001908152602001600020549050600081146133d75760006001826132fd9190614ef4565b90506000600186600001805490506133159190614ef4565b9050600086600001828154811061332f5761332e615189565b5b906000526020600020015490508087600001848154811061335357613352615189565b5b906000526020600020018190555060018361336e9190614e13565b876001016000838152602001908152602001600020819055508660000180548061339b5761339a61515a565b5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506133dd565b60009150505b92915050565b60006133ef838361356a565b61344857826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061344d565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156134fa57846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613538565b828560000160018361350c9190614ef4565b8154811061351d5761351c615189565b5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b6060613561848460008561358d565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b6060824710156135d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135c990614a51565b60405180910390fd5b6135db8561353f565b61361a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161361190614bf1565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161364391906146b1565b60006040518083038185875af1925050503d8060008114613680576040519150601f19603f3d011682016040523d82523d6000602084013e613685565b606091505b50915091506136958282866136a1565b92505050949350505050565b606083156136b157829050613701565b6000835111156136c45782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136f8919061490f565b60405180910390fd5b9392505050565b828054828255906000526020600020908101928215613757579160200282015b828111156137565782518290805190602001906137469291906137b5565b5091602001919060010190613728565b5b5090506137649190613863565b5090565b8280548282559060005260206000209081019282156137a4579160200282015b828111156137a3578251825591602001919060010190613788565b5b5090506137b19190613887565b5090565b8280546137c190614ff0565b90600052602060002090601f0160209004810192826137e3576000855561382a565b82601f106137fc57805160ff191683800117855561382a565b8280016001018555821561382a579182015b8281111561382957825182559160200191906001019061380e565b5b5090506138379190613887565b5090565b6040518061012001604052806009905b606081526020019060019003908161384b5790505090565b5b80821115613883576000818161387a91906138a4565b50600101613864565b5090565b5b808211156138a0576000816000905550600101613888565b5090565b5080546138b090614ff0565b6000825580601f106138c257506138e1565b601f0160209004906000526020600020908101906138e09190613887565b5b50565b60006138f76138f284614c91565b614c6c565b9050808382526020820190508285602086028201111561391a576139196151f6565b5b60005b8581101561396857813567ffffffffffffffff8111156139405761393f6151e7565b5b80860161394d8982613c15565b8552602085019450602084019350505060018101905061391d565b5050509392505050565b600061398561398084614cbd565b614c6c565b905080838252602082019050828560208602820111156139a8576139a76151f6565b5b60005b858110156139f657813567ffffffffffffffff8111156139ce576139cd6151e7565b5b8086016139db8982613c43565b855260208501945060208401935050506001810190506139ab565b5050509392505050565b6000613a13613a0e84614ce9565b614c6c565b90508083825260208201905082856020860282011115613a3657613a356151f6565b5b60005b85811015613a665781613a4c8882613cfb565b845260208401935060208301925050600181019050613a39565b5050509392505050565b6000613a83613a7e84614d15565b614c6c565b905082815260208101848484011115613a9f57613a9e6151fb565b5b613aaa848285614fae565b509392505050565b6000613ac5613ac084614d46565b614c6c565b905082815260208101848484011115613ae157613ae06151fb565b5b613aec848285614fae565b509392505050565b600081359050613b0381615a0d565b92915050565b600081359050613b1881615a24565b92915050565b600082601f830112613b3357613b326151e7565b5b8135613b438482602086016138e4565b91505092915050565b600082601f830112613b6157613b606151e7565b5b8135613b71848260208601613972565b91505092915050565b600082601f830112613b8f57613b8e6151e7565b5b8135613b9f848260208601613a00565b91505092915050565b600081359050613bb781615a3b565b92915050565b600081359050613bcc81615a52565b92915050565b600081519050613be181615a52565b92915050565b600082601f830112613bfc57613bfb6151e7565b5b8135613c0c848260208601613a70565b91505092915050565b600082601f830112613c2a57613c296151e7565b5b8135613c3a848260208601613ab2565b91505092915050565b600060608284031215613c5957613c586151ec565b5b613c636060614c6c565b9050600082013567ffffffffffffffff811115613c8357613c826151f1565b5b613c8f84828501613b1e565b600083015250602082013567ffffffffffffffff811115613cb357613cb26151f1565b5b613cbf84828501613b7a565b602083015250604082013567ffffffffffffffff811115613ce357613ce26151f1565b5b613cef84828501613c15565b60408301525092915050565b600081359050613d0a81615a69565b92915050565b600060208284031215613d2657613d25615205565b5b6000613d3484828501613af4565b91505092915050565b600060208284031215613d5357613d52615205565b5b6000613d6184828501613b09565b91505092915050565b60008060408385031215613d8157613d80615205565b5b6000613d8f85828601613af4565b9250506020613da085828601613af4565b9150509250929050565b600080600060608486031215613dc357613dc2615205565b5b6000613dd186828701613af4565b9350506020613de286828701613af4565b9250506040613df386828701613cfb565b9150509250925092565b60008060008060808587031215613e1757613e16615205565b5b6000613e2587828801613af4565b9450506020613e3687828801613af4565b9350506040613e4787828801613cfb565b925050606085013567ffffffffffffffff811115613e6857613e67615200565b5b613e7487828801613be7565b91505092959194509250565b60008060408385031215613e9757613e96615205565b5b6000613ea585828601613af4565b9250506020613eb685828601613ba8565b9150509250929050565b60008060408385031215613ed757613ed6615205565b5b6000613ee585828601613af4565b9250506020613ef685828601613cfb565b9150509250929050565b600060208284031215613f1657613f15615205565b5b600082013567ffffffffffffffff811115613f3457613f33615200565b5b613f4084828501613b4c565b91505092915050565b600060208284031215613f5f57613f5e615205565b5b6000613f6d84828501613ba8565b91505092915050565b600060208284031215613f8c57613f8b615205565b5b6000613f9a84828501613bbd565b91505092915050565b600060208284031215613fb957613fb8615205565b5b6000613fc784828501613bd2565b91505092915050565b600060208284031215613fe657613fe5615205565b5b6000613ff484828501613cfb565b91505092915050565b6000806040838503121561401457614013615205565b5b600061402285828601613cfb565b925050602061403385828601613cfb565b9150509250929050565b60006140498383614064565b60208301905092915050565b61405e81614f3a565b82525050565b61406d81614f28565b82525050565b61407c81614f28565b82525050565b600061408d82614d9c565b6140978185614dca565b93506140a283614d77565b8060005b838110156140d35781516140ba888261403d565b97506140c583614dbd565b9250506001810190506140a6565b5085935050505092915050565b6140e981614f4c565b82525050565b60006140fa82614da7565b6141048185614ddb565b9350614114818560208601614fbd565b61411d8161520a565b840191505092915050565b600061413382614da7565b61413d8185614dec565b935061414d818560208601614fbd565b80840191505092915050565b600061416482614db2565b61416e8185614df7565b935061417e818560208601614fbd565b6141878161520a565b840191505092915050565b600061419d82614db2565b6141a78185614e08565b93506141b7818560208601614fbd565b80840191505092915050565b600081546141d081614ff0565b6141da8186614e08565b945060018216600081146141f5576001811461420657614239565b60ff19831686528186019350614239565b61420f85614d87565b60005b8381101561423157815481890152600182019150602081019050614212565b838801955050505b50505092915050565b600061424f602283614df7565b915061425a8261521b565b604082019050919050565b6000614272603283614df7565b915061427d8261526a565b604082019050919050565b6000614295602683614df7565b91506142a0826152b9565b604082019050919050565b60006142b8601c83614df7565b91506142c382615308565b602082019050919050565b60006142db602c83614df7565b91506142e682615331565b604082019050919050565b60006142fe602483614df7565b915061430982615380565b604082019050919050565b6000614321601983614df7565b915061432c826153cf565b602082019050919050565b6000614344603a83614df7565b915061434f826153f8565b604082019050919050565b6000614367601d83614df7565b915061437282615447565b602082019050919050565b600061438a602683614df7565b915061439582615470565b604082019050919050565b60006143ad602c83614df7565b91506143b8826154bf565b604082019050919050565b60006143d0601183614e08565b91506143db8261550e565b601182019050919050565b60006143f3603883614df7565b91506143fe82615537565b604082019050919050565b6000614416602a83614df7565b915061442182615586565b604082019050919050565b6000614439600283614e08565b9150614444826155d5565b600282019050919050565b600061445c602283614df7565b9150614467826155fe565b604082019050919050565b600061447f602083614df7565b915061448a8261564d565b602082019050919050565b60006144a2602c83614df7565b91506144ad82615676565b604082019050919050565b60006144c5600583614e08565b91506144d0826156c5565b600582019050919050565b60006144e8601683614e08565b91506144f3826156ee565b601682019050919050565b600061450b602083614df7565b915061451682615717565b602082019050919050565b600061452e602983614df7565b915061453982615740565b604082019050919050565b6000614551602f83614df7565b915061455c8261578f565b604082019050919050565b6000614574602183614df7565b915061457f826157de565b604082019050919050565b6000614597607e83614e08565b91506145a28261582d565b607e82019050919050565b60006145ba601d83614e08565b91506145c5826158c8565b601d82019050919050565b60006145dd601b83614df7565b91506145e8826158f1565b602082019050919050565b6000614600600083614dec565b915061460b8261591a565b600082019050919050565b6000614623603183614df7565b915061462e8261591d565b604082019050919050565b6000614646601d83614df7565b91506146518261596c565b602082019050919050565b6000614669602983614df7565b915061467482615995565b604082019050919050565b600061468c601383614df7565b9150614697826159e4565b602082019050919050565b6146ab81614fa4565b82525050565b60006146bd8284614128565b915081905092915050565b60006146d4828c614192565b91506146e0828b614192565b91506146ec828a614192565b91506146f88289614192565b91506147048288614192565b91506147108287614192565b915061471c8286614192565b91506147288285614192565b91506147348284614192565b91508190509a9950505050505050505050565b60006147538284614192565b915061475e826143c3565b9150614769826144b8565b915081905092915050565b600061477f826144db565b915061478b82856141c3565b91506147968261458a565b91506147a28284614192565b91506147ad8261442c565b91508190509392505050565b60006147c4826145ad565b91506147d08284614192565b915081905092915050565b60006147e6826145f3565b9150819050919050565b60006020820190506148056000830184614073565b92915050565b60006020820190506148206000830184614055565b92915050565b600060808201905061483b6000830187614073565b6148486020830186614073565b61485560408301856146a2565b818103606083015261486781846140ef565b905095945050505050565b60006040820190506148876000830185614073565b61489460208301846146a2565b9392505050565b60006060820190506148b06000830186614073565b6148bd60208301856146a2565b6148ca60408301846146a2565b949350505050565b600060208201905081810360008301526148ec8184614082565b905092915050565b600060208201905061490960008301846140e0565b92915050565b600060208201905081810360008301526149298184614159565b905092915050565b6000602082019050818103600083015261494a81614242565b9050919050565b6000602082019050818103600083015261496a81614265565b9050919050565b6000602082019050818103600083015261498a81614288565b9050919050565b600060208201905081810360008301526149aa816142ab565b9050919050565b600060208201905081810360008301526149ca816142ce565b9050919050565b600060208201905081810360008301526149ea816142f1565b9050919050565b60006020820190508181036000830152614a0a81614314565b9050919050565b60006020820190508181036000830152614a2a81614337565b9050919050565b60006020820190508181036000830152614a4a8161435a565b9050919050565b60006020820190508181036000830152614a6a8161437d565b9050919050565b60006020820190508181036000830152614a8a816143a0565b9050919050565b60006020820190508181036000830152614aaa816143e6565b9050919050565b60006020820190508181036000830152614aca81614409565b9050919050565b60006020820190508181036000830152614aea8161444f565b9050919050565b60006020820190508181036000830152614b0a81614472565b9050919050565b60006020820190508181036000830152614b2a81614495565b9050919050565b60006020820190508181036000830152614b4a816144fe565b9050919050565b60006020820190508181036000830152614b6a81614521565b9050919050565b60006020820190508181036000830152614b8a81614544565b9050919050565b60006020820190508181036000830152614baa81614567565b9050919050565b60006020820190508181036000830152614bca816145d0565b9050919050565b60006020820190508181036000830152614bea81614616565b9050919050565b60006020820190508181036000830152614c0a81614639565b9050919050565b60006020820190508181036000830152614c2a8161465c565b9050919050565b60006020820190508181036000830152614c4a8161467f565b9050919050565b6000602082019050614c6660008301846146a2565b92915050565b6000614c76614c87565b9050614c828282615022565b919050565b6000604051905090565b600067ffffffffffffffff821115614cac57614cab6151b8565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614cd857614cd76151b8565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614d0457614d036151b8565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614d3057614d2f6151b8565b5b614d398261520a565b9050602081019050919050565b600067ffffffffffffffff821115614d6157614d606151b8565b5b614d6a8261520a565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e1e82614fa4565b9150614e2983614fa4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e5e57614e5d6150cd565b5b828201905092915050565b6000614e7482614fa4565b9150614e7f83614fa4565b925082614e8f57614e8e6150fc565b5b828204905092915050565b6000614ea582614fa4565b9150614eb083614fa4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ee957614ee86150cd565b5b828202905092915050565b6000614eff82614fa4565b9150614f0a83614fa4565b925082821015614f1d57614f1c6150cd565b5b828203905092915050565b6000614f3382614f84565b9050919050565b6000614f4582614f84565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614fdb578082015181840152602081019050614fc0565b83811115614fea576000848401525b50505050565b6000600282049050600182168061500857607f821691505b6020821081141561501c5761501b61512b565b5b50919050565b61502b8261520a565b810181811067ffffffffffffffff8211171561504a576150496151b8565b5b80604052505050565b600061505e82614fa4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615091576150906150cd565b5b600182019050919050565b60006150a782614fa4565b91506150b283614fa4565b9250826150c2576150c16150fc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f676976656e20746f6b656e2076616c756520697320677265617465722074686160008201527f6e2073616c65206c696d69740000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f636f6e74726163745f6d65746164617461000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f7b226e616d65223a2022436f6c6f75722054696d652000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a2022536c6f776c792073686966746960008201527f6e6720636f6c6f7572732c207265636f726473206f662074696d65207061737460208201527f2e204a6f6e617468616e2043686f6d6b6f2c2032303231222c2022696d61676560408201527f223a2022646174613a696d6167652f7376672b786d6c3b6261736536342c0000606082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f6d7573742073656e6420696e20636f727265637420616d6f756e740000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f676976656e20746f6b656e2076616c7565206973206c657373207468616e207360008201527f616c65206c696d69740000000000000000000000000000000000000000000000602082015250565b7f73616c65206d7573742062652061637469766500000000000000000000000000600082015250565b615a1681614f28565b8114615a2157600080fd5b50565b615a2d81614f3a565b8114615a3857600080fd5b50565b615a4481614f4c565b8114615a4f57600080fd5b50565b615a5b81614f58565b8114615a6657600080fd5b50565b615a7281614fa4565b8114615a7d57600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465723c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d22302030203130203130223e20203c726563742077696474683d22313022206865696768743d223130223e3c616e696d6174652069643d226f75746572626f7822206174747269627574654e616d653d2266696c6c222076616c7565733d222220726570656174436f756e743d22696e646566696e697465223e3c2f616e696d6174653e3c2f726563743e3c2f7376673e4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e2220726570656174436f756e743d22696e646566696e697465223e3c2f616e696d6174653e3c2f726563743e3c7265637420783d22322220793d2232222077696474683d223622206865696768743d2236223e3c616e696d6174652069643d22696e6e6572626f7822206174747269627574654e616d653d2266696c6c222076616c7565733d224142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220e0dd01abae1e5fa38df9efe25d08e64558fc79140033410b4685f88acd52dc2764736f6c634300080700330000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000008490b3dfba40b784e3a16974377c70a139306cfa

Deployed Bytecode

0x6080604052600436106102465760003560e01c806370a0823111610139578063c47f7cf2116100b6578063e8a3d4851161007a578063e8a3d485146108bc578063e985e9c5146108e7578063ed13c32814610924578063f2bcd0221461094d578063f2fde38b14610978578063fe3c4657146109a157610246565b8063c47f7cf2146107af578063c87b56dd146107ec578063cafa8dfe14610829578063cc33c87514610854578063d082e3811461089157610246565b80639466d206116100fd5780639466d206146106f257806395d89b411461071b578063a0ef91df14610746578063a22cb4651461075d578063b88d4fde1461078657610246565b806370a0823114610621578063715018a61461065e578063841718a6146106755780638da5cb5b1461069e57806391b7f5ed146106c957610246565b80632a55205a116101c75780634f6ccce71161018b5780634f6ccce71461052657806353d0023d14610563578063575ca2c71461058e5780636352211e146105b95780636c0360eb146105f657610246565b80632a55205a1461042e5780632f745c591461046c5780633effce33146104a957806342842e0e146104d257806347a6fee8146104fb57610246565b8063095ea7b31161020e578063095ea7b31461035857806317fb85941461038157806318160ddd146103b157806321b8092e146103dc57806323b872dd1461040557610246565b806301facb8e1461024b57806301ffc9a71461027657806304822058146102b357806306fdde03146102f0578063081812fc1461031b575b600080fd5b34801561025757600080fd5b506102606109cc565b60405161026d9190614c51565b60405180910390f35b34801561028257600080fd5b5061029d60048036038101906102989190613f76565b6109d2565b6040516102aa91906148f4565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613ffd565b610a4c565b6040516102e791906148d2565b60405180910390f35b3480156102fc57600080fd5b50610305610b33565b604051610312919061490f565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190613fd0565b610bc5565b60405161034f91906147f0565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a9190613ec0565b610c4a565b005b61039b60048036038101906103969190613fd0565b610d62565b6040516103a89190614c51565b60405180910390f35b3480156103bd57600080fd5b506103c6610f27565b6040516103d39190614c51565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe9190613d3d565b610f38565b005b34801561041157600080fd5b5061042c60048036038101906104279190613daa565b610ff8565b005b34801561043a57600080fd5b5061045560048036038101906104509190613ffd565b611058565b604051610463929190614872565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e9190613ec0565b6110a9565b6040516104a09190614c51565b60405180910390f35b3480156104b557600080fd5b506104d060048036038101906104cb9190613f00565b611104565b005b3480156104de57600080fd5b506104f960048036038101906104f49190613daa565b61122b565b005b34801561050757600080fd5b5061051061124b565b60405161051d9190614c51565b60405180910390f35b34801561053257600080fd5b5061054d60048036038101906105489190613fd0565b611251565b60405161055a9190614c51565b60405180910390f35b34801561056f57600080fd5b50610578611274565b60405161058591906148f4565b60405180910390f35b34801561059a57600080fd5b506105a3611287565b6040516105b09190614c51565b60405180910390f35b3480156105c557600080fd5b506105e060048036038101906105db9190613fd0565b61128d565b6040516105ed91906147f0565b60405180910390f35b34801561060257600080fd5b5061060b6112c4565b604051610618919061490f565b60405180910390f35b34801561062d57600080fd5b5061064860048036038101906106439190613d10565b611356565b6040516106559190614c51565b60405180910390f35b34801561066a57600080fd5b50610673611415565b005b34801561068157600080fd5b5061069c60048036038101906106979190613f49565b611552565b005b3480156106aa57600080fd5b506106b36115eb565b6040516106c091906147f0565b60405180910390f35b3480156106d557600080fd5b506106f060048036038101906106eb9190613fd0565b611615565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613fd0565b61169b565b005b34801561072757600080fd5b50610730611721565b60405161073d919061490f565b60405180910390f35b34801561075257600080fd5b5061075b6117b3565b005b34801561076957600080fd5b50610784600480360381019061077f9190613e80565b61185d565b005b34801561079257600080fd5b506107ad60048036038101906107a89190613dfd565b6119de565b005b3480156107bb57600080fd5b506107d660048036038101906107d19190613fd0565b611a40565b6040516107e3919061490f565b60405180910390f35b3480156107f857600080fd5b50610813600480360381019061080e9190613fd0565b611ae6565b604051610820919061490f565b60405180910390f35b34801561083557600080fd5b5061083e61209c565b60405161084b9190614c51565b60405180910390f35b34801561086057600080fd5b5061087b60048036038101906108769190613fd0565b6120a2565b60405161088891906147f0565b60405180910390f35b34801561089d57600080fd5b506108a66120b4565b6040516108b39190614c51565b60405180910390f35b3480156108c857600080fd5b506108d16120ba565b6040516108de919061490f565b60405180910390f35b3480156108f357600080fd5b5061090e60048036038101906109099190613d6a565b6120e8565b60405161091b91906148f4565b60405180910390f35b34801561093057600080fd5b5061094b60048036038101906109469190613ffd565b61217c565b005b34801561095957600080fd5b5061096261220a565b60405161096f919061480b565b60405180910390f35b34801561098457600080fd5b5061099f600480360381019061099a9190613d10565b612230565b005b3480156109ad57600080fd5b506109b66123dc565b6040516109c39190614c51565b60405180910390f35b600e5481565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a455750610a44826123e2565b5b9050919050565b606060008383610a5c9190614ef4565b67ffffffffffffffff811115610a7557610a746151b8565b5b604051908082528060200260200182016040528015610aa35781602001602082028036833780820191505090505b50905060008490505b83811015610b2857610abd8161128d565b828683610aca9190614ef4565b81518110610adb57610ada615189565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610b2090615053565b915050610aac565b508091505092915050565b606060068054610b4290614ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6e90614ff0565b8015610bbb5780601f10610b9057610100808354040283529160200191610bbb565b820191906000526020600020905b815481529060010190602001808311610b9e57829003601f168201915b5050505050905090565b6000610bd082612449565b610c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0690614b11565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c558261128d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbd90614b91565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ce5612466565b73ffffffffffffffffffffffffffffffffffffffff161480610d145750610d1381610d0e612466565b6120e8565b5b610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a90614a91565b60405180910390fd5b610d5d838361246e565b505050565b6000600e54821115610da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da0906149b1565b60405180910390fd5b600d54821015610dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de590614c11565b60405180910390fd5b601060009054906101000a900460ff1680610e3b5750610e0c6115eb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7190614c31565b60405180910390fd5b6011543414610ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb590614bb1565b60405180910390fd5b610ec83383612527565b6001600c6000828254610edb9190614e13565b925050819055507f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f333484604051610f159392919061489b565b60405180910390a1600c549050919050565b6000610f336002612545565b905090565b610f40612466565b73ffffffffffffffffffffffffffffffffffffffff16610f5e6115eb565b73ffffffffffffffffffffffffffffffffffffffff1614610fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fab90614b31565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611009611003612466565b8261255a565b611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103f90614bd1565b60405180910390fd5b611053838383612638565b505050565b60008060006064600f548561106d9190614e9a565b6110779190614e69565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168192509250509250929050565b60006110fc82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061284f90919063ffffffff16565b905092915050565b61110c612466565b73ffffffffffffffffffffffffffffffffffffffff1661112a6115eb565b73ffffffffffffffffffffffffffffffffffffffff1614611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117790614b31565b60405180910390fd5b60005b81518110156112275781818151811061119f5761119e615189565b5b60200260200101516012600083815260200190815260200160002060008201518160000190805190602001906111d6929190613708565b5060208201518160010190805190602001906111f3929190613768565b5060408201518160020190805190602001906112109291906137b5565b50905050808061121f90615053565b915050611183565b5050565b611246838383604051806020016040528060008152506119de565b505050565b600d5481565b60008061126883600261286990919063ffffffff16565b50905080915050919050565b601060009054906101000a900460ff1681565b60115481565b60006112bd82604051806060016040528060298152602001615b986029913960026128959092919063ffffffff16565b9050919050565b6060600880546112d390614ff0565b80601f01602080910402602001604051908101604052809291908181526020018280546112ff90614ff0565b801561134c5780601f106113215761010080835404028352916020019161134c565b820191906000526020600020905b81548152906001019060200180831161132f57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113be90614ab1565b60405180910390fd5b61140e600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206128b4565b9050919050565b61141d612466565b73ffffffffffffffffffffffffffffffffffffffff1661143b6115eb565b73ffffffffffffffffffffffffffffffffffffffff1614611491576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148890614b31565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61155a612466565b73ffffffffffffffffffffffffffffffffffffffff166115786115eb565b73ffffffffffffffffffffffffffffffffffffffff16146115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c590614b31565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61161d612466565b73ffffffffffffffffffffffffffffffffffffffff1661163b6115eb565b73ffffffffffffffffffffffffffffffffffffffff1614611691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168890614b31565b60405180910390fd5b8060118190555050565b6116a3612466565b73ffffffffffffffffffffffffffffffffffffffff166116c16115eb565b73ffffffffffffffffffffffffffffffffffffffff1614611717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170e90614b31565b60405180910390fd5b80600f8190555050565b60606007805461173090614ff0565b80601f016020809104026020016040519081016040528092919081815260200182805461175c90614ff0565b80156117a95780601f1061177e576101008083540402835291602001916117a9565b820191906000526020600020905b81548152906001019060200180831161178c57829003601f168201915b5050505050905090565b6117bb612466565b73ffffffffffffffffffffffffffffffffffffffff166117d96115eb565b73ffffffffffffffffffffffffffffffffffffffff161461182f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182690614b31565b60405180910390fd5b61185b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16476128c9565b565b611865612466565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ca906149f1565b60405180910390fd5b80600560006118e0612466565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661198d612466565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119d291906148f4565b60405180910390a35050565b6119ef6119e9612466565b8361255a565b611a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2590614bd1565b60405180910390fd5b611a3a848484846129bd565b50505050565b6012602052806000526040600020600091509050806002018054611a6390614ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8f90614ff0565b8015611adc5780601f10611ab157610100808354040283529160200191611adc565b820191906000526020600020905b815481529060010190602001808311611abf57829003601f168201915b5050505050905081565b6060611af182612449565b80611b2e5750611aff6115eb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6490614b71565b60405180910390fd5b611b7561383b565b6040518060e0016040528060b38152602001615ab360b3913981600060098110611ba257611ba1615189565b5b602002018190525060126000848152602001908152602001600020600001600081548110611bd357611bd2615189565b5b906000526020600020018054611be890614ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1490614ff0565b8015611c615780601f10611c3657610100808354040283529160200191611c61565b820191906000526020600020905b815481529060010190602001808311611c4457829003601f168201915b505050505081600160098110611c7a57611c79615189565b5b60200201819052506040518060400160405280600781526020017f22206475723d220000000000000000000000000000000000000000000000000081525081600260098110611ccc57611ccb615189565b5b6020020181905250611d1060126000858152602001908152602001600020600101600081548110611d0057611cff615189565b5b9060005260206000200154612a19565b81600360098110611d2457611d23615189565b5b60200201819052506040518060c0016040528060878152602001615bc16087913981600460098110611d5957611d58615189565b5b602002018190525060126000848152602001908152602001600020600001600181548110611d8a57611d89615189565b5b906000526020600020018054611d9f90614ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054611dcb90614ff0565b8015611e185780601f10611ded57610100808354040283529160200191611e18565b820191906000526020600020905b815481529060010190602001808311611dfb57829003601f168201915b505050505081600560098110611e3157611e30615189565b5b60200201819052506040518060400160405280600781526020017f22206475723d220000000000000000000000000000000000000000000000000081525081600660098110611e8357611e82615189565b5b6020020181905250611ec760126000858152602001908152602001600020600101600181548110611eb757611eb6615189565b5b9060005260206000200154612a19565b81600760098110611edb57611eda615189565b5b6020020181905250604051806060016040528060328152602001615b666032913981600860098110611f1057611f0f615189565b5b6020020181905250600081600060098110611f2e57611f2d615189565b5b602002015182600160098110611f4757611f46615189565b5b602002015183600260098110611f6057611f5f615189565b5b602002015184600360098110611f7957611f78615189565b5b602002015185600460098110611f9257611f91615189565b5b602002015186600560098110611fab57611faa615189565b5b602002015187600660098110611fc457611fc3615189565b5b602002015188600760098110611fdd57611fdc615189565b5b602002015189600860098110611ff657611ff5615189565b5b6020020151604051602001612013999897969594939291906146c8565b6040516020818303038152906040529050600061206d6012600087815260200190815260200160002060020161204884612b7a565b604051602001612059929190614774565b604051602081830303815290604052612b7a565b90508060405160200161208091906147b9565b6040516020818303038152906040529150819350505050919050565b600f5481565b60006120ad8261128d565b9050919050565b600c5481565b60606120c46112c4565b6040516020016120d49190614747565b604051602081830303815290604052905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612184612466565b73ffffffffffffffffffffffffffffffffffffffff166121a26115eb565b73ffffffffffffffffffffffffffffffffffffffff16146121f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ef90614b31565b60405180910390fd5b80600e8190555081600d819055505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612238612466565b73ffffffffffffffffffffffffffffffffffffffff166122566115eb565b73ffffffffffffffffffffffffffffffffffffffff16146122ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a390614b31565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561231c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231390614971565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b5481565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b600061245f826002612d1290919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124e18361128d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612541828260405180602001604052806000815250612d2c565b5050565b600061255382600001612d87565b9050919050565b600061256582612449565b6125a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259b90614a71565b60405180910390fd5b60006125af8361128d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061261e57508373ffffffffffffffffffffffffffffffffffffffff1661260684610bc5565b73ffffffffffffffffffffffffffffffffffffffff16145b8061262f575061262e81856120e8565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126588261128d565b73ffffffffffffffffffffffffffffffffffffffff16146126ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a590614b51565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561271e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612715906149d1565b60405180910390fd5b612729838383612d98565b61273460008261246e565b61278581600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612d9d90919063ffffffff16565b506127d781600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612db790919063ffffffff16565b506127ee81836002612dd19092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061285e8360000183612e06565b60001c905092915050565b60008060008061287c8660000186612e7a565b915091508160001c8160001c9350935050509250929050565b60006128a8846000018460001b84612f04565b60001c90509392505050565b60006128c282600001612fa5565b9050919050565b8047101561290c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290390614a31565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612932906147db565b60006040518083038185875af1925050503d806000811461296f576040519150601f19603f3d011682016040523d82523d6000602084013e612974565b606091505b50509050806129b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129af90614a11565b60405180910390fd5b505050565b6129c8848484612638565b6129d484848484612fb6565b612a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0a90614951565b60405180910390fd5b50505050565b60606000821415612a61576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b75565b600082905060005b60008214612a93578080612a7c90615053565b915050600a82612a8c9190614e69565b9150612a69565b60008167ffffffffffffffff811115612aaf57612aae6151b8565b5b6040519080825280601f01601f191660200182016040528015612ae15781602001600182028036833780820191505090505b5090505b60008514612b6e57600182612afa9190614ef4565b9150600a85612b09919061509c565b6030612b159190614e13565b60f81b818381518110612b2b57612b2a615189565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b679190614e69565b9450612ae5565b8093505050505b919050565b60606000825190506000811415612ba35760405180602001604052806000815250915050612d0d565b60006003600283612bb49190614e13565b612bbe9190614e69565b6004612bca9190614e9a565b90506000602082612bdb9190614e13565b67ffffffffffffffff811115612bf457612bf36151b8565b5b6040519080825280601f01601f191660200182016040528015612c265781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615c48604091399050600181016020830160005b86811015612cca5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612c51565b506003860660018114612ce45760028114612cf457612cff565b613d3d60f01b6002830352612cff565b603d60f81b60018303525b508484525050819450505050505b919050565b6000612d24836000018360001b61311a565b905092915050565b612d36838361313d565b612d436000848484612fb6565b612d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7990614951565b60405180910390fd5b505050565b600081600001805490509050919050565b505050565b6000612daf836000018360001b6132cb565b905092915050565b6000612dc9836000018360001b6133e3565b905092915050565b6000612dfd846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613453565b90509392505050565b600081836000018054905011612e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4890614931565b60405180910390fd5b826000018281548110612e6757612e66615189565b5b9060005260206000200154905092915050565b60008082846000018054905011612ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ebd90614ad1565b60405180910390fd5b6000846000018481548110612ede57612edd615189565b5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5d919061490f565b60405180910390fd5b5084600001600182612f789190614ef4565b81548110612f8957612f88615189565b5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612fd78473ffffffffffffffffffffffffffffffffffffffff1661353f565b612fe45760019050613112565b60006130ab63150b7a0260e01b612ff9612466565b88878760405160240161300f9493929190614826565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615a81603291398773ffffffffffffffffffffffffffffffffffffffff166135529092919063ffffffff16565b90506000818060200190518101906130c39190613fa3565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a490614af1565b60405180910390fd5b6131b681612449565b156131f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ed90614991565b60405180910390fd5b61320260008383612d98565b61325381600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612db790919063ffffffff16565b5061326a81836002612dd19092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080836001016000848152602001908152602001600020549050600081146133d75760006001826132fd9190614ef4565b90506000600186600001805490506133159190614ef4565b9050600086600001828154811061332f5761332e615189565b5b906000526020600020015490508087600001848154811061335357613352615189565b5b906000526020600020018190555060018361336e9190614e13565b876001016000838152602001908152602001600020819055508660000180548061339b5761339a61515a565b5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506133dd565b60009150505b92915050565b60006133ef838361356a565b61344857826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061344d565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156134fa57846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613538565b828560000160018361350c9190614ef4565b8154811061351d5761351c615189565b5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b6060613561848460008561358d565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b6060824710156135d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135c990614a51565b60405180910390fd5b6135db8561353f565b61361a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161361190614bf1565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161364391906146b1565b60006040518083038185875af1925050503d8060008114613680576040519150601f19603f3d011682016040523d82523d6000602084013e613685565b606091505b50915091506136958282866136a1565b92505050949350505050565b606083156136b157829050613701565b6000835111156136c45782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136f8919061490f565b60405180910390fd5b9392505050565b828054828255906000526020600020908101928215613757579160200282015b828111156137565782518290805190602001906137469291906137b5565b5091602001919060010190613728565b5b5090506137649190613863565b5090565b8280548282559060005260206000209081019282156137a4579160200282015b828111156137a3578251825591602001919060010190613788565b5b5090506137b19190613887565b5090565b8280546137c190614ff0565b90600052602060002090601f0160209004810192826137e3576000855561382a565b82601f106137fc57805160ff191683800117855561382a565b8280016001018555821561382a579182015b8281111561382957825182559160200191906001019061380e565b5b5090506138379190613887565b5090565b6040518061012001604052806009905b606081526020019060019003908161384b5790505090565b5b80821115613883576000818161387a91906138a4565b50600101613864565b5090565b5b808211156138a0576000816000905550600101613888565b5090565b5080546138b090614ff0565b6000825580601f106138c257506138e1565b601f0160209004906000526020600020908101906138e09190613887565b5b50565b60006138f76138f284614c91565b614c6c565b9050808382526020820190508285602086028201111561391a576139196151f6565b5b60005b8581101561396857813567ffffffffffffffff8111156139405761393f6151e7565b5b80860161394d8982613c15565b8552602085019450602084019350505060018101905061391d565b5050509392505050565b600061398561398084614cbd565b614c6c565b905080838252602082019050828560208602820111156139a8576139a76151f6565b5b60005b858110156139f657813567ffffffffffffffff8111156139ce576139cd6151e7565b5b8086016139db8982613c43565b855260208501945060208401935050506001810190506139ab565b5050509392505050565b6000613a13613a0e84614ce9565b614c6c565b90508083825260208201905082856020860282011115613a3657613a356151f6565b5b60005b85811015613a665781613a4c8882613cfb565b845260208401935060208301925050600181019050613a39565b5050509392505050565b6000613a83613a7e84614d15565b614c6c565b905082815260208101848484011115613a9f57613a9e6151fb565b5b613aaa848285614fae565b509392505050565b6000613ac5613ac084614d46565b614c6c565b905082815260208101848484011115613ae157613ae06151fb565b5b613aec848285614fae565b509392505050565b600081359050613b0381615a0d565b92915050565b600081359050613b1881615a24565b92915050565b600082601f830112613b3357613b326151e7565b5b8135613b438482602086016138e4565b91505092915050565b600082601f830112613b6157613b606151e7565b5b8135613b71848260208601613972565b91505092915050565b600082601f830112613b8f57613b8e6151e7565b5b8135613b9f848260208601613a00565b91505092915050565b600081359050613bb781615a3b565b92915050565b600081359050613bcc81615a52565b92915050565b600081519050613be181615a52565b92915050565b600082601f830112613bfc57613bfb6151e7565b5b8135613c0c848260208601613a70565b91505092915050565b600082601f830112613c2a57613c296151e7565b5b8135613c3a848260208601613ab2565b91505092915050565b600060608284031215613c5957613c586151ec565b5b613c636060614c6c565b9050600082013567ffffffffffffffff811115613c8357613c826151f1565b5b613c8f84828501613b1e565b600083015250602082013567ffffffffffffffff811115613cb357613cb26151f1565b5b613cbf84828501613b7a565b602083015250604082013567ffffffffffffffff811115613ce357613ce26151f1565b5b613cef84828501613c15565b60408301525092915050565b600081359050613d0a81615a69565b92915050565b600060208284031215613d2657613d25615205565b5b6000613d3484828501613af4565b91505092915050565b600060208284031215613d5357613d52615205565b5b6000613d6184828501613b09565b91505092915050565b60008060408385031215613d8157613d80615205565b5b6000613d8f85828601613af4565b9250506020613da085828601613af4565b9150509250929050565b600080600060608486031215613dc357613dc2615205565b5b6000613dd186828701613af4565b9350506020613de286828701613af4565b9250506040613df386828701613cfb565b9150509250925092565b60008060008060808587031215613e1757613e16615205565b5b6000613e2587828801613af4565b9450506020613e3687828801613af4565b9350506040613e4787828801613cfb565b925050606085013567ffffffffffffffff811115613e6857613e67615200565b5b613e7487828801613be7565b91505092959194509250565b60008060408385031215613e9757613e96615205565b5b6000613ea585828601613af4565b9250506020613eb685828601613ba8565b9150509250929050565b60008060408385031215613ed757613ed6615205565b5b6000613ee585828601613af4565b9250506020613ef685828601613cfb565b9150509250929050565b600060208284031215613f1657613f15615205565b5b600082013567ffffffffffffffff811115613f3457613f33615200565b5b613f4084828501613b4c565b91505092915050565b600060208284031215613f5f57613f5e615205565b5b6000613f6d84828501613ba8565b91505092915050565b600060208284031215613f8c57613f8b615205565b5b6000613f9a84828501613bbd565b91505092915050565b600060208284031215613fb957613fb8615205565b5b6000613fc784828501613bd2565b91505092915050565b600060208284031215613fe657613fe5615205565b5b6000613ff484828501613cfb565b91505092915050565b6000806040838503121561401457614013615205565b5b600061402285828601613cfb565b925050602061403385828601613cfb565b9150509250929050565b60006140498383614064565b60208301905092915050565b61405e81614f3a565b82525050565b61406d81614f28565b82525050565b61407c81614f28565b82525050565b600061408d82614d9c565b6140978185614dca565b93506140a283614d77565b8060005b838110156140d35781516140ba888261403d565b97506140c583614dbd565b9250506001810190506140a6565b5085935050505092915050565b6140e981614f4c565b82525050565b60006140fa82614da7565b6141048185614ddb565b9350614114818560208601614fbd565b61411d8161520a565b840191505092915050565b600061413382614da7565b61413d8185614dec565b935061414d818560208601614fbd565b80840191505092915050565b600061416482614db2565b61416e8185614df7565b935061417e818560208601614fbd565b6141878161520a565b840191505092915050565b600061419d82614db2565b6141a78185614e08565b93506141b7818560208601614fbd565b80840191505092915050565b600081546141d081614ff0565b6141da8186614e08565b945060018216600081146141f5576001811461420657614239565b60ff19831686528186019350614239565b61420f85614d87565b60005b8381101561423157815481890152600182019150602081019050614212565b838801955050505b50505092915050565b600061424f602283614df7565b915061425a8261521b565b604082019050919050565b6000614272603283614df7565b915061427d8261526a565b604082019050919050565b6000614295602683614df7565b91506142a0826152b9565b604082019050919050565b60006142b8601c83614df7565b91506142c382615308565b602082019050919050565b60006142db602c83614df7565b91506142e682615331565b604082019050919050565b60006142fe602483614df7565b915061430982615380565b604082019050919050565b6000614321601983614df7565b915061432c826153cf565b602082019050919050565b6000614344603a83614df7565b915061434f826153f8565b604082019050919050565b6000614367601d83614df7565b915061437282615447565b602082019050919050565b600061438a602683614df7565b915061439582615470565b604082019050919050565b60006143ad602c83614df7565b91506143b8826154bf565b604082019050919050565b60006143d0601183614e08565b91506143db8261550e565b601182019050919050565b60006143f3603883614df7565b91506143fe82615537565b604082019050919050565b6000614416602a83614df7565b915061442182615586565b604082019050919050565b6000614439600283614e08565b9150614444826155d5565b600282019050919050565b600061445c602283614df7565b9150614467826155fe565b604082019050919050565b600061447f602083614df7565b915061448a8261564d565b602082019050919050565b60006144a2602c83614df7565b91506144ad82615676565b604082019050919050565b60006144c5600583614e08565b91506144d0826156c5565b600582019050919050565b60006144e8601683614e08565b91506144f3826156ee565b601682019050919050565b600061450b602083614df7565b915061451682615717565b602082019050919050565b600061452e602983614df7565b915061453982615740565b604082019050919050565b6000614551602f83614df7565b915061455c8261578f565b604082019050919050565b6000614574602183614df7565b915061457f826157de565b604082019050919050565b6000614597607e83614e08565b91506145a28261582d565b607e82019050919050565b60006145ba601d83614e08565b91506145c5826158c8565b601d82019050919050565b60006145dd601b83614df7565b91506145e8826158f1565b602082019050919050565b6000614600600083614dec565b915061460b8261591a565b600082019050919050565b6000614623603183614df7565b915061462e8261591d565b604082019050919050565b6000614646601d83614df7565b91506146518261596c565b602082019050919050565b6000614669602983614df7565b915061467482615995565b604082019050919050565b600061468c601383614df7565b9150614697826159e4565b602082019050919050565b6146ab81614fa4565b82525050565b60006146bd8284614128565b915081905092915050565b60006146d4828c614192565b91506146e0828b614192565b91506146ec828a614192565b91506146f88289614192565b91506147048288614192565b91506147108287614192565b915061471c8286614192565b91506147288285614192565b91506147348284614192565b91508190509a9950505050505050505050565b60006147538284614192565b915061475e826143c3565b9150614769826144b8565b915081905092915050565b600061477f826144db565b915061478b82856141c3565b91506147968261458a565b91506147a28284614192565b91506147ad8261442c565b91508190509392505050565b60006147c4826145ad565b91506147d08284614192565b915081905092915050565b60006147e6826145f3565b9150819050919050565b60006020820190506148056000830184614073565b92915050565b60006020820190506148206000830184614055565b92915050565b600060808201905061483b6000830187614073565b6148486020830186614073565b61485560408301856146a2565b818103606083015261486781846140ef565b905095945050505050565b60006040820190506148876000830185614073565b61489460208301846146a2565b9392505050565b60006060820190506148b06000830186614073565b6148bd60208301856146a2565b6148ca60408301846146a2565b949350505050565b600060208201905081810360008301526148ec8184614082565b905092915050565b600060208201905061490960008301846140e0565b92915050565b600060208201905081810360008301526149298184614159565b905092915050565b6000602082019050818103600083015261494a81614242565b9050919050565b6000602082019050818103600083015261496a81614265565b9050919050565b6000602082019050818103600083015261498a81614288565b9050919050565b600060208201905081810360008301526149aa816142ab565b9050919050565b600060208201905081810360008301526149ca816142ce565b9050919050565b600060208201905081810360008301526149ea816142f1565b9050919050565b60006020820190508181036000830152614a0a81614314565b9050919050565b60006020820190508181036000830152614a2a81614337565b9050919050565b60006020820190508181036000830152614a4a8161435a565b9050919050565b60006020820190508181036000830152614a6a8161437d565b9050919050565b60006020820190508181036000830152614a8a816143a0565b9050919050565b60006020820190508181036000830152614aaa816143e6565b9050919050565b60006020820190508181036000830152614aca81614409565b9050919050565b60006020820190508181036000830152614aea8161444f565b9050919050565b60006020820190508181036000830152614b0a81614472565b9050919050565b60006020820190508181036000830152614b2a81614495565b9050919050565b60006020820190508181036000830152614b4a816144fe565b9050919050565b60006020820190508181036000830152614b6a81614521565b9050919050565b60006020820190508181036000830152614b8a81614544565b9050919050565b60006020820190508181036000830152614baa81614567565b9050919050565b60006020820190508181036000830152614bca816145d0565b9050919050565b60006020820190508181036000830152614bea81614616565b9050919050565b60006020820190508181036000830152614c0a81614639565b9050919050565b60006020820190508181036000830152614c2a8161465c565b9050919050565b60006020820190508181036000830152614c4a8161467f565b9050919050565b6000602082019050614c6660008301846146a2565b92915050565b6000614c76614c87565b9050614c828282615022565b919050565b6000604051905090565b600067ffffffffffffffff821115614cac57614cab6151b8565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614cd857614cd76151b8565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614d0457614d036151b8565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614d3057614d2f6151b8565b5b614d398261520a565b9050602081019050919050565b600067ffffffffffffffff821115614d6157614d606151b8565b5b614d6a8261520a565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e1e82614fa4565b9150614e2983614fa4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e5e57614e5d6150cd565b5b828201905092915050565b6000614e7482614fa4565b9150614e7f83614fa4565b925082614e8f57614e8e6150fc565b5b828204905092915050565b6000614ea582614fa4565b9150614eb083614fa4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ee957614ee86150cd565b5b828202905092915050565b6000614eff82614fa4565b9150614f0a83614fa4565b925082821015614f1d57614f1c6150cd565b5b828203905092915050565b6000614f3382614f84565b9050919050565b6000614f4582614f84565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614fdb578082015181840152602081019050614fc0565b83811115614fea576000848401525b50505050565b6000600282049050600182168061500857607f821691505b6020821081141561501c5761501b61512b565b5b50919050565b61502b8261520a565b810181811067ffffffffffffffff8211171561504a576150496151b8565b5b80604052505050565b600061505e82614fa4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615091576150906150cd565b5b600182019050919050565b60006150a782614fa4565b91506150b283614fa4565b9250826150c2576150c16150fc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f676976656e20746f6b656e2076616c756520697320677265617465722074686160008201527f6e2073616c65206c696d69740000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f636f6e74726163745f6d65746164617461000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f7b226e616d65223a2022436f6c6f75722054696d652000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a2022536c6f776c792073686966746960008201527f6e6720636f6c6f7572732c207265636f726473206f662074696d65207061737460208201527f2e204a6f6e617468616e2043686f6d6b6f2c2032303231222c2022696d61676560408201527f223a2022646174613a696d6167652f7376672b786d6c3b6261736536342c0000606082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f6d7573742073656e6420696e20636f727265637420616d6f756e740000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f676976656e20746f6b656e2076616c7565206973206c657373207468616e207360008201527f616c65206c696d69740000000000000000000000000000000000000000000000602082015250565b7f73616c65206d7573742062652061637469766500000000000000000000000000600082015250565b615a1681614f28565b8114615a2157600080fd5b50565b615a2d81614f3a565b8114615a3857600080fd5b50565b615a4481614f4c565b8114615a4f57600080fd5b50565b615a5b81614f58565b8114615a6657600080fd5b50565b615a7281614fa4565b8114615a7d57600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465723c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d22302030203130203130223e20203c726563742077696474683d22313022206865696768743d223130223e3c616e696d6174652069643d226f75746572626f7822206174747269627574654e616d653d2266696c6c222076616c7565733d222220726570656174436f756e743d22696e646566696e697465223e3c2f616e696d6174653e3c2f726563743e3c2f7376673e4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e2220726570656174436f756e743d22696e646566696e697465223e3c2f616e696d6174653e3c2f726563743e3c7265637420783d22322220793d2232222077696474683d223622206865696768743d2236223e3c616e696d6174652069643d22696e6e6572626f7822206174747269627574654e616d653d2266696c6c222076616c7565733d224142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220e0dd01abae1e5fa38df9efe25d08e64558fc79140033410b4685f88acd52dc2764736f6c63430008070033

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

0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000008490b3dfba40b784e3a16974377c70a139306cfa

-----Decoded View---------------
Arg [0] : givenPricePerPiece (uint256): 1000000000000000000
Arg [1] : givenWithdrawalAddress (address): 0x8490b3dFba40B784e3a16974377c70a139306CFA

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [1] : 0000000000000000000000008490b3dfba40b784e3a16974377c70a139306cfa


Deployed Bytecode Sourcemap

61678:6151:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61955:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62954:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66195:277;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48265:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50984:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50514:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66480:608;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49992:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65771:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51874:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63165:257;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;49754:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65544:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52250:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61916:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50280:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62122:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62159:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48021:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49572:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47738:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20471:148;;;;;;;;;;;;;:::i;:::-;;65050:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19820:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65392:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62795:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48434:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65929:120;;;;;;;;;;;;;:::i;:::-;;51277:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52472:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62324:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63450:1592;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62052:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66075:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61882:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49183:150;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51643:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65163:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61762:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20774:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61843:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61955;;;;:::o;62954:199::-;63031:4;63070:26;63055:41;;;:11;:41;;;;:90;;;;63109:36;63133:11;63109:23;:36::i;:::-;63055:90;63048:97;;62954:199;;;:::o;66195:277::-;66263:16;66291:19;66333:5;66327:3;:11;;;;:::i;:::-;66313:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66291:48;;66355:9;66367:5;66355:17;;66350:95;66378:3;66374:1;:7;66350:95;;;66423:10;66431:1;66423:7;:10::i;:::-;66407:2;66414:5;66410:1;:9;;;;:::i;:::-;66407:13;;;;;;;;:::i;:::-;;;;;;;:26;;;;;;;;;;;66383:3;;;;;:::i;:::-;;;;66350:95;;;;66462:2;66455:9;;;66195:277;;;;:::o;48265:100::-;48319:13;48352:5;48345:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48265:100;:::o;50984:221::-;51060:7;51088:16;51096:7;51088;:16::i;:::-;51080:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;51173:15;:24;51189:7;51173:24;;;;;;;;;;;;;;;;;;;;;51166:31;;50984:221;;;:::o;50514:404::-;50595:13;50611:23;50626:7;50611:14;:23::i;:::-;50595:39;;50659:5;50653:11;;:2;:11;;;;50645:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50739:5;50723:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;50748:44;50772:5;50779:12;:10;:12::i;:::-;50748:23;:44::i;:::-;50723:69;50715:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;50889:21;50898:2;50902:7;50889:8;:21::i;:::-;50584:334;50514:404;;:::o;66480:608::-;66544:7;66588:17;;66572:12;:33;;66564:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;66689:17;;66673:12;:33;;66665:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;66771:18;;;;;;;;;;;:43;;;;66807:7;:5;:7::i;:::-;66793:21;;:10;:21;;;66771:43;66763:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;66870:13;;66857:9;:26;66849:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;66928:35;66938:10;66950:12;66928:9;:35::i;:::-;66992:1;66976:12;;:17;;;;;;;:::i;:::-;;;;;;;;67009:41;67014:10;67026:9;67037:12;67009:41;;;;;;;;:::i;:::-;;;;;;;;67068:12;;67061:19;;66480:608;;;:::o;49992:211::-;50053:7;50174:21;:12;:19;:21::i;:::-;50167:28;;49992:211;:::o;65771:150::-;20051:12;:10;:12::i;:::-;20040:23;;:7;:5;:7::i;:::-;:23;;;20032:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65891:22:::1;65871:17;;:42;;;;;;;;;;;;;;;;;;65771:150:::0;:::o;51874:305::-;52035:41;52054:12;:10;:12::i;:::-;52068:7;52035:18;:41::i;:::-;52027:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;52143:28;52153:4;52159:2;52163:7;52143:9;:28::i;:::-;51874:305;;;:::o;63165:257::-;63252:16;63270:21;63304:18;63362:3;63339:19;;63326:10;:32;;;;:::i;:::-;63325:40;;;;:::i;:::-;63304:61;;63384:17;;;;;;;;;;;63403:10;63376:38;;;;;63165:257;;;;;:::o;49754:162::-;49851:7;49878:30;49902:5;49878:13;:20;49892:5;49878:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;49871:37;;49754:162;;;;:::o;65544:201::-;20051:12;:10;:12::i;:::-;20040:23;;:7;:5;:7::i;:::-;:23;;;20032:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65630:9:::1;65626:112;65649:9;:16;65645:1;:20;65626:112;;;65714:9;65724:1;65714:12;;;;;;;;:::i;:::-;;;;;;;;65696;:15;65709:1;65696:15;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;65667:4;;;;;:::i;:::-;;;;65626:112;;;;65544:201:::0;:::o;52250:151::-;52354:39;52371:4;52377:2;52381:7;52354:39;;;;;;;;;;;;:16;:39::i;:::-;52250:151;;;:::o;61916:32::-;;;;:::o;50280:172::-;50355:7;50376:15;50397:22;50413:5;50397:12;:15;;:22;;;;:::i;:::-;50375:44;;;50437:7;50430:14;;;50280:172;;;:::o;62122:30::-;;;;;;;;;;;;;:::o;62159:28::-;;;;:::o;48021:177::-;48093:7;48120:70;48137:7;48120:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;48113:77;;48021:177;;;:::o;49572:97::-;49620:13;49653:8;49646:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49572:97;:::o;47738:221::-;47810:7;47855:1;47838:19;;:5;:19;;;;47830:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;47922:29;:13;:20;47936:5;47922:20;;;;;;;;;;;;;;;:27;:29::i;:::-;47915:36;;47738:221;;;:::o;20471:148::-;20051:12;:10;:12::i;:::-;20040:23;;:7;:5;:7::i;:::-;:23;;;20032:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20578:1:::1;20541:40;;20562:6;;;;;;;;;;;20541:40;;;;;;;;;;;;20609:1;20592:6;;:19;;;;;;;;;;;;;;;;;;20471:148::o:0;65050:105::-;20051:12;:10;:12::i;:::-;20040:23;;:7;:5;:7::i;:::-;:23;;;20032:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65139:8:::1;65118:18;;:29;;;;;;;;;;;;;;;;;;65050:105:::0;:::o;19820:87::-;19866:7;19893:6;;;;;;;;;;;19886:13;;19820:87;:::o;65392:102::-;20051:12;:10;:12::i;:::-;20040:23;;:7;:5;:7::i;:::-;:23;;;20032:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65476:10:::1;65460:13;:26;;;;65392:102:::0;:::o;62795:151::-;20051:12;:10;:12::i;:::-;20040:23;;:7;:5;:7::i;:::-;:23;;;20032:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62914:24:::1;62892:19;:46;;;;62795:151:::0;:::o;48434:104::-;48490:13;48523:7;48516:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48434:104;:::o;65929:120::-;20051:12;:10;:12::i;:::-;20040:23;;:7;:5;:7::i;:::-;:23;;;20032:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65982:59:::1;66000:17;;;;;;;;;;;66019:21;65982:17;:59::i;:::-;65929:120::o:0;51277:295::-;51392:12;:10;:12::i;:::-;51380:24;;:8;:24;;;;51372:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;51492:8;51447:18;:32;51466:12;:10;:12::i;:::-;51447:32;;;;;;;;;;;;;;;:42;51480:8;51447:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;51545:8;51516:48;;51531:12;:10;:12::i;:::-;51516:48;;;51555:8;51516:48;;;;;;:::i;:::-;;;;;;;;51277:295;;:::o;52472:285::-;52604:41;52623:12;:10;:12::i;:::-;52637:7;52604:18;:41::i;:::-;52596:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;52710:39;52724:4;52730:2;52734:7;52743:5;52710:13;:39::i;:::-;52472:285;;;;:::o;62324:50::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63450:1592::-;63515:13;63566:16;63574:7;63566;:16::i;:::-;:42;;;;63601:7;:5;:7::i;:::-;63587:21;;:10;:21;;;63566:42;63558:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;63675:22;;:::i;:::-;63712:192;;;;;;;;;;;;;;;;;:5;63718:1;63712:8;;;;;;;:::i;:::-;;;;;:192;;;;63930:12;:21;63943:7;63930:21;;;;;;;;;;;:29;;63960:1;63930:32;;;;;;;;:::i;:::-;;;;;;;;;63919:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;63925:1;63919:8;;;;;;;:::i;:::-;;;;;:43;;;;63977:20;;;;;;;;;;;;;;;;;:5;63983:1;63977:8;;;;;;;:::i;:::-;;;;;:20;;;;64023:41;64032:12;:21;64045:7;64032:21;;;;;;;;;;;:28;;64061:1;64032:31;;;;;;;;:::i;:::-;;;;;;;;;;64023:8;:41::i;:::-;64012:5;64018:1;64012:8;;;;;;;:::i;:::-;;;;;:52;;;;64079:148;;;;;;;;;;;;;;;;;:5;64085:1;64079:8;;;;;;;:::i;:::-;;;;;:148;;;;64253:12;:21;64266:7;64253:21;;;;;;;;;;;:29;;64283:1;64253:32;;;;;;;;:::i;:::-;;;;;;;;;64242:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;64248:1;64242:8;;;;;;;:::i;:::-;;;;;:43;;;;64300:20;;;;;;;;;;;;;;;;;:5;64306:1;64300:8;;;;;;;:::i;:::-;;;;;:20;;;;64346:41;64355:12;:21;64368:7;64355:21;;;;;;;;;;;:28;;64384:1;64355:31;;;;;;;;:::i;:::-;;;;;;;;;;64346:8;:41::i;:::-;64335:5;64341:1;64335:8;;;;;;;:::i;:::-;;;;;:52;;;;64402:63;;;;;;;;;;;;;;;;;:5;64408:1;64402:8;;;;;;;:::i;:::-;;;;;:63;;;;64482:20;64529:5;64535:1;64529:8;;;;;;;:::i;:::-;;;;;;64539:5;64545:1;64539:8;;;;;;;:::i;:::-;;;;;;64549:5;64555:1;64549:8;;;;;;;:::i;:::-;;;;;;64559:5;64565:1;64559:8;;;;;;;:::i;:::-;;;;;;64569:5;64575:1;64569:8;;;;;;;:::i;:::-;;;;;;64579:5;64585:1;64579:8;;;;;;;:::i;:::-;;;;;;64589:5;64595:1;64589:8;;;;;;;:::i;:::-;;;;;;64598:5;64604:1;64598:8;;;;;;;:::i;:::-;;;;;;64608:5;64614:1;64608:8;;;;;;;:::i;:::-;;;;;;64512:105;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64482:136;;64633:18;64654:265;64724:12;:21;64737:7;64724:21;;;;;;;;;;;:27;;64882:28;64902:6;64882:13;:28::i;:::-;64681:235;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64654:13;:265::i;:::-;64633:286;;65000:4;64950:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;64934:72;;65028:6;65021:13;;;;;63450:1592;;;:::o;62052:39::-;;;;:::o;66075:112::-;66134:7;66162:16;66170:7;66162;:16::i;:::-;66154:25;;66075:112;;;:::o;61882:27::-;;;;:::o;49183:150::-;49227:13;49284:9;:7;:9::i;:::-;49267:57;;;;;;;;:::i;:::-;;;;;;;;;;;;;49253:72;;49183:150;:::o;51643:164::-;51740:4;51764:18;:25;51783:5;51764:25;;;;;;;;;;;;;;;:35;51790:8;51764:35;;;;;;;;;;;;;;;;;;;;;;;;;51757:42;;51643:164;;;;:::o;65163:221::-;20051:12;:10;:12::i;:::-;20040:23;;:7;:5;:7::i;:::-;:23;;;20032:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65300:22:::1;65280:17;:42;;;;65354:22;65334:17;:42;;;;65163:221:::0;;:::o;61762:40::-;;;;;;;;;;;;;:::o;20774:244::-;20051:12;:10;:12::i;:::-;20040:23;;:7;:5;:7::i;:::-;:23;;;20032:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20883:1:::1;20863:22;;:8;:22;;;;20855:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20973:8;20944:38;;20965:6;;;;;;;;;;;20944:38;;;;;;;;;;;;21002:8;20993:6;;:17;;;;;;;;;;;;;;;;;;20774:244:::0;:::o;61843:32::-;;;;:::o;30202:150::-;30287:4;30311:20;:33;30332:11;30311:33;;;;;;;;;;;;;;;;;;;;;;;;;;;30304:40;;30202:150;;;:::o;54224:127::-;54289:4;54313:30;54335:7;54313:12;:21;;:30;;;;:::i;:::-;54306:37;;54224:127;;;:::o;18445:98::-;18498:7;18525:10;18518:17;;18445:98;:::o;60152:183::-;60245:2;60218:15;:24;60234:7;60218:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;60301:7;60297:2;60263:46;;60272:23;60287:7;60272:14;:23::i;:::-;60263:46;;;;;;;;;;;;60152:183;;:::o;55216:110::-;55292:26;55302:2;55306:7;55292:26;;;;;;;;;;;;:9;:26::i;:::-;55216:110;;:::o;40032:123::-;40101:7;40128:19;40136:3;:10;;40128:7;:19::i;:::-;40121:26;;40032:123;;;:::o;54518:355::-;54611:4;54636:16;54644:7;54636;:16::i;:::-;54628:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54712:13;54728:23;54743:7;54728:14;:23::i;:::-;54712:39;;54781:5;54770:16;;:7;:16;;;:51;;;;54814:7;54790:31;;:20;54802:7;54790:11;:20::i;:::-;:31;;;54770:51;:94;;;;54825:39;54849:5;54856:7;54825:23;:39::i;:::-;54770:94;54762:103;;;54518:355;;;;:::o;57663:599::-;57788:4;57761:31;;:23;57776:7;57761:14;:23::i;:::-;:31;;;57753:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;57889:1;57875:16;;:2;:16;;;;57867:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;57945:39;57966:4;57972:2;57976:7;57945:20;:39::i;:::-;58049:29;58066:1;58070:7;58049:8;:29::i;:::-;58091:35;58118:7;58091:13;:19;58105:4;58091:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;58137:30;58159:7;58137:13;:17;58151:2;58137:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;58180:29;58197:7;58206:2;58180:12;:16;;:29;;;;;:::i;:::-;;58246:7;58242:2;58227:27;;58236:4;58227:27;;;;;;;;;;;;57663:599;;;:::o;9643:137::-;9714:7;9749:22;9753:3;:10;;9765:5;9749:3;:22::i;:::-;9741:31;;9734:38;;9643:137;;;;:::o;40494:236::-;40574:7;40583;40604:11;40617:13;40634:22;40638:3;:10;;40650:5;40634:3;:22::i;:::-;40603:53;;;;40683:3;40675:12;;40713:5;40705:14;;40667:55;;;;;;40494:236;;;;;:::o;41780:213::-;41887:7;41938:44;41943:3;:10;;41963:3;41955:12;;41969;41938:4;:44::i;:::-;41930:53;;41907:78;;41780:213;;;;;:::o;9186:114::-;9246:7;9273:19;9281:3;:10;;9273:7;:19::i;:::-;9266:26;;9186:114;;;:::o;11913:397::-;12028:6;12003:21;:31;;11995:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12160:12;12178:9;:14;;12201:6;12178:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12159:54;;;12232:7;12224:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;11984:326;11913:397;;:::o;53639:272::-;53753:28;53763:4;53769:2;53773:7;53753:9;:28::i;:::-;53800:48;53823:4;53829:2;53833:7;53842:5;53800:22;:48::i;:::-;53792:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;53639:272;;;;:::o;67111:715::-;67167:13;67389:1;67380:5;:10;67376:53;;;67407:10;;;;;;;;;;;;;;;;;;;;;67376:53;67439:12;67454:5;67439:20;;67470:14;67495:78;67510:1;67502:4;:9;67495:78;;67528:8;;;;;:::i;:::-;;;;67559:2;67551:10;;;;;:::i;:::-;;;67495:78;;;67583:19;67615:6;67605:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67583:39;;67633:154;67649:1;67640:5;:10;67633:154;;67677:1;67667:11;;;;;:::i;:::-;;;67744:2;67736:5;:10;;;;:::i;:::-;67723:2;:24;;;;:::i;:::-;67710:39;;67693:6;67700;67693:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;67773:2;67764:11;;;;;:::i;:::-;;;67633:154;;;67811:6;67797:21;;;;;67111:715;;;;:::o;68182:1607::-;68240:13;68266:11;68280:4;:11;68266:25;;68313:1;68306:3;:8;68302:23;;;68316:9;;;;;;;;;;;;;;;;;68302:23;68377:18;68415:1;68410;68404:3;:7;;;;:::i;:::-;68403:13;;;;:::i;:::-;68398:1;:19;;;;:::i;:::-;68377:40;;68475:19;68520:2;68507:10;:15;;;;:::i;:::-;68497:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68475:48;;68536:18;68557:5;;;;;;;;;;;;;;;;;68536:26;;68626:1;68619:5;68615:13;68671:2;68663:6;68659:15;68722:1;68690:777;68745:3;68742:1;68739:10;68690:777;;;68800:1;68797;68793:9;68788:14;;68858:8;68853:1;68847:4;68843:12;68837:19;68833:34;68938:4;68930:5;68926:2;68922:14;68918:25;68908:8;68904:40;68898:47;68977:3;68974:1;68970:11;68963:18;;69068:4;69059;69051:5;69047:2;69043:14;69039:25;69029:8;69025:40;69019:47;69015:58;69010:3;69006:68;68999:75;;69106:3;69103:1;69099:11;69092:18;;69196:4;69187;69179:5;69176:1;69172:13;69168:24;69158:8;69154:39;69148:46;69144:57;69139:3;69135:67;69128:74;;69234:3;69231:1;69227:11;69220:18;;69316:4;69307;69300:5;69296:16;69286:8;69282:31;69276:38;69272:49;69267:3;69263:59;69256:66;;69356:3;69351;69347:13;69340:20;;69398:3;69387:9;69380:22;69450:1;69439:9;69435:17;69422:30;;68769:698;;68690:777;;;68694:44;69499:1;69494:3;69490:11;69520:1;69515:84;;;;69618:1;69613:82;;;;69483:212;;69515:84;69576:6;69571:3;69567:16;69563:1;69552:9;69548:17;69541:43;69515:84;;69613:82;69674:4;69669:3;69665:14;69661:1;69650:9;69646:17;69639:41;69483:212;;69726:10;69718:6;69711:26;68584:1164;;69774:6;69760:21;;;;;;68182:1607;;;;:::o;39793:151::-;39877:4;39901:35;39911:3;:10;;39931:3;39923:12;;39901:9;:35::i;:::-;39894:42;;39793:151;;;;:::o;55553:250::-;55649:18;55655:2;55659:7;55649:5;:18::i;:::-;55686:54;55717:1;55721:2;55725:7;55734:5;55686:22;:54::i;:::-;55678:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;55553:250;;;:::o;36611:110::-;36667:7;36694:3;:12;;:19;;;;36687:26;;36611:110;;;:::o;60948:93::-;;;;:::o;8731:137::-;8801:4;8825:35;8833:3;:10;;8853:5;8845:14;;8825:7;:35::i;:::-;8818:42;;8731:137;;;;:::o;8424:131::-;8491:4;8515:32;8520:3;:10;;8540:5;8532:14;;8515:4;:32::i;:::-;8508:39;;8424:131;;;;:::o;39216:185::-;39305:4;39329:64;39334:3;:10;;39354:3;39346:12;;39384:5;39368:23;;39360:32;;39329:4;:64::i;:::-;39322:71;;39216:185;;;;;:::o;4684:204::-;4751:7;4800:5;4779:3;:11;;:18;;;;:26;4771:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4862:3;:11;;4874:5;4862:18;;;;;;;;:::i;:::-;;;;;;;;;;4855:25;;4684:204;;;;:::o;37076:279::-;37143:7;37152;37202:5;37180:3;:12;;:19;;;;:27;37172:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;37259:22;37284:3;:12;;37297:5;37284:19;;;;;;;;:::i;:::-;;;;;;;;;;;;37259:44;;37322:5;:10;;;37334:5;:12;;;37314:33;;;;;37076:279;;;;;:::o;38573:319::-;38667:7;38687:16;38706:3;:12;;:17;38719:3;38706:17;;;;;;;;;;;;38687:36;;38754:1;38742:8;:13;;38757:12;38734:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;38824:3;:12;;38848:1;38837:8;:12;;;;:::i;:::-;38824:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:33;;;38817:40;;;38573:319;;;;;:::o;4232:109::-;4288:7;4315:3;:11;;:18;;;;4308:25;;4232:109;;;:::o;59540:604::-;59661:4;59688:15;:2;:13;;;:15::i;:::-;59683:60;;59727:4;59720:11;;;;59683:60;59753:23;59779:252;59832:45;;;59892:12;:10;:12::i;:::-;59919:4;59938:7;59960:5;59795:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59779:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;59753:278;;60042:13;60069:10;60058:32;;;;;;;;;;;;:::i;:::-;60042:48;;44708:10;60119:16;;60109:26;;;:6;:26;;;;60101:35;;;;59540:604;;;;;;;:::o;36391:125::-;36462:4;36507:1;36486:3;:12;;:17;36499:3;36486:17;;;;;;;;;;;;:22;;36479:29;;36391:125;;;;:::o;56139:404::-;56233:1;56219:16;;:2;:16;;;;56211:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;56292:16;56300:7;56292;:16::i;:::-;56291:17;56283:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;56354:45;56383:1;56387:2;56391:7;56354:20;:45::i;:::-;56412:30;56434:7;56412:13;:17;56426:2;56412:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;56455:29;56472:7;56481:2;56455:12;:16;;:29;;;;;:::i;:::-;;56527:7;56523:2;56502:33;;56519:1;56502:33;;;;;;;;;;;;56139:404;;:::o;2387:1544::-;2453:4;2571:18;2592:3;:12;;:19;2605:5;2592:19;;;;;;;;;;;;2571:40;;2642:1;2628:10;:15;2624:1300;;2990:21;3027:1;3014:10;:14;;;;:::i;:::-;2990:38;;3043:17;3084:1;3063:3;:11;;:18;;;;:22;;;;:::i;:::-;3043:42;;3330:17;3350:3;:11;;3362:9;3350:22;;;;;;;;:::i;:::-;;;;;;;;;;3330:42;;3496:9;3467:3;:11;;3479:13;3467:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;3615:1;3599:13;:17;;;;:::i;:::-;3573:3;:12;;:23;3586:9;3573:23;;;;;;;;;;;:43;;;;3725:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3820:3;:12;;:19;3833:5;3820:19;;;;;;;;;;;3813:26;;;3863:4;3856:11;;;;;;;;2624:1300;3907:5;3900:12;;;2387:1544;;;;;:::o;1797:414::-;1860:4;1882:21;1892:3;1897:5;1882:9;:21::i;:::-;1877:327;;1920:3;:11;;1937:5;1920:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2103:3;:11;;:18;;;;2081:3;:12;;:19;2094:5;2081:19;;;;;;;;;;;:40;;;;2143:4;2136:11;;;;1877:327;2187:5;2180:12;;1797:414;;;;;:::o;33891:692::-;33967:4;34083:16;34102:3;:12;;:17;34115:3;34102:17;;;;;;;;;;;;34083:36;;34148:1;34136:8;:13;34132:444;;;34203:3;:12;;34221:38;;;;;;;;34238:3;34221:38;;;;34251:5;34221:38;;;34203:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34418:3;:12;;:19;;;;34398:3;:12;;:17;34411:3;34398:17;;;;;;;;;;;:39;;;;34459:4;34452:11;;;;;34132:444;34532:5;34496:3;:12;;34520:1;34509:8;:12;;;;:::i;:::-;34496:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:33;;:41;;;;34559:5;34552:12;;;33891:692;;;;;;:::o;10556:422::-;10616:4;10824:12;10935:7;10923:20;10915:28;;10969:1;10962:4;:8;10955:15;;;10556:422;;;:::o;13474:195::-;13577:12;13609:52;13631:6;13639:4;13645:1;13648:12;13609:21;:52::i;:::-;13602:59;;13474:195;;;;;:::o;4017:129::-;4090:4;4137:1;4114:3;:12;;:19;4127:5;4114:19;;;;;;;;;;;;:24;;4107:31;;4017:129;;;;:::o;14526:530::-;14653:12;14711:5;14686:21;:30;;14678:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;14778:18;14789:6;14778:10;:18::i;:::-;14770:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;14904:12;14918:23;14945:6;:11;;14965:5;14973:4;14945:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14903:75;;;;14996:52;15014:7;15023:10;15035:12;14996:17;:52::i;:::-;14989:59;;;;14526:530;;;;;;:::o;17066:742::-;17181:12;17210:7;17206:595;;;17241:10;17234:17;;;;17206:595;17375:1;17355:10;:17;:21;17351:439;;;17618:10;17612:17;17679:15;17666:10;17662:2;17658:19;17651:44;17351:439;17761:12;17754:20;;;;;;;;;;;:::i;:::-;;;;;;;;17066:742;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;23:957:1:-;129:5;154:91;170:74;237:6;170:74;:::i;:::-;154:91;:::i;:::-;145:100;;265:5;294:6;287:5;280:21;328:4;321:5;317:16;310:23;;354:6;404:3;396:4;388:6;384:17;379:3;375:27;372:36;369:143;;;423:79;;:::i;:::-;369:143;536:1;521:453;546:6;543:1;540:13;521:453;;;628:3;615:17;664:18;651:11;648:35;645:122;;;686:79;;:::i;:::-;645:122;810:11;802:6;798:24;848:47;891:3;879:10;848:47;:::i;:::-;843:3;836:60;925:4;920:3;916:14;909:21;;959:4;954:3;950:14;943:21;;581:393;;568:1;565;561:9;556:14;;521:453;;;525:14;135:845;;23:957;;;;;:::o;1026:1008::-;1149:5;1174:108;1190:91;1274:6;1190:91;:::i;:::-;1174:108;:::i;:::-;1165:117;;1302:5;1331:6;1324:5;1317:21;1365:4;1358:5;1354:16;1347:23;;1391:6;1441:3;1433:4;1425:6;1421:17;1416:3;1412:27;1409:36;1406:143;;;1460:79;;:::i;:::-;1406:143;1573:1;1558:470;1583:6;1580:1;1577:13;1558:470;;;1665:3;1652:17;1701:18;1688:11;1685:35;1682:122;;;1723:79;;:::i;:::-;1682:122;1847:11;1839:6;1835:24;1885:64;1945:3;1933:10;1885:64;:::i;:::-;1880:3;1873:77;1979:4;1974:3;1970:14;1963:21;;2013:4;2008:3;2004:14;1997:21;;1618:410;;1605:1;1602;1598:9;1593:14;;1558:470;;;1562:14;1155:879;;1026:1008;;;;;:::o;2057:722::-;2153:5;2178:81;2194:64;2251:6;2194:64;:::i;:::-;2178:81;:::i;:::-;2169:90;;2279:5;2308:6;2301:5;2294:21;2342:4;2335:5;2331:16;2324:23;;2368:6;2418:3;2410:4;2402:6;2398:17;2393:3;2389:27;2386:36;2383:143;;;2437:79;;:::i;:::-;2383:143;2550:1;2535:238;2560:6;2557:1;2554:13;2535:238;;;2628:3;2657:37;2690:3;2678:10;2657:37;:::i;:::-;2652:3;2645:50;2724:4;2719:3;2715:14;2708:21;;2758:4;2753:3;2749:14;2742:21;;2595:178;2582:1;2579;2575:9;2570:14;;2535:238;;;2539:14;2159:620;;2057:722;;;;;:::o;2785:410::-;2862:5;2887:65;2903:48;2944:6;2903:48;:::i;:::-;2887:65;:::i;:::-;2878:74;;2975:6;2968:5;2961:21;3013:4;3006:5;3002:16;3051:3;3042:6;3037:3;3033:16;3030:25;3027:112;;;3058:79;;:::i;:::-;3027:112;3148:41;3182:6;3177:3;3172;3148:41;:::i;:::-;2868:327;2785:410;;;;;:::o;3201:412::-;3279:5;3304:66;3320:49;3362:6;3320:49;:::i;:::-;3304:66;:::i;:::-;3295:75;;3393:6;3386:5;3379:21;3431:4;3424:5;3420:16;3469:3;3460:6;3455:3;3451:16;3448:25;3445:112;;;3476:79;;:::i;:::-;3445:112;3566:41;3600:6;3595:3;3590;3566:41;:::i;:::-;3285:328;3201:412;;;;;:::o;3619:139::-;3665:5;3703:6;3690:20;3681:29;;3719:33;3746:5;3719:33;:::i;:::-;3619:139;;;;:::o;3764:155::-;3818:5;3856:6;3843:20;3834:29;;3872:41;3907:5;3872:41;:::i;:::-;3764:155;;;;:::o;3941:390::-;4022:5;4071:3;4064:4;4056:6;4052:17;4048:27;4038:122;;4079:79;;:::i;:::-;4038:122;4196:6;4183:20;4221:104;4321:3;4313:6;4306:4;4298:6;4294:17;4221:104;:::i;:::-;4212:113;;4028:303;3941:390;;;;:::o;4377:424::-;4475:5;4524:3;4517:4;4509:6;4505:17;4501:27;4491:122;;4532:79;;:::i;:::-;4491:122;4649:6;4636:20;4674:121;4791:3;4783:6;4776:4;4768:6;4764:17;4674:121;:::i;:::-;4665:130;;4481:320;4377:424;;;;:::o;4824:370::-;4895:5;4944:3;4937:4;4929:6;4925:17;4921:27;4911:122;;4952:79;;:::i;:::-;4911:122;5069:6;5056:20;5094:94;5184:3;5176:6;5169:4;5161:6;5157:17;5094:94;:::i;:::-;5085:103;;4901:293;4824:370;;;;:::o;5200:133::-;5243:5;5281:6;5268:20;5259:29;;5297:30;5321:5;5297:30;:::i;:::-;5200:133;;;;:::o;5339:137::-;5384:5;5422:6;5409:20;5400:29;;5438:32;5464:5;5438:32;:::i;:::-;5339:137;;;;:::o;5482:141::-;5538:5;5569:6;5563:13;5554:22;;5585:32;5611:5;5585:32;:::i;:::-;5482:141;;;;:::o;5642:338::-;5697:5;5746:3;5739:4;5731:6;5727:17;5723:27;5713:122;;5754:79;;:::i;:::-;5713:122;5871:6;5858:20;5896:78;5970:3;5962:6;5955:4;5947:6;5943:17;5896:78;:::i;:::-;5887:87;;5703:277;5642:338;;;;:::o;6000:340::-;6056:5;6105:3;6098:4;6090:6;6086:17;6082:27;6072:122;;6113:79;;:::i;:::-;6072:122;6230:6;6217:20;6255:79;6330:3;6322:6;6315:4;6307:6;6303:17;6255:79;:::i;:::-;6246:88;;6062:278;6000:340;;;;:::o;6384:1293::-;6460:5;6504:4;6492:9;6487:3;6483:19;6479:30;6476:117;;;6512:79;;:::i;:::-;6476:117;6611:21;6627:4;6611:21;:::i;:::-;6602:30;;6722:1;6711:9;6707:17;6694:31;6752:18;6744:6;6741:30;6738:117;;;6774:79;;:::i;:::-;6738:117;6894:84;6974:3;6965:6;6954:9;6950:22;6894:84;:::i;:::-;6887:4;6880:5;6876:16;6869:110;6642:348;7079:2;7068:9;7064:18;7051:32;7110:18;7102:6;7099:30;7096:117;;;7132:79;;:::i;:::-;7096:117;7252:74;7322:3;7313:6;7302:9;7298:22;7252:74;:::i;:::-;7245:4;7238:5;7234:16;7227:100;7000:338;7426:2;7415:9;7411:18;7398:32;7457:18;7449:6;7446:30;7443:117;;;7479:79;;:::i;:::-;7443:117;7599:59;7654:3;7645:6;7634:9;7630:22;7599:59;:::i;:::-;7592:4;7585:5;7581:16;7574:85;7348:322;6384:1293;;;;:::o;7683:139::-;7729:5;7767:6;7754:20;7745:29;;7783:33;7810:5;7783:33;:::i;:::-;7683:139;;;;:::o;7828:329::-;7887:6;7936:2;7924:9;7915:7;7911:23;7907:32;7904:119;;;7942:79;;:::i;:::-;7904:119;8062:1;8087:53;8132:7;8123:6;8112:9;8108:22;8087:53;:::i;:::-;8077:63;;8033:117;7828:329;;;;:::o;8163:345::-;8230:6;8279:2;8267:9;8258:7;8254:23;8250:32;8247:119;;;8285:79;;:::i;:::-;8247:119;8405:1;8430:61;8483:7;8474:6;8463:9;8459:22;8430:61;:::i;:::-;8420:71;;8376:125;8163:345;;;;:::o;8514:474::-;8582:6;8590;8639:2;8627:9;8618:7;8614:23;8610:32;8607:119;;;8645:79;;:::i;:::-;8607:119;8765:1;8790:53;8835:7;8826:6;8815:9;8811:22;8790:53;:::i;:::-;8780:63;;8736:117;8892:2;8918:53;8963:7;8954:6;8943:9;8939:22;8918:53;:::i;:::-;8908:63;;8863:118;8514:474;;;;;:::o;8994:619::-;9071:6;9079;9087;9136:2;9124:9;9115:7;9111:23;9107:32;9104:119;;;9142:79;;:::i;:::-;9104:119;9262:1;9287:53;9332:7;9323:6;9312:9;9308:22;9287:53;:::i;:::-;9277:63;;9233:117;9389:2;9415:53;9460:7;9451:6;9440:9;9436:22;9415:53;:::i;:::-;9405:63;;9360:118;9517:2;9543:53;9588:7;9579:6;9568:9;9564:22;9543:53;:::i;:::-;9533:63;;9488:118;8994:619;;;;;:::o;9619:943::-;9714:6;9722;9730;9738;9787:3;9775:9;9766:7;9762:23;9758:33;9755:120;;;9794:79;;:::i;:::-;9755:120;9914:1;9939:53;9984:7;9975:6;9964:9;9960:22;9939:53;:::i;:::-;9929:63;;9885:117;10041:2;10067:53;10112:7;10103:6;10092:9;10088:22;10067:53;:::i;:::-;10057:63;;10012:118;10169:2;10195:53;10240:7;10231:6;10220:9;10216:22;10195:53;:::i;:::-;10185:63;;10140:118;10325:2;10314:9;10310:18;10297:32;10356:18;10348:6;10345:30;10342:117;;;10378:79;;:::i;:::-;10342:117;10483:62;10537:7;10528:6;10517:9;10513:22;10483:62;:::i;:::-;10473:72;;10268:287;9619:943;;;;;;;:::o;10568:468::-;10633:6;10641;10690:2;10678:9;10669:7;10665:23;10661:32;10658:119;;;10696:79;;:::i;:::-;10658:119;10816:1;10841:53;10886:7;10877:6;10866:9;10862:22;10841:53;:::i;:::-;10831:63;;10787:117;10943:2;10969:50;11011:7;11002:6;10991:9;10987:22;10969:50;:::i;:::-;10959:60;;10914:115;10568:468;;;;;:::o;11042:474::-;11110:6;11118;11167:2;11155:9;11146:7;11142:23;11138:32;11135:119;;;11173:79;;:::i;:::-;11135:119;11293:1;11318:53;11363:7;11354:6;11343:9;11339:22;11318:53;:::i;:::-;11308:63;;11264:117;11420:2;11446:53;11491:7;11482:6;11471:9;11467:22;11446:53;:::i;:::-;11436:63;;11391:118;11042:474;;;;;:::o;11522:593::-;11633:6;11682:2;11670:9;11661:7;11657:23;11653:32;11650:119;;;11688:79;;:::i;:::-;11650:119;11836:1;11825:9;11821:17;11808:31;11866:18;11858:6;11855:30;11852:117;;;11888:79;;:::i;:::-;11852:117;11993:105;12090:7;12081:6;12070:9;12066:22;11993:105;:::i;:::-;11983:115;;11779:329;11522:593;;;;:::o;12121:323::-;12177:6;12226:2;12214:9;12205:7;12201:23;12197:32;12194:119;;;12232:79;;:::i;:::-;12194:119;12352:1;12377:50;12419:7;12410:6;12399:9;12395:22;12377:50;:::i;:::-;12367:60;;12323:114;12121:323;;;;:::o;12450:327::-;12508:6;12557:2;12545:9;12536:7;12532:23;12528:32;12525:119;;;12563:79;;:::i;:::-;12525:119;12683:1;12708:52;12752:7;12743:6;12732:9;12728:22;12708:52;:::i;:::-;12698:62;;12654:116;12450:327;;;;:::o;12783:349::-;12852:6;12901:2;12889:9;12880:7;12876:23;12872:32;12869:119;;;12907:79;;:::i;:::-;12869:119;13027:1;13052:63;13107:7;13098:6;13087:9;13083:22;13052:63;:::i;:::-;13042:73;;12998:127;12783:349;;;;:::o;13138:329::-;13197:6;13246:2;13234:9;13225:7;13221:23;13217:32;13214:119;;;13252:79;;:::i;:::-;13214:119;13372:1;13397:53;13442:7;13433:6;13422:9;13418:22;13397:53;:::i;:::-;13387:63;;13343:117;13138:329;;;;:::o;13473:474::-;13541:6;13549;13598:2;13586:9;13577:7;13573:23;13569:32;13566:119;;;13604:79;;:::i;:::-;13566:119;13724:1;13749:53;13794:7;13785:6;13774:9;13770:22;13749:53;:::i;:::-;13739:63;;13695:117;13851:2;13877:53;13922:7;13913:6;13902:9;13898:22;13877:53;:::i;:::-;13867:63;;13822:118;13473:474;;;;;:::o;13953:179::-;14022:10;14043:46;14085:3;14077:6;14043:46;:::i;:::-;14121:4;14116:3;14112:14;14098:28;;13953:179;;;;:::o;14138:142::-;14241:32;14267:5;14241:32;:::i;:::-;14236:3;14229:45;14138:142;;:::o;14286:108::-;14363:24;14381:5;14363:24;:::i;:::-;14358:3;14351:37;14286:108;;:::o;14400:118::-;14487:24;14505:5;14487:24;:::i;:::-;14482:3;14475:37;14400:118;;:::o;14554:732::-;14673:3;14702:54;14750:5;14702:54;:::i;:::-;14772:86;14851:6;14846:3;14772:86;:::i;:::-;14765:93;;14882:56;14932:5;14882:56;:::i;:::-;14961:7;14992:1;14977:284;15002:6;14999:1;14996:13;14977:284;;;15078:6;15072:13;15105:63;15164:3;15149:13;15105:63;:::i;:::-;15098:70;;15191:60;15244:6;15191:60;:::i;:::-;15181:70;;15037:224;15024:1;15021;15017:9;15012:14;;14977:284;;;14981:14;15277:3;15270:10;;14678:608;;;14554:732;;;;:::o;15292:109::-;15373:21;15388:5;15373:21;:::i;:::-;15368:3;15361:34;15292:109;;:::o;15407:360::-;15493:3;15521:38;15553:5;15521:38;:::i;:::-;15575:70;15638:6;15633:3;15575:70;:::i;:::-;15568:77;;15654:52;15699:6;15694:3;15687:4;15680:5;15676:16;15654:52;:::i;:::-;15731:29;15753:6;15731:29;:::i;:::-;15726:3;15722:39;15715:46;;15497:270;15407:360;;;;:::o;15773:373::-;15877:3;15905:38;15937:5;15905:38;:::i;:::-;15959:88;16040:6;16035:3;15959:88;:::i;:::-;15952:95;;16056:52;16101:6;16096:3;16089:4;16082:5;16078:16;16056:52;:::i;:::-;16133:6;16128:3;16124:16;16117:23;;15881:265;15773:373;;;;:::o;16152:364::-;16240:3;16268:39;16301:5;16268:39;:::i;:::-;16323:71;16387:6;16382:3;16323:71;:::i;:::-;16316:78;;16403:52;16448:6;16443:3;16436:4;16429:5;16425:16;16403:52;:::i;:::-;16480:29;16502:6;16480:29;:::i;:::-;16475:3;16471:39;16464:46;;16244:272;16152:364;;;;:::o;16522:377::-;16628:3;16656:39;16689:5;16656:39;:::i;:::-;16711:89;16793:6;16788:3;16711:89;:::i;:::-;16704:96;;16809:52;16854:6;16849:3;16842:4;16835:5;16831:16;16809:52;:::i;:::-;16886:6;16881:3;16877:16;16870:23;;16632:267;16522:377;;;;:::o;16929:845::-;17032:3;17069:5;17063:12;17098:36;17124:9;17098:36;:::i;:::-;17150:89;17232:6;17227:3;17150:89;:::i;:::-;17143:96;;17270:1;17259:9;17255:17;17286:1;17281:137;;;;17432:1;17427:341;;;;17248:520;;17281:137;17365:4;17361:9;17350;17346:25;17341:3;17334:38;17401:6;17396:3;17392:16;17385:23;;17281:137;;17427:341;17494:38;17526:5;17494:38;:::i;:::-;17554:1;17568:154;17582:6;17579:1;17576:13;17568:154;;;17656:7;17650:14;17646:1;17641:3;17637:11;17630:35;17706:1;17697:7;17693:15;17682:26;;17604:4;17601:1;17597:12;17592:17;;17568:154;;;17751:6;17746:3;17742:16;17735:23;;17434:334;;17248:520;;17036:738;;16929:845;;;;:::o;17780:366::-;17922:3;17943:67;18007:2;18002:3;17943:67;:::i;:::-;17936:74;;18019:93;18108:3;18019:93;:::i;:::-;18137:2;18132:3;18128:12;18121:19;;17780:366;;;:::o;18152:::-;18294:3;18315:67;18379:2;18374:3;18315:67;:::i;:::-;18308:74;;18391:93;18480:3;18391:93;:::i;:::-;18509:2;18504:3;18500:12;18493:19;;18152:366;;;:::o;18524:::-;18666:3;18687:67;18751:2;18746:3;18687:67;:::i;:::-;18680:74;;18763:93;18852:3;18763:93;:::i;:::-;18881:2;18876:3;18872:12;18865:19;;18524:366;;;:::o;18896:::-;19038:3;19059:67;19123:2;19118:3;19059:67;:::i;:::-;19052:74;;19135:93;19224:3;19135:93;:::i;:::-;19253:2;19248:3;19244:12;19237:19;;18896:366;;;:::o;19268:::-;19410:3;19431:67;19495:2;19490:3;19431:67;:::i;:::-;19424:74;;19507:93;19596:3;19507:93;:::i;:::-;19625:2;19620:3;19616:12;19609:19;;19268:366;;;:::o;19640:::-;19782:3;19803:67;19867:2;19862:3;19803:67;:::i;:::-;19796:74;;19879:93;19968:3;19879:93;:::i;:::-;19997:2;19992:3;19988:12;19981:19;;19640:366;;;:::o;20012:::-;20154:3;20175:67;20239:2;20234:3;20175:67;:::i;:::-;20168:74;;20251:93;20340:3;20251:93;:::i;:::-;20369:2;20364:3;20360:12;20353:19;;20012:366;;;:::o;20384:::-;20526:3;20547:67;20611:2;20606:3;20547:67;:::i;:::-;20540:74;;20623:93;20712:3;20623:93;:::i;:::-;20741:2;20736:3;20732:12;20725:19;;20384:366;;;:::o;20756:::-;20898:3;20919:67;20983:2;20978:3;20919:67;:::i;:::-;20912:74;;20995:93;21084:3;20995:93;:::i;:::-;21113:2;21108:3;21104:12;21097:19;;20756:366;;;:::o;21128:::-;21270:3;21291:67;21355:2;21350:3;21291:67;:::i;:::-;21284:74;;21367:93;21456:3;21367:93;:::i;:::-;21485:2;21480:3;21476:12;21469:19;;21128:366;;;:::o;21500:::-;21642:3;21663:67;21727:2;21722:3;21663:67;:::i;:::-;21656:74;;21739:93;21828:3;21739:93;:::i;:::-;21857:2;21852:3;21848:12;21841:19;;21500:366;;;:::o;21872:402::-;22032:3;22053:85;22135:2;22130:3;22053:85;:::i;:::-;22046:92;;22147:93;22236:3;22147:93;:::i;:::-;22265:2;22260:3;22256:12;22249:19;;21872:402;;;:::o;22280:366::-;22422:3;22443:67;22507:2;22502:3;22443:67;:::i;:::-;22436:74;;22519:93;22608:3;22519:93;:::i;:::-;22637:2;22632:3;22628:12;22621:19;;22280:366;;;:::o;22652:::-;22794:3;22815:67;22879:2;22874:3;22815:67;:::i;:::-;22808:74;;22891:93;22980:3;22891:93;:::i;:::-;23009:2;23004:3;23000:12;22993:19;;22652:366;;;:::o;23024:400::-;23184:3;23205:84;23287:1;23282:3;23205:84;:::i;:::-;23198:91;;23298:93;23387:3;23298:93;:::i;:::-;23416:1;23411:3;23407:11;23400:18;;23024:400;;;:::o;23430:366::-;23572:3;23593:67;23657:2;23652:3;23593:67;:::i;:::-;23586:74;;23669:93;23758:3;23669:93;:::i;:::-;23787:2;23782:3;23778:12;23771:19;;23430:366;;;:::o;23802:::-;23944:3;23965:67;24029:2;24024:3;23965:67;:::i;:::-;23958:74;;24041:93;24130:3;24041:93;:::i;:::-;24159:2;24154:3;24150:12;24143:19;;23802:366;;;:::o;24174:::-;24316:3;24337:67;24401:2;24396:3;24337:67;:::i;:::-;24330:74;;24413:93;24502:3;24413:93;:::i;:::-;24531:2;24526:3;24522:12;24515:19;;24174:366;;;:::o;24546:400::-;24706:3;24727:84;24809:1;24804:3;24727:84;:::i;:::-;24720:91;;24820:93;24909:3;24820:93;:::i;:::-;24938:1;24933:3;24929:11;24922:18;;24546:400;;;:::o;24952:402::-;25112:3;25133:85;25215:2;25210:3;25133:85;:::i;:::-;25126:92;;25227:93;25316:3;25227:93;:::i;:::-;25345:2;25340:3;25336:12;25329:19;;24952:402;;;:::o;25360:366::-;25502:3;25523:67;25587:2;25582:3;25523:67;:::i;:::-;25516:74;;25599:93;25688:3;25599:93;:::i;:::-;25717:2;25712:3;25708:12;25701:19;;25360:366;;;:::o;25732:::-;25874:3;25895:67;25959:2;25954:3;25895:67;:::i;:::-;25888:74;;25971:93;26060:3;25971:93;:::i;:::-;26089:2;26084:3;26080:12;26073:19;;25732:366;;;:::o;26104:::-;26246:3;26267:67;26331:2;26326:3;26267:67;:::i;:::-;26260:74;;26343:93;26432:3;26343:93;:::i;:::-;26461:2;26456:3;26452:12;26445:19;;26104:366;;;:::o;26476:::-;26618:3;26639:67;26703:2;26698:3;26639:67;:::i;:::-;26632:74;;26715:93;26804:3;26715:93;:::i;:::-;26833:2;26828:3;26824:12;26817:19;;26476:366;;;:::o;26848:404::-;27008:3;27029:86;27111:3;27106;27029:86;:::i;:::-;27022:93;;27124;27213:3;27124:93;:::i;:::-;27242:3;27237;27233:13;27226:20;;26848:404;;;:::o;27258:402::-;27418:3;27439:85;27521:2;27516:3;27439:85;:::i;:::-;27432:92;;27533:93;27622:3;27533:93;:::i;:::-;27651:2;27646:3;27642:12;27635:19;;27258:402;;;:::o;27666:366::-;27808:3;27829:67;27893:2;27888:3;27829:67;:::i;:::-;27822:74;;27905:93;27994:3;27905:93;:::i;:::-;28023:2;28018:3;28014:12;28007:19;;27666:366;;;:::o;28038:398::-;28197:3;28218:83;28299:1;28294:3;28218:83;:::i;:::-;28211:90;;28310:93;28399:3;28310:93;:::i;:::-;28428:1;28423:3;28419:11;28412:18;;28038:398;;;:::o;28442:366::-;28584:3;28605:67;28669:2;28664:3;28605:67;:::i;:::-;28598:74;;28681:93;28770:3;28681:93;:::i;:::-;28799:2;28794:3;28790:12;28783:19;;28442:366;;;:::o;28814:::-;28956:3;28977:67;29041:2;29036:3;28977:67;:::i;:::-;28970:74;;29053:93;29142:3;29053:93;:::i;:::-;29171:2;29166:3;29162:12;29155:19;;28814:366;;;:::o;29186:::-;29328:3;29349:67;29413:2;29408:3;29349:67;:::i;:::-;29342:74;;29425:93;29514:3;29425:93;:::i;:::-;29543:2;29538:3;29534:12;29527:19;;29186:366;;;:::o;29558:::-;29700:3;29721:67;29785:2;29780:3;29721:67;:::i;:::-;29714:74;;29797:93;29886:3;29797:93;:::i;:::-;29915:2;29910:3;29906:12;29899:19;;29558:366;;;:::o;29930:118::-;30017:24;30035:5;30017:24;:::i;:::-;30012:3;30005:37;29930:118;;:::o;30054:271::-;30184:3;30206:93;30295:3;30286:6;30206:93;:::i;:::-;30199:100;;30316:3;30309:10;;30054:271;;;;:::o;30331:1555::-;30847:3;30869:95;30960:3;30951:6;30869:95;:::i;:::-;30862:102;;30981:95;31072:3;31063:6;30981:95;:::i;:::-;30974:102;;31093:95;31184:3;31175:6;31093:95;:::i;:::-;31086:102;;31205:95;31296:3;31287:6;31205:95;:::i;:::-;31198:102;;31317:95;31408:3;31399:6;31317:95;:::i;:::-;31310:102;;31429:95;31520:3;31511:6;31429:95;:::i;:::-;31422:102;;31541:95;31632:3;31623:6;31541:95;:::i;:::-;31534:102;;31653:95;31744:3;31735:6;31653:95;:::i;:::-;31646:102;;31765:95;31856:3;31847:6;31765:95;:::i;:::-;31758:102;;31877:3;31870:10;;30331:1555;;;;;;;;;;;;:::o;31892:807::-;32226:3;32248:95;32339:3;32330:6;32248:95;:::i;:::-;32241:102;;32360:148;32504:3;32360:148;:::i;:::-;32353:155;;32525:148;32669:3;32525:148;:::i;:::-;32518:155;;32690:3;32683:10;;31892:807;;;;:::o;32705:1227::-;33185:3;33207:148;33351:3;33207:148;:::i;:::-;33200:155;;33372:92;33460:3;33451:6;33372:92;:::i;:::-;33365:99;;33481:148;33625:3;33481:148;:::i;:::-;33474:155;;33646:95;33737:3;33728:6;33646:95;:::i;:::-;33639:102;;33758:148;33902:3;33758:148;:::i;:::-;33751:155;;33923:3;33916:10;;32705:1227;;;;;:::o;33938:541::-;34171:3;34193:148;34337:3;34193:148;:::i;:::-;34186:155;;34358:95;34449:3;34440:6;34358:95;:::i;:::-;34351:102;;34470:3;34463:10;;33938:541;;;;:::o;34485:379::-;34669:3;34691:147;34834:3;34691:147;:::i;:::-;34684:154;;34855:3;34848:10;;34485:379;;;:::o;34870:222::-;34963:4;35001:2;34990:9;34986:18;34978:26;;35014:71;35082:1;35071:9;35067:17;35058:6;35014:71;:::i;:::-;34870:222;;;;:::o;35098:254::-;35207:4;35245:2;35234:9;35230:18;35222:26;;35258:87;35342:1;35331:9;35327:17;35318:6;35258:87;:::i;:::-;35098:254;;;;:::o;35358:640::-;35553:4;35591:3;35580:9;35576:19;35568:27;;35605:71;35673:1;35662:9;35658:17;35649:6;35605:71;:::i;:::-;35686:72;35754:2;35743:9;35739:18;35730:6;35686:72;:::i;:::-;35768;35836:2;35825:9;35821:18;35812:6;35768:72;:::i;:::-;35887:9;35881:4;35877:20;35872:2;35861:9;35857:18;35850:48;35915:76;35986:4;35977:6;35915:76;:::i;:::-;35907:84;;35358:640;;;;;;;:::o;36004:332::-;36125:4;36163:2;36152:9;36148:18;36140:26;;36176:71;36244:1;36233:9;36229:17;36220:6;36176:71;:::i;:::-;36257:72;36325:2;36314:9;36310:18;36301:6;36257:72;:::i;:::-;36004:332;;;;;:::o;36342:442::-;36491:4;36529:2;36518:9;36514:18;36506:26;;36542:71;36610:1;36599:9;36595:17;36586:6;36542:71;:::i;:::-;36623:72;36691:2;36680:9;36676:18;36667:6;36623:72;:::i;:::-;36705;36773:2;36762:9;36758:18;36749:6;36705:72;:::i;:::-;36342:442;;;;;;:::o;36790:373::-;36933:4;36971:2;36960:9;36956:18;36948:26;;37020:9;37014:4;37010:20;37006:1;36995:9;36991:17;36984:47;37048:108;37151:4;37142:6;37048:108;:::i;:::-;37040:116;;36790:373;;;;:::o;37169:210::-;37256:4;37294:2;37283:9;37279:18;37271:26;;37307:65;37369:1;37358:9;37354:17;37345:6;37307:65;:::i;:::-;37169:210;;;;:::o;37385:313::-;37498:4;37536:2;37525:9;37521:18;37513:26;;37585:9;37579:4;37575:20;37571:1;37560:9;37556:17;37549:47;37613:78;37686:4;37677:6;37613:78;:::i;:::-;37605:86;;37385:313;;;;:::o;37704:419::-;37870:4;37908:2;37897:9;37893:18;37885:26;;37957:9;37951:4;37947:20;37943:1;37932:9;37928:17;37921:47;37985:131;38111:4;37985:131;:::i;:::-;37977:139;;37704:419;;;:::o;38129:::-;38295:4;38333:2;38322:9;38318:18;38310:26;;38382:9;38376:4;38372:20;38368:1;38357:9;38353:17;38346:47;38410:131;38536:4;38410:131;:::i;:::-;38402:139;;38129:419;;;:::o;38554:::-;38720:4;38758:2;38747:9;38743:18;38735:26;;38807:9;38801:4;38797:20;38793:1;38782:9;38778:17;38771:47;38835:131;38961:4;38835:131;:::i;:::-;38827:139;;38554:419;;;:::o;38979:::-;39145:4;39183:2;39172:9;39168:18;39160:26;;39232:9;39226:4;39222:20;39218:1;39207:9;39203:17;39196:47;39260:131;39386:4;39260:131;:::i;:::-;39252:139;;38979:419;;;:::o;39404:::-;39570:4;39608:2;39597:9;39593:18;39585:26;;39657:9;39651:4;39647:20;39643:1;39632:9;39628:17;39621:47;39685:131;39811:4;39685:131;:::i;:::-;39677:139;;39404:419;;;:::o;39829:::-;39995:4;40033:2;40022:9;40018:18;40010:26;;40082:9;40076:4;40072:20;40068:1;40057:9;40053:17;40046:47;40110:131;40236:4;40110:131;:::i;:::-;40102:139;;39829:419;;;:::o;40254:::-;40420:4;40458:2;40447:9;40443:18;40435:26;;40507:9;40501:4;40497:20;40493:1;40482:9;40478:17;40471:47;40535:131;40661:4;40535:131;:::i;:::-;40527:139;;40254:419;;;:::o;40679:::-;40845:4;40883:2;40872:9;40868:18;40860:26;;40932:9;40926:4;40922:20;40918:1;40907:9;40903:17;40896:47;40960:131;41086:4;40960:131;:::i;:::-;40952:139;;40679:419;;;:::o;41104:::-;41270:4;41308:2;41297:9;41293:18;41285:26;;41357:9;41351:4;41347:20;41343:1;41332:9;41328:17;41321:47;41385:131;41511:4;41385:131;:::i;:::-;41377:139;;41104:419;;;:::o;41529:::-;41695:4;41733:2;41722:9;41718:18;41710:26;;41782:9;41776:4;41772:20;41768:1;41757:9;41753:17;41746:47;41810:131;41936:4;41810:131;:::i;:::-;41802:139;;41529:419;;;:::o;41954:::-;42120:4;42158:2;42147:9;42143:18;42135:26;;42207:9;42201:4;42197:20;42193:1;42182:9;42178:17;42171:47;42235:131;42361:4;42235:131;:::i;:::-;42227:139;;41954:419;;;:::o;42379:::-;42545:4;42583:2;42572:9;42568:18;42560:26;;42632:9;42626:4;42622:20;42618:1;42607:9;42603:17;42596:47;42660:131;42786:4;42660:131;:::i;:::-;42652:139;;42379:419;;;:::o;42804:::-;42970:4;43008:2;42997:9;42993:18;42985:26;;43057:9;43051:4;43047:20;43043:1;43032:9;43028:17;43021:47;43085:131;43211:4;43085:131;:::i;:::-;43077:139;;42804:419;;;:::o;43229:::-;43395:4;43433:2;43422:9;43418:18;43410:26;;43482:9;43476:4;43472:20;43468:1;43457:9;43453:17;43446:47;43510:131;43636:4;43510:131;:::i;:::-;43502:139;;43229:419;;;:::o;43654:::-;43820:4;43858:2;43847:9;43843:18;43835:26;;43907:9;43901:4;43897:20;43893:1;43882:9;43878:17;43871:47;43935:131;44061:4;43935:131;:::i;:::-;43927:139;;43654:419;;;:::o;44079:::-;44245:4;44283:2;44272:9;44268:18;44260:26;;44332:9;44326:4;44322:20;44318:1;44307:9;44303:17;44296:47;44360:131;44486:4;44360:131;:::i;:::-;44352:139;;44079:419;;;:::o;44504:::-;44670:4;44708:2;44697:9;44693:18;44685:26;;44757:9;44751:4;44747:20;44743:1;44732:9;44728:17;44721:47;44785:131;44911:4;44785:131;:::i;:::-;44777:139;;44504:419;;;:::o;44929:::-;45095:4;45133:2;45122:9;45118:18;45110:26;;45182:9;45176:4;45172:20;45168:1;45157:9;45153:17;45146:47;45210:131;45336:4;45210:131;:::i;:::-;45202:139;;44929:419;;;:::o;45354:::-;45520:4;45558:2;45547:9;45543:18;45535:26;;45607:9;45601:4;45597:20;45593:1;45582:9;45578:17;45571:47;45635:131;45761:4;45635:131;:::i;:::-;45627:139;;45354:419;;;:::o;45779:::-;45945:4;45983:2;45972:9;45968:18;45960:26;;46032:9;46026:4;46022:20;46018:1;46007:9;46003:17;45996:47;46060:131;46186:4;46060:131;:::i;:::-;46052:139;;45779:419;;;:::o;46204:::-;46370:4;46408:2;46397:9;46393:18;46385:26;;46457:9;46451:4;46447:20;46443:1;46432:9;46428:17;46421:47;46485:131;46611:4;46485:131;:::i;:::-;46477:139;;46204:419;;;:::o;46629:::-;46795:4;46833:2;46822:9;46818:18;46810:26;;46882:9;46876:4;46872:20;46868:1;46857:9;46853:17;46846:47;46910:131;47036:4;46910:131;:::i;:::-;46902:139;;46629:419;;;:::o;47054:::-;47220:4;47258:2;47247:9;47243:18;47235:26;;47307:9;47301:4;47297:20;47293:1;47282:9;47278:17;47271:47;47335:131;47461:4;47335:131;:::i;:::-;47327:139;;47054:419;;;:::o;47479:::-;47645:4;47683:2;47672:9;47668:18;47660:26;;47732:9;47726:4;47722:20;47718:1;47707:9;47703:17;47696:47;47760:131;47886:4;47760:131;:::i;:::-;47752:139;;47479:419;;;:::o;47904:::-;48070:4;48108:2;48097:9;48093:18;48085:26;;48157:9;48151:4;48147:20;48143:1;48132:9;48128:17;48121:47;48185:131;48311:4;48185:131;:::i;:::-;48177:139;;47904:419;;;:::o;48329:222::-;48422:4;48460:2;48449:9;48445:18;48437:26;;48473:71;48541:1;48530:9;48526:17;48517:6;48473:71;:::i;:::-;48329:222;;;;:::o;48557:129::-;48591:6;48618:20;;:::i;:::-;48608:30;;48647:33;48675:4;48667:6;48647:33;:::i;:::-;48557:129;;;:::o;48692:75::-;48725:6;48758:2;48752:9;48742:19;;48692:75;:::o;48773:321::-;48860:4;48950:18;48942:6;48939:30;48936:56;;;48972:18;;:::i;:::-;48936:56;49022:4;49014:6;49010:17;49002:25;;49082:4;49076;49072:15;49064:23;;48773:321;;;:::o;49100:338::-;49204:4;49294:18;49286:6;49283:30;49280:56;;;49316:18;;:::i;:::-;49280:56;49366:4;49358:6;49354:17;49346:25;;49426:4;49420;49416:15;49408:23;;49100:338;;;:::o;49444:311::-;49521:4;49611:18;49603:6;49600:30;49597:56;;;49633:18;;:::i;:::-;49597:56;49683:4;49675:6;49671:17;49663:25;;49743:4;49737;49733:15;49725:23;;49444:311;;;:::o;49761:307::-;49822:4;49912:18;49904:6;49901:30;49898:56;;;49934:18;;:::i;:::-;49898:56;49972:29;49994:6;49972:29;:::i;:::-;49964:37;;50056:4;50050;50046:15;50038:23;;49761:307;;;:::o;50074:308::-;50136:4;50226:18;50218:6;50215:30;50212:56;;;50248:18;;:::i;:::-;50212:56;50286:29;50308:6;50286:29;:::i;:::-;50278:37;;50370:4;50364;50360:15;50352:23;;50074:308;;;:::o;50388:132::-;50455:4;50478:3;50470:11;;50508:4;50503:3;50499:14;50491:22;;50388:132;;;:::o;50526:141::-;50575:4;50598:3;50590:11;;50621:3;50618:1;50611:14;50655:4;50652:1;50642:18;50634:26;;50526:141;;;:::o;50673:114::-;50740:6;50774:5;50768:12;50758:22;;50673:114;;;:::o;50793:98::-;50844:6;50878:5;50872:12;50862:22;;50793:98;;;:::o;50897:99::-;50949:6;50983:5;50977:12;50967:22;;50897:99;;;:::o;51002:113::-;51072:4;51104;51099:3;51095:14;51087:22;;51002:113;;;:::o;51121:184::-;51220:11;51254:6;51249:3;51242:19;51294:4;51289:3;51285:14;51270:29;;51121:184;;;;:::o;51311:168::-;51394:11;51428:6;51423:3;51416:19;51468:4;51463:3;51459:14;51444:29;;51311:168;;;;:::o;51485:147::-;51586:11;51623:3;51608:18;;51485:147;;;;:::o;51638:169::-;51722:11;51756:6;51751:3;51744:19;51796:4;51791:3;51787:14;51772:29;;51638:169;;;;:::o;51813:148::-;51915:11;51952:3;51937:18;;51813:148;;;;:::o;51967:305::-;52007:3;52026:20;52044:1;52026:20;:::i;:::-;52021:25;;52060:20;52078:1;52060:20;:::i;:::-;52055:25;;52214:1;52146:66;52142:74;52139:1;52136:81;52133:107;;;52220:18;;:::i;:::-;52133:107;52264:1;52261;52257:9;52250:16;;51967:305;;;;:::o;52278:185::-;52318:1;52335:20;52353:1;52335:20;:::i;:::-;52330:25;;52369:20;52387:1;52369:20;:::i;:::-;52364:25;;52408:1;52398:35;;52413:18;;:::i;:::-;52398:35;52455:1;52452;52448:9;52443:14;;52278:185;;;;:::o;52469:348::-;52509:7;52532:20;52550:1;52532:20;:::i;:::-;52527:25;;52566:20;52584:1;52566:20;:::i;:::-;52561:25;;52754:1;52686:66;52682:74;52679:1;52676:81;52671:1;52664:9;52657:17;52653:105;52650:131;;;52761:18;;:::i;:::-;52650:131;52809:1;52806;52802:9;52791:20;;52469:348;;;;:::o;52823:191::-;52863:4;52883:20;52901:1;52883:20;:::i;:::-;52878:25;;52917:20;52935:1;52917:20;:::i;:::-;52912:25;;52956:1;52953;52950:8;52947:34;;;52961:18;;:::i;:::-;52947:34;53006:1;53003;52999:9;52991:17;;52823:191;;;;:::o;53020:96::-;53057:7;53086:24;53104:5;53086:24;:::i;:::-;53075:35;;53020:96;;;:::o;53122:104::-;53167:7;53196:24;53214:5;53196:24;:::i;:::-;53185:35;;53122:104;;;:::o;53232:90::-;53266:7;53309:5;53302:13;53295:21;53284:32;;53232:90;;;:::o;53328:149::-;53364:7;53404:66;53397:5;53393:78;53382:89;;53328:149;;;:::o;53483:126::-;53520:7;53560:42;53553:5;53549:54;53538:65;;53483:126;;;:::o;53615:77::-;53652:7;53681:5;53670:16;;53615:77;;;:::o;53698:154::-;53782:6;53777:3;53772;53759:30;53844:1;53835:6;53830:3;53826:16;53819:27;53698:154;;;:::o;53858:307::-;53926:1;53936:113;53950:6;53947:1;53944:13;53936:113;;;54035:1;54030:3;54026:11;54020:18;54016:1;54011:3;54007:11;54000:39;53972:2;53969:1;53965:10;53960:15;;53936:113;;;54067:6;54064:1;54061:13;54058:101;;;54147:1;54138:6;54133:3;54129:16;54122:27;54058:101;53907:258;53858:307;;;:::o;54171:320::-;54215:6;54252:1;54246:4;54242:12;54232:22;;54299:1;54293:4;54289:12;54320:18;54310:81;;54376:4;54368:6;54364:17;54354:27;;54310:81;54438:2;54430:6;54427:14;54407:18;54404:38;54401:84;;;54457:18;;:::i;:::-;54401:84;54222:269;54171:320;;;:::o;54497:281::-;54580:27;54602:4;54580:27;:::i;:::-;54572:6;54568:40;54710:6;54698:10;54695:22;54674:18;54662:10;54659:34;54656:62;54653:88;;;54721:18;;:::i;:::-;54653:88;54761:10;54757:2;54750:22;54540:238;54497:281;;:::o;54784:233::-;54823:3;54846:24;54864:5;54846:24;:::i;:::-;54837:33;;54892:66;54885:5;54882:77;54879:103;;;54962:18;;:::i;:::-;54879:103;55009:1;55002:5;54998:13;54991:20;;54784:233;;;:::o;55023:176::-;55055:1;55072:20;55090:1;55072:20;:::i;:::-;55067:25;;55106:20;55124:1;55106:20;:::i;:::-;55101:25;;55145:1;55135:35;;55150:18;;:::i;:::-;55135:35;55191:1;55188;55184:9;55179:14;;55023:176;;;;:::o;55205:180::-;55253:77;55250:1;55243:88;55350:4;55347:1;55340:15;55374:4;55371:1;55364:15;55391:180;55439:77;55436:1;55429:88;55536:4;55533:1;55526:15;55560:4;55557:1;55550:15;55577:180;55625:77;55622:1;55615:88;55722:4;55719:1;55712:15;55746:4;55743:1;55736:15;55763:180;55811:77;55808:1;55801:88;55908:4;55905:1;55898:15;55932:4;55929:1;55922:15;55949:180;55997:77;55994:1;55987:88;56094:4;56091:1;56084:15;56118:4;56115:1;56108:15;56135:180;56183:77;56180:1;56173:88;56280:4;56277:1;56270:15;56304:4;56301:1;56294:15;56321:117;56430:1;56427;56420:12;56444:117;56553:1;56550;56543:12;56567:117;56676:1;56673;56666:12;56690:117;56799:1;56796;56789:12;56813:117;56922:1;56919;56912:12;56936:117;57045:1;57042;57035:12;57059:117;57168:1;57165;57158:12;57182:102;57223:6;57274:2;57270:7;57265:2;57258:5;57254:14;57250:28;57240:38;;57182:102;;;:::o;57290:221::-;57430:34;57426:1;57418:6;57414:14;57407:58;57499:4;57494:2;57486:6;57482:15;57475:29;57290:221;:::o;57517:237::-;57657:34;57653:1;57645:6;57641:14;57634:58;57726:20;57721:2;57713:6;57709:15;57702:45;57517:237;:::o;57760:225::-;57900:34;57896:1;57888:6;57884:14;57877:58;57969:8;57964:2;57956:6;57952:15;57945:33;57760:225;:::o;57991:178::-;58131:30;58127:1;58119:6;58115:14;58108:54;57991:178;:::o;58175:231::-;58315:34;58311:1;58303:6;58299:14;58292:58;58384:14;58379:2;58371:6;58367:15;58360:39;58175:231;:::o;58412:223::-;58552:34;58548:1;58540:6;58536:14;58529:58;58621:6;58616:2;58608:6;58604:15;58597:31;58412:223;:::o;58641:175::-;58781:27;58777:1;58769:6;58765:14;58758:51;58641:175;:::o;58822:245::-;58962:34;58958:1;58950:6;58946:14;58939:58;59031:28;59026:2;59018:6;59014:15;59007:53;58822:245;:::o;59073:179::-;59213:31;59209:1;59201:6;59197:14;59190:55;59073:179;:::o;59258:225::-;59398:34;59394:1;59386:6;59382:14;59375:58;59467:8;59462:2;59454:6;59450:15;59443:33;59258:225;:::o;59489:231::-;59629:34;59625:1;59617:6;59613:14;59606:58;59698:14;59693:2;59685:6;59681:15;59674:39;59489:231;:::o;59726:167::-;59866:19;59862:1;59854:6;59850:14;59843:43;59726:167;:::o;59899:243::-;60039:34;60035:1;60027:6;60023:14;60016:58;60108:26;60103:2;60095:6;60091:15;60084:51;59899:243;:::o;60148:229::-;60288:34;60284:1;60276:6;60272:14;60265:58;60357:12;60352:2;60344:6;60340:15;60333:37;60148:229;:::o;60383:214::-;60523:66;60519:1;60511:6;60507:14;60500:90;60383:214;:::o;60603:221::-;60743:34;60739:1;60731:6;60727:14;60720:58;60812:4;60807:2;60799:6;60795:15;60788:29;60603:221;:::o;60830:182::-;60970:34;60966:1;60958:6;60954:14;60947:58;60830:182;:::o;61018:231::-;61158:34;61154:1;61146:6;61142:14;61135:58;61227:14;61222:2;61214:6;61210:15;61203:39;61018:231;:::o;61255:155::-;61395:7;61391:1;61383:6;61379:14;61372:31;61255:155;:::o;61416:214::-;61556:66;61552:1;61544:6;61540:14;61533:90;61416:214;:::o;61636:182::-;61776:34;61772:1;61764:6;61760:14;61753:58;61636:182;:::o;61824:228::-;61964:34;61960:1;61952:6;61948:14;61941:58;62033:11;62028:2;62020:6;62016:15;62009:36;61824:228;:::o;62058:234::-;62198:34;62194:1;62186:6;62182:14;62175:58;62267:17;62262:2;62254:6;62250:15;62243:42;62058:234;:::o;62298:220::-;62438:34;62434:1;62426:6;62422:14;62415:58;62507:3;62502:2;62494:6;62490:15;62483:28;62298:220;:::o;62524:485::-;62664:66;62660:1;62652:6;62648:14;62641:90;62765:34;62760:2;62752:6;62748:15;62741:59;62834:66;62829:2;62821:6;62817:15;62810:91;62935:66;62930:2;62922:6;62918:15;62911:91;62524:485;:::o;63015:179::-;63155:31;63151:1;63143:6;63139:14;63132:55;63015:179;:::o;63200:177::-;63340:29;63336:1;63328:6;63324:14;63317:53;63200:177;:::o;63383:114::-;;:::o;63503:236::-;63643:34;63639:1;63631:6;63627:14;63620:58;63712:19;63707:2;63699:6;63695:15;63688:44;63503:236;:::o;63745:179::-;63885:31;63881:1;63873:6;63869:14;63862:55;63745:179;:::o;63930:228::-;64070:34;64066:1;64058:6;64054:14;64047:58;64139:11;64134:2;64126:6;64122:15;64115:36;63930:228;:::o;64164:169::-;64304:21;64300:1;64292:6;64288:14;64281:45;64164:169;:::o;64339:122::-;64412:24;64430:5;64412:24;:::i;:::-;64405:5;64402:35;64392:63;;64451:1;64448;64441:12;64392:63;64339:122;:::o;64467:138::-;64548:32;64574:5;64548:32;:::i;:::-;64541:5;64538:43;64528:71;;64595:1;64592;64585:12;64528:71;64467:138;:::o;64611:116::-;64681:21;64696:5;64681:21;:::i;:::-;64674:5;64671:32;64661:60;;64717:1;64714;64707:12;64661:60;64611:116;:::o;64733:120::-;64805:23;64822:5;64805:23;:::i;:::-;64798:5;64795:34;64785:62;;64843:1;64840;64833:12;64785:62;64733:120;:::o;64859:122::-;64932:24;64950:5;64932:24;:::i;:::-;64925:5;64922:35;64912:63;;64971:1;64968;64961:12;64912:63;64859:122;:::o

Swarm Source

ipfs://e0dd01abae1e5fa38df9efe25d08e64558fc79140033410b4685f88acd52dc27
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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