ETH Price: $3,264.93 (-4.27%)
Gas: 17 Gwei

Token

Consensus Heartbeats (CH)
 

Overview

Max Total Supply

315 CH

Holders

176

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
bergyc.eth
Balance
1 CH
0x333983EB213d132CF4f71751dd38802d0362e3Fa
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:
ConsensusHeartbeats

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT 
    // File: @openzeppelin/contracts/utils/Context.sol
    
    pragma solidity >=0.6.0 <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 payable) {
            return msg.sender;
        }
    
        function _msgData() internal view virtual returns (bytes memory) {
            this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
            return msg.data;
        }
    }
    
    // File: @openzeppelin/contracts/introspection/IERC165.sol
    
    
    
    pragma solidity >=0.6.0 <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.6.2 <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.6.2 <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.6.2 <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.6.0 <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.6.0 <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 () internal {
            // 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;
        }
    }
    
    // File: @openzeppelin/contracts/math/SafeMath.sol
    
    
    
    pragma solidity >=0.6.0 <0.8.0;
    
    /**
     * @dev Wrappers over Solidity's arithmetic operations with added overflow
     * checks.
     *
     * Arithmetic operations in Solidity wrap on overflow. This can easily result
     * in bugs, because programmers usually assume that an overflow raises an
     * error, which is the standard behavior in high level programming languages.
     * `SafeMath` restores this intuition by reverting the transaction when an
     * operation overflows.
     *
     * Using this library instead of the unchecked operations eliminates an entire
     * class of bugs, so it's recommended to use it always.
     */
    library SafeMath {
        /**
         * @dev Returns the addition of two unsigned integers, with an overflow flag.
         *
         * _Available since v3.4._
         */
        function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    
        /**
         * @dev Returns the substraction of two unsigned integers, with an overflow flag.
         *
         * _Available since v3.4._
         */
        function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    
        /**
         * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
         *
         * _Available since v3.4._
         */
        function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    
        /**
         * @dev Returns the division of two unsigned integers, with a division by zero flag.
         *
         * _Available since v3.4._
         */
        function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    
        /**
         * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
         *
         * _Available since v3.4._
         */
        function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    
        /**
         * @dev Returns the addition of two unsigned integers, reverting on
         * overflow.
         *
         * Counterpart to Solidity's `+` operator.
         *
         * Requirements:
         *
         * - Addition cannot overflow.
         */
        function add(uint256 a, uint256 b) internal pure returns (uint256) {
            uint256 c = a + b;
            require(c >= a, "SafeMath: addition overflow");
            return c;
        }
    
        /**
         * @dev Returns the subtraction of two unsigned integers, reverting on
         * overflow (when the result is negative).
         *
         * Counterpart to Solidity's `-` operator.
         *
         * Requirements:
         *
         * - Subtraction cannot overflow.
         */
        function sub(uint256 a, uint256 b) internal pure returns (uint256) {
            require(b <= a, "SafeMath: subtraction overflow");
            return a - b;
        }
    
        /**
         * @dev Returns the multiplication of two unsigned integers, reverting on
         * overflow.
         *
         * Counterpart to Solidity's `*` operator.
         *
         * Requirements:
         *
         * - Multiplication cannot overflow.
         */
        function mul(uint256 a, uint256 b) internal pure returns (uint256) {
            if (a == 0) return 0;
            uint256 c = a * b;
            require(c / a == b, "SafeMath: multiplication overflow");
            return c;
        }
    
        /**
         * @dev Returns the integer division of two unsigned integers, reverting on
         * division by zero. The result is rounded towards zero.
         *
         * Counterpart to Solidity's `/` operator. Note: this function uses a
         * `revert` opcode (which leaves remaining gas untouched) while Solidity
         * uses an invalid opcode to revert (consuming all remaining gas).
         *
         * Requirements:
         *
         * - The divisor cannot be zero.
         */
        function div(uint256 a, uint256 b) internal pure returns (uint256) {
            require(b > 0, "SafeMath: division by zero");
            return a / b;
        }
    
        /**
         * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
         * reverting when dividing by zero.
         *
         * Counterpart to Solidity's `%` operator. This function uses a `revert`
         * opcode (which leaves remaining gas untouched) while Solidity uses an
         * invalid opcode to revert (consuming all remaining gas).
         *
         * Requirements:
         *
         * - The divisor cannot be zero.
         */
        function mod(uint256 a, uint256 b) internal pure returns (uint256) {
            require(b > 0, "SafeMath: modulo by zero");
            return a % b;
        }
    
        /**
         * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
         * overflow (when the result is negative).
         *
         * CAUTION: This function is deprecated because it requires allocating memory for the error
         * message unnecessarily. For custom revert reasons use {trySub}.
         *
         * Counterpart to Solidity's `-` operator.
         *
         * Requirements:
         *
         * - Subtraction cannot overflow.
         */
        function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            require(b <= a, errorMessage);
            return a - b;
        }
    
        /**
         * @dev Returns the integer division of two unsigned integers, reverting with custom message on
         * division by zero. The result is rounded towards zero.
         *
         * CAUTION: This function is deprecated because it requires allocating memory for the error
         * message unnecessarily. For custom revert reasons use {tryDiv}.
         *
         * Counterpart to Solidity's `/` operator. Note: this function uses a
         * `revert` opcode (which leaves remaining gas untouched) while Solidity
         * uses an invalid opcode to revert (consuming all remaining gas).
         *
         * Requirements:
         *
         * - The divisor cannot be zero.
         */
        function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            require(b > 0, errorMessage);
            return a / b;
        }
    
        /**
         * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
         * reverting with custom message when dividing by zero.
         *
         * CAUTION: This function is deprecated because it requires allocating memory for the error
         * message unnecessarily. For custom revert reasons use {tryMod}.
         *
         * Counterpart to Solidity's `%` operator. This function uses a `revert`
         * opcode (which leaves remaining gas untouched) while Solidity uses an
         * invalid opcode to revert (consuming all remaining gas).
         *
         * Requirements:
         *
         * - The divisor cannot be zero.
         */
        function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
    
    // File: @openzeppelin/contracts/utils/Address.sol
    
    
    
    pragma solidity >=0.6.2 <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/EnumerableSet.sol
    
    
    
    pragma solidity >=0.6.0 <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/EnumerableMap.sol
    
    
    
    pragma solidity >=0.6.0 <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))));
        }
    }
    
    // File: @openzeppelin/contracts/utils/Strings.sol
    
    
    
    pragma solidity >=0.6.0 <0.8.0;
    
    /**
     * @dev String operations.
     */
    library Strings {
        /**
         * @dev Converts a `uint256` to its ASCII `string` 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);
            uint256 index = digits - 1;
            temp = value;
            while (temp != 0) {
                buffer[index--] = bytes1(uint8(48 + temp % 10));
                temp /= 10;
            }
            return string(buffer);
        }
    }
    
    // File: @openzeppelin/contracts/token/ERC721/ERC721.sol
    
    
    
    pragma solidity >=0.6.0 <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 SafeMath for uint256;
        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
        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_) public {
            _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");
    
            string memory _tokenURI = _tokenURIs[tokenId];
            string memory base = baseURI();
    
            // If there is no base URI, return the token URI.
            if (bytes(base).length == 0) {
                return _tokenURI;
            }
            // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
            if (bytes(_tokenURI).length > 0) {
                return string(abi.encodePacked(base, _tokenURI));
            }
            // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
            return string(abi.encodePacked(base, tokenId.toString()));
        }
    
        /**
        * @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);
        }
    
        /**
         * @dev Approve `to` to operate on `tokenId`
         *
         * Emits an {Approval} event.
         */
        function _approve(address to, uint256 tokenId) internal virtual {
            _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: @openzeppelin/contracts/access/Ownable.sol
    
    
    
    pragma solidity >=0.6.0 <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 () internal {
            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;
        }
    }
    
    
    // ======== Consensus Heartbeats ======== //
    pragma solidity ^0.7.0;
    pragma abicoder v2;
    
    contract ConsensusHeartbeats is ERC721, Ownable {
        
    constructor() ERC721("Consensus Heartbeats", "CH") {}
            
    using SafeMath for uint256;
    // price of a CH
        uint256 public constant heartbeatPrice = 320000000000000000; // 0.32 ETH

    // max number of CH to purchase
        uint public constant MAX_HEARTBEAT_PURCHASE = 1;
        
    // max number of CH overall
        uint256 public constant MAX_HEARTBEATS_MAIN = 315;

    // mapping from token ID to name
        mapping (uint256 => string) public heartbeatBlockInformation;
        mapping (uint256 => string) public blockIdentity;

    // are individual sales active?
        bool public preSaleIsActive    = false;
        bool public publicSaleIsActive = false;
    
    // reconstructed code
        string public pyReconstructedCode;
        bool public   isPyReconstructed = false;
        
        string public cReconstructedCode;
        bool public   isCReconstructed = false;
    
        string public reconstructedCode;
        bool public   isReconstructed = false;
        
        // Reserve 9
        uint public HEARTBEAT_RESERVE = 9;
        
        function withdraw() public onlyOwner {
            uint balance = address(this).balance;
            msg.sender.transfer(balance);
        }

        // track how many has a given address minted
        mapping (address => uint256) public preSaleMinted;    
        // set whitelisted
        mapping (address => uint256) public whitelisted;

        function setWhitelistAddress (address[] memory users, uint[] memory allowedMint) public onlyOwner {
            for (uint i = 0; i < users.length; i++) {
                whitelisted[users[i]] = allowedMint[i];
            }
        }
        
        function reserveHeartbeats(address _to) public onlyOwner {        
            uint supply = totalSupply();
            require(supply < HEARTBEAT_RESERVE, "exceeded reserve"); // we know owner will mint reserve first so it just needs to be below the serve number
            _safeMint(_to, supply);
        }
    
        function setBaseURI(string memory baseURI) public onlyOwner {
            _setBaseURI(baseURI);
        }
    
        function flipSaleStatePresale() public onlyOwner {
            preSaleIsActive = !preSaleIsActive;
        }
    
        function flipSaleStatePublic() public onlyOwner {
            publicSaleIsActive = !publicSaleIsActive;
        }
    
        function setReconstructionPy(string calldata _currName) public onlyOwner {
            require(isPyReconstructed == false, "already reconstructed");
            isPyReconstructed = true;
            pyReconstructedCode = _currName;
        }
        
        function setReconstructionC(string calldata _currName) public onlyOwner {
            require(isCReconstructed == false, "already reconstructed");
            isCReconstructed = true;
            cReconstructedCode = _currName;
        }
        
        function setReconstruction(string calldata _currName) public onlyOwner {
            require(isReconstructed == false, "already reconstructed");
            isReconstructed = true;
            reconstructedCode = _currName;
        }
        
        function viewReconstructedPy() public view returns(string memory) {
            return pyReconstructedCode;
        }
        
        function viewReconstructedC() public view returns(string memory) {
            return cReconstructedCode;
        }
        
        function viewReconstructed() public view returns(string memory) {
            return reconstructedCode;
        }

        // we mint the audio and block component for each token to make it on-chain
        function setTokenInformation(uint256[] calldata _tokenId, string[] calldata _currName) public onlyOwner {
            for (uint i = 0; i < _tokenId.length; i++) {
                heartbeatBlockInformation[_tokenId[i]] = _currName[i];
            }
        }

        // view minted token reconstructor
        function viewTokenInformation(uint256 _tokenId) public view returns(string memory) {
            return heartbeatBlockInformation[_tokenId];
        }

        // block identity will only be visible from this contract. come and get it - this will be set once people figure it out
        function setBlockIdentity(uint256[] calldata _tokenId, string[] calldata _currName) public onlyOwner {
            for (uint i = 0; i < _tokenId.length; i++) {
                blockIdentity[_tokenId[i]] = _currName[i];
            }
        }

        // view minted identity
        function viewBlockIdentity(uint256 _tokenId) public view returns(string memory) {
            return blockIdentity[_tokenId];
        }

        function publicMint(uint _numberOfTokens) public payable { 
            require(publicSaleIsActive, "public not open"); // open minting
            require(_numberOfTokens == MAX_HEARTBEAT_PURCHASE, "precisely 1"); // exactly 1
            require(totalSupply().add(_numberOfTokens) <= MAX_HEARTBEATS_MAIN, "too many"); // does adding 1 exceed max?
            require(msg.value >= heartbeatPrice, "more eth"); // value needs to be correct
    
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_HEARTBEATS_MAIN) {
                _safeMint(msg.sender, mintIndex);
                }
        }
    
        function preMint(uint _numberOfTokens) public payable { 
    
            require(preSaleIsActive, "presale not open"); // presale is activated 
            require(whitelisted[msg.sender] > 0, "not allowed"); // allowed to mint
            require(whitelisted[msg.sender] > preSaleMinted[msg.sender], "exceed mint"); // less than their allowance
            require(totalSupply().add(_numberOfTokens) <= MAX_HEARTBEATS_MAIN, "too many"); // does adding 1 exceed max? very unlikely but better safe than sry
            require(_numberOfTokens == MAX_HEARTBEAT_PURCHASE, "only 1"); // exactly 1 at a time
            require(msg.value >= heartbeatPrice, "more eth"); // value needs to be correct
            
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_HEARTBEATS_MAIN) {
                _safeMint(msg.sender, mintIndex);
    		    preSaleMinted[msg.sender] += 1;
            }

            }
    
    
    
    }

Contract Security Audit

Contract ABI

[{"inputs":[],"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":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":[],"name":"HEARTBEAT_RESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_HEARTBEATS_MAIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_HEARTBEAT_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"blockIdentity","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cReconstructedCode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleStatePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleStatePublic","outputs":[],"stateMutability":"nonpayable","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":"","type":"uint256"}],"name":"heartbeatBlockInformation","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"heartbeatPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"isCReconstructed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPyReconstructed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isReconstructed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numberOfTokens","type":"uint256"}],"name":"preMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"preSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"preSaleMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numberOfTokens","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pyReconstructedCode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reconstructedCode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"reserveHeartbeats","outputs":[],"stateMutability":"nonpayable","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":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenId","type":"uint256[]"},{"internalType":"string[]","name":"_currName","type":"string[]"}],"name":"setBlockIdentity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_currName","type":"string"}],"name":"setReconstruction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_currName","type":"string"}],"name":"setReconstructionC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_currName","type":"string"}],"name":"setReconstructionPy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenId","type":"uint256[]"},{"internalType":"string[]","name":"_currName","type":"string[]"}],"name":"setTokenInformation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"allowedMint","type":"uint256[]"}],"name":"setWhitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[{"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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"viewBlockIdentity","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewReconstructed","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewReconstructedC","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewReconstructedPy","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"viewTokenInformation","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055506000600f60006101000a81548160ff0219169083151502179055506000601160006101000a81548160ff0219169083151502179055506000601360006101000a81548160ff02191690831515021790555060096014553480156200009d57600080fd5b506040518060400160405280601481526020017f436f6e73656e73757320486561727462656174730000000000000000000000008152506040518060400160405280600281526020017f4348000000000000000000000000000000000000000000000000000000000000815250620001226301ffc9a760e01b6200025560201b60201c565b81600690805190602001906200013a92919062000335565b5080600790805190602001906200015392919062000335565b506200016c6380ac58cd60e01b6200025560201b60201c565b62000184635b5e139f60e01b6200025560201b60201c565b6200019c63780e9d6360e01b6200025560201b60201c565b50506000620001b06200032d60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000460565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620002c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002b8906200042d565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200036d5760008555620003b9565b82601f106200038857805160ff1916838001178555620003b9565b82800160010185558215620003b9579182015b82811115620003b85782518255916020019190600101906200039b565b5b509050620003c89190620003cc565b5090565b5b80821115620003e7576000816000905550600101620003cd565b5090565b6000620003fa601c836200044f565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b600060208201905081810360008301526200044881620003eb565b9050919050565b600082825260208201905092915050565b61599880620004706000396000f3fe6080604052600436106103345760003560e01c80636c0360eb116101ab578063b88d4fde116100f7578063dc5d7f4111610095578063e985e9c51161006f578063e985e9c514610bef578063ee7cd16714610c2c578063f2fde38b14610c57578063fd0e710f14610c8057610334565b8063dc5d7f4114610b5e578063dd129da214610b89578063dfa7fdce14610bb257610334565b8063c7b030da116100d1578063c7b030da14610a7c578063c87b56dd14610aa7578063d4a8248714610ae4578063d936547e14610b2157610334565b8063b88d4fde146109fd578063bbfc27f614610a26578063c23249a114610a5157610334565b80638ad433ac1161016457806395d89b411161013e57806395d89b41146109555780639e129c9114610980578063a22cb465146109ab578063aeca5a8c146109d457610334565b80638ad433ac146108f75780638da5cb5b1461091357806392ea7d9c1461093e57610334565b80636c0360eb146107f957806370a0823114610824578063715018a6146108615780637c0f08fc1461087857806385f4a1ab146108a15780638652e469146108cc57610334565b80632db115441161028557806342842e0e1161022357806355f804b3116101fd57806355f804b31461073f57806356798bda146107685780636352211e14610791578063649dc4a1146107ce57610334565b806342842e0e1461069c5780634f6ccce7146106c5578063529be43b1461070257610334565b806337f1fc251161025f57806337f1fc25146105f25780633ccfd60b1461062f5780633d01afb5146106465780633dae71ff1461067157610334565b80632db11544146105705780632eef3b321461058c5780632f745c59146105b557610334565b80630fcf2e75116102f257806318160ddd116102cc57806318160ddd146104c85780631f0234d8146104f357806323b872dd1461051e5780632ad2804c1461054757610334565b80630fcf2e751461044757806316d601b314610472578063176f00aa1461049d57610334565b80629f66c41461033957806301ffc9a71461036257806306fdde031461039f578063081812fc146103ca57806308239c9614610407578063095ea7b31461041e575b600080fd5b34801561034557600080fd5b50610360600480360381019061035b9190614635565b610cbd565b005b34801561036e57600080fd5b50610389600480360381019061038491906145e3565b610dc0565b604051610396919061522a565b60405180910390f35b3480156103ab57600080fd5b506103b4610e27565b6040516103c19190615245565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec91906146bb565b610ec9565b6040516103fe91906151c3565b60405180910390f35b34801561041357600080fd5b5061041c610f4e565b005b34801561042a57600080fd5b50610445600480360381019061044091906144c6565b610ff6565b005b34801561045357600080fd5b5061045c61110e565b604051610469919061522a565b60405180910390f35b34801561047e57600080fd5b50610487611121565b6040516104949190615245565b60405180910390f35b3480156104a957600080fd5b506104b26111bf565b6040516104bf9190615627565b60405180910390f35b3480156104d457600080fd5b506104dd6111c5565b6040516104ea9190615627565b60405180910390f35b3480156104ff57600080fd5b506105086111d6565b604051610515919061522a565b60405180910390f35b34801561052a57600080fd5b50610545600480360381019061054091906143c0565b6111e9565b005b34801561055357600080fd5b5061056e6004803603810190610569919061456e565b611249565b005b61058a600480360381019061058591906146bb565b611338565b005b34801561059857600080fd5b506105b360048036038101906105ae9190614635565b61149f565b005b3480156105c157600080fd5b506105dc60048036038101906105d791906144c6565b6115a2565b6040516105e99190615627565b60405180910390f35b3480156105fe57600080fd5b50610619600480360381019061061491906146bb565b6115fd565b6040516106269190615245565b60405180910390f35b34801561063b57600080fd5b506106446116ad565b005b34801561065257600080fd5b5061065b611778565b604051610668919061522a565b60405180910390f35b34801561067d57600080fd5b5061068661178b565b6040516106939190615627565b60405180910390f35b3480156106a857600080fd5b506106c360048036038101906106be91906143c0565b611797565b005b3480156106d157600080fd5b506106ec60048036038101906106e791906146bb565b6117b7565b6040516106f99190615627565b60405180910390f35b34801561070e57600080fd5b506107296004803603810190610724919061435b565b6117da565b6040516107369190615627565b60405180910390f35b34801561074b57600080fd5b506107666004803603810190610761919061467a565b6117f2565b005b34801561077457600080fd5b5061078f600480360381019061078a9190614502565b61187a565b005b34801561079d57600080fd5b506107b860048036038101906107b391906146bb565b61197e565b6040516107c591906151c3565b60405180910390f35b3480156107da57600080fd5b506107e36119b5565b6040516107f0919061522a565b60405180910390f35b34801561080557600080fd5b5061080e6119c8565b60405161081b9190615245565b60405180910390f35b34801561083057600080fd5b5061084b6004803603810190610846919061435b565b611a6a565b6040516108589190615627565b60405180910390f35b34801561086d57600080fd5b50610876611b29565b005b34801561088457600080fd5b5061089f600480360381019061089a9190614635565b611c66565b005b3480156108ad57600080fd5b506108b6611d69565b6040516108c39190615627565b60405180910390f35b3480156108d857600080fd5b506108e1611d6f565b6040516108ee9190615245565b60405180910390f35b610911600480360381019061090c91906146bb565b611e0d565b005b34801561091f57600080fd5b50610928612104565b60405161093591906151c3565b60405180910390f35b34801561094a57600080fd5b5061095361212e565b005b34801561096157600080fd5b5061096a6121d6565b6040516109779190615245565b60405180910390f35b34801561098c57600080fd5b50610995612278565b6040516109a29190615245565b60405180910390f35b3480156109b757600080fd5b506109d260048036038101906109cd919061448a565b61231a565b005b3480156109e057600080fd5b506109fb60048036038101906109f6919061456e565b61249b565b005b348015610a0957600080fd5b50610a246004803603810190610a1f919061440f565b61258a565b005b348015610a3257600080fd5b50610a3b6125ec565b604051610a489190615627565b60405180910390f35b348015610a5d57600080fd5b50610a666125f1565b604051610a739190615245565b60405180910390f35b348015610a8857600080fd5b50610a91612693565b604051610a9e9190615245565b60405180910390f35b348015610ab357600080fd5b50610ace6004803603810190610ac991906146bb565b612731565b604051610adb9190615245565b60405180910390f35b348015610af057600080fd5b50610b0b6004803603810190610b0691906146bb565b6128b4565b604051610b189190615245565b60405180910390f35b348015610b2d57600080fd5b50610b486004803603810190610b43919061435b565b612969565b604051610b559190615627565b60405180910390f35b348015610b6a57600080fd5b50610b73612981565b604051610b809190615245565b60405180910390f35b348015610b9557600080fd5b50610bb06004803603810190610bab919061435b565b612a23565b005b348015610bbe57600080fd5b50610bd96004803603810190610bd491906146bb565b612afd565b604051610be69190615245565b60405180910390f35b348015610bfb57600080fd5b50610c166004803603810190610c119190614384565b612bb2565b604051610c23919061522a565b60405180910390f35b348015610c3857600080fd5b50610c41612c46565b604051610c4e919061522a565b60405180910390f35b348015610c6357600080fd5b50610c7e6004803603810190610c79919061435b565b612c59565b005b348015610c8c57600080fd5b50610ca76004803603810190610ca291906146bb565b612e05565b604051610cb49190615245565b60405180910390f35b610cc5612eb5565b73ffffffffffffffffffffffffffffffffffffffff16610ce3612104565b73ffffffffffffffffffffffffffffffffffffffff1614610d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d30906154c7565b60405180910390fd5b60001515600f60009054906101000a900460ff16151514610d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d86906155a7565b60405180910390fd5b6001600f60006101000a81548160ff0219169083151502179055508181600e9190610dbb929190613edf565b505050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ebf5780601f10610e9457610100808354040283529160200191610ebf565b820191906000526020600020905b815481529060010190602001808311610ea257829003601f168201915b5050505050905090565b6000610ed482612ebd565b610f13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0a906154a7565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610f56612eb5565b73ffffffffffffffffffffffffffffffffffffffff16610f74612104565b73ffffffffffffffffffffffffffffffffffffffff1614610fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc1906154c7565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b60006110018261197e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106990615547565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611091612eb5565b73ffffffffffffffffffffffffffffffffffffffff1614806110c057506110bf816110ba612eb5565b612bb2565b5b6110ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f690615407565b60405180910390fd5b6111098383612eda565b505050565b600d60019054906101000a900460ff1681565b60108054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111b75780601f1061118c576101008083540402835291602001916111b7565b820191906000526020600020905b81548152906001019060200180831161119a57829003601f168201915b505050505081565b61013b81565b60006111d16002612f93565b905090565b600d60009054906101000a900460ff1681565b6111fa6111f4612eb5565b82612fa8565b611239576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123090615567565b60405180910390fd5b611244838383613086565b505050565b611251612eb5565b73ffffffffffffffffffffffffffffffffffffffff1661126f612104565b73ffffffffffffffffffffffffffffffffffffffff16146112c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bc906154c7565b60405180910390fd5b60005b84849050811015611331578282828181106112df57fe5b90506020028101906112f19190615642565b600c600088888681811061130157fe5b9050602002013581526020019081526020016000209190611323929190613edf565b5080806001019150506112c8565b5050505050565b600d60019054906101000a900460ff16611387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137e906155e7565b60405180910390fd5b600181146113ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c190615327565b60405180910390fd5b61013b6113e7826113d96111c5565b61329d90919063ffffffff16565b1115611428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141f90615527565b60405180910390fd5b670470de4df8200000341015611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a90615347565b60405180910390fd5b600061147d6111c5565b905061013b61148a6111c5565b101561149b5761149a33826132f2565b5b5050565b6114a7612eb5565b73ffffffffffffffffffffffffffffffffffffffff166114c5612104565b73ffffffffffffffffffffffffffffffffffffffff161461151b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611512906154c7565b60405180910390fd5b60001515601160009054906101000a900460ff16151514611571576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611568906155a7565b60405180910390fd5b6001601160006101000a81548160ff02191690831515021790555081816010919061159d929190613edf565b505050565b60006115f582600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061331090919063ffffffff16565b905092915050565b600b6020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116a55780601f1061167a576101008083540402835291602001916116a5565b820191906000526020600020905b81548152906001019060200180831161168857829003601f168201915b505050505081565b6116b5612eb5565b73ffffffffffffffffffffffffffffffffffffffff166116d3612104565b73ffffffffffffffffffffffffffffffffffffffff1614611729576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611720906154c7565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611774573d6000803e3d6000fd5b5050565b601360009054906101000a900460ff1681565b670470de4df820000081565b6117b28383836040518060200160405280600081525061258a565b505050565b6000806117ce83600261332a90919063ffffffff16565b50905080915050919050565b60156020528060005260406000206000915090505481565b6117fa612eb5565b73ffffffffffffffffffffffffffffffffffffffff16611818612104565b73ffffffffffffffffffffffffffffffffffffffff161461186e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611865906154c7565b60405180910390fd5b61187781613356565b50565b611882612eb5565b73ffffffffffffffffffffffffffffffffffffffff166118a0612104565b73ffffffffffffffffffffffffffffffffffffffff16146118f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ed906154c7565b60405180910390fd5b60005b82518110156119795781818151811061190e57fe5b60200260200101516016600085848151811061192657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806001019150506118f9565b505050565b60006119ae8260405180606001604052806029815260200161593a6029913960026133709092919063ffffffff16565b9050919050565b601160009054906101000a900460ff1681565b606060098054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a605780601f10611a3557610100808354040283529160200191611a60565b820191906000526020600020905b815481529060010190602001808311611a4357829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad290615427565b60405180910390fd5b611b22600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061338f565b9050919050565b611b31612eb5565b73ffffffffffffffffffffffffffffffffffffffff16611b4f612104565b73ffffffffffffffffffffffffffffffffffffffff1614611ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9c906154c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611c6e612eb5565b73ffffffffffffffffffffffffffffffffffffffff16611c8c612104565b73ffffffffffffffffffffffffffffffffffffffff1614611ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd9906154c7565b60405180910390fd5b60001515601360009054906101000a900460ff16151514611d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2f906155a7565b60405180910390fd5b6001601360006101000a81548160ff021916908315150217905550818160129190611d64929190613edf565b505050565b60145481565b600e8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e055780601f10611dda57610100808354040283529160200191611e05565b820191906000526020600020905b815481529060010190602001808311611de857829003601f168201915b505050505081565b600d60009054906101000a900460ff16611e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5390615447565b60405180910390fd5b6000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed5906153e7565b60405180910390fd5b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9590615607565b60405180910390fd5b61013b611fbb82611fad6111c5565b61329d90919063ffffffff16565b1115611ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff390615527565b60405180910390fd5b6001811461203f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203690615287565b60405180910390fd5b670470de4df820000034101561208a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208190615347565b60405180910390fd5b60006120946111c5565b905061013b6120a16111c5565b1015612100576120b133826132f2565b6001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b612136612eb5565b73ffffffffffffffffffffffffffffffffffffffff16612154612104565b73ffffffffffffffffffffffffffffffffffffffff16146121aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a1906154c7565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b606060078054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561226e5780601f106122435761010080835404028352916020019161226e565b820191906000526020600020905b81548152906001019060200180831161225157829003601f168201915b5050505050905090565b6060600e8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123105780601f106122e557610100808354040283529160200191612310565b820191906000526020600020905b8154815290600101906020018083116122f357829003601f168201915b5050505050905090565b612322612eb5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238790615387565b60405180910390fd5b806005600061239d612eb5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661244a612eb5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161248f919061522a565b60405180910390a35050565b6124a3612eb5565b73ffffffffffffffffffffffffffffffffffffffff166124c1612104565b73ffffffffffffffffffffffffffffffffffffffff1614612517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250e906154c7565b60405180910390fd5b60005b848490508110156125835782828281811061253157fe5b90506020028101906125439190615642565b600b600088888681811061255357fe5b9050602002013581526020019081526020016000209190612575929190613edf565b50808060010191505061251a565b5050505050565b61259b612595612eb5565b83612fa8565b6125da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d190615567565b60405180910390fd5b6125e6848484846133a4565b50505050565b600181565b606060108054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156126895780601f1061265e57610100808354040283529160200191612689565b820191906000526020600020905b81548152906001019060200180831161266c57829003601f168201915b5050505050905090565b60128054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127295780601f106126fe57610100808354040283529160200191612729565b820191906000526020600020905b81548152906001019060200180831161270c57829003601f168201915b505050505081565b606061273c82612ebd565b61277b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277290615507565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128245780601f106127f957610100808354040283529160200191612824565b820191906000526020600020905b81548152906001019060200180831161280757829003601f168201915b5050505050905060006128356119c8565b905060008151141561284b5781925050506128af565b60008251111561288057808260405160200161286892919061519f565b604051602081830303815290604052925050506128af565b8061288a85613400565b60405160200161289b92919061519f565b604051602081830303815290604052925050505b919050565b6060600b60008381526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561295d5780601f106129325761010080835404028352916020019161295d565b820191906000526020600020905b81548152906001019060200180831161294057829003601f168201915b50505050509050919050565b60166020528060005260406000206000915090505481565b606060128054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a195780601f106129ee57610100808354040283529160200191612a19565b820191906000526020600020905b8154815290600101906020018083116129fc57829003601f168201915b5050505050905090565b612a2b612eb5565b73ffffffffffffffffffffffffffffffffffffffff16612a49612104565b73ffffffffffffffffffffffffffffffffffffffff1614612a9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a96906154c7565b60405180910390fd5b6000612aa96111c5565b90506014548110612aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae6906155c7565b60405180910390fd5b612af982826132f2565b5050565b6060600c60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612ba65780601f10612b7b57610100808354040283529160200191612ba6565b820191906000526020600020905b815481529060010190602001808311612b8957829003601f168201915b50505050509050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f60009054906101000a900460ff1681565b612c61612eb5565b73ffffffffffffffffffffffffffffffffffffffff16612c7f612104565b73ffffffffffffffffffffffffffffffffffffffff1614612cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ccc906154c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c906152c7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c6020528060005260406000206000915090508054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612ead5780601f10612e8257610100808354040283529160200191612ead565b820191906000526020600020905b815481529060010190602001808311612e9057829003601f168201915b505050505081565b600033905090565b6000612ed382600261354790919063ffffffff16565b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612f4d8361197e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612fa182600001613561565b9050919050565b6000612fb382612ebd565b612ff2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe9906153c7565b60405180910390fd5b6000612ffd8361197e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061306c57508373ffffffffffffffffffffffffffffffffffffffff1661305484610ec9565b73ffffffffffffffffffffffffffffffffffffffff16145b8061307d575061307c8185612bb2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166130a68261197e565b73ffffffffffffffffffffffffffffffffffffffff16146130fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f3906154e7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561316c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316390615367565b60405180910390fd5b613177838383613572565b613182600082612eda565b6131d381600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061357790919063ffffffff16565b5061322581600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061359190919063ffffffff16565b5061323c818360026135ab9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000808284019050838110156132e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132df90615307565b60405180910390fd5b8091505092915050565b61330c8282604051806020016040528060008152506135e0565b5050565b600061331f836000018361363b565b60001c905092915050565b60008060008061333d86600001866136a8565b915091508160001c8160001c9350935050509250929050565b806009908051906020019061336c929190613f6d565b5050565b6000613383846000018460001b8461372b565b60001c90509392505050565b600061339d826000016137bc565b9050919050565b6133af848484613086565b6133bb848484846137cd565b6133fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133f1906152a7565b60405180910390fd5b50505050565b60606000821415613448576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613542565b600082905060005b60008214613472578080600101915050600a828161346a57fe5b049150613450565b60008167ffffffffffffffff8111801561348b57600080fd5b506040519080825280601f01601f1916602001820160405280156134be5781602001600182028036833780820191505090505b50905060006001830390508593505b6000841461353a57600a84816134df57fe5b0660300160f81b828280600190039350815181106134f957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a848161353257fe5b0493506134cd565b819450505050505b919050565b6000613559836000018360001b613931565b905092915050565b600081600001805490509050919050565b505050565b6000613589836000018360001b613954565b905092915050565b60006135a3836000018360001b613a3c565b905092915050565b60006135d7846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613aac565b90509392505050565b6135ea8383613b88565b6135f760008484846137cd565b613636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161362d906152a7565b60405180910390fd5b505050565b600081836000018054905011613686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367d90615267565b60405180910390fd5b82600001828154811061369557fe5b9060005260206000200154905092915050565b600080828460000180549050116136f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136eb90615467565b60405180910390fd5b600084600001848154811061370557fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000808460010160008581526020019081526020016000205490506000811415839061378d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137849190615245565b60405180910390fd5b508460000160018203815481106137a057fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006137ee8473ffffffffffffffffffffffffffffffffffffffff16613d16565b6137fb5760019050613929565b60006138c263150b7a0260e01b613810612eb5565b88878760405160240161382694939291906151de565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615908603291398773ffffffffffffffffffffffffffffffffffffffff16613d299092919063ffffffff16565b90506000818060200190518101906138da919061460c565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114613a30576000600182039050600060018660000180549050039050600086600001828154811061399f57fe5b90600052602060002001549050808760000184815481106139bc57fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806139f457fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613a36565b60009150505b92915050565b6000613a488383613d41565b613aa1578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613aa6565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415613b5357846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613b81565b82856000016001830381548110613b6657fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bef90615487565b60405180910390fd5b613c0181612ebd565b15613c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c38906152e7565b60405180910390fd5b613c4d60008383613572565b613c9e81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061359190919063ffffffff16565b50613cb5818360026135ab9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6060613d388484600085613d64565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015613da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613da0906153a7565b60405180910390fd5b613db285613d16565b613df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613de890615587565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613e1a9190615188565b60006040518083038185875af1925050503d8060008114613e57576040519150601f19603f3d011682016040523d82523d6000602084013e613e5c565b606091505b5091509150613e6c828286613e78565b92505050949350505050565b60608315613e8857829050613ed8565b600083511115613e9b5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ecf9190615245565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613f155760008555613f5c565b82601f10613f2e57803560ff1916838001178555613f5c565b82800160010185558215613f5c579182015b82811115613f5b578235825591602001919060010190613f40565b5b509050613f699190613ffb565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613fa35760008555613fea565b82601f10613fbc57805160ff1916838001178555613fea565b82800160010185558215613fea579182015b82811115613fe9578251825591602001919060010190613fce565b5b509050613ff79190613ffb565b5090565b5b80821115614014576000816000905550600101613ffc565b5090565b600061402b614026846156ca565b615699565b9050808382526020820190508285602086028201111561404a57600080fd5b60005b8581101561407a5781614060888261416c565b84526020840193506020830192505060018101905061404d565b5050509392505050565b6000614097614092846156f6565b615699565b905080838252602082019050828560208602820111156140b657600080fd5b60005b858110156140e657816140cc8882614346565b8452602084019350602083019250506001810190506140b9565b5050509392505050565b60006141036140fe84615722565b615699565b90508281526020810184848401111561411b57600080fd5b614126848285615856565b509392505050565b600061414161413c84615752565b615699565b90508281526020810184848401111561415957600080fd5b614164848285615856565b509392505050565b60008135905061417b816158ab565b92915050565b600082601f83011261419257600080fd5b81356141a2848260208601614018565b91505092915050565b60008083601f8401126141bd57600080fd5b8235905067ffffffffffffffff8111156141d657600080fd5b6020830191508360208202830111156141ee57600080fd5b9250929050565b60008083601f84011261420757600080fd5b8235905067ffffffffffffffff81111561422057600080fd5b60208301915083602082028301111561423857600080fd5b9250929050565b600082601f83011261425057600080fd5b8135614260848260208601614084565b91505092915050565b600081359050614278816158c2565b92915050565b60008135905061428d816158d9565b92915050565b6000815190506142a2816158d9565b92915050565b600082601f8301126142b957600080fd5b81356142c98482602086016140f0565b91505092915050565b60008083601f8401126142e457600080fd5b8235905067ffffffffffffffff8111156142fd57600080fd5b60208301915083600182028301111561431557600080fd5b9250929050565b600082601f83011261432d57600080fd5b813561433d84826020860161412e565b91505092915050565b600081359050614355816158f0565b92915050565b60006020828403121561436d57600080fd5b600061437b8482850161416c565b91505092915050565b6000806040838503121561439757600080fd5b60006143a58582860161416c565b92505060206143b68582860161416c565b9150509250929050565b6000806000606084860312156143d557600080fd5b60006143e38682870161416c565b93505060206143f48682870161416c565b925050604061440586828701614346565b9150509250925092565b6000806000806080858703121561442557600080fd5b60006144338782880161416c565b94505060206144448782880161416c565b935050604061445587828801614346565b925050606085013567ffffffffffffffff81111561447257600080fd5b61447e878288016142a8565b91505092959194509250565b6000806040838503121561449d57600080fd5b60006144ab8582860161416c565b92505060206144bc85828601614269565b9150509250929050565b600080604083850312156144d957600080fd5b60006144e78582860161416c565b92505060206144f885828601614346565b9150509250929050565b6000806040838503121561451557600080fd5b600083013567ffffffffffffffff81111561452f57600080fd5b61453b85828601614181565b925050602083013567ffffffffffffffff81111561455857600080fd5b6145648582860161423f565b9150509250929050565b6000806000806040858703121561458457600080fd5b600085013567ffffffffffffffff81111561459e57600080fd5b6145aa878288016141f5565b9450945050602085013567ffffffffffffffff8111156145c957600080fd5b6145d5878288016141ab565b925092505092959194509250565b6000602082840312156145f557600080fd5b60006146038482850161427e565b91505092915050565b60006020828403121561461e57600080fd5b600061462c84828501614293565b91505092915050565b6000806020838503121561464857600080fd5b600083013567ffffffffffffffff81111561466257600080fd5b61466e858286016142d2565b92509250509250929050565b60006020828403121561468c57600080fd5b600082013567ffffffffffffffff8111156146a657600080fd5b6146b28482850161431c565b91505092915050565b6000602082840312156146cd57600080fd5b60006146db84828501614346565b91505092915050565b6146ed816157e2565b82525050565b6146fc816157d0565b82525050565b61470b816157f4565b82525050565b600061471c82615782565b6147268185615798565b9350614736818560208601615865565b61473f8161589a565b840191505092915050565b600061475582615782565b61475f81856157a9565b935061476f818560208601615865565b80840191505092915050565b60006147868261578d565b61479081856157b4565b93506147a0818560208601615865565b6147a98161589a565b840191505092915050565b60006147bf8261578d565b6147c981856157c5565b93506147d9818560208601615865565b80840191505092915050565b60006147f26022836157b4565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006148586006836157b4565b91507f6f6e6c79203100000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006148986032836157b4565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006148fe6026836157b4565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614964601c836157b4565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006149a4601b836157b4565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b60006149e4600b836157b4565b91507f707265636973656c7920310000000000000000000000000000000000000000006000830152602082019050919050565b6000614a246008836157b4565b91507f6d6f7265206574680000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614a646024836157b4565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614aca6019836157b4565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614b0a6026836157b4565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b70602c836157b4565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614bd6600b836157b4565b91507f6e6f7420616c6c6f7765640000000000000000000000000000000000000000006000830152602082019050919050565b6000614c166038836157b4565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614c7c602a836157b4565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ce26010836157b4565b91507f70726573616c65206e6f74206f70656e000000000000000000000000000000006000830152602082019050919050565b6000614d226022836157b4565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d886020836157b4565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614dc8602c836157b4565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614e2e6020836157b4565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614e6e6029836157b4565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ed4602f836157b4565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614f3a6008836157b4565b91507f746f6f206d616e790000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614f7a6021836157b4565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614fe06031836157b4565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000615046601d836157b4565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b60006150866015836157b4565b91507f616c7265616479207265636f6e737472756374656400000000000000000000006000830152602082019050919050565b60006150c66010836157b4565b91507f65786365656465642072657365727665000000000000000000000000000000006000830152602082019050919050565b6000615106600f836157b4565b91507f7075626c6963206e6f74206f70656e00000000000000000000000000000000006000830152602082019050919050565b6000615146600b836157b4565b91507f657863656564206d696e740000000000000000000000000000000000000000006000830152602082019050919050565b6151828161584c565b82525050565b6000615194828461474a565b915081905092915050565b60006151ab82856147b4565b91506151b782846147b4565b91508190509392505050565b60006020820190506151d860008301846146f3565b92915050565b60006080820190506151f360008301876146e4565b61520060208301866146f3565b61520d6040830185615179565b818103606083015261521f8184614711565b905095945050505050565b600060208201905061523f6000830184614702565b92915050565b6000602082019050818103600083015261525f818461477b565b905092915050565b60006020820190508181036000830152615280816147e5565b9050919050565b600060208201905081810360008301526152a08161484b565b9050919050565b600060208201905081810360008301526152c08161488b565b9050919050565b600060208201905081810360008301526152e0816148f1565b9050919050565b6000602082019050818103600083015261530081614957565b9050919050565b6000602082019050818103600083015261532081614997565b9050919050565b60006020820190508181036000830152615340816149d7565b9050919050565b6000602082019050818103600083015261536081614a17565b9050919050565b6000602082019050818103600083015261538081614a57565b9050919050565b600060208201905081810360008301526153a081614abd565b9050919050565b600060208201905081810360008301526153c081614afd565b9050919050565b600060208201905081810360008301526153e081614b63565b9050919050565b6000602082019050818103600083015261540081614bc9565b9050919050565b6000602082019050818103600083015261542081614c09565b9050919050565b6000602082019050818103600083015261544081614c6f565b9050919050565b6000602082019050818103600083015261546081614cd5565b9050919050565b6000602082019050818103600083015261548081614d15565b9050919050565b600060208201905081810360008301526154a081614d7b565b9050919050565b600060208201905081810360008301526154c081614dbb565b9050919050565b600060208201905081810360008301526154e081614e21565b9050919050565b6000602082019050818103600083015261550081614e61565b9050919050565b6000602082019050818103600083015261552081614ec7565b9050919050565b6000602082019050818103600083015261554081614f2d565b9050919050565b6000602082019050818103600083015261556081614f6d565b9050919050565b6000602082019050818103600083015261558081614fd3565b9050919050565b600060208201905081810360008301526155a081615039565b9050919050565b600060208201905081810360008301526155c081615079565b9050919050565b600060208201905081810360008301526155e0816150b9565b9050919050565b60006020820190508181036000830152615600816150f9565b9050919050565b6000602082019050818103600083015261562081615139565b9050919050565b600060208201905061563c6000830184615179565b92915050565b6000808335600160200384360303811261565b57600080fd5b80840192508235915067ffffffffffffffff82111561567957600080fd5b60208301925060018202360383131561569157600080fd5b509250929050565b6000604051905081810181811067ffffffffffffffff821117156156c0576156bf615898565b5b8060405250919050565b600067ffffffffffffffff8211156156e5576156e4615898565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561571157615710615898565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561573d5761573c615898565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561576d5761576c615898565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006157db8261582c565b9050919050565b60006157ed8261582c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615883578082015181840152602081019050615868565b83811115615892576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b6158b4816157d0565b81146158bf57600080fd5b50565b6158cb816157f4565b81146158d657600080fd5b50565b6158e281615800565b81146158ed57600080fd5b50565b6158f98161584c565b811461590457600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220f2d510bf4c02ab218d7f4a7476f728450867c6008213899cff4343ed71f9a9ce64736f6c63430007060033

Deployed Bytecode

0x6080604052600436106103345760003560e01c80636c0360eb116101ab578063b88d4fde116100f7578063dc5d7f4111610095578063e985e9c51161006f578063e985e9c514610bef578063ee7cd16714610c2c578063f2fde38b14610c57578063fd0e710f14610c8057610334565b8063dc5d7f4114610b5e578063dd129da214610b89578063dfa7fdce14610bb257610334565b8063c7b030da116100d1578063c7b030da14610a7c578063c87b56dd14610aa7578063d4a8248714610ae4578063d936547e14610b2157610334565b8063b88d4fde146109fd578063bbfc27f614610a26578063c23249a114610a5157610334565b80638ad433ac1161016457806395d89b411161013e57806395d89b41146109555780639e129c9114610980578063a22cb465146109ab578063aeca5a8c146109d457610334565b80638ad433ac146108f75780638da5cb5b1461091357806392ea7d9c1461093e57610334565b80636c0360eb146107f957806370a0823114610824578063715018a6146108615780637c0f08fc1461087857806385f4a1ab146108a15780638652e469146108cc57610334565b80632db115441161028557806342842e0e1161022357806355f804b3116101fd57806355f804b31461073f57806356798bda146107685780636352211e14610791578063649dc4a1146107ce57610334565b806342842e0e1461069c5780634f6ccce7146106c5578063529be43b1461070257610334565b806337f1fc251161025f57806337f1fc25146105f25780633ccfd60b1461062f5780633d01afb5146106465780633dae71ff1461067157610334565b80632db11544146105705780632eef3b321461058c5780632f745c59146105b557610334565b80630fcf2e75116102f257806318160ddd116102cc57806318160ddd146104c85780631f0234d8146104f357806323b872dd1461051e5780632ad2804c1461054757610334565b80630fcf2e751461044757806316d601b314610472578063176f00aa1461049d57610334565b80629f66c41461033957806301ffc9a71461036257806306fdde031461039f578063081812fc146103ca57806308239c9614610407578063095ea7b31461041e575b600080fd5b34801561034557600080fd5b50610360600480360381019061035b9190614635565b610cbd565b005b34801561036e57600080fd5b50610389600480360381019061038491906145e3565b610dc0565b604051610396919061522a565b60405180910390f35b3480156103ab57600080fd5b506103b4610e27565b6040516103c19190615245565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec91906146bb565b610ec9565b6040516103fe91906151c3565b60405180910390f35b34801561041357600080fd5b5061041c610f4e565b005b34801561042a57600080fd5b50610445600480360381019061044091906144c6565b610ff6565b005b34801561045357600080fd5b5061045c61110e565b604051610469919061522a565b60405180910390f35b34801561047e57600080fd5b50610487611121565b6040516104949190615245565b60405180910390f35b3480156104a957600080fd5b506104b26111bf565b6040516104bf9190615627565b60405180910390f35b3480156104d457600080fd5b506104dd6111c5565b6040516104ea9190615627565b60405180910390f35b3480156104ff57600080fd5b506105086111d6565b604051610515919061522a565b60405180910390f35b34801561052a57600080fd5b50610545600480360381019061054091906143c0565b6111e9565b005b34801561055357600080fd5b5061056e6004803603810190610569919061456e565b611249565b005b61058a600480360381019061058591906146bb565b611338565b005b34801561059857600080fd5b506105b360048036038101906105ae9190614635565b61149f565b005b3480156105c157600080fd5b506105dc60048036038101906105d791906144c6565b6115a2565b6040516105e99190615627565b60405180910390f35b3480156105fe57600080fd5b50610619600480360381019061061491906146bb565b6115fd565b6040516106269190615245565b60405180910390f35b34801561063b57600080fd5b506106446116ad565b005b34801561065257600080fd5b5061065b611778565b604051610668919061522a565b60405180910390f35b34801561067d57600080fd5b5061068661178b565b6040516106939190615627565b60405180910390f35b3480156106a857600080fd5b506106c360048036038101906106be91906143c0565b611797565b005b3480156106d157600080fd5b506106ec60048036038101906106e791906146bb565b6117b7565b6040516106f99190615627565b60405180910390f35b34801561070e57600080fd5b506107296004803603810190610724919061435b565b6117da565b6040516107369190615627565b60405180910390f35b34801561074b57600080fd5b506107666004803603810190610761919061467a565b6117f2565b005b34801561077457600080fd5b5061078f600480360381019061078a9190614502565b61187a565b005b34801561079d57600080fd5b506107b860048036038101906107b391906146bb565b61197e565b6040516107c591906151c3565b60405180910390f35b3480156107da57600080fd5b506107e36119b5565b6040516107f0919061522a565b60405180910390f35b34801561080557600080fd5b5061080e6119c8565b60405161081b9190615245565b60405180910390f35b34801561083057600080fd5b5061084b6004803603810190610846919061435b565b611a6a565b6040516108589190615627565b60405180910390f35b34801561086d57600080fd5b50610876611b29565b005b34801561088457600080fd5b5061089f600480360381019061089a9190614635565b611c66565b005b3480156108ad57600080fd5b506108b6611d69565b6040516108c39190615627565b60405180910390f35b3480156108d857600080fd5b506108e1611d6f565b6040516108ee9190615245565b60405180910390f35b610911600480360381019061090c91906146bb565b611e0d565b005b34801561091f57600080fd5b50610928612104565b60405161093591906151c3565b60405180910390f35b34801561094a57600080fd5b5061095361212e565b005b34801561096157600080fd5b5061096a6121d6565b6040516109779190615245565b60405180910390f35b34801561098c57600080fd5b50610995612278565b6040516109a29190615245565b60405180910390f35b3480156109b757600080fd5b506109d260048036038101906109cd919061448a565b61231a565b005b3480156109e057600080fd5b506109fb60048036038101906109f6919061456e565b61249b565b005b348015610a0957600080fd5b50610a246004803603810190610a1f919061440f565b61258a565b005b348015610a3257600080fd5b50610a3b6125ec565b604051610a489190615627565b60405180910390f35b348015610a5d57600080fd5b50610a666125f1565b604051610a739190615245565b60405180910390f35b348015610a8857600080fd5b50610a91612693565b604051610a9e9190615245565b60405180910390f35b348015610ab357600080fd5b50610ace6004803603810190610ac991906146bb565b612731565b604051610adb9190615245565b60405180910390f35b348015610af057600080fd5b50610b0b6004803603810190610b0691906146bb565b6128b4565b604051610b189190615245565b60405180910390f35b348015610b2d57600080fd5b50610b486004803603810190610b43919061435b565b612969565b604051610b559190615627565b60405180910390f35b348015610b6a57600080fd5b50610b73612981565b604051610b809190615245565b60405180910390f35b348015610b9557600080fd5b50610bb06004803603810190610bab919061435b565b612a23565b005b348015610bbe57600080fd5b50610bd96004803603810190610bd491906146bb565b612afd565b604051610be69190615245565b60405180910390f35b348015610bfb57600080fd5b50610c166004803603810190610c119190614384565b612bb2565b604051610c23919061522a565b60405180910390f35b348015610c3857600080fd5b50610c41612c46565b604051610c4e919061522a565b60405180910390f35b348015610c6357600080fd5b50610c7e6004803603810190610c79919061435b565b612c59565b005b348015610c8c57600080fd5b50610ca76004803603810190610ca291906146bb565b612e05565b604051610cb49190615245565b60405180910390f35b610cc5612eb5565b73ffffffffffffffffffffffffffffffffffffffff16610ce3612104565b73ffffffffffffffffffffffffffffffffffffffff1614610d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d30906154c7565b60405180910390fd5b60001515600f60009054906101000a900460ff16151514610d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d86906155a7565b60405180910390fd5b6001600f60006101000a81548160ff0219169083151502179055508181600e9190610dbb929190613edf565b505050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ebf5780601f10610e9457610100808354040283529160200191610ebf565b820191906000526020600020905b815481529060010190602001808311610ea257829003601f168201915b5050505050905090565b6000610ed482612ebd565b610f13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0a906154a7565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610f56612eb5565b73ffffffffffffffffffffffffffffffffffffffff16610f74612104565b73ffffffffffffffffffffffffffffffffffffffff1614610fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc1906154c7565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b60006110018261197e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106990615547565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611091612eb5565b73ffffffffffffffffffffffffffffffffffffffff1614806110c057506110bf816110ba612eb5565b612bb2565b5b6110ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f690615407565b60405180910390fd5b6111098383612eda565b505050565b600d60019054906101000a900460ff1681565b60108054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111b75780601f1061118c576101008083540402835291602001916111b7565b820191906000526020600020905b81548152906001019060200180831161119a57829003601f168201915b505050505081565b61013b81565b60006111d16002612f93565b905090565b600d60009054906101000a900460ff1681565b6111fa6111f4612eb5565b82612fa8565b611239576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123090615567565b60405180910390fd5b611244838383613086565b505050565b611251612eb5565b73ffffffffffffffffffffffffffffffffffffffff1661126f612104565b73ffffffffffffffffffffffffffffffffffffffff16146112c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bc906154c7565b60405180910390fd5b60005b84849050811015611331578282828181106112df57fe5b90506020028101906112f19190615642565b600c600088888681811061130157fe5b9050602002013581526020019081526020016000209190611323929190613edf565b5080806001019150506112c8565b5050505050565b600d60019054906101000a900460ff16611387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137e906155e7565b60405180910390fd5b600181146113ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c190615327565b60405180910390fd5b61013b6113e7826113d96111c5565b61329d90919063ffffffff16565b1115611428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141f90615527565b60405180910390fd5b670470de4df8200000341015611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a90615347565b60405180910390fd5b600061147d6111c5565b905061013b61148a6111c5565b101561149b5761149a33826132f2565b5b5050565b6114a7612eb5565b73ffffffffffffffffffffffffffffffffffffffff166114c5612104565b73ffffffffffffffffffffffffffffffffffffffff161461151b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611512906154c7565b60405180910390fd5b60001515601160009054906101000a900460ff16151514611571576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611568906155a7565b60405180910390fd5b6001601160006101000a81548160ff02191690831515021790555081816010919061159d929190613edf565b505050565b60006115f582600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061331090919063ffffffff16565b905092915050565b600b6020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116a55780601f1061167a576101008083540402835291602001916116a5565b820191906000526020600020905b81548152906001019060200180831161168857829003601f168201915b505050505081565b6116b5612eb5565b73ffffffffffffffffffffffffffffffffffffffff166116d3612104565b73ffffffffffffffffffffffffffffffffffffffff1614611729576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611720906154c7565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611774573d6000803e3d6000fd5b5050565b601360009054906101000a900460ff1681565b670470de4df820000081565b6117b28383836040518060200160405280600081525061258a565b505050565b6000806117ce83600261332a90919063ffffffff16565b50905080915050919050565b60156020528060005260406000206000915090505481565b6117fa612eb5565b73ffffffffffffffffffffffffffffffffffffffff16611818612104565b73ffffffffffffffffffffffffffffffffffffffff161461186e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611865906154c7565b60405180910390fd5b61187781613356565b50565b611882612eb5565b73ffffffffffffffffffffffffffffffffffffffff166118a0612104565b73ffffffffffffffffffffffffffffffffffffffff16146118f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ed906154c7565b60405180910390fd5b60005b82518110156119795781818151811061190e57fe5b60200260200101516016600085848151811061192657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806001019150506118f9565b505050565b60006119ae8260405180606001604052806029815260200161593a6029913960026133709092919063ffffffff16565b9050919050565b601160009054906101000a900460ff1681565b606060098054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a605780601f10611a3557610100808354040283529160200191611a60565b820191906000526020600020905b815481529060010190602001808311611a4357829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad290615427565b60405180910390fd5b611b22600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061338f565b9050919050565b611b31612eb5565b73ffffffffffffffffffffffffffffffffffffffff16611b4f612104565b73ffffffffffffffffffffffffffffffffffffffff1614611ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9c906154c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611c6e612eb5565b73ffffffffffffffffffffffffffffffffffffffff16611c8c612104565b73ffffffffffffffffffffffffffffffffffffffff1614611ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd9906154c7565b60405180910390fd5b60001515601360009054906101000a900460ff16151514611d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2f906155a7565b60405180910390fd5b6001601360006101000a81548160ff021916908315150217905550818160129190611d64929190613edf565b505050565b60145481565b600e8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e055780601f10611dda57610100808354040283529160200191611e05565b820191906000526020600020905b815481529060010190602001808311611de857829003601f168201915b505050505081565b600d60009054906101000a900460ff16611e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5390615447565b60405180910390fd5b6000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed5906153e7565b60405180910390fd5b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9590615607565b60405180910390fd5b61013b611fbb82611fad6111c5565b61329d90919063ffffffff16565b1115611ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff390615527565b60405180910390fd5b6001811461203f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203690615287565b60405180910390fd5b670470de4df820000034101561208a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208190615347565b60405180910390fd5b60006120946111c5565b905061013b6120a16111c5565b1015612100576120b133826132f2565b6001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b612136612eb5565b73ffffffffffffffffffffffffffffffffffffffff16612154612104565b73ffffffffffffffffffffffffffffffffffffffff16146121aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a1906154c7565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b606060078054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561226e5780601f106122435761010080835404028352916020019161226e565b820191906000526020600020905b81548152906001019060200180831161225157829003601f168201915b5050505050905090565b6060600e8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123105780601f106122e557610100808354040283529160200191612310565b820191906000526020600020905b8154815290600101906020018083116122f357829003601f168201915b5050505050905090565b612322612eb5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238790615387565b60405180910390fd5b806005600061239d612eb5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661244a612eb5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161248f919061522a565b60405180910390a35050565b6124a3612eb5565b73ffffffffffffffffffffffffffffffffffffffff166124c1612104565b73ffffffffffffffffffffffffffffffffffffffff1614612517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250e906154c7565b60405180910390fd5b60005b848490508110156125835782828281811061253157fe5b90506020028101906125439190615642565b600b600088888681811061255357fe5b9050602002013581526020019081526020016000209190612575929190613edf565b50808060010191505061251a565b5050505050565b61259b612595612eb5565b83612fa8565b6125da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d190615567565b60405180910390fd5b6125e6848484846133a4565b50505050565b600181565b606060108054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156126895780601f1061265e57610100808354040283529160200191612689565b820191906000526020600020905b81548152906001019060200180831161266c57829003601f168201915b5050505050905090565b60128054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127295780601f106126fe57610100808354040283529160200191612729565b820191906000526020600020905b81548152906001019060200180831161270c57829003601f168201915b505050505081565b606061273c82612ebd565b61277b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277290615507565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128245780601f106127f957610100808354040283529160200191612824565b820191906000526020600020905b81548152906001019060200180831161280757829003601f168201915b5050505050905060006128356119c8565b905060008151141561284b5781925050506128af565b60008251111561288057808260405160200161286892919061519f565b604051602081830303815290604052925050506128af565b8061288a85613400565b60405160200161289b92919061519f565b604051602081830303815290604052925050505b919050565b6060600b60008381526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561295d5780601f106129325761010080835404028352916020019161295d565b820191906000526020600020905b81548152906001019060200180831161294057829003601f168201915b50505050509050919050565b60166020528060005260406000206000915090505481565b606060128054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a195780601f106129ee57610100808354040283529160200191612a19565b820191906000526020600020905b8154815290600101906020018083116129fc57829003601f168201915b5050505050905090565b612a2b612eb5565b73ffffffffffffffffffffffffffffffffffffffff16612a49612104565b73ffffffffffffffffffffffffffffffffffffffff1614612a9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a96906154c7565b60405180910390fd5b6000612aa96111c5565b90506014548110612aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae6906155c7565b60405180910390fd5b612af982826132f2565b5050565b6060600c60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612ba65780601f10612b7b57610100808354040283529160200191612ba6565b820191906000526020600020905b815481529060010190602001808311612b8957829003601f168201915b50505050509050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f60009054906101000a900460ff1681565b612c61612eb5565b73ffffffffffffffffffffffffffffffffffffffff16612c7f612104565b73ffffffffffffffffffffffffffffffffffffffff1614612cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ccc906154c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c906152c7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c6020528060005260406000206000915090508054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612ead5780601f10612e8257610100808354040283529160200191612ead565b820191906000526020600020905b815481529060010190602001808311612e9057829003601f168201915b505050505081565b600033905090565b6000612ed382600261354790919063ffffffff16565b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612f4d8361197e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612fa182600001613561565b9050919050565b6000612fb382612ebd565b612ff2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe9906153c7565b60405180910390fd5b6000612ffd8361197e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061306c57508373ffffffffffffffffffffffffffffffffffffffff1661305484610ec9565b73ffffffffffffffffffffffffffffffffffffffff16145b8061307d575061307c8185612bb2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166130a68261197e565b73ffffffffffffffffffffffffffffffffffffffff16146130fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f3906154e7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561316c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316390615367565b60405180910390fd5b613177838383613572565b613182600082612eda565b6131d381600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061357790919063ffffffff16565b5061322581600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061359190919063ffffffff16565b5061323c818360026135ab9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000808284019050838110156132e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132df90615307565b60405180910390fd5b8091505092915050565b61330c8282604051806020016040528060008152506135e0565b5050565b600061331f836000018361363b565b60001c905092915050565b60008060008061333d86600001866136a8565b915091508160001c8160001c9350935050509250929050565b806009908051906020019061336c929190613f6d565b5050565b6000613383846000018460001b8461372b565b60001c90509392505050565b600061339d826000016137bc565b9050919050565b6133af848484613086565b6133bb848484846137cd565b6133fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133f1906152a7565b60405180910390fd5b50505050565b60606000821415613448576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613542565b600082905060005b60008214613472578080600101915050600a828161346a57fe5b049150613450565b60008167ffffffffffffffff8111801561348b57600080fd5b506040519080825280601f01601f1916602001820160405280156134be5781602001600182028036833780820191505090505b50905060006001830390508593505b6000841461353a57600a84816134df57fe5b0660300160f81b828280600190039350815181106134f957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a848161353257fe5b0493506134cd565b819450505050505b919050565b6000613559836000018360001b613931565b905092915050565b600081600001805490509050919050565b505050565b6000613589836000018360001b613954565b905092915050565b60006135a3836000018360001b613a3c565b905092915050565b60006135d7846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613aac565b90509392505050565b6135ea8383613b88565b6135f760008484846137cd565b613636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161362d906152a7565b60405180910390fd5b505050565b600081836000018054905011613686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367d90615267565b60405180910390fd5b82600001828154811061369557fe5b9060005260206000200154905092915050565b600080828460000180549050116136f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136eb90615467565b60405180910390fd5b600084600001848154811061370557fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000808460010160008581526020019081526020016000205490506000811415839061378d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137849190615245565b60405180910390fd5b508460000160018203815481106137a057fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006137ee8473ffffffffffffffffffffffffffffffffffffffff16613d16565b6137fb5760019050613929565b60006138c263150b7a0260e01b613810612eb5565b88878760405160240161382694939291906151de565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615908603291398773ffffffffffffffffffffffffffffffffffffffff16613d299092919063ffffffff16565b90506000818060200190518101906138da919061460c565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114613a30576000600182039050600060018660000180549050039050600086600001828154811061399f57fe5b90600052602060002001549050808760000184815481106139bc57fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806139f457fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613a36565b60009150505b92915050565b6000613a488383613d41565b613aa1578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613aa6565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415613b5357846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613b81565b82856000016001830381548110613b6657fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bef90615487565b60405180910390fd5b613c0181612ebd565b15613c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c38906152e7565b60405180910390fd5b613c4d60008383613572565b613c9e81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061359190919063ffffffff16565b50613cb5818360026135ab9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6060613d388484600085613d64565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015613da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613da0906153a7565b60405180910390fd5b613db285613d16565b613df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613de890615587565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613e1a9190615188565b60006040518083038185875af1925050503d8060008114613e57576040519150601f19603f3d011682016040523d82523d6000602084013e613e5c565b606091505b5091509150613e6c828286613e78565b92505050949350505050565b60608315613e8857829050613ed8565b600083511115613e9b5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ecf9190615245565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613f155760008555613f5c565b82601f10613f2e57803560ff1916838001178555613f5c565b82800160010185558215613f5c579182015b82811115613f5b578235825591602001919060010190613f40565b5b509050613f699190613ffb565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613fa35760008555613fea565b82601f10613fbc57805160ff1916838001178555613fea565b82800160010185558215613fea579182015b82811115613fe9578251825591602001919060010190613fce565b5b509050613ff79190613ffb565b5090565b5b80821115614014576000816000905550600101613ffc565b5090565b600061402b614026846156ca565b615699565b9050808382526020820190508285602086028201111561404a57600080fd5b60005b8581101561407a5781614060888261416c565b84526020840193506020830192505060018101905061404d565b5050509392505050565b6000614097614092846156f6565b615699565b905080838252602082019050828560208602820111156140b657600080fd5b60005b858110156140e657816140cc8882614346565b8452602084019350602083019250506001810190506140b9565b5050509392505050565b60006141036140fe84615722565b615699565b90508281526020810184848401111561411b57600080fd5b614126848285615856565b509392505050565b600061414161413c84615752565b615699565b90508281526020810184848401111561415957600080fd5b614164848285615856565b509392505050565b60008135905061417b816158ab565b92915050565b600082601f83011261419257600080fd5b81356141a2848260208601614018565b91505092915050565b60008083601f8401126141bd57600080fd5b8235905067ffffffffffffffff8111156141d657600080fd5b6020830191508360208202830111156141ee57600080fd5b9250929050565b60008083601f84011261420757600080fd5b8235905067ffffffffffffffff81111561422057600080fd5b60208301915083602082028301111561423857600080fd5b9250929050565b600082601f83011261425057600080fd5b8135614260848260208601614084565b91505092915050565b600081359050614278816158c2565b92915050565b60008135905061428d816158d9565b92915050565b6000815190506142a2816158d9565b92915050565b600082601f8301126142b957600080fd5b81356142c98482602086016140f0565b91505092915050565b60008083601f8401126142e457600080fd5b8235905067ffffffffffffffff8111156142fd57600080fd5b60208301915083600182028301111561431557600080fd5b9250929050565b600082601f83011261432d57600080fd5b813561433d84826020860161412e565b91505092915050565b600081359050614355816158f0565b92915050565b60006020828403121561436d57600080fd5b600061437b8482850161416c565b91505092915050565b6000806040838503121561439757600080fd5b60006143a58582860161416c565b92505060206143b68582860161416c565b9150509250929050565b6000806000606084860312156143d557600080fd5b60006143e38682870161416c565b93505060206143f48682870161416c565b925050604061440586828701614346565b9150509250925092565b6000806000806080858703121561442557600080fd5b60006144338782880161416c565b94505060206144448782880161416c565b935050604061445587828801614346565b925050606085013567ffffffffffffffff81111561447257600080fd5b61447e878288016142a8565b91505092959194509250565b6000806040838503121561449d57600080fd5b60006144ab8582860161416c565b92505060206144bc85828601614269565b9150509250929050565b600080604083850312156144d957600080fd5b60006144e78582860161416c565b92505060206144f885828601614346565b9150509250929050565b6000806040838503121561451557600080fd5b600083013567ffffffffffffffff81111561452f57600080fd5b61453b85828601614181565b925050602083013567ffffffffffffffff81111561455857600080fd5b6145648582860161423f565b9150509250929050565b6000806000806040858703121561458457600080fd5b600085013567ffffffffffffffff81111561459e57600080fd5b6145aa878288016141f5565b9450945050602085013567ffffffffffffffff8111156145c957600080fd5b6145d5878288016141ab565b925092505092959194509250565b6000602082840312156145f557600080fd5b60006146038482850161427e565b91505092915050565b60006020828403121561461e57600080fd5b600061462c84828501614293565b91505092915050565b6000806020838503121561464857600080fd5b600083013567ffffffffffffffff81111561466257600080fd5b61466e858286016142d2565b92509250509250929050565b60006020828403121561468c57600080fd5b600082013567ffffffffffffffff8111156146a657600080fd5b6146b28482850161431c565b91505092915050565b6000602082840312156146cd57600080fd5b60006146db84828501614346565b91505092915050565b6146ed816157e2565b82525050565b6146fc816157d0565b82525050565b61470b816157f4565b82525050565b600061471c82615782565b6147268185615798565b9350614736818560208601615865565b61473f8161589a565b840191505092915050565b600061475582615782565b61475f81856157a9565b935061476f818560208601615865565b80840191505092915050565b60006147868261578d565b61479081856157b4565b93506147a0818560208601615865565b6147a98161589a565b840191505092915050565b60006147bf8261578d565b6147c981856157c5565b93506147d9818560208601615865565b80840191505092915050565b60006147f26022836157b4565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006148586006836157b4565b91507f6f6e6c79203100000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006148986032836157b4565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006148fe6026836157b4565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614964601c836157b4565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006149a4601b836157b4565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b60006149e4600b836157b4565b91507f707265636973656c7920310000000000000000000000000000000000000000006000830152602082019050919050565b6000614a246008836157b4565b91507f6d6f7265206574680000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614a646024836157b4565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614aca6019836157b4565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614b0a6026836157b4565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b70602c836157b4565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614bd6600b836157b4565b91507f6e6f7420616c6c6f7765640000000000000000000000000000000000000000006000830152602082019050919050565b6000614c166038836157b4565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614c7c602a836157b4565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ce26010836157b4565b91507f70726573616c65206e6f74206f70656e000000000000000000000000000000006000830152602082019050919050565b6000614d226022836157b4565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d886020836157b4565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614dc8602c836157b4565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614e2e6020836157b4565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614e6e6029836157b4565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ed4602f836157b4565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614f3a6008836157b4565b91507f746f6f206d616e790000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614f7a6021836157b4565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614fe06031836157b4565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000615046601d836157b4565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b60006150866015836157b4565b91507f616c7265616479207265636f6e737472756374656400000000000000000000006000830152602082019050919050565b60006150c66010836157b4565b91507f65786365656465642072657365727665000000000000000000000000000000006000830152602082019050919050565b6000615106600f836157b4565b91507f7075626c6963206e6f74206f70656e00000000000000000000000000000000006000830152602082019050919050565b6000615146600b836157b4565b91507f657863656564206d696e740000000000000000000000000000000000000000006000830152602082019050919050565b6151828161584c565b82525050565b6000615194828461474a565b915081905092915050565b60006151ab82856147b4565b91506151b782846147b4565b91508190509392505050565b60006020820190506151d860008301846146f3565b92915050565b60006080820190506151f360008301876146e4565b61520060208301866146f3565b61520d6040830185615179565b818103606083015261521f8184614711565b905095945050505050565b600060208201905061523f6000830184614702565b92915050565b6000602082019050818103600083015261525f818461477b565b905092915050565b60006020820190508181036000830152615280816147e5565b9050919050565b600060208201905081810360008301526152a08161484b565b9050919050565b600060208201905081810360008301526152c08161488b565b9050919050565b600060208201905081810360008301526152e0816148f1565b9050919050565b6000602082019050818103600083015261530081614957565b9050919050565b6000602082019050818103600083015261532081614997565b9050919050565b60006020820190508181036000830152615340816149d7565b9050919050565b6000602082019050818103600083015261536081614a17565b9050919050565b6000602082019050818103600083015261538081614a57565b9050919050565b600060208201905081810360008301526153a081614abd565b9050919050565b600060208201905081810360008301526153c081614afd565b9050919050565b600060208201905081810360008301526153e081614b63565b9050919050565b6000602082019050818103600083015261540081614bc9565b9050919050565b6000602082019050818103600083015261542081614c09565b9050919050565b6000602082019050818103600083015261544081614c6f565b9050919050565b6000602082019050818103600083015261546081614cd5565b9050919050565b6000602082019050818103600083015261548081614d15565b9050919050565b600060208201905081810360008301526154a081614d7b565b9050919050565b600060208201905081810360008301526154c081614dbb565b9050919050565b600060208201905081810360008301526154e081614e21565b9050919050565b6000602082019050818103600083015261550081614e61565b9050919050565b6000602082019050818103600083015261552081614ec7565b9050919050565b6000602082019050818103600083015261554081614f2d565b9050919050565b6000602082019050818103600083015261556081614f6d565b9050919050565b6000602082019050818103600083015261558081614fd3565b9050919050565b600060208201905081810360008301526155a081615039565b9050919050565b600060208201905081810360008301526155c081615079565b9050919050565b600060208201905081810360008301526155e0816150b9565b9050919050565b60006020820190508181036000830152615600816150f9565b9050919050565b6000602082019050818103600083015261562081615139565b9050919050565b600060208201905061563c6000830184615179565b92915050565b6000808335600160200384360303811261565b57600080fd5b80840192508235915067ffffffffffffffff82111561567957600080fd5b60208301925060018202360383131561569157600080fd5b509250929050565b6000604051905081810181811067ffffffffffffffff821117156156c0576156bf615898565b5b8060405250919050565b600067ffffffffffffffff8211156156e5576156e4615898565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561571157615710615898565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561573d5761573c615898565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561576d5761576c615898565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006157db8261582c565b9050919050565b60006157ed8261582c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615883578082015181840152602081019050615868565b83811115615892576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b6158b4816157d0565b81146158bf57600080fd5b50565b6158cb816157f4565b81146158d657600080fd5b50565b6158e281615800565b81146158ed57600080fd5b50565b6158f98161584c565b811461590457600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220f2d510bf4c02ab218d7f4a7476f728450867c6008213899cff4343ed71f9a9ce64736f6c63430007060033

Deployed Bytecode Sourcemap

74416:6459:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76940:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11446:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57319:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60429:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76683:110;;;;;;;;;;;;;:::i;:::-;;59903:440;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75153:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75339:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74835:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59317:223;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75104:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61423:325;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78821:246;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79261:631;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77205:241;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59051:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74935:60;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75613:143;;;;;;;;;;;;;:::i;:::-;;75479:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74613:59;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61839:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59637:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75822:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76560:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75974:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57047:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75382:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58842:105;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56732:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73682:160;;;;;;;;;;;;;:::i;:::-;;77466:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75559:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75235;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79908:942;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72955:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76809:115;;;;;;;;;;;;;:::i;:::-;;57516:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77723:119;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60758:315;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78211:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62089:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74734:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77862:117;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75437:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57719:856;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78528:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75914:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77999:115;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76231:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79112:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61164:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75279:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74021:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75006:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76940:245;73218:12;:10;:12::i;:::-;73207:23;;:7;:5;:7::i;:::-;:23;;;73199:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77057:5:::1;77036:26;;:17;;;;;;;;;;;:26;;;77028:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;77123:4;77103:17;;:24;;;;;;;;;;;;;;;;;;77164:9;;77142:19;:31;;;;;;;:::i;:::-;;76940:245:::0;;:::o;11446:158::-;11531:4;11559:20;:33;11580:11;11559:33;;;;;;;;;;;;;;;;;;;;;;;;;;;11552:40;;11446:158;;;:::o;57319:108::-;57373:13;57410:5;57403:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57319:108;:::o;60429:237::-;60505:7;60537:16;60545:7;60537;:16::i;:::-;60529:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;60630:15;:24;60646:7;60630:24;;;;;;;;;;;;;;;;;;;;;60623:31;;60429:237;;;:::o;76683:110::-;73218:12;:10;:12::i;:::-;73207:23;;:7;:5;:7::i;:::-;:23;;;73199:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76766:15:::1;;;;;;;;;;;76765:16;76747:15;;:34;;;;;;;;;;;;;;;;;;76683:110::o:0;59903:440::-;59988:13;60004:23;60019:7;60004:14;:23::i;:::-;59988:39;;60056:5;60050:11;;:2;:11;;;;60042:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;60144:5;60128:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;60153:44;60177:5;60184:12;:10;:12::i;:::-;60153:23;:44::i;:::-;60128:69;60120:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;60310:21;60319:2;60323:7;60310:8;:21::i;:::-;59903:440;;;:::o;75153:38::-;;;;;;;;;;;;;:::o;75339:32::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;74835:49::-;74881:3;74835:49;:::o;59317:223::-;59378:7;59507:21;:12;:19;:21::i;:::-;59500:28;;59317:223;:::o;75104:38::-;;;;;;;;;;;;;:::o;61423:325::-;61592:41;61611:12;:10;:12::i;:::-;61625:7;61592:18;:41::i;:::-;61584:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;61708:28;61718:4;61724:2;61728:7;61708:9;:28::i;:::-;61423:325;;;:::o;78821:246::-;73218:12;:10;:12::i;:::-;73207:23;;:7;:5;:7::i;:::-;:23;;;73199:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78942:6:::1;78937:119;78958:8;;:15;;78954:1;:19;78937:119;;;79028:9;;79038:1;79028:12;;;;;;;;;;;;;;;;;;:::i;:::-;78999:13;:26;79013:8;;79022:1;79013:11;;;;;;;;;;;;;78999:26;;;;;;;;;;;:41;;;;;;;:::i;:::-;;78975:3;;;;;;;78937:119;;;;78821:246:::0;;;;:::o;79261:631::-;79342:18;;;;;;;;;;;79334:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;74780:1;79419:15;:41;79411:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;74881:3;79512:34;79530:15;79512:13;:11;:13::i;:::-;:17;;:34;;;;:::i;:::-;:57;;79504:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;74654:18;79634:9;:27;;79626:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;79724:14;79741:13;:11;:13::i;:::-;79724:30;;74881:3;79773:13;:11;:13::i;:::-;:35;79769:112;;;79829:32;79839:10;79851:9;79829;:32::i;:::-;79769:112;79261:631;;:::o;77205:241::-;73218:12;:10;:12::i;:::-;73207:23;;:7;:5;:7::i;:::-;:23;;;73199:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77320:5:::1;77300:25;;:16;;;;;;;;;;;:25;;;77292:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;77385:4;77366:16;;:23;;;;;;;;;;;;;;;;;;77425:9;;77404:18;:30;;;;;;;:::i;:::-;;77205:241:::0;;:::o;59051:170::-;59148:7;59179:30;59203:5;59179:13;:20;59193:5;59179:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;59172:37;;59051:170;;;;:::o;74935:60::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;75613:143::-;73218:12;:10;:12::i;:::-;73207:23;;:7;:5;:7::i;:::-;:23;;;73199:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75665:12:::1;75680:21;75665:36;;75716:10;:19;;:28;75736:7;75716:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;73282:1;75613:143::o:0;75479:37::-;;;;;;;;;;;;;:::o;74613:59::-;74654:18;74613:59;:::o;61839:159::-;61947:39;61964:4;61970:2;61974:7;61947:39;;;;;;;;;;;;:16;:39::i;:::-;61839:159;;;:::o;59637:184::-;59712:7;59737:15;59758:22;59774:5;59758:12;:15;;:22;;;;:::i;:::-;59736:44;;;59802:7;59795:14;;;59637:184;;;:::o;75822:49::-;;;;;;;;;;;;;;;;;:::o;76560:107::-;73218:12;:10;:12::i;:::-;73207:23;;:7;:5;:7::i;:::-;:23;;;73199:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76635:20:::1;76647:7;76635:11;:20::i;:::-;76560:107:::0;:::o;75974:237::-;73218:12;:10;:12::i;:::-;73207:23;;:7;:5;:7::i;:::-;:23;;;73199:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76092:6:::1;76087:113;76108:5;:12;76104:1;:16;76087:113;;;76170:11;76182:1;76170:14;;;;;;;;;;;;;;76146:11;:21;76158:5;76164:1;76158:8;;;;;;;;;;;;;;76146:21;;;;;;;;;;;;;;;:38;;;;76122:3;;;;;;;76087:113;;;;75974:237:::0;;:::o;57047:185::-;57119:7;57150:70;57167:7;57150:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;57143:77;;57047:185;;;:::o;75382:38::-;;;;;;;;;;;;;:::o;58842:105::-;58890:13;58927:8;58920:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58842:105;:::o;56732:233::-;56804:7;56853:1;56836:19;;:5;:19;;;;56828:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;56924:29;:13;:20;56938:5;56924:20;;;;;;;;;;;;;;;:27;:29::i;:::-;56917:36;;56732:233;;;:::o;73682:160::-;73218:12;:10;:12::i;:::-;73207:23;;:7;:5;:7::i;:::-;:23;;;73199:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73793:1:::1;73756:40;;73777:6;;;;;;;;;;;73756:40;;;;;;;;;;;;73828:1;73811:6;;:19;;;;;;;;;;;;;;;;;;73682:160::o:0;77466:237::-;73218:12;:10;:12::i;:::-;73207:23;;:7;:5;:7::i;:::-;:23;;;73199:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77579:5:::1;77560:24;;:15;;;;;;;;;;;:24;;;77552:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;77643:4;77625:15;;:22;;;;;;;;;;;;;;;;;;77682:9;;77662:17;:29;;;;;;;:::i;:::-;;77466:237:::0;;:::o;75559:33::-;;;;:::o;75235:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;79908:942::-;79992:15;;;;;;;;;;;79984:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;80102:1;80076:11;:23;80088:10;80076:23;;;;;;;;;;;;;;;;:27;80068:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;80187:13;:25;80201:10;80187:25;;;;;;;;;;;;;;;;80161:11;:23;80173:10;80161:23;;;;;;;;;;;;;;;;:51;80153:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;74881:3;80280:34;80298:15;80280:13;:11;:13::i;:::-;:17;;:34;;;;:::i;:::-;:57;;80272:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;74780:1;80441:15;:41;80433:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;74654:18;80539:9;:27;;80531:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;80637:14;80654:13;:11;:13::i;:::-;80637:30;;74881:3;80686:13;:11;:13::i;:::-;:35;80682:151;;;80742:32;80752:10;80764:9;80742;:32::i;:::-;80816:1;80787:13;:25;80801:10;80787:25;;;;;;;;;;;;;;;;:30;;;;;;;;;;;80682:151;79908:942;;:::o;72955:95::-;73001:7;73032:6;;;;;;;;;;;73025:13;;72955:95;:::o;76809:115::-;73218:12;:10;:12::i;:::-;73207:23;;:7;:5;:7::i;:::-;:23;;;73199:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76894:18:::1;;;;;;;;;;;76893:19;76872:18;;:40;;;;;;;;;;;;;;;;;;76809:115::o:0;57516:112::-;57572:13;57609:7;57602:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57516:112;:::o;77723:119::-;77774:13;77811:19;77804:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77723:119;:::o;60758:315::-;60877:12;:10;:12::i;:::-;60865:24;;:8;:24;;;;60857:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;60985:8;60940:18;:32;60959:12;:10;:12::i;:::-;60940:32;;;;;;;;;;;;;;;:42;60973:8;60940:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;61042:8;61013:48;;61028:12;:10;:12::i;:::-;61013:48;;;61052:8;61013:48;;;;;;:::i;:::-;;;;;;;;60758:315;;:::o;78211:261::-;73218:12;:10;:12::i;:::-;73207:23;;:7;:5;:7::i;:::-;:23;;;73199:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78335:6:::1;78330:131;78351:8;;:15;;78347:1;:19;78330:131;;;78433:9;;78443:1;78433:12;;;;;;;;;;;;;;;;;;:::i;:::-;78392:25;:38;78418:8;;78427:1;78418:11;;;;;;;;;;;;;78392:38;;;;;;;;;;;:53;;;;;;;:::i;:::-;;78368:3;;;;;;;78330:131;;;;78211:261:::0;;;;:::o;62089:297::-;62225:41;62244:12;:10;:12::i;:::-;62258:7;62225:18;:41::i;:::-;62217:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;62335:39;62349:4;62355:2;62359:7;62368:5;62335:13;:39::i;:::-;62089:297;;;;:::o;74734:47::-;74780:1;74734:47;:::o;77862:117::-;77912:13;77949:18;77942:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77862:117;:::o;75437:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57719:856::-;57792:13;57830:16;57838:7;57830;:16::i;:::-;57822:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;57919:23;57945:10;:19;57956:7;57945:19;;;;;;;;;;;57919:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57979:18;58000:9;:7;:9::i;:::-;57979:30;;58119:1;58103:4;58097:18;:23;58093:80;;;58148:9;58141:16;;;;;;58093:80;58311:1;58291:9;58285:23;:27;58281:116;;;58364:4;58370:9;58347:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58333:48;;;;;;58281:116;58537:4;58543:18;:7;:16;:18::i;:::-;58520:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58506:57;;;;57719:856;;;;:::o;78528:152::-;78596:13;78633:25;:35;78659:8;78633:35;;;;;;;;;;;78626:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78528:152;;;:::o;75914:47::-;;;;;;;;;;;;;;;;;:::o;77999:115::-;78048:13;78085:17;78078:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77999:115;:::o;76231:313::-;73218:12;:10;:12::i;:::-;73207:23;;:7;:5;:7::i;:::-;:23;;;73199:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76311:11:::1;76325:13;:11;:13::i;:::-;76311:27;;76370:17;;76361:6;:26;76353:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;76510:22;76520:3;76525:6;76510:9;:22::i;:::-;73282:1;76231:313:::0;:::o;79112:137::-;79177:13;79214;:23;79228:8;79214:23;;;;;;;;;;;79207:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79112:137;;;:::o;61164:172::-;61261:4;61289:18;:25;61308:5;61289:25;;;;;;;;;;;;;;;:35;61315:8;61289:35;;;;;;;;;;;;;;;;;;;;;;;;;61282:42;;61164:172;;;;:::o;75279:39::-;;;;;;;;;;;;;:::o;74021:260::-;73218:12;:10;:12::i;:::-;73207:23;;:7;:5;:7::i;:::-;:23;;;73199:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74134:1:::1;74114:22;;:8;:22;;;;74106:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;74228:8;74199:38;;74220:6;;;;;;;;;;;74199:38;;;;;;;;;;;;74261:8;74252:6;;:17;;;;;;;;;;;;;;;;;;74021:260:::0;:::o;75006:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;730:114::-;783:15;822:10;815:17;;730:114;:::o;63985:135::-;64050:4;64078:30;64100:7;64078:12;:21;;:30;;;;:::i;:::-;64071:37;;63985:135;;;:::o;70707:204::-;70813:2;70786:15;:24;70802:7;70786:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;70873:7;70869:2;70835:46;;70844:23;70859:7;70844:14;:23::i;:::-;70835:46;;;;;;;;;;;;70707:204;;:::o;49281:131::-;49350:7;49381:19;49389:3;:10;;49381:7;:19::i;:::-;49374:26;;49281:131;;;:::o;64323:371::-;64416:4;64445:16;64453:7;64445;:16::i;:::-;64437:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;64525:13;64541:23;64556:7;64541:14;:23::i;:::-;64525:39;;64598:5;64587:16;;:7;:16;;;:51;;;;64631:7;64607:31;;:20;64619:7;64607:11;:20::i;:::-;:31;;;64587:51;:94;;;;64642:39;64666:5;64673:7;64642:23;:39::i;:::-;64587:94;64579:103;;;64323:371;;;;:::o;67839:659::-;67968:4;67941:31;;:23;67956:7;67941:14;:23::i;:::-;:31;;;67933:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;68073:1;68059:16;;:2;:16;;;;68051:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;68137:39;68158:4;68164:2;68168:7;68137:20;:39::i;:::-;68253:29;68270:1;68274:7;68253:8;:29::i;:::-;68303:35;68330:7;68303:13;:19;68317:4;68303:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;68353:30;68375:7;68353:13;:17;68367:2;68353:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;68404:29;68421:7;68430:2;68404:12;:16;;:29;;;;;:::i;:::-;;68478:7;68474:2;68459:27;;68468:4;68459:27;;;;;;;;;;;;67839:659;;;:::o;15436:195::-;15494:7;15518:9;15534:1;15530;:5;15518:17;;15563:1;15558;:6;;15550:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;15618:1;15611:8;;;15436:195;;;;:::o;65085:118::-;65165:26;65175:2;65179:7;65165:26;;;;;;;;;;;;:9;:26::i;:::-;65085:118;;:::o;40180:145::-;40251:7;40290:22;40294:3;:10;;40306:5;40290:3;:22::i;:::-;40282:31;;40275:38;;40180:145;;;;:::o;49795:248::-;49875:7;49884;49909:11;49922:13;49939:22;49943:3;:10;;49955:5;49939:3;:22::i;:::-;49908:53;;;;49992:3;49984:12;;50022:5;50014:14;;49976:55;;;;;;49795:248;;;;;:::o;69175:108::-;69263:8;69252;:19;;;;;;;;;;;;:::i;:::-;;69175:108;:::o;51213:221::-;51320:7;51375:44;51380:3;:10;;51400:3;51392:12;;51406;51375:4;:44::i;:::-;51367:53;;51344:78;;51213:221;;;;;:::o;39666:122::-;39726:7;39757:19;39765:3;:10;;39757:7;:19::i;:::-;39750:26;;39666:122;;;:::o;63348:284::-;63466:28;63476:4;63482:2;63486:7;63466:9;:28::i;:::-;63517:48;63540:4;63546:2;63550:7;63559:5;63517:22;:48::i;:::-;63509:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;63348:284;;;;:::o;51749:830::-;51805:13;52051:1;52042:5;:10;52038:61;;;52073:10;;;;;;;;;;;;;;;;;;;;;52038:61;52113:12;52128:5;52113:20;;52148:14;52177:90;52192:1;52184:4;:9;52177:90;;52214:8;;;;;;;52249:2;52241:10;;;;;;;;;52177:90;;;52281:19;52313:6;52303:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52281:39;;52335:13;52360:1;52351:6;:10;52335:26;;52383:5;52376:12;;52403:129;52418:1;52410:4;:9;52403:129;;52483:2;52476:4;:9;;;;;;52471:2;:14;52458:29;;52440:6;52447:7;;;;;;;52440:15;;;;;;;;;;;:47;;;;;;;;;;;52514:2;52506:10;;;;;;;;;52403:129;;;52560:6;52546:21;;;;;;51749:830;;;;:::o;49014:159::-;49098:4;49126:35;49136:3;:10;;49156:3;49148:12;;49126:9;:35::i;:::-;49119:42;;49014:159;;;;:::o;45492:118::-;45548:7;45579:3;:12;;:19;;;;45572:26;;45492:118;;;:::o;71592:93::-;;;;:::o;39155:145::-;39225:4;39253:35;39261:3;:10;;39281:5;39273:14;;39253:7;:35::i;:::-;39246:42;;39155:145;;;;:::o;38808:139::-;38875:4;38903:32;38908:3;:10;;38928:5;38920:14;;38903:4;:32::i;:::-;38896:39;;38808:139;;;;:::o;48373:193::-;48462:4;48490:64;48495:3;:10;;48515:3;48507:12;;48545:5;48529:23;;48521:32;;48490:4;:64::i;:::-;48483:71;;48373:193;;;;;:::o;65454:262::-;65554:18;65560:2;65564:7;65554:5;:18::i;:::-;65595:54;65626:1;65630:2;65634:7;65643:5;65595:22;:54::i;:::-;65587:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;65454:262;;;:::o;34562:216::-;34629:7;34682:5;34661:3;:11;;:18;;;;:26;34653:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34748:3;:11;;34760:5;34748:18;;;;;;;;;;;;;;;;34741:25;;34562:216;;;;:::o;46013:299::-;46080:7;46089;46143:5;46121:3;:12;;:19;;;;:27;46113:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46208:22;46233:3;:12;;46246:5;46233:19;;;;;;;;;;;;;;;;;;46208:44;;46275:5;:10;;;46287:5;:12;;;46267:33;;;;;46013:299;;;;;:::o;47654:335::-;47748:7;47772:16;47791:3;:12;;:17;47804:3;47791:17;;;;;;;;;;;;47772:36;;47843:1;47831:8;:13;;47846:12;47823:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;47917:3;:12;;47941:1;47930:8;:12;47917:26;;;;;;;;;;;;;;;;;;:33;;;47910:40;;;47654:335;;;;;:::o;34053:117::-;34109:7;34140:3;:11;;:18;;;;34133:25;;34053:117;;;:::o;69896:664::-;70021:4;70056:15;:2;:13;;;:15::i;:::-;70051:68;;70099:4;70092:11;;;;70051:68;70133:23;70159:276;70216:45;;;70280:12;:10;:12::i;:::-;70311:4;70334:7;70360:5;70175:205;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70159:276;;;;;;;;;;;;;;;;;:2;:15;;;;:276;;;;;:::i;:::-;70133:302;;70450:13;70477:10;70466:32;;;;;;;;;;;;:::i;:::-;70450:48;;53425:10;70531:16;;70521:26;;;:6;:26;;;;70513:35;;;;69896:664;;;;;;;:::o;45244:133::-;45315:4;45364:1;45343:3;:12;;:17;45356:3;45343:17;;;;;;;;;;;;:22;;45336:29;;45244:133;;;;:::o;32032:1672::-;32098:4;32224:18;32245:3;:12;;:19;32258:5;32245:19;;;;;;;;;;;;32224:40;;32303:1;32289:10;:15;32285:1408;;32671:21;32708:1;32695:10;:14;32671:38;;32728:17;32769:1;32748:3;:11;;:18;;;;:22;32728:42;;33035:17;33055:3;:11;;33067:9;33055:22;;;;;;;;;;;;;;;;33035:42;;33213:9;33184:3;:11;;33196:13;33184:26;;;;;;;;;;;;;;;:38;;;;33340:1;33324:13;:17;33298:3;:12;;:23;33311:9;33298:23;;;;;;;;;;;:43;;;;33462:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;33569:3;:12;;:19;33582:5;33569:19;;;;;;;;;;;33562:26;;;33620:4;33613:11;;;;;;;;32285:1408;33672:5;33665:12;;;32032:1672;;;;;:::o;31370:454::-;31433:4;31459:21;31469:3;31474:5;31459:9;:21::i;:::-;31454:359;;31501:3;:11;;31518:5;31501:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31696:3;:11;;:18;;;;31674:3;:12;;:19;31687:5;31674:19;;;;;;;;;;;:40;;;;31740:4;31733:11;;;;31454:359;31792:5;31785:12;;31370:454;;;;;:::o;42512:748::-;42588:4;42712:16;42731:3;:12;;:17;42744:3;42731:17;;;;;;;;;;;;42712:36;;42785:1;42773:8;:13;42769:480;;;42844:3;:12;;42862:38;;;;;;;;42879:3;42862:38;;;;42892:5;42862:38;;;42844:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43071:3;:12;;:19;;;;43051:3;:12;;:17;43064:3;43051:17;;;;;;;;;;;:39;;;;43116:4;43109:11;;;;;42769:480;43197:5;43161:3;:12;;43185:1;43174:8;:12;43161:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;43228:5;43221:12;;;42512:748;;;;;;:::o;66108:448::-;66206:1;66192:16;;:2;:16;;;;66184:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;66269:16;66277:7;66269;:16::i;:::-;66268:17;66260:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;66339:45;66368:1;66372:2;66376:7;66339:20;:45::i;:::-;66405:30;66427:7;66405:13;:17;66419:2;66405:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;66456:29;66473:7;66482:2;66456:12;:16;;:29;;;;;:::i;:::-;;66536:7;66532:2;66511:33;;66528:1;66511:33;;;;;;;;;;;;66108:448;;:::o;21509:458::-;21569:4;21797:12;21916:7;21904:20;21896:28;;21954:1;21947:4;:8;21940:15;;;21509:458;;;:::o;24679:203::-;24782:12;24818:52;24840:6;24848:4;24854:1;24857:12;24818:21;:52::i;:::-;24811:59;;24679:203;;;;;:::o;33810:137::-;33883:4;33934:1;33911:3;:12;;:19;33924:5;33911:19;;;;;;;;;;;;:24;;33904:31;;33810:137;;;;:::o;25831:558::-;25958:12;26020:5;25995:21;:30;;25987:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;26091:18;26102:6;26091:10;:18::i;:::-;26083:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;26229:12;26243:23;26270:6;:11;;26290:5;26298:4;26270:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26228:75;;;;26325:52;26343:7;26352:10;26364:12;26325:17;:52::i;:::-;26318:59;;;;25831:558;;;;;;:::o;28599:810::-;28714:12;28747:7;28743:655;;;28782:10;28775:17;;;;28743:655;28928:1;28908:10;:17;:21;28904:479;;;29191:10;29185:17;29256:15;29243:10;29239:2;29235:19;29228:44;29135:160;29350:12;29343:20;;;;;;;;;;;:::i;:::-;;;;;;;;28599:810;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;669:622::-;;790:80;805:64;862:6;805:64;:::i;:::-;790:80;:::i;:::-;781:89;;890:5;918:6;911:5;904:21;944:4;937:5;933:16;926:23;;969:6;1019:3;1011:4;1003:6;999:17;994:3;990:27;987:36;984:2;;;1036:1;1033;1026:12;984:2;1064:1;1049:236;1074:6;1071:1;1068:13;1049:236;;;1141:3;1169:37;1202:3;1190:10;1169:37;:::i;:::-;1164:3;1157:50;1236:4;1231:3;1227:14;1220:21;;1270:4;1265:3;1261:14;1254:21;;1109:176;1096:1;1093;1089:9;1084:14;;1049:236;;;1053:14;771:520;;;;;;;:::o;1297:342::-;;1399:64;1414:48;1455:6;1414:48;:::i;:::-;1399:64;:::i;:::-;1390:73;;1486:6;1479:5;1472:21;1524:4;1517:5;1513:16;1562:3;1553:6;1548:3;1544:16;1541:25;1538:2;;;1579:1;1576;1569:12;1538:2;1592:41;1626:6;1621:3;1616;1592:41;:::i;:::-;1380:259;;;;;;:::o;1645:344::-;;1748:65;1763:49;1805:6;1763:49;:::i;:::-;1748:65;:::i;:::-;1739:74;;1836:6;1829:5;1822:21;1874:4;1867:5;1863:16;1912:3;1903:6;1898:3;1894:16;1891:25;1888:2;;;1929:1;1926;1919:12;1888:2;1942:41;1976:6;1971:3;1966;1942:41;:::i;:::-;1729:260;;;;;;:::o;1995:139::-;;2079:6;2066:20;2057:29;;2095:33;2122:5;2095:33;:::i;:::-;2047:87;;;;:::o;2157:303::-;;2277:3;2270:4;2262:6;2258:17;2254:27;2244:2;;2295:1;2292;2285:12;2244:2;2335:6;2322:20;2360:94;2450:3;2442:6;2435:4;2427:6;2423:17;2360:94;:::i;:::-;2351:103;;2234:226;;;;;:::o;2482:379::-;;;2627:3;2620:4;2612:6;2608:17;2604:27;2594:2;;2645:1;2642;2635:12;2594:2;2681:6;2668:20;2658:30;;2711:18;2703:6;2700:30;2697:2;;;2743:1;2740;2733:12;2697:2;2780:4;2772:6;2768:17;2756:29;;2834:3;2826:4;2818:6;2814:17;2804:8;2800:32;2797:41;2794:2;;;2851:1;2848;2841:12;2794:2;2584:277;;;;;:::o;2884:367::-;;;3017:3;3010:4;3002:6;2998:17;2994:27;2984:2;;3035:1;3032;3025:12;2984:2;3071:6;3058:20;3048:30;;3101:18;3093:6;3090:30;3087:2;;;3133:1;3130;3123:12;3087:2;3170:4;3162:6;3158:17;3146:29;;3224:3;3216:4;3208:6;3204:17;3194:8;3190:32;3187:41;3184:2;;;3241:1;3238;3231:12;3184:2;2974:277;;;;;:::o;3274:303::-;;3394:3;3387:4;3379:6;3375:17;3371:27;3361:2;;3412:1;3409;3402:12;3361:2;3452:6;3439:20;3477:94;3567:3;3559:6;3552:4;3544:6;3540:17;3477:94;:::i;:::-;3468:103;;3351:226;;;;;:::o;3583:133::-;;3664:6;3651:20;3642:29;;3680:30;3704:5;3680:30;:::i;:::-;3632:84;;;;:::o;3722:137::-;;3805:6;3792:20;3783:29;;3821:32;3847:5;3821:32;:::i;:::-;3773:86;;;;:::o;3865:141::-;;3952:6;3946:13;3937:22;;3968:32;3994:5;3968:32;:::i;:::-;3927:79;;;;:::o;4025:271::-;;4129:3;4122:4;4114:6;4110:17;4106:27;4096:2;;4147:1;4144;4137:12;4096:2;4187:6;4174:20;4212:78;4286:3;4278:6;4271:4;4263:6;4259:17;4212:78;:::i;:::-;4203:87;;4086:210;;;;;:::o;4316:352::-;;;4434:3;4427:4;4419:6;4415:17;4411:27;4401:2;;4452:1;4449;4442:12;4401:2;4488:6;4475:20;4465:30;;4518:18;4510:6;4507:30;4504:2;;;4550:1;4547;4540:12;4504:2;4587:4;4579:6;4575:17;4563:29;;4641:3;4633:4;4625:6;4621:17;4611:8;4607:32;4604:41;4601:2;;;4658:1;4655;4648:12;4601:2;4391:277;;;;;:::o;4688:273::-;;4793:3;4786:4;4778:6;4774:17;4770:27;4760:2;;4811:1;4808;4801:12;4760:2;4851:6;4838:20;4876:79;4951:3;4943:6;4936:4;4928:6;4924:17;4876:79;:::i;:::-;4867:88;;4750:211;;;;;:::o;4967:139::-;;5051:6;5038:20;5029:29;;5067:33;5094:5;5067:33;:::i;:::-;5019:87;;;;:::o;5112:262::-;;5220:2;5208:9;5199:7;5195:23;5191:32;5188:2;;;5236:1;5233;5226:12;5188:2;5279:1;5304:53;5349:7;5340:6;5329:9;5325:22;5304:53;:::i;:::-;5294:63;;5250:117;5178:196;;;;:::o;5380:407::-;;;5505:2;5493:9;5484:7;5480:23;5476:32;5473:2;;;5521:1;5518;5511:12;5473:2;5564:1;5589:53;5634:7;5625:6;5614:9;5610:22;5589:53;:::i;:::-;5579:63;;5535:117;5691:2;5717:53;5762:7;5753:6;5742:9;5738:22;5717:53;:::i;:::-;5707:63;;5662:118;5463:324;;;;;:::o;5793:552::-;;;;5935:2;5923:9;5914:7;5910:23;5906:32;5903:2;;;5951:1;5948;5941:12;5903:2;5994:1;6019:53;6064:7;6055:6;6044:9;6040:22;6019:53;:::i;:::-;6009:63;;5965:117;6121:2;6147:53;6192:7;6183:6;6172:9;6168:22;6147:53;:::i;:::-;6137:63;;6092:118;6249:2;6275:53;6320:7;6311:6;6300:9;6296:22;6275:53;:::i;:::-;6265:63;;6220:118;5893:452;;;;;:::o;6351:809::-;;;;;6519:3;6507:9;6498:7;6494:23;6490:33;6487:2;;;6536:1;6533;6526:12;6487:2;6579:1;6604:53;6649:7;6640:6;6629:9;6625:22;6604:53;:::i;:::-;6594:63;;6550:117;6706:2;6732:53;6777:7;6768:6;6757:9;6753:22;6732:53;:::i;:::-;6722:63;;6677:118;6834:2;6860:53;6905:7;6896:6;6885:9;6881:22;6860:53;:::i;:::-;6850:63;;6805:118;6990:2;6979:9;6975:18;6962:32;7021:18;7013:6;7010:30;7007:2;;;7053:1;7050;7043:12;7007:2;7081:62;7135:7;7126:6;7115:9;7111:22;7081:62;:::i;:::-;7071:72;;6933:220;6477:683;;;;;;;:::o;7166:401::-;;;7288:2;7276:9;7267:7;7263:23;7259:32;7256:2;;;7304:1;7301;7294:12;7256:2;7347:1;7372:53;7417:7;7408:6;7397:9;7393:22;7372:53;:::i;:::-;7362:63;;7318:117;7474:2;7500:50;7542:7;7533:6;7522:9;7518:22;7500:50;:::i;:::-;7490:60;;7445:115;7246:321;;;;;:::o;7573:407::-;;;7698:2;7686:9;7677:7;7673:23;7669:32;7666:2;;;7714:1;7711;7704:12;7666:2;7757:1;7782:53;7827:7;7818:6;7807:9;7803:22;7782:53;:::i;:::-;7772:63;;7728:117;7884:2;7910:53;7955:7;7946:6;7935:9;7931:22;7910:53;:::i;:::-;7900:63;;7855:118;7656:324;;;;;:::o;7986:693::-;;;8161:2;8149:9;8140:7;8136:23;8132:32;8129:2;;;8177:1;8174;8167:12;8129:2;8248:1;8237:9;8233:17;8220:31;8278:18;8270:6;8267:30;8264:2;;;8310:1;8307;8300:12;8264:2;8338:78;8408:7;8399:6;8388:9;8384:22;8338:78;:::i;:::-;8328:88;;8191:235;8493:2;8482:9;8478:18;8465:32;8524:18;8516:6;8513:30;8510:2;;;8556:1;8553;8546:12;8510:2;8584:78;8654:7;8645:6;8634:9;8630:22;8584:78;:::i;:::-;8574:88;;8436:236;8119:560;;;;;:::o;8685:757::-;;;;;8892:2;8880:9;8871:7;8867:23;8863:32;8860:2;;;8908:1;8905;8898:12;8860:2;8979:1;8968:9;8964:17;8951:31;9009:18;9001:6;8998:30;8995:2;;;9041:1;9038;9031:12;8995:2;9077:80;9149:7;9140:6;9129:9;9125:22;9077:80;:::i;:::-;9059:98;;;;8922:245;9234:2;9223:9;9219:18;9206:32;9265:18;9257:6;9254:30;9251:2;;;9297:1;9294;9287:12;9251:2;9333:92;9417:7;9408:6;9397:9;9393:22;9333:92;:::i;:::-;9315:110;;;;9177:258;8850:592;;;;;;;:::o;9448:260::-;;9555:2;9543:9;9534:7;9530:23;9526:32;9523:2;;;9571:1;9568;9561:12;9523:2;9614:1;9639:52;9683:7;9674:6;9663:9;9659:22;9639:52;:::i;:::-;9629:62;;9585:116;9513:195;;;;:::o;9714:282::-;;9832:2;9820:9;9811:7;9807:23;9803:32;9800:2;;;9848:1;9845;9838:12;9800:2;9891:1;9916:63;9971:7;9962:6;9951:9;9947:22;9916:63;:::i;:::-;9906:73;;9862:127;9790:206;;;;:::o;10002:395::-;;;10130:2;10118:9;10109:7;10105:23;10101:32;10098:2;;;10146:1;10143;10136:12;10098:2;10217:1;10206:9;10202:17;10189:31;10247:18;10239:6;10236:30;10233:2;;;10279:1;10276;10269:12;10233:2;10315:65;10372:7;10363:6;10352:9;10348:22;10315:65;:::i;:::-;10297:83;;;;10160:230;10088:309;;;;;:::o;10403:375::-;;10521:2;10509:9;10500:7;10496:23;10492:32;10489:2;;;10537:1;10534;10527:12;10489:2;10608:1;10597:9;10593:17;10580:31;10638:18;10630:6;10627:30;10624:2;;;10670:1;10667;10660:12;10624:2;10698:63;10753:7;10744:6;10733:9;10729:22;10698:63;:::i;:::-;10688:73;;10551:220;10479:299;;;;:::o;10784:262::-;;10892:2;10880:9;10871:7;10867:23;10863:32;10860:2;;;10908:1;10905;10898:12;10860:2;10951:1;10976:53;11021:7;11012:6;11001:9;10997:22;10976:53;:::i;:::-;10966:63;;10922:117;10850:196;;;;:::o;11052:142::-;11155:32;11181:5;11155:32;:::i;:::-;11150:3;11143:45;11133:61;;:::o;11200:118::-;11287:24;11305:5;11287:24;:::i;:::-;11282:3;11275:37;11265:53;;:::o;11324:109::-;11405:21;11420:5;11405:21;:::i;:::-;11400:3;11393:34;11383:50;;:::o;11439:360::-;;11553:38;11585:5;11553:38;:::i;:::-;11607:70;11670:6;11665:3;11607:70;:::i;:::-;11600:77;;11686:52;11731:6;11726:3;11719:4;11712:5;11708:16;11686:52;:::i;:::-;11763:29;11785:6;11763:29;:::i;:::-;11758:3;11754:39;11747:46;;11529:270;;;;;:::o;11805:373::-;;11937:38;11969:5;11937:38;:::i;:::-;11991:88;12072:6;12067:3;11991:88;:::i;:::-;11984:95;;12088:52;12133:6;12128:3;12121:4;12114:5;12110:16;12088:52;:::i;:::-;12165:6;12160:3;12156:16;12149:23;;11913:265;;;;;:::o;12184:364::-;;12300:39;12333:5;12300:39;:::i;:::-;12355:71;12419:6;12414:3;12355:71;:::i;:::-;12348:78;;12435:52;12480:6;12475:3;12468:4;12461:5;12457:16;12435:52;:::i;:::-;12512:29;12534:6;12512:29;:::i;:::-;12507:3;12503:39;12496:46;;12276:272;;;;;:::o;12554:377::-;;12688:39;12721:5;12688:39;:::i;:::-;12743:89;12825:6;12820:3;12743:89;:::i;:::-;12736:96;;12841:52;12886:6;12881:3;12874:4;12867:5;12863:16;12841:52;:::i;:::-;12918:6;12913:3;12909:16;12902:23;;12664:267;;;;;:::o;12937:366::-;;13100:67;13164:2;13159:3;13100:67;:::i;:::-;13093:74;;13197:34;13193:1;13188:3;13184:11;13177:55;13263:4;13258:2;13253:3;13249:12;13242:26;13294:2;13289:3;13285:12;13278:19;;13083:220;;;:::o;13309:303::-;;13472:66;13536:1;13531:3;13472:66;:::i;:::-;13465:73;;13568:8;13564:1;13559:3;13555:11;13548:29;13603:2;13598:3;13594:12;13587:19;;13455:157;;;:::o;13618:382::-;;13781:67;13845:2;13840:3;13781:67;:::i;:::-;13774:74;;13878:34;13874:1;13869:3;13865:11;13858:55;13944:20;13939:2;13934:3;13930:12;13923:42;13991:2;13986:3;13982:12;13975:19;;13764:236;;;:::o;14006:370::-;;14169:67;14233:2;14228:3;14169:67;:::i;:::-;14162:74;;14266:34;14262:1;14257:3;14253:11;14246:55;14332:8;14327:2;14322:3;14318:12;14311:30;14367:2;14362:3;14358:12;14351:19;;14152:224;;;:::o;14382:326::-;;14545:67;14609:2;14604:3;14545:67;:::i;:::-;14538:74;;14642:30;14638:1;14633:3;14629:11;14622:51;14699:2;14694:3;14690:12;14683:19;;14528:180;;;:::o;14714:325::-;;14877:67;14941:2;14936:3;14877:67;:::i;:::-;14870:74;;14974:29;14970:1;14965:3;14961:11;14954:50;15030:2;15025:3;15021:12;15014:19;;14860:179;;;:::o;15045:309::-;;15208:67;15272:2;15267:3;15208:67;:::i;:::-;15201:74;;15305:13;15301:1;15296:3;15292:11;15285:34;15345:2;15340:3;15336:12;15329:19;;15191:163;;;:::o;15360:305::-;;15523:66;15587:1;15582:3;15523:66;:::i;:::-;15516:73;;15619:10;15615:1;15610:3;15606:11;15599:31;15656:2;15651:3;15647:12;15640:19;;15506:159;;;:::o;15671:368::-;;15834:67;15898:2;15893:3;15834:67;:::i;:::-;15827:74;;15931:34;15927:1;15922:3;15918:11;15911:55;15997:6;15992:2;15987:3;15983:12;15976:28;16030:2;16025:3;16021:12;16014:19;;15817:222;;;:::o;16045:323::-;;16208:67;16272:2;16267:3;16208:67;:::i;:::-;16201:74;;16305:27;16301:1;16296:3;16292:11;16285:48;16359:2;16354:3;16350:12;16343:19;;16191:177;;;:::o;16374:370::-;;16537:67;16601:2;16596:3;16537:67;:::i;:::-;16530:74;;16634:34;16630:1;16625:3;16621:11;16614:55;16700:8;16695:2;16690:3;16686:12;16679:30;16735:2;16730:3;16726:12;16719:19;;16520:224;;;:::o;16750:376::-;;16913:67;16977:2;16972:3;16913:67;:::i;:::-;16906:74;;17010:34;17006:1;17001:3;16997:11;16990:55;17076:14;17071:2;17066:3;17062:12;17055:36;17117:2;17112:3;17108:12;17101:19;;16896:230;;;:::o;17132:309::-;;17295:67;17359:2;17354:3;17295:67;:::i;:::-;17288:74;;17392:13;17388:1;17383:3;17379:11;17372:34;17432:2;17427:3;17423:12;17416:19;;17278:163;;;:::o;17447:388::-;;17610:67;17674:2;17669:3;17610:67;:::i;:::-;17603:74;;17707:34;17703:1;17698:3;17694:11;17687:55;17773:26;17768:2;17763:3;17759:12;17752:48;17826:2;17821:3;17817:12;17810:19;;17593:242;;;:::o;17841:374::-;;18004:67;18068:2;18063:3;18004:67;:::i;:::-;17997:74;;18101:34;18097:1;18092:3;18088:11;18081:55;18167:12;18162:2;18157:3;18153:12;18146:34;18206:2;18201:3;18197:12;18190:19;;17987:228;;;:::o;18221:314::-;;18384:67;18448:2;18443:3;18384:67;:::i;:::-;18377:74;;18481:18;18477:1;18472:3;18468:11;18461:39;18526:2;18521:3;18517:12;18510:19;;18367:168;;;:::o;18541:366::-;;18704:67;18768:2;18763:3;18704:67;:::i;:::-;18697:74;;18801:34;18797:1;18792:3;18788:11;18781:55;18867:4;18862:2;18857:3;18853:12;18846:26;18898:2;18893:3;18889:12;18882:19;;18687:220;;;:::o;18913:330::-;;19076:67;19140:2;19135:3;19076:67;:::i;:::-;19069:74;;19173:34;19169:1;19164:3;19160:11;19153:55;19234:2;19229:3;19225:12;19218:19;;19059:184;;;:::o;19249:376::-;;19412:67;19476:2;19471:3;19412:67;:::i;:::-;19405:74;;19509:34;19505:1;19500:3;19496:11;19489:55;19575:14;19570:2;19565:3;19561:12;19554:36;19616:2;19611:3;19607:12;19600:19;;19395:230;;;:::o;19631:330::-;;19794:67;19858:2;19853:3;19794:67;:::i;:::-;19787:74;;19891:34;19887:1;19882:3;19878:11;19871:55;19952:2;19947:3;19943:12;19936:19;;19777:184;;;:::o;19967:373::-;;20130:67;20194:2;20189:3;20130:67;:::i;:::-;20123:74;;20227:34;20223:1;20218:3;20214:11;20207:55;20293:11;20288:2;20283:3;20279:12;20272:33;20331:2;20326:3;20322:12;20315:19;;20113:227;;;:::o;20346:379::-;;20509:67;20573:2;20568:3;20509:67;:::i;:::-;20502:74;;20606:34;20602:1;20597:3;20593:11;20586:55;20672:17;20667:2;20662:3;20658:12;20651:39;20716:2;20711:3;20707:12;20700:19;;20492:233;;;:::o;20731:305::-;;20894:66;20958:1;20953:3;20894:66;:::i;:::-;20887:73;;20990:10;20986:1;20981:3;20977:11;20970:31;21027:2;21022:3;21018:12;21011:19;;20877:159;;;:::o;21042:365::-;;21205:67;21269:2;21264:3;21205:67;:::i;:::-;21198:74;;21302:34;21298:1;21293:3;21289:11;21282:55;21368:3;21363:2;21358:3;21354:12;21347:25;21398:2;21393:3;21389:12;21382:19;;21188:219;;;:::o;21413:381::-;;21576:67;21640:2;21635:3;21576:67;:::i;:::-;21569:74;;21673:34;21669:1;21664:3;21660:11;21653:55;21739:19;21734:2;21729:3;21725:12;21718:41;21785:2;21780:3;21776:12;21769:19;;21559:235;;;:::o;21800:327::-;;21963:67;22027:2;22022:3;21963:67;:::i;:::-;21956:74;;22060:31;22056:1;22051:3;22047:11;22040:52;22118:2;22113:3;22109:12;22102:19;;21946:181;;;:::o;22133:319::-;;22296:67;22360:2;22355:3;22296:67;:::i;:::-;22289:74;;22393:23;22389:1;22384:3;22380:11;22373:44;22443:2;22438:3;22434:12;22427:19;;22279:173;;;:::o;22458:314::-;;22621:67;22685:2;22680:3;22621:67;:::i;:::-;22614:74;;22718:18;22714:1;22709:3;22705:11;22698:39;22763:2;22758:3;22754:12;22747:19;;22604:168;;;:::o;22778:313::-;;22941:67;23005:2;23000:3;22941:67;:::i;:::-;22934:74;;23038:17;23034:1;23029:3;23025:11;23018:38;23082:2;23077:3;23073:12;23066:19;;22924:167;;;:::o;23097:309::-;;23260:67;23324:2;23319:3;23260:67;:::i;:::-;23253:74;;23357:13;23353:1;23348:3;23344:11;23337:34;23397:2;23392:3;23388:12;23381:19;;23243:163;;;:::o;23412:118::-;23499:24;23517:5;23499:24;:::i;:::-;23494:3;23487:37;23477:53;;:::o;23536:271::-;;23688:93;23777:3;23768:6;23688:93;:::i;:::-;23681:100;;23798:3;23791:10;;23670:137;;;;:::o;23813:435::-;;24015:95;24106:3;24097:6;24015:95;:::i;:::-;24008:102;;24127:95;24218:3;24209:6;24127:95;:::i;:::-;24120:102;;24239:3;24232:10;;23997:251;;;;;:::o;24254:222::-;;24385:2;24374:9;24370:18;24362:26;;24398:71;24466:1;24455:9;24451:17;24442:6;24398:71;:::i;:::-;24352:124;;;;:::o;24482:672::-;;24731:3;24720:9;24716:19;24708:27;;24745:87;24829:1;24818:9;24814:17;24805:6;24745:87;:::i;:::-;24842:72;24910:2;24899:9;24895:18;24886:6;24842:72;:::i;:::-;24924;24992:2;24981:9;24977:18;24968:6;24924:72;:::i;:::-;25043:9;25037:4;25033:20;25028:2;25017:9;25013:18;25006:48;25071:76;25142:4;25133:6;25071:76;:::i;:::-;25063:84;;24698:456;;;;;;;:::o;25160:210::-;;25285:2;25274:9;25270:18;25262:26;;25298:65;25360:1;25349:9;25345:17;25336:6;25298:65;:::i;:::-;25252:118;;;;:::o;25376:313::-;;25527:2;25516:9;25512:18;25504:26;;25576:9;25570:4;25566:20;25562:1;25551:9;25547:17;25540:47;25604:78;25677:4;25668:6;25604:78;:::i;:::-;25596:86;;25494:195;;;;:::o;25695:419::-;;25899:2;25888:9;25884:18;25876:26;;25948:9;25942:4;25938:20;25934:1;25923:9;25919:17;25912:47;25976:131;26102:4;25976:131;:::i;:::-;25968:139;;25866:248;;;:::o;26120:419::-;;26324:2;26313:9;26309:18;26301:26;;26373:9;26367:4;26363:20;26359:1;26348:9;26344:17;26337:47;26401:131;26527:4;26401:131;:::i;:::-;26393:139;;26291:248;;;:::o;26545:419::-;;26749:2;26738:9;26734:18;26726:26;;26798:9;26792:4;26788:20;26784:1;26773:9;26769:17;26762:47;26826:131;26952:4;26826:131;:::i;:::-;26818:139;;26716:248;;;:::o;26970:419::-;;27174:2;27163:9;27159:18;27151:26;;27223:9;27217:4;27213:20;27209:1;27198:9;27194:17;27187:47;27251:131;27377:4;27251:131;:::i;:::-;27243:139;;27141:248;;;:::o;27395:419::-;;27599:2;27588:9;27584:18;27576:26;;27648:9;27642:4;27638:20;27634:1;27623:9;27619:17;27612:47;27676:131;27802:4;27676:131;:::i;:::-;27668:139;;27566:248;;;:::o;27820:419::-;;28024:2;28013:9;28009:18;28001:26;;28073:9;28067:4;28063:20;28059:1;28048:9;28044:17;28037:47;28101:131;28227:4;28101:131;:::i;:::-;28093:139;;27991:248;;;:::o;28245:419::-;;28449:2;28438:9;28434:18;28426:26;;28498:9;28492:4;28488:20;28484:1;28473:9;28469:17;28462:47;28526:131;28652:4;28526:131;:::i;:::-;28518:139;;28416:248;;;:::o;28670:419::-;;28874:2;28863:9;28859:18;28851:26;;28923:9;28917:4;28913:20;28909:1;28898:9;28894:17;28887:47;28951:131;29077:4;28951:131;:::i;:::-;28943:139;;28841:248;;;:::o;29095:419::-;;29299:2;29288:9;29284:18;29276:26;;29348:9;29342:4;29338:20;29334:1;29323:9;29319:17;29312:47;29376:131;29502:4;29376:131;:::i;:::-;29368:139;;29266:248;;;:::o;29520:419::-;;29724:2;29713:9;29709:18;29701:26;;29773:9;29767:4;29763:20;29759:1;29748:9;29744:17;29737:47;29801:131;29927:4;29801:131;:::i;:::-;29793:139;;29691:248;;;:::o;29945:419::-;;30149:2;30138:9;30134:18;30126:26;;30198:9;30192:4;30188:20;30184:1;30173:9;30169:17;30162:47;30226:131;30352:4;30226:131;:::i;:::-;30218:139;;30116:248;;;:::o;30370:419::-;;30574:2;30563:9;30559:18;30551:26;;30623:9;30617:4;30613:20;30609:1;30598:9;30594:17;30587:47;30651:131;30777:4;30651:131;:::i;:::-;30643:139;;30541:248;;;:::o;30795:419::-;;30999:2;30988:9;30984:18;30976:26;;31048:9;31042:4;31038:20;31034:1;31023:9;31019:17;31012:47;31076:131;31202:4;31076:131;:::i;:::-;31068:139;;30966:248;;;:::o;31220:419::-;;31424:2;31413:9;31409:18;31401:26;;31473:9;31467:4;31463:20;31459:1;31448:9;31444:17;31437:47;31501:131;31627:4;31501:131;:::i;:::-;31493:139;;31391:248;;;:::o;31645:419::-;;31849:2;31838:9;31834:18;31826:26;;31898:9;31892:4;31888:20;31884:1;31873:9;31869:17;31862:47;31926:131;32052:4;31926:131;:::i;:::-;31918:139;;31816:248;;;:::o;32070:419::-;;32274:2;32263:9;32259:18;32251:26;;32323:9;32317:4;32313:20;32309:1;32298:9;32294:17;32287:47;32351:131;32477:4;32351:131;:::i;:::-;32343:139;;32241:248;;;:::o;32495:419::-;;32699:2;32688:9;32684:18;32676:26;;32748:9;32742:4;32738:20;32734:1;32723:9;32719:17;32712:47;32776:131;32902:4;32776:131;:::i;:::-;32768:139;;32666:248;;;:::o;32920:419::-;;33124:2;33113:9;33109:18;33101:26;;33173:9;33167:4;33163:20;33159:1;33148:9;33144:17;33137:47;33201:131;33327:4;33201:131;:::i;:::-;33193:139;;33091:248;;;:::o;33345:419::-;;33549:2;33538:9;33534:18;33526:26;;33598:9;33592:4;33588:20;33584:1;33573:9;33569:17;33562:47;33626:131;33752:4;33626:131;:::i;:::-;33618:139;;33516:248;;;:::o;33770:419::-;;33974:2;33963:9;33959:18;33951:26;;34023:9;34017:4;34013:20;34009:1;33998:9;33994:17;33987:47;34051:131;34177:4;34051:131;:::i;:::-;34043:139;;33941:248;;;:::o;34195:419::-;;34399:2;34388:9;34384:18;34376:26;;34448:9;34442:4;34438:20;34434:1;34423:9;34419:17;34412:47;34476:131;34602:4;34476:131;:::i;:::-;34468:139;;34366:248;;;:::o;34620:419::-;;34824:2;34813:9;34809:18;34801:26;;34873:9;34867:4;34863:20;34859:1;34848:9;34844:17;34837:47;34901:131;35027:4;34901:131;:::i;:::-;34893:139;;34791:248;;;:::o;35045:419::-;;35249:2;35238:9;35234:18;35226:26;;35298:9;35292:4;35288:20;35284:1;35273:9;35269:17;35262:47;35326:131;35452:4;35326:131;:::i;:::-;35318:139;;35216:248;;;:::o;35470:419::-;;35674:2;35663:9;35659:18;35651:26;;35723:9;35717:4;35713:20;35709:1;35698:9;35694:17;35687:47;35751:131;35877:4;35751:131;:::i;:::-;35743:139;;35641:248;;;:::o;35895:419::-;;36099:2;36088:9;36084:18;36076:26;;36148:9;36142:4;36138:20;36134:1;36123:9;36119:17;36112:47;36176:131;36302:4;36176:131;:::i;:::-;36168:139;;36066:248;;;:::o;36320:419::-;;36524:2;36513:9;36509:18;36501:26;;36573:9;36567:4;36563:20;36559:1;36548:9;36544:17;36537:47;36601:131;36727:4;36601:131;:::i;:::-;36593:139;;36491:248;;;:::o;36745:419::-;;36949:2;36938:9;36934:18;36926:26;;36998:9;36992:4;36988:20;36984:1;36973:9;36969:17;36962:47;37026:131;37152:4;37026:131;:::i;:::-;37018:139;;36916:248;;;:::o;37170:419::-;;37374:2;37363:9;37359:18;37351:26;;37423:9;37417:4;37413:20;37409:1;37398:9;37394:17;37387:47;37451:131;37577:4;37451:131;:::i;:::-;37443:139;;37341:248;;;:::o;37595:419::-;;37799:2;37788:9;37784:18;37776:26;;37848:9;37842:4;37838:20;37834:1;37823:9;37819:17;37812:47;37876:131;38002:4;37876:131;:::i;:::-;37868:139;;37766:248;;;:::o;38020:419::-;;38224:2;38213:9;38209:18;38201:26;;38273:9;38267:4;38263:20;38259:1;38248:9;38244:17;38237:47;38301:131;38427:4;38301:131;:::i;:::-;38293:139;;38191:248;;;:::o;38445:222::-;;38576:2;38565:9;38561:18;38553:26;;38589:71;38657:1;38646:9;38642:17;38633:6;38589:71;:::i;:::-;38543:124;;;;:::o;38673:524::-;;;38813:11;38800:25;38913:1;38907:4;38903:12;38892:8;38876:14;38872:29;38868:48;38848:18;38844:73;38834:2;;38931:1;38928;38921:12;38834:2;38966:18;38956:8;38952:33;38944:41;;39018:4;39005:18;38995:28;;39046:18;39038:6;39035:30;39032:2;;;39078:1;39075;39068:12;39032:2;39109;39103:4;39099:13;39091:21;;39166:4;39158:6;39154:17;39138:14;39134:38;39128:4;39124:49;39121:2;;;39186:1;39183;39176:12;39121:2;38764:433;;;;;;:::o;39203:278::-;;39269:2;39263:9;39253:19;;39311:4;39303:6;39299:17;39418:6;39406:10;39403:22;39382:18;39370:10;39367:34;39364:62;39361:2;;;39429:13;;:::i;:::-;39361:2;39464:10;39460:2;39453:22;39243:238;;;;:::o;39487:306::-;;39654:18;39646:6;39643:30;39640:2;;;39676:13;;:::i;:::-;39640:2;39721:4;39713:6;39709:17;39701:25;;39781:4;39775;39771:15;39763:23;;39569:224;;;:::o;39799:306::-;;39966:18;39958:6;39955:30;39952:2;;;39988:13;;:::i;:::-;39952:2;40033:4;40025:6;40021:17;40013:25;;40093:4;40087;40083:15;40075:23;;39881:224;;;:::o;40111:326::-;;40262:18;40254:6;40251:30;40248:2;;;40284:13;;:::i;:::-;40248:2;40364:4;40360:9;40353:4;40345:6;40341:17;40337:33;40329:41;;40425:4;40419;40415:15;40407:23;;40177:260;;;:::o;40443:327::-;;40595:18;40587:6;40584:30;40581:2;;;40617:13;;:::i;:::-;40581:2;40697:4;40693:9;40686:4;40678:6;40674:17;40670:33;40662:41;;40758:4;40752;40748:15;40740:23;;40510:260;;;:::o;40776:98::-;;40861:5;40855:12;40845:22;;40834:40;;;:::o;40880:99::-;;40966:5;40960:12;40950:22;;40939:40;;;:::o;40985:168::-;;41102:6;41097:3;41090:19;41142:4;41137:3;41133:14;41118:29;;41080:73;;;;:::o;41159:147::-;;41297:3;41282:18;;41272:34;;;;:::o;41312:169::-;;41430:6;41425:3;41418:19;41470:4;41465:3;41461:14;41446:29;;41408:73;;;;:::o;41487:148::-;;41626:3;41611:18;;41601:34;;;;:::o;41641:96::-;;41707:24;41725:5;41707:24;:::i;:::-;41696:35;;41686:51;;;:::o;41743:104::-;;41817:24;41835:5;41817:24;:::i;:::-;41806:35;;41796:51;;;:::o;41853:90::-;;41930:5;41923:13;41916:21;41905:32;;41895:48;;;:::o;41949:149::-;;42025:66;42018:5;42014:78;42003:89;;41993:105;;;:::o;42104:126::-;;42181:42;42174:5;42170:54;42159:65;;42149:81;;;:::o;42236:77::-;;42302:5;42291:16;;42281:32;;;:::o;42319:154::-;42403:6;42398:3;42393;42380:30;42465:1;42456:6;42451:3;42447:16;42440:27;42370:103;;;:::o;42479:307::-;42547:1;42557:113;42571:6;42568:1;42565:13;42557:113;;;42656:1;42651:3;42647:11;42641:18;42637:1;42632:3;42628:11;42621:39;42593:2;42590:1;42586:10;42581:15;;42557:113;;;42688:6;42685:1;42682:13;42679:2;;;42768:1;42759:6;42754:3;42750:16;42743:27;42679:2;42528:258;;;;:::o;42792:48::-;42825:9;42846:102;;42938:2;42934:7;42929:2;42922:5;42918:14;42914:28;42904:38;;42894:54;;;:::o;42954:122::-;43027:24;43045:5;43027:24;:::i;:::-;43020:5;43017:35;43007:2;;43066:1;43063;43056:12;43007:2;42997:79;:::o;43082:116::-;43152:21;43167:5;43152:21;:::i;:::-;43145:5;43142:32;43132:2;;43188:1;43185;43178:12;43132:2;43122:76;:::o;43204:120::-;43276:23;43293:5;43276:23;:::i;:::-;43269:5;43266:34;43256:2;;43314:1;43311;43304:12;43256:2;43246:78;:::o;43330:122::-;43403:24;43421:5;43403:24;:::i;:::-;43396:5;43393:35;43383:2;;43442:1;43439;43432:12;43383:2;43373:79;:::o

Swarm Source

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